| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201162021620316204162051620616207162081620916210162111621216213162141621516216162171621816219162201622116222162231622416225162261622716228162291623016231162321623316234162351623616237162381623916240162411624216243162441624516246162471624816249162501625116252162531625416255162561625716258162591626016261162621626316264162651626616267162681626916270162711627216273162741627516276162771627816279162801628116282162831628416285162861628716288162891629016291162921629316294162951629616297162981629916300163011630216303163041630516306163071630816309163101631116312163131631416315163161631716318163191632016321163221632316324163251632616327163281632916330163311633216333163341633516336163371633816339163401634116342163431634416345163461634716348163491635016351163521635316354163551635616357163581635916360163611636216363163641636516366163671636816369163701637116372163731637416375163761637716378163791638016381163821638316384163851638616387163881638916390163911639216393163941639516396163971639816399164001640116402164031640416405164061640716408164091641016411164121641316414164151641616417164181641916420164211642216423164241642516426164271642816429164301643116432164331643416435164361643716438164391644016441164421644316444164451644616447164481644916450164511645216453164541645516456164571645816459164601646116462164631646416465164661646716468164691647016471164721647316474164751647616477164781647916480164811648216483164841648516486164871648816489164901649116492164931649416495164961649716498164991650016501165021650316504165051650616507165081650916510165111651216513165141651516516165171651816519165201652116522165231652416525165261652716528165291653016531165321653316534165351653616537165381653916540165411654216543165441654516546165471654816549165501655116552165531655416555165561655716558165591656016561165621656316564165651656616567165681656916570165711657216573165741657516576165771657816579165801658116582165831658416585165861658716588165891659016591165921659316594165951659616597165981659916600166011660216603166041660516606166071660816609166101661116612166131661416615166161661716618166191662016621166221662316624166251662616627166281662916630166311663216633166341663516636166371663816639166401664116642166431664416645166461664716648166491665016651166521665316654166551665616657166581665916660166611666216663166641666516666166671666816669166701667116672166731667416675166761667716678166791668016681166821668316684166851668616687166881668916690166911669216693166941669516696166971669816699167001670116702167031670416705167061670716708167091671016711167121671316714167151671616717167181671916720167211672216723167241672516726167271672816729167301673116732167331673416735167361673716738167391674016741167421674316744167451674616747167481674916750167511675216753167541675516756167571675816759167601676116762167631676416765167661676716768167691677016771167721677316774167751677616777167781677916780167811678216783167841678516786167871678816789167901679116792167931679416795167961679716798167991680016801168021680316804168051680616807168081680916810168111681216813168141681516816168171681816819168201682116822168231682416825168261682716828168291683016831168321683316834168351683616837168381683916840168411684216843168441684516846168471684816849168501685116852168531685416855168561685716858168591686016861168621686316864168651686616867168681686916870168711687216873168741687516876168771687816879168801688116882168831688416885168861688716888168891689016891168921689316894168951689616897168981689916900169011690216903169041690516906169071690816909169101691116912169131691416915169161691716918169191692016921169221692316924169251692616927169281692916930169311693216933169341693516936169371693816939169401694116942169431694416945169461694716948169491695016951169521695316954169551695616957169581695916960169611696216963169641696516966169671696816969169701697116972169731697416975169761697716978169791698016981169821698316984169851698616987169881698916990169911699216993169941699516996169971699816999170001700117002170031700417005170061700717008170091701017011170121701317014170151701617017170181701917020170211702217023170241702517026170271702817029170301703117032170331703417035170361703717038170391704017041170421704317044170451704617047170481704917050170511705217053170541705517056170571705817059170601706117062170631706417065170661706717068170691707017071170721707317074170751707617077170781707917080170811708217083170841708517086170871708817089170901709117092170931709417095170961709717098170991710017101171021710317104171051710617107171081710917110171111711217113171141711517116171171711817119171201712117122171231712417125171261712717128171291713017131171321713317134171351713617137171381713917140171411714217143171441714517146171471714817149171501715117152171531715417155171561715717158171591716017161171621716317164171651716617167171681716917170171711717217173171741717517176171771717817179171801718117182171831718417185171861718717188171891719017191171921719317194171951719617197171981719917200172011720217203172041720517206172071720817209172101721117212172131721417215172161721717218172191722017221172221722317224172251722617227172281722917230172311723217233172341723517236172371723817239172401724117242172431724417245172461724717248172491725017251172521725317254172551725617257172581725917260172611726217263172641726517266172671726817269172701727117272172731727417275172761727717278172791728017281172821728317284172851728617287172881728917290172911729217293172941729517296172971729817299173001730117302173031730417305173061730717308173091731017311173121731317314173151731617317173181731917320173211732217323173241732517326173271732817329173301733117332173331733417335173361733717338173391734017341173421734317344173451734617347173481734917350173511735217353173541735517356173571735817359173601736117362173631736417365173661736717368173691737017371173721737317374173751737617377173781737917380173811738217383173841738517386173871738817389173901739117392173931739417395173961739717398173991740017401174021740317404174051740617407174081740917410174111741217413174141741517416174171741817419174201742117422174231742417425174261742717428174291743017431174321743317434174351743617437174381743917440174411744217443174441744517446174471744817449174501745117452174531745417455174561745717458174591746017461174621746317464174651746617467174681746917470174711747217473174741747517476174771747817479174801748117482174831748417485174861748717488174891749017491174921749317494174951749617497174981749917500175011750217503175041750517506175071750817509175101751117512175131751417515175161751717518175191752017521175221752317524175251752617527175281752917530175311753217533175341753517536175371753817539175401754117542175431754417545175461754717548175491755017551175521755317554175551755617557175581755917560175611756217563175641756517566175671756817569175701757117572175731757417575175761757717578175791758017581175821758317584175851758617587175881758917590175911759217593175941759517596175971759817599176001760117602176031760417605176061760717608176091761017611176121761317614176151761617617176181761917620176211762217623176241762517626176271762817629176301763117632176331763417635176361763717638176391764017641176421764317644176451764617647176481764917650176511765217653176541765517656176571765817659176601766117662176631766417665176661766717668176691767017671176721767317674176751767617677176781767917680176811768217683176841768517686176871768817689176901769117692176931769417695176961769717698176991770017701177021770317704177051770617707177081770917710177111771217713177141771517716177171771817719177201772117722177231772417725177261772717728177291773017731177321773317734177351773617737177381773917740177411774217743177441774517746177471774817749177501775117752177531775417755177561775717758177591776017761177621776317764177651776617767177681776917770177711777217773177741777517776177771777817779177801778117782177831778417785177861778717788177891779017791177921779317794177951779617797177981779917800178011780217803178041780517806178071780817809178101781117812178131781417815178161781717818178191782017821178221782317824178251782617827178281782917830178311783217833178341783517836178371783817839178401784117842178431784417845178461784717848178491785017851178521785317854178551785617857178581785917860178611786217863178641786517866178671786817869178701787117872178731787417875178761787717878178791788017881178821788317884178851788617887178881788917890178911789217893178941789517896178971789817899179001790117902179031790417905179061790717908179091791017911179121791317914179151791617917179181791917920179211792217923179241792517926179271792817929179301793117932179331793417935179361793717938179391794017941179421794317944179451794617947179481794917950179511795217953179541795517956179571795817959179601796117962179631796417965179661796717968179691797017971179721797317974179751797617977179781797917980179811798217983179841798517986179871798817989179901799117992179931799417995179961799717998179991800018001180021800318004180051800618007180081800918010180111801218013180141801518016180171801818019180201802118022180231802418025180261802718028180291803018031180321803318034180351803618037180381803918040180411804218043180441804518046180471804818049180501805118052180531805418055180561805718058180591806018061180621806318064180651806618067180681806918070180711807218073180741807518076180771807818079180801808118082180831808418085180861808718088180891809018091180921809318094180951809618097180981809918100181011810218103181041810518106181071810818109181101811118112181131811418115181161811718118181191812018121181221812318124181251812618127181281812918130181311813218133181341813518136181371813818139181401814118142181431814418145181461814718148181491815018151181521815318154181551815618157181581815918160181611816218163181641816518166181671816818169181701817118172181731817418175181761817718178181791818018181181821818318184181851818618187181881818918190181911819218193181941819518196181971819818199182001820118202182031820418205182061820718208182091821018211182121821318214182151821618217182181821918220182211822218223182241822518226182271822818229182301823118232182331823418235182361823718238182391824018241182421824318244182451824618247182481824918250182511825218253182541825518256182571825818259182601826118262182631826418265182661826718268182691827018271182721827318274182751827618277182781827918280182811828218283182841828518286182871828818289182901829118292182931829418295182961829718298182991830018301183021830318304183051830618307183081830918310183111831218313183141831518316183171831818319183201832118322183231832418325183261832718328183291833018331183321833318334183351833618337183381833918340183411834218343183441834518346183471834818349183501835118352183531835418355183561835718358183591836018361183621836318364183651836618367183681836918370183711837218373183741837518376183771837818379183801838118382183831838418385183861838718388183891839018391183921839318394183951839618397183981839918400184011840218403184041840518406184071840818409184101841118412184131841418415184161841718418184191842018421184221842318424184251842618427184281842918430184311843218433184341843518436184371843818439184401844118442184431844418445184461844718448184491845018451184521845318454184551845618457184581845918460184611846218463184641846518466184671846818469184701847118472184731847418475184761847718478184791848018481184821848318484184851848618487184881848918490184911849218493184941849518496184971849818499185001850118502185031850418505185061850718508185091851018511185121851318514185151851618517185181851918520185211852218523185241852518526185271852818529185301853118532185331853418535185361853718538185391854018541185421854318544185451854618547185481854918550185511855218553185541855518556185571855818559185601856118562185631856418565185661856718568185691857018571185721857318574185751857618577185781857918580185811858218583185841858518586185871858818589185901859118592185931859418595185961859718598185991860018601186021860318604186051860618607186081860918610186111861218613186141861518616186171861818619186201862118622186231862418625186261862718628186291863018631186321863318634186351863618637186381863918640186411864218643186441864518646186471864818649186501865118652186531865418655186561865718658186591866018661186621866318664186651866618667186681866918670186711867218673186741867518676186771867818679186801868118682186831868418685186861868718688186891869018691186921869318694186951869618697186981869918700187011870218703187041870518706187071870818709187101871118712187131871418715187161871718718187191872018721187221872318724187251872618727187281872918730187311873218733187341873518736187371873818739187401874118742187431874418745187461874718748187491875018751187521875318754187551875618757187581875918760187611876218763187641876518766187671876818769187701877118772187731877418775187761877718778187791878018781187821878318784187851878618787187881878918790187911879218793187941879518796187971879818799188001880118802188031880418805188061880718808188091881018811188121881318814188151881618817188181881918820188211882218823188241882518826188271882818829188301883118832188331883418835188361883718838188391884018841188421884318844188451884618847188481884918850188511885218853188541885518856188571885818859188601886118862188631886418865188661886718868188691887018871188721887318874188751887618877188781887918880188811888218883188841888518886188871888818889188901889118892188931889418895188961889718898188991890018901189021890318904189051890618907189081890918910189111891218913189141891518916189171891818919189201892118922189231892418925189261892718928189291893018931189321893318934189351893618937189381893918940189411894218943189441894518946189471894818949189501895118952189531895418955189561895718958189591896018961189621896318964189651896618967189681896918970189711897218973189741897518976189771897818979189801898118982189831898418985189861898718988189891899018991189921899318994189951899618997189981899919000190011900219003190041900519006190071900819009190101901119012190131901419015190161901719018190191902019021190221902319024190251902619027190281902919030190311903219033190341903519036190371903819039190401904119042190431904419045190461904719048190491905019051190521905319054190551905619057190581905919060190611906219063190641906519066190671906819069190701907119072190731907419075190761907719078190791908019081190821908319084190851908619087190881908919090190911909219093190941909519096190971909819099191001910119102191031910419105191061910719108191091911019111191121911319114191151911619117191181911919120191211912219123191241912519126191271912819129191301913119132191331913419135191361913719138191391914019141191421914319144191451914619147191481914919150191511915219153191541915519156191571915819159191601916119162191631916419165191661916719168191691917019171191721917319174191751917619177191781917919180191811918219183191841918519186191871918819189191901919119192191931919419195191961919719198191991920019201192021920319204192051920619207192081920919210192111921219213192141921519216192171921819219192201922119222192231922419225192261922719228192291923019231192321923319234192351923619237192381923919240192411924219243192441924519246192471924819249192501925119252192531925419255192561925719258192591926019261192621926319264192651926619267192681926919270192711927219273192741927519276192771927819279192801928119282192831928419285192861928719288192891929019291192921929319294192951929619297192981929919300193011930219303193041930519306193071930819309193101931119312193131931419315193161931719318193191932019321193221932319324193251932619327193281932919330193311933219333193341933519336193371933819339193401934119342193431934419345193461934719348193491935019351193521935319354193551935619357193581935919360193611936219363193641936519366193671936819369193701937119372193731937419375193761937719378193791938019381193821938319384193851938619387193881938919390193911939219393193941939519396193971939819399194001940119402194031940419405194061940719408194091941019411194121941319414194151941619417194181941919420194211942219423194241942519426194271942819429194301943119432194331943419435194361943719438194391944019441194421944319444194451944619447194481944919450194511945219453194541945519456194571945819459194601946119462194631946419465194661946719468194691947019471194721947319474194751947619477194781947919480194811948219483194841948519486194871948819489194901949119492194931949419495194961949719498194991950019501195021950319504195051950619507195081950919510195111951219513195141951519516195171951819519195201952119522195231952419525195261952719528195291953019531195321953319534195351953619537195381953919540195411954219543195441954519546195471954819549195501955119552195531955419555195561955719558195591956019561195621956319564195651956619567195681956919570195711957219573195741957519576195771957819579195801958119582195831958419585195861958719588195891959019591195921959319594195951959619597195981959919600196011960219603196041960519606196071960819609196101961119612196131961419615196161961719618196191962019621196221962319624196251962619627196281962919630196311963219633196341963519636196371963819639196401964119642196431964419645196461964719648196491965019651196521965319654196551965619657196581965919660196611966219663196641966519666196671966819669196701967119672196731967419675196761967719678196791968019681196821968319684196851968619687196881968919690196911969219693196941969519696196971969819699197001970119702197031970419705197061970719708197091971019711197121971319714197151971619717197181971919720197211972219723197241972519726197271972819729197301973119732197331973419735197361973719738197391974019741197421974319744197451974619747197481974919750197511975219753197541975519756197571975819759197601976119762197631976419765197661976719768197691977019771197721977319774197751977619777197781977919780197811978219783197841978519786197871978819789197901979119792197931979419795197961979719798197991980019801198021980319804198051980619807198081980919810198111981219813198141981519816198171981819819198201982119822198231982419825198261982719828198291983019831198321983319834198351983619837198381983919840198411984219843198441984519846198471984819849198501985119852198531985419855198561985719858198591986019861198621986319864198651986619867198681986919870198711987219873198741987519876198771987819879198801988119882198831988419885198861988719888198891989019891198921989319894198951989619897198981989919900199011990219903199041990519906199071990819909199101991119912199131991419915199161991719918199191992019921199221992319924199251992619927199281992919930199311993219933199341993519936199371993819939199401994119942199431994419945199461994719948199491995019951199521995319954199551995619957199581995919960199611996219963199641996519966199671996819969199701997119972199731997419975199761997719978199791998019981199821998319984199851998619987199881998919990199911999219993199941999519996199971999819999200002000120002200032000420005200062000720008200092001020011200122001320014200152001620017200182001920020200212002220023200242002520026200272002820029200302003120032200332003420035200362003720038200392004020041200422004320044200452004620047200482004920050200512005220053200542005520056200572005820059200602006120062200632006420065200662006720068200692007020071200722007320074200752007620077200782007920080200812008220083200842008520086200872008820089200902009120092200932009420095200962009720098200992010020101201022010320104201052010620107201082010920110201112011220113201142011520116201172011820119201202012120122201232012420125201262012720128201292013020131201322013320134201352013620137201382013920140201412014220143201442014520146201472014820149201502015120152201532015420155201562015720158201592016020161201622016320164201652016620167201682016920170201712017220173201742017520176201772017820179201802018120182201832018420185201862018720188201892019020191201922019320194201952019620197201982019920200202012020220203202042020520206202072020820209202102021120212202132021420215202162021720218202192022020221202222022320224202252022620227202282022920230202312023220233202342023520236202372023820239202402024120242202432024420245202462024720248202492025020251202522025320254202552025620257202582025920260202612026220263202642026520266202672026820269202702027120272202732027420275202762027720278202792028020281202822028320284202852028620287202882028920290202912029220293202942029520296202972029820299203002030120302203032030420305203062030720308203092031020311203122031320314203152031620317203182031920320203212032220323203242032520326203272032820329203302033120332203332033420335203362033720338203392034020341203422034320344203452034620347203482034920350203512035220353203542035520356203572035820359203602036120362203632036420365203662036720368203692037020371203722037320374203752037620377203782037920380203812038220383203842038520386203872038820389203902039120392203932039420395203962039720398203992040020401204022040320404204052040620407204082040920410204112041220413204142041520416204172041820419204202042120422204232042420425204262042720428204292043020431204322043320434204352043620437204382043920440204412044220443204442044520446204472044820449204502045120452204532045420455204562045720458204592046020461204622046320464204652046620467204682046920470204712047220473204742047520476204772047820479204802048120482204832048420485204862048720488204892049020491204922049320494204952049620497204982049920500205012050220503205042050520506205072050820509205102051120512205132051420515205162051720518205192052020521205222052320524205252052620527205282052920530205312053220533205342053520536205372053820539205402054120542205432054420545205462054720548205492055020551205522055320554205552055620557205582055920560205612056220563205642056520566205672056820569205702057120572205732057420575205762057720578205792058020581205822058320584205852058620587205882058920590205912059220593205942059520596205972059820599206002060120602206032060420605206062060720608206092061020611206122061320614206152061620617206182061920620206212062220623206242062520626206272062820629206302063120632206332063420635206362063720638206392064020641206422064320644206452064620647206482064920650206512065220653206542065520656206572065820659206602066120662206632066420665206662066720668206692067020671206722067320674206752067620677206782067920680206812068220683206842068520686206872068820689206902069120692206932069420695206962069720698206992070020701207022070320704207052070620707207082070920710207112071220713207142071520716207172071820719207202072120722207232072420725207262072720728207292073020731207322073320734207352073620737207382073920740207412074220743207442074520746207472074820749207502075120752207532075420755207562075720758207592076020761207622076320764207652076620767207682076920770207712077220773207742077520776207772077820779207802078120782207832078420785207862078720788207892079020791207922079320794207952079620797207982079920800208012080220803208042080520806208072080820809208102081120812208132081420815208162081720818208192082020821208222082320824208252082620827208282082920830208312083220833208342083520836208372083820839208402084120842208432084420845208462084720848208492085020851208522085320854208552085620857208582085920860208612086220863208642086520866208672086820869208702087120872208732087420875208762087720878208792088020881208822088320884208852088620887208882088920890208912089220893208942089520896208972089820899209002090120902209032090420905209062090720908209092091020911209122091320914209152091620917209182091920920209212092220923209242092520926209272092820929209302093120932209332093420935209362093720938209392094020941209422094320944209452094620947209482094920950209512095220953209542095520956209572095820959209602096120962209632096420965209662096720968209692097020971209722097320974209752097620977209782097920980209812098220983209842098520986209872098820989209902099120992209932099420995209962099720998209992100021001210022100321004210052100621007210082100921010210112101221013210142101521016210172101821019210202102121022210232102421025210262102721028210292103021031210322103321034210352103621037210382103921040210412104221043210442104521046210472104821049210502105121052210532105421055210562105721058210592106021061210622106321064210652106621067210682106921070210712107221073210742107521076210772107821079210802108121082210832108421085210862108721088210892109021091210922109321094210952109621097210982109921100211012110221103211042110521106211072110821109211102111121112211132111421115211162111721118211192112021121211222112321124211252112621127211282112921130211312113221133211342113521136211372113821139211402114121142211432114421145211462114721148211492115021151211522115321154211552115621157211582115921160211612116221163211642116521166211672116821169211702117121172211732117421175211762117721178211792118021181211822118321184211852118621187211882118921190211912119221193211942119521196211972119821199212002120121202212032120421205212062120721208212092121021211212122121321214212152121621217212182121921220212212122221223212242122521226212272122821229212302123121232212332123421235212362123721238212392124021241212422124321244212452124621247212482124921250212512125221253212542125521256212572125821259212602126121262212632126421265212662126721268212692127021271212722127321274212752127621277212782127921280212812128221283212842128521286212872128821289212902129121292212932129421295212962129721298212992130021301213022130321304213052130621307213082130921310213112131221313213142131521316213172131821319213202132121322213232132421325213262132721328213292133021331213322133321334213352133621337213382133921340213412134221343213442134521346213472134821349213502135121352213532135421355213562135721358213592136021361213622136321364213652136621367213682136921370213712137221373213742137521376213772137821379213802138121382213832138421385213862138721388213892139021391213922139321394213952139621397213982139921400214012140221403214042140521406214072140821409214102141121412214132141421415214162141721418214192142021421214222142321424214252142621427214282142921430214312143221433214342143521436214372143821439214402144121442214432144421445214462144721448214492145021451214522145321454214552145621457214582145921460214612146221463214642146521466214672146821469214702147121472214732147421475214762147721478214792148021481214822148321484214852148621487214882148921490214912149221493214942149521496214972149821499215002150121502215032150421505215062150721508215092151021511215122151321514215152151621517215182151921520215212152221523215242152521526215272152821529215302153121532215332153421535215362153721538215392154021541215422154321544215452154621547215482154921550215512155221553215542155521556215572155821559215602156121562215632156421565215662156721568215692157021571215722157321574215752157621577215782157921580215812158221583215842158521586215872158821589215902159121592215932159421595215962159721598215992160021601216022160321604216052160621607216082160921610216112161221613216142161521616216172161821619216202162121622216232162421625216262162721628216292163021631216322163321634216352163621637216382163921640216412164221643216442164521646216472164821649216502165121652216532165421655216562165721658216592166021661216622166321664216652166621667216682166921670216712167221673216742167521676216772167821679216802168121682216832168421685216862168721688216892169021691216922169321694216952169621697216982169921700217012170221703217042170521706217072170821709217102171121712217132171421715217162171721718217192172021721217222172321724217252172621727217282172921730217312173221733217342173521736217372173821739217402174121742217432174421745217462174721748217492175021751217522175321754217552175621757217582175921760217612176221763217642176521766217672176821769217702177121772217732177421775217762177721778217792178021781217822178321784217852178621787217882178921790217912179221793217942179521796217972179821799218002180121802218032180421805218062180721808218092181021811218122181321814218152181621817218182181921820218212182221823218242182521826218272182821829218302183121832218332183421835218362183721838218392184021841218422184321844218452184621847218482184921850218512185221853218542185521856218572185821859218602186121862218632186421865218662186721868218692187021871218722187321874218752187621877218782187921880218812188221883218842188521886218872188821889218902189121892218932189421895218962189721898218992190021901219022190321904219052190621907219082190921910219112191221913219142191521916219172191821919219202192121922219232192421925219262192721928219292193021931219322193321934219352193621937219382193921940219412194221943219442194521946219472194821949219502195121952219532195421955219562195721958219592196021961219622196321964219652196621967219682196921970219712197221973219742197521976219772197821979219802198121982219832198421985219862198721988219892199021991219922199321994219952199621997219982199922000220012200222003220042200522006220072200822009220102201122012220132201422015220162201722018220192202022021220222202322024220252202622027220282202922030220312203222033220342203522036220372203822039220402204122042220432204422045220462204722048220492205022051220522205322054220552205622057220582205922060220612206222063220642206522066220672206822069220702207122072220732207422075220762207722078220792208022081220822208322084220852208622087220882208922090220912209222093220942209522096220972209822099221002210122102221032210422105221062210722108221092211022111221122211322114221152211622117221182211922120221212212222123221242212522126221272212822129221302213122132221332213422135221362213722138221392214022141221422214322144221452214622147221482214922150221512215222153221542215522156221572215822159221602216122162221632216422165221662216722168221692217022171221722217322174221752217622177221782217922180221812218222183221842218522186221872218822189221902219122192221932219422195221962219722198221992220022201222022220322204222052220622207222082220922210222112221222213222142221522216222172221822219222202222122222222232222422225222262222722228222292223022231222322223322234222352223622237222382223922240222412224222243222442224522246222472224822249222502225122252222532225422255222562225722258222592226022261222622226322264222652226622267222682226922270222712227222273222742227522276222772227822279222802228122282222832228422285222862228722288222892229022291222922229322294222952229622297222982229922300223012230222303223042230522306223072230822309223102231122312223132231422315223162231722318223192232022321223222232322324223252232622327223282232922330223312233222333223342233522336223372233822339223402234122342223432234422345223462234722348223492235022351223522235322354223552235622357223582235922360223612236222363223642236522366223672236822369223702237122372223732237422375223762237722378223792238022381223822238322384223852238622387223882238922390223912239222393223942239522396223972239822399224002240122402224032240422405224062240722408224092241022411224122241322414224152241622417224182241922420224212242222423224242242522426224272242822429224302243122432224332243422435224362243722438224392244022441224422244322444224452244622447224482244922450224512245222453224542245522456224572245822459224602246122462224632246422465224662246722468224692247022471224722247322474224752247622477224782247922480224812248222483224842248522486224872248822489224902249122492224932249422495224962249722498224992250022501225022250322504225052250622507225082250922510225112251222513225142251522516225172251822519225202252122522225232252422525225262252722528225292253022531225322253322534225352253622537225382253922540225412254222543225442254522546225472254822549225502255122552225532255422555225562255722558225592256022561225622256322564225652256622567225682256922570225712257222573225742257522576225772257822579225802258122582225832258422585225862258722588225892259022591225922259322594225952259622597225982259922600226012260222603226042260522606226072260822609226102261122612226132261422615226162261722618226192262022621226222262322624226252262622627226282262922630226312263222633226342263522636226372263822639226402264122642226432264422645226462264722648226492265022651226522265322654226552265622657226582265922660226612266222663226642266522666226672266822669226702267122672226732267422675226762267722678226792268022681226822268322684226852268622687226882268922690226912269222693226942269522696226972269822699227002270122702227032270422705227062270722708227092271022711227122271322714227152271622717227182271922720227212272222723227242272522726227272272822729227302273122732227332273422735227362273722738227392274022741227422274322744227452274622747227482274922750227512275222753227542275522756227572275822759227602276122762227632276422765227662276722768227692277022771227722277322774227752277622777227782277922780227812278222783227842278522786227872278822789227902279122792227932279422795227962279722798227992280022801228022280322804228052280622807228082280922810228112281222813228142281522816228172281822819228202282122822228232282422825228262282722828228292283022831228322283322834228352283622837228382283922840228412284222843228442284522846228472284822849228502285122852228532285422855228562285722858228592286022861228622286322864228652286622867228682286922870228712287222873228742287522876228772287822879228802288122882228832288422885228862288722888228892289022891228922289322894228952289622897228982289922900229012290222903229042290522906229072290822909229102291122912229132291422915229162291722918229192292022921229222292322924229252292622927229282292922930229312293222933229342293522936229372293822939229402294122942229432294422945229462294722948229492295022951229522295322954229552295622957229582295922960229612296222963229642296522966229672296822969229702297122972229732297422975229762297722978229792298022981229822298322984229852298622987229882298922990229912299222993229942299522996229972299822999230002300123002230032300423005230062300723008230092301023011230122301323014230152301623017230182301923020230212302223023230242302523026230272302823029230302303123032230332303423035230362303723038230392304023041230422304323044230452304623047230482304923050230512305223053230542305523056230572305823059230602306123062230632306423065230662306723068230692307023071230722307323074230752307623077230782307923080230812308223083230842308523086230872308823089230902309123092230932309423095230962309723098230992310023101231022310323104231052310623107231082310923110231112311223113231142311523116231172311823119231202312123122231232312423125231262312723128231292313023131231322313323134231352313623137231382313923140231412314223143231442314523146231472314823149231502315123152231532315423155231562315723158231592316023161231622316323164231652316623167231682316923170231712317223173231742317523176231772317823179231802318123182231832318423185231862318723188231892319023191231922319323194231952319623197231982319923200232012320223203232042320523206232072320823209232102321123212232132321423215232162321723218232192322023221232222322323224232252322623227232282322923230232312323223233232342323523236232372323823239232402324123242232432324423245232462324723248232492325023251232522325323254232552325623257232582325923260232612326223263232642326523266232672326823269232702327123272232732327423275232762327723278232792328023281232822328323284232852328623287232882328923290232912329223293232942329523296232972329823299233002330123302233032330423305233062330723308233092331023311233122331323314233152331623317233182331923320233212332223323233242332523326233272332823329233302333123332233332333423335233362333723338233392334023341233422334323344233452334623347233482334923350233512335223353233542335523356233572335823359233602336123362233632336423365233662336723368233692337023371233722337323374233752337623377233782337923380233812338223383233842338523386233872338823389233902339123392233932339423395233962339723398233992340023401234022340323404234052340623407234082340923410234112341223413234142341523416234172341823419234202342123422234232342423425234262342723428234292343023431234322343323434234352343623437234382343923440234412344223443234442344523446234472344823449234502345123452234532345423455234562345723458234592346023461234622346323464234652346623467234682346923470234712347223473234742347523476234772347823479234802348123482234832348423485234862348723488234892349023491234922349323494234952349623497234982349923500235012350223503235042350523506235072350823509235102351123512235132351423515235162351723518235192352023521235222352323524235252352623527235282352923530235312353223533235342353523536235372353823539235402354123542235432354423545235462354723548235492355023551235522355323554235552355623557235582355923560235612356223563235642356523566235672356823569235702357123572235732357423575235762357723578235792358023581235822358323584235852358623587235882358923590235912359223593235942359523596235972359823599236002360123602236032360423605236062360723608236092361023611236122361323614236152361623617236182361923620236212362223623236242362523626236272362823629236302363123632236332363423635236362363723638236392364023641236422364323644236452364623647236482364923650236512365223653236542365523656236572365823659236602366123662236632366423665236662366723668236692367023671236722367323674236752367623677236782367923680236812368223683236842368523686236872368823689236902369123692236932369423695236962369723698236992370023701237022370323704237052370623707237082370923710237112371223713237142371523716237172371823719237202372123722237232372423725237262372723728237292373023731237322373323734237352373623737237382373923740237412374223743237442374523746237472374823749237502375123752237532375423755237562375723758237592376023761237622376323764237652376623767237682376923770237712377223773237742377523776237772377823779237802378123782237832378423785237862378723788237892379023791237922379323794237952379623797237982379923800238012380223803238042380523806238072380823809238102381123812238132381423815238162381723818238192382023821238222382323824238252382623827238282382923830238312383223833238342383523836238372383823839238402384123842238432384423845238462384723848238492385023851238522385323854238552385623857238582385923860238612386223863238642386523866238672386823869238702387123872238732387423875238762387723878238792388023881238822388323884238852388623887238882388923890238912389223893238942389523896238972389823899239002390123902239032390423905239062390723908239092391023911239122391323914239152391623917239182391923920239212392223923239242392523926239272392823929239302393123932239332393423935239362393723938239392394023941239422394323944239452394623947239482394923950239512395223953239542395523956239572395823959239602396123962239632396423965239662396723968239692397023971239722397323974239752397623977239782397923980239812398223983239842398523986239872398823989239902399123992239932399423995239962399723998239992400024001240022400324004240052400624007240082400924010240112401224013240142401524016240172401824019240202402124022240232402424025240262402724028240292403024031240322403324034240352403624037240382403924040240412404224043240442404524046240472404824049240502405124052240532405424055240562405724058240592406024061240622406324064240652406624067240682406924070240712407224073240742407524076240772407824079240802408124082240832408424085240862408724088240892409024091240922409324094240952409624097240982409924100241012410224103241042410524106241072410824109241102411124112241132411424115241162411724118241192412024121241222412324124241252412624127241282412924130241312413224133241342413524136241372413824139241402414124142241432414424145241462414724148241492415024151241522415324154241552415624157241582415924160241612416224163241642416524166241672416824169241702417124172241732417424175241762417724178241792418024181241822418324184241852418624187241882418924190241912419224193241942419524196241972419824199242002420124202242032420424205242062420724208242092421024211242122421324214242152421624217242182421924220242212422224223242242422524226242272422824229242302423124232242332423424235242362423724238242392424024241242422424324244242452424624247242482424924250242512425224253242542425524256242572425824259242602426124262242632426424265242662426724268242692427024271242722427324274242752427624277242782427924280242812428224283242842428524286242872428824289242902429124292242932429424295242962429724298242992430024301243022430324304243052430624307243082430924310243112431224313243142431524316243172431824319243202432124322243232432424325243262432724328243292433024331243322433324334243352433624337243382433924340243412434224343243442434524346243472434824349243502435124352243532435424355243562435724358243592436024361243622436324364243652436624367243682436924370243712437224373243742437524376243772437824379243802438124382243832438424385243862438724388243892439024391243922439324394243952439624397243982439924400244012440224403244042440524406244072440824409244102441124412244132441424415244162441724418244192442024421244222442324424244252442624427244282442924430244312443224433244342443524436244372443824439244402444124442244432444424445244462444724448244492445024451244522445324454244552445624457244582445924460244612446224463244642446524466244672446824469244702447124472244732447424475244762447724478244792448024481244822448324484244852448624487244882448924490244912449224493244942449524496244972449824499245002450124502245032450424505245062450724508245092451024511245122451324514245152451624517245182451924520245212452224523245242452524526245272452824529245302453124532245332453424535245362453724538245392454024541245422454324544245452454624547245482454924550245512455224553245542455524556245572455824559245602456124562245632456424565245662456724568245692457024571245722457324574245752457624577245782457924580245812458224583245842458524586245872458824589245902459124592245932459424595245962459724598245992460024601246022460324604246052460624607246082460924610246112461224613246142461524616246172461824619246202462124622246232462424625246262462724628246292463024631246322463324634246352463624637246382463924640246412464224643246442464524646246472464824649246502465124652246532465424655246562465724658246592466024661246622466324664246652466624667246682466924670246712467224673246742467524676246772467824679246802468124682246832468424685246862468724688246892469024691246922469324694246952469624697246982469924700247012470224703247042470524706247072470824709247102471124712247132471424715247162471724718247192472024721247222472324724247252472624727247282472924730247312473224733247342473524736247372473824739247402474124742247432474424745247462474724748247492475024751247522475324754247552475624757247582475924760247612476224763247642476524766247672476824769247702477124772247732477424775247762477724778247792478024781247822478324784247852478624787247882478924790247912479224793247942479524796247972479824799248002480124802248032480424805248062480724808248092481024811248122481324814248152481624817248182481924820248212482224823248242482524826248272482824829248302483124832248332483424835248362483724838248392484024841248422484324844248452484624847248482484924850248512485224853248542485524856248572485824859248602486124862248632486424865248662486724868248692487024871248722487324874248752487624877248782487924880248812488224883248842488524886248872488824889248902489124892248932489424895248962489724898248992490024901249022490324904249052490624907249082490924910249112491224913249142491524916249172491824919249202492124922249232492424925249262492724928249292493024931249322493324934249352493624937249382493924940249412494224943249442494524946249472494824949249502495124952249532495424955249562495724958249592496024961249622496324964249652496624967249682496924970249712497224973249742497524976249772497824979249802498124982249832498424985249862498724988249892499024991249922499324994249952499624997249982499925000250012500225003250042500525006250072500825009250102501125012250132501425015250162501725018250192502025021250222502325024250252502625027250282502925030250312503225033250342503525036250372503825039250402504125042250432504425045250462504725048250492505025051250522505325054250552505625057250582505925060250612506225063250642506525066250672506825069250702507125072250732507425075250762507725078250792508025081250822508325084250852508625087250882508925090250912509225093250942509525096250972509825099251002510125102251032510425105251062510725108251092511025111251122511325114251152511625117251182511925120251212512225123251242512525126251272512825129251302513125132251332513425135251362513725138251392514025141251422514325144251452514625147251482514925150251512515225153251542515525156251572515825159251602516125162251632516425165251662516725168251692517025171251722517325174251752517625177251782517925180251812518225183251842518525186251872518825189251902519125192251932519425195251962519725198251992520025201252022520325204252052520625207252082520925210252112521225213252142521525216252172521825219252202522125222252232522425225252262522725228252292523025231252322523325234252352523625237252382523925240252412524225243252442524525246252472524825249252502525125252252532525425255252562525725258252592526025261252622526325264252652526625267252682526925270252712527225273252742527525276252772527825279252802528125282252832528425285252862528725288252892529025291252922529325294252952529625297252982529925300253012530225303253042530525306253072530825309253102531125312253132531425315253162531725318253192532025321253222532325324253252532625327253282532925330253312533225333253342533525336253372533825339253402534125342253432534425345253462534725348253492535025351253522535325354253552535625357253582535925360253612536225363253642536525366253672536825369253702537125372253732537425375253762537725378253792538025381253822538325384253852538625387253882538925390253912539225393253942539525396253972539825399254002540125402254032540425405254062540725408254092541025411254122541325414254152541625417254182541925420254212542225423254242542525426254272542825429254302543125432254332543425435254362543725438254392544025441254422544325444254452544625447254482544925450254512545225453254542545525456254572545825459254602546125462254632546425465254662546725468254692547025471254722547325474254752547625477254782547925480254812548225483254842548525486254872548825489254902549125492254932549425495254962549725498254992550025501255022550325504255052550625507255082550925510255112551225513255142551525516255172551825519255202552125522255232552425525255262552725528255292553025531255322553325534255352553625537255382553925540255412554225543255442554525546255472554825549255502555125552255532555425555255562555725558255592556025561255622556325564255652556625567255682556925570255712557225573255742557525576255772557825579255802558125582255832558425585255862558725588255892559025591255922559325594255952559625597255982559925600256012560225603256042560525606256072560825609256102561125612256132561425615256162561725618256192562025621256222562325624256252562625627256282562925630256312563225633256342563525636256372563825639256402564125642256432564425645256462564725648256492565025651256522565325654256552565625657256582565925660256612566225663256642566525666256672566825669256702567125672256732567425675256762567725678256792568025681256822568325684256852568625687256882568925690256912569225693256942569525696256972569825699257002570125702257032570425705257062570725708257092571025711257122571325714257152571625717257182571925720257212572225723257242572525726257272572825729257302573125732257332573425735257362573725738257392574025741257422574325744257452574625747257482574925750257512575225753257542575525756257572575825759257602576125762257632576425765257662576725768257692577025771257722577325774257752577625777257782577925780257812578225783257842578525786257872578825789257902579125792257932579425795257962579725798257992580025801258022580325804258052580625807258082580925810258112581225813258142581525816258172581825819258202582125822258232582425825258262582725828258292583025831258322583325834258352583625837258382583925840258412584225843258442584525846258472584825849258502585125852258532585425855258562585725858258592586025861258622586325864258652586625867258682586925870258712587225873258742587525876258772587825879258802588125882258832588425885258862588725888258892589025891258922589325894258952589625897258982589925900259012590225903259042590525906259072590825909259102591125912259132591425915259162591725918259192592025921259222592325924259252592625927259282592925930259312593225933259342593525936259372593825939259402594125942259432594425945259462594725948259492595025951259522595325954259552595625957259582595925960259612596225963259642596525966259672596825969259702597125972259732597425975259762597725978259792598025981259822598325984259852598625987259882598925990259912599225993259942599525996259972599825999260002600126002260032600426005260062600726008260092601026011260122601326014260152601626017260182601926020260212602226023260242602526026260272602826029260302603126032260332603426035260362603726038260392604026041260422604326044260452604626047260482604926050260512605226053260542605526056260572605826059260602606126062260632606426065260662606726068260692607026071260722607326074260752607626077260782607926080260812608226083260842608526086260872608826089260902609126092260932609426095260962609726098260992610026101261022610326104261052610626107261082610926110261112611226113261142611526116261172611826119261202612126122261232612426125261262612726128261292613026131261322613326134261352613626137261382613926140261412614226143261442614526146261472614826149261502615126152261532615426155261562615726158261592616026161261622616326164261652616626167261682616926170261712617226173261742617526176261772617826179261802618126182261832618426185261862618726188261892619026191261922619326194261952619626197261982619926200262012620226203262042620526206262072620826209262102621126212262132621426215262162621726218262192622026221262222622326224262252622626227262282622926230262312623226233262342623526236262372623826239262402624126242262432624426245262462624726248262492625026251262522625326254262552625626257262582625926260262612626226263262642626526266262672626826269262702627126272262732627426275262762627726278262792628026281262822628326284262852628626287262882628926290262912629226293262942629526296262972629826299263002630126302263032630426305263062630726308263092631026311263122631326314263152631626317263182631926320263212632226323263242632526326263272632826329263302633126332263332633426335263362633726338263392634026341263422634326344263452634626347263482634926350263512635226353263542635526356263572635826359263602636126362263632636426365263662636726368263692637026371263722637326374263752637626377263782637926380263812638226383263842638526386263872638826389263902639126392263932639426395263962639726398263992640026401264022640326404264052640626407264082640926410264112641226413264142641526416264172641826419264202642126422264232642426425264262642726428264292643026431264322643326434264352643626437264382643926440264412644226443264442644526446264472644826449264502645126452264532645426455264562645726458264592646026461264622646326464264652646626467264682646926470264712647226473264742647526476264772647826479264802648126482264832648426485264862648726488264892649026491264922649326494264952649626497264982649926500265012650226503265042650526506265072650826509265102651126512265132651426515265162651726518265192652026521265222652326524265252652626527265282652926530265312653226533265342653526536265372653826539265402654126542265432654426545265462654726548265492655026551265522655326554265552655626557265582655926560265612656226563265642656526566265672656826569265702657126572265732657426575265762657726578265792658026581265822658326584265852658626587265882658926590265912659226593265942659526596265972659826599266002660126602266032660426605266062660726608266092661026611266122661326614266152661626617266182661926620266212662226623266242662526626266272662826629266302663126632266332663426635266362663726638266392664026641266422664326644266452664626647266482664926650266512665226653266542665526656266572665826659266602666126662266632666426665266662666726668266692667026671266722667326674266752667626677266782667926680266812668226683266842668526686266872668826689266902669126692266932669426695266962669726698266992670026701267022670326704267052670626707267082670926710267112671226713267142671526716267172671826719267202672126722267232672426725267262672726728267292673026731267322673326734267352673626737267382673926740267412674226743267442674526746267472674826749267502675126752267532675426755267562675726758267592676026761267622676326764267652676626767267682676926770267712677226773267742677526776267772677826779267802678126782267832678426785267862678726788267892679026791267922679326794267952679626797267982679926800268012680226803268042680526806268072680826809268102681126812268132681426815268162681726818268192682026821268222682326824268252682626827268282682926830268312683226833268342683526836268372683826839268402684126842268432684426845268462684726848268492685026851268522685326854268552685626857268582685926860268612686226863268642686526866268672686826869268702687126872268732687426875268762687726878268792688026881268822688326884268852688626887268882688926890268912689226893268942689526896268972689826899269002690126902269032690426905269062690726908269092691026911269122691326914269152691626917269182691926920269212692226923269242692526926269272692826929269302693126932269332693426935269362693726938269392694026941269422694326944269452694626947269482694926950269512695226953269542695526956269572695826959269602696126962269632696426965269662696726968269692697026971269722697326974269752697626977269782697926980269812698226983269842698526986269872698826989269902699126992269932699426995269962699726998269992700027001270022700327004270052700627007270082700927010270112701227013270142701527016270172701827019270202702127022270232702427025270262702727028270292703027031270322703327034270352703627037270382703927040270412704227043270442704527046270472704827049270502705127052270532705427055270562705727058270592706027061270622706327064270652706627067270682706927070270712707227073270742707527076270772707827079270802708127082270832708427085270862708727088270892709027091270922709327094270952709627097270982709927100271012710227103271042710527106271072710827109271102711127112271132711427115271162711727118271192712027121271222712327124271252712627127271282712927130271312713227133271342713527136271372713827139271402714127142271432714427145271462714727148271492715027151271522715327154271552715627157271582715927160271612716227163271642716527166271672716827169271702717127172271732717427175271762717727178271792718027181271822718327184271852718627187271882718927190271912719227193271942719527196271972719827199272002720127202272032720427205272062720727208272092721027211272122721327214272152721627217272182721927220272212722227223272242722527226272272722827229272302723127232272332723427235272362723727238272392724027241272422724327244272452724627247272482724927250272512725227253272542725527256272572725827259272602726127262272632726427265272662726727268272692727027271272722727327274272752727627277272782727927280272812728227283272842728527286272872728827289272902729127292272932729427295272962729727298272992730027301273022730327304273052730627307273082730927310273112731227313273142731527316273172731827319273202732127322273232732427325273262732727328273292733027331273322733327334273352733627337273382733927340273412734227343273442734527346273472734827349273502735127352273532735427355273562735727358273592736027361273622736327364273652736627367273682736927370273712737227373273742737527376273772737827379273802738127382273832738427385273862738727388273892739027391273922739327394273952739627397273982739927400274012740227403274042740527406274072740827409274102741127412274132741427415274162741727418274192742027421274222742327424274252742627427274282742927430274312743227433274342743527436274372743827439274402744127442274432744427445274462744727448274492745027451274522745327454274552745627457274582745927460274612746227463274642746527466274672746827469274702747127472274732747427475274762747727478274792748027481274822748327484274852748627487274882748927490274912749227493274942749527496274972749827499275002750127502275032750427505275062750727508275092751027511 | 
							- (function() {
 
-   var AjaxMonitor, Bar, DocumentMonitor, ElementMonitor, ElementTracker, EventLagMonitor, Evented, Events, NoTargetError, Pace, RequestIntercept, SOURCE_KEYS, Scaler, SocketRequestTracker, XHRRequestTracker, animation, avgAmplitude, bar, cancelAnimation, cancelAnimationFrame, defaultOptions, extend, extendNative, getFromDOM, getIntercept, handlePushState, ignoreStack, init, now, options, requestAnimationFrame, result, runAnimation, scalers, shouldIgnoreURL, shouldTrack, source, sources, uniScaler, _WebSocket, _XDomainRequest, _XMLHttpRequest, _i, _intercept, _len, _pushState, _ref, _ref1, _replaceState,
 
-     __slice = [].slice,
 
-     __hasProp = {}.hasOwnProperty,
 
-     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
 
-     __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
 
-   defaultOptions = {
 
-     catchupTime: 100,
 
-     initialRate: .03,
 
-     minTime: 250,
 
-     ghostTime: 100,
 
-     maxProgressPerFrame: 20,
 
-     easeFactor: 1.25,
 
-     startOnPageLoad: true,
 
-     restartOnPushState: true,
 
-     restartOnRequestAfter: 500,
 
-     target: 'body',
 
-     elements: {
 
-       checkInterval: 100,
 
-       selectors: ['body']
 
-     },
 
-     eventLag: {
 
-       minSamples: 10,
 
-       sampleCount: 3,
 
-       lagThreshold: 3
 
-     },
 
-     ajax: {
 
-       trackMethods: ['GET'],
 
-       trackWebSockets: true,
 
-       ignoreURLs: []
 
-     }
 
-   };
 
-   now = function() {
 
-     var _ref;
 
-     return (_ref = typeof performance !== "undefined" && performance !== null ? typeof performance.now === "function" ? performance.now() : void 0 : void 0) != null ? _ref : +(new Date);
 
-   };
 
-   requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;
 
-   cancelAnimationFrame = window.cancelAnimationFrame || window.mozCancelAnimationFrame;
 
-   if (requestAnimationFrame == null) {
 
-     requestAnimationFrame = function(fn) {
 
-       return setTimeout(fn, 50);
 
-     };
 
-     cancelAnimationFrame = function(id) {
 
-       return clearTimeout(id);
 
-     };
 
-   }
 
-   runAnimation = function(fn) {
 
-     var last, tick;
 
-     last = now();
 
-     tick = function() {
 
-       var diff;
 
-       diff = now() - last;
 
-       if (diff >= 33) {
 
-         last = now();
 
-         return fn(diff, function() {
 
-           return requestAnimationFrame(tick);
 
-         });
 
-       } else {
 
-         return setTimeout(tick, 33 - diff);
 
-       }
 
-     };
 
-     return tick();
 
-   };
 
-   result = function() {
 
-     var args, key, obj;
 
-     obj = arguments[0], key = arguments[1], args = 3 <= arguments.length ? __slice.call(arguments, 2) : [];
 
-     if (typeof obj[key] === 'function') {
 
-       return obj[key].apply(obj, args);
 
-     } else {
 
-       return obj[key];
 
-     }
 
-   };
 
-   extend = function() {
 
-     var key, out, source, sources, val, _i, _len;
 
-     out = arguments[0], sources = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
 
-     for (_i = 0, _len = sources.length; _i < _len; _i++) {
 
-       source = sources[_i];
 
-       if (source) {
 
-         for (key in source) {
 
-           if (!__hasProp.call(source, key)) continue;
 
-           val = source[key];
 
-           if ((out[key] != null) && typeof out[key] === 'object' && (val != null) && typeof val === 'object') {
 
-             extend(out[key], val);
 
-           } else {
 
-             out[key] = val;
 
-           }
 
-         }
 
-       }
 
-     }
 
-     return out;
 
-   };
 
-   avgAmplitude = function(arr) {
 
-     var count, sum, v, _i, _len;
 
-     sum = count = 0;
 
-     for (_i = 0, _len = arr.length; _i < _len; _i++) {
 
-       v = arr[_i];
 
-       sum += Math.abs(v);
 
-       count++;
 
-     }
 
-     return sum / count;
 
-   };
 
-   getFromDOM = function(key, json) {
 
-     var data, e, el;
 
-     if (key == null) {
 
-       key = 'options';
 
-     }
 
-     if (json == null) {
 
-       json = true;
 
-     }
 
-     el = document.querySelector("[data-pace-" + key + "]");
 
-     if (!el) {
 
-       return;
 
-     }
 
-     data = el.getAttribute("data-pace-" + key);
 
-     if (!json) {
 
-       return data;
 
-     }
 
-     try {
 
-       return JSON.parse(data);
 
-     } catch (_error) {
 
-       e = _error;
 
-       return typeof console !== "undefined" && console !== null ? console.error("Error parsing inline pace options", e) : void 0;
 
-     }
 
-   };
 
-   Evented = (function() {
 
-     function Evented() {}
 
-     Evented.prototype.on = function(event, handler, ctx, once) {
 
-       var _base;
 
-       if (once == null) {
 
-         once = false;
 
-       }
 
-       if (this.bindings == null) {
 
-         this.bindings = {};
 
-       }
 
-       if ((_base = this.bindings)[event] == null) {
 
-         _base[event] = [];
 
-       }
 
-       return this.bindings[event].push({
 
-         handler: handler,
 
-         ctx: ctx,
 
-         once: once
 
-       });
 
-     };
 
-     Evented.prototype.once = function(event, handler, ctx) {
 
-       return this.on(event, handler, ctx, true);
 
-     };
 
-     Evented.prototype.off = function(event, handler) {
 
-       var i, _ref, _results;
 
-       if (((_ref = this.bindings) != null ? _ref[event] : void 0) == null) {
 
-         return;
 
-       }
 
-       if (handler == null) {
 
-         return delete this.bindings[event];
 
-       } else {
 
-         i = 0;
 
-         _results = [];
 
-         while (i < this.bindings[event].length) {
 
-           if (this.bindings[event][i].handler === handler) {
 
-             _results.push(this.bindings[event].splice(i, 1));
 
-           } else {
 
-             _results.push(i++);
 
-           }
 
-         }
 
-         return _results;
 
-       }
 
-     };
 
-     Evented.prototype.trigger = function() {
 
-       var args, ctx, event, handler, i, once, _ref, _ref1, _results;
 
-       event = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
 
-       if ((_ref = this.bindings) != null ? _ref[event] : void 0) {
 
-         i = 0;
 
-         _results = [];
 
-         while (i < this.bindings[event].length) {
 
-           _ref1 = this.bindings[event][i], handler = _ref1.handler, ctx = _ref1.ctx, once = _ref1.once;
 
-           handler.apply(ctx != null ? ctx : this, args);
 
-           if (once) {
 
-             _results.push(this.bindings[event].splice(i, 1));
 
-           } else {
 
-             _results.push(i++);
 
-           }
 
-         }
 
-         return _results;
 
-       }
 
-     };
 
-     return Evented;
 
-   })();
 
-   Pace = window.Pace || {};
 
-   window.Pace = Pace;
 
-   extend(Pace, Evented.prototype);
 
-   options = Pace.options = extend({}, defaultOptions, window.paceOptions, getFromDOM());
 
-   _ref = ['ajax', 'document', 'eventLag', 'elements'];
 
-   for (_i = 0, _len = _ref.length; _i < _len; _i++) {
 
-     source = _ref[_i];
 
-     if (options[source] === true) {
 
-       options[source] = defaultOptions[source];
 
-     }
 
-   }
 
-   NoTargetError = (function(_super) {
 
-     __extends(NoTargetError, _super);
 
-     function NoTargetError() {
 
-       _ref1 = NoTargetError.__super__.constructor.apply(this, arguments);
 
-       return _ref1;
 
-     }
 
-     return NoTargetError;
 
-   })(Error);
 
-   Bar = (function() {
 
-     function Bar() {
 
-       this.progress = 0;
 
-     }
 
-     Bar.prototype.getElement = function() {
 
-       var targetElement;
 
-       if (this.el == null) {
 
-         targetElement = document.querySelector(options.target);
 
-         if (!targetElement) {
 
-           throw new NoTargetError;
 
-         }
 
-         this.el = document.createElement('div');
 
-         this.el.className = "pace pace-active";
 
-         document.body.className = document.body.className.replace(/pace-done/g, '');
 
-         document.body.className += ' pace-running';
 
-         this.el.innerHTML = '<div class="pace-progress">\n  <div class="pace-progress-inner"></div>\n</div>\n<div class="pace-activity"></div>';
 
-         if (targetElement.firstChild != null) {
 
-           targetElement.insertBefore(this.el, targetElement.firstChild);
 
-         } else {
 
-           targetElement.appendChild(this.el);
 
-         }
 
-       }
 
-       return this.el;
 
-     };
 
-     Bar.prototype.finish = function() {
 
-       var el;
 
-       el = this.getElement();
 
-       el.className = el.className.replace('pace-active', '');
 
-       el.className += ' pace-inactive';
 
-       document.body.className = document.body.className.replace('pace-running', '');
 
-       return document.body.className += ' pace-done';
 
-     };
 
-     Bar.prototype.update = function(prog) {
 
-       this.progress = prog;
 
-       return this.render();
 
-     };
 
-     Bar.prototype.destroy = function() {
 
-       try {
 
-         this.getElement().parentNode.removeChild(this.getElement());
 
-       } catch (_error) {
 
-         NoTargetError = _error;
 
-       }
 
-       return this.el = void 0;
 
-     };
 
-     Bar.prototype.render = function() {
 
-       var el, key, progressStr, transform, _j, _len1, _ref2;
 
-       if (document.querySelector(options.target) == null) {
 
-         return false;
 
-       }
 
-       el = this.getElement();
 
-       transform = "translate3d(" + this.progress + "%, 0, 0)";
 
-       _ref2 = ['webkitTransform', 'msTransform', 'transform'];
 
-       for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
 
-         key = _ref2[_j];
 
-         el.children[0].style[key] = transform;
 
-       }
 
-       if (!this.lastRenderedProgress || this.lastRenderedProgress | 0 !== this.progress | 0) {
 
-         el.children[0].setAttribute('data-progress-text', "" + (this.progress | 0) + "%");
 
-         if (this.progress >= 100) {
 
-           progressStr = '99';
 
-         } else {
 
-           progressStr = this.progress < 10 ? "0" : "";
 
-           progressStr += this.progress | 0;
 
-         }
 
-         el.children[0].setAttribute('data-progress', "" + progressStr);
 
-       }
 
-       return this.lastRenderedProgress = this.progress;
 
-     };
 
-     Bar.prototype.done = function() {
 
-       return this.progress >= 100;
 
-     };
 
-     return Bar;
 
-   })();
 
-   Events = (function() {
 
-     function Events() {
 
-       this.bindings = {};
 
-     }
 
-     Events.prototype.trigger = function(name, val) {
 
-       var binding, _j, _len1, _ref2, _results;
 
-       if (this.bindings[name] != null) {
 
-         _ref2 = this.bindings[name];
 
-         _results = [];
 
-         for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
 
-           binding = _ref2[_j];
 
-           _results.push(binding.call(this, val));
 
-         }
 
-         return _results;
 
-       }
 
-     };
 
-     Events.prototype.on = function(name, fn) {
 
-       var _base;
 
-       if ((_base = this.bindings)[name] == null) {
 
-         _base[name] = [];
 
-       }
 
-       return this.bindings[name].push(fn);
 
-     };
 
-     return Events;
 
-   })();
 
-   _XMLHttpRequest = window.XMLHttpRequest;
 
-   _XDomainRequest = window.XDomainRequest;
 
-   _WebSocket = window.WebSocket;
 
-   extendNative = function(to, from) {
 
-     var e, key, _results;
 
-     _results = [];
 
-     for (key in from.prototype) {
 
-       try {
 
-         if ((to[key] == null) && typeof from[key] !== 'function') {
 
-           if (typeof Object.defineProperty === 'function') {
 
-             _results.push(Object.defineProperty(to, key, {
 
-               get: function() {
 
-                 return from.prototype[key];
 
-               },
 
-               configurable: true,
 
-               enumerable: true
 
-             }));
 
-           } else {
 
-             _results.push(to[key] = from.prototype[key]);
 
-           }
 
-         } else {
 
-           _results.push(void 0);
 
-         }
 
-       } catch (_error) {
 
-         e = _error;
 
-       }
 
-     }
 
-     return _results;
 
-   };
 
-   ignoreStack = [];
 
-   Pace.ignore = function() {
 
-     var args, fn, ret;
 
-     fn = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
 
-     ignoreStack.unshift('ignore');
 
-     ret = fn.apply(null, args);
 
-     ignoreStack.shift();
 
-     return ret;
 
-   };
 
-   Pace.track = function() {
 
-     var args, fn, ret;
 
-     fn = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
 
-     ignoreStack.unshift('track');
 
-     ret = fn.apply(null, args);
 
-     ignoreStack.shift();
 
-     return ret;
 
-   };
 
-   shouldTrack = function(method) {
 
-     var _ref2;
 
-     if (method == null) {
 
-       method = 'GET';
 
-     }
 
-     if (ignoreStack[0] === 'track') {
 
-       return 'force';
 
-     }
 
-     if (!ignoreStack.length && options.ajax) {
 
-       if (method === 'socket' && options.ajax.trackWebSockets) {
 
-         return true;
 
-       } else if (_ref2 = method.toUpperCase(), __indexOf.call(options.ajax.trackMethods, _ref2) >= 0) {
 
-         return true;
 
-       }
 
-     }
 
-     return false;
 
-   };
 
-   RequestIntercept = (function(_super) {
 
-     __extends(RequestIntercept, _super);
 
-     function RequestIntercept() {
 
-       var monitorXHR,
 
-         _this = this;
 
-       RequestIntercept.__super__.constructor.apply(this, arguments);
 
-       monitorXHR = function(req) {
 
-         var _open;
 
-         _open = req.open;
 
-         return req.open = function(type, url, async) {
 
-           if (shouldTrack(type)) {
 
-             _this.trigger('request', {
 
-               type: type,
 
-               url: url,
 
-               request: req
 
-             });
 
-           }
 
-           return _open.apply(req, arguments);
 
-         };
 
-       };
 
-       window.XMLHttpRequest = function(flags) {
 
-         var req;
 
-         req = new _XMLHttpRequest(flags);
 
-         monitorXHR(req);
 
-         return req;
 
-       };
 
-       try {
 
-         extendNative(window.XMLHttpRequest, _XMLHttpRequest);
 
-       } catch (_error) {}
 
-       if (_XDomainRequest != null) {
 
-         window.XDomainRequest = function() {
 
-           var req;
 
-           req = new _XDomainRequest;
 
-           monitorXHR(req);
 
-           return req;
 
-         };
 
-         try {
 
-           extendNative(window.XDomainRequest, _XDomainRequest);
 
-         } catch (_error) {}
 
-       }
 
-       if ((_WebSocket != null) && options.ajax.trackWebSockets) {
 
-         window.WebSocket = function(url, protocols) {
 
-           var req;
 
-           if (protocols != null) {
 
-             req = new _WebSocket(url, protocols);
 
-           } else {
 
-             req = new _WebSocket(url);
 
-           }
 
-           if (shouldTrack('socket')) {
 
-             _this.trigger('request', {
 
-               type: 'socket',
 
-               url: url,
 
-               protocols: protocols,
 
-               request: req
 
-             });
 
-           }
 
-           return req;
 
-         };
 
-         try {
 
-           extendNative(window.WebSocket, _WebSocket);
 
-         } catch (_error) {}
 
-       }
 
-     }
 
-     return RequestIntercept;
 
-   })(Events);
 
-   _intercept = null;
 
-   getIntercept = function() {
 
-     if (_intercept == null) {
 
-       _intercept = new RequestIntercept;
 
-     }
 
-     return _intercept;
 
-   };
 
-   shouldIgnoreURL = function(url) {
 
-     var pattern, _j, _len1, _ref2;
 
-     _ref2 = options.ajax.ignoreURLs;
 
-     for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
 
-       pattern = _ref2[_j];
 
-       if (typeof pattern === 'string') {
 
-         if (url.indexOf(pattern) !== -1) {
 
-           return true;
 
-         }
 
-       } else {
 
-         if (pattern.test(url)) {
 
-           return true;
 
-         }
 
-       }
 
-     }
 
-     return false;
 
-   };
 
-   getIntercept().on('request', function(_arg) {
 
-     var after, args, request, type, url;
 
-     type = _arg.type, request = _arg.request, url = _arg.url;
 
-     if (shouldIgnoreURL(url)) {
 
-       return;
 
-     }
 
-     if (!Pace.running && (options.restartOnRequestAfter !== false || shouldTrack(type) === 'force')) {
 
-       args = arguments;
 
-       after = options.restartOnRequestAfter || 0;
 
-       if (typeof after === 'boolean') {
 
-         after = 0;
 
-       }
 
-       return setTimeout(function() {
 
-         var stillActive, _j, _len1, _ref2, _ref3, _results;
 
-         if (type === 'socket') {
 
-           stillActive = request.readyState < 2;
 
-         } else {
 
-           stillActive = (0 < (_ref2 = request.readyState) && _ref2 < 4);
 
-         }
 
-         if (stillActive) {
 
-           Pace.restart();
 
-           _ref3 = Pace.sources;
 
-           _results = [];
 
-           for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) {
 
-             source = _ref3[_j];
 
-             if (source instanceof AjaxMonitor) {
 
-               source.watch.apply(source, args);
 
-               break;
 
-             } else {
 
-               _results.push(void 0);
 
-             }
 
-           }
 
-           return _results;
 
-         }
 
-       }, after);
 
-     }
 
-   });
 
-   AjaxMonitor = (function() {
 
-     function AjaxMonitor() {
 
-       var _this = this;
 
-       this.elements = [];
 
-       getIntercept().on('request', function() {
 
-         return _this.watch.apply(_this, arguments);
 
-       });
 
-     }
 
-     AjaxMonitor.prototype.watch = function(_arg) {
 
-       var request, tracker, type, url;
 
-       type = _arg.type, request = _arg.request, url = _arg.url;
 
-       if (shouldIgnoreURL(url)) {
 
-         return;
 
-       }
 
-       if (type === 'socket') {
 
-         tracker = new SocketRequestTracker(request);
 
-       } else {
 
-         tracker = new XHRRequestTracker(request);
 
-       }
 
-       return this.elements.push(tracker);
 
-     };
 
-     return AjaxMonitor;
 
-   })();
 
-   XHRRequestTracker = (function() {
 
-     function XHRRequestTracker(request) {
 
-       var event, size, _j, _len1, _onreadystatechange, _ref2,
 
-         _this = this;
 
-       this.progress = 0;
 
-       if (window.ProgressEvent != null) {
 
-         size = null;
 
-         request.addEventListener('progress', function(evt) {
 
-           if (evt.lengthComputable) {
 
-             return _this.progress = 100 * evt.loaded / evt.total;
 
-           } else {
 
-             return _this.progress = _this.progress + (100 - _this.progress) / 2;
 
-           }
 
-         }, false);
 
-         _ref2 = ['load', 'abort', 'timeout', 'error'];
 
-         for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
 
-           event = _ref2[_j];
 
-           request.addEventListener(event, function() {
 
-             return _this.progress = 100;
 
-           }, false);
 
-         }
 
-       } else {
 
-         _onreadystatechange = request.onreadystatechange;
 
-         request.onreadystatechange = function() {
 
-           var _ref3;
 
-           if ((_ref3 = request.readyState) === 0 || _ref3 === 4) {
 
-             _this.progress = 100;
 
-           } else if (request.readyState === 3) {
 
-             _this.progress = 50;
 
-           }
 
-           return typeof _onreadystatechange === "function" ? _onreadystatechange.apply(null, arguments) : void 0;
 
-         };
 
-       }
 
-     }
 
-     return XHRRequestTracker;
 
-   })();
 
-   SocketRequestTracker = (function() {
 
-     function SocketRequestTracker(request) {
 
-       var event, _j, _len1, _ref2,
 
-         _this = this;
 
-       this.progress = 0;
 
-       _ref2 = ['error', 'open'];
 
-       for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
 
-         event = _ref2[_j];
 
-         request.addEventListener(event, function() {
 
-           return _this.progress = 100;
 
-         }, false);
 
-       }
 
-     }
 
-     return SocketRequestTracker;
 
-   })();
 
-   ElementMonitor = (function() {
 
-     function ElementMonitor(options) {
 
-       var selector, _j, _len1, _ref2;
 
-       if (options == null) {
 
-         options = {};
 
-       }
 
-       this.elements = [];
 
-       if (options.selectors == null) {
 
-         options.selectors = [];
 
-       }
 
-       _ref2 = options.selectors;
 
-       for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
 
-         selector = _ref2[_j];
 
-         this.elements.push(new ElementTracker(selector));
 
-       }
 
-     }
 
-     return ElementMonitor;
 
-   })();
 
-   ElementTracker = (function() {
 
-     function ElementTracker(selector) {
 
-       this.selector = selector;
 
-       this.progress = 0;
 
-       this.check();
 
-     }
 
-     ElementTracker.prototype.check = function() {
 
-       var _this = this;
 
-       if (document.querySelector(this.selector)) {
 
-         return this.done();
 
-       } else {
 
-         return setTimeout((function() {
 
-           return _this.check();
 
-         }), options.elements.checkInterval);
 
-       }
 
-     };
 
-     ElementTracker.prototype.done = function() {
 
-       return this.progress = 100;
 
-     };
 
-     return ElementTracker;
 
-   })();
 
-   DocumentMonitor = (function() {
 
-     DocumentMonitor.prototype.states = {
 
-       loading: 0,
 
-       interactive: 50,
 
-       complete: 100
 
-     };
 
-     function DocumentMonitor() {
 
-       var _onreadystatechange, _ref2,
 
-         _this = this;
 
-       this.progress = (_ref2 = this.states[document.readyState]) != null ? _ref2 : 100;
 
-       _onreadystatechange = document.onreadystatechange;
 
-       document.onreadystatechange = function() {
 
-         if (_this.states[document.readyState] != null) {
 
-           _this.progress = _this.states[document.readyState];
 
-         }
 
-         return typeof _onreadystatechange === "function" ? _onreadystatechange.apply(null, arguments) : void 0;
 
-       };
 
-     }
 
-     return DocumentMonitor;
 
-   })();
 
-   EventLagMonitor = (function() {
 
-     function EventLagMonitor() {
 
-       var avg, interval, last, points, samples,
 
-         _this = this;
 
-       this.progress = 0;
 
-       avg = 0;
 
-       samples = [];
 
-       points = 0;
 
-       last = now();
 
-       interval = setInterval(function() {
 
-         var diff;
 
-         diff = now() - last - 50;
 
-         last = now();
 
-         samples.push(diff);
 
-         if (samples.length > options.eventLag.sampleCount) {
 
-           samples.shift();
 
-         }
 
-         avg = avgAmplitude(samples);
 
-         if (++points >= options.eventLag.minSamples && avg < options.eventLag.lagThreshold) {
 
-           _this.progress = 100;
 
-           return clearInterval(interval);
 
-         } else {
 
-           return _this.progress = 100 * (3 / (avg + 3));
 
-         }
 
-       }, 50);
 
-     }
 
-     return EventLagMonitor;
 
-   })();
 
-   Scaler = (function() {
 
-     function Scaler(source) {
 
-       this.source = source;
 
-       this.last = this.sinceLastUpdate = 0;
 
-       this.rate = options.initialRate;
 
-       this.catchup = 0;
 
-       this.progress = this.lastProgress = 0;
 
-       if (this.source != null) {
 
-         this.progress = result(this.source, 'progress');
 
-       }
 
-     }
 
-     Scaler.prototype.tick = function(frameTime, val) {
 
-       var scaling;
 
-       if (val == null) {
 
-         val = result(this.source, 'progress');
 
-       }
 
-       if (val >= 100) {
 
-         this.done = true;
 
-       }
 
-       if (val === this.last) {
 
-         this.sinceLastUpdate += frameTime;
 
-       } else {
 
-         if (this.sinceLastUpdate) {
 
-           this.rate = (val - this.last) / this.sinceLastUpdate;
 
-         }
 
-         this.catchup = (val - this.progress) / options.catchupTime;
 
-         this.sinceLastUpdate = 0;
 
-         this.last = val;
 
-       }
 
-       if (val > this.progress) {
 
-         this.progress += this.catchup * frameTime;
 
-       }
 
-       scaling = 1 - Math.pow(this.progress / 100, options.easeFactor);
 
-       this.progress += scaling * this.rate * frameTime;
 
-       this.progress = Math.min(this.lastProgress + options.maxProgressPerFrame, this.progress);
 
-       this.progress = Math.max(0, this.progress);
 
-       this.progress = Math.min(100, this.progress);
 
-       this.lastProgress = this.progress;
 
-       return this.progress;
 
-     };
 
-     return Scaler;
 
-   })();
 
-   sources = null;
 
-   scalers = null;
 
-   bar = null;
 
-   uniScaler = null;
 
-   animation = null;
 
-   cancelAnimation = null;
 
-   Pace.running = false;
 
-   handlePushState = function() {
 
-     if (options.restartOnPushState) {
 
-       return Pace.restart();
 
-     }
 
-   };
 
-   if (window.history.pushState != null) {
 
-     _pushState = window.history.pushState;
 
-     window.history.pushState = function() {
 
-       handlePushState();
 
-       return _pushState.apply(window.history, arguments);
 
-     };
 
-   }
 
-   if (window.history.replaceState != null) {
 
-     _replaceState = window.history.replaceState;
 
-     window.history.replaceState = function() {
 
-       handlePushState();
 
-       return _replaceState.apply(window.history, arguments);
 
-     };
 
-   }
 
-   SOURCE_KEYS = {
 
-     ajax: AjaxMonitor,
 
-     elements: ElementMonitor,
 
-     document: DocumentMonitor,
 
-     eventLag: EventLagMonitor
 
-   };
 
-   (init = function() {
 
-     var type, _j, _k, _len1, _len2, _ref2, _ref3, _ref4;
 
-     Pace.sources = sources = [];
 
-     _ref2 = ['ajax', 'elements', 'document', 'eventLag'];
 
-     for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
 
-       type = _ref2[_j];
 
-       if (options[type] !== false) {
 
-         sources.push(new SOURCE_KEYS[type](options[type]));
 
-       }
 
-     }
 
-     _ref4 = (_ref3 = options.extraSources) != null ? _ref3 : [];
 
-     for (_k = 0, _len2 = _ref4.length; _k < _len2; _k++) {
 
-       source = _ref4[_k];
 
-       sources.push(new source(options));
 
-     }
 
-     Pace.bar = bar = new Bar;
 
-     scalers = [];
 
-     return uniScaler = new Scaler;
 
-   })();
 
-   Pace.stop = function() {
 
-     Pace.trigger('stop');
 
-     Pace.running = false;
 
-     bar.destroy();
 
-     cancelAnimation = true;
 
-     if (animation != null) {
 
-       if (typeof cancelAnimationFrame === "function") {
 
-         cancelAnimationFrame(animation);
 
-       }
 
-       animation = null;
 
-     }
 
-     return init();
 
-   };
 
-   Pace.restart = function() {
 
-     Pace.trigger('restart');
 
-     Pace.stop();
 
-     return Pace.start();
 
-   };
 
-   Pace.go = function() {
 
-     var start;
 
-     Pace.running = true;
 
-     bar.render();
 
-     start = now();
 
-     cancelAnimation = false;
 
-     return animation = runAnimation(function(frameTime, enqueueNextFrame) {
 
-       var avg, count, done, element, elements, i, j, remaining, scaler, scalerList, sum, _j, _k, _len1, _len2, _ref2;
 
-       remaining = 100 - bar.progress;
 
-       count = sum = 0;
 
-       done = true;
 
-       for (i = _j = 0, _len1 = sources.length; _j < _len1; i = ++_j) {
 
-         source = sources[i];
 
-         scalerList = scalers[i] != null ? scalers[i] : scalers[i] = [];
 
-         elements = (_ref2 = source.elements) != null ? _ref2 : [source];
 
-         for (j = _k = 0, _len2 = elements.length; _k < _len2; j = ++_k) {
 
-           element = elements[j];
 
-           scaler = scalerList[j] != null ? scalerList[j] : scalerList[j] = new Scaler(element);
 
-           done &= scaler.done;
 
-           if (scaler.done) {
 
-             continue;
 
-           }
 
-           count++;
 
-           sum += scaler.tick(frameTime);
 
-         }
 
-       }
 
-       avg = sum / count;
 
-       bar.update(uniScaler.tick(frameTime, avg));
 
-       if (bar.done() || done || cancelAnimation) {
 
-         bar.update(100);
 
-         Pace.trigger('done');
 
-         return setTimeout(function() {
 
-           bar.finish();
 
-           Pace.running = false;
 
-           return Pace.trigger('hide');
 
-         }, Math.max(options.ghostTime, Math.max(options.minTime - (now() - start), 0)));
 
-       } else {
 
-         return enqueueNextFrame();
 
-       }
 
-     });
 
-   };
 
-   Pace.start = function(_options) {
 
-     extend(options, _options);
 
-     Pace.running = true;
 
-     try {
 
-       bar.render();
 
-     } catch (_error) {
 
-       NoTargetError = _error;
 
-     }
 
-     if (!document.querySelector('.pace')) {
 
-       return setTimeout(Pace.start, 50);
 
-     } else {
 
-       Pace.trigger('start');
 
-       return Pace.go();
 
-     }
 
-   };
 
-   if (typeof define === 'function' && define.amd) {
 
-     define(['pace'], function() {
 
-       return Pace;
 
-     });
 
-   } else if (typeof exports === 'object') {
 
-     module.exports = Pace;
 
-   } else {
 
-     if (options.startOnPageLoad) {
 
-       Pace.start();
 
-     }
 
-   }
 
- }).call(this);
 
- /*!
 
-  * jQuery JavaScript Library v3.4.1
 
-  * https://jquery.com/
 
-  *
 
-  * Includes Sizzle.js
 
-  * https://sizzlejs.com/
 
-  *
 
-  * Copyright JS Foundation and other contributors
 
-  * Released under the MIT license
 
-  * https://jquery.org/license
 
-  *
 
-  * Date: 2019-05-01T21:04Z
 
-  */
 
- ( function( global, factory ) {
 
- 	"use strict";
 
- 	if ( typeof module === "object" && typeof module.exports === "object" ) {
 
- 		// For CommonJS and CommonJS-like environments where a proper `window`
 
- 		// is present, execute the factory and get jQuery.
 
- 		// For environments that do not have a `window` with a `document`
 
- 		// (such as Node.js), expose a factory as module.exports.
 
- 		// This accentuates the need for the creation of a real `window`.
 
- 		// e.g. var jQuery = require("jquery")(window);
 
- 		// See ticket #14549 for more info.
 
- 		module.exports = global.document ?
 
- 			factory( global, true ) :
 
- 			function( w ) {
 
- 				if ( !w.document ) {
 
- 					throw new Error( "jQuery requires a window with a document" );
 
- 				}
 
- 				return factory( w );
 
- 			};
 
- 	} else {
 
- 		factory( global );
 
- 	}
 
- // Pass this if window is not defined yet
 
- } )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
 
- // Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
 
- // throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
 
- // arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
 
- // enough that all such attempts are guarded in a try block.
 
- "use strict";
 
- var arr = [];
 
- var document = window.document;
 
- var getProto = Object.getPrototypeOf;
 
- var slice = arr.slice;
 
- var concat = arr.concat;
 
- var push = arr.push;
 
- var indexOf = arr.indexOf;
 
- var class2type = {};
 
- var toString = class2type.toString;
 
- var hasOwn = class2type.hasOwnProperty;
 
- var fnToString = hasOwn.toString;
 
- var ObjectFunctionString = fnToString.call( Object );
 
- var support = {};
 
- var isFunction = function isFunction( obj ) {
 
-       // Support: Chrome <=57, Firefox <=52
 
-       // In some browsers, typeof returns "function" for HTML <object> elements
 
-       // (i.e., `typeof document.createElement( "object" ) === "function"`).
 
-       // We don't want to classify *any* DOM node as a function.
 
-       return typeof obj === "function" && typeof obj.nodeType !== "number";
 
-   };
 
- var isWindow = function isWindow( obj ) {
 
- 		return obj != null && obj === obj.window;
 
- 	};
 
- 	var preservedScriptAttributes = {
 
- 		type: true,
 
- 		src: true,
 
- 		nonce: true,
 
- 		noModule: true
 
- 	};
 
- 	function DOMEval( code, node, doc ) {
 
- 		doc = doc || document;
 
- 		var i, val,
 
- 			script = doc.createElement( "script" );
 
- 		script.text = code;
 
- 		if ( node ) {
 
- 			for ( i in preservedScriptAttributes ) {
 
- 				// Support: Firefox 64+, Edge 18+
 
- 				// Some browsers don't support the "nonce" property on scripts.
 
- 				// On the other hand, just using `getAttribute` is not enough as
 
- 				// the `nonce` attribute is reset to an empty string whenever it
 
- 				// becomes browsing-context connected.
 
- 				// See https://github.com/whatwg/html/issues/2369
 
- 				// See https://html.spec.whatwg.org/#nonce-attributes
 
- 				// The `node.getAttribute` check was added for the sake of
 
- 				// `jQuery.globalEval` so that it can fake a nonce-containing node
 
- 				// via an object.
 
- 				val = node[ i ] || node.getAttribute && node.getAttribute( i );
 
- 				if ( val ) {
 
- 					script.setAttribute( i, val );
 
- 				}
 
- 			}
 
- 		}
 
- 		doc.head.appendChild( script ).parentNode.removeChild( script );
 
- 	}
 
- function toType( obj ) {
 
- 	if ( obj == null ) {
 
- 		return obj + "";
 
- 	}
 
- 	// Support: Android <=2.3 only (functionish RegExp)
 
- 	return typeof obj === "object" || typeof obj === "function" ?
 
- 		class2type[ toString.call( obj ) ] || "object" :
 
- 		typeof obj;
 
- }
 
- /* global Symbol */
 
- // Defining this global in .eslintrc.json would create a danger of using the global
 
- // unguarded in another place, it seems safer to define global only for this module
 
- var
 
- 	version = "3.4.1",
 
- 	// Define a local copy of jQuery
 
- 	jQuery = function( selector, context ) {
 
- 		// The jQuery object is actually just the init constructor 'enhanced'
 
- 		// Need init if jQuery is called (just allow error to be thrown if not included)
 
- 		return new jQuery.fn.init( selector, context );
 
- 	},
 
- 	// Support: Android <=4.0 only
 
- 	// Make sure we trim BOM and NBSP
 
- 	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
 
- jQuery.fn = jQuery.prototype = {
 
- 	// The current version of jQuery being used
 
- 	jquery: version,
 
- 	constructor: jQuery,
 
- 	// The default length of a jQuery object is 0
 
- 	length: 0,
 
- 	toArray: function() {
 
- 		return slice.call( this );
 
- 	},
 
- 	// Get the Nth element in the matched element set OR
 
- 	// Get the whole matched element set as a clean array
 
- 	get: function( num ) {
 
- 		// Return all the elements in a clean array
 
- 		if ( num == null ) {
 
- 			return slice.call( this );
 
- 		}
 
- 		// Return just the one element from the set
 
- 		return num < 0 ? this[ num + this.length ] : this[ num ];
 
- 	},
 
- 	// Take an array of elements and push it onto the stack
 
- 	// (returning the new matched element set)
 
- 	pushStack: function( elems ) {
 
- 		// Build a new jQuery matched element set
 
- 		var ret = jQuery.merge( this.constructor(), elems );
 
- 		// Add the old object onto the stack (as a reference)
 
- 		ret.prevObject = this;
 
- 		// Return the newly-formed element set
 
- 		return ret;
 
- 	},
 
- 	// Execute a callback for every element in the matched set.
 
- 	each: function( callback ) {
 
- 		return jQuery.each( this, callback );
 
- 	},
 
- 	map: function( callback ) {
 
- 		return this.pushStack( jQuery.map( this, function( elem, i ) {
 
- 			return callback.call( elem, i, elem );
 
- 		} ) );
 
- 	},
 
- 	slice: function() {
 
- 		return this.pushStack( slice.apply( this, arguments ) );
 
- 	},
 
- 	first: function() {
 
- 		return this.eq( 0 );
 
- 	},
 
- 	last: function() {
 
- 		return this.eq( -1 );
 
- 	},
 
- 	eq: function( i ) {
 
- 		var len = this.length,
 
- 			j = +i + ( i < 0 ? len : 0 );
 
- 		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
 
- 	},
 
- 	end: function() {
 
- 		return this.prevObject || this.constructor();
 
- 	},
 
- 	// For internal use only.
 
- 	// Behaves like an Array's method, not like a jQuery method.
 
- 	push: push,
 
- 	sort: arr.sort,
 
- 	splice: arr.splice
 
- };
 
- jQuery.extend = jQuery.fn.extend = function() {
 
- 	var options, name, src, copy, copyIsArray, clone,
 
- 		target = arguments[ 0 ] || {},
 
- 		i = 1,
 
- 		length = arguments.length,
 
- 		deep = false;
 
- 	// Handle a deep copy situation
 
- 	if ( typeof target === "boolean" ) {
 
- 		deep = target;
 
- 		// Skip the boolean and the target
 
- 		target = arguments[ i ] || {};
 
- 		i++;
 
- 	}
 
- 	// Handle case when target is a string or something (possible in deep copy)
 
- 	if ( typeof target !== "object" && !isFunction( target ) ) {
 
- 		target = {};
 
- 	}
 
- 	// Extend jQuery itself if only one argument is passed
 
- 	if ( i === length ) {
 
- 		target = this;
 
- 		i--;
 
- 	}
 
- 	for ( ; i < length; i++ ) {
 
- 		// Only deal with non-null/undefined values
 
- 		if ( ( options = arguments[ i ] ) != null ) {
 
- 			// Extend the base object
 
- 			for ( name in options ) {
 
- 				copy = options[ name ];
 
- 				// Prevent Object.prototype pollution
 
- 				// Prevent never-ending loop
 
- 				if ( name === "__proto__" || target === copy ) {
 
- 					continue;
 
- 				}
 
- 				// Recurse if we're merging plain objects or arrays
 
- 				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
 
- 					( copyIsArray = Array.isArray( copy ) ) ) ) {
 
- 					src = target[ name ];
 
- 					// Ensure proper type for the source value
 
- 					if ( copyIsArray && !Array.isArray( src ) ) {
 
- 						clone = [];
 
- 					} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
 
- 						clone = {};
 
- 					} else {
 
- 						clone = src;
 
- 					}
 
- 					copyIsArray = false;
 
- 					// Never move original objects, clone them
 
- 					target[ name ] = jQuery.extend( deep, clone, copy );
 
- 				// Don't bring in undefined values
 
- 				} else if ( copy !== undefined ) {
 
- 					target[ name ] = copy;
 
- 				}
 
- 			}
 
- 		}
 
- 	}
 
- 	// Return the modified object
 
- 	return target;
 
- };
 
- jQuery.extend( {
 
- 	// Unique for each copy of jQuery on the page
 
- 	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
 
- 	// Assume jQuery is ready without the ready module
 
- 	isReady: true,
 
- 	error: function( msg ) {
 
- 		throw new Error( msg );
 
- 	},
 
- 	noop: function() {},
 
- 	isPlainObject: function( obj ) {
 
- 		var proto, Ctor;
 
- 		// Detect obvious negatives
 
- 		// Use toString instead of jQuery.type to catch host objects
 
- 		if ( !obj || toString.call( obj ) !== "[object Object]" ) {
 
- 			return false;
 
- 		}
 
- 		proto = getProto( obj );
 
- 		// Objects with no prototype (e.g., `Object.create( null )`) are plain
 
- 		if ( !proto ) {
 
- 			return true;
 
- 		}
 
- 		// Objects with prototype are plain iff they were constructed by a global Object function
 
- 		Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
 
- 		return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
 
- 	},
 
- 	isEmptyObject: function( obj ) {
 
- 		var name;
 
- 		for ( name in obj ) {
 
- 			return false;
 
- 		}
 
- 		return true;
 
- 	},
 
- 	// Evaluates a script in a global context
 
- 	globalEval: function( code, options ) {
 
- 		DOMEval( code, { nonce: options && options.nonce } );
 
- 	},
 
- 	each: function( obj, callback ) {
 
- 		var length, i = 0;
 
- 		if ( isArrayLike( obj ) ) {
 
- 			length = obj.length;
 
- 			for ( ; i < length; i++ ) {
 
- 				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
 
- 					break;
 
- 				}
 
- 			}
 
- 		} else {
 
- 			for ( i in obj ) {
 
- 				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
 
- 					break;
 
- 				}
 
- 			}
 
- 		}
 
- 		return obj;
 
- 	},
 
- 	// Support: Android <=4.0 only
 
- 	trim: function( text ) {
 
- 		return text == null ?
 
- 			"" :
 
- 			( text + "" ).replace( rtrim, "" );
 
- 	},
 
- 	// results is for internal usage only
 
- 	makeArray: function( arr, results ) {
 
- 		var ret = results || [];
 
- 		if ( arr != null ) {
 
- 			if ( isArrayLike( Object( arr ) ) ) {
 
- 				jQuery.merge( ret,
 
- 					typeof arr === "string" ?
 
- 					[ arr ] : arr
 
- 				);
 
- 			} else {
 
- 				push.call( ret, arr );
 
- 			}
 
- 		}
 
- 		return ret;
 
- 	},
 
- 	inArray: function( elem, arr, i ) {
 
- 		return arr == null ? -1 : indexOf.call( arr, elem, i );
 
- 	},
 
- 	// Support: Android <=4.0 only, PhantomJS 1 only
 
- 	// push.apply(_, arraylike) throws on ancient WebKit
 
- 	merge: function( first, second ) {
 
- 		var len = +second.length,
 
- 			j = 0,
 
- 			i = first.length;
 
- 		for ( ; j < len; j++ ) {
 
- 			first[ i++ ] = second[ j ];
 
- 		}
 
- 		first.length = i;
 
- 		return first;
 
- 	},
 
- 	grep: function( elems, callback, invert ) {
 
- 		var callbackInverse,
 
- 			matches = [],
 
- 			i = 0,
 
- 			length = elems.length,
 
- 			callbackExpect = !invert;
 
- 		// Go through the array, only saving the items
 
- 		// that pass the validator function
 
- 		for ( ; i < length; i++ ) {
 
- 			callbackInverse = !callback( elems[ i ], i );
 
- 			if ( callbackInverse !== callbackExpect ) {
 
- 				matches.push( elems[ i ] );
 
- 			}
 
- 		}
 
- 		return matches;
 
- 	},
 
- 	// arg is for internal usage only
 
- 	map: function( elems, callback, arg ) {
 
- 		var length, value,
 
- 			i = 0,
 
- 			ret = [];
 
- 		// Go through the array, translating each of the items to their new values
 
- 		if ( isArrayLike( elems ) ) {
 
- 			length = elems.length;
 
- 			for ( ; i < length; i++ ) {
 
- 				value = callback( elems[ i ], i, arg );
 
- 				if ( value != null ) {
 
- 					ret.push( value );
 
- 				}
 
- 			}
 
- 		// Go through every key on the object,
 
- 		} else {
 
- 			for ( i in elems ) {
 
- 				value = callback( elems[ i ], i, arg );
 
- 				if ( value != null ) {
 
- 					ret.push( value );
 
- 				}
 
- 			}
 
- 		}
 
- 		// Flatten any nested arrays
 
- 		return concat.apply( [], ret );
 
- 	},
 
- 	// A global GUID counter for objects
 
- 	guid: 1,
 
- 	// jQuery.support is not used in Core but other projects attach their
 
- 	// properties to it so it needs to exist.
 
- 	support: support
 
- } );
 
- if ( typeof Symbol === "function" ) {
 
- 	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
 
- }
 
- // Populate the class2type map
 
- jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
 
- function( i, name ) {
 
- 	class2type[ "[object " + name + "]" ] = name.toLowerCase();
 
- } );
 
- function isArrayLike( obj ) {
 
- 	// Support: real iOS 8.2 only (not reproducible in simulator)
 
- 	// `in` check used to prevent JIT error (gh-2145)
 
- 	// hasOwn isn't used here due to false negatives
 
- 	// regarding Nodelist length in IE
 
- 	var length = !!obj && "length" in obj && obj.length,
 
- 		type = toType( obj );
 
- 	if ( isFunction( obj ) || isWindow( obj ) ) {
 
- 		return false;
 
- 	}
 
- 	return type === "array" || length === 0 ||
 
- 		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
 
- }
 
- var Sizzle =
 
- /*!
 
-  * Sizzle CSS Selector Engine v2.3.4
 
-  * https://sizzlejs.com/
 
-  *
 
-  * Copyright JS Foundation and other contributors
 
-  * Released under the MIT license
 
-  * https://js.foundation/
 
-  *
 
-  * Date: 2019-04-08
 
-  */
 
- (function( window ) {
 
- var i,
 
- 	support,
 
- 	Expr,
 
- 	getText,
 
- 	isXML,
 
- 	tokenize,
 
- 	compile,
 
- 	select,
 
- 	outermostContext,
 
- 	sortInput,
 
- 	hasDuplicate,
 
- 	// Local document vars
 
- 	setDocument,
 
- 	document,
 
- 	docElem,
 
- 	documentIsHTML,
 
- 	rbuggyQSA,
 
- 	rbuggyMatches,
 
- 	matches,
 
- 	contains,
 
- 	// Instance-specific data
 
- 	expando = "sizzle" + 1 * new Date(),
 
- 	preferredDoc = window.document,
 
- 	dirruns = 0,
 
- 	done = 0,
 
- 	classCache = createCache(),
 
- 	tokenCache = createCache(),
 
- 	compilerCache = createCache(),
 
- 	nonnativeSelectorCache = createCache(),
 
- 	sortOrder = function( a, b ) {
 
- 		if ( a === b ) {
 
- 			hasDuplicate = true;
 
- 		}
 
- 		return 0;
 
- 	},
 
- 	// Instance methods
 
- 	hasOwn = ({}).hasOwnProperty,
 
- 	arr = [],
 
- 	pop = arr.pop,
 
- 	push_native = arr.push,
 
- 	push = arr.push,
 
- 	slice = arr.slice,
 
- 	// Use a stripped-down indexOf as it's faster than native
 
- 	// https://jsperf.com/thor-indexof-vs-for/5
 
- 	indexOf = function( list, elem ) {
 
- 		var i = 0,
 
- 			len = list.length;
 
- 		for ( ; i < len; i++ ) {
 
- 			if ( list[i] === elem ) {
 
- 				return i;
 
- 			}
 
- 		}
 
- 		return -1;
 
- 	},
 
- 	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
 
- 	// Regular expressions
 
- 	// http://www.w3.org/TR/css3-selectors/#whitespace
 
- 	whitespace = "[\\x20\\t\\r\\n\\f]",
 
- 	// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
 
- 	identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
 
- 	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
 
- 	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
 
- 		// Operator (capture 2)
 
- 		"*([*^$|!~]?=)" + whitespace +
 
- 		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
 
- 		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
 
- 		"*\\]",
 
- 	pseudos = ":(" + identifier + ")(?:\\((" +
 
- 		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
 
- 		// 1. quoted (capture 3; capture 4 or capture 5)
 
- 		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
 
- 		// 2. simple (capture 6)
 
- 		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
 
- 		// 3. anything else (capture 2)
 
- 		".*" +
 
- 		")\\)|)",
 
- 	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
 
- 	rwhitespace = new RegExp( whitespace + "+", "g" ),
 
- 	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
 
- 	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
 
- 	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
 
- 	rdescend = new RegExp( whitespace + "|>" ),
 
- 	rpseudo = new RegExp( pseudos ),
 
- 	ridentifier = new RegExp( "^" + identifier + "$" ),
 
- 	matchExpr = {
 
- 		"ID": new RegExp( "^#(" + identifier + ")" ),
 
- 		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
 
- 		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
 
- 		"ATTR": new RegExp( "^" + attributes ),
 
- 		"PSEUDO": new RegExp( "^" + pseudos ),
 
- 		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
 
- 			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
 
- 			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
 
- 		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
 
- 		// For use in libraries implementing .is()
 
- 		// We use this for POS matching in `select`
 
- 		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
 
- 			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
 
- 	},
 
- 	rhtml = /HTML$/i,
 
- 	rinputs = /^(?:input|select|textarea|button)$/i,
 
- 	rheader = /^h\d$/i,
 
- 	rnative = /^[^{]+\{\s*\[native \w/,
 
- 	// Easily-parseable/retrievable ID or TAG or CLASS selectors
 
- 	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
 
- 	rsibling = /[+~]/,
 
- 	// CSS escapes
 
- 	// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
 
- 	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
 
- 	funescape = function( _, escaped, escapedWhitespace ) {
 
- 		var high = "0x" + escaped - 0x10000;
 
- 		// NaN means non-codepoint
 
- 		// Support: Firefox<24
 
- 		// Workaround erroneous numeric interpretation of +"0x"
 
- 		return high !== high || escapedWhitespace ?
 
- 			escaped :
 
- 			high < 0 ?
 
- 				// BMP codepoint
 
- 				String.fromCharCode( high + 0x10000 ) :
 
- 				// Supplemental Plane codepoint (surrogate pair)
 
- 				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
 
- 	},
 
- 	// CSS string/identifier serialization
 
- 	// https://drafts.csswg.org/cssom/#common-serializing-idioms
 
- 	rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
 
- 	fcssescape = function( ch, asCodePoint ) {
 
- 		if ( asCodePoint ) {
 
- 			// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
 
- 			if ( ch === "\0" ) {
 
- 				return "\uFFFD";
 
- 			}
 
- 			// Control characters and (dependent upon position) numbers get escaped as code points
 
- 			return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
 
- 		}
 
- 		// Other potentially-special ASCII characters get backslash-escaped
 
- 		return "\\" + ch;
 
- 	},
 
- 	// Used for iframes
 
- 	// See setDocument()
 
- 	// Removing the function wrapper causes a "Permission Denied"
 
- 	// error in IE
 
- 	unloadHandler = function() {
 
- 		setDocument();
 
- 	},
 
- 	inDisabledFieldset = addCombinator(
 
- 		function( elem ) {
 
- 			return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
 
- 		},
 
- 		{ dir: "parentNode", next: "legend" }
 
- 	);
 
- // Optimize for push.apply( _, NodeList )
 
- try {
 
- 	push.apply(
 
- 		(arr = slice.call( preferredDoc.childNodes )),
 
- 		preferredDoc.childNodes
 
- 	);
 
- 	// Support: Android<4.0
 
- 	// Detect silently failing push.apply
 
- 	arr[ preferredDoc.childNodes.length ].nodeType;
 
- } catch ( e ) {
 
- 	push = { apply: arr.length ?
 
- 		// Leverage slice if possible
 
- 		function( target, els ) {
 
- 			push_native.apply( target, slice.call(els) );
 
- 		} :
 
- 		// Support: IE<9
 
- 		// Otherwise append directly
 
- 		function( target, els ) {
 
- 			var j = target.length,
 
- 				i = 0;
 
- 			// Can't trust NodeList.length
 
- 			while ( (target[j++] = els[i++]) ) {}
 
- 			target.length = j - 1;
 
- 		}
 
- 	};
 
- }
 
- function Sizzle( selector, context, results, seed ) {
 
- 	var m, i, elem, nid, match, groups, newSelector,
 
- 		newContext = context && context.ownerDocument,
 
- 		// nodeType defaults to 9, since context defaults to document
 
- 		nodeType = context ? context.nodeType : 9;
 
- 	results = results || [];
 
- 	// Return early from calls with invalid selector or context
 
- 	if ( typeof selector !== "string" || !selector ||
 
- 		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
 
- 		return results;
 
- 	}
 
- 	// Try to shortcut find operations (as opposed to filters) in HTML documents
 
- 	if ( !seed ) {
 
- 		if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
 
- 			setDocument( context );
 
- 		}
 
- 		context = context || document;
 
- 		if ( documentIsHTML ) {
 
- 			// If the selector is sufficiently simple, try using a "get*By*" DOM method
 
- 			// (excepting DocumentFragment context, where the methods don't exist)
 
- 			if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
 
- 				// ID selector
 
- 				if ( (m = match[1]) ) {
 
- 					// Document context
 
- 					if ( nodeType === 9 ) {
 
- 						if ( (elem = context.getElementById( m )) ) {
 
- 							// Support: IE, Opera, Webkit
 
- 							// TODO: identify versions
 
- 							// getElementById can match elements by name instead of ID
 
- 							if ( elem.id === m ) {
 
- 								results.push( elem );
 
- 								return results;
 
- 							}
 
- 						} else {
 
- 							return results;
 
- 						}
 
- 					// Element context
 
- 					} else {
 
- 						// Support: IE, Opera, Webkit
 
- 						// TODO: identify versions
 
- 						// getElementById can match elements by name instead of ID
 
- 						if ( newContext && (elem = newContext.getElementById( m )) &&
 
- 							contains( context, elem ) &&
 
- 							elem.id === m ) {
 
- 							results.push( elem );
 
- 							return results;
 
- 						}
 
- 					}
 
- 				// Type selector
 
- 				} else if ( match[2] ) {
 
- 					push.apply( results, context.getElementsByTagName( selector ) );
 
- 					return results;
 
- 				// Class selector
 
- 				} else if ( (m = match[3]) && support.getElementsByClassName &&
 
- 					context.getElementsByClassName ) {
 
- 					push.apply( results, context.getElementsByClassName( m ) );
 
- 					return results;
 
- 				}
 
- 			}
 
- 			// Take advantage of querySelectorAll
 
- 			if ( support.qsa &&
 
- 				!nonnativeSelectorCache[ selector + " " ] &&
 
- 				(!rbuggyQSA || !rbuggyQSA.test( selector )) &&
 
- 				// Support: IE 8 only
 
- 				// Exclude object elements
 
- 				(nodeType !== 1 || context.nodeName.toLowerCase() !== "object") ) {
 
- 				newSelector = selector;
 
- 				newContext = context;
 
- 				// qSA considers elements outside a scoping root when evaluating child or
 
- 				// descendant combinators, which is not what we want.
 
- 				// In such cases, we work around the behavior by prefixing every selector in the
 
- 				// list with an ID selector referencing the scope context.
 
- 				// Thanks to Andrew Dupont for this technique.
 
- 				if ( nodeType === 1 && rdescend.test( selector ) ) {
 
- 					// Capture the context ID, setting it first if necessary
 
- 					if ( (nid = context.getAttribute( "id" )) ) {
 
- 						nid = nid.replace( rcssescape, fcssescape );
 
- 					} else {
 
- 						context.setAttribute( "id", (nid = expando) );
 
- 					}
 
- 					// Prefix every selector in the list
 
- 					groups = tokenize( selector );
 
- 					i = groups.length;
 
- 					while ( i-- ) {
 
- 						groups[i] = "#" + nid + " " + toSelector( groups[i] );
 
- 					}
 
- 					newSelector = groups.join( "," );
 
- 					// Expand context for sibling selectors
 
- 					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
 
- 						context;
 
- 				}
 
- 				try {
 
- 					push.apply( results,
 
- 						newContext.querySelectorAll( newSelector )
 
- 					);
 
- 					return results;
 
- 				} catch ( qsaError ) {
 
- 					nonnativeSelectorCache( selector, true );
 
- 				} finally {
 
- 					if ( nid === expando ) {
 
- 						context.removeAttribute( "id" );
 
- 					}
 
- 				}
 
- 			}
 
- 		}
 
- 	}
 
- 	// All others
 
- 	return select( selector.replace( rtrim, "$1" ), context, results, seed );
 
- }
 
- /**
 
-  * Create key-value caches of limited size
 
-  * @returns {function(string, object)} Returns the Object data after storing it on itself with
 
-  *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
 
-  *	deleting the oldest entry
 
-  */
 
- function createCache() {
 
- 	var keys = [];
 
- 	function cache( key, value ) {
 
- 		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
 
- 		if ( keys.push( key + " " ) > Expr.cacheLength ) {
 
- 			// Only keep the most recent entries
 
- 			delete cache[ keys.shift() ];
 
- 		}
 
- 		return (cache[ key + " " ] = value);
 
- 	}
 
- 	return cache;
 
- }
 
- /**
 
-  * Mark a function for special use by Sizzle
 
-  * @param {Function} fn The function to mark
 
-  */
 
- function markFunction( fn ) {
 
- 	fn[ expando ] = true;
 
- 	return fn;
 
- }
 
- /**
 
-  * Support testing using an element
 
-  * @param {Function} fn Passed the created element and returns a boolean result
 
-  */
 
- function assert( fn ) {
 
- 	var el = document.createElement("fieldset");
 
- 	try {
 
- 		return !!fn( el );
 
- 	} catch (e) {
 
- 		return false;
 
- 	} finally {
 
- 		// Remove from its parent by default
 
- 		if ( el.parentNode ) {
 
- 			el.parentNode.removeChild( el );
 
- 		}
 
- 		// release memory in IE
 
- 		el = null;
 
- 	}
 
- }
 
- /**
 
-  * Adds the same handler for all of the specified attrs
 
-  * @param {String} attrs Pipe-separated list of attributes
 
-  * @param {Function} handler The method that will be applied
 
-  */
 
- function addHandle( attrs, handler ) {
 
- 	var arr = attrs.split("|"),
 
- 		i = arr.length;
 
- 	while ( i-- ) {
 
- 		Expr.attrHandle[ arr[i] ] = handler;
 
- 	}
 
- }
 
- /**
 
-  * Checks document order of two siblings
 
-  * @param {Element} a
 
-  * @param {Element} b
 
-  * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
 
-  */
 
- function siblingCheck( a, b ) {
 
- 	var cur = b && a,
 
- 		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
 
- 			a.sourceIndex - b.sourceIndex;
 
- 	// Use IE sourceIndex if available on both nodes
 
- 	if ( diff ) {
 
- 		return diff;
 
- 	}
 
- 	// Check if b follows a
 
- 	if ( cur ) {
 
- 		while ( (cur = cur.nextSibling) ) {
 
- 			if ( cur === b ) {
 
- 				return -1;
 
- 			}
 
- 		}
 
- 	}
 
- 	return a ? 1 : -1;
 
- }
 
- /**
 
-  * Returns a function to use in pseudos for input types
 
-  * @param {String} type
 
-  */
 
- function createInputPseudo( type ) {
 
- 	return function( elem ) {
 
- 		var name = elem.nodeName.toLowerCase();
 
- 		return name === "input" && elem.type === type;
 
- 	};
 
- }
 
- /**
 
-  * Returns a function to use in pseudos for buttons
 
-  * @param {String} type
 
-  */
 
- function createButtonPseudo( type ) {
 
- 	return function( elem ) {
 
- 		var name = elem.nodeName.toLowerCase();
 
- 		return (name === "input" || name === "button") && elem.type === type;
 
- 	};
 
- }
 
- /**
 
-  * Returns a function to use in pseudos for :enabled/:disabled
 
-  * @param {Boolean} disabled true for :disabled; false for :enabled
 
-  */
 
- function createDisabledPseudo( disabled ) {
 
- 	// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
 
- 	return function( elem ) {
 
- 		// Only certain elements can match :enabled or :disabled
 
- 		// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
 
- 		// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
 
- 		if ( "form" in elem ) {
 
- 			// Check for inherited disabledness on relevant non-disabled elements:
 
- 			// * listed form-associated elements in a disabled fieldset
 
- 			//   https://html.spec.whatwg.org/multipage/forms.html#category-listed
 
- 			//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
 
- 			// * option elements in a disabled optgroup
 
- 			//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
 
- 			// All such elements have a "form" property.
 
- 			if ( elem.parentNode && elem.disabled === false ) {
 
- 				// Option elements defer to a parent optgroup if present
 
- 				if ( "label" in elem ) {
 
- 					if ( "label" in elem.parentNode ) {
 
- 						return elem.parentNode.disabled === disabled;
 
- 					} else {
 
- 						return elem.disabled === disabled;
 
- 					}
 
- 				}
 
- 				// Support: IE 6 - 11
 
- 				// Use the isDisabled shortcut property to check for disabled fieldset ancestors
 
- 				return elem.isDisabled === disabled ||
 
- 					// Where there is no isDisabled, check manually
 
- 					/* jshint -W018 */
 
- 					elem.isDisabled !== !disabled &&
 
- 						inDisabledFieldset( elem ) === disabled;
 
- 			}
 
- 			return elem.disabled === disabled;
 
- 		// Try to winnow out elements that can't be disabled before trusting the disabled property.
 
- 		// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
 
- 		// even exist on them, let alone have a boolean value.
 
- 		} else if ( "label" in elem ) {
 
- 			return elem.disabled === disabled;
 
- 		}
 
- 		// Remaining elements are neither :enabled nor :disabled
 
- 		return false;
 
- 	};
 
- }
 
- /**
 
-  * Returns a function to use in pseudos for positionals
 
-  * @param {Function} fn
 
-  */
 
- function createPositionalPseudo( fn ) {
 
- 	return markFunction(function( argument ) {
 
- 		argument = +argument;
 
- 		return markFunction(function( seed, matches ) {
 
- 			var j,
 
- 				matchIndexes = fn( [], seed.length, argument ),
 
- 				i = matchIndexes.length;
 
- 			// Match elements found at the specified indexes
 
- 			while ( i-- ) {
 
- 				if ( seed[ (j = matchIndexes[i]) ] ) {
 
- 					seed[j] = !(matches[j] = seed[j]);
 
- 				}
 
- 			}
 
- 		});
 
- 	});
 
- }
 
- /**
 
-  * Checks a node for validity as a Sizzle context
 
-  * @param {Element|Object=} context
 
-  * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
 
-  */
 
- function testContext( context ) {
 
- 	return context && typeof context.getElementsByTagName !== "undefined" && context;
 
- }
 
- // Expose support vars for convenience
 
- support = Sizzle.support = {};
 
- /**
 
-  * Detects XML nodes
 
-  * @param {Element|Object} elem An element or a document
 
-  * @returns {Boolean} True iff elem is a non-HTML XML node
 
-  */
 
- isXML = Sizzle.isXML = function( elem ) {
 
- 	var namespace = elem.namespaceURI,
 
- 		docElem = (elem.ownerDocument || elem).documentElement;
 
- 	// Support: IE <=8
 
- 	// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
 
- 	// https://bugs.jquery.com/ticket/4833
 
- 	return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
 
- };
 
- /**
 
-  * Sets document-related variables once based on the current document
 
-  * @param {Element|Object} [doc] An element or document object to use to set the document
 
-  * @returns {Object} Returns the current document
 
-  */
 
- setDocument = Sizzle.setDocument = function( node ) {
 
- 	var hasCompare, subWindow,
 
- 		doc = node ? node.ownerDocument || node : preferredDoc;
 
- 	// Return early if doc is invalid or already selected
 
- 	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
 
- 		return document;
 
- 	}
 
- 	// Update global variables
 
- 	document = doc;
 
- 	docElem = document.documentElement;
 
- 	documentIsHTML = !isXML( document );
 
- 	// Support: IE 9-11, Edge
 
- 	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
 
- 	if ( preferredDoc !== document &&
 
- 		(subWindow = document.defaultView) && subWindow.top !== subWindow ) {
 
- 		// Support: IE 11, Edge
 
- 		if ( subWindow.addEventListener ) {
 
- 			subWindow.addEventListener( "unload", unloadHandler, false );
 
- 		// Support: IE 9 - 10 only
 
- 		} else if ( subWindow.attachEvent ) {
 
- 			subWindow.attachEvent( "onunload", unloadHandler );
 
- 		}
 
- 	}
 
- 	/* Attributes
 
- 	---------------------------------------------------------------------- */
 
- 	// Support: IE<8
 
- 	// Verify that getAttribute really returns attributes and not properties
 
- 	// (excepting IE8 booleans)
 
- 	support.attributes = assert(function( el ) {
 
- 		el.className = "i";
 
- 		return !el.getAttribute("className");
 
- 	});
 
- 	/* getElement(s)By*
 
- 	---------------------------------------------------------------------- */
 
- 	// Check if getElementsByTagName("*") returns only elements
 
- 	support.getElementsByTagName = assert(function( el ) {
 
- 		el.appendChild( document.createComment("") );
 
- 		return !el.getElementsByTagName("*").length;
 
- 	});
 
- 	// Support: IE<9
 
- 	support.getElementsByClassName = rnative.test( document.getElementsByClassName );
 
- 	// Support: IE<10
 
- 	// Check if getElementById returns elements by name
 
- 	// The broken getElementById methods don't pick up programmatically-set names,
 
- 	// so use a roundabout getElementsByName test
 
- 	support.getById = assert(function( el ) {
 
- 		docElem.appendChild( el ).id = expando;
 
- 		return !document.getElementsByName || !document.getElementsByName( expando ).length;
 
- 	});
 
- 	// ID filter and find
 
- 	if ( support.getById ) {
 
- 		Expr.filter["ID"] = function( id ) {
 
- 			var attrId = id.replace( runescape, funescape );
 
- 			return function( elem ) {
 
- 				return elem.getAttribute("id") === attrId;
 
- 			};
 
- 		};
 
- 		Expr.find["ID"] = function( id, context ) {
 
- 			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
 
- 				var elem = context.getElementById( id );
 
- 				return elem ? [ elem ] : [];
 
- 			}
 
- 		};
 
- 	} else {
 
- 		Expr.filter["ID"] =  function( id ) {
 
- 			var attrId = id.replace( runescape, funescape );
 
- 			return function( elem ) {
 
- 				var node = typeof elem.getAttributeNode !== "undefined" &&
 
- 					elem.getAttributeNode("id");
 
- 				return node && node.value === attrId;
 
- 			};
 
- 		};
 
- 		// Support: IE 6 - 7 only
 
- 		// getElementById is not reliable as a find shortcut
 
- 		Expr.find["ID"] = function( id, context ) {
 
- 			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
 
- 				var node, i, elems,
 
- 					elem = context.getElementById( id );
 
- 				if ( elem ) {
 
- 					// Verify the id attribute
 
- 					node = elem.getAttributeNode("id");
 
- 					if ( node && node.value === id ) {
 
- 						return [ elem ];
 
- 					}
 
- 					// Fall back on getElementsByName
 
- 					elems = context.getElementsByName( id );
 
- 					i = 0;
 
- 					while ( (elem = elems[i++]) ) {
 
- 						node = elem.getAttributeNode("id");
 
- 						if ( node && node.value === id ) {
 
- 							return [ elem ];
 
- 						}
 
- 					}
 
- 				}
 
- 				return [];
 
- 			}
 
- 		};
 
- 	}
 
- 	// Tag
 
- 	Expr.find["TAG"] = support.getElementsByTagName ?
 
- 		function( tag, context ) {
 
- 			if ( typeof context.getElementsByTagName !== "undefined" ) {
 
- 				return context.getElementsByTagName( tag );
 
- 			// DocumentFragment nodes don't have gEBTN
 
- 			} else if ( support.qsa ) {
 
- 				return context.querySelectorAll( tag );
 
- 			}
 
- 		} :
 
- 		function( tag, context ) {
 
- 			var elem,
 
- 				tmp = [],
 
- 				i = 0,
 
- 				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
 
- 				results = context.getElementsByTagName( tag );
 
- 			// Filter out possible comments
 
- 			if ( tag === "*" ) {
 
- 				while ( (elem = results[i++]) ) {
 
- 					if ( elem.nodeType === 1 ) {
 
- 						tmp.push( elem );
 
- 					}
 
- 				}
 
- 				return tmp;
 
- 			}
 
- 			return results;
 
- 		};
 
- 	// Class
 
- 	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
 
- 		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
 
- 			return context.getElementsByClassName( className );
 
- 		}
 
- 	};
 
- 	/* QSA/matchesSelector
 
- 	---------------------------------------------------------------------- */
 
- 	// QSA and matchesSelector support
 
- 	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
 
- 	rbuggyMatches = [];
 
- 	// qSa(:focus) reports false when true (Chrome 21)
 
- 	// We allow this because of a bug in IE8/9 that throws an error
 
- 	// whenever `document.activeElement` is accessed on an iframe
 
- 	// So, we allow :focus to pass through QSA all the time to avoid the IE error
 
- 	// See https://bugs.jquery.com/ticket/13378
 
- 	rbuggyQSA = [];
 
- 	if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
 
- 		// Build QSA regex
 
- 		// Regex strategy adopted from Diego Perini
 
- 		assert(function( el ) {
 
- 			// Select is set to empty string on purpose
 
- 			// This is to test IE's treatment of not explicitly
 
- 			// setting a boolean content attribute,
 
- 			// since its presence should be enough
 
- 			// https://bugs.jquery.com/ticket/12359
 
- 			docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
 
- 				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
 
- 				"<option selected=''></option></select>";
 
- 			// Support: IE8, Opera 11-12.16
 
- 			// Nothing should be selected when empty strings follow ^= or $= or *=
 
- 			// The test attribute must be unknown in Opera but "safe" for WinRT
 
- 			// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
 
- 			if ( el.querySelectorAll("[msallowcapture^='']").length ) {
 
- 				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
 
- 			}
 
- 			// Support: IE8
 
- 			// Boolean attributes and "value" are not treated correctly
 
- 			if ( !el.querySelectorAll("[selected]").length ) {
 
- 				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
 
- 			}
 
- 			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
 
- 			if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
 
- 				rbuggyQSA.push("~=");
 
- 			}
 
- 			// Webkit/Opera - :checked should return selected option elements
 
- 			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
 
- 			// IE8 throws error here and will not see later tests
 
- 			if ( !el.querySelectorAll(":checked").length ) {
 
- 				rbuggyQSA.push(":checked");
 
- 			}
 
- 			// Support: Safari 8+, iOS 8+
 
- 			// https://bugs.webkit.org/show_bug.cgi?id=136851
 
- 			// In-page `selector#id sibling-combinator selector` fails
 
- 			if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
 
- 				rbuggyQSA.push(".#.+[+~]");
 
- 			}
 
- 		});
 
- 		assert(function( el ) {
 
- 			el.innerHTML = "<a href='' disabled='disabled'></a>" +
 
- 				"<select disabled='disabled'><option/></select>";
 
- 			// Support: Windows 8 Native Apps
 
- 			// The type and name attributes are restricted during .innerHTML assignment
 
- 			var input = document.createElement("input");
 
- 			input.setAttribute( "type", "hidden" );
 
- 			el.appendChild( input ).setAttribute( "name", "D" );
 
- 			// Support: IE8
 
- 			// Enforce case-sensitivity of name attribute
 
- 			if ( el.querySelectorAll("[name=d]").length ) {
 
- 				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
 
- 			}
 
- 			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
 
- 			// IE8 throws error here and will not see later tests
 
- 			if ( el.querySelectorAll(":enabled").length !== 2 ) {
 
- 				rbuggyQSA.push( ":enabled", ":disabled" );
 
- 			}
 
- 			// Support: IE9-11+
 
- 			// IE's :disabled selector does not pick up the children of disabled fieldsets
 
- 			docElem.appendChild( el ).disabled = true;
 
- 			if ( el.querySelectorAll(":disabled").length !== 2 ) {
 
- 				rbuggyQSA.push( ":enabled", ":disabled" );
 
- 			}
 
- 			// Opera 10-11 does not throw on post-comma invalid pseudos
 
- 			el.querySelectorAll("*,:x");
 
- 			rbuggyQSA.push(",.*:");
 
- 		});
 
- 	}
 
- 	if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
 
- 		docElem.webkitMatchesSelector ||
 
- 		docElem.mozMatchesSelector ||
 
- 		docElem.oMatchesSelector ||
 
- 		docElem.msMatchesSelector) )) ) {
 
- 		assert(function( el ) {
 
- 			// Check to see if it's possible to do matchesSelector
 
- 			// on a disconnected node (IE 9)
 
- 			support.disconnectedMatch = matches.call( el, "*" );
 
- 			// This should fail with an exception
 
- 			// Gecko does not error, returns false instead
 
- 			matches.call( el, "[s!='']:x" );
 
- 			rbuggyMatches.push( "!=", pseudos );
 
- 		});
 
- 	}
 
- 	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
 
- 	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
 
- 	/* Contains
 
- 	---------------------------------------------------------------------- */
 
- 	hasCompare = rnative.test( docElem.compareDocumentPosition );
 
- 	// Element contains another
 
- 	// Purposefully self-exclusive
 
- 	// As in, an element does not contain itself
 
- 	contains = hasCompare || rnative.test( docElem.contains ) ?
 
- 		function( a, b ) {
 
- 			var adown = a.nodeType === 9 ? a.documentElement : a,
 
- 				bup = b && b.parentNode;
 
- 			return a === bup || !!( bup && bup.nodeType === 1 && (
 
- 				adown.contains ?
 
- 					adown.contains( bup ) :
 
- 					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
 
- 			));
 
- 		} :
 
- 		function( a, b ) {
 
- 			if ( b ) {
 
- 				while ( (b = b.parentNode) ) {
 
- 					if ( b === a ) {
 
- 						return true;
 
- 					}
 
- 				}
 
- 			}
 
- 			return false;
 
- 		};
 
- 	/* Sorting
 
- 	---------------------------------------------------------------------- */
 
- 	// Document order sorting
 
- 	sortOrder = hasCompare ?
 
- 	function( a, b ) {
 
- 		// Flag for duplicate removal
 
- 		if ( a === b ) {
 
- 			hasDuplicate = true;
 
- 			return 0;
 
- 		}
 
- 		// Sort on method existence if only one input has compareDocumentPosition
 
- 		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
 
- 		if ( compare ) {
 
- 			return compare;
 
- 		}
 
- 		// Calculate position if both inputs belong to the same document
 
- 		compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
 
- 			a.compareDocumentPosition( b ) :
 
- 			// Otherwise we know they are disconnected
 
- 			1;
 
- 		// Disconnected nodes
 
- 		if ( compare & 1 ||
 
- 			(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
 
- 			// Choose the first element that is related to our preferred document
 
- 			if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
 
- 				return -1;
 
- 			}
 
- 			if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
 
- 				return 1;
 
- 			}
 
- 			// Maintain original order
 
- 			return sortInput ?
 
- 				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
 
- 				0;
 
- 		}
 
- 		return compare & 4 ? -1 : 1;
 
- 	} :
 
- 	function( a, b ) {
 
- 		// Exit early if the nodes are identical
 
- 		if ( a === b ) {
 
- 			hasDuplicate = true;
 
- 			return 0;
 
- 		}
 
- 		var cur,
 
- 			i = 0,
 
- 			aup = a.parentNode,
 
- 			bup = b.parentNode,
 
- 			ap = [ a ],
 
- 			bp = [ b ];
 
- 		// Parentless nodes are either documents or disconnected
 
- 		if ( !aup || !bup ) {
 
- 			return a === document ? -1 :
 
- 				b === document ? 1 :
 
- 				aup ? -1 :
 
- 				bup ? 1 :
 
- 				sortInput ?
 
- 				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
 
- 				0;
 
- 		// If the nodes are siblings, we can do a quick check
 
- 		} else if ( aup === bup ) {
 
- 			return siblingCheck( a, b );
 
- 		}
 
- 		// Otherwise we need full lists of their ancestors for comparison
 
- 		cur = a;
 
- 		while ( (cur = cur.parentNode) ) {
 
- 			ap.unshift( cur );
 
- 		}
 
- 		cur = b;
 
- 		while ( (cur = cur.parentNode) ) {
 
- 			bp.unshift( cur );
 
- 		}
 
- 		// Walk down the tree looking for a discrepancy
 
- 		while ( ap[i] === bp[i] ) {
 
- 			i++;
 
- 		}
 
- 		return i ?
 
- 			// Do a sibling check if the nodes have a common ancestor
 
- 			siblingCheck( ap[i], bp[i] ) :
 
- 			// Otherwise nodes in our document sort first
 
- 			ap[i] === preferredDoc ? -1 :
 
- 			bp[i] === preferredDoc ? 1 :
 
- 			0;
 
- 	};
 
- 	return document;
 
- };
 
- Sizzle.matches = function( expr, elements ) {
 
- 	return Sizzle( expr, null, null, elements );
 
- };
 
- Sizzle.matchesSelector = function( elem, expr ) {
 
- 	// Set document vars if needed
 
- 	if ( ( elem.ownerDocument || elem ) !== document ) {
 
- 		setDocument( elem );
 
- 	}
 
- 	if ( support.matchesSelector && documentIsHTML &&
 
- 		!nonnativeSelectorCache[ expr + " " ] &&
 
- 		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
 
- 		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
 
- 		try {
 
- 			var ret = matches.call( elem, expr );
 
- 			// IE 9's matchesSelector returns false on disconnected nodes
 
- 			if ( ret || support.disconnectedMatch ||
 
- 					// As well, disconnected nodes are said to be in a document
 
- 					// fragment in IE 9
 
- 					elem.document && elem.document.nodeType !== 11 ) {
 
- 				return ret;
 
- 			}
 
- 		} catch (e) {
 
- 			nonnativeSelectorCache( expr, true );
 
- 		}
 
- 	}
 
- 	return Sizzle( expr, document, null, [ elem ] ).length > 0;
 
- };
 
- Sizzle.contains = function( context, elem ) {
 
- 	// Set document vars if needed
 
- 	if ( ( context.ownerDocument || context ) !== document ) {
 
- 		setDocument( context );
 
- 	}
 
- 	return contains( context, elem );
 
- };
 
- Sizzle.attr = function( elem, name ) {
 
- 	// Set document vars if needed
 
- 	if ( ( elem.ownerDocument || elem ) !== document ) {
 
- 		setDocument( elem );
 
- 	}
 
- 	var fn = Expr.attrHandle[ name.toLowerCase() ],
 
- 		// Don't get fooled by Object.prototype properties (jQuery #13807)
 
- 		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
 
- 			fn( elem, name, !documentIsHTML ) :
 
- 			undefined;
 
- 	return val !== undefined ?
 
- 		val :
 
- 		support.attributes || !documentIsHTML ?
 
- 			elem.getAttribute( name ) :
 
- 			(val = elem.getAttributeNode(name)) && val.specified ?
 
- 				val.value :
 
- 				null;
 
- };
 
- Sizzle.escape = function( sel ) {
 
- 	return (sel + "").replace( rcssescape, fcssescape );
 
- };
 
- Sizzle.error = function( msg ) {
 
- 	throw new Error( "Syntax error, unrecognized expression: " + msg );
 
- };
 
- /**
 
-  * Document sorting and removing duplicates
 
-  * @param {ArrayLike} results
 
-  */
 
- Sizzle.uniqueSort = function( results ) {
 
- 	var elem,
 
- 		duplicates = [],
 
- 		j = 0,
 
- 		i = 0;
 
- 	// Unless we *know* we can detect duplicates, assume their presence
 
- 	hasDuplicate = !support.detectDuplicates;
 
- 	sortInput = !support.sortStable && results.slice( 0 );
 
- 	results.sort( sortOrder );
 
- 	if ( hasDuplicate ) {
 
- 		while ( (elem = results[i++]) ) {
 
- 			if ( elem === results[ i ] ) {
 
- 				j = duplicates.push( i );
 
- 			}
 
- 		}
 
- 		while ( j-- ) {
 
- 			results.splice( duplicates[ j ], 1 );
 
- 		}
 
- 	}
 
- 	// Clear input after sorting to release objects
 
- 	// See https://github.com/jquery/sizzle/pull/225
 
- 	sortInput = null;
 
- 	return results;
 
- };
 
- /**
 
-  * Utility function for retrieving the text value of an array of DOM nodes
 
-  * @param {Array|Element} elem
 
-  */
 
- getText = Sizzle.getText = function( elem ) {
 
- 	var node,
 
- 		ret = "",
 
- 		i = 0,
 
- 		nodeType = elem.nodeType;
 
- 	if ( !nodeType ) {
 
- 		// If no nodeType, this is expected to be an array
 
- 		while ( (node = elem[i++]) ) {
 
- 			// Do not traverse comment nodes
 
- 			ret += getText( node );
 
- 		}
 
- 	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
 
- 		// Use textContent for elements
 
- 		// innerText usage removed for consistency of new lines (jQuery #11153)
 
- 		if ( typeof elem.textContent === "string" ) {
 
- 			return elem.textContent;
 
- 		} else {
 
- 			// Traverse its children
 
- 			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
 
- 				ret += getText( elem );
 
- 			}
 
- 		}
 
- 	} else if ( nodeType === 3 || nodeType === 4 ) {
 
- 		return elem.nodeValue;
 
- 	}
 
- 	// Do not include comment or processing instruction nodes
 
- 	return ret;
 
- };
 
- Expr = Sizzle.selectors = {
 
- 	// Can be adjusted by the user
 
- 	cacheLength: 50,
 
- 	createPseudo: markFunction,
 
- 	match: matchExpr,
 
- 	attrHandle: {},
 
- 	find: {},
 
- 	relative: {
 
- 		">": { dir: "parentNode", first: true },
 
- 		" ": { dir: "parentNode" },
 
- 		"+": { dir: "previousSibling", first: true },
 
- 		"~": { dir: "previousSibling" }
 
- 	},
 
- 	preFilter: {
 
- 		"ATTR": function( match ) {
 
- 			match[1] = match[1].replace( runescape, funescape );
 
- 			// Move the given value to match[3] whether quoted or unquoted
 
- 			match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
 
- 			if ( match[2] === "~=" ) {
 
- 				match[3] = " " + match[3] + " ";
 
- 			}
 
- 			return match.slice( 0, 4 );
 
- 		},
 
- 		"CHILD": function( match ) {
 
- 			/* matches from matchExpr["CHILD"]
 
- 				1 type (only|nth|...)
 
- 				2 what (child|of-type)
 
- 				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
 
- 				4 xn-component of xn+y argument ([+-]?\d*n|)
 
- 				5 sign of xn-component
 
- 				6 x of xn-component
 
- 				7 sign of y-component
 
- 				8 y of y-component
 
- 			*/
 
- 			match[1] = match[1].toLowerCase();
 
- 			if ( match[1].slice( 0, 3 ) === "nth" ) {
 
- 				// nth-* requires argument
 
- 				if ( !match[3] ) {
 
- 					Sizzle.error( match[0] );
 
- 				}
 
- 				// numeric x and y parameters for Expr.filter.CHILD
 
- 				// remember that false/true cast respectively to 0/1
 
- 				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
 
- 				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
 
- 			// other types prohibit arguments
 
- 			} else if ( match[3] ) {
 
- 				Sizzle.error( match[0] );
 
- 			}
 
- 			return match;
 
- 		},
 
- 		"PSEUDO": function( match ) {
 
- 			var excess,
 
- 				unquoted = !match[6] && match[2];
 
- 			if ( matchExpr["CHILD"].test( match[0] ) ) {
 
- 				return null;
 
- 			}
 
- 			// Accept quoted arguments as-is
 
- 			if ( match[3] ) {
 
- 				match[2] = match[4] || match[5] || "";
 
- 			// Strip excess characters from unquoted arguments
 
- 			} else if ( unquoted && rpseudo.test( unquoted ) &&
 
- 				// Get excess from tokenize (recursively)
 
- 				(excess = tokenize( unquoted, true )) &&
 
- 				// advance to the next closing parenthesis
 
- 				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
 
- 				// excess is a negative index
 
- 				match[0] = match[0].slice( 0, excess );
 
- 				match[2] = unquoted.slice( 0, excess );
 
- 			}
 
- 			// Return only captures needed by the pseudo filter method (type and argument)
 
- 			return match.slice( 0, 3 );
 
- 		}
 
- 	},
 
- 	filter: {
 
- 		"TAG": function( nodeNameSelector ) {
 
- 			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
 
- 			return nodeNameSelector === "*" ?
 
- 				function() { return true; } :
 
- 				function( elem ) {
 
- 					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
 
- 				};
 
- 		},
 
- 		"CLASS": function( className ) {
 
- 			var pattern = classCache[ className + " " ];
 
- 			return pattern ||
 
- 				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
 
- 				classCache( className, function( elem ) {
 
- 					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
 
- 				});
 
- 		},
 
- 		"ATTR": function( name, operator, check ) {
 
- 			return function( elem ) {
 
- 				var result = Sizzle.attr( elem, name );
 
- 				if ( result == null ) {
 
- 					return operator === "!=";
 
- 				}
 
- 				if ( !operator ) {
 
- 					return true;
 
- 				}
 
- 				result += "";
 
- 				return operator === "=" ? result === check :
 
- 					operator === "!=" ? result !== check :
 
- 					operator === "^=" ? check && result.indexOf( check ) === 0 :
 
- 					operator === "*=" ? check && result.indexOf( check ) > -1 :
 
- 					operator === "$=" ? check && result.slice( -check.length ) === check :
 
- 					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
 
- 					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
 
- 					false;
 
- 			};
 
- 		},
 
- 		"CHILD": function( type, what, argument, first, last ) {
 
- 			var simple = type.slice( 0, 3 ) !== "nth",
 
- 				forward = type.slice( -4 ) !== "last",
 
- 				ofType = what === "of-type";
 
- 			return first === 1 && last === 0 ?
 
- 				// Shortcut for :nth-*(n)
 
- 				function( elem ) {
 
- 					return !!elem.parentNode;
 
- 				} :
 
- 				function( elem, context, xml ) {
 
- 					var cache, uniqueCache, outerCache, node, nodeIndex, start,
 
- 						dir = simple !== forward ? "nextSibling" : "previousSibling",
 
- 						parent = elem.parentNode,
 
- 						name = ofType && elem.nodeName.toLowerCase(),
 
- 						useCache = !xml && !ofType,
 
- 						diff = false;
 
- 					if ( parent ) {
 
- 						// :(first|last|only)-(child|of-type)
 
- 						if ( simple ) {
 
- 							while ( dir ) {
 
- 								node = elem;
 
- 								while ( (node = node[ dir ]) ) {
 
- 									if ( ofType ?
 
- 										node.nodeName.toLowerCase() === name :
 
- 										node.nodeType === 1 ) {
 
- 										return false;
 
- 									}
 
- 								}
 
- 								// Reverse direction for :only-* (if we haven't yet done so)
 
- 								start = dir = type === "only" && !start && "nextSibling";
 
- 							}
 
- 							return true;
 
- 						}
 
- 						start = [ forward ? parent.firstChild : parent.lastChild ];
 
- 						// non-xml :nth-child(...) stores cache data on `parent`
 
- 						if ( forward && useCache ) {
 
- 							// Seek `elem` from a previously-cached index
 
- 							// ...in a gzip-friendly way
 
- 							node = parent;
 
- 							outerCache = node[ expando ] || (node[ expando ] = {});
 
- 							// Support: IE <9 only
 
- 							// Defend against cloned attroperties (jQuery gh-1709)
 
- 							uniqueCache = outerCache[ node.uniqueID ] ||
 
- 								(outerCache[ node.uniqueID ] = {});
 
- 							cache = uniqueCache[ type ] || [];
 
- 							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
 
- 							diff = nodeIndex && cache[ 2 ];
 
- 							node = nodeIndex && parent.childNodes[ nodeIndex ];
 
- 							while ( (node = ++nodeIndex && node && node[ dir ] ||
 
- 								// Fallback to seeking `elem` from the start
 
- 								(diff = nodeIndex = 0) || start.pop()) ) {
 
- 								// When found, cache indexes on `parent` and break
 
- 								if ( node.nodeType === 1 && ++diff && node === elem ) {
 
- 									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
 
- 									break;
 
- 								}
 
- 							}
 
- 						} else {
 
- 							// Use previously-cached element index if available
 
- 							if ( useCache ) {
 
- 								// ...in a gzip-friendly way
 
- 								node = elem;
 
- 								outerCache = node[ expando ] || (node[ expando ] = {});
 
- 								// Support: IE <9 only
 
- 								// Defend against cloned attroperties (jQuery gh-1709)
 
- 								uniqueCache = outerCache[ node.uniqueID ] ||
 
- 									(outerCache[ node.uniqueID ] = {});
 
- 								cache = uniqueCache[ type ] || [];
 
- 								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
 
- 								diff = nodeIndex;
 
- 							}
 
- 							// xml :nth-child(...)
 
- 							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
 
- 							if ( diff === false ) {
 
- 								// Use the same loop as above to seek `elem` from the start
 
- 								while ( (node = ++nodeIndex && node && node[ dir ] ||
 
- 									(diff = nodeIndex = 0) || start.pop()) ) {
 
- 									if ( ( ofType ?
 
- 										node.nodeName.toLowerCase() === name :
 
- 										node.nodeType === 1 ) &&
 
- 										++diff ) {
 
- 										// Cache the index of each encountered element
 
- 										if ( useCache ) {
 
- 											outerCache = node[ expando ] || (node[ expando ] = {});
 
- 											// Support: IE <9 only
 
- 											// Defend against cloned attroperties (jQuery gh-1709)
 
- 											uniqueCache = outerCache[ node.uniqueID ] ||
 
- 												(outerCache[ node.uniqueID ] = {});
 
- 											uniqueCache[ type ] = [ dirruns, diff ];
 
- 										}
 
- 										if ( node === elem ) {
 
- 											break;
 
- 										}
 
- 									}
 
- 								}
 
- 							}
 
- 						}
 
- 						// Incorporate the offset, then check against cycle size
 
- 						diff -= last;
 
- 						return diff === first || ( diff % first === 0 && diff / first >= 0 );
 
- 					}
 
- 				};
 
- 		},
 
- 		"PSEUDO": function( pseudo, argument ) {
 
- 			// pseudo-class names are case-insensitive
 
- 			// http://www.w3.org/TR/selectors/#pseudo-classes
 
- 			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
 
- 			// Remember that setFilters inherits from pseudos
 
- 			var args,
 
- 				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
 
- 					Sizzle.error( "unsupported pseudo: " + pseudo );
 
- 			// The user may use createPseudo to indicate that
 
- 			// arguments are needed to create the filter function
 
- 			// just as Sizzle does
 
- 			if ( fn[ expando ] ) {
 
- 				return fn( argument );
 
- 			}
 
- 			// But maintain support for old signatures
 
- 			if ( fn.length > 1 ) {
 
- 				args = [ pseudo, pseudo, "", argument ];
 
- 				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
 
- 					markFunction(function( seed, matches ) {
 
- 						var idx,
 
- 							matched = fn( seed, argument ),
 
- 							i = matched.length;
 
- 						while ( i-- ) {
 
- 							idx = indexOf( seed, matched[i] );
 
- 							seed[ idx ] = !( matches[ idx ] = matched[i] );
 
- 						}
 
- 					}) :
 
- 					function( elem ) {
 
- 						return fn( elem, 0, args );
 
- 					};
 
- 			}
 
- 			return fn;
 
- 		}
 
- 	},
 
- 	pseudos: {
 
- 		// Potentially complex pseudos
 
- 		"not": markFunction(function( selector ) {
 
- 			// Trim the selector passed to compile
 
- 			// to avoid treating leading and trailing
 
- 			// spaces as combinators
 
- 			var input = [],
 
- 				results = [],
 
- 				matcher = compile( selector.replace( rtrim, "$1" ) );
 
- 			return matcher[ expando ] ?
 
- 				markFunction(function( seed, matches, context, xml ) {
 
- 					var elem,
 
- 						unmatched = matcher( seed, null, xml, [] ),
 
- 						i = seed.length;
 
- 					// Match elements unmatched by `matcher`
 
- 					while ( i-- ) {
 
- 						if ( (elem = unmatched[i]) ) {
 
- 							seed[i] = !(matches[i] = elem);
 
- 						}
 
- 					}
 
- 				}) :
 
- 				function( elem, context, xml ) {
 
- 					input[0] = elem;
 
- 					matcher( input, null, xml, results );
 
- 					// Don't keep the element (issue #299)
 
- 					input[0] = null;
 
- 					return !results.pop();
 
- 				};
 
- 		}),
 
- 		"has": markFunction(function( selector ) {
 
- 			return function( elem ) {
 
- 				return Sizzle( selector, elem ).length > 0;
 
- 			};
 
- 		}),
 
- 		"contains": markFunction(function( text ) {
 
- 			text = text.replace( runescape, funescape );
 
- 			return function( elem ) {
 
- 				return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
 
- 			};
 
- 		}),
 
- 		// "Whether an element is represented by a :lang() selector
 
- 		// is based solely on the element's language value
 
- 		// being equal to the identifier C,
 
- 		// or beginning with the identifier C immediately followed by "-".
 
- 		// The matching of C against the element's language value is performed case-insensitively.
 
- 		// The identifier C does not have to be a valid language name."
 
- 		// http://www.w3.org/TR/selectors/#lang-pseudo
 
- 		"lang": markFunction( function( lang ) {
 
- 			// lang value must be a valid identifier
 
- 			if ( !ridentifier.test(lang || "") ) {
 
- 				Sizzle.error( "unsupported lang: " + lang );
 
- 			}
 
- 			lang = lang.replace( runescape, funescape ).toLowerCase();
 
- 			return function( elem ) {
 
- 				var elemLang;
 
- 				do {
 
- 					if ( (elemLang = documentIsHTML ?
 
- 						elem.lang :
 
- 						elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
 
- 						elemLang = elemLang.toLowerCase();
 
- 						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
 
- 					}
 
- 				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
 
- 				return false;
 
- 			};
 
- 		}),
 
- 		// Miscellaneous
 
- 		"target": function( elem ) {
 
- 			var hash = window.location && window.location.hash;
 
- 			return hash && hash.slice( 1 ) === elem.id;
 
- 		},
 
- 		"root": function( elem ) {
 
- 			return elem === docElem;
 
- 		},
 
- 		"focus": function( elem ) {
 
- 			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
 
- 		},
 
- 		// Boolean properties
 
- 		"enabled": createDisabledPseudo( false ),
 
- 		"disabled": createDisabledPseudo( true ),
 
- 		"checked": function( elem ) {
 
- 			// In CSS3, :checked should return both checked and selected elements
 
- 			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
 
- 			var nodeName = elem.nodeName.toLowerCase();
 
- 			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
 
- 		},
 
- 		"selected": function( elem ) {
 
- 			// Accessing this property makes selected-by-default
 
- 			// options in Safari work properly
 
- 			if ( elem.parentNode ) {
 
- 				elem.parentNode.selectedIndex;
 
- 			}
 
- 			return elem.selected === true;
 
- 		},
 
- 		// Contents
 
- 		"empty": function( elem ) {
 
- 			// http://www.w3.org/TR/selectors/#empty-pseudo
 
- 			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
 
- 			//   but not by others (comment: 8; processing instruction: 7; etc.)
 
- 			// nodeType < 6 works because attributes (2) do not appear as children
 
- 			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
 
- 				if ( elem.nodeType < 6 ) {
 
- 					return false;
 
- 				}
 
- 			}
 
- 			return true;
 
- 		},
 
- 		"parent": function( elem ) {
 
- 			return !Expr.pseudos["empty"]( elem );
 
- 		},
 
- 		// Element/input types
 
- 		"header": function( elem ) {
 
- 			return rheader.test( elem.nodeName );
 
- 		},
 
- 		"input": function( elem ) {
 
- 			return rinputs.test( elem.nodeName );
 
- 		},
 
- 		"button": function( elem ) {
 
- 			var name = elem.nodeName.toLowerCase();
 
- 			return name === "input" && elem.type === "button" || name === "button";
 
- 		},
 
- 		"text": function( elem ) {
 
- 			var attr;
 
- 			return elem.nodeName.toLowerCase() === "input" &&
 
- 				elem.type === "text" &&
 
- 				// Support: IE<8
 
- 				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
 
- 				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
 
- 		},
 
- 		// Position-in-collection
 
- 		"first": createPositionalPseudo(function() {
 
- 			return [ 0 ];
 
- 		}),
 
- 		"last": createPositionalPseudo(function( matchIndexes, length ) {
 
- 			return [ length - 1 ];
 
- 		}),
 
- 		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
 
- 			return [ argument < 0 ? argument + length : argument ];
 
- 		}),
 
- 		"even": createPositionalPseudo(function( matchIndexes, length ) {
 
- 			var i = 0;
 
- 			for ( ; i < length; i += 2 ) {
 
- 				matchIndexes.push( i );
 
- 			}
 
- 			return matchIndexes;
 
- 		}),
 
- 		"odd": createPositionalPseudo(function( matchIndexes, length ) {
 
- 			var i = 1;
 
- 			for ( ; i < length; i += 2 ) {
 
- 				matchIndexes.push( i );
 
- 			}
 
- 			return matchIndexes;
 
- 		}),
 
- 		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
 
- 			var i = argument < 0 ?
 
- 				argument + length :
 
- 				argument > length ?
 
- 					length :
 
- 					argument;
 
- 			for ( ; --i >= 0; ) {
 
- 				matchIndexes.push( i );
 
- 			}
 
- 			return matchIndexes;
 
- 		}),
 
- 		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
 
- 			var i = argument < 0 ? argument + length : argument;
 
- 			for ( ; ++i < length; ) {
 
- 				matchIndexes.push( i );
 
- 			}
 
- 			return matchIndexes;
 
- 		})
 
- 	}
 
- };
 
- Expr.pseudos["nth"] = Expr.pseudos["eq"];
 
- // Add button/input type pseudos
 
- for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
 
- 	Expr.pseudos[ i ] = createInputPseudo( i );
 
- }
 
- for ( i in { submit: true, reset: true } ) {
 
- 	Expr.pseudos[ i ] = createButtonPseudo( i );
 
- }
 
- // Easy API for creating new setFilters
 
- function setFilters() {}
 
- setFilters.prototype = Expr.filters = Expr.pseudos;
 
- Expr.setFilters = new setFilters();
 
- tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
 
- 	var matched, match, tokens, type,
 
- 		soFar, groups, preFilters,
 
- 		cached = tokenCache[ selector + " " ];
 
- 	if ( cached ) {
 
- 		return parseOnly ? 0 : cached.slice( 0 );
 
- 	}
 
- 	soFar = selector;
 
- 	groups = [];
 
- 	preFilters = Expr.preFilter;
 
- 	while ( soFar ) {
 
- 		// Comma and first run
 
- 		if ( !matched || (match = rcomma.exec( soFar )) ) {
 
- 			if ( match ) {
 
- 				// Don't consume trailing commas as valid
 
- 				soFar = soFar.slice( match[0].length ) || soFar;
 
- 			}
 
- 			groups.push( (tokens = []) );
 
- 		}
 
- 		matched = false;
 
- 		// Combinators
 
- 		if ( (match = rcombinators.exec( soFar )) ) {
 
- 			matched = match.shift();
 
- 			tokens.push({
 
- 				value: matched,
 
- 				// Cast descendant combinators to space
 
- 				type: match[0].replace( rtrim, " " )
 
- 			});
 
- 			soFar = soFar.slice( matched.length );
 
- 		}
 
- 		// Filters
 
- 		for ( type in Expr.filter ) {
 
- 			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
 
- 				(match = preFilters[ type ]( match ))) ) {
 
- 				matched = match.shift();
 
- 				tokens.push({
 
- 					value: matched,
 
- 					type: type,
 
- 					matches: match
 
- 				});
 
- 				soFar = soFar.slice( matched.length );
 
- 			}
 
- 		}
 
- 		if ( !matched ) {
 
- 			break;
 
- 		}
 
- 	}
 
- 	// Return the length of the invalid excess
 
- 	// if we're just parsing
 
- 	// Otherwise, throw an error or return tokens
 
- 	return parseOnly ?
 
- 		soFar.length :
 
- 		soFar ?
 
- 			Sizzle.error( selector ) :
 
- 			// Cache the tokens
 
- 			tokenCache( selector, groups ).slice( 0 );
 
- };
 
- function toSelector( tokens ) {
 
- 	var i = 0,
 
- 		len = tokens.length,
 
- 		selector = "";
 
- 	for ( ; i < len; i++ ) {
 
- 		selector += tokens[i].value;
 
- 	}
 
- 	return selector;
 
- }
 
- function addCombinator( matcher, combinator, base ) {
 
- 	var dir = combinator.dir,
 
- 		skip = combinator.next,
 
- 		key = skip || dir,
 
- 		checkNonElements = base && key === "parentNode",
 
- 		doneName = done++;
 
- 	return combinator.first ?
 
- 		// Check against closest ancestor/preceding element
 
- 		function( elem, context, xml ) {
 
- 			while ( (elem = elem[ dir ]) ) {
 
- 				if ( elem.nodeType === 1 || checkNonElements ) {
 
- 					return matcher( elem, context, xml );
 
- 				}
 
- 			}
 
- 			return false;
 
- 		} :
 
- 		// Check against all ancestor/preceding elements
 
- 		function( elem, context, xml ) {
 
- 			var oldCache, uniqueCache, outerCache,
 
- 				newCache = [ dirruns, doneName ];
 
- 			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
 
- 			if ( xml ) {
 
- 				while ( (elem = elem[ dir ]) ) {
 
- 					if ( elem.nodeType === 1 || checkNonElements ) {
 
- 						if ( matcher( elem, context, xml ) ) {
 
- 							return true;
 
- 						}
 
- 					}
 
- 				}
 
- 			} else {
 
- 				while ( (elem = elem[ dir ]) ) {
 
- 					if ( elem.nodeType === 1 || checkNonElements ) {
 
- 						outerCache = elem[ expando ] || (elem[ expando ] = {});
 
- 						// Support: IE <9 only
 
- 						// Defend against cloned attroperties (jQuery gh-1709)
 
- 						uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
 
- 						if ( skip && skip === elem.nodeName.toLowerCase() ) {
 
- 							elem = elem[ dir ] || elem;
 
- 						} else if ( (oldCache = uniqueCache[ key ]) &&
 
- 							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
 
- 							// Assign to newCache so results back-propagate to previous elements
 
- 							return (newCache[ 2 ] = oldCache[ 2 ]);
 
- 						} else {
 
- 							// Reuse newcache so results back-propagate to previous elements
 
- 							uniqueCache[ key ] = newCache;
 
- 							// A match means we're done; a fail means we have to keep checking
 
- 							if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
 
- 								return true;
 
- 							}
 
- 						}
 
- 					}
 
- 				}
 
- 			}
 
- 			return false;
 
- 		};
 
- }
 
- function elementMatcher( matchers ) {
 
- 	return matchers.length > 1 ?
 
- 		function( elem, context, xml ) {
 
- 			var i = matchers.length;
 
- 			while ( i-- ) {
 
- 				if ( !matchers[i]( elem, context, xml ) ) {
 
- 					return false;
 
- 				}
 
- 			}
 
- 			return true;
 
- 		} :
 
- 		matchers[0];
 
- }
 
- function multipleContexts( selector, contexts, results ) {
 
- 	var i = 0,
 
- 		len = contexts.length;
 
- 	for ( ; i < len; i++ ) {
 
- 		Sizzle( selector, contexts[i], results );
 
- 	}
 
- 	return results;
 
- }
 
- function condense( unmatched, map, filter, context, xml ) {
 
- 	var elem,
 
- 		newUnmatched = [],
 
- 		i = 0,
 
- 		len = unmatched.length,
 
- 		mapped = map != null;
 
- 	for ( ; i < len; i++ ) {
 
- 		if ( (elem = unmatched[i]) ) {
 
- 			if ( !filter || filter( elem, context, xml ) ) {
 
- 				newUnmatched.push( elem );
 
- 				if ( mapped ) {
 
- 					map.push( i );
 
- 				}
 
- 			}
 
- 		}
 
- 	}
 
- 	return newUnmatched;
 
- }
 
- function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
 
- 	if ( postFilter && !postFilter[ expando ] ) {
 
- 		postFilter = setMatcher( postFilter );
 
- 	}
 
- 	if ( postFinder && !postFinder[ expando ] ) {
 
- 		postFinder = setMatcher( postFinder, postSelector );
 
- 	}
 
- 	return markFunction(function( seed, results, context, xml ) {
 
- 		var temp, i, elem,
 
- 			preMap = [],
 
- 			postMap = [],
 
- 			preexisting = results.length,
 
- 			// Get initial elements from seed or context
 
- 			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
 
- 			// Prefilter to get matcher input, preserving a map for seed-results synchronization
 
- 			matcherIn = preFilter && ( seed || !selector ) ?
 
- 				condense( elems, preMap, preFilter, context, xml ) :
 
- 				elems,
 
- 			matcherOut = matcher ?
 
- 				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
 
- 				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
 
- 					// ...intermediate processing is necessary
 
- 					[] :
 
- 					// ...otherwise use results directly
 
- 					results :
 
- 				matcherIn;
 
- 		// Find primary matches
 
- 		if ( matcher ) {
 
- 			matcher( matcherIn, matcherOut, context, xml );
 
- 		}
 
- 		// Apply postFilter
 
- 		if ( postFilter ) {
 
- 			temp = condense( matcherOut, postMap );
 
- 			postFilter( temp, [], context, xml );
 
- 			// Un-match failing elements by moving them back to matcherIn
 
- 			i = temp.length;
 
- 			while ( i-- ) {
 
- 				if ( (elem = temp[i]) ) {
 
- 					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
 
- 				}
 
- 			}
 
- 		}
 
- 		if ( seed ) {
 
- 			if ( postFinder || preFilter ) {
 
- 				if ( postFinder ) {
 
- 					// Get the final matcherOut by condensing this intermediate into postFinder contexts
 
- 					temp = [];
 
- 					i = matcherOut.length;
 
- 					while ( i-- ) {
 
- 						if ( (elem = matcherOut[i]) ) {
 
- 							// Restore matcherIn since elem is not yet a final match
 
- 							temp.push( (matcherIn[i] = elem) );
 
- 						}
 
- 					}
 
- 					postFinder( null, (matcherOut = []), temp, xml );
 
- 				}
 
- 				// Move matched elements from seed to results to keep them synchronized
 
- 				i = matcherOut.length;
 
- 				while ( i-- ) {
 
- 					if ( (elem = matcherOut[i]) &&
 
- 						(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
 
- 						seed[temp] = !(results[temp] = elem);
 
- 					}
 
- 				}
 
- 			}
 
- 		// Add elements to results, through postFinder if defined
 
- 		} else {
 
- 			matcherOut = condense(
 
- 				matcherOut === results ?
 
- 					matcherOut.splice( preexisting, matcherOut.length ) :
 
- 					matcherOut
 
- 			);
 
- 			if ( postFinder ) {
 
- 				postFinder( null, results, matcherOut, xml );
 
- 			} else {
 
- 				push.apply( results, matcherOut );
 
- 			}
 
- 		}
 
- 	});
 
- }
 
- function matcherFromTokens( tokens ) {
 
- 	var checkContext, matcher, j,
 
- 		len = tokens.length,
 
- 		leadingRelative = Expr.relative[ tokens[0].type ],
 
- 		implicitRelative = leadingRelative || Expr.relative[" "],
 
- 		i = leadingRelative ? 1 : 0,
 
- 		// The foundational matcher ensures that elements are reachable from top-level context(s)
 
- 		matchContext = addCombinator( function( elem ) {
 
- 			return elem === checkContext;
 
- 		}, implicitRelative, true ),
 
- 		matchAnyContext = addCombinator( function( elem ) {
 
- 			return indexOf( checkContext, elem ) > -1;
 
- 		}, implicitRelative, true ),
 
- 		matchers = [ function( elem, context, xml ) {
 
- 			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
 
- 				(checkContext = context).nodeType ?
 
- 					matchContext( elem, context, xml ) :
 
- 					matchAnyContext( elem, context, xml ) );
 
- 			// Avoid hanging onto element (issue #299)
 
- 			checkContext = null;
 
- 			return ret;
 
- 		} ];
 
- 	for ( ; i < len; i++ ) {
 
- 		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
 
- 			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
 
- 		} else {
 
- 			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
 
- 			// Return special upon seeing a positional matcher
 
- 			if ( matcher[ expando ] ) {
 
- 				// Find the next relative operator (if any) for proper handling
 
- 				j = ++i;
 
- 				for ( ; j < len; j++ ) {
 
- 					if ( Expr.relative[ tokens[j].type ] ) {
 
- 						break;
 
- 					}
 
- 				}
 
- 				return setMatcher(
 
- 					i > 1 && elementMatcher( matchers ),
 
- 					i > 1 && toSelector(
 
- 						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
 
- 						tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
 
- 					).replace( rtrim, "$1" ),
 
- 					matcher,
 
- 					i < j && matcherFromTokens( tokens.slice( i, j ) ),
 
- 					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
 
- 					j < len && toSelector( tokens )
 
- 				);
 
- 			}
 
- 			matchers.push( matcher );
 
- 		}
 
- 	}
 
- 	return elementMatcher( matchers );
 
- }
 
- function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
 
- 	var bySet = setMatchers.length > 0,
 
- 		byElement = elementMatchers.length > 0,
 
- 		superMatcher = function( seed, context, xml, results, outermost ) {
 
- 			var elem, j, matcher,
 
- 				matchedCount = 0,
 
- 				i = "0",
 
- 				unmatched = seed && [],
 
- 				setMatched = [],
 
- 				contextBackup = outermostContext,
 
- 				// We must always have either seed elements or outermost context
 
- 				elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
 
- 				// Use integer dirruns iff this is the outermost matcher
 
- 				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
 
- 				len = elems.length;
 
- 			if ( outermost ) {
 
- 				outermostContext = context === document || context || outermost;
 
- 			}
 
- 			// Add elements passing elementMatchers directly to results
 
- 			// Support: IE<9, Safari
 
- 			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
 
- 			for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
 
- 				if ( byElement && elem ) {
 
- 					j = 0;
 
- 					if ( !context && elem.ownerDocument !== document ) {
 
- 						setDocument( elem );
 
- 						xml = !documentIsHTML;
 
- 					}
 
- 					while ( (matcher = elementMatchers[j++]) ) {
 
- 						if ( matcher( elem, context || document, xml) ) {
 
- 							results.push( elem );
 
- 							break;
 
- 						}
 
- 					}
 
- 					if ( outermost ) {
 
- 						dirruns = dirrunsUnique;
 
- 					}
 
- 				}
 
- 				// Track unmatched elements for set filters
 
- 				if ( bySet ) {
 
- 					// They will have gone through all possible matchers
 
- 					if ( (elem = !matcher && elem) ) {
 
- 						matchedCount--;
 
- 					}
 
- 					// Lengthen the array for every element, matched or not
 
- 					if ( seed ) {
 
- 						unmatched.push( elem );
 
- 					}
 
- 				}
 
- 			}
 
- 			// `i` is now the count of elements visited above, and adding it to `matchedCount`
 
- 			// makes the latter nonnegative.
 
- 			matchedCount += i;
 
- 			// Apply set filters to unmatched elements
 
- 			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
 
- 			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
 
- 			// no element matchers and no seed.
 
- 			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
 
- 			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
 
- 			// numerically zero.
 
- 			if ( bySet && i !== matchedCount ) {
 
- 				j = 0;
 
- 				while ( (matcher = setMatchers[j++]) ) {
 
- 					matcher( unmatched, setMatched, context, xml );
 
- 				}
 
- 				if ( seed ) {
 
- 					// Reintegrate element matches to eliminate the need for sorting
 
- 					if ( matchedCount > 0 ) {
 
- 						while ( i-- ) {
 
- 							if ( !(unmatched[i] || setMatched[i]) ) {
 
- 								setMatched[i] = pop.call( results );
 
- 							}
 
- 						}
 
- 					}
 
- 					// Discard index placeholder values to get only actual matches
 
- 					setMatched = condense( setMatched );
 
- 				}
 
- 				// Add matches to results
 
- 				push.apply( results, setMatched );
 
- 				// Seedless set matches succeeding multiple successful matchers stipulate sorting
 
- 				if ( outermost && !seed && setMatched.length > 0 &&
 
- 					( matchedCount + setMatchers.length ) > 1 ) {
 
- 					Sizzle.uniqueSort( results );
 
- 				}
 
- 			}
 
- 			// Override manipulation of globals by nested matchers
 
- 			if ( outermost ) {
 
- 				dirruns = dirrunsUnique;
 
- 				outermostContext = contextBackup;
 
- 			}
 
- 			return unmatched;
 
- 		};
 
- 	return bySet ?
 
- 		markFunction( superMatcher ) :
 
- 		superMatcher;
 
- }
 
- compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
 
- 	var i,
 
- 		setMatchers = [],
 
- 		elementMatchers = [],
 
- 		cached = compilerCache[ selector + " " ];
 
- 	if ( !cached ) {
 
- 		// Generate a function of recursive functions that can be used to check each element
 
- 		if ( !match ) {
 
- 			match = tokenize( selector );
 
- 		}
 
- 		i = match.length;
 
- 		while ( i-- ) {
 
- 			cached = matcherFromTokens( match[i] );
 
- 			if ( cached[ expando ] ) {
 
- 				setMatchers.push( cached );
 
- 			} else {
 
- 				elementMatchers.push( cached );
 
- 			}
 
- 		}
 
- 		// Cache the compiled function
 
- 		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
 
- 		// Save selector and tokenization
 
- 		cached.selector = selector;
 
- 	}
 
- 	return cached;
 
- };
 
- /**
 
-  * A low-level selection function that works with Sizzle's compiled
 
-  *  selector functions
 
-  * @param {String|Function} selector A selector or a pre-compiled
 
-  *  selector function built with Sizzle.compile
 
-  * @param {Element} context
 
-  * @param {Array} [results]
 
-  * @param {Array} [seed] A set of elements to match against
 
-  */
 
- select = Sizzle.select = function( selector, context, results, seed ) {
 
- 	var i, tokens, token, type, find,
 
- 		compiled = typeof selector === "function" && selector,
 
- 		match = !seed && tokenize( (selector = compiled.selector || selector) );
 
- 	results = results || [];
 
- 	// Try to minimize operations if there is only one selector in the list and no seed
 
- 	// (the latter of which guarantees us context)
 
- 	if ( match.length === 1 ) {
 
- 		// Reduce context if the leading compound selector is an ID
 
- 		tokens = match[0] = match[0].slice( 0 );
 
- 		if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
 
- 				context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
 
- 			context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
 
- 			if ( !context ) {
 
- 				return results;
 
- 			// Precompiled matchers will still verify ancestry, so step up a level
 
- 			} else if ( compiled ) {
 
- 				context = context.parentNode;
 
- 			}
 
- 			selector = selector.slice( tokens.shift().value.length );
 
- 		}
 
- 		// Fetch a seed set for right-to-left matching
 
- 		i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
 
- 		while ( i-- ) {
 
- 			token = tokens[i];
 
- 			// Abort if we hit a combinator
 
- 			if ( Expr.relative[ (type = token.type) ] ) {
 
- 				break;
 
- 			}
 
- 			if ( (find = Expr.find[ type ]) ) {
 
- 				// Search, expanding context for leading sibling combinators
 
- 				if ( (seed = find(
 
- 					token.matches[0].replace( runescape, funescape ),
 
- 					rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
 
- 				)) ) {
 
- 					// If seed is empty or no tokens remain, we can return early
 
- 					tokens.splice( i, 1 );
 
- 					selector = seed.length && toSelector( tokens );
 
- 					if ( !selector ) {
 
- 						push.apply( results, seed );
 
- 						return results;
 
- 					}
 
- 					break;
 
- 				}
 
- 			}
 
- 		}
 
- 	}
 
- 	// Compile and execute a filtering function if one is not provided
 
- 	// Provide `match` to avoid retokenization if we modified the selector above
 
- 	( compiled || compile( selector, match ) )(
 
- 		seed,
 
- 		context,
 
- 		!documentIsHTML,
 
- 		results,
 
- 		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
 
- 	);
 
- 	return results;
 
- };
 
- // One-time assignments
 
- // Sort stability
 
- support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
 
- // Support: Chrome 14-35+
 
- // Always assume duplicates if they aren't passed to the comparison function
 
- support.detectDuplicates = !!hasDuplicate;
 
- // Initialize against the default document
 
- setDocument();
 
- // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
 
- // Detached nodes confoundingly follow *each other*
 
- support.sortDetached = assert(function( el ) {
 
- 	// Should return 1, but returns 4 (following)
 
- 	return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
 
- });
 
- // Support: IE<8
 
- // Prevent attribute/property "interpolation"
 
- // https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
 
- if ( !assert(function( el ) {
 
- 	el.innerHTML = "<a href='#'></a>";
 
- 	return el.firstChild.getAttribute("href") === "#" ;
 
- }) ) {
 
- 	addHandle( "type|href|height|width", function( elem, name, isXML ) {
 
- 		if ( !isXML ) {
 
- 			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
 
- 		}
 
- 	});
 
- }
 
- // Support: IE<9
 
- // Use defaultValue in place of getAttribute("value")
 
- if ( !support.attributes || !assert(function( el ) {
 
- 	el.innerHTML = "<input/>";
 
- 	el.firstChild.setAttribute( "value", "" );
 
- 	return el.firstChild.getAttribute( "value" ) === "";
 
- }) ) {
 
- 	addHandle( "value", function( elem, name, isXML ) {
 
- 		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
 
- 			return elem.defaultValue;
 
- 		}
 
- 	});
 
- }
 
- // Support: IE<9
 
- // Use getAttributeNode to fetch booleans when getAttribute lies
 
- if ( !assert(function( el ) {
 
- 	return el.getAttribute("disabled") == null;
 
- }) ) {
 
- 	addHandle( booleans, function( elem, name, isXML ) {
 
- 		var val;
 
- 		if ( !isXML ) {
 
- 			return elem[ name ] === true ? name.toLowerCase() :
 
- 					(val = elem.getAttributeNode( name )) && val.specified ?
 
- 					val.value :
 
- 				null;
 
- 		}
 
- 	});
 
- }
 
- return Sizzle;
 
- })( window );
 
- jQuery.find = Sizzle;
 
- jQuery.expr = Sizzle.selectors;
 
- // Deprecated
 
- jQuery.expr[ ":" ] = jQuery.expr.pseudos;
 
- jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
 
- jQuery.text = Sizzle.getText;
 
- jQuery.isXMLDoc = Sizzle.isXML;
 
- jQuery.contains = Sizzle.contains;
 
- jQuery.escapeSelector = Sizzle.escape;
 
- var dir = function( elem, dir, until ) {
 
- 	var matched = [],
 
- 		truncate = until !== undefined;
 
- 	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
 
- 		if ( elem.nodeType === 1 ) {
 
- 			if ( truncate && jQuery( elem ).is( until ) ) {
 
- 				break;
 
- 			}
 
- 			matched.push( elem );
 
- 		}
 
- 	}
 
- 	return matched;
 
- };
 
- var siblings = function( n, elem ) {
 
- 	var matched = [];
 
- 	for ( ; n; n = n.nextSibling ) {
 
- 		if ( n.nodeType === 1 && n !== elem ) {
 
- 			matched.push( n );
 
- 		}
 
- 	}
 
- 	return matched;
 
- };
 
- var rneedsContext = jQuery.expr.match.needsContext;
 
- function nodeName( elem, name ) {
 
-   return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
 
- };
 
- var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
 
- // Implement the identical functionality for filter and not
 
- function winnow( elements, qualifier, not ) {
 
- 	if ( isFunction( qualifier ) ) {
 
- 		return jQuery.grep( elements, function( elem, i ) {
 
- 			return !!qualifier.call( elem, i, elem ) !== not;
 
- 		} );
 
- 	}
 
- 	// Single element
 
- 	if ( qualifier.nodeType ) {
 
- 		return jQuery.grep( elements, function( elem ) {
 
- 			return ( elem === qualifier ) !== not;
 
- 		} );
 
- 	}
 
- 	// Arraylike of elements (jQuery, arguments, Array)
 
- 	if ( typeof qualifier !== "string" ) {
 
- 		return jQuery.grep( elements, function( elem ) {
 
- 			return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
 
- 		} );
 
- 	}
 
- 	// Filtered directly for both simple and complex selectors
 
- 	return jQuery.filter( qualifier, elements, not );
 
- }
 
- jQuery.filter = function( expr, elems, not ) {
 
- 	var elem = elems[ 0 ];
 
- 	if ( not ) {
 
- 		expr = ":not(" + expr + ")";
 
- 	}
 
- 	if ( elems.length === 1 && elem.nodeType === 1 ) {
 
- 		return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
 
- 	}
 
- 	return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
 
- 		return elem.nodeType === 1;
 
- 	} ) );
 
- };
 
- jQuery.fn.extend( {
 
- 	find: function( selector ) {
 
- 		var i, ret,
 
- 			len = this.length,
 
- 			self = this;
 
- 		if ( typeof selector !== "string" ) {
 
- 			return this.pushStack( jQuery( selector ).filter( function() {
 
- 				for ( i = 0; i < len; i++ ) {
 
- 					if ( jQuery.contains( self[ i ], this ) ) {
 
- 						return true;
 
- 					}
 
- 				}
 
- 			} ) );
 
- 		}
 
- 		ret = this.pushStack( [] );
 
- 		for ( i = 0; i < len; i++ ) {
 
- 			jQuery.find( selector, self[ i ], ret );
 
- 		}
 
- 		return len > 1 ? jQuery.uniqueSort( ret ) : ret;
 
- 	},
 
- 	filter: function( selector ) {
 
- 		return this.pushStack( winnow( this, selector || [], false ) );
 
- 	},
 
- 	not: function( selector ) {
 
- 		return this.pushStack( winnow( this, selector || [], true ) );
 
- 	},
 
- 	is: function( selector ) {
 
- 		return !!winnow(
 
- 			this,
 
- 			// If this is a positional/relative selector, check membership in the returned set
 
- 			// so $("p:first").is("p:last") won't return true for a doc with two "p".
 
- 			typeof selector === "string" && rneedsContext.test( selector ) ?
 
- 				jQuery( selector ) :
 
- 				selector || [],
 
- 			false
 
- 		).length;
 
- 	}
 
- } );
 
- // Initialize a jQuery object
 
- // A central reference to the root jQuery(document)
 
- var rootjQuery,
 
- 	// A simple way to check for HTML strings
 
- 	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
 
- 	// Strict HTML recognition (#11290: must start with <)
 
- 	// Shortcut simple #id case for speed
 
- 	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
 
- 	init = jQuery.fn.init = function( selector, context, root ) {
 
- 		var match, elem;
 
- 		// HANDLE: $(""), $(null), $(undefined), $(false)
 
- 		if ( !selector ) {
 
- 			return this;
 
- 		}
 
- 		// Method init() accepts an alternate rootjQuery
 
- 		// so migrate can support jQuery.sub (gh-2101)
 
- 		root = root || rootjQuery;
 
- 		// Handle HTML strings
 
- 		if ( typeof selector === "string" ) {
 
- 			if ( selector[ 0 ] === "<" &&
 
- 				selector[ selector.length - 1 ] === ">" &&
 
- 				selector.length >= 3 ) {
 
- 				// Assume that strings that start and end with <> are HTML and skip the regex check
 
- 				match = [ null, selector, null ];
 
- 			} else {
 
- 				match = rquickExpr.exec( selector );
 
- 			}
 
- 			// Match html or make sure no context is specified for #id
 
- 			if ( match && ( match[ 1 ] || !context ) ) {
 
- 				// HANDLE: $(html) -> $(array)
 
- 				if ( match[ 1 ] ) {
 
- 					context = context instanceof jQuery ? context[ 0 ] : context;
 
- 					// Option to run scripts is true for back-compat
 
- 					// Intentionally let the error be thrown if parseHTML is not present
 
- 					jQuery.merge( this, jQuery.parseHTML(
 
- 						match[ 1 ],
 
- 						context && context.nodeType ? context.ownerDocument || context : document,
 
- 						true
 
- 					) );
 
- 					// HANDLE: $(html, props)
 
- 					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
 
- 						for ( match in context ) {
 
- 							// Properties of context are called as methods if possible
 
- 							if ( isFunction( this[ match ] ) ) {
 
- 								this[ match ]( context[ match ] );
 
- 							// ...and otherwise set as attributes
 
- 							} else {
 
- 								this.attr( match, context[ match ] );
 
- 							}
 
- 						}
 
- 					}
 
- 					return this;
 
- 				// HANDLE: $(#id)
 
- 				} else {
 
- 					elem = document.getElementById( match[ 2 ] );
 
- 					if ( elem ) {
 
- 						// Inject the element directly into the jQuery object
 
- 						this[ 0 ] = elem;
 
- 						this.length = 1;
 
- 					}
 
- 					return this;
 
- 				}
 
- 			// HANDLE: $(expr, $(...))
 
- 			} else if ( !context || context.jquery ) {
 
- 				return ( context || root ).find( selector );
 
- 			// HANDLE: $(expr, context)
 
- 			// (which is just equivalent to: $(context).find(expr)
 
- 			} else {
 
- 				return this.constructor( context ).find( selector );
 
- 			}
 
- 		// HANDLE: $(DOMElement)
 
- 		} else if ( selector.nodeType ) {
 
- 			this[ 0 ] = selector;
 
- 			this.length = 1;
 
- 			return this;
 
- 		// HANDLE: $(function)
 
- 		// Shortcut for document ready
 
- 		} else if ( isFunction( selector ) ) {
 
- 			return root.ready !== undefined ?
 
- 				root.ready( selector ) :
 
- 				// Execute immediately if ready is not present
 
- 				selector( jQuery );
 
- 		}
 
- 		return jQuery.makeArray( selector, this );
 
- 	};
 
- // Give the init function the jQuery prototype for later instantiation
 
- init.prototype = jQuery.fn;
 
- // Initialize central reference
 
- rootjQuery = jQuery( document );
 
- var rparentsprev = /^(?:parents|prev(?:Until|All))/,
 
- 	// Methods guaranteed to produce a unique set when starting from a unique set
 
- 	guaranteedUnique = {
 
- 		children: true,
 
- 		contents: true,
 
- 		next: true,
 
- 		prev: true
 
- 	};
 
- jQuery.fn.extend( {
 
- 	has: function( target ) {
 
- 		var targets = jQuery( target, this ),
 
- 			l = targets.length;
 
- 		return this.filter( function() {
 
- 			var i = 0;
 
- 			for ( ; i < l; i++ ) {
 
- 				if ( jQuery.contains( this, targets[ i ] ) ) {
 
- 					return true;
 
- 				}
 
- 			}
 
- 		} );
 
- 	},
 
- 	closest: function( selectors, context ) {
 
- 		var cur,
 
- 			i = 0,
 
- 			l = this.length,
 
- 			matched = [],
 
- 			targets = typeof selectors !== "string" && jQuery( selectors );
 
- 		// Positional selectors never match, since there's no _selection_ context
 
- 		if ( !rneedsContext.test( selectors ) ) {
 
- 			for ( ; i < l; i++ ) {
 
- 				for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
 
- 					// Always skip document fragments
 
- 					if ( cur.nodeType < 11 && ( targets ?
 
- 						targets.index( cur ) > -1 :
 
- 						// Don't pass non-elements to Sizzle
 
- 						cur.nodeType === 1 &&
 
- 							jQuery.find.matchesSelector( cur, selectors ) ) ) {
 
- 						matched.push( cur );
 
- 						break;
 
- 					}
 
- 				}
 
- 			}
 
- 		}
 
- 		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
 
- 	},
 
- 	// Determine the position of an element within the set
 
- 	index: function( elem ) {
 
- 		// No argument, return index in parent
 
- 		if ( !elem ) {
 
- 			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
 
- 		}
 
- 		// Index in selector
 
- 		if ( typeof elem === "string" ) {
 
- 			return indexOf.call( jQuery( elem ), this[ 0 ] );
 
- 		}
 
- 		// Locate the position of the desired element
 
- 		return indexOf.call( this,
 
- 			// If it receives a jQuery object, the first element is used
 
- 			elem.jquery ? elem[ 0 ] : elem
 
- 		);
 
- 	},
 
- 	add: function( selector, context ) {
 
- 		return this.pushStack(
 
- 			jQuery.uniqueSort(
 
- 				jQuery.merge( this.get(), jQuery( selector, context ) )
 
- 			)
 
- 		);
 
- 	},
 
- 	addBack: function( selector ) {
 
- 		return this.add( selector == null ?
 
- 			this.prevObject : this.prevObject.filter( selector )
 
- 		);
 
- 	}
 
- } );
 
- function sibling( cur, dir ) {
 
- 	while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
 
- 	return cur;
 
- }
 
- jQuery.each( {
 
- 	parent: function( elem ) {
 
- 		var parent = elem.parentNode;
 
- 		return parent && parent.nodeType !== 11 ? parent : null;
 
- 	},
 
- 	parents: function( elem ) {
 
- 		return dir( elem, "parentNode" );
 
- 	},
 
- 	parentsUntil: function( elem, i, until ) {
 
- 		return dir( elem, "parentNode", until );
 
- 	},
 
- 	next: function( elem ) {
 
- 		return sibling( elem, "nextSibling" );
 
- 	},
 
- 	prev: function( elem ) {
 
- 		return sibling( elem, "previousSibling" );
 
- 	},
 
- 	nextAll: function( elem ) {
 
- 		return dir( elem, "nextSibling" );
 
- 	},
 
- 	prevAll: function( elem ) {
 
- 		return dir( elem, "previousSibling" );
 
- 	},
 
- 	nextUntil: function( elem, i, until ) {
 
- 		return dir( elem, "nextSibling", until );
 
- 	},
 
- 	prevUntil: function( elem, i, until ) {
 
- 		return dir( elem, "previousSibling", until );
 
- 	},
 
- 	siblings: function( elem ) {
 
- 		return siblings( ( elem.parentNode || {} ).firstChild, elem );
 
- 	},
 
- 	children: function( elem ) {
 
- 		return siblings( elem.firstChild );
 
- 	},
 
- 	contents: function( elem ) {
 
- 		if ( typeof elem.contentDocument !== "undefined" ) {
 
- 			return elem.contentDocument;
 
- 		}
 
- 		// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
 
- 		// Treat the template element as a regular one in browsers that
 
- 		// don't support it.
 
- 		if ( nodeName( elem, "template" ) ) {
 
- 			elem = elem.content || elem;
 
- 		}
 
- 		return jQuery.merge( [], elem.childNodes );
 
- 	}
 
- }, function( name, fn ) {
 
- 	jQuery.fn[ name ] = function( until, selector ) {
 
- 		var matched = jQuery.map( this, fn, until );
 
- 		if ( name.slice( -5 ) !== "Until" ) {
 
- 			selector = until;
 
- 		}
 
- 		if ( selector && typeof selector === "string" ) {
 
- 			matched = jQuery.filter( selector, matched );
 
- 		}
 
- 		if ( this.length > 1 ) {
 
- 			// Remove duplicates
 
- 			if ( !guaranteedUnique[ name ] ) {
 
- 				jQuery.uniqueSort( matched );
 
- 			}
 
- 			// Reverse order for parents* and prev-derivatives
 
- 			if ( rparentsprev.test( name ) ) {
 
- 				matched.reverse();
 
- 			}
 
- 		}
 
- 		return this.pushStack( matched );
 
- 	};
 
- } );
 
- var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
 
- // Convert String-formatted options into Object-formatted ones
 
- function createOptions( options ) {
 
- 	var object = {};
 
- 	jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
 
- 		object[ flag ] = true;
 
- 	} );
 
- 	return object;
 
- }
 
- /*
 
-  * Create a callback list using the following parameters:
 
-  *
 
-  *	options: an optional list of space-separated options that will change how
 
-  *			the callback list behaves or a more traditional option object
 
-  *
 
-  * By default a callback list will act like an event callback list and can be
 
-  * "fired" multiple times.
 
-  *
 
-  * Possible options:
 
-  *
 
-  *	once:			will ensure the callback list can only be fired once (like a Deferred)
 
-  *
 
-  *	memory:			will keep track of previous values and will call any callback added
 
-  *					after the list has been fired right away with the latest "memorized"
 
-  *					values (like a Deferred)
 
-  *
 
-  *	unique:			will ensure a callback can only be added once (no duplicate in the list)
 
-  *
 
-  *	stopOnFalse:	interrupt callings when a callback returns false
 
-  *
 
-  */
 
- jQuery.Callbacks = function( options ) {
 
- 	// Convert options from String-formatted to Object-formatted if needed
 
- 	// (we check in cache first)
 
- 	options = typeof options === "string" ?
 
- 		createOptions( options ) :
 
- 		jQuery.extend( {}, options );
 
- 	var // Flag to know if list is currently firing
 
- 		firing,
 
- 		// Last fire value for non-forgettable lists
 
- 		memory,
 
- 		// Flag to know if list was already fired
 
- 		fired,
 
- 		// Flag to prevent firing
 
- 		locked,
 
- 		// Actual callback list
 
- 		list = [],
 
- 		// Queue of execution data for repeatable lists
 
- 		queue = [],
 
- 		// Index of currently firing callback (modified by add/remove as needed)
 
- 		firingIndex = -1,
 
- 		// Fire callbacks
 
- 		fire = function() {
 
- 			// Enforce single-firing
 
- 			locked = locked || options.once;
 
- 			// Execute callbacks for all pending executions,
 
- 			// respecting firingIndex overrides and runtime changes
 
- 			fired = firing = true;
 
- 			for ( ; queue.length; firingIndex = -1 ) {
 
- 				memory = queue.shift();
 
- 				while ( ++firingIndex < list.length ) {
 
- 					// Run callback and check for early termination
 
- 					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
 
- 						options.stopOnFalse ) {
 
- 						// Jump to end and forget the data so .add doesn't re-fire
 
- 						firingIndex = list.length;
 
- 						memory = false;
 
- 					}
 
- 				}
 
- 			}
 
- 			// Forget the data if we're done with it
 
- 			if ( !options.memory ) {
 
- 				memory = false;
 
- 			}
 
- 			firing = false;
 
- 			// Clean up if we're done firing for good
 
- 			if ( locked ) {
 
- 				// Keep an empty list if we have data for future add calls
 
- 				if ( memory ) {
 
- 					list = [];
 
- 				// Otherwise, this object is spent
 
- 				} else {
 
- 					list = "";
 
- 				}
 
- 			}
 
- 		},
 
- 		// Actual Callbacks object
 
- 		self = {
 
- 			// Add a callback or a collection of callbacks to the list
 
- 			add: function() {
 
- 				if ( list ) {
 
- 					// If we have memory from a past run, we should fire after adding
 
- 					if ( memory && !firing ) {
 
- 						firingIndex = list.length - 1;
 
- 						queue.push( memory );
 
- 					}
 
- 					( function add( args ) {
 
- 						jQuery.each( args, function( _, arg ) {
 
- 							if ( isFunction( arg ) ) {
 
- 								if ( !options.unique || !self.has( arg ) ) {
 
- 									list.push( arg );
 
- 								}
 
- 							} else if ( arg && arg.length && toType( arg ) !== "string" ) {
 
- 								// Inspect recursively
 
- 								add( arg );
 
- 							}
 
- 						} );
 
- 					} )( arguments );
 
- 					if ( memory && !firing ) {
 
- 						fire();
 
- 					}
 
- 				}
 
- 				return this;
 
- 			},
 
- 			// Remove a callback from the list
 
- 			remove: function() {
 
- 				jQuery.each( arguments, function( _, arg ) {
 
- 					var index;
 
- 					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
 
- 						list.splice( index, 1 );
 
- 						// Handle firing indexes
 
- 						if ( index <= firingIndex ) {
 
- 							firingIndex--;
 
- 						}
 
- 					}
 
- 				} );
 
- 				return this;
 
- 			},
 
- 			// Check if a given callback is in the list.
 
- 			// If no argument is given, return whether or not list has callbacks attached.
 
- 			has: function( fn ) {
 
- 				return fn ?
 
- 					jQuery.inArray( fn, list ) > -1 :
 
- 					list.length > 0;
 
- 			},
 
- 			// Remove all callbacks from the list
 
- 			empty: function() {
 
- 				if ( list ) {
 
- 					list = [];
 
- 				}
 
- 				return this;
 
- 			},
 
- 			// Disable .fire and .add
 
- 			// Abort any current/pending executions
 
- 			// Clear all callbacks and values
 
- 			disable: function() {
 
- 				locked = queue = [];
 
- 				list = memory = "";
 
- 				return this;
 
- 			},
 
- 			disabled: function() {
 
- 				return !list;
 
- 			},
 
- 			// Disable .fire
 
- 			// Also disable .add unless we have memory (since it would have no effect)
 
- 			// Abort any pending executions
 
- 			lock: function() {
 
- 				locked = queue = [];
 
- 				if ( !memory && !firing ) {
 
- 					list = memory = "";
 
- 				}
 
- 				return this;
 
- 			},
 
- 			locked: function() {
 
- 				return !!locked;
 
- 			},
 
- 			// Call all callbacks with the given context and arguments
 
- 			fireWith: function( context, args ) {
 
- 				if ( !locked ) {
 
- 					args = args || [];
 
- 					args = [ context, args.slice ? args.slice() : args ];
 
- 					queue.push( args );
 
- 					if ( !firing ) {
 
- 						fire();
 
- 					}
 
- 				}
 
- 				return this;
 
- 			},
 
- 			// Call all the callbacks with the given arguments
 
- 			fire: function() {
 
- 				self.fireWith( this, arguments );
 
- 				return this;
 
- 			},
 
- 			// To know if the callbacks have already been called at least once
 
- 			fired: function() {
 
- 				return !!fired;
 
- 			}
 
- 		};
 
- 	return self;
 
- };
 
- function Identity( v ) {
 
- 	return v;
 
- }
 
- function Thrower( ex ) {
 
- 	throw ex;
 
- }
 
- function adoptValue( value, resolve, reject, noValue ) {
 
- 	var method;
 
- 	try {
 
- 		// Check for promise aspect first to privilege synchronous behavior
 
- 		if ( value && isFunction( ( method = value.promise ) ) ) {
 
- 			method.call( value ).done( resolve ).fail( reject );
 
- 		// Other thenables
 
- 		} else if ( value && isFunction( ( method = value.then ) ) ) {
 
- 			method.call( value, resolve, reject );
 
- 		// Other non-thenables
 
- 		} else {
 
- 			// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
 
- 			// * false: [ value ].slice( 0 ) => resolve( value )
 
- 			// * true: [ value ].slice( 1 ) => resolve()
 
- 			resolve.apply( undefined, [ value ].slice( noValue ) );
 
- 		}
 
- 	// For Promises/A+, convert exceptions into rejections
 
- 	// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
 
- 	// Deferred#then to conditionally suppress rejection.
 
- 	} catch ( value ) {
 
- 		// Support: Android 4.0 only
 
- 		// Strict mode functions invoked without .call/.apply get global-object context
 
- 		reject.apply( undefined, [ value ] );
 
- 	}
 
- }
 
- jQuery.extend( {
 
- 	Deferred: function( func ) {
 
- 		var tuples = [
 
- 				// action, add listener, callbacks,
 
- 				// ... .then handlers, argument index, [final state]
 
- 				[ "notify", "progress", jQuery.Callbacks( "memory" ),
 
- 					jQuery.Callbacks( "memory" ), 2 ],
 
- 				[ "resolve", "done", jQuery.Callbacks( "once memory" ),
 
- 					jQuery.Callbacks( "once memory" ), 0, "resolved" ],
 
- 				[ "reject", "fail", jQuery.Callbacks( "once memory" ),
 
- 					jQuery.Callbacks( "once memory" ), 1, "rejected" ]
 
- 			],
 
- 			state = "pending",
 
- 			promise = {
 
- 				state: function() {
 
- 					return state;
 
- 				},
 
- 				always: function() {
 
- 					deferred.done( arguments ).fail( arguments );
 
- 					return this;
 
- 				},
 
- 				"catch": function( fn ) {
 
- 					return promise.then( null, fn );
 
- 				},
 
- 				// Keep pipe for back-compat
 
- 				pipe: function( /* fnDone, fnFail, fnProgress */ ) {
 
- 					var fns = arguments;
 
- 					return jQuery.Deferred( function( newDefer ) {
 
- 						jQuery.each( tuples, function( i, tuple ) {
 
- 							// Map tuples (progress, done, fail) to arguments (done, fail, progress)
 
- 							var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
 
- 							// deferred.progress(function() { bind to newDefer or newDefer.notify })
 
- 							// deferred.done(function() { bind to newDefer or newDefer.resolve })
 
- 							// deferred.fail(function() { bind to newDefer or newDefer.reject })
 
- 							deferred[ tuple[ 1 ] ]( function() {
 
- 								var returned = fn && fn.apply( this, arguments );
 
- 								if ( returned && isFunction( returned.promise ) ) {
 
- 									returned.promise()
 
- 										.progress( newDefer.notify )
 
- 										.done( newDefer.resolve )
 
- 										.fail( newDefer.reject );
 
- 								} else {
 
- 									newDefer[ tuple[ 0 ] + "With" ](
 
- 										this,
 
- 										fn ? [ returned ] : arguments
 
- 									);
 
- 								}
 
- 							} );
 
- 						} );
 
- 						fns = null;
 
- 					} ).promise();
 
- 				},
 
- 				then: function( onFulfilled, onRejected, onProgress ) {
 
- 					var maxDepth = 0;
 
- 					function resolve( depth, deferred, handler, special ) {
 
- 						return function() {
 
- 							var that = this,
 
- 								args = arguments,
 
- 								mightThrow = function() {
 
- 									var returned, then;
 
- 									// Support: Promises/A+ section 2.3.3.3.3
 
- 									// https://promisesaplus.com/#point-59
 
- 									// Ignore double-resolution attempts
 
- 									if ( depth < maxDepth ) {
 
- 										return;
 
- 									}
 
- 									returned = handler.apply( that, args );
 
- 									// Support: Promises/A+ section 2.3.1
 
- 									// https://promisesaplus.com/#point-48
 
- 									if ( returned === deferred.promise() ) {
 
- 										throw new TypeError( "Thenable self-resolution" );
 
- 									}
 
- 									// Support: Promises/A+ sections 2.3.3.1, 3.5
 
- 									// https://promisesaplus.com/#point-54
 
- 									// https://promisesaplus.com/#point-75
 
- 									// Retrieve `then` only once
 
- 									then = returned &&
 
- 										// Support: Promises/A+ section 2.3.4
 
- 										// https://promisesaplus.com/#point-64
 
- 										// Only check objects and functions for thenability
 
- 										( typeof returned === "object" ||
 
- 											typeof returned === "function" ) &&
 
- 										returned.then;
 
- 									// Handle a returned thenable
 
- 									if ( isFunction( then ) ) {
 
- 										// Special processors (notify) just wait for resolution
 
- 										if ( special ) {
 
- 											then.call(
 
- 												returned,
 
- 												resolve( maxDepth, deferred, Identity, special ),
 
- 												resolve( maxDepth, deferred, Thrower, special )
 
- 											);
 
- 										// Normal processors (resolve) also hook into progress
 
- 										} else {
 
- 											// ...and disregard older resolution values
 
- 											maxDepth++;
 
- 											then.call(
 
- 												returned,
 
- 												resolve( maxDepth, deferred, Identity, special ),
 
- 												resolve( maxDepth, deferred, Thrower, special ),
 
- 												resolve( maxDepth, deferred, Identity,
 
- 													deferred.notifyWith )
 
- 											);
 
- 										}
 
- 									// Handle all other returned values
 
- 									} else {
 
- 										// Only substitute handlers pass on context
 
- 										// and multiple values (non-spec behavior)
 
- 										if ( handler !== Identity ) {
 
- 											that = undefined;
 
- 											args = [ returned ];
 
- 										}
 
- 										// Process the value(s)
 
- 										// Default process is resolve
 
- 										( special || deferred.resolveWith )( that, args );
 
- 									}
 
- 								},
 
- 								// Only normal processors (resolve) catch and reject exceptions
 
- 								process = special ?
 
- 									mightThrow :
 
- 									function() {
 
- 										try {
 
- 											mightThrow();
 
- 										} catch ( e ) {
 
- 											if ( jQuery.Deferred.exceptionHook ) {
 
- 												jQuery.Deferred.exceptionHook( e,
 
- 													process.stackTrace );
 
- 											}
 
- 											// Support: Promises/A+ section 2.3.3.3.4.1
 
- 											// https://promisesaplus.com/#point-61
 
- 											// Ignore post-resolution exceptions
 
- 											if ( depth + 1 >= maxDepth ) {
 
- 												// Only substitute handlers pass on context
 
- 												// and multiple values (non-spec behavior)
 
- 												if ( handler !== Thrower ) {
 
- 													that = undefined;
 
- 													args = [ e ];
 
- 												}
 
- 												deferred.rejectWith( that, args );
 
- 											}
 
- 										}
 
- 									};
 
- 							// Support: Promises/A+ section 2.3.3.3.1
 
- 							// https://promisesaplus.com/#point-57
 
- 							// Re-resolve promises immediately to dodge false rejection from
 
- 							// subsequent errors
 
- 							if ( depth ) {
 
- 								process();
 
- 							} else {
 
- 								// Call an optional hook to record the stack, in case of exception
 
- 								// since it's otherwise lost when execution goes async
 
- 								if ( jQuery.Deferred.getStackHook ) {
 
- 									process.stackTrace = jQuery.Deferred.getStackHook();
 
- 								}
 
- 								window.setTimeout( process );
 
- 							}
 
- 						};
 
- 					}
 
- 					return jQuery.Deferred( function( newDefer ) {
 
- 						// progress_handlers.add( ... )
 
- 						tuples[ 0 ][ 3 ].add(
 
- 							resolve(
 
- 								0,
 
- 								newDefer,
 
- 								isFunction( onProgress ) ?
 
- 									onProgress :
 
- 									Identity,
 
- 								newDefer.notifyWith
 
- 							)
 
- 						);
 
- 						// fulfilled_handlers.add( ... )
 
- 						tuples[ 1 ][ 3 ].add(
 
- 							resolve(
 
- 								0,
 
- 								newDefer,
 
- 								isFunction( onFulfilled ) ?
 
- 									onFulfilled :
 
- 									Identity
 
- 							)
 
- 						);
 
- 						// rejected_handlers.add( ... )
 
- 						tuples[ 2 ][ 3 ].add(
 
- 							resolve(
 
- 								0,
 
- 								newDefer,
 
- 								isFunction( onRejected ) ?
 
- 									onRejected :
 
- 									Thrower
 
- 							)
 
- 						);
 
- 					} ).promise();
 
- 				},
 
- 				// Get a promise for this deferred
 
- 				// If obj is provided, the promise aspect is added to the object
 
- 				promise: function( obj ) {
 
- 					return obj != null ? jQuery.extend( obj, promise ) : promise;
 
- 				}
 
- 			},
 
- 			deferred = {};
 
- 		// Add list-specific methods
 
- 		jQuery.each( tuples, function( i, tuple ) {
 
- 			var list = tuple[ 2 ],
 
- 				stateString = tuple[ 5 ];
 
- 			// promise.progress = list.add
 
- 			// promise.done = list.add
 
- 			// promise.fail = list.add
 
- 			promise[ tuple[ 1 ] ] = list.add;
 
- 			// Handle state
 
- 			if ( stateString ) {
 
- 				list.add(
 
- 					function() {
 
- 						// state = "resolved" (i.e., fulfilled)
 
- 						// state = "rejected"
 
- 						state = stateString;
 
- 					},
 
- 					// rejected_callbacks.disable
 
- 					// fulfilled_callbacks.disable
 
- 					tuples[ 3 - i ][ 2 ].disable,
 
- 					// rejected_handlers.disable
 
- 					// fulfilled_handlers.disable
 
- 					tuples[ 3 - i ][ 3 ].disable,
 
- 					// progress_callbacks.lock
 
- 					tuples[ 0 ][ 2 ].lock,
 
- 					// progress_handlers.lock
 
- 					tuples[ 0 ][ 3 ].lock
 
- 				);
 
- 			}
 
- 			// progress_handlers.fire
 
- 			// fulfilled_handlers.fire
 
- 			// rejected_handlers.fire
 
- 			list.add( tuple[ 3 ].fire );
 
- 			// deferred.notify = function() { deferred.notifyWith(...) }
 
- 			// deferred.resolve = function() { deferred.resolveWith(...) }
 
- 			// deferred.reject = function() { deferred.rejectWith(...) }
 
- 			deferred[ tuple[ 0 ] ] = function() {
 
- 				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
 
- 				return this;
 
- 			};
 
- 			// deferred.notifyWith = list.fireWith
 
- 			// deferred.resolveWith = list.fireWith
 
- 			// deferred.rejectWith = list.fireWith
 
- 			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
 
- 		} );
 
- 		// Make the deferred a promise
 
- 		promise.promise( deferred );
 
- 		// Call given func if any
 
- 		if ( func ) {
 
- 			func.call( deferred, deferred );
 
- 		}
 
- 		// All done!
 
- 		return deferred;
 
- 	},
 
- 	// Deferred helper
 
- 	when: function( singleValue ) {
 
- 		var
 
- 			// count of uncompleted subordinates
 
- 			remaining = arguments.length,
 
- 			// count of unprocessed arguments
 
- 			i = remaining,
 
- 			// subordinate fulfillment data
 
- 			resolveContexts = Array( i ),
 
- 			resolveValues = slice.call( arguments ),
 
- 			// the master Deferred
 
- 			master = jQuery.Deferred(),
 
- 			// subordinate callback factory
 
- 			updateFunc = function( i ) {
 
- 				return function( value ) {
 
- 					resolveContexts[ i ] = this;
 
- 					resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
 
- 					if ( !( --remaining ) ) {
 
- 						master.resolveWith( resolveContexts, resolveValues );
 
- 					}
 
- 				};
 
- 			};
 
- 		// Single- and empty arguments are adopted like Promise.resolve
 
- 		if ( remaining <= 1 ) {
 
- 			adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
 
- 				!remaining );
 
- 			// Use .then() to unwrap secondary thenables (cf. gh-3000)
 
- 			if ( master.state() === "pending" ||
 
- 				isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
 
- 				return master.then();
 
- 			}
 
- 		}
 
- 		// Multiple arguments are aggregated like Promise.all array elements
 
- 		while ( i-- ) {
 
- 			adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
 
- 		}
 
- 		return master.promise();
 
- 	}
 
- } );
 
- // These usually indicate a programmer mistake during development,
 
- // warn about them ASAP rather than swallowing them by default.
 
- var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
 
- jQuery.Deferred.exceptionHook = function( error, stack ) {
 
- 	// Support: IE 8 - 9 only
 
- 	// Console exists when dev tools are open, which can happen at any time
 
- 	if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
 
- 		window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
 
- 	}
 
- };
 
- jQuery.readyException = function( error ) {
 
- 	window.setTimeout( function() {
 
- 		throw error;
 
- 	} );
 
- };
 
- // The deferred used on DOM ready
 
- var readyList = jQuery.Deferred();
 
- jQuery.fn.ready = function( fn ) {
 
- 	readyList
 
- 		.then( fn )
 
- 		// Wrap jQuery.readyException in a function so that the lookup
 
- 		// happens at the time of error handling instead of callback
 
- 		// registration.
 
- 		.catch( function( error ) {
 
- 			jQuery.readyException( error );
 
- 		} );
 
- 	return this;
 
- };
 
- jQuery.extend( {
 
- 	// Is the DOM ready to be used? Set to true once it occurs.
 
- 	isReady: false,
 
- 	// A counter to track how many items to wait for before
 
- 	// the ready event fires. See #6781
 
- 	readyWait: 1,
 
- 	// Handle when the DOM is ready
 
- 	ready: function( wait ) {
 
- 		// Abort if there are pending holds or we're already ready
 
- 		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
 
- 			return;
 
- 		}
 
- 		// Remember that the DOM is ready
 
- 		jQuery.isReady = true;
 
- 		// If a normal DOM Ready event fired, decrement, and wait if need be
 
- 		if ( wait !== true && --jQuery.readyWait > 0 ) {
 
- 			return;
 
- 		}
 
- 		// If there are functions bound, to execute
 
- 		readyList.resolveWith( document, [ jQuery ] );
 
- 	}
 
- } );
 
- jQuery.ready.then = readyList.then;
 
- // The ready event handler and self cleanup method
 
- function completed() {
 
- 	document.removeEventListener( "DOMContentLoaded", completed );
 
- 	window.removeEventListener( "load", completed );
 
- 	jQuery.ready();
 
- }
 
- // Catch cases where $(document).ready() is called
 
- // after the browser event has already occurred.
 
- // Support: IE <=9 - 10 only
 
- // Older IE sometimes signals "interactive" too soon
 
- if ( document.readyState === "complete" ||
 
- 	( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
 
- 	// Handle it asynchronously to allow scripts the opportunity to delay ready
 
- 	window.setTimeout( jQuery.ready );
 
- } else {
 
- 	// Use the handy event callback
 
- 	document.addEventListener( "DOMContentLoaded", completed );
 
- 	// A fallback to window.onload, that will always work
 
- 	window.addEventListener( "load", completed );
 
- }
 
- // Multifunctional method to get and set values of a collection
 
- // The value/s can optionally be executed if it's a function
 
- var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
 
- 	var i = 0,
 
- 		len = elems.length,
 
- 		bulk = key == null;
 
- 	// Sets many values
 
- 	if ( toType( key ) === "object" ) {
 
- 		chainable = true;
 
- 		for ( i in key ) {
 
- 			access( elems, fn, i, key[ i ], true, emptyGet, raw );
 
- 		}
 
- 	// Sets one value
 
- 	} else if ( value !== undefined ) {
 
- 		chainable = true;
 
- 		if ( !isFunction( value ) ) {
 
- 			raw = true;
 
- 		}
 
- 		if ( bulk ) {
 
- 			// Bulk operations run against the entire set
 
- 			if ( raw ) {
 
- 				fn.call( elems, value );
 
- 				fn = null;
 
- 			// ...except when executing function values
 
- 			} else {
 
- 				bulk = fn;
 
- 				fn = function( elem, key, value ) {
 
- 					return bulk.call( jQuery( elem ), value );
 
- 				};
 
- 			}
 
- 		}
 
- 		if ( fn ) {
 
- 			for ( ; i < len; i++ ) {
 
- 				fn(
 
- 					elems[ i ], key, raw ?
 
- 					value :
 
- 					value.call( elems[ i ], i, fn( elems[ i ], key ) )
 
- 				);
 
- 			}
 
- 		}
 
- 	}
 
- 	if ( chainable ) {
 
- 		return elems;
 
- 	}
 
- 	// Gets
 
- 	if ( bulk ) {
 
- 		return fn.call( elems );
 
- 	}
 
- 	return len ? fn( elems[ 0 ], key ) : emptyGet;
 
- };
 
- // Matches dashed string for camelizing
 
- var rmsPrefix = /^-ms-/,
 
- 	rdashAlpha = /-([a-z])/g;
 
- // Used by camelCase as callback to replace()
 
- function fcamelCase( all, letter ) {
 
- 	return letter.toUpperCase();
 
- }
 
- // Convert dashed to camelCase; used by the css and data modules
 
- // Support: IE <=9 - 11, Edge 12 - 15
 
- // Microsoft forgot to hump their vendor prefix (#9572)
 
- function camelCase( string ) {
 
- 	return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
 
- }
 
- var acceptData = function( owner ) {
 
- 	// Accepts only:
 
- 	//  - Node
 
- 	//    - Node.ELEMENT_NODE
 
- 	//    - Node.DOCUMENT_NODE
 
- 	//  - Object
 
- 	//    - Any
 
- 	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
 
- };
 
- function Data() {
 
- 	this.expando = jQuery.expando + Data.uid++;
 
- }
 
- Data.uid = 1;
 
- Data.prototype = {
 
- 	cache: function( owner ) {
 
- 		// Check if the owner object already has a cache
 
- 		var value = owner[ this.expando ];
 
- 		// If not, create one
 
- 		if ( !value ) {
 
- 			value = {};
 
- 			// We can accept data for non-element nodes in modern browsers,
 
- 			// but we should not, see #8335.
 
- 			// Always return an empty object.
 
- 			if ( acceptData( owner ) ) {
 
- 				// If it is a node unlikely to be stringify-ed or looped over
 
- 				// use plain assignment
 
- 				if ( owner.nodeType ) {
 
- 					owner[ this.expando ] = value;
 
- 				// Otherwise secure it in a non-enumerable property
 
- 				// configurable must be true to allow the property to be
 
- 				// deleted when data is removed
 
- 				} else {
 
- 					Object.defineProperty( owner, this.expando, {
 
- 						value: value,
 
- 						configurable: true
 
- 					} );
 
- 				}
 
- 			}
 
- 		}
 
- 		return value;
 
- 	},
 
- 	set: function( owner, data, value ) {
 
- 		var prop,
 
- 			cache = this.cache( owner );
 
- 		// Handle: [ owner, key, value ] args
 
- 		// Always use camelCase key (gh-2257)
 
- 		if ( typeof data === "string" ) {
 
- 			cache[ camelCase( data ) ] = value;
 
- 		// Handle: [ owner, { properties } ] args
 
- 		} else {
 
- 			// Copy the properties one-by-one to the cache object
 
- 			for ( prop in data ) {
 
- 				cache[ camelCase( prop ) ] = data[ prop ];
 
- 			}
 
- 		}
 
- 		return cache;
 
- 	},
 
- 	get: function( owner, key ) {
 
- 		return key === undefined ?
 
- 			this.cache( owner ) :
 
- 			// Always use camelCase key (gh-2257)
 
- 			owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
 
- 	},
 
- 	access: function( owner, key, value ) {
 
- 		// In cases where either:
 
- 		//
 
- 		//   1. No key was specified
 
- 		//   2. A string key was specified, but no value provided
 
- 		//
 
- 		// Take the "read" path and allow the get method to determine
 
- 		// which value to return, respectively either:
 
- 		//
 
- 		//   1. The entire cache object
 
- 		//   2. The data stored at the key
 
- 		//
 
- 		if ( key === undefined ||
 
- 				( ( key && typeof key === "string" ) && value === undefined ) ) {
 
- 			return this.get( owner, key );
 
- 		}
 
- 		// When the key is not a string, or both a key and value
 
- 		// are specified, set or extend (existing objects) with either:
 
- 		//
 
- 		//   1. An object of properties
 
- 		//   2. A key and value
 
- 		//
 
- 		this.set( owner, key, value );
 
- 		// Since the "set" path can have two possible entry points
 
- 		// return the expected data based on which path was taken[*]
 
- 		return value !== undefined ? value : key;
 
- 	},
 
- 	remove: function( owner, key ) {
 
- 		var i,
 
- 			cache = owner[ this.expando ];
 
- 		if ( cache === undefined ) {
 
- 			return;
 
- 		}
 
- 		if ( key !== undefined ) {
 
- 			// Support array or space separated string of keys
 
- 			if ( Array.isArray( key ) ) {
 
- 				// If key is an array of keys...
 
- 				// We always set camelCase keys, so remove that.
 
- 				key = key.map( camelCase );
 
- 			} else {
 
- 				key = camelCase( key );
 
- 				// If a key with the spaces exists, use it.
 
- 				// Otherwise, create an array by matching non-whitespace
 
- 				key = key in cache ?
 
- 					[ key ] :
 
- 					( key.match( rnothtmlwhite ) || [] );
 
- 			}
 
- 			i = key.length;
 
- 			while ( i-- ) {
 
- 				delete cache[ key[ i ] ];
 
- 			}
 
- 		}
 
- 		// Remove the expando if there's no more data
 
- 		if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
 
- 			// Support: Chrome <=35 - 45
 
- 			// Webkit & Blink performance suffers when deleting properties
 
- 			// from DOM nodes, so set to undefined instead
 
- 			// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
 
- 			if ( owner.nodeType ) {
 
- 				owner[ this.expando ] = undefined;
 
- 			} else {
 
- 				delete owner[ this.expando ];
 
- 			}
 
- 		}
 
- 	},
 
- 	hasData: function( owner ) {
 
- 		var cache = owner[ this.expando ];
 
- 		return cache !== undefined && !jQuery.isEmptyObject( cache );
 
- 	}
 
- };
 
- var dataPriv = new Data();
 
- var dataUser = new Data();
 
- //	Implementation Summary
 
- //
 
- //	1. Enforce API surface and semantic compatibility with 1.9.x branch
 
- //	2. Improve the module's maintainability by reducing the storage
 
- //		paths to a single mechanism.
 
- //	3. Use the same single mechanism to support "private" and "user" data.
 
- //	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
 
- //	5. Avoid exposing implementation details on user objects (eg. expando properties)
 
- //	6. Provide a clear path for implementation upgrade to WeakMap in 2014
 
- var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
 
- 	rmultiDash = /[A-Z]/g;
 
- function getData( data ) {
 
- 	if ( data === "true" ) {
 
- 		return true;
 
- 	}
 
- 	if ( data === "false" ) {
 
- 		return false;
 
- 	}
 
- 	if ( data === "null" ) {
 
- 		return null;
 
- 	}
 
- 	// Only convert to a number if it doesn't change the string
 
- 	if ( data === +data + "" ) {
 
- 		return +data;
 
- 	}
 
- 	if ( rbrace.test( data ) ) {
 
- 		return JSON.parse( data );
 
- 	}
 
- 	return data;
 
- }
 
- function dataAttr( elem, key, data ) {
 
- 	var name;
 
- 	// If nothing was found internally, try to fetch any
 
- 	// data from the HTML5 data-* attribute
 
- 	if ( data === undefined && elem.nodeType === 1 ) {
 
- 		name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
 
- 		data = elem.getAttribute( name );
 
- 		if ( typeof data === "string" ) {
 
- 			try {
 
- 				data = getData( data );
 
- 			} catch ( e ) {}
 
- 			// Make sure we set the data so it isn't changed later
 
- 			dataUser.set( elem, key, data );
 
- 		} else {
 
- 			data = undefined;
 
- 		}
 
- 	}
 
- 	return data;
 
- }
 
- jQuery.extend( {
 
- 	hasData: function( elem ) {
 
- 		return dataUser.hasData( elem ) || dataPriv.hasData( elem );
 
- 	},
 
- 	data: function( elem, name, data ) {
 
- 		return dataUser.access( elem, name, data );
 
- 	},
 
- 	removeData: function( elem, name ) {
 
- 		dataUser.remove( elem, name );
 
- 	},
 
- 	// TODO: Now that all calls to _data and _removeData have been replaced
 
- 	// with direct calls to dataPriv methods, these can be deprecated.
 
- 	_data: function( elem, name, data ) {
 
- 		return dataPriv.access( elem, name, data );
 
- 	},
 
- 	_removeData: function( elem, name ) {
 
- 		dataPriv.remove( elem, name );
 
- 	}
 
- } );
 
- jQuery.fn.extend( {
 
- 	data: function( key, value ) {
 
- 		var i, name, data,
 
- 			elem = this[ 0 ],
 
- 			attrs = elem && elem.attributes;
 
- 		// Gets all values
 
- 		if ( key === undefined ) {
 
- 			if ( this.length ) {
 
- 				data = dataUser.get( elem );
 
- 				if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
 
- 					i = attrs.length;
 
- 					while ( i-- ) {
 
- 						// Support: IE 11 only
 
- 						// The attrs elements can be null (#14894)
 
- 						if ( attrs[ i ] ) {
 
- 							name = attrs[ i ].name;
 
- 							if ( name.indexOf( "data-" ) === 0 ) {
 
- 								name = camelCase( name.slice( 5 ) );
 
- 								dataAttr( elem, name, data[ name ] );
 
- 							}
 
- 						}
 
- 					}
 
- 					dataPriv.set( elem, "hasDataAttrs", true );
 
- 				}
 
- 			}
 
- 			return data;
 
- 		}
 
- 		// Sets multiple values
 
- 		if ( typeof key === "object" ) {
 
- 			return this.each( function() {
 
- 				dataUser.set( this, key );
 
- 			} );
 
- 		}
 
- 		return access( this, function( value ) {
 
- 			var data;
 
- 			// The calling jQuery object (element matches) is not empty
 
- 			// (and therefore has an element appears at this[ 0 ]) and the
 
- 			// `value` parameter was not undefined. An empty jQuery object
 
- 			// will result in `undefined` for elem = this[ 0 ] which will
 
- 			// throw an exception if an attempt to read a data cache is made.
 
- 			if ( elem && value === undefined ) {
 
- 				// Attempt to get data from the cache
 
- 				// The key will always be camelCased in Data
 
- 				data = dataUser.get( elem, key );
 
- 				if ( data !== undefined ) {
 
- 					return data;
 
- 				}
 
- 				// Attempt to "discover" the data in
 
- 				// HTML5 custom data-* attrs
 
- 				data = dataAttr( elem, key );
 
- 				if ( data !== undefined ) {
 
- 					return data;
 
- 				}
 
- 				// We tried really hard, but the data doesn't exist.
 
- 				return;
 
- 			}
 
- 			// Set the data...
 
- 			this.each( function() {
 
- 				// We always store the camelCased key
 
- 				dataUser.set( this, key, value );
 
- 			} );
 
- 		}, null, value, arguments.length > 1, null, true );
 
- 	},
 
- 	removeData: function( key ) {
 
- 		return this.each( function() {
 
- 			dataUser.remove( this, key );
 
- 		} );
 
- 	}
 
- } );
 
- jQuery.extend( {
 
- 	queue: function( elem, type, data ) {
 
- 		var queue;
 
- 		if ( elem ) {
 
- 			type = ( type || "fx" ) + "queue";
 
- 			queue = dataPriv.get( elem, type );
 
- 			// Speed up dequeue by getting out quickly if this is just a lookup
 
- 			if ( data ) {
 
- 				if ( !queue || Array.isArray( data ) ) {
 
- 					queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
 
- 				} else {
 
- 					queue.push( data );
 
- 				}
 
- 			}
 
- 			return queue || [];
 
- 		}
 
- 	},
 
- 	dequeue: function( elem, type ) {
 
- 		type = type || "fx";
 
- 		var queue = jQuery.queue( elem, type ),
 
- 			startLength = queue.length,
 
- 			fn = queue.shift(),
 
- 			hooks = jQuery._queueHooks( elem, type ),
 
- 			next = function() {
 
- 				jQuery.dequeue( elem, type );
 
- 			};
 
- 		// If the fx queue is dequeued, always remove the progress sentinel
 
- 		if ( fn === "inprogress" ) {
 
- 			fn = queue.shift();
 
- 			startLength--;
 
- 		}
 
- 		if ( fn ) {
 
- 			// Add a progress sentinel to prevent the fx queue from being
 
- 			// automatically dequeued
 
- 			if ( type === "fx" ) {
 
- 				queue.unshift( "inprogress" );
 
- 			}
 
- 			// Clear up the last queue stop function
 
- 			delete hooks.stop;
 
- 			fn.call( elem, next, hooks );
 
- 		}
 
- 		if ( !startLength && hooks ) {
 
- 			hooks.empty.fire();
 
- 		}
 
- 	},
 
- 	// Not public - generate a queueHooks object, or return the current one
 
- 	_queueHooks: function( elem, type ) {
 
- 		var key = type + "queueHooks";
 
- 		return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
 
- 			empty: jQuery.Callbacks( "once memory" ).add( function() {
 
- 				dataPriv.remove( elem, [ type + "queue", key ] );
 
- 			} )
 
- 		} );
 
- 	}
 
- } );
 
- jQuery.fn.extend( {
 
- 	queue: function( type, data ) {
 
- 		var setter = 2;
 
- 		if ( typeof type !== "string" ) {
 
- 			data = type;
 
- 			type = "fx";
 
- 			setter--;
 
- 		}
 
- 		if ( arguments.length < setter ) {
 
- 			return jQuery.queue( this[ 0 ], type );
 
- 		}
 
- 		return data === undefined ?
 
- 			this :
 
- 			this.each( function() {
 
- 				var queue = jQuery.queue( this, type, data );
 
- 				// Ensure a hooks for this queue
 
- 				jQuery._queueHooks( this, type );
 
- 				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
 
- 					jQuery.dequeue( this, type );
 
- 				}
 
- 			} );
 
- 	},
 
- 	dequeue: function( type ) {
 
- 		return this.each( function() {
 
- 			jQuery.dequeue( this, type );
 
- 		} );
 
- 	},
 
- 	clearQueue: function( type ) {
 
- 		return this.queue( type || "fx", [] );
 
- 	},
 
- 	// Get a promise resolved when queues of a certain type
 
- 	// are emptied (fx is the type by default)
 
- 	promise: function( type, obj ) {
 
- 		var tmp,
 
- 			count = 1,
 
- 			defer = jQuery.Deferred(),
 
- 			elements = this,
 
- 			i = this.length,
 
- 			resolve = function() {
 
- 				if ( !( --count ) ) {
 
- 					defer.resolveWith( elements, [ elements ] );
 
- 				}
 
- 			};
 
- 		if ( typeof type !== "string" ) {
 
- 			obj = type;
 
- 			type = undefined;
 
- 		}
 
- 		type = type || "fx";
 
- 		while ( i-- ) {
 
- 			tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
 
- 			if ( tmp && tmp.empty ) {
 
- 				count++;
 
- 				tmp.empty.add( resolve );
 
- 			}
 
- 		}
 
- 		resolve();
 
- 		return defer.promise( obj );
 
- 	}
 
- } );
 
- var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
 
- var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
 
- var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
 
- var documentElement = document.documentElement;
 
- 	var isAttached = function( elem ) {
 
- 			return jQuery.contains( elem.ownerDocument, elem );
 
- 		},
 
- 		composed = { composed: true };
 
- 	// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
 
- 	// Check attachment across shadow DOM boundaries when possible (gh-3504)
 
- 	// Support: iOS 10.0-10.2 only
 
- 	// Early iOS 10 versions support `attachShadow` but not `getRootNode`,
 
- 	// leading to errors. We need to check for `getRootNode`.
 
- 	if ( documentElement.getRootNode ) {
 
- 		isAttached = function( elem ) {
 
- 			return jQuery.contains( elem.ownerDocument, elem ) ||
 
- 				elem.getRootNode( composed ) === elem.ownerDocument;
 
- 		};
 
- 	}
 
- var isHiddenWithinTree = function( elem, el ) {
 
- 		// isHiddenWithinTree might be called from jQuery#filter function;
 
- 		// in that case, element will be second argument
 
- 		elem = el || elem;
 
- 		// Inline style trumps all
 
- 		return elem.style.display === "none" ||
 
- 			elem.style.display === "" &&
 
- 			// Otherwise, check computed style
 
- 			// Support: Firefox <=43 - 45
 
- 			// Disconnected elements can have computed display: none, so first confirm that elem is
 
- 			// in the document.
 
- 			isAttached( elem ) &&
 
- 			jQuery.css( elem, "display" ) === "none";
 
- 	};
 
- var swap = function( elem, options, callback, args ) {
 
- 	var ret, name,
 
- 		old = {};
 
- 	// Remember the old values, and insert the new ones
 
- 	for ( name in options ) {
 
- 		old[ name ] = elem.style[ name ];
 
- 		elem.style[ name ] = options[ name ];
 
- 	}
 
- 	ret = callback.apply( elem, args || [] );
 
- 	// Revert the old values
 
- 	for ( name in options ) {
 
- 		elem.style[ name ] = old[ name ];
 
- 	}
 
- 	return ret;
 
- };
 
- function adjustCSS( elem, prop, valueParts, tween ) {
 
- 	var adjusted, scale,
 
- 		maxIterations = 20,
 
- 		currentValue = tween ?
 
- 			function() {
 
- 				return tween.cur();
 
- 			} :
 
- 			function() {
 
- 				return jQuery.css( elem, prop, "" );
 
- 			},
 
- 		initial = currentValue(),
 
- 		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
 
- 		// Starting value computation is required for potential unit mismatches
 
- 		initialInUnit = elem.nodeType &&
 
- 			( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
 
- 			rcssNum.exec( jQuery.css( elem, prop ) );
 
- 	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
 
- 		// Support: Firefox <=54
 
- 		// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
 
- 		initial = initial / 2;
 
- 		// Trust units reported by jQuery.css
 
- 		unit = unit || initialInUnit[ 3 ];
 
- 		// Iteratively approximate from a nonzero starting point
 
- 		initialInUnit = +initial || 1;
 
- 		while ( maxIterations-- ) {
 
- 			// Evaluate and update our best guess (doubling guesses that zero out).
 
- 			// Finish if the scale equals or crosses 1 (making the old*new product non-positive).
 
- 			jQuery.style( elem, prop, initialInUnit + unit );
 
- 			if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
 
- 				maxIterations = 0;
 
- 			}
 
- 			initialInUnit = initialInUnit / scale;
 
- 		}
 
- 		initialInUnit = initialInUnit * 2;
 
- 		jQuery.style( elem, prop, initialInUnit + unit );
 
- 		// Make sure we update the tween properties later on
 
- 		valueParts = valueParts || [];
 
- 	}
 
- 	if ( valueParts ) {
 
- 		initialInUnit = +initialInUnit || +initial || 0;
 
- 		// Apply relative offset (+=/-=) if specified
 
- 		adjusted = valueParts[ 1 ] ?
 
- 			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
 
- 			+valueParts[ 2 ];
 
- 		if ( tween ) {
 
- 			tween.unit = unit;
 
- 			tween.start = initialInUnit;
 
- 			tween.end = adjusted;
 
- 		}
 
- 	}
 
- 	return adjusted;
 
- }
 
- var defaultDisplayMap = {};
 
- function getDefaultDisplay( elem ) {
 
- 	var temp,
 
- 		doc = elem.ownerDocument,
 
- 		nodeName = elem.nodeName,
 
- 		display = defaultDisplayMap[ nodeName ];
 
- 	if ( display ) {
 
- 		return display;
 
- 	}
 
- 	temp = doc.body.appendChild( doc.createElement( nodeName ) );
 
- 	display = jQuery.css( temp, "display" );
 
- 	temp.parentNode.removeChild( temp );
 
- 	if ( display === "none" ) {
 
- 		display = "block";
 
- 	}
 
- 	defaultDisplayMap[ nodeName ] = display;
 
- 	return display;
 
- }
 
- function showHide( elements, show ) {
 
- 	var display, elem,
 
- 		values = [],
 
- 		index = 0,
 
- 		length = elements.length;
 
- 	// Determine new display value for elements that need to change
 
- 	for ( ; index < length; index++ ) {
 
- 		elem = elements[ index ];
 
- 		if ( !elem.style ) {
 
- 			continue;
 
- 		}
 
- 		display = elem.style.display;
 
- 		if ( show ) {
 
- 			// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
 
- 			// check is required in this first loop unless we have a nonempty display value (either
 
- 			// inline or about-to-be-restored)
 
- 			if ( display === "none" ) {
 
- 				values[ index ] = dataPriv.get( elem, "display" ) || null;
 
- 				if ( !values[ index ] ) {
 
- 					elem.style.display = "";
 
- 				}
 
- 			}
 
- 			if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
 
- 				values[ index ] = getDefaultDisplay( elem );
 
- 			}
 
- 		} else {
 
- 			if ( display !== "none" ) {
 
- 				values[ index ] = "none";
 
- 				// Remember what we're overwriting
 
- 				dataPriv.set( elem, "display", display );
 
- 			}
 
- 		}
 
- 	}
 
- 	// Set the display of the elements in a second loop to avoid constant reflow
 
- 	for ( index = 0; index < length; index++ ) {
 
- 		if ( values[ index ] != null ) {
 
- 			elements[ index ].style.display = values[ index ];
 
- 		}
 
- 	}
 
- 	return elements;
 
- }
 
- jQuery.fn.extend( {
 
- 	show: function() {
 
- 		return showHide( this, true );
 
- 	},
 
- 	hide: function() {
 
- 		return showHide( this );
 
- 	},
 
- 	toggle: function( state ) {
 
- 		if ( typeof state === "boolean" ) {
 
- 			return state ? this.show() : this.hide();
 
- 		}
 
- 		return this.each( function() {
 
- 			if ( isHiddenWithinTree( this ) ) {
 
- 				jQuery( this ).show();
 
- 			} else {
 
- 				jQuery( this ).hide();
 
- 			}
 
- 		} );
 
- 	}
 
- } );
 
- var rcheckableType = ( /^(?:checkbox|radio)$/i );
 
- var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
 
- var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
 
- // We have to close these tags to support XHTML (#13200)
 
- var wrapMap = {
 
- 	// Support: IE <=9 only
 
- 	option: [ 1, "<select multiple='multiple'>", "</select>" ],
 
- 	// XHTML parsers do not magically insert elements in the
 
- 	// same way that tag soup parsers do. So we cannot shorten
 
- 	// this by omitting <tbody> or other required elements.
 
- 	thead: [ 1, "<table>", "</table>" ],
 
- 	col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
 
- 	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
 
- 	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
 
- 	_default: [ 0, "", "" ]
 
- };
 
- // Support: IE <=9 only
 
- wrapMap.optgroup = wrapMap.option;
 
- wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
 
- wrapMap.th = wrapMap.td;
 
- function getAll( context, tag ) {
 
- 	// Support: IE <=9 - 11 only
 
- 	// Use typeof to avoid zero-argument method invocation on host objects (#15151)
 
- 	var ret;
 
- 	if ( typeof context.getElementsByTagName !== "undefined" ) {
 
- 		ret = context.getElementsByTagName( tag || "*" );
 
- 	} else if ( typeof context.querySelectorAll !== "undefined" ) {
 
- 		ret = context.querySelectorAll( tag || "*" );
 
- 	} else {
 
- 		ret = [];
 
- 	}
 
- 	if ( tag === undefined || tag && nodeName( context, tag ) ) {
 
- 		return jQuery.merge( [ context ], ret );
 
- 	}
 
- 	return ret;
 
- }
 
- // Mark scripts as having already been evaluated
 
- function setGlobalEval( elems, refElements ) {
 
- 	var i = 0,
 
- 		l = elems.length;
 
- 	for ( ; i < l; i++ ) {
 
- 		dataPriv.set(
 
- 			elems[ i ],
 
- 			"globalEval",
 
- 			!refElements || dataPriv.get( refElements[ i ], "globalEval" )
 
- 		);
 
- 	}
 
- }
 
- var rhtml = /<|&#?\w+;/;
 
- function buildFragment( elems, context, scripts, selection, ignored ) {
 
- 	var elem, tmp, tag, wrap, attached, j,
 
- 		fragment = context.createDocumentFragment(),
 
- 		nodes = [],
 
- 		i = 0,
 
- 		l = elems.length;
 
- 	for ( ; i < l; i++ ) {
 
- 		elem = elems[ i ];
 
- 		if ( elem || elem === 0 ) {
 
- 			// Add nodes directly
 
- 			if ( toType( elem ) === "object" ) {
 
- 				// Support: Android <=4.0 only, PhantomJS 1 only
 
- 				// push.apply(_, arraylike) throws on ancient WebKit
 
- 				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
 
- 			// Convert non-html into a text node
 
- 			} else if ( !rhtml.test( elem ) ) {
 
- 				nodes.push( context.createTextNode( elem ) );
 
- 			// Convert html into DOM nodes
 
- 			} else {
 
- 				tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
 
- 				// Deserialize a standard representation
 
- 				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
 
- 				wrap = wrapMap[ tag ] || wrapMap._default;
 
- 				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
 
- 				// Descend through wrappers to the right content
 
- 				j = wrap[ 0 ];
 
- 				while ( j-- ) {
 
- 					tmp = tmp.lastChild;
 
- 				}
 
- 				// Support: Android <=4.0 only, PhantomJS 1 only
 
- 				// push.apply(_, arraylike) throws on ancient WebKit
 
- 				jQuery.merge( nodes, tmp.childNodes );
 
- 				// Remember the top-level container
 
- 				tmp = fragment.firstChild;
 
- 				// Ensure the created nodes are orphaned (#12392)
 
- 				tmp.textContent = "";
 
- 			}
 
- 		}
 
- 	}
 
- 	// Remove wrapper from fragment
 
- 	fragment.textContent = "";
 
- 	i = 0;
 
- 	while ( ( elem = nodes[ i++ ] ) ) {
 
- 		// Skip elements already in the context collection (trac-4087)
 
- 		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
 
- 			if ( ignored ) {
 
- 				ignored.push( elem );
 
- 			}
 
- 			continue;
 
- 		}
 
- 		attached = isAttached( elem );
 
- 		// Append to fragment
 
- 		tmp = getAll( fragment.appendChild( elem ), "script" );
 
- 		// Preserve script evaluation history
 
- 		if ( attached ) {
 
- 			setGlobalEval( tmp );
 
- 		}
 
- 		// Capture executables
 
- 		if ( scripts ) {
 
- 			j = 0;
 
- 			while ( ( elem = tmp[ j++ ] ) ) {
 
- 				if ( rscriptType.test( elem.type || "" ) ) {
 
- 					scripts.push( elem );
 
- 				}
 
- 			}
 
- 		}
 
- 	}
 
- 	return fragment;
 
- }
 
- ( function() {
 
- 	var fragment = document.createDocumentFragment(),
 
- 		div = fragment.appendChild( document.createElement( "div" ) ),
 
- 		input = document.createElement( "input" );
 
- 	// Support: Android 4.0 - 4.3 only
 
- 	// Check state lost if the name is set (#11217)
 
- 	// Support: Windows Web Apps (WWA)
 
- 	// `name` and `type` must use .setAttribute for WWA (#14901)
 
- 	input.setAttribute( "type", "radio" );
 
- 	input.setAttribute( "checked", "checked" );
 
- 	input.setAttribute( "name", "t" );
 
- 	div.appendChild( input );
 
- 	// Support: Android <=4.1 only
 
- 	// Older WebKit doesn't clone checked state correctly in fragments
 
- 	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
 
- 	// Support: IE <=11 only
 
- 	// Make sure textarea (and checkbox) defaultValue is properly cloned
 
- 	div.innerHTML = "<textarea>x</textarea>";
 
- 	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
 
- } )();
 
- var
 
- 	rkeyEvent = /^key/,
 
- 	rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
 
- 	rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
 
- function returnTrue() {
 
- 	return true;
 
- }
 
- function returnFalse() {
 
- 	return false;
 
- }
 
- // Support: IE <=9 - 11+
 
- // focus() and blur() are asynchronous, except when they are no-op.
 
- // So expect focus to be synchronous when the element is already active,
 
- // and blur to be synchronous when the element is not already active.
 
- // (focus and blur are always synchronous in other supported browsers,
 
- // this just defines when we can count on it).
 
- function expectSync( elem, type ) {
 
- 	return ( elem === safeActiveElement() ) === ( type === "focus" );
 
- }
 
- // Support: IE <=9 only
 
- // Accessing document.activeElement can throw unexpectedly
 
- // https://bugs.jquery.com/ticket/13393
 
- function safeActiveElement() {
 
- 	try {
 
- 		return document.activeElement;
 
- 	} catch ( err ) { }
 
- }
 
- function on( elem, types, selector, data, fn, one ) {
 
- 	var origFn, type;
 
- 	// Types can be a map of types/handlers
 
- 	if ( typeof types === "object" ) {
 
- 		// ( types-Object, selector, data )
 
- 		if ( typeof selector !== "string" ) {
 
- 			// ( types-Object, data )
 
- 			data = data || selector;
 
- 			selector = undefined;
 
- 		}
 
- 		for ( type in types ) {
 
- 			on( elem, type, selector, data, types[ type ], one );
 
- 		}
 
- 		return elem;
 
- 	}
 
- 	if ( data == null && fn == null ) {
 
- 		// ( types, fn )
 
- 		fn = selector;
 
- 		data = selector = undefined;
 
- 	} else if ( fn == null ) {
 
- 		if ( typeof selector === "string" ) {
 
- 			// ( types, selector, fn )
 
- 			fn = data;
 
- 			data = undefined;
 
- 		} else {
 
- 			// ( types, data, fn )
 
- 			fn = data;
 
- 			data = selector;
 
- 			selector = undefined;
 
- 		}
 
- 	}
 
- 	if ( fn === false ) {
 
- 		fn = returnFalse;
 
- 	} else if ( !fn ) {
 
- 		return elem;
 
- 	}
 
- 	if ( one === 1 ) {
 
- 		origFn = fn;
 
- 		fn = function( event ) {
 
- 			// Can use an empty set, since event contains the info
 
- 			jQuery().off( event );
 
- 			return origFn.apply( this, arguments );
 
- 		};
 
- 		// Use same guid so caller can remove using origFn
 
- 		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
 
- 	}
 
- 	return elem.each( function() {
 
- 		jQuery.event.add( this, types, fn, data, selector );
 
- 	} );
 
- }
 
- /*
 
-  * Helper functions for managing events -- not part of the public interface.
 
-  * Props to Dean Edwards' addEvent library for many of the ideas.
 
-  */
 
- jQuery.event = {
 
- 	global: {},
 
- 	add: function( elem, types, handler, data, selector ) {
 
- 		var handleObjIn, eventHandle, tmp,
 
- 			events, t, handleObj,
 
- 			special, handlers, type, namespaces, origType,
 
- 			elemData = dataPriv.get( elem );
 
- 		// Don't attach events to noData or text/comment nodes (but allow plain objects)
 
- 		if ( !elemData ) {
 
- 			return;
 
- 		}
 
- 		// Caller can pass in an object of custom data in lieu of the handler
 
- 		if ( handler.handler ) {
 
- 			handleObjIn = handler;
 
- 			handler = handleObjIn.handler;
 
- 			selector = handleObjIn.selector;
 
- 		}
 
- 		// Ensure that invalid selectors throw exceptions at attach time
 
- 		// Evaluate against documentElement in case elem is a non-element node (e.g., document)
 
- 		if ( selector ) {
 
- 			jQuery.find.matchesSelector( documentElement, selector );
 
- 		}
 
- 		// Make sure that the handler has a unique ID, used to find/remove it later
 
- 		if ( !handler.guid ) {
 
- 			handler.guid = jQuery.guid++;
 
- 		}
 
- 		// Init the element's event structure and main handler, if this is the first
 
- 		if ( !( events = elemData.events ) ) {
 
- 			events = elemData.events = {};
 
- 		}
 
- 		if ( !( eventHandle = elemData.handle ) ) {
 
- 			eventHandle = elemData.handle = function( e ) {
 
- 				// Discard the second event of a jQuery.event.trigger() and
 
- 				// when an event is called after a page has unloaded
 
- 				return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
 
- 					jQuery.event.dispatch.apply( elem, arguments ) : undefined;
 
- 			};
 
- 		}
 
- 		// Handle multiple events separated by a space
 
- 		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
 
- 		t = types.length;
 
- 		while ( t-- ) {
 
- 			tmp = rtypenamespace.exec( types[ t ] ) || [];
 
- 			type = origType = tmp[ 1 ];
 
- 			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
 
- 			// There *must* be a type, no attaching namespace-only handlers
 
- 			if ( !type ) {
 
- 				continue;
 
- 			}
 
- 			// If event changes its type, use the special event handlers for the changed type
 
- 			special = jQuery.event.special[ type ] || {};
 
- 			// If selector defined, determine special event api type, otherwise given type
 
- 			type = ( selector ? special.delegateType : special.bindType ) || type;
 
- 			// Update special based on newly reset type
 
- 			special = jQuery.event.special[ type ] || {};
 
- 			// handleObj is passed to all event handlers
 
- 			handleObj = jQuery.extend( {
 
- 				type: type,
 
- 				origType: origType,
 
- 				data: data,
 
- 				handler: handler,
 
- 				guid: handler.guid,
 
- 				selector: selector,
 
- 				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
 
- 				namespace: namespaces.join( "." )
 
- 			}, handleObjIn );
 
- 			// Init the event handler queue if we're the first
 
- 			if ( !( handlers = events[ type ] ) ) {
 
- 				handlers = events[ type ] = [];
 
- 				handlers.delegateCount = 0;
 
- 				// Only use addEventListener if the special events handler returns false
 
- 				if ( !special.setup ||
 
- 					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
 
- 					if ( elem.addEventListener ) {
 
- 						elem.addEventListener( type, eventHandle );
 
- 					}
 
- 				}
 
- 			}
 
- 			if ( special.add ) {
 
- 				special.add.call( elem, handleObj );
 
- 				if ( !handleObj.handler.guid ) {
 
- 					handleObj.handler.guid = handler.guid;
 
- 				}
 
- 			}
 
- 			// Add to the element's handler list, delegates in front
 
- 			if ( selector ) {
 
- 				handlers.splice( handlers.delegateCount++, 0, handleObj );
 
- 			} else {
 
- 				handlers.push( handleObj );
 
- 			}
 
- 			// Keep track of which events have ever been used, for event optimization
 
- 			jQuery.event.global[ type ] = true;
 
- 		}
 
- 	},
 
- 	// Detach an event or set of events from an element
 
- 	remove: function( elem, types, handler, selector, mappedTypes ) {
 
- 		var j, origCount, tmp,
 
- 			events, t, handleObj,
 
- 			special, handlers, type, namespaces, origType,
 
- 			elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
 
- 		if ( !elemData || !( events = elemData.events ) ) {
 
- 			return;
 
- 		}
 
- 		// Once for each type.namespace in types; type may be omitted
 
- 		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
 
- 		t = types.length;
 
- 		while ( t-- ) {
 
- 			tmp = rtypenamespace.exec( types[ t ] ) || [];
 
- 			type = origType = tmp[ 1 ];
 
- 			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
 
- 			// Unbind all events (on this namespace, if provided) for the element
 
- 			if ( !type ) {
 
- 				for ( type in events ) {
 
- 					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
 
- 				}
 
- 				continue;
 
- 			}
 
- 			special = jQuery.event.special[ type ] || {};
 
- 			type = ( selector ? special.delegateType : special.bindType ) || type;
 
- 			handlers = events[ type ] || [];
 
- 			tmp = tmp[ 2 ] &&
 
- 				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
 
- 			// Remove matching events
 
- 			origCount = j = handlers.length;
 
- 			while ( j-- ) {
 
- 				handleObj = handlers[ j ];
 
- 				if ( ( mappedTypes || origType === handleObj.origType ) &&
 
- 					( !handler || handler.guid === handleObj.guid ) &&
 
- 					( !tmp || tmp.test( handleObj.namespace ) ) &&
 
- 					( !selector || selector === handleObj.selector ||
 
- 						selector === "**" && handleObj.selector ) ) {
 
- 					handlers.splice( j, 1 );
 
- 					if ( handleObj.selector ) {
 
- 						handlers.delegateCount--;
 
- 					}
 
- 					if ( special.remove ) {
 
- 						special.remove.call( elem, handleObj );
 
- 					}
 
- 				}
 
- 			}
 
- 			// Remove generic event handler if we removed something and no more handlers exist
 
- 			// (avoids potential for endless recursion during removal of special event handlers)
 
- 			if ( origCount && !handlers.length ) {
 
- 				if ( !special.teardown ||
 
- 					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
 
- 					jQuery.removeEvent( elem, type, elemData.handle );
 
- 				}
 
- 				delete events[ type ];
 
- 			}
 
- 		}
 
- 		// Remove data and the expando if it's no longer used
 
- 		if ( jQuery.isEmptyObject( events ) ) {
 
- 			dataPriv.remove( elem, "handle events" );
 
- 		}
 
- 	},
 
- 	dispatch: function( nativeEvent ) {
 
- 		// Make a writable jQuery.Event from the native event object
 
- 		var event = jQuery.event.fix( nativeEvent );
 
- 		var i, j, ret, matched, handleObj, handlerQueue,
 
- 			args = new Array( arguments.length ),
 
- 			handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
 
- 			special = jQuery.event.special[ event.type ] || {};
 
- 		// Use the fix-ed jQuery.Event rather than the (read-only) native event
 
- 		args[ 0 ] = event;
 
- 		for ( i = 1; i < arguments.length; i++ ) {
 
- 			args[ i ] = arguments[ i ];
 
- 		}
 
- 		event.delegateTarget = this;
 
- 		// Call the preDispatch hook for the mapped type, and let it bail if desired
 
- 		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
 
- 			return;
 
- 		}
 
- 		// Determine handlers
 
- 		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
 
- 		// Run delegates first; they may want to stop propagation beneath us
 
- 		i = 0;
 
- 		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
 
- 			event.currentTarget = matched.elem;
 
- 			j = 0;
 
- 			while ( ( handleObj = matched.handlers[ j++ ] ) &&
 
- 				!event.isImmediatePropagationStopped() ) {
 
- 				// If the event is namespaced, then each handler is only invoked if it is
 
- 				// specially universal or its namespaces are a superset of the event's.
 
- 				if ( !event.rnamespace || handleObj.namespace === false ||
 
- 					event.rnamespace.test( handleObj.namespace ) ) {
 
- 					event.handleObj = handleObj;
 
- 					event.data = handleObj.data;
 
- 					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
 
- 						handleObj.handler ).apply( matched.elem, args );
 
- 					if ( ret !== undefined ) {
 
- 						if ( ( event.result = ret ) === false ) {
 
- 							event.preventDefault();
 
- 							event.stopPropagation();
 
- 						}
 
- 					}
 
- 				}
 
- 			}
 
- 		}
 
- 		// Call the postDispatch hook for the mapped type
 
- 		if ( special.postDispatch ) {
 
- 			special.postDispatch.call( this, event );
 
- 		}
 
- 		return event.result;
 
- 	},
 
- 	handlers: function( event, handlers ) {
 
- 		var i, handleObj, sel, matchedHandlers, matchedSelectors,
 
- 			handlerQueue = [],
 
- 			delegateCount = handlers.delegateCount,
 
- 			cur = event.target;
 
- 		// Find delegate handlers
 
- 		if ( delegateCount &&
 
- 			// Support: IE <=9
 
- 			// Black-hole SVG <use> instance trees (trac-13180)
 
- 			cur.nodeType &&
 
- 			// Support: Firefox <=42
 
- 			// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
 
- 			// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
 
- 			// Support: IE 11 only
 
- 			// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
 
- 			!( event.type === "click" && event.button >= 1 ) ) {
 
- 			for ( ; cur !== this; cur = cur.parentNode || this ) {
 
- 				// Don't check non-elements (#13208)
 
- 				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
 
- 				if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
 
- 					matchedHandlers = [];
 
- 					matchedSelectors = {};
 
- 					for ( i = 0; i < delegateCount; i++ ) {
 
- 						handleObj = handlers[ i ];
 
- 						// Don't conflict with Object.prototype properties (#13203)
 
- 						sel = handleObj.selector + " ";
 
- 						if ( matchedSelectors[ sel ] === undefined ) {
 
- 							matchedSelectors[ sel ] = handleObj.needsContext ?
 
- 								jQuery( sel, this ).index( cur ) > -1 :
 
- 								jQuery.find( sel, this, null, [ cur ] ).length;
 
- 						}
 
- 						if ( matchedSelectors[ sel ] ) {
 
- 							matchedHandlers.push( handleObj );
 
- 						}
 
- 					}
 
- 					if ( matchedHandlers.length ) {
 
- 						handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
 
- 					}
 
- 				}
 
- 			}
 
- 		}
 
- 		// Add the remaining (directly-bound) handlers
 
- 		cur = this;
 
- 		if ( delegateCount < handlers.length ) {
 
- 			handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
 
- 		}
 
- 		return handlerQueue;
 
- 	},
 
- 	addProp: function( name, hook ) {
 
- 		Object.defineProperty( jQuery.Event.prototype, name, {
 
- 			enumerable: true,
 
- 			configurable: true,
 
- 			get: isFunction( hook ) ?
 
- 				function() {
 
- 					if ( this.originalEvent ) {
 
- 							return hook( this.originalEvent );
 
- 					}
 
- 				} :
 
- 				function() {
 
- 					if ( this.originalEvent ) {
 
- 							return this.originalEvent[ name ];
 
- 					}
 
- 				},
 
- 			set: function( value ) {
 
- 				Object.defineProperty( this, name, {
 
- 					enumerable: true,
 
- 					configurable: true,
 
- 					writable: true,
 
- 					value: value
 
- 				} );
 
- 			}
 
- 		} );
 
- 	},
 
- 	fix: function( originalEvent ) {
 
- 		return originalEvent[ jQuery.expando ] ?
 
- 			originalEvent :
 
- 			new jQuery.Event( originalEvent );
 
- 	},
 
- 	special: {
 
- 		load: {
 
- 			// Prevent triggered image.load events from bubbling to window.load
 
- 			noBubble: true
 
- 		},
 
- 		click: {
 
- 			// Utilize native event to ensure correct state for checkable inputs
 
- 			setup: function( data ) {
 
- 				// For mutual compressibility with _default, replace `this` access with a local var.
 
- 				// `|| data` is dead code meant only to preserve the variable through minification.
 
- 				var el = this || data;
 
- 				// Claim the first handler
 
- 				if ( rcheckableType.test( el.type ) &&
 
- 					el.click && nodeName( el, "input" ) ) {
 
- 					// dataPriv.set( el, "click", ... )
 
- 					leverageNative( el, "click", returnTrue );
 
- 				}
 
- 				// Return false to allow normal processing in the caller
 
- 				return false;
 
- 			},
 
- 			trigger: function( data ) {
 
- 				// For mutual compressibility with _default, replace `this` access with a local var.
 
- 				// `|| data` is dead code meant only to preserve the variable through minification.
 
- 				var el = this || data;
 
- 				// Force setup before triggering a click
 
- 				if ( rcheckableType.test( el.type ) &&
 
- 					el.click && nodeName( el, "input" ) ) {
 
- 					leverageNative( el, "click" );
 
- 				}
 
- 				// Return non-false to allow normal event-path propagation
 
- 				return true;
 
- 			},
 
- 			// For cross-browser consistency, suppress native .click() on links
 
- 			// Also prevent it if we're currently inside a leveraged native-event stack
 
- 			_default: function( event ) {
 
- 				var target = event.target;
 
- 				return rcheckableType.test( target.type ) &&
 
- 					target.click && nodeName( target, "input" ) &&
 
- 					dataPriv.get( target, "click" ) ||
 
- 					nodeName( target, "a" );
 
- 			}
 
- 		},
 
- 		beforeunload: {
 
- 			postDispatch: function( event ) {
 
- 				// Support: Firefox 20+
 
- 				// Firefox doesn't alert if the returnValue field is not set.
 
- 				if ( event.result !== undefined && event.originalEvent ) {
 
- 					event.originalEvent.returnValue = event.result;
 
- 				}
 
- 			}
 
- 		}
 
- 	}
 
- };
 
- // Ensure the presence of an event listener that handles manually-triggered
 
- // synthetic events by interrupting progress until reinvoked in response to
 
- // *native* events that it fires directly, ensuring that state changes have
 
- // already occurred before other listeners are invoked.
 
- function leverageNative( el, type, expectSync ) {
 
- 	// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
 
- 	if ( !expectSync ) {
 
- 		if ( dataPriv.get( el, type ) === undefined ) {
 
- 			jQuery.event.add( el, type, returnTrue );
 
- 		}
 
- 		return;
 
- 	}
 
- 	// Register the controller as a special universal handler for all event namespaces
 
- 	dataPriv.set( el, type, false );
 
- 	jQuery.event.add( el, type, {
 
- 		namespace: false,
 
- 		handler: function( event ) {
 
- 			var notAsync, result,
 
- 				saved = dataPriv.get( this, type );
 
- 			if ( ( event.isTrigger & 1 ) && this[ type ] ) {
 
- 				// Interrupt processing of the outer synthetic .trigger()ed event
 
- 				// Saved data should be false in such cases, but might be a leftover capture object
 
- 				// from an async native handler (gh-4350)
 
- 				if ( !saved.length ) {
 
- 					// Store arguments for use when handling the inner native event
 
- 					// There will always be at least one argument (an event object), so this array
 
- 					// will not be confused with a leftover capture object.
 
- 					saved = slice.call( arguments );
 
- 					dataPriv.set( this, type, saved );
 
- 					// Trigger the native event and capture its result
 
- 					// Support: IE <=9 - 11+
 
- 					// focus() and blur() are asynchronous
 
- 					notAsync = expectSync( this, type );
 
- 					this[ type ]();
 
- 					result = dataPriv.get( this, type );
 
- 					if ( saved !== result || notAsync ) {
 
- 						dataPriv.set( this, type, false );
 
- 					} else {
 
- 						result = {};
 
- 					}
 
- 					if ( saved !== result ) {
 
- 						// Cancel the outer synthetic event
 
- 						event.stopImmediatePropagation();
 
- 						event.preventDefault();
 
- 						return result.value;
 
- 					}
 
- 				// If this is an inner synthetic event for an event with a bubbling surrogate
 
- 				// (focus or blur), assume that the surrogate already propagated from triggering the
 
- 				// native event and prevent that from happening again here.
 
- 				// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
 
- 				// bubbling surrogate propagates *after* the non-bubbling base), but that seems
 
- 				// less bad than duplication.
 
- 				} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
 
- 					event.stopPropagation();
 
- 				}
 
- 			// If this is a native event triggered above, everything is now in order
 
- 			// Fire an inner synthetic event with the original arguments
 
- 			} else if ( saved.length ) {
 
- 				// ...and capture the result
 
- 				dataPriv.set( this, type, {
 
- 					value: jQuery.event.trigger(
 
- 						// Support: IE <=9 - 11+
 
- 						// Extend with the prototype to reset the above stopImmediatePropagation()
 
- 						jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
 
- 						saved.slice( 1 ),
 
- 						this
 
- 					)
 
- 				} );
 
- 				// Abort handling of the native event
 
- 				event.stopImmediatePropagation();
 
- 			}
 
- 		}
 
- 	} );
 
- }
 
- jQuery.removeEvent = function( elem, type, handle ) {
 
- 	// This "if" is needed for plain objects
 
- 	if ( elem.removeEventListener ) {
 
- 		elem.removeEventListener( type, handle );
 
- 	}
 
- };
 
- jQuery.Event = function( src, props ) {
 
- 	// Allow instantiation without the 'new' keyword
 
- 	if ( !( this instanceof jQuery.Event ) ) {
 
- 		return new jQuery.Event( src, props );
 
- 	}
 
- 	// Event object
 
- 	if ( src && src.type ) {
 
- 		this.originalEvent = src;
 
- 		this.type = src.type;
 
- 		// Events bubbling up the document may have been marked as prevented
 
- 		// by a handler lower down the tree; reflect the correct value.
 
- 		this.isDefaultPrevented = src.defaultPrevented ||
 
- 				src.defaultPrevented === undefined &&
 
- 				// Support: Android <=2.3 only
 
- 				src.returnValue === false ?
 
- 			returnTrue :
 
- 			returnFalse;
 
- 		// Create target properties
 
- 		// Support: Safari <=6 - 7 only
 
- 		// Target should not be a text node (#504, #13143)
 
- 		this.target = ( src.target && src.target.nodeType === 3 ) ?
 
- 			src.target.parentNode :
 
- 			src.target;
 
- 		this.currentTarget = src.currentTarget;
 
- 		this.relatedTarget = src.relatedTarget;
 
- 	// Event type
 
- 	} else {
 
- 		this.type = src;
 
- 	}
 
- 	// Put explicitly provided properties onto the event object
 
- 	if ( props ) {
 
- 		jQuery.extend( this, props );
 
- 	}
 
- 	// Create a timestamp if incoming event doesn't have one
 
- 	this.timeStamp = src && src.timeStamp || Date.now();
 
- 	// Mark it as fixed
 
- 	this[ jQuery.expando ] = true;
 
- };
 
- // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
 
- // https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
 
- jQuery.Event.prototype = {
 
- 	constructor: jQuery.Event,
 
- 	isDefaultPrevented: returnFalse,
 
- 	isPropagationStopped: returnFalse,
 
- 	isImmediatePropagationStopped: returnFalse,
 
- 	isSimulated: false,
 
- 	preventDefault: function() {
 
- 		var e = this.originalEvent;
 
- 		this.isDefaultPrevented = returnTrue;
 
- 		if ( e && !this.isSimulated ) {
 
- 			e.preventDefault();
 
- 		}
 
- 	},
 
- 	stopPropagation: function() {
 
- 		var e = this.originalEvent;
 
- 		this.isPropagationStopped = returnTrue;
 
- 		if ( e && !this.isSimulated ) {
 
- 			e.stopPropagation();
 
- 		}
 
- 	},
 
- 	stopImmediatePropagation: function() {
 
- 		var e = this.originalEvent;
 
- 		this.isImmediatePropagationStopped = returnTrue;
 
- 		if ( e && !this.isSimulated ) {
 
- 			e.stopImmediatePropagation();
 
- 		}
 
- 		this.stopPropagation();
 
- 	}
 
- };
 
- // Includes all common event props including KeyEvent and MouseEvent specific props
 
- jQuery.each( {
 
- 	altKey: true,
 
- 	bubbles: true,
 
- 	cancelable: true,
 
- 	changedTouches: true,
 
- 	ctrlKey: true,
 
- 	detail: true,
 
- 	eventPhase: true,
 
- 	metaKey: true,
 
- 	pageX: true,
 
- 	pageY: true,
 
- 	shiftKey: true,
 
- 	view: true,
 
- 	"char": true,
 
- 	code: true,
 
- 	charCode: true,
 
- 	key: true,
 
- 	keyCode: true,
 
- 	button: true,
 
- 	buttons: true,
 
- 	clientX: true,
 
- 	clientY: true,
 
- 	offsetX: true,
 
- 	offsetY: true,
 
- 	pointerId: true,
 
- 	pointerType: true,
 
- 	screenX: true,
 
- 	screenY: true,
 
- 	targetTouches: true,
 
- 	toElement: true,
 
- 	touches: true,
 
- 	which: function( event ) {
 
- 		var button = event.button;
 
- 		// Add which for key events
 
- 		if ( event.which == null && rkeyEvent.test( event.type ) ) {
 
- 			return event.charCode != null ? event.charCode : event.keyCode;
 
- 		}
 
- 		// Add which for click: 1 === left; 2 === middle; 3 === right
 
- 		if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
 
- 			if ( button & 1 ) {
 
- 				return 1;
 
- 			}
 
- 			if ( button & 2 ) {
 
- 				return 3;
 
- 			}
 
- 			if ( button & 4 ) {
 
- 				return 2;
 
- 			}
 
- 			return 0;
 
- 		}
 
- 		return event.which;
 
- 	}
 
- }, jQuery.event.addProp );
 
- jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
 
- 	jQuery.event.special[ type ] = {
 
- 		// Utilize native event if possible so blur/focus sequence is correct
 
- 		setup: function() {
 
- 			// Claim the first handler
 
- 			// dataPriv.set( this, "focus", ... )
 
- 			// dataPriv.set( this, "blur", ... )
 
- 			leverageNative( this, type, expectSync );
 
- 			// Return false to allow normal processing in the caller
 
- 			return false;
 
- 		},
 
- 		trigger: function() {
 
- 			// Force setup before trigger
 
- 			leverageNative( this, type );
 
- 			// Return non-false to allow normal event-path propagation
 
- 			return true;
 
- 		},
 
- 		delegateType: delegateType
 
- 	};
 
- } );
 
- // Create mouseenter/leave events using mouseover/out and event-time checks
 
- // so that event delegation works in jQuery.
 
- // Do the same for pointerenter/pointerleave and pointerover/pointerout
 
- //
 
- // Support: Safari 7 only
 
- // Safari sends mouseenter too often; see:
 
- // https://bugs.chromium.org/p/chromium/issues/detail?id=470258
 
- // for the description of the bug (it existed in older Chrome versions as well).
 
- jQuery.each( {
 
- 	mouseenter: "mouseover",
 
- 	mouseleave: "mouseout",
 
- 	pointerenter: "pointerover",
 
- 	pointerleave: "pointerout"
 
- }, function( orig, fix ) {
 
- 	jQuery.event.special[ orig ] = {
 
- 		delegateType: fix,
 
- 		bindType: fix,
 
- 		handle: function( event ) {
 
- 			var ret,
 
- 				target = this,
 
- 				related = event.relatedTarget,
 
- 				handleObj = event.handleObj;
 
- 			// For mouseenter/leave call the handler if related is outside the target.
 
- 			// NB: No relatedTarget if the mouse left/entered the browser window
 
- 			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
 
- 				event.type = handleObj.origType;
 
- 				ret = handleObj.handler.apply( this, arguments );
 
- 				event.type = fix;
 
- 			}
 
- 			return ret;
 
- 		}
 
- 	};
 
- } );
 
- jQuery.fn.extend( {
 
- 	on: function( types, selector, data, fn ) {
 
- 		return on( this, types, selector, data, fn );
 
- 	},
 
- 	one: function( types, selector, data, fn ) {
 
- 		return on( this, types, selector, data, fn, 1 );
 
- 	},
 
- 	off: function( types, selector, fn ) {
 
- 		var handleObj, type;
 
- 		if ( types && types.preventDefault && types.handleObj ) {
 
- 			// ( event )  dispatched jQuery.Event
 
- 			handleObj = types.handleObj;
 
- 			jQuery( types.delegateTarget ).off(
 
- 				handleObj.namespace ?
 
- 					handleObj.origType + "." + handleObj.namespace :
 
- 					handleObj.origType,
 
- 				handleObj.selector,
 
- 				handleObj.handler
 
- 			);
 
- 			return this;
 
- 		}
 
- 		if ( typeof types === "object" ) {
 
- 			// ( types-object [, selector] )
 
- 			for ( type in types ) {
 
- 				this.off( type, selector, types[ type ] );
 
- 			}
 
- 			return this;
 
- 		}
 
- 		if ( selector === false || typeof selector === "function" ) {
 
- 			// ( types [, fn] )
 
- 			fn = selector;
 
- 			selector = undefined;
 
- 		}
 
- 		if ( fn === false ) {
 
- 			fn = returnFalse;
 
- 		}
 
- 		return this.each( function() {
 
- 			jQuery.event.remove( this, types, fn, selector );
 
- 		} );
 
- 	}
 
- } );
 
- var
 
- 	/* eslint-disable max-len */
 
- 	// See https://github.com/eslint/eslint/issues/3229
 
- 	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
 
- 	/* eslint-enable */
 
- 	// Support: IE <=10 - 11, Edge 12 - 13 only
 
- 	// In IE/Edge using regex groups here causes severe slowdowns.
 
- 	// See https://connect.microsoft.com/IE/feedback/details/1736512/
 
- 	rnoInnerhtml = /<script|<style|<link/i,
 
- 	// checked="checked" or checked
 
- 	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
 
- 	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
 
- // Prefer a tbody over its parent table for containing new rows
 
- function manipulationTarget( elem, content ) {
 
- 	if ( nodeName( elem, "table" ) &&
 
- 		nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
 
- 		return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
 
- 	}
 
- 	return elem;
 
- }
 
- // Replace/restore the type attribute of script elements for safe DOM manipulation
 
- function disableScript( elem ) {
 
- 	elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
 
- 	return elem;
 
- }
 
- function restoreScript( elem ) {
 
- 	if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
 
- 		elem.type = elem.type.slice( 5 );
 
- 	} else {
 
- 		elem.removeAttribute( "type" );
 
- 	}
 
- 	return elem;
 
- }
 
- function cloneCopyEvent( src, dest ) {
 
- 	var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
 
- 	if ( dest.nodeType !== 1 ) {
 
- 		return;
 
- 	}
 
- 	// 1. Copy private data: events, handlers, etc.
 
- 	if ( dataPriv.hasData( src ) ) {
 
- 		pdataOld = dataPriv.access( src );
 
- 		pdataCur = dataPriv.set( dest, pdataOld );
 
- 		events = pdataOld.events;
 
- 		if ( events ) {
 
- 			delete pdataCur.handle;
 
- 			pdataCur.events = {};
 
- 			for ( type in events ) {
 
- 				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
 
- 					jQuery.event.add( dest, type, events[ type ][ i ] );
 
- 				}
 
- 			}
 
- 		}
 
- 	}
 
- 	// 2. Copy user data
 
- 	if ( dataUser.hasData( src ) ) {
 
- 		udataOld = dataUser.access( src );
 
- 		udataCur = jQuery.extend( {}, udataOld );
 
- 		dataUser.set( dest, udataCur );
 
- 	}
 
- }
 
- // Fix IE bugs, see support tests
 
- function fixInput( src, dest ) {
 
- 	var nodeName = dest.nodeName.toLowerCase();
 
- 	// Fails to persist the checked state of a cloned checkbox or radio button.
 
- 	if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
 
- 		dest.checked = src.checked;
 
- 	// Fails to return the selected option to the default selected state when cloning options
 
- 	} else if ( nodeName === "input" || nodeName === "textarea" ) {
 
- 		dest.defaultValue = src.defaultValue;
 
- 	}
 
- }
 
- function domManip( collection, args, callback, ignored ) {
 
- 	// Flatten any nested arrays
 
- 	args = concat.apply( [], args );
 
- 	var fragment, first, scripts, hasScripts, node, doc,
 
- 		i = 0,
 
- 		l = collection.length,
 
- 		iNoClone = l - 1,
 
- 		value = args[ 0 ],
 
- 		valueIsFunction = isFunction( value );
 
- 	// We can't cloneNode fragments that contain checked, in WebKit
 
- 	if ( valueIsFunction ||
 
- 			( l > 1 && typeof value === "string" &&
 
- 				!support.checkClone && rchecked.test( value ) ) ) {
 
- 		return collection.each( function( index ) {
 
- 			var self = collection.eq( index );
 
- 			if ( valueIsFunction ) {
 
- 				args[ 0 ] = value.call( this, index, self.html() );
 
- 			}
 
- 			domManip( self, args, callback, ignored );
 
- 		} );
 
- 	}
 
- 	if ( l ) {
 
- 		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
 
- 		first = fragment.firstChild;
 
- 		if ( fragment.childNodes.length === 1 ) {
 
- 			fragment = first;
 
- 		}
 
- 		// Require either new content or an interest in ignored elements to invoke the callback
 
- 		if ( first || ignored ) {
 
- 			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
 
- 			hasScripts = scripts.length;
 
- 			// Use the original fragment for the last item
 
- 			// instead of the first because it can end up
 
- 			// being emptied incorrectly in certain situations (#8070).
 
- 			for ( ; i < l; i++ ) {
 
- 				node = fragment;
 
- 				if ( i !== iNoClone ) {
 
- 					node = jQuery.clone( node, true, true );
 
- 					// Keep references to cloned scripts for later restoration
 
- 					if ( hasScripts ) {
 
- 						// Support: Android <=4.0 only, PhantomJS 1 only
 
- 						// push.apply(_, arraylike) throws on ancient WebKit
 
- 						jQuery.merge( scripts, getAll( node, "script" ) );
 
- 					}
 
- 				}
 
- 				callback.call( collection[ i ], node, i );
 
- 			}
 
- 			if ( hasScripts ) {
 
- 				doc = scripts[ scripts.length - 1 ].ownerDocument;
 
- 				// Reenable scripts
 
- 				jQuery.map( scripts, restoreScript );
 
- 				// Evaluate executable scripts on first document insertion
 
- 				for ( i = 0; i < hasScripts; i++ ) {
 
- 					node = scripts[ i ];
 
- 					if ( rscriptType.test( node.type || "" ) &&
 
- 						!dataPriv.access( node, "globalEval" ) &&
 
- 						jQuery.contains( doc, node ) ) {
 
- 						if ( node.src && ( node.type || "" ).toLowerCase()  !== "module" ) {
 
- 							// Optional AJAX dependency, but won't run scripts if not present
 
- 							if ( jQuery._evalUrl && !node.noModule ) {
 
- 								jQuery._evalUrl( node.src, {
 
- 									nonce: node.nonce || node.getAttribute( "nonce" )
 
- 								} );
 
- 							}
 
- 						} else {
 
- 							DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
 
- 						}
 
- 					}
 
- 				}
 
- 			}
 
- 		}
 
- 	}
 
- 	return collection;
 
- }
 
- function remove( elem, selector, keepData ) {
 
- 	var node,
 
- 		nodes = selector ? jQuery.filter( selector, elem ) : elem,
 
- 		i = 0;
 
- 	for ( ; ( node = nodes[ i ] ) != null; i++ ) {
 
- 		if ( !keepData && node.nodeType === 1 ) {
 
- 			jQuery.cleanData( getAll( node ) );
 
- 		}
 
- 		if ( node.parentNode ) {
 
- 			if ( keepData && isAttached( node ) ) {
 
- 				setGlobalEval( getAll( node, "script" ) );
 
- 			}
 
- 			node.parentNode.removeChild( node );
 
- 		}
 
- 	}
 
- 	return elem;
 
- }
 
- jQuery.extend( {
 
- 	htmlPrefilter: function( html ) {
 
- 		return html.replace( rxhtmlTag, "<$1></$2>" );
 
- 	},
 
- 	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
 
- 		var i, l, srcElements, destElements,
 
- 			clone = elem.cloneNode( true ),
 
- 			inPage = isAttached( elem );
 
- 		// Fix IE cloning issues
 
- 		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
 
- 				!jQuery.isXMLDoc( elem ) ) {
 
- 			// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
 
- 			destElements = getAll( clone );
 
- 			srcElements = getAll( elem );
 
- 			for ( i = 0, l = srcElements.length; i < l; i++ ) {
 
- 				fixInput( srcElements[ i ], destElements[ i ] );
 
- 			}
 
- 		}
 
- 		// Copy the events from the original to the clone
 
- 		if ( dataAndEvents ) {
 
- 			if ( deepDataAndEvents ) {
 
- 				srcElements = srcElements || getAll( elem );
 
- 				destElements = destElements || getAll( clone );
 
- 				for ( i = 0, l = srcElements.length; i < l; i++ ) {
 
- 					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
 
- 				}
 
- 			} else {
 
- 				cloneCopyEvent( elem, clone );
 
- 			}
 
- 		}
 
- 		// Preserve script evaluation history
 
- 		destElements = getAll( clone, "script" );
 
- 		if ( destElements.length > 0 ) {
 
- 			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
 
- 		}
 
- 		// Return the cloned set
 
- 		return clone;
 
- 	},
 
- 	cleanData: function( elems ) {
 
- 		var data, elem, type,
 
- 			special = jQuery.event.special,
 
- 			i = 0;
 
- 		for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
 
- 			if ( acceptData( elem ) ) {
 
- 				if ( ( data = elem[ dataPriv.expando ] ) ) {
 
- 					if ( data.events ) {
 
- 						for ( type in data.events ) {
 
- 							if ( special[ type ] ) {
 
- 								jQuery.event.remove( elem, type );
 
- 							// This is a shortcut to avoid jQuery.event.remove's overhead
 
- 							} else {
 
- 								jQuery.removeEvent( elem, type, data.handle );
 
- 							}
 
- 						}
 
- 					}
 
- 					// Support: Chrome <=35 - 45+
 
- 					// Assign undefined instead of using delete, see Data#remove
 
- 					elem[ dataPriv.expando ] = undefined;
 
- 				}
 
- 				if ( elem[ dataUser.expando ] ) {
 
- 					// Support: Chrome <=35 - 45+
 
- 					// Assign undefined instead of using delete, see Data#remove
 
- 					elem[ dataUser.expando ] = undefined;
 
- 				}
 
- 			}
 
- 		}
 
- 	}
 
- } );
 
- jQuery.fn.extend( {
 
- 	detach: function( selector ) {
 
- 		return remove( this, selector, true );
 
- 	},
 
- 	remove: function( selector ) {
 
- 		return remove( this, selector );
 
- 	},
 
- 	text: function( value ) {
 
- 		return access( this, function( value ) {
 
- 			return value === undefined ?
 
- 				jQuery.text( this ) :
 
- 				this.empty().each( function() {
 
- 					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
 
- 						this.textContent = value;
 
- 					}
 
- 				} );
 
- 		}, null, value, arguments.length );
 
- 	},
 
- 	append: function() {
 
- 		return domManip( this, arguments, function( elem ) {
 
- 			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
 
- 				var target = manipulationTarget( this, elem );
 
- 				target.appendChild( elem );
 
- 			}
 
- 		} );
 
- 	},
 
- 	prepend: function() {
 
- 		return domManip( this, arguments, function( elem ) {
 
- 			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
 
- 				var target = manipulationTarget( this, elem );
 
- 				target.insertBefore( elem, target.firstChild );
 
- 			}
 
- 		} );
 
- 	},
 
- 	before: function() {
 
- 		return domManip( this, arguments, function( elem ) {
 
- 			if ( this.parentNode ) {
 
- 				this.parentNode.insertBefore( elem, this );
 
- 			}
 
- 		} );
 
- 	},
 
- 	after: function() {
 
- 		return domManip( this, arguments, function( elem ) {
 
- 			if ( this.parentNode ) {
 
- 				this.parentNode.insertBefore( elem, this.nextSibling );
 
- 			}
 
- 		} );
 
- 	},
 
- 	empty: function() {
 
- 		var elem,
 
- 			i = 0;
 
- 		for ( ; ( elem = this[ i ] ) != null; i++ ) {
 
- 			if ( elem.nodeType === 1 ) {
 
- 				// Prevent memory leaks
 
- 				jQuery.cleanData( getAll( elem, false ) );
 
- 				// Remove any remaining nodes
 
- 				elem.textContent = "";
 
- 			}
 
- 		}
 
- 		return this;
 
- 	},
 
- 	clone: function( dataAndEvents, deepDataAndEvents ) {
 
- 		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
 
- 		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
 
- 		return this.map( function() {
 
- 			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
 
- 		} );
 
- 	},
 
- 	html: function( value ) {
 
- 		return access( this, function( value ) {
 
- 			var elem = this[ 0 ] || {},
 
- 				i = 0,
 
- 				l = this.length;
 
- 			if ( value === undefined && elem.nodeType === 1 ) {
 
- 				return elem.innerHTML;
 
- 			}
 
- 			// See if we can take a shortcut and just use innerHTML
 
- 			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
 
- 				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
 
- 				value = jQuery.htmlPrefilter( value );
 
- 				try {
 
- 					for ( ; i < l; i++ ) {
 
- 						elem = this[ i ] || {};
 
- 						// Remove element nodes and prevent memory leaks
 
- 						if ( elem.nodeType === 1 ) {
 
- 							jQuery.cleanData( getAll( elem, false ) );
 
- 							elem.innerHTML = value;
 
- 						}
 
- 					}
 
- 					elem = 0;
 
- 				// If using innerHTML throws an exception, use the fallback method
 
- 				} catch ( e ) {}
 
- 			}
 
- 			if ( elem ) {
 
- 				this.empty().append( value );
 
- 			}
 
- 		}, null, value, arguments.length );
 
- 	},
 
- 	replaceWith: function() {
 
- 		var ignored = [];
 
- 		// Make the changes, replacing each non-ignored context element with the new content
 
- 		return domManip( this, arguments, function( elem ) {
 
- 			var parent = this.parentNode;
 
- 			if ( jQuery.inArray( this, ignored ) < 0 ) {
 
- 				jQuery.cleanData( getAll( this ) );
 
- 				if ( parent ) {
 
- 					parent.replaceChild( elem, this );
 
- 				}
 
- 			}
 
- 		// Force callback invocation
 
- 		}, ignored );
 
- 	}
 
- } );
 
- jQuery.each( {
 
- 	appendTo: "append",
 
- 	prependTo: "prepend",
 
- 	insertBefore: "before",
 
- 	insertAfter: "after",
 
- 	replaceAll: "replaceWith"
 
- }, function( name, original ) {
 
- 	jQuery.fn[ name ] = function( selector ) {
 
- 		var elems,
 
- 			ret = [],
 
- 			insert = jQuery( selector ),
 
- 			last = insert.length - 1,
 
- 			i = 0;
 
- 		for ( ; i <= last; i++ ) {
 
- 			elems = i === last ? this : this.clone( true );
 
- 			jQuery( insert[ i ] )[ original ]( elems );
 
- 			// Support: Android <=4.0 only, PhantomJS 1 only
 
- 			// .get() because push.apply(_, arraylike) throws on ancient WebKit
 
- 			push.apply( ret, elems.get() );
 
- 		}
 
- 		return this.pushStack( ret );
 
- 	};
 
- } );
 
- var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
 
- var getStyles = function( elem ) {
 
- 		// Support: IE <=11 only, Firefox <=30 (#15098, #14150)
 
- 		// IE throws on elements created in popups
 
- 		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
 
- 		var view = elem.ownerDocument.defaultView;
 
- 		if ( !view || !view.opener ) {
 
- 			view = window;
 
- 		}
 
- 		return view.getComputedStyle( elem );
 
- 	};
 
- var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
 
- ( function() {
 
- 	// Executing both pixelPosition & boxSizingReliable tests require only one layout
 
- 	// so they're executed at the same time to save the second computation.
 
- 	function computeStyleTests() {
 
- 		// This is a singleton, we need to execute it only once
 
- 		if ( !div ) {
 
- 			return;
 
- 		}
 
- 		container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
 
- 			"margin-top:1px;padding:0;border:0";
 
- 		div.style.cssText =
 
- 			"position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
 
- 			"margin:auto;border:1px;padding:1px;" +
 
- 			"width:60%;top:1%";
 
- 		documentElement.appendChild( container ).appendChild( div );
 
- 		var divStyle = window.getComputedStyle( div );
 
- 		pixelPositionVal = divStyle.top !== "1%";
 
- 		// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
 
- 		reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
 
- 		// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
 
- 		// Some styles come back with percentage values, even though they shouldn't
 
- 		div.style.right = "60%";
 
- 		pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
 
- 		// Support: IE 9 - 11 only
 
- 		// Detect misreporting of content dimensions for box-sizing:border-box elements
 
- 		boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
 
- 		// Support: IE 9 only
 
- 		// Detect overflow:scroll screwiness (gh-3699)
 
- 		// Support: Chrome <=64
 
- 		// Don't get tricked when zoom affects offsetWidth (gh-4029)
 
- 		div.style.position = "absolute";
 
- 		scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;
 
- 		documentElement.removeChild( container );
 
- 		// Nullify the div so it wouldn't be stored in the memory and
 
- 		// it will also be a sign that checks already performed
 
- 		div = null;
 
- 	}
 
- 	function roundPixelMeasures( measure ) {
 
- 		return Math.round( parseFloat( measure ) );
 
- 	}
 
- 	var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
 
- 		reliableMarginLeftVal,
 
- 		container = document.createElement( "div" ),
 
- 		div = document.createElement( "div" );
 
- 	// Finish early in limited (non-browser) environments
 
- 	if ( !div.style ) {
 
- 		return;
 
- 	}
 
- 	// Support: IE <=9 - 11 only
 
- 	// Style of cloned element affects source element cloned (#8908)
 
- 	div.style.backgroundClip = "content-box";
 
- 	div.cloneNode( true ).style.backgroundClip = "";
 
- 	support.clearCloneStyle = div.style.backgroundClip === "content-box";
 
- 	jQuery.extend( support, {
 
- 		boxSizingReliable: function() {
 
- 			computeStyleTests();
 
- 			return boxSizingReliableVal;
 
- 		},
 
- 		pixelBoxStyles: function() {
 
- 			computeStyleTests();
 
- 			return pixelBoxStylesVal;
 
- 		},
 
- 		pixelPosition: function() {
 
- 			computeStyleTests();
 
- 			return pixelPositionVal;
 
- 		},
 
- 		reliableMarginLeft: function() {
 
- 			computeStyleTests();
 
- 			return reliableMarginLeftVal;
 
- 		},
 
- 		scrollboxSize: function() {
 
- 			computeStyleTests();
 
- 			return scrollboxSizeVal;
 
- 		}
 
- 	} );
 
- } )();
 
- function curCSS( elem, name, computed ) {
 
- 	var width, minWidth, maxWidth, ret,
 
- 		// Support: Firefox 51+
 
- 		// Retrieving style before computed somehow
 
- 		// fixes an issue with getting wrong values
 
- 		// on detached elements
 
- 		style = elem.style;
 
- 	computed = computed || getStyles( elem );
 
- 	// getPropertyValue is needed for:
 
- 	//   .css('filter') (IE 9 only, #12537)
 
- 	//   .css('--customProperty) (#3144)
 
- 	if ( computed ) {
 
- 		ret = computed.getPropertyValue( name ) || computed[ name ];
 
- 		if ( ret === "" && !isAttached( elem ) ) {
 
- 			ret = jQuery.style( elem, name );
 
- 		}
 
- 		// A tribute to the "awesome hack by Dean Edwards"
 
- 		// Android Browser returns percentage for some values,
 
- 		// but width seems to be reliably pixels.
 
- 		// This is against the CSSOM draft spec:
 
- 		// https://drafts.csswg.org/cssom/#resolved-values
 
- 		if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
 
- 			// Remember the original values
 
- 			width = style.width;
 
- 			minWidth = style.minWidth;
 
- 			maxWidth = style.maxWidth;
 
- 			// Put in the new values to get a computed value out
 
- 			style.minWidth = style.maxWidth = style.width = ret;
 
- 			ret = computed.width;
 
- 			// Revert the changed values
 
- 			style.width = width;
 
- 			style.minWidth = minWidth;
 
- 			style.maxWidth = maxWidth;
 
- 		}
 
- 	}
 
- 	return ret !== undefined ?
 
- 		// Support: IE <=9 - 11 only
 
- 		// IE returns zIndex value as an integer.
 
- 		ret + "" :
 
- 		ret;
 
- }
 
- function addGetHookIf( conditionFn, hookFn ) {
 
- 	// Define the hook, we'll check on the first run if it's really needed.
 
- 	return {
 
- 		get: function() {
 
- 			if ( conditionFn() ) {
 
- 				// Hook not needed (or it's not possible to use it due
 
- 				// to missing dependency), remove it.
 
- 				delete this.get;
 
- 				return;
 
- 			}
 
- 			// Hook needed; redefine it so that the support test is not executed again.
 
- 			return ( this.get = hookFn ).apply( this, arguments );
 
- 		}
 
- 	};
 
- }
 
- var cssPrefixes = [ "Webkit", "Moz", "ms" ],
 
- 	emptyStyle = document.createElement( "div" ).style,
 
- 	vendorProps = {};
 
- // Return a vendor-prefixed property or undefined
 
- function vendorPropName( name ) {
 
- 	// Check for vendor prefixed names
 
- 	var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
 
- 		i = cssPrefixes.length;
 
- 	while ( i-- ) {
 
- 		name = cssPrefixes[ i ] + capName;
 
- 		if ( name in emptyStyle ) {
 
- 			return name;
 
- 		}
 
- 	}
 
- }
 
- // Return a potentially-mapped jQuery.cssProps or vendor prefixed property
 
- function finalPropName( name ) {
 
- 	var final = jQuery.cssProps[ name ] || vendorProps[ name ];
 
- 	if ( final ) {
 
- 		return final;
 
- 	}
 
- 	if ( name in emptyStyle ) {
 
- 		return name;
 
- 	}
 
- 	return vendorProps[ name ] = vendorPropName( name ) || name;
 
- }
 
- var
 
- 	// Swappable if display is none or starts with table
 
- 	// except "table", "table-cell", or "table-caption"
 
- 	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
 
- 	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
 
- 	rcustomProp = /^--/,
 
- 	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
 
- 	cssNormalTransform = {
 
- 		letterSpacing: "0",
 
- 		fontWeight: "400"
 
- 	};
 
- function setPositiveNumber( elem, value, subtract ) {
 
- 	// Any relative (+/-) values have already been
 
- 	// normalized at this point
 
- 	var matches = rcssNum.exec( value );
 
- 	return matches ?
 
- 		// Guard against undefined "subtract", e.g., when used as in cssHooks
 
- 		Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
 
- 		value;
 
- }
 
- function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
 
- 	var i = dimension === "width" ? 1 : 0,
 
- 		extra = 0,
 
- 		delta = 0;
 
- 	// Adjustment may not be necessary
 
- 	if ( box === ( isBorderBox ? "border" : "content" ) ) {
 
- 		return 0;
 
- 	}
 
- 	for ( ; i < 4; i += 2 ) {
 
- 		// Both box models exclude margin
 
- 		if ( box === "margin" ) {
 
- 			delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
 
- 		}
 
- 		// If we get here with a content-box, we're seeking "padding" or "border" or "margin"
 
- 		if ( !isBorderBox ) {
 
- 			// Add padding
 
- 			delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
 
- 			// For "border" or "margin", add border
 
- 			if ( box !== "padding" ) {
 
- 				delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
 
- 			// But still keep track of it otherwise
 
- 			} else {
 
- 				extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
 
- 			}
 
- 		// If we get here with a border-box (content + padding + border), we're seeking "content" or
 
- 		// "padding" or "margin"
 
- 		} else {
 
- 			// For "content", subtract padding
 
- 			if ( box === "content" ) {
 
- 				delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
 
- 			}
 
- 			// For "content" or "padding", subtract border
 
- 			if ( box !== "margin" ) {
 
- 				delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
 
- 			}
 
- 		}
 
- 	}
 
- 	// Account for positive content-box scroll gutter when requested by providing computedVal
 
- 	if ( !isBorderBox && computedVal >= 0 ) {
 
- 		// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
 
- 		// Assuming integer scroll gutter, subtract the rest and round down
 
- 		delta += Math.max( 0, Math.ceil(
 
- 			elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
 
- 			computedVal -
 
- 			delta -
 
- 			extra -
 
- 			0.5
 
- 		// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
 
- 		// Use an explicit zero to avoid NaN (gh-3964)
 
- 		) ) || 0;
 
- 	}
 
- 	return delta;
 
- }
 
- function getWidthOrHeight( elem, dimension, extra ) {
 
- 	// Start with computed style
 
- 	var styles = getStyles( elem ),
 
- 		// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
 
- 		// Fake content-box until we know it's needed to know the true value.
 
- 		boxSizingNeeded = !support.boxSizingReliable() || extra,
 
- 		isBorderBox = boxSizingNeeded &&
 
- 			jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
 
- 		valueIsBorderBox = isBorderBox,
 
- 		val = curCSS( elem, dimension, styles ),
 
- 		offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );
 
- 	// Support: Firefox <=54
 
- 	// Return a confounding non-pixel value or feign ignorance, as appropriate.
 
- 	if ( rnumnonpx.test( val ) ) {
 
- 		if ( !extra ) {
 
- 			return val;
 
- 		}
 
- 		val = "auto";
 
- 	}
 
- 	// Fall back to offsetWidth/offsetHeight when value is "auto"
 
- 	// This happens for inline elements with no explicit setting (gh-3571)
 
- 	// Support: Android <=4.1 - 4.3 only
 
- 	// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
 
- 	// Support: IE 9-11 only
 
- 	// Also use offsetWidth/offsetHeight for when box sizing is unreliable
 
- 	// We use getClientRects() to check for hidden/disconnected.
 
- 	// In those cases, the computed value can be trusted to be border-box
 
- 	if ( ( !support.boxSizingReliable() && isBorderBox ||
 
- 		val === "auto" ||
 
- 		!parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
 
- 		elem.getClientRects().length ) {
 
- 		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
 
- 		// Where available, offsetWidth/offsetHeight approximate border box dimensions.
 
- 		// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
 
- 		// retrieved value as a content box dimension.
 
- 		valueIsBorderBox = offsetProp in elem;
 
- 		if ( valueIsBorderBox ) {
 
- 			val = elem[ offsetProp ];
 
- 		}
 
- 	}
 
- 	// Normalize "" and auto
 
- 	val = parseFloat( val ) || 0;
 
- 	// Adjust for the element's box model
 
- 	return ( val +
 
- 		boxModelAdjustment(
 
- 			elem,
 
- 			dimension,
 
- 			extra || ( isBorderBox ? "border" : "content" ),
 
- 			valueIsBorderBox,
 
- 			styles,
 
- 			// Provide the current computed size to request scroll gutter calculation (gh-3589)
 
- 			val
 
- 		)
 
- 	) + "px";
 
- }
 
- jQuery.extend( {
 
- 	// Add in style property hooks for overriding the default
 
- 	// behavior of getting and setting a style property
 
- 	cssHooks: {
 
- 		opacity: {
 
- 			get: function( elem, computed ) {
 
- 				if ( computed ) {
 
- 					// We should always get a number back from opacity
 
- 					var ret = curCSS( elem, "opacity" );
 
- 					return ret === "" ? "1" : ret;
 
- 				}
 
- 			}
 
- 		}
 
- 	},
 
- 	// Don't automatically add "px" to these possibly-unitless properties
 
- 	cssNumber: {
 
- 		"animationIterationCount": true,
 
- 		"columnCount": true,
 
- 		"fillOpacity": true,
 
- 		"flexGrow": true,
 
- 		"flexShrink": true,
 
- 		"fontWeight": true,
 
- 		"gridArea": true,
 
- 		"gridColumn": true,
 
- 		"gridColumnEnd": true,
 
- 		"gridColumnStart": true,
 
- 		"gridRow": true,
 
- 		"gridRowEnd": true,
 
- 		"gridRowStart": true,
 
- 		"lineHeight": true,
 
- 		"opacity": true,
 
- 		"order": true,
 
- 		"orphans": true,
 
- 		"widows": true,
 
- 		"zIndex": true,
 
- 		"zoom": true
 
- 	},
 
- 	// Add in properties whose names you wish to fix before
 
- 	// setting or getting the value
 
- 	cssProps: {},
 
- 	// Get and set the style property on a DOM Node
 
- 	style: function( elem, name, value, extra ) {
 
- 		// Don't set styles on text and comment nodes
 
- 		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
 
- 			return;
 
- 		}
 
- 		// Make sure that we're working with the right name
 
- 		var ret, type, hooks,
 
- 			origName = camelCase( name ),
 
- 			isCustomProp = rcustomProp.test( name ),
 
- 			style = elem.style;
 
- 		// Make sure that we're working with the right name. We don't
 
- 		// want to query the value if it is a CSS custom property
 
- 		// since they are user-defined.
 
- 		if ( !isCustomProp ) {
 
- 			name = finalPropName( origName );
 
- 		}
 
- 		// Gets hook for the prefixed version, then unprefixed version
 
- 		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
 
- 		// Check if we're setting a value
 
- 		if ( value !== undefined ) {
 
- 			type = typeof value;
 
- 			// Convert "+=" or "-=" to relative numbers (#7345)
 
- 			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
 
- 				value = adjustCSS( elem, name, ret );
 
- 				// Fixes bug #9237
 
- 				type = "number";
 
- 			}
 
- 			// Make sure that null and NaN values aren't set (#7116)
 
- 			if ( value == null || value !== value ) {
 
- 				return;
 
- 			}
 
- 			// If a number was passed in, add the unit (except for certain CSS properties)
 
- 			// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
 
- 			// "px" to a few hardcoded values.
 
- 			if ( type === "number" && !isCustomProp ) {
 
- 				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
 
- 			}
 
- 			// background-* props affect original clone's values
 
- 			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
 
- 				style[ name ] = "inherit";
 
- 			}
 
- 			// If a hook was provided, use that value, otherwise just set the specified value
 
- 			if ( !hooks || !( "set" in hooks ) ||
 
- 				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
 
- 				if ( isCustomProp ) {
 
- 					style.setProperty( name, value );
 
- 				} else {
 
- 					style[ name ] = value;
 
- 				}
 
- 			}
 
- 		} else {
 
- 			// If a hook was provided get the non-computed value from there
 
- 			if ( hooks && "get" in hooks &&
 
- 				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
 
- 				return ret;
 
- 			}
 
- 			// Otherwise just get the value from the style object
 
- 			return style[ name ];
 
- 		}
 
- 	},
 
- 	css: function( elem, name, extra, styles ) {
 
- 		var val, num, hooks,
 
- 			origName = camelCase( name ),
 
- 			isCustomProp = rcustomProp.test( name );
 
- 		// Make sure that we're working with the right name. We don't
 
- 		// want to modify the value if it is a CSS custom property
 
- 		// since they are user-defined.
 
- 		if ( !isCustomProp ) {
 
- 			name = finalPropName( origName );
 
- 		}
 
- 		// Try prefixed name followed by the unprefixed name
 
- 		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
 
- 		// If a hook was provided get the computed value from there
 
- 		if ( hooks && "get" in hooks ) {
 
- 			val = hooks.get( elem, true, extra );
 
- 		}
 
- 		// Otherwise, if a way to get the computed value exists, use that
 
- 		if ( val === undefined ) {
 
- 			val = curCSS( elem, name, styles );
 
- 		}
 
- 		// Convert "normal" to computed value
 
- 		if ( val === "normal" && name in cssNormalTransform ) {
 
- 			val = cssNormalTransform[ name ];
 
- 		}
 
- 		// Make numeric if forced or a qualifier was provided and val looks numeric
 
- 		if ( extra === "" || extra ) {
 
- 			num = parseFloat( val );
 
- 			return extra === true || isFinite( num ) ? num || 0 : val;
 
- 		}
 
- 		return val;
 
- 	}
 
- } );
 
- jQuery.each( [ "height", "width" ], function( i, dimension ) {
 
- 	jQuery.cssHooks[ dimension ] = {
 
- 		get: function( elem, computed, extra ) {
 
- 			if ( computed ) {
 
- 				// Certain elements can have dimension info if we invisibly show them
 
- 				// but it must have a current display style that would benefit
 
- 				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
 
- 					// Support: Safari 8+
 
- 					// Table columns in Safari have non-zero offsetWidth & zero
 
- 					// getBoundingClientRect().width unless display is changed.
 
- 					// Support: IE <=11 only
 
- 					// Running getBoundingClientRect on a disconnected node
 
- 					// in IE throws an error.
 
- 					( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
 
- 						swap( elem, cssShow, function() {
 
- 							return getWidthOrHeight( elem, dimension, extra );
 
- 						} ) :
 
- 						getWidthOrHeight( elem, dimension, extra );
 
- 			}
 
- 		},
 
- 		set: function( elem, value, extra ) {
 
- 			var matches,
 
- 				styles = getStyles( elem ),
 
- 				// Only read styles.position if the test has a chance to fail
 
- 				// to avoid forcing a reflow.
 
- 				scrollboxSizeBuggy = !support.scrollboxSize() &&
 
- 					styles.position === "absolute",
 
- 				// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
 
- 				boxSizingNeeded = scrollboxSizeBuggy || extra,
 
- 				isBorderBox = boxSizingNeeded &&
 
- 					jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
 
- 				subtract = extra ?
 
- 					boxModelAdjustment(
 
- 						elem,
 
- 						dimension,
 
- 						extra,
 
- 						isBorderBox,
 
- 						styles
 
- 					) :
 
- 					0;
 
- 			// Account for unreliable border-box dimensions by comparing offset* to computed and
 
- 			// faking a content-box to get border and padding (gh-3699)
 
- 			if ( isBorderBox && scrollboxSizeBuggy ) {
 
- 				subtract -= Math.ceil(
 
- 					elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
 
- 					parseFloat( styles[ dimension ] ) -
 
- 					boxModelAdjustment( elem, dimension, "border", false, styles ) -
 
- 					0.5
 
- 				);
 
- 			}
 
- 			// Convert to pixels if value adjustment is needed
 
- 			if ( subtract && ( matches = rcssNum.exec( value ) ) &&
 
- 				( matches[ 3 ] || "px" ) !== "px" ) {
 
- 				elem.style[ dimension ] = value;
 
- 				value = jQuery.css( elem, dimension );
 
- 			}
 
- 			return setPositiveNumber( elem, value, subtract );
 
- 		}
 
- 	};
 
- } );
 
- jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
 
- 	function( elem, computed ) {
 
- 		if ( computed ) {
 
- 			return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
 
- 				elem.getBoundingClientRect().left -
 
- 					swap( elem, { marginLeft: 0 }, function() {
 
- 						return elem.getBoundingClientRect().left;
 
- 					} )
 
- 				) + "px";
 
- 		}
 
- 	}
 
- );
 
- // These hooks are used by animate to expand properties
 
- jQuery.each( {
 
- 	margin: "",
 
- 	padding: "",
 
- 	border: "Width"
 
- }, function( prefix, suffix ) {
 
- 	jQuery.cssHooks[ prefix + suffix ] = {
 
- 		expand: function( value ) {
 
- 			var i = 0,
 
- 				expanded = {},
 
- 				// Assumes a single number if not a string
 
- 				parts = typeof value === "string" ? value.split( " " ) : [ value ];
 
- 			for ( ; i < 4; i++ ) {
 
- 				expanded[ prefix + cssExpand[ i ] + suffix ] =
 
- 					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
 
- 			}
 
- 			return expanded;
 
- 		}
 
- 	};
 
- 	if ( prefix !== "margin" ) {
 
- 		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
 
- 	}
 
- } );
 
- jQuery.fn.extend( {
 
- 	css: function( name, value ) {
 
- 		return access( this, function( elem, name, value ) {
 
- 			var styles, len,
 
- 				map = {},
 
- 				i = 0;
 
- 			if ( Array.isArray( name ) ) {
 
- 				styles = getStyles( elem );
 
- 				len = name.length;
 
- 				for ( ; i < len; i++ ) {
 
- 					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
 
- 				}
 
- 				return map;
 
- 			}
 
- 			return value !== undefined ?
 
- 				jQuery.style( elem, name, value ) :
 
- 				jQuery.css( elem, name );
 
- 		}, name, value, arguments.length > 1 );
 
- 	}
 
- } );
 
- function Tween( elem, options, prop, end, easing ) {
 
- 	return new Tween.prototype.init( elem, options, prop, end, easing );
 
- }
 
- jQuery.Tween = Tween;
 
- Tween.prototype = {
 
- 	constructor: Tween,
 
- 	init: function( elem, options, prop, end, easing, unit ) {
 
- 		this.elem = elem;
 
- 		this.prop = prop;
 
- 		this.easing = easing || jQuery.easing._default;
 
- 		this.options = options;
 
- 		this.start = this.now = this.cur();
 
- 		this.end = end;
 
- 		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
 
- 	},
 
- 	cur: function() {
 
- 		var hooks = Tween.propHooks[ this.prop ];
 
- 		return hooks && hooks.get ?
 
- 			hooks.get( this ) :
 
- 			Tween.propHooks._default.get( this );
 
- 	},
 
- 	run: function( percent ) {
 
- 		var eased,
 
- 			hooks = Tween.propHooks[ this.prop ];
 
- 		if ( this.options.duration ) {
 
- 			this.pos = eased = jQuery.easing[ this.easing ](
 
- 				percent, this.options.duration * percent, 0, 1, this.options.duration
 
- 			);
 
- 		} else {
 
- 			this.pos = eased = percent;
 
- 		}
 
- 		this.now = ( this.end - this.start ) * eased + this.start;
 
- 		if ( this.options.step ) {
 
- 			this.options.step.call( this.elem, this.now, this );
 
- 		}
 
- 		if ( hooks && hooks.set ) {
 
- 			hooks.set( this );
 
- 		} else {
 
- 			Tween.propHooks._default.set( this );
 
- 		}
 
- 		return this;
 
- 	}
 
- };
 
- Tween.prototype.init.prototype = Tween.prototype;
 
- Tween.propHooks = {
 
- 	_default: {
 
- 		get: function( tween ) {
 
- 			var result;
 
- 			// Use a property on the element directly when it is not a DOM element,
 
- 			// or when there is no matching style property that exists.
 
- 			if ( tween.elem.nodeType !== 1 ||
 
- 				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
 
- 				return tween.elem[ tween.prop ];
 
- 			}
 
- 			// Passing an empty string as a 3rd parameter to .css will automatically
 
- 			// attempt a parseFloat and fallback to a string if the parse fails.
 
- 			// Simple values such as "10px" are parsed to Float;
 
- 			// complex values such as "rotate(1rad)" are returned as-is.
 
- 			result = jQuery.css( tween.elem, tween.prop, "" );
 
- 			// Empty strings, null, undefined and "auto" are converted to 0.
 
- 			return !result || result === "auto" ? 0 : result;
 
- 		},
 
- 		set: function( tween ) {
 
- 			// Use step hook for back compat.
 
- 			// Use cssHook if its there.
 
- 			// Use .style if available and use plain properties where available.
 
- 			if ( jQuery.fx.step[ tween.prop ] ) {
 
- 				jQuery.fx.step[ tween.prop ]( tween );
 
- 			} else if ( tween.elem.nodeType === 1 && (
 
- 					jQuery.cssHooks[ tween.prop ] ||
 
- 					tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
 
- 				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
 
- 			} else {
 
- 				tween.elem[ tween.prop ] = tween.now;
 
- 			}
 
- 		}
 
- 	}
 
- };
 
- // Support: IE <=9 only
 
- // Panic based approach to setting things on disconnected nodes
 
- Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
 
- 	set: function( tween ) {
 
- 		if ( tween.elem.nodeType && tween.elem.parentNode ) {
 
- 			tween.elem[ tween.prop ] = tween.now;
 
- 		}
 
- 	}
 
- };
 
- jQuery.easing = {
 
- 	linear: function( p ) {
 
- 		return p;
 
- 	},
 
- 	swing: function( p ) {
 
- 		return 0.5 - Math.cos( p * Math.PI ) / 2;
 
- 	},
 
- 	_default: "swing"
 
- };
 
- jQuery.fx = Tween.prototype.init;
 
- // Back compat <1.8 extension point
 
- jQuery.fx.step = {};
 
- var
 
- 	fxNow, inProgress,
 
- 	rfxtypes = /^(?:toggle|show|hide)$/,
 
- 	rrun = /queueHooks$/;
 
- function schedule() {
 
- 	if ( inProgress ) {
 
- 		if ( document.hidden === false && window.requestAnimationFrame ) {
 
- 			window.requestAnimationFrame( schedule );
 
- 		} else {
 
- 			window.setTimeout( schedule, jQuery.fx.interval );
 
- 		}
 
- 		jQuery.fx.tick();
 
- 	}
 
- }
 
- // Animations created synchronously will run synchronously
 
- function createFxNow() {
 
- 	window.setTimeout( function() {
 
- 		fxNow = undefined;
 
- 	} );
 
- 	return ( fxNow = Date.now() );
 
- }
 
- // Generate parameters to create a standard animation
 
- function genFx( type, includeWidth ) {
 
- 	var which,
 
- 		i = 0,
 
- 		attrs = { height: type };
 
- 	// If we include width, step value is 1 to do all cssExpand values,
 
- 	// otherwise step value is 2 to skip over Left and Right
 
- 	includeWidth = includeWidth ? 1 : 0;
 
- 	for ( ; i < 4; i += 2 - includeWidth ) {
 
- 		which = cssExpand[ i ];
 
- 		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
 
- 	}
 
- 	if ( includeWidth ) {
 
- 		attrs.opacity = attrs.width = type;
 
- 	}
 
- 	return attrs;
 
- }
 
- function createTween( value, prop, animation ) {
 
- 	var tween,
 
- 		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
 
- 		index = 0,
 
- 		length = collection.length;
 
- 	for ( ; index < length; index++ ) {
 
- 		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
 
- 			// We're done with this property
 
- 			return tween;
 
- 		}
 
- 	}
 
- }
 
- function defaultPrefilter( elem, props, opts ) {
 
- 	var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
 
- 		isBox = "width" in props || "height" in props,
 
- 		anim = this,
 
- 		orig = {},
 
- 		style = elem.style,
 
- 		hidden = elem.nodeType && isHiddenWithinTree( elem ),
 
- 		dataShow = dataPriv.get( elem, "fxshow" );
 
- 	// Queue-skipping animations hijack the fx hooks
 
- 	if ( !opts.queue ) {
 
- 		hooks = jQuery._queueHooks( elem, "fx" );
 
- 		if ( hooks.unqueued == null ) {
 
- 			hooks.unqueued = 0;
 
- 			oldfire = hooks.empty.fire;
 
- 			hooks.empty.fire = function() {
 
- 				if ( !hooks.unqueued ) {
 
- 					oldfire();
 
- 				}
 
- 			};
 
- 		}
 
- 		hooks.unqueued++;
 
- 		anim.always( function() {
 
- 			// Ensure the complete handler is called before this completes
 
- 			anim.always( function() {
 
- 				hooks.unqueued--;
 
- 				if ( !jQuery.queue( elem, "fx" ).length ) {
 
- 					hooks.empty.fire();
 
- 				}
 
- 			} );
 
- 		} );
 
- 	}
 
- 	// Detect show/hide animations
 
- 	for ( prop in props ) {
 
- 		value = props[ prop ];
 
- 		if ( rfxtypes.test( value ) ) {
 
- 			delete props[ prop ];
 
- 			toggle = toggle || value === "toggle";
 
- 			if ( value === ( hidden ? "hide" : "show" ) ) {
 
- 				// Pretend to be hidden if this is a "show" and
 
- 				// there is still data from a stopped show/hide
 
- 				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
 
- 					hidden = true;
 
- 				// Ignore all other no-op show/hide data
 
- 				} else {
 
- 					continue;
 
- 				}
 
- 			}
 
- 			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
 
- 		}
 
- 	}
 
- 	// Bail out if this is a no-op like .hide().hide()
 
- 	propTween = !jQuery.isEmptyObject( props );
 
- 	if ( !propTween && jQuery.isEmptyObject( orig ) ) {
 
- 		return;
 
- 	}
 
- 	// Restrict "overflow" and "display" styles during box animations
 
- 	if ( isBox && elem.nodeType === 1 ) {
 
- 		// Support: IE <=9 - 11, Edge 12 - 15
 
- 		// Record all 3 overflow attributes because IE does not infer the shorthand
 
- 		// from identically-valued overflowX and overflowY and Edge just mirrors
 
- 		// the overflowX value there.
 
- 		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
 
- 		// Identify a display type, preferring old show/hide data over the CSS cascade
 
- 		restoreDisplay = dataShow && dataShow.display;
 
- 		if ( restoreDisplay == null ) {
 
- 			restoreDisplay = dataPriv.get( elem, "display" );
 
- 		}
 
- 		display = jQuery.css( elem, "display" );
 
- 		if ( display === "none" ) {
 
- 			if ( restoreDisplay ) {
 
- 				display = restoreDisplay;
 
- 			} else {
 
- 				// Get nonempty value(s) by temporarily forcing visibility
 
- 				showHide( [ elem ], true );
 
- 				restoreDisplay = elem.style.display || restoreDisplay;
 
- 				display = jQuery.css( elem, "display" );
 
- 				showHide( [ elem ] );
 
- 			}
 
- 		}
 
- 		// Animate inline elements as inline-block
 
- 		if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
 
- 			if ( jQuery.css( elem, "float" ) === "none" ) {
 
- 				// Restore the original display value at the end of pure show/hide animations
 
- 				if ( !propTween ) {
 
- 					anim.done( function() {
 
- 						style.display = restoreDisplay;
 
- 					} );
 
- 					if ( restoreDisplay == null ) {
 
- 						display = style.display;
 
- 						restoreDisplay = display === "none" ? "" : display;
 
- 					}
 
- 				}
 
- 				style.display = "inline-block";
 
- 			}
 
- 		}
 
- 	}
 
- 	if ( opts.overflow ) {
 
- 		style.overflow = "hidden";
 
- 		anim.always( function() {
 
- 			style.overflow = opts.overflow[ 0 ];
 
- 			style.overflowX = opts.overflow[ 1 ];
 
- 			style.overflowY = opts.overflow[ 2 ];
 
- 		} );
 
- 	}
 
- 	// Implement show/hide animations
 
- 	propTween = false;
 
- 	for ( prop in orig ) {
 
- 		// General show/hide setup for this element animation
 
- 		if ( !propTween ) {
 
- 			if ( dataShow ) {
 
- 				if ( "hidden" in dataShow ) {
 
- 					hidden = dataShow.hidden;
 
- 				}
 
- 			} else {
 
- 				dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
 
- 			}
 
- 			// Store hidden/visible for toggle so `.stop().toggle()` "reverses"
 
- 			if ( toggle ) {
 
- 				dataShow.hidden = !hidden;
 
- 			}
 
- 			// Show elements before animating them
 
- 			if ( hidden ) {
 
- 				showHide( [ elem ], true );
 
- 			}
 
- 			/* eslint-disable no-loop-func */
 
- 			anim.done( function() {
 
- 			/* eslint-enable no-loop-func */
 
- 				// The final step of a "hide" animation is actually hiding the element
 
- 				if ( !hidden ) {
 
- 					showHide( [ elem ] );
 
- 				}
 
- 				dataPriv.remove( elem, "fxshow" );
 
- 				for ( prop in orig ) {
 
- 					jQuery.style( elem, prop, orig[ prop ] );
 
- 				}
 
- 			} );
 
- 		}
 
- 		// Per-property setup
 
- 		propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
 
- 		if ( !( prop in dataShow ) ) {
 
- 			dataShow[ prop ] = propTween.start;
 
- 			if ( hidden ) {
 
- 				propTween.end = propTween.start;
 
- 				propTween.start = 0;
 
- 			}
 
- 		}
 
- 	}
 
- }
 
- function propFilter( props, specialEasing ) {
 
- 	var index, name, easing, value, hooks;
 
- 	// camelCase, specialEasing and expand cssHook pass
 
- 	for ( index in props ) {
 
- 		name = camelCase( index );
 
- 		easing = specialEasing[ name ];
 
- 		value = props[ index ];
 
- 		if ( Array.isArray( value ) ) {
 
- 			easing = value[ 1 ];
 
- 			value = props[ index ] = value[ 0 ];
 
- 		}
 
- 		if ( index !== name ) {
 
- 			props[ name ] = value;
 
- 			delete props[ index ];
 
- 		}
 
- 		hooks = jQuery.cssHooks[ name ];
 
- 		if ( hooks && "expand" in hooks ) {
 
- 			value = hooks.expand( value );
 
- 			delete props[ name ];
 
- 			// Not quite $.extend, this won't overwrite existing keys.
 
- 			// Reusing 'index' because we have the correct "name"
 
- 			for ( index in value ) {
 
- 				if ( !( index in props ) ) {
 
- 					props[ index ] = value[ index ];
 
- 					specialEasing[ index ] = easing;
 
- 				}
 
- 			}
 
- 		} else {
 
- 			specialEasing[ name ] = easing;
 
- 		}
 
- 	}
 
- }
 
- function Animation( elem, properties, options ) {
 
- 	var result,
 
- 		stopped,
 
- 		index = 0,
 
- 		length = Animation.prefilters.length,
 
- 		deferred = jQuery.Deferred().always( function() {
 
- 			// Don't match elem in the :animated selector
 
- 			delete tick.elem;
 
- 		} ),
 
- 		tick = function() {
 
- 			if ( stopped ) {
 
- 				return false;
 
- 			}
 
- 			var currentTime = fxNow || createFxNow(),
 
- 				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
 
- 				// Support: Android 2.3 only
 
- 				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
 
- 				temp = remaining / animation.duration || 0,
 
- 				percent = 1 - temp,
 
- 				index = 0,
 
- 				length = animation.tweens.length;
 
- 			for ( ; index < length; index++ ) {
 
- 				animation.tweens[ index ].run( percent );
 
- 			}
 
- 			deferred.notifyWith( elem, [ animation, percent, remaining ] );
 
- 			// If there's more to do, yield
 
- 			if ( percent < 1 && length ) {
 
- 				return remaining;
 
- 			}
 
- 			// If this was an empty animation, synthesize a final progress notification
 
- 			if ( !length ) {
 
- 				deferred.notifyWith( elem, [ animation, 1, 0 ] );
 
- 			}
 
- 			// Resolve the animation and report its conclusion
 
- 			deferred.resolveWith( elem, [ animation ] );
 
- 			return false;
 
- 		},
 
- 		animation = deferred.promise( {
 
- 			elem: elem,
 
- 			props: jQuery.extend( {}, properties ),
 
- 			opts: jQuery.extend( true, {
 
- 				specialEasing: {},
 
- 				easing: jQuery.easing._default
 
- 			}, options ),
 
- 			originalProperties: properties,
 
- 			originalOptions: options,
 
- 			startTime: fxNow || createFxNow(),
 
- 			duration: options.duration,
 
- 			tweens: [],
 
- 			createTween: function( prop, end ) {
 
- 				var tween = jQuery.Tween( elem, animation.opts, prop, end,
 
- 						animation.opts.specialEasing[ prop ] || animation.opts.easing );
 
- 				animation.tweens.push( tween );
 
- 				return tween;
 
- 			},
 
- 			stop: function( gotoEnd ) {
 
- 				var index = 0,
 
- 					// If we are going to the end, we want to run all the tweens
 
- 					// otherwise we skip this part
 
- 					length = gotoEnd ? animation.tweens.length : 0;
 
- 				if ( stopped ) {
 
- 					return this;
 
- 				}
 
- 				stopped = true;
 
- 				for ( ; index < length; index++ ) {
 
- 					animation.tweens[ index ].run( 1 );
 
- 				}
 
- 				// Resolve when we played the last frame; otherwise, reject
 
- 				if ( gotoEnd ) {
 
- 					deferred.notifyWith( elem, [ animation, 1, 0 ] );
 
- 					deferred.resolveWith( elem, [ animation, gotoEnd ] );
 
- 				} else {
 
- 					deferred.rejectWith( elem, [ animation, gotoEnd ] );
 
- 				}
 
- 				return this;
 
- 			}
 
- 		} ),
 
- 		props = animation.props;
 
- 	propFilter( props, animation.opts.specialEasing );
 
- 	for ( ; index < length; index++ ) {
 
- 		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
 
- 		if ( result ) {
 
- 			if ( isFunction( result.stop ) ) {
 
- 				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
 
- 					result.stop.bind( result );
 
- 			}
 
- 			return result;
 
- 		}
 
- 	}
 
- 	jQuery.map( props, createTween, animation );
 
- 	if ( isFunction( animation.opts.start ) ) {
 
- 		animation.opts.start.call( elem, animation );
 
- 	}
 
- 	// Attach callbacks from options
 
- 	animation
 
- 		.progress( animation.opts.progress )
 
- 		.done( animation.opts.done, animation.opts.complete )
 
- 		.fail( animation.opts.fail )
 
- 		.always( animation.opts.always );
 
- 	jQuery.fx.timer(
 
- 		jQuery.extend( tick, {
 
- 			elem: elem,
 
- 			anim: animation,
 
- 			queue: animation.opts.queue
 
- 		} )
 
- 	);
 
- 	return animation;
 
- }
 
- jQuery.Animation = jQuery.extend( Animation, {
 
- 	tweeners: {
 
- 		"*": [ function( prop, value ) {
 
- 			var tween = this.createTween( prop, value );
 
- 			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
 
- 			return tween;
 
- 		} ]
 
- 	},
 
- 	tweener: function( props, callback ) {
 
- 		if ( isFunction( props ) ) {
 
- 			callback = props;
 
- 			props = [ "*" ];
 
- 		} else {
 
- 			props = props.match( rnothtmlwhite );
 
- 		}
 
- 		var prop,
 
- 			index = 0,
 
- 			length = props.length;
 
- 		for ( ; index < length; index++ ) {
 
- 			prop = props[ index ];
 
- 			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
 
- 			Animation.tweeners[ prop ].unshift( callback );
 
- 		}
 
- 	},
 
- 	prefilters: [ defaultPrefilter ],
 
- 	prefilter: function( callback, prepend ) {
 
- 		if ( prepend ) {
 
- 			Animation.prefilters.unshift( callback );
 
- 		} else {
 
- 			Animation.prefilters.push( callback );
 
- 		}
 
- 	}
 
- } );
 
- jQuery.speed = function( speed, easing, fn ) {
 
- 	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
 
- 		complete: fn || !fn && easing ||
 
- 			isFunction( speed ) && speed,
 
- 		duration: speed,
 
- 		easing: fn && easing || easing && !isFunction( easing ) && easing
 
- 	};
 
- 	// Go to the end state if fx are off
 
- 	if ( jQuery.fx.off ) {
 
- 		opt.duration = 0;
 
- 	} else {
 
- 		if ( typeof opt.duration !== "number" ) {
 
- 			if ( opt.duration in jQuery.fx.speeds ) {
 
- 				opt.duration = jQuery.fx.speeds[ opt.duration ];
 
- 			} else {
 
- 				opt.duration = jQuery.fx.speeds._default;
 
- 			}
 
- 		}
 
- 	}
 
- 	// Normalize opt.queue - true/undefined/null -> "fx"
 
- 	if ( opt.queue == null || opt.queue === true ) {
 
- 		opt.queue = "fx";
 
- 	}
 
- 	// Queueing
 
- 	opt.old = opt.complete;
 
- 	opt.complete = function() {
 
- 		if ( isFunction( opt.old ) ) {
 
- 			opt.old.call( this );
 
- 		}
 
- 		if ( opt.queue ) {
 
- 			jQuery.dequeue( this, opt.queue );
 
- 		}
 
- 	};
 
- 	return opt;
 
- };
 
- jQuery.fn.extend( {
 
- 	fadeTo: function( speed, to, easing, callback ) {
 
- 		// Show any hidden elements after setting opacity to 0
 
- 		return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
 
- 			// Animate to the value specified
 
- 			.end().animate( { opacity: to }, speed, easing, callback );
 
- 	},
 
- 	animate: function( prop, speed, easing, callback ) {
 
- 		var empty = jQuery.isEmptyObject( prop ),
 
- 			optall = jQuery.speed( speed, easing, callback ),
 
- 			doAnimation = function() {
 
- 				// Operate on a copy of prop so per-property easing won't be lost
 
- 				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
 
- 				// Empty animations, or finishing resolves immediately
 
- 				if ( empty || dataPriv.get( this, "finish" ) ) {
 
- 					anim.stop( true );
 
- 				}
 
- 			};
 
- 			doAnimation.finish = doAnimation;
 
- 		return empty || optall.queue === false ?
 
- 			this.each( doAnimation ) :
 
- 			this.queue( optall.queue, doAnimation );
 
- 	},
 
- 	stop: function( type, clearQueue, gotoEnd ) {
 
- 		var stopQueue = function( hooks ) {
 
- 			var stop = hooks.stop;
 
- 			delete hooks.stop;
 
- 			stop( gotoEnd );
 
- 		};
 
- 		if ( typeof type !== "string" ) {
 
- 			gotoEnd = clearQueue;
 
- 			clearQueue = type;
 
- 			type = undefined;
 
- 		}
 
- 		if ( clearQueue && type !== false ) {
 
- 			this.queue( type || "fx", [] );
 
- 		}
 
- 		return this.each( function() {
 
- 			var dequeue = true,
 
- 				index = type != null && type + "queueHooks",
 
- 				timers = jQuery.timers,
 
- 				data = dataPriv.get( this );
 
- 			if ( index ) {
 
- 				if ( data[ index ] && data[ index ].stop ) {
 
- 					stopQueue( data[ index ] );
 
- 				}
 
- 			} else {
 
- 				for ( index in data ) {
 
- 					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
 
- 						stopQueue( data[ index ] );
 
- 					}
 
- 				}
 
- 			}
 
- 			for ( index = timers.length; index--; ) {
 
- 				if ( timers[ index ].elem === this &&
 
- 					( type == null || timers[ index ].queue === type ) ) {
 
- 					timers[ index ].anim.stop( gotoEnd );
 
- 					dequeue = false;
 
- 					timers.splice( index, 1 );
 
- 				}
 
- 			}
 
- 			// Start the next in the queue if the last step wasn't forced.
 
- 			// Timers currently will call their complete callbacks, which
 
- 			// will dequeue but only if they were gotoEnd.
 
- 			if ( dequeue || !gotoEnd ) {
 
- 				jQuery.dequeue( this, type );
 
- 			}
 
- 		} );
 
- 	},
 
- 	finish: function( type ) {
 
- 		if ( type !== false ) {
 
- 			type = type || "fx";
 
- 		}
 
- 		return this.each( function() {
 
- 			var index,
 
- 				data = dataPriv.get( this ),
 
- 				queue = data[ type + "queue" ],
 
- 				hooks = data[ type + "queueHooks" ],
 
- 				timers = jQuery.timers,
 
- 				length = queue ? queue.length : 0;
 
- 			// Enable finishing flag on private data
 
- 			data.finish = true;
 
- 			// Empty the queue first
 
- 			jQuery.queue( this, type, [] );
 
- 			if ( hooks && hooks.stop ) {
 
- 				hooks.stop.call( this, true );
 
- 			}
 
- 			// Look for any active animations, and finish them
 
- 			for ( index = timers.length; index--; ) {
 
- 				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
 
- 					timers[ index ].anim.stop( true );
 
- 					timers.splice( index, 1 );
 
- 				}
 
- 			}
 
- 			// Look for any animations in the old queue and finish them
 
- 			for ( index = 0; index < length; index++ ) {
 
- 				if ( queue[ index ] && queue[ index ].finish ) {
 
- 					queue[ index ].finish.call( this );
 
- 				}
 
- 			}
 
- 			// Turn off finishing flag
 
- 			delete data.finish;
 
- 		} );
 
- 	}
 
- } );
 
- jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
 
- 	var cssFn = jQuery.fn[ name ];
 
- 	jQuery.fn[ name ] = function( speed, easing, callback ) {
 
- 		return speed == null || typeof speed === "boolean" ?
 
- 			cssFn.apply( this, arguments ) :
 
- 			this.animate( genFx( name, true ), speed, easing, callback );
 
- 	};
 
- } );
 
- // Generate shortcuts for custom animations
 
- jQuery.each( {
 
- 	slideDown: genFx( "show" ),
 
- 	slideUp: genFx( "hide" ),
 
- 	slideToggle: genFx( "toggle" ),
 
- 	fadeIn: { opacity: "show" },
 
- 	fadeOut: { opacity: "hide" },
 
- 	fadeToggle: { opacity: "toggle" }
 
- }, function( name, props ) {
 
- 	jQuery.fn[ name ] = function( speed, easing, callback ) {
 
- 		return this.animate( props, speed, easing, callback );
 
- 	};
 
- } );
 
- jQuery.timers = [];
 
- jQuery.fx.tick = function() {
 
- 	var timer,
 
- 		i = 0,
 
- 		timers = jQuery.timers;
 
- 	fxNow = Date.now();
 
- 	for ( ; i < timers.length; i++ ) {
 
- 		timer = timers[ i ];
 
- 		// Run the timer and safely remove it when done (allowing for external removal)
 
- 		if ( !timer() && timers[ i ] === timer ) {
 
- 			timers.splice( i--, 1 );
 
- 		}
 
- 	}
 
- 	if ( !timers.length ) {
 
- 		jQuery.fx.stop();
 
- 	}
 
- 	fxNow = undefined;
 
- };
 
- jQuery.fx.timer = function( timer ) {
 
- 	jQuery.timers.push( timer );
 
- 	jQuery.fx.start();
 
- };
 
- jQuery.fx.interval = 13;
 
- jQuery.fx.start = function() {
 
- 	if ( inProgress ) {
 
- 		return;
 
- 	}
 
- 	inProgress = true;
 
- 	schedule();
 
- };
 
- jQuery.fx.stop = function() {
 
- 	inProgress = null;
 
- };
 
- jQuery.fx.speeds = {
 
- 	slow: 600,
 
- 	fast: 200,
 
- 	// Default speed
 
- 	_default: 400
 
- };
 
- // Based off of the plugin by Clint Helfers, with permission.
 
- // https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
 
- jQuery.fn.delay = function( time, type ) {
 
- 	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
 
- 	type = type || "fx";
 
- 	return this.queue( type, function( next, hooks ) {
 
- 		var timeout = window.setTimeout( next, time );
 
- 		hooks.stop = function() {
 
- 			window.clearTimeout( timeout );
 
- 		};
 
- 	} );
 
- };
 
- ( function() {
 
- 	var input = document.createElement( "input" ),
 
- 		select = document.createElement( "select" ),
 
- 		opt = select.appendChild( document.createElement( "option" ) );
 
- 	input.type = "checkbox";
 
- 	// Support: Android <=4.3 only
 
- 	// Default value for a checkbox should be "on"
 
- 	support.checkOn = input.value !== "";
 
- 	// Support: IE <=11 only
 
- 	// Must access selectedIndex to make default options select
 
- 	support.optSelected = opt.selected;
 
- 	// Support: IE <=11 only
 
- 	// An input loses its value after becoming a radio
 
- 	input = document.createElement( "input" );
 
- 	input.value = "t";
 
- 	input.type = "radio";
 
- 	support.radioValue = input.value === "t";
 
- } )();
 
- var boolHook,
 
- 	attrHandle = jQuery.expr.attrHandle;
 
- jQuery.fn.extend( {
 
- 	attr: function( name, value ) {
 
- 		return access( this, jQuery.attr, name, value, arguments.length > 1 );
 
- 	},
 
- 	removeAttr: function( name ) {
 
- 		return this.each( function() {
 
- 			jQuery.removeAttr( this, name );
 
- 		} );
 
- 	}
 
- } );
 
- jQuery.extend( {
 
- 	attr: function( elem, name, value ) {
 
- 		var ret, hooks,
 
- 			nType = elem.nodeType;
 
- 		// Don't get/set attributes on text, comment and attribute nodes
 
- 		if ( nType === 3 || nType === 8 || nType === 2 ) {
 
- 			return;
 
- 		}
 
- 		// Fallback to prop when attributes are not supported
 
- 		if ( typeof elem.getAttribute === "undefined" ) {
 
- 			return jQuery.prop( elem, name, value );
 
- 		}
 
- 		// Attribute hooks are determined by the lowercase version
 
- 		// Grab necessary hook if one is defined
 
- 		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
 
- 			hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
 
- 				( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
 
- 		}
 
- 		if ( value !== undefined ) {
 
- 			if ( value === null ) {
 
- 				jQuery.removeAttr( elem, name );
 
- 				return;
 
- 			}
 
- 			if ( hooks && "set" in hooks &&
 
- 				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
 
- 				return ret;
 
- 			}
 
- 			elem.setAttribute( name, value + "" );
 
- 			return value;
 
- 		}
 
- 		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
 
- 			return ret;
 
- 		}
 
- 		ret = jQuery.find.attr( elem, name );
 
- 		// Non-existent attributes return null, we normalize to undefined
 
- 		return ret == null ? undefined : ret;
 
- 	},
 
- 	attrHooks: {
 
- 		type: {
 
- 			set: function( elem, value ) {
 
- 				if ( !support.radioValue && value === "radio" &&
 
- 					nodeName( elem, "input" ) ) {
 
- 					var val = elem.value;
 
- 					elem.setAttribute( "type", value );
 
- 					if ( val ) {
 
- 						elem.value = val;
 
- 					}
 
- 					return value;
 
- 				}
 
- 			}
 
- 		}
 
- 	},
 
- 	removeAttr: function( elem, value ) {
 
- 		var name,
 
- 			i = 0,
 
- 			// Attribute names can contain non-HTML whitespace characters
 
- 			// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
 
- 			attrNames = value && value.match( rnothtmlwhite );
 
- 		if ( attrNames && elem.nodeType === 1 ) {
 
- 			while ( ( name = attrNames[ i++ ] ) ) {
 
- 				elem.removeAttribute( name );
 
- 			}
 
- 		}
 
- 	}
 
- } );
 
- // Hooks for boolean attributes
 
- boolHook = {
 
- 	set: function( elem, value, name ) {
 
- 		if ( value === false ) {
 
- 			// Remove boolean attributes when set to false
 
- 			jQuery.removeAttr( elem, name );
 
- 		} else {
 
- 			elem.setAttribute( name, name );
 
- 		}
 
- 		return name;
 
- 	}
 
- };
 
- jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
 
- 	var getter = attrHandle[ name ] || jQuery.find.attr;
 
- 	attrHandle[ name ] = function( elem, name, isXML ) {
 
- 		var ret, handle,
 
- 			lowercaseName = name.toLowerCase();
 
- 		if ( !isXML ) {
 
- 			// Avoid an infinite loop by temporarily removing this function from the getter
 
- 			handle = attrHandle[ lowercaseName ];
 
- 			attrHandle[ lowercaseName ] = ret;
 
- 			ret = getter( elem, name, isXML ) != null ?
 
- 				lowercaseName :
 
- 				null;
 
- 			attrHandle[ lowercaseName ] = handle;
 
- 		}
 
- 		return ret;
 
- 	};
 
- } );
 
- var rfocusable = /^(?:input|select|textarea|button)$/i,
 
- 	rclickable = /^(?:a|area)$/i;
 
- jQuery.fn.extend( {
 
- 	prop: function( name, value ) {
 
- 		return access( this, jQuery.prop, name, value, arguments.length > 1 );
 
- 	},
 
- 	removeProp: function( name ) {
 
- 		return this.each( function() {
 
- 			delete this[ jQuery.propFix[ name ] || name ];
 
- 		} );
 
- 	}
 
- } );
 
- jQuery.extend( {
 
- 	prop: function( elem, name, value ) {
 
- 		var ret, hooks,
 
- 			nType = elem.nodeType;
 
- 		// Don't get/set properties on text, comment and attribute nodes
 
- 		if ( nType === 3 || nType === 8 || nType === 2 ) {
 
- 			return;
 
- 		}
 
- 		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
 
- 			// Fix name and attach hooks
 
- 			name = jQuery.propFix[ name ] || name;
 
- 			hooks = jQuery.propHooks[ name ];
 
- 		}
 
- 		if ( value !== undefined ) {
 
- 			if ( hooks && "set" in hooks &&
 
- 				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
 
- 				return ret;
 
- 			}
 
- 			return ( elem[ name ] = value );
 
- 		}
 
- 		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
 
- 			return ret;
 
- 		}
 
- 		return elem[ name ];
 
- 	},
 
- 	propHooks: {
 
- 		tabIndex: {
 
- 			get: function( elem ) {
 
- 				// Support: IE <=9 - 11 only
 
- 				// elem.tabIndex doesn't always return the
 
- 				// correct value when it hasn't been explicitly set
 
- 				// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
 
- 				// Use proper attribute retrieval(#12072)
 
- 				var tabindex = jQuery.find.attr( elem, "tabindex" );
 
- 				if ( tabindex ) {
 
- 					return parseInt( tabindex, 10 );
 
- 				}
 
- 				if (
 
- 					rfocusable.test( elem.nodeName ) ||
 
- 					rclickable.test( elem.nodeName ) &&
 
- 					elem.href
 
- 				) {
 
- 					return 0;
 
- 				}
 
- 				return -1;
 
- 			}
 
- 		}
 
- 	},
 
- 	propFix: {
 
- 		"for": "htmlFor",
 
- 		"class": "className"
 
- 	}
 
- } );
 
- // Support: IE <=11 only
 
- // Accessing the selectedIndex property
 
- // forces the browser to respect setting selected
 
- // on the option
 
- // The getter ensures a default option is selected
 
- // when in an optgroup
 
- // eslint rule "no-unused-expressions" is disabled for this code
 
- // since it considers such accessions noop
 
- if ( !support.optSelected ) {
 
- 	jQuery.propHooks.selected = {
 
- 		get: function( elem ) {
 
- 			/* eslint no-unused-expressions: "off" */
 
- 			var parent = elem.parentNode;
 
- 			if ( parent && parent.parentNode ) {
 
- 				parent.parentNode.selectedIndex;
 
- 			}
 
- 			return null;
 
- 		},
 
- 		set: function( elem ) {
 
- 			/* eslint no-unused-expressions: "off" */
 
- 			var parent = elem.parentNode;
 
- 			if ( parent ) {
 
- 				parent.selectedIndex;
 
- 				if ( parent.parentNode ) {
 
- 					parent.parentNode.selectedIndex;
 
- 				}
 
- 			}
 
- 		}
 
- 	};
 
- }
 
- jQuery.each( [
 
- 	"tabIndex",
 
- 	"readOnly",
 
- 	"maxLength",
 
- 	"cellSpacing",
 
- 	"cellPadding",
 
- 	"rowSpan",
 
- 	"colSpan",
 
- 	"useMap",
 
- 	"frameBorder",
 
- 	"contentEditable"
 
- ], function() {
 
- 	jQuery.propFix[ this.toLowerCase() ] = this;
 
- } );
 
- 	// Strip and collapse whitespace according to HTML spec
 
- 	// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
 
- 	function stripAndCollapse( value ) {
 
- 		var tokens = value.match( rnothtmlwhite ) || [];
 
- 		return tokens.join( " " );
 
- 	}
 
- function getClass( elem ) {
 
- 	return elem.getAttribute && elem.getAttribute( "class" ) || "";
 
- }
 
- function classesToArray( value ) {
 
- 	if ( Array.isArray( value ) ) {
 
- 		return value;
 
- 	}
 
- 	if ( typeof value === "string" ) {
 
- 		return value.match( rnothtmlwhite ) || [];
 
- 	}
 
- 	return [];
 
- }
 
- jQuery.fn.extend( {
 
- 	addClass: function( value ) {
 
- 		var classes, elem, cur, curValue, clazz, j, finalValue,
 
- 			i = 0;
 
- 		if ( isFunction( value ) ) {
 
- 			return this.each( function( j ) {
 
- 				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
 
- 			} );
 
- 		}
 
- 		classes = classesToArray( value );
 
- 		if ( classes.length ) {
 
- 			while ( ( elem = this[ i++ ] ) ) {
 
- 				curValue = getClass( elem );
 
- 				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
 
- 				if ( cur ) {
 
- 					j = 0;
 
- 					while ( ( clazz = classes[ j++ ] ) ) {
 
- 						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
 
- 							cur += clazz + " ";
 
- 						}
 
- 					}
 
- 					// Only assign if different to avoid unneeded rendering.
 
- 					finalValue = stripAndCollapse( cur );
 
- 					if ( curValue !== finalValue ) {
 
- 						elem.setAttribute( "class", finalValue );
 
- 					}
 
- 				}
 
- 			}
 
- 		}
 
- 		return this;
 
- 	},
 
- 	removeClass: function( value ) {
 
- 		var classes, elem, cur, curValue, clazz, j, finalValue,
 
- 			i = 0;
 
- 		if ( isFunction( value ) ) {
 
- 			return this.each( function( j ) {
 
- 				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
 
- 			} );
 
- 		}
 
- 		if ( !arguments.length ) {
 
- 			return this.attr( "class", "" );
 
- 		}
 
- 		classes = classesToArray( value );
 
- 		if ( classes.length ) {
 
- 			while ( ( elem = this[ i++ ] ) ) {
 
- 				curValue = getClass( elem );
 
- 				// This expression is here for better compressibility (see addClass)
 
- 				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
 
- 				if ( cur ) {
 
- 					j = 0;
 
- 					while ( ( clazz = classes[ j++ ] ) ) {
 
- 						// Remove *all* instances
 
- 						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
 
- 							cur = cur.replace( " " + clazz + " ", " " );
 
- 						}
 
- 					}
 
- 					// Only assign if different to avoid unneeded rendering.
 
- 					finalValue = stripAndCollapse( cur );
 
- 					if ( curValue !== finalValue ) {
 
- 						elem.setAttribute( "class", finalValue );
 
- 					}
 
- 				}
 
- 			}
 
- 		}
 
- 		return this;
 
- 	},
 
- 	toggleClass: function( value, stateVal ) {
 
- 		var type = typeof value,
 
- 			isValidValue = type === "string" || Array.isArray( value );
 
- 		if ( typeof stateVal === "boolean" && isValidValue ) {
 
- 			return stateVal ? this.addClass( value ) : this.removeClass( value );
 
- 		}
 
- 		if ( isFunction( value ) ) {
 
- 			return this.each( function( i ) {
 
- 				jQuery( this ).toggleClass(
 
- 					value.call( this, i, getClass( this ), stateVal ),
 
- 					stateVal
 
- 				);
 
- 			} );
 
- 		}
 
- 		return this.each( function() {
 
- 			var className, i, self, classNames;
 
- 			if ( isValidValue ) {
 
- 				// Toggle individual class names
 
- 				i = 0;
 
- 				self = jQuery( this );
 
- 				classNames = classesToArray( value );
 
- 				while ( ( className = classNames[ i++ ] ) ) {
 
- 					// Check each className given, space separated list
 
- 					if ( self.hasClass( className ) ) {
 
- 						self.removeClass( className );
 
- 					} else {
 
- 						self.addClass( className );
 
- 					}
 
- 				}
 
- 			// Toggle whole class name
 
- 			} else if ( value === undefined || type === "boolean" ) {
 
- 				className = getClass( this );
 
- 				if ( className ) {
 
- 					// Store className if set
 
- 					dataPriv.set( this, "__className__", className );
 
- 				}
 
- 				// If the element has a class name or if we're passed `false`,
 
- 				// then remove the whole classname (if there was one, the above saved it).
 
- 				// Otherwise bring back whatever was previously saved (if anything),
 
- 				// falling back to the empty string if nothing was stored.
 
- 				if ( this.setAttribute ) {
 
- 					this.setAttribute( "class",
 
- 						className || value === false ?
 
- 						"" :
 
- 						dataPriv.get( this, "__className__" ) || ""
 
- 					);
 
- 				}
 
- 			}
 
- 		} );
 
- 	},
 
- 	hasClass: function( selector ) {
 
- 		var className, elem,
 
- 			i = 0;
 
- 		className = " " + selector + " ";
 
- 		while ( ( elem = this[ i++ ] ) ) {
 
- 			if ( elem.nodeType === 1 &&
 
- 				( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
 
- 					return true;
 
- 			}
 
- 		}
 
- 		return false;
 
- 	}
 
- } );
 
- var rreturn = /\r/g;
 
- jQuery.fn.extend( {
 
- 	val: function( value ) {
 
- 		var hooks, ret, valueIsFunction,
 
- 			elem = this[ 0 ];
 
- 		if ( !arguments.length ) {
 
- 			if ( elem ) {
 
- 				hooks = jQuery.valHooks[ elem.type ] ||
 
- 					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
 
- 				if ( hooks &&
 
- 					"get" in hooks &&
 
- 					( ret = hooks.get( elem, "value" ) ) !== undefined
 
- 				) {
 
- 					return ret;
 
- 				}
 
- 				ret = elem.value;
 
- 				// Handle most common string cases
 
- 				if ( typeof ret === "string" ) {
 
- 					return ret.replace( rreturn, "" );
 
- 				}
 
- 				// Handle cases where value is null/undef or number
 
- 				return ret == null ? "" : ret;
 
- 			}
 
- 			return;
 
- 		}
 
- 		valueIsFunction = isFunction( value );
 
- 		return this.each( function( i ) {
 
- 			var val;
 
- 			if ( this.nodeType !== 1 ) {
 
- 				return;
 
- 			}
 
- 			if ( valueIsFunction ) {
 
- 				val = value.call( this, i, jQuery( this ).val() );
 
- 			} else {
 
- 				val = value;
 
- 			}
 
- 			// Treat null/undefined as ""; convert numbers to string
 
- 			if ( val == null ) {
 
- 				val = "";
 
- 			} else if ( typeof val === "number" ) {
 
- 				val += "";
 
- 			} else if ( Array.isArray( val ) ) {
 
- 				val = jQuery.map( val, function( value ) {
 
- 					return value == null ? "" : value + "";
 
- 				} );
 
- 			}
 
- 			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
 
- 			// If set returns undefined, fall back to normal setting
 
- 			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
 
- 				this.value = val;
 
- 			}
 
- 		} );
 
- 	}
 
- } );
 
- jQuery.extend( {
 
- 	valHooks: {
 
- 		option: {
 
- 			get: function( elem ) {
 
- 				var val = jQuery.find.attr( elem, "value" );
 
- 				return val != null ?
 
- 					val :
 
- 					// Support: IE <=10 - 11 only
 
- 					// option.text throws exceptions (#14686, #14858)
 
- 					// Strip and collapse whitespace
 
- 					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
 
- 					stripAndCollapse( jQuery.text( elem ) );
 
- 			}
 
- 		},
 
- 		select: {
 
- 			get: function( elem ) {
 
- 				var value, option, i,
 
- 					options = elem.options,
 
- 					index = elem.selectedIndex,
 
- 					one = elem.type === "select-one",
 
- 					values = one ? null : [],
 
- 					max = one ? index + 1 : options.length;
 
- 				if ( index < 0 ) {
 
- 					i = max;
 
- 				} else {
 
- 					i = one ? index : 0;
 
- 				}
 
- 				// Loop through all the selected options
 
- 				for ( ; i < max; i++ ) {
 
- 					option = options[ i ];
 
- 					// Support: IE <=9 only
 
- 					// IE8-9 doesn't update selected after form reset (#2551)
 
- 					if ( ( option.selected || i === index ) &&
 
- 							// Don't return options that are disabled or in a disabled optgroup
 
- 							!option.disabled &&
 
- 							( !option.parentNode.disabled ||
 
- 								!nodeName( option.parentNode, "optgroup" ) ) ) {
 
- 						// Get the specific value for the option
 
- 						value = jQuery( option ).val();
 
- 						// We don't need an array for one selects
 
- 						if ( one ) {
 
- 							return value;
 
- 						}
 
- 						// Multi-Selects return an array
 
- 						values.push( value );
 
- 					}
 
- 				}
 
- 				return values;
 
- 			},
 
- 			set: function( elem, value ) {
 
- 				var optionSet, option,
 
- 					options = elem.options,
 
- 					values = jQuery.makeArray( value ),
 
- 					i = options.length;
 
- 				while ( i-- ) {
 
- 					option = options[ i ];
 
- 					/* eslint-disable no-cond-assign */
 
- 					if ( option.selected =
 
- 						jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
 
- 					) {
 
- 						optionSet = true;
 
- 					}
 
- 					/* eslint-enable no-cond-assign */
 
- 				}
 
- 				// Force browsers to behave consistently when non-matching value is set
 
- 				if ( !optionSet ) {
 
- 					elem.selectedIndex = -1;
 
- 				}
 
- 				return values;
 
- 			}
 
- 		}
 
- 	}
 
- } );
 
- // Radios and checkboxes getter/setter
 
- jQuery.each( [ "radio", "checkbox" ], function() {
 
- 	jQuery.valHooks[ this ] = {
 
- 		set: function( elem, value ) {
 
- 			if ( Array.isArray( value ) ) {
 
- 				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
 
- 			}
 
- 		}
 
- 	};
 
- 	if ( !support.checkOn ) {
 
- 		jQuery.valHooks[ this ].get = function( elem ) {
 
- 			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
 
- 		};
 
- 	}
 
- } );
 
- // Return jQuery for attributes-only inclusion
 
- support.focusin = "onfocusin" in window;
 
- var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
 
- 	stopPropagationCallback = function( e ) {
 
- 		e.stopPropagation();
 
- 	};
 
- jQuery.extend( jQuery.event, {
 
- 	trigger: function( event, data, elem, onlyHandlers ) {
 
- 		var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
 
- 			eventPath = [ elem || document ],
 
- 			type = hasOwn.call( event, "type" ) ? event.type : event,
 
- 			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
 
- 		cur = lastElement = tmp = elem = elem || document;
 
- 		// Don't do events on text and comment nodes
 
- 		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
 
- 			return;
 
- 		}
 
- 		// focus/blur morphs to focusin/out; ensure we're not firing them right now
 
- 		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
 
- 			return;
 
- 		}
 
- 		if ( type.indexOf( "." ) > -1 ) {
 
- 			// Namespaced trigger; create a regexp to match event type in handle()
 
- 			namespaces = type.split( "." );
 
- 			type = namespaces.shift();
 
- 			namespaces.sort();
 
- 		}
 
- 		ontype = type.indexOf( ":" ) < 0 && "on" + type;
 
- 		// Caller can pass in a jQuery.Event object, Object, or just an event type string
 
- 		event = event[ jQuery.expando ] ?
 
- 			event :
 
- 			new jQuery.Event( type, typeof event === "object" && event );
 
- 		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
 
- 		event.isTrigger = onlyHandlers ? 2 : 3;
 
- 		event.namespace = namespaces.join( "." );
 
- 		event.rnamespace = event.namespace ?
 
- 			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
 
- 			null;
 
- 		// Clean up the event in case it is being reused
 
- 		event.result = undefined;
 
- 		if ( !event.target ) {
 
- 			event.target = elem;
 
- 		}
 
- 		// Clone any incoming data and prepend the event, creating the handler arg list
 
- 		data = data == null ?
 
- 			[ event ] :
 
- 			jQuery.makeArray( data, [ event ] );
 
- 		// Allow special events to draw outside the lines
 
- 		special = jQuery.event.special[ type ] || {};
 
- 		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
 
- 			return;
 
- 		}
 
- 		// Determine event propagation path in advance, per W3C events spec (#9951)
 
- 		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
 
- 		if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
 
- 			bubbleType = special.delegateType || type;
 
- 			if ( !rfocusMorph.test( bubbleType + type ) ) {
 
- 				cur = cur.parentNode;
 
- 			}
 
- 			for ( ; cur; cur = cur.parentNode ) {
 
- 				eventPath.push( cur );
 
- 				tmp = cur;
 
- 			}
 
- 			// Only add window if we got to document (e.g., not plain obj or detached DOM)
 
- 			if ( tmp === ( elem.ownerDocument || document ) ) {
 
- 				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
 
- 			}
 
- 		}
 
- 		// Fire handlers on the event path
 
- 		i = 0;
 
- 		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
 
- 			lastElement = cur;
 
- 			event.type = i > 1 ?
 
- 				bubbleType :
 
- 				special.bindType || type;
 
- 			// jQuery handler
 
- 			handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
 
- 				dataPriv.get( cur, "handle" );
 
- 			if ( handle ) {
 
- 				handle.apply( cur, data );
 
- 			}
 
- 			// Native handler
 
- 			handle = ontype && cur[ ontype ];
 
- 			if ( handle && handle.apply && acceptData( cur ) ) {
 
- 				event.result = handle.apply( cur, data );
 
- 				if ( event.result === false ) {
 
- 					event.preventDefault();
 
- 				}
 
- 			}
 
- 		}
 
- 		event.type = type;
 
- 		// If nobody prevented the default action, do it now
 
- 		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
 
- 			if ( ( !special._default ||
 
- 				special._default.apply( eventPath.pop(), data ) === false ) &&
 
- 				acceptData( elem ) ) {
 
- 				// Call a native DOM method on the target with the same name as the event.
 
- 				// Don't do default actions on window, that's where global variables be (#6170)
 
- 				if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
 
- 					// Don't re-trigger an onFOO event when we call its FOO() method
 
- 					tmp = elem[ ontype ];
 
- 					if ( tmp ) {
 
- 						elem[ ontype ] = null;
 
- 					}
 
- 					// Prevent re-triggering of the same event, since we already bubbled it above
 
- 					jQuery.event.triggered = type;
 
- 					if ( event.isPropagationStopped() ) {
 
- 						lastElement.addEventListener( type, stopPropagationCallback );
 
- 					}
 
- 					elem[ type ]();
 
- 					if ( event.isPropagationStopped() ) {
 
- 						lastElement.removeEventListener( type, stopPropagationCallback );
 
- 					}
 
- 					jQuery.event.triggered = undefined;
 
- 					if ( tmp ) {
 
- 						elem[ ontype ] = tmp;
 
- 					}
 
- 				}
 
- 			}
 
- 		}
 
- 		return event.result;
 
- 	},
 
- 	// Piggyback on a donor event to simulate a different one
 
- 	// Used only for `focus(in | out)` events
 
- 	simulate: function( type, elem, event ) {
 
- 		var e = jQuery.extend(
 
- 			new jQuery.Event(),
 
- 			event,
 
- 			{
 
- 				type: type,
 
- 				isSimulated: true
 
- 			}
 
- 		);
 
- 		jQuery.event.trigger( e, null, elem );
 
- 	}
 
- } );
 
- jQuery.fn.extend( {
 
- 	trigger: function( type, data ) {
 
- 		return this.each( function() {
 
- 			jQuery.event.trigger( type, data, this );
 
- 		} );
 
- 	},
 
- 	triggerHandler: function( type, data ) {
 
- 		var elem = this[ 0 ];
 
- 		if ( elem ) {
 
- 			return jQuery.event.trigger( type, data, elem, true );
 
- 		}
 
- 	}
 
- } );
 
- // Support: Firefox <=44
 
- // Firefox doesn't have focus(in | out) events
 
- // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
 
- //
 
- // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
 
- // focus(in | out) events fire after focus & blur events,
 
- // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
 
- // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
 
- if ( !support.focusin ) {
 
- 	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
 
- 		// Attach a single capturing handler on the document while someone wants focusin/focusout
 
- 		var handler = function( event ) {
 
- 			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
 
- 		};
 
- 		jQuery.event.special[ fix ] = {
 
- 			setup: function() {
 
- 				var doc = this.ownerDocument || this,
 
- 					attaches = dataPriv.access( doc, fix );
 
- 				if ( !attaches ) {
 
- 					doc.addEventListener( orig, handler, true );
 
- 				}
 
- 				dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
 
- 			},
 
- 			teardown: function() {
 
- 				var doc = this.ownerDocument || this,
 
- 					attaches = dataPriv.access( doc, fix ) - 1;
 
- 				if ( !attaches ) {
 
- 					doc.removeEventListener( orig, handler, true );
 
- 					dataPriv.remove( doc, fix );
 
- 				} else {
 
- 					dataPriv.access( doc, fix, attaches );
 
- 				}
 
- 			}
 
- 		};
 
- 	} );
 
- }
 
- var location = window.location;
 
- var nonce = Date.now();
 
- var rquery = ( /\?/ );
 
- // Cross-browser xml parsing
 
- jQuery.parseXML = function( data ) {
 
- 	var xml;
 
- 	if ( !data || typeof data !== "string" ) {
 
- 		return null;
 
- 	}
 
- 	// Support: IE 9 - 11 only
 
- 	// IE throws on parseFromString with invalid input.
 
- 	try {
 
- 		xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
 
- 	} catch ( e ) {
 
- 		xml = undefined;
 
- 	}
 
- 	if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
 
- 		jQuery.error( "Invalid XML: " + data );
 
- 	}
 
- 	return xml;
 
- };
 
- var
 
- 	rbracket = /\[\]$/,
 
- 	rCRLF = /\r?\n/g,
 
- 	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
 
- 	rsubmittable = /^(?:input|select|textarea|keygen)/i;
 
- function buildParams( prefix, obj, traditional, add ) {
 
- 	var name;
 
- 	if ( Array.isArray( obj ) ) {
 
- 		// Serialize array item.
 
- 		jQuery.each( obj, function( i, v ) {
 
- 			if ( traditional || rbracket.test( prefix ) ) {
 
- 				// Treat each array item as a scalar.
 
- 				add( prefix, v );
 
- 			} else {
 
- 				// Item is non-scalar (array or object), encode its numeric index.
 
- 				buildParams(
 
- 					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
 
- 					v,
 
- 					traditional,
 
- 					add
 
- 				);
 
- 			}
 
- 		} );
 
- 	} else if ( !traditional && toType( obj ) === "object" ) {
 
- 		// Serialize object item.
 
- 		for ( name in obj ) {
 
- 			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
 
- 		}
 
- 	} else {
 
- 		// Serialize scalar item.
 
- 		add( prefix, obj );
 
- 	}
 
- }
 
- // Serialize an array of form elements or a set of
 
- // key/values into a query string
 
- jQuery.param = function( a, traditional ) {
 
- 	var prefix,
 
- 		s = [],
 
- 		add = function( key, valueOrFunction ) {
 
- 			// If value is a function, invoke it and use its return value
 
- 			var value = isFunction( valueOrFunction ) ?
 
- 				valueOrFunction() :
 
- 				valueOrFunction;
 
- 			s[ s.length ] = encodeURIComponent( key ) + "=" +
 
- 				encodeURIComponent( value == null ? "" : value );
 
- 		};
 
- 	if ( a == null ) {
 
- 		return "";
 
- 	}
 
- 	// If an array was passed in, assume that it is an array of form elements.
 
- 	if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
 
- 		// Serialize the form elements
 
- 		jQuery.each( a, function() {
 
- 			add( this.name, this.value );
 
- 		} );
 
- 	} else {
 
- 		// If traditional, encode the "old" way (the way 1.3.2 or older
 
- 		// did it), otherwise encode params recursively.
 
- 		for ( prefix in a ) {
 
- 			buildParams( prefix, a[ prefix ], traditional, add );
 
- 		}
 
- 	}
 
- 	// Return the resulting serialization
 
- 	return s.join( "&" );
 
- };
 
- jQuery.fn.extend( {
 
- 	serialize: function() {
 
- 		return jQuery.param( this.serializeArray() );
 
- 	},
 
- 	serializeArray: function() {
 
- 		return this.map( function() {
 
- 			// Can add propHook for "elements" to filter or add form elements
 
- 			var elements = jQuery.prop( this, "elements" );
 
- 			return elements ? jQuery.makeArray( elements ) : this;
 
- 		} )
 
- 		.filter( function() {
 
- 			var type = this.type;
 
- 			// Use .is( ":disabled" ) so that fieldset[disabled] works
 
- 			return this.name && !jQuery( this ).is( ":disabled" ) &&
 
- 				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
 
- 				( this.checked || !rcheckableType.test( type ) );
 
- 		} )
 
- 		.map( function( i, elem ) {
 
- 			var val = jQuery( this ).val();
 
- 			if ( val == null ) {
 
- 				return null;
 
- 			}
 
- 			if ( Array.isArray( val ) ) {
 
- 				return jQuery.map( val, function( val ) {
 
- 					return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
 
- 				} );
 
- 			}
 
- 			return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
 
- 		} ).get();
 
- 	}
 
- } );
 
- var
 
- 	r20 = /%20/g,
 
- 	rhash = /#.*$/,
 
- 	rantiCache = /([?&])_=[^&]*/,
 
- 	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
 
- 	// #7653, #8125, #8152: local protocol detection
 
- 	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
 
- 	rnoContent = /^(?:GET|HEAD)$/,
 
- 	rprotocol = /^\/\//,
 
- 	/* Prefilters
 
- 	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
 
- 	 * 2) These are called:
 
- 	 *    - BEFORE asking for a transport
 
- 	 *    - AFTER param serialization (s.data is a string if s.processData is true)
 
- 	 * 3) key is the dataType
 
- 	 * 4) the catchall symbol "*" can be used
 
- 	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
 
- 	 */
 
- 	prefilters = {},
 
- 	/* Transports bindings
 
- 	 * 1) key is the dataType
 
- 	 * 2) the catchall symbol "*" can be used
 
- 	 * 3) selection will start with transport dataType and THEN go to "*" if needed
 
- 	 */
 
- 	transports = {},
 
- 	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
 
- 	allTypes = "*/".concat( "*" ),
 
- 	// Anchor tag for parsing the document origin
 
- 	originAnchor = document.createElement( "a" );
 
- 	originAnchor.href = location.href;
 
- // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
 
- function addToPrefiltersOrTransports( structure ) {
 
- 	// dataTypeExpression is optional and defaults to "*"
 
- 	return function( dataTypeExpression, func ) {
 
- 		if ( typeof dataTypeExpression !== "string" ) {
 
- 			func = dataTypeExpression;
 
- 			dataTypeExpression = "*";
 
- 		}
 
- 		var dataType,
 
- 			i = 0,
 
- 			dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
 
- 		if ( isFunction( func ) ) {
 
- 			// For each dataType in the dataTypeExpression
 
- 			while ( ( dataType = dataTypes[ i++ ] ) ) {
 
- 				// Prepend if requested
 
- 				if ( dataType[ 0 ] === "+" ) {
 
- 					dataType = dataType.slice( 1 ) || "*";
 
- 					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
 
- 				// Otherwise append
 
- 				} else {
 
- 					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
 
- 				}
 
- 			}
 
- 		}
 
- 	};
 
- }
 
- // Base inspection function for prefilters and transports
 
- function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
 
- 	var inspected = {},
 
- 		seekingTransport = ( structure === transports );
 
- 	function inspect( dataType ) {
 
- 		var selected;
 
- 		inspected[ dataType ] = true;
 
- 		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
 
- 			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
 
- 			if ( typeof dataTypeOrTransport === "string" &&
 
- 				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
 
- 				options.dataTypes.unshift( dataTypeOrTransport );
 
- 				inspect( dataTypeOrTransport );
 
- 				return false;
 
- 			} else if ( seekingTransport ) {
 
- 				return !( selected = dataTypeOrTransport );
 
- 			}
 
- 		} );
 
- 		return selected;
 
- 	}
 
- 	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
 
- }
 
- // A special extend for ajax options
 
- // that takes "flat" options (not to be deep extended)
 
- // Fixes #9887
 
- function ajaxExtend( target, src ) {
 
- 	var key, deep,
 
- 		flatOptions = jQuery.ajaxSettings.flatOptions || {};
 
- 	for ( key in src ) {
 
- 		if ( src[ key ] !== undefined ) {
 
- 			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
 
- 		}
 
- 	}
 
- 	if ( deep ) {
 
- 		jQuery.extend( true, target, deep );
 
- 	}
 
- 	return target;
 
- }
 
- /* Handles responses to an ajax request:
 
-  * - finds the right dataType (mediates between content-type and expected dataType)
 
-  * - returns the corresponding response
 
-  */
 
- function ajaxHandleResponses( s, jqXHR, responses ) {
 
- 	var ct, type, finalDataType, firstDataType,
 
- 		contents = s.contents,
 
- 		dataTypes = s.dataTypes;
 
- 	// Remove auto dataType and get content-type in the process
 
- 	while ( dataTypes[ 0 ] === "*" ) {
 
- 		dataTypes.shift();
 
- 		if ( ct === undefined ) {
 
- 			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
 
- 		}
 
- 	}
 
- 	// Check if we're dealing with a known content-type
 
- 	if ( ct ) {
 
- 		for ( type in contents ) {
 
- 			if ( contents[ type ] && contents[ type ].test( ct ) ) {
 
- 				dataTypes.unshift( type );
 
- 				break;
 
- 			}
 
- 		}
 
- 	}
 
- 	// Check to see if we have a response for the expected dataType
 
- 	if ( dataTypes[ 0 ] in responses ) {
 
- 		finalDataType = dataTypes[ 0 ];
 
- 	} else {
 
- 		// Try convertible dataTypes
 
- 		for ( type in responses ) {
 
- 			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
 
- 				finalDataType = type;
 
- 				break;
 
- 			}
 
- 			if ( !firstDataType ) {
 
- 				firstDataType = type;
 
- 			}
 
- 		}
 
- 		// Or just use first one
 
- 		finalDataType = finalDataType || firstDataType;
 
- 	}
 
- 	// If we found a dataType
 
- 	// We add the dataType to the list if needed
 
- 	// and return the corresponding response
 
- 	if ( finalDataType ) {
 
- 		if ( finalDataType !== dataTypes[ 0 ] ) {
 
- 			dataTypes.unshift( finalDataType );
 
- 		}
 
- 		return responses[ finalDataType ];
 
- 	}
 
- }
 
- /* Chain conversions given the request and the original response
 
-  * Also sets the responseXXX fields on the jqXHR instance
 
-  */
 
- function ajaxConvert( s, response, jqXHR, isSuccess ) {
 
- 	var conv2, current, conv, tmp, prev,
 
- 		converters = {},
 
- 		// Work with a copy of dataTypes in case we need to modify it for conversion
 
- 		dataTypes = s.dataTypes.slice();
 
- 	// Create converters map with lowercased keys
 
- 	if ( dataTypes[ 1 ] ) {
 
- 		for ( conv in s.converters ) {
 
- 			converters[ conv.toLowerCase() ] = s.converters[ conv ];
 
- 		}
 
- 	}
 
- 	current = dataTypes.shift();
 
- 	// Convert to each sequential dataType
 
- 	while ( current ) {
 
- 		if ( s.responseFields[ current ] ) {
 
- 			jqXHR[ s.responseFields[ current ] ] = response;
 
- 		}
 
- 		// Apply the dataFilter if provided
 
- 		if ( !prev && isSuccess && s.dataFilter ) {
 
- 			response = s.dataFilter( response, s.dataType );
 
- 		}
 
- 		prev = current;
 
- 		current = dataTypes.shift();
 
- 		if ( current ) {
 
- 			// There's only work to do if current dataType is non-auto
 
- 			if ( current === "*" ) {
 
- 				current = prev;
 
- 			// Convert response if prev dataType is non-auto and differs from current
 
- 			} else if ( prev !== "*" && prev !== current ) {
 
- 				// Seek a direct converter
 
- 				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
 
- 				// If none found, seek a pair
 
- 				if ( !conv ) {
 
- 					for ( conv2 in converters ) {
 
- 						// If conv2 outputs current
 
- 						tmp = conv2.split( " " );
 
- 						if ( tmp[ 1 ] === current ) {
 
- 							// If prev can be converted to accepted input
 
- 							conv = converters[ prev + " " + tmp[ 0 ] ] ||
 
- 								converters[ "* " + tmp[ 0 ] ];
 
- 							if ( conv ) {
 
- 								// Condense equivalence converters
 
- 								if ( conv === true ) {
 
- 									conv = converters[ conv2 ];
 
- 								// Otherwise, insert the intermediate dataType
 
- 								} else if ( converters[ conv2 ] !== true ) {
 
- 									current = tmp[ 0 ];
 
- 									dataTypes.unshift( tmp[ 1 ] );
 
- 								}
 
- 								break;
 
- 							}
 
- 						}
 
- 					}
 
- 				}
 
- 				// Apply converter (if not an equivalence)
 
- 				if ( conv !== true ) {
 
- 					// Unless errors are allowed to bubble, catch and return them
 
- 					if ( conv && s.throws ) {
 
- 						response = conv( response );
 
- 					} else {
 
- 						try {
 
- 							response = conv( response );
 
- 						} catch ( e ) {
 
- 							return {
 
- 								state: "parsererror",
 
- 								error: conv ? e : "No conversion from " + prev + " to " + current
 
- 							};
 
- 						}
 
- 					}
 
- 				}
 
- 			}
 
- 		}
 
- 	}
 
- 	return { state: "success", data: response };
 
- }
 
- jQuery.extend( {
 
- 	// Counter for holding the number of active queries
 
- 	active: 0,
 
- 	// Last-Modified header cache for next request
 
- 	lastModified: {},
 
- 	etag: {},
 
- 	ajaxSettings: {
 
- 		url: location.href,
 
- 		type: "GET",
 
- 		isLocal: rlocalProtocol.test( location.protocol ),
 
- 		global: true,
 
- 		processData: true,
 
- 		async: true,
 
- 		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
 
- 		/*
 
- 		timeout: 0,
 
- 		data: null,
 
- 		dataType: null,
 
- 		username: null,
 
- 		password: null,
 
- 		cache: null,
 
- 		throws: false,
 
- 		traditional: false,
 
- 		headers: {},
 
- 		*/
 
- 		accepts: {
 
- 			"*": allTypes,
 
- 			text: "text/plain",
 
- 			html: "text/html",
 
- 			xml: "application/xml, text/xml",
 
- 			json: "application/json, text/javascript"
 
- 		},
 
- 		contents: {
 
- 			xml: /\bxml\b/,
 
- 			html: /\bhtml/,
 
- 			json: /\bjson\b/
 
- 		},
 
- 		responseFields: {
 
- 			xml: "responseXML",
 
- 			text: "responseText",
 
- 			json: "responseJSON"
 
- 		},
 
- 		// Data converters
 
- 		// Keys separate source (or catchall "*") and destination types with a single space
 
- 		converters: {
 
- 			// Convert anything to text
 
- 			"* text": String,
 
- 			// Text to html (true = no transformation)
 
- 			"text html": true,
 
- 			// Evaluate text as a json expression
 
- 			"text json": JSON.parse,
 
- 			// Parse text as xml
 
- 			"text xml": jQuery.parseXML
 
- 		},
 
- 		// For options that shouldn't be deep extended:
 
- 		// you can add your own custom options here if
 
- 		// and when you create one that shouldn't be
 
- 		// deep extended (see ajaxExtend)
 
- 		flatOptions: {
 
- 			url: true,
 
- 			context: true
 
- 		}
 
- 	},
 
- 	// Creates a full fledged settings object into target
 
- 	// with both ajaxSettings and settings fields.
 
- 	// If target is omitted, writes into ajaxSettings.
 
- 	ajaxSetup: function( target, settings ) {
 
- 		return settings ?
 
- 			// Building a settings object
 
- 			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
 
- 			// Extending ajaxSettings
 
- 			ajaxExtend( jQuery.ajaxSettings, target );
 
- 	},
 
- 	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
 
- 	ajaxTransport: addToPrefiltersOrTransports( transports ),
 
- 	// Main method
 
- 	ajax: function( url, options ) {
 
- 		// If url is an object, simulate pre-1.5 signature
 
- 		if ( typeof url === "object" ) {
 
- 			options = url;
 
- 			url = undefined;
 
- 		}
 
- 		// Force options to be an object
 
- 		options = options || {};
 
- 		var transport,
 
- 			// URL without anti-cache param
 
- 			cacheURL,
 
- 			// Response headers
 
- 			responseHeadersString,
 
- 			responseHeaders,
 
- 			// timeout handle
 
- 			timeoutTimer,
 
- 			// Url cleanup var
 
- 			urlAnchor,
 
- 			// Request state (becomes false upon send and true upon completion)
 
- 			completed,
 
- 			// To know if global events are to be dispatched
 
- 			fireGlobals,
 
- 			// Loop variable
 
- 			i,
 
- 			// uncached part of the url
 
- 			uncached,
 
- 			// Create the final options object
 
- 			s = jQuery.ajaxSetup( {}, options ),
 
- 			// Callbacks context
 
- 			callbackContext = s.context || s,
 
- 			// Context for global events is callbackContext if it is a DOM node or jQuery collection
 
- 			globalEventContext = s.context &&
 
- 				( callbackContext.nodeType || callbackContext.jquery ) ?
 
- 					jQuery( callbackContext ) :
 
- 					jQuery.event,
 
- 			// Deferreds
 
- 			deferred = jQuery.Deferred(),
 
- 			completeDeferred = jQuery.Callbacks( "once memory" ),
 
- 			// Status-dependent callbacks
 
- 			statusCode = s.statusCode || {},
 
- 			// Headers (they are sent all at once)
 
- 			requestHeaders = {},
 
- 			requestHeadersNames = {},
 
- 			// Default abort message
 
- 			strAbort = "canceled",
 
- 			// Fake xhr
 
- 			jqXHR = {
 
- 				readyState: 0,
 
- 				// Builds headers hashtable if needed
 
- 				getResponseHeader: function( key ) {
 
- 					var match;
 
- 					if ( completed ) {
 
- 						if ( !responseHeaders ) {
 
- 							responseHeaders = {};
 
- 							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
 
- 								responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
 
- 									( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )
 
- 										.concat( match[ 2 ] );
 
- 							}
 
- 						}
 
- 						match = responseHeaders[ key.toLowerCase() + " " ];
 
- 					}
 
- 					return match == null ? null : match.join( ", " );
 
- 				},
 
- 				// Raw string
 
- 				getAllResponseHeaders: function() {
 
- 					return completed ? responseHeadersString : null;
 
- 				},
 
- 				// Caches the header
 
- 				setRequestHeader: function( name, value ) {
 
- 					if ( completed == null ) {
 
- 						name = requestHeadersNames[ name.toLowerCase() ] =
 
- 							requestHeadersNames[ name.toLowerCase() ] || name;
 
- 						requestHeaders[ name ] = value;
 
- 					}
 
- 					return this;
 
- 				},
 
- 				// Overrides response content-type header
 
- 				overrideMimeType: function( type ) {
 
- 					if ( completed == null ) {
 
- 						s.mimeType = type;
 
- 					}
 
- 					return this;
 
- 				},
 
- 				// Status-dependent callbacks
 
- 				statusCode: function( map ) {
 
- 					var code;
 
- 					if ( map ) {
 
- 						if ( completed ) {
 
- 							// Execute the appropriate callbacks
 
- 							jqXHR.always( map[ jqXHR.status ] );
 
- 						} else {
 
- 							// Lazy-add the new callbacks in a way that preserves old ones
 
- 							for ( code in map ) {
 
- 								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
 
- 							}
 
- 						}
 
- 					}
 
- 					return this;
 
- 				},
 
- 				// Cancel the request
 
- 				abort: function( statusText ) {
 
- 					var finalText = statusText || strAbort;
 
- 					if ( transport ) {
 
- 						transport.abort( finalText );
 
- 					}
 
- 					done( 0, finalText );
 
- 					return this;
 
- 				}
 
- 			};
 
- 		// Attach deferreds
 
- 		deferred.promise( jqXHR );
 
- 		// Add protocol if not provided (prefilters might expect it)
 
- 		// Handle falsy url in the settings object (#10093: consistency with old signature)
 
- 		// We also use the url parameter if available
 
- 		s.url = ( ( url || s.url || location.href ) + "" )
 
- 			.replace( rprotocol, location.protocol + "//" );
 
- 		// Alias method option to type as per ticket #12004
 
- 		s.type = options.method || options.type || s.method || s.type;
 
- 		// Extract dataTypes list
 
- 		s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
 
- 		// A cross-domain request is in order when the origin doesn't match the current origin.
 
- 		if ( s.crossDomain == null ) {
 
- 			urlAnchor = document.createElement( "a" );
 
- 			// Support: IE <=8 - 11, Edge 12 - 15
 
- 			// IE throws exception on accessing the href property if url is malformed,
 
- 			// e.g. http://example.com:80x/
 
- 			try {
 
- 				urlAnchor.href = s.url;
 
- 				// Support: IE <=8 - 11 only
 
- 				// Anchor's host property isn't correctly set when s.url is relative
 
- 				urlAnchor.href = urlAnchor.href;
 
- 				s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
 
- 					urlAnchor.protocol + "//" + urlAnchor.host;
 
- 			} catch ( e ) {
 
- 				// If there is an error parsing the URL, assume it is crossDomain,
 
- 				// it can be rejected by the transport if it is invalid
 
- 				s.crossDomain = true;
 
- 			}
 
- 		}
 
- 		// Convert data if not already a string
 
- 		if ( s.data && s.processData && typeof s.data !== "string" ) {
 
- 			s.data = jQuery.param( s.data, s.traditional );
 
- 		}
 
- 		// Apply prefilters
 
- 		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
 
- 		// If request was aborted inside a prefilter, stop there
 
- 		if ( completed ) {
 
- 			return jqXHR;
 
- 		}
 
- 		// We can fire global events as of now if asked to
 
- 		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
 
- 		fireGlobals = jQuery.event && s.global;
 
- 		// Watch for a new set of requests
 
- 		if ( fireGlobals && jQuery.active++ === 0 ) {
 
- 			jQuery.event.trigger( "ajaxStart" );
 
- 		}
 
- 		// Uppercase the type
 
- 		s.type = s.type.toUpperCase();
 
- 		// Determine if request has content
 
- 		s.hasContent = !rnoContent.test( s.type );
 
- 		// Save the URL in case we're toying with the If-Modified-Since
 
- 		// and/or If-None-Match header later on
 
- 		// Remove hash to simplify url manipulation
 
- 		cacheURL = s.url.replace( rhash, "" );
 
- 		// More options handling for requests with no content
 
- 		if ( !s.hasContent ) {
 
- 			// Remember the hash so we can put it back
 
- 			uncached = s.url.slice( cacheURL.length );
 
- 			// If data is available and should be processed, append data to url
 
- 			if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
 
- 				cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
 
- 				// #9682: remove data so that it's not used in an eventual retry
 
- 				delete s.data;
 
- 			}
 
- 			// Add or update anti-cache param if needed
 
- 			if ( s.cache === false ) {
 
- 				cacheURL = cacheURL.replace( rantiCache, "$1" );
 
- 				uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
 
- 			}
 
- 			// Put hash and anti-cache on the URL that will be requested (gh-1732)
 
- 			s.url = cacheURL + uncached;
 
- 		// Change '%20' to '+' if this is encoded form body content (gh-2658)
 
- 		} else if ( s.data && s.processData &&
 
- 			( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
 
- 			s.data = s.data.replace( r20, "+" );
 
- 		}
 
- 		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
 
- 		if ( s.ifModified ) {
 
- 			if ( jQuery.lastModified[ cacheURL ] ) {
 
- 				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
 
- 			}
 
- 			if ( jQuery.etag[ cacheURL ] ) {
 
- 				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
 
- 			}
 
- 		}
 
- 		// Set the correct header, if data is being sent
 
- 		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
 
- 			jqXHR.setRequestHeader( "Content-Type", s.contentType );
 
- 		}
 
- 		// Set the Accepts header for the server, depending on the dataType
 
- 		jqXHR.setRequestHeader(
 
- 			"Accept",
 
- 			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
 
- 				s.accepts[ s.dataTypes[ 0 ] ] +
 
- 					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
 
- 				s.accepts[ "*" ]
 
- 		);
 
- 		// Check for headers option
 
- 		for ( i in s.headers ) {
 
- 			jqXHR.setRequestHeader( i, s.headers[ i ] );
 
- 		}
 
- 		// Allow custom headers/mimetypes and early abort
 
- 		if ( s.beforeSend &&
 
- 			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
 
- 			// Abort if not done already and return
 
- 			return jqXHR.abort();
 
- 		}
 
- 		// Aborting is no longer a cancellation
 
- 		strAbort = "abort";
 
- 		// Install callbacks on deferreds
 
- 		completeDeferred.add( s.complete );
 
- 		jqXHR.done( s.success );
 
- 		jqXHR.fail( s.error );
 
- 		// Get transport
 
- 		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
 
- 		// If no transport, we auto-abort
 
- 		if ( !transport ) {
 
- 			done( -1, "No Transport" );
 
- 		} else {
 
- 			jqXHR.readyState = 1;
 
- 			// Send global event
 
- 			if ( fireGlobals ) {
 
- 				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
 
- 			}
 
- 			// If request was aborted inside ajaxSend, stop there
 
- 			if ( completed ) {
 
- 				return jqXHR;
 
- 			}
 
- 			// Timeout
 
- 			if ( s.async && s.timeout > 0 ) {
 
- 				timeoutTimer = window.setTimeout( function() {
 
- 					jqXHR.abort( "timeout" );
 
- 				}, s.timeout );
 
- 			}
 
- 			try {
 
- 				completed = false;
 
- 				transport.send( requestHeaders, done );
 
- 			} catch ( e ) {
 
- 				// Rethrow post-completion exceptions
 
- 				if ( completed ) {
 
- 					throw e;
 
- 				}
 
- 				// Propagate others as results
 
- 				done( -1, e );
 
- 			}
 
- 		}
 
- 		// Callback for when everything is done
 
- 		function done( status, nativeStatusText, responses, headers ) {
 
- 			var isSuccess, success, error, response, modified,
 
- 				statusText = nativeStatusText;
 
- 			// Ignore repeat invocations
 
- 			if ( completed ) {
 
- 				return;
 
- 			}
 
- 			completed = true;
 
- 			// Clear timeout if it exists
 
- 			if ( timeoutTimer ) {
 
- 				window.clearTimeout( timeoutTimer );
 
- 			}
 
- 			// Dereference transport for early garbage collection
 
- 			// (no matter how long the jqXHR object will be used)
 
- 			transport = undefined;
 
- 			// Cache response headers
 
- 			responseHeadersString = headers || "";
 
- 			// Set readyState
 
- 			jqXHR.readyState = status > 0 ? 4 : 0;
 
- 			// Determine if successful
 
- 			isSuccess = status >= 200 && status < 300 || status === 304;
 
- 			// Get response data
 
- 			if ( responses ) {
 
- 				response = ajaxHandleResponses( s, jqXHR, responses );
 
- 			}
 
- 			// Convert no matter what (that way responseXXX fields are always set)
 
- 			response = ajaxConvert( s, response, jqXHR, isSuccess );
 
- 			// If successful, handle type chaining
 
- 			if ( isSuccess ) {
 
- 				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
 
- 				if ( s.ifModified ) {
 
- 					modified = jqXHR.getResponseHeader( "Last-Modified" );
 
- 					if ( modified ) {
 
- 						jQuery.lastModified[ cacheURL ] = modified;
 
- 					}
 
- 					modified = jqXHR.getResponseHeader( "etag" );
 
- 					if ( modified ) {
 
- 						jQuery.etag[ cacheURL ] = modified;
 
- 					}
 
- 				}
 
- 				// if no content
 
- 				if ( status === 204 || s.type === "HEAD" ) {
 
- 					statusText = "nocontent";
 
- 				// if not modified
 
- 				} else if ( status === 304 ) {
 
- 					statusText = "notmodified";
 
- 				// If we have data, let's convert it
 
- 				} else {
 
- 					statusText = response.state;
 
- 					success = response.data;
 
- 					error = response.error;
 
- 					isSuccess = !error;
 
- 				}
 
- 			} else {
 
- 				// Extract error from statusText and normalize for non-aborts
 
- 				error = statusText;
 
- 				if ( status || !statusText ) {
 
- 					statusText = "error";
 
- 					if ( status < 0 ) {
 
- 						status = 0;
 
- 					}
 
- 				}
 
- 			}
 
- 			// Set data for the fake xhr object
 
- 			jqXHR.status = status;
 
- 			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
 
- 			// Success/Error
 
- 			if ( isSuccess ) {
 
- 				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
 
- 			} else {
 
- 				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
 
- 			}
 
- 			// Status-dependent callbacks
 
- 			jqXHR.statusCode( statusCode );
 
- 			statusCode = undefined;
 
- 			if ( fireGlobals ) {
 
- 				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
 
- 					[ jqXHR, s, isSuccess ? success : error ] );
 
- 			}
 
- 			// Complete
 
- 			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
 
- 			if ( fireGlobals ) {
 
- 				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
 
- 				// Handle the global AJAX counter
 
- 				if ( !( --jQuery.active ) ) {
 
- 					jQuery.event.trigger( "ajaxStop" );
 
- 				}
 
- 			}
 
- 		}
 
- 		return jqXHR;
 
- 	},
 
- 	getJSON: function( url, data, callback ) {
 
- 		return jQuery.get( url, data, callback, "json" );
 
- 	},
 
- 	getScript: function( url, callback ) {
 
- 		return jQuery.get( url, undefined, callback, "script" );
 
- 	}
 
- } );
 
- jQuery.each( [ "get", "post" ], function( i, method ) {
 
- 	jQuery[ method ] = function( url, data, callback, type ) {
 
- 		// Shift arguments if data argument was omitted
 
- 		if ( isFunction( data ) ) {
 
- 			type = type || callback;
 
- 			callback = data;
 
- 			data = undefined;
 
- 		}
 
- 		// The url can be an options object (which then must have .url)
 
- 		return jQuery.ajax( jQuery.extend( {
 
- 			url: url,
 
- 			type: method,
 
- 			dataType: type,
 
- 			data: data,
 
- 			success: callback
 
- 		}, jQuery.isPlainObject( url ) && url ) );
 
- 	};
 
- } );
 
- jQuery._evalUrl = function( url, options ) {
 
- 	return jQuery.ajax( {
 
- 		url: url,
 
- 		// Make this explicit, since user can override this through ajaxSetup (#11264)
 
- 		type: "GET",
 
- 		dataType: "script",
 
- 		cache: true,
 
- 		async: false,
 
- 		global: false,
 
- 		// Only evaluate the response if it is successful (gh-4126)
 
- 		// dataFilter is not invoked for failure responses, so using it instead
 
- 		// of the default converter is kludgy but it works.
 
- 		converters: {
 
- 			"text script": function() {}
 
- 		},
 
- 		dataFilter: function( response ) {
 
- 			jQuery.globalEval( response, options );
 
- 		}
 
- 	} );
 
- };
 
- jQuery.fn.extend( {
 
- 	wrapAll: function( html ) {
 
- 		var wrap;
 
- 		if ( this[ 0 ] ) {
 
- 			if ( isFunction( html ) ) {
 
- 				html = html.call( this[ 0 ] );
 
- 			}
 
- 			// The elements to wrap the target around
 
- 			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
 
- 			if ( this[ 0 ].parentNode ) {
 
- 				wrap.insertBefore( this[ 0 ] );
 
- 			}
 
- 			wrap.map( function() {
 
- 				var elem = this;
 
- 				while ( elem.firstElementChild ) {
 
- 					elem = elem.firstElementChild;
 
- 				}
 
- 				return elem;
 
- 			} ).append( this );
 
- 		}
 
- 		return this;
 
- 	},
 
- 	wrapInner: function( html ) {
 
- 		if ( isFunction( html ) ) {
 
- 			return this.each( function( i ) {
 
- 				jQuery( this ).wrapInner( html.call( this, i ) );
 
- 			} );
 
- 		}
 
- 		return this.each( function() {
 
- 			var self = jQuery( this ),
 
- 				contents = self.contents();
 
- 			if ( contents.length ) {
 
- 				contents.wrapAll( html );
 
- 			} else {
 
- 				self.append( html );
 
- 			}
 
- 		} );
 
- 	},
 
- 	wrap: function( html ) {
 
- 		var htmlIsFunction = isFunction( html );
 
- 		return this.each( function( i ) {
 
- 			jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
 
- 		} );
 
- 	},
 
- 	unwrap: function( selector ) {
 
- 		this.parent( selector ).not( "body" ).each( function() {
 
- 			jQuery( this ).replaceWith( this.childNodes );
 
- 		} );
 
- 		return this;
 
- 	}
 
- } );
 
- jQuery.expr.pseudos.hidden = function( elem ) {
 
- 	return !jQuery.expr.pseudos.visible( elem );
 
- };
 
- jQuery.expr.pseudos.visible = function( elem ) {
 
- 	return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
 
- };
 
- jQuery.ajaxSettings.xhr = function() {
 
- 	try {
 
- 		return new window.XMLHttpRequest();
 
- 	} catch ( e ) {}
 
- };
 
- var xhrSuccessStatus = {
 
- 		// File protocol always yields status code 0, assume 200
 
- 		0: 200,
 
- 		// Support: IE <=9 only
 
- 		// #1450: sometimes IE returns 1223 when it should be 204
 
- 		1223: 204
 
- 	},
 
- 	xhrSupported = jQuery.ajaxSettings.xhr();
 
- support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
 
- support.ajax = xhrSupported = !!xhrSupported;
 
- jQuery.ajaxTransport( function( options ) {
 
- 	var callback, errorCallback;
 
- 	// Cross domain only allowed if supported through XMLHttpRequest
 
- 	if ( support.cors || xhrSupported && !options.crossDomain ) {
 
- 		return {
 
- 			send: function( headers, complete ) {
 
- 				var i,
 
- 					xhr = options.xhr();
 
- 				xhr.open(
 
- 					options.type,
 
- 					options.url,
 
- 					options.async,
 
- 					options.username,
 
- 					options.password
 
- 				);
 
- 				// Apply custom fields if provided
 
- 				if ( options.xhrFields ) {
 
- 					for ( i in options.xhrFields ) {
 
- 						xhr[ i ] = options.xhrFields[ i ];
 
- 					}
 
- 				}
 
- 				// Override mime type if needed
 
- 				if ( options.mimeType && xhr.overrideMimeType ) {
 
- 					xhr.overrideMimeType( options.mimeType );
 
- 				}
 
- 				// X-Requested-With header
 
- 				// For cross-domain requests, seeing as conditions for a preflight are
 
- 				// akin to a jigsaw puzzle, we simply never set it to be sure.
 
- 				// (it can always be set on a per-request basis or even using ajaxSetup)
 
- 				// For same-domain requests, won't change header if already provided.
 
- 				if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
 
- 					headers[ "X-Requested-With" ] = "XMLHttpRequest";
 
- 				}
 
- 				// Set headers
 
- 				for ( i in headers ) {
 
- 					xhr.setRequestHeader( i, headers[ i ] );
 
- 				}
 
- 				// Callback
 
- 				callback = function( type ) {
 
- 					return function() {
 
- 						if ( callback ) {
 
- 							callback = errorCallback = xhr.onload =
 
- 								xhr.onerror = xhr.onabort = xhr.ontimeout =
 
- 									xhr.onreadystatechange = null;
 
- 							if ( type === "abort" ) {
 
- 								xhr.abort();
 
- 							} else if ( type === "error" ) {
 
- 								// Support: IE <=9 only
 
- 								// On a manual native abort, IE9 throws
 
- 								// errors on any property access that is not readyState
 
- 								if ( typeof xhr.status !== "number" ) {
 
- 									complete( 0, "error" );
 
- 								} else {
 
- 									complete(
 
- 										// File: protocol always yields status 0; see #8605, #14207
 
- 										xhr.status,
 
- 										xhr.statusText
 
- 									);
 
- 								}
 
- 							} else {
 
- 								complete(
 
- 									xhrSuccessStatus[ xhr.status ] || xhr.status,
 
- 									xhr.statusText,
 
- 									// Support: IE <=9 only
 
- 									// IE9 has no XHR2 but throws on binary (trac-11426)
 
- 									// For XHR2 non-text, let the caller handle it (gh-2498)
 
- 									( xhr.responseType || "text" ) !== "text"  ||
 
- 									typeof xhr.responseText !== "string" ?
 
- 										{ binary: xhr.response } :
 
- 										{ text: xhr.responseText },
 
- 									xhr.getAllResponseHeaders()
 
- 								);
 
- 							}
 
- 						}
 
- 					};
 
- 				};
 
- 				// Listen to events
 
- 				xhr.onload = callback();
 
- 				errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
 
- 				// Support: IE 9 only
 
- 				// Use onreadystatechange to replace onabort
 
- 				// to handle uncaught aborts
 
- 				if ( xhr.onabort !== undefined ) {
 
- 					xhr.onabort = errorCallback;
 
- 				} else {
 
- 					xhr.onreadystatechange = function() {
 
- 						// Check readyState before timeout as it changes
 
- 						if ( xhr.readyState === 4 ) {
 
- 							// Allow onerror to be called first,
 
- 							// but that will not handle a native abort
 
- 							// Also, save errorCallback to a variable
 
- 							// as xhr.onerror cannot be accessed
 
- 							window.setTimeout( function() {
 
- 								if ( callback ) {
 
- 									errorCallback();
 
- 								}
 
- 							} );
 
- 						}
 
- 					};
 
- 				}
 
- 				// Create the abort callback
 
- 				callback = callback( "abort" );
 
- 				try {
 
- 					// Do send the request (this may raise an exception)
 
- 					xhr.send( options.hasContent && options.data || null );
 
- 				} catch ( e ) {
 
- 					// #14683: Only rethrow if this hasn't been notified as an error yet
 
- 					if ( callback ) {
 
- 						throw e;
 
- 					}
 
- 				}
 
- 			},
 
- 			abort: function() {
 
- 				if ( callback ) {
 
- 					callback();
 
- 				}
 
- 			}
 
- 		};
 
- 	}
 
- } );
 
- // Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
 
- jQuery.ajaxPrefilter( function( s ) {
 
- 	if ( s.crossDomain ) {
 
- 		s.contents.script = false;
 
- 	}
 
- } );
 
- // Install script dataType
 
- jQuery.ajaxSetup( {
 
- 	accepts: {
 
- 		script: "text/javascript, application/javascript, " +
 
- 			"application/ecmascript, application/x-ecmascript"
 
- 	},
 
- 	contents: {
 
- 		script: /\b(?:java|ecma)script\b/
 
- 	},
 
- 	converters: {
 
- 		"text script": function( text ) {
 
- 			jQuery.globalEval( text );
 
- 			return text;
 
- 		}
 
- 	}
 
- } );
 
- // Handle cache's special case and crossDomain
 
- jQuery.ajaxPrefilter( "script", function( s ) {
 
- 	if ( s.cache === undefined ) {
 
- 		s.cache = false;
 
- 	}
 
- 	if ( s.crossDomain ) {
 
- 		s.type = "GET";
 
- 	}
 
- } );
 
- // Bind script tag hack transport
 
- jQuery.ajaxTransport( "script", function( s ) {
 
- 	// This transport only deals with cross domain or forced-by-attrs requests
 
- 	if ( s.crossDomain || s.scriptAttrs ) {
 
- 		var script, callback;
 
- 		return {
 
- 			send: function( _, complete ) {
 
- 				script = jQuery( "<script>" )
 
- 					.attr( s.scriptAttrs || {} )
 
- 					.prop( { charset: s.scriptCharset, src: s.url } )
 
- 					.on( "load error", callback = function( evt ) {
 
- 						script.remove();
 
- 						callback = null;
 
- 						if ( evt ) {
 
- 							complete( evt.type === "error" ? 404 : 200, evt.type );
 
- 						}
 
- 					} );
 
- 				// Use native DOM manipulation to avoid our domManip AJAX trickery
 
- 				document.head.appendChild( script[ 0 ] );
 
- 			},
 
- 			abort: function() {
 
- 				if ( callback ) {
 
- 					callback();
 
- 				}
 
- 			}
 
- 		};
 
- 	}
 
- } );
 
- var oldCallbacks = [],
 
- 	rjsonp = /(=)\?(?=&|$)|\?\?/;
 
- // Default jsonp settings
 
- jQuery.ajaxSetup( {
 
- 	jsonp: "callback",
 
- 	jsonpCallback: function() {
 
- 		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
 
- 		this[ callback ] = true;
 
- 		return callback;
 
- 	}
 
- } );
 
- // Detect, normalize options and install callbacks for jsonp requests
 
- jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
 
- 	var callbackName, overwritten, responseContainer,
 
- 		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
 
- 			"url" :
 
- 			typeof s.data === "string" &&
 
- 				( s.contentType || "" )
 
- 					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
 
- 				rjsonp.test( s.data ) && "data"
 
- 		);
 
- 	// Handle iff the expected data type is "jsonp" or we have a parameter to set
 
- 	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
 
- 		// Get callback name, remembering preexisting value associated with it
 
- 		callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
 
- 			s.jsonpCallback() :
 
- 			s.jsonpCallback;
 
- 		// Insert callback into url or form data
 
- 		if ( jsonProp ) {
 
- 			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
 
- 		} else if ( s.jsonp !== false ) {
 
- 			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
 
- 		}
 
- 		// Use data converter to retrieve json after script execution
 
- 		s.converters[ "script json" ] = function() {
 
- 			if ( !responseContainer ) {
 
- 				jQuery.error( callbackName + " was not called" );
 
- 			}
 
- 			return responseContainer[ 0 ];
 
- 		};
 
- 		// Force json dataType
 
- 		s.dataTypes[ 0 ] = "json";
 
- 		// Install callback
 
- 		overwritten = window[ callbackName ];
 
- 		window[ callbackName ] = function() {
 
- 			responseContainer = arguments;
 
- 		};
 
- 		// Clean-up function (fires after converters)
 
- 		jqXHR.always( function() {
 
- 			// If previous value didn't exist - remove it
 
- 			if ( overwritten === undefined ) {
 
- 				jQuery( window ).removeProp( callbackName );
 
- 			// Otherwise restore preexisting value
 
- 			} else {
 
- 				window[ callbackName ] = overwritten;
 
- 			}
 
- 			// Save back as free
 
- 			if ( s[ callbackName ] ) {
 
- 				// Make sure that re-using the options doesn't screw things around
 
- 				s.jsonpCallback = originalSettings.jsonpCallback;
 
- 				// Save the callback name for future use
 
- 				oldCallbacks.push( callbackName );
 
- 			}
 
- 			// Call if it was a function and we have a response
 
- 			if ( responseContainer && isFunction( overwritten ) ) {
 
- 				overwritten( responseContainer[ 0 ] );
 
- 			}
 
- 			responseContainer = overwritten = undefined;
 
- 		} );
 
- 		// Delegate to script
 
- 		return "script";
 
- 	}
 
- } );
 
- // Support: Safari 8 only
 
- // In Safari 8 documents created via document.implementation.createHTMLDocument
 
- // collapse sibling forms: the second one becomes a child of the first one.
 
- // Because of that, this security measure has to be disabled in Safari 8.
 
- // https://bugs.webkit.org/show_bug.cgi?id=137337
 
- support.createHTMLDocument = ( function() {
 
- 	var body = document.implementation.createHTMLDocument( "" ).body;
 
- 	body.innerHTML = "<form></form><form></form>";
 
- 	return body.childNodes.length === 2;
 
- } )();
 
- // Argument "data" should be string of html
 
- // context (optional): If specified, the fragment will be created in this context,
 
- // defaults to document
 
- // keepScripts (optional): If true, will include scripts passed in the html string
 
- jQuery.parseHTML = function( data, context, keepScripts ) {
 
- 	if ( typeof data !== "string" ) {
 
- 		return [];
 
- 	}
 
- 	if ( typeof context === "boolean" ) {
 
- 		keepScripts = context;
 
- 		context = false;
 
- 	}
 
- 	var base, parsed, scripts;
 
- 	if ( !context ) {
 
- 		// Stop scripts or inline event handlers from being executed immediately
 
- 		// by using document.implementation
 
- 		if ( support.createHTMLDocument ) {
 
- 			context = document.implementation.createHTMLDocument( "" );
 
- 			// Set the base href for the created document
 
- 			// so any parsed elements with URLs
 
- 			// are based on the document's URL (gh-2965)
 
- 			base = context.createElement( "base" );
 
- 			base.href = document.location.href;
 
- 			context.head.appendChild( base );
 
- 		} else {
 
- 			context = document;
 
- 		}
 
- 	}
 
- 	parsed = rsingleTag.exec( data );
 
- 	scripts = !keepScripts && [];
 
- 	// Single tag
 
- 	if ( parsed ) {
 
- 		return [ context.createElement( parsed[ 1 ] ) ];
 
- 	}
 
- 	parsed = buildFragment( [ data ], context, scripts );
 
- 	if ( scripts && scripts.length ) {
 
- 		jQuery( scripts ).remove();
 
- 	}
 
- 	return jQuery.merge( [], parsed.childNodes );
 
- };
 
- /**
 
-  * Load a url into a page
 
-  */
 
- jQuery.fn.load = function( url, params, callback ) {
 
- 	var selector, type, response,
 
- 		self = this,
 
- 		off = url.indexOf( " " );
 
- 	if ( off > -1 ) {
 
- 		selector = stripAndCollapse( url.slice( off ) );
 
- 		url = url.slice( 0, off );
 
- 	}
 
- 	// If it's a function
 
- 	if ( isFunction( params ) ) {
 
- 		// We assume that it's the callback
 
- 		callback = params;
 
- 		params = undefined;
 
- 	// Otherwise, build a param string
 
- 	} else if ( params && typeof params === "object" ) {
 
- 		type = "POST";
 
- 	}
 
- 	// If we have elements to modify, make the request
 
- 	if ( self.length > 0 ) {
 
- 		jQuery.ajax( {
 
- 			url: url,
 
- 			// If "type" variable is undefined, then "GET" method will be used.
 
- 			// Make value of this field explicit since
 
- 			// user can override it through ajaxSetup method
 
- 			type: type || "GET",
 
- 			dataType: "html",
 
- 			data: params
 
- 		} ).done( function( responseText ) {
 
- 			// Save response for use in complete callback
 
- 			response = arguments;
 
- 			self.html( selector ?
 
- 				// If a selector was specified, locate the right elements in a dummy div
 
- 				// Exclude scripts to avoid IE 'Permission Denied' errors
 
- 				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
 
- 				// Otherwise use the full result
 
- 				responseText );
 
- 		// If the request succeeds, this function gets "data", "status", "jqXHR"
 
- 		// but they are ignored because response was set above.
 
- 		// If it fails, this function gets "jqXHR", "status", "error"
 
- 		} ).always( callback && function( jqXHR, status ) {
 
- 			self.each( function() {
 
- 				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
 
- 			} );
 
- 		} );
 
- 	}
 
- 	return this;
 
- };
 
- // Attach a bunch of functions for handling common AJAX events
 
- jQuery.each( [
 
- 	"ajaxStart",
 
- 	"ajaxStop",
 
- 	"ajaxComplete",
 
- 	"ajaxError",
 
- 	"ajaxSuccess",
 
- 	"ajaxSend"
 
- ], function( i, type ) {
 
- 	jQuery.fn[ type ] = function( fn ) {
 
- 		return this.on( type, fn );
 
- 	};
 
- } );
 
- jQuery.expr.pseudos.animated = function( elem ) {
 
- 	return jQuery.grep( jQuery.timers, function( fn ) {
 
- 		return elem === fn.elem;
 
- 	} ).length;
 
- };
 
- jQuery.offset = {
 
- 	setOffset: function( elem, options, i ) {
 
- 		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
 
- 			position = jQuery.css( elem, "position" ),
 
- 			curElem = jQuery( elem ),
 
- 			props = {};
 
- 		// Set position first, in-case top/left are set even on static elem
 
- 		if ( position === "static" ) {
 
- 			elem.style.position = "relative";
 
- 		}
 
- 		curOffset = curElem.offset();
 
- 		curCSSTop = jQuery.css( elem, "top" );
 
- 		curCSSLeft = jQuery.css( elem, "left" );
 
- 		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
 
- 			( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
 
- 		// Need to be able to calculate position if either
 
- 		// top or left is auto and position is either absolute or fixed
 
- 		if ( calculatePosition ) {
 
- 			curPosition = curElem.position();
 
- 			curTop = curPosition.top;
 
- 			curLeft = curPosition.left;
 
- 		} else {
 
- 			curTop = parseFloat( curCSSTop ) || 0;
 
- 			curLeft = parseFloat( curCSSLeft ) || 0;
 
- 		}
 
- 		if ( isFunction( options ) ) {
 
- 			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
 
- 			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
 
- 		}
 
- 		if ( options.top != null ) {
 
- 			props.top = ( options.top - curOffset.top ) + curTop;
 
- 		}
 
- 		if ( options.left != null ) {
 
- 			props.left = ( options.left - curOffset.left ) + curLeft;
 
- 		}
 
- 		if ( "using" in options ) {
 
- 			options.using.call( elem, props );
 
- 		} else {
 
- 			curElem.css( props );
 
- 		}
 
- 	}
 
- };
 
- jQuery.fn.extend( {
 
- 	// offset() relates an element's border box to the document origin
 
- 	offset: function( options ) {
 
- 		// Preserve chaining for setter
 
- 		if ( arguments.length ) {
 
- 			return options === undefined ?
 
- 				this :
 
- 				this.each( function( i ) {
 
- 					jQuery.offset.setOffset( this, options, i );
 
- 				} );
 
- 		}
 
- 		var rect, win,
 
- 			elem = this[ 0 ];
 
- 		if ( !elem ) {
 
- 			return;
 
- 		}
 
- 		// Return zeros for disconnected and hidden (display: none) elements (gh-2310)
 
- 		// Support: IE <=11 only
 
- 		// Running getBoundingClientRect on a
 
- 		// disconnected node in IE throws an error
 
- 		if ( !elem.getClientRects().length ) {
 
- 			return { top: 0, left: 0 };
 
- 		}
 
- 		// Get document-relative position by adding viewport scroll to viewport-relative gBCR
 
- 		rect = elem.getBoundingClientRect();
 
- 		win = elem.ownerDocument.defaultView;
 
- 		return {
 
- 			top: rect.top + win.pageYOffset,
 
- 			left: rect.left + win.pageXOffset
 
- 		};
 
- 	},
 
- 	// position() relates an element's margin box to its offset parent's padding box
 
- 	// This corresponds to the behavior of CSS absolute positioning
 
- 	position: function() {
 
- 		if ( !this[ 0 ] ) {
 
- 			return;
 
- 		}
 
- 		var offsetParent, offset, doc,
 
- 			elem = this[ 0 ],
 
- 			parentOffset = { top: 0, left: 0 };
 
- 		// position:fixed elements are offset from the viewport, which itself always has zero offset
 
- 		if ( jQuery.css( elem, "position" ) === "fixed" ) {
 
- 			// Assume position:fixed implies availability of getBoundingClientRect
 
- 			offset = elem.getBoundingClientRect();
 
- 		} else {
 
- 			offset = this.offset();
 
- 			// Account for the *real* offset parent, which can be the document or its root element
 
- 			// when a statically positioned element is identified
 
- 			doc = elem.ownerDocument;
 
- 			offsetParent = elem.offsetParent || doc.documentElement;
 
- 			while ( offsetParent &&
 
- 				( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
 
- 				jQuery.css( offsetParent, "position" ) === "static" ) {
 
- 				offsetParent = offsetParent.parentNode;
 
- 			}
 
- 			if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
 
- 				// Incorporate borders into its offset, since they are outside its content origin
 
- 				parentOffset = jQuery( offsetParent ).offset();
 
- 				parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
 
- 				parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
 
- 			}
 
- 		}
 
- 		// Subtract parent offsets and element margins
 
- 		return {
 
- 			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
 
- 			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
 
- 		};
 
- 	},
 
- 	// This method will return documentElement in the following cases:
 
- 	// 1) For the element inside the iframe without offsetParent, this method will return
 
- 	//    documentElement of the parent window
 
- 	// 2) For the hidden or detached element
 
- 	// 3) For body or html element, i.e. in case of the html node - it will return itself
 
- 	//
 
- 	// but those exceptions were never presented as a real life use-cases
 
- 	// and might be considered as more preferable results.
 
- 	//
 
- 	// This logic, however, is not guaranteed and can change at any point in the future
 
- 	offsetParent: function() {
 
- 		return this.map( function() {
 
- 			var offsetParent = this.offsetParent;
 
- 			while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
 
- 				offsetParent = offsetParent.offsetParent;
 
- 			}
 
- 			return offsetParent || documentElement;
 
- 		} );
 
- 	}
 
- } );
 
- // Create scrollLeft and scrollTop methods
 
- jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
 
- 	var top = "pageYOffset" === prop;
 
- 	jQuery.fn[ method ] = function( val ) {
 
- 		return access( this, function( elem, method, val ) {
 
- 			// Coalesce documents and windows
 
- 			var win;
 
- 			if ( isWindow( elem ) ) {
 
- 				win = elem;
 
- 			} else if ( elem.nodeType === 9 ) {
 
- 				win = elem.defaultView;
 
- 			}
 
- 			if ( val === undefined ) {
 
- 				return win ? win[ prop ] : elem[ method ];
 
- 			}
 
- 			if ( win ) {
 
- 				win.scrollTo(
 
- 					!top ? val : win.pageXOffset,
 
- 					top ? val : win.pageYOffset
 
- 				);
 
- 			} else {
 
- 				elem[ method ] = val;
 
- 			}
 
- 		}, method, val, arguments.length );
 
- 	};
 
- } );
 
- // Support: Safari <=7 - 9.1, Chrome <=37 - 49
 
- // Add the top/left cssHooks using jQuery.fn.position
 
- // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
 
- // Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
 
- // getComputedStyle returns percent when specified for top/left/bottom/right;
 
- // rather than make the css module depend on the offset module, just check for it here
 
- jQuery.each( [ "top", "left" ], function( i, prop ) {
 
- 	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
 
- 		function( elem, computed ) {
 
- 			if ( computed ) {
 
- 				computed = curCSS( elem, prop );
 
- 				// If curCSS returns percentage, fallback to offset
 
- 				return rnumnonpx.test( computed ) ?
 
- 					jQuery( elem ).position()[ prop ] + "px" :
 
- 					computed;
 
- 			}
 
- 		}
 
- 	);
 
- } );
 
- // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
 
- jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
 
- 	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
 
- 		function( defaultExtra, funcName ) {
 
- 		// Margin is only for outerHeight, outerWidth
 
- 		jQuery.fn[ funcName ] = function( margin, value ) {
 
- 			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
 
- 				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
 
- 			return access( this, function( elem, type, value ) {
 
- 				var doc;
 
- 				if ( isWindow( elem ) ) {
 
- 					// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
 
- 					return funcName.indexOf( "outer" ) === 0 ?
 
- 						elem[ "inner" + name ] :
 
- 						elem.document.documentElement[ "client" + name ];
 
- 				}
 
- 				// Get document width or height
 
- 				if ( elem.nodeType === 9 ) {
 
- 					doc = elem.documentElement;
 
- 					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
 
- 					// whichever is greatest
 
- 					return Math.max(
 
- 						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
 
- 						elem.body[ "offset" + name ], doc[ "offset" + name ],
 
- 						doc[ "client" + name ]
 
- 					);
 
- 				}
 
- 				return value === undefined ?
 
- 					// Get width or height on the element, requesting but not forcing parseFloat
 
- 					jQuery.css( elem, type, extra ) :
 
- 					// Set width or height on the element
 
- 					jQuery.style( elem, type, value, extra );
 
- 			}, type, chainable ? margin : undefined, chainable );
 
- 		};
 
- 	} );
 
- } );
 
- jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
 
- 	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
 
- 	"change select submit keydown keypress keyup contextmenu" ).split( " " ),
 
- 	function( i, name ) {
 
- 	// Handle event binding
 
- 	jQuery.fn[ name ] = function( data, fn ) {
 
- 		return arguments.length > 0 ?
 
- 			this.on( name, null, data, fn ) :
 
- 			this.trigger( name );
 
- 	};
 
- } );
 
- jQuery.fn.extend( {
 
- 	hover: function( fnOver, fnOut ) {
 
- 		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
 
- 	}
 
- } );
 
- jQuery.fn.extend( {
 
- 	bind: function( types, data, fn ) {
 
- 		return this.on( types, null, data, fn );
 
- 	},
 
- 	unbind: function( types, fn ) {
 
- 		return this.off( types, null, fn );
 
- 	},
 
- 	delegate: function( selector, types, data, fn ) {
 
- 		return this.on( types, selector, data, fn );
 
- 	},
 
- 	undelegate: function( selector, types, fn ) {
 
- 		// ( namespace ) or ( selector, types [, fn] )
 
- 		return arguments.length === 1 ?
 
- 			this.off( selector, "**" ) :
 
- 			this.off( types, selector || "**", fn );
 
- 	}
 
- } );
 
- // Bind a function to a context, optionally partially applying any
 
- // arguments.
 
- // jQuery.proxy is deprecated to promote standards (specifically Function#bind)
 
- // However, it is not slated for removal any time soon
 
- jQuery.proxy = function( fn, context ) {
 
- 	var tmp, args, proxy;
 
- 	if ( typeof context === "string" ) {
 
- 		tmp = fn[ context ];
 
- 		context = fn;
 
- 		fn = tmp;
 
- 	}
 
- 	// Quick check to determine if target is callable, in the spec
 
- 	// this throws a TypeError, but we will just return undefined.
 
- 	if ( !isFunction( fn ) ) {
 
- 		return undefined;
 
- 	}
 
- 	// Simulated bind
 
- 	args = slice.call( arguments, 2 );
 
- 	proxy = function() {
 
- 		return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
 
- 	};
 
- 	// Set the guid of unique handler to the same of original handler, so it can be removed
 
- 	proxy.guid = fn.guid = fn.guid || jQuery.guid++;
 
- 	return proxy;
 
- };
 
- jQuery.holdReady = function( hold ) {
 
- 	if ( hold ) {
 
- 		jQuery.readyWait++;
 
- 	} else {
 
- 		jQuery.ready( true );
 
- 	}
 
- };
 
- jQuery.isArray = Array.isArray;
 
- jQuery.parseJSON = JSON.parse;
 
- jQuery.nodeName = nodeName;
 
- jQuery.isFunction = isFunction;
 
- jQuery.isWindow = isWindow;
 
- jQuery.camelCase = camelCase;
 
- jQuery.type = toType;
 
- jQuery.now = Date.now;
 
- jQuery.isNumeric = function( obj ) {
 
- 	// As of jQuery 3.0, isNumeric is limited to
 
- 	// strings and numbers (primitives or objects)
 
- 	// that can be coerced to finite numbers (gh-2662)
 
- 	var type = jQuery.type( obj );
 
- 	return ( type === "number" || type === "string" ) &&
 
- 		// parseFloat NaNs numeric-cast false positives ("")
 
- 		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
 
- 		// subtraction forces infinities to NaN
 
- 		!isNaN( obj - parseFloat( obj ) );
 
- };
 
- // Register as a named AMD module, since jQuery can be concatenated with other
 
- // files that may use define, but not via a proper concatenation script that
 
- // understands anonymous AMD modules. A named AMD is safest and most robust
 
- // way to register. Lowercase jquery is used because AMD module names are
 
- // derived from file names, and jQuery is normally delivered in a lowercase
 
- // file name. Do this after creating the global so that if an AMD module wants
 
- // to call noConflict to hide this version of jQuery, it will work.
 
- // Note that for maximum portability, libraries that are not jQuery should
 
- // declare themselves as anonymous modules, and avoid setting a global if an
 
- // AMD loader is present. jQuery is a special case. For more information, see
 
- // https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
 
- if ( typeof define === "function" && define.amd ) {
 
- 	define( "jquery", [], function() {
 
- 		return jQuery;
 
- 	} );
 
- }
 
- var
 
- 	// Map over jQuery in case of overwrite
 
- 	_jQuery = window.jQuery,
 
- 	// Map over the $ in case of overwrite
 
- 	_$ = window.$;
 
- jQuery.noConflict = function( deep ) {
 
- 	if ( window.$ === jQuery ) {
 
- 		window.$ = _$;
 
- 	}
 
- 	if ( deep && window.jQuery === jQuery ) {
 
- 		window.jQuery = _jQuery;
 
- 	}
 
- 	return jQuery;
 
- };
 
- // Expose jQuery and $ identifiers, even in AMD
 
- // (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
 
- // and CommonJS for browser emulators (#13566)
 
- if ( !noGlobal ) {
 
- 	window.jQuery = window.$ = jQuery;
 
- }
 
- return jQuery;
 
- } );
 
- /*! jQuery UI - v1.11.4 - 2016-03-02
 
- * http://jqueryui.com
 
- * Includes: core.js, widget.js, mouse.js, draggable.js, droppable.js, sortable.js, effect.js, effect-slide.js
 
- * Copyright jQuery Foundation and other contributors; Licensed MIT */
 
- (function( factory ) {
 
- 	if ( typeof define === "function" && define.amd ) {
 
- 		// AMD. Register as an anonymous module.
 
- 		define([ "jquery" ], factory );
 
- 	} else {
 
- 		// Browser globals
 
- 		factory( jQuery );
 
- 	}
 
- }(function( $ ) {
 
- /*!
 
-  * jQuery UI Core 1.11.4
 
-  * http://jqueryui.com
 
-  *
 
-  * Copyright jQuery Foundation and other contributors
 
-  * Released under the MIT license.
 
-  * http://jquery.org/license
 
-  *
 
-  * http://api.jqueryui.com/category/ui-core/
 
-  */
 
- // $.ui might exist from components with no dependencies, e.g., $.ui.position
 
- $.ui = $.ui || {};
 
- $.extend( $.ui, {
 
- 	version: "1.11.4",
 
- 	keyCode: {
 
- 		BACKSPACE: 8,
 
- 		COMMA: 188,
 
- 		DELETE: 46,
 
- 		DOWN: 40,
 
- 		END: 35,
 
- 		ENTER: 13,
 
- 		ESCAPE: 27,
 
- 		HOME: 36,
 
- 		LEFT: 37,
 
- 		PAGE_DOWN: 34,
 
- 		PAGE_UP: 33,
 
- 		PERIOD: 190,
 
- 		RIGHT: 39,
 
- 		SPACE: 32,
 
- 		TAB: 9,
 
- 		UP: 38
 
- 	}
 
- });
 
- // plugins
 
- $.fn.extend({
 
- 	scrollParent: function( includeHidden ) {
 
- 		var position = this.css( "position" ),
 
- 			excludeStaticParent = position === "absolute",
 
- 			overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,
 
- 			scrollParent = this.parents().filter( function() {
 
- 				var parent = $( this );
 
- 				if ( excludeStaticParent && parent.css( "position" ) === "static" ) {
 
- 					return false;
 
- 				}
 
- 				return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) + parent.css( "overflow-x" ) );
 
- 			}).eq( 0 );
 
- 		return position === "fixed" || !scrollParent.length ? $( this[ 0 ].ownerDocument || document ) : scrollParent;
 
- 	},
 
- 	uniqueId: (function() {
 
- 		var uuid = 0;
 
- 		return function() {
 
- 			return this.each(function() {
 
- 				if ( !this.id ) {
 
- 					this.id = "ui-id-" + ( ++uuid );
 
- 				}
 
- 			});
 
- 		};
 
- 	})(),
 
- 	removeUniqueId: function() {
 
- 		return this.each(function() {
 
- 			if ( /^ui-id-\d+$/.test( this.id ) ) {
 
- 				$( this ).removeAttr( "id" );
 
- 			}
 
- 		});
 
- 	}
 
- });
 
- // selectors
 
- function focusable( element, isTabIndexNotNaN ) {
 
- 	var map, mapName, img,
 
- 		nodeName = element.nodeName.toLowerCase();
 
- 	if ( "area" === nodeName ) {
 
- 		map = element.parentNode;
 
- 		mapName = map.name;
 
- 		if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
 
- 			return false;
 
- 		}
 
- 		img = $( "img[usemap='#" + mapName + "']" )[ 0 ];
 
- 		return !!img && visible( img );
 
- 	}
 
- 	return ( /^(input|select|textarea|button|object)$/.test( nodeName ) ?
 
- 		!element.disabled :
 
- 		"a" === nodeName ?
 
- 			element.href || isTabIndexNotNaN :
 
- 			isTabIndexNotNaN) &&
 
- 		// the element and all of its ancestors must be visible
 
- 		visible( element );
 
- }
 
- function visible( element ) {
 
- 	return $.expr.filters.visible( element ) &&
 
- 		!$( element ).parents().addBack().filter(function() {
 
- 			return $.css( this, "visibility" ) === "hidden";
 
- 		}).length;
 
- }
 
- $.extend( $.expr[ ":" ], {
 
- 	data: $.expr.createPseudo ?
 
- 		$.expr.createPseudo(function( dataName ) {
 
- 			return function( elem ) {
 
- 				return !!$.data( elem, dataName );
 
- 			};
 
- 		}) :
 
- 		// support: jQuery <1.8
 
- 		function( elem, i, match ) {
 
- 			return !!$.data( elem, match[ 3 ] );
 
- 		},
 
- 	focusable: function( element ) {
 
- 		return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
 
- 	},
 
- 	tabbable: function( element ) {
 
- 		var tabIndex = $.attr( element, "tabindex" ),
 
- 			isTabIndexNaN = isNaN( tabIndex );
 
- 		return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
 
- 	}
 
- });
 
- // support: jQuery <1.8
 
- if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
 
- 	$.each( [ "Width", "Height" ], function( i, name ) {
 
- 		var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
 
- 			type = name.toLowerCase(),
 
- 			orig = {
 
- 				innerWidth: $.fn.innerWidth,
 
- 				innerHeight: $.fn.innerHeight,
 
- 				outerWidth: $.fn.outerWidth,
 
- 				outerHeight: $.fn.outerHeight
 
- 			};
 
- 		function reduce( elem, size, border, margin ) {
 
- 			$.each( side, function() {
 
- 				size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
 
- 				if ( border ) {
 
- 					size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;
 
- 				}
 
- 				if ( margin ) {
 
- 					size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
 
- 				}
 
- 			});
 
- 			return size;
 
- 		}
 
- 		$.fn[ "inner" + name ] = function( size ) {
 
- 			if ( size === undefined ) {
 
- 				return orig[ "inner" + name ].call( this );
 
- 			}
 
- 			return this.each(function() {
 
- 				$( this ).css( type, reduce( this, size ) + "px" );
 
- 			});
 
- 		};
 
- 		$.fn[ "outer" + name] = function( size, margin ) {
 
- 			if ( typeof size !== "number" ) {
 
- 				return orig[ "outer" + name ].call( this, size );
 
- 			}
 
- 			return this.each(function() {
 
- 				$( this).css( type, reduce( this, size, true, margin ) + "px" );
 
- 			});
 
- 		};
 
- 	});
 
- }
 
- // support: jQuery <1.8
 
- if ( !$.fn.addBack ) {
 
- 	$.fn.addBack = function( selector ) {
 
- 		return this.add( selector == null ?
 
- 			this.prevObject : this.prevObject.filter( selector )
 
- 		);
 
- 	};
 
- }
 
- // support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
 
- if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
 
- 	$.fn.removeData = (function( removeData ) {
 
- 		return function( key ) {
 
- 			if ( arguments.length ) {
 
- 				return removeData.call( this, $.camelCase( key ) );
 
- 			} else {
 
- 				return removeData.call( this );
 
- 			}
 
- 		};
 
- 	})( $.fn.removeData );
 
- }
 
- // deprecated
 
- $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
 
- $.fn.extend({
 
- 	focus: (function( orig ) {
 
- 		return function( delay, fn ) {
 
- 			return typeof delay === "number" ?
 
- 				this.each(function() {
 
- 					var elem = this;
 
- 					setTimeout(function() {
 
- 						$( elem ).focus();
 
- 						if ( fn ) {
 
- 							fn.call( elem );
 
- 						}
 
- 					}, delay );
 
- 				}) :
 
- 				orig.apply( this, arguments );
 
- 		};
 
- 	})( $.fn.focus ),
 
- 	disableSelection: (function() {
 
- 		var eventType = "onselectstart" in document.createElement( "div" ) ?
 
- 			"selectstart" :
 
- 			"mousedown";
 
- 		return function() {
 
- 			return this.bind( eventType + ".ui-disableSelection", function( event ) {
 
- 				event.preventDefault();
 
- 			});
 
- 		};
 
- 	})(),
 
- 	enableSelection: function() {
 
- 		return this.unbind( ".ui-disableSelection" );
 
- 	},
 
- 	zIndex: function( zIndex ) {
 
- 		if ( zIndex !== undefined ) {
 
- 			return this.css( "zIndex", zIndex );
 
- 		}
 
- 		if ( this.length ) {
 
- 			var elem = $( this[ 0 ] ), position, value;
 
- 			while ( elem.length && elem[ 0 ] !== document ) {
 
- 				// Ignore z-index if position is set to a value where z-index is ignored by the browser
 
- 				// This makes behavior of this function consistent across browsers
 
- 				// WebKit always returns auto if the element is positioned
 
- 				position = elem.css( "position" );
 
- 				if ( position === "absolute" || position === "relative" || position === "fixed" ) {
 
- 					// IE returns 0 when zIndex is not specified
 
- 					// other browsers return a string
 
- 					// we ignore the case of nested elements with an explicit value of 0
 
- 					// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
 
- 					value = parseInt( elem.css( "zIndex" ), 10 );
 
- 					if ( !isNaN( value ) && value !== 0 ) {
 
- 						return value;
 
- 					}
 
- 				}
 
- 				elem = elem.parent();
 
- 			}
 
- 		}
 
- 		return 0;
 
- 	}
 
- });
 
- // $.ui.plugin is deprecated. Use $.widget() extensions instead.
 
- $.ui.plugin = {
 
- 	add: function( module, option, set ) {
 
- 		var i,
 
- 			proto = $.ui[ module ].prototype;
 
- 		for ( i in set ) {
 
- 			proto.plugins[ i ] = proto.plugins[ i ] || [];
 
- 			proto.plugins[ i ].push( [ option, set[ i ] ] );
 
- 		}
 
- 	},
 
- 	call: function( instance, name, args, allowDisconnected ) {
 
- 		var i,
 
- 			set = instance.plugins[ name ];
 
- 		if ( !set ) {
 
- 			return;
 
- 		}
 
- 		if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) ) {
 
- 			return;
 
- 		}
 
- 		for ( i = 0; i < set.length; i++ ) {
 
- 			if ( instance.options[ set[ i ][ 0 ] ] ) {
 
- 				set[ i ][ 1 ].apply( instance.element, args );
 
- 			}
 
- 		}
 
- 	}
 
- };
 
- /*!
 
-  * jQuery UI Widget 1.11.4
 
-  * http://jqueryui.com
 
-  *
 
-  * Copyright jQuery Foundation and other contributors
 
-  * Released under the MIT license.
 
-  * http://jquery.org/license
 
-  *
 
-  * http://api.jqueryui.com/jQuery.widget/
 
-  */
 
- var widget_uuid = 0,
 
- 	widget_slice = Array.prototype.slice;
 
- $.cleanData = (function( orig ) {
 
- 	return function( elems ) {
 
- 		var events, elem, i;
 
- 		for ( i = 0; (elem = elems[i]) != null; i++ ) {
 
- 			try {
 
- 				// Only trigger remove when necessary to save time
 
- 				events = $._data( elem, "events" );
 
- 				if ( events && events.remove ) {
 
- 					$( elem ).triggerHandler( "remove" );
 
- 				}
 
- 			// http://bugs.jquery.com/ticket/8235
 
- 			} catch ( e ) {}
 
- 		}
 
- 		orig( elems );
 
- 	};
 
- })( $.cleanData );
 
- $.widget = function( name, base, prototype ) {
 
- 	var fullName, existingConstructor, constructor, basePrototype,
 
- 		// proxiedPrototype allows the provided prototype to remain unmodified
 
- 		// so that it can be used as a mixin for multiple widgets (#8876)
 
- 		proxiedPrototype = {},
 
- 		namespace = name.split( "." )[ 0 ];
 
- 	name = name.split( "." )[ 1 ];
 
- 	fullName = namespace + "-" + name;
 
- 	if ( !prototype ) {
 
- 		prototype = base;
 
- 		base = $.Widget;
 
- 	}
 
- 	// create selector for plugin
 
- 	$.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
 
- 		return !!$.data( elem, fullName );
 
- 	};
 
- 	$[ namespace ] = $[ namespace ] || {};
 
- 	existingConstructor = $[ namespace ][ name ];
 
- 	constructor = $[ namespace ][ name ] = function( options, element ) {
 
- 		// allow instantiation without "new" keyword
 
- 		if ( !this._createWidget ) {
 
- 			return new constructor( options, element );
 
- 		}
 
- 		// allow instantiation without initializing for simple inheritance
 
- 		// must use "new" keyword (the code above always passes args)
 
- 		if ( arguments.length ) {
 
- 			this._createWidget( options, element );
 
- 		}
 
- 	};
 
- 	// extend with the existing constructor to carry over any static properties
 
- 	$.extend( constructor, existingConstructor, {
 
- 		version: prototype.version,
 
- 		// copy the object used to create the prototype in case we need to
 
- 		// redefine the widget later
 
- 		_proto: $.extend( {}, prototype ),
 
- 		// track widgets that inherit from this widget in case this widget is
 
- 		// redefined after a widget inherits from it
 
- 		_childConstructors: []
 
- 	});
 
- 	basePrototype = new base();
 
- 	// we need to make the options hash a property directly on the new instance
 
- 	// otherwise we'll modify the options hash on the prototype that we're
 
- 	// inheriting from
 
- 	basePrototype.options = $.widget.extend( {}, basePrototype.options );
 
- 	$.each( prototype, function( prop, value ) {
 
- 		if ( !$.isFunction( value ) ) {
 
- 			proxiedPrototype[ prop ] = value;
 
- 			return;
 
- 		}
 
- 		proxiedPrototype[ prop ] = (function() {
 
- 			var _super = function() {
 
- 					return base.prototype[ prop ].apply( this, arguments );
 
- 				},
 
- 				_superApply = function( args ) {
 
- 					return base.prototype[ prop ].apply( this, args );
 
- 				};
 
- 			return function() {
 
- 				var __super = this._super,
 
- 					__superApply = this._superApply,
 
- 					returnValue;
 
- 				this._super = _super;
 
- 				this._superApply = _superApply;
 
- 				returnValue = value.apply( this, arguments );
 
- 				this._super = __super;
 
- 				this._superApply = __superApply;
 
- 				return returnValue;
 
- 			};
 
- 		})();
 
- 	});
 
- 	constructor.prototype = $.widget.extend( basePrototype, {
 
- 		// TODO: remove support for widgetEventPrefix
 
- 		// always use the name + a colon as the prefix, e.g., draggable:start
 
- 		// don't prefix for widgets that aren't DOM-based
 
- 		widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name
 
- 	}, proxiedPrototype, {
 
- 		constructor: constructor,
 
- 		namespace: namespace,
 
- 		widgetName: name,
 
- 		widgetFullName: fullName
 
- 	});
 
- 	// If this widget is being redefined then we need to find all widgets that
 
- 	// are inheriting from it and redefine all of them so that they inherit from
 
- 	// the new version of this widget. We're essentially trying to replace one
 
- 	// level in the prototype chain.
 
- 	if ( existingConstructor ) {
 
- 		$.each( existingConstructor._childConstructors, function( i, child ) {
 
- 			var childPrototype = child.prototype;
 
- 			// redefine the child widget using the same prototype that was
 
- 			// originally used, but inherit from the new version of the base
 
- 			$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
 
- 		});
 
- 		// remove the list of existing child constructors from the old constructor
 
- 		// so the old child constructors can be garbage collected
 
- 		delete existingConstructor._childConstructors;
 
- 	} else {
 
- 		base._childConstructors.push( constructor );
 
- 	}
 
- 	$.widget.bridge( name, constructor );
 
- 	return constructor;
 
- };
 
- $.widget.extend = function( target ) {
 
- 	var input = widget_slice.call( arguments, 1 ),
 
- 		inputIndex = 0,
 
- 		inputLength = input.length,
 
- 		key,
 
- 		value;
 
- 	for ( ; inputIndex < inputLength; inputIndex++ ) {
 
- 		for ( key in input[ inputIndex ] ) {
 
- 			value = input[ inputIndex ][ key ];
 
- 			if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
 
- 				// Clone objects
 
- 				if ( $.isPlainObject( value ) ) {
 
- 					target[ key ] = $.isPlainObject( target[ key ] ) ?
 
- 						$.widget.extend( {}, target[ key ], value ) :
 
- 						// Don't extend strings, arrays, etc. with objects
 
- 						$.widget.extend( {}, value );
 
- 				// Copy everything else by reference
 
- 				} else {
 
- 					target[ key ] = value;
 
- 				}
 
- 			}
 
- 		}
 
- 	}
 
- 	return target;
 
- };
 
- $.widget.bridge = function( name, object ) {
 
- 	var fullName = object.prototype.widgetFullName || name;
 
- 	$.fn[ name ] = function( options ) {
 
- 		var isMethodCall = typeof options === "string",
 
- 			args = widget_slice.call( arguments, 1 ),
 
- 			returnValue = this;
 
- 		if ( isMethodCall ) {
 
- 			this.each(function() {
 
- 				var methodValue,
 
- 					instance = $.data( this, fullName );
 
- 				if ( options === "instance" ) {
 
- 					returnValue = instance;
 
- 					return false;
 
- 				}
 
- 				if ( !instance ) {
 
- 					return $.error( "cannot call methods on " + name + " prior to initialization; " +
 
- 						"attempted to call method '" + options + "'" );
 
- 				}
 
- 				if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
 
- 					return $.error( "no such method '" + options + "' for " + name + " widget instance" );
 
- 				}
 
- 				methodValue = instance[ options ].apply( instance, args );
 
- 				if ( methodValue !== instance && methodValue !== undefined ) {
 
- 					returnValue = methodValue && methodValue.jquery ?
 
- 						returnValue.pushStack( methodValue.get() ) :
 
- 						methodValue;
 
- 					return false;
 
- 				}
 
- 			});
 
- 		} else {
 
- 			// Allow multiple hashes to be passed on init
 
- 			if ( args.length ) {
 
- 				options = $.widget.extend.apply( null, [ options ].concat(args) );
 
- 			}
 
- 			this.each(function() {
 
- 				var instance = $.data( this, fullName );
 
- 				if ( instance ) {
 
- 					instance.option( options || {} );
 
- 					if ( instance._init ) {
 
- 						instance._init();
 
- 					}
 
- 				} else {
 
- 					$.data( this, fullName, new object( options, this ) );
 
- 				}
 
- 			});
 
- 		}
 
- 		return returnValue;
 
- 	};
 
- };
 
- $.Widget = function( /* options, element */ ) {};
 
- $.Widget._childConstructors = [];
 
- $.Widget.prototype = {
 
- 	widgetName: "widget",
 
- 	widgetEventPrefix: "",
 
- 	defaultElement: "<div>",
 
- 	options: {
 
- 		disabled: false,
 
- 		// callbacks
 
- 		create: null
 
- 	},
 
- 	_createWidget: function( options, element ) {
 
- 		element = $( element || this.defaultElement || this )[ 0 ];
 
- 		this.element = $( element );
 
- 		this.uuid = widget_uuid++;
 
- 		this.eventNamespace = "." + this.widgetName + this.uuid;
 
- 		this.bindings = $();
 
- 		this.hoverable = $();
 
- 		this.focusable = $();
 
- 		if ( element !== this ) {
 
- 			$.data( element, this.widgetFullName, this );
 
- 			this._on( true, this.element, {
 
- 				remove: function( event ) {
 
- 					if ( event.target === element ) {
 
- 						this.destroy();
 
- 					}
 
- 				}
 
- 			});
 
- 			this.document = $( element.style ?
 
- 				// element within the document
 
- 				element.ownerDocument :
 
- 				// element is window or document
 
- 				element.document || element );
 
- 			this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
 
- 		}
 
- 		this.options = $.widget.extend( {},
 
- 			this.options,
 
- 			this._getCreateOptions(),
 
- 			options );
 
- 		this._create();
 
- 		this._trigger( "create", null, this._getCreateEventData() );
 
- 		this._init();
 
- 	},
 
- 	_getCreateOptions: $.noop,
 
- 	_getCreateEventData: $.noop,
 
- 	_create: $.noop,
 
- 	_init: $.noop,
 
- 	destroy: function() {
 
- 		this._destroy();
 
- 		// we can probably remove the unbind calls in 2.0
 
- 		// all event bindings should go through this._on()
 
- 		this.element
 
- 			.unbind( this.eventNamespace )
 
- 			.removeData( this.widgetFullName )
 
- 			// support: jquery <1.6.3
 
- 			// http://bugs.jquery.com/ticket/9413
 
- 			.removeData( $.camelCase( this.widgetFullName ) );
 
- 		this.widget()
 
- 			.unbind( this.eventNamespace )
 
- 			.removeAttr( "aria-disabled" )
 
- 			.removeClass(
 
- 				this.widgetFullName + "-disabled " +
 
- 				"ui-state-disabled" );
 
- 		// clean up events and states
 
- 		this.bindings.unbind( this.eventNamespace );
 
- 		this.hoverable.removeClass( "ui-state-hover" );
 
- 		this.focusable.removeClass( "ui-state-focus" );
 
- 	},
 
- 	_destroy: $.noop,
 
- 	widget: function() {
 
- 		return this.element;
 
- 	},
 
- 	option: function( key, value ) {
 
- 		var options = key,
 
- 			parts,
 
- 			curOption,
 
- 			i;
 
- 		if ( arguments.length === 0 ) {
 
- 			// don't return a reference to the internal hash
 
- 			return $.widget.extend( {}, this.options );
 
- 		}
 
- 		if ( typeof key === "string" ) {
 
- 			// handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
 
- 			options = {};
 
- 			parts = key.split( "." );
 
- 			key = parts.shift();
 
- 			if ( parts.length ) {
 
- 				curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
 
- 				for ( i = 0; i < parts.length - 1; i++ ) {
 
- 					curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
 
- 					curOption = curOption[ parts[ i ] ];
 
- 				}
 
- 				key = parts.pop();
 
- 				if ( arguments.length === 1 ) {
 
- 					return curOption[ key ] === undefined ? null : curOption[ key ];
 
- 				}
 
- 				curOption[ key ] = value;
 
- 			} else {
 
- 				if ( arguments.length === 1 ) {
 
- 					return this.options[ key ] === undefined ? null : this.options[ key ];
 
- 				}
 
- 				options[ key ] = value;
 
- 			}
 
- 		}
 
- 		this._setOptions( options );
 
- 		return this;
 
- 	},
 
- 	_setOptions: function( options ) {
 
- 		var key;
 
- 		for ( key in options ) {
 
- 			this._setOption( key, options[ key ] );
 
- 		}
 
- 		return this;
 
- 	},
 
- 	_setOption: function( key, value ) {
 
- 		this.options[ key ] = value;
 
- 		if ( key === "disabled" ) {
 
- 			this.widget()
 
- 				.toggleClass( this.widgetFullName + "-disabled", !!value );
 
- 			// If the widget is becoming disabled, then nothing is interactive
 
- 			if ( value ) {
 
- 				this.hoverable.removeClass( "ui-state-hover" );
 
- 				this.focusable.removeClass( "ui-state-focus" );
 
- 			}
 
- 		}
 
- 		return this;
 
- 	},
 
- 	enable: function() {
 
- 		return this._setOptions({ disabled: false });
 
- 	},
 
- 	disable: function() {
 
- 		return this._setOptions({ disabled: true });
 
- 	},
 
- 	_on: function( suppressDisabledCheck, element, handlers ) {
 
- 		var delegateElement,
 
- 			instance = this;
 
- 		// no suppressDisabledCheck flag, shuffle arguments
 
- 		if ( typeof suppressDisabledCheck !== "boolean" ) {
 
- 			handlers = element;
 
- 			element = suppressDisabledCheck;
 
- 			suppressDisabledCheck = false;
 
- 		}
 
- 		// no element argument, shuffle and use this.element
 
- 		if ( !handlers ) {
 
- 			handlers = element;
 
- 			element = this.element;
 
- 			delegateElement = this.widget();
 
- 		} else {
 
- 			element = delegateElement = $( element );
 
- 			this.bindings = this.bindings.add( element );
 
- 		}
 
- 		$.each( handlers, function( event, handler ) {
 
- 			function handlerProxy() {
 
- 				// allow widgets to customize the disabled handling
 
- 				// - disabled as an array instead of boolean
 
- 				// - disabled class as method for disabling individual parts
 
- 				if ( !suppressDisabledCheck &&
 
- 						( instance.options.disabled === true ||
 
- 							$( this ).hasClass( "ui-state-disabled" ) ) ) {
 
- 					return;
 
- 				}
 
- 				return ( typeof handler === "string" ? instance[ handler ] : handler )
 
- 					.apply( instance, arguments );
 
- 			}
 
- 			// copy the guid so direct unbinding works
 
- 			if ( typeof handler !== "string" ) {
 
- 				handlerProxy.guid = handler.guid =
 
- 					handler.guid || handlerProxy.guid || $.guid++;
 
- 			}
 
- 			var match = event.match( /^([\w:-]*)\s*(.*)$/ ),
 
- 				eventName = match[1] + instance.eventNamespace,
 
- 				selector = match[2];
 
- 			if ( selector ) {
 
- 				delegateElement.delegate( selector, eventName, handlerProxy );
 
- 			} else {
 
- 				element.bind( eventName, handlerProxy );
 
- 			}
 
- 		});
 
- 	},
 
- 	_off: function( element, eventName ) {
 
- 		eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) +
 
- 			this.eventNamespace;
 
- 		element.unbind( eventName ).undelegate( eventName );
 
- 		// Clear the stack to avoid memory leaks (#10056)
 
- 		this.bindings = $( this.bindings.not( element ).get() );
 
- 		this.focusable = $( this.focusable.not( element ).get() );
 
- 		this.hoverable = $( this.hoverable.not( element ).get() );
 
- 	},
 
- 	_delay: function( handler, delay ) {
 
- 		function handlerProxy() {
 
- 			return ( typeof handler === "string" ? instance[ handler ] : handler )
 
- 				.apply( instance, arguments );
 
- 		}
 
- 		var instance = this;
 
- 		return setTimeout( handlerProxy, delay || 0 );
 
- 	},
 
- 	_hoverable: function( element ) {
 
- 		this.hoverable = this.hoverable.add( element );
 
- 		this._on( element, {
 
- 			mouseenter: function( event ) {
 
- 				$( event.currentTarget ).addClass( "ui-state-hover" );
 
- 			},
 
- 			mouseleave: function( event ) {
 
- 				$( event.currentTarget ).removeClass( "ui-state-hover" );
 
- 			}
 
- 		});
 
- 	},
 
- 	_focusable: function( element ) {
 
- 		this.focusable = this.focusable.add( element );
 
- 		this._on( element, {
 
- 			focusin: function( event ) {
 
- 				$( event.currentTarget ).addClass( "ui-state-focus" );
 
- 			},
 
- 			focusout: function( event ) {
 
- 				$( event.currentTarget ).removeClass( "ui-state-focus" );
 
- 			}
 
- 		});
 
- 	},
 
- 	_trigger: function( type, event, data ) {
 
- 		var prop, orig,
 
- 			callback = this.options[ type ];
 
- 		data = data || {};
 
- 		event = $.Event( event );
 
- 		event.type = ( type === this.widgetEventPrefix ?
 
- 			type :
 
- 			this.widgetEventPrefix + type ).toLowerCase();
 
- 		// the original event may come from any element
 
- 		// so we need to reset the target on the new event
 
- 		event.target = this.element[ 0 ];
 
- 		// copy original event properties over to the new event
 
- 		orig = event.originalEvent;
 
- 		if ( orig ) {
 
- 			for ( prop in orig ) {
 
- 				if ( !( prop in event ) ) {
 
- 					event[ prop ] = orig[ prop ];
 
- 				}
 
- 			}
 
- 		}
 
- 		this.element.trigger( event, data );
 
- 		return !( $.isFunction( callback ) &&
 
- 			callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
 
- 			event.isDefaultPrevented() );
 
- 	}
 
- };
 
- $.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
 
- 	$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
 
- 		if ( typeof options === "string" ) {
 
- 			options = { effect: options };
 
- 		}
 
- 		var hasOptions,
 
- 			effectName = !options ?
 
- 				method :
 
- 				options === true || typeof options === "number" ?
 
- 					defaultEffect :
 
- 					options.effect || defaultEffect;
 
- 		options = options || {};
 
- 		if ( typeof options === "number" ) {
 
- 			options = { duration: options };
 
- 		}
 
- 		hasOptions = !$.isEmptyObject( options );
 
- 		options.complete = callback;
 
- 		if ( options.delay ) {
 
- 			element.delay( options.delay );
 
- 		}
 
- 		if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
 
- 			element[ method ]( options );
 
- 		} else if ( effectName !== method && element[ effectName ] ) {
 
- 			element[ effectName ]( options.duration, options.easing, callback );
 
- 		} else {
 
- 			element.queue(function( next ) {
 
- 				$( this )[ method ]();
 
- 				if ( callback ) {
 
- 					callback.call( element[ 0 ] );
 
- 				}
 
- 				next();
 
- 			});
 
- 		}
 
- 	};
 
- });
 
- var widget = $.widget;
 
- /*!
 
-  * jQuery UI Mouse 1.11.4
 
-  * http://jqueryui.com
 
-  *
 
-  * Copyright jQuery Foundation and other contributors
 
-  * Released under the MIT license.
 
-  * http://jquery.org/license
 
-  *
 
-  * http://api.jqueryui.com/mouse/
 
-  */
 
- var mouseHandled = false;
 
- $( document ).mouseup( function() {
 
- 	mouseHandled = false;
 
- });
 
- var mouse = $.widget("ui.mouse", {
 
- 	version: "1.11.4",
 
- 	options: {
 
- 		cancel: "input,textarea,button,select,option",
 
- 		distance: 1,
 
- 		delay: 0
 
- 	},
 
- 	_mouseInit: function() {
 
- 		var that = this;
 
- 		this.element
 
- 			.bind("mousedown." + this.widgetName, function(event) {
 
- 				return that._mouseDown(event);
 
- 			})
 
- 			.bind("click." + this.widgetName, function(event) {
 
- 				if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) {
 
- 					$.removeData(event.target, that.widgetName + ".preventClickEvent");
 
- 					event.stopImmediatePropagation();
 
- 					return false;
 
- 				}
 
- 			});
 
- 		this.started = false;
 
- 	},
 
- 	// TODO: make sure destroying one instance of mouse doesn't mess with
 
- 	// other instances of mouse
 
- 	_mouseDestroy: function() {
 
- 		this.element.unbind("." + this.widgetName);
 
- 		if ( this._mouseMoveDelegate ) {
 
- 			this.document
 
- 				.unbind("mousemove." + this.widgetName, this._mouseMoveDelegate)
 
- 				.unbind("mouseup." + this.widgetName, this._mouseUpDelegate);
 
- 		}
 
- 	},
 
- 	_mouseDown: function(event) {
 
- 		// don't let more than one widget handle mouseStart
 
- 		if ( mouseHandled ) {
 
- 			return;
 
- 		}
 
- 		this._mouseMoved = false;
 
- 		// we may have missed mouseup (out of window)
 
- 		(this._mouseStarted && this._mouseUp(event));
 
- 		this._mouseDownEvent = event;
 
- 		var that = this,
 
- 			btnIsLeft = (event.which === 1),
 
- 			// event.target.nodeName works around a bug in IE 8 with
 
- 			// disabled inputs (#7620)
 
- 			elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
 
- 		if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
 
- 			return true;
 
- 		}
 
- 		this.mouseDelayMet = !this.options.delay;
 
- 		if (!this.mouseDelayMet) {
 
- 			this._mouseDelayTimer = setTimeout(function() {
 
- 				that.mouseDelayMet = true;
 
- 			}, this.options.delay);
 
- 		}
 
- 		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
 
- 			this._mouseStarted = (this._mouseStart(event) !== false);
 
- 			if (!this._mouseStarted) {
 
- 				event.preventDefault();
 
- 				return true;
 
- 			}
 
- 		}
 
- 		// Click event may never have fired (Gecko & Opera)
 
- 		if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) {
 
- 			$.removeData(event.target, this.widgetName + ".preventClickEvent");
 
- 		}
 
- 		// these delegates are required to keep context
 
- 		this._mouseMoveDelegate = function(event) {
 
- 			return that._mouseMove(event);
 
- 		};
 
- 		this._mouseUpDelegate = function(event) {
 
- 			return that._mouseUp(event);
 
- 		};
 
- 		this.document
 
- 			.bind( "mousemove." + this.widgetName, this._mouseMoveDelegate )
 
- 			.bind( "mouseup." + this.widgetName, this._mouseUpDelegate );
 
- 		event.preventDefault();
 
- 		mouseHandled = true;
 
- 		return true;
 
- 	},
 
- 	_mouseMove: function(event) {
 
- 		// Only check for mouseups outside the document if you've moved inside the document
 
- 		// at least once. This prevents the firing of mouseup in the case of IE<9, which will
 
- 		// fire a mousemove event if content is placed under the cursor. See #7778
 
- 		// Support: IE <9
 
- 		if ( this._mouseMoved ) {
 
- 			// IE mouseup check - mouseup happened when mouse was out of window
 
- 			if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) {
 
- 				return this._mouseUp(event);
 
- 			// Iframe mouseup check - mouseup occurred in another document
 
- 			} else if ( !event.which ) {
 
- 				return this._mouseUp( event );
 
- 			}
 
- 		}
 
- 		if ( event.which || event.button ) {
 
- 			this._mouseMoved = true;
 
- 		}
 
- 		if (this._mouseStarted) {
 
- 			this._mouseDrag(event);
 
- 			return event.preventDefault();
 
- 		}
 
- 		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
 
- 			this._mouseStarted =
 
- 				(this._mouseStart(this._mouseDownEvent, event) !== false);
 
- 			(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
 
- 		}
 
- 		return !this._mouseStarted;
 
- 	},
 
- 	_mouseUp: function(event) {
 
- 		this.document
 
- 			.unbind( "mousemove." + this.widgetName, this._mouseMoveDelegate )
 
- 			.unbind( "mouseup." + this.widgetName, this._mouseUpDelegate );
 
- 		if (this._mouseStarted) {
 
- 			this._mouseStarted = false;
 
- 			if (event.target === this._mouseDownEvent.target) {
 
- 				$.data(event.target, this.widgetName + ".preventClickEvent", true);
 
- 			}
 
- 			this._mouseStop(event);
 
- 		}
 
- 		mouseHandled = false;
 
- 		return false;
 
- 	},
 
- 	_mouseDistanceMet: function(event) {
 
- 		return (Math.max(
 
- 				Math.abs(this._mouseDownEvent.pageX - event.pageX),
 
- 				Math.abs(this._mouseDownEvent.pageY - event.pageY)
 
- 			) >= this.options.distance
 
- 		);
 
- 	},
 
- 	_mouseDelayMet: function(/* event */) {
 
- 		return this.mouseDelayMet;
 
- 	},
 
- 	// These are placeholder methods, to be overriden by extending plugin
 
- 	_mouseStart: function(/* event */) {},
 
- 	_mouseDrag: function(/* event */) {},
 
- 	_mouseStop: function(/* event */) {},
 
- 	_mouseCapture: function(/* event */) { return true; }
 
- });
 
- /*!
 
-  * jQuery UI Draggable 1.11.4
 
-  * http://jqueryui.com
 
-  *
 
-  * Copyright jQuery Foundation and other contributors
 
-  * Released under the MIT license.
 
-  * http://jquery.org/license
 
-  *
 
-  * http://api.jqueryui.com/draggable/
 
-  */
 
- $.widget("ui.draggable", $.ui.mouse, {
 
- 	version: "1.11.4",
 
- 	widgetEventPrefix: "drag",
 
- 	options: {
 
- 		addClasses: true,
 
- 		appendTo: "parent",
 
- 		axis: false,
 
- 		connectToSortable: false,
 
- 		containment: false,
 
- 		cursor: "auto",
 
- 		cursorAt: false,
 
- 		grid: false,
 
- 		handle: false,
 
- 		helper: "original",
 
- 		iframeFix: false,
 
- 		opacity: false,
 
- 		refreshPositions: false,
 
- 		revert: false,
 
- 		revertDuration: 500,
 
- 		scope: "default",
 
- 		scroll: true,
 
- 		scrollSensitivity: 20,
 
- 		scrollSpeed: 20,
 
- 		snap: false,
 
- 		snapMode: "both",
 
- 		snapTolerance: 20,
 
- 		stack: false,
 
- 		zIndex: false,
 
- 		// callbacks
 
- 		drag: null,
 
- 		start: null,
 
- 		stop: null
 
- 	},
 
- 	_create: function() {
 
- 		if ( this.options.helper === "original" ) {
 
- 			this._setPositionRelative();
 
- 		}
 
- 		if (this.options.addClasses){
 
- 			this.element.addClass("ui-draggable");
 
- 		}
 
- 		if (this.options.disabled){
 
- 			this.element.addClass("ui-draggable-disabled");
 
- 		}
 
- 		this._setHandleClassName();
 
- 		this._mouseInit();
 
- 	},
 
- 	_setOption: function( key, value ) {
 
- 		this._super( key, value );
 
- 		if ( key === "handle" ) {
 
- 			this._removeHandleClassName();
 
- 			this._setHandleClassName();
 
- 		}
 
- 	},
 
- 	_destroy: function() {
 
- 		if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) {
 
- 			this.destroyOnClear = true;
 
- 			return;
 
- 		}
 
- 		this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" );
 
- 		this._removeHandleClassName();
 
- 		this._mouseDestroy();
 
- 	},
 
- 	_mouseCapture: function(event) {
 
- 		var o = this.options;
 
- 		this._blurActiveElement( event );
 
- 		// among others, prevent a drag on a resizable-handle
 
- 		if (this.helper || o.disabled || $(event.target).closest(".ui-resizable-handle").length > 0) {
 
- 			return false;
 
- 		}
 
- 		//Quit if we're not on a valid handle
 
- 		this.handle = this._getHandle(event);
 
- 		if (!this.handle) {
 
- 			return false;
 
- 		}
 
- 		this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix );
 
- 		return true;
 
- 	},
 
- 	_blockFrames: function( selector ) {
 
- 		this.iframeBlocks = this.document.find( selector ).map(function() {
 
- 			var iframe = $( this );
 
- 			return $( "<div>" )
 
- 				.css( "position", "absolute" )
 
- 				.appendTo( iframe.parent() )
 
- 				.outerWidth( iframe.outerWidth() )
 
- 				.outerHeight( iframe.outerHeight() )
 
- 				.offset( iframe.offset() )[ 0 ];
 
- 		});
 
- 	},
 
- 	_unblockFrames: function() {
 
- 		if ( this.iframeBlocks ) {
 
- 			this.iframeBlocks.remove();
 
- 			delete this.iframeBlocks;
 
- 		}
 
- 	},
 
- 	_blurActiveElement: function( event ) {
 
- 		var document = this.document[ 0 ];
 
- 		// Only need to blur if the event occurred on the draggable itself, see #10527
 
- 		if ( !this.handleElement.is( event.target ) ) {
 
- 			return;
 
- 		}
 
- 		// support: IE9
 
- 		// IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
 
- 		try {
 
- 			// Support: IE9, IE10
 
- 			// If the <body> is blurred, IE will switch windows, see #9520
 
- 			if ( document.activeElement && document.activeElement.nodeName.toLowerCase() !== "body" ) {
 
- 				// Blur any element that currently has focus, see #4261
 
- 				$( document.activeElement ).blur();
 
- 			}
 
- 		} catch ( error ) {}
 
- 	},
 
- 	_mouseStart: function(event) {
 
- 		var o = this.options;
 
- 		//Create and append the visible helper
 
- 		this.helper = this._createHelper(event);
 
- 		this.helper.addClass("ui-draggable-dragging");
 
- 		//Cache the helper size
 
- 		this._cacheHelperProportions();
 
- 		//If ddmanager is used for droppables, set the global draggable
 
- 		if ($.ui.ddmanager) {
 
- 			$.ui.ddmanager.current = this;
 
- 		}
 
- 		/*
 
- 		 * - Position generation -
 
- 		 * This block generates everything position related - it's the core of draggables.
 
- 		 */
 
- 		//Cache the margins of the original element
 
- 		this._cacheMargins();
 
- 		//Store the helper's css position
 
- 		this.cssPosition = this.helper.css( "position" );
 
- 		this.scrollParent = this.helper.scrollParent( true );
 
- 		this.offsetParent = this.helper.offsetParent();
 
- 		this.hasFixedAncestor = this.helper.parents().filter(function() {
 
- 				return $( this ).css( "position" ) === "fixed";
 
- 			}).length > 0;
 
- 		//The element's absolute position on the page minus margins
 
- 		this.positionAbs = this.element.offset();
 
- 		this._refreshOffsets( event );
 
- 		//Generate the original position
 
- 		this.originalPosition = this.position = this._generatePosition( event, false );
 
- 		this.originalPageX = event.pageX;
 
- 		this.originalPageY = event.pageY;
 
- 		//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
 
- 		(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
 
- 		//Set a containment if given in the options
 
- 		this._setContainment();
 
- 		//Trigger event + callbacks
 
- 		if (this._trigger("start", event) === false) {
 
- 			this._clear();
 
- 			return false;
 
- 		}
 
- 		//Recache the helper size
 
- 		this._cacheHelperProportions();
 
- 		//Prepare the droppable offsets
 
- 		if ($.ui.ddmanager && !o.dropBehaviour) {
 
- 			$.ui.ddmanager.prepareOffsets(this, event);
 
- 		}
 
- 		// Reset helper's right/bottom css if they're set and set explicit width/height instead
 
- 		// as this prevents resizing of elements with right/bottom set (see #7772)
 
- 		this._normalizeRightBottom();
 
- 		this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
 
- 		//If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)
 
- 		if ( $.ui.ddmanager ) {
 
- 			$.ui.ddmanager.dragStart(this, event);
 
- 		}
 
- 		return true;
 
- 	},
 
- 	_refreshOffsets: function( event ) {
 
- 		this.offset = {
 
- 			top: this.positionAbs.top - this.margins.top,
 
- 			left: this.positionAbs.left - this.margins.left,
 
- 			scroll: false,
 
- 			parent: this._getParentOffset(),
 
- 			relative: this._getRelativeOffset()
 
- 		};
 
- 		this.offset.click = {
 
- 			left: event.pageX - this.offset.left,
 
- 			top: event.pageY - this.offset.top
 
- 		};
 
- 	},
 
- 	_mouseDrag: function(event, noPropagation) {
 
- 		// reset any necessary cached properties (see #5009)
 
- 		if ( this.hasFixedAncestor ) {
 
- 			this.offset.parent = this._getParentOffset();
 
- 		}
 
- 		//Compute the helpers position
 
- 		this.position = this._generatePosition( event, true );
 
- 		this.positionAbs = this._convertPositionTo("absolute");
 
- 		//Call plugins and callbacks and use the resulting position if something is returned
 
- 		if (!noPropagation) {
 
- 			var ui = this._uiHash();
 
- 			if (this._trigger("drag", event, ui) === false) {
 
- 				this._mouseUp({});
 
- 				return false;
 
- 			}
 
- 			this.position = ui.position;
 
- 		}
 
- 		this.helper[ 0 ].style.left = this.position.left + "px";
 
- 		this.helper[ 0 ].style.top = this.position.top + "px";
 
- 		if ($.ui.ddmanager) {
 
- 			$.ui.ddmanager.drag(this, event);
 
- 		}
 
- 		return false;
 
- 	},
 
- 	_mouseStop: function(event) {
 
- 		//If we are using droppables, inform the manager about the drop
 
- 		var that = this,
 
- 			dropped = false;
 
- 		if ($.ui.ddmanager && !this.options.dropBehaviour) {
 
- 			dropped = $.ui.ddmanager.drop(this, event);
 
- 		}
 
- 		//if a drop comes from outside (a sortable)
 
- 		if (this.dropped) {
 
- 			dropped = this.dropped;
 
- 			this.dropped = false;
 
- 		}
 
- 		if ((this.options.revert === "invalid" && !dropped) || (this.options.revert === "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
 
- 			$(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
 
- 				if (that._trigger("stop", event) !== false) {
 
- 					that._clear();
 
- 				}
 
- 			});
 
- 		} else {
 
- 			if (this._trigger("stop", event) !== false) {
 
- 				this._clear();
 
- 			}
 
- 		}
 
- 		return false;
 
- 	},
 
- 	_mouseUp: function( event ) {
 
- 		this._unblockFrames();
 
- 		//If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
 
- 		if ( $.ui.ddmanager ) {
 
- 			$.ui.ddmanager.dragStop(this, event);
 
- 		}
 
- 		// Only need to focus if the event occurred on the draggable itself, see #10527
 
- 		if ( this.handleElement.is( event.target ) ) {
 
- 			// The interaction is over; whether or not the click resulted in a drag, focus the element
 
- 			this.element.focus();
 
- 		}
 
- 		return $.ui.mouse.prototype._mouseUp.call(this, event);
 
- 	},
 
- 	cancel: function() {
 
- 		if (this.helper.is(".ui-draggable-dragging")) {
 
- 			this._mouseUp({});
 
- 		} else {
 
- 			this._clear();
 
- 		}
 
- 		return this;
 
- 	},
 
- 	_getHandle: function(event) {
 
- 		return this.options.handle ?
 
- 			!!$( event.target ).closest( this.element.find( this.options.handle ) ).length :
 
- 			true;
 
- 	},
 
- 	_setHandleClassName: function() {
 
- 		this.handleElement = this.options.handle ?
 
- 			this.element.find( this.options.handle ) : this.element;
 
- 		this.handleElement.addClass( "ui-draggable-handle" );
 
- 	},
 
- 	_removeHandleClassName: function() {
 
- 		this.handleElement.removeClass( "ui-draggable-handle" );
 
- 	},
 
- 	_createHelper: function(event) {
 
- 		var o = this.options,
 
- 			helperIsFunction = $.isFunction( o.helper ),
 
- 			helper = helperIsFunction ?
 
- 				$( o.helper.apply( this.element[ 0 ], [ event ] ) ) :
 
- 				( o.helper === "clone" ?
 
- 					this.element.clone().removeAttr( "id" ) :
 
- 					this.element );
 
- 		if (!helper.parents("body").length) {
 
- 			helper.appendTo((o.appendTo === "parent" ? this.element[0].parentNode : o.appendTo));
 
- 		}
 
- 		// http://bugs.jqueryui.com/ticket/9446
 
- 		// a helper function can return the original element
 
- 		// which wouldn't have been set to relative in _create
 
- 		if ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) {
 
- 			this._setPositionRelative();
 
- 		}
 
- 		if (helper[0] !== this.element[0] && !(/(fixed|absolute)/).test(helper.css("position"))) {
 
- 			helper.css("position", "absolute");
 
- 		}
 
- 		return helper;
 
- 	},
 
- 	_setPositionRelative: function() {
 
- 		if ( !( /^(?:r|a|f)/ ).test( this.element.css( "position" ) ) ) {
 
- 			this.element[ 0 ].style.position = "relative";
 
- 		}
 
- 	},
 
- 	_adjustOffsetFromHelper: function(obj) {
 
- 		if (typeof obj === "string") {
 
- 			obj = obj.split(" ");
 
- 		}
 
- 		if ($.isArray(obj)) {
 
- 			obj = { left: +obj[0], top: +obj[1] || 0 };
 
- 		}
 
- 		if ("left" in obj) {
 
- 			this.offset.click.left = obj.left + this.margins.left;
 
- 		}
 
- 		if ("right" in obj) {
 
- 			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
 
- 		}
 
- 		if ("top" in obj) {
 
- 			this.offset.click.top = obj.top + this.margins.top;
 
- 		}
 
- 		if ("bottom" in obj) {
 
- 			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
 
- 		}
 
- 	},
 
- 	_isRootNode: function( element ) {
 
- 		return ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ];
 
- 	},
 
- 	_getParentOffset: function() {
 
- 		//Get the offsetParent and cache its position
 
- 		var po = this.offsetParent.offset(),
 
- 			document = this.document[ 0 ];
 
- 		// This is a special case where we need to modify a offset calculated on start, since the following happened:
 
- 		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
 
- 		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
 
- 		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
 
- 		if (this.cssPosition === "absolute" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
 
- 			po.left += this.scrollParent.scrollLeft();
 
- 			po.top += this.scrollParent.scrollTop();
 
- 		}
 
- 		if ( this._isRootNode( this.offsetParent[ 0 ] ) ) {
 
- 			po = { top: 0, left: 0 };
 
- 		}
 
- 		return {
 
- 			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"), 10) || 0),
 
- 			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"), 10) || 0)
 
- 		};
 
- 	},
 
- 	_getRelativeOffset: function() {
 
- 		if ( this.cssPosition !== "relative" ) {
 
- 			return { top: 0, left: 0 };
 
- 		}
 
- 		var p = this.element.position(),
 
- 			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
 
- 		return {
 
- 			top: p.top - ( parseInt(this.helper.css( "top" ), 10) || 0 ) + ( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ),
 
- 			left: p.left - ( parseInt(this.helper.css( "left" ), 10) || 0 ) + ( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 )
 
- 		};
 
- 	},
 
- 	_cacheMargins: function() {
 
- 		this.margins = {
 
- 			left: (parseInt(this.element.css("marginLeft"), 10) || 0),
 
- 			top: (parseInt(this.element.css("marginTop"), 10) || 0),
 
- 			right: (parseInt(this.element.css("marginRight"), 10) || 0),
 
- 			bottom: (parseInt(this.element.css("marginBottom"), 10) || 0)
 
- 		};
 
- 	},
 
- 	_cacheHelperProportions: function() {
 
- 		this.helperProportions = {
 
- 			width: this.helper.outerWidth(),
 
- 			height: this.helper.outerHeight()
 
- 		};
 
- 	},
 
- 	_setContainment: function() {
 
- 		var isUserScrollable, c, ce,
 
- 			o = this.options,
 
- 			document = this.document[ 0 ];
 
- 		this.relativeContainer = null;
 
- 		if ( !o.containment ) {
 
- 			this.containment = null;
 
- 			return;
 
- 		}
 
- 		if ( o.containment === "window" ) {
 
- 			this.containment = [
 
- 				$( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
 
- 				$( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,
 
- 				$( window ).scrollLeft() + $( window ).width() - this.helperProportions.width - this.margins.left,
 
- 				$( window ).scrollTop() + ( $( window ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top
 
- 			];
 
- 			return;
 
- 		}
 
- 		if ( o.containment === "document") {
 
- 			this.containment = [
 
- 				0,
 
- 				0,
 
- 				$( document ).width() - this.helperProportions.width - this.margins.left,
 
- 				( $( document ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top
 
- 			];
 
- 			return;
 
- 		}
 
- 		if ( o.containment.constructor === Array ) {
 
- 			this.containment = o.containment;
 
- 			return;
 
- 		}
 
- 		if ( o.containment === "parent" ) {
 
- 			o.containment = this.helper[ 0 ].parentNode;
 
- 		}
 
- 		c = $( o.containment );
 
- 		ce = c[ 0 ];
 
- 		if ( !ce ) {
 
- 			return;
 
- 		}
 
- 		isUserScrollable = /(scroll|auto)/.test( c.css( "overflow" ) );
 
- 		this.containment = [
 
- 			( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ),
 
- 			( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingTop" ), 10 ) || 0 ),
 
- 			( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
 
- 				( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) -
 
- 				( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) -
 
- 				this.helperProportions.width -
 
- 				this.margins.left -
 
- 				this.margins.right,
 
- 			( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -
 
- 				( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) -
 
- 				( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) -
 
- 				this.helperProportions.height -
 
- 				this.margins.top -
 
- 				this.margins.bottom
 
- 		];
 
- 		this.relativeContainer = c;
 
- 	},
 
- 	_convertPositionTo: function(d, pos) {
 
- 		if (!pos) {
 
- 			pos = this.position;
 
- 		}
 
- 		var mod = d === "absolute" ? 1 : -1,
 
- 			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
 
- 		return {
 
- 			top: (
 
- 				pos.top	+																// The absolute mouse position
 
- 				this.offset.relative.top * mod +										// Only for relative positioned nodes: Relative offset from element to offset parent
 
- 				this.offset.parent.top * mod -										// The offsetParent's offset without borders (offset + border)
 
- 				( ( this.cssPosition === "fixed" ? -this.offset.scroll.top : ( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod)
 
- 			),
 
- 			left: (
 
- 				pos.left +																// The absolute mouse position
 
- 				this.offset.relative.left * mod +										// Only for relative positioned nodes: Relative offset from element to offset parent
 
- 				this.offset.parent.left * mod	-										// The offsetParent's offset without borders (offset + border)
 
- 				( ( this.cssPosition === "fixed" ? -this.offset.scroll.left : ( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod)
 
- 			)
 
- 		};
 
- 	},
 
- 	_generatePosition: function( event, constrainPosition ) {
 
- 		var containment, co, top, left,
 
- 			o = this.options,
 
- 			scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ),
 
- 			pageX = event.pageX,
 
- 			pageY = event.pageY;
 
- 		// Cache the scroll
 
- 		if ( !scrollIsRootNode || !this.offset.scroll ) {
 
- 			this.offset.scroll = {
 
- 				top: this.scrollParent.scrollTop(),
 
- 				left: this.scrollParent.scrollLeft()
 
- 			};
 
- 		}
 
- 		/*
 
- 		 * - Position constraining -
 
- 		 * Constrain the position to a mix of grid, containment.
 
- 		 */
 
- 		// If we are not dragging yet, we won't check for options
 
- 		if ( constrainPosition ) {
 
- 			if ( this.containment ) {
 
- 				if ( this.relativeContainer ){
 
- 					co = this.relativeContainer.offset();
 
- 					containment = [
 
- 						this.containment[ 0 ] + co.left,
 
- 						this.containment[ 1 ] + co.top,
 
- 						this.containment[ 2 ] + co.left,
 
- 						this.containment[ 3 ] + co.top
 
- 					];
 
- 				} else {
 
- 					containment = this.containment;
 
- 				}
 
- 				if (event.pageX - this.offset.click.left < containment[0]) {
 
- 					pageX = containment[0] + this.offset.click.left;
 
- 				}
 
- 				if (event.pageY - this.offset.click.top < containment[1]) {
 
- 					pageY = containment[1] + this.offset.click.top;
 
- 				}
 
- 				if (event.pageX - this.offset.click.left > containment[2]) {
 
- 					pageX = containment[2] + this.offset.click.left;
 
- 				}
 
- 				if (event.pageY - this.offset.click.top > containment[3]) {
 
- 					pageY = containment[3] + this.offset.click.top;
 
- 				}
 
- 			}
 
- 			if (o.grid) {
 
- 				//Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)
 
- 				top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;
 
- 				pageY = containment ? ((top - this.offset.click.top >= containment[1] || top - this.offset.click.top > containment[3]) ? top : ((top - this.offset.click.top >= containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
 
- 				left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;
 
- 				pageX = containment ? ((left - this.offset.click.left >= containment[0] || left - this.offset.click.left > containment[2]) ? left : ((left - this.offset.click.left >= containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
 
- 			}
 
- 			if ( o.axis === "y" ) {
 
- 				pageX = this.originalPageX;
 
- 			}
 
- 			if ( o.axis === "x" ) {
 
- 				pageY = this.originalPageY;
 
- 			}
 
- 		}
 
- 		return {
 
- 			top: (
 
- 				pageY -																	// The absolute mouse position
 
- 				this.offset.click.top	-												// Click offset (relative to the element)
 
- 				this.offset.relative.top -												// Only for relative positioned nodes: Relative offset from element to offset parent
 
- 				this.offset.parent.top +												// The offsetParent's offset without borders (offset + border)
 
- 				( this.cssPosition === "fixed" ? -this.offset.scroll.top : ( scrollIsRootNode ? 0 : this.offset.scroll.top ) )
 
- 			),
 
- 			left: (
 
- 				pageX -																	// The absolute mouse position
 
- 				this.offset.click.left -												// Click offset (relative to the element)
 
- 				this.offset.relative.left -												// Only for relative positioned nodes: Relative offset from element to offset parent
 
- 				this.offset.parent.left +												// The offsetParent's offset without borders (offset + border)
 
- 				( this.cssPosition === "fixed" ? -this.offset.scroll.left : ( scrollIsRootNode ? 0 : this.offset.scroll.left ) )
 
- 			)
 
- 		};
 
- 	},
 
- 	_clear: function() {
 
- 		this.helper.removeClass("ui-draggable-dragging");
 
- 		if (this.helper[0] !== this.element[0] && !this.cancelHelperRemoval) {
 
- 			this.helper.remove();
 
- 		}
 
- 		this.helper = null;
 
- 		this.cancelHelperRemoval = false;
 
- 		if ( this.destroyOnClear ) {
 
- 			this.destroy();
 
- 		}
 
- 	},
 
- 	_normalizeRightBottom: function() {
 
- 		if ( this.options.axis !== "y" && this.helper.css( "right" ) !== "auto" ) {
 
- 			this.helper.width( this.helper.width() );
 
- 			this.helper.css( "right", "auto" );
 
- 		}
 
- 		if ( this.options.axis !== "x" && this.helper.css( "bottom" ) !== "auto" ) {
 
- 			this.helper.height( this.helper.height() );
 
- 			this.helper.css( "bottom", "auto" );
 
- 		}
 
- 	},
 
- 	// From now on bulk stuff - mainly helpers
 
- 	_trigger: function( type, event, ui ) {
 
- 		ui = ui || this._uiHash();
 
- 		$.ui.plugin.call( this, type, [ event, ui, this ], true );
 
- 		// Absolute position and offset (see #6884 ) have to be recalculated after plugins
 
- 		if ( /^(drag|start|stop)/.test( type ) ) {
 
- 			this.positionAbs = this._convertPositionTo( "absolute" );
 
- 			ui.offset = this.positionAbs;
 
- 		}
 
- 		return $.Widget.prototype._trigger.call( this, type, event, ui );
 
- 	},
 
- 	plugins: {},
 
- 	_uiHash: function() {
 
- 		return {
 
- 			helper: this.helper,
 
- 			position: this.position,
 
- 			originalPosition: this.originalPosition,
 
- 			offset: this.positionAbs
 
- 		};
 
- 	}
 
- });
 
- $.ui.plugin.add( "draggable", "connectToSortable", {
 
- 	start: function( event, ui, draggable ) {
 
- 		var uiSortable = $.extend( {}, ui, {
 
- 			item: draggable.element
 
- 		});
 
- 		draggable.sortables = [];
 
- 		$( draggable.options.connectToSortable ).each(function() {
 
- 			var sortable = $( this ).sortable( "instance" );
 
- 			if ( sortable && !sortable.options.disabled ) {
 
- 				draggable.sortables.push( sortable );
 
- 				// refreshPositions is called at drag start to refresh the containerCache
 
- 				// which is used in drag. This ensures it's initialized and synchronized
 
- 				// with any changes that might have happened on the page since initialization.
 
- 				sortable.refreshPositions();
 
- 				sortable._trigger("activate", event, uiSortable);
 
- 			}
 
- 		});
 
- 	},
 
- 	stop: function( event, ui, draggable ) {
 
- 		var uiSortable = $.extend( {}, ui, {
 
- 			item: draggable.element
 
- 		});
 
- 		draggable.cancelHelperRemoval = false;
 
- 		$.each( draggable.sortables, function() {
 
- 			var sortable = this;
 
- 			if ( sortable.isOver ) {
 
- 				sortable.isOver = 0;
 
- 				// Allow this sortable to handle removing the helper
 
- 				draggable.cancelHelperRemoval = true;
 
- 				sortable.cancelHelperRemoval = false;
 
- 				// Use _storedCSS To restore properties in the sortable,
 
- 				// as this also handles revert (#9675) since the draggable
 
- 				// may have modified them in unexpected ways (#8809)
 
- 				sortable._storedCSS = {
 
- 					position: sortable.placeholder.css( "position" ),
 
- 					top: sortable.placeholder.css( "top" ),
 
- 					left: sortable.placeholder.css( "left" )
 
- 				};
 
- 				sortable._mouseStop(event);
 
- 				// Once drag has ended, the sortable should return to using
 
- 				// its original helper, not the shared helper from draggable
 
- 				sortable.options.helper = sortable.options._helper;
 
- 			} else {
 
- 				// Prevent this Sortable from removing the helper.
 
- 				// However, don't set the draggable to remove the helper
 
- 				// either as another connected Sortable may yet handle the removal.
 
- 				sortable.cancelHelperRemoval = true;
 
- 				sortable._trigger( "deactivate", event, uiSortable );
 
- 			}
 
- 		});
 
- 	},
 
- 	drag: function( event, ui, draggable ) {
 
- 		$.each( draggable.sortables, function() {
 
- 			var innermostIntersecting = false,
 
- 				sortable = this;
 
- 			// Copy over variables that sortable's _intersectsWith uses
 
- 			sortable.positionAbs = draggable.positionAbs;
 
- 			sortable.helperProportions = draggable.helperProportions;
 
- 			sortable.offset.click = draggable.offset.click;
 
- 			if ( sortable._intersectsWith( sortable.containerCache ) ) {
 
- 				innermostIntersecting = true;
 
- 				$.each( draggable.sortables, function() {
 
- 					// Copy over variables that sortable's _intersectsWith uses
 
- 					this.positionAbs = draggable.positionAbs;
 
- 					this.helperProportions = draggable.helperProportions;
 
- 					this.offset.click = draggable.offset.click;
 
- 					if ( this !== sortable &&
 
- 							this._intersectsWith( this.containerCache ) &&
 
- 							$.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) {
 
- 						innermostIntersecting = false;
 
- 					}
 
- 					return innermostIntersecting;
 
- 				});
 
- 			}
 
- 			if ( innermostIntersecting ) {
 
- 				// If it intersects, we use a little isOver variable and set it once,
 
- 				// so that the move-in stuff gets fired only once.
 
- 				if ( !sortable.isOver ) {
 
- 					sortable.isOver = 1;
 
- 					// Store draggable's parent in case we need to reappend to it later.
 
- 					draggable._parent = ui.helper.parent();
 
- 					sortable.currentItem = ui.helper
 
- 						.appendTo( sortable.element )
 
- 						.data( "ui-sortable-item", true );
 
- 					// Store helper option to later restore it
 
- 					sortable.options._helper = sortable.options.helper;
 
- 					sortable.options.helper = function() {
 
- 						return ui.helper[ 0 ];
 
- 					};
 
- 					// Fire the start events of the sortable with our passed browser event,
 
- 					// and our own helper (so it doesn't create a new one)
 
- 					event.target = sortable.currentItem[ 0 ];
 
- 					sortable._mouseCapture( event, true );
 
- 					sortable._mouseStart( event, true, true );
 
- 					// Because the browser event is way off the new appended portlet,
 
- 					// modify necessary variables to reflect the changes
 
- 					sortable.offset.click.top = draggable.offset.click.top;
 
- 					sortable.offset.click.left = draggable.offset.click.left;
 
- 					sortable.offset.parent.left -= draggable.offset.parent.left -
 
- 						sortable.offset.parent.left;
 
- 					sortable.offset.parent.top -= draggable.offset.parent.top -
 
- 						sortable.offset.parent.top;
 
- 					draggable._trigger( "toSortable", event );
 
- 					// Inform draggable that the helper is in a valid drop zone,
 
- 					// used solely in the revert option to handle "valid/invalid".
 
- 					draggable.dropped = sortable.element;
 
- 					// Need to refreshPositions of all sortables in the case that
 
- 					// adding to one sortable changes the location of the other sortables (#9675)
 
- 					$.each( draggable.sortables, function() {
 
- 						this.refreshPositions();
 
- 					});
 
- 					// hack so receive/update callbacks work (mostly)
 
- 					draggable.currentItem = draggable.element;
 
- 					sortable.fromOutside = draggable;
 
- 				}
 
- 				if ( sortable.currentItem ) {
 
- 					sortable._mouseDrag( event );
 
- 					// Copy the sortable's position because the draggable's can potentially reflect
 
- 					// a relative position, while sortable is always absolute, which the dragged
 
- 					// element has now become. (#8809)
 
- 					ui.position = sortable.position;
 
- 				}
 
- 			} else {
 
- 				// If it doesn't intersect with the sortable, and it intersected before,
 
- 				// we fake the drag stop of the sortable, but make sure it doesn't remove
 
- 				// the helper by using cancelHelperRemoval.
 
- 				if ( sortable.isOver ) {
 
- 					sortable.isOver = 0;
 
- 					sortable.cancelHelperRemoval = true;
 
- 					// Calling sortable's mouseStop would trigger a revert,
 
- 					// so revert must be temporarily false until after mouseStop is called.
 
- 					sortable.options._revert = sortable.options.revert;
 
- 					sortable.options.revert = false;
 
- 					sortable._trigger( "out", event, sortable._uiHash( sortable ) );
 
- 					sortable._mouseStop( event, true );
 
- 					// restore sortable behaviors that were modfied
 
- 					// when the draggable entered the sortable area (#9481)
 
- 					sortable.options.revert = sortable.options._revert;
 
- 					sortable.options.helper = sortable.options._helper;
 
- 					if ( sortable.placeholder ) {
 
- 						sortable.placeholder.remove();
 
- 					}
 
- 					// Restore and recalculate the draggable's offset considering the sortable
 
- 					// may have modified them in unexpected ways. (#8809, #10669)
 
- 					ui.helper.appendTo( draggable._parent );
 
- 					draggable._refreshOffsets( event );
 
- 					ui.position = draggable._generatePosition( event, true );
 
- 					draggable._trigger( "fromSortable", event );
 
- 					// Inform draggable that the helper is no longer in a valid drop zone
 
- 					draggable.dropped = false;
 
- 					// Need to refreshPositions of all sortables just in case removing
 
- 					// from one sortable changes the location of other sortables (#9675)
 
- 					$.each( draggable.sortables, function() {
 
- 						this.refreshPositions();
 
- 					});
 
- 				}
 
- 			}
 
- 		});
 
- 	}
 
- });
 
- $.ui.plugin.add("draggable", "cursor", {
 
- 	start: function( event, ui, instance ) {
 
- 		var t = $( "body" ),
 
- 			o = instance.options;
 
- 		if (t.css("cursor")) {
 
- 			o._cursor = t.css("cursor");
 
- 		}
 
- 		t.css("cursor", o.cursor);
 
- 	},
 
- 	stop: function( event, ui, instance ) {
 
- 		var o = instance.options;
 
- 		if (o._cursor) {
 
- 			$("body").css("cursor", o._cursor);
 
- 		}
 
- 	}
 
- });
 
- $.ui.plugin.add("draggable", "opacity", {
 
- 	start: function( event, ui, instance ) {
 
- 		var t = $( ui.helper ),
 
- 			o = instance.options;
 
- 		if (t.css("opacity")) {
 
- 			o._opacity = t.css("opacity");
 
- 		}
 
- 		t.css("opacity", o.opacity);
 
- 	},
 
- 	stop: function( event, ui, instance ) {
 
- 		var o = instance.options;
 
- 		if (o._opacity) {
 
- 			$(ui.helper).css("opacity", o._opacity);
 
- 		}
 
- 	}
 
- });
 
- $.ui.plugin.add("draggable", "scroll", {
 
- 	start: function( event, ui, i ) {
 
- 		if ( !i.scrollParentNotHidden ) {
 
- 			i.scrollParentNotHidden = i.helper.scrollParent( false );
 
- 		}
 
- 		if ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] && i.scrollParentNotHidden[ 0 ].tagName !== "HTML" ) {
 
- 			i.overflowOffset = i.scrollParentNotHidden.offset();
 
- 		}
 
- 	},
 
- 	drag: function( event, ui, i  ) {
 
- 		var o = i.options,
 
- 			scrolled = false,
 
- 			scrollParent = i.scrollParentNotHidden[ 0 ],
 
- 			document = i.document[ 0 ];
 
- 		if ( scrollParent !== document && scrollParent.tagName !== "HTML" ) {
 
- 			if ( !o.axis || o.axis !== "x" ) {
 
- 				if ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY < o.scrollSensitivity ) {
 
- 					scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;
 
- 				} else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) {
 
- 					scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;
 
- 				}
 
- 			}
 
- 			if ( !o.axis || o.axis !== "y" ) {
 
- 				if ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX < o.scrollSensitivity ) {
 
- 					scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;
 
- 				} else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) {
 
- 					scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;
 
- 				}
 
- 			}
 
- 		} else {
 
- 			if (!o.axis || o.axis !== "x") {
 
- 				if (event.pageY - $(document).scrollTop() < o.scrollSensitivity) {
 
- 					scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
 
- 				} else if ($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {
 
- 					scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
 
- 				}
 
- 			}
 
- 			if (!o.axis || o.axis !== "y") {
 
- 				if (event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {
 
- 					scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
 
- 				} else if ($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {
 
- 					scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
 
- 				}
 
- 			}
 
- 		}
 
- 		if (scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
 
- 			$.ui.ddmanager.prepareOffsets(i, event);
 
- 		}
 
- 	}
 
- });
 
- $.ui.plugin.add("draggable", "snap", {
 
- 	start: function( event, ui, i ) {
 
- 		var o = i.options;
 
- 		i.snapElements = [];
 
- 		$(o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap).each(function() {
 
- 			var $t = $(this),
 
- 				$o = $t.offset();
 
- 			if (this !== i.element[0]) {
 
- 				i.snapElements.push({
 
- 					item: this,
 
- 					width: $t.outerWidth(), height: $t.outerHeight(),
 
- 					top: $o.top, left: $o.left
 
- 				});
 
- 			}
 
- 		});
 
- 	},
 
- 	drag: function( event, ui, inst ) {
 
- 		var ts, bs, ls, rs, l, r, t, b, i, first,
 
- 			o = inst.options,
 
- 			d = o.snapTolerance,
 
- 			x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
 
- 			y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
 
- 		for (i = inst.snapElements.length - 1; i >= 0; i--){
 
- 			l = inst.snapElements[i].left - inst.margins.left;
 
- 			r = l + inst.snapElements[i].width;
 
- 			t = inst.snapElements[i].top - inst.margins.top;
 
- 			b = t + inst.snapElements[i].height;
 
- 			if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d || !$.contains( inst.snapElements[ i ].item.ownerDocument, inst.snapElements[ i ].item ) ) {
 
- 				if (inst.snapElements[i].snapping) {
 
- 					(inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
 
- 				}
 
- 				inst.snapElements[i].snapping = false;
 
- 				continue;
 
- 			}
 
- 			if (o.snapMode !== "inner") {
 
- 				ts = Math.abs(t - y2) <= d;
 
- 				bs = Math.abs(b - y1) <= d;
 
- 				ls = Math.abs(l - x2) <= d;
 
- 				rs = Math.abs(r - x1) <= d;
 
- 				if (ts) {
 
- 					ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top;
 
- 				}
 
- 				if (bs) {
 
- 					ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top;
 
- 				}
 
- 				if (ls) {
 
- 					ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left;
 
- 				}
 
- 				if (rs) {
 
- 					ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left;
 
- 				}
 
- 			}
 
- 			first = (ts || bs || ls || rs);
 
- 			if (o.snapMode !== "outer") {
 
- 				ts = Math.abs(t - y1) <= d;
 
- 				bs = Math.abs(b - y2) <= d;
 
- 				ls = Math.abs(l - x1) <= d;
 
- 				rs = Math.abs(r - x2) <= d;
 
- 				if (ts) {
 
- 					ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top;
 
- 				}
 
- 				if (bs) {
 
- 					ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top;
 
- 				}
 
- 				if (ls) {
 
- 					ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left;
 
- 				}
 
- 				if (rs) {
 
- 					ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left;
 
- 				}
 
- 			}
 
- 			if (!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) {
 
- 				(inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
 
- 			}
 
- 			inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
 
- 		}
 
- 	}
 
- });
 
- $.ui.plugin.add("draggable", "stack", {
 
- 	start: function( event, ui, instance ) {
 
- 		var min,
 
- 			o = instance.options,
 
- 			group = $.makeArray($(o.stack)).sort(function(a, b) {
 
- 				return (parseInt($(a).css("zIndex"), 10) || 0) - (parseInt($(b).css("zIndex"), 10) || 0);
 
- 			});
 
- 		if (!group.length) { return; }
 
- 		min = parseInt($(group[0]).css("zIndex"), 10) || 0;
 
- 		$(group).each(function(i) {
 
- 			$(this).css("zIndex", min + i);
 
- 		});
 
- 		this.css("zIndex", (min + group.length));
 
- 	}
 
- });
 
- $.ui.plugin.add("draggable", "zIndex", {
 
- 	start: function( event, ui, instance ) {
 
- 		var t = $( ui.helper ),
 
- 			o = instance.options;
 
- 		if (t.css("zIndex")) {
 
- 			o._zIndex = t.css("zIndex");
 
- 		}
 
- 		t.css("zIndex", o.zIndex);
 
- 	},
 
- 	stop: function( event, ui, instance ) {
 
- 		var o = instance.options;
 
- 		if (o._zIndex) {
 
- 			$(ui.helper).css("zIndex", o._zIndex);
 
- 		}
 
- 	}
 
- });
 
- var draggable = $.ui.draggable;
 
- /*!
 
-  * jQuery UI Droppable 1.11.4
 
-  * http://jqueryui.com
 
-  *
 
-  * Copyright jQuery Foundation and other contributors
 
-  * Released under the MIT license.
 
-  * http://jquery.org/license
 
-  *
 
-  * http://api.jqueryui.com/droppable/
 
-  */
 
- $.widget( "ui.droppable", {
 
- 	version: "1.11.4",
 
- 	widgetEventPrefix: "drop",
 
- 	options: {
 
- 		accept: "*",
 
- 		activeClass: false,
 
- 		addClasses: true,
 
- 		greedy: false,
 
- 		hoverClass: false,
 
- 		scope: "default",
 
- 		tolerance: "intersect",
 
- 		// callbacks
 
- 		activate: null,
 
- 		deactivate: null,
 
- 		drop: null,
 
- 		out: null,
 
- 		over: null
 
- 	},
 
- 	_create: function() {
 
- 		var proportions,
 
- 			o = this.options,
 
- 			accept = o.accept;
 
- 		this.isover = false;
 
- 		this.isout = true;
 
- 		this.accept = $.isFunction( accept ) ? accept : function( d ) {
 
- 			return d.is( accept );
 
- 		};
 
- 		this.proportions = function( /* valueToWrite */ ) {
 
- 			if ( arguments.length ) {
 
- 				// Store the droppable's proportions
 
- 				proportions = arguments[ 0 ];
 
- 			} else {
 
- 				// Retrieve or derive the droppable's proportions
 
- 				return proportions ?
 
- 					proportions :
 
- 					proportions = {
 
- 						width: this.element[ 0 ].offsetWidth,
 
- 						height: this.element[ 0 ].offsetHeight
 
- 					};
 
- 			}
 
- 		};
 
- 		this._addToManager( o.scope );
 
- 		o.addClasses && this.element.addClass( "ui-droppable" );
 
- 	},
 
- 	_addToManager: function( scope ) {
 
- 		// Add the reference and positions to the manager
 
- 		$.ui.ddmanager.droppables[ scope ] = $.ui.ddmanager.droppables[ scope ] || [];
 
- 		$.ui.ddmanager.droppables[ scope ].push( this );
 
- 	},
 
- 	_splice: function( drop ) {
 
- 		var i = 0;
 
- 		for ( ; i < drop.length; i++ ) {
 
- 			if ( drop[ i ] === this ) {
 
- 				drop.splice( i, 1 );
 
- 			}
 
- 		}
 
- 	},
 
- 	_destroy: function() {
 
- 		var drop = $.ui.ddmanager.droppables[ this.options.scope ];
 
- 		this._splice( drop );
 
- 		this.element.removeClass( "ui-droppable ui-droppable-disabled" );
 
- 	},
 
- 	_setOption: function( key, value ) {
 
- 		if ( key === "accept" ) {
 
- 			this.accept = $.isFunction( value ) ? value : function( d ) {
 
- 				return d.is( value );
 
- 			};
 
- 		} else if ( key === "scope" ) {
 
- 			var drop = $.ui.ddmanager.droppables[ this.options.scope ];
 
- 			this._splice( drop );
 
- 			this._addToManager( value );
 
- 		}
 
- 		this._super( key, value );
 
- 	},
 
- 	_activate: function( event ) {
 
- 		var draggable = $.ui.ddmanager.current;
 
- 		if ( this.options.activeClass ) {
 
- 			this.element.addClass( this.options.activeClass );
 
- 		}
 
- 		if ( draggable ){
 
- 			this._trigger( "activate", event, this.ui( draggable ) );
 
- 		}
 
- 	},
 
- 	_deactivate: function( event ) {
 
- 		var draggable = $.ui.ddmanager.current;
 
- 		if ( this.options.activeClass ) {
 
- 			this.element.removeClass( this.options.activeClass );
 
- 		}
 
- 		if ( draggable ){
 
- 			this._trigger( "deactivate", event, this.ui( draggable ) );
 
- 		}
 
- 	},
 
- 	_over: function( event ) {
 
- 		var draggable = $.ui.ddmanager.current;
 
- 		// Bail if draggable and droppable are same element
 
- 		if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {
 
- 			return;
 
- 		}
 
- 		if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
 
- 			if ( this.options.hoverClass ) {
 
- 				this.element.addClass( this.options.hoverClass );
 
- 			}
 
- 			this._trigger( "over", event, this.ui( draggable ) );
 
- 		}
 
- 	},
 
- 	_out: function( event ) {
 
- 		var draggable = $.ui.ddmanager.current;
 
- 		// Bail if draggable and droppable are same element
 
- 		if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {
 
- 			return;
 
- 		}
 
- 		if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
 
- 			if ( this.options.hoverClass ) {
 
- 				this.element.removeClass( this.options.hoverClass );
 
- 			}
 
- 			this._trigger( "out", event, this.ui( draggable ) );
 
- 		}
 
- 	},
 
- 	_drop: function( event, custom ) {
 
- 		var draggable = custom || $.ui.ddmanager.current,
 
- 			childrenIntersection = false;
 
- 		// Bail if draggable and droppable are same element
 
- 		if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {
 
- 			return false;
 
- 		}
 
- 		this.element.find( ":data(ui-droppable)" ).not( ".ui-draggable-dragging" ).each(function() {
 
- 			var inst = $( this ).droppable( "instance" );
 
- 			if (
 
- 				inst.options.greedy &&
 
- 				!inst.options.disabled &&
 
- 				inst.options.scope === draggable.options.scope &&
 
- 				inst.accept.call( inst.element[ 0 ], ( draggable.currentItem || draggable.element ) ) &&
 
- 				$.ui.intersect( draggable, $.extend( inst, { offset: inst.element.offset() } ), inst.options.tolerance, event )
 
- 			) { childrenIntersection = true; return false; }
 
- 		});
 
- 		if ( childrenIntersection ) {
 
- 			return false;
 
- 		}
 
- 		if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
 
- 			if ( this.options.activeClass ) {
 
- 				this.element.removeClass( this.options.activeClass );
 
- 			}
 
- 			if ( this.options.hoverClass ) {
 
- 				this.element.removeClass( this.options.hoverClass );
 
- 			}
 
- 			this._trigger( "drop", event, this.ui( draggable ) );
 
- 			return this.element;
 
- 		}
 
- 		return false;
 
- 	},
 
- 	ui: function( c ) {
 
- 		return {
 
- 			draggable: ( c.currentItem || c.element ),
 
- 			helper: c.helper,
 
- 			position: c.position,
 
- 			offset: c.positionAbs
 
- 		};
 
- 	}
 
- });
 
- $.ui.intersect = (function() {
 
- 	function isOverAxis( x, reference, size ) {
 
- 		return ( x >= reference ) && ( x < ( reference + size ) );
 
- 	}
 
- 	return function( draggable, droppable, toleranceMode, event ) {
 
- 		if ( !droppable.offset ) {
 
- 			return false;
 
- 		}
 
- 		var x1 = ( draggable.positionAbs || draggable.position.absolute ).left + draggable.margins.left,
 
- 			y1 = ( draggable.positionAbs || draggable.position.absolute ).top + draggable.margins.top,
 
- 			x2 = x1 + draggable.helperProportions.width,
 
- 			y2 = y1 + draggable.helperProportions.height,
 
- 			l = droppable.offset.left,
 
- 			t = droppable.offset.top,
 
- 			r = l + droppable.proportions().width,
 
- 			b = t + droppable.proportions().height;
 
- 		switch ( toleranceMode ) {
 
- 		case "fit":
 
- 			return ( l <= x1 && x2 <= r && t <= y1 && y2 <= b );
 
- 		case "intersect":
 
- 			return ( l < x1 + ( draggable.helperProportions.width / 2 ) && // Right Half
 
- 				x2 - ( draggable.helperProportions.width / 2 ) < r && // Left Half
 
- 				t < y1 + ( draggable.helperProportions.height / 2 ) && // Bottom Half
 
- 				y2 - ( draggable.helperProportions.height / 2 ) < b ); // Top Half
 
- 		case "pointer":
 
- 			return isOverAxis( event.pageY, t, droppable.proportions().height ) && isOverAxis( event.pageX, l, droppable.proportions().width );
 
- 		case "touch":
 
- 			return (
 
- 				( y1 >= t && y1 <= b ) || // Top edge touching
 
- 				( y2 >= t && y2 <= b ) || // Bottom edge touching
 
- 				( y1 < t && y2 > b ) // Surrounded vertically
 
- 			) && (
 
- 				( x1 >= l && x1 <= r ) || // Left edge touching
 
- 				( x2 >= l && x2 <= r ) || // Right edge touching
 
- 				( x1 < l && x2 > r ) // Surrounded horizontally
 
- 			);
 
- 		default:
 
- 			return false;
 
- 		}
 
- 	};
 
- })();
 
- /*
 
- 	This manager tracks offsets of draggables and droppables
 
- */
 
- $.ui.ddmanager = {
 
- 	current: null,
 
- 	droppables: { "default": [] },
 
- 	prepareOffsets: function( t, event ) {
 
- 		var i, j,
 
- 			m = $.ui.ddmanager.droppables[ t.options.scope ] || [],
 
- 			type = event ? event.type : null, // workaround for #2317
 
- 			list = ( t.currentItem || t.element ).find( ":data(ui-droppable)" ).addBack();
 
- 		droppablesLoop: for ( i = 0; i < m.length; i++ ) {
 
- 			// No disabled and non-accepted
 
- 			if ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0 ], ( t.currentItem || t.element ) ) ) ) {
 
- 				continue;
 
- 			}
 
- 			// Filter out elements in the current dragged item
 
- 			for ( j = 0; j < list.length; j++ ) {
 
- 				if ( list[ j ] === m[ i ].element[ 0 ] ) {
 
- 					m[ i ].proportions().height = 0;
 
- 					continue droppablesLoop;
 
- 				}
 
- 			}
 
- 			m[ i ].visible = m[ i ].element.css( "display" ) !== "none";
 
- 			if ( !m[ i ].visible ) {
 
- 				continue;
 
- 			}
 
- 			// Activate the droppable if used directly from draggables
 
- 			if ( type === "mousedown" ) {
 
- 				m[ i ]._activate.call( m[ i ], event );
 
- 			}
 
- 			m[ i ].offset = m[ i ].element.offset();
 
- 			m[ i ].proportions({ width: m[ i ].element[ 0 ].offsetWidth, height: m[ i ].element[ 0 ].offsetHeight });
 
- 		}
 
- 	},
 
- 	drop: function( draggable, event ) {
 
- 		var dropped = false;
 
- 		// Create a copy of the droppables in case the list changes during the drop (#9116)
 
- 		$.each( ( $.ui.ddmanager.droppables[ draggable.options.scope ] || [] ).slice(), function() {
 
- 			if ( !this.options ) {
 
- 				return;
 
- 			}
 
- 			if ( !this.options.disabled && this.visible && $.ui.intersect( draggable, this, this.options.tolerance, event ) ) {
 
- 				dropped = this._drop.call( this, event ) || dropped;
 
- 			}
 
- 			if ( !this.options.disabled && this.visible && this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
 
- 				this.isout = true;
 
- 				this.isover = false;
 
- 				this._deactivate.call( this, event );
 
- 			}
 
- 		});
 
- 		return dropped;
 
- 	},
 
- 	dragStart: function( draggable, event ) {
 
- 		// Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)
 
- 		draggable.element.parentsUntil( "body" ).bind( "scroll.droppable", function() {
 
- 			if ( !draggable.options.refreshPositions ) {
 
- 				$.ui.ddmanager.prepareOffsets( draggable, event );
 
- 			}
 
- 		});
 
- 	},
 
- 	drag: function( draggable, event ) {
 
- 		// If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
 
- 		if ( draggable.options.refreshPositions ) {
 
- 			$.ui.ddmanager.prepareOffsets( draggable, event );
 
- 		}
 
- 		// Run through all droppables and check their positions based on specific tolerance options
 
- 		$.each( $.ui.ddmanager.droppables[ draggable.options.scope ] || [], function() {
 
- 			if ( this.options.disabled || this.greedyChild || !this.visible ) {
 
- 				return;
 
- 			}
 
- 			var parentInstance, scope, parent,
 
- 				intersects = $.ui.intersect( draggable, this, this.options.tolerance, event ),
 
- 				c = !intersects && this.isover ? "isout" : ( intersects && !this.isover ? "isover" : null );
 
- 			if ( !c ) {
 
- 				return;
 
- 			}
 
- 			if ( this.options.greedy ) {
 
- 				// find droppable parents with same scope
 
- 				scope = this.options.scope;
 
- 				parent = this.element.parents( ":data(ui-droppable)" ).filter(function() {
 
- 					return $( this ).droppable( "instance" ).options.scope === scope;
 
- 				});
 
- 				if ( parent.length ) {
 
- 					parentInstance = $( parent[ 0 ] ).droppable( "instance" );
 
- 					parentInstance.greedyChild = ( c === "isover" );
 
- 				}
 
- 			}
 
- 			// we just moved into a greedy child
 
- 			if ( parentInstance && c === "isover" ) {
 
- 				parentInstance.isover = false;
 
- 				parentInstance.isout = true;
 
- 				parentInstance._out.call( parentInstance, event );
 
- 			}
 
- 			this[ c ] = true;
 
- 			this[c === "isout" ? "isover" : "isout"] = false;
 
- 			this[c === "isover" ? "_over" : "_out"].call( this, event );
 
- 			// we just moved out of a greedy child
 
- 			if ( parentInstance && c === "isout" ) {
 
- 				parentInstance.isout = false;
 
- 				parentInstance.isover = true;
 
- 				parentInstance._over.call( parentInstance, event );
 
- 			}
 
- 		});
 
- 	},
 
- 	dragStop: function( draggable, event ) {
 
- 		draggable.element.parentsUntil( "body" ).unbind( "scroll.droppable" );
 
- 		// Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)
 
- 		if ( !draggable.options.refreshPositions ) {
 
- 			$.ui.ddmanager.prepareOffsets( draggable, event );
 
- 		}
 
- 	}
 
- };
 
- var droppable = $.ui.droppable;
 
- /*!
 
-  * jQuery UI Sortable 1.11.4
 
-  * http://jqueryui.com
 
-  *
 
-  * Copyright jQuery Foundation and other contributors
 
-  * Released under the MIT license.
 
-  * http://jquery.org/license
 
-  *
 
-  * http://api.jqueryui.com/sortable/
 
-  */
 
- var sortable = $.widget("ui.sortable", $.ui.mouse, {
 
- 	version: "1.11.4",
 
- 	widgetEventPrefix: "sort",
 
- 	ready: false,
 
- 	options: {
 
- 		appendTo: "parent",
 
- 		axis: false,
 
- 		connectWith: false,
 
- 		containment: false,
 
- 		cursor: "auto",
 
- 		cursorAt: false,
 
- 		dropOnEmpty: true,
 
- 		forcePlaceholderSize: false,
 
- 		forceHelperSize: false,
 
- 		grid: false,
 
- 		handle: false,
 
- 		helper: "original",
 
- 		items: "> *",
 
- 		opacity: false,
 
- 		placeholder: false,
 
- 		revert: false,
 
- 		scroll: true,
 
- 		scrollSensitivity: 20,
 
- 		scrollSpeed: 20,
 
- 		scope: "default",
 
- 		tolerance: "intersect",
 
- 		zIndex: 1000,
 
- 		// callbacks
 
- 		activate: null,
 
- 		beforeStop: null,
 
- 		change: null,
 
- 		deactivate: null,
 
- 		out: null,
 
- 		over: null,
 
- 		receive: null,
 
- 		remove: null,
 
- 		sort: null,
 
- 		start: null,
 
- 		stop: null,
 
- 		update: null
 
- 	},
 
- 	_isOverAxis: function( x, reference, size ) {
 
- 		return ( x >= reference ) && ( x < ( reference + size ) );
 
- 	},
 
- 	_isFloating: function( item ) {
 
- 		return (/left|right/).test(item.css("float")) || (/inline|table-cell/).test(item.css("display"));
 
- 	},
 
- 	_create: function() {
 
- 		this.containerCache = {};
 
- 		this.element.addClass("ui-sortable");
 
- 		//Get the items
 
- 		this.refresh();
 
- 		//Let's determine the parent's offset
 
- 		this.offset = this.element.offset();
 
- 		//Initialize mouse events for interaction
 
- 		this._mouseInit();
 
- 		this._setHandleClassName();
 
- 		//We're ready to go
 
- 		this.ready = true;
 
- 	},
 
- 	_setOption: function( key, value ) {
 
- 		this._super( key, value );
 
- 		if ( key === "handle" ) {
 
- 			this._setHandleClassName();
 
- 		}
 
- 	},
 
- 	_setHandleClassName: function() {
 
- 		this.element.find( ".ui-sortable-handle" ).removeClass( "ui-sortable-handle" );
 
- 		$.each( this.items, function() {
 
- 			( this.instance.options.handle ?
 
- 				this.item.find( this.instance.options.handle ) : this.item )
 
- 				.addClass( "ui-sortable-handle" );
 
- 		});
 
- 	},
 
- 	_destroy: function() {
 
- 		this.element
 
- 			.removeClass( "ui-sortable ui-sortable-disabled" )
 
- 			.find( ".ui-sortable-handle" )
 
- 				.removeClass( "ui-sortable-handle" );
 
- 		this._mouseDestroy();
 
- 		for ( var i = this.items.length - 1; i >= 0; i-- ) {
 
- 			this.items[i].item.removeData(this.widgetName + "-item");
 
- 		}
 
- 		return this;
 
- 	},
 
- 	_mouseCapture: function(event, overrideHandle) {
 
- 		var currentItem = null,
 
- 			validHandle = false,
 
- 			that = this;
 
- 		if (this.reverting) {
 
- 			return false;
 
- 		}
 
- 		if(this.options.disabled || this.options.type === "static") {
 
- 			return false;
 
- 		}
 
- 		//We have to refresh the items data once first
 
- 		this._refreshItems(event);
 
- 		//Find out if the clicked node (or one of its parents) is a actual item in this.items
 
- 		$(event.target).parents().each(function() {
 
- 			if($.data(this, that.widgetName + "-item") === that) {
 
- 				currentItem = $(this);
 
- 				return false;
 
- 			}
 
- 		});
 
- 		if($.data(event.target, that.widgetName + "-item") === that) {
 
- 			currentItem = $(event.target);
 
- 		}
 
- 		if(!currentItem) {
 
- 			return false;
 
- 		}
 
- 		if(this.options.handle && !overrideHandle) {
 
- 			$(this.options.handle, currentItem).find("*").addBack().each(function() {
 
- 				if(this === event.target) {
 
- 					validHandle = true;
 
- 				}
 
- 			});
 
- 			if(!validHandle) {
 
- 				return false;
 
- 			}
 
- 		}
 
- 		this.currentItem = currentItem;
 
- 		this._removeCurrentsFromItems();
 
- 		return true;
 
- 	},
 
- 	_mouseStart: function(event, overrideHandle, noActivation) {
 
- 		var i, body,
 
- 			o = this.options;
 
- 		this.currentContainer = this;
 
- 		//We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
 
- 		this.refreshPositions();
 
- 		//Create and append the visible helper
 
- 		this.helper = this._createHelper(event);
 
- 		//Cache the helper size
 
- 		this._cacheHelperProportions();
 
- 		/*
 
- 		 * - Position generation -
 
- 		 * This block generates everything position related - it's the core of draggables.
 
- 		 */
 
- 		//Cache the margins of the original element
 
- 		this._cacheMargins();
 
- 		//Get the next scrolling parent
 
- 		this.scrollParent = this.helper.scrollParent();
 
- 		//The element's absolute position on the page minus margins
 
- 		this.offset = this.currentItem.offset();
 
- 		this.offset = {
 
- 			top: this.offset.top - this.margins.top,
 
- 			left: this.offset.left - this.margins.left
 
- 		};
 
- 		$.extend(this.offset, {
 
- 			click: { //Where the click happened, relative to the element
 
- 				left: event.pageX - this.offset.left,
 
- 				top: event.pageY - this.offset.top
 
- 			},
 
- 			parent: this._getParentOffset(),
 
- 			relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
 
- 		});
 
- 		// Only after we got the offset, we can change the helper's position to absolute
 
- 		// TODO: Still need to figure out a way to make relative sorting possible
 
- 		this.helper.css("position", "absolute");
 
- 		this.cssPosition = this.helper.css("position");
 
- 		//Generate the original position
 
- 		this.originalPosition = this._generatePosition(event);
 
- 		this.originalPageX = event.pageX;
 
- 		this.originalPageY = event.pageY;
 
- 		//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
 
- 		(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
 
- 		//Cache the former DOM position
 
- 		this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
 
- 		//If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
 
- 		if(this.helper[0] !== this.currentItem[0]) {
 
- 			this.currentItem.hide();
 
- 		}
 
- 		//Create the placeholder
 
- 		this._createPlaceholder();
 
- 		//Set a containment if given in the options
 
- 		if(o.containment) {
 
- 			this._setContainment();
 
- 		}
 
- 		if( o.cursor && o.cursor !== "auto" ) { // cursor option
 
- 			body = this.document.find( "body" );
 
- 			// support: IE
 
- 			this.storedCursor = body.css( "cursor" );
 
- 			body.css( "cursor", o.cursor );
 
- 			this.storedStylesheet = $( "<style>*{ cursor: "+o.cursor+" !important; }</style>" ).appendTo( body );
 
- 		}
 
- 		if(o.opacity) { // opacity option
 
- 			if (this.helper.css("opacity")) {
 
- 				this._storedOpacity = this.helper.css("opacity");
 
- 			}
 
- 			this.helper.css("opacity", o.opacity);
 
- 		}
 
- 		if(o.zIndex) { // zIndex option
 
- 			if (this.helper.css("zIndex")) {
 
- 				this._storedZIndex = this.helper.css("zIndex");
 
- 			}
 
- 			this.helper.css("zIndex", o.zIndex);
 
- 		}
 
- 		//Prepare scrolling
 
- 		if(this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName !== "HTML") {
 
- 			this.overflowOffset = this.scrollParent.offset();
 
- 		}
 
- 		//Call callbacks
 
- 		this._trigger("start", event, this._uiHash());
 
- 		//Recache the helper size
 
- 		if(!this._preserveHelperProportions) {
 
- 			this._cacheHelperProportions();
 
- 		}
 
- 		//Post "activate" events to possible containers
 
- 		if( !noActivation ) {
 
- 			for ( i = this.containers.length - 1; i >= 0; i-- ) {
 
- 				this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) );
 
- 			}
 
- 		}
 
- 		//Prepare possible droppables
 
- 		if($.ui.ddmanager) {
 
- 			$.ui.ddmanager.current = this;
 
- 		}
 
- 		if ($.ui.ddmanager && !o.dropBehaviour) {
 
- 			$.ui.ddmanager.prepareOffsets(this, event);
 
- 		}
 
- 		this.dragging = true;
 
- 		this.helper.addClass("ui-sortable-helper");
 
- 		this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
 
- 		return true;
 
- 	},
 
- 	_mouseDrag: function(event) {
 
- 		var i, item, itemElement, intersection,
 
- 			o = this.options,
 
- 			scrolled = false;
 
- 		//Compute the helpers position
 
- 		this.position = this._generatePosition(event);
 
- 		this.positionAbs = this._convertPositionTo("absolute");
 
- 		if (!this.lastPositionAbs) {
 
- 			this.lastPositionAbs = this.positionAbs;
 
- 		}
 
- 		//Do scrolling
 
- 		if(this.options.scroll) {
 
- 			if(this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName !== "HTML") {
 
- 				if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {
 
- 					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
 
- 				} else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) {
 
- 					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
 
- 				}
 
- 				if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {
 
- 					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
 
- 				} else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) {
 
- 					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
 
- 				}
 
- 			} else {
 
- 				if(event.pageY - this.document.scrollTop() < o.scrollSensitivity) {
 
- 					scrolled = this.document.scrollTop(this.document.scrollTop() - o.scrollSpeed);
 
- 				} else if(this.window.height() - (event.pageY - this.document.scrollTop()) < o.scrollSensitivity) {
 
- 					scrolled = this.document.scrollTop(this.document.scrollTop() + o.scrollSpeed);
 
- 				}
 
- 				if(event.pageX - this.document.scrollLeft() < o.scrollSensitivity) {
 
- 					scrolled = this.document.scrollLeft(this.document.scrollLeft() - o.scrollSpeed);
 
- 				} else if(this.window.width() - (event.pageX - this.document.scrollLeft()) < o.scrollSensitivity) {
 
- 					scrolled = this.document.scrollLeft(this.document.scrollLeft() + o.scrollSpeed);
 
- 				}
 
- 			}
 
- 			if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
 
- 				$.ui.ddmanager.prepareOffsets(this, event);
 
- 			}
 
- 		}
 
- 		//Regenerate the absolute position used for position checks
 
- 		this.positionAbs = this._convertPositionTo("absolute");
 
- 		//Set the helper position
 
- 		if(!this.options.axis || this.options.axis !== "y") {
 
- 			this.helper[0].style.left = this.position.left+"px";
 
- 		}
 
- 		if(!this.options.axis || this.options.axis !== "x") {
 
- 			this.helper[0].style.top = this.position.top+"px";
 
- 		}
 
- 		//Rearrange
 
- 		for (i = this.items.length - 1; i >= 0; i--) {
 
- 			//Cache variables and intersection, continue if no intersection
 
- 			item = this.items[i];
 
- 			itemElement = item.item[0];
 
- 			intersection = this._intersectsWithPointer(item);
 
- 			if (!intersection) {
 
- 				continue;
 
- 			}
 
- 			// Only put the placeholder inside the current Container, skip all
 
- 			// items from other containers. This works because when moving
 
- 			// an item from one container to another the
 
- 			// currentContainer is switched before the placeholder is moved.
 
- 			//
 
- 			// Without this, moving items in "sub-sortables" can cause
 
- 			// the placeholder to jitter between the outer and inner container.
 
- 			if (item.instance !== this.currentContainer) {
 
- 				continue;
 
- 			}
 
- 			// cannot intersect with itself
 
- 			// no useless actions that have been done before
 
- 			// no action if the item moved is the parent of the item checked
 
- 			if (itemElement !== this.currentItem[0] &&
 
- 				this.placeholder[intersection === 1 ? "next" : "prev"]()[0] !== itemElement &&
 
- 				!$.contains(this.placeholder[0], itemElement) &&
 
- 				(this.options.type === "semi-dynamic" ? !$.contains(this.element[0], itemElement) : true)
 
- 			) {
 
- 				this.direction = intersection === 1 ? "down" : "up";
 
- 				if (this.options.tolerance === "pointer" || this._intersectsWithSides(item)) {
 
- 					this._rearrange(event, item);
 
- 				} else {
 
- 					break;
 
- 				}
 
- 				this._trigger("change", event, this._uiHash());
 
- 				break;
 
- 			}
 
- 		}
 
- 		//Post events to containers
 
- 		this._contactContainers(event);
 
- 		//Interconnect with droppables
 
- 		if($.ui.ddmanager) {
 
- 			$.ui.ddmanager.drag(this, event);
 
- 		}
 
- 		//Call callbacks
 
- 		this._trigger("sort", event, this._uiHash());
 
- 		this.lastPositionAbs = this.positionAbs;
 
- 		return false;
 
- 	},
 
- 	_mouseStop: function(event, noPropagation) {
 
- 		if(!event) {
 
- 			return;
 
- 		}
 
- 		//If we are using droppables, inform the manager about the drop
 
- 		if ($.ui.ddmanager && !this.options.dropBehaviour) {
 
- 			$.ui.ddmanager.drop(this, event);
 
- 		}
 
- 		if(this.options.revert) {
 
- 			var that = this,
 
- 				cur = this.placeholder.offset(),
 
- 				axis = this.options.axis,
 
- 				animation = {};
 
- 			if ( !axis || axis === "x" ) {
 
- 				animation.left = cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollLeft);
 
- 			}
 
- 			if ( !axis || axis === "y" ) {
 
- 				animation.top = cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollTop);
 
- 			}
 
- 			this.reverting = true;
 
- 			$(this.helper).animate( animation, parseInt(this.options.revert, 10) || 500, function() {
 
- 				that._clear(event);
 
- 			});
 
- 		} else {
 
- 			this._clear(event, noPropagation);
 
- 		}
 
- 		return false;
 
- 	},
 
- 	cancel: function() {
 
- 		if(this.dragging) {
 
- 			this._mouseUp({ target: null });
 
- 			if(this.options.helper === "original") {
 
- 				this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
 
- 			} else {
 
- 				this.currentItem.show();
 
- 			}
 
- 			//Post deactivating events to containers
 
- 			for (var i = this.containers.length - 1; i >= 0; i--){
 
- 				this.containers[i]._trigger("deactivate", null, this._uiHash(this));
 
- 				if(this.containers[i].containerCache.over) {
 
- 					this.containers[i]._trigger("out", null, this._uiHash(this));
 
- 					this.containers[i].containerCache.over = 0;
 
- 				}
 
- 			}
 
- 		}
 
- 		if (this.placeholder) {
 
- 			//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
 
- 			if(this.placeholder[0].parentNode) {
 
- 				this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
 
- 			}
 
- 			if(this.options.helper !== "original" && this.helper && this.helper[0].parentNode) {
 
- 				this.helper.remove();
 
- 			}
 
- 			$.extend(this, {
 
- 				helper: null,
 
- 				dragging: false,
 
- 				reverting: false,
 
- 				_noFinalSort: null
 
- 			});
 
- 			if(this.domPosition.prev) {
 
- 				$(this.domPosition.prev).after(this.currentItem);
 
- 			} else {
 
- 				$(this.domPosition.parent).prepend(this.currentItem);
 
- 			}
 
- 		}
 
- 		return this;
 
- 	},
 
- 	serialize: function(o) {
 
- 		var items = this._getItemsAsjQuery(o && o.connected),
 
- 			str = [];
 
- 		o = o || {};
 
- 		$(items).each(function() {
 
- 			var res = ($(o.item || this).attr(o.attribute || "id") || "").match(o.expression || (/(.+)[\-=_](.+)/));
 
- 			if (res) {
 
- 				str.push((o.key || res[1]+"[]")+"="+(o.key && o.expression ? res[1] : res[2]));
 
- 			}
 
- 		});
 
- 		if(!str.length && o.key) {
 
- 			str.push(o.key + "=");
 
- 		}
 
- 		return str.join("&");
 
- 	},
 
- 	toArray: function(o) {
 
- 		var items = this._getItemsAsjQuery(o && o.connected),
 
- 			ret = [];
 
- 		o = o || {};
 
- 		items.each(function() { ret.push($(o.item || this).attr(o.attribute || "id") || ""); });
 
- 		return ret;
 
- 	},
 
- 	/* Be careful with the following core functions */
 
- 	_intersectsWith: function(item) {
 
- 		var x1 = this.positionAbs.left,
 
- 			x2 = x1 + this.helperProportions.width,
 
- 			y1 = this.positionAbs.top,
 
- 			y2 = y1 + this.helperProportions.height,
 
- 			l = item.left,
 
- 			r = l + item.width,
 
- 			t = item.top,
 
- 			b = t + item.height,
 
- 			dyClick = this.offset.click.top,
 
- 			dxClick = this.offset.click.left,
 
- 			isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick ) > t && ( y1 + dyClick ) < b ),
 
- 			isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick ) > l && ( x1 + dxClick ) < r ),
 
- 			isOverElement = isOverElementHeight && isOverElementWidth;
 
- 		if ( this.options.tolerance === "pointer" ||
 
- 			this.options.forcePointerForContainers ||
 
- 			(this.options.tolerance !== "pointer" && this.helperProportions[this.floating ? "width" : "height"] > item[this.floating ? "width" : "height"])
 
- 		) {
 
- 			return isOverElement;
 
- 		} else {
 
- 			return (l < x1 + (this.helperProportions.width / 2) && // Right Half
 
- 				x2 - (this.helperProportions.width / 2) < r && // Left Half
 
- 				t < y1 + (this.helperProportions.height / 2) && // Bottom Half
 
- 				y2 - (this.helperProportions.height / 2) < b ); // Top Half
 
- 		}
 
- 	},
 
- 	_intersectsWithPointer: function(item) {
 
- 		var isOverElementHeight = (this.options.axis === "x") || this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
 
- 			isOverElementWidth = (this.options.axis === "y") || this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
 
- 			isOverElement = isOverElementHeight && isOverElementWidth,
 
- 			verticalDirection = this._getDragVerticalDirection(),
 
- 			horizontalDirection = this._getDragHorizontalDirection();
 
- 		if (!isOverElement) {
 
- 			return false;
 
- 		}
 
- 		return this.floating ?
 
- 			( ((horizontalDirection && horizontalDirection === "right") || verticalDirection === "down") ? 2 : 1 )
 
- 			: ( verticalDirection && (verticalDirection === "down" ? 2 : 1) );
 
- 	},
 
- 	_intersectsWithSides: function(item) {
 
- 		var isOverBottomHalf = this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
 
- 			isOverRightHalf = this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
 
- 			verticalDirection = this._getDragVerticalDirection(),
 
- 			horizontalDirection = this._getDragHorizontalDirection();
 
- 		if (this.floating && horizontalDirection) {
 
- 			return ((horizontalDirection === "right" && isOverRightHalf) || (horizontalDirection === "left" && !isOverRightHalf));
 
- 		} else {
 
- 			return verticalDirection && ((verticalDirection === "down" && isOverBottomHalf) || (verticalDirection === "up" && !isOverBottomHalf));
 
- 		}
 
- 	},
 
- 	_getDragVerticalDirection: function() {
 
- 		var delta = this.positionAbs.top - this.lastPositionAbs.top;
 
- 		return delta !== 0 && (delta > 0 ? "down" : "up");
 
- 	},
 
- 	_getDragHorizontalDirection: function() {
 
- 		var delta = this.positionAbs.left - this.lastPositionAbs.left;
 
- 		return delta !== 0 && (delta > 0 ? "right" : "left");
 
- 	},
 
- 	refresh: function(event) {
 
- 		this._refreshItems(event);
 
- 		this._setHandleClassName();
 
- 		this.refreshPositions();
 
- 		return this;
 
- 	},
 
- 	_connectWith: function() {
 
- 		var options = this.options;
 
- 		return options.connectWith.constructor === String ? [options.connectWith] : options.connectWith;
 
- 	},
 
- 	_getItemsAsjQuery: function(connected) {
 
- 		var i, j, cur, inst,
 
- 			items = [],
 
- 			queries = [],
 
- 			connectWith = this._connectWith();
 
- 		if(connectWith && connected) {
 
- 			for (i = connectWith.length - 1; i >= 0; i--){
 
- 				cur = $(connectWith[i], this.document[0]);
 
- 				for ( j = cur.length - 1; j >= 0; j--){
 
- 					inst = $.data(cur[j], this.widgetFullName);
 
- 					if(inst && inst !== this && !inst.options.disabled) {
 
- 						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), inst]);
 
- 					}
 
- 				}
 
- 			}
 
- 		}
 
- 		queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), this]);
 
- 		function addItems() {
 
- 			items.push( this );
 
- 		}
 
- 		for (i = queries.length - 1; i >= 0; i--){
 
- 			queries[i][0].each( addItems );
 
- 		}
 
- 		return $(items);
 
- 	},
 
- 	_removeCurrentsFromItems: function() {
 
- 		var list = this.currentItem.find(":data(" + this.widgetName + "-item)");
 
- 		this.items = $.grep(this.items, function (item) {
 
- 			for (var j=0; j < list.length; j++) {
 
- 				if(list[j] === item.item[0]) {
 
- 					return false;
 
- 				}
 
- 			}
 
- 			return true;
 
- 		});
 
- 	},
 
- 	_refreshItems: function(event) {
 
- 		this.items = [];
 
- 		this.containers = [this];
 
- 		var i, j, cur, inst, targetData, _queries, item, queriesLength,
 
- 			items = this.items,
 
- 			queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]],
 
- 			connectWith = this._connectWith();
 
- 		if(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down
 
- 			for (i = connectWith.length - 1; i >= 0; i--){
 
- 				cur = $(connectWith[i], this.document[0]);
 
- 				for (j = cur.length - 1; j >= 0; j--){
 
- 					inst = $.data(cur[j], this.widgetFullName);
 
- 					if(inst && inst !== this && !inst.options.disabled) {
 
- 						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
 
- 						this.containers.push(inst);
 
- 					}
 
- 				}
 
- 			}
 
- 		}
 
- 		for (i = queries.length - 1; i >= 0; i--) {
 
- 			targetData = queries[i][1];
 
- 			_queries = queries[i][0];
 
- 			for (j=0, queriesLength = _queries.length; j < queriesLength; j++) {
 
- 				item = $(_queries[j]);
 
- 				item.data(this.widgetName + "-item", targetData); // Data for target checking (mouse manager)
 
- 				items.push({
 
- 					item: item,
 
- 					instance: targetData,
 
- 					width: 0, height: 0,
 
- 					left: 0, top: 0
 
- 				});
 
- 			}
 
- 		}
 
- 	},
 
- 	refreshPositions: function(fast) {
 
- 		// Determine whether items are being displayed horizontally
 
- 		this.floating = this.items.length ?
 
- 			this.options.axis === "x" || this._isFloating( this.items[ 0 ].item ) :
 
- 			false;
 
- 		//This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
 
- 		if(this.offsetParent && this.helper) {
 
- 			this.offset.parent = this._getParentOffset();
 
- 		}
 
- 		var i, item, t, p;
 
- 		for (i = this.items.length - 1; i >= 0; i--){
 
- 			item = this.items[i];
 
- 			//We ignore calculating positions of all connected containers when we're not over them
 
- 			if(item.instance !== this.currentContainer && this.currentContainer && item.item[0] !== this.currentItem[0]) {
 
- 				continue;
 
- 			}
 
- 			t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
 
- 			if (!fast) {
 
- 				item.width = t.outerWidth();
 
- 				item.height = t.outerHeight();
 
- 			}
 
- 			p = t.offset();
 
- 			item.left = p.left;
 
- 			item.top = p.top;
 
- 		}
 
- 		if(this.options.custom && this.options.custom.refreshContainers) {
 
- 			this.options.custom.refreshContainers.call(this);
 
- 		} else {
 
- 			for (i = this.containers.length - 1; i >= 0; i--){
 
- 				p = this.containers[i].element.offset();
 
- 				this.containers[i].containerCache.left = p.left;
 
- 				this.containers[i].containerCache.top = p.top;
 
- 				this.containers[i].containerCache.width = this.containers[i].element.outerWidth();
 
- 				this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
 
- 			}
 
- 		}
 
- 		return this;
 
- 	},
 
- 	_createPlaceholder: function(that) {
 
- 		that = that || this;
 
- 		var className,
 
- 			o = that.options;
 
- 		if(!o.placeholder || o.placeholder.constructor === String) {
 
- 			className = o.placeholder;
 
- 			o.placeholder = {
 
- 				element: function() {
 
- 					var nodeName = that.currentItem[0].nodeName.toLowerCase(),
 
- 						element = $( "<" + nodeName + ">", that.document[0] )
 
- 							.addClass(className || that.currentItem[0].className+" ui-sortable-placeholder")
 
- 							.removeClass("ui-sortable-helper");
 
- 					if ( nodeName === "tbody" ) {
 
- 						that._createTrPlaceholder(
 
- 							that.currentItem.find( "tr" ).eq( 0 ),
 
- 							$( "<tr>", that.document[ 0 ] ).appendTo( element )
 
- 						);
 
- 					} else if ( nodeName === "tr" ) {
 
- 						that._createTrPlaceholder( that.currentItem, element );
 
- 					} else if ( nodeName === "img" ) {
 
- 						element.attr( "src", that.currentItem.attr( "src" ) );
 
- 					}
 
- 					if ( !className ) {
 
- 						element.css( "visibility", "hidden" );
 
- 					}
 
- 					return element;
 
- 				},
 
- 				update: function(container, p) {
 
- 					// 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
 
- 					// 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
 
- 					if(className && !o.forcePlaceholderSize) {
 
- 						return;
 
- 					}
 
- 					//If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
 
- 					if(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css("paddingTop")||0, 10) - parseInt(that.currentItem.css("paddingBottom")||0, 10)); }
 
- 					if(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css("paddingLeft")||0, 10) - parseInt(that.currentItem.css("paddingRight")||0, 10)); }
 
- 				}
 
- 			};
 
- 		}
 
- 		//Create the placeholder
 
- 		that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));
 
- 		//Append it after the actual current item
 
- 		that.currentItem.after(that.placeholder);
 
- 		//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
 
- 		o.placeholder.update(that, that.placeholder);
 
- 	},
 
- 	_createTrPlaceholder: function( sourceTr, targetTr ) {
 
- 		var that = this;
 
- 		sourceTr.children().each(function() {
 
- 			$( "<td> </td>", that.document[ 0 ] )
 
- 				.attr( "colspan", $( this ).attr( "colspan" ) || 1 )
 
- 				.appendTo( targetTr );
 
- 		});
 
- 	},
 
- 	_contactContainers: function(event) {
 
- 		var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom, floating, axis,
 
- 			innermostContainer = null,
 
- 			innermostIndex = null;
 
- 		// get innermost container that intersects with item
 
- 		for (i = this.containers.length - 1; i >= 0; i--) {
 
- 			// never consider a container that's located within the item itself
 
- 			if($.contains(this.currentItem[0], this.containers[i].element[0])) {
 
- 				continue;
 
- 			}
 
- 			if(this._intersectsWith(this.containers[i].containerCache)) {
 
- 				// if we've already found a container and it's more "inner" than this, then continue
 
- 				if(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0])) {
 
- 					continue;
 
- 				}
 
- 				innermostContainer = this.containers[i];
 
- 				innermostIndex = i;
 
- 			} else {
 
- 				// container doesn't intersect. trigger "out" event if necessary
 
- 				if(this.containers[i].containerCache.over) {
 
- 					this.containers[i]._trigger("out", event, this._uiHash(this));
 
- 					this.containers[i].containerCache.over = 0;
 
- 				}
 
- 			}
 
- 		}
 
- 		// if no intersecting containers found, return
 
- 		if(!innermostContainer) {
 
- 			return;
 
- 		}
 
- 		// move the item into the container if it's not there already
 
- 		if(this.containers.length === 1) {
 
- 			if (!this.containers[innermostIndex].containerCache.over) {
 
- 				this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
 
- 				this.containers[innermostIndex].containerCache.over = 1;
 
- 			}
 
- 		} else {
 
- 			//When entering a new container, we will find the item with the least distance and append our item near it
 
- 			dist = 10000;
 
- 			itemWithLeastDistance = null;
 
- 			floating = innermostContainer.floating || this._isFloating(this.currentItem);
 
- 			posProperty = floating ? "left" : "top";
 
- 			sizeProperty = floating ? "width" : "height";
 
- 			axis = floating ? "clientX" : "clientY";
 
- 			for (j = this.items.length - 1; j >= 0; j--) {
 
- 				if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) {
 
- 					continue;
 
- 				}
 
- 				if(this.items[j].item[0] === this.currentItem[0]) {
 
- 					continue;
 
- 				}
 
- 				cur = this.items[j].item.offset()[posProperty];
 
- 				nearBottom = false;
 
- 				if ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {
 
- 					nearBottom = true;
 
- 				}
 
- 				if ( Math.abs( event[ axis ] - cur ) < dist ) {
 
- 					dist = Math.abs( event[ axis ] - cur );
 
- 					itemWithLeastDistance = this.items[ j ];
 
- 					this.direction = nearBottom ? "up": "down";
 
- 				}
 
- 			}
 
- 			//Check if dropOnEmpty is enabled
 
- 			if(!itemWithLeastDistance && !this.options.dropOnEmpty) {
 
- 				return;
 
- 			}
 
- 			if(this.currentContainer === this.containers[innermostIndex]) {
 
- 				if ( !this.currentContainer.containerCache.over ) {
 
- 					this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash() );
 
- 					this.currentContainer.containerCache.over = 1;
 
- 				}
 
- 				return;
 
- 			}
 
- 			itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);
 
- 			this._trigger("change", event, this._uiHash());
 
- 			this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
 
- 			this.currentContainer = this.containers[innermostIndex];
 
- 			//Update the placeholder
 
- 			this.options.placeholder.update(this.currentContainer, this.placeholder);
 
- 			this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
 
- 			this.containers[innermostIndex].containerCache.over = 1;
 
- 		}
 
- 	},
 
- 	_createHelper: function(event) {
 
- 		var o = this.options,
 
- 			helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper === "clone" ? this.currentItem.clone() : this.currentItem);
 
- 		//Add the helper to the DOM if that didn't happen already
 
- 		if(!helper.parents("body").length) {
 
- 			$(o.appendTo !== "parent" ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
 
- 		}
 
- 		if(helper[0] === this.currentItem[0]) {
 
- 			this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };
 
- 		}
 
- 		if(!helper[0].style.width || o.forceHelperSize) {
 
- 			helper.width(this.currentItem.width());
 
- 		}
 
- 		if(!helper[0].style.height || o.forceHelperSize) {
 
- 			helper.height(this.currentItem.height());
 
- 		}
 
- 		return helper;
 
- 	},
 
- 	_adjustOffsetFromHelper: function(obj) {
 
- 		if (typeof obj === "string") {
 
- 			obj = obj.split(" ");
 
- 		}
 
- 		if ($.isArray(obj)) {
 
- 			obj = {left: +obj[0], top: +obj[1] || 0};
 
- 		}
 
- 		if ("left" in obj) {
 
- 			this.offset.click.left = obj.left + this.margins.left;
 
- 		}
 
- 		if ("right" in obj) {
 
- 			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
 
- 		}
 
- 		if ("top" in obj) {
 
- 			this.offset.click.top = obj.top + this.margins.top;
 
- 		}
 
- 		if ("bottom" in obj) {
 
- 			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
 
- 		}
 
- 	},
 
- 	_getParentOffset: function() {
 
- 		//Get the offsetParent and cache its position
 
- 		this.offsetParent = this.helper.offsetParent();
 
- 		var po = this.offsetParent.offset();
 
- 		// This is a special case where we need to modify a offset calculated on start, since the following happened:
 
- 		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
 
- 		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
 
- 		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
 
- 		if(this.cssPosition === "absolute" && this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) {
 
- 			po.left += this.scrollParent.scrollLeft();
 
- 			po.top += this.scrollParent.scrollTop();
 
- 		}
 
- 		// This needs to be actually done for all browsers, since pageX/pageY includes this information
 
- 		// with an ugly IE fix
 
- 		if( this.offsetParent[0] === this.document[0].body || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) {
 
- 			po = { top: 0, left: 0 };
 
- 		}
 
- 		return {
 
- 			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
 
- 			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
 
- 		};
 
- 	},
 
- 	_getRelativeOffset: function() {
 
- 		if(this.cssPosition === "relative") {
 
- 			var p = this.currentItem.position();
 
- 			return {
 
- 				top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
 
- 				left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
 
- 			};
 
- 		} else {
 
- 			return { top: 0, left: 0 };
 
- 		}
 
- 	},
 
- 	_cacheMargins: function() {
 
- 		this.margins = {
 
- 			left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
 
- 			top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
 
- 		};
 
- 	},
 
- 	_cacheHelperProportions: function() {
 
- 		this.helperProportions = {
 
- 			width: this.helper.outerWidth(),
 
- 			height: this.helper.outerHeight()
 
- 		};
 
- 	},
 
- 	_setContainment: function() {
 
- 		var ce, co, over,
 
- 			o = this.options;
 
- 		if(o.containment === "parent") {
 
- 			o.containment = this.helper[0].parentNode;
 
- 		}
 
- 		if(o.containment === "document" || o.containment === "window") {
 
- 			this.containment = [
 
- 				0 - this.offset.relative.left - this.offset.parent.left,
 
- 				0 - this.offset.relative.top - this.offset.parent.top,
 
- 				o.containment === "document" ? this.document.width() : this.window.width() - this.helperProportions.width - this.margins.left,
 
- 				(o.containment === "document" ? this.document.width() : this.window.height() || this.document[0].body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
 
- 			];
 
- 		}
 
- 		if(!(/^(document|window|parent)$/).test(o.containment)) {
 
- 			ce = $(o.containment)[0];
 
- 			co = $(o.containment).offset();
 
- 			over = ($(ce).css("overflow") !== "hidden");
 
- 			this.containment = [
 
- 				co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
 
- 				co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
 
- 				co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
 
- 				co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
 
- 			];
 
- 		}
 
- 	},
 
- 	_convertPositionTo: function(d, pos) {
 
- 		if(!pos) {
 
- 			pos = this.position;
 
- 		}
 
- 		var mod = d === "absolute" ? 1 : -1,
 
- 			scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent,
 
- 			scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
 
- 		return {
 
- 			top: (
 
- 				pos.top	+																// The absolute mouse position
 
- 				this.offset.relative.top * mod +										// Only for relative positioned nodes: Relative offset from element to offset parent
 
- 				this.offset.parent.top * mod -											// The offsetParent's offset without borders (offset + border)
 
- 				( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
 
- 			),
 
- 			left: (
 
- 				pos.left +																// The absolute mouse position
 
- 				this.offset.relative.left * mod +										// Only for relative positioned nodes: Relative offset from element to offset parent
 
- 				this.offset.parent.left * mod	-										// The offsetParent's offset without borders (offset + border)
 
- 				( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
 
- 			)
 
- 		};
 
- 	},
 
- 	_generatePosition: function(event) {
 
- 		var top, left,
 
- 			o = this.options,
 
- 			pageX = event.pageX,
 
- 			pageY = event.pageY,
 
- 			scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
 
- 		// This is another very weird special case that only happens for relative elements:
 
- 		// 1. If the css position is relative
 
- 		// 2. and the scroll parent is the document or similar to the offset parent
 
- 		// we have to refresh the relative offset during the scroll so there are no jumps
 
- 		if(this.cssPosition === "relative" && !(this.scrollParent[0] !== this.document[0] && this.scrollParent[0] !== this.offsetParent[0])) {
 
- 			this.offset.relative = this._getRelativeOffset();
 
- 		}
 
- 		/*
 
- 		 * - Position constraining -
 
- 		 * Constrain the position to a mix of grid, containment.
 
- 		 */
 
- 		if(this.originalPosition) { //If we are not dragging yet, we won't check for options
 
- 			if(this.containment) {
 
- 				if(event.pageX - this.offset.click.left < this.containment[0]) {
 
- 					pageX = this.containment[0] + this.offset.click.left;
 
- 				}
 
- 				if(event.pageY - this.offset.click.top < this.containment[1]) {
 
- 					pageY = this.containment[1] + this.offset.click.top;
 
- 				}
 
- 				if(event.pageX - this.offset.click.left > this.containment[2]) {
 
- 					pageX = this.containment[2] + this.offset.click.left;
 
- 				}
 
- 				if(event.pageY - this.offset.click.top > this.containment[3]) {
 
- 					pageY = this.containment[3] + this.offset.click.top;
 
- 				}
 
- 			}
 
- 			if(o.grid) {
 
- 				top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
 
- 				pageY = this.containment ? ( (top - this.offset.click.top >= this.containment[1] && top - this.offset.click.top <= this.containment[3]) ? top : ((top - this.offset.click.top >= this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
 
- 				left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
 
- 				pageX = this.containment ? ( (left - this.offset.click.left >= this.containment[0] && left - this.offset.click.left <= this.containment[2]) ? left : ((left - this.offset.click.left >= this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
 
- 			}
 
- 		}
 
- 		return {
 
- 			top: (
 
- 				pageY -																// The absolute mouse position
 
- 				this.offset.click.top -													// Click offset (relative to the element)
 
- 				this.offset.relative.top	-											// Only for relative positioned nodes: Relative offset from element to offset parent
 
- 				this.offset.parent.top +												// The offsetParent's offset without borders (offset + border)
 
- 				( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
 
- 			),
 
- 			left: (
 
- 				pageX -																// The absolute mouse position
 
- 				this.offset.click.left -												// Click offset (relative to the element)
 
- 				this.offset.relative.left	-											// Only for relative positioned nodes: Relative offset from element to offset parent
 
- 				this.offset.parent.left +												// The offsetParent's offset without borders (offset + border)
 
- 				( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
 
- 			)
 
- 		};
 
- 	},
 
- 	_rearrange: function(event, i, a, hardRefresh) {
 
- 		a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction === "down" ? i.item[0] : i.item[0].nextSibling));
 
- 		//Various things done here to improve the performance:
 
- 		// 1. we create a setTimeout, that calls refreshPositions
 
- 		// 2. on the instance, we have a counter variable, that get's higher after every append
 
- 		// 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
 
- 		// 4. this lets only the last addition to the timeout stack through
 
- 		this.counter = this.counter ? ++this.counter : 1;
 
- 		var counter = this.counter;
 
- 		this._delay(function() {
 
- 			if(counter === this.counter) {
 
- 				this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
 
- 			}
 
- 		});
 
- 	},
 
- 	_clear: function(event, noPropagation) {
 
- 		this.reverting = false;
 
- 		// We delay all events that have to be triggered to after the point where the placeholder has been removed and
 
- 		// everything else normalized again
 
- 		var i,
 
- 			delayedTriggers = [];
 
- 		// We first have to update the dom position of the actual currentItem
 
- 		// Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
 
- 		if(!this._noFinalSort && this.currentItem.parent().length) {
 
- 			this.placeholder.before(this.currentItem);
 
- 		}
 
- 		this._noFinalSort = null;
 
- 		if(this.helper[0] === this.currentItem[0]) {
 
- 			for(i in this._storedCSS) {
 
- 				if(this._storedCSS[i] === "auto" || this._storedCSS[i] === "static") {
 
- 					this._storedCSS[i] = "";
 
- 				}
 
- 			}
 
- 			this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
 
- 		} else {
 
- 			this.currentItem.show();
 
- 		}
 
- 		if(this.fromOutside && !noPropagation) {
 
- 			delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
 
- 		}
 
- 		if((this.fromOutside || this.domPosition.prev !== this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent !== this.currentItem.parent()[0]) && !noPropagation) {
 
- 			delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
 
- 		}
 
- 		// Check if the items Container has Changed and trigger appropriate
 
- 		// events.
 
- 		if (this !== this.currentContainer) {
 
- 			if(!noPropagation) {
 
- 				delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
 
- 				delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); };  }).call(this, this.currentContainer));
 
- 				delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this));  }; }).call(this, this.currentContainer));
 
- 			}
 
- 		}
 
- 		//Post events to containers
 
- 		function delayEvent( type, instance, container ) {
 
- 			return function( event ) {
 
- 				container._trigger( type, event, instance._uiHash( instance ) );
 
- 			};
 
- 		}
 
- 		for (i = this.containers.length - 1; i >= 0; i--){
 
- 			if (!noPropagation) {
 
- 				delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ] ) );
 
- 			}
 
- 			if(this.containers[i].containerCache.over) {
 
- 				delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) );
 
- 				this.containers[i].containerCache.over = 0;
 
- 			}
 
- 		}
 
- 		//Do what was originally in plugins
 
- 		if ( this.storedCursor ) {
 
- 			this.document.find( "body" ).css( "cursor", this.storedCursor );
 
- 			this.storedStylesheet.remove();
 
- 		}
 
- 		if(this._storedOpacity) {
 
- 			this.helper.css("opacity", this._storedOpacity);
 
- 		}
 
- 		if(this._storedZIndex) {
 
- 			this.helper.css("zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex);
 
- 		}
 
- 		this.dragging = false;
 
- 		if(!noPropagation) {
 
- 			this._trigger("beforeStop", event, this._uiHash());
 
- 		}
 
- 		//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
 
- 		this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
 
- 		if ( !this.cancelHelperRemoval ) {
 
- 			if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
 
- 				this.helper.remove();
 
- 			}
 
- 			this.helper = null;
 
- 		}
 
- 		if(!noPropagation) {
 
- 			for (i=0; i < delayedTriggers.length; i++) {
 
- 				delayedTriggers[i].call(this, event);
 
- 			} //Trigger all delayed events
 
- 			this._trigger("stop", event, this._uiHash());
 
- 		}
 
- 		this.fromOutside = false;
 
- 		return !this.cancelHelperRemoval;
 
- 	},
 
- 	_trigger: function() {
 
- 		if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
 
- 			this.cancel();
 
- 		}
 
- 	},
 
- 	_uiHash: function(_inst) {
 
- 		var inst = _inst || this;
 
- 		return {
 
- 			helper: inst.helper,
 
- 			placeholder: inst.placeholder || $([]),
 
- 			position: inst.position,
 
- 			originalPosition: inst.originalPosition,
 
- 			offset: inst.positionAbs,
 
- 			item: inst.currentItem,
 
- 			sender: _inst ? _inst.element : null
 
- 		};
 
- 	}
 
- });
 
- /*!
 
-  * jQuery UI Effects 1.11.4
 
-  * http://jqueryui.com
 
-  *
 
-  * Copyright jQuery Foundation and other contributors
 
-  * Released under the MIT license.
 
-  * http://jquery.org/license
 
-  *
 
-  * http://api.jqueryui.com/category/effects-core/
 
-  */
 
- var dataSpace = "ui-effects-",
 
- 	// Create a local jQuery because jQuery Color relies on it and the
 
- 	// global may not exist with AMD and a custom build (#10199)
 
- 	jQuery = $;
 
- $.effects = {
 
- 	effect: {}
 
- };
 
- /*!
 
-  * jQuery Color Animations v2.1.2
 
-  * https://github.com/jquery/jquery-color
 
-  *
 
-  * Copyright 2014 jQuery Foundation and other contributors
 
-  * Released under the MIT license.
 
-  * http://jquery.org/license
 
-  *
 
-  * Date: Wed Jan 16 08:47:09 2013 -0600
 
-  */
 
- (function( jQuery, undefined ) {
 
- 	var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",
 
- 	// plusequals test for += 100 -= 100
 
- 	rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
 
- 	// a set of RE's that can match strings and generate color tuples.
 
- 	stringParsers = [ {
 
- 			re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
 
- 			parse: function( execResult ) {
 
- 				return [
 
- 					execResult[ 1 ],
 
- 					execResult[ 2 ],
 
- 					execResult[ 3 ],
 
- 					execResult[ 4 ]
 
- 				];
 
- 			}
 
- 		}, {
 
- 			re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
 
- 			parse: function( execResult ) {
 
- 				return [
 
- 					execResult[ 1 ] * 2.55,
 
- 					execResult[ 2 ] * 2.55,
 
- 					execResult[ 3 ] * 2.55,
 
- 					execResult[ 4 ]
 
- 				];
 
- 			}
 
- 		}, {
 
- 			// this regex ignores A-F because it's compared against an already lowercased string
 
- 			re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,
 
- 			parse: function( execResult ) {
 
- 				return [
 
- 					parseInt( execResult[ 1 ], 16 ),
 
- 					parseInt( execResult[ 2 ], 16 ),
 
- 					parseInt( execResult[ 3 ], 16 )
 
- 				];
 
- 			}
 
- 		}, {
 
- 			// this regex ignores A-F because it's compared against an already lowercased string
 
- 			re: /#([a-f0-9])([a-f0-9])([a-f0-9])/,
 
- 			parse: function( execResult ) {
 
- 				return [
 
- 					parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),
 
- 					parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),
 
- 					parseInt( execResult[ 3 ] + execResult[ 3 ], 16 )
 
- 				];
 
- 			}
 
- 		}, {
 
- 			re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
 
- 			space: "hsla",
 
- 			parse: function( execResult ) {
 
- 				return [
 
- 					execResult[ 1 ],
 
- 					execResult[ 2 ] / 100,
 
- 					execResult[ 3 ] / 100,
 
- 					execResult[ 4 ]
 
- 				];
 
- 			}
 
- 		} ],
 
- 	// jQuery.Color( )
 
- 	color = jQuery.Color = function( color, green, blue, alpha ) {
 
- 		return new jQuery.Color.fn.parse( color, green, blue, alpha );
 
- 	},
 
- 	spaces = {
 
- 		rgba: {
 
- 			props: {
 
- 				red: {
 
- 					idx: 0,
 
- 					type: "byte"
 
- 				},
 
- 				green: {
 
- 					idx: 1,
 
- 					type: "byte"
 
- 				},
 
- 				blue: {
 
- 					idx: 2,
 
- 					type: "byte"
 
- 				}
 
- 			}
 
- 		},
 
- 		hsla: {
 
- 			props: {
 
- 				hue: {
 
- 					idx: 0,
 
- 					type: "degrees"
 
- 				},
 
- 				saturation: {
 
- 					idx: 1,
 
- 					type: "percent"
 
- 				},
 
- 				lightness: {
 
- 					idx: 2,
 
- 					type: "percent"
 
- 				}
 
- 			}
 
- 		}
 
- 	},
 
- 	propTypes = {
 
- 		"byte": {
 
- 			floor: true,
 
- 			max: 255
 
- 		},
 
- 		"percent": {
 
- 			max: 1
 
- 		},
 
- 		"degrees": {
 
- 			mod: 360,
 
- 			floor: true
 
- 		}
 
- 	},
 
- 	support = color.support = {},
 
- 	// element for support tests
 
- 	supportElem = jQuery( "<p>" )[ 0 ],
 
- 	// colors = jQuery.Color.names
 
- 	colors,
 
- 	// local aliases of functions called often
 
- 	each = jQuery.each;
 
- // determine rgba support immediately
 
- supportElem.style.cssText = "background-color:rgba(1,1,1,.5)";
 
- support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1;
 
- // define cache name and alpha properties
 
- // for rgba and hsla spaces
 
- each( spaces, function( spaceName, space ) {
 
- 	space.cache = "_" + spaceName;
 
- 	space.props.alpha = {
 
- 		idx: 3,
 
- 		type: "percent",
 
- 		def: 1
 
- 	};
 
- });
 
- function clamp( value, prop, allowEmpty ) {
 
- 	var type = propTypes[ prop.type ] || {};
 
- 	if ( value == null ) {
 
- 		return (allowEmpty || !prop.def) ? null : prop.def;
 
- 	}
 
- 	// ~~ is an short way of doing floor for positive numbers
 
- 	value = type.floor ? ~~value : parseFloat( value );
 
- 	// IE will pass in empty strings as value for alpha,
 
- 	// which will hit this case
 
- 	if ( isNaN( value ) ) {
 
- 		return prop.def;
 
- 	}
 
- 	if ( type.mod ) {
 
- 		// we add mod before modding to make sure that negatives values
 
- 		// get converted properly: -10 -> 350
 
- 		return (value + type.mod) % type.mod;
 
- 	}
 
- 	// for now all property types without mod have min and max
 
- 	return 0 > value ? 0 : type.max < value ? type.max : value;
 
- }
 
- function stringParse( string ) {
 
- 	var inst = color(),
 
- 		rgba = inst._rgba = [];
 
- 	string = string.toLowerCase();
 
- 	each( stringParsers, function( i, parser ) {
 
- 		var parsed,
 
- 			match = parser.re.exec( string ),
 
- 			values = match && parser.parse( match ),
 
- 			spaceName = parser.space || "rgba";
 
- 		if ( values ) {
 
- 			parsed = inst[ spaceName ]( values );
 
- 			// if this was an rgba parse the assignment might happen twice
 
- 			// oh well....
 
- 			inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];
 
- 			rgba = inst._rgba = parsed._rgba;
 
- 			// exit each( stringParsers ) here because we matched
 
- 			return false;
 
- 		}
 
- 	});
 
- 	// Found a stringParser that handled it
 
- 	if ( rgba.length ) {
 
- 		// if this came from a parsed string, force "transparent" when alpha is 0
 
- 		// chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
 
- 		if ( rgba.join() === "0,0,0,0" ) {
 
- 			jQuery.extend( rgba, colors.transparent );
 
- 		}
 
- 		return inst;
 
- 	}
 
- 	// named colors
 
- 	return colors[ string ];
 
- }
 
- color.fn = jQuery.extend( color.prototype, {
 
- 	parse: function( red, green, blue, alpha ) {
 
- 		if ( red === undefined ) {
 
- 			this._rgba = [ null, null, null, null ];
 
- 			return this;
 
- 		}
 
- 		if ( red.jquery || red.nodeType ) {
 
- 			red = jQuery( red ).css( green );
 
- 			green = undefined;
 
- 		}
 
- 		var inst = this,
 
- 			type = jQuery.type( red ),
 
- 			rgba = this._rgba = [];
 
- 		// more than 1 argument specified - assume ( red, green, blue, alpha )
 
- 		if ( green !== undefined ) {
 
- 			red = [ red, green, blue, alpha ];
 
- 			type = "array";
 
- 		}
 
- 		if ( type === "string" ) {
 
- 			return this.parse( stringParse( red ) || colors._default );
 
- 		}
 
- 		if ( type === "array" ) {
 
- 			each( spaces.rgba.props, function( key, prop ) {
 
- 				rgba[ prop.idx ] = clamp( red[ prop.idx ], prop );
 
- 			});
 
- 			return this;
 
- 		}
 
- 		if ( type === "object" ) {
 
- 			if ( red instanceof color ) {
 
- 				each( spaces, function( spaceName, space ) {
 
- 					if ( red[ space.cache ] ) {
 
- 						inst[ space.cache ] = red[ space.cache ].slice();
 
- 					}
 
- 				});
 
- 			} else {
 
- 				each( spaces, function( spaceName, space ) {
 
- 					var cache = space.cache;
 
- 					each( space.props, function( key, prop ) {
 
- 						// if the cache doesn't exist, and we know how to convert
 
- 						if ( !inst[ cache ] && space.to ) {
 
- 							// if the value was null, we don't need to copy it
 
- 							// if the key was alpha, we don't need to copy it either
 
- 							if ( key === "alpha" || red[ key ] == null ) {
 
- 								return;
 
- 							}
 
- 							inst[ cache ] = space.to( inst._rgba );
 
- 						}
 
- 						// this is the only case where we allow nulls for ALL properties.
 
- 						// call clamp with alwaysAllowEmpty
 
- 						inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );
 
- 					});
 
- 					// everything defined but alpha?
 
- 					if ( inst[ cache ] && jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {
 
- 						// use the default of 1
 
- 						inst[ cache ][ 3 ] = 1;
 
- 						if ( space.from ) {
 
- 							inst._rgba = space.from( inst[ cache ] );
 
- 						}
 
- 					}
 
- 				});
 
- 			}
 
- 			return this;
 
- 		}
 
- 	},
 
- 	is: function( compare ) {
 
- 		var is = color( compare ),
 
- 			same = true,
 
- 			inst = this;
 
- 		each( spaces, function( _, space ) {
 
- 			var localCache,
 
- 				isCache = is[ space.cache ];
 
- 			if (isCache) {
 
- 				localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];
 
- 				each( space.props, function( _, prop ) {
 
- 					if ( isCache[ prop.idx ] != null ) {
 
- 						same = ( isCache[ prop.idx ] === localCache[ prop.idx ] );
 
- 						return same;
 
- 					}
 
- 				});
 
- 			}
 
- 			return same;
 
- 		});
 
- 		return same;
 
- 	},
 
- 	_space: function() {
 
- 		var used = [],
 
- 			inst = this;
 
- 		each( spaces, function( spaceName, space ) {
 
- 			if ( inst[ space.cache ] ) {
 
- 				used.push( spaceName );
 
- 			}
 
- 		});
 
- 		return used.pop();
 
- 	},
 
- 	transition: function( other, distance ) {
 
- 		var end = color( other ),
 
- 			spaceName = end._space(),
 
- 			space = spaces[ spaceName ],
 
- 			startColor = this.alpha() === 0 ? color( "transparent" ) : this,
 
- 			start = startColor[ space.cache ] || space.to( startColor._rgba ),
 
- 			result = start.slice();
 
- 		end = end[ space.cache ];
 
- 		each( space.props, function( key, prop ) {
 
- 			var index = prop.idx,
 
- 				startValue = start[ index ],
 
- 				endValue = end[ index ],
 
- 				type = propTypes[ prop.type ] || {};
 
- 			// if null, don't override start value
 
- 			if ( endValue === null ) {
 
- 				return;
 
- 			}
 
- 			// if null - use end
 
- 			if ( startValue === null ) {
 
- 				result[ index ] = endValue;
 
- 			} else {
 
- 				if ( type.mod ) {
 
- 					if ( endValue - startValue > type.mod / 2 ) {
 
- 						startValue += type.mod;
 
- 					} else if ( startValue - endValue > type.mod / 2 ) {
 
- 						startValue -= type.mod;
 
- 					}
 
- 				}
 
- 				result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );
 
- 			}
 
- 		});
 
- 		return this[ spaceName ]( result );
 
- 	},
 
- 	blend: function( opaque ) {
 
- 		// if we are already opaque - return ourself
 
- 		if ( this._rgba[ 3 ] === 1 ) {
 
- 			return this;
 
- 		}
 
- 		var rgb = this._rgba.slice(),
 
- 			a = rgb.pop(),
 
- 			blend = color( opaque )._rgba;
 
- 		return color( jQuery.map( rgb, function( v, i ) {
 
- 			return ( 1 - a ) * blend[ i ] + a * v;
 
- 		}));
 
- 	},
 
- 	toRgbaString: function() {
 
- 		var prefix = "rgba(",
 
- 			rgba = jQuery.map( this._rgba, function( v, i ) {
 
- 				return v == null ? ( i > 2 ? 1 : 0 ) : v;
 
- 			});
 
- 		if ( rgba[ 3 ] === 1 ) {
 
- 			rgba.pop();
 
- 			prefix = "rgb(";
 
- 		}
 
- 		return prefix + rgba.join() + ")";
 
- 	},
 
- 	toHslaString: function() {
 
- 		var prefix = "hsla(",
 
- 			hsla = jQuery.map( this.hsla(), function( v, i ) {
 
- 				if ( v == null ) {
 
- 					v = i > 2 ? 1 : 0;
 
- 				}
 
- 				// catch 1 and 2
 
- 				if ( i && i < 3 ) {
 
- 					v = Math.round( v * 100 ) + "%";
 
- 				}
 
- 				return v;
 
- 			});
 
- 		if ( hsla[ 3 ] === 1 ) {
 
- 			hsla.pop();
 
- 			prefix = "hsl(";
 
- 		}
 
- 		return prefix + hsla.join() + ")";
 
- 	},
 
- 	toHexString: function( includeAlpha ) {
 
- 		var rgba = this._rgba.slice(),
 
- 			alpha = rgba.pop();
 
- 		if ( includeAlpha ) {
 
- 			rgba.push( ~~( alpha * 255 ) );
 
- 		}
 
- 		return "#" + jQuery.map( rgba, function( v ) {
 
- 			// default to 0 when nulls exist
 
- 			v = ( v || 0 ).toString( 16 );
 
- 			return v.length === 1 ? "0" + v : v;
 
- 		}).join("");
 
- 	},
 
- 	toString: function() {
 
- 		return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString();
 
- 	}
 
- });
 
- color.fn.parse.prototype = color.fn;
 
- // hsla conversions adapted from:
 
- // https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021
 
- function hue2rgb( p, q, h ) {
 
- 	h = ( h + 1 ) % 1;
 
- 	if ( h * 6 < 1 ) {
 
- 		return p + ( q - p ) * h * 6;
 
- 	}
 
- 	if ( h * 2 < 1) {
 
- 		return q;
 
- 	}
 
- 	if ( h * 3 < 2 ) {
 
- 		return p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6;
 
- 	}
 
- 	return p;
 
- }
 
- spaces.hsla.to = function( rgba ) {
 
- 	if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {
 
- 		return [ null, null, null, rgba[ 3 ] ];
 
- 	}
 
- 	var r = rgba[ 0 ] / 255,
 
- 		g = rgba[ 1 ] / 255,
 
- 		b = rgba[ 2 ] / 255,
 
- 		a = rgba[ 3 ],
 
- 		max = Math.max( r, g, b ),
 
- 		min = Math.min( r, g, b ),
 
- 		diff = max - min,
 
- 		add = max + min,
 
- 		l = add * 0.5,
 
- 		h, s;
 
- 	if ( min === max ) {
 
- 		h = 0;
 
- 	} else if ( r === max ) {
 
- 		h = ( 60 * ( g - b ) / diff ) + 360;
 
- 	} else if ( g === max ) {
 
- 		h = ( 60 * ( b - r ) / diff ) + 120;
 
- 	} else {
 
- 		h = ( 60 * ( r - g ) / diff ) + 240;
 
- 	}
 
- 	// chroma (diff) == 0 means greyscale which, by definition, saturation = 0%
 
- 	// otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)
 
- 	if ( diff === 0 ) {
 
- 		s = 0;
 
- 	} else if ( l <= 0.5 ) {
 
- 		s = diff / add;
 
- 	} else {
 
- 		s = diff / ( 2 - add );
 
- 	}
 
- 	return [ Math.round(h) % 360, s, l, a == null ? 1 : a ];
 
- };
 
- spaces.hsla.from = function( hsla ) {
 
- 	if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {
 
- 		return [ null, null, null, hsla[ 3 ] ];
 
- 	}
 
- 	var h = hsla[ 0 ] / 360,
 
- 		s = hsla[ 1 ],
 
- 		l = hsla[ 2 ],
 
- 		a = hsla[ 3 ],
 
- 		q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,
 
- 		p = 2 * l - q;
 
- 	return [
 
- 		Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),
 
- 		Math.round( hue2rgb( p, q, h ) * 255 ),
 
- 		Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),
 
- 		a
 
- 	];
 
- };
 
- each( spaces, function( spaceName, space ) {
 
- 	var props = space.props,
 
- 		cache = space.cache,
 
- 		to = space.to,
 
- 		from = space.from;
 
- 	// makes rgba() and hsla()
 
- 	color.fn[ spaceName ] = function( value ) {
 
- 		// generate a cache for this space if it doesn't exist
 
- 		if ( to && !this[ cache ] ) {
 
- 			this[ cache ] = to( this._rgba );
 
- 		}
 
- 		if ( value === undefined ) {
 
- 			return this[ cache ].slice();
 
- 		}
 
- 		var ret,
 
- 			type = jQuery.type( value ),
 
- 			arr = ( type === "array" || type === "object" ) ? value : arguments,
 
- 			local = this[ cache ].slice();
 
- 		each( props, function( key, prop ) {
 
- 			var val = arr[ type === "object" ? key : prop.idx ];
 
- 			if ( val == null ) {
 
- 				val = local[ prop.idx ];
 
- 			}
 
- 			local[ prop.idx ] = clamp( val, prop );
 
- 		});
 
- 		if ( from ) {
 
- 			ret = color( from( local ) );
 
- 			ret[ cache ] = local;
 
- 			return ret;
 
- 		} else {
 
- 			return color( local );
 
- 		}
 
- 	};
 
- 	// makes red() green() blue() alpha() hue() saturation() lightness()
 
- 	each( props, function( key, prop ) {
 
- 		// alpha is included in more than one space
 
- 		if ( color.fn[ key ] ) {
 
- 			return;
 
- 		}
 
- 		color.fn[ key ] = function( value ) {
 
- 			var vtype = jQuery.type( value ),
 
- 				fn = ( key === "alpha" ? ( this._hsla ? "hsla" : "rgba" ) : spaceName ),
 
- 				local = this[ fn ](),
 
- 				cur = local[ prop.idx ],
 
- 				match;
 
- 			if ( vtype === "undefined" ) {
 
- 				return cur;
 
- 			}
 
- 			if ( vtype === "function" ) {
 
- 				value = value.call( this, cur );
 
- 				vtype = jQuery.type( value );
 
- 			}
 
- 			if ( value == null && prop.empty ) {
 
- 				return this;
 
- 			}
 
- 			if ( vtype === "string" ) {
 
- 				match = rplusequals.exec( value );
 
- 				if ( match ) {
 
- 					value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 );
 
- 				}
 
- 			}
 
- 			local[ prop.idx ] = value;
 
- 			return this[ fn ]( local );
 
- 		};
 
- 	});
 
- });
 
- // add cssHook and .fx.step function for each named hook.
 
- // accept a space separated string of properties
 
- color.hook = function( hook ) {
 
- 	var hooks = hook.split( " " );
 
- 	each( hooks, function( i, hook ) {
 
- 		jQuery.cssHooks[ hook ] = {
 
- 			set: function( elem, value ) {
 
- 				var parsed, curElem,
 
- 					backgroundColor = "";
 
- 				if ( value !== "transparent" && ( jQuery.type( value ) !== "string" || ( parsed = stringParse( value ) ) ) ) {
 
- 					value = color( parsed || value );
 
- 					if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {
 
- 						curElem = hook === "backgroundColor" ? elem.parentNode : elem;
 
- 						while (
 
- 							(backgroundColor === "" || backgroundColor === "transparent") &&
 
- 							curElem && curElem.style
 
- 						) {
 
- 							try {
 
- 								backgroundColor = jQuery.css( curElem, "backgroundColor" );
 
- 								curElem = curElem.parentNode;
 
- 							} catch ( e ) {
 
- 							}
 
- 						}
 
- 						value = value.blend( backgroundColor && backgroundColor !== "transparent" ?
 
- 							backgroundColor :
 
- 							"_default" );
 
- 					}
 
- 					value = value.toRgbaString();
 
- 				}
 
- 				try {
 
- 					elem.style[ hook ] = value;
 
- 				} catch ( e ) {
 
- 					// wrapped to prevent IE from throwing errors on "invalid" values like 'auto' or 'inherit'
 
- 				}
 
- 			}
 
- 		};
 
- 		jQuery.fx.step[ hook ] = function( fx ) {
 
- 			if ( !fx.colorInit ) {
 
- 				fx.start = color( fx.elem, hook );
 
- 				fx.end = color( fx.end );
 
- 				fx.colorInit = true;
 
- 			}
 
- 			jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );
 
- 		};
 
- 	});
 
- };
 
- color.hook( stepHooks );
 
- jQuery.cssHooks.borderColor = {
 
- 	expand: function( value ) {
 
- 		var expanded = {};
 
- 		each( [ "Top", "Right", "Bottom", "Left" ], function( i, part ) {
 
- 			expanded[ "border" + part + "Color" ] = value;
 
- 		});
 
- 		return expanded;
 
- 	}
 
- };
 
- // Basic color names only.
 
- // Usage of any of the other color names requires adding yourself or including
 
- // jquery.color.svg-names.js.
 
- colors = jQuery.Color.names = {
 
- 	// 4.1. Basic color keywords
 
- 	aqua: "#00ffff",
 
- 	black: "#000000",
 
- 	blue: "#0000ff",
 
- 	fuchsia: "#ff00ff",
 
- 	gray: "#808080",
 
- 	green: "#008000",
 
- 	lime: "#00ff00",
 
- 	maroon: "#800000",
 
- 	navy: "#000080",
 
- 	olive: "#808000",
 
- 	purple: "#800080",
 
- 	red: "#ff0000",
 
- 	silver: "#c0c0c0",
 
- 	teal: "#008080",
 
- 	white: "#ffffff",
 
- 	yellow: "#ffff00",
 
- 	// 4.2.3. "transparent" color keyword
 
- 	transparent: [ null, null, null, 0 ],
 
- 	_default: "#ffffff"
 
- };
 
- })( jQuery );
 
- /******************************************************************************/
 
- /****************************** CLASS ANIMATIONS ******************************/
 
- /******************************************************************************/
 
- (function() {
 
- var classAnimationActions = [ "add", "remove", "toggle" ],
 
- 	shorthandStyles = {
 
- 		border: 1,
 
- 		borderBottom: 1,
 
- 		borderColor: 1,
 
- 		borderLeft: 1,
 
- 		borderRight: 1,
 
- 		borderTop: 1,
 
- 		borderWidth: 1,
 
- 		margin: 1,
 
- 		padding: 1
 
- 	};
 
- $.each([ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ], function( _, prop ) {
 
- 	$.fx.step[ prop ] = function( fx ) {
 
- 		if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {
 
- 			jQuery.style( fx.elem, prop, fx.end );
 
- 			fx.setAttr = true;
 
- 		}
 
- 	};
 
- });
 
- function getElementStyles( elem ) {
 
- 	var key, len,
 
- 		style = elem.ownerDocument.defaultView ?
 
- 			elem.ownerDocument.defaultView.getComputedStyle( elem, null ) :
 
- 			elem.currentStyle,
 
- 		styles = {};
 
- 	if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {
 
- 		len = style.length;
 
- 		while ( len-- ) {
 
- 			key = style[ len ];
 
- 			if ( typeof style[ key ] === "string" ) {
 
- 				styles[ $.camelCase( key ) ] = style[ key ];
 
- 			}
 
- 		}
 
- 	// support: Opera, IE <9
 
- 	} else {
 
- 		for ( key in style ) {
 
- 			if ( typeof style[ key ] === "string" ) {
 
- 				styles[ key ] = style[ key ];
 
- 			}
 
- 		}
 
- 	}
 
- 	return styles;
 
- }
 
- function styleDifference( oldStyle, newStyle ) {
 
- 	var diff = {},
 
- 		name, value;
 
- 	for ( name in newStyle ) {
 
- 		value = newStyle[ name ];
 
- 		if ( oldStyle[ name ] !== value ) {
 
- 			if ( !shorthandStyles[ name ] ) {
 
- 				if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {
 
- 					diff[ name ] = value;
 
- 				}
 
- 			}
 
- 		}
 
- 	}
 
- 	return diff;
 
- }
 
- // support: jQuery <1.8
 
- if ( !$.fn.addBack ) {
 
- 	$.fn.addBack = function( selector ) {
 
- 		return this.add( selector == null ?
 
- 			this.prevObject : this.prevObject.filter( selector )
 
- 		);
 
- 	};
 
- }
 
- $.effects.animateClass = function( value, duration, easing, callback ) {
 
- 	var o = $.speed( duration, easing, callback );
 
- 	return this.queue( function() {
 
- 		var animated = $( this ),
 
- 			baseClass = animated.attr( "class" ) || "",
 
- 			applyClassChange,
 
- 			allAnimations = o.children ? animated.find( "*" ).addBack() : animated;
 
- 		// map the animated objects to store the original styles.
 
- 		allAnimations = allAnimations.map(function() {
 
- 			var el = $( this );
 
- 			return {
 
- 				el: el,
 
- 				start: getElementStyles( this )
 
- 			};
 
- 		});
 
- 		// apply class change
 
- 		applyClassChange = function() {
 
- 			$.each( classAnimationActions, function(i, action) {
 
- 				if ( value[ action ] ) {
 
- 					animated[ action + "Class" ]( value[ action ] );
 
- 				}
 
- 			});
 
- 		};
 
- 		applyClassChange();
 
- 		// map all animated objects again - calculate new styles and diff
 
- 		allAnimations = allAnimations.map(function() {
 
- 			this.end = getElementStyles( this.el[ 0 ] );
 
- 			this.diff = styleDifference( this.start, this.end );
 
- 			return this;
 
- 		});
 
- 		// apply original class
 
- 		animated.attr( "class", baseClass );
 
- 		// map all animated objects again - this time collecting a promise
 
- 		allAnimations = allAnimations.map(function() {
 
- 			var styleInfo = this,
 
- 				dfd = $.Deferred(),
 
- 				opts = $.extend({}, o, {
 
- 					queue: false,
 
- 					complete: function() {
 
- 						dfd.resolve( styleInfo );
 
- 					}
 
- 				});
 
- 			this.el.animate( this.diff, opts );
 
- 			return dfd.promise();
 
- 		});
 
- 		// once all animations have completed:
 
- 		$.when.apply( $, allAnimations.get() ).done(function() {
 
- 			// set the final class
 
- 			applyClassChange();
 
- 			// for each animated element,
 
- 			// clear all css properties that were animated
 
- 			$.each( arguments, function() {
 
- 				var el = this.el;
 
- 				$.each( this.diff, function(key) {
 
- 					el.css( key, "" );
 
- 				});
 
- 			});
 
- 			// this is guarnteed to be there if you use jQuery.speed()
 
- 			// it also handles dequeuing the next anim...
 
- 			o.complete.call( animated[ 0 ] );
 
- 		});
 
- 	});
 
- };
 
- $.fn.extend({
 
- 	addClass: (function( orig ) {
 
- 		return function( classNames, speed, easing, callback ) {
 
- 			return speed ?
 
- 				$.effects.animateClass.call( this,
 
- 					{ add: classNames }, speed, easing, callback ) :
 
- 				orig.apply( this, arguments );
 
- 		};
 
- 	})( $.fn.addClass ),
 
- 	removeClass: (function( orig ) {
 
- 		return function( classNames, speed, easing, callback ) {
 
- 			return arguments.length > 1 ?
 
- 				$.effects.animateClass.call( this,
 
- 					{ remove: classNames }, speed, easing, callback ) :
 
- 				orig.apply( this, arguments );
 
- 		};
 
- 	})( $.fn.removeClass ),
 
- 	toggleClass: (function( orig ) {
 
- 		return function( classNames, force, speed, easing, callback ) {
 
- 			if ( typeof force === "boolean" || force === undefined ) {
 
- 				if ( !speed ) {
 
- 					// without speed parameter
 
- 					return orig.apply( this, arguments );
 
- 				} else {
 
- 					return $.effects.animateClass.call( this,
 
- 						(force ? { add: classNames } : { remove: classNames }),
 
- 						speed, easing, callback );
 
- 				}
 
- 			} else {
 
- 				// without force parameter
 
- 				return $.effects.animateClass.call( this,
 
- 					{ toggle: classNames }, force, speed, easing );
 
- 			}
 
- 		};
 
- 	})( $.fn.toggleClass ),
 
- 	switchClass: function( remove, add, speed, easing, callback) {
 
- 		return $.effects.animateClass.call( this, {
 
- 			add: add,
 
- 			remove: remove
 
- 		}, speed, easing, callback );
 
- 	}
 
- });
 
- })();
 
- /******************************************************************************/
 
- /*********************************** EFFECTS **********************************/
 
- /******************************************************************************/
 
- (function() {
 
- $.extend( $.effects, {
 
- 	version: "1.11.4",
 
- 	// Saves a set of properties in a data storage
 
- 	save: function( element, set ) {
 
- 		for ( var i = 0; i < set.length; i++ ) {
 
- 			if ( set[ i ] !== null ) {
 
- 				element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );
 
- 			}
 
- 		}
 
- 	},
 
- 	// Restores a set of previously saved properties from a data storage
 
- 	restore: function( element, set ) {
 
- 		var val, i;
 
- 		for ( i = 0; i < set.length; i++ ) {
 
- 			if ( set[ i ] !== null ) {
 
- 				val = element.data( dataSpace + set[ i ] );
 
- 				// support: jQuery 1.6.2
 
- 				// http://bugs.jquery.com/ticket/9917
 
- 				// jQuery 1.6.2 incorrectly returns undefined for any falsy value.
 
- 				// We can't differentiate between "" and 0 here, so we just assume
 
- 				// empty string since it's likely to be a more common value...
 
- 				if ( val === undefined ) {
 
- 					val = "";
 
- 				}
 
- 				element.css( set[ i ], val );
 
- 			}
 
- 		}
 
- 	},
 
- 	setMode: function( el, mode ) {
 
- 		if (mode === "toggle") {
 
- 			mode = el.is( ":hidden" ) ? "show" : "hide";
 
- 		}
 
- 		return mode;
 
- 	},
 
- 	// Translates a [top,left] array into a baseline value
 
- 	// this should be a little more flexible in the future to handle a string & hash
 
- 	getBaseline: function( origin, original ) {
 
- 		var y, x;
 
- 		switch ( origin[ 0 ] ) {
 
- 			case "top": y = 0; break;
 
- 			case "middle": y = 0.5; break;
 
- 			case "bottom": y = 1; break;
 
- 			default: y = origin[ 0 ] / original.height;
 
- 		}
 
- 		switch ( origin[ 1 ] ) {
 
- 			case "left": x = 0; break;
 
- 			case "center": x = 0.5; break;
 
- 			case "right": x = 1; break;
 
- 			default: x = origin[ 1 ] / original.width;
 
- 		}
 
- 		return {
 
- 			x: x,
 
- 			y: y
 
- 		};
 
- 	},
 
- 	// Wraps the element around a wrapper that copies position properties
 
- 	createWrapper: function( element ) {
 
- 		// if the element is already wrapped, return it
 
- 		if ( element.parent().is( ".ui-effects-wrapper" )) {
 
- 			return element.parent();
 
- 		}
 
- 		// wrap the element
 
- 		var props = {
 
- 				width: element.outerWidth(true),
 
- 				height: element.outerHeight(true),
 
- 				"float": element.css( "float" )
 
- 			},
 
- 			wrapper = $( "<div></div>" )
 
- 				.addClass( "ui-effects-wrapper" )
 
- 				.css({
 
- 					fontSize: "100%",
 
- 					background: "transparent",
 
- 					border: "none",
 
- 					margin: 0,
 
- 					padding: 0
 
- 				}),
 
- 			// Store the size in case width/height are defined in % - Fixes #5245
 
- 			size = {
 
- 				width: element.width(),
 
- 				height: element.height()
 
- 			},
 
- 			active = document.activeElement;
 
- 		// support: Firefox
 
- 		// Firefox incorrectly exposes anonymous content
 
- 		// https://bugzilla.mozilla.org/show_bug.cgi?id=561664
 
- 		try {
 
- 			active.id;
 
- 		} catch ( e ) {
 
- 			active = document.body;
 
- 		}
 
- 		element.wrap( wrapper );
 
- 		// Fixes #7595 - Elements lose focus when wrapped.
 
- 		if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
 
- 			$( active ).focus();
 
- 		}
 
- 		wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually lose the reference to the wrapped element
 
- 		// transfer positioning properties to the wrapper
 
- 		if ( element.css( "position" ) === "static" ) {
 
- 			wrapper.css({ position: "relative" });
 
- 			element.css({ position: "relative" });
 
- 		} else {
 
- 			$.extend( props, {
 
- 				position: element.css( "position" ),
 
- 				zIndex: element.css( "z-index" )
 
- 			});
 
- 			$.each([ "top", "left", "bottom", "right" ], function(i, pos) {
 
- 				props[ pos ] = element.css( pos );
 
- 				if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {
 
- 					props[ pos ] = "auto";
 
- 				}
 
- 			});
 
- 			element.css({
 
- 				position: "relative",
 
- 				top: 0,
 
- 				left: 0,
 
- 				right: "auto",
 
- 				bottom: "auto"
 
- 			});
 
- 		}
 
- 		element.css(size);
 
- 		return wrapper.css( props ).show();
 
- 	},
 
- 	removeWrapper: function( element ) {
 
- 		var active = document.activeElement;
 
- 		if ( element.parent().is( ".ui-effects-wrapper" ) ) {
 
- 			element.parent().replaceWith( element );
 
- 			// Fixes #7595 - Elements lose focus when wrapped.
 
- 			if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
 
- 				$( active ).focus();
 
- 			}
 
- 		}
 
- 		return element;
 
- 	},
 
- 	setTransition: function( element, list, factor, value ) {
 
- 		value = value || {};
 
- 		$.each( list, function( i, x ) {
 
- 			var unit = element.cssUnit( x );
 
- 			if ( unit[ 0 ] > 0 ) {
 
- 				value[ x ] = unit[ 0 ] * factor + unit[ 1 ];
 
- 			}
 
- 		});
 
- 		return value;
 
- 	}
 
- });
 
- // return an effect options object for the given parameters:
 
- function _normalizeArguments( effect, options, speed, callback ) {
 
- 	// allow passing all options as the first parameter
 
- 	if ( $.isPlainObject( effect ) ) {
 
- 		options = effect;
 
- 		effect = effect.effect;
 
- 	}
 
- 	// convert to an object
 
- 	effect = { effect: effect };
 
- 	// catch (effect, null, ...)
 
- 	if ( options == null ) {
 
- 		options = {};
 
- 	}
 
- 	// catch (effect, callback)
 
- 	if ( $.isFunction( options ) ) {
 
- 		callback = options;
 
- 		speed = null;
 
- 		options = {};
 
- 	}
 
- 	// catch (effect, speed, ?)
 
- 	if ( typeof options === "number" || $.fx.speeds[ options ] ) {
 
- 		callback = speed;
 
- 		speed = options;
 
- 		options = {};
 
- 	}
 
- 	// catch (effect, options, callback)
 
- 	if ( $.isFunction( speed ) ) {
 
- 		callback = speed;
 
- 		speed = null;
 
- 	}
 
- 	// add options to effect
 
- 	if ( options ) {
 
- 		$.extend( effect, options );
 
- 	}
 
- 	speed = speed || options.duration;
 
- 	effect.duration = $.fx.off ? 0 :
 
- 		typeof speed === "number" ? speed :
 
- 		speed in $.fx.speeds ? $.fx.speeds[ speed ] :
 
- 		$.fx.speeds._default;
 
- 	effect.complete = callback || options.complete;
 
- 	return effect;
 
- }
 
- function standardAnimationOption( option ) {
 
- 	// Valid standard speeds (nothing, number, named speed)
 
- 	if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) {
 
- 		return true;
 
- 	}
 
- 	// Invalid strings - treat as "normal" speed
 
- 	if ( typeof option === "string" && !$.effects.effect[ option ] ) {
 
- 		return true;
 
- 	}
 
- 	// Complete callback
 
- 	if ( $.isFunction( option ) ) {
 
- 		return true;
 
- 	}
 
- 	// Options hash (but not naming an effect)
 
- 	if ( typeof option === "object" && !option.effect ) {
 
- 		return true;
 
- 	}
 
- 	// Didn't match any standard API
 
- 	return false;
 
- }
 
- $.fn.extend({
 
- 	effect: function( /* effect, options, speed, callback */ ) {
 
- 		var args = _normalizeArguments.apply( this, arguments ),
 
- 			mode = args.mode,
 
- 			queue = args.queue,
 
- 			effectMethod = $.effects.effect[ args.effect ];
 
- 		if ( $.fx.off || !effectMethod ) {
 
- 			// delegate to the original method (e.g., .show()) if possible
 
- 			if ( mode ) {
 
- 				return this[ mode ]( args.duration, args.complete );
 
- 			} else {
 
- 				return this.each( function() {
 
- 					if ( args.complete ) {
 
- 						args.complete.call( this );
 
- 					}
 
- 				});
 
- 			}
 
- 		}
 
- 		function run( next ) {
 
- 			var elem = $( this ),
 
- 				complete = args.complete,
 
- 				mode = args.mode;
 
- 			function done() {
 
- 				if ( $.isFunction( complete ) ) {
 
- 					complete.call( elem[0] );
 
- 				}
 
- 				if ( $.isFunction( next ) ) {
 
- 					next();
 
- 				}
 
- 			}
 
- 			// If the element already has the correct final state, delegate to
 
- 			// the core methods so the internal tracking of "olddisplay" works.
 
- 			if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) {
 
- 				elem[ mode ]();
 
- 				done();
 
- 			} else {
 
- 				effectMethod.call( elem[0], args, done );
 
- 			}
 
- 		}
 
- 		return queue === false ? this.each( run ) : this.queue( queue || "fx", run );
 
- 	},
 
- 	show: (function( orig ) {
 
- 		return function( option ) {
 
- 			if ( standardAnimationOption( option ) ) {
 
- 				return orig.apply( this, arguments );
 
- 			} else {
 
- 				var args = _normalizeArguments.apply( this, arguments );
 
- 				args.mode = "show";
 
- 				return this.effect.call( this, args );
 
- 			}
 
- 		};
 
- 	})( $.fn.show ),
 
- 	hide: (function( orig ) {
 
- 		return function( option ) {
 
- 			if ( standardAnimationOption( option ) ) {
 
- 				return orig.apply( this, arguments );
 
- 			} else {
 
- 				var args = _normalizeArguments.apply( this, arguments );
 
- 				args.mode = "hide";
 
- 				return this.effect.call( this, args );
 
- 			}
 
- 		};
 
- 	})( $.fn.hide ),
 
- 	toggle: (function( orig ) {
 
- 		return function( option ) {
 
- 			if ( standardAnimationOption( option ) || typeof option === "boolean" ) {
 
- 				return orig.apply( this, arguments );
 
- 			} else {
 
- 				var args = _normalizeArguments.apply( this, arguments );
 
- 				args.mode = "toggle";
 
- 				return this.effect.call( this, args );
 
- 			}
 
- 		};
 
- 	})( $.fn.toggle ),
 
- 	// helper functions
 
- 	cssUnit: function(key) {
 
- 		var style = this.css( key ),
 
- 			val = [];
 
- 		$.each( [ "em", "px", "%", "pt" ], function( i, unit ) {
 
- 			if ( style.indexOf( unit ) > 0 ) {
 
- 				val = [ parseFloat( style ), unit ];
 
- 			}
 
- 		});
 
- 		return val;
 
- 	}
 
- });
 
- })();
 
- /******************************************************************************/
 
- /*********************************** EASING ***********************************/
 
- /******************************************************************************/
 
- (function() {
 
- // based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
 
- var baseEasings = {};
 
- $.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
 
- 	baseEasings[ name ] = function( p ) {
 
- 		return Math.pow( p, i + 2 );
 
- 	};
 
- });
 
- $.extend( baseEasings, {
 
- 	Sine: function( p ) {
 
- 		return 1 - Math.cos( p * Math.PI / 2 );
 
- 	},
 
- 	Circ: function( p ) {
 
- 		return 1 - Math.sqrt( 1 - p * p );
 
- 	},
 
- 	Elastic: function( p ) {
 
- 		return p === 0 || p === 1 ? p :
 
- 			-Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );
 
- 	},
 
- 	Back: function( p ) {
 
- 		return p * p * ( 3 * p - 2 );
 
- 	},
 
- 	Bounce: function( p ) {
 
- 		var pow2,
 
- 			bounce = 4;
 
- 		while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
 
- 		return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
 
- 	}
 
- });
 
- $.each( baseEasings, function( name, easeIn ) {
 
- 	$.easing[ "easeIn" + name ] = easeIn;
 
- 	$.easing[ "easeOut" + name ] = function( p ) {
 
- 		return 1 - easeIn( 1 - p );
 
- 	};
 
- 	$.easing[ "easeInOut" + name ] = function( p ) {
 
- 		return p < 0.5 ?
 
- 			easeIn( p * 2 ) / 2 :
 
- 			1 - easeIn( p * -2 + 2 ) / 2;
 
- 	};
 
- });
 
- })();
 
- var effect = $.effects;
 
- /*!
 
-  * jQuery UI Effects Slide 1.11.4
 
-  * http://jqueryui.com
 
-  *
 
-  * Copyright jQuery Foundation and other contributors
 
-  * Released under the MIT license.
 
-  * http://jquery.org/license
 
-  *
 
-  * http://api.jqueryui.com/slide-effect/
 
-  */
 
- /*var effectSlide = $.effects.effect.slide = function( o, done ) {
 
- 	// Create element
 
- 	var el = $( this ),
 
- 		props = [ "position", "top", "bottom", "left", "right", "width", "height" ],
 
- 		mode = $.effects.setMode( el, o.mode || "show" ),
 
- 		show = mode === "show",
 
- 		direction = o.direction || "left",
 
- 		ref = (direction === "up" || direction === "down") ? "top" : "left",
 
- 		positiveMotion = (direction === "up" || direction === "left"),
 
- 		distance,
 
- 		animation = {};
 
- 	// Adjust
 
- 	$.effects.save( el, props );
 
- 	el.show();
 
- 	distance = o.distance || el[ ref === "top" ? "outerHeight" : "outerWidth" ]( true );
 
- 	$.effects.createWrapper( el ).css({
 
- 		overflow: "hidden"
 
- 	});
 
- 	if ( show ) {
 
- 		el.css( ref, positiveMotion ? (isNaN(distance) ? "-" + distance : -distance) : distance );
 
- 	}
 
- 	// Animation
 
- 	animation[ ref ] = ( show ?
 
- 		( positiveMotion ? "+=" : "-=") :
 
- 		( positiveMotion ? "-=" : "+=")) +
 
- 		distance;
 
- 	// Animate
 
- 	el.animate( animation, {
 
- 		queue: false,
 
- 		duration: o.duration,
 
- 		easing: o.easing,
 
- 		complete: function() {
 
- 			if ( mode === "hide" ) {
 
- 				el.hide();
 
- 			}
 
- 			$.effects.restore( el, props );
 
- 			$.effects.removeWrapper( el );
 
- 			done();
 
- 		}
 
- 	});
 
- };
 
- */
 
- }));
 
- /**!
 
-  * @fileOverview Kickass library to create and place poppers near their reference elements.
 
-  * @version 1.15.0
 
-  * @license
 
-  * Copyright (c) 2016 Federico Zivolo and contributors
 
-  *
 
-  * Permission is hereby granted, free of charge, to any person obtaining a copy
 
-  * of this software and associated documentation files (the "Software"), to deal
 
-  * in the Software without restriction, including without limitation the rights
 
-  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 
-  * copies of the Software, and to permit persons to whom the Software is
 
-  * furnished to do so, subject to the following conditions:
 
-  *
 
-  * The above copyright notice and this permission notice shall be included in all
 
-  * copies or substantial portions of the Software.
 
-  *
 
-  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 
-  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 
-  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 
-  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 
-  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 
-  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 
-  * SOFTWARE.
 
-  */
 
- (function (global, factory) {
 
- 	typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
 
- 	typeof define === 'function' && define.amd ? define(factory) :
 
- 	(global.Popper = factory());
 
- }(this, (function () { 'use strict';
 
- var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';
 
- var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];
 
- var timeoutDuration = 0;
 
- for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {
 
-   if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {
 
-     timeoutDuration = 1;
 
-     break;
 
-   }
 
- }
 
- function microtaskDebounce(fn) {
 
-   var called = false;
 
-   return function () {
 
-     if (called) {
 
-       return;
 
-     }
 
-     called = true;
 
-     window.Promise.resolve().then(function () {
 
-       called = false;
 
-       fn();
 
-     });
 
-   };
 
- }
 
- function taskDebounce(fn) {
 
-   var scheduled = false;
 
-   return function () {
 
-     if (!scheduled) {
 
-       scheduled = true;
 
-       setTimeout(function () {
 
-         scheduled = false;
 
-         fn();
 
-       }, timeoutDuration);
 
-     }
 
-   };
 
- }
 
- var supportsMicroTasks = isBrowser && window.Promise;
 
- /**
 
- * Create a debounced version of a method, that's asynchronously deferred
 
- * but called in the minimum time possible.
 
- *
 
- * @method
 
- * @memberof Popper.Utils
 
- * @argument {Function} fn
 
- * @returns {Function}
 
- */
 
- var debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;
 
- /**
 
-  * Check if the given variable is a function
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @argument {Any} functionToCheck - variable to check
 
-  * @returns {Boolean} answer to: is a function?
 
-  */
 
- function isFunction(functionToCheck) {
 
-   var getType = {};
 
-   return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';
 
- }
 
- /**
 
-  * Get CSS computed property of the given element
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @argument {Eement} element
 
-  * @argument {String} property
 
-  */
 
- function getStyleComputedProperty(element, property) {
 
-   if (element.nodeType !== 1) {
 
-     return [];
 
-   }
 
-   // NOTE: 1 DOM access here
 
-   var window = element.ownerDocument.defaultView;
 
-   var css = window.getComputedStyle(element, null);
 
-   return property ? css[property] : css;
 
- }
 
- /**
 
-  * Returns the parentNode or the host of the element
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @argument {Element} element
 
-  * @returns {Element} parent
 
-  */
 
- function getParentNode(element) {
 
-   if (element.nodeName === 'HTML') {
 
-     return element;
 
-   }
 
-   return element.parentNode || element.host;
 
- }
 
- /**
 
-  * Returns the scrolling parent of the given element
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @argument {Element} element
 
-  * @returns {Element} scroll parent
 
-  */
 
- function getScrollParent(element) {
 
-   // Return body, `getScroll` will take care to get the correct `scrollTop` from it
 
-   if (!element) {
 
-     return document.body;
 
-   }
 
-   switch (element.nodeName) {
 
-     case 'HTML':
 
-     case 'BODY':
 
-       return element.ownerDocument.body;
 
-     case '#document':
 
-       return element.body;
 
-   }
 
-   // Firefox want us to check `-x` and `-y` variations as well
 
-   var _getStyleComputedProp = getStyleComputedProperty(element),
 
-       overflow = _getStyleComputedProp.overflow,
 
-       overflowX = _getStyleComputedProp.overflowX,
 
-       overflowY = _getStyleComputedProp.overflowY;
 
-   if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {
 
-     return element;
 
-   }
 
-   return getScrollParent(getParentNode(element));
 
- }
 
- var isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);
 
- var isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);
 
- /**
 
-  * Determines if the browser is Internet Explorer
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @param {Number} version to check
 
-  * @returns {Boolean} isIE
 
-  */
 
- function isIE(version) {
 
-   if (version === 11) {
 
-     return isIE11;
 
-   }
 
-   if (version === 10) {
 
-     return isIE10;
 
-   }
 
-   return isIE11 || isIE10;
 
- }
 
- /**
 
-  * Returns the offset parent of the given element
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @argument {Element} element
 
-  * @returns {Element} offset parent
 
-  */
 
- function getOffsetParent(element) {
 
-   if (!element) {
 
-     return document.documentElement;
 
-   }
 
-   var noOffsetParent = isIE(10) ? document.body : null;
 
-   // NOTE: 1 DOM access here
 
-   var offsetParent = element.offsetParent || null;
 
-   // Skip hidden elements which don't have an offsetParent
 
-   while (offsetParent === noOffsetParent && element.nextElementSibling) {
 
-     offsetParent = (element = element.nextElementSibling).offsetParent;
 
-   }
 
-   var nodeName = offsetParent && offsetParent.nodeName;
 
-   if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {
 
-     return element ? element.ownerDocument.documentElement : document.documentElement;
 
-   }
 
-   // .offsetParent will return the closest TH, TD or TABLE in case
 
-   // no offsetParent is present, I hate this job...
 
-   if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {
 
-     return getOffsetParent(offsetParent);
 
-   }
 
-   return offsetParent;
 
- }
 
- function isOffsetContainer(element) {
 
-   var nodeName = element.nodeName;
 
-   if (nodeName === 'BODY') {
 
-     return false;
 
-   }
 
-   return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;
 
- }
 
- /**
 
-  * Finds the root node (document, shadowDOM root) of the given element
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @argument {Element} node
 
-  * @returns {Element} root node
 
-  */
 
- function getRoot(node) {
 
-   if (node.parentNode !== null) {
 
-     return getRoot(node.parentNode);
 
-   }
 
-   return node;
 
- }
 
- /**
 
-  * Finds the offset parent common to the two provided nodes
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @argument {Element} element1
 
-  * @argument {Element} element2
 
-  * @returns {Element} common offset parent
 
-  */
 
- function findCommonOffsetParent(element1, element2) {
 
-   // This check is needed to avoid errors in case one of the elements isn't defined for any reason
 
-   if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {
 
-     return document.documentElement;
 
-   }
 
-   // Here we make sure to give as "start" the element that comes first in the DOM
 
-   var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;
 
-   var start = order ? element1 : element2;
 
-   var end = order ? element2 : element1;
 
-   // Get common ancestor container
 
-   var range = document.createRange();
 
-   range.setStart(start, 0);
 
-   range.setEnd(end, 0);
 
-   var commonAncestorContainer = range.commonAncestorContainer;
 
-   // Both nodes are inside #document
 
-   if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {
 
-     if (isOffsetContainer(commonAncestorContainer)) {
 
-       return commonAncestorContainer;
 
-     }
 
-     return getOffsetParent(commonAncestorContainer);
 
-   }
 
-   // one of the nodes is inside shadowDOM, find which one
 
-   var element1root = getRoot(element1);
 
-   if (element1root.host) {
 
-     return findCommonOffsetParent(element1root.host, element2);
 
-   } else {
 
-     return findCommonOffsetParent(element1, getRoot(element2).host);
 
-   }
 
- }
 
- /**
 
-  * Gets the scroll value of the given element in the given side (top and left)
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @argument {Element} element
 
-  * @argument {String} side `top` or `left`
 
-  * @returns {number} amount of scrolled pixels
 
-  */
 
- function getScroll(element) {
 
-   var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';
 
-   var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';
 
-   var nodeName = element.nodeName;
 
-   if (nodeName === 'BODY' || nodeName === 'HTML') {
 
-     var html = element.ownerDocument.documentElement;
 
-     var scrollingElement = element.ownerDocument.scrollingElement || html;
 
-     return scrollingElement[upperSide];
 
-   }
 
-   return element[upperSide];
 
- }
 
- /*
 
-  * Sum or subtract the element scroll values (left and top) from a given rect object
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @param {Object} rect - Rect object you want to change
 
-  * @param {HTMLElement} element - The element from the function reads the scroll values
 
-  * @param {Boolean} subtract - set to true if you want to subtract the scroll values
 
-  * @return {Object} rect - The modifier rect object
 
-  */
 
- function includeScroll(rect, element) {
 
-   var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
 
-   var scrollTop = getScroll(element, 'top');
 
-   var scrollLeft = getScroll(element, 'left');
 
-   var modifier = subtract ? -1 : 1;
 
-   rect.top += scrollTop * modifier;
 
-   rect.bottom += scrollTop * modifier;
 
-   rect.left += scrollLeft * modifier;
 
-   rect.right += scrollLeft * modifier;
 
-   return rect;
 
- }
 
- /*
 
-  * Helper to detect borders of a given element
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @param {CSSStyleDeclaration} styles
 
-  * Result of `getStyleComputedProperty` on the given element
 
-  * @param {String} axis - `x` or `y`
 
-  * @return {number} borders - The borders size of the given axis
 
-  */
 
- function getBordersSize(styles, axis) {
 
-   var sideA = axis === 'x' ? 'Left' : 'Top';
 
-   var sideB = sideA === 'Left' ? 'Right' : 'Bottom';
 
-   return parseFloat(styles['border' + sideA + 'Width'], 10) + parseFloat(styles['border' + sideB + 'Width'], 10);
 
- }
 
- function getSize(axis, body, html, computedStyle) {
 
-   return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0);
 
- }
 
- function getWindowSizes(document) {
 
-   var body = document.body;
 
-   var html = document.documentElement;
 
-   var computedStyle = isIE(10) && getComputedStyle(html);
 
-   return {
 
-     height: getSize('Height', body, html, computedStyle),
 
-     width: getSize('Width', body, html, computedStyle)
 
-   };
 
- }
 
- var classCallCheck = function (instance, Constructor) {
 
-   if (!(instance instanceof Constructor)) {
 
-     throw new TypeError("Cannot call a class as a function");
 
-   }
 
- };
 
- var createClass = function () {
 
-   function defineProperties(target, props) {
 
-     for (var i = 0; i < props.length; i++) {
 
-       var descriptor = props[i];
 
-       descriptor.enumerable = descriptor.enumerable || false;
 
-       descriptor.configurable = true;
 
-       if ("value" in descriptor) descriptor.writable = true;
 
-       Object.defineProperty(target, descriptor.key, descriptor);
 
-     }
 
-   }
 
-   return function (Constructor, protoProps, staticProps) {
 
-     if (protoProps) defineProperties(Constructor.prototype, protoProps);
 
-     if (staticProps) defineProperties(Constructor, staticProps);
 
-     return Constructor;
 
-   };
 
- }();
 
- var defineProperty = function (obj, key, value) {
 
-   if (key in obj) {
 
-     Object.defineProperty(obj, key, {
 
-       value: value,
 
-       enumerable: true,
 
-       configurable: true,
 
-       writable: true
 
-     });
 
-   } else {
 
-     obj[key] = value;
 
-   }
 
-   return obj;
 
- };
 
- var _extends = Object.assign || function (target) {
 
-   for (var i = 1; i < arguments.length; i++) {
 
-     var source = arguments[i];
 
-     for (var key in source) {
 
-       if (Object.prototype.hasOwnProperty.call(source, key)) {
 
-         target[key] = source[key];
 
-       }
 
-     }
 
-   }
 
-   return target;
 
- };
 
- /**
 
-  * Given element offsets, generate an output similar to getBoundingClientRect
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @argument {Object} offsets
 
-  * @returns {Object} ClientRect like output
 
-  */
 
- function getClientRect(offsets) {
 
-   return _extends({}, offsets, {
 
-     right: offsets.left + offsets.width,
 
-     bottom: offsets.top + offsets.height
 
-   });
 
- }
 
- /**
 
-  * Get bounding client rect of given element
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @param {HTMLElement} element
 
-  * @return {Object} client rect
 
-  */
 
- function getBoundingClientRect(element) {
 
-   var rect = {};
 
-   // IE10 10 FIX: Please, don't ask, the element isn't
 
-   // considered in DOM in some circumstances...
 
-   // This isn't reproducible in IE10 compatibility mode of IE11
 
-   try {
 
-     if (isIE(10)) {
 
-       rect = element.getBoundingClientRect();
 
-       var scrollTop = getScroll(element, 'top');
 
-       var scrollLeft = getScroll(element, 'left');
 
-       rect.top += scrollTop;
 
-       rect.left += scrollLeft;
 
-       rect.bottom += scrollTop;
 
-       rect.right += scrollLeft;
 
-     } else {
 
-       rect = element.getBoundingClientRect();
 
-     }
 
-   } catch (e) {}
 
-   var result = {
 
-     left: rect.left,
 
-     top: rect.top,
 
-     width: rect.right - rect.left,
 
-     height: rect.bottom - rect.top
 
-   };
 
-   // subtract scrollbar size from sizes
 
-   var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};
 
-   var width = sizes.width || element.clientWidth || result.right - result.left;
 
-   var height = sizes.height || element.clientHeight || result.bottom - result.top;
 
-   var horizScrollbar = element.offsetWidth - width;
 
-   var vertScrollbar = element.offsetHeight - height;
 
-   // if an hypothetical scrollbar is detected, we must be sure it's not a `border`
 
-   // we make this check conditional for performance reasons
 
-   if (horizScrollbar || vertScrollbar) {
 
-     var styles = getStyleComputedProperty(element);
 
-     horizScrollbar -= getBordersSize(styles, 'x');
 
-     vertScrollbar -= getBordersSize(styles, 'y');
 
-     result.width -= horizScrollbar;
 
-     result.height -= vertScrollbar;
 
-   }
 
-   return getClientRect(result);
 
- }
 
- function getOffsetRectRelativeToArbitraryNode(children, parent) {
 
-   var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
 
-   var isIE10 = isIE(10);
 
-   var isHTML = parent.nodeName === 'HTML';
 
-   var childrenRect = getBoundingClientRect(children);
 
-   var parentRect = getBoundingClientRect(parent);
 
-   var scrollParent = getScrollParent(children);
 
-   var styles = getStyleComputedProperty(parent);
 
-   var borderTopWidth = parseFloat(styles.borderTopWidth, 10);
 
-   var borderLeftWidth = parseFloat(styles.borderLeftWidth, 10);
 
-   // In cases where the parent is fixed, we must ignore negative scroll in offset calc
 
-   if (fixedPosition && isHTML) {
 
-     parentRect.top = Math.max(parentRect.top, 0);
 
-     parentRect.left = Math.max(parentRect.left, 0);
 
-   }
 
-   var offsets = getClientRect({
 
-     top: childrenRect.top - parentRect.top - borderTopWidth,
 
-     left: childrenRect.left - parentRect.left - borderLeftWidth,
 
-     width: childrenRect.width,
 
-     height: childrenRect.height
 
-   });
 
-   offsets.marginTop = 0;
 
-   offsets.marginLeft = 0;
 
-   // Subtract margins of documentElement in case it's being used as parent
 
-   // we do this only on HTML because it's the only element that behaves
 
-   // differently when margins are applied to it. The margins are included in
 
-   // the box of the documentElement, in the other cases not.
 
-   if (!isIE10 && isHTML) {
 
-     var marginTop = parseFloat(styles.marginTop, 10);
 
-     var marginLeft = parseFloat(styles.marginLeft, 10);
 
-     offsets.top -= borderTopWidth - marginTop;
 
-     offsets.bottom -= borderTopWidth - marginTop;
 
-     offsets.left -= borderLeftWidth - marginLeft;
 
-     offsets.right -= borderLeftWidth - marginLeft;
 
-     // Attach marginTop and marginLeft because in some circumstances we may need them
 
-     offsets.marginTop = marginTop;
 
-     offsets.marginLeft = marginLeft;
 
-   }
 
-   if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {
 
-     offsets = includeScroll(offsets, parent);
 
-   }
 
-   return offsets;
 
- }
 
- function getViewportOffsetRectRelativeToArtbitraryNode(element) {
 
-   var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
 
-   var html = element.ownerDocument.documentElement;
 
-   var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);
 
-   var width = Math.max(html.clientWidth, window.innerWidth || 0);
 
-   var height = Math.max(html.clientHeight, window.innerHeight || 0);
 
-   var scrollTop = !excludeScroll ? getScroll(html) : 0;
 
-   var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;
 
-   var offset = {
 
-     top: scrollTop - relativeOffset.top + relativeOffset.marginTop,
 
-     left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,
 
-     width: width,
 
-     height: height
 
-   };
 
-   return getClientRect(offset);
 
- }
 
- /**
 
-  * Check if the given element is fixed or is inside a fixed parent
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @argument {Element} element
 
-  * @argument {Element} customContainer
 
-  * @returns {Boolean} answer to "isFixed?"
 
-  */
 
- function isFixed(element) {
 
-   var nodeName = element.nodeName;
 
-   if (nodeName === 'BODY' || nodeName === 'HTML') {
 
-     return false;
 
-   }
 
-   if (getStyleComputedProperty(element, 'position') === 'fixed') {
 
-     return true;
 
-   }
 
-   var parentNode = getParentNode(element);
 
-   if (!parentNode) {
 
-     return false;
 
-   }
 
-   return isFixed(parentNode);
 
- }
 
- /**
 
-  * Finds the first parent of an element that has a transformed property defined
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @argument {Element} element
 
-  * @returns {Element} first transformed parent or documentElement
 
-  */
 
- function getFixedPositionOffsetParent(element) {
 
-   // This check is needed to avoid errors in case one of the elements isn't defined for any reason
 
-   if (!element || !element.parentElement || isIE()) {
 
-     return document.documentElement;
 
-   }
 
-   var el = element.parentElement;
 
-   while (el && getStyleComputedProperty(el, 'transform') === 'none') {
 
-     el = el.parentElement;
 
-   }
 
-   return el || document.documentElement;
 
- }
 
- /**
 
-  * Computed the boundaries limits and return them
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @param {HTMLElement} popper
 
-  * @param {HTMLElement} reference
 
-  * @param {number} padding
 
-  * @param {HTMLElement} boundariesElement - Element used to define the boundaries
 
-  * @param {Boolean} fixedPosition - Is in fixed position mode
 
-  * @returns {Object} Coordinates of the boundaries
 
-  */
 
- function getBoundaries(popper, reference, padding, boundariesElement) {
 
-   var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
 
-   // NOTE: 1 DOM access here
 
-   var boundaries = { top: 0, left: 0 };
 
-   var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);
 
-   // Handle viewport case
 
-   if (boundariesElement === 'viewport') {
 
-     boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);
 
-   } else {
 
-     // Handle other cases based on DOM element used as boundaries
 
-     var boundariesNode = void 0;
 
-     if (boundariesElement === 'scrollParent') {
 
-       boundariesNode = getScrollParent(getParentNode(reference));
 
-       if (boundariesNode.nodeName === 'BODY') {
 
-         boundariesNode = popper.ownerDocument.documentElement;
 
-       }
 
-     } else if (boundariesElement === 'window') {
 
-       boundariesNode = popper.ownerDocument.documentElement;
 
-     } else {
 
-       boundariesNode = boundariesElement;
 
-     }
 
-     var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);
 
-     // In case of HTML, we need a different computation
 
-     if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {
 
-       var _getWindowSizes = getWindowSizes(popper.ownerDocument),
 
-           height = _getWindowSizes.height,
 
-           width = _getWindowSizes.width;
 
-       boundaries.top += offsets.top - offsets.marginTop;
 
-       boundaries.bottom = height + offsets.top;
 
-       boundaries.left += offsets.left - offsets.marginLeft;
 
-       boundaries.right = width + offsets.left;
 
-     } else {
 
-       // for all the other DOM elements, this one is good
 
-       boundaries = offsets;
 
-     }
 
-   }
 
-   // Add paddings
 
-   padding = padding || 0;
 
-   var isPaddingNumber = typeof padding === 'number';
 
-   boundaries.left += isPaddingNumber ? padding : padding.left || 0;
 
-   boundaries.top += isPaddingNumber ? padding : padding.top || 0;
 
-   boundaries.right -= isPaddingNumber ? padding : padding.right || 0;
 
-   boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0;
 
-   return boundaries;
 
- }
 
- function getArea(_ref) {
 
-   var width = _ref.width,
 
-       height = _ref.height;
 
-   return width * height;
 
- }
 
- /**
 
-  * Utility used to transform the `auto` placement to the placement with more
 
-  * available space.
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @argument {Object} data - The data object generated by update method
 
-  * @argument {Object} options - Modifiers configuration and options
 
-  * @returns {Object} The data object, properly modified
 
-  */
 
- function computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {
 
-   var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;
 
-   if (placement.indexOf('auto') === -1) {
 
-     return placement;
 
-   }
 
-   var boundaries = getBoundaries(popper, reference, padding, boundariesElement);
 
-   var rects = {
 
-     top: {
 
-       width: boundaries.width,
 
-       height: refRect.top - boundaries.top
 
-     },
 
-     right: {
 
-       width: boundaries.right - refRect.right,
 
-       height: boundaries.height
 
-     },
 
-     bottom: {
 
-       width: boundaries.width,
 
-       height: boundaries.bottom - refRect.bottom
 
-     },
 
-     left: {
 
-       width: refRect.left - boundaries.left,
 
-       height: boundaries.height
 
-     }
 
-   };
 
-   var sortedAreas = Object.keys(rects).map(function (key) {
 
-     return _extends({
 
-       key: key
 
-     }, rects[key], {
 
-       area: getArea(rects[key])
 
-     });
 
-   }).sort(function (a, b) {
 
-     return b.area - a.area;
 
-   });
 
-   var filteredAreas = sortedAreas.filter(function (_ref2) {
 
-     var width = _ref2.width,
 
-         height = _ref2.height;
 
-     return width >= popper.clientWidth && height >= popper.clientHeight;
 
-   });
 
-   var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;
 
-   var variation = placement.split('-')[1];
 
-   return computedPlacement + (variation ? '-' + variation : '');
 
- }
 
- /**
 
-  * Get offsets to the reference element
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @param {Object} state
 
-  * @param {Element} popper - the popper element
 
-  * @param {Element} reference - the reference element (the popper will be relative to this)
 
-  * @param {Element} fixedPosition - is in fixed position mode
 
-  * @returns {Object} An object containing the offsets which will be applied to the popper
 
-  */
 
- function getReferenceOffsets(state, popper, reference) {
 
-   var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
 
-   var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);
 
-   return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);
 
- }
 
- /**
 
-  * Get the outer sizes of the given element (offset size + margins)
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @argument {Element} element
 
-  * @returns {Object} object containing width and height properties
 
-  */
 
- function getOuterSizes(element) {
 
-   var window = element.ownerDocument.defaultView;
 
-   var styles = window.getComputedStyle(element);
 
-   var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);
 
-   var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);
 
-   var result = {
 
-     width: element.offsetWidth + y,
 
-     height: element.offsetHeight + x
 
-   };
 
-   return result;
 
- }
 
- /**
 
-  * Get the opposite placement of the given one
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @argument {String} placement
 
-  * @returns {String} flipped placement
 
-  */
 
- function getOppositePlacement(placement) {
 
-   var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };
 
-   return placement.replace(/left|right|bottom|top/g, function (matched) {
 
-     return hash[matched];
 
-   });
 
- }
 
- /**
 
-  * Get offsets to the popper
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @param {Object} position - CSS position the Popper will get applied
 
-  * @param {HTMLElement} popper - the popper element
 
-  * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)
 
-  * @param {String} placement - one of the valid placement options
 
-  * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper
 
-  */
 
- function getPopperOffsets(popper, referenceOffsets, placement) {
 
-   placement = placement.split('-')[0];
 
-   // Get popper node sizes
 
-   var popperRect = getOuterSizes(popper);
 
-   // Add position, width and height to our offsets object
 
-   var popperOffsets = {
 
-     width: popperRect.width,
 
-     height: popperRect.height
 
-   };
 
-   // depending by the popper placement we have to compute its offsets slightly differently
 
-   var isHoriz = ['right', 'left'].indexOf(placement) !== -1;
 
-   var mainSide = isHoriz ? 'top' : 'left';
 
-   var secondarySide = isHoriz ? 'left' : 'top';
 
-   var measurement = isHoriz ? 'height' : 'width';
 
-   var secondaryMeasurement = !isHoriz ? 'height' : 'width';
 
-   popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;
 
-   if (placement === secondarySide) {
 
-     popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];
 
-   } else {
 
-     popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];
 
-   }
 
-   return popperOffsets;
 
- }
 
- /**
 
-  * Mimics the `find` method of Array
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @argument {Array} arr
 
-  * @argument prop
 
-  * @argument value
 
-  * @returns index or -1
 
-  */
 
- function find(arr, check) {
 
-   // use native find if supported
 
-   if (Array.prototype.find) {
 
-     return arr.find(check);
 
-   }
 
-   // use `filter` to obtain the same behavior of `find`
 
-   return arr.filter(check)[0];
 
- }
 
- /**
 
-  * Return the index of the matching object
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @argument {Array} arr
 
-  * @argument prop
 
-  * @argument value
 
-  * @returns index or -1
 
-  */
 
- function findIndex(arr, prop, value) {
 
-   // use native findIndex if supported
 
-   if (Array.prototype.findIndex) {
 
-     return arr.findIndex(function (cur) {
 
-       return cur[prop] === value;
 
-     });
 
-   }
 
-   // use `find` + `indexOf` if `findIndex` isn't supported
 
-   var match = find(arr, function (obj) {
 
-     return obj[prop] === value;
 
-   });
 
-   return arr.indexOf(match);
 
- }
 
- /**
 
-  * Loop trough the list of modifiers and run them in order,
 
-  * each of them will then edit the data object.
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @param {dataObject} data
 
-  * @param {Array} modifiers
 
-  * @param {String} ends - Optional modifier name used as stopper
 
-  * @returns {dataObject}
 
-  */
 
- function runModifiers(modifiers, data, ends) {
 
-   var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));
 
-   modifiersToRun.forEach(function (modifier) {
 
-     if (modifier['function']) {
 
-       // eslint-disable-line dot-notation
 
-       console.warn('`modifier.function` is deprecated, use `modifier.fn`!');
 
-     }
 
-     var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation
 
-     if (modifier.enabled && isFunction(fn)) {
 
-       // Add properties to offsets to make them a complete clientRect object
 
-       // we do this before each modifier to make sure the previous one doesn't
 
-       // mess with these values
 
-       data.offsets.popper = getClientRect(data.offsets.popper);
 
-       data.offsets.reference = getClientRect(data.offsets.reference);
 
-       data = fn(data, modifier);
 
-     }
 
-   });
 
-   return data;
 
- }
 
- /**
 
-  * Updates the position of the popper, computing the new offsets and applying
 
-  * the new style.<br />
 
-  * Prefer `scheduleUpdate` over `update` because of performance reasons.
 
-  * @method
 
-  * @memberof Popper
 
-  */
 
- function update() {
 
-   // if popper is destroyed, don't perform any further update
 
-   if (this.state.isDestroyed) {
 
-     return;
 
-   }
 
-   var data = {
 
-     instance: this,
 
-     styles: {},
 
-     arrowStyles: {},
 
-     attributes: {},
 
-     flipped: false,
 
-     offsets: {}
 
-   };
 
-   // compute reference element offsets
 
-   data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed);
 
-   // compute auto placement, store placement inside the data object,
 
-   // modifiers will be able to edit `placement` if needed
 
-   // and refer to originalPlacement to know the original value
 
-   data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding);
 
-   // store the computed placement inside `originalPlacement`
 
-   data.originalPlacement = data.placement;
 
-   data.positionFixed = this.options.positionFixed;
 
-   // compute the popper offsets
 
-   data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);
 
-   data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute';
 
-   // run the modifiers
 
-   data = runModifiers(this.modifiers, data);
 
-   // the first `update` will call `onCreate` callback
 
-   // the other ones will call `onUpdate` callback
 
-   if (!this.state.isCreated) {
 
-     this.state.isCreated = true;
 
-     this.options.onCreate(data);
 
-   } else {
 
-     this.options.onUpdate(data);
 
-   }
 
- }
 
- /**
 
-  * Helper used to know if the given modifier is enabled.
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @returns {Boolean}
 
-  */
 
- function isModifierEnabled(modifiers, modifierName) {
 
-   return modifiers.some(function (_ref) {
 
-     var name = _ref.name,
 
-         enabled = _ref.enabled;
 
-     return enabled && name === modifierName;
 
-   });
 
- }
 
- /**
 
-  * Get the prefixed supported property name
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @argument {String} property (camelCase)
 
-  * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)
 
-  */
 
- function getSupportedPropertyName(property) {
 
-   var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];
 
-   var upperProp = property.charAt(0).toUpperCase() + property.slice(1);
 
-   for (var i = 0; i < prefixes.length; i++) {
 
-     var prefix = prefixes[i];
 
-     var toCheck = prefix ? '' + prefix + upperProp : property;
 
-     if (typeof document.body.style[toCheck] !== 'undefined') {
 
-       return toCheck;
 
-     }
 
-   }
 
-   return null;
 
- }
 
- /**
 
-  * Destroys the popper.
 
-  * @method
 
-  * @memberof Popper
 
-  */
 
- function destroy() {
 
-   this.state.isDestroyed = true;
 
-   // touch DOM only if `applyStyle` modifier is enabled
 
-   if (isModifierEnabled(this.modifiers, 'applyStyle')) {
 
-     this.popper.removeAttribute('x-placement');
 
-     this.popper.style.position = '';
 
-     this.popper.style.top = '';
 
-     this.popper.style.left = '';
 
-     this.popper.style.right = '';
 
-     this.popper.style.bottom = '';
 
-     this.popper.style.willChange = '';
 
-     this.popper.style[getSupportedPropertyName('transform')] = '';
 
-   }
 
-   this.disableEventListeners();
 
-   // remove the popper if user explicity asked for the deletion on destroy
 
-   // do not use `remove` because IE11 doesn't support it
 
-   if (this.options.removeOnDestroy) {
 
-     this.popper.parentNode.removeChild(this.popper);
 
-   }
 
-   return this;
 
- }
 
- /**
 
-  * Get the window associated with the element
 
-  * @argument {Element} element
 
-  * @returns {Window}
 
-  */
 
- function getWindow(element) {
 
-   var ownerDocument = element.ownerDocument;
 
-   return ownerDocument ? ownerDocument.defaultView : window;
 
- }
 
- function attachToScrollParents(scrollParent, event, callback, scrollParents) {
 
-   var isBody = scrollParent.nodeName === 'BODY';
 
-   var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;
 
-   target.addEventListener(event, callback, { passive: true });
 
-   if (!isBody) {
 
-     attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);
 
-   }
 
-   scrollParents.push(target);
 
- }
 
- /**
 
-  * Setup needed event listeners used to update the popper position
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @private
 
-  */
 
- function setupEventListeners(reference, options, state, updateBound) {
 
-   // Resize event listener on window
 
-   state.updateBound = updateBound;
 
-   getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });
 
-   // Scroll event listener on scroll parents
 
-   var scrollElement = getScrollParent(reference);
 
-   attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);
 
-   state.scrollElement = scrollElement;
 
-   state.eventsEnabled = true;
 
-   return state;
 
- }
 
- /**
 
-  * It will add resize/scroll events and start recalculating
 
-  * position of the popper element when they are triggered.
 
-  * @method
 
-  * @memberof Popper
 
-  */
 
- function enableEventListeners() {
 
-   if (!this.state.eventsEnabled) {
 
-     this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);
 
-   }
 
- }
 
- /**
 
-  * Remove event listeners used to update the popper position
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @private
 
-  */
 
- function removeEventListeners(reference, state) {
 
-   // Remove resize event listener on window
 
-   getWindow(reference).removeEventListener('resize', state.updateBound);
 
-   // Remove scroll event listener on scroll parents
 
-   state.scrollParents.forEach(function (target) {
 
-     target.removeEventListener('scroll', state.updateBound);
 
-   });
 
-   // Reset state
 
-   state.updateBound = null;
 
-   state.scrollParents = [];
 
-   state.scrollElement = null;
 
-   state.eventsEnabled = false;
 
-   return state;
 
- }
 
- /**
 
-  * It will remove resize/scroll events and won't recalculate popper position
 
-  * when they are triggered. It also won't trigger `onUpdate` callback anymore,
 
-  * unless you call `update` method manually.
 
-  * @method
 
-  * @memberof Popper
 
-  */
 
- function disableEventListeners() {
 
-   if (this.state.eventsEnabled) {
 
-     cancelAnimationFrame(this.scheduleUpdate);
 
-     this.state = removeEventListeners(this.reference, this.state);
 
-   }
 
- }
 
- /**
 
-  * Tells if a given input is a number
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @param {*} input to check
 
-  * @return {Boolean}
 
-  */
 
- function isNumeric(n) {
 
-   return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);
 
- }
 
- /**
 
-  * Set the style to the given popper
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @argument {Element} element - Element to apply the style to
 
-  * @argument {Object} styles
 
-  * Object with a list of properties and values which will be applied to the element
 
-  */
 
- function setStyles(element, styles) {
 
-   Object.keys(styles).forEach(function (prop) {
 
-     var unit = '';
 
-     // add unit if the value is numeric and is one of the following
 
-     if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {
 
-       unit = 'px';
 
-     }
 
-     element.style[prop] = styles[prop] + unit;
 
-   });
 
- }
 
- /**
 
-  * Set the attributes to the given popper
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @argument {Element} element - Element to apply the attributes to
 
-  * @argument {Object} styles
 
-  * Object with a list of properties and values which will be applied to the element
 
-  */
 
- function setAttributes(element, attributes) {
 
-   Object.keys(attributes).forEach(function (prop) {
 
-     var value = attributes[prop];
 
-     if (value !== false) {
 
-       element.setAttribute(prop, attributes[prop]);
 
-     } else {
 
-       element.removeAttribute(prop);
 
-     }
 
-   });
 
- }
 
- /**
 
-  * @function
 
-  * @memberof Modifiers
 
-  * @argument {Object} data - The data object generated by `update` method
 
-  * @argument {Object} data.styles - List of style properties - values to apply to popper element
 
-  * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element
 
-  * @argument {Object} options - Modifiers configuration and options
 
-  * @returns {Object} The same data object
 
-  */
 
- function applyStyle(data) {
 
-   // any property present in `data.styles` will be applied to the popper,
 
-   // in this way we can make the 3rd party modifiers add custom styles to it
 
-   // Be aware, modifiers could override the properties defined in the previous
 
-   // lines of this modifier!
 
-   setStyles(data.instance.popper, data.styles);
 
-   // any property present in `data.attributes` will be applied to the popper,
 
-   // they will be set as HTML attributes of the element
 
-   setAttributes(data.instance.popper, data.attributes);
 
-   // if arrowElement is defined and arrowStyles has some properties
 
-   if (data.arrowElement && Object.keys(data.arrowStyles).length) {
 
-     setStyles(data.arrowElement, data.arrowStyles);
 
-   }
 
-   return data;
 
- }
 
- /**
 
-  * Set the x-placement attribute before everything else because it could be used
 
-  * to add margins to the popper margins needs to be calculated to get the
 
-  * correct popper offsets.
 
-  * @method
 
-  * @memberof Popper.modifiers
 
-  * @param {HTMLElement} reference - The reference element used to position the popper
 
-  * @param {HTMLElement} popper - The HTML element used as popper
 
-  * @param {Object} options - Popper.js options
 
-  */
 
- function applyStyleOnLoad(reference, popper, options, modifierOptions, state) {
 
-   // compute reference element offsets
 
-   var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);
 
-   // compute auto placement, store placement inside the data object,
 
-   // modifiers will be able to edit `placement` if needed
 
-   // and refer to originalPlacement to know the original value
 
-   var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);
 
-   popper.setAttribute('x-placement', placement);
 
-   // Apply `position` to popper before anything else because
 
-   // without the position applied we can't guarantee correct computations
 
-   setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });
 
-   return options;
 
- }
 
- /**
 
-  * @function
 
-  * @memberof Popper.Utils
 
-  * @argument {Object} data - The data object generated by `update` method
 
-  * @argument {Boolean} shouldRound - If the offsets should be rounded at all
 
-  * @returns {Object} The popper's position offsets rounded
 
-  *
 
-  * The tale of pixel-perfect positioning. It's still not 100% perfect, but as
 
-  * good as it can be within reason.
 
-  * Discussion here: https://github.com/FezVrasta/popper.js/pull/715
 
-  *
 
-  * Low DPI screens cause a popper to be blurry if not using full pixels (Safari
 
-  * as well on High DPI screens).
 
-  *
 
-  * Firefox prefers no rounding for positioning and does not have blurriness on
 
-  * high DPI screens.
 
-  *
 
-  * Only horizontal placement and left/right values need to be considered.
 
-  */
 
- function getRoundedOffsets(data, shouldRound) {
 
-   var _data$offsets = data.offsets,
 
-       popper = _data$offsets.popper,
 
-       reference = _data$offsets.reference;
 
-   var round = Math.round,
 
-       floor = Math.floor;
 
-   var noRound = function noRound(v) {
 
-     return v;
 
-   };
 
-   var referenceWidth = round(reference.width);
 
-   var popperWidth = round(popper.width);
 
-   var isVertical = ['left', 'right'].indexOf(data.placement) !== -1;
 
-   var isVariation = data.placement.indexOf('-') !== -1;
 
-   var sameWidthParity = referenceWidth % 2 === popperWidth % 2;
 
-   var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1;
 
-   var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor;
 
-   var verticalToInteger = !shouldRound ? noRound : round;
 
-   return {
 
-     left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left),
 
-     top: verticalToInteger(popper.top),
 
-     bottom: verticalToInteger(popper.bottom),
 
-     right: horizontalToInteger(popper.right)
 
-   };
 
- }
 
- var isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent);
 
- /**
 
-  * @function
 
-  * @memberof Modifiers
 
-  * @argument {Object} data - The data object generated by `update` method
 
-  * @argument {Object} options - Modifiers configuration and options
 
-  * @returns {Object} The data object, properly modified
 
-  */
 
- function computeStyle(data, options) {
 
-   var x = options.x,
 
-       y = options.y;
 
-   var popper = data.offsets.popper;
 
-   // Remove this legacy support in Popper.js v2
 
-   var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {
 
-     return modifier.name === 'applyStyle';
 
-   }).gpuAcceleration;
 
-   if (legacyGpuAccelerationOption !== undefined) {
 
-     console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');
 
-   }
 
-   var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;
 
-   var offsetParent = getOffsetParent(data.instance.popper);
 
-   var offsetParentRect = getBoundingClientRect(offsetParent);
 
-   // Styles
 
-   var styles = {
 
-     position: popper.position
 
-   };
 
-   var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox);
 
-   var sideA = x === 'bottom' ? 'top' : 'bottom';
 
-   var sideB = y === 'right' ? 'left' : 'right';
 
-   // if gpuAcceleration is set to `true` and transform is supported,
 
-   //  we use `translate3d` to apply the position to the popper we
 
-   // automatically use the supported prefixed version if needed
 
-   var prefixedProperty = getSupportedPropertyName('transform');
 
-   // now, let's make a step back and look at this code closely (wtf?)
 
-   // If the content of the popper grows once it's been positioned, it
 
-   // may happen that the popper gets misplaced because of the new content
 
-   // overflowing its reference element
 
-   // To avoid this problem, we provide two options (x and y), which allow
 
-   // the consumer to define the offset origin.
 
-   // If we position a popper on top of a reference element, we can set
 
-   // `x` to `top` to make the popper grow towards its top instead of
 
-   // its bottom.
 
-   var left = void 0,
 
-       top = void 0;
 
-   if (sideA === 'bottom') {
 
-     // when offsetParent is <html> the positioning is relative to the bottom of the screen (excluding the scrollbar)
 
-     // and not the bottom of the html element
 
-     if (offsetParent.nodeName === 'HTML') {
 
-       top = -offsetParent.clientHeight + offsets.bottom;
 
-     } else {
 
-       top = -offsetParentRect.height + offsets.bottom;
 
-     }
 
-   } else {
 
-     top = offsets.top;
 
-   }
 
-   if (sideB === 'right') {
 
-     if (offsetParent.nodeName === 'HTML') {
 
-       left = -offsetParent.clientWidth + offsets.right;
 
-     } else {
 
-       left = -offsetParentRect.width + offsets.right;
 
-     }
 
-   } else {
 
-     left = offsets.left;
 
-   }
 
-   if (gpuAcceleration && prefixedProperty) {
 
-     styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';
 
-     styles[sideA] = 0;
 
-     styles[sideB] = 0;
 
-     styles.willChange = 'transform';
 
-   } else {
 
-     // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties
 
-     var invertTop = sideA === 'bottom' ? -1 : 1;
 
-     var invertLeft = sideB === 'right' ? -1 : 1;
 
-     styles[sideA] = top * invertTop;
 
-     styles[sideB] = left * invertLeft;
 
-     styles.willChange = sideA + ', ' + sideB;
 
-   }
 
-   // Attributes
 
-   var attributes = {
 
-     'x-placement': data.placement
 
-   };
 
-   // Update `data` attributes, styles and arrowStyles
 
-   data.attributes = _extends({}, attributes, data.attributes);
 
-   data.styles = _extends({}, styles, data.styles);
 
-   data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles);
 
-   return data;
 
- }
 
- /**
 
-  * Helper used to know if the given modifier depends from another one.<br />
 
-  * It checks if the needed modifier is listed and enabled.
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @param {Array} modifiers - list of modifiers
 
-  * @param {String} requestingName - name of requesting modifier
 
-  * @param {String} requestedName - name of requested modifier
 
-  * @returns {Boolean}
 
-  */
 
- function isModifierRequired(modifiers, requestingName, requestedName) {
 
-   var requesting = find(modifiers, function (_ref) {
 
-     var name = _ref.name;
 
-     return name === requestingName;
 
-   });
 
-   var isRequired = !!requesting && modifiers.some(function (modifier) {
 
-     return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;
 
-   });
 
-   if (!isRequired) {
 
-     var _requesting = '`' + requestingName + '`';
 
-     var requested = '`' + requestedName + '`';
 
-     console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');
 
-   }
 
-   return isRequired;
 
- }
 
- /**
 
-  * @function
 
-  * @memberof Modifiers
 
-  * @argument {Object} data - The data object generated by update method
 
-  * @argument {Object} options - Modifiers configuration and options
 
-  * @returns {Object} The data object, properly modified
 
-  */
 
- function arrow(data, options) {
 
-   var _data$offsets$arrow;
 
-   // arrow depends on keepTogether in order to work
 
-   if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {
 
-     return data;
 
-   }
 
-   var arrowElement = options.element;
 
-   // if arrowElement is a string, suppose it's a CSS selector
 
-   if (typeof arrowElement === 'string') {
 
-     arrowElement = data.instance.popper.querySelector(arrowElement);
 
-     // if arrowElement is not found, don't run the modifier
 
-     if (!arrowElement) {
 
-       return data;
 
-     }
 
-   } else {
 
-     // if the arrowElement isn't a query selector we must check that the
 
-     // provided DOM node is child of its popper node
 
-     if (!data.instance.popper.contains(arrowElement)) {
 
-       console.warn('WARNING: `arrow.element` must be child of its popper element!');
 
-       return data;
 
-     }
 
-   }
 
-   var placement = data.placement.split('-')[0];
 
-   var _data$offsets = data.offsets,
 
-       popper = _data$offsets.popper,
 
-       reference = _data$offsets.reference;
 
-   var isVertical = ['left', 'right'].indexOf(placement) !== -1;
 
-   var len = isVertical ? 'height' : 'width';
 
-   var sideCapitalized = isVertical ? 'Top' : 'Left';
 
-   var side = sideCapitalized.toLowerCase();
 
-   var altSide = isVertical ? 'left' : 'top';
 
-   var opSide = isVertical ? 'bottom' : 'right';
 
-   var arrowElementSize = getOuterSizes(arrowElement)[len];
 
-   //
 
-   // extends keepTogether behavior making sure the popper and its
 
-   // reference have enough pixels in conjunction
 
-   //
 
-   // top/left side
 
-   if (reference[opSide] - arrowElementSize < popper[side]) {
 
-     data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);
 
-   }
 
-   // bottom/right side
 
-   if (reference[side] + arrowElementSize > popper[opSide]) {
 
-     data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];
 
-   }
 
-   data.offsets.popper = getClientRect(data.offsets.popper);
 
-   // compute center of the popper
 
-   var center = reference[side] + reference[len] / 2 - arrowElementSize / 2;
 
-   // Compute the sideValue using the updated popper offsets
 
-   // take popper margin in account because we don't have this info available
 
-   var css = getStyleComputedProperty(data.instance.popper);
 
-   var popperMarginSide = parseFloat(css['margin' + sideCapitalized], 10);
 
-   var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width'], 10);
 
-   var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;
 
-   // prevent arrowElement from being placed not contiguously to its popper
 
-   sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);
 
-   data.arrowElement = arrowElement;
 
-   data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);
 
-   return data;
 
- }
 
- /**
 
-  * Get the opposite placement variation of the given one
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @argument {String} placement variation
 
-  * @returns {String} flipped placement variation
 
-  */
 
- function getOppositeVariation(variation) {
 
-   if (variation === 'end') {
 
-     return 'start';
 
-   } else if (variation === 'start') {
 
-     return 'end';
 
-   }
 
-   return variation;
 
- }
 
- /**
 
-  * List of accepted placements to use as values of the `placement` option.<br />
 
-  * Valid placements are:
 
-  * - `auto`
 
-  * - `top`
 
-  * - `right`
 
-  * - `bottom`
 
-  * - `left`
 
-  *
 
-  * Each placement can have a variation from this list:
 
-  * - `-start`
 
-  * - `-end`
 
-  *
 
-  * Variations are interpreted easily if you think of them as the left to right
 
-  * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`
 
-  * is right.<br />
 
-  * Vertically (`left` and `right`), `start` is top and `end` is bottom.
 
-  *
 
-  * Some valid examples are:
 
-  * - `top-end` (on top of reference, right aligned)
 
-  * - `right-start` (on right of reference, top aligned)
 
-  * - `bottom` (on bottom, centered)
 
-  * - `auto-end` (on the side with more space available, alignment depends by placement)
 
-  *
 
-  * @static
 
-  * @type {Array}
 
-  * @enum {String}
 
-  * @readonly
 
-  * @method placements
 
-  * @memberof Popper
 
-  */
 
- var placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'];
 
- // Get rid of `auto` `auto-start` and `auto-end`
 
- var validPlacements = placements.slice(3);
 
- /**
 
-  * Given an initial placement, returns all the subsequent placements
 
-  * clockwise (or counter-clockwise).
 
-  *
 
-  * @method
 
-  * @memberof Popper.Utils
 
-  * @argument {String} placement - A valid placement (it accepts variations)
 
-  * @argument {Boolean} counter - Set to true to walk the placements counterclockwise
 
-  * @returns {Array} placements including their variations
 
-  */
 
- function clockwise(placement) {
 
-   var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
 
-   var index = validPlacements.indexOf(placement);
 
-   var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));
 
-   return counter ? arr.reverse() : arr;
 
- }
 
- var BEHAVIORS = {
 
-   FLIP: 'flip',
 
-   CLOCKWISE: 'clockwise',
 
-   COUNTERCLOCKWISE: 'counterclockwise'
 
- };
 
- /**
 
-  * @function
 
-  * @memberof Modifiers
 
-  * @argument {Object} data - The data object generated by update method
 
-  * @argument {Object} options - Modifiers configuration and options
 
-  * @returns {Object} The data object, properly modified
 
-  */
 
- function flip(data, options) {
 
-   // if `inner` modifier is enabled, we can't use the `flip` modifier
 
-   if (isModifierEnabled(data.instance.modifiers, 'inner')) {
 
-     return data;
 
-   }
 
-   if (data.flipped && data.placement === data.originalPlacement) {
 
-     // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides
 
-     return data;
 
-   }
 
-   var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed);
 
-   var placement = data.placement.split('-')[0];
 
-   var placementOpposite = getOppositePlacement(placement);
 
-   var variation = data.placement.split('-')[1] || '';
 
-   var flipOrder = [];
 
-   switch (options.behavior) {
 
-     case BEHAVIORS.FLIP:
 
-       flipOrder = [placement, placementOpposite];
 
-       break;
 
-     case BEHAVIORS.CLOCKWISE:
 
-       flipOrder = clockwise(placement);
 
-       break;
 
-     case BEHAVIORS.COUNTERCLOCKWISE:
 
-       flipOrder = clockwise(placement, true);
 
-       break;
 
-     default:
 
-       flipOrder = options.behavior;
 
-   }
 
-   flipOrder.forEach(function (step, index) {
 
-     if (placement !== step || flipOrder.length === index + 1) {
 
-       return data;
 
-     }
 
-     placement = data.placement.split('-')[0];
 
-     placementOpposite = getOppositePlacement(placement);
 
-     var popperOffsets = data.offsets.popper;
 
-     var refOffsets = data.offsets.reference;
 
-     // using floor because the reference offsets may contain decimals we are not going to consider here
 
-     var floor = Math.floor;
 
-     var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom);
 
-     var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);
 
-     var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);
 
-     var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);
 
-     var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);
 
-     var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom;
 
-     // flip the variation if required
 
-     var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;
 
-     // flips variation if reference element overflows boundaries
 
-     var flippedVariationByRef = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);
 
-     // flips variation if popper content overflows boundaries
 
-     var flippedVariationByContent = !!options.flipVariationsByContent && (isVertical && variation === 'start' && overflowsRight || isVertical && variation === 'end' && overflowsLeft || !isVertical && variation === 'start' && overflowsBottom || !isVertical && variation === 'end' && overflowsTop);
 
-     var flippedVariation = flippedVariationByRef || flippedVariationByContent;
 
-     if (overlapsRef || overflowsBoundaries || flippedVariation) {
 
-       // this boolean to detect any flip loop
 
-       data.flipped = true;
 
-       if (overlapsRef || overflowsBoundaries) {
 
-         placement = flipOrder[index + 1];
 
-       }
 
-       if (flippedVariation) {
 
-         variation = getOppositeVariation(variation);
 
-       }
 
-       data.placement = placement + (variation ? '-' + variation : '');
 
-       // this object contains `position`, we want to preserve it along with
 
-       // any additional property we may add in the future
 
-       data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));
 
-       data = runModifiers(data.instance.modifiers, data, 'flip');
 
-     }
 
-   });
 
-   return data;
 
- }
 
- /**
 
-  * @function
 
-  * @memberof Modifiers
 
-  * @argument {Object} data - The data object generated by update method
 
-  * @argument {Object} options - Modifiers configuration and options
 
-  * @returns {Object} The data object, properly modified
 
-  */
 
- function keepTogether(data) {
 
-   var _data$offsets = data.offsets,
 
-       popper = _data$offsets.popper,
 
-       reference = _data$offsets.reference;
 
-   var placement = data.placement.split('-')[0];
 
-   var floor = Math.floor;
 
-   var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;
 
-   var side = isVertical ? 'right' : 'bottom';
 
-   var opSide = isVertical ? 'left' : 'top';
 
-   var measurement = isVertical ? 'width' : 'height';
 
-   if (popper[side] < floor(reference[opSide])) {
 
-     data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];
 
-   }
 
-   if (popper[opSide] > floor(reference[side])) {
 
-     data.offsets.popper[opSide] = floor(reference[side]);
 
-   }
 
-   return data;
 
- }
 
- /**
 
-  * Converts a string containing value + unit into a px value number
 
-  * @function
 
-  * @memberof {modifiers~offset}
 
-  * @private
 
-  * @argument {String} str - Value + unit string
 
-  * @argument {String} measurement - `height` or `width`
 
-  * @argument {Object} popperOffsets
 
-  * @argument {Object} referenceOffsets
 
-  * @returns {Number|String}
 
-  * Value in pixels, or original string if no values were extracted
 
-  */
 
- function toValue(str, measurement, popperOffsets, referenceOffsets) {
 
-   // separate value from unit
 
-   var split = str.match(/((?:\-|\+)?\d*\.?\d*)(.*)/);
 
-   var value = +split[1];
 
-   var unit = split[2];
 
-   // If it's not a number it's an operator, I guess
 
-   if (!value) {
 
-     return str;
 
-   }
 
-   if (unit.indexOf('%') === 0) {
 
-     var element = void 0;
 
-     switch (unit) {
 
-       case '%p':
 
-         element = popperOffsets;
 
-         break;
 
-       case '%':
 
-       case '%r':
 
-       default:
 
-         element = referenceOffsets;
 
-     }
 
-     var rect = getClientRect(element);
 
-     return rect[measurement] / 100 * value;
 
-   } else if (unit === 'vh' || unit === 'vw') {
 
-     // if is a vh or vw, we calculate the size based on the viewport
 
-     var size = void 0;
 
-     if (unit === 'vh') {
 
-       size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
 
-     } else {
 
-       size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
 
-     }
 
-     return size / 100 * value;
 
-   } else {
 
-     // if is an explicit pixel unit, we get rid of the unit and keep the value
 
-     // if is an implicit unit, it's px, and we return just the value
 
-     return value;
 
-   }
 
- }
 
- /**
 
-  * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.
 
-  * @function
 
-  * @memberof {modifiers~offset}
 
-  * @private
 
-  * @argument {String} offset
 
-  * @argument {Object} popperOffsets
 
-  * @argument {Object} referenceOffsets
 
-  * @argument {String} basePlacement
 
-  * @returns {Array} a two cells array with x and y offsets in numbers
 
-  */
 
- function parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {
 
-   var offsets = [0, 0];
 
-   // Use height if placement is left or right and index is 0 otherwise use width
 
-   // in this way the first offset will use an axis and the second one
 
-   // will use the other one
 
-   var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;
 
-   // Split the offset string to obtain a list of values and operands
 
-   // The regex addresses values with the plus or minus sign in front (+10, -20, etc)
 
-   var fragments = offset.split(/(\+|\-)/).map(function (frag) {
 
-     return frag.trim();
 
-   });
 
-   // Detect if the offset string contains a pair of values or a single one
 
-   // they could be separated by comma or space
 
-   var divider = fragments.indexOf(find(fragments, function (frag) {
 
-     return frag.search(/,|\s/) !== -1;
 
-   }));
 
-   if (fragments[divider] && fragments[divider].indexOf(',') === -1) {
 
-     console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');
 
-   }
 
-   // If divider is found, we divide the list of values and operands to divide
 
-   // them by ofset X and Y.
 
-   var splitRegex = /\s*,\s*|\s+/;
 
-   var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments];
 
-   // Convert the values with units to absolute pixels to allow our computations
 
-   ops = ops.map(function (op, index) {
 
-     // Most of the units rely on the orientation of the popper
 
-     var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';
 
-     var mergeWithPrevious = false;
 
-     return op
 
-     // This aggregates any `+` or `-` sign that aren't considered operators
 
-     // e.g.: 10 + +5 => [10, +, +5]
 
-     .reduce(function (a, b) {
 
-       if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {
 
-         a[a.length - 1] = b;
 
-         mergeWithPrevious = true;
 
-         return a;
 
-       } else if (mergeWithPrevious) {
 
-         a[a.length - 1] += b;
 
-         mergeWithPrevious = false;
 
-         return a;
 
-       } else {
 
-         return a.concat(b);
 
-       }
 
-     }, [])
 
-     // Here we convert the string values into number values (in px)
 
-     .map(function (str) {
 
-       return toValue(str, measurement, popperOffsets, referenceOffsets);
 
-     });
 
-   });
 
-   // Loop trough the offsets arrays and execute the operations
 
-   ops.forEach(function (op, index) {
 
-     op.forEach(function (frag, index2) {
 
-       if (isNumeric(frag)) {
 
-         offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);
 
-       }
 
-     });
 
-   });
 
-   return offsets;
 
- }
 
- /**
 
-  * @function
 
-  * @memberof Modifiers
 
-  * @argument {Object} data - The data object generated by update method
 
-  * @argument {Object} options - Modifiers configuration and options
 
-  * @argument {Number|String} options.offset=0
 
-  * The offset value as described in the modifier description
 
-  * @returns {Object} The data object, properly modified
 
-  */
 
- function offset(data, _ref) {
 
-   var offset = _ref.offset;
 
-   var placement = data.placement,
 
-       _data$offsets = data.offsets,
 
-       popper = _data$offsets.popper,
 
-       reference = _data$offsets.reference;
 
-   var basePlacement = placement.split('-')[0];
 
-   var offsets = void 0;
 
-   if (isNumeric(+offset)) {
 
-     offsets = [+offset, 0];
 
-   } else {
 
-     offsets = parseOffset(offset, popper, reference, basePlacement);
 
-   }
 
-   if (basePlacement === 'left') {
 
-     popper.top += offsets[0];
 
-     popper.left -= offsets[1];
 
-   } else if (basePlacement === 'right') {
 
-     popper.top += offsets[0];
 
-     popper.left += offsets[1];
 
-   } else if (basePlacement === 'top') {
 
-     popper.left += offsets[0];
 
-     popper.top -= offsets[1];
 
-   } else if (basePlacement === 'bottom') {
 
-     popper.left += offsets[0];
 
-     popper.top += offsets[1];
 
-   }
 
-   data.popper = popper;
 
-   return data;
 
- }
 
- /**
 
-  * @function
 
-  * @memberof Modifiers
 
-  * @argument {Object} data - The data object generated by `update` method
 
-  * @argument {Object} options - Modifiers configuration and options
 
-  * @returns {Object} The data object, properly modified
 
-  */
 
- function preventOverflow(data, options) {
 
-   var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper);
 
-   // If offsetParent is the reference element, we really want to
 
-   // go one step up and use the next offsetParent as reference to
 
-   // avoid to make this modifier completely useless and look like broken
 
-   if (data.instance.reference === boundariesElement) {
 
-     boundariesElement = getOffsetParent(boundariesElement);
 
-   }
 
-   // NOTE: DOM access here
 
-   // resets the popper's position so that the document size can be calculated excluding
 
-   // the size of the popper element itself
 
-   var transformProp = getSupportedPropertyName('transform');
 
-   var popperStyles = data.instance.popper.style; // assignment to help minification
 
-   var top = popperStyles.top,
 
-       left = popperStyles.left,
 
-       transform = popperStyles[transformProp];
 
-   popperStyles.top = '';
 
-   popperStyles.left = '';
 
-   popperStyles[transformProp] = '';
 
-   var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed);
 
-   // NOTE: DOM access here
 
-   // restores the original style properties after the offsets have been computed
 
-   popperStyles.top = top;
 
-   popperStyles.left = left;
 
-   popperStyles[transformProp] = transform;
 
-   options.boundaries = boundaries;
 
-   var order = options.priority;
 
-   var popper = data.offsets.popper;
 
-   var check = {
 
-     primary: function primary(placement) {
 
-       var value = popper[placement];
 
-       if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {
 
-         value = Math.max(popper[placement], boundaries[placement]);
 
-       }
 
-       return defineProperty({}, placement, value);
 
-     },
 
-     secondary: function secondary(placement) {
 
-       var mainSide = placement === 'right' ? 'left' : 'top';
 
-       var value = popper[mainSide];
 
-       if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {
 
-         value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));
 
-       }
 
-       return defineProperty({}, mainSide, value);
 
-     }
 
-   };
 
-   order.forEach(function (placement) {
 
-     var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';
 
-     popper = _extends({}, popper, check[side](placement));
 
-   });
 
-   data.offsets.popper = popper;
 
-   return data;
 
- }
 
- /**
 
-  * @function
 
-  * @memberof Modifiers
 
-  * @argument {Object} data - The data object generated by `update` method
 
-  * @argument {Object} options - Modifiers configuration and options
 
-  * @returns {Object} The data object, properly modified
 
-  */
 
- function shift(data) {
 
-   var placement = data.placement;
 
-   var basePlacement = placement.split('-')[0];
 
-   var shiftvariation = placement.split('-')[1];
 
-   // if shift shiftvariation is specified, run the modifier
 
-   if (shiftvariation) {
 
-     var _data$offsets = data.offsets,
 
-         reference = _data$offsets.reference,
 
-         popper = _data$offsets.popper;
 
-     var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;
 
-     var side = isVertical ? 'left' : 'top';
 
-     var measurement = isVertical ? 'width' : 'height';
 
-     var shiftOffsets = {
 
-       start: defineProperty({}, side, reference[side]),
 
-       end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement])
 
-     };
 
-     data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]);
 
-   }
 
-   return data;
 
- }
 
- /**
 
-  * @function
 
-  * @memberof Modifiers
 
-  * @argument {Object} data - The data object generated by update method
 
-  * @argument {Object} options - Modifiers configuration and options
 
-  * @returns {Object} The data object, properly modified
 
-  */
 
- function hide(data) {
 
-   if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {
 
-     return data;
 
-   }
 
-   var refRect = data.offsets.reference;
 
-   var bound = find(data.instance.modifiers, function (modifier) {
 
-     return modifier.name === 'preventOverflow';
 
-   }).boundaries;
 
-   if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {
 
-     // Avoid unnecessary DOM access if visibility hasn't changed
 
-     if (data.hide === true) {
 
-       return data;
 
-     }
 
-     data.hide = true;
 
-     data.attributes['x-out-of-boundaries'] = '';
 
-   } else {
 
-     // Avoid unnecessary DOM access if visibility hasn't changed
 
-     if (data.hide === false) {
 
-       return data;
 
-     }
 
-     data.hide = false;
 
-     data.attributes['x-out-of-boundaries'] = false;
 
-   }
 
-   return data;
 
- }
 
- /**
 
-  * @function
 
-  * @memberof Modifiers
 
-  * @argument {Object} data - The data object generated by `update` method
 
-  * @argument {Object} options - Modifiers configuration and options
 
-  * @returns {Object} The data object, properly modified
 
-  */
 
- function inner(data) {
 
-   var placement = data.placement;
 
-   var basePlacement = placement.split('-')[0];
 
-   var _data$offsets = data.offsets,
 
-       popper = _data$offsets.popper,
 
-       reference = _data$offsets.reference;
 
-   var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;
 
-   var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;
 
-   popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);
 
-   data.placement = getOppositePlacement(placement);
 
-   data.offsets.popper = getClientRect(popper);
 
-   return data;
 
- }
 
- /**
 
-  * Modifier function, each modifier can have a function of this type assigned
 
-  * to its `fn` property.<br />
 
-  * These functions will be called on each update, this means that you must
 
-  * make sure they are performant enough to avoid performance bottlenecks.
 
-  *
 
-  * @function ModifierFn
 
-  * @argument {dataObject} data - The data object generated by `update` method
 
-  * @argument {Object} options - Modifiers configuration and options
 
-  * @returns {dataObject} The data object, properly modified
 
-  */
 
- /**
 
-  * Modifiers are plugins used to alter the behavior of your poppers.<br />
 
-  * Popper.js uses a set of 9 modifiers to provide all the basic functionalities
 
-  * needed by the library.
 
-  *
 
-  * Usually you don't want to override the `order`, `fn` and `onLoad` props.
 
-  * All the other properties are configurations that could be tweaked.
 
-  * @namespace modifiers
 
-  */
 
- var modifiers = {
 
-   /**
 
-    * Modifier used to shift the popper on the start or end of its reference
 
-    * element.<br />
 
-    * It will read the variation of the `placement` property.<br />
 
-    * It can be one either `-end` or `-start`.
 
-    * @memberof modifiers
 
-    * @inner
 
-    */
 
-   shift: {
 
-     /** @prop {number} order=100 - Index used to define the order of execution */
 
-     order: 100,
 
-     /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
 
-     enabled: true,
 
-     /** @prop {ModifierFn} */
 
-     fn: shift
 
-   },
 
-   /**
 
-    * The `offset` modifier can shift your popper on both its axis.
 
-    *
 
-    * It accepts the following units:
 
-    * - `px` or unit-less, interpreted as pixels
 
-    * - `%` or `%r`, percentage relative to the length of the reference element
 
-    * - `%p`, percentage relative to the length of the popper element
 
-    * - `vw`, CSS viewport width unit
 
-    * - `vh`, CSS viewport height unit
 
-    *
 
-    * For length is intended the main axis relative to the placement of the popper.<br />
 
-    * This means that if the placement is `top` or `bottom`, the length will be the
 
-    * `width`. In case of `left` or `right`, it will be the `height`.
 
-    *
 
-    * You can provide a single value (as `Number` or `String`), or a pair of values
 
-    * as `String` divided by a comma or one (or more) white spaces.<br />
 
-    * The latter is a deprecated method because it leads to confusion and will be
 
-    * removed in v2.<br />
 
-    * Additionally, it accepts additions and subtractions between different units.
 
-    * Note that multiplications and divisions aren't supported.
 
-    *
 
-    * Valid examples are:
 
-    * ```
 
-    * 10
 
-    * '10%'
 
-    * '10, 10'
 
-    * '10%, 10'
 
-    * '10 + 10%'
 
-    * '10 - 5vh + 3%'
 
-    * '-10px + 5vh, 5px - 6%'
 
-    * ```
 
-    * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap
 
-    * > with their reference element, unfortunately, you will have to disable the `flip` modifier.
 
-    * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).
 
-    *
 
-    * @memberof modifiers
 
-    * @inner
 
-    */
 
-   offset: {
 
-     /** @prop {number} order=200 - Index used to define the order of execution */
 
-     order: 200,
 
-     /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
 
-     enabled: true,
 
-     /** @prop {ModifierFn} */
 
-     fn: offset,
 
-     /** @prop {Number|String} offset=0
 
-      * The offset value as described in the modifier description
 
-      */
 
-     offset: 0
 
-   },
 
-   /**
 
-    * Modifier used to prevent the popper from being positioned outside the boundary.
 
-    *
 
-    * A scenario exists where the reference itself is not within the boundaries.<br />
 
-    * We can say it has "escaped the boundaries" — or just "escaped".<br />
 
-    * In this case we need to decide whether the popper should either:
 
-    *
 
-    * - detach from the reference and remain "trapped" in the boundaries, or
 
-    * - if it should ignore the boundary and "escape with its reference"
 
-    *
 
-    * When `escapeWithReference` is set to`true` and reference is completely
 
-    * outside its boundaries, the popper will overflow (or completely leave)
 
-    * the boundaries in order to remain attached to the edge of the reference.
 
-    *
 
-    * @memberof modifiers
 
-    * @inner
 
-    */
 
-   preventOverflow: {
 
-     /** @prop {number} order=300 - Index used to define the order of execution */
 
-     order: 300,
 
-     /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
 
-     enabled: true,
 
-     /** @prop {ModifierFn} */
 
-     fn: preventOverflow,
 
-     /**
 
-      * @prop {Array} [priority=['left','right','top','bottom']]
 
-      * Popper will try to prevent overflow following these priorities by default,
 
-      * then, it could overflow on the left and on top of the `boundariesElement`
 
-      */
 
-     priority: ['left', 'right', 'top', 'bottom'],
 
-     /**
 
-      * @prop {number} padding=5
 
-      * Amount of pixel used to define a minimum distance between the boundaries
 
-      * and the popper. This makes sure the popper always has a little padding
 
-      * between the edges of its container
 
-      */
 
-     padding: 5,
 
-     /**
 
-      * @prop {String|HTMLElement} boundariesElement='scrollParent'
 
-      * Boundaries used by the modifier. Can be `scrollParent`, `window`,
 
-      * `viewport` or any DOM element.
 
-      */
 
-     boundariesElement: 'scrollParent'
 
-   },
 
-   /**
 
-    * Modifier used to make sure the reference and its popper stay near each other
 
-    * without leaving any gap between the two. Especially useful when the arrow is
 
-    * enabled and you want to ensure that it points to its reference element.
 
-    * It cares only about the first axis. You can still have poppers with margin
 
-    * between the popper and its reference element.
 
-    * @memberof modifiers
 
-    * @inner
 
-    */
 
-   keepTogether: {
 
-     /** @prop {number} order=400 - Index used to define the order of execution */
 
-     order: 400,
 
-     /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
 
-     enabled: true,
 
-     /** @prop {ModifierFn} */
 
-     fn: keepTogether
 
-   },
 
-   /**
 
-    * This modifier is used to move the `arrowElement` of the popper to make
 
-    * sure it is positioned between the reference element and its popper element.
 
-    * It will read the outer size of the `arrowElement` node to detect how many
 
-    * pixels of conjunction are needed.
 
-    *
 
-    * It has no effect if no `arrowElement` is provided.
 
-    * @memberof modifiers
 
-    * @inner
 
-    */
 
-   arrow: {
 
-     /** @prop {number} order=500 - Index used to define the order of execution */
 
-     order: 500,
 
-     /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
 
-     enabled: true,
 
-     /** @prop {ModifierFn} */
 
-     fn: arrow,
 
-     /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */
 
-     element: '[x-arrow]'
 
-   },
 
-   /**
 
-    * Modifier used to flip the popper's placement when it starts to overlap its
 
-    * reference element.
 
-    *
 
-    * Requires the `preventOverflow` modifier before it in order to work.
 
-    *
 
-    * **NOTE:** this modifier will interrupt the current update cycle and will
 
-    * restart it if it detects the need to flip the placement.
 
-    * @memberof modifiers
 
-    * @inner
 
-    */
 
-   flip: {
 
-     /** @prop {number} order=600 - Index used to define the order of execution */
 
-     order: 600,
 
-     /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
 
-     enabled: true,
 
-     /** @prop {ModifierFn} */
 
-     fn: flip,
 
-     /**
 
-      * @prop {String|Array} behavior='flip'
 
-      * The behavior used to change the popper's placement. It can be one of
 
-      * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid
 
-      * placements (with optional variations)
 
-      */
 
-     behavior: 'flip',
 
-     /**
 
-      * @prop {number} padding=5
 
-      * The popper will flip if it hits the edges of the `boundariesElement`
 
-      */
 
-     padding: 5,
 
-     /**
 
-      * @prop {String|HTMLElement} boundariesElement='viewport'
 
-      * The element which will define the boundaries of the popper position.
 
-      * The popper will never be placed outside of the defined boundaries
 
-      * (except if `keepTogether` is enabled)
 
-      */
 
-     boundariesElement: 'viewport',
 
-     /**
 
-      * @prop {Boolean} flipVariations=false
 
-      * The popper will switch placement variation between `-start` and `-end` when
 
-      * the reference element overlaps its boundaries.
 
-      *
 
-      * The original placement should have a set variation.
 
-      */
 
-     flipVariations: false,
 
-     /**
 
-      * @prop {Boolean} flipVariationsByContent=false
 
-      * The popper will switch placement variation between `-start` and `-end` when
 
-      * the popper element overlaps its reference boundaries.
 
-      *
 
-      * The original placement should have a set variation.
 
-      */
 
-     flipVariationsByContent: false
 
-   },
 
-   /**
 
-    * Modifier used to make the popper flow toward the inner of the reference element.
 
-    * By default, when this modifier is disabled, the popper will be placed outside
 
-    * the reference element.
 
-    * @memberof modifiers
 
-    * @inner
 
-    */
 
-   inner: {
 
-     /** @prop {number} order=700 - Index used to define the order of execution */
 
-     order: 700,
 
-     /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */
 
-     enabled: false,
 
-     /** @prop {ModifierFn} */
 
-     fn: inner
 
-   },
 
-   /**
 
-    * Modifier used to hide the popper when its reference element is outside of the
 
-    * popper boundaries. It will set a `x-out-of-boundaries` attribute which can
 
-    * be used to hide with a CSS selector the popper when its reference is
 
-    * out of boundaries.
 
-    *
 
-    * Requires the `preventOverflow` modifier before it in order to work.
 
-    * @memberof modifiers
 
-    * @inner
 
-    */
 
-   hide: {
 
-     /** @prop {number} order=800 - Index used to define the order of execution */
 
-     order: 800,
 
-     /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
 
-     enabled: true,
 
-     /** @prop {ModifierFn} */
 
-     fn: hide
 
-   },
 
-   /**
 
-    * Computes the style that will be applied to the popper element to gets
 
-    * properly positioned.
 
-    *
 
-    * Note that this modifier will not touch the DOM, it just prepares the styles
 
-    * so that `applyStyle` modifier can apply it. This separation is useful
 
-    * in case you need to replace `applyStyle` with a custom implementation.
 
-    *
 
-    * This modifier has `850` as `order` value to maintain backward compatibility
 
-    * with previous versions of Popper.js. Expect the modifiers ordering method
 
-    * to change in future major versions of the library.
 
-    *
 
-    * @memberof modifiers
 
-    * @inner
 
-    */
 
-   computeStyle: {
 
-     /** @prop {number} order=850 - Index used to define the order of execution */
 
-     order: 850,
 
-     /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
 
-     enabled: true,
 
-     /** @prop {ModifierFn} */
 
-     fn: computeStyle,
 
-     /**
 
-      * @prop {Boolean} gpuAcceleration=true
 
-      * If true, it uses the CSS 3D transformation to position the popper.
 
-      * Otherwise, it will use the `top` and `left` properties
 
-      */
 
-     gpuAcceleration: true,
 
-     /**
 
-      * @prop {string} [x='bottom']
 
-      * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.
 
-      * Change this if your popper should grow in a direction different from `bottom`
 
-      */
 
-     x: 'bottom',
 
-     /**
 
-      * @prop {string} [x='left']
 
-      * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.
 
-      * Change this if your popper should grow in a direction different from `right`
 
-      */
 
-     y: 'right'
 
-   },
 
-   /**
 
-    * Applies the computed styles to the popper element.
 
-    *
 
-    * All the DOM manipulations are limited to this modifier. This is useful in case
 
-    * you want to integrate Popper.js inside a framework or view library and you
 
-    * want to delegate all the DOM manipulations to it.
 
-    *
 
-    * Note that if you disable this modifier, you must make sure the popper element
 
-    * has its position set to `absolute` before Popper.js can do its work!
 
-    *
 
-    * Just disable this modifier and define your own to achieve the desired effect.
 
-    *
 
-    * @memberof modifiers
 
-    * @inner
 
-    */
 
-   applyStyle: {
 
-     /** @prop {number} order=900 - Index used to define the order of execution */
 
-     order: 900,
 
-     /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
 
-     enabled: true,
 
-     /** @prop {ModifierFn} */
 
-     fn: applyStyle,
 
-     /** @prop {Function} */
 
-     onLoad: applyStyleOnLoad,
 
-     /**
 
-      * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier
 
-      * @prop {Boolean} gpuAcceleration=true
 
-      * If true, it uses the CSS 3D transformation to position the popper.
 
-      * Otherwise, it will use the `top` and `left` properties
 
-      */
 
-     gpuAcceleration: undefined
 
-   }
 
- };
 
- /**
 
-  * The `dataObject` is an object containing all the information used by Popper.js.
 
-  * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.
 
-  * @name dataObject
 
-  * @property {Object} data.instance The Popper.js instance
 
-  * @property {String} data.placement Placement applied to popper
 
-  * @property {String} data.originalPlacement Placement originally defined on init
 
-  * @property {Boolean} data.flipped True if popper has been flipped by flip modifier
 
-  * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper
 
-  * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier
 
-  * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)
 
-  * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)
 
-  * @property {Object} data.boundaries Offsets of the popper boundaries
 
-  * @property {Object} data.offsets The measurements of popper, reference and arrow elements
 
-  * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values
 
-  * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values
 
-  * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0
 
-  */
 
- /**
 
-  * Default options provided to Popper.js constructor.<br />
 
-  * These can be overridden using the `options` argument of Popper.js.<br />
 
-  * To override an option, simply pass an object with the same
 
-  * structure of the `options` object, as the 3rd argument. For example:
 
-  * ```
 
-  * new Popper(ref, pop, {
 
-  *   modifiers: {
 
-  *     preventOverflow: { enabled: false }
 
-  *   }
 
-  * })
 
-  * ```
 
-  * @type {Object}
 
-  * @static
 
-  * @memberof Popper
 
-  */
 
- var Defaults = {
 
-   /**
 
-    * Popper's placement.
 
-    * @prop {Popper.placements} placement='bottom'
 
-    */
 
-   placement: 'bottom',
 
-   /**
 
-    * Set this to true if you want popper to position it self in 'fixed' mode
 
-    * @prop {Boolean} positionFixed=false
 
-    */
 
-   positionFixed: false,
 
-   /**
 
-    * Whether events (resize, scroll) are initially enabled.
 
-    * @prop {Boolean} eventsEnabled=true
 
-    */
 
-   eventsEnabled: true,
 
-   /**
 
-    * Set to true if you want to automatically remove the popper when
 
-    * you call the `destroy` method.
 
-    * @prop {Boolean} removeOnDestroy=false
 
-    */
 
-   removeOnDestroy: false,
 
-   /**
 
-    * Callback called when the popper is created.<br />
 
-    * By default, it is set to no-op.<br />
 
-    * Access Popper.js instance with `data.instance`.
 
-    * @prop {onCreate}
 
-    */
 
-   onCreate: function onCreate() {},
 
-   /**
 
-    * Callback called when the popper is updated. This callback is not called
 
-    * on the initialization/creation of the popper, but only on subsequent
 
-    * updates.<br />
 
-    * By default, it is set to no-op.<br />
 
-    * Access Popper.js instance with `data.instance`.
 
-    * @prop {onUpdate}
 
-    */
 
-   onUpdate: function onUpdate() {},
 
-   /**
 
-    * List of modifiers used to modify the offsets before they are applied to the popper.
 
-    * They provide most of the functionalities of Popper.js.
 
-    * @prop {modifiers}
 
-    */
 
-   modifiers: modifiers
 
- };
 
- /**
 
-  * @callback onCreate
 
-  * @param {dataObject} data
 
-  */
 
- /**
 
-  * @callback onUpdate
 
-  * @param {dataObject} data
 
-  */
 
- // Utils
 
- // Methods
 
- var Popper = function () {
 
-   /**
 
-    * Creates a new Popper.js instance.
 
-    * @class Popper
 
-    * @param {Element|referenceObject} reference - The reference element used to position the popper
 
-    * @param {Element} popper - The HTML / XML element used as the popper
 
-    * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)
 
-    * @return {Object} instance - The generated Popper.js instance
 
-    */
 
-   function Popper(reference, popper) {
 
-     var _this = this;
 
-     var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
 
-     classCallCheck(this, Popper);
 
-     this.scheduleUpdate = function () {
 
-       return requestAnimationFrame(_this.update);
 
-     };
 
-     // make update() debounced, so that it only runs at most once-per-tick
 
-     this.update = debounce(this.update.bind(this));
 
-     // with {} we create a new object with the options inside it
 
-     this.options = _extends({}, Popper.Defaults, options);
 
-     // init state
 
-     this.state = {
 
-       isDestroyed: false,
 
-       isCreated: false,
 
-       scrollParents: []
 
-     };
 
-     // get reference and popper elements (allow jQuery wrappers)
 
-     this.reference = reference && reference.jquery ? reference[0] : reference;
 
-     this.popper = popper && popper.jquery ? popper[0] : popper;
 
-     // Deep merge modifiers options
 
-     this.options.modifiers = {};
 
-     Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {
 
-       _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});
 
-     });
 
-     // Refactoring modifiers' list (Object => Array)
 
-     this.modifiers = Object.keys(this.options.modifiers).map(function (name) {
 
-       return _extends({
 
-         name: name
 
-       }, _this.options.modifiers[name]);
 
-     })
 
-     // sort the modifiers by order
 
-     .sort(function (a, b) {
 
-       return a.order - b.order;
 
-     });
 
-     // modifiers have the ability to execute arbitrary code when Popper.js get inited
 
-     // such code is executed in the same order of its modifier
 
-     // they could add new properties to their options configuration
 
-     // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!
 
-     this.modifiers.forEach(function (modifierOptions) {
 
-       if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {
 
-         modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);
 
-       }
 
-     });
 
-     // fire the first update to position the popper in the right place
 
-     this.update();
 
-     var eventsEnabled = this.options.eventsEnabled;
 
-     if (eventsEnabled) {
 
-       // setup event listeners, they will take care of update the position in specific situations
 
-       this.enableEventListeners();
 
-     }
 
-     this.state.eventsEnabled = eventsEnabled;
 
-   }
 
-   // We can't use class properties because they don't get listed in the
 
-   // class prototype and break stuff like Sinon stubs
 
-   createClass(Popper, [{
 
-     key: 'update',
 
-     value: function update$$1() {
 
-       return update.call(this);
 
-     }
 
-   }, {
 
-     key: 'destroy',
 
-     value: function destroy$$1() {
 
-       return destroy.call(this);
 
-     }
 
-   }, {
 
-     key: 'enableEventListeners',
 
-     value: function enableEventListeners$$1() {
 
-       return enableEventListeners.call(this);
 
-     }
 
-   }, {
 
-     key: 'disableEventListeners',
 
-     value: function disableEventListeners$$1() {
 
-       return disableEventListeners.call(this);
 
-     }
 
-     /**
 
-      * Schedules an update. It will run on the next UI update available.
 
-      * @method scheduleUpdate
 
-      * @memberof Popper
 
-      */
 
-     /**
 
-      * Collection of utilities useful when writing custom modifiers.
 
-      * Starting from version 1.7, this method is available only if you
 
-      * include `popper-utils.js` before `popper.js`.
 
-      *
 
-      * **DEPRECATION**: This way to access PopperUtils is deprecated
 
-      * and will be removed in v2! Use the PopperUtils module directly instead.
 
-      * Due to the high instability of the methods contained in Utils, we can't
 
-      * guarantee them to follow semver. Use them at your own risk!
 
-      * @static
 
-      * @private
 
-      * @type {Object}
 
-      * @deprecated since version 1.8
 
-      * @member Utils
 
-      * @memberof Popper
 
-      */
 
-   }]);
 
-   return Popper;
 
- }();
 
- /**
 
-  * The `referenceObject` is an object that provides an interface compatible with Popper.js
 
-  * and lets you use it as replacement of a real DOM node.<br />
 
-  * You can use this method to position a popper relatively to a set of coordinates
 
-  * in case you don't have a DOM node to use as reference.
 
-  *
 
-  * ```
 
-  * new Popper(referenceObject, popperNode);
 
-  * ```
 
-  *
 
-  * NB: This feature isn't supported in Internet Explorer 10.
 
-  * @name referenceObject
 
-  * @property {Function} data.getBoundingClientRect
 
-  * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.
 
-  * @property {number} data.clientWidth
 
-  * An ES6 getter that will return the width of the virtual reference element.
 
-  * @property {number} data.clientHeight
 
-  * An ES6 getter that will return the height of the virtual reference element.
 
-  */
 
- Popper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;
 
- Popper.placements = placements;
 
- Popper.Defaults = Defaults;
 
- return Popper;
 
- })));
 
- //# sourceMappingURL=popper.js.map
 
- /*!
 
-   * Bootstrap v4.3.1 (https://getbootstrap.com/)
 
-   * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
 
-   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
-   */
 
- (function (global, factory) {
 
-   typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery'), require('popper.js')) :
 
-   typeof define === 'function' && define.amd ? define(['exports', 'jquery', 'popper.js'], factory) :
 
-   (global = global || self, factory(global.bootstrap = {}, global.jQuery, global.Popper));
 
- }(this, function (exports, $, Popper) { 'use strict';
 
-   $ = $ && $.hasOwnProperty('default') ? $['default'] : $;
 
-   Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper;
 
-   function _defineProperties(target, props) {
 
-     for (var i = 0; i < props.length; i++) {
 
-       var descriptor = props[i];
 
-       descriptor.enumerable = descriptor.enumerable || false;
 
-       descriptor.configurable = true;
 
-       if ("value" in descriptor) descriptor.writable = true;
 
-       Object.defineProperty(target, descriptor.key, descriptor);
 
-     }
 
-   }
 
-   function _createClass(Constructor, protoProps, staticProps) {
 
-     if (protoProps) _defineProperties(Constructor.prototype, protoProps);
 
-     if (staticProps) _defineProperties(Constructor, staticProps);
 
-     return Constructor;
 
-   }
 
-   function _defineProperty(obj, key, value) {
 
-     if (key in obj) {
 
-       Object.defineProperty(obj, key, {
 
-         value: value,
 
-         enumerable: true,
 
-         configurable: true,
 
-         writable: true
 
-       });
 
-     } else {
 
-       obj[key] = value;
 
-     }
 
-     return obj;
 
-   }
 
-   function _objectSpread(target) {
 
-     for (var i = 1; i < arguments.length; i++) {
 
-       var source = arguments[i] != null ? arguments[i] : {};
 
-       var ownKeys = Object.keys(source);
 
-       if (typeof Object.getOwnPropertySymbols === 'function') {
 
-         ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
 
-           return Object.getOwnPropertyDescriptor(source, sym).enumerable;
 
-         }));
 
-       }
 
-       ownKeys.forEach(function (key) {
 
-         _defineProperty(target, key, source[key]);
 
-       });
 
-     }
 
-     return target;
 
-   }
 
-   function _inheritsLoose(subClass, superClass) {
 
-     subClass.prototype = Object.create(superClass.prototype);
 
-     subClass.prototype.constructor = subClass;
 
-     subClass.__proto__ = superClass;
 
-   }
 
-   /**
 
-    * --------------------------------------------------------------------------
 
-    * Bootstrap (v4.3.1): util.js
 
-    * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
-    * --------------------------------------------------------------------------
 
-    */
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * Private TransitionEnd Helpers
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   var TRANSITION_END = 'transitionend';
 
-   var MAX_UID = 1000000;
 
-   var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
 
-   function toType(obj) {
 
-     return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
 
-   }
 
-   function getSpecialTransitionEndEvent() {
 
-     return {
 
-       bindType: TRANSITION_END,
 
-       delegateType: TRANSITION_END,
 
-       handle: function handle(event) {
 
-         if ($(event.target).is(this)) {
 
-           return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params
 
-         }
 
-         return undefined; // eslint-disable-line no-undefined
 
-       }
 
-     };
 
-   }
 
-   function transitionEndEmulator(duration) {
 
-     var _this = this;
 
-     var called = false;
 
-     $(this).one(Util.TRANSITION_END, function () {
 
-       called = true;
 
-     });
 
-     setTimeout(function () {
 
-       if (!called) {
 
-         Util.triggerTransitionEnd(_this);
 
-       }
 
-     }, duration);
 
-     return this;
 
-   }
 
-   function setTransitionEndSupport() {
 
-     $.fn.emulateTransitionEnd = transitionEndEmulator;
 
-     $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();
 
-   }
 
-   /**
 
-    * --------------------------------------------------------------------------
 
-    * Public Util Api
 
-    * --------------------------------------------------------------------------
 
-    */
 
-   var Util = {
 
-     TRANSITION_END: 'bsTransitionEnd',
 
-     getUID: function getUID(prefix) {
 
-       do {
 
-         // eslint-disable-next-line no-bitwise
 
-         prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here
 
-       } while (document.getElementById(prefix));
 
-       return prefix;
 
-     },
 
-     getSelectorFromElement: function getSelectorFromElement(element) {
 
-       var selector = element.getAttribute('data-target');
 
-       if (!selector || selector === '#') {
 
-         var hrefAttr = element.getAttribute('href');
 
-         selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : '';
 
-       }
 
-       try {
 
-         return document.querySelector(selector) ? selector : null;
 
-       } catch (err) {
 
-         return null;
 
-       }
 
-     },
 
-     getTransitionDurationFromElement: function getTransitionDurationFromElement(element) {
 
-       if (!element) {
 
-         return 0;
 
-       } // Get transition-duration of the element
 
-       var transitionDuration = $(element).css('transition-duration');
 
-       var transitionDelay = $(element).css('transition-delay');
 
-       var floatTransitionDuration = parseFloat(transitionDuration);
 
-       var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
 
-       if (!floatTransitionDuration && !floatTransitionDelay) {
 
-         return 0;
 
-       } // If multiple durations are defined, take the first
 
-       transitionDuration = transitionDuration.split(',')[0];
 
-       transitionDelay = transitionDelay.split(',')[0];
 
-       return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
 
-     },
 
-     reflow: function reflow(element) {
 
-       return element.offsetHeight;
 
-     },
 
-     triggerTransitionEnd: function triggerTransitionEnd(element) {
 
-       $(element).trigger(TRANSITION_END);
 
-     },
 
-     // TODO: Remove in v5
 
-     supportsTransitionEnd: function supportsTransitionEnd() {
 
-       return Boolean(TRANSITION_END);
 
-     },
 
-     isElement: function isElement(obj) {
 
-       return (obj[0] || obj).nodeType;
 
-     },
 
-     typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {
 
-       for (var property in configTypes) {
 
-         if (Object.prototype.hasOwnProperty.call(configTypes, property)) {
 
-           var expectedTypes = configTypes[property];
 
-           var value = config[property];
 
-           var valueType = value && Util.isElement(value) ? 'element' : toType(value);
 
-           if (!new RegExp(expectedTypes).test(valueType)) {
 
-             throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\"."));
 
-           }
 
-         }
 
-       }
 
-     },
 
-     findShadowRoot: function findShadowRoot(element) {
 
-       if (!document.documentElement.attachShadow) {
 
-         return null;
 
-       } // Can find the shadow root otherwise it'll return the document
 
-       if (typeof element.getRootNode === 'function') {
 
-         var root = element.getRootNode();
 
-         return root instanceof ShadowRoot ? root : null;
 
-       }
 
-       if (element instanceof ShadowRoot) {
 
-         return element;
 
-       } // when we don't find a shadow root
 
-       if (!element.parentNode) {
 
-         return null;
 
-       }
 
-       return Util.findShadowRoot(element.parentNode);
 
-     }
 
-   };
 
-   setTransitionEndSupport();
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * Constants
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   var NAME = 'alert';
 
-   var VERSION = '4.3.1';
 
-   var DATA_KEY = 'bs.alert';
 
-   var EVENT_KEY = "." + DATA_KEY;
 
-   var DATA_API_KEY = '.data-api';
 
-   var JQUERY_NO_CONFLICT = $.fn[NAME];
 
-   var Selector = {
 
-     DISMISS: '[data-dismiss="alert"]'
 
-   };
 
-   var Event = {
 
-     CLOSE: "close" + EVENT_KEY,
 
-     CLOSED: "closed" + EVENT_KEY,
 
-     CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
 
-   };
 
-   var ClassName = {
 
-     ALERT: 'alert',
 
-     FADE: 'fade',
 
-     SHOW: 'show'
 
-     /**
 
-      * ------------------------------------------------------------------------
 
-      * Class Definition
 
-      * ------------------------------------------------------------------------
 
-      */
 
-   };
 
-   var Alert =
 
-   /*#__PURE__*/
 
-   function () {
 
-     function Alert(element) {
 
-       this._element = element;
 
-     } // Getters
 
-     var _proto = Alert.prototype;
 
-     // Public
 
-     _proto.close = function close(element) {
 
-       var rootElement = this._element;
 
-       if (element) {
 
-         rootElement = this._getRootElement(element);
 
-       }
 
-       var customEvent = this._triggerCloseEvent(rootElement);
 
-       if (customEvent.isDefaultPrevented()) {
 
-         return;
 
-       }
 
-       this._removeElement(rootElement);
 
-     };
 
-     _proto.dispose = function dispose() {
 
-       $.removeData(this._element, DATA_KEY);
 
-       this._element = null;
 
-     } // Private
 
-     ;
 
-     _proto._getRootElement = function _getRootElement(element) {
 
-       var selector = Util.getSelectorFromElement(element);
 
-       var parent = false;
 
-       if (selector) {
 
-         parent = document.querySelector(selector);
 
-       }
 
-       if (!parent) {
 
-         parent = $(element).closest("." + ClassName.ALERT)[0];
 
-       }
 
-       return parent;
 
-     };
 
-     _proto._triggerCloseEvent = function _triggerCloseEvent(element) {
 
-       var closeEvent = $.Event(Event.CLOSE);
 
-       $(element).trigger(closeEvent);
 
-       return closeEvent;
 
-     };
 
-     _proto._removeElement = function _removeElement(element) {
 
-       var _this = this;
 
-       $(element).removeClass(ClassName.SHOW);
 
-       if (!$(element).hasClass(ClassName.FADE)) {
 
-         this._destroyElement(element);
 
-         return;
 
-       }
 
-       var transitionDuration = Util.getTransitionDurationFromElement(element);
 
-       $(element).one(Util.TRANSITION_END, function (event) {
 
-         return _this._destroyElement(element, event);
 
-       }).emulateTransitionEnd(transitionDuration);
 
-     };
 
-     _proto._destroyElement = function _destroyElement(element) {
 
-       $(element).detach().trigger(Event.CLOSED).remove();
 
-     } // Static
 
-     ;
 
-     Alert._jQueryInterface = function _jQueryInterface(config) {
 
-       return this.each(function () {
 
-         var $element = $(this);
 
-         var data = $element.data(DATA_KEY);
 
-         if (!data) {
 
-           data = new Alert(this);
 
-           $element.data(DATA_KEY, data);
 
-         }
 
-         if (config === 'close') {
 
-           data[config](this);
 
-         }
 
-       });
 
-     };
 
-     Alert._handleDismiss = function _handleDismiss(alertInstance) {
 
-       return function (event) {
 
-         if (event) {
 
-           event.preventDefault();
 
-         }
 
-         alertInstance.close(this);
 
-       };
 
-     };
 
-     _createClass(Alert, null, [{
 
-       key: "VERSION",
 
-       get: function get() {
 
-         return VERSION;
 
-       }
 
-     }]);
 
-     return Alert;
 
-   }();
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * Data Api implementation
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   $(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * jQuery
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   $.fn[NAME] = Alert._jQueryInterface;
 
-   $.fn[NAME].Constructor = Alert;
 
-   $.fn[NAME].noConflict = function () {
 
-     $.fn[NAME] = JQUERY_NO_CONFLICT;
 
-     return Alert._jQueryInterface;
 
-   };
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * Constants
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   var NAME$1 = 'button';
 
-   var VERSION$1 = '4.3.1';
 
-   var DATA_KEY$1 = 'bs.button';
 
-   var EVENT_KEY$1 = "." + DATA_KEY$1;
 
-   var DATA_API_KEY$1 = '.data-api';
 
-   var JQUERY_NO_CONFLICT$1 = $.fn[NAME$1];
 
-   var ClassName$1 = {
 
-     ACTIVE: 'active',
 
-     BUTTON: 'btn',
 
-     FOCUS: 'focus'
 
-   };
 
-   var Selector$1 = {
 
-     DATA_TOGGLE_CARROT: '[data-toggle^="button"]',
 
-     DATA_TOGGLE: '[data-toggle="buttons"]',
 
-     INPUT: 'input:not([type="hidden"])',
 
-     ACTIVE: '.active',
 
-     BUTTON: '.btn'
 
-   };
 
-   var Event$1 = {
 
-     CLICK_DATA_API: "click" + EVENT_KEY$1 + DATA_API_KEY$1,
 
-     FOCUS_BLUR_DATA_API: "focus" + EVENT_KEY$1 + DATA_API_KEY$1 + " " + ("blur" + EVENT_KEY$1 + DATA_API_KEY$1)
 
-     /**
 
-      * ------------------------------------------------------------------------
 
-      * Class Definition
 
-      * ------------------------------------------------------------------------
 
-      */
 
-   };
 
-   var Button =
 
-   /*#__PURE__*/
 
-   function () {
 
-     function Button(element) {
 
-       this._element = element;
 
-     } // Getters
 
-     var _proto = Button.prototype;
 
-     // Public
 
-     _proto.toggle = function toggle() {
 
-       var triggerChangeEvent = true;
 
-       var addAriaPressed = true;
 
-       var rootElement = $(this._element).closest(Selector$1.DATA_TOGGLE)[0];
 
-       if (rootElement) {
 
-         var input = this._element.querySelector(Selector$1.INPUT);
 
-         if (input) {
 
-           if (input.type === 'radio') {
 
-             if (input.checked && this._element.classList.contains(ClassName$1.ACTIVE)) {
 
-               triggerChangeEvent = false;
 
-             } else {
 
-               var activeElement = rootElement.querySelector(Selector$1.ACTIVE);
 
-               if (activeElement) {
 
-                 $(activeElement).removeClass(ClassName$1.ACTIVE);
 
-               }
 
-             }
 
-           }
 
-           if (triggerChangeEvent) {
 
-             if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) {
 
-               return;
 
-             }
 
-             input.checked = !this._element.classList.contains(ClassName$1.ACTIVE);
 
-             $(input).trigger('change');
 
-           }
 
-           input.focus();
 
-           addAriaPressed = false;
 
-         }
 
-       }
 
-       if (addAriaPressed) {
 
-         this._element.setAttribute('aria-pressed', !this._element.classList.contains(ClassName$1.ACTIVE));
 
-       }
 
-       if (triggerChangeEvent) {
 
-         $(this._element).toggleClass(ClassName$1.ACTIVE);
 
-       }
 
-     };
 
-     _proto.dispose = function dispose() {
 
-       $.removeData(this._element, DATA_KEY$1);
 
-       this._element = null;
 
-     } // Static
 
-     ;
 
-     Button._jQueryInterface = function _jQueryInterface(config) {
 
-       return this.each(function () {
 
-         var data = $(this).data(DATA_KEY$1);
 
-         if (!data) {
 
-           data = new Button(this);
 
-           $(this).data(DATA_KEY$1, data);
 
-         }
 
-         if (config === 'toggle') {
 
-           data[config]();
 
-         }
 
-       });
 
-     };
 
-     _createClass(Button, null, [{
 
-       key: "VERSION",
 
-       get: function get() {
 
-         return VERSION$1;
 
-       }
 
-     }]);
 
-     return Button;
 
-   }();
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * Data Api implementation
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   $(document).on(Event$1.CLICK_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {
 
-     event.preventDefault();
 
-     var button = event.target;
 
-     if (!$(button).hasClass(ClassName$1.BUTTON)) {
 
-       button = $(button).closest(Selector$1.BUTTON);
 
-     }
 
-     Button._jQueryInterface.call($(button), 'toggle');
 
-   }).on(Event$1.FOCUS_BLUR_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {
 
-     var button = $(event.target).closest(Selector$1.BUTTON)[0];
 
-     $(button).toggleClass(ClassName$1.FOCUS, /^focus(in)?$/.test(event.type));
 
-   });
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * jQuery
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   $.fn[NAME$1] = Button._jQueryInterface;
 
-   $.fn[NAME$1].Constructor = Button;
 
-   $.fn[NAME$1].noConflict = function () {
 
-     $.fn[NAME$1] = JQUERY_NO_CONFLICT$1;
 
-     return Button._jQueryInterface;
 
-   };
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * Constants
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   var NAME$2 = 'carousel';
 
-   var VERSION$2 = '4.3.1';
 
-   var DATA_KEY$2 = 'bs.carousel';
 
-   var EVENT_KEY$2 = "." + DATA_KEY$2;
 
-   var DATA_API_KEY$2 = '.data-api';
 
-   var JQUERY_NO_CONFLICT$2 = $.fn[NAME$2];
 
-   var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key
 
-   var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key
 
-   var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch
 
-   var SWIPE_THRESHOLD = 40;
 
-   var Default = {
 
-     interval: 5000,
 
-     keyboard: true,
 
-     slide: false,
 
-     pause: 'hover',
 
-     wrap: true,
 
-     touch: true
 
-   };
 
-   var DefaultType = {
 
-     interval: '(number|boolean)',
 
-     keyboard: 'boolean',
 
-     slide: '(boolean|string)',
 
-     pause: '(string|boolean)',
 
-     wrap: 'boolean',
 
-     touch: 'boolean'
 
-   };
 
-   var Direction = {
 
-     NEXT: 'next',
 
-     PREV: 'prev',
 
-     LEFT: 'left',
 
-     RIGHT: 'right'
 
-   };
 
-   var Event$2 = {
 
-     SLIDE: "slide" + EVENT_KEY$2,
 
-     SLID: "slid" + EVENT_KEY$2,
 
-     KEYDOWN: "keydown" + EVENT_KEY$2,
 
-     MOUSEENTER: "mouseenter" + EVENT_KEY$2,
 
-     MOUSELEAVE: "mouseleave" + EVENT_KEY$2,
 
-     TOUCHSTART: "touchstart" + EVENT_KEY$2,
 
-     TOUCHMOVE: "touchmove" + EVENT_KEY$2,
 
-     TOUCHEND: "touchend" + EVENT_KEY$2,
 
-     POINTERDOWN: "pointerdown" + EVENT_KEY$2,
 
-     POINTERUP: "pointerup" + EVENT_KEY$2,
 
-     DRAG_START: "dragstart" + EVENT_KEY$2,
 
-     LOAD_DATA_API: "load" + EVENT_KEY$2 + DATA_API_KEY$2,
 
-     CLICK_DATA_API: "click" + EVENT_KEY$2 + DATA_API_KEY$2
 
-   };
 
-   var ClassName$2 = {
 
-     CAROUSEL: 'carousel',
 
-     ACTIVE: 'active',
 
-     SLIDE: 'slide',
 
-     RIGHT: 'carousel-item-right',
 
-     LEFT: 'carousel-item-left',
 
-     NEXT: 'carousel-item-next',
 
-     PREV: 'carousel-item-prev',
 
-     ITEM: 'carousel-item',
 
-     POINTER_EVENT: 'pointer-event'
 
-   };
 
-   var Selector$2 = {
 
-     ACTIVE: '.active',
 
-     ACTIVE_ITEM: '.active.carousel-item',
 
-     ITEM: '.carousel-item',
 
-     ITEM_IMG: '.carousel-item img',
 
-     NEXT_PREV: '.carousel-item-next, .carousel-item-prev',
 
-     INDICATORS: '.carousel-indicators',
 
-     DATA_SLIDE: '[data-slide], [data-slide-to]',
 
-     DATA_RIDE: '[data-ride="carousel"]'
 
-   };
 
-   var PointerType = {
 
-     TOUCH: 'touch',
 
-     PEN: 'pen'
 
-     /**
 
-      * ------------------------------------------------------------------------
 
-      * Class Definition
 
-      * ------------------------------------------------------------------------
 
-      */
 
-   };
 
-   var Carousel =
 
-   /*#__PURE__*/
 
-   function () {
 
-     function Carousel(element, config) {
 
-       this._items = null;
 
-       this._interval = null;
 
-       this._activeElement = null;
 
-       this._isPaused = false;
 
-       this._isSliding = false;
 
-       this.touchTimeout = null;
 
-       this.touchStartX = 0;
 
-       this.touchDeltaX = 0;
 
-       this._config = this._getConfig(config);
 
-       this._element = element;
 
-       this._indicatorsElement = this._element.querySelector(Selector$2.INDICATORS);
 
-       this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;
 
-       this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent);
 
-       this._addEventListeners();
 
-     } // Getters
 
-     var _proto = Carousel.prototype;
 
-     // Public
 
-     _proto.next = function next() {
 
-       if (!this._isSliding) {
 
-         this._slide(Direction.NEXT);
 
-       }
 
-     };
 
-     _proto.nextWhenVisible = function nextWhenVisible() {
 
-       // Don't call next when the page isn't visible
 
-       // or the carousel or its parent isn't visible
 
-       if (!document.hidden && $(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden') {
 
-         this.next();
 
-       }
 
-     };
 
-     _proto.prev = function prev() {
 
-       if (!this._isSliding) {
 
-         this._slide(Direction.PREV);
 
-       }
 
-     };
 
-     _proto.pause = function pause(event) {
 
-       if (!event) {
 
-         this._isPaused = true;
 
-       }
 
-       if (this._element.querySelector(Selector$2.NEXT_PREV)) {
 
-         Util.triggerTransitionEnd(this._element);
 
-         this.cycle(true);
 
-       }
 
-       clearInterval(this._interval);
 
-       this._interval = null;
 
-     };
 
-     _proto.cycle = function cycle(event) {
 
-       if (!event) {
 
-         this._isPaused = false;
 
-       }
 
-       if (this._interval) {
 
-         clearInterval(this._interval);
 
-         this._interval = null;
 
-       }
 
-       if (this._config.interval && !this._isPaused) {
 
-         this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);
 
-       }
 
-     };
 
-     _proto.to = function to(index) {
 
-       var _this = this;
 
-       this._activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM);
 
-       var activeIndex = this._getItemIndex(this._activeElement);
 
-       if (index > this._items.length - 1 || index < 0) {
 
-         return;
 
-       }
 
-       if (this._isSliding) {
 
-         $(this._element).one(Event$2.SLID, function () {
 
-           return _this.to(index);
 
-         });
 
-         return;
 
-       }
 
-       if (activeIndex === index) {
 
-         this.pause();
 
-         this.cycle();
 
-         return;
 
-       }
 
-       var direction = index > activeIndex ? Direction.NEXT : Direction.PREV;
 
-       this._slide(direction, this._items[index]);
 
-     };
 
-     _proto.dispose = function dispose() {
 
-       $(this._element).off(EVENT_KEY$2);
 
-       $.removeData(this._element, DATA_KEY$2);
 
-       this._items = null;
 
-       this._config = null;
 
-       this._element = null;
 
-       this._interval = null;
 
-       this._isPaused = null;
 
-       this._isSliding = null;
 
-       this._activeElement = null;
 
-       this._indicatorsElement = null;
 
-     } // Private
 
-     ;
 
-     _proto._getConfig = function _getConfig(config) {
 
-       config = _objectSpread({}, Default, config);
 
-       Util.typeCheckConfig(NAME$2, config, DefaultType);
 
-       return config;
 
-     };
 
-     _proto._handleSwipe = function _handleSwipe() {
 
-       var absDeltax = Math.abs(this.touchDeltaX);
 
-       if (absDeltax <= SWIPE_THRESHOLD) {
 
-         return;
 
-       }
 
-       var direction = absDeltax / this.touchDeltaX; // swipe left
 
-       if (direction > 0) {
 
-         this.prev();
 
-       } // swipe right
 
-       if (direction < 0) {
 
-         this.next();
 
-       }
 
-     };
 
-     _proto._addEventListeners = function _addEventListeners() {
 
-       var _this2 = this;
 
-       if (this._config.keyboard) {
 
-         $(this._element).on(Event$2.KEYDOWN, function (event) {
 
-           return _this2._keydown(event);
 
-         });
 
-       }
 
-       if (this._config.pause === 'hover') {
 
-         $(this._element).on(Event$2.MOUSEENTER, function (event) {
 
-           return _this2.pause(event);
 
-         }).on(Event$2.MOUSELEAVE, function (event) {
 
-           return _this2.cycle(event);
 
-         });
 
-       }
 
-       if (this._config.touch) {
 
-         this._addTouchEventListeners();
 
-       }
 
-     };
 
-     _proto._addTouchEventListeners = function _addTouchEventListeners() {
 
-       var _this3 = this;
 
-       if (!this._touchSupported) {
 
-         return;
 
-       }
 
-       var start = function start(event) {
 
-         if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {
 
-           _this3.touchStartX = event.originalEvent.clientX;
 
-         } else if (!_this3._pointerEvent) {
 
-           _this3.touchStartX = event.originalEvent.touches[0].clientX;
 
-         }
 
-       };
 
-       var move = function move(event) {
 
-         // ensure swiping with one touch and not pinching
 
-         if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {
 
-           _this3.touchDeltaX = 0;
 
-         } else {
 
-           _this3.touchDeltaX = event.originalEvent.touches[0].clientX - _this3.touchStartX;
 
-         }
 
-       };
 
-       var end = function end(event) {
 
-         if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {
 
-           _this3.touchDeltaX = event.originalEvent.clientX - _this3.touchStartX;
 
-         }
 
-         _this3._handleSwipe();
 
-         if (_this3._config.pause === 'hover') {
 
-           // If it's a touch-enabled device, mouseenter/leave are fired as
 
-           // part of the mouse compatibility events on first tap - the carousel
 
-           // would stop cycling until user tapped out of it;
 
-           // here, we listen for touchend, explicitly pause the carousel
 
-           // (as if it's the second time we tap on it, mouseenter compat event
 
-           // is NOT fired) and after a timeout (to allow for mouse compatibility
 
-           // events to fire) we explicitly restart cycling
 
-           _this3.pause();
 
-           if (_this3.touchTimeout) {
 
-             clearTimeout(_this3.touchTimeout);
 
-           }
 
-           _this3.touchTimeout = setTimeout(function (event) {
 
-             return _this3.cycle(event);
 
-           }, TOUCHEVENT_COMPAT_WAIT + _this3._config.interval);
 
-         }
 
-       };
 
-       $(this._element.querySelectorAll(Selector$2.ITEM_IMG)).on(Event$2.DRAG_START, function (e) {
 
-         return e.preventDefault();
 
-       });
 
-       if (this._pointerEvent) {
 
-         $(this._element).on(Event$2.POINTERDOWN, function (event) {
 
-           return start(event);
 
-         });
 
-         $(this._element).on(Event$2.POINTERUP, function (event) {
 
-           return end(event);
 
-         });
 
-         this._element.classList.add(ClassName$2.POINTER_EVENT);
 
-       } else {
 
-         $(this._element).on(Event$2.TOUCHSTART, function (event) {
 
-           return start(event);
 
-         });
 
-         $(this._element).on(Event$2.TOUCHMOVE, function (event) {
 
-           return move(event);
 
-         });
 
-         $(this._element).on(Event$2.TOUCHEND, function (event) {
 
-           return end(event);
 
-         });
 
-       }
 
-     };
 
-     _proto._keydown = function _keydown(event) {
 
-       if (/input|textarea/i.test(event.target.tagName)) {
 
-         return;
 
-       }
 
-       switch (event.which) {
 
-         case ARROW_LEFT_KEYCODE:
 
-           event.preventDefault();
 
-           this.prev();
 
-           break;
 
-         case ARROW_RIGHT_KEYCODE:
 
-           event.preventDefault();
 
-           this.next();
 
-           break;
 
-         default:
 
-       }
 
-     };
 
-     _proto._getItemIndex = function _getItemIndex(element) {
 
-       this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(Selector$2.ITEM)) : [];
 
-       return this._items.indexOf(element);
 
-     };
 
-     _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) {
 
-       var isNextDirection = direction === Direction.NEXT;
 
-       var isPrevDirection = direction === Direction.PREV;
 
-       var activeIndex = this._getItemIndex(activeElement);
 
-       var lastItemIndex = this._items.length - 1;
 
-       var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;
 
-       if (isGoingToWrap && !this._config.wrap) {
 
-         return activeElement;
 
-       }
 
-       var delta = direction === Direction.PREV ? -1 : 1;
 
-       var itemIndex = (activeIndex + delta) % this._items.length;
 
-       return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];
 
-     };
 
-     _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {
 
-       var targetIndex = this._getItemIndex(relatedTarget);
 
-       var fromIndex = this._getItemIndex(this._element.querySelector(Selector$2.ACTIVE_ITEM));
 
-       var slideEvent = $.Event(Event$2.SLIDE, {
 
-         relatedTarget: relatedTarget,
 
-         direction: eventDirectionName,
 
-         from: fromIndex,
 
-         to: targetIndex
 
-       });
 
-       $(this._element).trigger(slideEvent);
 
-       return slideEvent;
 
-     };
 
-     _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {
 
-       if (this._indicatorsElement) {
 
-         var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector$2.ACTIVE));
 
-         $(indicators).removeClass(ClassName$2.ACTIVE);
 
-         var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];
 
-         if (nextIndicator) {
 
-           $(nextIndicator).addClass(ClassName$2.ACTIVE);
 
-         }
 
-       }
 
-     };
 
-     _proto._slide = function _slide(direction, element) {
 
-       var _this4 = this;
 
-       var activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM);
 
-       var activeElementIndex = this._getItemIndex(activeElement);
 
-       var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);
 
-       var nextElementIndex = this._getItemIndex(nextElement);
 
-       var isCycling = Boolean(this._interval);
 
-       var directionalClassName;
 
-       var orderClassName;
 
-       var eventDirectionName;
 
-       if (direction === Direction.NEXT) {
 
-         directionalClassName = ClassName$2.LEFT;
 
-         orderClassName = ClassName$2.NEXT;
 
-         eventDirectionName = Direction.LEFT;
 
-       } else {
 
-         directionalClassName = ClassName$2.RIGHT;
 
-         orderClassName = ClassName$2.PREV;
 
-         eventDirectionName = Direction.RIGHT;
 
-       }
 
-       if (nextElement && $(nextElement).hasClass(ClassName$2.ACTIVE)) {
 
-         this._isSliding = false;
 
-         return;
 
-       }
 
-       var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);
 
-       if (slideEvent.isDefaultPrevented()) {
 
-         return;
 
-       }
 
-       if (!activeElement || !nextElement) {
 
-         // Some weirdness is happening, so we bail
 
-         return;
 
-       }
 
-       this._isSliding = true;
 
-       if (isCycling) {
 
-         this.pause();
 
-       }
 
-       this._setActiveIndicatorElement(nextElement);
 
-       var slidEvent = $.Event(Event$2.SLID, {
 
-         relatedTarget: nextElement,
 
-         direction: eventDirectionName,
 
-         from: activeElementIndex,
 
-         to: nextElementIndex
 
-       });
 
-       if ($(this._element).hasClass(ClassName$2.SLIDE)) {
 
-         $(nextElement).addClass(orderClassName);
 
-         Util.reflow(nextElement);
 
-         $(activeElement).addClass(directionalClassName);
 
-         $(nextElement).addClass(directionalClassName);
 
-         var nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10);
 
-         if (nextElementInterval) {
 
-           this._config.defaultInterval = this._config.defaultInterval || this._config.interval;
 
-           this._config.interval = nextElementInterval;
 
-         } else {
 
-           this._config.interval = this._config.defaultInterval || this._config.interval;
 
-         }
 
-         var transitionDuration = Util.getTransitionDurationFromElement(activeElement);
 
-         $(activeElement).one(Util.TRANSITION_END, function () {
 
-           $(nextElement).removeClass(directionalClassName + " " + orderClassName).addClass(ClassName$2.ACTIVE);
 
-           $(activeElement).removeClass(ClassName$2.ACTIVE + " " + orderClassName + " " + directionalClassName);
 
-           _this4._isSliding = false;
 
-           setTimeout(function () {
 
-             return $(_this4._element).trigger(slidEvent);
 
-           }, 0);
 
-         }).emulateTransitionEnd(transitionDuration);
 
-       } else {
 
-         $(activeElement).removeClass(ClassName$2.ACTIVE);
 
-         $(nextElement).addClass(ClassName$2.ACTIVE);
 
-         this._isSliding = false;
 
-         $(this._element).trigger(slidEvent);
 
-       }
 
-       if (isCycling) {
 
-         this.cycle();
 
-       }
 
-     } // Static
 
-     ;
 
-     Carousel._jQueryInterface = function _jQueryInterface(config) {
 
-       return this.each(function () {
 
-         var data = $(this).data(DATA_KEY$2);
 
-         var _config = _objectSpread({}, Default, $(this).data());
 
-         if (typeof config === 'object') {
 
-           _config = _objectSpread({}, _config, config);
 
-         }
 
-         var action = typeof config === 'string' ? config : _config.slide;
 
-         if (!data) {
 
-           data = new Carousel(this, _config);
 
-           $(this).data(DATA_KEY$2, data);
 
-         }
 
-         if (typeof config === 'number') {
 
-           data.to(config);
 
-         } else if (typeof action === 'string') {
 
-           if (typeof data[action] === 'undefined') {
 
-             throw new TypeError("No method named \"" + action + "\"");
 
-           }
 
-           data[action]();
 
-         } else if (_config.interval && _config.ride) {
 
-           data.pause();
 
-           data.cycle();
 
-         }
 
-       });
 
-     };
 
-     Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {
 
-       var selector = Util.getSelectorFromElement(this);
 
-       if (!selector) {
 
-         return;
 
-       }
 
-       var target = $(selector)[0];
 
-       if (!target || !$(target).hasClass(ClassName$2.CAROUSEL)) {
 
-         return;
 
-       }
 
-       var config = _objectSpread({}, $(target).data(), $(this).data());
 
-       var slideIndex = this.getAttribute('data-slide-to');
 
-       if (slideIndex) {
 
-         config.interval = false;
 
-       }
 
-       Carousel._jQueryInterface.call($(target), config);
 
-       if (slideIndex) {
 
-         $(target).data(DATA_KEY$2).to(slideIndex);
 
-       }
 
-       event.preventDefault();
 
-     };
 
-     _createClass(Carousel, null, [{
 
-       key: "VERSION",
 
-       get: function get() {
 
-         return VERSION$2;
 
-       }
 
-     }, {
 
-       key: "Default",
 
-       get: function get() {
 
-         return Default;
 
-       }
 
-     }]);
 
-     return Carousel;
 
-   }();
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * Data Api implementation
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   $(document).on(Event$2.CLICK_DATA_API, Selector$2.DATA_SLIDE, Carousel._dataApiClickHandler);
 
-   $(window).on(Event$2.LOAD_DATA_API, function () {
 
-     var carousels = [].slice.call(document.querySelectorAll(Selector$2.DATA_RIDE));
 
-     for (var i = 0, len = carousels.length; i < len; i++) {
 
-       var $carousel = $(carousels[i]);
 
-       Carousel._jQueryInterface.call($carousel, $carousel.data());
 
-     }
 
-   });
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * jQuery
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   $.fn[NAME$2] = Carousel._jQueryInterface;
 
-   $.fn[NAME$2].Constructor = Carousel;
 
-   $.fn[NAME$2].noConflict = function () {
 
-     $.fn[NAME$2] = JQUERY_NO_CONFLICT$2;
 
-     return Carousel._jQueryInterface;
 
-   };
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * Constants
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   var NAME$3 = 'collapse';
 
-   var VERSION$3 = '4.3.1';
 
-   var DATA_KEY$3 = 'bs.collapse';
 
-   var EVENT_KEY$3 = "." + DATA_KEY$3;
 
-   var DATA_API_KEY$3 = '.data-api';
 
-   var JQUERY_NO_CONFLICT$3 = $.fn[NAME$3];
 
-   var Default$1 = {
 
-     toggle: true,
 
-     parent: ''
 
-   };
 
-   var DefaultType$1 = {
 
-     toggle: 'boolean',
 
-     parent: '(string|element)'
 
-   };
 
-   var Event$3 = {
 
-     SHOW: "show" + EVENT_KEY$3,
 
-     SHOWN: "shown" + EVENT_KEY$3,
 
-     HIDE: "hide" + EVENT_KEY$3,
 
-     HIDDEN: "hidden" + EVENT_KEY$3,
 
-     CLICK_DATA_API: "click" + EVENT_KEY$3 + DATA_API_KEY$3
 
-   };
 
-   var ClassName$3 = {
 
-     SHOW: 'show',
 
-     COLLAPSE: 'collapse',
 
-     COLLAPSING: 'collapsing',
 
-     COLLAPSED: 'collapsed'
 
-   };
 
-   var Dimension = {
 
-     WIDTH: 'width',
 
-     HEIGHT: 'height'
 
-   };
 
-   var Selector$3 = {
 
-     ACTIVES: '.show, .collapsing',
 
-     DATA_TOGGLE: '[data-toggle="collapse"]'
 
-     /**
 
-      * ------------------------------------------------------------------------
 
-      * Class Definition
 
-      * ------------------------------------------------------------------------
 
-      */
 
-   };
 
-   var Collapse =
 
-   /*#__PURE__*/
 
-   function () {
 
-     function Collapse(element, config) {
 
-       this._isTransitioning = false;
 
-       this._element = element;
 
-       this._config = this._getConfig(config);
 
-       this._triggerArray = [].slice.call(document.querySelectorAll("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]")));
 
-       var toggleList = [].slice.call(document.querySelectorAll(Selector$3.DATA_TOGGLE));
 
-       for (var i = 0, len = toggleList.length; i < len; i++) {
 
-         var elem = toggleList[i];
 
-         var selector = Util.getSelectorFromElement(elem);
 
-         var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) {
 
-           return foundElem === element;
 
-         });
 
-         if (selector !== null && filterElement.length > 0) {
 
-           this._selector = selector;
 
-           this._triggerArray.push(elem);
 
-         }
 
-       }
 
-       this._parent = this._config.parent ? this._getParent() : null;
 
-       if (!this._config.parent) {
 
-         this._addAriaAndCollapsedClass(this._element, this._triggerArray);
 
-       }
 
-       if (this._config.toggle) {
 
-         this.toggle();
 
-       }
 
-     } // Getters
 
-     var _proto = Collapse.prototype;
 
-     // Public
 
-     _proto.toggle = function toggle() {
 
-       if ($(this._element).hasClass(ClassName$3.SHOW)) {
 
-         this.hide();
 
-       } else {
 
-         this.show();
 
-       }
 
-     };
 
-     _proto.show = function show() {
 
-       var _this = this;
 
-       if (this._isTransitioning || $(this._element).hasClass(ClassName$3.SHOW)) {
 
-         return;
 
-       }
 
-       var actives;
 
-       var activesData;
 
-       if (this._parent) {
 
-         actives = [].slice.call(this._parent.querySelectorAll(Selector$3.ACTIVES)).filter(function (elem) {
 
-           if (typeof _this._config.parent === 'string') {
 
-             return elem.getAttribute('data-parent') === _this._config.parent;
 
-           }
 
-           return elem.classList.contains(ClassName$3.COLLAPSE);
 
-         });
 
-         if (actives.length === 0) {
 
-           actives = null;
 
-         }
 
-       }
 
-       if (actives) {
 
-         activesData = $(actives).not(this._selector).data(DATA_KEY$3);
 
-         if (activesData && activesData._isTransitioning) {
 
-           return;
 
-         }
 
-       }
 
-       var startEvent = $.Event(Event$3.SHOW);
 
-       $(this._element).trigger(startEvent);
 
-       if (startEvent.isDefaultPrevented()) {
 
-         return;
 
-       }
 
-       if (actives) {
 
-         Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide');
 
-         if (!activesData) {
 
-           $(actives).data(DATA_KEY$3, null);
 
-         }
 
-       }
 
-       var dimension = this._getDimension();
 
-       $(this._element).removeClass(ClassName$3.COLLAPSE).addClass(ClassName$3.COLLAPSING);
 
-       this._element.style[dimension] = 0;
 
-       if (this._triggerArray.length) {
 
-         $(this._triggerArray).removeClass(ClassName$3.COLLAPSED).attr('aria-expanded', true);
 
-       }
 
-       this.setTransitioning(true);
 
-       var complete = function complete() {
 
-         $(_this._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).addClass(ClassName$3.SHOW);
 
-         _this._element.style[dimension] = '';
 
-         _this.setTransitioning(false);
 
-         $(_this._element).trigger(Event$3.SHOWN);
 
-       };
 
-       var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
 
-       var scrollSize = "scroll" + capitalizedDimension;
 
-       var transitionDuration = Util.getTransitionDurationFromElement(this._element);
 
-       $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
 
-       this._element.style[dimension] = this._element[scrollSize] + "px";
 
-     };
 
-     _proto.hide = function hide() {
 
-       var _this2 = this;
 
-       if (this._isTransitioning || !$(this._element).hasClass(ClassName$3.SHOW)) {
 
-         return;
 
-       }
 
-       var startEvent = $.Event(Event$3.HIDE);
 
-       $(this._element).trigger(startEvent);
 
-       if (startEvent.isDefaultPrevented()) {
 
-         return;
 
-       }
 
-       var dimension = this._getDimension();
 
-       this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + "px";
 
-       Util.reflow(this._element);
 
-       $(this._element).addClass(ClassName$3.COLLAPSING).removeClass(ClassName$3.COLLAPSE).removeClass(ClassName$3.SHOW);
 
-       var triggerArrayLength = this._triggerArray.length;
 
-       if (triggerArrayLength > 0) {
 
-         for (var i = 0; i < triggerArrayLength; i++) {
 
-           var trigger = this._triggerArray[i];
 
-           var selector = Util.getSelectorFromElement(trigger);
 
-           if (selector !== null) {
 
-             var $elem = $([].slice.call(document.querySelectorAll(selector)));
 
-             if (!$elem.hasClass(ClassName$3.SHOW)) {
 
-               $(trigger).addClass(ClassName$3.COLLAPSED).attr('aria-expanded', false);
 
-             }
 
-           }
 
-         }
 
-       }
 
-       this.setTransitioning(true);
 
-       var complete = function complete() {
 
-         _this2.setTransitioning(false);
 
-         $(_this2._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).trigger(Event$3.HIDDEN);
 
-       };
 
-       this._element.style[dimension] = '';
 
-       var transitionDuration = Util.getTransitionDurationFromElement(this._element);
 
-       $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
 
-     };
 
-     _proto.setTransitioning = function setTransitioning(isTransitioning) {
 
-       this._isTransitioning = isTransitioning;
 
-     };
 
-     _proto.dispose = function dispose() {
 
-       $.removeData(this._element, DATA_KEY$3);
 
-       this._config = null;
 
-       this._parent = null;
 
-       this._element = null;
 
-       this._triggerArray = null;
 
-       this._isTransitioning = null;
 
-     } // Private
 
-     ;
 
-     _proto._getConfig = function _getConfig(config) {
 
-       config = _objectSpread({}, Default$1, config);
 
-       config.toggle = Boolean(config.toggle); // Coerce string values
 
-       Util.typeCheckConfig(NAME$3, config, DefaultType$1);
 
-       return config;
 
-     };
 
-     _proto._getDimension = function _getDimension() {
 
-       var hasWidth = $(this._element).hasClass(Dimension.WIDTH);
 
-       return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;
 
-     };
 
-     _proto._getParent = function _getParent() {
 
-       var _this3 = this;
 
-       var parent;
 
-       if (Util.isElement(this._config.parent)) {
 
-         parent = this._config.parent; // It's a jQuery object
 
-         if (typeof this._config.parent.jquery !== 'undefined') {
 
-           parent = this._config.parent[0];
 
-         }
 
-       } else {
 
-         parent = document.querySelector(this._config.parent);
 
-       }
 
-       var selector = "[data-toggle=\"collapse\"][data-parent=\"" + this._config.parent + "\"]";
 
-       var children = [].slice.call(parent.querySelectorAll(selector));
 
-       $(children).each(function (i, element) {
 
-         _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);
 
-       });
 
-       return parent;
 
-     };
 
-     _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
 
-       var isOpen = $(element).hasClass(ClassName$3.SHOW);
 
-       if (triggerArray.length) {
 
-         $(triggerArray).toggleClass(ClassName$3.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
 
-       }
 
-     } // Static
 
-     ;
 
-     Collapse._getTargetFromElement = function _getTargetFromElement(element) {
 
-       var selector = Util.getSelectorFromElement(element);
 
-       return selector ? document.querySelector(selector) : null;
 
-     };
 
-     Collapse._jQueryInterface = function _jQueryInterface(config) {
 
-       return this.each(function () {
 
-         var $this = $(this);
 
-         var data = $this.data(DATA_KEY$3);
 
-         var _config = _objectSpread({}, Default$1, $this.data(), typeof config === 'object' && config ? config : {});
 
-         if (!data && _config.toggle && /show|hide/.test(config)) {
 
-           _config.toggle = false;
 
-         }
 
-         if (!data) {
 
-           data = new Collapse(this, _config);
 
-           $this.data(DATA_KEY$3, data);
 
-         }
 
-         if (typeof config === 'string') {
 
-           if (typeof data[config] === 'undefined') {
 
-             throw new TypeError("No method named \"" + config + "\"");
 
-           }
 
-           data[config]();
 
-         }
 
-       });
 
-     };
 
-     _createClass(Collapse, null, [{
 
-       key: "VERSION",
 
-       get: function get() {
 
-         return VERSION$3;
 
-       }
 
-     }, {
 
-       key: "Default",
 
-       get: function get() {
 
-         return Default$1;
 
-       }
 
-     }]);
 
-     return Collapse;
 
-   }();
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * Data Api implementation
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   $(document).on(Event$3.CLICK_DATA_API, Selector$3.DATA_TOGGLE, function (event) {
 
-     // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
 
-     if (event.currentTarget.tagName === 'A') {
 
-       event.preventDefault();
 
-     }
 
-     var $trigger = $(this);
 
-     var selector = Util.getSelectorFromElement(this);
 
-     var selectors = [].slice.call(document.querySelectorAll(selector));
 
-     $(selectors).each(function () {
 
-       var $target = $(this);
 
-       var data = $target.data(DATA_KEY$3);
 
-       var config = data ? 'toggle' : $trigger.data();
 
-       Collapse._jQueryInterface.call($target, config);
 
-     });
 
-   });
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * jQuery
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   $.fn[NAME$3] = Collapse._jQueryInterface;
 
-   $.fn[NAME$3].Constructor = Collapse;
 
-   $.fn[NAME$3].noConflict = function () {
 
-     $.fn[NAME$3] = JQUERY_NO_CONFLICT$3;
 
-     return Collapse._jQueryInterface;
 
-   };
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * Constants
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   var NAME$4 = 'dropdown';
 
-   var VERSION$4 = '4.3.1';
 
-   var DATA_KEY$4 = 'bs.dropdown';
 
-   var EVENT_KEY$4 = "." + DATA_KEY$4;
 
-   var DATA_API_KEY$4 = '.data-api';
 
-   var JQUERY_NO_CONFLICT$4 = $.fn[NAME$4];
 
-   var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
 
-   var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key
 
-   var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key
 
-   var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key
 
-   var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key
 
-   var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)
 
-   var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + "|" + ARROW_DOWN_KEYCODE + "|" + ESCAPE_KEYCODE);
 
-   var Event$4 = {
 
-     HIDE: "hide" + EVENT_KEY$4,
 
-     HIDDEN: "hidden" + EVENT_KEY$4,
 
-     SHOW: "show" + EVENT_KEY$4,
 
-     SHOWN: "shown" + EVENT_KEY$4,
 
-     CLICK: "click" + EVENT_KEY$4,
 
-     CLICK_DATA_API: "click" + EVENT_KEY$4 + DATA_API_KEY$4,
 
-     KEYDOWN_DATA_API: "keydown" + EVENT_KEY$4 + DATA_API_KEY$4,
 
-     KEYUP_DATA_API: "keyup" + EVENT_KEY$4 + DATA_API_KEY$4
 
-   };
 
-   var ClassName$4 = {
 
-     DISABLED: 'disabled',
 
-     SHOW: 'show',
 
-     DROPUP: 'dropup',
 
-     DROPRIGHT: 'dropright',
 
-     DROPLEFT: 'dropleft',
 
-     MENURIGHT: 'dropdown-menu-right',
 
-     MENULEFT: 'dropdown-menu-left',
 
-     POSITION_STATIC: 'position-static'
 
-   };
 
-   var Selector$4 = {
 
-     DATA_TOGGLE: '[data-toggle="dropdown"]',
 
-     FORM_CHILD: '.dropdown form',
 
-     MENU: '.dropdown-menu',
 
-     NAVBAR_NAV: '.navbar-nav',
 
-     VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'
 
-   };
 
-   var AttachmentMap = {
 
-     TOP: 'top-start',
 
-     TOPEND: 'top-end',
 
-     BOTTOM: 'bottom-start',
 
-     BOTTOMEND: 'bottom-end',
 
-     RIGHT: 'right-start',
 
-     RIGHTEND: 'right-end',
 
-     LEFT: 'left-start',
 
-     LEFTEND: 'left-end'
 
-   };
 
-   var Default$2 = {
 
-     offset: 0,
 
-     flip: true,
 
-     boundary: 'scrollParent',
 
-     reference: 'toggle',
 
-     display: 'dynamic'
 
-   };
 
-   var DefaultType$2 = {
 
-     offset: '(number|string|function)',
 
-     flip: 'boolean',
 
-     boundary: '(string|element)',
 
-     reference: '(string|element)',
 
-     display: 'string'
 
-     /**
 
-      * ------------------------------------------------------------------------
 
-      * Class Definition
 
-      * ------------------------------------------------------------------------
 
-      */
 
-   };
 
-   var Dropdown =
 
-   /*#__PURE__*/
 
-   function () {
 
-     function Dropdown(element, config) {
 
-       this._element = element;
 
-       this._popper = null;
 
-       this._config = this._getConfig(config);
 
-       this._menu = this._getMenuElement();
 
-       this._inNavbar = this._detectNavbar();
 
-       this._addEventListeners();
 
-     } // Getters
 
-     var _proto = Dropdown.prototype;
 
-     // Public
 
-     _proto.toggle = function toggle() {
 
-       if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED)) {
 
-         return;
 
-       }
 
-       var parent = Dropdown._getParentFromElement(this._element);
 
-       var isActive = $(this._menu).hasClass(ClassName$4.SHOW);
 
-       Dropdown._clearMenus();
 
-       if (isActive) {
 
-         return;
 
-       }
 
-       var relatedTarget = {
 
-         relatedTarget: this._element
 
-       };
 
-       var showEvent = $.Event(Event$4.SHOW, relatedTarget);
 
-       $(parent).trigger(showEvent);
 
-       if (showEvent.isDefaultPrevented()) {
 
-         return;
 
-       } // Disable totally Popper.js for Dropdown in Navbar
 
-       if (!this._inNavbar) {
 
-         /**
 
-          * Check for Popper dependency
 
-          * Popper - https://popper.js.org
 
-          */
 
-         if (typeof Popper === 'undefined') {
 
-           throw new TypeError('Bootstrap\'s dropdowns require Popper.js (https://popper.js.org/)');
 
-         }
 
-         var referenceElement = this._element;
 
-         if (this._config.reference === 'parent') {
 
-           referenceElement = parent;
 
-         } else if (Util.isElement(this._config.reference)) {
 
-           referenceElement = this._config.reference; // Check if it's jQuery element
 
-           if (typeof this._config.reference.jquery !== 'undefined') {
 
-             referenceElement = this._config.reference[0];
 
-           }
 
-         } // If boundary is not `scrollParent`, then set position to `static`
 
-         // to allow the menu to "escape" the scroll parent's boundaries
 
-         // https://github.com/twbs/bootstrap/issues/24251
 
-         if (this._config.boundary !== 'scrollParent') {
 
-           $(parent).addClass(ClassName$4.POSITION_STATIC);
 
-         }
 
-         this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig());
 
-       } // If this is a touch-enabled device we add extra
 
-       // empty mouseover listeners to the body's immediate children;
 
-       // only needed because of broken event delegation on iOS
 
-       // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
 
-       if ('ontouchstart' in document.documentElement && $(parent).closest(Selector$4.NAVBAR_NAV).length === 0) {
 
-         $(document.body).children().on('mouseover', null, $.noop);
 
-       }
 
-       this._element.focus();
 
-       this._element.setAttribute('aria-expanded', true);
 
-       $(this._menu).toggleClass(ClassName$4.SHOW);
 
-       $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));
 
-     };
 
-     _proto.show = function show() {
 
-       if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || $(this._menu).hasClass(ClassName$4.SHOW)) {
 
-         return;
 
-       }
 
-       var relatedTarget = {
 
-         relatedTarget: this._element
 
-       };
 
-       var showEvent = $.Event(Event$4.SHOW, relatedTarget);
 
-       var parent = Dropdown._getParentFromElement(this._element);
 
-       $(parent).trigger(showEvent);
 
-       if (showEvent.isDefaultPrevented()) {
 
-         return;
 
-       }
 
-       $(this._menu).toggleClass(ClassName$4.SHOW);
 
-       $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));
 
-     };
 
-     _proto.hide = function hide() {
 
-       if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || !$(this._menu).hasClass(ClassName$4.SHOW)) {
 
-         return;
 
-       }
 
-       var relatedTarget = {
 
-         relatedTarget: this._element
 
-       };
 
-       var hideEvent = $.Event(Event$4.HIDE, relatedTarget);
 
-       var parent = Dropdown._getParentFromElement(this._element);
 
-       $(parent).trigger(hideEvent);
 
-       if (hideEvent.isDefaultPrevented()) {
 
-         return;
 
-       }
 
-       $(this._menu).toggleClass(ClassName$4.SHOW);
 
-       $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));
 
-     };
 
-     _proto.dispose = function dispose() {
 
-       $.removeData(this._element, DATA_KEY$4);
 
-       $(this._element).off(EVENT_KEY$4);
 
-       this._element = null;
 
-       this._menu = null;
 
-       if (this._popper !== null) {
 
-         this._popper.destroy();
 
-         this._popper = null;
 
-       }
 
-     };
 
-     _proto.update = function update() {
 
-       this._inNavbar = this._detectNavbar();
 
-       if (this._popper !== null) {
 
-         this._popper.scheduleUpdate();
 
-       }
 
-     } // Private
 
-     ;
 
-     _proto._addEventListeners = function _addEventListeners() {
 
-       var _this = this;
 
-       $(this._element).on(Event$4.CLICK, function (event) {
 
-         event.preventDefault();
 
-         event.stopPropagation();
 
-         _this.toggle();
 
-       });
 
-     };
 
-     _proto._getConfig = function _getConfig(config) {
 
-       config = _objectSpread({}, this.constructor.Default, $(this._element).data(), config);
 
-       Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType);
 
-       return config;
 
-     };
 
-     _proto._getMenuElement = function _getMenuElement() {
 
-       if (!this._menu) {
 
-         var parent = Dropdown._getParentFromElement(this._element);
 
-         if (parent) {
 
-           this._menu = parent.querySelector(Selector$4.MENU);
 
-         }
 
-       }
 
-       return this._menu;
 
-     };
 
-     _proto._getPlacement = function _getPlacement() {
 
-       var $parentDropdown = $(this._element.parentNode);
 
-       var placement = AttachmentMap.BOTTOM; // Handle dropup
 
-       if ($parentDropdown.hasClass(ClassName$4.DROPUP)) {
 
-         placement = AttachmentMap.TOP;
 
-         if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) {
 
-           placement = AttachmentMap.TOPEND;
 
-         }
 
-       } else if ($parentDropdown.hasClass(ClassName$4.DROPRIGHT)) {
 
-         placement = AttachmentMap.RIGHT;
 
-       } else if ($parentDropdown.hasClass(ClassName$4.DROPLEFT)) {
 
-         placement = AttachmentMap.LEFT;
 
-       } else if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) {
 
-         placement = AttachmentMap.BOTTOMEND;
 
-       }
 
-       return placement;
 
-     };
 
-     _proto._detectNavbar = function _detectNavbar() {
 
-       return $(this._element).closest('.navbar').length > 0;
 
-     };
 
-     _proto._getOffset = function _getOffset() {
 
-       var _this2 = this;
 
-       var offset = {};
 
-       if (typeof this._config.offset === 'function') {
 
-         offset.fn = function (data) {
 
-           data.offsets = _objectSpread({}, data.offsets, _this2._config.offset(data.offsets, _this2._element) || {});
 
-           return data;
 
-         };
 
-       } else {
 
-         offset.offset = this._config.offset;
 
-       }
 
-       return offset;
 
-     };
 
-     _proto._getPopperConfig = function _getPopperConfig() {
 
-       var popperConfig = {
 
-         placement: this._getPlacement(),
 
-         modifiers: {
 
-           offset: this._getOffset(),
 
-           flip: {
 
-             enabled: this._config.flip
 
-           },
 
-           preventOverflow: {
 
-             boundariesElement: this._config.boundary
 
-           }
 
-         } // Disable Popper.js if we have a static display
 
-       };
 
-       if (this._config.display === 'static') {
 
-         popperConfig.modifiers.applyStyle = {
 
-           enabled: false
 
-         };
 
-       }
 
-       return popperConfig;
 
-     } // Static
 
-     ;
 
-     Dropdown._jQueryInterface = function _jQueryInterface(config) {
 
-       return this.each(function () {
 
-         var data = $(this).data(DATA_KEY$4);
 
-         var _config = typeof config === 'object' ? config : null;
 
-         if (!data) {
 
-           data = new Dropdown(this, _config);
 
-           $(this).data(DATA_KEY$4, data);
 
-         }
 
-         if (typeof config === 'string') {
 
-           if (typeof data[config] === 'undefined') {
 
-             throw new TypeError("No method named \"" + config + "\"");
 
-           }
 
-           data[config]();
 
-         }
 
-       });
 
-     };
 
-     Dropdown._clearMenus = function _clearMenus(event) {
 
-       if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {
 
-         return;
 
-       }
 
-       var toggles = [].slice.call(document.querySelectorAll(Selector$4.DATA_TOGGLE));
 
-       for (var i = 0, len = toggles.length; i < len; i++) {
 
-         var parent = Dropdown._getParentFromElement(toggles[i]);
 
-         var context = $(toggles[i]).data(DATA_KEY$4);
 
-         var relatedTarget = {
 
-           relatedTarget: toggles[i]
 
-         };
 
-         if (event && event.type === 'click') {
 
-           relatedTarget.clickEvent = event;
 
-         }
 
-         if (!context) {
 
-           continue;
 
-         }
 
-         var dropdownMenu = context._menu;
 
-         if (!$(parent).hasClass(ClassName$4.SHOW)) {
 
-           continue;
 
-         }
 
-         if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $.contains(parent, event.target)) {
 
-           continue;
 
-         }
 
-         var hideEvent = $.Event(Event$4.HIDE, relatedTarget);
 
-         $(parent).trigger(hideEvent);
 
-         if (hideEvent.isDefaultPrevented()) {
 
-           continue;
 
-         } // If this is a touch-enabled device we remove the extra
 
-         // empty mouseover listeners we added for iOS support
 
-         if ('ontouchstart' in document.documentElement) {
 
-           $(document.body).children().off('mouseover', null, $.noop);
 
-         }
 
-         toggles[i].setAttribute('aria-expanded', 'false');
 
-         $(dropdownMenu).removeClass(ClassName$4.SHOW);
 
-         $(parent).removeClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));
 
-       }
 
-     };
 
-     Dropdown._getParentFromElement = function _getParentFromElement(element) {
 
-       var parent;
 
-       var selector = Util.getSelectorFromElement(element);
 
-       if (selector) {
 
-         parent = document.querySelector(selector);
 
-       }
 
-       return parent || element.parentNode;
 
-     } // eslint-disable-next-line complexity
 
-     ;
 
-     Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {
 
-       // If not input/textarea:
 
-       //  - And not a key in REGEXP_KEYDOWN => not a dropdown command
 
-       // If input/textarea:
 
-       //  - If space key => not a dropdown command
 
-       //  - If key is other than escape
 
-       //    - If key is not up or down => not a dropdown command
 
-       //    - If trigger inside the menu => not a dropdown command
 
-       if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $(event.target).closest(Selector$4.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {
 
-         return;
 
-       }
 
-       event.preventDefault();
 
-       event.stopPropagation();
 
-       if (this.disabled || $(this).hasClass(ClassName$4.DISABLED)) {
 
-         return;
 
-       }
 
-       var parent = Dropdown._getParentFromElement(this);
 
-       var isActive = $(parent).hasClass(ClassName$4.SHOW);
 
-       if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
 
-         if (event.which === ESCAPE_KEYCODE) {
 
-           var toggle = parent.querySelector(Selector$4.DATA_TOGGLE);
 
-           $(toggle).trigger('focus');
 
-         }
 
-         $(this).trigger('click');
 
-         return;
 
-       }
 
-       var items = [].slice.call(parent.querySelectorAll(Selector$4.VISIBLE_ITEMS));
 
-       if (items.length === 0) {
 
-         return;
 
-       }
 
-       var index = items.indexOf(event.target);
 
-       if (event.which === ARROW_UP_KEYCODE && index > 0) {
 
-         // Up
 
-         index--;
 
-       }
 
-       if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {
 
-         // Down
 
-         index++;
 
-       }
 
-       if (index < 0) {
 
-         index = 0;
 
-       }
 
-       items[index].focus();
 
-     };
 
-     _createClass(Dropdown, null, [{
 
-       key: "VERSION",
 
-       get: function get() {
 
-         return VERSION$4;
 
-       }
 
-     }, {
 
-       key: "Default",
 
-       get: function get() {
 
-         return Default$2;
 
-       }
 
-     }, {
 
-       key: "DefaultType",
 
-       get: function get() {
 
-         return DefaultType$2;
 
-       }
 
-     }]);
 
-     return Dropdown;
 
-   }();
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * Data Api implementation
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   $(document).on(Event$4.KEYDOWN_DATA_API, Selector$4.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event$4.KEYDOWN_DATA_API, Selector$4.MENU, Dropdown._dataApiKeydownHandler).on(Event$4.CLICK_DATA_API + " " + Event$4.KEYUP_DATA_API, Dropdown._clearMenus).on(Event$4.CLICK_DATA_API, Selector$4.DATA_TOGGLE, function (event) {
 
-     event.preventDefault();
 
-     event.stopPropagation();
 
-     Dropdown._jQueryInterface.call($(this), 'toggle');
 
-   }).on(Event$4.CLICK_DATA_API, Selector$4.FORM_CHILD, function (e) {
 
-     e.stopPropagation();
 
-   });
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * jQuery
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   $.fn[NAME$4] = Dropdown._jQueryInterface;
 
-   $.fn[NAME$4].Constructor = Dropdown;
 
-   $.fn[NAME$4].noConflict = function () {
 
-     $.fn[NAME$4] = JQUERY_NO_CONFLICT$4;
 
-     return Dropdown._jQueryInterface;
 
-   };
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * Constants
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   var NAME$5 = 'modal';
 
-   var VERSION$5 = '4.3.1';
 
-   var DATA_KEY$5 = 'bs.modal';
 
-   var EVENT_KEY$5 = "." + DATA_KEY$5;
 
-   var DATA_API_KEY$5 = '.data-api';
 
-   var JQUERY_NO_CONFLICT$5 = $.fn[NAME$5];
 
-   var ESCAPE_KEYCODE$1 = 27; // KeyboardEvent.which value for Escape (Esc) key
 
-   var Default$3 = {
 
-     backdrop: true,
 
-     keyboard: true,
 
-     focus: true,
 
-     show: true
 
-   };
 
-   var DefaultType$3 = {
 
-     backdrop: '(boolean|string)',
 
-     keyboard: 'boolean',
 
-     focus: 'boolean',
 
-     show: 'boolean'
 
-   };
 
-   var Event$5 = {
 
-     HIDE: "hide" + EVENT_KEY$5,
 
-     HIDDEN: "hidden" + EVENT_KEY$5,
 
-     SHOW: "show" + EVENT_KEY$5,
 
-     SHOWN: "shown" + EVENT_KEY$5,
 
-     FOCUSIN: "focusin" + EVENT_KEY$5,
 
-     RESIZE: "resize" + EVENT_KEY$5,
 
-     CLICK_DISMISS: "click.dismiss" + EVENT_KEY$5,
 
-     KEYDOWN_DISMISS: "keydown.dismiss" + EVENT_KEY$5,
 
-     MOUSEUP_DISMISS: "mouseup.dismiss" + EVENT_KEY$5,
 
-     MOUSEDOWN_DISMISS: "mousedown.dismiss" + EVENT_KEY$5,
 
-     CLICK_DATA_API: "click" + EVENT_KEY$5 + DATA_API_KEY$5
 
-   };
 
-   var ClassName$5 = {
 
-     SCROLLABLE: 'modal-dialog-scrollable',
 
-     SCROLLBAR_MEASURER: 'modal-scrollbar-measure',
 
-     BACKDROP: 'modal-backdrop',
 
-     OPEN: 'modal-open',
 
-     FADE: 'fade',
 
-     SHOW: 'show'
 
-   };
 
-   var Selector$5 = {
 
-     DIALOG: '.modal-dialog',
 
-     MODAL_BODY: '.modal-body',
 
-     DATA_TOGGLE: '[data-toggle="modal"]',
 
-     DATA_DISMISS: '[data-dismiss="modal"]',
 
-     FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',
 
-     STICKY_CONTENT: '.sticky-top'
 
-     /**
 
-      * ------------------------------------------------------------------------
 
-      * Class Definition
 
-      * ------------------------------------------------------------------------
 
-      */
 
-   };
 
-   var Modal =
 
-   /*#__PURE__*/
 
-   function () {
 
-     function Modal(element, config) {
 
-       this._config = this._getConfig(config);
 
-       this._element = element;
 
-       this._dialog = element.querySelector(Selector$5.DIALOG);
 
-       this._backdrop = null;
 
-       this._isShown = false;
 
-       this._isBodyOverflowing = false;
 
-       this._ignoreBackdropClick = false;
 
-       this._isTransitioning = false;
 
-       this._scrollbarWidth = 0;
 
-     } // Getters
 
-     var _proto = Modal.prototype;
 
-     // Public
 
-     _proto.toggle = function toggle(relatedTarget) {
 
-       return this._isShown ? this.hide() : this.show(relatedTarget);
 
-     };
 
-     _proto.show = function show(relatedTarget) {
 
-       var _this = this;
 
-       if (this._isShown || this._isTransitioning) {
 
-         return;
 
-       }
 
-       if ($(this._element).hasClass(ClassName$5.FADE)) {
 
-         this._isTransitioning = true;
 
-       }
 
-       var showEvent = $.Event(Event$5.SHOW, {
 
-         relatedTarget: relatedTarget
 
-       });
 
-       $(this._element).trigger(showEvent);
 
-       if (this._isShown || showEvent.isDefaultPrevented()) {
 
-         return;
 
-       }
 
-       this._isShown = true;
 
-       this._checkScrollbar();
 
-       this._setScrollbar();
 
-       this._adjustDialog();
 
-       this._setEscapeEvent();
 
-       this._setResizeEvent();
 
-       $(this._element).on(Event$5.CLICK_DISMISS, Selector$5.DATA_DISMISS, function (event) {
 
-         return _this.hide(event);
 
-       });
 
-       $(this._dialog).on(Event$5.MOUSEDOWN_DISMISS, function () {
 
-         $(_this._element).one(Event$5.MOUSEUP_DISMISS, function (event) {
 
-           if ($(event.target).is(_this._element)) {
 
-             _this._ignoreBackdropClick = true;
 
-           }
 
-         });
 
-       });
 
-       this._showBackdrop(function () {
 
-         return _this._showElement(relatedTarget);
 
-       });
 
-     };
 
-     _proto.hide = function hide(event) {
 
-       var _this2 = this;
 
-       if (event) {
 
-         event.preventDefault();
 
-       }
 
-       if (!this._isShown || this._isTransitioning) {
 
-         return;
 
-       }
 
-       var hideEvent = $.Event(Event$5.HIDE);
 
-       $(this._element).trigger(hideEvent);
 
-       if (!this._isShown || hideEvent.isDefaultPrevented()) {
 
-         return;
 
-       }
 
-       this._isShown = false;
 
-       var transition = $(this._element).hasClass(ClassName$5.FADE);
 
-       if (transition) {
 
-         this._isTransitioning = true;
 
-       }
 
-       this._setEscapeEvent();
 
-       this._setResizeEvent();
 
-       $(document).off(Event$5.FOCUSIN);
 
-       $(this._element).removeClass(ClassName$5.SHOW);
 
-       $(this._element).off(Event$5.CLICK_DISMISS);
 
-       $(this._dialog).off(Event$5.MOUSEDOWN_DISMISS);
 
-       if (transition) {
 
-         var transitionDuration = Util.getTransitionDurationFromElement(this._element);
 
-         $(this._element).one(Util.TRANSITION_END, function (event) {
 
-           return _this2._hideModal(event);
 
-         }).emulateTransitionEnd(transitionDuration);
 
-       } else {
 
-         this._hideModal();
 
-       }
 
-     };
 
-     _proto.dispose = function dispose() {
 
-       [window, this._element, this._dialog].forEach(function (htmlElement) {
 
-         return $(htmlElement).off(EVENT_KEY$5);
 
-       });
 
-       /**
 
-        * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`
 
-        * Do not move `document` in `htmlElements` array
 
-        * It will remove `Event.CLICK_DATA_API` event that should remain
 
-        */
 
-       $(document).off(Event$5.FOCUSIN);
 
-       $.removeData(this._element, DATA_KEY$5);
 
-       this._config = null;
 
-       this._element = null;
 
-       this._dialog = null;
 
-       this._backdrop = null;
 
-       this._isShown = null;
 
-       this._isBodyOverflowing = null;
 
-       this._ignoreBackdropClick = null;
 
-       this._isTransitioning = null;
 
-       this._scrollbarWidth = null;
 
-     };
 
-     _proto.handleUpdate = function handleUpdate() {
 
-       this._adjustDialog();
 
-     } // Private
 
-     ;
 
-     _proto._getConfig = function _getConfig(config) {
 
-       config = _objectSpread({}, Default$3, config);
 
-       Util.typeCheckConfig(NAME$5, config, DefaultType$3);
 
-       return config;
 
-     };
 
-     _proto._showElement = function _showElement(relatedTarget) {
 
-       var _this3 = this;
 
-       var transition = $(this._element).hasClass(ClassName$5.FADE);
 
-       if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
 
-         // Don't move modal's DOM position
 
-         document.body.appendChild(this._element);
 
-       }
 
-       this._element.style.display = 'block';
 
-       this._element.removeAttribute('aria-hidden');
 
-       this._element.setAttribute('aria-modal', true);
 
-       if ($(this._dialog).hasClass(ClassName$5.SCROLLABLE)) {
 
-         this._dialog.querySelector(Selector$5.MODAL_BODY).scrollTop = 0;
 
-       } else {
 
-         this._element.scrollTop = 0;
 
-       }
 
-       if (transition) {
 
-         Util.reflow(this._element);
 
-       }
 
-       $(this._element).addClass(ClassName$5.SHOW);
 
-       if (this._config.focus) {
 
-         this._enforceFocus();
 
-       }
 
-       var shownEvent = $.Event(Event$5.SHOWN, {
 
-         relatedTarget: relatedTarget
 
-       });
 
-       var transitionComplete = function transitionComplete() {
 
-         if (_this3._config.focus) {
 
-           _this3._element.focus();
 
-         }
 
-         _this3._isTransitioning = false;
 
-         $(_this3._element).trigger(shownEvent);
 
-       };
 
-       if (transition) {
 
-         var transitionDuration = Util.getTransitionDurationFromElement(this._dialog);
 
-         $(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration);
 
-       } else {
 
-         transitionComplete();
 
-       }
 
-     };
 
-     _proto._enforceFocus = function _enforceFocus() {
 
-       var _this4 = this;
 
-       $(document).off(Event$5.FOCUSIN) // Guard against infinite focus loop
 
-       .on(Event$5.FOCUSIN, function (event) {
 
-         if (document !== event.target && _this4._element !== event.target && $(_this4._element).has(event.target).length === 0) {
 
-           _this4._element.focus();
 
-         }
 
-       });
 
-     };
 
-     _proto._setEscapeEvent = function _setEscapeEvent() {
 
-       var _this5 = this;
 
-       if (this._isShown && this._config.keyboard) {
 
-         $(this._element).on(Event$5.KEYDOWN_DISMISS, function (event) {
 
-           if (event.which === ESCAPE_KEYCODE$1) {
 
-             event.preventDefault();
 
-             _this5.hide();
 
-           }
 
-         });
 
-       } else if (!this._isShown) {
 
-         $(this._element).off(Event$5.KEYDOWN_DISMISS);
 
-       }
 
-     };
 
-     _proto._setResizeEvent = function _setResizeEvent() {
 
-       var _this6 = this;
 
-       if (this._isShown) {
 
-         $(window).on(Event$5.RESIZE, function (event) {
 
-           return _this6.handleUpdate(event);
 
-         });
 
-       } else {
 
-         $(window).off(Event$5.RESIZE);
 
-       }
 
-     };
 
-     _proto._hideModal = function _hideModal() {
 
-       var _this7 = this;
 
-       this._element.style.display = 'none';
 
-       this._element.setAttribute('aria-hidden', true);
 
-       this._element.removeAttribute('aria-modal');
 
-       this._isTransitioning = false;
 
-       this._showBackdrop(function () {
 
-         $(document.body).removeClass(ClassName$5.OPEN);
 
-         _this7._resetAdjustments();
 
-         _this7._resetScrollbar();
 
-         $(_this7._element).trigger(Event$5.HIDDEN);
 
-       });
 
-     };
 
-     _proto._removeBackdrop = function _removeBackdrop() {
 
-       if (this._backdrop) {
 
-         $(this._backdrop).remove();
 
-         this._backdrop = null;
 
-       }
 
-     };
 
-     _proto._showBackdrop = function _showBackdrop(callback) {
 
-       var _this8 = this;
 
-       var animate = $(this._element).hasClass(ClassName$5.FADE) ? ClassName$5.FADE : '';
 
-       if (this._isShown && this._config.backdrop) {
 
-         this._backdrop = document.createElement('div');
 
-         this._backdrop.className = ClassName$5.BACKDROP;
 
-         if (animate) {
 
-           this._backdrop.classList.add(animate);
 
-         }
 
-         $(this._backdrop).appendTo(document.body);
 
-         $(this._element).on(Event$5.CLICK_DISMISS, function (event) {
 
-           if (_this8._ignoreBackdropClick) {
 
-             _this8._ignoreBackdropClick = false;
 
-             return;
 
-           }
 
-           if (event.target !== event.currentTarget) {
 
-             return;
 
-           }
 
-           if (_this8._config.backdrop === 'static') {
 
-             _this8._element.focus();
 
-           } else {
 
-             _this8.hide();
 
-           }
 
-         });
 
-         if (animate) {
 
-           Util.reflow(this._backdrop);
 
-         }
 
-         $(this._backdrop).addClass(ClassName$5.SHOW);
 
-         if (!callback) {
 
-           return;
 
-         }
 
-         if (!animate) {
 
-           callback();
 
-           return;
 
-         }
 
-         var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);
 
-         $(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration);
 
-       } else if (!this._isShown && this._backdrop) {
 
-         $(this._backdrop).removeClass(ClassName$5.SHOW);
 
-         var callbackRemove = function callbackRemove() {
 
-           _this8._removeBackdrop();
 
-           if (callback) {
 
-             callback();
 
-           }
 
-         };
 
-         if ($(this._element).hasClass(ClassName$5.FADE)) {
 
-           var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);
 
-           $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration);
 
-         } else {
 
-           callbackRemove();
 
-         }
 
-       } else if (callback) {
 
-         callback();
 
-       }
 
-     } // ----------------------------------------------------------------------
 
-     // the following methods are used to handle overflowing modals
 
-     // todo (fat): these should probably be refactored out of modal.js
 
-     // ----------------------------------------------------------------------
 
-     ;
 
-     _proto._adjustDialog = function _adjustDialog() {
 
-       var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
 
-       if (!this._isBodyOverflowing && isModalOverflowing) {
 
-         this._element.style.paddingLeft = this._scrollbarWidth + "px";
 
-       }
 
-       if (this._isBodyOverflowing && !isModalOverflowing) {
 
-         this._element.style.paddingRight = this._scrollbarWidth + "px";
 
-       }
 
-     };
 
-     _proto._resetAdjustments = function _resetAdjustments() {
 
-       this._element.style.paddingLeft = '';
 
-       this._element.style.paddingRight = '';
 
-     };
 
-     _proto._checkScrollbar = function _checkScrollbar() {
 
-       var rect = document.body.getBoundingClientRect();
 
-       this._isBodyOverflowing = rect.left + rect.right < window.innerWidth;
 
-       this._scrollbarWidth = this._getScrollbarWidth();
 
-     };
 
-     _proto._setScrollbar = function _setScrollbar() {
 
-       var _this9 = this;
 
-       if (this._isBodyOverflowing) {
 
-         // Note: DOMNode.style.paddingRight returns the actual value or '' if not set
 
-         //   while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set
 
-         var fixedContent = [].slice.call(document.querySelectorAll(Selector$5.FIXED_CONTENT));
 
-         var stickyContent = [].slice.call(document.querySelectorAll(Selector$5.STICKY_CONTENT)); // Adjust fixed content padding
 
-         $(fixedContent).each(function (index, element) {
 
-           var actualPadding = element.style.paddingRight;
 
-           var calculatedPadding = $(element).css('padding-right');
 
-           $(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + "px");
 
-         }); // Adjust sticky content margin
 
-         $(stickyContent).each(function (index, element) {
 
-           var actualMargin = element.style.marginRight;
 
-           var calculatedMargin = $(element).css('margin-right');
 
-           $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + "px");
 
-         }); // Adjust body padding
 
-         var actualPadding = document.body.style.paddingRight;
 
-         var calculatedPadding = $(document.body).css('padding-right');
 
-         $(document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + "px");
 
-       }
 
-       $(document.body).addClass(ClassName$5.OPEN);
 
-     };
 
-     _proto._resetScrollbar = function _resetScrollbar() {
 
-       // Restore fixed content padding
 
-       var fixedContent = [].slice.call(document.querySelectorAll(Selector$5.FIXED_CONTENT));
 
-       $(fixedContent).each(function (index, element) {
 
-         var padding = $(element).data('padding-right');
 
-         $(element).removeData('padding-right');
 
-         element.style.paddingRight = padding ? padding : '';
 
-       }); // Restore sticky content
 
-       var elements = [].slice.call(document.querySelectorAll("" + Selector$5.STICKY_CONTENT));
 
-       $(elements).each(function (index, element) {
 
-         var margin = $(element).data('margin-right');
 
-         if (typeof margin !== 'undefined') {
 
-           $(element).css('margin-right', margin).removeData('margin-right');
 
-         }
 
-       }); // Restore body padding
 
-       var padding = $(document.body).data('padding-right');
 
-       $(document.body).removeData('padding-right');
 
-       document.body.style.paddingRight = padding ? padding : '';
 
-     };
 
-     _proto._getScrollbarWidth = function _getScrollbarWidth() {
 
-       // thx d.walsh
 
-       var scrollDiv = document.createElement('div');
 
-       scrollDiv.className = ClassName$5.SCROLLBAR_MEASURER;
 
-       document.body.appendChild(scrollDiv);
 
-       var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;
 
-       document.body.removeChild(scrollDiv);
 
-       return scrollbarWidth;
 
-     } // Static
 
-     ;
 
-     Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {
 
-       return this.each(function () {
 
-         var data = $(this).data(DATA_KEY$5);
 
-         var _config = _objectSpread({}, Default$3, $(this).data(), typeof config === 'object' && config ? config : {});
 
-         if (!data) {
 
-           data = new Modal(this, _config);
 
-           $(this).data(DATA_KEY$5, data);
 
-         }
 
-         if (typeof config === 'string') {
 
-           if (typeof data[config] === 'undefined') {
 
-             throw new TypeError("No method named \"" + config + "\"");
 
-           }
 
-           data[config](relatedTarget);
 
-         } else if (_config.show) {
 
-           data.show(relatedTarget);
 
-         }
 
-       });
 
-     };
 
-     _createClass(Modal, null, [{
 
-       key: "VERSION",
 
-       get: function get() {
 
-         return VERSION$5;
 
-       }
 
-     }, {
 
-       key: "Default",
 
-       get: function get() {
 
-         return Default$3;
 
-       }
 
-     }]);
 
-     return Modal;
 
-   }();
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * Data Api implementation
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   $(document).on(Event$5.CLICK_DATA_API, Selector$5.DATA_TOGGLE, function (event) {
 
-     var _this10 = this;
 
-     var target;
 
-     var selector = Util.getSelectorFromElement(this);
 
-     if (selector) {
 
-       target = document.querySelector(selector);
 
-     }
 
-     var config = $(target).data(DATA_KEY$5) ? 'toggle' : _objectSpread({}, $(target).data(), $(this).data());
 
-     if (this.tagName === 'A' || this.tagName === 'AREA') {
 
-       event.preventDefault();
 
-     }
 
-     var $target = $(target).one(Event$5.SHOW, function (showEvent) {
 
-       if (showEvent.isDefaultPrevented()) {
 
-         // Only register focus restorer if modal will actually get shown
 
-         return;
 
-       }
 
-       $target.one(Event$5.HIDDEN, function () {
 
-         if ($(_this10).is(':visible')) {
 
-           _this10.focus();
 
-         }
 
-       });
 
-     });
 
-     Modal._jQueryInterface.call($(target), config, this);
 
-   });
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * jQuery
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   $.fn[NAME$5] = Modal._jQueryInterface;
 
-   $.fn[NAME$5].Constructor = Modal;
 
-   $.fn[NAME$5].noConflict = function () {
 
-     $.fn[NAME$5] = JQUERY_NO_CONFLICT$5;
 
-     return Modal._jQueryInterface;
 
-   };
 
-   /**
 
-    * --------------------------------------------------------------------------
 
-    * Bootstrap (v4.3.1): tools/sanitizer.js
 
-    * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
-    * --------------------------------------------------------------------------
 
-    */
 
-   var uriAttrs = ['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href'];
 
-   var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
 
-   var DefaultWhitelist = {
 
-     // Global attributes allowed on any supplied element below.
 
-     '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
 
-     a: ['target', 'href', 'title', 'rel'],
 
-     area: [],
 
-     b: [],
 
-     br: [],
 
-     col: [],
 
-     code: [],
 
-     div: [],
 
-     em: [],
 
-     hr: [],
 
-     h1: [],
 
-     h2: [],
 
-     h3: [],
 
-     h4: [],
 
-     h5: [],
 
-     h6: [],
 
-     i: [],
 
-     img: ['src', 'alt', 'title', 'width', 'height'],
 
-     li: [],
 
-     ol: [],
 
-     p: [],
 
-     pre: [],
 
-     s: [],
 
-     small: [],
 
-     span: [],
 
-     sub: [],
 
-     sup: [],
 
-     strong: [],
 
-     u: [],
 
-     ul: []
 
-     /**
 
-      * A pattern that recognizes a commonly useful subset of URLs that are safe.
 
-      *
 
-      * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
 
-      */
 
-   };
 
-   var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi;
 
-   /**
 
-    * A pattern that matches safe data URLs. Only matches image, video and audio types.
 
-    *
 
-    * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
 
-    */
 
-   var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;
 
-   function allowedAttribute(attr, allowedAttributeList) {
 
-     var attrName = attr.nodeName.toLowerCase();
 
-     if (allowedAttributeList.indexOf(attrName) !== -1) {
 
-       if (uriAttrs.indexOf(attrName) !== -1) {
 
-         return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN));
 
-       }
 
-       return true;
 
-     }
 
-     var regExp = allowedAttributeList.filter(function (attrRegex) {
 
-       return attrRegex instanceof RegExp;
 
-     }); // Check if a regular expression validates the attribute.
 
-     for (var i = 0, l = regExp.length; i < l; i++) {
 
-       if (attrName.match(regExp[i])) {
 
-         return true;
 
-       }
 
-     }
 
-     return false;
 
-   }
 
-   function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {
 
-     if (unsafeHtml.length === 0) {
 
-       return unsafeHtml;
 
-     }
 
-     if (sanitizeFn && typeof sanitizeFn === 'function') {
 
-       return sanitizeFn(unsafeHtml);
 
-     }
 
-     var domParser = new window.DOMParser();
 
-     var createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');
 
-     var whitelistKeys = Object.keys(whiteList);
 
-     var elements = [].slice.call(createdDocument.body.querySelectorAll('*'));
 
-     var _loop = function _loop(i, len) {
 
-       var el = elements[i];
 
-       var elName = el.nodeName.toLowerCase();
 
-       if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {
 
-         el.parentNode.removeChild(el);
 
-         return "continue";
 
-       }
 
-       var attributeList = [].slice.call(el.attributes);
 
-       var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []);
 
-       attributeList.forEach(function (attr) {
 
-         if (!allowedAttribute(attr, whitelistedAttributes)) {
 
-           el.removeAttribute(attr.nodeName);
 
-         }
 
-       });
 
-     };
 
-     for (var i = 0, len = elements.length; i < len; i++) {
 
-       var _ret = _loop(i, len);
 
-       if (_ret === "continue") continue;
 
-     }
 
-     return createdDocument.body.innerHTML;
 
-   }
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * Constants
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   var NAME$6 = 'tooltip';
 
-   var VERSION$6 = '4.3.1';
 
-   var DATA_KEY$6 = 'bs.tooltip';
 
-   var EVENT_KEY$6 = "." + DATA_KEY$6;
 
-   var JQUERY_NO_CONFLICT$6 = $.fn[NAME$6];
 
-   var CLASS_PREFIX = 'bs-tooltip';
 
-   var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g');
 
-   var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn'];
 
-   var DefaultType$4 = {
 
-     animation: 'boolean',
 
-     template: 'string',
 
-     title: '(string|element|function)',
 
-     trigger: 'string',
 
-     delay: '(number|object)',
 
-     html: 'boolean',
 
-     selector: '(string|boolean)',
 
-     placement: '(string|function)',
 
-     offset: '(number|string|function)',
 
-     container: '(string|element|boolean)',
 
-     fallbackPlacement: '(string|array)',
 
-     boundary: '(string|element)',
 
-     sanitize: 'boolean',
 
-     sanitizeFn: '(null|function)',
 
-     whiteList: 'object'
 
-   };
 
-   var AttachmentMap$1 = {
 
-     AUTO: 'auto',
 
-     TOP: 'top',
 
-     RIGHT: 'right',
 
-     BOTTOM: 'bottom',
 
-     LEFT: 'left'
 
-   };
 
-   var Default$4 = {
 
-     animation: true,
 
-     template: '<div class="tooltip" role="tooltip">' + '<div class="arrow"></div>' + '<div class="tooltip-inner"></div></div>',
 
-     trigger: 'hover focus',
 
-     title: '',
 
-     delay: 0,
 
-     html: false,
 
-     selector: false,
 
-     placement: 'top',
 
-     offset: 0,
 
-     container: false,
 
-     fallbackPlacement: 'flip',
 
-     boundary: 'scrollParent',
 
-     sanitize: true,
 
-     sanitizeFn: null,
 
-     whiteList: DefaultWhitelist
 
-   };
 
-   var HoverState = {
 
-     SHOW: 'show',
 
-     OUT: 'out'
 
-   };
 
-   var Event$6 = {
 
-     HIDE: "hide" + EVENT_KEY$6,
 
-     HIDDEN: "hidden" + EVENT_KEY$6,
 
-     SHOW: "show" + EVENT_KEY$6,
 
-     SHOWN: "shown" + EVENT_KEY$6,
 
-     INSERTED: "inserted" + EVENT_KEY$6,
 
-     CLICK: "click" + EVENT_KEY$6,
 
-     FOCUSIN: "focusin" + EVENT_KEY$6,
 
-     FOCUSOUT: "focusout" + EVENT_KEY$6,
 
-     MOUSEENTER: "mouseenter" + EVENT_KEY$6,
 
-     MOUSELEAVE: "mouseleave" + EVENT_KEY$6
 
-   };
 
-   var ClassName$6 = {
 
-     FADE: 'fade',
 
-     SHOW: 'show'
 
-   };
 
-   var Selector$6 = {
 
-     TOOLTIP: '.tooltip',
 
-     TOOLTIP_INNER: '.tooltip-inner',
 
-     ARROW: '.arrow'
 
-   };
 
-   var Trigger = {
 
-     HOVER: 'hover',
 
-     FOCUS: 'focus',
 
-     CLICK: 'click',
 
-     MANUAL: 'manual'
 
-     /**
 
-      * ------------------------------------------------------------------------
 
-      * Class Definition
 
-      * ------------------------------------------------------------------------
 
-      */
 
-   };
 
-   var Tooltip =
 
-   /*#__PURE__*/
 
-   function () {
 
-     function Tooltip(element, config) {
 
-       /**
 
-        * Check for Popper dependency
 
-        * Popper - https://popper.js.org
 
-        */
 
-       if (typeof Popper === 'undefined') {
 
-         throw new TypeError('Bootstrap\'s tooltips require Popper.js (https://popper.js.org/)');
 
-       } // private
 
-       this._isEnabled = true;
 
-       this._timeout = 0;
 
-       this._hoverState = '';
 
-       this._activeTrigger = {};
 
-       this._popper = null; // Protected
 
-       this.element = element;
 
-       this.config = this._getConfig(config);
 
-       this.tip = null;
 
-       this._setListeners();
 
-     } // Getters
 
-     var _proto = Tooltip.prototype;
 
-     // Public
 
-     _proto.enable = function enable() {
 
-       this._isEnabled = true;
 
-     };
 
-     _proto.disable = function disable() {
 
-       this._isEnabled = false;
 
-     };
 
-     _proto.toggleEnabled = function toggleEnabled() {
 
-       this._isEnabled = !this._isEnabled;
 
-     };
 
-     _proto.toggle = function toggle(event) {
 
-       if (!this._isEnabled) {
 
-         return;
 
-       }
 
-       if (event) {
 
-         var dataKey = this.constructor.DATA_KEY;
 
-         var context = $(event.currentTarget).data(dataKey);
 
-         if (!context) {
 
-           context = new this.constructor(event.currentTarget, this._getDelegateConfig());
 
-           $(event.currentTarget).data(dataKey, context);
 
-         }
 
-         context._activeTrigger.click = !context._activeTrigger.click;
 
-         if (context._isWithActiveTrigger()) {
 
-           context._enter(null, context);
 
-         } else {
 
-           context._leave(null, context);
 
-         }
 
-       } else {
 
-         if ($(this.getTipElement()).hasClass(ClassName$6.SHOW)) {
 
-           this._leave(null, this);
 
-           return;
 
-         }
 
-         this._enter(null, this);
 
-       }
 
-     };
 
-     _proto.dispose = function dispose() {
 
-       clearTimeout(this._timeout);
 
-       $.removeData(this.element, this.constructor.DATA_KEY);
 
-       $(this.element).off(this.constructor.EVENT_KEY);
 
-       $(this.element).closest('.modal').off('hide.bs.modal');
 
-       if (this.tip) {
 
-         $(this.tip).remove();
 
-       }
 
-       this._isEnabled = null;
 
-       this._timeout = null;
 
-       this._hoverState = null;
 
-       this._activeTrigger = null;
 
-       if (this._popper !== null) {
 
-         this._popper.destroy();
 
-       }
 
-       this._popper = null;
 
-       this.element = null;
 
-       this.config = null;
 
-       this.tip = null;
 
-     };
 
-     _proto.show = function show() {
 
-       var _this = this;
 
-       if ($(this.element).css('display') === 'none') {
 
-         throw new Error('Please use show on visible elements');
 
-       }
 
-       var showEvent = $.Event(this.constructor.Event.SHOW);
 
-       if (this.isWithContent() && this._isEnabled) {
 
-         $(this.element).trigger(showEvent);
 
-         var shadowRoot = Util.findShadowRoot(this.element);
 
-         var isInTheDom = $.contains(shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement, this.element);
 
-         if (showEvent.isDefaultPrevented() || !isInTheDom) {
 
-           return;
 
-         }
 
-         var tip = this.getTipElement();
 
-         var tipId = Util.getUID(this.constructor.NAME);
 
-         tip.setAttribute('id', tipId);
 
-         this.element.setAttribute('aria-describedby', tipId);
 
-         this.setContent();
 
-         if (this.config.animation) {
 
-           $(tip).addClass(ClassName$6.FADE);
 
-         }
 
-         var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;
 
-         var attachment = this._getAttachment(placement);
 
-         this.addAttachmentClass(attachment);
 
-         var container = this._getContainer();
 
-         $(tip).data(this.constructor.DATA_KEY, this);
 
-         if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {
 
-           $(tip).appendTo(container);
 
-         }
 
-         $(this.element).trigger(this.constructor.Event.INSERTED);
 
-         this._popper = new Popper(this.element, tip, {
 
-           placement: attachment,
 
-           modifiers: {
 
-             offset: this._getOffset(),
 
-             flip: {
 
-               behavior: this.config.fallbackPlacement
 
-             },
 
-             arrow: {
 
-               element: Selector$6.ARROW
 
-             },
 
-             preventOverflow: {
 
-               boundariesElement: this.config.boundary
 
-             }
 
-           },
 
-           onCreate: function onCreate(data) {
 
-             if (data.originalPlacement !== data.placement) {
 
-               _this._handlePopperPlacementChange(data);
 
-             }
 
-           },
 
-           onUpdate: function onUpdate(data) {
 
-             return _this._handlePopperPlacementChange(data);
 
-           }
 
-         });
 
-         $(tip).addClass(ClassName$6.SHOW); // If this is a touch-enabled device we add extra
 
-         // empty mouseover listeners to the body's immediate children;
 
-         // only needed because of broken event delegation on iOS
 
-         // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
 
-         if ('ontouchstart' in document.documentElement) {
 
-           $(document.body).children().on('mouseover', null, $.noop);
 
-         }
 
-         var complete = function complete() {
 
-           if (_this.config.animation) {
 
-             _this._fixTransition();
 
-           }
 
-           var prevHoverState = _this._hoverState;
 
-           _this._hoverState = null;
 
-           $(_this.element).trigger(_this.constructor.Event.SHOWN);
 
-           if (prevHoverState === HoverState.OUT) {
 
-             _this._leave(null, _this);
 
-           }
 
-         };
 
-         if ($(this.tip).hasClass(ClassName$6.FADE)) {
 
-           var transitionDuration = Util.getTransitionDurationFromElement(this.tip);
 
-           $(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
 
-         } else {
 
-           complete();
 
-         }
 
-       }
 
-     };
 
-     _proto.hide = function hide(callback) {
 
-       var _this2 = this;
 
-       var tip = this.getTipElement();
 
-       var hideEvent = $.Event(this.constructor.Event.HIDE);
 
-       var complete = function complete() {
 
-         if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) {
 
-           tip.parentNode.removeChild(tip);
 
-         }
 
-         _this2._cleanTipClass();
 
-         _this2.element.removeAttribute('aria-describedby');
 
-         $(_this2.element).trigger(_this2.constructor.Event.HIDDEN);
 
-         if (_this2._popper !== null) {
 
-           _this2._popper.destroy();
 
-         }
 
-         if (callback) {
 
-           callback();
 
-         }
 
-       };
 
-       $(this.element).trigger(hideEvent);
 
-       if (hideEvent.isDefaultPrevented()) {
 
-         return;
 
-       }
 
-       $(tip).removeClass(ClassName$6.SHOW); // If this is a touch-enabled device we remove the extra
 
-       // empty mouseover listeners we added for iOS support
 
-       if ('ontouchstart' in document.documentElement) {
 
-         $(document.body).children().off('mouseover', null, $.noop);
 
-       }
 
-       this._activeTrigger[Trigger.CLICK] = false;
 
-       this._activeTrigger[Trigger.FOCUS] = false;
 
-       this._activeTrigger[Trigger.HOVER] = false;
 
-       if ($(this.tip).hasClass(ClassName$6.FADE)) {
 
-         var transitionDuration = Util.getTransitionDurationFromElement(tip);
 
-         $(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
 
-       } else {
 
-         complete();
 
-       }
 
-       this._hoverState = '';
 
-     };
 
-     _proto.update = function update() {
 
-       if (this._popper !== null) {
 
-         this._popper.scheduleUpdate();
 
-       }
 
-     } // Protected
 
-     ;
 
-     _proto.isWithContent = function isWithContent() {
 
-       return Boolean(this.getTitle());
 
-     };
 
-     _proto.addAttachmentClass = function addAttachmentClass(attachment) {
 
-       $(this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment);
 
-     };
 
-     _proto.getTipElement = function getTipElement() {
 
-       this.tip = this.tip || $(this.config.template)[0];
 
-       return this.tip;
 
-     };
 
-     _proto.setContent = function setContent() {
 
-       var tip = this.getTipElement();
 
-       this.setElementContent($(tip.querySelectorAll(Selector$6.TOOLTIP_INNER)), this.getTitle());
 
-       $(tip).removeClass(ClassName$6.FADE + " " + ClassName$6.SHOW);
 
-     };
 
-     _proto.setElementContent = function setElementContent($element, content) {
 
-       if (typeof content === 'object' && (content.nodeType || content.jquery)) {
 
-         // Content is a DOM node or a jQuery
 
-         if (this.config.html) {
 
-           if (!$(content).parent().is($element)) {
 
-             $element.empty().append(content);
 
-           }
 
-         } else {
 
-           $element.text($(content).text());
 
-         }
 
-         return;
 
-       }
 
-       if (this.config.html) {
 
-         if (this.config.sanitize) {
 
-           content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn);
 
-         }
 
-         $element.html(content);
 
-       } else {
 
-         $element.text(content);
 
-       }
 
-     };
 
-     _proto.getTitle = function getTitle() {
 
-       var title = this.element.getAttribute('data-original-title');
 
-       if (!title) {
 
-         title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;
 
-       }
 
-       return title;
 
-     } // Private
 
-     ;
 
-     _proto._getOffset = function _getOffset() {
 
-       var _this3 = this;
 
-       var offset = {};
 
-       if (typeof this.config.offset === 'function') {
 
-         offset.fn = function (data) {
 
-           data.offsets = _objectSpread({}, data.offsets, _this3.config.offset(data.offsets, _this3.element) || {});
 
-           return data;
 
-         };
 
-       } else {
 
-         offset.offset = this.config.offset;
 
-       }
 
-       return offset;
 
-     };
 
-     _proto._getContainer = function _getContainer() {
 
-       if (this.config.container === false) {
 
-         return document.body;
 
-       }
 
-       if (Util.isElement(this.config.container)) {
 
-         return $(this.config.container);
 
-       }
 
-       return $(document).find(this.config.container);
 
-     };
 
-     _proto._getAttachment = function _getAttachment(placement) {
 
-       return AttachmentMap$1[placement.toUpperCase()];
 
-     };
 
-     _proto._setListeners = function _setListeners() {
 
-       var _this4 = this;
 
-       var triggers = this.config.trigger.split(' ');
 
-       triggers.forEach(function (trigger) {
 
-         if (trigger === 'click') {
 
-           $(_this4.element).on(_this4.constructor.Event.CLICK, _this4.config.selector, function (event) {
 
-             return _this4.toggle(event);
 
-           });
 
-         } else if (trigger !== Trigger.MANUAL) {
 
-           var eventIn = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSEENTER : _this4.constructor.Event.FOCUSIN;
 
-           var eventOut = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSELEAVE : _this4.constructor.Event.FOCUSOUT;
 
-           $(_this4.element).on(eventIn, _this4.config.selector, function (event) {
 
-             return _this4._enter(event);
 
-           }).on(eventOut, _this4.config.selector, function (event) {
 
-             return _this4._leave(event);
 
-           });
 
-         }
 
-       });
 
-       $(this.element).closest('.modal').on('hide.bs.modal', function () {
 
-         if (_this4.element) {
 
-           _this4.hide();
 
-         }
 
-       });
 
-       if (this.config.selector) {
 
-         this.config = _objectSpread({}, this.config, {
 
-           trigger: 'manual',
 
-           selector: ''
 
-         });
 
-       } else {
 
-         this._fixTitle();
 
-       }
 
-     };
 
-     _proto._fixTitle = function _fixTitle() {
 
-       var titleType = typeof this.element.getAttribute('data-original-title');
 
-       if (this.element.getAttribute('title') || titleType !== 'string') {
 
-         this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');
 
-         this.element.setAttribute('title', '');
 
-       }
 
-     };
 
-     _proto._enter = function _enter(event, context) {
 
-       var dataKey = this.constructor.DATA_KEY;
 
-       context = context || $(event.currentTarget).data(dataKey);
 
-       if (!context) {
 
-         context = new this.constructor(event.currentTarget, this._getDelegateConfig());
 
-         $(event.currentTarget).data(dataKey, context);
 
-       }
 
-       if (event) {
 
-         context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;
 
-       }
 
-       if ($(context.getTipElement()).hasClass(ClassName$6.SHOW) || context._hoverState === HoverState.SHOW) {
 
-         context._hoverState = HoverState.SHOW;
 
-         return;
 
-       }
 
-       clearTimeout(context._timeout);
 
-       context._hoverState = HoverState.SHOW;
 
-       if (!context.config.delay || !context.config.delay.show) {
 
-         context.show();
 
-         return;
 
-       }
 
-       context._timeout = setTimeout(function () {
 
-         if (context._hoverState === HoverState.SHOW) {
 
-           context.show();
 
-         }
 
-       }, context.config.delay.show);
 
-     };
 
-     _proto._leave = function _leave(event, context) {
 
-       var dataKey = this.constructor.DATA_KEY;
 
-       context = context || $(event.currentTarget).data(dataKey);
 
-       if (!context) {
 
-         context = new this.constructor(event.currentTarget, this._getDelegateConfig());
 
-         $(event.currentTarget).data(dataKey, context);
 
-       }
 
-       if (event) {
 
-         context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;
 
-       }
 
-       if (context._isWithActiveTrigger()) {
 
-         return;
 
-       }
 
-       clearTimeout(context._timeout);
 
-       context._hoverState = HoverState.OUT;
 
-       if (!context.config.delay || !context.config.delay.hide) {
 
-         context.hide();
 
-         return;
 
-       }
 
-       context._timeout = setTimeout(function () {
 
-         if (context._hoverState === HoverState.OUT) {
 
-           context.hide();
 
-         }
 
-       }, context.config.delay.hide);
 
-     };
 
-     _proto._isWithActiveTrigger = function _isWithActiveTrigger() {
 
-       for (var trigger in this._activeTrigger) {
 
-         if (this._activeTrigger[trigger]) {
 
-           return true;
 
-         }
 
-       }
 
-       return false;
 
-     };
 
-     _proto._getConfig = function _getConfig(config) {
 
-       var dataAttributes = $(this.element).data();
 
-       Object.keys(dataAttributes).forEach(function (dataAttr) {
 
-         if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {
 
-           delete dataAttributes[dataAttr];
 
-         }
 
-       });
 
-       config = _objectSpread({}, this.constructor.Default, dataAttributes, typeof config === 'object' && config ? config : {});
 
-       if (typeof config.delay === 'number') {
 
-         config.delay = {
 
-           show: config.delay,
 
-           hide: config.delay
 
-         };
 
-       }
 
-       if (typeof config.title === 'number') {
 
-         config.title = config.title.toString();
 
-       }
 
-       if (typeof config.content === 'number') {
 
-         config.content = config.content.toString();
 
-       }
 
-       Util.typeCheckConfig(NAME$6, config, this.constructor.DefaultType);
 
-       if (config.sanitize) {
 
-         config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn);
 
-       }
 
-       return config;
 
-     };
 
-     _proto._getDelegateConfig = function _getDelegateConfig() {
 
-       var config = {};
 
-       if (this.config) {
 
-         for (var key in this.config) {
 
-           if (this.constructor.Default[key] !== this.config[key]) {
 
-             config[key] = this.config[key];
 
-           }
 
-         }
 
-       }
 
-       return config;
 
-     };
 
-     _proto._cleanTipClass = function _cleanTipClass() {
 
-       var $tip = $(this.getTipElement());
 
-       var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);
 
-       if (tabClass !== null && tabClass.length) {
 
-         $tip.removeClass(tabClass.join(''));
 
-       }
 
-     };
 
-     _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) {
 
-       var popperInstance = popperData.instance;
 
-       this.tip = popperInstance.popper;
 
-       this._cleanTipClass();
 
-       this.addAttachmentClass(this._getAttachment(popperData.placement));
 
-     };
 
-     _proto._fixTransition = function _fixTransition() {
 
-       var tip = this.getTipElement();
 
-       var initConfigAnimation = this.config.animation;
 
-       if (tip.getAttribute('x-placement') !== null) {
 
-         return;
 
-       }
 
-       $(tip).removeClass(ClassName$6.FADE);
 
-       this.config.animation = false;
 
-       this.hide();
 
-       this.show();
 
-       this.config.animation = initConfigAnimation;
 
-     } // Static
 
-     ;
 
-     Tooltip._jQueryInterface = function _jQueryInterface(config) {
 
-       return this.each(function () {
 
-         var data = $(this).data(DATA_KEY$6);
 
-         var _config = typeof config === 'object' && config;
 
-         if (!data && /dispose|hide/.test(config)) {
 
-           return;
 
-         }
 
-         if (!data) {
 
-           data = new Tooltip(this, _config);
 
-           $(this).data(DATA_KEY$6, data);
 
-         }
 
-         if (typeof config === 'string') {
 
-           if (typeof data[config] === 'undefined') {
 
-             throw new TypeError("No method named \"" + config + "\"");
 
-           }
 
-           data[config]();
 
-         }
 
-       });
 
-     };
 
-     _createClass(Tooltip, null, [{
 
-       key: "VERSION",
 
-       get: function get() {
 
-         return VERSION$6;
 
-       }
 
-     }, {
 
-       key: "Default",
 
-       get: function get() {
 
-         return Default$4;
 
-       }
 
-     }, {
 
-       key: "NAME",
 
-       get: function get() {
 
-         return NAME$6;
 
-       }
 
-     }, {
 
-       key: "DATA_KEY",
 
-       get: function get() {
 
-         return DATA_KEY$6;
 
-       }
 
-     }, {
 
-       key: "Event",
 
-       get: function get() {
 
-         return Event$6;
 
-       }
 
-     }, {
 
-       key: "EVENT_KEY",
 
-       get: function get() {
 
-         return EVENT_KEY$6;
 
-       }
 
-     }, {
 
-       key: "DefaultType",
 
-       get: function get() {
 
-         return DefaultType$4;
 
-       }
 
-     }]);
 
-     return Tooltip;
 
-   }();
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * jQuery
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   $.fn[NAME$6] = Tooltip._jQueryInterface;
 
-   $.fn[NAME$6].Constructor = Tooltip;
 
-   $.fn[NAME$6].noConflict = function () {
 
-     $.fn[NAME$6] = JQUERY_NO_CONFLICT$6;
 
-     return Tooltip._jQueryInterface;
 
-   };
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * Constants
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   var NAME$7 = 'popover';
 
-   var VERSION$7 = '4.3.1';
 
-   var DATA_KEY$7 = 'bs.popover';
 
-   var EVENT_KEY$7 = "." + DATA_KEY$7;
 
-   var JQUERY_NO_CONFLICT$7 = $.fn[NAME$7];
 
-   var CLASS_PREFIX$1 = 'bs-popover';
 
-   var BSCLS_PREFIX_REGEX$1 = new RegExp("(^|\\s)" + CLASS_PREFIX$1 + "\\S+", 'g');
 
-   var Default$5 = _objectSpread({}, Tooltip.Default, {
 
-     placement: 'right',
 
-     trigger: 'click',
 
-     content: '',
 
-     template: '<div class="popover" role="tooltip">' + '<div class="arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div></div>'
 
-   });
 
-   var DefaultType$5 = _objectSpread({}, Tooltip.DefaultType, {
 
-     content: '(string|element|function)'
 
-   });
 
-   var ClassName$7 = {
 
-     FADE: 'fade',
 
-     SHOW: 'show'
 
-   };
 
-   var Selector$7 = {
 
-     TITLE: '.popover-header',
 
-     CONTENT: '.popover-body'
 
-   };
 
-   var Event$7 = {
 
-     HIDE: "hide" + EVENT_KEY$7,
 
-     HIDDEN: "hidden" + EVENT_KEY$7,
 
-     SHOW: "show" + EVENT_KEY$7,
 
-     SHOWN: "shown" + EVENT_KEY$7,
 
-     INSERTED: "inserted" + EVENT_KEY$7,
 
-     CLICK: "click" + EVENT_KEY$7,
 
-     FOCUSIN: "focusin" + EVENT_KEY$7,
 
-     FOCUSOUT: "focusout" + EVENT_KEY$7,
 
-     MOUSEENTER: "mouseenter" + EVENT_KEY$7,
 
-     MOUSELEAVE: "mouseleave" + EVENT_KEY$7
 
-     /**
 
-      * ------------------------------------------------------------------------
 
-      * Class Definition
 
-      * ------------------------------------------------------------------------
 
-      */
 
-   };
 
-   var Popover =
 
-   /*#__PURE__*/
 
-   function (_Tooltip) {
 
-     _inheritsLoose(Popover, _Tooltip);
 
-     function Popover() {
 
-       return _Tooltip.apply(this, arguments) || this;
 
-     }
 
-     var _proto = Popover.prototype;
 
-     // Overrides
 
-     _proto.isWithContent = function isWithContent() {
 
-       return this.getTitle() || this._getContent();
 
-     };
 
-     _proto.addAttachmentClass = function addAttachmentClass(attachment) {
 
-       $(this.getTipElement()).addClass(CLASS_PREFIX$1 + "-" + attachment);
 
-     };
 
-     _proto.getTipElement = function getTipElement() {
 
-       this.tip = this.tip || $(this.config.template)[0];
 
-       return this.tip;
 
-     };
 
-     _proto.setContent = function setContent() {
 
-       var $tip = $(this.getTipElement()); // We use append for html objects to maintain js events
 
-       this.setElementContent($tip.find(Selector$7.TITLE), this.getTitle());
 
-       var content = this._getContent();
 
-       if (typeof content === 'function') {
 
-         content = content.call(this.element);
 
-       }
 
-       this.setElementContent($tip.find(Selector$7.CONTENT), content);
 
-       $tip.removeClass(ClassName$7.FADE + " " + ClassName$7.SHOW);
 
-     } // Private
 
-     ;
 
-     _proto._getContent = function _getContent() {
 
-       return this.element.getAttribute('data-content') || this.config.content;
 
-     };
 
-     _proto._cleanTipClass = function _cleanTipClass() {
 
-       var $tip = $(this.getTipElement());
 
-       var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX$1);
 
-       if (tabClass !== null && tabClass.length > 0) {
 
-         $tip.removeClass(tabClass.join(''));
 
-       }
 
-     } // Static
 
-     ;
 
-     Popover._jQueryInterface = function _jQueryInterface(config) {
 
-       return this.each(function () {
 
-         var data = $(this).data(DATA_KEY$7);
 
-         var _config = typeof config === 'object' ? config : null;
 
-         if (!data && /dispose|hide/.test(config)) {
 
-           return;
 
-         }
 
-         if (!data) {
 
-           data = new Popover(this, _config);
 
-           $(this).data(DATA_KEY$7, data);
 
-         }
 
-         if (typeof config === 'string') {
 
-           if (typeof data[config] === 'undefined') {
 
-             throw new TypeError("No method named \"" + config + "\"");
 
-           }
 
-           data[config]();
 
-         }
 
-       });
 
-     };
 
-     _createClass(Popover, null, [{
 
-       key: "VERSION",
 
-       // Getters
 
-       get: function get() {
 
-         return VERSION$7;
 
-       }
 
-     }, {
 
-       key: "Default",
 
-       get: function get() {
 
-         return Default$5;
 
-       }
 
-     }, {
 
-       key: "NAME",
 
-       get: function get() {
 
-         return NAME$7;
 
-       }
 
-     }, {
 
-       key: "DATA_KEY",
 
-       get: function get() {
 
-         return DATA_KEY$7;
 
-       }
 
-     }, {
 
-       key: "Event",
 
-       get: function get() {
 
-         return Event$7;
 
-       }
 
-     }, {
 
-       key: "EVENT_KEY",
 
-       get: function get() {
 
-         return EVENT_KEY$7;
 
-       }
 
-     }, {
 
-       key: "DefaultType",
 
-       get: function get() {
 
-         return DefaultType$5;
 
-       }
 
-     }]);
 
-     return Popover;
 
-   }(Tooltip);
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * jQuery
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   $.fn[NAME$7] = Popover._jQueryInterface;
 
-   $.fn[NAME$7].Constructor = Popover;
 
-   $.fn[NAME$7].noConflict = function () {
 
-     $.fn[NAME$7] = JQUERY_NO_CONFLICT$7;
 
-     return Popover._jQueryInterface;
 
-   };
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * Constants
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   var NAME$8 = 'scrollspy';
 
-   var VERSION$8 = '4.3.1';
 
-   var DATA_KEY$8 = 'bs.scrollspy';
 
-   var EVENT_KEY$8 = "." + DATA_KEY$8;
 
-   var DATA_API_KEY$6 = '.data-api';
 
-   var JQUERY_NO_CONFLICT$8 = $.fn[NAME$8];
 
-   var Default$6 = {
 
-     offset: 10,
 
-     method: 'auto',
 
-     target: ''
 
-   };
 
-   var DefaultType$6 = {
 
-     offset: 'number',
 
-     method: 'string',
 
-     target: '(string|element)'
 
-   };
 
-   var Event$8 = {
 
-     ACTIVATE: "activate" + EVENT_KEY$8,
 
-     SCROLL: "scroll" + EVENT_KEY$8,
 
-     LOAD_DATA_API: "load" + EVENT_KEY$8 + DATA_API_KEY$6
 
-   };
 
-   var ClassName$8 = {
 
-     DROPDOWN_ITEM: 'dropdown-item',
 
-     DROPDOWN_MENU: 'dropdown-menu',
 
-     ACTIVE: 'active'
 
-   };
 
-   var Selector$8 = {
 
-     DATA_SPY: '[data-spy="scroll"]',
 
-     ACTIVE: '.active',
 
-     NAV_LIST_GROUP: '.nav, .list-group',
 
-     NAV_LINKS: '.nav-link',
 
-     NAV_ITEMS: '.nav-item',
 
-     LIST_ITEMS: '.list-group-item',
 
-     DROPDOWN: '.dropdown',
 
-     DROPDOWN_ITEMS: '.dropdown-item',
 
-     DROPDOWN_TOGGLE: '.dropdown-toggle'
 
-   };
 
-   var OffsetMethod = {
 
-     OFFSET: 'offset',
 
-     POSITION: 'position'
 
-     /**
 
-      * ------------------------------------------------------------------------
 
-      * Class Definition
 
-      * ------------------------------------------------------------------------
 
-      */
 
-   };
 
-   var ScrollSpy =
 
-   /*#__PURE__*/
 
-   function () {
 
-     function ScrollSpy(element, config) {
 
-       var _this = this;
 
-       this._element = element;
 
-       this._scrollElement = element.tagName === 'BODY' ? window : element;
 
-       this._config = this._getConfig(config);
 
-       this._selector = this._config.target + " " + Selector$8.NAV_LINKS + "," + (this._config.target + " " + Selector$8.LIST_ITEMS + ",") + (this._config.target + " " + Selector$8.DROPDOWN_ITEMS);
 
-       this._offsets = [];
 
-       this._targets = [];
 
-       this._activeTarget = null;
 
-       this._scrollHeight = 0;
 
-       $(this._scrollElement).on(Event$8.SCROLL, function (event) {
 
-         return _this._process(event);
 
-       });
 
-       this.refresh();
 
-       this._process();
 
-     } // Getters
 
-     var _proto = ScrollSpy.prototype;
 
-     // Public
 
-     _proto.refresh = function refresh() {
 
-       var _this2 = this;
 
-       var autoMethod = this._scrollElement === this._scrollElement.window ? OffsetMethod.OFFSET : OffsetMethod.POSITION;
 
-       var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;
 
-       var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;
 
-       this._offsets = [];
 
-       this._targets = [];
 
-       this._scrollHeight = this._getScrollHeight();
 
-       var targets = [].slice.call(document.querySelectorAll(this._selector));
 
-       targets.map(function (element) {
 
-         var target;
 
-         var targetSelector = Util.getSelectorFromElement(element);
 
-         if (targetSelector) {
 
-           target = document.querySelector(targetSelector);
 
-         }
 
-         if (target) {
 
-           var targetBCR = target.getBoundingClientRect();
 
-           if (targetBCR.width || targetBCR.height) {
 
-             // TODO (fat): remove sketch reliance on jQuery position/offset
 
-             return [$(target)[offsetMethod]().top + offsetBase, targetSelector];
 
-           }
 
-         }
 
-         return null;
 
-       }).filter(function (item) {
 
-         return item;
 
-       }).sort(function (a, b) {
 
-         return a[0] - b[0];
 
-       }).forEach(function (item) {
 
-         _this2._offsets.push(item[0]);
 
-         _this2._targets.push(item[1]);
 
-       });
 
-     };
 
-     _proto.dispose = function dispose() {
 
-       $.removeData(this._element, DATA_KEY$8);
 
-       $(this._scrollElement).off(EVENT_KEY$8);
 
-       this._element = null;
 
-       this._scrollElement = null;
 
-       this._config = null;
 
-       this._selector = null;
 
-       this._offsets = null;
 
-       this._targets = null;
 
-       this._activeTarget = null;
 
-       this._scrollHeight = null;
 
-     } // Private
 
-     ;
 
-     _proto._getConfig = function _getConfig(config) {
 
-       config = _objectSpread({}, Default$6, typeof config === 'object' && config ? config : {});
 
-       if (typeof config.target !== 'string') {
 
-         var id = $(config.target).attr('id');
 
-         if (!id) {
 
-           id = Util.getUID(NAME$8);
 
-           $(config.target).attr('id', id);
 
-         }
 
-         config.target = "#" + id;
 
-       }
 
-       Util.typeCheckConfig(NAME$8, config, DefaultType$6);
 
-       return config;
 
-     };
 
-     _proto._getScrollTop = function _getScrollTop() {
 
-       return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;
 
-     };
 
-     _proto._getScrollHeight = function _getScrollHeight() {
 
-       return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
 
-     };
 
-     _proto._getOffsetHeight = function _getOffsetHeight() {
 
-       return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;
 
-     };
 
-     _proto._process = function _process() {
 
-       var scrollTop = this._getScrollTop() + this._config.offset;
 
-       var scrollHeight = this._getScrollHeight();
 
-       var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();
 
-       if (this._scrollHeight !== scrollHeight) {
 
-         this.refresh();
 
-       }
 
-       if (scrollTop >= maxScroll) {
 
-         var target = this._targets[this._targets.length - 1];
 
-         if (this._activeTarget !== target) {
 
-           this._activate(target);
 
-         }
 
-         return;
 
-       }
 
-       if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {
 
-         this._activeTarget = null;
 
-         this._clear();
 
-         return;
 
-       }
 
-       var offsetLength = this._offsets.length;
 
-       for (var i = offsetLength; i--;) {
 
-         var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);
 
-         if (isActiveTarget) {
 
-           this._activate(this._targets[i]);
 
-         }
 
-       }
 
-     };
 
-     _proto._activate = function _activate(target) {
 
-       this._activeTarget = target;
 
-       this._clear();
 
-       var queries = this._selector.split(',').map(function (selector) {
 
-         return selector + "[data-target=\"" + target + "\"]," + selector + "[href=\"" + target + "\"]";
 
-       });
 
-       var $link = $([].slice.call(document.querySelectorAll(queries.join(','))));
 
-       if ($link.hasClass(ClassName$8.DROPDOWN_ITEM)) {
 
-         $link.closest(Selector$8.DROPDOWN).find(Selector$8.DROPDOWN_TOGGLE).addClass(ClassName$8.ACTIVE);
 
-         $link.addClass(ClassName$8.ACTIVE);
 
-       } else {
 
-         // Set triggered link as active
 
-         $link.addClass(ClassName$8.ACTIVE); // Set triggered links parents as active
 
-         // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
 
-         $link.parents(Selector$8.NAV_LIST_GROUP).prev(Selector$8.NAV_LINKS + ", " + Selector$8.LIST_ITEMS).addClass(ClassName$8.ACTIVE); // Handle special case when .nav-link is inside .nav-item
 
-         $link.parents(Selector$8.NAV_LIST_GROUP).prev(Selector$8.NAV_ITEMS).children(Selector$8.NAV_LINKS).addClass(ClassName$8.ACTIVE);
 
-       }
 
-       $(this._scrollElement).trigger(Event$8.ACTIVATE, {
 
-         relatedTarget: target
 
-       });
 
-     };
 
-     _proto._clear = function _clear() {
 
-       [].slice.call(document.querySelectorAll(this._selector)).filter(function (node) {
 
-         return node.classList.contains(ClassName$8.ACTIVE);
 
-       }).forEach(function (node) {
 
-         return node.classList.remove(ClassName$8.ACTIVE);
 
-       });
 
-     } // Static
 
-     ;
 
-     ScrollSpy._jQueryInterface = function _jQueryInterface(config) {
 
-       return this.each(function () {
 
-         var data = $(this).data(DATA_KEY$8);
 
-         var _config = typeof config === 'object' && config;
 
-         if (!data) {
 
-           data = new ScrollSpy(this, _config);
 
-           $(this).data(DATA_KEY$8, data);
 
-         }
 
-         if (typeof config === 'string') {
 
-           if (typeof data[config] === 'undefined') {
 
-             throw new TypeError("No method named \"" + config + "\"");
 
-           }
 
-           data[config]();
 
-         }
 
-       });
 
-     };
 
-     _createClass(ScrollSpy, null, [{
 
-       key: "VERSION",
 
-       get: function get() {
 
-         return VERSION$8;
 
-       }
 
-     }, {
 
-       key: "Default",
 
-       get: function get() {
 
-         return Default$6;
 
-       }
 
-     }]);
 
-     return ScrollSpy;
 
-   }();
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * Data Api implementation
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   $(window).on(Event$8.LOAD_DATA_API, function () {
 
-     var scrollSpys = [].slice.call(document.querySelectorAll(Selector$8.DATA_SPY));
 
-     var scrollSpysLength = scrollSpys.length;
 
-     for (var i = scrollSpysLength; i--;) {
 
-       var $spy = $(scrollSpys[i]);
 
-       ScrollSpy._jQueryInterface.call($spy, $spy.data());
 
-     }
 
-   });
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * jQuery
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   $.fn[NAME$8] = ScrollSpy._jQueryInterface;
 
-   $.fn[NAME$8].Constructor = ScrollSpy;
 
-   $.fn[NAME$8].noConflict = function () {
 
-     $.fn[NAME$8] = JQUERY_NO_CONFLICT$8;
 
-     return ScrollSpy._jQueryInterface;
 
-   };
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * Constants
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   var NAME$9 = 'tab';
 
-   var VERSION$9 = '4.3.1';
 
-   var DATA_KEY$9 = 'bs.tab';
 
-   var EVENT_KEY$9 = "." + DATA_KEY$9;
 
-   var DATA_API_KEY$7 = '.data-api';
 
-   var JQUERY_NO_CONFLICT$9 = $.fn[NAME$9];
 
-   var Event$9 = {
 
-     HIDE: "hide" + EVENT_KEY$9,
 
-     HIDDEN: "hidden" + EVENT_KEY$9,
 
-     SHOW: "show" + EVENT_KEY$9,
 
-     SHOWN: "shown" + EVENT_KEY$9,
 
-     CLICK_DATA_API: "click" + EVENT_KEY$9 + DATA_API_KEY$7
 
-   };
 
-   var ClassName$9 = {
 
-     DROPDOWN_MENU: 'dropdown-menu',
 
-     ACTIVE: 'active',
 
-     DISABLED: 'disabled',
 
-     FADE: 'fade',
 
-     SHOW: 'show'
 
-   };
 
-   var Selector$9 = {
 
-     DROPDOWN: '.dropdown',
 
-     NAV_LIST_GROUP: '.nav, .list-group',
 
-     ACTIVE: '.active',
 
-     ACTIVE_UL: '> li > .active',
 
-     DATA_TOGGLE: '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',
 
-     DROPDOWN_TOGGLE: '.dropdown-toggle',
 
-     DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'
 
-     /**
 
-      * ------------------------------------------------------------------------
 
-      * Class Definition
 
-      * ------------------------------------------------------------------------
 
-      */
 
-   };
 
-   var Tab =
 
-   /*#__PURE__*/
 
-   function () {
 
-     function Tab(element) {
 
-       this._element = element;
 
-     } // Getters
 
-     var _proto = Tab.prototype;
 
-     // Public
 
-     _proto.show = function show() {
 
-       var _this = this;
 
-       if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName$9.ACTIVE) || $(this._element).hasClass(ClassName$9.DISABLED)) {
 
-         return;
 
-       }
 
-       var target;
 
-       var previous;
 
-       var listElement = $(this._element).closest(Selector$9.NAV_LIST_GROUP)[0];
 
-       var selector = Util.getSelectorFromElement(this._element);
 
-       if (listElement) {
 
-         var itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? Selector$9.ACTIVE_UL : Selector$9.ACTIVE;
 
-         previous = $.makeArray($(listElement).find(itemSelector));
 
-         previous = previous[previous.length - 1];
 
-       }
 
-       var hideEvent = $.Event(Event$9.HIDE, {
 
-         relatedTarget: this._element
 
-       });
 
-       var showEvent = $.Event(Event$9.SHOW, {
 
-         relatedTarget: previous
 
-       });
 
-       if (previous) {
 
-         $(previous).trigger(hideEvent);
 
-       }
 
-       $(this._element).trigger(showEvent);
 
-       if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {
 
-         return;
 
-       }
 
-       if (selector) {
 
-         target = document.querySelector(selector);
 
-       }
 
-       this._activate(this._element, listElement);
 
-       var complete = function complete() {
 
-         var hiddenEvent = $.Event(Event$9.HIDDEN, {
 
-           relatedTarget: _this._element
 
-         });
 
-         var shownEvent = $.Event(Event$9.SHOWN, {
 
-           relatedTarget: previous
 
-         });
 
-         $(previous).trigger(hiddenEvent);
 
-         $(_this._element).trigger(shownEvent);
 
-       };
 
-       if (target) {
 
-         this._activate(target, target.parentNode, complete);
 
-       } else {
 
-         complete();
 
-       }
 
-     };
 
-     _proto.dispose = function dispose() {
 
-       $.removeData(this._element, DATA_KEY$9);
 
-       this._element = null;
 
-     } // Private
 
-     ;
 
-     _proto._activate = function _activate(element, container, callback) {
 
-       var _this2 = this;
 
-       var activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? $(container).find(Selector$9.ACTIVE_UL) : $(container).children(Selector$9.ACTIVE);
 
-       var active = activeElements[0];
 
-       var isTransitioning = callback && active && $(active).hasClass(ClassName$9.FADE);
 
-       var complete = function complete() {
 
-         return _this2._transitionComplete(element, active, callback);
 
-       };
 
-       if (active && isTransitioning) {
 
-         var transitionDuration = Util.getTransitionDurationFromElement(active);
 
-         $(active).removeClass(ClassName$9.SHOW).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
 
-       } else {
 
-         complete();
 
-       }
 
-     };
 
-     _proto._transitionComplete = function _transitionComplete(element, active, callback) {
 
-       if (active) {
 
-         $(active).removeClass(ClassName$9.ACTIVE);
 
-         var dropdownChild = $(active.parentNode).find(Selector$9.DROPDOWN_ACTIVE_CHILD)[0];
 
-         if (dropdownChild) {
 
-           $(dropdownChild).removeClass(ClassName$9.ACTIVE);
 
-         }
 
-         if (active.getAttribute('role') === 'tab') {
 
-           active.setAttribute('aria-selected', false);
 
-         }
 
-       }
 
-       $(element).addClass(ClassName$9.ACTIVE);
 
-       if (element.getAttribute('role') === 'tab') {
 
-         element.setAttribute('aria-selected', true);
 
-       }
 
-       Util.reflow(element);
 
-       if (element.classList.contains(ClassName$9.FADE)) {
 
-         element.classList.add(ClassName$9.SHOW);
 
-       }
 
-       if (element.parentNode && $(element.parentNode).hasClass(ClassName$9.DROPDOWN_MENU)) {
 
-         var dropdownElement = $(element).closest(Selector$9.DROPDOWN)[0];
 
-         if (dropdownElement) {
 
-           var dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector$9.DROPDOWN_TOGGLE));
 
-           $(dropdownToggleList).addClass(ClassName$9.ACTIVE);
 
-         }
 
-         element.setAttribute('aria-expanded', true);
 
-       }
 
-       if (callback) {
 
-         callback();
 
-       }
 
-     } // Static
 
-     ;
 
-     Tab._jQueryInterface = function _jQueryInterface(config) {
 
-       return this.each(function () {
 
-         var $this = $(this);
 
-         var data = $this.data(DATA_KEY$9);
 
-         if (!data) {
 
-           data = new Tab(this);
 
-           $this.data(DATA_KEY$9, data);
 
-         }
 
-         if (typeof config === 'string') {
 
-           if (typeof data[config] === 'undefined') {
 
-             throw new TypeError("No method named \"" + config + "\"");
 
-           }
 
-           data[config]();
 
-         }
 
-       });
 
-     };
 
-     _createClass(Tab, null, [{
 
-       key: "VERSION",
 
-       get: function get() {
 
-         return VERSION$9;
 
-       }
 
-     }]);
 
-     return Tab;
 
-   }();
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * Data Api implementation
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   $(document).on(Event$9.CLICK_DATA_API, Selector$9.DATA_TOGGLE, function (event) {
 
-     event.preventDefault();
 
-     Tab._jQueryInterface.call($(this), 'show');
 
-   });
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * jQuery
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   $.fn[NAME$9] = Tab._jQueryInterface;
 
-   $.fn[NAME$9].Constructor = Tab;
 
-   $.fn[NAME$9].noConflict = function () {
 
-     $.fn[NAME$9] = JQUERY_NO_CONFLICT$9;
 
-     return Tab._jQueryInterface;
 
-   };
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * Constants
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   var NAME$a = 'toast';
 
-   var VERSION$a = '4.3.1';
 
-   var DATA_KEY$a = 'bs.toast';
 
-   var EVENT_KEY$a = "." + DATA_KEY$a;
 
-   var JQUERY_NO_CONFLICT$a = $.fn[NAME$a];
 
-   var Event$a = {
 
-     CLICK_DISMISS: "click.dismiss" + EVENT_KEY$a,
 
-     HIDE: "hide" + EVENT_KEY$a,
 
-     HIDDEN: "hidden" + EVENT_KEY$a,
 
-     SHOW: "show" + EVENT_KEY$a,
 
-     SHOWN: "shown" + EVENT_KEY$a
 
-   };
 
-   var ClassName$a = {
 
-     FADE: 'fade',
 
-     HIDE: 'hide',
 
-     SHOW: 'show',
 
-     SHOWING: 'showing'
 
-   };
 
-   var DefaultType$7 = {
 
-     animation: 'boolean',
 
-     autohide: 'boolean',
 
-     delay: 'number'
 
-   };
 
-   var Default$7 = {
 
-     animation: true,
 
-     autohide: true,
 
-     delay: 500
 
-   };
 
-   var Selector$a = {
 
-     DATA_DISMISS: '[data-dismiss="toast"]'
 
-     /**
 
-      * ------------------------------------------------------------------------
 
-      * Class Definition
 
-      * ------------------------------------------------------------------------
 
-      */
 
-   };
 
-   var Toast =
 
-   /*#__PURE__*/
 
-   function () {
 
-     function Toast(element, config) {
 
-       this._element = element;
 
-       this._config = this._getConfig(config);
 
-       this._timeout = null;
 
-       this._setListeners();
 
-     } // Getters
 
-     var _proto = Toast.prototype;
 
-     // Public
 
-     _proto.show = function show() {
 
-       var _this = this;
 
-       $(this._element).trigger(Event$a.SHOW);
 
-       if (this._config.animation) {
 
-         this._element.classList.add(ClassName$a.FADE);
 
-       }
 
-       var complete = function complete() {
 
-         _this._element.classList.remove(ClassName$a.SHOWING);
 
-         _this._element.classList.add(ClassName$a.SHOW);
 
-         $(_this._element).trigger(Event$a.SHOWN);
 
-         if (_this._config.autohide) {
 
-           _this.hide();
 
-         }
 
-       };
 
-       this._element.classList.remove(ClassName$a.HIDE);
 
-       this._element.classList.add(ClassName$a.SHOWING);
 
-       if (this._config.animation) {
 
-         var transitionDuration = Util.getTransitionDurationFromElement(this._element);
 
-         $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
 
-       } else {
 
-         complete();
 
-       }
 
-     };
 
-     _proto.hide = function hide(withoutTimeout) {
 
-       var _this2 = this;
 
-       if (!this._element.classList.contains(ClassName$a.SHOW)) {
 
-         return;
 
-       }
 
-       $(this._element).trigger(Event$a.HIDE);
 
-       if (withoutTimeout) {
 
-         this._close();
 
-       } else {
 
-         this._timeout = setTimeout(function () {
 
-           _this2._close();
 
-         }, this._config.delay);
 
-       }
 
-     };
 
-     _proto.dispose = function dispose() {
 
-       clearTimeout(this._timeout);
 
-       this._timeout = null;
 
-       if (this._element.classList.contains(ClassName$a.SHOW)) {
 
-         this._element.classList.remove(ClassName$a.SHOW);
 
-       }
 
-       $(this._element).off(Event$a.CLICK_DISMISS);
 
-       $.removeData(this._element, DATA_KEY$a);
 
-       this._element = null;
 
-       this._config = null;
 
-     } // Private
 
-     ;
 
-     _proto._getConfig = function _getConfig(config) {
 
-       config = _objectSpread({}, Default$7, $(this._element).data(), typeof config === 'object' && config ? config : {});
 
-       Util.typeCheckConfig(NAME$a, config, this.constructor.DefaultType);
 
-       return config;
 
-     };
 
-     _proto._setListeners = function _setListeners() {
 
-       var _this3 = this;
 
-       $(this._element).on(Event$a.CLICK_DISMISS, Selector$a.DATA_DISMISS, function () {
 
-         return _this3.hide(true);
 
-       });
 
-     };
 
-     _proto._close = function _close() {
 
-       var _this4 = this;
 
-       var complete = function complete() {
 
-         _this4._element.classList.add(ClassName$a.HIDE);
 
-         $(_this4._element).trigger(Event$a.HIDDEN);
 
-       };
 
-       this._element.classList.remove(ClassName$a.SHOW);
 
-       if (this._config.animation) {
 
-         var transitionDuration = Util.getTransitionDurationFromElement(this._element);
 
-         $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
 
-       } else {
 
-         complete();
 
-       }
 
-     } // Static
 
-     ;
 
-     Toast._jQueryInterface = function _jQueryInterface(config) {
 
-       return this.each(function () {
 
-         var $element = $(this);
 
-         var data = $element.data(DATA_KEY$a);
 
-         var _config = typeof config === 'object' && config;
 
-         if (!data) {
 
-           data = new Toast(this, _config);
 
-           $element.data(DATA_KEY$a, data);
 
-         }
 
-         if (typeof config === 'string') {
 
-           if (typeof data[config] === 'undefined') {
 
-             throw new TypeError("No method named \"" + config + "\"");
 
-           }
 
-           data[config](this);
 
-         }
 
-       });
 
-     };
 
-     _createClass(Toast, null, [{
 
-       key: "VERSION",
 
-       get: function get() {
 
-         return VERSION$a;
 
-       }
 
-     }, {
 
-       key: "DefaultType",
 
-       get: function get() {
 
-         return DefaultType$7;
 
-       }
 
-     }, {
 
-       key: "Default",
 
-       get: function get() {
 
-         return Default$7;
 
-       }
 
-     }]);
 
-     return Toast;
 
-   }();
 
-   /**
 
-    * ------------------------------------------------------------------------
 
-    * jQuery
 
-    * ------------------------------------------------------------------------
 
-    */
 
-   $.fn[NAME$a] = Toast._jQueryInterface;
 
-   $.fn[NAME$a].Constructor = Toast;
 
-   $.fn[NAME$a].noConflict = function () {
 
-     $.fn[NAME$a] = JQUERY_NO_CONFLICT$a;
 
-     return Toast._jQueryInterface;
 
-   };
 
-   /**
 
-    * --------------------------------------------------------------------------
 
-    * Bootstrap (v4.3.1): index.js
 
-    * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 
-    * --------------------------------------------------------------------------
 
-    */
 
-   (function () {
 
-     if (typeof $ === 'undefined') {
 
-       throw new TypeError('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.');
 
-     }
 
-     var version = $.fn.jquery.split(' ')[0].split('.');
 
-     var minMajor = 1;
 
-     var ltMajor = 2;
 
-     var minMinor = 9;
 
-     var minPatch = 1;
 
-     var maxMajor = 4;
 
-     if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {
 
-       throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');
 
-     }
 
-   })();
 
-   exports.Util = Util;
 
-   exports.Alert = Alert;
 
-   exports.Button = Button;
 
-   exports.Carousel = Carousel;
 
-   exports.Collapse = Collapse;
 
-   exports.Dropdown = Dropdown;
 
-   exports.Modal = Modal;
 
-   exports.Popover = Popover;
 
-   exports.Scrollspy = ScrollSpy;
 
-   exports.Tab = Tab;
 
-   exports.Toast = Toast;
 
-   exports.Tooltip = Tooltip;
 
-   Object.defineProperty(exports, '__esModule', { value: true });
 
- }));
 
- //# sourceMappingURL=bootstrap.js.map
 
- /*! @preserve
 
-  * bootbox.js
 
-  * version: 5.1.1
 
-  * author: Nick Payne <nick@kurai.co.uk>
 
-  * license: MIT
 
-  * http://bootboxjs.com/
 
-  */
 
- (function (root, factory) {
 
-   'use strict';
 
-   if (typeof define === 'function' && define.amd) {
 
-     // AMD
 
-     define(['jquery'], factory);
 
-   } else if (typeof exports === 'object') {
 
-     // Node, CommonJS-like
 
-     module.exports = factory(require('jquery'));
 
-   } else {
 
-     // Browser globals (root is window)
 
-     root.bootbox = factory(root.jQuery);
 
-   }
 
- }(this, function init($, undefined) {
 
-   'use strict';
 
-   //  Polyfills Object.keys, if necessary.
 
-   //  @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
 
-   if (!Object.keys) {
 
-     Object.keys = (function () {
 
-       var hasOwnProperty = Object.prototype.hasOwnProperty,
 
-         hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),
 
-         dontEnums = [
 
-           'toString',
 
-           'toLocaleString',
 
-           'valueOf',
 
-           'hasOwnProperty',
 
-           'isPrototypeOf',
 
-           'propertyIsEnumerable',
 
-           'constructor'
 
-         ],
 
-         dontEnumsLength = dontEnums.length;
 
-       return function (obj) {
 
-         if (typeof obj !== 'function' && (typeof obj !== 'object' || obj === null)) {
 
-           throw new TypeError('Object.keys called on non-object');
 
-         }
 
-         var result = [], prop, i;
 
-         for (prop in obj) {
 
-           if (hasOwnProperty.call(obj, prop)) {
 
-             result.push(prop);
 
-           }
 
-         }
 
-         if (hasDontEnumBug) {
 
-           for (i = 0; i < dontEnumsLength; i++) {
 
-             if (hasOwnProperty.call(obj, dontEnums[i])) {
 
-               result.push(dontEnums[i]);
 
-             }
 
-           }
 
-         }
 
-         return result;
 
-       };
 
-     }());
 
-   }
 
-   var exports = {};
 
-   var VERSION = '5.0.0';
 
-   exports.VERSION = VERSION;
 
-   var locales = {};
 
-   var templates = {
 
-     dialog:
 
-     '<div class="bootbox modal" tabindex="-1" role="dialog" aria-hidden="true">' +
 
-     '<div class="modal-dialog">' +
 
-     '<div class="modal-content">' +
 
-     '<div class="modal-body"><div class="bootbox-body"></div></div>' +
 
-     '</div>' +
 
-     '</div>' +
 
-     '</div>',
 
-     header:
 
-     '<div class="modal-header">' +
 
-     '<h5 class="modal-title"></h5>' +
 
-     '</div>',
 
-     footer:
 
-     '<div class="modal-footer"></div>',
 
-     closeButton:
 
-     '<button type="button" class="bootbox-close-button close" aria-hidden="true">×</button>',
 
-     form:
 
-     '<form class="bootbox-form"></form>',
 
-     button:
 
-     '<button type="button" class="btn"></button>',
 
-     option:
 
-     '<option></option>',
 
-     promptMessage:
 
-     '<div class="bootbox-prompt-message"></div>',
 
-     inputs: {
 
-       text:
 
-       '<input class="bootbox-input bootbox-input-text form-control" autocomplete="off" type="text" />',
 
-       textarea:
 
-       '<textarea class="bootbox-input bootbox-input-textarea form-control"></textarea>',
 
-       email:
 
-       '<input class="bootbox-input bootbox-input-email form-control" autocomplete="off" type="email" />',
 
-       select:
 
-       '<select class="bootbox-input bootbox-input-select form-control"></select>',
 
-       checkbox:
 
-       '<div class="form-check checkbox"><label class="form-check-label"><input class="form-check-input bootbox-input bootbox-input-checkbox" type="checkbox" /></label></div>',
 
-       radio:
 
-       '<div class="form-check radio"><label class="form-check-label"><input class="form-check-input bootbox-input bootbox-input-radio" type="radio" name="bootbox-radio" /></label></div>',
 
-       date:
 
-       '<input class="bootbox-input bootbox-input-date form-control" autocomplete="off" type="date" />',
 
-       time:
 
-       '<input class="bootbox-input bootbox-input-time form-control" autocomplete="off" type="time" />',
 
-       number:
 
-       '<input class="bootbox-input bootbox-input-number form-control" autocomplete="off" type="number" />',
 
-       password:
 
-       '<input class="bootbox-input bootbox-input-password form-control" autocomplete="off" type="password" />',
 
-       range:
 
-       '<input class="bootbox-input bootbox-input-range form-control-range" autocomplete="off" type="range" />'
 
-     }
 
-   };
 
-   var defaults = {
 
-     // default language
 
-     locale: 'en',
 
-     // show backdrop or not. Default to static so user has to interact with dialog
 
-     backdrop: 'static',
 
-     // animate the modal in/out
 
-     animate: true,
 
-     // additional class string applied to the top level dialog
 
-     className: null,
 
-     // whether or not to include a close button
 
-     closeButton: true,
 
-     // show the dialog immediately by default
 
-     show: true,
 
-     // dialog container
 
-     container: 'body',
 
-     // default value (used by the prompt helper)
 
-     value: '',
 
-     // default input type (used by the prompt helper)
 
-     inputType: 'text',
 
-     // switch button order from cancel/confirm (default) to confirm/cancel
 
-     swapButtonOrder: false,
 
-     // center modal vertically in page
 
-     centerVertical: false,
 
-     // Append "multiple" property to the select when using the "prompt" helper
 
-     multiple: false,
 
-     // Automatically scroll modal content when height exceeds viewport height
 
-     scrollable: false
 
-   };
 
-   // PUBLIC FUNCTIONS
 
-   // *************************************************************************************************************
 
-   // Return all currently registered locales, or a specific locale if "name" is defined
 
-   exports.locales = function (name) {
 
-     return name ? locales[name] : locales;
 
-   };
 
-   // Register localized strings for the OK, Confirm, and Cancel buttons
 
-   exports.addLocale = function (name, values) {
 
-     $.each(['OK', 'CANCEL', 'CONFIRM'], function (_, v) {
 
-       if (!values[v]) {
 
-         throw new Error('Please supply a translation for "' + v + '"');
 
-       }
 
-     });
 
-     locales[name] = {
 
-       OK: values.OK,
 
-       CANCEL: values.CANCEL,
 
-       CONFIRM: values.CONFIRM
 
-     };
 
-     return exports;
 
-   };
 
-   // Remove a previously-registered locale
 
-   exports.removeLocale = function (name) {
 
-     if (name !== 'en') {
 
-       delete locales[name];
 
-     }
 
-     else {
 
-       throw new Error('"en" is used as the default and fallback locale and cannot be removed.');
 
-     }
 
-     return exports;
 
-   };
 
-   // Set the default locale
 
-   exports.setLocale = function (name) {
 
-     return exports.setDefaults('locale', name);
 
-   };
 
-   // Override default value(s) of Bootbox.
 
-   exports.setDefaults = function () {
 
-     var values = {};
 
-     if (arguments.length === 2) {
 
-       // allow passing of single key/value...
 
-       values[arguments[0]] = arguments[1];
 
-     } else {
 
-       // ... and as an object too
 
-       values = arguments[0];
 
-     }
 
-     $.extend(defaults, values);
 
-     return exports;
 
-   };
 
-   exports.setTemplates = function () {
 
-     var values = {};
 
-      if (arguments.length === 3) {
 
-       // allow passing of {key1: {key2: value}} as setTemplates(key1, key2, value)...
 
-       values[arguments[0]] = {};
 
-       values[arguments[0]][arguments[1]] = arguments[2];
 
-     } else if (arguments.length === 2) {
 
-       // ...or allow passing of {key: value} as setTemplates(key, value)...
 
-       values[arguments[0]] = arguments[1];
 
-     } else {
 
-       // ... and as an object too setTemplates(value)
 
-       values = arguments[0];
 
-     }
 
-      $.extend(templates, values);
 
-   };
 
-   // Hides all currently active Bootbox modals
 
-   exports.hideAll = function () {
 
-     $('.bootbox').modal('hide');
 
-     return exports;
 
-   };
 
-   // Allows the base init() function to be overridden
 
-   exports.init = function (_$) {
 
-     return init(_$ || $);
 
-   };
 
-   // CORE HELPER FUNCTIONS
 
-   // *************************************************************************************************************
 
-   // Core dialog function
 
-   exports.dialog = function (options) {
 
-     if ($.fn.modal === undefined) {
 
-       throw new Error(
 
-         '"$.fn.modal" is not defined; please double check you have included ' +
 
-         'the Bootstrap JavaScript library. See http://getbootstrap.com/javascript/ ' +
 
-         'for more details.'
 
-       );
 
-     }
 
-     options = sanitize(options);
 
-     if ($.fn.modal.Constructor.VERSION) {
 
-       options.fullBootstrapVersion = $.fn.modal.Constructor.VERSION;
 
-       var i = options.fullBootstrapVersion.indexOf('.');
 
-       options.bootstrap = options.fullBootstrapVersion.substring(0, i);
 
-     }
 
-     else {
 
-       // Assuming version 2.3.2, as that was the last "supported" 2.x version
 
-       options.bootstrap = '2';
 
-       options.fullBootstrapVersion = '2.3.2';
 
-       console.warn('Bootbox will *mostly* work with Bootstrap 2, but we do not officially support it. Please upgrade, if possible.');
 
-     }
 
-     var dialog = $(templates.dialog);
 
-     var innerDialog = dialog.find('.modal-dialog');
 
-     var body = dialog.find('.modal-body');
 
-     var header = $(templates.header);
 
-     var footer = $(templates.footer);
 
-     var buttons = options.buttons;
 
-     var callbacks = {
 
-       onEscape: options.onEscape
 
-     };
 
-     body.find('.bootbox-body').html(options.message);
 
-     // Only attempt to create buttons if at least one has 
 
-     // been defined in the options object
 
-     if (getKeyLength(options.buttons) > 0) {
 
-       each(buttons, function (key, b) {
 
-         var button = $(templates.button);
 
-         button.data('bb-handler', key);
 
-         button.addClass(b.className);
 
-         switch(key)
 
-         {
 
-           case 'ok':
 
-           case 'confirm':
 
-             button.addClass('bootbox-accept');
 
-             break;
 
-           case 'cancel':
 
-             button.addClass('bootbox-cancel');
 
-             break;
 
-         }
 
-         button.html(b.label);
 
-         footer.append(button);
 
-         callbacks[key] = b.callback;
 
-       });
 
-       body.after(footer);
 
-     }
 
-     if (options.animate === true) {
 
-       dialog.addClass('fade');
 
-     }
 
-     if (options.className) {
 
-       dialog.addClass(options.className);
 
-     }
 
-     if (options.size) {
 
-       // Requires Bootstrap 3.1.0 or higher
 
-       if (options.fullBootstrapVersion.substring(0, 3) < '3.1') {
 
-         console.warn('"size" requires Bootstrap 3.1.0 or higher. You appear to be using ' + options.fullBootstrapVersion + '. Please upgrade to use this option.');
 
-       }
 
-       switch(options.size)
 
-       {
 
-         case 'small':
 
-         case 'sm':
 
-           innerDialog.addClass('modal-sm');
 
-           break;
 
-         case 'large':
 
-         case 'lg':
 
-           innerDialog.addClass('modal-lg');
 
-           break;
 
-         case 'xl':
 
-         case 'extra-large':
 
-           // Requires Bootstrap 4.2.0 or higher
 
-           if (options.fullBootstrapVersion.substring(0, 3) < '4.2') {
 
-             console.warn('Using size "xl"/"extra-large" requires Bootstrap 4.2.0 or higher. You appear to be using ' + options.fullBootstrapVersion + '. Please upgrade to use this option.');
 
-           }
 
-           innerDialog.addClass('modal-xl');
 
-           break;
 
-       }
 
-     }
 
-     if(options.scrollable){
 
-       // Requires Bootstrap 4.3.0 or higher
 
-       if (options.fullBootstrapVersion.substring(0, 3) < '4.3') {
 
-         console.warn('Using "scrollable" requires Bootstrap 4.3.0 or higher. You appear to be using ' + options.fullBootstrapVersion + '. Please upgrade to use this option.');
 
-       }
 
-       innerDialog.addClass('modal-dialog-scrollable');
 
-     }
 
-     if (options.title) {
 
-       body.before(header);
 
-       dialog.find('.modal-title').html(options.title);
 
-     }
 
-     if (options.closeButton) {
 
-       var closeButton = $(templates.closeButton);
 
-       if (options.title) {
 
-         if (options.bootstrap > 3) {
 
-           dialog.find('.modal-header').append(closeButton);
 
-         }
 
-         else {
 
-           dialog.find('.modal-header').prepend(closeButton);
 
-         }
 
-       } else {
 
-         closeButton.prependTo(body);
 
-       }
 
-     }
 
-     if(options.centerVertical){
 
-       // Requires Bootstrap 4.0.0-beta.3 or higher
 
-       if (options.fullBootstrapVersion < '4.0.0') {
 
-         console.warn('"centerVertical" requires Bootstrap 4.0.0-beta.3 or higher. You appear to be using ' + options.fullBootstrapVersion + '. Please upgrade to use this option.');
 
-       }
 
-       innerDialog.addClass('modal-dialog-centered');
 
-     }
 
-     // Bootstrap event listeners; these handle extra
 
-     // setup & teardown required after the underlying
 
-     // modal has performed certain actions.
 
-     // make sure we unbind any listeners once the dialog has definitively been dismissed
 
-       dialog.one('hide.bs.modal', function (e) {
 
-         if (e.target === this) {
 
-           dialog.off('escape.close.bb');
 
-           dialog.off('click');
 
-         }
 
-     });
 
-     dialog.one('hidden.bs.modal', function (e) {
 
-       // ensure we don't accidentally intercept hidden events triggered
 
-       // by children of the current dialog. We shouldn't need to handle this anymore, 
 
-       // now that Bootstrap namespaces its events, but still worth doing.
 
-       if (e.target === this) {
 
-         dialog.remove();
 
-       }
 
-     });
 
-     dialog.one('shown.bs.modal', function () {
 
-       dialog.find('.bootbox-accept:first').trigger('focus');
 
-     });
 
-     // Bootbox event listeners; used to decouple some
 
-     // behaviours from their respective triggers
 
-     if (options.backdrop !== 'static') {
 
-       // A boolean true/false according to the Bootstrap docs
 
-       // should show a dialog the user can dismiss by clicking on
 
-       // the background.
 
-       // We always only ever pass static/false to the actual
 
-       // $.modal function because with "true" we can't trap
 
-       // this event (the .modal-backdrop swallows it)
 
-       // However, we still want to sort of respect true
 
-       // and invoke the escape mechanism instead
 
-       dialog.on('click.dismiss.bs.modal', function (e) {
 
-         // @NOTE: the target varies in >= 3.3.x releases since the modal backdrop
 
-         // moved *inside* the outer dialog rather than *alongside* it
 
-         if (dialog.children('.modal-backdrop').length) {
 
-           e.currentTarget = dialog.children('.modal-backdrop').get(0);
 
-         }
 
-         if (e.target !== e.currentTarget) {
 
-           return;
 
-         }
 
-         dialog.trigger('escape.close.bb');
 
-       });
 
-     }
 
-     dialog.on('escape.close.bb', function (e) {
 
-       // the if statement looks redundant but it isn't; without it
 
-       // if we *didn't* have an onEscape handler then processCallback
 
-       // would automatically dismiss the dialog
 
-       if (callbacks.onEscape) {
 
-         processCallback(e, dialog, callbacks.onEscape);
 
-       }
 
-     });
 
-     dialog.on('click', '.modal-footer button:not(.disabled)', function (e) {
 
-       var callbackKey = $(this).data('bb-handler');
 
-       processCallback(e, dialog, callbacks[callbackKey]);
 
-     });
 
-     dialog.on('click', '.bootbox-close-button', function (e) {
 
-       // onEscape might be falsy but that's fine; the fact is
 
-       // if the user has managed to click the close button we
 
-       // have to close the dialog, callback or not
 
-       processCallback(e, dialog, callbacks.onEscape);
 
-     });
 
-     dialog.on('keyup', function (e) {
 
-       if (e.which === 27) {
 
-         dialog.trigger('escape.close.bb');
 
-       }
 
-     });
 
-     // the remainder of this method simply deals with adding our
 
-     // dialogent to the DOM, augmenting it with Bootstrap's modal
 
-     // functionality and then giving the resulting object back
 
-     // to our caller
 
-     $(options.container).append(dialog);
 
-     dialog.modal({
 
-       backdrop: options.backdrop ? 'static' : false,
 
-       keyboard: false,
 
-       show: false
 
-     });
 
-     if (options.show) {
 
-       dialog.modal('show');
 
-     }
 
-     return dialog;
 
-   };
 
-   // Helper function to simulate the native alert() behavior. **NOTE**: This is non-blocking, so any
 
-   // code that must happen after the alert is dismissed should be placed within the callback function 
 
-   // for this alert.
 
-   exports.alert = function () {
 
-     var options;
 
-     options = mergeDialogOptions('alert', ['ok'], ['message', 'callback'], arguments);
 
-     // @TODO: can this move inside exports.dialog when we're iterating over each
 
-     // button and checking its button.callback value instead?
 
-     if (options.callback && !$.isFunction(options.callback)) {
 
-       throw new Error('alert requires the "callback" property to be a function when provided');
 
-     }
 
-     // override the ok and escape callback to make sure they just invoke
 
-     // the single user-supplied one (if provided)
 
-     options.buttons.ok.callback = options.onEscape = function () {
 
-       if ($.isFunction(options.callback)) {
 
-         return options.callback.call(this);
 
-       }
 
-       return true;
 
-     };
 
-     return exports.dialog(options);
 
-   };
 
-   // Helper function to simulate the native confirm() behavior. **NOTE**: This is non-blocking, so any
 
-   // code that must happen after the confirm is dismissed should be placed within the callback function 
 
-   // for this confirm.
 
-   exports.confirm = function () {
 
-     var options;
 
-     options = mergeDialogOptions('confirm', ['cancel', 'confirm'], ['message', 'callback'], arguments);
 
-     // confirm specific validation; they don't make sense without a callback so make
 
-     // sure it's present
 
-     if (!$.isFunction(options.callback)) {
 
-       throw new Error('confirm requires a callback');
 
-     }
 
-     // overrides; undo anything the user tried to set they shouldn't have
 
-     options.buttons.cancel.callback = options.onEscape = function () {
 
-       return options.callback.call(this, false);
 
-     };
 
-     options.buttons.confirm.callback = function () {
 
-       return options.callback.call(this, true);
 
-     };
 
-     return exports.dialog(options);
 
-   };
 
-   // Helper function to simulate the native prompt() behavior. **NOTE**: This is non-blocking, so any
 
-   // code that must happen after the prompt is dismissed should be placed within the callback function 
 
-   // for this prompt.
 
-   exports.prompt = function () {
 
-     var options;
 
-     var promptDialog;
 
-     var form;
 
-     var input;
 
-     var shouldShow;
 
-     var inputOptions;
 
-     // we have to create our form first otherwise
 
-     // its value is undefined when gearing up our options
 
-     // @TODO this could be solved by allowing message to
 
-     // be a function instead...
 
-     form = $(templates.form);
 
-     // prompt defaults are more complex than others in that
 
-     // users can override more defaults
 
-     options = mergeDialogOptions('prompt', ['cancel', 'confirm'], ['title', 'callback'], arguments);
 
-     if (!options.value) {
 
-       options.value = defaults.value;
 
-     }
 
-     if (!options.inputType) {
 
-       options.inputType = defaults.inputType;
 
-     }
 
-     // capture the user's show value; we always set this to false before
 
-     // spawning the dialog to give us a chance to attach some handlers to
 
-     // it, but we need to make sure we respect a preference not to show it
 
-     shouldShow = (options.show === undefined) ? defaults.show : options.show;
 
-     // This is required prior to calling the dialog builder below - we need to 
 
-     // add an event handler just before the prompt is shown
 
-     options.show = false;
 
-     // Handles the 'cancel' action
 
-     options.buttons.cancel.callback = options.onEscape = function () {
 
-       return options.callback.call(this, null);
 
-     };
 
-     // Prompt submitted - extract the prompt value. This requires a bit of work, 
 
-     // given the different input types available.
 
-     options.buttons.confirm.callback = function () {
 
-       var value;
 
-       if (options.inputType === 'checkbox') {
 
-         value = input.find('input:checked').map(function () {
 
-           return $(this).val();
 
-         }).get();
 
-       } else if (options.inputType === 'radio') {
 
-         value = input.find('input:checked').val();
 
-       }
 
-       else {
 
-         if (input[0].checkValidity && !input[0].checkValidity()) {
 
-           // prevents button callback from being called
 
-           return false;
 
-         } else {
 
-           if (options.inputType === 'select' && options.multiple === true) {
 
-             value = input.find('option:selected').map(function () {
 
-               return $(this).val();
 
-             }).get();
 
-           }
 
-           else{
 
-             value = input.val();
 
-           }
 
-         }
 
-       }
 
-       return options.callback.call(this, value);
 
-     };
 
-     // prompt-specific validation
 
-     if (!options.title) {
 
-       throw new Error('prompt requires a title');
 
-     }
 
-     if (!$.isFunction(options.callback)) {
 
-       throw new Error('prompt requires a callback');
 
-     }
 
-     if (!templates.inputs[options.inputType]) {
 
-       throw new Error('Invalid prompt type');
 
-     }
 
-     // create the input based on the supplied type
 
-     input = $(templates.inputs[options.inputType]);
 
-     switch (options.inputType) {
 
-       case 'text':
 
-       case 'textarea':
 
-       case 'email':
 
-       case 'password':
 
-         input.val(options.value);
 
-         
 
-         if (options.placeholder) {
 
-           input.attr('placeholder', options.placeholder);
 
-         }
 
-     
 
-         if (options.pattern) {
 
-           input.attr('pattern', options.pattern);
 
-         }
 
-     
 
-         if (options.maxlength) {
 
-           input.attr('maxlength', options.maxlength);
 
-         }
 
-         if (options.required) {
 
-           input.prop({ 'required': true });
 
-         }
 
-         
 
-         if (options.rows && !isNaN(parseInt(options.rows))) {
 
-           if(options.inputType === 'textarea'){
 
-             input.attr({ 'rows': options.rows });
 
-           }
 
-         }
 
-         break;
 
-       case 'date':
 
-       case 'time':
 
-       case 'number':
 
-       case 'range':
 
-         input.val(options.value);
 
-         
 
-         if (options.placeholder) {
 
-           input.attr('placeholder', options.placeholder);
 
-         }
 
-     
 
-         if (options.pattern) {
 
-           input.attr('pattern', options.pattern);
 
-         }
 
-         if (options.required) {
 
-           input.prop({ 'required': true });
 
-         }
 
-         
 
-         // These input types have extra attributes which affect their input validation.
 
-         // Warning: For most browsers, date inputs are buggy in their implementation of 'step', so 
 
-         // this attribute will have no effect. Therefore, we don't set the attribute for date inputs.
 
-         // @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/date#Setting_maximum_and_minimum_dates
 
-         if (options.inputType !== 'date') {
 
-           if (options.step) {
 
-             if (options.step === 'any' || (!isNaN(options.step) && parseInt(options.step) > 0)) {
 
-               input.attr('step', options.step);
 
-             }
 
-             else {
 
-               throw new Error('"step" must be a valid positive number or the value "any". See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-step for more information.');
 
-             }
 
-           }
 
-         }
 
-         if(minAndMaxAreValid(options.inputType, options.min, options.max)){
 
-           if(options.min !== undefined){
 
-             input.attr('min', options.min);
 
-           }
 
-           if(options.max !== undefined){
 
-             input.attr('max', options.max);
 
-           }
 
-         }
 
-         break;
 
-       case 'select':
 
-         var groups = {};
 
-         inputOptions = options.inputOptions || [];
 
-         if (!$.isArray(inputOptions)) {
 
-           throw new Error('Please pass an array of input options');
 
-         }
 
-         if (!inputOptions.length) {
 
-           throw new Error('prompt with "inputType" set to "select" requires at least one option');
 
-         }
 
-         // placeholder is not actually a valid attribute for select,
 
-         // but we'll allow it, assuming it might be used for a plugin
 
-         if (options.placeholder) {
 
-           input.attr('placeholder', options.placeholder);
 
-         }
 
-         
 
-         if (options.required) {
 
-           input.prop({ 'required': true });
 
-         }
 
-         
 
-         if (options.multiple) {
 
-           input.prop({ 'multiple': true });
 
-         }
 
-         
 
-         each(inputOptions, function (_, option) {
 
-           // assume the element to attach to is the input...
 
-           var elem = input;
 
-           if (option.value === undefined || option.text === undefined) {
 
-             throw new Error('each option needs a "value" property and a "text" property');
 
-           }
 
-           // ... but override that element if this option sits in a group
 
-           if (option.group) {
 
-             // initialise group if necessary
 
-             if (!groups[option.group]) {
 
-               groups[option.group] = $('<optgroup />').attr('label', option.group);
 
-             }
 
-             elem = groups[option.group];
 
-           }
 
-           var o = $(templates.option);
 
-           o.attr('value', option.value).text(option.text);
 
-           elem.append(o);
 
-         });
 
-         each(groups, function (_, group) {
 
-           input.append(group);
 
-         });
 
-         // safe to set a select's value as per a normal input
 
-         input.val(options.value);
 
-         break;
 
-       case 'checkbox':
 
-         var checkboxValues = $.isArray(options.value) ? options.value : [options.value];
 
-         inputOptions = options.inputOptions || [];
 
-         if (!inputOptions.length) {
 
-           throw new Error('prompt with "inputType" set to "checkbox" requires at least one option');
 
-         }
 
-         // checkboxes have to nest within a containing element, so
 
-         // they break the rules a bit and we end up re-assigning
 
-         // our 'input' element to this container instead
 
-         input = $('<div class="bootbox-checkbox-list"></div>');
 
-         each(inputOptions, function (_, option) {
 
-           if (option.value === undefined || option.text === undefined) {
 
-             throw new Error('each option needs a "value" property and a "text" property');
 
-           }
 
-           var checkbox = $(templates.inputs[options.inputType]);
 
-           checkbox.find('input').attr('value', option.value);
 
-           checkbox.find('label').append('\n' + option.text);
 
-           // we've ensured values is an array so we can always iterate over it
 
-           each(checkboxValues, function (_, value) {
 
-             if (value === option.value) {
 
-               checkbox.find('input').prop('checked', true);
 
-             }
 
-           });
 
-           input.append(checkbox);
 
-         });
 
-         break;
 
-       case 'radio':
 
-         // Make sure that value is not an array (only a single radio can ever be checked)
 
-         if (options.value !== undefined && $.isArray(options.value)) {
 
-           throw new Error('prompt with "inputType" set to "radio" requires a single, non-array value for "value"');
 
-         }
 
-         inputOptions = options.inputOptions || [];
 
-         if (!inputOptions.length) {
 
-           throw new Error('prompt with "inputType" set to "radio" requires at least one option');
 
-         }
 
-         // Radiobuttons have to nest within a containing element, so
 
-         // they break the rules a bit and we end up re-assigning
 
-         // our 'input' element to this container instead
 
-         input = $('<div class="bootbox-radiobutton-list"></div>');
 
-         // Radiobuttons should always have an initial checked input checked in a "group".
 
-         // If value is undefined or doesn't match an input option, select the first radiobutton
 
-         var checkFirstRadio = true;
 
-         each(inputOptions, function (_, option) {
 
-           if (option.value === undefined || option.text === undefined) {
 
-             throw new Error('each option needs a "value" property and a "text" property');
 
-           }
 
-           var radio = $(templates.inputs[options.inputType]);
 
-           radio.find('input').attr('value', option.value);
 
-           radio.find('label').append('\n' + option.text);
 
-           if (options.value !== undefined) {
 
-             if (option.value === options.value) {
 
-               radio.find('input').prop('checked', true);
 
-               checkFirstRadio = false;
 
-             }
 
-           }
 
-           input.append(radio);
 
-         });
 
-         if (checkFirstRadio) {
 
-           input.find('input[type="radio"]').first().prop('checked', true);
 
-         }
 
-         break;
 
-     }
 
-     // now place it in our form
 
-     form.append(input);
 
-     form.on('submit', function (e) {
 
-       e.preventDefault();
 
-       // Fix for SammyJS (or similar JS routing library) hijacking the form post.
 
-       e.stopPropagation();
 
-       // @TODO can we actually click *the* button object instead?
 
-       // e.g. buttons.confirm.click() or similar
 
-       promptDialog.find('.bootbox-accept').trigger('click');
 
-     });
 
-     if ($.trim(options.message) !== '') {
 
-       // Add the form to whatever content the user may have added.
 
-       var message = $(templates.promptMessage).html(options.message);
 
-       form.prepend(message);
 
-       options.message = form;
 
-     }
 
-     else {
 
-       options.message = form;
 
-     }
 
-     // Generate the dialog
 
-     promptDialog = exports.dialog(options);
 
-     // clear the existing handler focusing the submit button...
 
-     promptDialog.off('shown.bs.modal');
 
-     // ...and replace it with one focusing our input, if possible
 
-     promptDialog.on('shown.bs.modal', function () {
 
-       // need the closure here since input isn't
 
-       // an object otherwise
 
-       input.focus();
 
-     });
 
-     if (shouldShow === true) {
 
-       promptDialog.modal('show');
 
-     }
 
-     return promptDialog;
 
-   };
 
-   // INTERNAL FUNCTIONS
 
-   // *************************************************************************************************************
 
-   // Map a flexible set of arguments into a single returned object
 
-   // If args.length is already one just return it, otherwise
 
-   // use the properties argument to map the unnamed args to
 
-   // object properties.
 
-   // So in the latter case:
 
-   //  mapArguments(["foo", $.noop], ["message", "callback"])
 
-   //  -> { message: "foo", callback: $.noop }
 
-   function mapArguments(args, properties) {
 
-     var argn = args.length;
 
-     var options = {};
 
-     if (argn < 1 || argn > 2) {
 
-       throw new Error('Invalid argument length');
 
-     }
 
-     if (argn === 2 || typeof args[0] === 'string') {
 
-       options[properties[0]] = args[0];
 
-       options[properties[1]] = args[1];
 
-     } else {
 
-       options = args[0];
 
-     }
 
-     return options;
 
-   }
 
-   //  Merge a set of default dialog options with user supplied arguments
 
-   function mergeArguments(defaults, args, properties) {
 
-     return $.extend(
 
-       // deep merge
 
-       true,
 
-       // ensure the target is an empty, unreferenced object
 
-       {},
 
-       // the base options object for this type of dialog (often just buttons)
 
-       defaults,
 
-       // args could be an object or array; if it's an array properties will
 
-       // map it to a proper options object
 
-       mapArguments(
 
-         args,
 
-         properties
 
-       )
 
-     );
 
-   }
 
-   //  This entry-level method makes heavy use of composition to take a simple
 
-   //  range of inputs and return valid options suitable for passing to bootbox.dialog
 
-   function mergeDialogOptions(className, labels, properties, args) {
 
-     var locale;
 
-     if(args && args[0]){
 
-       locale = args[0].locale || defaults.locale;
 
-       var swapButtons = args[0].swapButtonOrder || defaults.swapButtonOrder;
 
-       if(swapButtons){
 
-         labels = labels.reverse();
 
-       }
 
-     }
 
-     //  build up a base set of dialog properties
 
-     var baseOptions = {
 
-       className: 'bootbox-' + className,
 
-       buttons: createLabels(labels, locale)
 
-     };
 
-     // Ensure the buttons properties generated, *after* merging
 
-     // with user args are still valid against the supplied labels
 
-     return validateButtons(
 
-       // merge the generated base properties with user supplied arguments
 
-       mergeArguments(
 
-         baseOptions,
 
-         args,
 
-         // if args.length > 1, properties specify how each arg maps to an object key
 
-         properties
 
-       ),
 
-       labels
 
-     );
 
-   }
 
-   //  Checks each button object to see if key is valid. 
 
-   //  This function will only be called by the alert, confirm, and prompt helpers. 
 
-   function validateButtons(options, buttons) {
 
-     var allowedButtons = {};
 
-     each(buttons, function (key, value) {
 
-       allowedButtons[value] = true;
 
-     });
 
-     each(options.buttons, function (key) {
 
-       if (allowedButtons[key] === undefined) {
 
-         throw new Error('button key "' + key + '" is not allowed (options are ' + buttons.join(' ') + ')');
 
-       }
 
-     });
 
-     return options;
 
-   }
 
-   //  From a given list of arguments, return a suitable object of button labels.
 
-   //  All this does is normalise the given labels and translate them where possible.
 
-   //  e.g. "ok", "confirm" -> { ok: "OK", cancel: "Annuleren" }
 
-   function createLabels(labels, locale) {
 
-     var buttons = {};
 
-     for (var i = 0, j = labels.length; i < j; i++) {
 
-       var argument = labels[i];
 
-       var key = argument.toLowerCase();
 
-       var value = argument.toUpperCase();
 
-       buttons[key] = {
 
-         label: getText(value, locale)
 
-       };
 
-     }
 
-     return buttons;
 
-   }
 
-   //  Get localized text from a locale. Defaults to 'en' locale if no locale 
 
-   //  provided or a non-registered locale is requested
 
-   function getText(key, locale) {
 
-     var labels = locales[locale];
 
-     return labels ? labels[key] : locales.en[key];
 
-   }
 
-   //  Filter and tidy up any user supplied parameters to this dialog.
 
-   //  Also looks for any shorthands used and ensures that the options
 
-   //  which are returned are all normalized properly
 
-   function sanitize(options) {
 
-     var buttons;
 
-     var total;
 
-     if (typeof options !== 'object') {
 
-       throw new Error('Please supply an object of options');
 
-     }
 
-     if (!options.message) {
 
-       throw new Error('"message" option must not be null or an empty string.');
 
-     }
 
-     // make sure any supplied options take precedence over defaults
 
-     options = $.extend({}, defaults, options);
 
-     // no buttons is still a valid dialog but it's cleaner to always have
 
-     // a buttons object to iterate over, even if it's empty
 
-     if (!options.buttons) {
 
-       options.buttons = {};
 
-     }
 
-     buttons = options.buttons;
 
-     total = getKeyLength(buttons);
 
-     each(buttons, function (key, button, index) {
 
-       if ($.isFunction(button)) {
 
-         // short form, assume value is our callback. Since button
 
-         // isn't an object it isn't a reference either so re-assign it
 
-         button = buttons[key] = {
 
-           callback: button
 
-         };
 
-       }
 
-       // before any further checks make sure by now button is the correct type
 
-       if ($.type(button) !== 'object') {
 
-         throw new Error('button with key "' + key + '" must be an object');
 
-       }
 
-       if (!button.label) {
 
-         // the lack of an explicit label means we'll assume the key is good enough
 
-         button.label = key;
 
-       }
 
-       if (!button.className) {     
 
-         var isPrimary = false;
 
-         if(options.swapButtonOrder){
 
-           isPrimary = index === 0;
 
-         }
 
-         else{
 
-           isPrimary = index === total-1;
 
-         }
 
-         if (total <= 2 && isPrimary) {
 
-           // always add a primary to the main option in a one or two-button dialog
 
-           button.className = 'btn-primary';
 
-         } else {
 
-           // adding both classes allows us to target both BS3 and BS4 without needing to check the version
 
-           button.className = 'btn-secondary btn-default';
 
-         }
 
-       }
 
-     });
 
-     return options;
 
-   }
 
-   //  Returns a count of the properties defined on the object
 
-   function getKeyLength(obj) {
 
-     return Object.keys(obj).length;
 
-   }
 
-   //  Tiny wrapper function around jQuery.each; just adds index as the third parameter
 
-   function each(collection, iterator) {
 
-     var index = 0;
 
-     $.each(collection, function (key, value) {
 
-       iterator(key, value, index++);
 
-     });
 
-   }
 
-   //  Handle the invoked dialog callback
 
-   function processCallback(e, dialog, callback) {
 
-     e.stopPropagation();
 
-     e.preventDefault();
 
-     // by default we assume a callback will get rid of the dialog,
 
-     // although it is given the opportunity to override this
 
-     // so, if the callback can be invoked and it *explicitly returns false*
 
-     // then we'll set a flag to keep the dialog active...
 
-     var preserveDialog = $.isFunction(callback) && callback.call(dialog, e) === false;
 
-     // ... otherwise we'll bin it
 
-     if (!preserveDialog) {
 
-       dialog.modal('hide');
 
-     }
 
-   }
 
-   
 
-   // Validate `min` and `max` values based on the current `inputType` value
 
-   function minAndMaxAreValid(type, min, max){
 
-     var result = false;
 
-     var minValid = true;
 
-     var maxValid = true;
 
-     if (type === 'date') {
 
-       if (min !== undefined && !(minValid = dateIsValid(min))) {
 
-         console.warn('Browsers which natively support the "date" input type expect date values to be of the form "YYYY-MM-DD" (see ISO-8601 https://www.iso.org/iso-8601-date-and-time-format.html). Bootbox does not enforce this rule, but your min value may not be enforced by this browser.');
 
-       }
 
-       else if (max !== undefined && !(maxValid = dateIsValid(max))) {
 
-         console.warn('Browsers which natively support the "date" input type expect date values to be of the form "YYYY-MM-DD" (see ISO-8601 https://www.iso.org/iso-8601-date-and-time-format.html). Bootbox does not enforce this rule, but your max value may not be enforced by this browser.');
 
-       }
 
-     }
 
-     else if (type === 'time') {
 
-       if (min !== undefined && !(minValid = timeIsValid(min))) {
 
-         throw new Error('"min" is not a valid time. See https://www.w3.org/TR/2012/WD-html-markup-20120315/datatypes.html#form.data.time for more information.');
 
-       }
 
-       else if (max !== undefined && !(maxValid = timeIsValid(max))) {
 
-         throw new Error('"max" is not a valid time. See https://www.w3.org/TR/2012/WD-html-markup-20120315/datatypes.html#form.data.time for more information.');
 
-       }
 
-     }
 
-     else {
 
-       if (min !== undefined && isNaN(min)) {
 
-         throw new Error('"min" must be a valid number. See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-min for more information.');
 
-       }
 
-       if (max !== undefined && isNaN(max)) {
 
-         throw new Error('"max" must be a valid number. See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-max for more information.');
 
-       }
 
-     }
 
-     
 
-     if(minValid && maxValid){
 
-       if(max <= min){
 
-         throw new Error('"max" must be greater than "min". See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-max for more information.');
 
-       }
 
-       else{
 
-         result = true;
 
-       }
 
-     }
 
-     return result;
 
-   }
 
-   function timeIsValid(value){
 
-     return /([01][0-9]|2[0-3]):[0-5][0-9]?:[0-5][0-9]/.test(value);
 
-   }
 
-   function dateIsValid(value){
 
-     return /(\d{4})-(\d{2})-(\d{2})/.test(value);
 
-   }
 
-   //  Register the default locale
 
-   exports.addLocale('en', {
 
-     OK: 'OK',
 
-     CANCEL: 'Cancel',
 
-     CONFIRM: 'OK'
 
-   });
 
-   //  The Bootbox object
 
-   return exports;
 
- }));
 
- bootbox.setTemplates({
 
- 		dialog:
 
- 		'<div class="bootbox modal" tabindex="-1" role="dialog" aria-hidden="true">' +
 
- 		'<div class="modal-dialog">' +
 
- 		'<div class="modal-content">' +
 
- 		'<div class="modal-body"><div class="bootbox-body"></div></div>' +
 
- 		'</div>' +
 
- 		'</div>' +
 
- 		'</div>',
 
- 		header:
 
- 		'<div class="modal-header">' +
 
- 		'<h5 class="modal-title"></h5>' +
 
- 		'</div>',
 
- 		footer:
 
- 		'<div class="modal-footer"></div>',
 
- 		closeButton:
 
- 		'<button type="button" class="bootbox-close-button close" aria-hidden="true"><i class="fal fa-times"></i></button>',
 
- 		form:
 
- 		'<form class="bootbox-form"></form>',
 
- 		button:
 
- 		'<button type="button" class="btn"></button>',
 
- 		option:
 
- 		'<option></option>',
 
- 		promptMessage:
 
- 		'<div class="bootbox-prompt-message"></div>',
 
- 		inputs: {
 
- 			text:
 
- 			'<input class="bootbox-input bootbox-input-text form-control" autocomplete="off" type="text" />',
 
- 			textarea:
 
- 			'<textarea class="bootbox-input bootbox-input-textarea form-control"></textarea>',
 
- 			email:
 
- 			'<input class="bootbox-input bootbox-input-email form-control" autocomplete="off" type="email" />',
 
- 			select:
 
- 			'<select class="bootbox-input bootbox-input-select form-control"></select>',
 
- 			checkbox:
 
- 			'<div class="form-check checkbox"><label class="form-check-label"><input class="form-check-input bootbox-input bootbox-input-checkbox" type="checkbox" /></label></div>',
 
- 			radio:
 
- 			'<div class="form-check radio"><label class="form-check-label"><input class="form-check-input bootbox-input bootbox-input-radio" type="radio" name="bootbox-radio" /></label></div>',
 
- 			date:
 
- 			'<input class="bootbox-input bootbox-input-date form-control" autocomplete="off" type="date" />',
 
- 			time:
 
- 			'<input class="bootbox-input bootbox-input-time form-control" autocomplete="off" type="time" />',
 
- 			number:
 
- 			'<input class="bootbox-input bootbox-input-number form-control" autocomplete="off" type="number" />',
 
- 			password:
 
- 			'<input class="bootbox-input bootbox-input-password form-control" autocomplete="off" type="password" />',
 
- 			range:
 
- 			'<input class="bootbox-input bootbox-input-range form-control-range" autocomplete="off" type="range" />'
 
- 		}
 
- 	
 
- });
 
- /**
 
-  * author: andreas johan virkus
 
-  * snippet url: https://gist.github.com/andreasvirkus/bfaedc839de0d46ffe4c
 
-  * 
 
-  * Remove classes that have given prefix
 
-  * Example: You have an element with classes "apple juiceSmall juiceBig banana"
 
-  * You run:
 
-  *   $elem.removeClassPrefix('juice');
 
-  * The resulting classes are "apple banana"
 
-  */
 
- $.fn.removeClassPrefix = function (prefix) {
 
-     this.each( function ( i, it ) {
 
-         var classes = it.className.split(" ").map(function (item) {
 
-             return item.indexOf(prefix) === 0 ? "" : item;
 
-         });
 
-         it.className = classes.join(" ");
 
-     });
 
-     return this;
 
- };
 
- /**
 
-  * "http://dummy.com/?technology=jquery&blog=jquerybyexample". 
 
-  * 1 var tech = getUrlParameter('technology');
 
-  * 2 var blog = getUrlParameter('blog');
 
-  * note: we are using this inside icon generator page
 
-  */
 
- var getUrlParameter = function getUrlParameter(sParam) {
 
-     var sPageURL = decodeURIComponent(window.location.search.substring(1)),
 
-         sURLVariables = sPageURL.split('&'),
 
-         sParameterName,
 
-         i;
 
-     for (i = 0; i < sURLVariables.length; i++) {
 
-         sParameterName = sURLVariables[i].split('=');
 
-         if (sParameterName[0] === sParam) {
 
-             return sParameterName[1] === undefined ? true : sParameterName[1];
 
-         }
 
-     }
 
- };
 
- /**
 
-  * detect IE
 
-  * returns version of IE or false, if browser is not Internet Explorer
 
-  */
 
- function detectIE() {
 
-     var ua = window.navigator.userAgent;
 
-     var msie = ua.indexOf('MSIE ');
 
-     if (msie > 0) {
 
-         // IE 10 or older => return version number
 
-         return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
 
-     }
 
-     var trident = ua.indexOf('Trident/');
 
-     if (trident > 0) {
 
-         // IE 11 => return version number
 
-         var rv = ua.indexOf('rv:');
 
-         return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
 
-     }
 
-     var edge = ua.indexOf('Edge/');
 
-     if (edge > 0) {
 
-        // Edge (IE 12+) => return version number
 
-        return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
 
-     }
 
-     // other browser
 
-     return false;
 
- }
 
- /*
 
-  * Toggle text
 
-  * $(".example").toggleText('Initial', 'Secondary');
 
-  * https://stackoverflow.com/questions/2155453/jquery-toggle-text
 
-  */
 
- jQuery.fn.extend({
 
-     toggleText: function (a, b){
 
-         var that = this;
 
-             if (that.text() != a && that.text() != b){
 
-                 that.text(a);
 
-             }
 
-             else
 
-             if (that.text() == a){
 
-                 that.text(b);
 
-             }
 
-             else
 
-             if (that.text() == b){
 
-                 that.text(a);
 
-             }
 
-         return this;
 
-     }
 
- });
 
- /*
 
-  * Convert RGB to HEX
 
-  * rgb2hex(hex_value)
 
-  */
 
- function rgb2hex(rgb) {
 
-     rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
 
-     function hex(x) {
 
-         return ("0" + parseInt(x).toString(16)).slice(-2);
 
-     }
 
-     return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
 
- }
 
- /*!
 
-  * jQuery throttle / debounce - v1.1 - 3/7/2010
 
-  * http://benalman.com/projects/jquery-throttle-debounce-plugin/
 
-  * 
 
-  * Copyright (c) 2010 "Cowboy" Ben Alman
 
-  * Dual licensed under the MIT and GPL licenses.
 
-  * http://benalman.com/about/license/
 
-  */
 
- // Script: jQuery throttle / debounce: Sometimes, less is more!
 
- //
 
- // *Version: 1.1, Last updated: 3/7/2010*
 
- // 
 
- // Project Home - http://benalman.com/projects/jquery-throttle-debounce-plugin/
 
- // GitHub       - http://github.com/cowboy/jquery-throttle-debounce/
 
- // Source       - http://github.com/cowboy/jquery-throttle-debounce/raw/master/jquery.ba-throttle-debounce.js
 
- // (Minified)   - http://github.com/cowboy/jquery-throttle-debounce/raw/master/jquery.ba-throttle-debounce.min.js (0.7kb)
 
- // 
 
- // About: License
 
- // 
 
- // Copyright (c) 2010 "Cowboy" Ben Alman,
 
- // Dual licensed under the MIT and GPL licenses.
 
- // http://benalman.com/about/license/
 
- // 
 
- // About: Examples
 
- // 
 
- // These working examples, complete with fully commented code, illustrate a few
 
- // ways in which this plugin can be used.
 
- // 
 
- // Throttle - http://benalman.com/code/projects/jquery-throttle-debounce/examples/throttle/
 
- // Debounce - http://benalman.com/code/projects/jquery-throttle-debounce/examples/debounce/
 
- // 
 
- // About: Support and Testing
 
- // 
 
- // Information about what version or versions of jQuery this plugin has been
 
- // tested with, what browsers it has been tested in, and where the unit tests
 
- // reside (so you can test it yourself).
 
- // 
 
- // jQuery Versions - none, 1.3.2, 1.4.2
 
- // Browsers Tested - Internet Explorer 6-8, Firefox 2-3.6, Safari 3-4, Chrome 4-5, Opera 9.6-10.1.
 
- // Unit Tests      - http://benalman.com/code/projects/jquery-throttle-debounce/unit/
 
- // 
 
- // About: Release History
 
- // 
 
- // 1.1 - (3/7/2010) Fixed a bug in <jQuery.throttle> where trailing callbacks
 
- //       executed later than they should. Reworked a fair amount of internal
 
- //       logic as well.
 
- // 1.0 - (3/6/2010) Initial release as a stand-alone project. Migrated over
 
- //       from jquery-misc repo v0.4 to jquery-throttle repo v1.0, added the
 
- //       no_trailing throttle parameter and debounce functionality.
 
- // 
 
- // Topic: Note for non-jQuery users
 
- // 
 
- // jQuery isn't actually required for this plugin, because nothing internal
 
- // uses any jQuery methods or properties. jQuery is just used as a namespace
 
- // under which these methods can exist.
 
- // 
 
- // Since jQuery isn't actually required for this plugin, if jQuery doesn't exist
 
- // when this plugin is loaded, the method described below will be created in
 
- // the `Cowboy` namespace. Usage will be exactly the same, but instead of
 
- // $.method() or jQuery.method(), you'll need to use Cowboy.method().
 
- (function(window,undefined){
 
-   '$:nomunge'; // Used by YUI compressor.
 
-   
 
-   // Since jQuery really isn't required for this plugin, use `jQuery` as the
 
-   // namespace only if it already exists, otherwise use the `Cowboy` namespace,
 
-   // creating it if necessary.
 
-   var $ = window.jQuery || window.Cowboy || ( window.Cowboy = {} ),
 
-     
 
-     // Internal method reference.
 
-     jq_throttle;
 
-   
 
-   // Method: jQuery.throttle
 
-   // 
 
-   // Throttle execution of a function. Especially useful for rate limiting
 
-   // execution of handlers on events like resize and scroll. If you want to
 
-   // rate-limit execution of a function to a single time, see the
 
-   // <jQuery.debounce> method.
 
-   // 
 
-   // In this visualization, | is a throttled-function call and X is the actual
 
-   // callback execution:
 
-   // 
 
-   // > Throttled with `no_trailing` specified as false or unspecified:
 
-   // > ||||||||||||||||||||||||| (pause) |||||||||||||||||||||||||
 
-   // > X    X    X    X    X    X        X    X    X    X    X    X
 
-   // > 
 
-   // > Throttled with `no_trailing` specified as true:
 
-   // > ||||||||||||||||||||||||| (pause) |||||||||||||||||||||||||
 
-   // > X    X    X    X    X             X    X    X    X    X
 
-   // 
 
-   // Usage:
 
-   // 
 
-   // > var throttled = jQuery.throttle( delay, [ no_trailing, ] callback );
 
-   // > 
 
-   // > jQuery('selector').bind( 'someevent', throttled );
 
-   // > jQuery('selector').unbind( 'someevent', throttled );
 
-   // 
 
-   // This also works in jQuery 1.4+:
 
-   // 
 
-   // > jQuery('selector').bind( 'someevent', jQuery.throttle( delay, [ no_trailing, ] callback ) );
 
-   // > jQuery('selector').unbind( 'someevent', callback );
 
-   // 
 
-   // Arguments:
 
-   // 
 
-   //  delay - (Number) A zero-or-greater delay in milliseconds. For event
 
-   //    callbacks, values around 100 or 250 (or even higher) are most useful.
 
-   //  no_trailing - (Boolean) Optional, defaults to false. If no_trailing is
 
-   //    true, callback will only execute every `delay` milliseconds while the
 
-   //    throttled-function is being called. If no_trailing is false or
 
-   //    unspecified, callback will be executed one final time after the last
 
-   //    throttled-function call. (After the throttled-function has not been
 
-   //    called for `delay` milliseconds, the internal counter is reset)
 
-   //  callback - (Function) A function to be executed after delay milliseconds.
 
-   //    The `this` context and all arguments are passed through, as-is, to
 
-   //    `callback` when the throttled-function is executed.
 
-   // 
 
-   // Returns:
 
-   // 
 
-   //  (Function) A new, throttled, function.
 
-   
 
-   $.throttle = jq_throttle = function( delay, no_trailing, callback, debounce_mode ) {
 
-     // After wrapper has stopped being called, this timeout ensures that
 
-     // `callback` is executed at the proper times in `throttle` and `end`
 
-     // debounce modes.
 
-     var timeout_id,
 
-       
 
-       // Keep track of the last time `callback` was executed.
 
-       last_exec = 0;
 
-     
 
-     // `no_trailing` defaults to falsy.
 
-     if ( typeof no_trailing !== 'boolean' ) {
 
-       debounce_mode = callback;
 
-       callback = no_trailing;
 
-       no_trailing = undefined;
 
-     }
 
-     
 
-     // The `wrapper` function encapsulates all of the throttling / debouncing
 
-     // functionality and when executed will limit the rate at which `callback`
 
-     // is executed.
 
-     function wrapper() {
 
-       var that = this,
 
-         elapsed = +new Date() - last_exec,
 
-         args = arguments;
 
-       
 
-       // Execute `callback` and update the `last_exec` timestamp.
 
-       function exec() {
 
-         last_exec = +new Date();
 
-         callback.apply( that, args );
 
-       };
 
-       
 
-       // If `debounce_mode` is true (at_begin) this is used to clear the flag
 
-       // to allow future `callback` executions.
 
-       function clear() {
 
-         timeout_id = undefined;
 
-       };
 
-       
 
-       if ( debounce_mode && !timeout_id ) {
 
-         // Since `wrapper` is being called for the first time and
 
-         // `debounce_mode` is true (at_begin), execute `callback`.
 
-         exec();
 
-       }
 
-       
 
-       // Clear any existing timeout.
 
-       timeout_id && clearTimeout( timeout_id );
 
-       
 
-       if ( debounce_mode === undefined && elapsed > delay ) {
 
-         // In throttle mode, if `delay` time has been exceeded, execute
 
-         // `callback`.
 
-         exec();
 
-         
 
-       } else if ( no_trailing !== true ) {
 
-         // In trailing throttle mode, since `delay` time has not been
 
-         // exceeded, schedule `callback` to execute `delay` ms after most
 
-         // recent execution.
 
-         // 
 
-         // If `debounce_mode` is true (at_begin), schedule `clear` to execute
 
-         // after `delay` ms.
 
-         // 
 
-         // If `debounce_mode` is false (at end), schedule `callback` to
 
-         // execute after `delay` ms.
 
-         timeout_id = setTimeout( debounce_mode ? clear : exec, debounce_mode === undefined ? delay - elapsed : delay );
 
-       }
 
-     };
 
-     
 
-     // Set the guid of `wrapper` function to the same of original callback, so
 
-     // it can be removed in jQuery 1.4+ .unbind or .die by using the original
 
-     // callback as a reference.
 
-     if ( $.guid ) {
 
-       wrapper.guid = callback.guid = callback.guid || $.guid++;
 
-     }
 
-     
 
-     // Return the wrapper function.
 
-     return wrapper;
 
-   };
 
-   
 
-   // Method: jQuery.debounce
 
-   // 
 
-   // Debounce execution of a function. Debouncing, unlike throttling,
 
-   // guarantees that a function is only executed a single time, either at the
 
-   // very beginning of a series of calls, or at the very end. If you want to
 
-   // simply rate-limit execution of a function, see the <jQuery.throttle>
 
-   // method.
 
-   // 
 
-   // In this visualization, | is a debounced-function call and X is the actual
 
-   // callback execution:
 
-   // 
 
-   // > Debounced with `at_begin` specified as false or unspecified:
 
-   // > ||||||||||||||||||||||||| (pause) |||||||||||||||||||||||||
 
-   // >                          X                                 X
 
-   // > 
 
-   // > Debounced with `at_begin` specified as true:
 
-   // > ||||||||||||||||||||||||| (pause) |||||||||||||||||||||||||
 
-   // > X                                 X
 
-   // 
 
-   // Usage:
 
-   // 
 
-   // > var debounced = jQuery.debounce( delay, [ at_begin, ] callback );
 
-   // > 
 
-   // > jQuery('selector').bind( 'someevent', debounced );
 
-   // > jQuery('selector').unbind( 'someevent', debounced );
 
-   // 
 
-   // This also works in jQuery 1.4+:
 
-   // 
 
-   // > jQuery('selector').bind( 'someevent', jQuery.debounce( delay, [ at_begin, ] callback ) );
 
-   // > jQuery('selector').unbind( 'someevent', callback );
 
-   // 
 
-   // Arguments:
 
-   // 
 
-   //  delay - (Number) A zero-or-greater delay in milliseconds. For event
 
-   //    callbacks, values around 100 or 250 (or even higher) are most useful.
 
-   //  at_begin - (Boolean) Optional, defaults to false. If at_begin is false or
 
-   //    unspecified, callback will only be executed `delay` milliseconds after
 
-   //    the last debounced-function call. If at_begin is true, callback will be
 
-   //    executed only at the first debounced-function call. (After the
 
-   //    throttled-function has not been called for `delay` milliseconds, the
 
-   //    internal counter is reset)
 
-   //  callback - (Function) A function to be executed after delay milliseconds.
 
-   //    The `this` context and all arguments are passed through, as-is, to
 
-   //    `callback` when the debounced-function is executed.
 
-   // 
 
-   // Returns:
 
-   // 
 
-   //  (Function) A new, debounced, function.
 
-   
 
-   $.debounce = function( delay, at_begin, callback ) {
 
-     return callback === undefined
 
-       ? jq_throttle( delay, at_begin, false )
 
-       : jq_throttle( delay, callback, at_begin !== false );
 
-   };
 
-   
 
- })(this);
 
- /*! Copyright (c) 2011 Piotr Rochala (http://rocha.la)
 
-  * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 
-  * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 
-  *
 
-  * Version: 1.3.8
 
-  *
 
-  */
 
- (function($) {
 
-   $.fn.extend({
 
-     slimScroll: function(options) {
 
-       var defaults = {
 
-         // width in pixels of the visible scroll area
 
-         width : 'auto',
 
-         // height in pixels of the visible scroll area
 
-         height : '250px',
 
-         // width in pixels of the scrollbar and rail
 
-         size : '7px',
 
-         // scrollbar color, accepts any hex/color value
 
-         color: '#000',
 
-         // scrollbar position - left/right
 
-         position : 'right',
 
-         // distance in pixels between the side edge and the scrollbar
 
-         distance : '1px',
 
-         // default scroll position on load - top / bottom / $('selector')
 
-         start : 'top',
 
-         // sets scrollbar opacity
 
-         opacity : .4,
 
-         // enables always-on mode for the scrollbar
 
-         alwaysVisible : false,
 
-         // check if we should hide the scrollbar when user is hovering over
 
-         disableFadeOut : false,
 
-         // sets visibility of the rail
 
-         railVisible : false,
 
-         // sets rail color
 
-         railColor : '#333',
 
-         // sets rail opacity
 
-         railOpacity : .2,
 
-         // whether  we should use jQuery UI Draggable to enable bar dragging
 
-         railDraggable : true,
 
-         // defautlt CSS class of the slimscroll rail
 
-         railClass : 'slimScrollRail',
 
-         // defautlt CSS class of the slimscroll bar
 
-         barClass : 'slimScrollBar',
 
-         // defautlt CSS class of the slimscroll wrapper
 
-         wrapperClass : 'slimScrollDiv',
 
-         // check if mousewheel should scroll the window if we reach top/bottom
 
-         allowPageScroll : false,
 
-         // scroll amount applied to each mouse wheel step
 
-         wheelStep : 20,
 
-         // scroll amount applied when user is using gestures
 
-         touchScrollStep : 200,
 
-         // sets border radius
 
-         borderRadius: '7px',
 
-         // sets border radius of the rail
 
-         railBorderRadius : '7px'
 
-       };
 
-       var o = $.extend(defaults, options);
 
-       // do it for every element that matches selector
 
-       this.each(function(){
 
-       var isOverPanel, isOverBar, isDragg, queueHide, touchDif,
 
-         barHeight, percentScroll, lastScroll,
 
-         divS = '<div></div>',
 
-         minBarHeight = 30,
 
-         releaseScroll = false;
 
-         // used in event handlers and for better minification
 
-         var me = $(this);
 
-         // ensure we are not binding it again
 
-         if (me.parent().hasClass(o.wrapperClass))
 
-         {
 
-             // start from last bar position
 
-             var offset = me.scrollTop();
 
-             // find bar and rail
 
-             bar = me.siblings('.' + o.barClass);
 
-             rail = me.siblings('.' + o.railClass);
 
-             getBarHeight();
 
-             // check if we should scroll existing instance
 
-             if ($.isPlainObject(options))
 
-             {
 
-               // Pass height: auto to an existing slimscroll object to force a resize after contents have changed
 
-               if ( 'height' in options && options.height == 'auto' ) {
 
-                 me.parent().css('height', 'auto');
 
-                 me.css('height', 'auto');
 
-                 var height = me.parent().parent().height();
 
-                 me.parent().css('height', height);
 
-                 me.css('height', height);
 
-               } else if ('height' in options) {
 
-                 var h = options.height;
 
-                 me.parent().css('height', h);
 
-                 me.css('height', h);
 
-               }
 
-               if ('scrollTo' in options)
 
-               {
 
-                 // jump to a static point
 
-                 offset = parseInt(o.scrollTo);
 
-               }
 
-               else if ('scrollBy' in options)
 
-               {
 
-                 // jump by value pixels
 
-                 offset += parseInt(o.scrollBy);
 
-               }
 
-               else if ('destroy' in options)
 
-               {
 
-                 // remove slimscroll elements
 
-                 bar.remove();
 
-                 rail.remove();
 
-                 me.unwrap();
 
-                 return;
 
-               }
 
-               // scroll content by the given offset
 
-               scrollContent(offset, false, true);
 
-             }
 
-             return;
 
-         }
 
-         else if ($.isPlainObject(options))
 
-         {
 
-             if ('destroy' in options)
 
-             {
 
-             	return;
 
-             }
 
-         }
 
-         // optionally set height to the parent's height
 
-         o.height = (o.height == 'auto') ? me.parent().height() : o.height;
 
-         // wrap content
 
-         var wrapper = $(divS)
 
-           .addClass(o.wrapperClass)
 
-           .css({
 
-             position: 'relative',
 
-             overflow: 'hidden',
 
-             width: o.width,
 
-             height: o.height
 
-           });
 
-         // update style for the div
 
-         me.css({
 
-           overflow: 'hidden',
 
-           width: o.width,
 
-           height: o.height
 
-         });
 
-         // create scrollbar rail
 
-         var rail = $(divS)
 
-           .addClass(o.railClass)
 
-           .css({
 
-             width: o.size,
 
-             height: '100%',
 
-             position: 'absolute',
 
-             top: 0,
 
-             display: (o.alwaysVisible && o.railVisible) ? 'block' : 'none',
 
-             'border-radius': o.railBorderRadius,
 
-             background: o.railColor,
 
-             opacity: o.railOpacity,
 
-             zIndex: 90
 
-           });
 
-         // create scrollbar
 
-         var bar = $(divS)
 
-           .addClass(o.barClass)
 
-           .css({
 
-             background: o.color,
 
-             width: o.size,
 
-             position: 'absolute',
 
-             top: 0,
 
-             opacity: o.opacity,
 
-             display: o.alwaysVisible ? 'block' : 'none',
 
-             'border-radius' : o.borderRadius,
 
-             BorderRadius: o.borderRadius,
 
-             MozBorderRadius: o.borderRadius,
 
-             WebkitBorderRadius: o.borderRadius,
 
-             zIndex: 99
 
-           });
 
-         // set position
 
-         var posCss = (o.position == 'right') ? { right: o.distance } : { left: o.distance };
 
-         rail.css(posCss);
 
-         bar.css(posCss);
 
-         // wrap it
 
-         me.wrap(wrapper);
 
-         // append to parent div
 
-         me.parent().append(bar);
 
-         me.parent().append(rail);
 
-         // make it draggable and no longer dependent on the jqueryUI
 
-         if (o.railDraggable){
 
-           bar.bind("mousedown", function(e) {
 
-             var $doc = $(document);
 
-             isDragg = true;
 
-             t = parseFloat(bar.css('top'));
 
-             pageY = e.pageY;
 
-             $doc.bind("mousemove.slimscroll", function(e){
 
-               currTop = t + e.pageY - pageY;
 
-               bar.css('top', currTop);
 
-               scrollContent(0, bar.position().top, false);// scroll content
 
-             });
 
-             $doc.bind("mouseup.slimscroll", function(e) {
 
-               isDragg = false;hideBar();
 
-               $doc.unbind('.slimscroll');
 
-             });
 
-             return false;
 
-           }).bind("selectstart.slimscroll", function(e){
 
-             e.stopPropagation();
 
-             e.preventDefault();
 
-             return false;
 
-           });
 
-         }
 
-         // on rail over
 
-         rail.hover(function(){
 
-           showBar();
 
-         }, function(){
 
-           hideBar();
 
-         });
 
-         // on bar over
 
-         bar.hover(function(){
 
-           isOverBar = true;
 
-         }, function(){
 
-           isOverBar = false;
 
-         });
 
-         // show on parent mouseover
 
-         me.hover(function(){
 
-           isOverPanel = true;
 
-           showBar();
 
-           hideBar();
 
-         }, function(){
 
-           isOverPanel = false;
 
-           hideBar();
 
-         });
 
-         // support for mobile
 
-         me.bind('touchstart', function(e,b){
 
-           if (e.originalEvent.touches.length)
 
-           {
 
-             // record where touch started
 
-             touchDif = e.originalEvent.touches[0].pageY;
 
-           }
 
-         });
 
-         me.bind('touchmove', function(e){
 
-           // prevent scrolling the page if necessary
 
-           if(!releaseScroll)
 
-           {
 
-   		      e.originalEvent.preventDefault();
 
- 		      }
 
-           if (e.originalEvent.touches.length)
 
-           {
 
-             // see how far user swiped
 
-             var diff = (touchDif - e.originalEvent.touches[0].pageY) / o.touchScrollStep;
 
-             // scroll content
 
-             scrollContent(diff, true);
 
-             touchDif = e.originalEvent.touches[0].pageY;
 
-           }
 
-         });
 
-         // set up initial height
 
-         getBarHeight();
 
-         // check start position
 
-         if (o.start === 'bottom')
 
-         {
 
-           // scroll content to bottom
 
-           bar.css({ top: me.outerHeight() - bar.outerHeight() });
 
-           scrollContent(0, true);
 
-         }
 
-         else if (o.start !== 'top')
 
-         {
 
-           // assume jQuery selector
 
-           scrollContent($(o.start).position().top, null, true);
 
-           // make sure bar stays hidden
 
-           if (!o.alwaysVisible) { bar.hide(); }
 
-         }
 
-         // attach scroll events
 
-         attachWheel(this);
 
-         function _onWheel(e)
 
-         {
 
-           // use mouse wheel only when mouse is over
 
-           if (!isOverPanel) { return; }
 
-           var e = e || window.event;
 
-           var delta = 0;
 
-           if (e.wheelDelta) { delta = -e.wheelDelta/120; }
 
-           if (e.detail) { delta = e.detail / 3; }
 
-           var target = e.target || e.srcTarget || e.srcElement;
 
-           if ($(target).closest('.' + o.wrapperClass).is(me.parent())) {
 
-             // scroll content
 
-             scrollContent(delta, true);
 
-           }
 
-           // stop window scroll
 
-           if (e.preventDefault && !releaseScroll) { e.preventDefault(); }
 
-           if (!releaseScroll) { e.returnValue = false; }
 
-         }
 
-         function scrollContent(y, isWheel, isJump)
 
-         {
 
-           releaseScroll = false;
 
-           var delta = y;
 
-           var maxTop = me.outerHeight() - bar.outerHeight();
 
-           if (isWheel)
 
-           {
 
-             // move bar with mouse wheel
 
-             delta = parseInt(bar.css('top')) + y * parseInt(o.wheelStep) / 100 * bar.outerHeight();
 
-             // move bar, make sure it doesn't go out
 
-             delta = Math.min(Math.max(delta, 0), maxTop);
 
-             // if scrolling down, make sure a fractional change to the
 
-             // scroll position isn't rounded away when the scrollbar's CSS is set
 
-             // this flooring of delta would happened automatically when
 
-             // bar.css is set below, but we floor here for clarity
 
-             delta = (y > 0) ? Math.ceil(delta) : Math.floor(delta);
 
-             // scroll the scrollbar
 
-             bar.css({ top: delta + 'px' });
 
-           }
 
-           // calculate actual scroll amount
 
-           percentScroll = parseInt(bar.css('top')) / (me.outerHeight() - bar.outerHeight());
 
-           delta = percentScroll * (me[0].scrollHeight - me.outerHeight());
 
-           if (isJump)
 
-           {
 
-             delta = y;
 
-             var offsetTop = delta / me[0].scrollHeight * me.outerHeight();
 
-             offsetTop = Math.min(Math.max(offsetTop, 0), maxTop);
 
-             bar.css({ top: offsetTop + 'px' });
 
-           }
 
-           // scroll content
 
-           me.scrollTop(delta);
 
-           // fire scrolling event
 
-           me.trigger('slimscrolling', ~~delta);
 
-           // ensure bar is visible
 
-           showBar();
 
-           // trigger hide when scroll is stopped
 
-           hideBar();
 
-         }
 
-         function attachWheel(target)
 
-         {
 
-           if (window.addEventListener)
 
-           {
 
-             target.addEventListener('DOMMouseScroll', _onWheel, false );
 
-             target.addEventListener('mousewheel', _onWheel, false );
 
-           }
 
-           else
 
-           {
 
-             document.attachEvent("onmousewheel", _onWheel)
 
-           }
 
-         }
 
-         function getBarHeight()
 
-         {
 
-           // calculate scrollbar height and make sure it is not too small
 
-           barHeight = Math.max((me.outerHeight() / me[0].scrollHeight) * me.outerHeight(), minBarHeight);
 
-           bar.css({ height: barHeight + 'px' });
 
-           // hide scrollbar if content is not long enough
 
-           var display = barHeight == me.outerHeight() ? 'none' : 'block';
 
-           bar.css({ display: display });
 
-         }
 
-         function showBar()
 
-         {
 
-           // recalculate bar height
 
-           getBarHeight();
 
-           clearTimeout(queueHide);
 
-           // when bar reached top or bottom
 
-           if (percentScroll == ~~percentScroll)
 
-           {
 
-             //release wheel
 
-             releaseScroll = o.allowPageScroll;
 
-             // publish approporiate event
 
-             if (lastScroll != percentScroll)
 
-             {
 
-                 var msg = (~~percentScroll == 0) ? 'top' : 'bottom';
 
-                 me.trigger('slimscroll', msg);
 
-             }
 
-           }
 
-           else
 
-           {
 
-             releaseScroll = false;
 
-           }
 
-           lastScroll = percentScroll;
 
-           // show only when required
 
-           if(barHeight >= me.outerHeight()) {
 
-             //allow window scroll
 
-             releaseScroll = true;
 
-             return;
 
-           }
 
-           bar.stop(true,true).fadeIn('fast');
 
-           if (o.railVisible) { rail.stop(true,true).fadeIn('fast'); }
 
-         }
 
-         function hideBar()
 
-         {
 
-           // only hide when options allow it
 
-           if (!o.alwaysVisible)
 
-           {
 
-             queueHide = setTimeout(function(){
 
-               if (!(o.disableFadeOut && isOverPanel) && !isOverBar && !isDragg)
 
-               {
 
-                 bar.fadeOut('slow');
 
-                 rail.fadeOut('slow');
 
-               }
 
-             }, 1000);
 
-           }
 
-         }
 
-       });
 
-       // maintain chainability
 
-       return this;
 
-     }
 
-   });
 
-   $.fn.extend({
 
-     slimscroll: $.fn.slimScroll
 
-   });
 
- })(jQuery);
 
- /*!
 
-  * Waves v0.7.6
 
-  * http://fian.my.id/Waves
 
-  *
 
-  * Copyright 2014-2018 Alfiana E. Sibuea and other contributors
 
-  * Released under the MIT license
 
-  * https://github.com/fians/Waves/blob/master/LICENSE
 
-  */
 
- ;(function(window, factory) {
 
-     'use strict';
 
-     // AMD. Register as an anonymous module.  Wrap in function so we have access
 
-     // to root via `this`.
 
-     if (typeof define === 'function' && define.amd) {
 
-         define([], function() {
 
-             window.Waves = factory.call(window);
 
-             return window.Waves;
 
-         });
 
-     }
 
-     // Node. Does not work with strict CommonJS, but only CommonJS-like
 
-     // environments that support module.exports, like Node.
 
-     else if (typeof exports === 'object') {
 
-         module.exports = factory.call(window);
 
-     }
 
-     // Browser globals.
 
-     else {
 
-         window.Waves = factory.call(window);
 
-     }
 
- })(typeof global === 'object' ? global : this, function() {
 
-     'use strict';
 
-     var Waves            = Waves || {};
 
-     var $$               = document.querySelectorAll.bind(document);
 
-     var toString         = Object.prototype.toString;
 
-     var isTouchAvailable = 'ontouchstart' in window;
 
-     // Find exact position of element
 
-     function isWindow(obj) {
 
-         return obj !== null && obj === obj.window;
 
-     }
 
-     function getWindow(elem) {
 
-         return isWindow(elem) ? elem : elem.nodeType === 9 && elem.defaultView;
 
-     }
 
-     function isObject(value) {
 
-         var type = typeof value;
 
-         return type === 'function' || type === 'object' && !!value;
 
-     }
 
-     function isDOMNode(obj) {
 
-         return isObject(obj) && obj.nodeType > 0;
 
-     }
 
-     function getWavesElements(nodes) {
 
-         var stringRepr = toString.call(nodes);
 
-         if (stringRepr === '[object String]') {
 
-             return $$(nodes);
 
-         } else if (isObject(nodes) && /^\[object (Array|HTMLCollection|NodeList|Object)\]$/.test(stringRepr) && nodes.hasOwnProperty('length')) {
 
-             return nodes;
 
-         } else if (isDOMNode(nodes)) {
 
-             return [nodes];
 
-         }
 
-         return [];
 
-     }
 
-     function offset(elem) {
 
-         var docElem, win,
 
-             box = { top: 0, left: 0 },
 
-             doc = elem && elem.ownerDocument;
 
-         docElem = doc.documentElement;
 
-         if (typeof elem.getBoundingClientRect !== typeof undefined) {
 
-             box = elem.getBoundingClientRect();
 
-         }
 
-         win = getWindow(doc);
 
-         return {
 
-             top: box.top + win.pageYOffset - docElem.clientTop,
 
-             left: box.left + win.pageXOffset - docElem.clientLeft
 
-         };
 
-     }
 
-     function convertStyle(styleObj) {
 
-         var style = '';
 
-         for (var prop in styleObj) {
 
-             if (styleObj.hasOwnProperty(prop)) {
 
-                 style += (prop + ':' + styleObj[prop] + ';');
 
-             }
 
-         }
 
-         return style;
 
-     }
 
-     var Effect = {
 
-         // Effect duration
 
-         duration: 750,
 
-         // Effect delay (check for scroll before showing effect)
 
-         delay: 200,
 
-         show: function(e, element, velocity) {
 
-             // Disable right click
 
-             if (e.button === 2) {
 
-                 return false;
 
-             }
 
-             element = element || this;
 
-             // Create ripple
 
-             var ripple = document.createElement('div');
 
-             ripple.className = 'waves-ripple waves-rippling';
 
-             element.appendChild(ripple);
 
-             // Get click coordinate and element width
 
-             var pos       = offset(element);
 
-             var relativeY = 0;
 
-             var relativeX = 0;
 
-             // Support for touch devices
 
-             if('touches' in e && e.touches.length) {
 
-                 relativeY   = (e.touches[0].pageY - pos.top);
 
-                 relativeX   = (e.touches[0].pageX - pos.left);
 
-             }
 
-             //Normal case
 
-             else {
 
-                 relativeY   = (e.pageY - pos.top);
 
-                 relativeX   = (e.pageX - pos.left);
 
-             }
 
-             // Support for synthetic events
 
-             relativeX = relativeX >= 0 ? relativeX : 0;
 
-             relativeY = relativeY >= 0 ? relativeY : 0;
 
-             var scale     = 'scale(' + ((element.clientWidth / 100) * 3) + ')';
 
-             var translate = 'translate(0,0)';
 
-             if (velocity) {
 
-                 translate = 'translate(' + (velocity.x) + 'px, ' + (velocity.y) + 'px)';
 
-             }
 
-             // Attach data to element
 
-             ripple.setAttribute('data-hold', Date.now());
 
-             ripple.setAttribute('data-x', relativeX);
 
-             ripple.setAttribute('data-y', relativeY);
 
-             ripple.setAttribute('data-scale', scale);
 
-             ripple.setAttribute('data-translate', translate);
 
-             // Set ripple position
 
-             var rippleStyle = {
 
-                 top: relativeY + 'px',
 
-                 left: relativeX + 'px'
 
-             };
 
-             ripple.classList.add('waves-notransition');
 
-             ripple.setAttribute('style', convertStyle(rippleStyle));
 
-             ripple.classList.remove('waves-notransition');
 
-             // Scale the ripple
 
-             rippleStyle['-webkit-transform'] = scale + ' ' + translate;
 
-             rippleStyle['-moz-transform'] = scale + ' ' + translate;
 
-             rippleStyle['-ms-transform'] = scale + ' ' + translate;
 
-             rippleStyle['-o-transform'] = scale + ' ' + translate;
 
-             rippleStyle.transform = scale + ' ' + translate;
 
-             rippleStyle.opacity = '1';
 
-             var duration = e.type === 'mousemove' ? 2500 : Effect.duration;
 
-             rippleStyle['-webkit-transition-duration'] = duration + 'ms';
 
-             rippleStyle['-moz-transition-duration']    = duration + 'ms';
 
-             rippleStyle['-o-transition-duration']      = duration + 'ms';
 
-             rippleStyle['transition-duration']         = duration + 'ms';
 
-             ripple.setAttribute('style', convertStyle(rippleStyle));
 
-         },
 
-         hide: function(e, element) {
 
-             element = element || this;
 
-             var ripples = element.getElementsByClassName('waves-rippling');
 
-             for (var i = 0, len = ripples.length; i < len; i++) {
 
-                 removeRipple(e, element, ripples[i]);
 
-             }
 
-             if (isTouchAvailable) {
 
-                 element.removeEventListener('touchend', Effect.hide);
 
-                 element.removeEventListener('touchcancel', Effect.hide);
 
-             }
 
-             element.removeEventListener('mouseup', Effect.hide);
 
-             element.removeEventListener('mouseleave', Effect.hide);
 
-         }
 
-     };
 
-     /**
 
-      * Collection of wrapper for HTML element that only have single tag
 
-      * like <input> and <img>
 
-      */
 
-     var TagWrapper = {
 
-         // Wrap <input> tag so it can perform the effect
 
-         input: function(element) {
 
-             var parent = element.parentNode;
 
-             // If input already have parent just pass through
 
-             if (parent.tagName.toLowerCase() === 'i' && parent.classList.contains('waves-effect')) {
 
-                 return;
 
-             }
 
-             // Put element class and style to the specified parent
 
-             var wrapper       = document.createElement('i');
 
-             wrapper.className = element.className + ' waves-input-wrapper';
 
-             element.className = 'waves-button-input';
 
-             // Put element as child
 
-             parent.replaceChild(wrapper, element);
 
-             wrapper.appendChild(element);
 
-             // Apply element color and background color to wrapper
 
-             var elementStyle    = window.getComputedStyle(element, null);
 
-             var color           = elementStyle.color;
 
-             var backgroundColor = elementStyle.backgroundColor;
 
-             wrapper.setAttribute('style', 'color:' + color + ';background:' + backgroundColor);
 
-             element.setAttribute('style', 'background-color:rgba(0,0,0,0);');
 
-         },
 
-         // Wrap <img> tag so it can perform the effect
 
-         img: function(element) {
 
-             var parent = element.parentNode;
 
-             // If input already have parent just pass through
 
-             if (parent.tagName.toLowerCase() === 'i' && parent.classList.contains('waves-effect')) {
 
-                 return;
 
-             }
 
-             // Put element as child
 
-             var wrapper  = document.createElement('i');
 
-             parent.replaceChild(wrapper, element);
 
-             wrapper.appendChild(element);
 
-         }
 
-     };
 
-     /**
 
-      * Hide the effect and remove the ripple. Must be
 
-      * a separate function to pass the JSLint...
 
-      */
 
-     function removeRipple(e, el, ripple) {
 
-         // Check if the ripple still exist
 
-         if (!ripple) {
 
-             return;
 
-         }
 
-         ripple.classList.remove('waves-rippling');
 
-         var relativeX = ripple.getAttribute('data-x');
 
-         var relativeY = ripple.getAttribute('data-y');
 
-         var scale     = ripple.getAttribute('data-scale');
 
-         var translate = ripple.getAttribute('data-translate');
 
-         // Get delay beetween mousedown and mouse leave
 
-         var diff = Date.now() - Number(ripple.getAttribute('data-hold'));
 
-         var delay = 350 - diff;
 
-         if (delay < 0) {
 
-             delay = 0;
 
-         }
 
-         if (e.type === 'mousemove') {
 
-             delay = 150;
 
-         }
 
-         // Fade out ripple after delay
 
-         var duration = e.type === 'mousemove' ? 2500 : Effect.duration;
 
-         setTimeout(function() {
 
-             var style = {
 
-                 top: relativeY + 'px',
 
-                 left: relativeX + 'px',
 
-                 opacity: '0',
 
-                 // Duration
 
-                 '-webkit-transition-duration': duration + 'ms',
 
-                 '-moz-transition-duration': duration + 'ms',
 
-                 '-o-transition-duration': duration + 'ms',
 
-                 'transition-duration': duration + 'ms',
 
-                 '-webkit-transform': scale + ' ' + translate,
 
-                 '-moz-transform': scale + ' ' + translate,
 
-                 '-ms-transform': scale + ' ' + translate,
 
-                 '-o-transform': scale + ' ' + translate,
 
-                 'transform': scale + ' ' + translate
 
-             };
 
-             ripple.setAttribute('style', convertStyle(style));
 
-             setTimeout(function() {
 
-                 try {
 
-                     el.removeChild(ripple);
 
-                 } catch (e) {
 
-                     return false;
 
-                 }
 
-             }, duration);
 
-         }, delay);
 
-     }
 
-     /**
 
-      * Disable mousedown event for 500ms during and after touch
 
-      */
 
-     var TouchHandler = {
 
-         /* uses an integer rather than bool so there's no issues with
 
-          * needing to clear timeouts if another touch event occurred
 
-          * within the 500ms. Cannot mouseup between touchstart and
 
-          * touchend, nor in the 500ms after touchend. */
 
-         touches: 0,
 
-         allowEvent: function(e) {
 
-             var allow = true;
 
-             if (/^(mousedown|mousemove)$/.test(e.type) && TouchHandler.touches) {
 
-                 allow = false;
 
-             }
 
-             return allow;
 
-         },
 
-         registerEvent: function(e) {
 
-             var eType = e.type;
 
-             if (eType === 'touchstart') {
 
-                 TouchHandler.touches += 1; // push
 
-             } else if (/^(touchend|touchcancel)$/.test(eType)) {
 
-                 setTimeout(function() {
 
-                     if (TouchHandler.touches) {
 
-                         TouchHandler.touches -= 1; // pop after 500ms
 
-                     }
 
-                 }, 500);
 
-             }
 
-         }
 
-     };
 
-     /**
 
-      * Delegated click handler for .waves-effect element.
 
-      * returns null when .waves-effect element not in "click tree"
 
-      */
 
-     function getWavesEffectElement(e) {
 
-         if (TouchHandler.allowEvent(e) === false) {
 
-             return null;
 
-         }
 
-         var element = null;
 
-         var target = e.target || e.srcElement;
 
-         while (target.parentElement) {
 
-             if ( (!(target instanceof SVGElement)) && target.classList.contains('waves-effect')) {
 
-                 element = target;
 
-                 break;
 
-             }
 
-             target = target.parentElement;
 
-         }
 
-         return element;
 
-     }
 
-     /**
 
-      * Bubble the click and show effect if .waves-effect elem was found
 
-      */
 
-     function showEffect(e) {
 
-         // Disable effect if element has "disabled" property on it
 
-         // In some cases, the event is not triggered by the current element
 
-         // if (e.target.getAttribute('disabled') !== null) {
 
-         //     return;
 
-         // }
 
-         var element = getWavesEffectElement(e);
 
-         if (element !== null) {
 
-             // Make it sure the element has either disabled property, disabled attribute or 'disabled' class
 
-             if (element.disabled || element.getAttribute('disabled') || element.classList.contains('disabled')) {
 
-                 return;
 
-             }
 
-             TouchHandler.registerEvent(e);
 
-             if (e.type === 'touchstart' && Effect.delay) {
 
-                 var hidden = false;
 
-                 var timer = setTimeout(function () {
 
-                     timer = null;
 
-                     Effect.show(e, element);
 
-                 }, Effect.delay);
 
-                 var hideEffect = function(hideEvent) {
 
-                     // if touch hasn't moved, and effect not yet started: start effect now
 
-                     if (timer) {
 
-                         clearTimeout(timer);
 
-                         timer = null;
 
-                         Effect.show(e, element);
 
-                     }
 
-                     if (!hidden) {
 
-                         hidden = true;
 
-                         Effect.hide(hideEvent, element);
 
-                     }
 
-                     removeListeners();
 
-                 };
 
-                 var touchMove = function(moveEvent) {
 
-                     if (timer) {
 
-                         clearTimeout(timer);
 
-                         timer = null;
 
-                     }
 
-                     hideEffect(moveEvent);
 
-                     removeListeners();
 
-                 };
 
-                 element.addEventListener('touchmove', touchMove, false);
 
-                 element.addEventListener('touchend', hideEffect, false);
 
-                 element.addEventListener('touchcancel', hideEffect, false);
 
-                 var removeListeners = function() {
 
-                     element.removeEventListener('touchmove', touchMove);
 
-                     element.removeEventListener('touchend', hideEffect);
 
-                     element.removeEventListener('touchcancel', hideEffect);
 
-                 };
 
-             } else {
 
-                 Effect.show(e, element);
 
-                 if (isTouchAvailable) {
 
-                     element.addEventListener('touchend', Effect.hide, false);
 
-                     element.addEventListener('touchcancel', Effect.hide, false);
 
-                 }
 
-                 element.addEventListener('mouseup', Effect.hide, false);
 
-                 element.addEventListener('mouseleave', Effect.hide, false);
 
-             }
 
-         }
 
-     }
 
-     Waves.init = function(options) {
 
-         var body = document.body;
 
-         options = options || {};
 
-         if ('duration' in options) {
 
-             Effect.duration = options.duration;
 
-         }
 
-         if ('delay' in options) {
 
-             Effect.delay = options.delay;
 
-         }
 
-         if (isTouchAvailable) {
 
-             body.addEventListener('touchstart', showEffect, false);
 
-             body.addEventListener('touchcancel', TouchHandler.registerEvent, false);
 
-             body.addEventListener('touchend', TouchHandler.registerEvent, false);
 
-         }
 
-         body.addEventListener('mousedown', showEffect, false);
 
-     };
 
-     /**
 
-      * Attach Waves to dynamically loaded inputs, or add .waves-effect and other
 
-      * waves classes to a set of elements. Set drag to true if the ripple mouseover
 
-      * or skimming effect should be applied to the elements.
 
-      */
 
-     Waves.attach = function(elements, classes) {
 
-         elements = getWavesElements(elements);
 
-         if (toString.call(classes) === '[object Array]') {
 
-             classes = classes.join(' ');
 
-         }
 
-         classes = classes ? ' ' + classes : '';
 
-         var element, tagName;
 
-         for (var i = 0, len = elements.length; i < len; i++) {
 
-             element = elements[i];
 
-             tagName = element.tagName.toLowerCase();
 
-             if (['input', 'img'].indexOf(tagName) !== -1) {
 
-                 TagWrapper[tagName](element);
 
-                 element = element.parentElement;
 
-             }
 
-             if (element.className.indexOf('waves-effect') === -1) {
 
-                 element.className += ' waves-effect' + classes;
 
-             }
 
-         }
 
-     };
 
-     /**
 
-      * Cause a ripple to appear in an element via code.
 
-      */
 
-     Waves.ripple = function(elements, options) {
 
-         elements = getWavesElements(elements);
 
-         var elementsLen = elements.length;
 
-         options          = options || {};
 
-         options.wait     = options.wait || 0;
 
-         options.position = options.position || null; // default = centre of element
 
-         if (elementsLen) {
 
-             var element, pos, off, centre = {}, i = 0;
 
-             var mousedown = {
 
-                 type: 'mousedown',
 
-                 button: 1
 
-             };
 
-             var hideRipple = function(mouseup, element) {
 
-                 return function() {
 
-                     Effect.hide(mouseup, element);
 
-                 };
 
-             };
 
-             for (; i < elementsLen; i++) {
 
-                 element = elements[i];
 
-                 pos = options.position || {
 
-                     x: element.clientWidth / 2,
 
-                     y: element.clientHeight / 2
 
-                 };
 
-                 off      = offset(element);
 
-                 centre.x = off.left + pos.x;
 
-                 centre.y = off.top + pos.y;
 
-                 mousedown.pageX = centre.x;
 
-                 mousedown.pageY = centre.y;
 
-                 Effect.show(mousedown, element);
 
-                 if (options.wait >= 0 && options.wait !== null) {
 
-                     var mouseup = {
 
-                         type: 'mouseup',
 
-                         button: 1
 
-                     };
 
-                     setTimeout(hideRipple(mouseup, element), options.wait);
 
-                 }
 
-             }
 
-         }
 
-     };
 
-     /**
 
-      * Remove all ripples from an element.
 
-      */
 
-     Waves.calm = function(elements) {
 
-         elements = getWavesElements(elements);
 
-         var mouseup = {
 
-             type: 'mouseup',
 
-             button: 1
 
-         };
 
-         for (var i = 0, len = elements.length; i < len; i++) {
 
-             Effect.hide(mouseup, elements[i]);
 
-         }
 
-     };
 
-     /**
 
-      * Deprecated API fallback
 
-      */
 
-     Waves.displayEffect = function(options) {
 
-         console.error('Waves.displayEffect() has been deprecated and will be removed in future version. Please use Waves.init() to initialize Waves effect');
 
-         Waves.init(options);
 
-     };
 
-     return Waves;
 
- });
 
-  /*!
 
-  * jQuery SmartPanels v1.0.0
 
-  *
 
-  * Copyright 2019, 2020 SmartAdmin WebApp
 
-  * Released under Marketplace License (see your license details for usage)
 
-  *
 
-  * Publish Date: 2018-01-01T17:42Z
 
-  */
 
- (function ($, window, document, undefined) {
 
- 	//"use strict"; 
 
- 	var pluginName = 'smartPanel';
 
- 	/**
 
- 	 * Check for touch support and set right click events.
 
- 	 **/
 
- 	/*var clickEvent = (('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch ? 
 
- 		'clickEvent' : 'click') + '.' + pluginName;*/
 
- 	var clickEvent;
 
- 	if (('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) {
 
- 		clickEvent = 'click tap';
 
- 	} else {
 
- 		clickEvent = 'click';
 
- 	}
 
- 	function Plugin(element, options) {
 
- 		/**
 
- 		 * Variables.
 
- 		 **/
 
- 		this.obj = $(element);
 
- 		this.o = $.extend({}, $.fn[pluginName].defaults, options);
 
- 		this.objId = this.obj.attr('id');
 
- 		this.panel = this.obj.find(this.o.panels);
 
- 		this.storage = {enabled: this.o.localStorage};
 
- 		this.initialized = false;
 
- 		this.init();
 
- 	}
 
- 	Plugin.prototype = {
 
- 		/**
 
- 		 * Function for the indicator image.
 
- 		 *
 
- 		 * @param:
 
- 		 **/
 
- 		_runPanelLoader: function (elm) {
 
- 			var self = this;
 
- 			if (self.o.localStorage === true) {
 
- 				elm.closest(self.o.panels)
 
- 				.find('.panel-saving')
 
- 				.stop(true, true)
 
- 				.fadeIn(100)
 
- 				.delay(600)
 
- 				.fadeOut(100);
 
- 			}
 
- 		},
 
- 		_loadKeys : function () {
 
- 			
 
- 			var self = this;
 
- 			var panel_url = self.o.pageKey || location.pathname;
 
- 			self.storage.keySettings = 'smartPanel_settings_' + panel_url + '_' + self.objId;
 
- 			self.storage.keyPosition = 'smartPanel_position_' + panel_url + '_' + self.objId;
 
- 		},
 
-  
 
- 		/**
 
- 		 * Save all settings to the localStorage.
 
- 		 *
 
- 		 * @param:
 
- 		 **/
 
- 		_savePanelSettings: function () {
 
- 			var self = this;
 
- 			var storage = self.storage;
 
- 			self._loadKeys();
 
- 			var storeSettings = self.obj.find(self.o.panels)
 
- 				.map(function () {
 
- 					var storeSettingsStr = {};
 
- 					storeSettingsStr.id = $(this)
 
- 						.attr('id');
 
- 					storeSettingsStr.style = $(this)
 
- 						.attr('data-panel-attstyle');
 
- 					storeSettingsStr.locked = ($(this)
 
- 						.hasClass('panel-locked') ? 1 : 0);
 
- 					storeSettingsStr.collapsed = ($(this)
 
- 						.hasClass('panel-collapsed') ? 1 : 0);
 
- 					return storeSettingsStr;
 
- 				}).get();
 
- 			var storeSettingsObj = JSON.stringify({
 
- 				'panel': storeSettings
 
- 			});
 
- 			/* Place it in the storage(only if needed) */
 
- 			if (storage.enabled && storage.getKeySettings != storeSettingsObj) {
 
- 				localStorage.setItem(storage.keySettings, storeSettingsObj);
 
- 				storage.getKeySettings = storeSettingsObj;
 
- 				//if (myapp_config.debugState)
 
- 					//console.log("storeSettingsObj:" + storeSettingsObj)
 
- 			}
 
- 			/**
 
- 			 * Run the callback function.
 
- 			 **/
 
- 			
 
- 			if (typeof self.o.onSave == 'function') {
 
- 				self.o.onSave.call(this, null, storeSettingsObj, storage.keySettings);
 
- 				if (myapp_config.debugState)
 
- 					console.log("keySettings: " + storage.keySettings)
 
- 			}
 
- 		},
 
- 		/**
 
- 		 * Save positions to the localStorage.
 
- 		 *
 
- 		 * @param:
 
- 		 **/
 
- 		_savePanelPosition: function () {
 
- 			var self = this;
 
- 			var storage = self.storage;
 
- 			self._loadKeys();
 
- 			var mainArr = self.obj.find(self.o.grid + '.sortable-grid')
 
- 				.map(function () {
 
- 					var subArr = $(this)
 
- 						.children(self.o.panels)
 
- 						.map(function () {
 
- 							return {
 
- 								'id': $(this).attr('id')
 
- 							};
 
- 						}).get();
 
- 					return {
 
- 						'section': subArr
 
- 					};
 
- 				}).get();
 
- 			var storePositionObj = JSON.stringify({
 
- 				'grid': mainArr
 
- 			});
 
- 			/* Place it in the storage(only if needed) */
 
- 			if (storage.enabled && storage.getKeyPosition != storePositionObj) {
 
- 				localStorage.setItem(storage.keyPosition, storePositionObj);
 
- 				storage.getKeyPosition = storePositionObj
 
- 			}
 
- 			/**
 
- 			 * Run the callback function.
 
- 			 **/
 
- 			if (typeof self.o.onSave == 'function') {
 
- 				self.o.onSave.call(this, storePositionObj, storage.keyPosition);
 
- 			}
 
- 		},
 
- 		/**
 
- 		 * Code that we run at the start.
 
- 		 *
 
- 		 * @param:
 
- 		 **/
 
- 		init: function () {
 
- 			var self = this;
 
- 			
 
- 			if (self.initialized) return;
 
- 			self._initStorage(self.storage);
 
- 			/**
 
- 			 * Force users to use an id(it's needed for the local storage).
 
- 			 **/
 
- 			if (!$('#' + self.objId)
 
- 				.length) {
 
- 				//alert('Your panel ID is missing!');
 
-                if (typeof bootbox  != 'undefined') {
 
-                		bootbox.alert("Your panel ID is missing!");
 
-                } else {
 
-                		alert('Your panel ID is missing!');
 
-                }
 
- 			}
 
- 			/**
 
- 			 * This will add an extra class that we use to store the
 
- 			 * panels in the right order.(savety)
 
- 			 **/
 
- 			$(self.o.grid)
 
- 				.each(function () {
 
- 					if ($(this)
 
- 						.find(self.o.panels)
 
- 						.length) {
 
- 						$(this)
 
- 							.addClass('sortable-grid');
 
- 					}
 
- 				});
 
- 			/**
 
- 			 * SET POSITION PANEL
 
- 			 **/
 
- 			/**
 
- 			 * Run if data is present.
 
- 			 **/
 
- 			if (self.storage.enabled && self.storage.getKeyPosition) {
 
- 				var jsonPosition = JSON.parse(self.storage.getKeyPosition);
 
- 				/**
 
- 				 * Loop the data, and put every panels on the right place.
 
- 				 **/
 
- 				for (var key in jsonPosition.grid) {
 
- 					var changeOrder = self.obj.find(self.o.grid + '.sortable-grid')
 
- 						.eq(key);
 
- 					for (var key2 in jsonPosition.grid[key].section) {
 
- 						changeOrder.append($('#' + jsonPosition.grid[key].section[key2].id));
 
- 					}
 
- 				}
 
- 			}
 
- 			/**
 
- 			 * SET SETTINGS PANEL
 
- 			 **/
 
- 			/**
 
- 			 * Run if data is present.
 
- 			 **/
 
- 			if (self.storage.enabled && self.storage.getKeySettings) {
 
- 				var jsonSettings = JSON.parse(self.storage.getKeySettings);
 
- 				if (myapp_config.debugState)
 
- 					console.log("Panel settings loaded: " + self.storage.getKeySettings)
 
- 				/**
 
- 				 * Loop the data and hide/show the panels and set the inputs in
 
- 				 * panel to checked(if hidden) and add an indicator class to the div.
 
- 				 * Loop all labels and update the panel titles.
 
- 				 **/
 
- 				for (var key in jsonSettings.panel) {
 
- 					var panelId = $('#' + jsonSettings.panel[key].id);
 
- 					/**
 
- 					 * Set a style(if present).
 
- 					 **/
 
- 					if (jsonSettings.panel[key].style) {
 
- 						panelId.attr('data-panel-attstyle', '' + jsonSettings.panel[key].style + '')
 
- 							.children('.panel-hdr')
 
- 							.removeClassPrefix('bg-')
 
- 							.addClass(jsonSettings.panel[key].style);
 
- 					}
 
- 					/**
 
- 					 * Toggle content panel.
 
- 					 **/
 
- 					if (jsonSettings.panel[key].collapsed == 1) {
 
- 						panelId.addClass('panel-collapsed')
 
- 							.children('.panel-container').addClass('collapse').removeClass('show');
 
- 					}
 
- 					/**
 
- 					 * Locked panel from sorting.
 
- 					 **/
 
- 					if (jsonSettings.panel[key].locked == 1) {
 
- 						panelId.addClass('panel-locked');
 
- 					}
 
- 				}
 
- 			}
 
- 			/**
 
- 			 * Format colors
 
- 			 **/
 
- 			if (self.o.panelColors && self.o.colorButton) {
 
- 				var formatedPanelColors = [];
 
- 				for (var key in self.o.panelColors) {
 
- 					formatedPanelColors.push('<a href="#" class="btn d-inline-block '+ self.o.panelColors[key] +' width-2 height-2 p-0 rounded-0 js-panel-color hover-effect-dot" data-panel-setstyle="'+ self.o.panelColors[key] +'" style="margin:1px;"></a>');
 
- 				}
 
- 			}
 
- 			/**
 
- 			 * LOOP ALL PANELS
 
- 			 **/            
 
- 			self.panel.each(function () {
 
- 				var tPanel = $(this),
 
- 					closeButton,
 
- 					fullscreenButton,
 
- 					collapseButton,
 
- 					lockedButton,
 
- 					refreshButton,
 
- 					colorButton,
 
- 					resetButton,
 
- 					customButton,
 
- 					thisHeader = $(this).children('.panel-hdr'),
 
- 					thisContainer = $(this).children('.panel-container');
 
- 				/**
 
- 				 * Dont double wrap(check).
 
- 				 **/
 
- 				if (!thisHeader.parent().attr('role')) {
 
- 					/**
 
- 					 * Adding a helper class to all sortable panels, this will be
 
- 					 * used to find the panels that are sortable, it will skip the panels
 
- 					 * that have the dataset 'panels-sortable="false"' set to false.
 
- 					 **/
 
- 					if (self.o.sortable === true && tPanel.data('panel-sortable') === undefined) {
 
- 						tPanel.addClass('panel-sortable');
 
- 					}
 
- 					/**
 
- 					* Add a close button to the panel header (if set to true)
 
- 					**/
 
- 					if (self.o.closeButton === true && tPanel.data('panel-close') === undefined) {
 
- 						closeButton = '<a href="#" class="btn btn-panel hover-effect-dot js-panel-close" data-toggle="tooltip" data-offset="0,10" data-original-title="Close"></a>';
 
- 					} else {
 
- 						closeButton = '';
 
- 					}
 
- 					/**
 
- 					* Add a fullscreen button to the panel header (if set to true).
 
- 					**/
 
- 					if (self.o.fullscreenButton === true && tPanel.data('panel-fullscreen') === undefined) {
 
- 						fullscreenButton = '<a href="#" class="btn btn-panel hover-effect-dot js-panel-fullscreen" data-toggle="tooltip" data-offset="0,10" data-original-title="Fullscreen"></a>';
 
- 					} else {
 
- 						fullscreenButton = '';
 
- 					}
 
- 					/**
 
- 					* Add a collapse button to the panel header (if set to true).
 
- 					**/
 
- 					if (self.o.collapseButton === true && tPanel.data('panel-collapsed') === undefined) {
 
- 						collapseButton = '<a href="#" class="btn btn-panel hover-effect-dot js-panel-collapse" data-toggle="tooltip" data-offset="0,10" data-original-title="Collapse"></a>'
 
- 					} else {
 
- 						collapseButton = '';
 
- 					}
 
- 					/**
 
- 					* Add a locked button to the panel header (if set to true).
 
- 					**/
 
- 					if (self.o.lockedButton === true && tPanel.data('panel-locked') === undefined) {
 
- 						lockedButton = '<a href="#" class="dropdown-item js-panel-locked"><span data-i18n="drpdwn.lockpanel">' + self.o.lockedButtonLabel + '</span></a>'
 
- 					} else {
 
- 						lockedButton = '';
 
- 					}
 
- 					/**
 
- 					* Add a refresh button to the panel header (if set to true).
 
- 					**/
 
- 					if (self.o.refreshButton === true && tPanel.data('panel-refresh') === undefined) {
 
- 						refreshButton = '<a href="#" class="dropdown-item js-panel-refresh"><span data-i18n="drpdwn.refreshpanel">' + self.o.refreshButtonLabel + '</span></a>';
 
- 						thisContainer.prepend(
 
- 							'<div class="loader"><i class="fal fa-spinner-third fa-spin-4x fs-xxl"></i></div>'
 
- 						);
 
- 						//append** conflicts with panel > container > content:last child, so changed to prepend
 
- 						
 
- 					} else {
 
- 						refreshButton = '';
 
- 					}
 
- 					/**
 
- 					* Add a color select button to the panel header (if set to true).
 
- 					**/
 
- 					if (self.o.colorButton === true && tPanel.data('panel-color') === undefined) {
 
- 						colorButton = ' <div class="dropdown-multilevel dropdown-multilevel-left">\
 
- 											<div class="dropdown-item">\
 
- 												<span data-i18n="drpdwn.panelcolor">' + self.o.colorButtonLabel + '</span>\
 
- 											</div>\
 
- 											<div class="dropdown-menu d-flex flex-wrap" style="min-width: 9.5rem; width: 9.5rem; padding: 0.5rem">' + formatedPanelColors.join(" ") + '</div>\
 
- 										</div>'
 
- 					} else {
 
- 						colorButton = '';
 
- 					}
 
- 					/**
 
- 					* Add a reset widget button to the panel header (if set to true).
 
- 					**/
 
- 					if (self.o.resetButton === true && tPanel.data('panel-reset') === undefined) {
 
- 						resetButton = '<div class="dropdown-divider m-0"></div><a href="#" class="dropdown-item js-panel-reset"><span data-i18n="drpdwn.resetpanel">' + self.o.resetButtonLabel + '</span></a>'
 
- 					} else {
 
- 						resetButton = '';
 
- 					}
 
- 					/**
 
- 					* Add a custom button to the panel header (if set to true).
 
- 					**/
 
- 					if (self.o.customButton === true && tPanel.data('panel-custombutton') === undefined) {
 
- 						customButton = '<a href="#" class="dropdown-item js-panel-custombutton pl-4"><span data-i18n="drpdwn.custombutton">' + self.o.customButtonLabel + '</span></a>'
 
- 					} else {
 
- 						customButton = '';
 
- 					}
 
- 					/**
 
- 					 * Append the image to the panel header.
 
- 					 **/
 
- 					thisHeader.append(
 
- 						'<div class="panel-saving mr-2" style="display:none"><i class="fal fa-spinner-third fa-spin-4x fs-xl"></i></div>'
 
- 					);
 
- 					/**
 
- 					 * Set the buttons order.
 
- 					 **/
 
- 					var formatButtons = self.o.buttonOrder
 
- 						.replace(/%close%/g, closeButton)
 
- 						.replace(/%fullscreen%/g, fullscreenButton)
 
- 						.replace(/%collapse%/g, collapseButton);
 
- 					/**
 
- 					 * Add a button wrapper to the header.
 
- 					 **/
 
- 					if (closeButton !== '' || fullscreenButton !== '' || collapseButton !== '') {
 
- 						thisHeader.append('<div class="panel-toolbar">' + formatButtons + '</div>');
 
- 					}
 
- 					/**
 
- 					 * Set the dropdown buttons order.
 
- 					 **/
 
- 					var formatDropdownButtons = self.o.buttonOrderDropdown
 
- 						.replace(/%locked%/g, lockedButton)
 
- 						.replace(/%color%/g, colorButton)
 
- 						.replace(/%refresh%/g, refreshButton)
 
- 						.replace(/%reset%/g, resetButton)
 
- 						.replace(/%custom%/g, customButton);
 
- 					/**
 
- 					 * Add a button wrapper to the header.
 
- 					 **/
 
- 					if (lockedButton !== '' || colorButton !== '' || refreshButton !== '' || resetButton !== '' || customButton !== '') {
 
- 						thisHeader.append('<div class="panel-toolbar"><a href="#" class="btn btn-toolbar-master" data-toggle="dropdown"><i class="fal fa-ellipsis-v"></i></a><div class="dropdown-menu dropdown-menu-animated dropdown-menu-right p-0">' + formatDropdownButtons + '</div></div>');
 
- 					}    
 
- 					/**
 
- 					 * Adding roles to some parts.
 
- 					 **/
 
- 					tPanel.attr('role', 'widget')
 
- 						.children('div')
 
- 						.attr('role', 'content')
 
- 						.prev('.panel-hdr')
 
- 						.attr('role', 'heading')
 
- 						.children('.panel-toolbar')
 
- 						.attr('role', 'menu');
 
- 				}
 
- 			});
 
- 			/**
 
- 			 * SORTABLE
 
- 			 **/
 
- 			/**
 
- 			 * jQuery UI soratble, this allows users to sort the panels.
 
- 			 * Notice that this part needs the jquery-ui core to work.
 
- 			 **/
 
- 			if (self.o.sortable === true && jQuery.ui) {
 
- 				var sortItem = self.obj.find(self.o.grid + '.sortable-grid')
 
- 					.not('[data-panel-excludegrid]');
 
- 				sortItem.sortable({
 
- 					items: sortItem.find(self.o.panels + '.panel-sortable'),
 
- 					connectWith: sortItem,
 
- 					placeholder: self.o.placeholderClass,
 
- 					cursor: 'move',
 
- 					//revert: true,
 
- 					opacity: self.o.opacity,
 
- 					delay: 0,
 
- 					revert: 350,
 
- 					cancel: '.btn-panel, .panel-fullscreen .panel-fullscreen, .mod-panel-disable .panel-sortable, .panel-locked.panel-sortable',
 
- 					zIndex: 10000,
 
- 					handle: self.o.dragHandle,
 
- 					forcePlaceholderSize: true,
 
- 					forceHelperSize: true,
 
- 					update: function (event, ui) {
 
- 						/* run pre-loader in the panel */
 
- 						self._runPanelLoader(ui.item.children());
 
- 						/* store the positions of the plugins */
 
- 						self._savePanelPosition();
 
- 						/**
 
- 						 * Run the callback function.
 
- 						 **/
 
- 						if (typeof self.o.onChange == 'function') {
 
- 							self.o.onChange.call(this, ui.item);
 
- 						}
 
- 					}
 
- 				}); //you can add  }).disableSelection() if you don't want text to be selected accidently.
 
- 			}
 
- 			/**
 
- 			 * CLICKEVENTS
 
- 			 **/
 
- 			self._clickEvents();
 
- 			/**
 
- 			 * DELETE LOCAL STORAGE KEYS
 
- 			 **/
 
- 			if (self.storage.enabled) {
 
- 			   
 
- 				// Delete the settings key.
 
- 				$(self.o.deleteSettingsKey)
 
- 					.on(clickEvent, this, function (e) {
 
- 						var cleared = confirm(self.o.settingsKeyLabel);
 
- 						if (cleared) {
 
- 							localStorage.removeItem(keySettings);
 
- 						}
 
- 						e.preventDefault();
 
- 					});
 
- 				// Delete the position key.
 
- 				$(self.o.deletePositionKey)
 
- 					.on(clickEvent, this, function (e) {
 
- 						var cleared = confirm(self.o.positionKeyLabel);
 
- 						if (cleared) {
 
- 							localStorage.removeItem(keyPosition);
 
- 						}
 
- 						e.preventDefault();
 
- 					});
 
- 			}
 
- 			initialized = true;
 
- 		},
 
- 		/**
 
- 		 * Initialize storage.
 
- 		 *
 
- 		 * @param:
 
- 		 **/
 
- 		_initStorage: function (storage) {
 
- 			/**
 
- 			 * LOCALSTORAGE CHECK
 
- 			 **/
 
- 			storage.enabled = storage.enabled && !! function () {
 
- 				var result, uid = +new Date();
 
- 				try {
 
- 					localStorage.setItem(uid, uid);
 
- 					result = localStorage.getItem(uid) == uid;
 
- 					localStorage.removeItem(uid);
 
- 					return result;
 
- 				} catch (e) {}
 
- 			}();
 
- 			this._loadKeys();
 
- 			if (storage.enabled) {
 
- 				storage.getKeySettings = localStorage.getItem(storage.keySettings);
 
- 				storage.getKeyPosition = localStorage.getItem(storage.keyPosition);
 
- 				
 
- 			} // end if
 
- 		},
 
- 		/**
 
- 		 * Register all click events.
 
- 		 *
 
- 		 * @param:
 
- 		 **/
 
- 		_clickEvents: function () {
 
- 			var self = this;
 
- 			var headers = self.panel.children('.panel-hdr');
 
- 			/**
 
- 			 * Allow users to toggle collapse.
 
- 			 **/
 
- 			headers.on(clickEvent, '.js-panel-collapse', function (e) {
 
- 				var tPanel = $(this),
 
- 					pPanel = tPanel.closest(self.o.panels);
 
- 				/**
 
- 				 * Close tooltip
 
- 				 **/
 
- 				if( typeof($.fn.tooltip) !== 'undefined' && $('[data-toggle="tooltip"]').length ){
 
- 					$(this).tooltip('hide');
 
- 				} else {
 
- 					console.log("bs.tooltip is not loaded");
 
- 				}   
 
- 				/**
 
- 				 * Run function for the indicator image.
 
- 				 **/
 
- 			   // pPanel.toggleClass("panel-collapsed");
 
- 				pPanel.children('.panel-container').collapse('toggle')
 
- 					.on('shown.bs.collapse', function() {
 
- 						pPanel.removeClass('panel-collapsed');
 
- 						self._savePanelSettings(); 
 
- 					 }).on('hidden.bs.collapse', function(){
 
- 						pPanel.addClass('panel-collapsed');
 
- 						self._savePanelSettings(); 
 
- 					});
 
- 				/*if (pPanel.hasClass('panel-collapsed')) {
 
- 					pPanel.removeClass('panel-collapsed')
 
- 						.children('.panel-container')
 
- 						.slideDown(400, function () {
 
- 							self._savePanelSettings(); 
 
- 						});
 
- 				} else {
 
- 					pPanel.addClass('panel-collapsed')
 
- 						.children('.panel-container')
 
- 						.slideUp(400, function () {
 
- 							self._savePanelSettings(); 
 
- 						});
 
- 				}*/
 
- 				/**
 
- 				 * Run function for the indicator image.
 
- 				 **/
 
- 				self._runPanelLoader(tPanel);
 
- 				/**
 
- 				 * Run the callback function.
 
- 				 **/
 
- 				if (typeof self.o.onCollapse == 'function') {
 
- 					self.o.onCollapse.call(this, pPanel);
 
- 				}
 
- 				/**
 
- 				 * Lets save the setings.
 
- 				 **/
 
- 			   // self._savePanelSettings();             
 
- 				
 
- 				e.preventDefault();
 
- 			});
 
- 			/**
 
- 			 * Allow users to toggle fullscreen.
 
- 			 **/
 
- 			headers.on(clickEvent, '.js-panel-fullscreen', function (e) {
 
- 				var tPanel = $(this),
 
- 					pPanel = tPanel.closest(self.o.panels);
 
- 				/**
 
- 				 * Close tooltip
 
- 				 **/
 
- 				if( typeof($.fn.tooltip) !== 'undefined' && $('[data-toggle="tooltip"]').length ){
 
- 					$(this).tooltip('hide');
 
- 				} else {
 
- 					console.log("bs.tooltip is not loaded");
 
- 				}   
 
- 				/**
 
- 				 * Run function for the indicator image.
 
- 				 **/
 
- 				pPanel.toggleClass("panel-fullscreen");
 
- 				myapp_config.root_.toggleClass('panel-fullscreen');
 
- 				/**
 
- 				 * Run function for the indicator image.
 
- 				 **/
 
- 				self._runPanelLoader(tPanel);
 
- 				/**
 
- 				 * Run the callback function.
 
- 				 **/
 
- 				if (typeof self.o.onFullscreen == 'function') {
 
- 					self.o.onFullscreen.call(this, pPanel);
 
- 				}
 
- 				e.preventDefault();
 
- 			});
 
- 			/**
 
- 			 * Allow users to close the panel.
 
- 			 **/
 
- 			headers.on(clickEvent, '.js-panel-close', function (e) {
 
- 				var tPanel = $(this),
 
- 					pPanel = tPanel.closest(self.o.panels),
 
- 					pTitle = pPanel.children('.panel-hdr').children('h2').text().trim();
 
- 				/**
 
- 				 * Close tooltip
 
- 				 **/
 
- 				if( typeof($.fn.tooltip) !== 'undefined' && $('[data-toggle="tooltip"]').length ){
 
- 					$(this).tooltip('hide');
 
- 				} else {
 
- 					console.log("bs.tooltip is not loaded");
 
- 				}   
 
- 				
 
- 				var killPanel = function (){
 
- 					/**
 
- 					 * Run function for the indicator image.
 
- 					 **/
 
- 					pPanel.fadeOut(500,function(){
 
- 						/* remove panel */
 
- 						$(this).remove();
 
- 						/**
 
- 						 * Run the callback function.
 
- 						 **/
 
- 						if (typeof self.o.onClosepanel == 'function') {
 
- 							self.o.onClosepanel.call(this, pPanel);
 
- 						}
 
- 					});  
 
- 					/**
 
- 					 * Run function for the indicator image.
 
- 					 **/
 
- 					self._runPanelLoader(tPanel);
 
- 				};
 
- 				//backdrop sound
 
- 				initApp.playSound('media/sound', 'messagebox')
 
- 				if (typeof bootbox  != 'undefined') {
 
- 					bootbox.confirm({
 
- 						title: "<i class='fal fa-times-circle text-danger mr-2'></i> Do you wish to delete panel <span class='fw-500'> '" +pTitle+"' </span>?",
 
- 						message: "<span><strong>Warning:</strong> This action cannot be undone!</span>",
 
- 						centerVertical: true,
 
- 						swapButtonOrder: true,
 
- 						buttons: {
 
- 							confirm: {
 
- 								label: 'Yes',
 
- 								className: 'btn-danger shadow-0'
 
- 							},
 
- 							cancel: {
 
- 								label: 'No',
 
- 								className: 'btn-default'
 
- 							}
 
- 						},
 
- 						className: "modal-alert",
 
- 						closeButton: false,
 
- 						callback: function (result) {
 
- 							if (result == true) {
 
- 								//close panel 
 
- 								killPanel();
 
- 							}
 
- 						}
 
- 					});
 
- 				} else {
 
- 					if (confirm( 'Do you wish to delete panel ' + pTitle + '?' )) {
 
- 						killPanel();
 
- 					}
 
- 				}				
 
- 				e.preventDefault();
 
- 			});
 
- 			/**
 
- 			 * Allow users to set widget style (color).
 
- 			 **/
 
- 			headers.on(clickEvent, '.js-panel-color', function (e) {
 
- 				var tPanel = $(this),
 
- 					pPanel = tPanel.closest(self.o.panels),
 
- 					selectedHdr = tPanel.closest('.panel-hdr'),
 
- 					val = tPanel.data('panel-setstyle');
 
- 				/**
 
- 				 * Run the callback function.
 
- 				 **/
 
- 				selectedHdr.removeClassPrefix('bg-')
 
- 					.addClass(val)
 
- 					.closest('.panel')
 
- 					.attr('data-panel-attstyle', '' + val + '');              
 
- 				/**
 
- 				 * Run the callback function.
 
- 				 **/
 
- 				if (typeof self.o.onColor == 'function') {
 
- 					self.o.onColor.call(this, pPanel);
 
- 				}
 
- 				/**
 
- 				 * Run function for the indicator image.
 
- 				 **/
 
- 				self._runPanelLoader(tPanel);
 
- 				/**
 
- 				 * Lets save the setings.
 
- 				 **/
 
- 				self._savePanelSettings();
 
- 				e.preventDefault();
 
- 			});
 
- 			/**
 
- 			 * Allow users to lock widget to grid - preventing draging.
 
- 			 **/
 
- 			headers.on(clickEvent, '.js-panel-locked', function (e) {
 
- 				var tPanel = $(this),
 
- 					pPanel = tPanel.closest(self.o.panels);
 
- 				/**
 
- 				 * Run function for the indicator image.
 
- 				 **/
 
- 				pPanel.toggleClass('panel-locked');
 
- 				/**
 
- 				 * Run function for the indicator image.
 
- 				 **/
 
- 				self._runPanelLoader(tPanel);
 
- 				/**
 
- 				 * Run the callback function.
 
- 				 **/
 
- 				if (typeof self.o.onLocked == 'function') {
 
- 					self.o.onLocked.call(this, pPanel);
 
- 				}
 
- 				/**
 
- 				 * Lets save the setings.
 
- 				 **/
 
- 				self._savePanelSettings();             
 
- 				
 
- 				e.preventDefault();
 
- 			});
 
- 			/**
 
- 			 * Allow users to toggle refresh widget content.
 
- 			 **/
 
- 			headers.on(clickEvent, '.js-panel-refresh', function (e) {
 
- 				var tPanel = $(this),
 
- 					pPanel = tPanel.closest(self.o.panels),
 
- 					//pContainer = pPanel.children('.panel-container'),
 
- 					dTimer = pPanel.attr('data-refresh-timer') || 1500;
 
- 				/**
 
- 				 * Run function for the indicator image.
 
- 				 **/
 
- 				pPanel.addClass('panel-refresh').children('.panel-container').addClass('enable-loader')
 
- 					.stop(true, true)
 
- 					.delay(dTimer).queue(function(){
 
- 						//pContainer.removeClass('enable-spinner').dequeue();
 
- 						pPanel.removeClass('panel-refresh').children('.panel-container').removeClass('enable-loader').dequeue();
 
- 						console.log(pPanel.attr('id') + " refresh complete");
 
- 					}); 
 
- 				/**
 
- 				 * Run the callback function.
 
- 				 **/
 
- 				if (typeof self.o.onRefresh == 'function') {
 
- 					self.o.onRefresh.call(this, pPanel);
 
- 				}       
 
- 				
 
- 				e.preventDefault();
 
- 			});
 
- 			 /**
 
- 			 * Allow users to toggle reset widget settings.
 
- 			 **/
 
- 			headers.on(clickEvent, '.js-panel-reset', function (e) {
 
- 				var tPanel = $(this),
 
- 					pPanel = tPanel.closest(self.o.panels),
 
- 					selectedHdr = tPanel.closest('.panel-hdr');
 
- 				/**
 
- 				 * Remove all setting classes.
 
- 				 **/
 
- 				selectedHdr.removeClassPrefix('bg-')
 
- 					.closest('.panel')
 
- 					.removeClass('panel-collapsed panel-fullscreen panel-locked')
 
- 					.attr('data-panel-attstyle', '')
 
- 					.children('.panel-container').collapse('show');
 
- 					  
 
- 				/**
 
- 				 * Run function for the indicator image.
 
- 				 **/
 
- 				self._runPanelLoader(tPanel);    
 
- 				/**
 
- 				 * Lets save the setings.
 
- 				 **/
 
- 				self._savePanelSettings(); 
 
- 				/**
 
- 				 * Run the callback function.
 
- 				 **/
 
- 				if (typeof self.o.onReset == 'function') {
 
- 					self.o.onReset.call(this, pPanel);
 
- 				}       
 
- 				
 
- 				e.preventDefault();
 
- 			});
 
- 			headers = null;
 
- 		},
 
- 		/**
 
- 		 * Destroy.
 
- 		 *
 
- 		 * @param:
 
- 		 **/
 
- 		destroy: function () {
 
- 			var self = this, 
 
- 				namespace = '.' + pluginName, 
 
- 				sortItem = self.obj.find(self.o.grid + '.sortable-grid').not('[data-panel-excludegrid]');
 
- 			self.panel.removeClass('panel-sortable');
 
- 			sortItem.sortable('destroy');
 
- 			self.panel.children('.panel-hdr').off(namespace);
 
- 			$(self.o.deletePositionKey).off(namespace);
 
- 			$(window).off(namespace);
 
- 			self.obj.removeData(pluginName);
 
- 			self.initialized = false;
 
- 		}
 
- 	};
 
- 	$.fn[pluginName] = function (option) {
 
- 		return this.each(function () {
 
- 			var $this = $(this),
 
- 				data = $this.data(pluginName);
 
- 			if (!data) {
 
- 				var options = typeof option == 'object' && option;
 
- 				$this.data(pluginName, (data = new Plugin(this, options)));
 
- 			}
 
- 			if (typeof option == 'string') {
 
- 				data[option]();
 
- 			}
 
- 		});
 
- 	};
 
- 	/**
 
- 	 * Default settings(dont change).
 
- 	 * You can globally override these options
 
- 	 * by using $.fn.pluginName.key = 'value';
 
- 	 **/
 
- 	$.fn[pluginName].defaults = {
 
- 		grid: '[class*="col-"]',
 
- 		panels: '.panel',
 
- 		placeholderClass: 'panel-placeholder',
 
- 		dragHandle: '> .panel-hdr > h2',
 
- 		localStorage: true,
 
- 		onChange: function () {},
 
- 		onSave: function () {},
 
- 		opacity: 1,
 
- 		deleteSettingsKey: '',
 
- 		settingsKeyLabel: 'Reset settings?',
 
- 		deletePositionKey: '',
 
- 		positionKeyLabel: 'Reset position?',
 
- 		sortable: true,
 
- 		buttonOrder: '%collapse% %fullscreen% %close%',
 
- 		buttonOrderDropdown: '%refresh% %locked% %color% %custom% %reset%',
 
- 		customButton: false,
 
- 		customButtonLabel: "Custom Label",
 
- 		onCustom: function () {},
 
- 		closeButton: true,
 
- 		onClosepanel: function() {
 
- 			if (myapp_config.debugState)
 
- 				console.log($(this).closest(".panel").attr('id') + " onClosepanel")
 
- 		},
 
- 		fullscreenButton: true,
 
- 		onFullscreen: function() {
 
- 			if (myapp_config.debugState)
 
- 				console.log($(this).closest(".panel").attr('id') + " onFullscreen")
 
- 		},
 
- 		collapseButton: true,
 
- 		onCollapse: function() {
 
- 			if (myapp_config.debugState)
 
- 				console.log($(this).closest(".panel").attr('id') + " onCollapse")
 
- 		},
 
- 		lockedButton: true,
 
- 		lockedButtonLabel: "Lock Position",
 
- 		onLocked: function() {
 
- 			if (myapp_config.debugState)
 
- 				console.log($(this).closest(".panel").attr('id') + " onLocked")
 
- 		},
 
- 		refreshButton: true,
 
- 		refreshButtonLabel: "Refresh Content",
 
- 		onRefresh: function() {
 
- 			if (myapp_config.debugState)
 
- 				console.log($(this).closest(".panel").attr('id') + " onRefresh")
 
- 		},
 
- 		colorButton: true,
 
- 		colorButtonLabel: "Panel Style",
 
- 		onColor: function() {
 
- 			if (myapp_config.debugState)
 
- 				console.log($(this).closest(".panel").attr('id') + " onColor")
 
- 		},
 
- 		panelColors: ['bg-primary-700 bg-success-gradient',
 
- 					  'bg-primary-500 bg-info-gradient',
 
- 					  'bg-primary-600 bg-primary-gradient',
 
- 					  'bg-info-600 bg-primray-gradient',                      
 
- 					  'bg-info-600 bg-info-gradient',
 
- 					  'bg-info-700 bg-success-gradient',
 
- 					  'bg-success-900 bg-info-gradient',
 
- 					  'bg-success-700 bg-primary-gradient', 
 
- 					  'bg-success-600 bg-success-gradient',                                 
 
- 					  'bg-danger-900 bg-info-gradient',
 
- 					  'bg-fusion-400 bg-fusion-gradient', 
 
- 					  'bg-faded'],
 
- 		resetButton: true,
 
- 		resetButtonLabel: "Reset Panel",
 
- 		onReset: function() {
 
- 			if (myapp_config.debugState)
 
- 				console.log( $(this).closest(".panel").attr('id') + " onReset callback" )
 
- 		}
 
- 	};
 
- })(jQuery, window, document);
 
 
  |