stats.html 622 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" />
  5. <title>Generated by gitinspector 0.3.1</title>
  6. <script type="application/javascript">/*!
  7. * jQuery JavaScript Library v1.8.3
  8. * http://jquery.com/
  9. *
  10. * Includes Sizzle.js
  11. * http://sizzlejs.com/
  12. *
  13. * Copyright 2012 jQuery Foundation and other contributors
  14. * Released under the MIT license
  15. * http://jquery.org/license
  16. *
  17. * Date: Tue Nov 13 2012 08:20:33 GMT-0500 (Eastern Standard Time)
  18. */
  19. (function( window, undefined ) {
  20. var
  21. // A central reference to the root jQuery(document)
  22. rootjQuery,
  23. // The deferred used on DOM ready
  24. readyList,
  25. // Use the correct document accordingly with window argument (sandbox)
  26. document = window.document,
  27. location = window.location,
  28. navigator = window.navigator,
  29. // Map over jQuery in case of overwrite
  30. _jQuery = window.jQuery,
  31. // Map over the $ in case of overwrite
  32. _$ = window.$,
  33. // Save a reference to some core methods
  34. core_push = Array.prototype.push,
  35. core_slice = Array.prototype.slice,
  36. core_indexOf = Array.prototype.indexOf,
  37. core_toString = Object.prototype.toString,
  38. core_hasOwn = Object.prototype.hasOwnProperty,
  39. core_trim = String.prototype.trim,
  40. // Define a local copy of jQuery
  41. jQuery = function( selector, context ) {
  42. // The jQuery object is actually just the init constructor 'enhanced'
  43. return new jQuery.fn.init( selector, context, rootjQuery );
  44. },
  45. // Used for matching numbers
  46. core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,
  47. // Used for detecting and trimming whitespace
  48. core_rnotwhite = /\S/,
  49. core_rspace = /\s+/,
  50. // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
  51. rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
  52. // A simple way to check for HTML strings
  53. // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
  54. rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
  55. // Match a standalone tag
  56. rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
  57. // JSON RegExp
  58. rvalidchars = /^[\],:{}\s]*$/,
  59. rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
  60. rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
  61. rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,
  62. // Matches dashed string for camelizing
  63. rmsPrefix = /^-ms-/,
  64. rdashAlpha = /-([\da-z])/gi,
  65. // Used by jQuery.camelCase as callback to replace()
  66. fcamelCase = function( all, letter ) {
  67. return ( letter + "" ).toUpperCase();
  68. },
  69. // The ready event handler and self cleanup method
  70. DOMContentLoaded = function() {
  71. if ( document.addEventListener ) {
  72. document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
  73. jQuery.ready();
  74. } else if ( document.readyState === "complete" ) {
  75. // we're here because readyState === "complete" in oldIE
  76. // which is good enough for us to call the dom ready!
  77. document.detachEvent( "onreadystatechange", DOMContentLoaded );
  78. jQuery.ready();
  79. }
  80. },
  81. // [[Class]] -> type pairs
  82. class2type = {};
  83. jQuery.fn = jQuery.prototype = {
  84. constructor: jQuery,
  85. init: function( selector, context, rootjQuery ) {
  86. var match, elem, ret, doc;
  87. // Handle $(""), $(null), $(undefined), $(false)
  88. if ( !selector ) {
  89. return this;
  90. }
  91. // Handle $(DOMElement)
  92. if ( selector.nodeType ) {
  93. this.context = this[0] = selector;
  94. this.length = 1;
  95. return this;
  96. }
  97. // Handle HTML strings
  98. if ( typeof selector === "string" ) {
  99. if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
  100. // Assume that strings that start and end with <> are HTML and skip the regex check
  101. match = [ null, selector, null ];
  102. } else {
  103. match = rquickExpr.exec( selector );
  104. }
  105. // Match html or make sure no context is specified for #id
  106. if ( match && (match[1] || !context) ) {
  107. // HANDLE: $(html) -> $(array)
  108. if ( match[1] ) {
  109. context = context instanceof jQuery ? context[0] : context;
  110. doc = ( context && context.nodeType ? context.ownerDocument || context : document );
  111. // scripts is true for back-compat
  112. selector = jQuery.parseHTML( match[1], doc, true );
  113. if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
  114. this.attr.call( selector, context, true );
  115. }
  116. return jQuery.merge( this, selector );
  117. // HANDLE: $(#id)
  118. } else {
  119. elem = document.getElementById( match[2] );
  120. // Check parentNode to catch when Blackberry 4.6 returns
  121. // nodes that are no longer in the document #6963
  122. if ( elem && elem.parentNode ) {
  123. // Handle the case where IE and Opera return items
  124. // by name instead of ID
  125. if ( elem.id !== match[2] ) {
  126. return rootjQuery.find( selector );
  127. }
  128. // Otherwise, we inject the element directly into the jQuery object
  129. this.length = 1;
  130. this[0] = elem;
  131. }
  132. this.context = document;
  133. this.selector = selector;
  134. return this;
  135. }
  136. // HANDLE: $(expr, $(...))
  137. } else if ( !context || context.jquery ) {
  138. return ( context || rootjQuery ).find( selector );
  139. // HANDLE: $(expr, context)
  140. // (which is just equivalent to: $(context).find(expr)
  141. } else {
  142. return this.constructor( context ).find( selector );
  143. }
  144. // HANDLE: $(function)
  145. // Shortcut for document ready
  146. } else if ( jQuery.isFunction( selector ) ) {
  147. return rootjQuery.ready( selector );
  148. }
  149. if ( selector.selector !== undefined ) {
  150. this.selector = selector.selector;
  151. this.context = selector.context;
  152. }
  153. return jQuery.makeArray( selector, this );
  154. },
  155. // Start with an empty selector
  156. selector: "",
  157. // The current version of jQuery being used
  158. jquery: "1.8.3",
  159. // The default length of a jQuery object is 0
  160. length: 0,
  161. // The number of elements contained in the matched element set
  162. size: function() {
  163. return this.length;
  164. },
  165. toArray: function() {
  166. return core_slice.call( this );
  167. },
  168. // Get the Nth element in the matched element set OR
  169. // Get the whole matched element set as a clean array
  170. get: function( num ) {
  171. return num == null ?
  172. // Return a 'clean' array
  173. this.toArray() :
  174. // Return just the object
  175. ( num < 0 ? this[ this.length + num ] : this[ num ] );
  176. },
  177. // Take an array of elements and push it onto the stack
  178. // (returning the new matched element set)
  179. pushStack: function( elems, name, selector ) {
  180. // Build a new jQuery matched element set
  181. var ret = jQuery.merge( this.constructor(), elems );
  182. // Add the old object onto the stack (as a reference)
  183. ret.prevObject = this;
  184. ret.context = this.context;
  185. if ( name === "find" ) {
  186. ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
  187. } else if ( name ) {
  188. ret.selector = this.selector + "." + name + "(" + selector + ")";
  189. }
  190. // Return the newly-formed element set
  191. return ret;
  192. },
  193. // Execute a callback for every element in the matched set.
  194. // (You can seed the arguments with an array of args, but this is
  195. // only used internally.)
  196. each: function( callback, args ) {
  197. return jQuery.each( this, callback, args );
  198. },
  199. ready: function( fn ) {
  200. // Add the callback
  201. jQuery.ready.promise().done( fn );
  202. return this;
  203. },
  204. eq: function( i ) {
  205. i = +i;
  206. return i === -1 ?
  207. this.slice( i ) :
  208. this.slice( i, i + 1 );
  209. },
  210. first: function() {
  211. return this.eq( 0 );
  212. },
  213. last: function() {
  214. return this.eq( -1 );
  215. },
  216. slice: function() {
  217. return this.pushStack( core_slice.apply( this, arguments ),
  218. "slice", core_slice.call(arguments).join(",") );
  219. },
  220. map: function( callback ) {
  221. return this.pushStack( jQuery.map(this, function( elem, i ) {
  222. return callback.call( elem, i, elem );
  223. }));
  224. },
  225. end: function() {
  226. return this.prevObject || this.constructor(null);
  227. },
  228. // For internal use only.
  229. // Behaves like an Array's method, not like a jQuery method.
  230. push: core_push,
  231. sort: [].sort,
  232. splice: [].splice
  233. };
  234. // Give the init function the jQuery prototype for later instantiation
  235. jQuery.fn.init.prototype = jQuery.fn;
  236. jQuery.extend = jQuery.fn.extend = function() {
  237. var options, name, src, copy, copyIsArray, clone,
  238. target = arguments[0] || {},
  239. i = 1,
  240. length = arguments.length,
  241. deep = false;
  242. // Handle a deep copy situation
  243. if ( typeof target === "boolean" ) {
  244. deep = target;
  245. target = arguments[1] || {};
  246. // skip the boolean and the target
  247. i = 2;
  248. }
  249. // Handle case when target is a string or something (possible in deep copy)
  250. if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
  251. target = {};
  252. }
  253. // extend jQuery itself if only one argument is passed
  254. if ( length === i ) {
  255. target = this;
  256. --i;
  257. }
  258. for ( ; i < length; i++ ) {
  259. // Only deal with non-null/undefined values
  260. if ( (options = arguments[ i ]) != null ) {
  261. // Extend the base object
  262. for ( name in options ) {
  263. src = target[ name ];
  264. copy = options[ name ];
  265. // Prevent never-ending loop
  266. if ( target === copy ) {
  267. continue;
  268. }
  269. // Recurse if we're merging plain objects or arrays
  270. if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
  271. if ( copyIsArray ) {
  272. copyIsArray = false;
  273. clone = src && jQuery.isArray(src) ? src : [];
  274. } else {
  275. clone = src && jQuery.isPlainObject(src) ? src : {};
  276. }
  277. // Never move original objects, clone them
  278. target[ name ] = jQuery.extend( deep, clone, copy );
  279. // Don't bring in undefined values
  280. } else if ( copy !== undefined ) {
  281. target[ name ] = copy;
  282. }
  283. }
  284. }
  285. }
  286. // Return the modified object
  287. return target;
  288. };
  289. jQuery.extend({
  290. noConflict: function( deep ) {
  291. if ( window.$ === jQuery ) {
  292. window.$ = _$;
  293. }
  294. if ( deep && window.jQuery === jQuery ) {
  295. window.jQuery = _jQuery;
  296. }
  297. return jQuery;
  298. },
  299. // Is the DOM ready to be used? Set to true once it occurs.
  300. isReady: false,
  301. // A counter to track how many items to wait for before
  302. // the ready event fires. See #6781
  303. readyWait: 1,
  304. // Hold (or release) the ready event
  305. holdReady: function( hold ) {
  306. if ( hold ) {
  307. jQuery.readyWait++;
  308. } else {
  309. jQuery.ready( true );
  310. }
  311. },
  312. // Handle when the DOM is ready
  313. ready: function( wait ) {
  314. // Abort if there are pending holds or we're already ready
  315. if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
  316. return;
  317. }
  318. // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
  319. if ( !document.body ) {
  320. return setTimeout( jQuery.ready, 1 );
  321. }
  322. // Remember that the DOM is ready
  323. jQuery.isReady = true;
  324. // If a normal DOM Ready event fired, decrement, and wait if need be
  325. if ( wait !== true && --jQuery.readyWait > 0 ) {
  326. return;
  327. }
  328. // If there are functions bound, to execute
  329. readyList.resolveWith( document, [ jQuery ] );
  330. // Trigger any bound ready events
  331. if ( jQuery.fn.trigger ) {
  332. jQuery( document ).trigger("ready").off("ready");
  333. }
  334. },
  335. // See test/unit/core.js for details concerning isFunction.
  336. // Since version 1.3, DOM methods and functions like alert
  337. // aren't supported. They return false on IE (#2968).
  338. isFunction: function( obj ) {
  339. return jQuery.type(obj) === "function";
  340. },
  341. isArray: Array.isArray || function( obj ) {
  342. return jQuery.type(obj) === "array";
  343. },
  344. isWindow: function( obj ) {
  345. return obj != null && obj == obj.window;
  346. },
  347. isNumeric: function( obj ) {
  348. return !isNaN( parseFloat(obj) ) && isFinite( obj );
  349. },
  350. type: function( obj ) {
  351. return obj == null ?
  352. String( obj ) :
  353. class2type[ core_toString.call(obj) ] || "object";
  354. },
  355. isPlainObject: function( obj ) {
  356. // Must be an Object.
  357. // Because of IE, we also have to check the presence of the constructor property.
  358. // Make sure that DOM nodes and window objects don't pass through, as well
  359. if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
  360. return false;
  361. }
  362. try {
  363. // Not own constructor property must be Object
  364. if ( obj.constructor &&
  365. !core_hasOwn.call(obj, "constructor") &&
  366. !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
  367. return false;
  368. }
  369. } catch ( e ) {
  370. // IE8,9 Will throw exceptions on certain host objects #9897
  371. return false;
  372. }
  373. // Own properties are enumerated firstly, so to speed up,
  374. // if last one is own, then all properties are own.
  375. var key;
  376. for ( key in obj ) {}
  377. return key === undefined || core_hasOwn.call( obj, key );
  378. },
  379. isEmptyObject: function( obj ) {
  380. var name;
  381. for ( name in obj ) {
  382. return false;
  383. }
  384. return true;
  385. },
  386. error: function( msg ) {
  387. throw new Error( msg );
  388. },
  389. // data: string of html
  390. // context (optional): If specified, the fragment will be created in this context, defaults to document
  391. // scripts (optional): If true, will include scripts passed in the html string
  392. parseHTML: function( data, context, scripts ) {
  393. var parsed;
  394. if ( !data || typeof data !== "string" ) {
  395. return null;
  396. }
  397. if ( typeof context === "boolean" ) {
  398. scripts = context;
  399. context = 0;
  400. }
  401. context = context || document;
  402. // Single tag
  403. if ( (parsed = rsingleTag.exec( data )) ) {
  404. return [ context.createElement( parsed[1] ) ];
  405. }
  406. parsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] );
  407. return jQuery.merge( [],
  408. (parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes );
  409. },
  410. parseJSON: function( data ) {
  411. if ( !data || typeof data !== "string") {
  412. return null;
  413. }
  414. // Make sure leading/trailing whitespace is removed (IE can't handle it)
  415. data = jQuery.trim( data );
  416. // Attempt to parse using the native JSON parser first
  417. if ( window.JSON && window.JSON.parse ) {
  418. return window.JSON.parse( data );
  419. }
  420. // Make sure the incoming data is actual JSON
  421. // Logic borrowed from http://json.org/json2.js
  422. if ( rvalidchars.test( data.replace( rvalidescape, "@" )
  423. .replace( rvalidtokens, "]" )
  424. .replace( rvalidbraces, "")) ) {
  425. return ( new Function( "return " + data ) )();
  426. }
  427. jQuery.error( "Invalid JSON: " + data );
  428. },
  429. // Cross-browser xml parsing
  430. parseXML: function( data ) {
  431. var xml, tmp;
  432. if ( !data || typeof data !== "string" ) {
  433. return null;
  434. }
  435. try {
  436. if ( window.DOMParser ) { // Standard
  437. tmp = new DOMParser();
  438. xml = tmp.parseFromString( data , "text/xml" );
  439. } else { // IE
  440. xml = new ActiveXObject( "Microsoft.XMLDOM" );
  441. xml.async = "false";
  442. xml.loadXML( data );
  443. }
  444. } catch( e ) {
  445. xml = undefined;
  446. }
  447. if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
  448. jQuery.error( "Invalid XML: " + data );
  449. }
  450. return xml;
  451. },
  452. noop: function() {},
  453. // Evaluates a script in a global context
  454. // Workarounds based on findings by Jim Driscoll
  455. // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
  456. globalEval: function( data ) {
  457. if ( data && core_rnotwhite.test( data ) ) {
  458. // We use execScript on Internet Explorer
  459. // We use an anonymous function so that context is window
  460. // rather than jQuery in Firefox
  461. ( window.execScript || function( data ) {
  462. window[ "eval" ].call( window, data );
  463. } )( data );
  464. }
  465. },
  466. // Convert dashed to camelCase; used by the css and data modules
  467. // Microsoft forgot to hump their vendor prefix (#9572)
  468. camelCase: function( string ) {
  469. return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
  470. },
  471. nodeName: function( elem, name ) {
  472. return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
  473. },
  474. // args is for internal usage only
  475. each: function( obj, callback, args ) {
  476. var name,
  477. i = 0,
  478. length = obj.length,
  479. isObj = length === undefined || jQuery.isFunction( obj );
  480. if ( args ) {
  481. if ( isObj ) {
  482. for ( name in obj ) {
  483. if ( callback.apply( obj[ name ], args ) === false ) {
  484. break;
  485. }
  486. }
  487. } else {
  488. for ( ; i < length; ) {
  489. if ( callback.apply( obj[ i++ ], args ) === false ) {
  490. break;
  491. }
  492. }
  493. }
  494. // A special, fast, case for the most common use of each
  495. } else {
  496. if ( isObj ) {
  497. for ( name in obj ) {
  498. if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) {
  499. break;
  500. }
  501. }
  502. } else {
  503. for ( ; i < length; ) {
  504. if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {
  505. break;
  506. }
  507. }
  508. }
  509. }
  510. return obj;
  511. },
  512. // Use native String.trim function wherever possible
  513. trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
  514. function( text ) {
  515. return text == null ?
  516. "" :
  517. core_trim.call( text );
  518. } :
  519. // Otherwise use our own trimming functionality
  520. function( text ) {
  521. return text == null ?
  522. "" :
  523. ( text + "" ).replace( rtrim, "" );
  524. },
  525. // results is for internal usage only
  526. makeArray: function( arr, results ) {
  527. var type,
  528. ret = results || [];
  529. if ( arr != null ) {
  530. // The window, strings (and functions) also have 'length'
  531. // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
  532. type = jQuery.type( arr );
  533. if ( arr.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( arr ) ) {
  534. core_push.call( ret, arr );
  535. } else {
  536. jQuery.merge( ret, arr );
  537. }
  538. }
  539. return ret;
  540. },
  541. inArray: function( elem, arr, i ) {
  542. var len;
  543. if ( arr ) {
  544. if ( core_indexOf ) {
  545. return core_indexOf.call( arr, elem, i );
  546. }
  547. len = arr.length;
  548. i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
  549. for ( ; i < len; i++ ) {
  550. // Skip accessing in sparse arrays
  551. if ( i in arr && arr[ i ] === elem ) {
  552. return i;
  553. }
  554. }
  555. }
  556. return -1;
  557. },
  558. merge: function( first, second ) {
  559. var l = second.length,
  560. i = first.length,
  561. j = 0;
  562. if ( typeof l === "number" ) {
  563. for ( ; j < l; j++ ) {
  564. first[ i++ ] = second[ j ];
  565. }
  566. } else {
  567. while ( second[j] !== undefined ) {
  568. first[ i++ ] = second[ j++ ];
  569. }
  570. }
  571. first.length = i;
  572. return first;
  573. },
  574. grep: function( elems, callback, inv ) {
  575. var retVal,
  576. ret = [],
  577. i = 0,
  578. length = elems.length;
  579. inv = !!inv;
  580. // Go through the array, only saving the items
  581. // that pass the validator function
  582. for ( ; i < length; i++ ) {
  583. retVal = !!callback( elems[ i ], i );
  584. if ( inv !== retVal ) {
  585. ret.push( elems[ i ] );
  586. }
  587. }
  588. return ret;
  589. },
  590. // arg is for internal usage only
  591. map: function( elems, callback, arg ) {
  592. var value, key,
  593. ret = [],
  594. i = 0,
  595. length = elems.length,
  596. // jquery objects are treated as arrays
  597. isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
  598. // Go through the array, translating each of the items to their
  599. if ( isArray ) {
  600. for ( ; i < length; i++ ) {
  601. value = callback( elems[ i ], i, arg );
  602. if ( value != null ) {
  603. ret[ ret.length ] = value;
  604. }
  605. }
  606. // Go through every key on the object,
  607. } else {
  608. for ( key in elems ) {
  609. value = callback( elems[ key ], key, arg );
  610. if ( value != null ) {
  611. ret[ ret.length ] = value;
  612. }
  613. }
  614. }
  615. // Flatten any nested arrays
  616. return ret.concat.apply( [], ret );
  617. },
  618. // A global GUID counter for objects
  619. guid: 1,
  620. // Bind a function to a context, optionally partially applying any
  621. // arguments.
  622. proxy: function( fn, context ) {
  623. var tmp, args, proxy;
  624. if ( typeof context === "string" ) {
  625. tmp = fn[ context ];
  626. context = fn;
  627. fn = tmp;
  628. }
  629. // Quick check to determine if target is callable, in the spec
  630. // this throws a TypeError, but we will just return undefined.
  631. if ( !jQuery.isFunction( fn ) ) {
  632. return undefined;
  633. }
  634. // Simulated bind
  635. args = core_slice.call( arguments, 2 );
  636. proxy = function() {
  637. return fn.apply( context, args.concat( core_slice.call( arguments ) ) );
  638. };
  639. // Set the guid of unique handler to the same of original handler, so it can be removed
  640. proxy.guid = fn.guid = fn.guid || jQuery.guid++;
  641. return proxy;
  642. },
  643. // Multifunctional method to get and set values of a collection
  644. // The value/s can optionally be executed if it's a function
  645. access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
  646. var exec,
  647. bulk = key == null,
  648. i = 0,
  649. length = elems.length;
  650. // Sets many values
  651. if ( key && typeof key === "object" ) {
  652. for ( i in key ) {
  653. jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
  654. }
  655. chainable = 1;
  656. // Sets one value
  657. } else if ( value !== undefined ) {
  658. // Optionally, function values get executed if exec is true
  659. exec = pass === undefined && jQuery.isFunction( value );
  660. if ( bulk ) {
  661. // Bulk operations only iterate when executing function values
  662. if ( exec ) {
  663. exec = fn;
  664. fn = function( elem, key, value ) {
  665. return exec.call( jQuery( elem ), value );
  666. };
  667. // Otherwise they run against the entire set
  668. } else {
  669. fn.call( elems, value );
  670. fn = null;
  671. }
  672. }
  673. if ( fn ) {
  674. for (; i < length; i++ ) {
  675. fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
  676. }
  677. }
  678. chainable = 1;
  679. }
  680. return chainable ?
  681. elems :
  682. // Gets
  683. bulk ?
  684. fn.call( elems ) :
  685. length ? fn( elems[0], key ) : emptyGet;
  686. },
  687. now: function() {
  688. return ( new Date() ).getTime();
  689. }
  690. });
  691. jQuery.ready.promise = function( obj ) {
  692. if ( !readyList ) {
  693. readyList = jQuery.Deferred();
  694. // Catch cases where $(document).ready() is called after the browser event has already occurred.
  695. // we once tried to use readyState "interactive" here, but it caused issues like the one
  696. // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
  697. if ( document.readyState === "complete" ) {
  698. // Handle it asynchronously to allow scripts the opportunity to delay ready
  699. setTimeout( jQuery.ready, 1 );
  700. // Standards-based browsers support DOMContentLoaded
  701. } else if ( document.addEventListener ) {
  702. // Use the handy event callback
  703. document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
  704. // A fallback to window.onload, that will always work
  705. window.addEventListener( "load", jQuery.ready, false );
  706. // If IE event model is used
  707. } else {
  708. // Ensure firing before onload, maybe late but safe also for iframes
  709. document.attachEvent( "onreadystatechange", DOMContentLoaded );
  710. // A fallback to window.onload, that will always work
  711. window.attachEvent( "onload", jQuery.ready );
  712. // If IE and not a frame
  713. // continually check to see if the document is ready
  714. var top = false;
  715. try {
  716. top = window.frameElement == null && document.documentElement;
  717. } catch(e) {}
  718. if ( top && top.doScroll ) {
  719. (function doScrollCheck() {
  720. if ( !jQuery.isReady ) {
  721. try {
  722. // Use the trick by Diego Perini
  723. // http://javascript.nwbox.com/IEContentLoaded/
  724. top.doScroll("left");
  725. } catch(e) {
  726. return setTimeout( doScrollCheck, 50 );
  727. }
  728. // and execute any waiting functions
  729. jQuery.ready();
  730. }
  731. })();
  732. }
  733. }
  734. }
  735. return readyList.promise( obj );
  736. };
  737. // Populate the class2type map
  738. jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
  739. class2type[ "[object " + name + "]" ] = name.toLowerCase();
  740. });
  741. // All jQuery objects should point back to these
  742. rootjQuery = jQuery(document);
  743. // String to Object options format cache
  744. var optionsCache = {};
  745. // Convert String-formatted options into Object-formatted ones and store in cache
  746. function createOptions( options ) {
  747. var object = optionsCache[ options ] = {};
  748. jQuery.each( options.split( core_rspace ), function( _, flag ) {
  749. object[ flag ] = true;
  750. });
  751. return object;
  752. }
  753. /*
  754. * Create a callback list using the following parameters:
  755. *
  756. * options: an optional list of space-separated options that will change how
  757. * the callback list behaves or a more traditional option object
  758. *
  759. * By default a callback list will act like an event callback list and can be
  760. * "fired" multiple times.
  761. *
  762. * Possible options:
  763. *
  764. * once: will ensure the callback list can only be fired once (like a Deferred)
  765. *
  766. * memory: will keep track of previous values and will call any callback added
  767. * after the list has been fired right away with the latest "memorized"
  768. * values (like a Deferred)
  769. *
  770. * unique: will ensure a callback can only be added once (no duplicate in the list)
  771. *
  772. * stopOnFalse: interrupt callings when a callback returns false
  773. *
  774. */
  775. jQuery.Callbacks = function( options ) {
  776. // Convert options from String-formatted to Object-formatted if needed
  777. // (we check in cache first)
  778. options = typeof options === "string" ?
  779. ( optionsCache[ options ] || createOptions( options ) ) :
  780. jQuery.extend( {}, options );
  781. var // Last fire value (for non-forgettable lists)
  782. memory,
  783. // Flag to know if list was already fired
  784. fired,
  785. // Flag to know if list is currently firing
  786. firing,
  787. // First callback to fire (used internally by add and fireWith)
  788. firingStart,
  789. // End of the loop when firing
  790. firingLength,
  791. // Index of currently firing callback (modified by remove if needed)
  792. firingIndex,
  793. // Actual callback list
  794. list = [],
  795. // Stack of fire calls for repeatable lists
  796. stack = !options.once && [],
  797. // Fire callbacks
  798. fire = function( data ) {
  799. memory = options.memory && data;
  800. fired = true;
  801. firingIndex = firingStart || 0;
  802. firingStart = 0;
  803. firingLength = list.length;
  804. firing = true;
  805. for ( ; list && firingIndex < firingLength; firingIndex++ ) {
  806. if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
  807. memory = false; // To prevent further calls using add
  808. break;
  809. }
  810. }
  811. firing = false;
  812. if ( list ) {
  813. if ( stack ) {
  814. if ( stack.length ) {
  815. fire( stack.shift() );
  816. }
  817. } else if ( memory ) {
  818. list = [];
  819. } else {
  820. self.disable();
  821. }
  822. }
  823. },
  824. // Actual Callbacks object
  825. self = {
  826. // Add a callback or a collection of callbacks to the list
  827. add: function() {
  828. if ( list ) {
  829. // First, we save the current length
  830. var start = list.length;
  831. (function add( args ) {
  832. jQuery.each( args, function( _, arg ) {
  833. var type = jQuery.type( arg );
  834. if ( type === "function" ) {
  835. if ( !options.unique || !self.has( arg ) ) {
  836. list.push( arg );
  837. }
  838. } else if ( arg && arg.length && type !== "string" ) {
  839. // Inspect recursively
  840. add( arg );
  841. }
  842. });
  843. })( arguments );
  844. // Do we need to add the callbacks to the
  845. // current firing batch?
  846. if ( firing ) {
  847. firingLength = list.length;
  848. // With memory, if we're not firing then
  849. // we should call right away
  850. } else if ( memory ) {
  851. firingStart = start;
  852. fire( memory );
  853. }
  854. }
  855. return this;
  856. },
  857. // Remove a callback from the list
  858. remove: function() {
  859. if ( list ) {
  860. jQuery.each( arguments, function( _, arg ) {
  861. var index;
  862. while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
  863. list.splice( index, 1 );
  864. // Handle firing indexes
  865. if ( firing ) {
  866. if ( index <= firingLength ) {
  867. firingLength--;
  868. }
  869. if ( index <= firingIndex ) {
  870. firingIndex--;
  871. }
  872. }
  873. }
  874. });
  875. }
  876. return this;
  877. },
  878. // Control if a given callback is in the list
  879. has: function( fn ) {
  880. return jQuery.inArray( fn, list ) > -1;
  881. },
  882. // Remove all callbacks from the list
  883. empty: function() {
  884. list = [];
  885. return this;
  886. },
  887. // Have the list do nothing anymore
  888. disable: function() {
  889. list = stack = memory = undefined;
  890. return this;
  891. },
  892. // Is it disabled?
  893. disabled: function() {
  894. return !list;
  895. },
  896. // Lock the list in its current state
  897. lock: function() {
  898. stack = undefined;
  899. if ( !memory ) {
  900. self.disable();
  901. }
  902. return this;
  903. },
  904. // Is it locked?
  905. locked: function() {
  906. return !stack;
  907. },
  908. // Call all callbacks with the given context and arguments
  909. fireWith: function( context, args ) {
  910. args = args || [];
  911. args = [ context, args.slice ? args.slice() : args ];
  912. if ( list && ( !fired || stack ) ) {
  913. if ( firing ) {
  914. stack.push( args );
  915. } else {
  916. fire( args );
  917. }
  918. }
  919. return this;
  920. },
  921. // Call all the callbacks with the given arguments
  922. fire: function() {
  923. self.fireWith( this, arguments );
  924. return this;
  925. },
  926. // To know if the callbacks have already been called at least once
  927. fired: function() {
  928. return !!fired;
  929. }
  930. };
  931. return self;
  932. };
  933. jQuery.extend({
  934. Deferred: function( func ) {
  935. var tuples = [
  936. // action, add listener, listener list, final state
  937. [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
  938. [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
  939. [ "notify", "progress", jQuery.Callbacks("memory") ]
  940. ],
  941. state = "pending",
  942. promise = {
  943. state: function() {
  944. return state;
  945. },
  946. always: function() {
  947. deferred.done( arguments ).fail( arguments );
  948. return this;
  949. },
  950. then: function( /* fnDone, fnFail, fnProgress */ ) {
  951. var fns = arguments;
  952. return jQuery.Deferred(function( newDefer ) {
  953. jQuery.each( tuples, function( i, tuple ) {
  954. var action = tuple[ 0 ],
  955. fn = fns[ i ];
  956. // deferred[ done | fail | progress ] for forwarding actions to newDefer
  957. deferred[ tuple[1] ]( jQuery.isFunction( fn ) ?
  958. function() {
  959. var returned = fn.apply( this, arguments );
  960. if ( returned && jQuery.isFunction( returned.promise ) ) {
  961. returned.promise()
  962. .done( newDefer.resolve )
  963. .fail( newDefer.reject )
  964. .progress( newDefer.notify );
  965. } else {
  966. newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
  967. }
  968. } :
  969. newDefer[ action ]
  970. );
  971. });
  972. fns = null;
  973. }).promise();
  974. },
  975. // Get a promise for this deferred
  976. // If obj is provided, the promise aspect is added to the object
  977. promise: function( obj ) {
  978. return obj != null ? jQuery.extend( obj, promise ) : promise;
  979. }
  980. },
  981. deferred = {};
  982. // Keep pipe for back-compat
  983. promise.pipe = promise.then;
  984. // Add list-specific methods
  985. jQuery.each( tuples, function( i, tuple ) {
  986. var list = tuple[ 2 ],
  987. stateString = tuple[ 3 ];
  988. // promise[ done | fail | progress ] = list.add
  989. promise[ tuple[1] ] = list.add;
  990. // Handle state
  991. if ( stateString ) {
  992. list.add(function() {
  993. // state = [ resolved | rejected ]
  994. state = stateString;
  995. // [ reject_list | resolve_list ].disable; progress_list.lock
  996. }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
  997. }
  998. // deferred[ resolve | reject | notify ] = list.fire
  999. deferred[ tuple[0] ] = list.fire;
  1000. deferred[ tuple[0] + "With" ] = list.fireWith;
  1001. });
  1002. // Make the deferred a promise
  1003. promise.promise( deferred );
  1004. // Call given func if any
  1005. if ( func ) {
  1006. func.call( deferred, deferred );
  1007. }
  1008. // All done!
  1009. return deferred;
  1010. },
  1011. // Deferred helper
  1012. when: function( subordinate /* , ..., subordinateN */ ) {
  1013. var i = 0,
  1014. resolveValues = core_slice.call( arguments ),
  1015. length = resolveValues.length,
  1016. // the count of uncompleted subordinates
  1017. remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
  1018. // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
  1019. deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
  1020. // Update function for both resolve and progress values
  1021. updateFunc = function( i, contexts, values ) {
  1022. return function( value ) {
  1023. contexts[ i ] = this;
  1024. values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
  1025. if( values === progressValues ) {
  1026. deferred.notifyWith( contexts, values );
  1027. } else if ( !( --remaining ) ) {
  1028. deferred.resolveWith( contexts, values );
  1029. }
  1030. };
  1031. },
  1032. progressValues, progressContexts, resolveContexts;
  1033. // add listeners to Deferred subordinates; treat others as resolved
  1034. if ( length > 1 ) {
  1035. progressValues = new Array( length );
  1036. progressContexts = new Array( length );
  1037. resolveContexts = new Array( length );
  1038. for ( ; i < length; i++ ) {
  1039. if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
  1040. resolveValues[ i ].promise()
  1041. .done( updateFunc( i, resolveContexts, resolveValues ) )
  1042. .fail( deferred.reject )
  1043. .progress( updateFunc( i, progressContexts, progressValues ) );
  1044. } else {
  1045. --remaining;
  1046. }
  1047. }
  1048. }
  1049. // if we're not waiting on anything, resolve the master
  1050. if ( !remaining ) {
  1051. deferred.resolveWith( resolveContexts, resolveValues );
  1052. }
  1053. return deferred.promise();
  1054. }
  1055. });
  1056. jQuery.support = (function() {
  1057. var support,
  1058. all,
  1059. a,
  1060. select,
  1061. opt,
  1062. input,
  1063. fragment,
  1064. eventName,
  1065. i,
  1066. isSupported,
  1067. clickFn,
  1068. div = document.createElement("div");
  1069. // Setup
  1070. div.setAttribute( "className", "t" );
  1071. div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
  1072. // Support tests won't run in some limited or non-browser environments
  1073. all = div.getElementsByTagName("*");
  1074. a = div.getElementsByTagName("a")[ 0 ];
  1075. if ( !all || !a || !all.length ) {
  1076. return {};
  1077. }
  1078. // First batch of tests
  1079. select = document.createElement("select");
  1080. opt = select.appendChild( document.createElement("option") );
  1081. input = div.getElementsByTagName("input")[ 0 ];
  1082. a.style.cssText = "top:1px;float:left;opacity:.5";
  1083. support = {
  1084. // IE strips leading whitespace when .innerHTML is used
  1085. leadingWhitespace: ( div.firstChild.nodeType === 3 ),
  1086. // Make sure that tbody elements aren't automatically inserted
  1087. // IE will insert them into empty tables
  1088. tbody: !div.getElementsByTagName("tbody").length,
  1089. // Make sure that link elements get serialized correctly by innerHTML
  1090. // This requires a wrapper element in IE
  1091. htmlSerialize: !!div.getElementsByTagName("link").length,
  1092. // Get the style information from getAttribute
  1093. // (IE uses .cssText instead)
  1094. style: /top/.test( a.getAttribute("style") ),
  1095. // Make sure that URLs aren't manipulated
  1096. // (IE normalizes it by default)
  1097. hrefNormalized: ( a.getAttribute("href") === "/a" ),
  1098. // Make sure that element opacity exists
  1099. // (IE uses filter instead)
  1100. // Use a regex to work around a WebKit issue. See #5145
  1101. opacity: /^0.5/.test( a.style.opacity ),
  1102. // Verify style float existence
  1103. // (IE uses styleFloat instead of cssFloat)
  1104. cssFloat: !!a.style.cssFloat,
  1105. // Make sure that if no value is specified for a checkbox
  1106. // that it defaults to "on".
  1107. // (WebKit defaults to "" instead)
  1108. checkOn: ( input.value === "on" ),
  1109. // Make sure that a selected-by-default option has a working selected property.
  1110. // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
  1111. optSelected: opt.selected,
  1112. // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
  1113. getSetAttribute: div.className !== "t",
  1114. // Tests for enctype support on a form (#6743)
  1115. enctype: !!document.createElement("form").enctype,
  1116. // Makes sure cloning an html5 element does not cause problems
  1117. // Where outerHTML is undefined, this still works
  1118. html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
  1119. // jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
  1120. boxModel: ( document.compatMode === "CSS1Compat" ),
  1121. // Will be defined later
  1122. submitBubbles: true,
  1123. changeBubbles: true,
  1124. focusinBubbles: false,
  1125. deleteExpando: true,
  1126. noCloneEvent: true,
  1127. inlineBlockNeedsLayout: false,
  1128. shrinkWrapBlocks: false,
  1129. reliableMarginRight: true,
  1130. boxSizingReliable: true,
  1131. pixelPosition: false
  1132. };
  1133. // Make sure checked status is properly cloned
  1134. input.checked = true;
  1135. support.noCloneChecked = input.cloneNode( true ).checked;
  1136. // Make sure that the options inside disabled selects aren't marked as disabled
  1137. // (WebKit marks them as disabled)
  1138. select.disabled = true;
  1139. support.optDisabled = !opt.disabled;
  1140. // Test to see if it's possible to delete an expando from an element
  1141. // Fails in Internet Explorer
  1142. try {
  1143. delete div.test;
  1144. } catch( e ) {
  1145. support.deleteExpando = false;
  1146. }
  1147. if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
  1148. div.attachEvent( "onclick", clickFn = function() {
  1149. // Cloning a node shouldn't copy over any
  1150. // bound event handlers (IE does this)
  1151. support.noCloneEvent = false;
  1152. });
  1153. div.cloneNode( true ).fireEvent("onclick");
  1154. div.detachEvent( "onclick", clickFn );
  1155. }
  1156. // Check if a radio maintains its value
  1157. // after being appended to the DOM
  1158. input = document.createElement("input");
  1159. input.value = "t";
  1160. input.setAttribute( "type", "radio" );
  1161. support.radioValue = input.value === "t";
  1162. input.setAttribute( "checked", "checked" );
  1163. // #11217 - WebKit loses check when the name is after the checked attribute
  1164. input.setAttribute( "name", "t" );
  1165. div.appendChild( input );
  1166. fragment = document.createDocumentFragment();
  1167. fragment.appendChild( div.lastChild );
  1168. // WebKit doesn't clone checked state correctly in fragments
  1169. support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
  1170. // Check if a disconnected checkbox will retain its checked
  1171. // value of true after appended to the DOM (IE6/7)
  1172. support.appendChecked = input.checked;
  1173. fragment.removeChild( input );
  1174. fragment.appendChild( div );
  1175. // Technique from Juriy Zaytsev
  1176. // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
  1177. // We only care about the case where non-standard event systems
  1178. // are used, namely in IE. Short-circuiting here helps us to
  1179. // avoid an eval call (in setAttribute) which can cause CSP
  1180. // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
  1181. if ( div.attachEvent ) {
  1182. for ( i in {
  1183. submit: true,
  1184. change: true,
  1185. focusin: true
  1186. }) {
  1187. eventName = "on" + i;
  1188. isSupported = ( eventName in div );
  1189. if ( !isSupported ) {
  1190. div.setAttribute( eventName, "return;" );
  1191. isSupported = ( typeof div[ eventName ] === "function" );
  1192. }
  1193. support[ i + "Bubbles" ] = isSupported;
  1194. }
  1195. }
  1196. // Run tests that need a body at doc ready
  1197. jQuery(function() {
  1198. var container, div, tds, marginDiv,
  1199. divReset = "padding:0;margin:0;border:0;display:block;overflow:hidden;",
  1200. body = document.getElementsByTagName("body")[0];
  1201. if ( !body ) {
  1202. // Return for frameset docs that don't have a body
  1203. return;
  1204. }
  1205. container = document.createElement("div");
  1206. container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px";
  1207. body.insertBefore( container, body.firstChild );
  1208. // Construct the test element
  1209. div = document.createElement("div");
  1210. container.appendChild( div );
  1211. // Check if table cells still have offsetWidth/Height when they are set
  1212. // to display:none and there are still other visible table cells in a
  1213. // table row; if so, offsetWidth/Height are not reliable for use when
  1214. // determining if an element has been hidden directly using
  1215. // display:none (it is still safe to use offsets if a parent element is
  1216. // hidden; don safety goggles and see bug #4512 for more information).
  1217. // (only IE 8 fails this test)
  1218. div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
  1219. tds = div.getElementsByTagName("td");
  1220. tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
  1221. isSupported = ( tds[ 0 ].offsetHeight === 0 );
  1222. tds[ 0 ].style.display = "";
  1223. tds[ 1 ].style.display = "none";
  1224. // Check if empty table cells still have offsetWidth/Height
  1225. // (IE <= 8 fail this test)
  1226. support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
  1227. // Check box-sizing and margin behavior
  1228. div.innerHTML = "";
  1229. div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
  1230. support.boxSizing = ( div.offsetWidth === 4 );
  1231. support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
  1232. // NOTE: To any future maintainer, we've window.getComputedStyle
  1233. // because jsdom on node.js will break without it.
  1234. if ( window.getComputedStyle ) {
  1235. support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
  1236. support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
  1237. // Check if div with explicit width and no margin-right incorrectly
  1238. // gets computed margin-right based on width of container. For more
  1239. // info see bug #3333
  1240. // Fails in WebKit before Feb 2011 nightlies
  1241. // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
  1242. marginDiv = document.createElement("div");
  1243. marginDiv.style.cssText = div.style.cssText = divReset;
  1244. marginDiv.style.marginRight = marginDiv.style.width = "0";
  1245. div.style.width = "1px";
  1246. div.appendChild( marginDiv );
  1247. support.reliableMarginRight =
  1248. !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
  1249. }
  1250. if ( typeof div.style.zoom !== "undefined" ) {
  1251. // Check if natively block-level elements act like inline-block
  1252. // elements when setting their display to 'inline' and giving
  1253. // them layout
  1254. // (IE < 8 does this)
  1255. div.innerHTML = "";
  1256. div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
  1257. support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
  1258. // Check if elements with layout shrink-wrap their children
  1259. // (IE 6 does this)
  1260. div.style.display = "block";
  1261. div.style.overflow = "visible";
  1262. div.innerHTML = "<div></div>";
  1263. div.firstChild.style.width = "5px";
  1264. support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
  1265. container.style.zoom = 1;
  1266. }
  1267. // Null elements to avoid leaks in IE
  1268. body.removeChild( container );
  1269. container = div = tds = marginDiv = null;
  1270. });
  1271. // Null elements to avoid leaks in IE
  1272. fragment.removeChild( div );
  1273. all = a = select = opt = input = fragment = div = null;
  1274. return support;
  1275. })();
  1276. var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
  1277. rmultiDash = /([A-Z])/g;
  1278. jQuery.extend({
  1279. cache: {},
  1280. deletedIds: [],
  1281. // Remove at next major release (1.9/2.0)
  1282. uuid: 0,
  1283. // Unique for each copy of jQuery on the page
  1284. // Non-digits removed to match rinlinejQuery
  1285. expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
  1286. // The following elements throw uncatchable exceptions if you
  1287. // attempt to add expando properties to them.
  1288. noData: {
  1289. "embed": true,
  1290. // Ban all objects except for Flash (which handle expandos)
  1291. "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
  1292. "applet": true
  1293. },
  1294. hasData: function( elem ) {
  1295. elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
  1296. return !!elem && !isEmptyDataObject( elem );
  1297. },
  1298. data: function( elem, name, data, pvt /* Internal Use Only */ ) {
  1299. if ( !jQuery.acceptData( elem ) ) {
  1300. return;
  1301. }
  1302. var thisCache, ret,
  1303. internalKey = jQuery.expando,
  1304. getByName = typeof name === "string",
  1305. // We have to handle DOM nodes and JS objects differently because IE6-7
  1306. // can't GC object references properly across the DOM-JS boundary
  1307. isNode = elem.nodeType,
  1308. // Only DOM nodes need the global jQuery cache; JS object data is
  1309. // attached directly to the object so GC can occur automatically
  1310. cache = isNode ? jQuery.cache : elem,
  1311. // Only defining an ID for JS objects if its cache already exists allows
  1312. // the code to shortcut on the same path as a DOM node with no cache
  1313. id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
  1314. // Avoid doing any more work than we need to when trying to get data on an
  1315. // object that has no data at all
  1316. if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
  1317. return;
  1318. }
  1319. if ( !id ) {
  1320. // Only DOM nodes need a new unique ID for each element since their data
  1321. // ends up in the global cache
  1322. if ( isNode ) {
  1323. elem[ internalKey ] = id = jQuery.deletedIds.pop() || jQuery.guid++;
  1324. } else {
  1325. id = internalKey;
  1326. }
  1327. }
  1328. if ( !cache[ id ] ) {
  1329. cache[ id ] = {};
  1330. // Avoids exposing jQuery metadata on plain JS objects when the object
  1331. // is serialized using JSON.stringify
  1332. if ( !isNode ) {
  1333. cache[ id ].toJSON = jQuery.noop;
  1334. }
  1335. }
  1336. // An object can be passed to jQuery.data instead of a key/value pair; this gets
  1337. // shallow copied over onto the existing cache
  1338. if ( typeof name === "object" || typeof name === "function" ) {
  1339. if ( pvt ) {
  1340. cache[ id ] = jQuery.extend( cache[ id ], name );
  1341. } else {
  1342. cache[ id ].data = jQuery.extend( cache[ id ].data, name );
  1343. }
  1344. }
  1345. thisCache = cache[ id ];
  1346. // jQuery data() is stored in a separate object inside the object's internal data
  1347. // cache in order to avoid key collisions between internal data and user-defined
  1348. // data.
  1349. if ( !pvt ) {
  1350. if ( !thisCache.data ) {
  1351. thisCache.data = {};
  1352. }
  1353. thisCache = thisCache.data;
  1354. }
  1355. if ( data !== undefined ) {
  1356. thisCache[ jQuery.camelCase( name ) ] = data;
  1357. }
  1358. // Check for both converted-to-camel and non-converted data property names
  1359. // If a data property was specified
  1360. if ( getByName ) {
  1361. // First Try to find as-is property data
  1362. ret = thisCache[ name ];
  1363. // Test for null|undefined property data
  1364. if ( ret == null ) {
  1365. // Try to find the camelCased property
  1366. ret = thisCache[ jQuery.camelCase( name ) ];
  1367. }
  1368. } else {
  1369. ret = thisCache;
  1370. }
  1371. return ret;
  1372. },
  1373. removeData: function( elem, name, pvt /* Internal Use Only */ ) {
  1374. if ( !jQuery.acceptData( elem ) ) {
  1375. return;
  1376. }
  1377. var thisCache, i, l,
  1378. isNode = elem.nodeType,
  1379. // See jQuery.data for more information
  1380. cache = isNode ? jQuery.cache : elem,
  1381. id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
  1382. // If there is already no cache entry for this object, there is no
  1383. // purpose in continuing
  1384. if ( !cache[ id ] ) {
  1385. return;
  1386. }
  1387. if ( name ) {
  1388. thisCache = pvt ? cache[ id ] : cache[ id ].data;
  1389. if ( thisCache ) {
  1390. // Support array or space separated string names for data keys
  1391. if ( !jQuery.isArray( name ) ) {
  1392. // try the string as a key before any manipulation
  1393. if ( name in thisCache ) {
  1394. name = [ name ];
  1395. } else {
  1396. // split the camel cased version by spaces unless a key with the spaces exists
  1397. name = jQuery.camelCase( name );
  1398. if ( name in thisCache ) {
  1399. name = [ name ];
  1400. } else {
  1401. name = name.split(" ");
  1402. }
  1403. }
  1404. }
  1405. for ( i = 0, l = name.length; i < l; i++ ) {
  1406. delete thisCache[ name[i] ];
  1407. }
  1408. // If there is no data left in the cache, we want to continue
  1409. // and let the cache object itself get destroyed
  1410. if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
  1411. return;
  1412. }
  1413. }
  1414. }
  1415. // See jQuery.data for more information
  1416. if ( !pvt ) {
  1417. delete cache[ id ].data;
  1418. // Don't destroy the parent cache unless the internal data object
  1419. // had been the only thing left in it
  1420. if ( !isEmptyDataObject( cache[ id ] ) ) {
  1421. return;
  1422. }
  1423. }
  1424. // Destroy the cache
  1425. if ( isNode ) {
  1426. jQuery.cleanData( [ elem ], true );
  1427. // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
  1428. } else if ( jQuery.support.deleteExpando || cache != cache.window ) {
  1429. delete cache[ id ];
  1430. // When all else fails, null
  1431. } else {
  1432. cache[ id ] = null;
  1433. }
  1434. },
  1435. // For internal use only.
  1436. _data: function( elem, name, data ) {
  1437. return jQuery.data( elem, name, data, true );
  1438. },
  1439. // A method for determining if a DOM node can handle the data expando
  1440. acceptData: function( elem ) {
  1441. var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
  1442. // nodes accept data unless otherwise specified; rejection can be conditional
  1443. return !noData || noData !== true && elem.getAttribute("classid") === noData;
  1444. }
  1445. });
  1446. jQuery.fn.extend({
  1447. data: function( key, value ) {
  1448. var parts, part, attr, name, l,
  1449. elem = this[0],
  1450. i = 0,
  1451. data = null;
  1452. // Gets all values
  1453. if ( key === undefined ) {
  1454. if ( this.length ) {
  1455. data = jQuery.data( elem );
  1456. if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
  1457. attr = elem.attributes;
  1458. for ( l = attr.length; i < l; i++ ) {
  1459. name = attr[i].name;
  1460. if ( !name.indexOf( "data-" ) ) {
  1461. name = jQuery.camelCase( name.substring(5) );
  1462. dataAttr( elem, name, data[ name ] );
  1463. }
  1464. }
  1465. jQuery._data( elem, "parsedAttrs", true );
  1466. }
  1467. }
  1468. return data;
  1469. }
  1470. // Sets multiple values
  1471. if ( typeof key === "object" ) {
  1472. return this.each(function() {
  1473. jQuery.data( this, key );
  1474. });
  1475. }
  1476. parts = key.split( ".", 2 );
  1477. parts[1] = parts[1] ? "." + parts[1] : "";
  1478. part = parts[1] + "!";
  1479. return jQuery.access( this, function( value ) {
  1480. if ( value === undefined ) {
  1481. data = this.triggerHandler( "getData" + part, [ parts[0] ] );
  1482. // Try to fetch any internally stored data first
  1483. if ( data === undefined && elem ) {
  1484. data = jQuery.data( elem, key );
  1485. data = dataAttr( elem, key, data );
  1486. }
  1487. return data === undefined && parts[1] ?
  1488. this.data( parts[0] ) :
  1489. data;
  1490. }
  1491. parts[1] = value;
  1492. this.each(function() {
  1493. var self = jQuery( this );
  1494. self.triggerHandler( "setData" + part, parts );
  1495. jQuery.data( this, key, value );
  1496. self.triggerHandler( "changeData" + part, parts );
  1497. });
  1498. }, null, value, arguments.length > 1, null, false );
  1499. },
  1500. removeData: function( key ) {
  1501. return this.each(function() {
  1502. jQuery.removeData( this, key );
  1503. });
  1504. }
  1505. });
  1506. function dataAttr( elem, key, data ) {
  1507. // If nothing was found internally, try to fetch any
  1508. // data from the HTML5 data-* attribute
  1509. if ( data === undefined && elem.nodeType === 1 ) {
  1510. var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
  1511. data = elem.getAttribute( name );
  1512. if ( typeof data === "string" ) {
  1513. try {
  1514. data = data === "true" ? true :
  1515. data === "false" ? false :
  1516. data === "null" ? null :
  1517. // Only convert to a number if it doesn't change the string
  1518. +data + "" === data ? +data :
  1519. rbrace.test( data ) ? jQuery.parseJSON( data ) :
  1520. data;
  1521. } catch( e ) {}
  1522. // Make sure we set the data so it isn't changed later
  1523. jQuery.data( elem, key, data );
  1524. } else {
  1525. data = undefined;
  1526. }
  1527. }
  1528. return data;
  1529. }
  1530. // checks a cache object for emptiness
  1531. function isEmptyDataObject( obj ) {
  1532. var name;
  1533. for ( name in obj ) {
  1534. // if the public data object is empty, the private is still empty
  1535. if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
  1536. continue;
  1537. }
  1538. if ( name !== "toJSON" ) {
  1539. return false;
  1540. }
  1541. }
  1542. return true;
  1543. }
  1544. jQuery.extend({
  1545. queue: function( elem, type, data ) {
  1546. var queue;
  1547. if ( elem ) {
  1548. type = ( type || "fx" ) + "queue";
  1549. queue = jQuery._data( elem, type );
  1550. // Speed up dequeue by getting out quickly if this is just a lookup
  1551. if ( data ) {
  1552. if ( !queue || jQuery.isArray(data) ) {
  1553. queue = jQuery._data( elem, type, jQuery.makeArray(data) );
  1554. } else {
  1555. queue.push( data );
  1556. }
  1557. }
  1558. return queue || [];
  1559. }
  1560. },
  1561. dequeue: function( elem, type ) {
  1562. type = type || "fx";
  1563. var queue = jQuery.queue( elem, type ),
  1564. startLength = queue.length,
  1565. fn = queue.shift(),
  1566. hooks = jQuery._queueHooks( elem, type ),
  1567. next = function() {
  1568. jQuery.dequeue( elem, type );
  1569. };
  1570. // If the fx queue is dequeued, always remove the progress sentinel
  1571. if ( fn === "inprogress" ) {
  1572. fn = queue.shift();
  1573. startLength--;
  1574. }
  1575. if ( fn ) {
  1576. // Add a progress sentinel to prevent the fx queue from being
  1577. // automatically dequeued
  1578. if ( type === "fx" ) {
  1579. queue.unshift( "inprogress" );
  1580. }
  1581. // clear up the last queue stop function
  1582. delete hooks.stop;
  1583. fn.call( elem, next, hooks );
  1584. }
  1585. if ( !startLength && hooks ) {
  1586. hooks.empty.fire();
  1587. }
  1588. },
  1589. // not intended for public consumption - generates a queueHooks object, or returns the current one
  1590. _queueHooks: function( elem, type ) {
  1591. var key = type + "queueHooks";
  1592. return jQuery._data( elem, key ) || jQuery._data( elem, key, {
  1593. empty: jQuery.Callbacks("once memory").add(function() {
  1594. jQuery.removeData( elem, type + "queue", true );
  1595. jQuery.removeData( elem, key, true );
  1596. })
  1597. });
  1598. }
  1599. });
  1600. jQuery.fn.extend({
  1601. queue: function( type, data ) {
  1602. var setter = 2;
  1603. if ( typeof type !== "string" ) {
  1604. data = type;
  1605. type = "fx";
  1606. setter--;
  1607. }
  1608. if ( arguments.length < setter ) {
  1609. return jQuery.queue( this[0], type );
  1610. }
  1611. return data === undefined ?
  1612. this :
  1613. this.each(function() {
  1614. var queue = jQuery.queue( this, type, data );
  1615. // ensure a hooks for this queue
  1616. jQuery._queueHooks( this, type );
  1617. if ( type === "fx" && queue[0] !== "inprogress" ) {
  1618. jQuery.dequeue( this, type );
  1619. }
  1620. });
  1621. },
  1622. dequeue: function( type ) {
  1623. return this.each(function() {
  1624. jQuery.dequeue( this, type );
  1625. });
  1626. },
  1627. // Based off of the plugin by Clint Helfers, with permission.
  1628. // http://blindsignals.com/index.php/2009/07/jquery-delay/
  1629. delay: function( time, type ) {
  1630. time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
  1631. type = type || "fx";
  1632. return this.queue( type, function( next, hooks ) {
  1633. var timeout = setTimeout( next, time );
  1634. hooks.stop = function() {
  1635. clearTimeout( timeout );
  1636. };
  1637. });
  1638. },
  1639. clearQueue: function( type ) {
  1640. return this.queue( type || "fx", [] );
  1641. },
  1642. // Get a promise resolved when queues of a certain type
  1643. // are emptied (fx is the type by default)
  1644. promise: function( type, obj ) {
  1645. var tmp,
  1646. count = 1,
  1647. defer = jQuery.Deferred(),
  1648. elements = this,
  1649. i = this.length,
  1650. resolve = function() {
  1651. if ( !( --count ) ) {
  1652. defer.resolveWith( elements, [ elements ] );
  1653. }
  1654. };
  1655. if ( typeof type !== "string" ) {
  1656. obj = type;
  1657. type = undefined;
  1658. }
  1659. type = type || "fx";
  1660. while( i-- ) {
  1661. tmp = jQuery._data( elements[ i ], type + "queueHooks" );
  1662. if ( tmp && tmp.empty ) {
  1663. count++;
  1664. tmp.empty.add( resolve );
  1665. }
  1666. }
  1667. resolve();
  1668. return defer.promise( obj );
  1669. }
  1670. });
  1671. var nodeHook, boolHook, fixSpecified,
  1672. rclass = /[\t\r\n]/g,
  1673. rreturn = /\r/g,
  1674. rtype = /^(?:button|input)$/i,
  1675. rfocusable = /^(?:button|input|object|select|textarea)$/i,
  1676. rclickable = /^a(?:rea|)$/i,
  1677. rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
  1678. getSetAttribute = jQuery.support.getSetAttribute;
  1679. jQuery.fn.extend({
  1680. attr: function( name, value ) {
  1681. return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
  1682. },
  1683. removeAttr: function( name ) {
  1684. return this.each(function() {
  1685. jQuery.removeAttr( this, name );
  1686. });
  1687. },
  1688. prop: function( name, value ) {
  1689. return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
  1690. },
  1691. removeProp: function( name ) {
  1692. name = jQuery.propFix[ name ] || name;
  1693. return this.each(function() {
  1694. // try/catch handles cases where IE balks (such as removing a property on window)
  1695. try {
  1696. this[ name ] = undefined;
  1697. delete this[ name ];
  1698. } catch( e ) {}
  1699. });
  1700. },
  1701. addClass: function( value ) {
  1702. var classNames, i, l, elem,
  1703. setClass, c, cl;
  1704. if ( jQuery.isFunction( value ) ) {
  1705. return this.each(function( j ) {
  1706. jQuery( this ).addClass( value.call(this, j, this.className) );
  1707. });
  1708. }
  1709. if ( value && typeof value === "string" ) {
  1710. classNames = value.split( core_rspace );
  1711. for ( i = 0, l = this.length; i < l; i++ ) {
  1712. elem = this[ i ];
  1713. if ( elem.nodeType === 1 ) {
  1714. if ( !elem.className && classNames.length === 1 ) {
  1715. elem.className = value;
  1716. } else {
  1717. setClass = " " + elem.className + " ";
  1718. for ( c = 0, cl = classNames.length; c < cl; c++ ) {
  1719. if ( setClass.indexOf( " " + classNames[ c ] + " " ) < 0 ) {
  1720. setClass += classNames[ c ] + " ";
  1721. }
  1722. }
  1723. elem.className = jQuery.trim( setClass );
  1724. }
  1725. }
  1726. }
  1727. }
  1728. return this;
  1729. },
  1730. removeClass: function( value ) {
  1731. var removes, className, elem, c, cl, i, l;
  1732. if ( jQuery.isFunction( value ) ) {
  1733. return this.each(function( j ) {
  1734. jQuery( this ).removeClass( value.call(this, j, this.className) );
  1735. });
  1736. }
  1737. if ( (value && typeof value === "string") || value === undefined ) {
  1738. removes = ( value || "" ).split( core_rspace );
  1739. for ( i = 0, l = this.length; i < l; i++ ) {
  1740. elem = this[ i ];
  1741. if ( elem.nodeType === 1 && elem.className ) {
  1742. className = (" " + elem.className + " ").replace( rclass, " " );
  1743. // loop over each item in the removal list
  1744. for ( c = 0, cl = removes.length; c < cl; c++ ) {
  1745. // Remove until there is nothing to remove,
  1746. while ( className.indexOf(" " + removes[ c ] + " ") >= 0 ) {
  1747. className = className.replace( " " + removes[ c ] + " " , " " );
  1748. }
  1749. }
  1750. elem.className = value ? jQuery.trim( className ) : "";
  1751. }
  1752. }
  1753. }
  1754. return this;
  1755. },
  1756. toggleClass: function( value, stateVal ) {
  1757. var type = typeof value,
  1758. isBool = typeof stateVal === "boolean";
  1759. if ( jQuery.isFunction( value ) ) {
  1760. return this.each(function( i ) {
  1761. jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
  1762. });
  1763. }
  1764. return this.each(function() {
  1765. if ( type === "string" ) {
  1766. // toggle individual class names
  1767. var className,
  1768. i = 0,
  1769. self = jQuery( this ),
  1770. state = stateVal,
  1771. classNames = value.split( core_rspace );
  1772. while ( (className = classNames[ i++ ]) ) {
  1773. // check each className given, space separated list
  1774. state = isBool ? state : !self.hasClass( className );
  1775. self[ state ? "addClass" : "removeClass" ]( className );
  1776. }
  1777. } else if ( type === "undefined" || type === "boolean" ) {
  1778. if ( this.className ) {
  1779. // store className if set
  1780. jQuery._data( this, "__className__", this.className );
  1781. }
  1782. // toggle whole className
  1783. this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
  1784. }
  1785. });
  1786. },
  1787. hasClass: function( selector ) {
  1788. var className = " " + selector + " ",
  1789. i = 0,
  1790. l = this.length;
  1791. for ( ; i < l; i++ ) {
  1792. if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
  1793. return true;
  1794. }
  1795. }
  1796. return false;
  1797. },
  1798. val: function( value ) {
  1799. var hooks, ret, isFunction,
  1800. elem = this[0];
  1801. if ( !arguments.length ) {
  1802. if ( elem ) {
  1803. hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
  1804. if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
  1805. return ret;
  1806. }
  1807. ret = elem.value;
  1808. return typeof ret === "string" ?
  1809. // handle most common string cases
  1810. ret.replace(rreturn, "") :
  1811. // handle cases where value is null/undef or number
  1812. ret == null ? "" : ret;
  1813. }
  1814. return;
  1815. }
  1816. isFunction = jQuery.isFunction( value );
  1817. return this.each(function( i ) {
  1818. var val,
  1819. self = jQuery(this);
  1820. if ( this.nodeType !== 1 ) {
  1821. return;
  1822. }
  1823. if ( isFunction ) {
  1824. val = value.call( this, i, self.val() );
  1825. } else {
  1826. val = value;
  1827. }
  1828. // Treat null/undefined as ""; convert numbers to string
  1829. if ( val == null ) {
  1830. val = "";
  1831. } else if ( typeof val === "number" ) {
  1832. val += "";
  1833. } else if ( jQuery.isArray( val ) ) {
  1834. val = jQuery.map(val, function ( value ) {
  1835. return value == null ? "" : value + "";
  1836. });
  1837. }
  1838. hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
  1839. // If set returns undefined, fall back to normal setting
  1840. if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
  1841. this.value = val;
  1842. }
  1843. });
  1844. }
  1845. });
  1846. jQuery.extend({
  1847. valHooks: {
  1848. option: {
  1849. get: function( elem ) {
  1850. // attributes.value is undefined in Blackberry 4.7 but
  1851. // uses .value. See #6932
  1852. var val = elem.attributes.value;
  1853. return !val || val.specified ? elem.value : elem.text;
  1854. }
  1855. },
  1856. select: {
  1857. get: function( elem ) {
  1858. var value, option,
  1859. options = elem.options,
  1860. index = elem.selectedIndex,
  1861. one = elem.type === "select-one" || index < 0,
  1862. values = one ? null : [],
  1863. max = one ? index + 1 : options.length,
  1864. i = index < 0 ?
  1865. max :
  1866. one ? index : 0;
  1867. // Loop through all the selected options
  1868. for ( ; i < max; i++ ) {
  1869. option = options[ i ];
  1870. // oldIE doesn't update selected after form reset (#2551)
  1871. if ( ( option.selected || i === index ) &&
  1872. // Don't return options that are disabled or in a disabled optgroup
  1873. ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
  1874. ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
  1875. // Get the specific value for the option
  1876. value = jQuery( option ).val();
  1877. // We don't need an array for one selects
  1878. if ( one ) {
  1879. return value;
  1880. }
  1881. // Multi-Selects return an array
  1882. values.push( value );
  1883. }
  1884. }
  1885. return values;
  1886. },
  1887. set: function( elem, value ) {
  1888. var values = jQuery.makeArray( value );
  1889. jQuery(elem).find("option").each(function() {
  1890. this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
  1891. });
  1892. if ( !values.length ) {
  1893. elem.selectedIndex = -1;
  1894. }
  1895. return values;
  1896. }
  1897. }
  1898. },
  1899. // Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9
  1900. attrFn: {},
  1901. attr: function( elem, name, value, pass ) {
  1902. var ret, hooks, notxml,
  1903. nType = elem.nodeType;
  1904. // don't get/set attributes on text, comment and attribute nodes
  1905. if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
  1906. return;
  1907. }
  1908. if ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) {
  1909. return jQuery( elem )[ name ]( value );
  1910. }
  1911. // Fallback to prop when attributes are not supported
  1912. if ( typeof elem.getAttribute === "undefined" ) {
  1913. return jQuery.prop( elem, name, value );
  1914. }
  1915. notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
  1916. // All attributes are lowercase
  1917. // Grab necessary hook if one is defined
  1918. if ( notxml ) {
  1919. name = name.toLowerCase();
  1920. hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
  1921. }
  1922. if ( value !== undefined ) {
  1923. if ( value === null ) {
  1924. jQuery.removeAttr( elem, name );
  1925. return;
  1926. } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
  1927. return ret;
  1928. } else {
  1929. elem.setAttribute( name, value + "" );
  1930. return value;
  1931. }
  1932. } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
  1933. return ret;
  1934. } else {
  1935. ret = elem.getAttribute( name );
  1936. // Non-existent attributes return null, we normalize to undefined
  1937. return ret === null ?
  1938. undefined :
  1939. ret;
  1940. }
  1941. },
  1942. removeAttr: function( elem, value ) {
  1943. var propName, attrNames, name, isBool,
  1944. i = 0;
  1945. if ( value && elem.nodeType === 1 ) {
  1946. attrNames = value.split( core_rspace );
  1947. for ( ; i < attrNames.length; i++ ) {
  1948. name = attrNames[ i ];
  1949. if ( name ) {
  1950. propName = jQuery.propFix[ name ] || name;
  1951. isBool = rboolean.test( name );
  1952. // See #9699 for explanation of this approach (setting first, then removal)
  1953. // Do not do this for boolean attributes (see #10870)
  1954. if ( !isBool ) {
  1955. jQuery.attr( elem, name, "" );
  1956. }
  1957. elem.removeAttribute( getSetAttribute ? name : propName );
  1958. // Set corresponding property to false for boolean attributes
  1959. if ( isBool && propName in elem ) {
  1960. elem[ propName ] = false;
  1961. }
  1962. }
  1963. }
  1964. }
  1965. },
  1966. attrHooks: {
  1967. type: {
  1968. set: function( elem, value ) {
  1969. // We can't allow the type property to be changed (since it causes problems in IE)
  1970. if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
  1971. jQuery.error( "type property can't be changed" );
  1972. } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
  1973. // Setting the type on a radio button after the value resets the value in IE6-9
  1974. // Reset value to it's default in case type is set after value
  1975. // This is for element creation
  1976. var val = elem.value;
  1977. elem.setAttribute( "type", value );
  1978. if ( val ) {
  1979. elem.value = val;
  1980. }
  1981. return value;
  1982. }
  1983. }
  1984. },
  1985. // Use the value property for back compat
  1986. // Use the nodeHook for button elements in IE6/7 (#1954)
  1987. value: {
  1988. get: function( elem, name ) {
  1989. if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
  1990. return nodeHook.get( elem, name );
  1991. }
  1992. return name in elem ?
  1993. elem.value :
  1994. null;
  1995. },
  1996. set: function( elem, value, name ) {
  1997. if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
  1998. return nodeHook.set( elem, value, name );
  1999. }
  2000. // Does not return so that setAttribute is also used
  2001. elem.value = value;
  2002. }
  2003. }
  2004. },
  2005. propFix: {
  2006. tabindex: "tabIndex",
  2007. readonly: "readOnly",
  2008. "for": "htmlFor",
  2009. "class": "className",
  2010. maxlength: "maxLength",
  2011. cellspacing: "cellSpacing",
  2012. cellpadding: "cellPadding",
  2013. rowspan: "rowSpan",
  2014. colspan: "colSpan",
  2015. usemap: "useMap",
  2016. frameborder: "frameBorder",
  2017. contenteditable: "contentEditable"
  2018. },
  2019. prop: function( elem, name, value ) {
  2020. var ret, hooks, notxml,
  2021. nType = elem.nodeType;
  2022. // don't get/set properties on text, comment and attribute nodes
  2023. if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
  2024. return;
  2025. }
  2026. notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
  2027. if ( notxml ) {
  2028. // Fix name and attach hooks
  2029. name = jQuery.propFix[ name ] || name;
  2030. hooks = jQuery.propHooks[ name ];
  2031. }
  2032. if ( value !== undefined ) {
  2033. if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
  2034. return ret;
  2035. } else {
  2036. return ( elem[ name ] = value );
  2037. }
  2038. } else {
  2039. if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
  2040. return ret;
  2041. } else {
  2042. return elem[ name ];
  2043. }
  2044. }
  2045. },
  2046. propHooks: {
  2047. tabIndex: {
  2048. get: function( elem ) {
  2049. // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
  2050. // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
  2051. var attributeNode = elem.getAttributeNode("tabindex");
  2052. return attributeNode && attributeNode.specified ?
  2053. parseInt( attributeNode.value, 10 ) :
  2054. rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
  2055. 0 :
  2056. undefined;
  2057. }
  2058. }
  2059. }
  2060. });
  2061. // Hook for boolean attributes
  2062. boolHook = {
  2063. get: function( elem, name ) {
  2064. // Align boolean attributes with corresponding properties
  2065. // Fall back to attribute presence where some booleans are not supported
  2066. var attrNode,
  2067. property = jQuery.prop( elem, name );
  2068. return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
  2069. name.toLowerCase() :
  2070. undefined;
  2071. },
  2072. set: function( elem, value, name ) {
  2073. var propName;
  2074. if ( value === false ) {
  2075. // Remove boolean attributes when set to false
  2076. jQuery.removeAttr( elem, name );
  2077. } else {
  2078. // value is true since we know at this point it's type boolean and not false
  2079. // Set boolean attributes to the same name and set the DOM property
  2080. propName = jQuery.propFix[ name ] || name;
  2081. if ( propName in elem ) {
  2082. // Only set the IDL specifically if it already exists on the element
  2083. elem[ propName ] = true;
  2084. }
  2085. elem.setAttribute( name, name.toLowerCase() );
  2086. }
  2087. return name;
  2088. }
  2089. };
  2090. // IE6/7 do not support getting/setting some attributes with get/setAttribute
  2091. if ( !getSetAttribute ) {
  2092. fixSpecified = {
  2093. name: true,
  2094. id: true,
  2095. coords: true
  2096. };
  2097. // Use this for any attribute in IE6/7
  2098. // This fixes almost every IE6/7 issue
  2099. nodeHook = jQuery.valHooks.button = {
  2100. get: function( elem, name ) {
  2101. var ret;
  2102. ret = elem.getAttributeNode( name );
  2103. return ret && ( fixSpecified[ name ] ? ret.value !== "" : ret.specified ) ?
  2104. ret.value :
  2105. undefined;
  2106. },
  2107. set: function( elem, value, name ) {
  2108. // Set the existing or create a new attribute node
  2109. var ret = elem.getAttributeNode( name );
  2110. if ( !ret ) {
  2111. ret = document.createAttribute( name );
  2112. elem.setAttributeNode( ret );
  2113. }
  2114. return ( ret.value = value + "" );
  2115. }
  2116. };
  2117. // Set width and height to auto instead of 0 on empty string( Bug #8150 )
  2118. // This is for removals
  2119. jQuery.each([ "width", "height" ], function( i, name ) {
  2120. jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
  2121. set: function( elem, value ) {
  2122. if ( value === "" ) {
  2123. elem.setAttribute( name, "auto" );
  2124. return value;
  2125. }
  2126. }
  2127. });
  2128. });
  2129. // Set contenteditable to false on removals(#10429)
  2130. // Setting to empty string throws an error as an invalid value
  2131. jQuery.attrHooks.contenteditable = {
  2132. get: nodeHook.get,
  2133. set: function( elem, value, name ) {
  2134. if ( value === "" ) {
  2135. value = "false";
  2136. }
  2137. nodeHook.set( elem, value, name );
  2138. }
  2139. };
  2140. }
  2141. // Some attributes require a special call on IE
  2142. if ( !jQuery.support.hrefNormalized ) {
  2143. jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
  2144. jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
  2145. get: function( elem ) {
  2146. var ret = elem.getAttribute( name, 2 );
  2147. return ret === null ? undefined : ret;
  2148. }
  2149. });
  2150. });
  2151. }
  2152. if ( !jQuery.support.style ) {
  2153. jQuery.attrHooks.style = {
  2154. get: function( elem ) {
  2155. // Return undefined in the case of empty string
  2156. // Normalize to lowercase since IE uppercases css property names
  2157. return elem.style.cssText.toLowerCase() || undefined;
  2158. },
  2159. set: function( elem, value ) {
  2160. return ( elem.style.cssText = value + "" );
  2161. }
  2162. };
  2163. }
  2164. // Safari mis-reports the default selected property of an option
  2165. // Accessing the parent's selectedIndex property fixes it
  2166. if ( !jQuery.support.optSelected ) {
  2167. jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
  2168. get: function( elem ) {
  2169. var parent = elem.parentNode;
  2170. if ( parent ) {
  2171. parent.selectedIndex;
  2172. // Make sure that it also works with optgroups, see #5701
  2173. if ( parent.parentNode ) {
  2174. parent.parentNode.selectedIndex;
  2175. }
  2176. }
  2177. return null;
  2178. }
  2179. });
  2180. }
  2181. // IE6/7 call enctype encoding
  2182. if ( !jQuery.support.enctype ) {
  2183. jQuery.propFix.enctype = "encoding";
  2184. }
  2185. // Radios and checkboxes getter/setter
  2186. if ( !jQuery.support.checkOn ) {
  2187. jQuery.each([ "radio", "checkbox" ], function() {
  2188. jQuery.valHooks[ this ] = {
  2189. get: function( elem ) {
  2190. // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
  2191. return elem.getAttribute("value") === null ? "on" : elem.value;
  2192. }
  2193. };
  2194. });
  2195. }
  2196. jQuery.each([ "radio", "checkbox" ], function() {
  2197. jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
  2198. set: function( elem, value ) {
  2199. if ( jQuery.isArray( value ) ) {
  2200. return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
  2201. }
  2202. }
  2203. });
  2204. });
  2205. var rformElems = /^(?:textarea|input|select)$/i,
  2206. rtypenamespace = /^([^\.]*|)(?:\.(.+)|)$/,
  2207. rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
  2208. rkeyEvent = /^key/,
  2209. rmouseEvent = /^(?:mouse|contextmenu)|click/,
  2210. rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
  2211. hoverHack = function( events ) {
  2212. return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
  2213. };
  2214. /*
  2215. * Helper functions for managing events -- not part of the public interface.
  2216. * Props to Dean Edwards' addEvent library for many of the ideas.
  2217. */
  2218. jQuery.event = {
  2219. add: function( elem, types, handler, data, selector ) {
  2220. var elemData, eventHandle, events,
  2221. t, tns, type, namespaces, handleObj,
  2222. handleObjIn, handlers, special;
  2223. // Don't attach events to noData or text/comment nodes (allow plain objects tho)
  2224. if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
  2225. return;
  2226. }
  2227. // Caller can pass in an object of custom data in lieu of the handler
  2228. if ( handler.handler ) {
  2229. handleObjIn = handler;
  2230. handler = handleObjIn.handler;
  2231. selector = handleObjIn.selector;
  2232. }
  2233. // Make sure that the handler has a unique ID, used to find/remove it later
  2234. if ( !handler.guid ) {
  2235. handler.guid = jQuery.guid++;
  2236. }
  2237. // Init the element's event structure and main handler, if this is the first
  2238. events = elemData.events;
  2239. if ( !events ) {
  2240. elemData.events = events = {};
  2241. }
  2242. eventHandle = elemData.handle;
  2243. if ( !eventHandle ) {
  2244. elemData.handle = eventHandle = function( e ) {
  2245. // Discard the second event of a jQuery.event.trigger() and
  2246. // when an event is called after a page has unloaded
  2247. return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
  2248. jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
  2249. undefined;
  2250. };
  2251. // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
  2252. eventHandle.elem = elem;
  2253. }
  2254. // Handle multiple events separated by a space
  2255. // jQuery(...).bind("mouseover mouseout", fn);
  2256. types = jQuery.trim( hoverHack(types) ).split( " " );
  2257. for ( t = 0; t < types.length; t++ ) {
  2258. tns = rtypenamespace.exec( types[t] ) || [];
  2259. type = tns[1];
  2260. namespaces = ( tns[2] || "" ).split( "." ).sort();
  2261. // If event changes its type, use the special event handlers for the changed type
  2262. special = jQuery.event.special[ type ] || {};
  2263. // If selector defined, determine special event api type, otherwise given type
  2264. type = ( selector ? special.delegateType : special.bindType ) || type;
  2265. // Update special based on newly reset type
  2266. special = jQuery.event.special[ type ] || {};
  2267. // handleObj is passed to all event handlers
  2268. handleObj = jQuery.extend({
  2269. type: type,
  2270. origType: tns[1],
  2271. data: data,
  2272. handler: handler,
  2273. guid: handler.guid,
  2274. selector: selector,
  2275. needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
  2276. namespace: namespaces.join(".")
  2277. }, handleObjIn );
  2278. // Init the event handler queue if we're the first
  2279. handlers = events[ type ];
  2280. if ( !handlers ) {
  2281. handlers = events[ type ] = [];
  2282. handlers.delegateCount = 0;
  2283. // Only use addEventListener/attachEvent if the special events handler returns false
  2284. if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
  2285. // Bind the global event handler to the element
  2286. if ( elem.addEventListener ) {
  2287. elem.addEventListener( type, eventHandle, false );
  2288. } else if ( elem.attachEvent ) {
  2289. elem.attachEvent( "on" + type, eventHandle );
  2290. }
  2291. }
  2292. }
  2293. if ( special.add ) {
  2294. special.add.call( elem, handleObj );
  2295. if ( !handleObj.handler.guid ) {
  2296. handleObj.handler.guid = handler.guid;
  2297. }
  2298. }
  2299. // Add to the element's handler list, delegates in front
  2300. if ( selector ) {
  2301. handlers.splice( handlers.delegateCount++, 0, handleObj );
  2302. } else {
  2303. handlers.push( handleObj );
  2304. }
  2305. // Keep track of which events have ever been used, for event optimization
  2306. jQuery.event.global[ type ] = true;
  2307. }
  2308. // Nullify elem to prevent memory leaks in IE
  2309. elem = null;
  2310. },
  2311. global: {},
  2312. // Detach an event or set of events from an element
  2313. remove: function( elem, types, handler, selector, mappedTypes ) {
  2314. var t, tns, type, origType, namespaces, origCount,
  2315. j, events, special, eventType, handleObj,
  2316. elemData = jQuery.hasData( elem ) && jQuery._data( elem );
  2317. if ( !elemData || !(events = elemData.events) ) {
  2318. return;
  2319. }
  2320. // Once for each type.namespace in types; type may be omitted
  2321. types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
  2322. for ( t = 0; t < types.length; t++ ) {
  2323. tns = rtypenamespace.exec( types[t] ) || [];
  2324. type = origType = tns[1];
  2325. namespaces = tns[2];
  2326. // Unbind all events (on this namespace, if provided) for the element
  2327. if ( !type ) {
  2328. for ( type in events ) {
  2329. jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
  2330. }
  2331. continue;
  2332. }
  2333. special = jQuery.event.special[ type ] || {};
  2334. type = ( selector? special.delegateType : special.bindType ) || type;
  2335. eventType = events[ type ] || [];
  2336. origCount = eventType.length;
  2337. namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
  2338. // Remove matching events
  2339. for ( j = 0; j < eventType.length; j++ ) {
  2340. handleObj = eventType[ j ];
  2341. if ( ( mappedTypes || origType === handleObj.origType ) &&
  2342. ( !handler || handler.guid === handleObj.guid ) &&
  2343. ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
  2344. ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
  2345. eventType.splice( j--, 1 );
  2346. if ( handleObj.selector ) {
  2347. eventType.delegateCount--;
  2348. }
  2349. if ( special.remove ) {
  2350. special.remove.call( elem, handleObj );
  2351. }
  2352. }
  2353. }
  2354. // Remove generic event handler if we removed something and no more handlers exist
  2355. // (avoids potential for endless recursion during removal of special event handlers)
  2356. if ( eventType.length === 0 && origCount !== eventType.length ) {
  2357. if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
  2358. jQuery.removeEvent( elem, type, elemData.handle );
  2359. }
  2360. delete events[ type ];
  2361. }
  2362. }
  2363. // Remove the expando if it's no longer used
  2364. if ( jQuery.isEmptyObject( events ) ) {
  2365. delete elemData.handle;
  2366. // removeData also checks for emptiness and clears the expando if empty
  2367. // so use it instead of delete
  2368. jQuery.removeData( elem, "events", true );
  2369. }
  2370. },
  2371. // Events that are safe to short-circuit if no handlers are attached.
  2372. // Native DOM events should not be added, they may have inline handlers.
  2373. customEvent: {
  2374. "getData": true,
  2375. "setData": true,
  2376. "changeData": true
  2377. },
  2378. trigger: function( event, data, elem, onlyHandlers ) {
  2379. // Don't do events on text and comment nodes
  2380. if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
  2381. return;
  2382. }
  2383. // Event object or event type
  2384. var cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType,
  2385. type = event.type || event,
  2386. namespaces = [];
  2387. // focus/blur morphs to focusin/out; ensure we're not firing them right now
  2388. if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
  2389. return;
  2390. }
  2391. if ( type.indexOf( "!" ) >= 0 ) {
  2392. // Exclusive events trigger only for the exact event (no namespaces)
  2393. type = type.slice(0, -1);
  2394. exclusive = true;
  2395. }
  2396. if ( type.indexOf( "." ) >= 0 ) {
  2397. // Namespaced trigger; create a regexp to match event type in handle()
  2398. namespaces = type.split(".");
  2399. type = namespaces.shift();
  2400. namespaces.sort();
  2401. }
  2402. if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
  2403. // No jQuery handlers for this event type, and it can't have inline handlers
  2404. return;
  2405. }
  2406. // Caller can pass in an Event, Object, or just an event type string
  2407. event = typeof event === "object" ?
  2408. // jQuery.Event object
  2409. event[ jQuery.expando ] ? event :
  2410. // Object literal
  2411. new jQuery.Event( type, event ) :
  2412. // Just the event type (string)
  2413. new jQuery.Event( type );
  2414. event.type = type;
  2415. event.isTrigger = true;
  2416. event.exclusive = exclusive;
  2417. event.namespace = namespaces.join( "." );
  2418. event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
  2419. ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
  2420. // Handle a global trigger
  2421. if ( !elem ) {
  2422. // TODO: Stop taunting the data cache; remove global events and always attach to document
  2423. cache = jQuery.cache;
  2424. for ( i in cache ) {
  2425. if ( cache[ i ].events && cache[ i ].events[ type ] ) {
  2426. jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
  2427. }
  2428. }
  2429. return;
  2430. }
  2431. // Clean up the event in case it is being reused
  2432. event.result = undefined;
  2433. if ( !event.target ) {
  2434. event.target = elem;
  2435. }
  2436. // Clone any incoming data and prepend the event, creating the handler arg list
  2437. data = data != null ? jQuery.makeArray( data ) : [];
  2438. data.unshift( event );
  2439. // Allow special events to draw outside the lines
  2440. special = jQuery.event.special[ type ] || {};
  2441. if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
  2442. return;
  2443. }
  2444. // Determine event propagation path in advance, per W3C events spec (#9951)
  2445. // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
  2446. eventPath = [[ elem, special.bindType || type ]];
  2447. if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
  2448. bubbleType = special.delegateType || type;
  2449. cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
  2450. for ( old = elem; cur; cur = cur.parentNode ) {
  2451. eventPath.push([ cur, bubbleType ]);
  2452. old = cur;
  2453. }
  2454. // Only add window if we got to document (e.g., not plain obj or detached DOM)
  2455. if ( old === (elem.ownerDocument || document) ) {
  2456. eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
  2457. }
  2458. }
  2459. // Fire handlers on the event path
  2460. for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
  2461. cur = eventPath[i][0];
  2462. event.type = eventPath[i][1];
  2463. handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
  2464. if ( handle ) {
  2465. handle.apply( cur, data );
  2466. }
  2467. // Note that this is a bare JS function and not a jQuery handler
  2468. handle = ontype && cur[ ontype ];
  2469. if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
  2470. event.preventDefault();
  2471. }
  2472. }
  2473. event.type = type;
  2474. // If nobody prevented the default action, do it now
  2475. if ( !onlyHandlers && !event.isDefaultPrevented() ) {
  2476. if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
  2477. !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
  2478. // Call a native DOM method on the target with the same name name as the event.
  2479. // Can't use an .isFunction() check here because IE6/7 fails that test.
  2480. // Don't do default actions on window, that's where global variables be (#6170)
  2481. // IE<9 dies on focus/blur to hidden element (#1486)
  2482. if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
  2483. // Don't re-trigger an onFOO event when we call its FOO() method
  2484. old = elem[ ontype ];
  2485. if ( old ) {
  2486. elem[ ontype ] = null;
  2487. }
  2488. // Prevent re-triggering of the same event, since we already bubbled it above
  2489. jQuery.event.triggered = type;
  2490. elem[ type ]();
  2491. jQuery.event.triggered = undefined;
  2492. if ( old ) {
  2493. elem[ ontype ] = old;
  2494. }
  2495. }
  2496. }
  2497. }
  2498. return event.result;
  2499. },
  2500. dispatch: function( event ) {
  2501. // Make a writable jQuery.Event from the native event object
  2502. event = jQuery.event.fix( event || window.event );
  2503. var i, j, cur, ret, selMatch, matched, matches, handleObj, sel, related,
  2504. handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
  2505. delegateCount = handlers.delegateCount,
  2506. args = core_slice.call( arguments ),
  2507. run_all = !event.exclusive && !event.namespace,
  2508. special = jQuery.event.special[ event.type ] || {},
  2509. handlerQueue = [];
  2510. // Use the fix-ed jQuery.Event rather than the (read-only) native event
  2511. args[0] = event;
  2512. event.delegateTarget = this;
  2513. // Call the preDispatch hook for the mapped type, and let it bail if desired
  2514. if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
  2515. return;
  2516. }
  2517. // Determine handlers that should run if there are delegated events
  2518. // Avoid non-left-click bubbling in Firefox (#3861)
  2519. if ( delegateCount && !(event.button && event.type === "click") ) {
  2520. for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
  2521. // Don't process clicks (ONLY) on disabled elements (#6911, #8165, #11382, #11764)
  2522. if ( cur.disabled !== true || event.type !== "click" ) {
  2523. selMatch = {};
  2524. matches = [];
  2525. for ( i = 0; i < delegateCount; i++ ) {
  2526. handleObj = handlers[ i ];
  2527. sel = handleObj.selector;
  2528. if ( selMatch[ sel ] === undefined ) {
  2529. selMatch[ sel ] = handleObj.needsContext ?
  2530. jQuery( sel, this ).index( cur ) >= 0 :
  2531. jQuery.find( sel, this, null, [ cur ] ).length;
  2532. }
  2533. if ( selMatch[ sel ] ) {
  2534. matches.push( handleObj );
  2535. }
  2536. }
  2537. if ( matches.length ) {
  2538. handlerQueue.push({ elem: cur, matches: matches });
  2539. }
  2540. }
  2541. }
  2542. }
  2543. // Add the remaining (directly-bound) handlers
  2544. if ( handlers.length > delegateCount ) {
  2545. handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
  2546. }
  2547. // Run delegates first; they may want to stop propagation beneath us
  2548. for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
  2549. matched = handlerQueue[ i ];
  2550. event.currentTarget = matched.elem;
  2551. for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
  2552. handleObj = matched.matches[ j ];
  2553. // Triggered event must either 1) be non-exclusive and have no namespace, or
  2554. // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
  2555. if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
  2556. event.data = handleObj.data;
  2557. event.handleObj = handleObj;
  2558. ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
  2559. .apply( matched.elem, args );
  2560. if ( ret !== undefined ) {
  2561. event.result = ret;
  2562. if ( ret === false ) {
  2563. event.preventDefault();
  2564. event.stopPropagation();
  2565. }
  2566. }
  2567. }
  2568. }
  2569. }
  2570. // Call the postDispatch hook for the mapped type
  2571. if ( special.postDispatch ) {
  2572. special.postDispatch.call( this, event );
  2573. }
  2574. return event.result;
  2575. },
  2576. // Includes some event props shared by KeyEvent and MouseEvent
  2577. // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
  2578. props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
  2579. fixHooks: {},
  2580. keyHooks: {
  2581. props: "char charCode key keyCode".split(" "),
  2582. filter: function( event, original ) {
  2583. // Add which for key events
  2584. if ( event.which == null ) {
  2585. event.which = original.charCode != null ? original.charCode : original.keyCode;
  2586. }
  2587. return event;
  2588. }
  2589. },
  2590. mouseHooks: {
  2591. props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
  2592. filter: function( event, original ) {
  2593. var eventDoc, doc, body,
  2594. button = original.button,
  2595. fromElement = original.fromElement;
  2596. // Calculate pageX/Y if missing and clientX/Y available
  2597. if ( event.pageX == null && original.clientX != null ) {
  2598. eventDoc = event.target.ownerDocument || document;
  2599. doc = eventDoc.documentElement;
  2600. body = eventDoc.body;
  2601. event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
  2602. event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
  2603. }
  2604. // Add relatedTarget, if necessary
  2605. if ( !event.relatedTarget && fromElement ) {
  2606. event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
  2607. }
  2608. // Add which for click: 1 === left; 2 === middle; 3 === right
  2609. // Note: button is not normalized, so don't use it
  2610. if ( !event.which && button !== undefined ) {
  2611. event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
  2612. }
  2613. return event;
  2614. }
  2615. },
  2616. fix: function( event ) {
  2617. if ( event[ jQuery.expando ] ) {
  2618. return event;
  2619. }
  2620. // Create a writable copy of the event object and normalize some properties
  2621. var i, prop,
  2622. originalEvent = event,
  2623. fixHook = jQuery.event.fixHooks[ event.type ] || {},
  2624. copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
  2625. event = jQuery.Event( originalEvent );
  2626. for ( i = copy.length; i; ) {
  2627. prop = copy[ --i ];
  2628. event[ prop ] = originalEvent[ prop ];
  2629. }
  2630. // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
  2631. if ( !event.target ) {
  2632. event.target = originalEvent.srcElement || document;
  2633. }
  2634. // Target should not be a text node (#504, Safari)
  2635. if ( event.target.nodeType === 3 ) {
  2636. event.target = event.target.parentNode;
  2637. }
  2638. // For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8)
  2639. event.metaKey = !!event.metaKey;
  2640. return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
  2641. },
  2642. special: {
  2643. load: {
  2644. // Prevent triggered image.load events from bubbling to window.load
  2645. noBubble: true
  2646. },
  2647. focus: {
  2648. delegateType: "focusin"
  2649. },
  2650. blur: {
  2651. delegateType: "focusout"
  2652. },
  2653. beforeunload: {
  2654. setup: function( data, namespaces, eventHandle ) {
  2655. // We only want to do this special case on windows
  2656. if ( jQuery.isWindow( this ) ) {
  2657. this.onbeforeunload = eventHandle;
  2658. }
  2659. },
  2660. teardown: function( namespaces, eventHandle ) {
  2661. if ( this.onbeforeunload === eventHandle ) {
  2662. this.onbeforeunload = null;
  2663. }
  2664. }
  2665. }
  2666. },
  2667. simulate: function( type, elem, event, bubble ) {
  2668. // Piggyback on a donor event to simulate a different one.
  2669. // Fake originalEvent to avoid donor's stopPropagation, but if the
  2670. // simulated event prevents default then we do the same on the donor.
  2671. var e = jQuery.extend(
  2672. new jQuery.Event(),
  2673. event,
  2674. { type: type,
  2675. isSimulated: true,
  2676. originalEvent: {}
  2677. }
  2678. );
  2679. if ( bubble ) {
  2680. jQuery.event.trigger( e, null, elem );
  2681. } else {
  2682. jQuery.event.dispatch.call( elem, e );
  2683. }
  2684. if ( e.isDefaultPrevented() ) {
  2685. event.preventDefault();
  2686. }
  2687. }
  2688. };
  2689. // Some plugins are using, but it's undocumented/deprecated and will be removed.
  2690. // The 1.7 special event interface should provide all the hooks needed now.
  2691. jQuery.event.handle = jQuery.event.dispatch;
  2692. jQuery.removeEvent = document.removeEventListener ?
  2693. function( elem, type, handle ) {
  2694. if ( elem.removeEventListener ) {
  2695. elem.removeEventListener( type, handle, false );
  2696. }
  2697. } :
  2698. function( elem, type, handle ) {
  2699. var name = "on" + type;
  2700. if ( elem.detachEvent ) {
  2701. // #8545, #7054, preventing memory leaks for custom events in IE6-8
  2702. // detachEvent needed property on element, by name of that event, to properly expose it to GC
  2703. if ( typeof elem[ name ] === "undefined" ) {
  2704. elem[ name ] = null;
  2705. }
  2706. elem.detachEvent( name, handle );
  2707. }
  2708. };
  2709. jQuery.Event = function( src, props ) {
  2710. // Allow instantiation without the 'new' keyword
  2711. if ( !(this instanceof jQuery.Event) ) {
  2712. return new jQuery.Event( src, props );
  2713. }
  2714. // Event object
  2715. if ( src && src.type ) {
  2716. this.originalEvent = src;
  2717. this.type = src.type;
  2718. // Events bubbling up the document may have been marked as prevented
  2719. // by a handler lower down the tree; reflect the correct value.
  2720. this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
  2721. src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
  2722. // Event type
  2723. } else {
  2724. this.type = src;
  2725. }
  2726. // Put explicitly provided properties onto the event object
  2727. if ( props ) {
  2728. jQuery.extend( this, props );
  2729. }
  2730. // Create a timestamp if incoming event doesn't have one
  2731. this.timeStamp = src && src.timeStamp || jQuery.now();
  2732. // Mark it as fixed
  2733. this[ jQuery.expando ] = true;
  2734. };
  2735. function returnFalse() {
  2736. return false;
  2737. }
  2738. function returnTrue() {
  2739. return true;
  2740. }
  2741. // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
  2742. // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
  2743. jQuery.Event.prototype = {
  2744. preventDefault: function() {
  2745. this.isDefaultPrevented = returnTrue;
  2746. var e = this.originalEvent;
  2747. if ( !e ) {
  2748. return;
  2749. }
  2750. // if preventDefault exists run it on the original event
  2751. if ( e.preventDefault ) {
  2752. e.preventDefault();
  2753. // otherwise set the returnValue property of the original event to false (IE)
  2754. } else {
  2755. e.returnValue = false;
  2756. }
  2757. },
  2758. stopPropagation: function() {
  2759. this.isPropagationStopped = returnTrue;
  2760. var e = this.originalEvent;
  2761. if ( !e ) {
  2762. return;
  2763. }
  2764. // if stopPropagation exists run it on the original event
  2765. if ( e.stopPropagation ) {
  2766. e.stopPropagation();
  2767. }
  2768. // otherwise set the cancelBubble property of the original event to true (IE)
  2769. e.cancelBubble = true;
  2770. },
  2771. stopImmediatePropagation: function() {
  2772. this.isImmediatePropagationStopped = returnTrue;
  2773. this.stopPropagation();
  2774. },
  2775. isDefaultPrevented: returnFalse,
  2776. isPropagationStopped: returnFalse,
  2777. isImmediatePropagationStopped: returnFalse
  2778. };
  2779. // Create mouseenter/leave events using mouseover/out and event-time checks
  2780. jQuery.each({
  2781. mouseenter: "mouseover",
  2782. mouseleave: "mouseout"
  2783. }, function( orig, fix ) {
  2784. jQuery.event.special[ orig ] = {
  2785. delegateType: fix,
  2786. bindType: fix,
  2787. handle: function( event ) {
  2788. var ret,
  2789. target = this,
  2790. related = event.relatedTarget,
  2791. handleObj = event.handleObj,
  2792. selector = handleObj.selector;
  2793. // For mousenter/leave call the handler if related is outside the target.
  2794. // NB: No relatedTarget if the mouse left/entered the browser window
  2795. if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
  2796. event.type = handleObj.origType;
  2797. ret = handleObj.handler.apply( this, arguments );
  2798. event.type = fix;
  2799. }
  2800. return ret;
  2801. }
  2802. };
  2803. });
  2804. // IE submit delegation
  2805. if ( !jQuery.support.submitBubbles ) {
  2806. jQuery.event.special.submit = {
  2807. setup: function() {
  2808. // Only need this for delegated form submit events
  2809. if ( jQuery.nodeName( this, "form" ) ) {
  2810. return false;
  2811. }
  2812. // Lazy-add a submit handler when a descendant form may potentially be submitted
  2813. jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
  2814. // Node name check avoids a VML-related crash in IE (#9807)
  2815. var elem = e.target,
  2816. form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
  2817. if ( form && !jQuery._data( form, "_submit_attached" ) ) {
  2818. jQuery.event.add( form, "submit._submit", function( event ) {
  2819. event._submit_bubble = true;
  2820. });
  2821. jQuery._data( form, "_submit_attached", true );
  2822. }
  2823. });
  2824. // return undefined since we don't need an event listener
  2825. },
  2826. postDispatch: function( event ) {
  2827. // If form was submitted by the user, bubble the event up the tree
  2828. if ( event._submit_bubble ) {
  2829. delete event._submit_bubble;
  2830. if ( this.parentNode && !event.isTrigger ) {
  2831. jQuery.event.simulate( "submit", this.parentNode, event, true );
  2832. }
  2833. }
  2834. },
  2835. teardown: function() {
  2836. // Only need this for delegated form submit events
  2837. if ( jQuery.nodeName( this, "form" ) ) {
  2838. return false;
  2839. }
  2840. // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
  2841. jQuery.event.remove( this, "._submit" );
  2842. }
  2843. };
  2844. }
  2845. // IE change delegation and checkbox/radio fix
  2846. if ( !jQuery.support.changeBubbles ) {
  2847. jQuery.event.special.change = {
  2848. setup: function() {
  2849. if ( rformElems.test( this.nodeName ) ) {
  2850. // IE doesn't fire change on a check/radio until blur; trigger it on click
  2851. // after a propertychange. Eat the blur-change in special.change.handle.
  2852. // This still fires onchange a second time for check/radio after blur.
  2853. if ( this.type === "checkbox" || this.type === "radio" ) {
  2854. jQuery.event.add( this, "propertychange._change", function( event ) {
  2855. if ( event.originalEvent.propertyName === "checked" ) {
  2856. this._just_changed = true;
  2857. }
  2858. });
  2859. jQuery.event.add( this, "click._change", function( event ) {
  2860. if ( this._just_changed && !event.isTrigger ) {
  2861. this._just_changed = false;
  2862. }
  2863. // Allow triggered, simulated change events (#11500)
  2864. jQuery.event.simulate( "change", this, event, true );
  2865. });
  2866. }
  2867. return false;
  2868. }
  2869. // Delegated event; lazy-add a change handler on descendant inputs
  2870. jQuery.event.add( this, "beforeactivate._change", function( e ) {
  2871. var elem = e.target;
  2872. if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "_change_attached" ) ) {
  2873. jQuery.event.add( elem, "change._change", function( event ) {
  2874. if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
  2875. jQuery.event.simulate( "change", this.parentNode, event, true );
  2876. }
  2877. });
  2878. jQuery._data( elem, "_change_attached", true );
  2879. }
  2880. });
  2881. },
  2882. handle: function( event ) {
  2883. var elem = event.target;
  2884. // Swallow native change events from checkbox/radio, we already triggered them above
  2885. if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
  2886. return event.handleObj.handler.apply( this, arguments );
  2887. }
  2888. },
  2889. teardown: function() {
  2890. jQuery.event.remove( this, "._change" );
  2891. return !rformElems.test( this.nodeName );
  2892. }
  2893. };
  2894. }
  2895. // Create "bubbling" focus and blur events
  2896. if ( !jQuery.support.focusinBubbles ) {
  2897. jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
  2898. // Attach a single capturing handler while someone wants focusin/focusout
  2899. var attaches = 0,
  2900. handler = function( event ) {
  2901. jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
  2902. };
  2903. jQuery.event.special[ fix ] = {
  2904. setup: function() {
  2905. if ( attaches++ === 0 ) {
  2906. document.addEventListener( orig, handler, true );
  2907. }
  2908. },
  2909. teardown: function() {
  2910. if ( --attaches === 0 ) {
  2911. document.removeEventListener( orig, handler, true );
  2912. }
  2913. }
  2914. };
  2915. });
  2916. }
  2917. jQuery.fn.extend({
  2918. on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
  2919. var origFn, type;
  2920. // Types can be a map of types/handlers
  2921. if ( typeof types === "object" ) {
  2922. // ( types-Object, selector, data )
  2923. if ( typeof selector !== "string" ) { // && selector != null
  2924. // ( types-Object, data )
  2925. data = data || selector;
  2926. selector = undefined;
  2927. }
  2928. for ( type in types ) {
  2929. this.on( type, selector, data, types[ type ], one );
  2930. }
  2931. return this;
  2932. }
  2933. if ( data == null && fn == null ) {
  2934. // ( types, fn )
  2935. fn = selector;
  2936. data = selector = undefined;
  2937. } else if ( fn == null ) {
  2938. if ( typeof selector === "string" ) {
  2939. // ( types, selector, fn )
  2940. fn = data;
  2941. data = undefined;
  2942. } else {
  2943. // ( types, data, fn )
  2944. fn = data;
  2945. data = selector;
  2946. selector = undefined;
  2947. }
  2948. }
  2949. if ( fn === false ) {
  2950. fn = returnFalse;
  2951. } else if ( !fn ) {
  2952. return this;
  2953. }
  2954. if ( one === 1 ) {
  2955. origFn = fn;
  2956. fn = function( event ) {
  2957. // Can use an empty set, since event contains the info
  2958. jQuery().off( event );
  2959. return origFn.apply( this, arguments );
  2960. };
  2961. // Use same guid so caller can remove using origFn
  2962. fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
  2963. }
  2964. return this.each( function() {
  2965. jQuery.event.add( this, types, fn, data, selector );
  2966. });
  2967. },
  2968. one: function( types, selector, data, fn ) {
  2969. return this.on( types, selector, data, fn, 1 );
  2970. },
  2971. off: function( types, selector, fn ) {
  2972. var handleObj, type;
  2973. if ( types && types.preventDefault && types.handleObj ) {
  2974. // ( event ) dispatched jQuery.Event
  2975. handleObj = types.handleObj;
  2976. jQuery( types.delegateTarget ).off(
  2977. handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
  2978. handleObj.selector,
  2979. handleObj.handler
  2980. );
  2981. return this;
  2982. }
  2983. if ( typeof types === "object" ) {
  2984. // ( types-object [, selector] )
  2985. for ( type in types ) {
  2986. this.off( type, selector, types[ type ] );
  2987. }
  2988. return this;
  2989. }
  2990. if ( selector === false || typeof selector === "function" ) {
  2991. // ( types [, fn] )
  2992. fn = selector;
  2993. selector = undefined;
  2994. }
  2995. if ( fn === false ) {
  2996. fn = returnFalse;
  2997. }
  2998. return this.each(function() {
  2999. jQuery.event.remove( this, types, fn, selector );
  3000. });
  3001. },
  3002. bind: function( types, data, fn ) {
  3003. return this.on( types, null, data, fn );
  3004. },
  3005. unbind: function( types, fn ) {
  3006. return this.off( types, null, fn );
  3007. },
  3008. live: function( types, data, fn ) {
  3009. jQuery( this.context ).on( types, this.selector, data, fn );
  3010. return this;
  3011. },
  3012. die: function( types, fn ) {
  3013. jQuery( this.context ).off( types, this.selector || "**", fn );
  3014. return this;
  3015. },
  3016. delegate: function( selector, types, data, fn ) {
  3017. return this.on( types, selector, data, fn );
  3018. },
  3019. undelegate: function( selector, types, fn ) {
  3020. // ( namespace ) or ( selector, types [, fn] )
  3021. return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
  3022. },
  3023. trigger: function( type, data ) {
  3024. return this.each(function() {
  3025. jQuery.event.trigger( type, data, this );
  3026. });
  3027. },
  3028. triggerHandler: function( type, data ) {
  3029. if ( this[0] ) {
  3030. return jQuery.event.trigger( type, data, this[0], true );
  3031. }
  3032. },
  3033. toggle: function( fn ) {
  3034. // Save reference to arguments for access in closure
  3035. var args = arguments,
  3036. guid = fn.guid || jQuery.guid++,
  3037. i = 0,
  3038. toggler = function( event ) {
  3039. // Figure out which function to execute
  3040. var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
  3041. jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
  3042. // Make sure that clicks stop
  3043. event.preventDefault();
  3044. // and execute the function
  3045. return args[ lastToggle ].apply( this, arguments ) || false;
  3046. };
  3047. // link all the functions, so any of them can unbind this click handler
  3048. toggler.guid = guid;
  3049. while ( i < args.length ) {
  3050. args[ i++ ].guid = guid;
  3051. }
  3052. return this.click( toggler );
  3053. },
  3054. hover: function( fnOver, fnOut ) {
  3055. return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
  3056. }
  3057. });
  3058. jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
  3059. "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
  3060. "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
  3061. // Handle event binding
  3062. jQuery.fn[ name ] = function( data, fn ) {
  3063. if ( fn == null ) {
  3064. fn = data;
  3065. data = null;
  3066. }
  3067. return arguments.length > 0 ?
  3068. this.on( name, null, data, fn ) :
  3069. this.trigger( name );
  3070. };
  3071. if ( rkeyEvent.test( name ) ) {
  3072. jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
  3073. }
  3074. if ( rmouseEvent.test( name ) ) {
  3075. jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
  3076. }
  3077. });
  3078. /*!
  3079. * Sizzle CSS Selector Engine
  3080. * Copyright 2012 jQuery Foundation and other contributors
  3081. * Released under the MIT license
  3082. * http://sizzlejs.com/
  3083. */
  3084. (function( window, undefined ) {
  3085. var cachedruns,
  3086. assertGetIdNotName,
  3087. Expr,
  3088. getText,
  3089. isXML,
  3090. contains,
  3091. compile,
  3092. sortOrder,
  3093. hasDuplicate,
  3094. outermostContext,
  3095. baseHasDuplicate = true,
  3096. strundefined = "undefined",
  3097. expando = ( "sizcache" + Math.random() ).replace( ".", "" ),
  3098. Token = String,
  3099. document = window.document,
  3100. docElem = document.documentElement,
  3101. dirruns = 0,
  3102. done = 0,
  3103. pop = [].pop,
  3104. push = [].push,
  3105. slice = [].slice,
  3106. // Use a stripped-down indexOf if a native one is unavailable
  3107. indexOf = [].indexOf || function( elem ) {
  3108. var i = 0,
  3109. len = this.length;
  3110. for ( ; i < len; i++ ) {
  3111. if ( this[i] === elem ) {
  3112. return i;
  3113. }
  3114. }
  3115. return -1;
  3116. },
  3117. // Augment a function for special use by Sizzle
  3118. markFunction = function( fn, value ) {
  3119. fn[ expando ] = value == null || value;
  3120. return fn;
  3121. },
  3122. createCache = function() {
  3123. var cache = {},
  3124. keys = [];
  3125. return markFunction(function( key, value ) {
  3126. // Only keep the most recent entries
  3127. if ( keys.push( key ) > Expr.cacheLength ) {
  3128. delete cache[ keys.shift() ];
  3129. }
  3130. // Retrieve with (key + " ") to avoid collision with native Object.prototype properties (see Issue #157)
  3131. return (cache[ key + " " ] = value);
  3132. }, cache );
  3133. },
  3134. classCache = createCache(),
  3135. tokenCache = createCache(),
  3136. compilerCache = createCache(),
  3137. // Regex
  3138. // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
  3139. whitespace = "[\\x20\\t\\r\\n\\f]",
  3140. // http://www.w3.org/TR/css3-syntax/#characters
  3141. characterEncoding = "(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",
  3142. // Loosely modeled on CSS identifier characters
  3143. // An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors)
  3144. // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
  3145. identifier = characterEncoding.replace( "w", "w#" ),
  3146. // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
  3147. operators = "([*^$|!~]?=)",
  3148. attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
  3149. "*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
  3150. // Prefer arguments not in parens/brackets,
  3151. // then attribute selectors and non-pseudos (denoted by :),
  3152. // then anything else
  3153. // These preferences are here to reduce the number of selectors
  3154. // needing tokenize in the PSEUDO preFilter
  3155. pseudos = ":(" + characterEncoding + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:" + attributes + ")|[^:]|\\\\.)*|.*))\\)|)",
  3156. // For matchExpr.POS and matchExpr.needsContext
  3157. pos = ":(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
  3158. "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)",
  3159. // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
  3160. rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
  3161. rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
  3162. rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),
  3163. rpseudo = new RegExp( pseudos ),
  3164. // Easily-parseable/retrievable ID or TAG or CLASS selectors
  3165. rquickExpr = /^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,
  3166. rnot = /^:not/,
  3167. rsibling = /[\x20\t\r\n\f]*[+~]/,
  3168. rendsWithNot = /:not\($/,
  3169. rheader = /h\d/i,
  3170. rinputs = /input|select|textarea|button/i,
  3171. rbackslash = /\\(?!\\)/g,
  3172. matchExpr = {
  3173. "ID": new RegExp( "^#(" + characterEncoding + ")" ),
  3174. "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
  3175. "NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),
  3176. "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
  3177. "ATTR": new RegExp( "^" + attributes ),
  3178. "PSEUDO": new RegExp( "^" + pseudos ),
  3179. "POS": new RegExp( pos, "i" ),
  3180. "CHILD": new RegExp( "^:(only|nth|first|last)-child(?:\\(" + whitespace +
  3181. "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
  3182. "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
  3183. // For use in libraries implementing .is()
  3184. "needsContext": new RegExp( "^" + whitespace + "*[>+~]|" + pos, "i" )
  3185. },
  3186. // Support
  3187. // Used for testing something on an element
  3188. assert = function( fn ) {
  3189. var div = document.createElement("div");
  3190. try {
  3191. return fn( div );
  3192. } catch (e) {
  3193. return false;
  3194. } finally {
  3195. // release memory in IE
  3196. div = null;
  3197. }
  3198. },
  3199. // Check if getElementsByTagName("*") returns only elements
  3200. assertTagNameNoComments = assert(function( div ) {
  3201. div.appendChild( document.createComment("") );
  3202. return !div.getElementsByTagName("*").length;
  3203. }),
  3204. // Check if getAttribute returns normalized href attributes
  3205. assertHrefNotNormalized = assert(function( div ) {
  3206. div.innerHTML = "<a href='#'></a>";
  3207. return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&
  3208. div.firstChild.getAttribute("href") === "#";
  3209. }),
  3210. // Check if attributes should be retrieved by attribute nodes
  3211. assertAttributes = assert(function( div ) {
  3212. div.innerHTML = "<select></select>";
  3213. var type = typeof div.lastChild.getAttribute("multiple");
  3214. // IE8 returns a string for some attributes even when not present
  3215. return type !== "boolean" && type !== "string";
  3216. }),
  3217. // Check if getElementsByClassName can be trusted
  3218. assertUsableClassName = assert(function( div ) {
  3219. // Opera can't find a second classname (in 9.6)
  3220. div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";
  3221. if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) {
  3222. return false;
  3223. }
  3224. // Safari 3.2 caches class attributes and doesn't catch changes
  3225. div.lastChild.className = "e";
  3226. return div.getElementsByClassName("e").length === 2;
  3227. }),
  3228. // Check if getElementById returns elements by name
  3229. // Check if getElementsByName privileges form controls or returns elements by ID
  3230. assertUsableName = assert(function( div ) {
  3231. // Inject content
  3232. div.id = expando + 0;
  3233. div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";
  3234. docElem.insertBefore( div, docElem.firstChild );
  3235. // Test
  3236. var pass = document.getElementsByName &&
  3237. // buggy browsers will return fewer than the correct 2
  3238. document.getElementsByName( expando ).length === 2 +
  3239. // buggy browsers will return more than the correct 0
  3240. document.getElementsByName( expando + 0 ).length;
  3241. assertGetIdNotName = !document.getElementById( expando );
  3242. // Cleanup
  3243. docElem.removeChild( div );
  3244. return pass;
  3245. });
  3246. // If slice is not available, provide a backup
  3247. try {
  3248. slice.call( docElem.childNodes, 0 )[0].nodeType;
  3249. } catch ( e ) {
  3250. slice = function( i ) {
  3251. var elem,
  3252. results = [];
  3253. for ( ; (elem = this[i]); i++ ) {
  3254. results.push( elem );
  3255. }
  3256. return results;
  3257. };
  3258. }
  3259. function Sizzle( selector, context, results, seed ) {
  3260. results = results || [];
  3261. context = context || document;
  3262. var match, elem, xml, m,
  3263. nodeType = context.nodeType;
  3264. if ( !selector || typeof selector !== "string" ) {
  3265. return results;
  3266. }
  3267. if ( nodeType !== 1 && nodeType !== 9 ) {
  3268. return [];
  3269. }
  3270. xml = isXML( context );
  3271. if ( !xml && !seed ) {
  3272. if ( (match = rquickExpr.exec( selector )) ) {
  3273. // Speed-up: Sizzle("#ID")
  3274. if ( (m = match[1]) ) {
  3275. if ( nodeType === 9 ) {
  3276. elem = context.getElementById( m );
  3277. // Check parentNode to catch when Blackberry 4.6 returns
  3278. // nodes that are no longer in the document #6963
  3279. if ( elem && elem.parentNode ) {
  3280. // Handle the case where IE, Opera, and Webkit return items
  3281. // by name instead of ID
  3282. if ( elem.id === m ) {
  3283. results.push( elem );
  3284. return results;
  3285. }
  3286. } else {
  3287. return results;
  3288. }
  3289. } else {
  3290. // Context is not a document
  3291. if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
  3292. contains( context, elem ) && elem.id === m ) {
  3293. results.push( elem );
  3294. return results;
  3295. }
  3296. }
  3297. // Speed-up: Sizzle("TAG")
  3298. } else if ( match[2] ) {
  3299. push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );
  3300. return results;
  3301. // Speed-up: Sizzle(".CLASS")
  3302. } else if ( (m = match[3]) && assertUsableClassName && context.getElementsByClassName ) {
  3303. push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );
  3304. return results;
  3305. }
  3306. }
  3307. }
  3308. // All others
  3309. return select( selector.replace( rtrim, "$1" ), context, results, seed, xml );
  3310. }
  3311. Sizzle.matches = function( expr, elements ) {
  3312. return Sizzle( expr, null, null, elements );
  3313. };
  3314. Sizzle.matchesSelector = function( elem, expr ) {
  3315. return Sizzle( expr, null, null, [ elem ] ).length > 0;
  3316. };
  3317. // Returns a function to use in pseudos for input types
  3318. function createInputPseudo( type ) {
  3319. return function( elem ) {
  3320. var name = elem.nodeName.toLowerCase();
  3321. return name === "input" && elem.type === type;
  3322. };
  3323. }
  3324. // Returns a function to use in pseudos for buttons
  3325. function createButtonPseudo( type ) {
  3326. return function( elem ) {
  3327. var name = elem.nodeName.toLowerCase();
  3328. return (name === "input" || name === "button") && elem.type === type;
  3329. };
  3330. }
  3331. // Returns a function to use in pseudos for positionals
  3332. function createPositionalPseudo( fn ) {
  3333. return markFunction(function( argument ) {
  3334. argument = +argument;
  3335. return markFunction(function( seed, matches ) {
  3336. var j,
  3337. matchIndexes = fn( [], seed.length, argument ),
  3338. i = matchIndexes.length;
  3339. // Match elements found at the specified indexes
  3340. while ( i-- ) {
  3341. if ( seed[ (j = matchIndexes[i]) ] ) {
  3342. seed[j] = !(matches[j] = seed[j]);
  3343. }
  3344. }
  3345. });
  3346. });
  3347. }
  3348. /**
  3349. * Utility function for retrieving the text value of an array of DOM nodes
  3350. * @param {Array|Element} elem
  3351. */
  3352. getText = Sizzle.getText = function( elem ) {
  3353. var node,
  3354. ret = "",
  3355. i = 0,
  3356. nodeType = elem.nodeType;
  3357. if ( nodeType ) {
  3358. if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
  3359. // Use textContent for elements
  3360. // innerText usage removed for consistency of new lines (see #11153)
  3361. if ( typeof elem.textContent === "string" ) {
  3362. return elem.textContent;
  3363. } else {
  3364. // Traverse its children
  3365. for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
  3366. ret += getText( elem );
  3367. }
  3368. }
  3369. } else if ( nodeType === 3 || nodeType === 4 ) {
  3370. return elem.nodeValue;
  3371. }
  3372. // Do not include comment or processing instruction nodes
  3373. } else {
  3374. // If no nodeType, this is expected to be an array
  3375. for ( ; (node = elem[i]); i++ ) {
  3376. // Do not traverse comment nodes
  3377. ret += getText( node );
  3378. }
  3379. }
  3380. return ret;
  3381. };
  3382. isXML = Sizzle.isXML = function( elem ) {
  3383. // documentElement is verified for cases where it doesn't yet exist
  3384. // (such as loading iframes in IE - #4833)
  3385. var documentElement = elem && (elem.ownerDocument || elem).documentElement;
  3386. return documentElement ? documentElement.nodeName !== "HTML" : false;
  3387. };
  3388. // Element contains another
  3389. contains = Sizzle.contains = docElem.contains ?
  3390. function( a, b ) {
  3391. var adown = a.nodeType === 9 ? a.documentElement : a,
  3392. bup = b && b.parentNode;
  3393. return a === bup || !!( bup && bup.nodeType === 1 && adown.contains && adown.contains(bup) );
  3394. } :
  3395. docElem.compareDocumentPosition ?
  3396. function( a, b ) {
  3397. return b && !!( a.compareDocumentPosition( b ) & 16 );
  3398. } :
  3399. function( a, b ) {
  3400. while ( (b = b.parentNode) ) {
  3401. if ( b === a ) {
  3402. return true;
  3403. }
  3404. }
  3405. return false;
  3406. };
  3407. Sizzle.attr = function( elem, name ) {
  3408. var val,
  3409. xml = isXML( elem );
  3410. if ( !xml ) {
  3411. name = name.toLowerCase();
  3412. }
  3413. if ( (val = Expr.attrHandle[ name ]) ) {
  3414. return val( elem );
  3415. }
  3416. if ( xml || assertAttributes ) {
  3417. return elem.getAttribute( name );
  3418. }
  3419. val = elem.getAttributeNode( name );
  3420. return val ?
  3421. typeof elem[ name ] === "boolean" ?
  3422. elem[ name ] ? name : null :
  3423. val.specified ? val.value : null :
  3424. null;
  3425. };
  3426. Expr = Sizzle.selectors = {
  3427. // Can be adjusted by the user
  3428. cacheLength: 50,
  3429. createPseudo: markFunction,
  3430. match: matchExpr,
  3431. // IE6/7 return a modified href
  3432. attrHandle: assertHrefNotNormalized ?
  3433. {} :
  3434. {
  3435. "href": function( elem ) {
  3436. return elem.getAttribute( "href", 2 );
  3437. },
  3438. "type": function( elem ) {
  3439. return elem.getAttribute("type");
  3440. }
  3441. },
  3442. find: {
  3443. "ID": assertGetIdNotName ?
  3444. function( id, context, xml ) {
  3445. if ( typeof context.getElementById !== strundefined && !xml ) {
  3446. var m = context.getElementById( id );
  3447. // Check parentNode to catch when Blackberry 4.6 returns
  3448. // nodes that are no longer in the document #6963
  3449. return m && m.parentNode ? [m] : [];
  3450. }
  3451. } :
  3452. function( id, context, xml ) {
  3453. if ( typeof context.getElementById !== strundefined && !xml ) {
  3454. var m = context.getElementById( id );
  3455. return m ?
  3456. m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?
  3457. [m] :
  3458. undefined :
  3459. [];
  3460. }
  3461. },
  3462. "TAG": assertTagNameNoComments ?
  3463. function( tag, context ) {
  3464. if ( typeof context.getElementsByTagName !== strundefined ) {
  3465. return context.getElementsByTagName( tag );
  3466. }
  3467. } :
  3468. function( tag, context ) {
  3469. var results = context.getElementsByTagName( tag );
  3470. // Filter out possible comments
  3471. if ( tag === "*" ) {
  3472. var elem,
  3473. tmp = [],
  3474. i = 0;
  3475. for ( ; (elem = results[i]); i++ ) {
  3476. if ( elem.nodeType === 1 ) {
  3477. tmp.push( elem );
  3478. }
  3479. }
  3480. return tmp;
  3481. }
  3482. return results;
  3483. },
  3484. "NAME": assertUsableName && function( tag, context ) {
  3485. if ( typeof context.getElementsByName !== strundefined ) {
  3486. return context.getElementsByName( name );
  3487. }
  3488. },
  3489. "CLASS": assertUsableClassName && function( className, context, xml ) {
  3490. if ( typeof context.getElementsByClassName !== strundefined && !xml ) {
  3491. return context.getElementsByClassName( className );
  3492. }
  3493. }
  3494. },
  3495. relative: {
  3496. ">": { dir: "parentNode", first: true },
  3497. " ": { dir: "parentNode" },
  3498. "+": { dir: "previousSibling", first: true },
  3499. "~": { dir: "previousSibling" }
  3500. },
  3501. preFilter: {
  3502. "ATTR": function( match ) {
  3503. match[1] = match[1].replace( rbackslash, "" );
  3504. // Move the given value to match[3] whether quoted or unquoted
  3505. match[3] = ( match[4] || match[5] || "" ).replace( rbackslash, "" );
  3506. if ( match[2] === "~=" ) {
  3507. match[3] = " " + match[3] + " ";
  3508. }
  3509. return match.slice( 0, 4 );
  3510. },
  3511. "CHILD": function( match ) {
  3512. /* matches from matchExpr["CHILD"]
  3513. 1 type (only|nth|...)
  3514. 2 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
  3515. 3 xn-component of xn+y argument ([+-]?\d*n|)
  3516. 4 sign of xn-component
  3517. 5 x of xn-component
  3518. 6 sign of y-component
  3519. 7 y of y-component
  3520. */
  3521. match[1] = match[1].toLowerCase();
  3522. if ( match[1] === "nth" ) {
  3523. // nth-child requires argument
  3524. if ( !match[2] ) {
  3525. Sizzle.error( match[0] );
  3526. }
  3527. // numeric x and y parameters for Expr.filter.CHILD
  3528. // remember that false/true cast respectively to 0/1
  3529. match[3] = +( match[3] ? match[4] + (match[5] || 1) : 2 * ( match[2] === "even" || match[2] === "odd" ) );
  3530. match[4] = +( ( match[6] + match[7] ) || match[2] === "odd" );
  3531. // other types prohibit arguments
  3532. } else if ( match[2] ) {
  3533. Sizzle.error( match[0] );
  3534. }
  3535. return match;
  3536. },
  3537. "PSEUDO": function( match ) {
  3538. var unquoted, excess;
  3539. if ( matchExpr["CHILD"].test( match[0] ) ) {
  3540. return null;
  3541. }
  3542. if ( match[3] ) {
  3543. match[2] = match[3];
  3544. } else if ( (unquoted = match[4]) ) {
  3545. // Only check arguments that contain a pseudo
  3546. if ( rpseudo.test(unquoted) &&
  3547. // Get excess from tokenize (recursively)
  3548. (excess = tokenize( unquoted, true )) &&
  3549. // advance to the next closing parenthesis
  3550. (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
  3551. // excess is a negative index
  3552. unquoted = unquoted.slice( 0, excess );
  3553. match[0] = match[0].slice( 0, excess );
  3554. }
  3555. match[2] = unquoted;
  3556. }
  3557. // Return only captures needed by the pseudo filter method (type and argument)
  3558. return match.slice( 0, 3 );
  3559. }
  3560. },
  3561. filter: {
  3562. "ID": assertGetIdNotName ?
  3563. function( id ) {
  3564. id = id.replace( rbackslash, "" );
  3565. return function( elem ) {
  3566. return elem.getAttribute("id") === id;
  3567. };
  3568. } :
  3569. function( id ) {
  3570. id = id.replace( rbackslash, "" );
  3571. return function( elem ) {
  3572. var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
  3573. return node && node.value === id;
  3574. };
  3575. },
  3576. "TAG": function( nodeName ) {
  3577. if ( nodeName === "*" ) {
  3578. return function() { return true; };
  3579. }
  3580. nodeName = nodeName.replace( rbackslash, "" ).toLowerCase();
  3581. return function( elem ) {
  3582. return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
  3583. };
  3584. },
  3585. "CLASS": function( className ) {
  3586. var pattern = classCache[ expando ][ className + " " ];
  3587. return pattern ||
  3588. (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
  3589. classCache( className, function( elem ) {
  3590. return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );
  3591. });
  3592. },
  3593. "ATTR": function( name, operator, check ) {
  3594. return function( elem, context ) {
  3595. var result = Sizzle.attr( elem, name );
  3596. if ( result == null ) {
  3597. return operator === "!=";
  3598. }
  3599. if ( !operator ) {
  3600. return true;
  3601. }
  3602. result += "";
  3603. return operator === "=" ? result === check :
  3604. operator === "!=" ? result !== check :
  3605. operator === "^=" ? check && result.indexOf( check ) === 0 :
  3606. operator === "*=" ? check && result.indexOf( check ) > -1 :
  3607. operator === "$=" ? check && result.substr( result.length - check.length ) === check :
  3608. operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
  3609. operator === "|=" ? result === check || result.substr( 0, check.length + 1 ) === check + "-" :
  3610. false;
  3611. };
  3612. },
  3613. "CHILD": function( type, argument, first, last ) {
  3614. if ( type === "nth" ) {
  3615. return function( elem ) {
  3616. var node, diff,
  3617. parent = elem.parentNode;
  3618. if ( first === 1 && last === 0 ) {
  3619. return true;
  3620. }
  3621. if ( parent ) {
  3622. diff = 0;
  3623. for ( node = parent.firstChild; node; node = node.nextSibling ) {
  3624. if ( node.nodeType === 1 ) {
  3625. diff++;
  3626. if ( elem === node ) {
  3627. break;
  3628. }
  3629. }
  3630. }
  3631. }
  3632. // Incorporate the offset (or cast to NaN), then check against cycle size
  3633. diff -= last;
  3634. return diff === first || ( diff % first === 0 && diff / first >= 0 );
  3635. };
  3636. }
  3637. return function( elem ) {
  3638. var node = elem;
  3639. switch ( type ) {
  3640. case "only":
  3641. case "first":
  3642. while ( (node = node.previousSibling) ) {
  3643. if ( node.nodeType === 1 ) {
  3644. return false;
  3645. }
  3646. }
  3647. if ( type === "first" ) {
  3648. return true;
  3649. }
  3650. node = elem;
  3651. /* falls through */
  3652. case "last":
  3653. while ( (node = node.nextSibling) ) {
  3654. if ( node.nodeType === 1 ) {
  3655. return false;
  3656. }
  3657. }
  3658. return true;
  3659. }
  3660. };
  3661. },
  3662. "PSEUDO": function( pseudo, argument ) {
  3663. // pseudo-class names are case-insensitive
  3664. // http://www.w3.org/TR/selectors/#pseudo-classes
  3665. // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
  3666. // Remember that setFilters inherits from pseudos
  3667. var args,
  3668. fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
  3669. Sizzle.error( "unsupported pseudo: " + pseudo );
  3670. // The user may use createPseudo to indicate that
  3671. // arguments are needed to create the filter function
  3672. // just as Sizzle does
  3673. if ( fn[ expando ] ) {
  3674. return fn( argument );
  3675. }
  3676. // But maintain support for old signatures
  3677. if ( fn.length > 1 ) {
  3678. args = [ pseudo, pseudo, "", argument ];
  3679. return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
  3680. markFunction(function( seed, matches ) {
  3681. var idx,
  3682. matched = fn( seed, argument ),
  3683. i = matched.length;
  3684. while ( i-- ) {
  3685. idx = indexOf.call( seed, matched[i] );
  3686. seed[ idx ] = !( matches[ idx ] = matched[i] );
  3687. }
  3688. }) :
  3689. function( elem ) {
  3690. return fn( elem, 0, args );
  3691. };
  3692. }
  3693. return fn;
  3694. }
  3695. },
  3696. pseudos: {
  3697. "not": markFunction(function( selector ) {
  3698. // Trim the selector passed to compile
  3699. // to avoid treating leading and trailing
  3700. // spaces as combinators
  3701. var input = [],
  3702. results = [],
  3703. matcher = compile( selector.replace( rtrim, "$1" ) );
  3704. return matcher[ expando ] ?
  3705. markFunction(function( seed, matches, context, xml ) {
  3706. var elem,
  3707. unmatched = matcher( seed, null, xml, [] ),
  3708. i = seed.length;
  3709. // Match elements unmatched by `matcher`
  3710. while ( i-- ) {
  3711. if ( (elem = unmatched[i]) ) {
  3712. seed[i] = !(matches[i] = elem);
  3713. }
  3714. }
  3715. }) :
  3716. function( elem, context, xml ) {
  3717. input[0] = elem;
  3718. matcher( input, null, xml, results );
  3719. return !results.pop();
  3720. };
  3721. }),
  3722. "has": markFunction(function( selector ) {
  3723. return function( elem ) {
  3724. return Sizzle( selector, elem ).length > 0;
  3725. };
  3726. }),
  3727. "contains": markFunction(function( text ) {
  3728. return function( elem ) {
  3729. return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
  3730. };
  3731. }),
  3732. "enabled": function( elem ) {
  3733. return elem.disabled === false;
  3734. },
  3735. "disabled": function( elem ) {
  3736. return elem.disabled === true;
  3737. },
  3738. "checked": function( elem ) {
  3739. // In CSS3, :checked should return both checked and selected elements
  3740. // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
  3741. var nodeName = elem.nodeName.toLowerCase();
  3742. return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
  3743. },
  3744. "selected": function( elem ) {
  3745. // Accessing this property makes selected-by-default
  3746. // options in Safari work properly
  3747. if ( elem.parentNode ) {
  3748. elem.parentNode.selectedIndex;
  3749. }
  3750. return elem.selected === true;
  3751. },
  3752. "parent": function( elem ) {
  3753. return !Expr.pseudos["empty"]( elem );
  3754. },
  3755. "empty": function( elem ) {
  3756. // http://www.w3.org/TR/selectors/#empty-pseudo
  3757. // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
  3758. // not comment, processing instructions, or others
  3759. // Thanks to Diego Perini for the nodeName shortcut
  3760. // Greater than "@" means alpha characters (specifically not starting with "#" or "?")
  3761. var nodeType;
  3762. elem = elem.firstChild;
  3763. while ( elem ) {
  3764. if ( elem.nodeName > "@" || (nodeType = elem.nodeType) === 3 || nodeType === 4 ) {
  3765. return false;
  3766. }
  3767. elem = elem.nextSibling;
  3768. }
  3769. return true;
  3770. },
  3771. "header": function( elem ) {
  3772. return rheader.test( elem.nodeName );
  3773. },
  3774. "text": function( elem ) {
  3775. var type, attr;
  3776. // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
  3777. // use getAttribute instead to test this case
  3778. return elem.nodeName.toLowerCase() === "input" &&
  3779. (type = elem.type) === "text" &&
  3780. ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === type );
  3781. },
  3782. // Input types
  3783. "radio": createInputPseudo("radio"),
  3784. "checkbox": createInputPseudo("checkbox"),
  3785. "file": createInputPseudo("file"),
  3786. "password": createInputPseudo("password"),
  3787. "image": createInputPseudo("image"),
  3788. "submit": createButtonPseudo("submit"),
  3789. "reset": createButtonPseudo("reset"),
  3790. "button": function( elem ) {
  3791. var name = elem.nodeName.toLowerCase();
  3792. return name === "input" && elem.type === "button" || name === "button";
  3793. },
  3794. "input": function( elem ) {
  3795. return rinputs.test( elem.nodeName );
  3796. },
  3797. "focus": function( elem ) {
  3798. var doc = elem.ownerDocument;
  3799. return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
  3800. },
  3801. "active": function( elem ) {
  3802. return elem === elem.ownerDocument.activeElement;
  3803. },
  3804. // Positional types
  3805. "first": createPositionalPseudo(function() {
  3806. return [ 0 ];
  3807. }),
  3808. "last": createPositionalPseudo(function( matchIndexes, length ) {
  3809. return [ length - 1 ];
  3810. }),
  3811. "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
  3812. return [ argument < 0 ? argument + length : argument ];
  3813. }),
  3814. "even": createPositionalPseudo(function( matchIndexes, length ) {
  3815. for ( var i = 0; i < length; i += 2 ) {
  3816. matchIndexes.push( i );
  3817. }
  3818. return matchIndexes;
  3819. }),
  3820. "odd": createPositionalPseudo(function( matchIndexes, length ) {
  3821. for ( var i = 1; i < length; i += 2 ) {
  3822. matchIndexes.push( i );
  3823. }
  3824. return matchIndexes;
  3825. }),
  3826. "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
  3827. for ( var i = argument < 0 ? argument + length : argument; --i >= 0; ) {
  3828. matchIndexes.push( i );
  3829. }
  3830. return matchIndexes;
  3831. }),
  3832. "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
  3833. for ( var i = argument < 0 ? argument + length : argument; ++i < length; ) {
  3834. matchIndexes.push( i );
  3835. }
  3836. return matchIndexes;
  3837. })
  3838. }
  3839. };
  3840. function siblingCheck( a, b, ret ) {
  3841. if ( a === b ) {
  3842. return ret;
  3843. }
  3844. var cur = a.nextSibling;
  3845. while ( cur ) {
  3846. if ( cur === b ) {
  3847. return -1;
  3848. }
  3849. cur = cur.nextSibling;
  3850. }
  3851. return 1;
  3852. }
  3853. sortOrder = docElem.compareDocumentPosition ?
  3854. function( a, b ) {
  3855. if ( a === b ) {
  3856. hasDuplicate = true;
  3857. return 0;
  3858. }
  3859. return ( !a.compareDocumentPosition || !b.compareDocumentPosition ?
  3860. a.compareDocumentPosition :
  3861. a.compareDocumentPosition(b) & 4
  3862. ) ? -1 : 1;
  3863. } :
  3864. function( a, b ) {
  3865. // The nodes are identical, we can exit early
  3866. if ( a === b ) {
  3867. hasDuplicate = true;
  3868. return 0;
  3869. // Fallback to using sourceIndex (in IE) if it's available on both nodes
  3870. } else if ( a.sourceIndex && b.sourceIndex ) {
  3871. return a.sourceIndex - b.sourceIndex;
  3872. }
  3873. var al, bl,
  3874. ap = [],
  3875. bp = [],
  3876. aup = a.parentNode,
  3877. bup = b.parentNode,
  3878. cur = aup;
  3879. // If the nodes are siblings (or identical) we can do a quick check
  3880. if ( aup === bup ) {
  3881. return siblingCheck( a, b );
  3882. // If no parents were found then the nodes are disconnected
  3883. } else if ( !aup ) {
  3884. return -1;
  3885. } else if ( !bup ) {
  3886. return 1;
  3887. }
  3888. // Otherwise they're somewhere else in the tree so we need
  3889. // to build up a full list of the parentNodes for comparison
  3890. while ( cur ) {
  3891. ap.unshift( cur );
  3892. cur = cur.parentNode;
  3893. }
  3894. cur = bup;
  3895. while ( cur ) {
  3896. bp.unshift( cur );
  3897. cur = cur.parentNode;
  3898. }
  3899. al = ap.length;
  3900. bl = bp.length;
  3901. // Start walking down the tree looking for a discrepancy
  3902. for ( var i = 0; i < al && i < bl; i++ ) {
  3903. if ( ap[i] !== bp[i] ) {
  3904. return siblingCheck( ap[i], bp[i] );
  3905. }
  3906. }
  3907. // We ended someplace up the tree so do a sibling check
  3908. return i === al ?
  3909. siblingCheck( a, bp[i], -1 ) :
  3910. siblingCheck( ap[i], b, 1 );
  3911. };
  3912. // Always assume the presence of duplicates if sort doesn't
  3913. // pass them to our comparison function (as in Google Chrome).
  3914. [0, 0].sort( sortOrder );
  3915. baseHasDuplicate = !hasDuplicate;
  3916. // Document sorting and removing duplicates
  3917. Sizzle.uniqueSort = function( results ) {
  3918. var elem,
  3919. duplicates = [],
  3920. i = 1,
  3921. j = 0;
  3922. hasDuplicate = baseHasDuplicate;
  3923. results.sort( sortOrder );
  3924. if ( hasDuplicate ) {
  3925. for ( ; (elem = results[i]); i++ ) {
  3926. if ( elem === results[ i - 1 ] ) {
  3927. j = duplicates.push( i );
  3928. }
  3929. }
  3930. while ( j-- ) {
  3931. results.splice( duplicates[ j ], 1 );
  3932. }
  3933. }
  3934. return results;
  3935. };
  3936. Sizzle.error = function( msg ) {
  3937. throw new Error( "Syntax error, unrecognized expression: " + msg );
  3938. };
  3939. function tokenize( selector, parseOnly ) {
  3940. var matched, match, tokens, type,
  3941. soFar, groups, preFilters,
  3942. cached = tokenCache[ expando ][ selector + " " ];
  3943. if ( cached ) {
  3944. return parseOnly ? 0 : cached.slice( 0 );
  3945. }
  3946. soFar = selector;
  3947. groups = [];
  3948. preFilters = Expr.preFilter;
  3949. while ( soFar ) {
  3950. // Comma and first run
  3951. if ( !matched || (match = rcomma.exec( soFar )) ) {
  3952. if ( match ) {
  3953. // Don't consume trailing commas as valid
  3954. soFar = soFar.slice( match[0].length ) || soFar;
  3955. }
  3956. groups.push( tokens = [] );
  3957. }
  3958. matched = false;
  3959. // Combinators
  3960. if ( (match = rcombinators.exec( soFar )) ) {
  3961. tokens.push( matched = new Token( match.shift() ) );
  3962. soFar = soFar.slice( matched.length );
  3963. // Cast descendant combinators to space
  3964. matched.type = match[0].replace( rtrim, " " );
  3965. }
  3966. // Filters
  3967. for ( type in Expr.filter ) {
  3968. if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
  3969. (match = preFilters[ type ]( match ))) ) {
  3970. tokens.push( matched = new Token( match.shift() ) );
  3971. soFar = soFar.slice( matched.length );
  3972. matched.type = type;
  3973. matched.matches = match;
  3974. }
  3975. }
  3976. if ( !matched ) {
  3977. break;
  3978. }
  3979. }
  3980. // Return the length of the invalid excess
  3981. // if we're just parsing
  3982. // Otherwise, throw an error or return tokens
  3983. return parseOnly ?
  3984. soFar.length :
  3985. soFar ?
  3986. Sizzle.error( selector ) :
  3987. // Cache the tokens
  3988. tokenCache( selector, groups ).slice( 0 );
  3989. }
  3990. function addCombinator( matcher, combinator, base ) {
  3991. var dir = combinator.dir,
  3992. checkNonElements = base && combinator.dir === "parentNode",
  3993. doneName = done++;
  3994. return combinator.first ?
  3995. // Check against closest ancestor/preceding element
  3996. function( elem, context, xml ) {
  3997. while ( (elem = elem[ dir ]) ) {
  3998. if ( checkNonElements || elem.nodeType === 1 ) {
  3999. return matcher( elem, context, xml );
  4000. }
  4001. }
  4002. } :
  4003. // Check against all ancestor/preceding elements
  4004. function( elem, context, xml ) {
  4005. // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
  4006. if ( !xml ) {
  4007. var cache,
  4008. dirkey = dirruns + " " + doneName + " ",
  4009. cachedkey = dirkey + cachedruns;
  4010. while ( (elem = elem[ dir ]) ) {
  4011. if ( checkNonElements || elem.nodeType === 1 ) {
  4012. if ( (cache = elem[ expando ]) === cachedkey ) {
  4013. return elem.sizset;
  4014. } else if ( typeof cache === "string" && cache.indexOf(dirkey) === 0 ) {
  4015. if ( elem.sizset ) {
  4016. return elem;
  4017. }
  4018. } else {
  4019. elem[ expando ] = cachedkey;
  4020. if ( matcher( elem, context, xml ) ) {
  4021. elem.sizset = true;
  4022. return elem;
  4023. }
  4024. elem.sizset = false;
  4025. }
  4026. }
  4027. }
  4028. } else {
  4029. while ( (elem = elem[ dir ]) ) {
  4030. if ( checkNonElements || elem.nodeType === 1 ) {
  4031. if ( matcher( elem, context, xml ) ) {
  4032. return elem;
  4033. }
  4034. }
  4035. }
  4036. }
  4037. };
  4038. }
  4039. function elementMatcher( matchers ) {
  4040. return matchers.length > 1 ?
  4041. function( elem, context, xml ) {
  4042. var i = matchers.length;
  4043. while ( i-- ) {
  4044. if ( !matchers[i]( elem, context, xml ) ) {
  4045. return false;
  4046. }
  4047. }
  4048. return true;
  4049. } :
  4050. matchers[0];
  4051. }
  4052. function condense( unmatched, map, filter, context, xml ) {
  4053. var elem,
  4054. newUnmatched = [],
  4055. i = 0,
  4056. len = unmatched.length,
  4057. mapped = map != null;
  4058. for ( ; i < len; i++ ) {
  4059. if ( (elem = unmatched[i]) ) {
  4060. if ( !filter || filter( elem, context, xml ) ) {
  4061. newUnmatched.push( elem );
  4062. if ( mapped ) {
  4063. map.push( i );
  4064. }
  4065. }
  4066. }
  4067. }
  4068. return newUnmatched;
  4069. }
  4070. function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
  4071. if ( postFilter && !postFilter[ expando ] ) {
  4072. postFilter = setMatcher( postFilter );
  4073. }
  4074. if ( postFinder && !postFinder[ expando ] ) {
  4075. postFinder = setMatcher( postFinder, postSelector );
  4076. }
  4077. return markFunction(function( seed, results, context, xml ) {
  4078. var temp, i, elem,
  4079. preMap = [],
  4080. postMap = [],
  4081. preexisting = results.length,
  4082. // Get initial elements from seed or context
  4083. elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
  4084. // Prefilter to get matcher input, preserving a map for seed-results synchronization
  4085. matcherIn = preFilter && ( seed || !selector ) ?
  4086. condense( elems, preMap, preFilter, context, xml ) :
  4087. elems,
  4088. matcherOut = matcher ?
  4089. // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
  4090. postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
  4091. // ...intermediate processing is necessary
  4092. [] :
  4093. // ...otherwise use results directly
  4094. results :
  4095. matcherIn;
  4096. // Find primary matches
  4097. if ( matcher ) {
  4098. matcher( matcherIn, matcherOut, context, xml );
  4099. }
  4100. // Apply postFilter
  4101. if ( postFilter ) {
  4102. temp = condense( matcherOut, postMap );
  4103. postFilter( temp, [], context, xml );
  4104. // Un-match failing elements by moving them back to matcherIn
  4105. i = temp.length;
  4106. while ( i-- ) {
  4107. if ( (elem = temp[i]) ) {
  4108. matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
  4109. }
  4110. }
  4111. }
  4112. if ( seed ) {
  4113. if ( postFinder || preFilter ) {
  4114. if ( postFinder ) {
  4115. // Get the final matcherOut by condensing this intermediate into postFinder contexts
  4116. temp = [];
  4117. i = matcherOut.length;
  4118. while ( i-- ) {
  4119. if ( (elem = matcherOut[i]) ) {
  4120. // Restore matcherIn since elem is not yet a final match
  4121. temp.push( (matcherIn[i] = elem) );
  4122. }
  4123. }
  4124. postFinder( null, (matcherOut = []), temp, xml );
  4125. }
  4126. // Move matched elements from seed to results to keep them synchronized
  4127. i = matcherOut.length;
  4128. while ( i-- ) {
  4129. if ( (elem = matcherOut[i]) &&
  4130. (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
  4131. seed[temp] = !(results[temp] = elem);
  4132. }
  4133. }
  4134. }
  4135. // Add elements to results, through postFinder if defined
  4136. } else {
  4137. matcherOut = condense(
  4138. matcherOut === results ?
  4139. matcherOut.splice( preexisting, matcherOut.length ) :
  4140. matcherOut
  4141. );
  4142. if ( postFinder ) {
  4143. postFinder( null, results, matcherOut, xml );
  4144. } else {
  4145. push.apply( results, matcherOut );
  4146. }
  4147. }
  4148. });
  4149. }
  4150. function matcherFromTokens( tokens ) {
  4151. var checkContext, matcher, j,
  4152. len = tokens.length,
  4153. leadingRelative = Expr.relative[ tokens[0].type ],
  4154. implicitRelative = leadingRelative || Expr.relative[" "],
  4155. i = leadingRelative ? 1 : 0,
  4156. // The foundational matcher ensures that elements are reachable from top-level context(s)
  4157. matchContext = addCombinator( function( elem ) {
  4158. return elem === checkContext;
  4159. }, implicitRelative, true ),
  4160. matchAnyContext = addCombinator( function( elem ) {
  4161. return indexOf.call( checkContext, elem ) > -1;
  4162. }, implicitRelative, true ),
  4163. matchers = [ function( elem, context, xml ) {
  4164. return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
  4165. (checkContext = context).nodeType ?
  4166. matchContext( elem, context, xml ) :
  4167. matchAnyContext( elem, context, xml ) );
  4168. } ];
  4169. for ( ; i < len; i++ ) {
  4170. if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
  4171. matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
  4172. } else {
  4173. matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
  4174. // Return special upon seeing a positional matcher
  4175. if ( matcher[ expando ] ) {
  4176. // Find the next relative operator (if any) for proper handling
  4177. j = ++i;
  4178. for ( ; j < len; j++ ) {
  4179. if ( Expr.relative[ tokens[j].type ] ) {
  4180. break;
  4181. }
  4182. }
  4183. return setMatcher(
  4184. i > 1 && elementMatcher( matchers ),
  4185. i > 1 && tokens.slice( 0, i - 1 ).join("").replace( rtrim, "$1" ),
  4186. matcher,
  4187. i < j && matcherFromTokens( tokens.slice( i, j ) ),
  4188. j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
  4189. j < len && tokens.join("")
  4190. );
  4191. }
  4192. matchers.push( matcher );
  4193. }
  4194. }
  4195. return elementMatcher( matchers );
  4196. }
  4197. function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
  4198. var bySet = setMatchers.length > 0,
  4199. byElement = elementMatchers.length > 0,
  4200. superMatcher = function( seed, context, xml, results, expandContext ) {
  4201. var elem, j, matcher,
  4202. setMatched = [],
  4203. matchedCount = 0,
  4204. i = "0",
  4205. unmatched = seed && [],
  4206. outermost = expandContext != null,
  4207. contextBackup = outermostContext,
  4208. // We must always have either seed elements or context
  4209. elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
  4210. // Nested matchers should use non-integer dirruns
  4211. dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.E);
  4212. if ( outermost ) {
  4213. outermostContext = context !== document && context;
  4214. cachedruns = superMatcher.el;
  4215. }
  4216. // Add elements passing elementMatchers directly to results
  4217. for ( ; (elem = elems[i]) != null; i++ ) {
  4218. if ( byElement && elem ) {
  4219. for ( j = 0; (matcher = elementMatchers[j]); j++ ) {
  4220. if ( matcher( elem, context, xml ) ) {
  4221. results.push( elem );
  4222. break;
  4223. }
  4224. }
  4225. if ( outermost ) {
  4226. dirruns = dirrunsUnique;
  4227. cachedruns = ++superMatcher.el;
  4228. }
  4229. }
  4230. // Track unmatched elements for set filters
  4231. if ( bySet ) {
  4232. // They will have gone through all possible matchers
  4233. if ( (elem = !matcher && elem) ) {
  4234. matchedCount--;
  4235. }
  4236. // Lengthen the array for every element, matched or not
  4237. if ( seed ) {
  4238. unmatched.push( elem );
  4239. }
  4240. }
  4241. }
  4242. // Apply set filters to unmatched elements
  4243. matchedCount += i;
  4244. if ( bySet && i !== matchedCount ) {
  4245. for ( j = 0; (matcher = setMatchers[j]); j++ ) {
  4246. matcher( unmatched, setMatched, context, xml );
  4247. }
  4248. if ( seed ) {
  4249. // Reintegrate element matches to eliminate the need for sorting
  4250. if ( matchedCount > 0 ) {
  4251. while ( i-- ) {
  4252. if ( !(unmatched[i] || setMatched[i]) ) {
  4253. setMatched[i] = pop.call( results );
  4254. }
  4255. }
  4256. }
  4257. // Discard index placeholder values to get only actual matches
  4258. setMatched = condense( setMatched );
  4259. }
  4260. // Add matches to results
  4261. push.apply( results, setMatched );
  4262. // Seedless set matches succeeding multiple successful matchers stipulate sorting
  4263. if ( outermost && !seed && setMatched.length > 0 &&
  4264. ( matchedCount + setMatchers.length ) > 1 ) {
  4265. Sizzle.uniqueSort( results );
  4266. }
  4267. }
  4268. // Override manipulation of globals by nested matchers
  4269. if ( outermost ) {
  4270. dirruns = dirrunsUnique;
  4271. outermostContext = contextBackup;
  4272. }
  4273. return unmatched;
  4274. };
  4275. superMatcher.el = 0;
  4276. return bySet ?
  4277. markFunction( superMatcher ) :
  4278. superMatcher;
  4279. }
  4280. compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
  4281. var i,
  4282. setMatchers = [],
  4283. elementMatchers = [],
  4284. cached = compilerCache[ expando ][ selector + " " ];
  4285. if ( !cached ) {
  4286. // Generate a function of recursive functions that can be used to check each element
  4287. if ( !group ) {
  4288. group = tokenize( selector );
  4289. }
  4290. i = group.length;
  4291. while ( i-- ) {
  4292. cached = matcherFromTokens( group[i] );
  4293. if ( cached[ expando ] ) {
  4294. setMatchers.push( cached );
  4295. } else {
  4296. elementMatchers.push( cached );
  4297. }
  4298. }
  4299. // Cache the compiled function
  4300. cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
  4301. }
  4302. return cached;
  4303. };
  4304. function multipleContexts( selector, contexts, results ) {
  4305. var i = 0,
  4306. len = contexts.length;
  4307. for ( ; i < len; i++ ) {
  4308. Sizzle( selector, contexts[i], results );
  4309. }
  4310. return results;
  4311. }
  4312. function select( selector, context, results, seed, xml ) {
  4313. var i, tokens, token, type, find,
  4314. match = tokenize( selector ),
  4315. j = match.length;
  4316. if ( !seed ) {
  4317. // Try to minimize operations if there is only one group
  4318. if ( match.length === 1 ) {
  4319. // Take a shortcut and set the context if the root selector is an ID
  4320. tokens = match[0] = match[0].slice( 0 );
  4321. if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
  4322. context.nodeType === 9 && !xml &&
  4323. Expr.relative[ tokens[1].type ] ) {
  4324. context = Expr.find["ID"]( token.matches[0].replace( rbackslash, "" ), context, xml )[0];
  4325. if ( !context ) {
  4326. return results;
  4327. }
  4328. selector = selector.slice( tokens.shift().length );
  4329. }
  4330. // Fetch a seed set for right-to-left matching
  4331. for ( i = matchExpr["POS"].test( selector ) ? -1 : tokens.length - 1; i >= 0; i-- ) {
  4332. token = tokens[i];
  4333. // Abort if we hit a combinator
  4334. if ( Expr.relative[ (type = token.type) ] ) {
  4335. break;
  4336. }
  4337. if ( (find = Expr.find[ type ]) ) {
  4338. // Search, expanding context for leading sibling combinators
  4339. if ( (seed = find(
  4340. token.matches[0].replace( rbackslash, "" ),
  4341. rsibling.test( tokens[0].type ) && context.parentNode || context,
  4342. xml
  4343. )) ) {
  4344. // If seed is empty or no tokens remain, we can return early
  4345. tokens.splice( i, 1 );
  4346. selector = seed.length && tokens.join("");
  4347. if ( !selector ) {
  4348. push.apply( results, slice.call( seed, 0 ) );
  4349. return results;
  4350. }
  4351. break;
  4352. }
  4353. }
  4354. }
  4355. }
  4356. }
  4357. // Compile and execute a filtering function
  4358. // Provide `match` to avoid retokenization if we modified the selector above
  4359. compile( selector, match )(
  4360. seed,
  4361. context,
  4362. xml,
  4363. results,
  4364. rsibling.test( selector )
  4365. );
  4366. return results;
  4367. }
  4368. if ( document.querySelectorAll ) {
  4369. (function() {
  4370. var disconnectedMatch,
  4371. oldSelect = select,
  4372. rescape = /'|\\/g,
  4373. rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
  4374. // qSa(:focus) reports false when true (Chrome 21), no need to also add to buggyMatches since matches checks buggyQSA
  4375. // A support test would require too much code (would include document ready)
  4376. rbuggyQSA = [ ":focus" ],
  4377. // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
  4378. // A support test would require too much code (would include document ready)
  4379. // just skip matchesSelector for :active
  4380. rbuggyMatches = [ ":active" ],
  4381. matches = docElem.matchesSelector ||
  4382. docElem.mozMatchesSelector ||
  4383. docElem.webkitMatchesSelector ||
  4384. docElem.oMatchesSelector ||
  4385. docElem.msMatchesSelector;
  4386. // Build QSA regex
  4387. // Regex strategy adopted from Diego Perini
  4388. assert(function( div ) {
  4389. // Select is set to empty string on purpose
  4390. // This is to test IE's treatment of not explictly
  4391. // setting a boolean content attribute,
  4392. // since its presence should be enough
  4393. // http://bugs.jquery.com/ticket/12359
  4394. div.innerHTML = "<select><option selected=''></option></select>";
  4395. // IE8 - Some boolean attributes are not treated correctly
  4396. if ( !div.querySelectorAll("[selected]").length ) {
  4397. rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );
  4398. }
  4399. // Webkit/Opera - :checked should return selected option elements
  4400. // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
  4401. // IE8 throws error here (do not put tests after this one)
  4402. if ( !div.querySelectorAll(":checked").length ) {
  4403. rbuggyQSA.push(":checked");
  4404. }
  4405. });
  4406. assert(function( div ) {
  4407. // Opera 10-12/IE9 - ^= $= *= and empty values
  4408. // Should not select anything
  4409. div.innerHTML = "<p test=''></p>";
  4410. if ( div.querySelectorAll("[test^='']").length ) {
  4411. rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );
  4412. }
  4413. // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
  4414. // IE8 throws error here (do not put tests after this one)
  4415. div.innerHTML = "<input type='hidden'/>";
  4416. if ( !div.querySelectorAll(":enabled").length ) {
  4417. rbuggyQSA.push(":enabled", ":disabled");
  4418. }
  4419. });
  4420. // rbuggyQSA always contains :focus, so no need for a length check
  4421. rbuggyQSA = /* rbuggyQSA.length && */ new RegExp( rbuggyQSA.join("|") );
  4422. select = function( selector, context, results, seed, xml ) {
  4423. // Only use querySelectorAll when not filtering,
  4424. // when this is not xml,
  4425. // and when no QSA bugs apply
  4426. if ( !seed && !xml && !rbuggyQSA.test( selector ) ) {
  4427. var groups, i,
  4428. old = true,
  4429. nid = expando,
  4430. newContext = context,
  4431. newSelector = context.nodeType === 9 && selector;
  4432. // qSA works strangely on Element-rooted queries
  4433. // We can work around this by specifying an extra ID on the root
  4434. // and working up from there (Thanks to Andrew Dupont for the technique)
  4435. // IE 8 doesn't work on object elements
  4436. if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
  4437. groups = tokenize( selector );
  4438. if ( (old = context.getAttribute("id")) ) {
  4439. nid = old.replace( rescape, "\\$&" );
  4440. } else {
  4441. context.setAttribute( "id", nid );
  4442. }
  4443. nid = "[id='" + nid + "'] ";
  4444. i = groups.length;
  4445. while ( i-- ) {
  4446. groups[i] = nid + groups[i].join("");
  4447. }
  4448. newContext = rsibling.test( selector ) && context.parentNode || context;
  4449. newSelector = groups.join(",");
  4450. }
  4451. if ( newSelector ) {
  4452. try {
  4453. push.apply( results, slice.call( newContext.querySelectorAll(
  4454. newSelector
  4455. ), 0 ) );
  4456. return results;
  4457. } catch(qsaError) {
  4458. } finally {
  4459. if ( !old ) {
  4460. context.removeAttribute("id");
  4461. }
  4462. }
  4463. }
  4464. }
  4465. return oldSelect( selector, context, results, seed, xml );
  4466. };
  4467. if ( matches ) {
  4468. assert(function( div ) {
  4469. // Check to see if it's possible to do matchesSelector
  4470. // on a disconnected node (IE 9)
  4471. disconnectedMatch = matches.call( div, "div" );
  4472. // This should fail with an exception
  4473. // Gecko does not error, returns false instead
  4474. try {
  4475. matches.call( div, "[test!='']:sizzle" );
  4476. rbuggyMatches.push( "!=", pseudos );
  4477. } catch ( e ) {}
  4478. });
  4479. // rbuggyMatches always contains :active and :focus, so no need for a length check
  4480. rbuggyMatches = /* rbuggyMatches.length && */ new RegExp( rbuggyMatches.join("|") );
  4481. Sizzle.matchesSelector = function( elem, expr ) {
  4482. // Make sure that attribute selectors are quoted
  4483. expr = expr.replace( rattributeQuotes, "='$1']" );
  4484. // rbuggyMatches always contains :active, so no need for an existence check
  4485. if ( !isXML( elem ) && !rbuggyMatches.test( expr ) && !rbuggyQSA.test( expr ) ) {
  4486. try {
  4487. var ret = matches.call( elem, expr );
  4488. // IE 9's matchesSelector returns false on disconnected nodes
  4489. if ( ret || disconnectedMatch ||
  4490. // As well, disconnected nodes are said to be in a document
  4491. // fragment in IE 9
  4492. elem.document && elem.document.nodeType !== 11 ) {
  4493. return ret;
  4494. }
  4495. } catch(e) {}
  4496. }
  4497. return Sizzle( expr, null, null, [ elem ] ).length > 0;
  4498. };
  4499. }
  4500. })();
  4501. }
  4502. // Deprecated
  4503. Expr.pseudos["nth"] = Expr.pseudos["eq"];
  4504. // Back-compat
  4505. function setFilters() {}
  4506. Expr.filters = setFilters.prototype = Expr.pseudos;
  4507. Expr.setFilters = new setFilters();
  4508. // Override sizzle attribute retrieval
  4509. Sizzle.attr = jQuery.attr;
  4510. jQuery.find = Sizzle;
  4511. jQuery.expr = Sizzle.selectors;
  4512. jQuery.expr[":"] = jQuery.expr.pseudos;
  4513. jQuery.unique = Sizzle.uniqueSort;
  4514. jQuery.text = Sizzle.getText;
  4515. jQuery.isXMLDoc = Sizzle.isXML;
  4516. jQuery.contains = Sizzle.contains;
  4517. })( window );
  4518. var runtil = /Until$/,
  4519. rparentsprev = /^(?:parents|prev(?:Until|All))/,
  4520. isSimple = /^.[^:#\[\.,]*$/,
  4521. rneedsContext = jQuery.expr.match.needsContext,
  4522. // methods guaranteed to produce a unique set when starting from a unique set
  4523. guaranteedUnique = {
  4524. children: true,
  4525. contents: true,
  4526. next: true,
  4527. prev: true
  4528. };
  4529. jQuery.fn.extend({
  4530. find: function( selector ) {
  4531. var i, l, length, n, r, ret,
  4532. self = this;
  4533. if ( typeof selector !== "string" ) {
  4534. return jQuery( selector ).filter(function() {
  4535. for ( i = 0, l = self.length; i < l; i++ ) {
  4536. if ( jQuery.contains( self[ i ], this ) ) {
  4537. return true;
  4538. }
  4539. }
  4540. });
  4541. }
  4542. ret = this.pushStack( "", "find", selector );
  4543. for ( i = 0, l = this.length; i < l; i++ ) {
  4544. length = ret.length;
  4545. jQuery.find( selector, this[i], ret );
  4546. if ( i > 0 ) {
  4547. // Make sure that the results are unique
  4548. for ( n = length; n < ret.length; n++ ) {
  4549. for ( r = 0; r < length; r++ ) {
  4550. if ( ret[r] === ret[n] ) {
  4551. ret.splice(n--, 1);
  4552. break;
  4553. }
  4554. }
  4555. }
  4556. }
  4557. }
  4558. return ret;
  4559. },
  4560. has: function( target ) {
  4561. var i,
  4562. targets = jQuery( target, this ),
  4563. len = targets.length;
  4564. return this.filter(function() {
  4565. for ( i = 0; i < len; i++ ) {
  4566. if ( jQuery.contains( this, targets[i] ) ) {
  4567. return true;
  4568. }
  4569. }
  4570. });
  4571. },
  4572. not: function( selector ) {
  4573. return this.pushStack( winnow(this, selector, false), "not", selector);
  4574. },
  4575. filter: function( selector ) {
  4576. return this.pushStack( winnow(this, selector, true), "filter", selector );
  4577. },
  4578. is: function( selector ) {
  4579. return !!selector && (
  4580. typeof selector === "string" ?
  4581. // If this is a positional/relative selector, check membership in the returned set
  4582. // so $("p:first").is("p:last") won't return true for a doc with two "p".
  4583. rneedsContext.test( selector ) ?
  4584. jQuery( selector, this.context ).index( this[0] ) >= 0 :
  4585. jQuery.filter( selector, this ).length > 0 :
  4586. this.filter( selector ).length > 0 );
  4587. },
  4588. closest: function( selectors, context ) {
  4589. var cur,
  4590. i = 0,
  4591. l = this.length,
  4592. ret = [],
  4593. pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
  4594. jQuery( selectors, context || this.context ) :
  4595. 0;
  4596. for ( ; i < l; i++ ) {
  4597. cur = this[i];
  4598. while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
  4599. if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
  4600. ret.push( cur );
  4601. break;
  4602. }
  4603. cur = cur.parentNode;
  4604. }
  4605. }
  4606. ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
  4607. return this.pushStack( ret, "closest", selectors );
  4608. },
  4609. // Determine the position of an element within
  4610. // the matched set of elements
  4611. index: function( elem ) {
  4612. // No argument, return index in parent
  4613. if ( !elem ) {
  4614. return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
  4615. }
  4616. // index in selector
  4617. if ( typeof elem === "string" ) {
  4618. return jQuery.inArray( this[0], jQuery( elem ) );
  4619. }
  4620. // Locate the position of the desired element
  4621. return jQuery.inArray(
  4622. // If it receives a jQuery object, the first element is used
  4623. elem.jquery ? elem[0] : elem, this );
  4624. },
  4625. add: function( selector, context ) {
  4626. var set = typeof selector === "string" ?
  4627. jQuery( selector, context ) :
  4628. jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
  4629. all = jQuery.merge( this.get(), set );
  4630. return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
  4631. all :
  4632. jQuery.unique( all ) );
  4633. },
  4634. addBack: function( selector ) {
  4635. return this.add( selector == null ?
  4636. this.prevObject : this.prevObject.filter(selector)
  4637. );
  4638. }
  4639. });
  4640. jQuery.fn.andSelf = jQuery.fn.addBack;
  4641. // A painfully simple check to see if an element is disconnected
  4642. // from a document (should be improved, where feasible).
  4643. function isDisconnected( node ) {
  4644. return !node || !node.parentNode || node.parentNode.nodeType === 11;
  4645. }
  4646. function sibling( cur, dir ) {
  4647. do {
  4648. cur = cur[ dir ];
  4649. } while ( cur && cur.nodeType !== 1 );
  4650. return cur;
  4651. }
  4652. jQuery.each({
  4653. parent: function( elem ) {
  4654. var parent = elem.parentNode;
  4655. return parent && parent.nodeType !== 11 ? parent : null;
  4656. },
  4657. parents: function( elem ) {
  4658. return jQuery.dir( elem, "parentNode" );
  4659. },
  4660. parentsUntil: function( elem, i, until ) {
  4661. return jQuery.dir( elem, "parentNode", until );
  4662. },
  4663. next: function( elem ) {
  4664. return sibling( elem, "nextSibling" );
  4665. },
  4666. prev: function( elem ) {
  4667. return sibling( elem, "previousSibling" );
  4668. },
  4669. nextAll: function( elem ) {
  4670. return jQuery.dir( elem, "nextSibling" );
  4671. },
  4672. prevAll: function( elem ) {
  4673. return jQuery.dir( elem, "previousSibling" );
  4674. },
  4675. nextUntil: function( elem, i, until ) {
  4676. return jQuery.dir( elem, "nextSibling", until );
  4677. },
  4678. prevUntil: function( elem, i, until ) {
  4679. return jQuery.dir( elem, "previousSibling", until );
  4680. },
  4681. siblings: function( elem ) {
  4682. return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
  4683. },
  4684. children: function( elem ) {
  4685. return jQuery.sibling( elem.firstChild );
  4686. },
  4687. contents: function( elem ) {
  4688. return jQuery.nodeName( elem, "iframe" ) ?
  4689. elem.contentDocument || elem.contentWindow.document :
  4690. jQuery.merge( [], elem.childNodes );
  4691. }
  4692. }, function( name, fn ) {
  4693. jQuery.fn[ name ] = function( until, selector ) {
  4694. var ret = jQuery.map( this, fn, until );
  4695. if ( !runtil.test( name ) ) {
  4696. selector = until;
  4697. }
  4698. if ( selector && typeof selector === "string" ) {
  4699. ret = jQuery.filter( selector, ret );
  4700. }
  4701. ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
  4702. if ( this.length > 1 && rparentsprev.test( name ) ) {
  4703. ret = ret.reverse();
  4704. }
  4705. return this.pushStack( ret, name, core_slice.call( arguments ).join(",") );
  4706. };
  4707. });
  4708. jQuery.extend({
  4709. filter: function( expr, elems, not ) {
  4710. if ( not ) {
  4711. expr = ":not(" + expr + ")";
  4712. }
  4713. return elems.length === 1 ?
  4714. jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
  4715. jQuery.find.matches(expr, elems);
  4716. },
  4717. dir: function( elem, dir, until ) {
  4718. var matched = [],
  4719. cur = elem[ dir ];
  4720. while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
  4721. if ( cur.nodeType === 1 ) {
  4722. matched.push( cur );
  4723. }
  4724. cur = cur[dir];
  4725. }
  4726. return matched;
  4727. },
  4728. sibling: function( n, elem ) {
  4729. var r = [];
  4730. for ( ; n; n = n.nextSibling ) {
  4731. if ( n.nodeType === 1 && n !== elem ) {
  4732. r.push( n );
  4733. }
  4734. }
  4735. return r;
  4736. }
  4737. });
  4738. // Implement the identical functionality for filter and not
  4739. function winnow( elements, qualifier, keep ) {
  4740. // Can't pass null or undefined to indexOf in Firefox 4
  4741. // Set to 0 to skip string check
  4742. qualifier = qualifier || 0;
  4743. if ( jQuery.isFunction( qualifier ) ) {
  4744. return jQuery.grep(elements, function( elem, i ) {
  4745. var retVal = !!qualifier.call( elem, i, elem );
  4746. return retVal === keep;
  4747. });
  4748. } else if ( qualifier.nodeType ) {
  4749. return jQuery.grep(elements, function( elem, i ) {
  4750. return ( elem === qualifier ) === keep;
  4751. });
  4752. } else if ( typeof qualifier === "string" ) {
  4753. var filtered = jQuery.grep(elements, function( elem ) {
  4754. return elem.nodeType === 1;
  4755. });
  4756. if ( isSimple.test( qualifier ) ) {
  4757. return jQuery.filter(qualifier, filtered, !keep);
  4758. } else {
  4759. qualifier = jQuery.filter( qualifier, filtered );
  4760. }
  4761. }
  4762. return jQuery.grep(elements, function( elem, i ) {
  4763. return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
  4764. });
  4765. }
  4766. function createSafeFragment( document ) {
  4767. var list = nodeNames.split( "|" ),
  4768. safeFrag = document.createDocumentFragment();
  4769. if ( safeFrag.createElement ) {
  4770. while ( list.length ) {
  4771. safeFrag.createElement(
  4772. list.pop()
  4773. );
  4774. }
  4775. }
  4776. return safeFrag;
  4777. }
  4778. var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
  4779. "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
  4780. rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
  4781. rleadingWhitespace = /^\s+/,
  4782. rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
  4783. rtagName = /<([\w:]+)/,
  4784. rtbody = /<tbody/i,
  4785. rhtml = /<|&#?\w+;/,
  4786. rnoInnerhtml = /<(?:script|style|link)/i,
  4787. rnocache = /<(?:script|object|embed|option|style)/i,
  4788. rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
  4789. rcheckableType = /^(?:checkbox|radio)$/,
  4790. // checked="checked" or checked
  4791. rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
  4792. rscriptType = /\/(java|ecma)script/i,
  4793. rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,
  4794. wrapMap = {
  4795. option: [ 1, "<select multiple='multiple'>", "</select>" ],
  4796. legend: [ 1, "<fieldset>", "</fieldset>" ],
  4797. thead: [ 1, "<table>", "</table>" ],
  4798. tr: [ 2, "<table><tbody>", "</tbody></table>" ],
  4799. td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
  4800. col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
  4801. area: [ 1, "<map>", "</map>" ],
  4802. _default: [ 0, "", "" ]
  4803. },
  4804. safeFragment = createSafeFragment( document ),
  4805. fragmentDiv = safeFragment.appendChild( document.createElement("div") );
  4806. wrapMap.optgroup = wrapMap.option;
  4807. wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
  4808. wrapMap.th = wrapMap.td;
  4809. // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
  4810. // unless wrapped in a div with non-breaking characters in front of it.
  4811. if ( !jQuery.support.htmlSerialize ) {
  4812. wrapMap._default = [ 1, "X<div>", "</div>" ];
  4813. }
  4814. jQuery.fn.extend({
  4815. text: function( value ) {
  4816. return jQuery.access( this, function( value ) {
  4817. return value === undefined ?
  4818. jQuery.text( this ) :
  4819. this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
  4820. }, null, value, arguments.length );
  4821. },
  4822. wrapAll: function( html ) {
  4823. if ( jQuery.isFunction( html ) ) {
  4824. return this.each(function(i) {
  4825. jQuery(this).wrapAll( html.call(this, i) );
  4826. });
  4827. }
  4828. if ( this[0] ) {
  4829. // The elements to wrap the target around
  4830. var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
  4831. if ( this[0].parentNode ) {
  4832. wrap.insertBefore( this[0] );
  4833. }
  4834. wrap.map(function() {
  4835. var elem = this;
  4836. while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
  4837. elem = elem.firstChild;
  4838. }
  4839. return elem;
  4840. }).append( this );
  4841. }
  4842. return this;
  4843. },
  4844. wrapInner: function( html ) {
  4845. if ( jQuery.isFunction( html ) ) {
  4846. return this.each(function(i) {
  4847. jQuery(this).wrapInner( html.call(this, i) );
  4848. });
  4849. }
  4850. return this.each(function() {
  4851. var self = jQuery( this ),
  4852. contents = self.contents();
  4853. if ( contents.length ) {
  4854. contents.wrapAll( html );
  4855. } else {
  4856. self.append( html );
  4857. }
  4858. });
  4859. },
  4860. wrap: function( html ) {
  4861. var isFunction = jQuery.isFunction( html );
  4862. return this.each(function(i) {
  4863. jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
  4864. });
  4865. },
  4866. unwrap: function() {
  4867. return this.parent().each(function() {
  4868. if ( !jQuery.nodeName( this, "body" ) ) {
  4869. jQuery( this ).replaceWith( this.childNodes );
  4870. }
  4871. }).end();
  4872. },
  4873. append: function() {
  4874. return this.domManip(arguments, true, function( elem ) {
  4875. if ( this.nodeType === 1 || this.nodeType === 11 ) {
  4876. this.appendChild( elem );
  4877. }
  4878. });
  4879. },
  4880. prepend: function() {
  4881. return this.domManip(arguments, true, function( elem ) {
  4882. if ( this.nodeType === 1 || this.nodeType === 11 ) {
  4883. this.insertBefore( elem, this.firstChild );
  4884. }
  4885. });
  4886. },
  4887. before: function() {
  4888. if ( !isDisconnected( this[0] ) ) {
  4889. return this.domManip(arguments, false, function( elem ) {
  4890. this.parentNode.insertBefore( elem, this );
  4891. });
  4892. }
  4893. if ( arguments.length ) {
  4894. var set = jQuery.clean( arguments );
  4895. return this.pushStack( jQuery.merge( set, this ), "before", this.selector );
  4896. }
  4897. },
  4898. after: function() {
  4899. if ( !isDisconnected( this[0] ) ) {
  4900. return this.domManip(arguments, false, function( elem ) {
  4901. this.parentNode.insertBefore( elem, this.nextSibling );
  4902. });
  4903. }
  4904. if ( arguments.length ) {
  4905. var set = jQuery.clean( arguments );
  4906. return this.pushStack( jQuery.merge( this, set ), "after", this.selector );
  4907. }
  4908. },
  4909. // keepData is for internal use only--do not document
  4910. remove: function( selector, keepData ) {
  4911. var elem,
  4912. i = 0;
  4913. for ( ; (elem = this[i]) != null; i++ ) {
  4914. if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
  4915. if ( !keepData && elem.nodeType === 1 ) {
  4916. jQuery.cleanData( elem.getElementsByTagName("*") );
  4917. jQuery.cleanData( [ elem ] );
  4918. }
  4919. if ( elem.parentNode ) {
  4920. elem.parentNode.removeChild( elem );
  4921. }
  4922. }
  4923. }
  4924. return this;
  4925. },
  4926. empty: function() {
  4927. var elem,
  4928. i = 0;
  4929. for ( ; (elem = this[i]) != null; i++ ) {
  4930. // Remove element nodes and prevent memory leaks
  4931. if ( elem.nodeType === 1 ) {
  4932. jQuery.cleanData( elem.getElementsByTagName("*") );
  4933. }
  4934. // Remove any remaining nodes
  4935. while ( elem.firstChild ) {
  4936. elem.removeChild( elem.firstChild );
  4937. }
  4938. }
  4939. return this;
  4940. },
  4941. clone: function( dataAndEvents, deepDataAndEvents ) {
  4942. dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
  4943. deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
  4944. return this.map( function () {
  4945. return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
  4946. });
  4947. },
  4948. html: function( value ) {
  4949. return jQuery.access( this, function( value ) {
  4950. var elem = this[0] || {},
  4951. i = 0,
  4952. l = this.length;
  4953. if ( value === undefined ) {
  4954. return elem.nodeType === 1 ?
  4955. elem.innerHTML.replace( rinlinejQuery, "" ) :
  4956. undefined;
  4957. }
  4958. // See if we can take a shortcut and just use innerHTML
  4959. if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
  4960. ( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) &&
  4961. ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
  4962. !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
  4963. value = value.replace( rxhtmlTag, "<$1></$2>" );
  4964. try {
  4965. for (; i < l; i++ ) {
  4966. // Remove element nodes and prevent memory leaks
  4967. elem = this[i] || {};
  4968. if ( elem.nodeType === 1 ) {
  4969. jQuery.cleanData( elem.getElementsByTagName( "*" ) );
  4970. elem.innerHTML = value;
  4971. }
  4972. }
  4973. elem = 0;
  4974. // If using innerHTML throws an exception, use the fallback method
  4975. } catch(e) {}
  4976. }
  4977. if ( elem ) {
  4978. this.empty().append( value );
  4979. }
  4980. }, null, value, arguments.length );
  4981. },
  4982. replaceWith: function( value ) {
  4983. if ( !isDisconnected( this[0] ) ) {
  4984. // Make sure that the elements are removed from the DOM before they are inserted
  4985. // this can help fix replacing a parent with child elements
  4986. if ( jQuery.isFunction( value ) ) {
  4987. return this.each(function(i) {
  4988. var self = jQuery(this), old = self.html();
  4989. self.replaceWith( value.call( this, i, old ) );
  4990. });
  4991. }
  4992. if ( typeof value !== "string" ) {
  4993. value = jQuery( value ).detach();
  4994. }
  4995. return this.each(function() {
  4996. var next = this.nextSibling,
  4997. parent = this.parentNode;
  4998. jQuery( this ).remove();
  4999. if ( next ) {
  5000. jQuery(next).before( value );
  5001. } else {
  5002. jQuery(parent).append( value );
  5003. }
  5004. });
  5005. }
  5006. return this.length ?
  5007. this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
  5008. this;
  5009. },
  5010. detach: function( selector ) {
  5011. return this.remove( selector, true );
  5012. },
  5013. domManip: function( args, table, callback ) {
  5014. // Flatten any nested arrays
  5015. args = [].concat.apply( [], args );
  5016. var results, first, fragment, iNoClone,
  5017. i = 0,
  5018. value = args[0],
  5019. scripts = [],
  5020. l = this.length;
  5021. // We can't cloneNode fragments that contain checked, in WebKit
  5022. if ( !jQuery.support.checkClone && l > 1 && typeof value === "string" && rchecked.test( value ) ) {
  5023. return this.each(function() {
  5024. jQuery(this).domManip( args, table, callback );
  5025. });
  5026. }
  5027. if ( jQuery.isFunction(value) ) {
  5028. return this.each(function(i) {
  5029. var self = jQuery(this);
  5030. args[0] = value.call( this, i, table ? self.html() : undefined );
  5031. self.domManip( args, table, callback );
  5032. });
  5033. }
  5034. if ( this[0] ) {
  5035. results = jQuery.buildFragment( args, this, scripts );
  5036. fragment = results.fragment;
  5037. first = fragment.firstChild;
  5038. if ( fragment.childNodes.length === 1 ) {
  5039. fragment = first;
  5040. }
  5041. if ( first ) {
  5042. table = table && jQuery.nodeName( first, "tr" );
  5043. // Use the original fragment for the last item instead of the first because it can end up
  5044. // being emptied incorrectly in certain situations (#8070).
  5045. // Fragments from the fragment cache must always be cloned and never used in place.
  5046. for ( iNoClone = results.cacheable || l - 1; i < l; i++ ) {
  5047. callback.call(
  5048. table && jQuery.nodeName( this[i], "table" ) ?
  5049. findOrAppend( this[i], "tbody" ) :
  5050. this[i],
  5051. i === iNoClone ?
  5052. fragment :
  5053. jQuery.clone( fragment, true, true )
  5054. );
  5055. }
  5056. }
  5057. // Fix #11809: Avoid leaking memory
  5058. fragment = first = null;
  5059. if ( scripts.length ) {
  5060. jQuery.each( scripts, function( i, elem ) {
  5061. if ( elem.src ) {
  5062. if ( jQuery.ajax ) {
  5063. jQuery.ajax({
  5064. url: elem.src,
  5065. type: "GET",
  5066. dataType: "script",
  5067. async: false,
  5068. global: false,
  5069. "throws": true
  5070. });
  5071. } else {
  5072. jQuery.error("no ajax");
  5073. }
  5074. } else {
  5075. jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "" ) );
  5076. }
  5077. if ( elem.parentNode ) {
  5078. elem.parentNode.removeChild( elem );
  5079. }
  5080. });
  5081. }
  5082. }
  5083. return this;
  5084. }
  5085. });
  5086. function findOrAppend( elem, tag ) {
  5087. return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
  5088. }
  5089. function cloneCopyEvent( src, dest ) {
  5090. if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
  5091. return;
  5092. }
  5093. var type, i, l,
  5094. oldData = jQuery._data( src ),
  5095. curData = jQuery._data( dest, oldData ),
  5096. events = oldData.events;
  5097. if ( events ) {
  5098. delete curData.handle;
  5099. curData.events = {};
  5100. for ( type in events ) {
  5101. for ( i = 0, l = events[ type ].length; i < l; i++ ) {
  5102. jQuery.event.add( dest, type, events[ type ][ i ] );
  5103. }
  5104. }
  5105. }
  5106. // make the cloned public data object a copy from the original
  5107. if ( curData.data ) {
  5108. curData.data = jQuery.extend( {}, curData.data );
  5109. }
  5110. }
  5111. function cloneFixAttributes( src, dest ) {
  5112. var nodeName;
  5113. // We do not need to do anything for non-Elements
  5114. if ( dest.nodeType !== 1 ) {
  5115. return;
  5116. }
  5117. // clearAttributes removes the attributes, which we don't want,
  5118. // but also removes the attachEvent events, which we *do* want
  5119. if ( dest.clearAttributes ) {
  5120. dest.clearAttributes();
  5121. }
  5122. // mergeAttributes, in contrast, only merges back on the
  5123. // original attributes, not the events
  5124. if ( dest.mergeAttributes ) {
  5125. dest.mergeAttributes( src );
  5126. }
  5127. nodeName = dest.nodeName.toLowerCase();
  5128. if ( nodeName === "object" ) {
  5129. // IE6-10 improperly clones children of object elements using classid.
  5130. // IE10 throws NoModificationAllowedError if parent is null, #12132.
  5131. if ( dest.parentNode ) {
  5132. dest.outerHTML = src.outerHTML;
  5133. }
  5134. // This path appears unavoidable for IE9. When cloning an object
  5135. // element in IE9, the outerHTML strategy above is not sufficient.
  5136. // If the src has innerHTML and the destination does not,
  5137. // copy the src.innerHTML into the dest.innerHTML. #10324
  5138. if ( jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML)) ) {
  5139. dest.innerHTML = src.innerHTML;
  5140. }
  5141. } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
  5142. // IE6-8 fails to persist the checked state of a cloned checkbox
  5143. // or radio button. Worse, IE6-7 fail to give the cloned element
  5144. // a checked appearance if the defaultChecked value isn't also set
  5145. dest.defaultChecked = dest.checked = src.checked;
  5146. // IE6-7 get confused and end up setting the value of a cloned
  5147. // checkbox/radio button to an empty string instead of "on"
  5148. if ( dest.value !== src.value ) {
  5149. dest.value = src.value;
  5150. }
  5151. // IE6-8 fails to return the selected option to the default selected
  5152. // state when cloning options
  5153. } else if ( nodeName === "option" ) {
  5154. dest.selected = src.defaultSelected;
  5155. // IE6-8 fails to set the defaultValue to the correct value when
  5156. // cloning other types of input fields
  5157. } else if ( nodeName === "input" || nodeName === "textarea" ) {
  5158. dest.defaultValue = src.defaultValue;
  5159. // IE blanks contents when cloning scripts
  5160. } else if ( nodeName === "script" && dest.text !== src.text ) {
  5161. dest.text = src.text;
  5162. }
  5163. // Event data gets referenced instead of copied if the expando
  5164. // gets copied too
  5165. dest.removeAttribute( jQuery.expando );
  5166. }
  5167. jQuery.buildFragment = function( args, context, scripts ) {
  5168. var fragment, cacheable, cachehit,
  5169. first = args[ 0 ];
  5170. // Set context from what may come in as undefined or a jQuery collection or a node
  5171. // Updated to fix #12266 where accessing context[0] could throw an exception in IE9/10 &
  5172. // also doubles as fix for #8950 where plain objects caused createDocumentFragment exception
  5173. context = context || document;
  5174. context = !context.nodeType && context[0] || context;
  5175. context = context.ownerDocument || context;
  5176. // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
  5177. // Cloning options loses the selected state, so don't cache them
  5178. // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
  5179. // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
  5180. // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
  5181. if ( args.length === 1 && typeof first === "string" && first.length < 512 && context === document &&
  5182. first.charAt(0) === "<" && !rnocache.test( first ) &&
  5183. (jQuery.support.checkClone || !rchecked.test( first )) &&
  5184. (jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
  5185. // Mark cacheable and look for a hit
  5186. cacheable = true;
  5187. fragment = jQuery.fragments[ first ];
  5188. cachehit = fragment !== undefined;
  5189. }
  5190. if ( !fragment ) {
  5191. fragment = context.createDocumentFragment();
  5192. jQuery.clean( args, context, fragment, scripts );
  5193. // Update the cache, but only store false
  5194. // unless this is a second parsing of the same content
  5195. if ( cacheable ) {
  5196. jQuery.fragments[ first ] = cachehit && fragment;
  5197. }
  5198. }
  5199. return { fragment: fragment, cacheable: cacheable };
  5200. };
  5201. jQuery.fragments = {};
  5202. jQuery.each({
  5203. appendTo: "append",
  5204. prependTo: "prepend",
  5205. insertBefore: "before",
  5206. insertAfter: "after",
  5207. replaceAll: "replaceWith"
  5208. }, function( name, original ) {
  5209. jQuery.fn[ name ] = function( selector ) {
  5210. var elems,
  5211. i = 0,
  5212. ret = [],
  5213. insert = jQuery( selector ),
  5214. l = insert.length,
  5215. parent = this.length === 1 && this[0].parentNode;
  5216. if ( (parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && l === 1 ) {
  5217. insert[ original ]( this[0] );
  5218. return this;
  5219. } else {
  5220. for ( ; i < l; i++ ) {
  5221. elems = ( i > 0 ? this.clone(true) : this ).get();
  5222. jQuery( insert[i] )[ original ]( elems );
  5223. ret = ret.concat( elems );
  5224. }
  5225. return this.pushStack( ret, name, insert.selector );
  5226. }
  5227. };
  5228. });
  5229. function getAll( elem ) {
  5230. if ( typeof elem.getElementsByTagName !== "undefined" ) {
  5231. return elem.getElementsByTagName( "*" );
  5232. } else if ( typeof elem.querySelectorAll !== "undefined" ) {
  5233. return elem.querySelectorAll( "*" );
  5234. } else {
  5235. return [];
  5236. }
  5237. }
  5238. // Used in clean, fixes the defaultChecked property
  5239. function fixDefaultChecked( elem ) {
  5240. if ( rcheckableType.test( elem.type ) ) {
  5241. elem.defaultChecked = elem.checked;
  5242. }
  5243. }
  5244. jQuery.extend({
  5245. clone: function( elem, dataAndEvents, deepDataAndEvents ) {
  5246. var srcElements,
  5247. destElements,
  5248. i,
  5249. clone;
  5250. if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
  5251. clone = elem.cloneNode( true );
  5252. // IE<=8 does not properly clone detached, unknown element nodes
  5253. } else {
  5254. fragmentDiv.innerHTML = elem.outerHTML;
  5255. fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
  5256. }
  5257. if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
  5258. (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
  5259. // IE copies events bound via attachEvent when using cloneNode.
  5260. // Calling detachEvent on the clone will also remove the events
  5261. // from the original. In order to get around this, we use some
  5262. // proprietary methods to clear the events. Thanks to MooTools
  5263. // guys for this hotness.
  5264. cloneFixAttributes( elem, clone );
  5265. // Using Sizzle here is crazy slow, so we use getElementsByTagName instead
  5266. srcElements = getAll( elem );
  5267. destElements = getAll( clone );
  5268. // Weird iteration because IE will replace the length property
  5269. // with an element if you are cloning the body and one of the
  5270. // elements on the page has a name or id of "length"
  5271. for ( i = 0; srcElements[i]; ++i ) {
  5272. // Ensure that the destination node is not null; Fixes #9587
  5273. if ( destElements[i] ) {
  5274. cloneFixAttributes( srcElements[i], destElements[i] );
  5275. }
  5276. }
  5277. }
  5278. // Copy the events from the original to the clone
  5279. if ( dataAndEvents ) {
  5280. cloneCopyEvent( elem, clone );
  5281. if ( deepDataAndEvents ) {
  5282. srcElements = getAll( elem );
  5283. destElements = getAll( clone );
  5284. for ( i = 0; srcElements[i]; ++i ) {
  5285. cloneCopyEvent( srcElements[i], destElements[i] );
  5286. }
  5287. }
  5288. }
  5289. srcElements = destElements = null;
  5290. // Return the cloned set
  5291. return clone;
  5292. },
  5293. clean: function( elems, context, fragment, scripts ) {
  5294. var i, j, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags,
  5295. safe = context === document && safeFragment,
  5296. ret = [];
  5297. // Ensure that context is a document
  5298. if ( !context || typeof context.createDocumentFragment === "undefined" ) {
  5299. context = document;
  5300. }
  5301. // Use the already-created safe fragment if context permits
  5302. for ( i = 0; (elem = elems[i]) != null; i++ ) {
  5303. if ( typeof elem === "number" ) {
  5304. elem += "";
  5305. }
  5306. if ( !elem ) {
  5307. continue;
  5308. }
  5309. // Convert html string into DOM nodes
  5310. if ( typeof elem === "string" ) {
  5311. if ( !rhtml.test( elem ) ) {
  5312. elem = context.createTextNode( elem );
  5313. } else {
  5314. // Ensure a safe container in which to render the html
  5315. safe = safe || createSafeFragment( context );
  5316. div = context.createElement("div");
  5317. safe.appendChild( div );
  5318. // Fix "XHTML"-style tags in all browsers
  5319. elem = elem.replace(rxhtmlTag, "<$1></$2>");
  5320. // Go to html and back, then peel off extra wrappers
  5321. tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
  5322. wrap = wrapMap[ tag ] || wrapMap._default;
  5323. depth = wrap[0];
  5324. div.innerHTML = wrap[1] + elem + wrap[2];
  5325. // Move to the right depth
  5326. while ( depth-- ) {
  5327. div = div.lastChild;
  5328. }
  5329. // Remove IE's autoinserted <tbody> from table fragments
  5330. if ( !jQuery.support.tbody ) {
  5331. // String was a <table>, *may* have spurious <tbody>
  5332. hasBody = rtbody.test(elem);
  5333. tbody = tag === "table" && !hasBody ?
  5334. div.firstChild && div.firstChild.childNodes :
  5335. // String was a bare <thead> or <tfoot>
  5336. wrap[1] === "<table>" && !hasBody ?
  5337. div.childNodes :
  5338. [];
  5339. for ( j = tbody.length - 1; j >= 0 ; --j ) {
  5340. if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
  5341. tbody[ j ].parentNode.removeChild( tbody[ j ] );
  5342. }
  5343. }
  5344. }
  5345. // IE completely kills leading whitespace when innerHTML is used
  5346. if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
  5347. div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
  5348. }
  5349. elem = div.childNodes;
  5350. // Take out of fragment container (we need a fresh div each time)
  5351. div.parentNode.removeChild( div );
  5352. }
  5353. }
  5354. if ( elem.nodeType ) {
  5355. ret.push( elem );
  5356. } else {
  5357. jQuery.merge( ret, elem );
  5358. }
  5359. }
  5360. // Fix #11356: Clear elements from safeFragment
  5361. if ( div ) {
  5362. elem = div = safe = null;
  5363. }
  5364. // Reset defaultChecked for any radios and checkboxes
  5365. // about to be appended to the DOM in IE 6/7 (#8060)
  5366. if ( !jQuery.support.appendChecked ) {
  5367. for ( i = 0; (elem = ret[i]) != null; i++ ) {
  5368. if ( jQuery.nodeName( elem, "input" ) ) {
  5369. fixDefaultChecked( elem );
  5370. } else if ( typeof elem.getElementsByTagName !== "undefined" ) {
  5371. jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
  5372. }
  5373. }
  5374. }
  5375. // Append elements to a provided document fragment
  5376. if ( fragment ) {
  5377. // Special handling of each script element
  5378. handleScript = function( elem ) {
  5379. // Check if we consider it executable
  5380. if ( !elem.type || rscriptType.test( elem.type ) ) {
  5381. // Detach the script and store it in the scripts array (if provided) or the fragment
  5382. // Return truthy to indicate that it has been handled
  5383. return scripts ?
  5384. scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
  5385. fragment.appendChild( elem );
  5386. }
  5387. };
  5388. for ( i = 0; (elem = ret[i]) != null; i++ ) {
  5389. // Check if we're done after handling an executable script
  5390. if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
  5391. // Append to fragment and handle embedded scripts
  5392. fragment.appendChild( elem );
  5393. if ( typeof elem.getElementsByTagName !== "undefined" ) {
  5394. // handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
  5395. jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
  5396. // Splice the scripts into ret after their former ancestor and advance our index beyond them
  5397. ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
  5398. i += jsTags.length;
  5399. }
  5400. }
  5401. }
  5402. }
  5403. return ret;
  5404. },
  5405. cleanData: function( elems, /* internal */ acceptData ) {
  5406. var data, id, elem, type,
  5407. i = 0,
  5408. internalKey = jQuery.expando,
  5409. cache = jQuery.cache,
  5410. deleteExpando = jQuery.support.deleteExpando,
  5411. special = jQuery.event.special;
  5412. for ( ; (elem = elems[i]) != null; i++ ) {
  5413. if ( acceptData || jQuery.acceptData( elem ) ) {
  5414. id = elem[ internalKey ];
  5415. data = id && cache[ id ];
  5416. if ( data ) {
  5417. if ( data.events ) {
  5418. for ( type in data.events ) {
  5419. if ( special[ type ] ) {
  5420. jQuery.event.remove( elem, type );
  5421. // This is a shortcut to avoid jQuery.event.remove's overhead
  5422. } else {
  5423. jQuery.removeEvent( elem, type, data.handle );
  5424. }
  5425. }
  5426. }
  5427. // Remove cache only if it was not already removed by jQuery.event.remove
  5428. if ( cache[ id ] ) {
  5429. delete cache[ id ];
  5430. // IE does not allow us to delete expando properties from nodes,
  5431. // nor does it have a removeAttribute function on Document nodes;
  5432. // we must handle all of these cases
  5433. if ( deleteExpando ) {
  5434. delete elem[ internalKey ];
  5435. } else if ( elem.removeAttribute ) {
  5436. elem.removeAttribute( internalKey );
  5437. } else {
  5438. elem[ internalKey ] = null;
  5439. }
  5440. jQuery.deletedIds.push( id );
  5441. }
  5442. }
  5443. }
  5444. }
  5445. }
  5446. });
  5447. // Limit scope pollution from any deprecated API
  5448. (function() {
  5449. var matched, browser;
  5450. // Use of jQuery.browser is frowned upon.
  5451. // More details: http://api.jquery.com/jQuery.browser
  5452. // jQuery.uaMatch maintained for back-compat
  5453. jQuery.uaMatch = function( ua ) {
  5454. ua = ua.toLowerCase();
  5455. var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
  5456. /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
  5457. /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
  5458. /(msie) ([\w.]+)/.exec( ua ) ||
  5459. ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
  5460. [];
  5461. return {
  5462. browser: match[ 1 ] || "",
  5463. version: match[ 2 ] || "0"
  5464. };
  5465. };
  5466. matched = jQuery.uaMatch( navigator.userAgent );
  5467. browser = {};
  5468. if ( matched.browser ) {
  5469. browser[ matched.browser ] = true;
  5470. browser.version = matched.version;
  5471. }
  5472. // Chrome is Webkit, but Webkit is also Safari.
  5473. if ( browser.chrome ) {
  5474. browser.webkit = true;
  5475. } else if ( browser.webkit ) {
  5476. browser.safari = true;
  5477. }
  5478. jQuery.browser = browser;
  5479. jQuery.sub = function() {
  5480. function jQuerySub( selector, context ) {
  5481. return new jQuerySub.fn.init( selector, context );
  5482. }
  5483. jQuery.extend( true, jQuerySub, this );
  5484. jQuerySub.superclass = this;
  5485. jQuerySub.fn = jQuerySub.prototype = this();
  5486. jQuerySub.fn.constructor = jQuerySub;
  5487. jQuerySub.sub = this.sub;
  5488. jQuerySub.fn.init = function init( selector, context ) {
  5489. if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
  5490. context = jQuerySub( context );
  5491. }
  5492. return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
  5493. };
  5494. jQuerySub.fn.init.prototype = jQuerySub.fn;
  5495. var rootjQuerySub = jQuerySub(document);
  5496. return jQuerySub;
  5497. };
  5498. })();
  5499. var curCSS, iframe, iframeDoc,
  5500. ralpha = /alpha\([^)]*\)/i,
  5501. ropacity = /opacity=([^)]*)/,
  5502. rposition = /^(top|right|bottom|left)$/,
  5503. // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
  5504. // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
  5505. rdisplayswap = /^(none|table(?!-c[ea]).+)/,
  5506. rmargin = /^margin/,
  5507. rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
  5508. rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
  5509. rrelNum = new RegExp( "^([-+])=(" + core_pnum + ")", "i" ),
  5510. elemdisplay = { BODY: "block" },
  5511. cssShow = { position: "absolute", visibility: "hidden", display: "block" },
  5512. cssNormalTransform = {
  5513. letterSpacing: 0,
  5514. fontWeight: 400
  5515. },
  5516. cssExpand = [ "Top", "Right", "Bottom", "Left" ],
  5517. cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
  5518. eventsToggle = jQuery.fn.toggle;
  5519. // return a css property mapped to a potentially vendor prefixed property
  5520. function vendorPropName( style, name ) {
  5521. // shortcut for names that are not vendor prefixed
  5522. if ( name in style ) {
  5523. return name;
  5524. }
  5525. // check for vendor prefixed names
  5526. var capName = name.charAt(0).toUpperCase() + name.slice(1),
  5527. origName = name,
  5528. i = cssPrefixes.length;
  5529. while ( i-- ) {
  5530. name = cssPrefixes[ i ] + capName;
  5531. if ( name in style ) {
  5532. return name;
  5533. }
  5534. }
  5535. return origName;
  5536. }
  5537. function isHidden( elem, el ) {
  5538. elem = el || elem;
  5539. return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
  5540. }
  5541. function showHide( elements, show ) {
  5542. var elem, display,
  5543. values = [],
  5544. index = 0,
  5545. length = elements.length;
  5546. for ( ; index < length; index++ ) {
  5547. elem = elements[ index ];
  5548. if ( !elem.style ) {
  5549. continue;
  5550. }
  5551. values[ index ] = jQuery._data( elem, "olddisplay" );
  5552. if ( show ) {
  5553. // Reset the inline display of this element to learn if it is
  5554. // being hidden by cascaded rules or not
  5555. if ( !values[ index ] && elem.style.display === "none" ) {
  5556. elem.style.display = "";
  5557. }
  5558. // Set elements which have been overridden with display: none
  5559. // in a stylesheet to whatever the default browser style is
  5560. // for such an element
  5561. if ( elem.style.display === "" && isHidden( elem ) ) {
  5562. values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
  5563. }
  5564. } else {
  5565. display = curCSS( elem, "display" );
  5566. if ( !values[ index ] && display !== "none" ) {
  5567. jQuery._data( elem, "olddisplay", display );
  5568. }
  5569. }
  5570. }
  5571. // Set the display of most of the elements in a second loop
  5572. // to avoid the constant reflow
  5573. for ( index = 0; index < length; index++ ) {
  5574. elem = elements[ index ];
  5575. if ( !elem.style ) {
  5576. continue;
  5577. }
  5578. if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
  5579. elem.style.display = show ? values[ index ] || "" : "none";
  5580. }
  5581. }
  5582. return elements;
  5583. }
  5584. jQuery.fn.extend({
  5585. css: function( name, value ) {
  5586. return jQuery.access( this, function( elem, name, value ) {
  5587. return value !== undefined ?
  5588. jQuery.style( elem, name, value ) :
  5589. jQuery.css( elem, name );
  5590. }, name, value, arguments.length > 1 );
  5591. },
  5592. show: function() {
  5593. return showHide( this, true );
  5594. },
  5595. hide: function() {
  5596. return showHide( this );
  5597. },
  5598. toggle: function( state, fn2 ) {
  5599. var bool = typeof state === "boolean";
  5600. if ( jQuery.isFunction( state ) && jQuery.isFunction( fn2 ) ) {
  5601. return eventsToggle.apply( this, arguments );
  5602. }
  5603. return this.each(function() {
  5604. if ( bool ? state : isHidden( this ) ) {
  5605. jQuery( this ).show();
  5606. } else {
  5607. jQuery( this ).hide();
  5608. }
  5609. });
  5610. }
  5611. });
  5612. jQuery.extend({
  5613. // Add in style property hooks for overriding the default
  5614. // behavior of getting and setting a style property
  5615. cssHooks: {
  5616. opacity: {
  5617. get: function( elem, computed ) {
  5618. if ( computed ) {
  5619. // We should always get a number back from opacity
  5620. var ret = curCSS( elem, "opacity" );
  5621. return ret === "" ? "1" : ret;
  5622. }
  5623. }
  5624. }
  5625. },
  5626. // Exclude the following css properties to add px
  5627. cssNumber: {
  5628. "fillOpacity": true,
  5629. "fontWeight": true,
  5630. "lineHeight": true,
  5631. "opacity": true,
  5632. "orphans": true,
  5633. "widows": true,
  5634. "zIndex": true,
  5635. "zoom": true
  5636. },
  5637. // Add in properties whose names you wish to fix before
  5638. // setting or getting the value
  5639. cssProps: {
  5640. // normalize float css property
  5641. "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
  5642. },
  5643. // Get and set the style property on a DOM Node
  5644. style: function( elem, name, value, extra ) {
  5645. // Don't set styles on text and comment nodes
  5646. if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
  5647. return;
  5648. }
  5649. // Make sure that we're working with the right name
  5650. var ret, type, hooks,
  5651. origName = jQuery.camelCase( name ),
  5652. style = elem.style;
  5653. name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
  5654. // gets hook for the prefixed version
  5655. // followed by the unprefixed version
  5656. hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
  5657. // Check if we're setting a value
  5658. if ( value !== undefined ) {
  5659. type = typeof value;
  5660. // convert relative number strings (+= or -=) to relative numbers. #7345
  5661. if ( type === "string" && (ret = rrelNum.exec( value )) ) {
  5662. value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
  5663. // Fixes bug #9237
  5664. type = "number";
  5665. }
  5666. // Make sure that NaN and null values aren't set. See: #7116
  5667. if ( value == null || type === "number" && isNaN( value ) ) {
  5668. return;
  5669. }
  5670. // If a number was passed in, add 'px' to the (except for certain CSS properties)
  5671. if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
  5672. value += "px";
  5673. }
  5674. // If a hook was provided, use that value, otherwise just set the specified value
  5675. if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
  5676. // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
  5677. // Fixes bug #5509
  5678. try {
  5679. style[ name ] = value;
  5680. } catch(e) {}
  5681. }
  5682. } else {
  5683. // If a hook was provided get the non-computed value from there
  5684. if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
  5685. return ret;
  5686. }
  5687. // Otherwise just get the value from the style object
  5688. return style[ name ];
  5689. }
  5690. },
  5691. css: function( elem, name, numeric, extra ) {
  5692. var val, num, hooks,
  5693. origName = jQuery.camelCase( name );
  5694. // Make sure that we're working with the right name
  5695. name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
  5696. // gets hook for the prefixed version
  5697. // followed by the unprefixed version
  5698. hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
  5699. // If a hook was provided get the computed value from there
  5700. if ( hooks && "get" in hooks ) {
  5701. val = hooks.get( elem, true, extra );
  5702. }
  5703. // Otherwise, if a way to get the computed value exists, use that
  5704. if ( val === undefined ) {
  5705. val = curCSS( elem, name );
  5706. }
  5707. //convert "normal" to computed value
  5708. if ( val === "normal" && name in cssNormalTransform ) {
  5709. val = cssNormalTransform[ name ];
  5710. }
  5711. // Return, converting to number if forced or a qualifier was provided and val looks numeric
  5712. if ( numeric || extra !== undefined ) {
  5713. num = parseFloat( val );
  5714. return numeric || jQuery.isNumeric( num ) ? num || 0 : val;
  5715. }
  5716. return val;
  5717. },
  5718. // A method for quickly swapping in/out CSS properties to get correct calculations
  5719. swap: function( elem, options, callback ) {
  5720. var ret, name,
  5721. old = {};
  5722. // Remember the old values, and insert the new ones
  5723. for ( name in options ) {
  5724. old[ name ] = elem.style[ name ];
  5725. elem.style[ name ] = options[ name ];
  5726. }
  5727. ret = callback.call( elem );
  5728. // Revert the old values
  5729. for ( name in options ) {
  5730. elem.style[ name ] = old[ name ];
  5731. }
  5732. return ret;
  5733. }
  5734. });
  5735. // NOTE: To any future maintainer, we've window.getComputedStyle
  5736. // because jsdom on node.js will break without it.
  5737. if ( window.getComputedStyle ) {
  5738. curCSS = function( elem, name ) {
  5739. var ret, width, minWidth, maxWidth,
  5740. computed = window.getComputedStyle( elem, null ),
  5741. style = elem.style;
  5742. if ( computed ) {
  5743. // getPropertyValue is only needed for .css('filter') in IE9, see #12537
  5744. ret = computed.getPropertyValue( name ) || computed[ name ];
  5745. if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
  5746. ret = jQuery.style( elem, name );
  5747. }
  5748. // A tribute to the "awesome hack by Dean Edwards"
  5749. // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
  5750. // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
  5751. // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
  5752. if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
  5753. width = style.width;
  5754. minWidth = style.minWidth;
  5755. maxWidth = style.maxWidth;
  5756. style.minWidth = style.maxWidth = style.width = ret;
  5757. ret = computed.width;
  5758. style.width = width;
  5759. style.minWidth = minWidth;
  5760. style.maxWidth = maxWidth;
  5761. }
  5762. }
  5763. return ret;
  5764. };
  5765. } else if ( document.documentElement.currentStyle ) {
  5766. curCSS = function( elem, name ) {
  5767. var left, rsLeft,
  5768. ret = elem.currentStyle && elem.currentStyle[ name ],
  5769. style = elem.style;
  5770. // Avoid setting ret to empty string here
  5771. // so we don't default to auto
  5772. if ( ret == null && style && style[ name ] ) {
  5773. ret = style[ name ];
  5774. }
  5775. // From the awesome hack by Dean Edwards
  5776. // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
  5777. // If we're not dealing with a regular pixel number
  5778. // but a number that has a weird ending, we need to convert it to pixels
  5779. // but not position css attributes, as those are proportional to the parent element instead
  5780. // and we can't measure the parent instead because it might trigger a "stacking dolls" problem
  5781. if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
  5782. // Remember the original values
  5783. left = style.left;
  5784. rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
  5785. // Put in the new values to get a computed value out
  5786. if ( rsLeft ) {
  5787. elem.runtimeStyle.left = elem.currentStyle.left;
  5788. }
  5789. style.left = name === "fontSize" ? "1em" : ret;
  5790. ret = style.pixelLeft + "px";
  5791. // Revert the changed values
  5792. style.left = left;
  5793. if ( rsLeft ) {
  5794. elem.runtimeStyle.left = rsLeft;
  5795. }
  5796. }
  5797. return ret === "" ? "auto" : ret;
  5798. };
  5799. }
  5800. function setPositiveNumber( elem, value, subtract ) {
  5801. var matches = rnumsplit.exec( value );
  5802. return matches ?
  5803. Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
  5804. value;
  5805. }
  5806. function augmentWidthOrHeight( elem, name, extra, isBorderBox ) {
  5807. var i = extra === ( isBorderBox ? "border" : "content" ) ?
  5808. // If we already have the right measurement, avoid augmentation
  5809. 4 :
  5810. // Otherwise initialize for horizontal or vertical properties
  5811. name === "width" ? 1 : 0,
  5812. val = 0;
  5813. for ( ; i < 4; i += 2 ) {
  5814. // both box models exclude margin, so add it if we want it
  5815. if ( extra === "margin" ) {
  5816. // we use jQuery.css instead of curCSS here
  5817. // because of the reliableMarginRight CSS hook!
  5818. val += jQuery.css( elem, extra + cssExpand[ i ], true );
  5819. }
  5820. // From this point on we use curCSS for maximum performance (relevant in animations)
  5821. if ( isBorderBox ) {
  5822. // border-box includes padding, so remove it if we want content
  5823. if ( extra === "content" ) {
  5824. val -= parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
  5825. }
  5826. // at this point, extra isn't border nor margin, so remove border
  5827. if ( extra !== "margin" ) {
  5828. val -= parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
  5829. }
  5830. } else {
  5831. // at this point, extra isn't content, so add padding
  5832. val += parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
  5833. // at this point, extra isn't content nor padding, so add border
  5834. if ( extra !== "padding" ) {
  5835. val += parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
  5836. }
  5837. }
  5838. }
  5839. return val;
  5840. }
  5841. function getWidthOrHeight( elem, name, extra ) {
  5842. // Start with offset property, which is equivalent to the border-box value
  5843. var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
  5844. valueIsBorderBox = true,
  5845. isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box";
  5846. // some non-html elements return undefined for offsetWidth, so check for null/undefined
  5847. // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
  5848. // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
  5849. if ( val <= 0 || val == null ) {
  5850. // Fall back to computed then uncomputed css if necessary
  5851. val = curCSS( elem, name );
  5852. if ( val < 0 || val == null ) {
  5853. val = elem.style[ name ];
  5854. }
  5855. // Computed unit is not pixels. Stop here and return.
  5856. if ( rnumnonpx.test(val) ) {
  5857. return val;
  5858. }
  5859. // we need the check for style in case a browser which returns unreliable values
  5860. // for getComputedStyle silently falls back to the reliable elem.style
  5861. valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
  5862. // Normalize "", auto, and prepare for extra
  5863. val = parseFloat( val ) || 0;
  5864. }
  5865. // use the active box-sizing model to add/subtract irrelevant styles
  5866. return ( val +
  5867. augmentWidthOrHeight(
  5868. elem,
  5869. name,
  5870. extra || ( isBorderBox ? "border" : "content" ),
  5871. valueIsBorderBox
  5872. )
  5873. ) + "px";
  5874. }
  5875. // Try to determine the default display value of an element
  5876. function css_defaultDisplay( nodeName ) {
  5877. if ( elemdisplay[ nodeName ] ) {
  5878. return elemdisplay[ nodeName ];
  5879. }
  5880. var elem = jQuery( "<" + nodeName + ">" ).appendTo( document.body ),
  5881. display = elem.css("display");
  5882. elem.remove();
  5883. // If the simple way fails,
  5884. // get element's real default display by attaching it to a temp iframe
  5885. if ( display === "none" || display === "" ) {
  5886. // Use the already-created iframe if possible
  5887. iframe = document.body.appendChild(
  5888. iframe || jQuery.extend( document.createElement("iframe"), {
  5889. frameBorder: 0,
  5890. width: 0,
  5891. height: 0
  5892. })
  5893. );
  5894. // Create a cacheable copy of the iframe document on first call.
  5895. // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
  5896. // document to it; WebKit & Firefox won't allow reusing the iframe document.
  5897. if ( !iframeDoc || !iframe.createElement ) {
  5898. iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
  5899. iframeDoc.write("<!doctype html><html><body>");
  5900. iframeDoc.close();
  5901. }
  5902. elem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) );
  5903. display = curCSS( elem, "display" );
  5904. document.body.removeChild( iframe );
  5905. }
  5906. // Store the correct default display
  5907. elemdisplay[ nodeName ] = display;
  5908. return display;
  5909. }
  5910. jQuery.each([ "height", "width" ], function( i, name ) {
  5911. jQuery.cssHooks[ name ] = {
  5912. get: function( elem, computed, extra ) {
  5913. if ( computed ) {
  5914. // certain elements can have dimension info if we invisibly show them
  5915. // however, it must have a current display style that would benefit from this
  5916. if ( elem.offsetWidth === 0 && rdisplayswap.test( curCSS( elem, "display" ) ) ) {
  5917. return jQuery.swap( elem, cssShow, function() {
  5918. return getWidthOrHeight( elem, name, extra );
  5919. });
  5920. } else {
  5921. return getWidthOrHeight( elem, name, extra );
  5922. }
  5923. }
  5924. },
  5925. set: function( elem, value, extra ) {
  5926. return setPositiveNumber( elem, value, extra ?
  5927. augmentWidthOrHeight(
  5928. elem,
  5929. name,
  5930. extra,
  5931. jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box"
  5932. ) : 0
  5933. );
  5934. }
  5935. };
  5936. });
  5937. if ( !jQuery.support.opacity ) {
  5938. jQuery.cssHooks.opacity = {
  5939. get: function( elem, computed ) {
  5940. // IE uses filters for opacity
  5941. return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
  5942. ( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
  5943. computed ? "1" : "";
  5944. },
  5945. set: function( elem, value ) {
  5946. var style = elem.style,
  5947. currentStyle = elem.currentStyle,
  5948. opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
  5949. filter = currentStyle && currentStyle.filter || style.filter || "";
  5950. // IE has trouble with opacity if it does not have layout
  5951. // Force it by setting the zoom level
  5952. style.zoom = 1;
  5953. // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
  5954. if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
  5955. style.removeAttribute ) {
  5956. // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
  5957. // if "filter:" is present at all, clearType is disabled, we want to avoid this
  5958. // style.removeAttribute is IE Only, but so apparently is this code path...
  5959. style.removeAttribute( "filter" );
  5960. // if there there is no filter style applied in a css rule, we are done
  5961. if ( currentStyle && !currentStyle.filter ) {
  5962. return;
  5963. }
  5964. }
  5965. // otherwise, set new filter values
  5966. style.filter = ralpha.test( filter ) ?
  5967. filter.replace( ralpha, opacity ) :
  5968. filter + " " + opacity;
  5969. }
  5970. };
  5971. }
  5972. // These hooks cannot be added until DOM ready because the support test
  5973. // for it is not run until after DOM ready
  5974. jQuery(function() {
  5975. if ( !jQuery.support.reliableMarginRight ) {
  5976. jQuery.cssHooks.marginRight = {
  5977. get: function( elem, computed ) {
  5978. // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
  5979. // Work around by temporarily setting element display to inline-block
  5980. return jQuery.swap( elem, { "display": "inline-block" }, function() {
  5981. if ( computed ) {
  5982. return curCSS( elem, "marginRight" );
  5983. }
  5984. });
  5985. }
  5986. };
  5987. }
  5988. // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
  5989. // getComputedStyle returns percent when specified for top/left/bottom/right
  5990. // rather than make the css module depend on the offset module, we just check for it here
  5991. if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
  5992. jQuery.each( [ "top", "left" ], function( i, prop ) {
  5993. jQuery.cssHooks[ prop ] = {
  5994. get: function( elem, computed ) {
  5995. if ( computed ) {
  5996. var ret = curCSS( elem, prop );
  5997. // if curCSS returns percentage, fallback to offset
  5998. return rnumnonpx.test( ret ) ? jQuery( elem ).position()[ prop ] + "px" : ret;
  5999. }
  6000. }
  6001. };
  6002. });
  6003. }
  6004. });
  6005. if ( jQuery.expr && jQuery.expr.filters ) {
  6006. jQuery.expr.filters.hidden = function( elem ) {
  6007. return ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || curCSS( elem, "display" )) === "none");
  6008. };
  6009. jQuery.expr.filters.visible = function( elem ) {
  6010. return !jQuery.expr.filters.hidden( elem );
  6011. };
  6012. }
  6013. // These hooks are used by animate to expand properties
  6014. jQuery.each({
  6015. margin: "",
  6016. padding: "",
  6017. border: "Width"
  6018. }, function( prefix, suffix ) {
  6019. jQuery.cssHooks[ prefix + suffix ] = {
  6020. expand: function( value ) {
  6021. var i,
  6022. // assumes a single number if not a string
  6023. parts = typeof value === "string" ? value.split(" ") : [ value ],
  6024. expanded = {};
  6025. for ( i = 0; i < 4; i++ ) {
  6026. expanded[ prefix + cssExpand[ i ] + suffix ] =
  6027. parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
  6028. }
  6029. return expanded;
  6030. }
  6031. };
  6032. if ( !rmargin.test( prefix ) ) {
  6033. jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
  6034. }
  6035. });
  6036. var r20 = /%20/g,
  6037. rbracket = /\[\]$/,
  6038. rCRLF = /\r?\n/g,
  6039. rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
  6040. rselectTextarea = /^(?:select|textarea)/i;
  6041. jQuery.fn.extend({
  6042. serialize: function() {
  6043. return jQuery.param( this.serializeArray() );
  6044. },
  6045. serializeArray: function() {
  6046. return this.map(function(){
  6047. return this.elements ? jQuery.makeArray( this.elements ) : this;
  6048. })
  6049. .filter(function(){
  6050. return this.name && !this.disabled &&
  6051. ( this.checked || rselectTextarea.test( this.nodeName ) ||
  6052. rinput.test( this.type ) );
  6053. })
  6054. .map(function( i, elem ){
  6055. var val = jQuery( this ).val();
  6056. return val == null ?
  6057. null :
  6058. jQuery.isArray( val ) ?
  6059. jQuery.map( val, function( val, i ){
  6060. return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
  6061. }) :
  6062. { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
  6063. }).get();
  6064. }
  6065. });
  6066. //Serialize an array of form elements or a set of
  6067. //key/values into a query string
  6068. jQuery.param = function( a, traditional ) {
  6069. var prefix,
  6070. s = [],
  6071. add = function( key, value ) {
  6072. // If value is a function, invoke it and return its value
  6073. value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
  6074. s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
  6075. };
  6076. // Set traditional to true for jQuery <= 1.3.2 behavior.
  6077. if ( traditional === undefined ) {
  6078. traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
  6079. }
  6080. // If an array was passed in, assume that it is an array of form elements.
  6081. if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
  6082. // Serialize the form elements
  6083. jQuery.each( a, function() {
  6084. add( this.name, this.value );
  6085. });
  6086. } else {
  6087. // If traditional, encode the "old" way (the way 1.3.2 or older
  6088. // did it), otherwise encode params recursively.
  6089. for ( prefix in a ) {
  6090. buildParams( prefix, a[ prefix ], traditional, add );
  6091. }
  6092. }
  6093. // Return the resulting serialization
  6094. return s.join( "&" ).replace( r20, "+" );
  6095. };
  6096. function buildParams( prefix, obj, traditional, add ) {
  6097. var name;
  6098. if ( jQuery.isArray( obj ) ) {
  6099. // Serialize array item.
  6100. jQuery.each( obj, function( i, v ) {
  6101. if ( traditional || rbracket.test( prefix ) ) {
  6102. // Treat each array item as a scalar.
  6103. add( prefix, v );
  6104. } else {
  6105. // If array item is non-scalar (array or object), encode its
  6106. // numeric index to resolve deserialization ambiguity issues.
  6107. // Note that rack (as of 1.0.0) can't currently deserialize
  6108. // nested arrays properly, and attempting to do so may cause
  6109. // a server error. Possible fixes are to modify rack's
  6110. // deserialization algorithm or to provide an option or flag
  6111. // to force array serialization to be shallow.
  6112. buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
  6113. }
  6114. });
  6115. } else if ( !traditional && jQuery.type( obj ) === "object" ) {
  6116. // Serialize object item.
  6117. for ( name in obj ) {
  6118. buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
  6119. }
  6120. } else {
  6121. // Serialize scalar item.
  6122. add( prefix, obj );
  6123. }
  6124. }
  6125. var
  6126. // Document location
  6127. ajaxLocParts,
  6128. ajaxLocation,
  6129. rhash = /#.*$/,
  6130. rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
  6131. // #7653, #8125, #8152: local protocol detection
  6132. rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
  6133. rnoContent = /^(?:GET|HEAD)$/,
  6134. rprotocol = /^\/\//,
  6135. rquery = /\?/,
  6136. rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
  6137. rts = /([?&])_=[^&]*/,
  6138. rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
  6139. // Keep a copy of the old load method
  6140. _load = jQuery.fn.load,
  6141. /* Prefilters
  6142. * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
  6143. * 2) These are called:
  6144. * - BEFORE asking for a transport
  6145. * - AFTER param serialization (s.data is a string if s.processData is true)
  6146. * 3) key is the dataType
  6147. * 4) the catchall symbol "*" can be used
  6148. * 5) execution will start with transport dataType and THEN continue down to "*" if needed
  6149. */
  6150. prefilters = {},
  6151. /* Transports bindings
  6152. * 1) key is the dataType
  6153. * 2) the catchall symbol "*" can be used
  6154. * 3) selection will start with transport dataType and THEN go to "*" if needed
  6155. */
  6156. transports = {},
  6157. // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
  6158. allTypes = ["*/"] + ["*"];
  6159. // #8138, IE may throw an exception when accessing
  6160. // a field from window.location if document.domain has been set
  6161. try {
  6162. ajaxLocation = location.href;
  6163. } catch( e ) {
  6164. // Use the href attribute of an A element
  6165. // since IE will modify it given document.location
  6166. ajaxLocation = document.createElement( "a" );
  6167. ajaxLocation.href = "";
  6168. ajaxLocation = ajaxLocation.href;
  6169. }
  6170. // Segment location into parts
  6171. ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
  6172. // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
  6173. function addToPrefiltersOrTransports( structure ) {
  6174. // dataTypeExpression is optional and defaults to "*"
  6175. return function( dataTypeExpression, func ) {
  6176. if ( typeof dataTypeExpression !== "string" ) {
  6177. func = dataTypeExpression;
  6178. dataTypeExpression = "*";
  6179. }
  6180. var dataType, list, placeBefore,
  6181. dataTypes = dataTypeExpression.toLowerCase().split( core_rspace ),
  6182. i = 0,
  6183. length = dataTypes.length;
  6184. if ( jQuery.isFunction( func ) ) {
  6185. // For each dataType in the dataTypeExpression
  6186. for ( ; i < length; i++ ) {
  6187. dataType = dataTypes[ i ];
  6188. // We control if we're asked to add before
  6189. // any existing element
  6190. placeBefore = /^\+/.test( dataType );
  6191. if ( placeBefore ) {
  6192. dataType = dataType.substr( 1 ) || "*";
  6193. }
  6194. list = structure[ dataType ] = structure[ dataType ] || [];
  6195. // then we add to the structure accordingly
  6196. list[ placeBefore ? "unshift" : "push" ]( func );
  6197. }
  6198. }
  6199. };
  6200. }
  6201. // Base inspection function for prefilters and transports
  6202. function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
  6203. dataType /* internal */, inspected /* internal */ ) {
  6204. dataType = dataType || options.dataTypes[ 0 ];
  6205. inspected = inspected || {};
  6206. inspected[ dataType ] = true;
  6207. var selection,
  6208. list = structure[ dataType ],
  6209. i = 0,
  6210. length = list ? list.length : 0,
  6211. executeOnly = ( structure === prefilters );
  6212. for ( ; i < length && ( executeOnly || !selection ); i++ ) {
  6213. selection = list[ i ]( options, originalOptions, jqXHR );
  6214. // If we got redirected to another dataType
  6215. // we try there if executing only and not done already
  6216. if ( typeof selection === "string" ) {
  6217. if ( !executeOnly || inspected[ selection ] ) {
  6218. selection = undefined;
  6219. } else {
  6220. options.dataTypes.unshift( selection );
  6221. selection = inspectPrefiltersOrTransports(
  6222. structure, options, originalOptions, jqXHR, selection, inspected );
  6223. }
  6224. }
  6225. }
  6226. // If we're only executing or nothing was selected
  6227. // we try the catchall dataType if not done already
  6228. if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
  6229. selection = inspectPrefiltersOrTransports(
  6230. structure, options, originalOptions, jqXHR, "*", inspected );
  6231. }
  6232. // unnecessary when only executing (prefilters)
  6233. // but it'll be ignored by the caller in that case
  6234. return selection;
  6235. }
  6236. // A special extend for ajax options
  6237. // that takes "flat" options (not to be deep extended)
  6238. // Fixes #9887
  6239. function ajaxExtend( target, src ) {
  6240. var key, deep,
  6241. flatOptions = jQuery.ajaxSettings.flatOptions || {};
  6242. for ( key in src ) {
  6243. if ( src[ key ] !== undefined ) {
  6244. ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
  6245. }
  6246. }
  6247. if ( deep ) {
  6248. jQuery.extend( true, target, deep );
  6249. }
  6250. }
  6251. jQuery.fn.load = function( url, params, callback ) {
  6252. if ( typeof url !== "string" && _load ) {
  6253. return _load.apply( this, arguments );
  6254. }
  6255. // Don't do a request if no elements are being requested
  6256. if ( !this.length ) {
  6257. return this;
  6258. }
  6259. var selector, type, response,
  6260. self = this,
  6261. off = url.indexOf(" ");
  6262. if ( off >= 0 ) {
  6263. selector = url.slice( off, url.length );
  6264. url = url.slice( 0, off );
  6265. }
  6266. // If it's a function
  6267. if ( jQuery.isFunction( params ) ) {
  6268. // We assume that it's the callback
  6269. callback = params;
  6270. params = undefined;
  6271. // Otherwise, build a param string
  6272. } else if ( params && typeof params === "object" ) {
  6273. type = "POST";
  6274. }
  6275. // Request the remote document
  6276. jQuery.ajax({
  6277. url: url,
  6278. // if "type" variable is undefined, then "GET" method will be used
  6279. type: type,
  6280. dataType: "html",
  6281. data: params,
  6282. complete: function( jqXHR, status ) {
  6283. if ( callback ) {
  6284. self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
  6285. }
  6286. }
  6287. }).done(function( responseText ) {
  6288. // Save response for use in complete callback
  6289. response = arguments;
  6290. // See if a selector was specified
  6291. self.html( selector ?
  6292. // Create a dummy div to hold the results
  6293. jQuery("<div>")
  6294. // inject the contents of the document in, removing the scripts
  6295. // to avoid any 'Permission Denied' errors in IE
  6296. .append( responseText.replace( rscript, "" ) )
  6297. // Locate the specified elements
  6298. .find( selector ) :
  6299. // If not, just inject the full result
  6300. responseText );
  6301. });
  6302. return this;
  6303. };
  6304. // Attach a bunch of functions for handling common AJAX events
  6305. jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
  6306. jQuery.fn[ o ] = function( f ){
  6307. return this.on( o, f );
  6308. };
  6309. });
  6310. jQuery.each( [ "get", "post" ], function( i, method ) {
  6311. jQuery[ method ] = function( url, data, callback, type ) {
  6312. // shift arguments if data argument was omitted
  6313. if ( jQuery.isFunction( data ) ) {
  6314. type = type || callback;
  6315. callback = data;
  6316. data = undefined;
  6317. }
  6318. return jQuery.ajax({
  6319. type: method,
  6320. url: url,
  6321. data: data,
  6322. success: callback,
  6323. dataType: type
  6324. });
  6325. };
  6326. });
  6327. jQuery.extend({
  6328. getScript: function( url, callback ) {
  6329. return jQuery.get( url, undefined, callback, "script" );
  6330. },
  6331. getJSON: function( url, data, callback ) {
  6332. return jQuery.get( url, data, callback, "json" );
  6333. },
  6334. // Creates a full fledged settings object into target
  6335. // with both ajaxSettings and settings fields.
  6336. // If target is omitted, writes into ajaxSettings.
  6337. ajaxSetup: function( target, settings ) {
  6338. if ( settings ) {
  6339. // Building a settings object
  6340. ajaxExtend( target, jQuery.ajaxSettings );
  6341. } else {
  6342. // Extending ajaxSettings
  6343. settings = target;
  6344. target = jQuery.ajaxSettings;
  6345. }
  6346. ajaxExtend( target, settings );
  6347. return target;
  6348. },
  6349. ajaxSettings: {
  6350. url: ajaxLocation,
  6351. isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
  6352. global: true,
  6353. type: "GET",
  6354. contentType: "application/x-www-form-urlencoded; charset=UTF-8",
  6355. processData: true,
  6356. async: true,
  6357. /*
  6358. timeout: 0,
  6359. data: null,
  6360. dataType: null,
  6361. username: null,
  6362. password: null,
  6363. cache: null,
  6364. throws: false,
  6365. traditional: false,
  6366. headers: {},
  6367. */
  6368. accepts: {
  6369. xml: "application/xml, text/xml",
  6370. html: "text/html",
  6371. text: "text/plain",
  6372. json: "application/json, text/javascript",
  6373. "*": allTypes
  6374. },
  6375. contents: {
  6376. xml: /xml/,
  6377. html: /html/,
  6378. json: /json/
  6379. },
  6380. responseFields: {
  6381. xml: "responseXML",
  6382. text: "responseText"
  6383. },
  6384. // List of data converters
  6385. // 1) key format is "source_type destination_type" (a single space in-between)
  6386. // 2) the catchall symbol "*" can be used for source_type
  6387. converters: {
  6388. // Convert anything to text
  6389. "* text": window.String,
  6390. // Text to html (true = no transformation)
  6391. "text html": true,
  6392. // Evaluate text as a json expression
  6393. "text json": jQuery.parseJSON,
  6394. // Parse text as xml
  6395. "text xml": jQuery.parseXML
  6396. },
  6397. // For options that shouldn't be deep extended:
  6398. // you can add your own custom options here if
  6399. // and when you create one that shouldn't be
  6400. // deep extended (see ajaxExtend)
  6401. flatOptions: {
  6402. context: true,
  6403. url: true
  6404. }
  6405. },
  6406. ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
  6407. ajaxTransport: addToPrefiltersOrTransports( transports ),
  6408. // Main method
  6409. ajax: function( url, options ) {
  6410. // If url is an object, simulate pre-1.5 signature
  6411. if ( typeof url === "object" ) {
  6412. options = url;
  6413. url = undefined;
  6414. }
  6415. // Force options to be an object
  6416. options = options || {};
  6417. var // ifModified key
  6418. ifModifiedKey,
  6419. // Response headers
  6420. responseHeadersString,
  6421. responseHeaders,
  6422. // transport
  6423. transport,
  6424. // timeout handle
  6425. timeoutTimer,
  6426. // Cross-domain detection vars
  6427. parts,
  6428. // To know if global events are to be dispatched
  6429. fireGlobals,
  6430. // Loop variable
  6431. i,
  6432. // Create the final options object
  6433. s = jQuery.ajaxSetup( {}, options ),
  6434. // Callbacks context
  6435. callbackContext = s.context || s,
  6436. // Context for global events
  6437. // It's the callbackContext if one was provided in the options
  6438. // and if it's a DOM node or a jQuery collection
  6439. globalEventContext = callbackContext !== s &&
  6440. ( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
  6441. jQuery( callbackContext ) : jQuery.event,
  6442. // Deferreds
  6443. deferred = jQuery.Deferred(),
  6444. completeDeferred = jQuery.Callbacks( "once memory" ),
  6445. // Status-dependent callbacks
  6446. statusCode = s.statusCode || {},
  6447. // Headers (they are sent all at once)
  6448. requestHeaders = {},
  6449. requestHeadersNames = {},
  6450. // The jqXHR state
  6451. state = 0,
  6452. // Default abort message
  6453. strAbort = "canceled",
  6454. // Fake xhr
  6455. jqXHR = {
  6456. readyState: 0,
  6457. // Caches the header
  6458. setRequestHeader: function( name, value ) {
  6459. if ( !state ) {
  6460. var lname = name.toLowerCase();
  6461. name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
  6462. requestHeaders[ name ] = value;
  6463. }
  6464. return this;
  6465. },
  6466. // Raw string
  6467. getAllResponseHeaders: function() {
  6468. return state === 2 ? responseHeadersString : null;
  6469. },
  6470. // Builds headers hashtable if needed
  6471. getResponseHeader: function( key ) {
  6472. var match;
  6473. if ( state === 2 ) {
  6474. if ( !responseHeaders ) {
  6475. responseHeaders = {};
  6476. while( ( match = rheaders.exec( responseHeadersString ) ) ) {
  6477. responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
  6478. }
  6479. }
  6480. match = responseHeaders[ key.toLowerCase() ];
  6481. }
  6482. return match === undefined ? null : match;
  6483. },
  6484. // Overrides response content-type header
  6485. overrideMimeType: function( type ) {
  6486. if ( !state ) {
  6487. s.mimeType = type;
  6488. }
  6489. return this;
  6490. },
  6491. // Cancel the request
  6492. abort: function( statusText ) {
  6493. statusText = statusText || strAbort;
  6494. if ( transport ) {
  6495. transport.abort( statusText );
  6496. }
  6497. done( 0, statusText );
  6498. return this;
  6499. }
  6500. };
  6501. // Callback for when everything is done
  6502. // It is defined here because jslint complains if it is declared
  6503. // at the end of the function (which would be more logical and readable)
  6504. function done( status, nativeStatusText, responses, headers ) {
  6505. var isSuccess, success, error, response, modified,
  6506. statusText = nativeStatusText;
  6507. // Called once
  6508. if ( state === 2 ) {
  6509. return;
  6510. }
  6511. // State is "done" now
  6512. state = 2;
  6513. // Clear timeout if it exists
  6514. if ( timeoutTimer ) {
  6515. clearTimeout( timeoutTimer );
  6516. }
  6517. // Dereference transport for early garbage collection
  6518. // (no matter how long the jqXHR object will be used)
  6519. transport = undefined;
  6520. // Cache response headers
  6521. responseHeadersString = headers || "";
  6522. // Set readyState
  6523. jqXHR.readyState = status > 0 ? 4 : 0;
  6524. // Get response data
  6525. if ( responses ) {
  6526. response = ajaxHandleResponses( s, jqXHR, responses );
  6527. }
  6528. // If successful, handle type chaining
  6529. if ( status >= 200 && status < 300 || status === 304 ) {
  6530. // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
  6531. if ( s.ifModified ) {
  6532. modified = jqXHR.getResponseHeader("Last-Modified");
  6533. if ( modified ) {
  6534. jQuery.lastModified[ ifModifiedKey ] = modified;
  6535. }
  6536. modified = jqXHR.getResponseHeader("Etag");
  6537. if ( modified ) {
  6538. jQuery.etag[ ifModifiedKey ] = modified;
  6539. }
  6540. }
  6541. // If not modified
  6542. if ( status === 304 ) {
  6543. statusText = "notmodified";
  6544. isSuccess = true;
  6545. // If we have data
  6546. } else {
  6547. isSuccess = ajaxConvert( s, response );
  6548. statusText = isSuccess.state;
  6549. success = isSuccess.data;
  6550. error = isSuccess.error;
  6551. isSuccess = !error;
  6552. }
  6553. } else {
  6554. // We extract error from statusText
  6555. // then normalize statusText and status for non-aborts
  6556. error = statusText;
  6557. if ( !statusText || status ) {
  6558. statusText = "error";
  6559. if ( status < 0 ) {
  6560. status = 0;
  6561. }
  6562. }
  6563. }
  6564. // Set data for the fake xhr object
  6565. jqXHR.status = status;
  6566. jqXHR.statusText = ( nativeStatusText || statusText ) + "";
  6567. // Success/Error
  6568. if ( isSuccess ) {
  6569. deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
  6570. } else {
  6571. deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
  6572. }
  6573. // Status-dependent callbacks
  6574. jqXHR.statusCode( statusCode );
  6575. statusCode = undefined;
  6576. if ( fireGlobals ) {
  6577. globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
  6578. [ jqXHR, s, isSuccess ? success : error ] );
  6579. }
  6580. // Complete
  6581. completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
  6582. if ( fireGlobals ) {
  6583. globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
  6584. // Handle the global AJAX counter
  6585. if ( !( --jQuery.active ) ) {
  6586. jQuery.event.trigger( "ajaxStop" );
  6587. }
  6588. }
  6589. }
  6590. // Attach deferreds
  6591. deferred.promise( jqXHR );
  6592. jqXHR.success = jqXHR.done;
  6593. jqXHR.error = jqXHR.fail;
  6594. jqXHR.complete = completeDeferred.add;
  6595. // Status-dependent callbacks
  6596. jqXHR.statusCode = function( map ) {
  6597. if ( map ) {
  6598. var tmp;
  6599. if ( state < 2 ) {
  6600. for ( tmp in map ) {
  6601. statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
  6602. }
  6603. } else {
  6604. tmp = map[ jqXHR.status ];
  6605. jqXHR.always( tmp );
  6606. }
  6607. }
  6608. return this;
  6609. };
  6610. // Remove hash character (#7531: and string promotion)
  6611. // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
  6612. // We also use the url parameter if available
  6613. s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
  6614. // Extract dataTypes list
  6615. s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( core_rspace );
  6616. // A cross-domain request is in order when we have a protocol:host:port mismatch
  6617. if ( s.crossDomain == null ) {
  6618. parts = rurl.exec( s.url.toLowerCase() );
  6619. s.crossDomain = !!( parts &&
  6620. ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
  6621. ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
  6622. ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
  6623. );
  6624. }
  6625. // Convert data if not already a string
  6626. if ( s.data && s.processData && typeof s.data !== "string" ) {
  6627. s.data = jQuery.param( s.data, s.traditional );
  6628. }
  6629. // Apply prefilters
  6630. inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
  6631. // If request was aborted inside a prefilter, stop there
  6632. if ( state === 2 ) {
  6633. return jqXHR;
  6634. }
  6635. // We can fire global events as of now if asked to
  6636. fireGlobals = s.global;
  6637. // Uppercase the type
  6638. s.type = s.type.toUpperCase();
  6639. // Determine if request has content
  6640. s.hasContent = !rnoContent.test( s.type );
  6641. // Watch for a new set of requests
  6642. if ( fireGlobals && jQuery.active++ === 0 ) {
  6643. jQuery.event.trigger( "ajaxStart" );
  6644. }
  6645. // More options handling for requests with no content
  6646. if ( !s.hasContent ) {
  6647. // If data is available, append data to url
  6648. if ( s.data ) {
  6649. s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
  6650. // #9682: remove data so that it's not used in an eventual retry
  6651. delete s.data;
  6652. }
  6653. // Get ifModifiedKey before adding the anti-cache parameter
  6654. ifModifiedKey = s.url;
  6655. // Add anti-cache in url if needed
  6656. if ( s.cache === false ) {
  6657. var ts = jQuery.now(),
  6658. // try replacing _= if it is there
  6659. ret = s.url.replace( rts, "$1_=" + ts );
  6660. // if nothing was replaced, add timestamp to the end
  6661. s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
  6662. }
  6663. }
  6664. // Set the correct header, if data is being sent
  6665. if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
  6666. jqXHR.setRequestHeader( "Content-Type", s.contentType );
  6667. }
  6668. // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
  6669. if ( s.ifModified ) {
  6670. ifModifiedKey = ifModifiedKey || s.url;
  6671. if ( jQuery.lastModified[ ifModifiedKey ] ) {
  6672. jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
  6673. }
  6674. if ( jQuery.etag[ ifModifiedKey ] ) {
  6675. jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
  6676. }
  6677. }
  6678. // Set the Accepts header for the server, depending on the dataType
  6679. jqXHR.setRequestHeader(
  6680. "Accept",
  6681. s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
  6682. s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
  6683. s.accepts[ "*" ]
  6684. );
  6685. // Check for headers option
  6686. for ( i in s.headers ) {
  6687. jqXHR.setRequestHeader( i, s.headers[ i ] );
  6688. }
  6689. // Allow custom headers/mimetypes and early abort
  6690. if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
  6691. // Abort if not done already and return
  6692. return jqXHR.abort();
  6693. }
  6694. // aborting is no longer a cancellation
  6695. strAbort = "abort";
  6696. // Install callbacks on deferreds
  6697. for ( i in { success: 1, error: 1, complete: 1 } ) {
  6698. jqXHR[ i ]( s[ i ] );
  6699. }
  6700. // Get transport
  6701. transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
  6702. // If no transport, we auto-abort
  6703. if ( !transport ) {
  6704. done( -1, "No Transport" );
  6705. } else {
  6706. jqXHR.readyState = 1;
  6707. // Send global event
  6708. if ( fireGlobals ) {
  6709. globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
  6710. }
  6711. // Timeout
  6712. if ( s.async && s.timeout > 0 ) {
  6713. timeoutTimer = setTimeout( function(){
  6714. jqXHR.abort( "timeout" );
  6715. }, s.timeout );
  6716. }
  6717. try {
  6718. state = 1;
  6719. transport.send( requestHeaders, done );
  6720. } catch (e) {
  6721. // Propagate exception as error if not done
  6722. if ( state < 2 ) {
  6723. done( -1, e );
  6724. // Simply rethrow otherwise
  6725. } else {
  6726. throw e;
  6727. }
  6728. }
  6729. }
  6730. return jqXHR;
  6731. },
  6732. // Counter for holding the number of active queries
  6733. active: 0,
  6734. // Last-Modified header cache for next request
  6735. lastModified: {},
  6736. etag: {}
  6737. });
  6738. /* Handles responses to an ajax request:
  6739. * - sets all responseXXX fields accordingly
  6740. * - finds the right dataType (mediates between content-type and expected dataType)
  6741. * - returns the corresponding response
  6742. */
  6743. function ajaxHandleResponses( s, jqXHR, responses ) {
  6744. var ct, type, finalDataType, firstDataType,
  6745. contents = s.contents,
  6746. dataTypes = s.dataTypes,
  6747. responseFields = s.responseFields;
  6748. // Fill responseXXX fields
  6749. for ( type in responseFields ) {
  6750. if ( type in responses ) {
  6751. jqXHR[ responseFields[type] ] = responses[ type ];
  6752. }
  6753. }
  6754. // Remove auto dataType and get content-type in the process
  6755. while( dataTypes[ 0 ] === "*" ) {
  6756. dataTypes.shift();
  6757. if ( ct === undefined ) {
  6758. ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
  6759. }
  6760. }
  6761. // Check if we're dealing with a known content-type
  6762. if ( ct ) {
  6763. for ( type in contents ) {
  6764. if ( contents[ type ] && contents[ type ].test( ct ) ) {
  6765. dataTypes.unshift( type );
  6766. break;
  6767. }
  6768. }
  6769. }
  6770. // Check to see if we have a response for the expected dataType
  6771. if ( dataTypes[ 0 ] in responses ) {
  6772. finalDataType = dataTypes[ 0 ];
  6773. } else {
  6774. // Try convertible dataTypes
  6775. for ( type in responses ) {
  6776. if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
  6777. finalDataType = type;
  6778. break;
  6779. }
  6780. if ( !firstDataType ) {
  6781. firstDataType = type;
  6782. }
  6783. }
  6784. // Or just use first one
  6785. finalDataType = finalDataType || firstDataType;
  6786. }
  6787. // If we found a dataType
  6788. // We add the dataType to the list if needed
  6789. // and return the corresponding response
  6790. if ( finalDataType ) {
  6791. if ( finalDataType !== dataTypes[ 0 ] ) {
  6792. dataTypes.unshift( finalDataType );
  6793. }
  6794. return responses[ finalDataType ];
  6795. }
  6796. }
  6797. // Chain conversions given the request and the original response
  6798. function ajaxConvert( s, response ) {
  6799. var conv, conv2, current, tmp,
  6800. // Work with a copy of dataTypes in case we need to modify it for conversion
  6801. dataTypes = s.dataTypes.slice(),
  6802. prev = dataTypes[ 0 ],
  6803. converters = {},
  6804. i = 0;
  6805. // Apply the dataFilter if provided
  6806. if ( s.dataFilter ) {
  6807. response = s.dataFilter( response, s.dataType );
  6808. }
  6809. // Create converters map with lowercased keys
  6810. if ( dataTypes[ 1 ] ) {
  6811. for ( conv in s.converters ) {
  6812. converters[ conv.toLowerCase() ] = s.converters[ conv ];
  6813. }
  6814. }
  6815. // Convert to each sequential dataType, tolerating list modification
  6816. for ( ; (current = dataTypes[++i]); ) {
  6817. // There's only work to do if current dataType is non-auto
  6818. if ( current !== "*" ) {
  6819. // Convert response if prev dataType is non-auto and differs from current
  6820. if ( prev !== "*" && prev !== current ) {
  6821. // Seek a direct converter
  6822. conv = converters[ prev + " " + current ] || converters[ "* " + current ];
  6823. // If none found, seek a pair
  6824. if ( !conv ) {
  6825. for ( conv2 in converters ) {
  6826. // If conv2 outputs current
  6827. tmp = conv2.split(" ");
  6828. if ( tmp[ 1 ] === current ) {
  6829. // If prev can be converted to accepted input
  6830. conv = converters[ prev + " " + tmp[ 0 ] ] ||
  6831. converters[ "* " + tmp[ 0 ] ];
  6832. if ( conv ) {
  6833. // Condense equivalence converters
  6834. if ( conv === true ) {
  6835. conv = converters[ conv2 ];
  6836. // Otherwise, insert the intermediate dataType
  6837. } else if ( converters[ conv2 ] !== true ) {
  6838. current = tmp[ 0 ];
  6839. dataTypes.splice( i--, 0, current );
  6840. }
  6841. break;
  6842. }
  6843. }
  6844. }
  6845. }
  6846. // Apply converter (if not an equivalence)
  6847. if ( conv !== true ) {
  6848. // Unless errors are allowed to bubble, catch and return them
  6849. if ( conv && s["throws"] ) {
  6850. response = conv( response );
  6851. } else {
  6852. try {
  6853. response = conv( response );
  6854. } catch ( e ) {
  6855. return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
  6856. }
  6857. }
  6858. }
  6859. }
  6860. // Update prev for next iteration
  6861. prev = current;
  6862. }
  6863. }
  6864. return { state: "success", data: response };
  6865. }
  6866. var oldCallbacks = [],
  6867. rquestion = /\?/,
  6868. rjsonp = /(=)\?(?=&|$)|\?\?/,
  6869. nonce = jQuery.now();
  6870. // Default jsonp settings
  6871. jQuery.ajaxSetup({
  6872. jsonp: "callback",
  6873. jsonpCallback: function() {
  6874. var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
  6875. this[ callback ] = true;
  6876. return callback;
  6877. }
  6878. });
  6879. // Detect, normalize options and install callbacks for jsonp requests
  6880. jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
  6881. var callbackName, overwritten, responseContainer,
  6882. data = s.data,
  6883. url = s.url,
  6884. hasCallback = s.jsonp !== false,
  6885. replaceInUrl = hasCallback && rjsonp.test( url ),
  6886. replaceInData = hasCallback && !replaceInUrl && typeof data === "string" &&
  6887. !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") &&
  6888. rjsonp.test( data );
  6889. // Handle iff the expected data type is "jsonp" or we have a parameter to set
  6890. if ( s.dataTypes[ 0 ] === "jsonp" || replaceInUrl || replaceInData ) {
  6891. // Get callback name, remembering preexisting value associated with it
  6892. callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
  6893. s.jsonpCallback() :
  6894. s.jsonpCallback;
  6895. overwritten = window[ callbackName ];
  6896. // Insert callback into url or form data
  6897. if ( replaceInUrl ) {
  6898. s.url = url.replace( rjsonp, "$1" + callbackName );
  6899. } else if ( replaceInData ) {
  6900. s.data = data.replace( rjsonp, "$1" + callbackName );
  6901. } else if ( hasCallback ) {
  6902. s.url += ( rquestion.test( url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
  6903. }
  6904. // Use data converter to retrieve json after script execution
  6905. s.converters["script json"] = function() {
  6906. if ( !responseContainer ) {
  6907. jQuery.error( callbackName + " was not called" );
  6908. }
  6909. return responseContainer[ 0 ];
  6910. };
  6911. // force json dataType
  6912. s.dataTypes[ 0 ] = "json";
  6913. // Install callback
  6914. window[ callbackName ] = function() {
  6915. responseContainer = arguments;
  6916. };
  6917. // Clean-up function (fires after converters)
  6918. jqXHR.always(function() {
  6919. // Restore preexisting value
  6920. window[ callbackName ] = overwritten;
  6921. // Save back as free
  6922. if ( s[ callbackName ] ) {
  6923. // make sure that re-using the options doesn't screw things around
  6924. s.jsonpCallback = originalSettings.jsonpCallback;
  6925. // save the callback name for future use
  6926. oldCallbacks.push( callbackName );
  6927. }
  6928. // Call if it was a function and we have a response
  6929. if ( responseContainer && jQuery.isFunction( overwritten ) ) {
  6930. overwritten( responseContainer[ 0 ] );
  6931. }
  6932. responseContainer = overwritten = undefined;
  6933. });
  6934. // Delegate to script
  6935. return "script";
  6936. }
  6937. });
  6938. // Install script dataType
  6939. jQuery.ajaxSetup({
  6940. accepts: {
  6941. script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
  6942. },
  6943. contents: {
  6944. script: /javascript|ecmascript/
  6945. },
  6946. converters: {
  6947. "text script": function( text ) {
  6948. jQuery.globalEval( text );
  6949. return text;
  6950. }
  6951. }
  6952. });
  6953. // Handle cache's special case and global
  6954. jQuery.ajaxPrefilter( "script", function( s ) {
  6955. if ( s.cache === undefined ) {
  6956. s.cache = false;
  6957. }
  6958. if ( s.crossDomain ) {
  6959. s.type = "GET";
  6960. s.global = false;
  6961. }
  6962. });
  6963. // Bind script tag hack transport
  6964. jQuery.ajaxTransport( "script", function(s) {
  6965. // This transport only deals with cross domain requests
  6966. if ( s.crossDomain ) {
  6967. var script,
  6968. head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
  6969. return {
  6970. send: function( _, callback ) {
  6971. script = document.createElement( "script" );
  6972. script.async = "async";
  6973. if ( s.scriptCharset ) {
  6974. script.charset = s.scriptCharset;
  6975. }
  6976. script.src = s.url;
  6977. // Attach handlers for all browsers
  6978. script.onload = script.onreadystatechange = function( _, isAbort ) {
  6979. if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
  6980. // Handle memory leak in IE
  6981. script.onload = script.onreadystatechange = null;
  6982. // Remove the script
  6983. if ( head && script.parentNode ) {
  6984. head.removeChild( script );
  6985. }
  6986. // Dereference the script
  6987. script = undefined;
  6988. // Callback if not abort
  6989. if ( !isAbort ) {
  6990. callback( 200, "success" );
  6991. }
  6992. }
  6993. };
  6994. // Use insertBefore instead of appendChild to circumvent an IE6 bug.
  6995. // This arises when a base node is used (#2709 and #4378).
  6996. head.insertBefore( script, head.firstChild );
  6997. },
  6998. abort: function() {
  6999. if ( script ) {
  7000. script.onload( 0, 1 );
  7001. }
  7002. }
  7003. };
  7004. }
  7005. });
  7006. var xhrCallbacks,
  7007. // #5280: Internet Explorer will keep connections alive if we don't abort on unload
  7008. xhrOnUnloadAbort = window.ActiveXObject ? function() {
  7009. // Abort all pending requests
  7010. for ( var key in xhrCallbacks ) {
  7011. xhrCallbacks[ key ]( 0, 1 );
  7012. }
  7013. } : false,
  7014. xhrId = 0;
  7015. // Functions to create xhrs
  7016. function createStandardXHR() {
  7017. try {
  7018. return new window.XMLHttpRequest();
  7019. } catch( e ) {}
  7020. }
  7021. function createActiveXHR() {
  7022. try {
  7023. return new window.ActiveXObject( "Microsoft.XMLHTTP" );
  7024. } catch( e ) {}
  7025. }
  7026. // Create the request object
  7027. // (This is still attached to ajaxSettings for backward compatibility)
  7028. jQuery.ajaxSettings.xhr = window.ActiveXObject ?
  7029. /* Microsoft failed to properly
  7030. * implement the XMLHttpRequest in IE7 (can't request local files),
  7031. * so we use the ActiveXObject when it is available
  7032. * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
  7033. * we need a fallback.
  7034. */
  7035. function() {
  7036. return !this.isLocal && createStandardXHR() || createActiveXHR();
  7037. } :
  7038. // For all other browsers, use the standard XMLHttpRequest object
  7039. createStandardXHR;
  7040. // Determine support properties
  7041. (function( xhr ) {
  7042. jQuery.extend( jQuery.support, {
  7043. ajax: !!xhr,
  7044. cors: !!xhr && ( "withCredentials" in xhr )
  7045. });
  7046. })( jQuery.ajaxSettings.xhr() );
  7047. // Create transport if the browser can provide an xhr
  7048. if ( jQuery.support.ajax ) {
  7049. jQuery.ajaxTransport(function( s ) {
  7050. // Cross domain only allowed if supported through XMLHttpRequest
  7051. if ( !s.crossDomain || jQuery.support.cors ) {
  7052. var callback;
  7053. return {
  7054. send: function( headers, complete ) {
  7055. // Get a new xhr
  7056. var handle, i,
  7057. xhr = s.xhr();
  7058. // Open the socket
  7059. // Passing null username, generates a login popup on Opera (#2865)
  7060. if ( s.username ) {
  7061. xhr.open( s.type, s.url, s.async, s.username, s.password );
  7062. } else {
  7063. xhr.open( s.type, s.url, s.async );
  7064. }
  7065. // Apply custom fields if provided
  7066. if ( s.xhrFields ) {
  7067. for ( i in s.xhrFields ) {
  7068. xhr[ i ] = s.xhrFields[ i ];
  7069. }
  7070. }
  7071. // Override mime type if needed
  7072. if ( s.mimeType && xhr.overrideMimeType ) {
  7073. xhr.overrideMimeType( s.mimeType );
  7074. }
  7075. // X-Requested-With header
  7076. // For cross-domain requests, seeing as conditions for a preflight are
  7077. // akin to a jigsaw puzzle, we simply never set it to be sure.
  7078. // (it can always be set on a per-request basis or even using ajaxSetup)
  7079. // For same-domain requests, won't change header if already provided.
  7080. if ( !s.crossDomain && !headers["X-Requested-With"] ) {
  7081. headers[ "X-Requested-With" ] = "XMLHttpRequest";
  7082. }
  7083. // Need an extra try/catch for cross domain requests in Firefox 3
  7084. try {
  7085. for ( i in headers ) {
  7086. xhr.setRequestHeader( i, headers[ i ] );
  7087. }
  7088. } catch( _ ) {}
  7089. // Do send the request
  7090. // This may raise an exception which is actually
  7091. // handled in jQuery.ajax (so no try/catch here)
  7092. xhr.send( ( s.hasContent && s.data ) || null );
  7093. // Listener
  7094. callback = function( _, isAbort ) {
  7095. var status,
  7096. statusText,
  7097. responseHeaders,
  7098. responses,
  7099. xml;
  7100. // Firefox throws exceptions when accessing properties
  7101. // of an xhr when a network error occurred
  7102. // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
  7103. try {
  7104. // Was never called and is aborted or complete
  7105. if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
  7106. // Only called once
  7107. callback = undefined;
  7108. // Do not keep as active anymore
  7109. if ( handle ) {
  7110. xhr.onreadystatechange = jQuery.noop;
  7111. if ( xhrOnUnloadAbort ) {
  7112. delete xhrCallbacks[ handle ];
  7113. }
  7114. }
  7115. // If it's an abort
  7116. if ( isAbort ) {
  7117. // Abort it manually if needed
  7118. if ( xhr.readyState !== 4 ) {
  7119. xhr.abort();
  7120. }
  7121. } else {
  7122. status = xhr.status;
  7123. responseHeaders = xhr.getAllResponseHeaders();
  7124. responses = {};
  7125. xml = xhr.responseXML;
  7126. // Construct response list
  7127. if ( xml && xml.documentElement /* #4958 */ ) {
  7128. responses.xml = xml;
  7129. }
  7130. // When requesting binary data, IE6-9 will throw an exception
  7131. // on any attempt to access responseText (#11426)
  7132. try {
  7133. responses.text = xhr.responseText;
  7134. } catch( e ) {
  7135. }
  7136. // Firefox throws an exception when accessing
  7137. // statusText for faulty cross-domain requests
  7138. try {
  7139. statusText = xhr.statusText;
  7140. } catch( e ) {
  7141. // We normalize with Webkit giving an empty statusText
  7142. statusText = "";
  7143. }
  7144. // Filter status for non standard behaviors
  7145. // If the request is local and we have data: assume a success
  7146. // (success with no data won't get notified, that's the best we
  7147. // can do given current implementations)
  7148. if ( !status && s.isLocal && !s.crossDomain ) {
  7149. status = responses.text ? 200 : 404;
  7150. // IE - #1450: sometimes returns 1223 when it should be 204
  7151. } else if ( status === 1223 ) {
  7152. status = 204;
  7153. }
  7154. }
  7155. }
  7156. } catch( firefoxAccessException ) {
  7157. if ( !isAbort ) {
  7158. complete( -1, firefoxAccessException );
  7159. }
  7160. }
  7161. // Call complete if needed
  7162. if ( responses ) {
  7163. complete( status, statusText, responses, responseHeaders );
  7164. }
  7165. };
  7166. if ( !s.async ) {
  7167. // if we're in sync mode we fire the callback
  7168. callback();
  7169. } else if ( xhr.readyState === 4 ) {
  7170. // (IE6 & IE7) if it's in cache and has been
  7171. // retrieved directly we need to fire the callback
  7172. setTimeout( callback, 0 );
  7173. } else {
  7174. handle = ++xhrId;
  7175. if ( xhrOnUnloadAbort ) {
  7176. // Create the active xhrs callbacks list if needed
  7177. // and attach the unload handler
  7178. if ( !xhrCallbacks ) {
  7179. xhrCallbacks = {};
  7180. jQuery( window ).unload( xhrOnUnloadAbort );
  7181. }
  7182. // Add to list of active xhrs callbacks
  7183. xhrCallbacks[ handle ] = callback;
  7184. }
  7185. xhr.onreadystatechange = callback;
  7186. }
  7187. },
  7188. abort: function() {
  7189. if ( callback ) {
  7190. callback(0,1);
  7191. }
  7192. }
  7193. };
  7194. }
  7195. });
  7196. }
  7197. var fxNow, timerId,
  7198. rfxtypes = /^(?:toggle|show|hide)$/,
  7199. rfxnum = new RegExp( "^(?:([-+])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
  7200. rrun = /queueHooks$/,
  7201. animationPrefilters = [ defaultPrefilter ],
  7202. tweeners = {
  7203. "*": [function( prop, value ) {
  7204. var end, unit,
  7205. tween = this.createTween( prop, value ),
  7206. parts = rfxnum.exec( value ),
  7207. target = tween.cur(),
  7208. start = +target || 0,
  7209. scale = 1,
  7210. maxIterations = 20;
  7211. if ( parts ) {
  7212. end = +parts[2];
  7213. unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
  7214. // We need to compute starting value
  7215. if ( unit !== "px" && start ) {
  7216. // Iteratively approximate from a nonzero starting point
  7217. // Prefer the current property, because this process will be trivial if it uses the same units
  7218. // Fallback to end or a simple constant
  7219. start = jQuery.css( tween.elem, prop, true ) || end || 1;
  7220. do {
  7221. // If previous iteration zeroed out, double until we get *something*
  7222. // Use a string for doubling factor so we don't accidentally see scale as unchanged below
  7223. scale = scale || ".5";
  7224. // Adjust and apply
  7225. start = start / scale;
  7226. jQuery.style( tween.elem, prop, start + unit );
  7227. // Update scale, tolerating zero or NaN from tween.cur()
  7228. // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
  7229. } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
  7230. }
  7231. tween.unit = unit;
  7232. tween.start = start;
  7233. // If a +=/-= token was provided, we're doing a relative animation
  7234. tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
  7235. }
  7236. return tween;
  7237. }]
  7238. };
  7239. // Animations created synchronously will run synchronously
  7240. function createFxNow() {
  7241. setTimeout(function() {
  7242. fxNow = undefined;
  7243. }, 0 );
  7244. return ( fxNow = jQuery.now() );
  7245. }
  7246. function createTweens( animation, props ) {
  7247. jQuery.each( props, function( prop, value ) {
  7248. var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
  7249. index = 0,
  7250. length = collection.length;
  7251. for ( ; index < length; index++ ) {
  7252. if ( collection[ index ].call( animation, prop, value ) ) {
  7253. // we're done with this property
  7254. return;
  7255. }
  7256. }
  7257. });
  7258. }
  7259. function Animation( elem, properties, options ) {
  7260. var result,
  7261. index = 0,
  7262. tweenerIndex = 0,
  7263. length = animationPrefilters.length,
  7264. deferred = jQuery.Deferred().always( function() {
  7265. // don't match elem in the :animated selector
  7266. delete tick.elem;
  7267. }),
  7268. tick = function() {
  7269. var currentTime = fxNow || createFxNow(),
  7270. remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
  7271. // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
  7272. temp = remaining / animation.duration || 0,
  7273. percent = 1 - temp,
  7274. index = 0,
  7275. length = animation.tweens.length;
  7276. for ( ; index < length ; index++ ) {
  7277. animation.tweens[ index ].run( percent );
  7278. }
  7279. deferred.notifyWith( elem, [ animation, percent, remaining ]);
  7280. if ( percent < 1 && length ) {
  7281. return remaining;
  7282. } else {
  7283. deferred.resolveWith( elem, [ animation ] );
  7284. return false;
  7285. }
  7286. },
  7287. animation = deferred.promise({
  7288. elem: elem,
  7289. props: jQuery.extend( {}, properties ),
  7290. opts: jQuery.extend( true, { specialEasing: {} }, options ),
  7291. originalProperties: properties,
  7292. originalOptions: options,
  7293. startTime: fxNow || createFxNow(),
  7294. duration: options.duration,
  7295. tweens: [],
  7296. createTween: function( prop, end, easing ) {
  7297. var tween = jQuery.Tween( elem, animation.opts, prop, end,
  7298. animation.opts.specialEasing[ prop ] || animation.opts.easing );
  7299. animation.tweens.push( tween );
  7300. return tween;
  7301. },
  7302. stop: function( gotoEnd ) {
  7303. var index = 0,
  7304. // if we are going to the end, we want to run all the tweens
  7305. // otherwise we skip this part
  7306. length = gotoEnd ? animation.tweens.length : 0;
  7307. for ( ; index < length ; index++ ) {
  7308. animation.tweens[ index ].run( 1 );
  7309. }
  7310. // resolve when we played the last frame
  7311. // otherwise, reject
  7312. if ( gotoEnd ) {
  7313. deferred.resolveWith( elem, [ animation, gotoEnd ] );
  7314. } else {
  7315. deferred.rejectWith( elem, [ animation, gotoEnd ] );
  7316. }
  7317. return this;
  7318. }
  7319. }),
  7320. props = animation.props;
  7321. propFilter( props, animation.opts.specialEasing );
  7322. for ( ; index < length ; index++ ) {
  7323. result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
  7324. if ( result ) {
  7325. return result;
  7326. }
  7327. }
  7328. createTweens( animation, props );
  7329. if ( jQuery.isFunction( animation.opts.start ) ) {
  7330. animation.opts.start.call( elem, animation );
  7331. }
  7332. jQuery.fx.timer(
  7333. jQuery.extend( tick, {
  7334. anim: animation,
  7335. queue: animation.opts.queue,
  7336. elem: elem
  7337. })
  7338. );
  7339. // attach callbacks from options
  7340. return animation.progress( animation.opts.progress )
  7341. .done( animation.opts.done, animation.opts.complete )
  7342. .fail( animation.opts.fail )
  7343. .always( animation.opts.always );
  7344. }
  7345. function propFilter( props, specialEasing ) {
  7346. var index, name, easing, value, hooks;
  7347. // camelCase, specialEasing and expand cssHook pass
  7348. for ( index in props ) {
  7349. name = jQuery.camelCase( index );
  7350. easing = specialEasing[ name ];
  7351. value = props[ index ];
  7352. if ( jQuery.isArray( value ) ) {
  7353. easing = value[ 1 ];
  7354. value = props[ index ] = value[ 0 ];
  7355. }
  7356. if ( index !== name ) {
  7357. props[ name ] = value;
  7358. delete props[ index ];
  7359. }
  7360. hooks = jQuery.cssHooks[ name ];
  7361. if ( hooks && "expand" in hooks ) {
  7362. value = hooks.expand( value );
  7363. delete props[ name ];
  7364. // not quite $.extend, this wont overwrite keys already present.
  7365. // also - reusing 'index' from above because we have the correct "name"
  7366. for ( index in value ) {
  7367. if ( !( index in props ) ) {
  7368. props[ index ] = value[ index ];
  7369. specialEasing[ index ] = easing;
  7370. }
  7371. }
  7372. } else {
  7373. specialEasing[ name ] = easing;
  7374. }
  7375. }
  7376. }
  7377. jQuery.Animation = jQuery.extend( Animation, {
  7378. tweener: function( props, callback ) {
  7379. if ( jQuery.isFunction( props ) ) {
  7380. callback = props;
  7381. props = [ "*" ];
  7382. } else {
  7383. props = props.split(" ");
  7384. }
  7385. var prop,
  7386. index = 0,
  7387. length = props.length;
  7388. for ( ; index < length ; index++ ) {
  7389. prop = props[ index ];
  7390. tweeners[ prop ] = tweeners[ prop ] || [];
  7391. tweeners[ prop ].unshift( callback );
  7392. }
  7393. },
  7394. prefilter: function( callback, prepend ) {
  7395. if ( prepend ) {
  7396. animationPrefilters.unshift( callback );
  7397. } else {
  7398. animationPrefilters.push( callback );
  7399. }
  7400. }
  7401. });
  7402. function defaultPrefilter( elem, props, opts ) {
  7403. var index, prop, value, length, dataShow, toggle, tween, hooks, oldfire,
  7404. anim = this,
  7405. style = elem.style,
  7406. orig = {},
  7407. handled = [],
  7408. hidden = elem.nodeType && isHidden( elem );
  7409. // handle queue: false promises
  7410. if ( !opts.queue ) {
  7411. hooks = jQuery._queueHooks( elem, "fx" );
  7412. if ( hooks.unqueued == null ) {
  7413. hooks.unqueued = 0;
  7414. oldfire = hooks.empty.fire;
  7415. hooks.empty.fire = function() {
  7416. if ( !hooks.unqueued ) {
  7417. oldfire();
  7418. }
  7419. };
  7420. }
  7421. hooks.unqueued++;
  7422. anim.always(function() {
  7423. // doing this makes sure that the complete handler will be called
  7424. // before this completes
  7425. anim.always(function() {
  7426. hooks.unqueued--;
  7427. if ( !jQuery.queue( elem, "fx" ).length ) {
  7428. hooks.empty.fire();
  7429. }
  7430. });
  7431. });
  7432. }
  7433. // height/width overflow pass
  7434. if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
  7435. // Make sure that nothing sneaks out
  7436. // Record all 3 overflow attributes because IE does not
  7437. // change the overflow attribute when overflowX and
  7438. // overflowY are set to the same value
  7439. opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
  7440. // Set display property to inline-block for height/width
  7441. // animations on inline elements that are having width/height animated
  7442. if ( jQuery.css( elem, "display" ) === "inline" &&
  7443. jQuery.css( elem, "float" ) === "none" ) {
  7444. // inline-level elements accept inline-block;
  7445. // block-level elements need to be inline with layout
  7446. if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
  7447. style.display = "inline-block";
  7448. } else {
  7449. style.zoom = 1;
  7450. }
  7451. }
  7452. }
  7453. if ( opts.overflow ) {
  7454. style.overflow = "hidden";
  7455. if ( !jQuery.support.shrinkWrapBlocks ) {
  7456. anim.done(function() {
  7457. style.overflow = opts.overflow[ 0 ];
  7458. style.overflowX = opts.overflow[ 1 ];
  7459. style.overflowY = opts.overflow[ 2 ];
  7460. });
  7461. }
  7462. }
  7463. // show/hide pass
  7464. for ( index in props ) {
  7465. value = props[ index ];
  7466. if ( rfxtypes.exec( value ) ) {
  7467. delete props[ index ];
  7468. toggle = toggle || value === "toggle";
  7469. if ( value === ( hidden ? "hide" : "show" ) ) {
  7470. continue;
  7471. }
  7472. handled.push( index );
  7473. }
  7474. }
  7475. length = handled.length;
  7476. if ( length ) {
  7477. dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
  7478. if ( "hidden" in dataShow ) {
  7479. hidden = dataShow.hidden;
  7480. }
  7481. // store state if its toggle - enables .stop().toggle() to "reverse"
  7482. if ( toggle ) {
  7483. dataShow.hidden = !hidden;
  7484. }
  7485. if ( hidden ) {
  7486. jQuery( elem ).show();
  7487. } else {
  7488. anim.done(function() {
  7489. jQuery( elem ).hide();
  7490. });
  7491. }
  7492. anim.done(function() {
  7493. var prop;
  7494. jQuery.removeData( elem, "fxshow", true );
  7495. for ( prop in orig ) {
  7496. jQuery.style( elem, prop, orig[ prop ] );
  7497. }
  7498. });
  7499. for ( index = 0 ; index < length ; index++ ) {
  7500. prop = handled[ index ];
  7501. tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
  7502. orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
  7503. if ( !( prop in dataShow ) ) {
  7504. dataShow[ prop ] = tween.start;
  7505. if ( hidden ) {
  7506. tween.end = tween.start;
  7507. tween.start = prop === "width" || prop === "height" ? 1 : 0;
  7508. }
  7509. }
  7510. }
  7511. }
  7512. }
  7513. function Tween( elem, options, prop, end, easing ) {
  7514. return new Tween.prototype.init( elem, options, prop, end, easing );
  7515. }
  7516. jQuery.Tween = Tween;
  7517. Tween.prototype = {
  7518. constructor: Tween,
  7519. init: function( elem, options, prop, end, easing, unit ) {
  7520. this.elem = elem;
  7521. this.prop = prop;
  7522. this.easing = easing || "swing";
  7523. this.options = options;
  7524. this.start = this.now = this.cur();
  7525. this.end = end;
  7526. this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
  7527. },
  7528. cur: function() {
  7529. var hooks = Tween.propHooks[ this.prop ];
  7530. return hooks && hooks.get ?
  7531. hooks.get( this ) :
  7532. Tween.propHooks._default.get( this );
  7533. },
  7534. run: function( percent ) {
  7535. var eased,
  7536. hooks = Tween.propHooks[ this.prop ];
  7537. if ( this.options.duration ) {
  7538. this.pos = eased = jQuery.easing[ this.easing ](
  7539. percent, this.options.duration * percent, 0, 1, this.options.duration
  7540. );
  7541. } else {
  7542. this.pos = eased = percent;
  7543. }
  7544. this.now = ( this.end - this.start ) * eased + this.start;
  7545. if ( this.options.step ) {
  7546. this.options.step.call( this.elem, this.now, this );
  7547. }
  7548. if ( hooks && hooks.set ) {
  7549. hooks.set( this );
  7550. } else {
  7551. Tween.propHooks._default.set( this );
  7552. }
  7553. return this;
  7554. }
  7555. };
  7556. Tween.prototype.init.prototype = Tween.prototype;
  7557. Tween.propHooks = {
  7558. _default: {
  7559. get: function( tween ) {
  7560. var result;
  7561. if ( tween.elem[ tween.prop ] != null &&
  7562. (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
  7563. return tween.elem[ tween.prop ];
  7564. }
  7565. // passing any value as a 4th parameter to .css will automatically
  7566. // attempt a parseFloat and fallback to a string if the parse fails
  7567. // so, simple values such as "10px" are parsed to Float.
  7568. // complex values such as "rotate(1rad)" are returned as is.
  7569. result = jQuery.css( tween.elem, tween.prop, false, "" );
  7570. // Empty strings, null, undefined and "auto" are converted to 0.
  7571. return !result || result === "auto" ? 0 : result;
  7572. },
  7573. set: function( tween ) {
  7574. // use step hook for back compat - use cssHook if its there - use .style if its
  7575. // available and use plain properties where available
  7576. if ( jQuery.fx.step[ tween.prop ] ) {
  7577. jQuery.fx.step[ tween.prop ]( tween );
  7578. } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
  7579. jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
  7580. } else {
  7581. tween.elem[ tween.prop ] = tween.now;
  7582. }
  7583. }
  7584. }
  7585. };
  7586. // Remove in 2.0 - this supports IE8's panic based approach
  7587. // to setting things on disconnected nodes
  7588. Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
  7589. set: function( tween ) {
  7590. if ( tween.elem.nodeType && tween.elem.parentNode ) {
  7591. tween.elem[ tween.prop ] = tween.now;
  7592. }
  7593. }
  7594. };
  7595. jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
  7596. var cssFn = jQuery.fn[ name ];
  7597. jQuery.fn[ name ] = function( speed, easing, callback ) {
  7598. return speed == null || typeof speed === "boolean" ||
  7599. // special check for .toggle( handler, handler, ... )
  7600. ( !i && jQuery.isFunction( speed ) && jQuery.isFunction( easing ) ) ?
  7601. cssFn.apply( this, arguments ) :
  7602. this.animate( genFx( name, true ), speed, easing, callback );
  7603. };
  7604. });
  7605. jQuery.fn.extend({
  7606. fadeTo: function( speed, to, easing, callback ) {
  7607. // show any hidden elements after setting opacity to 0
  7608. return this.filter( isHidden ).css( "opacity", 0 ).show()
  7609. // animate to the value specified
  7610. .end().animate({ opacity: to }, speed, easing, callback );
  7611. },
  7612. animate: function( prop, speed, easing, callback ) {
  7613. var empty = jQuery.isEmptyObject( prop ),
  7614. optall = jQuery.speed( speed, easing, callback ),
  7615. doAnimation = function() {
  7616. // Operate on a copy of prop so per-property easing won't be lost
  7617. var anim = Animation( this, jQuery.extend( {}, prop ), optall );
  7618. // Empty animations resolve immediately
  7619. if ( empty ) {
  7620. anim.stop( true );
  7621. }
  7622. };
  7623. return empty || optall.queue === false ?
  7624. this.each( doAnimation ) :
  7625. this.queue( optall.queue, doAnimation );
  7626. },
  7627. stop: function( type, clearQueue, gotoEnd ) {
  7628. var stopQueue = function( hooks ) {
  7629. var stop = hooks.stop;
  7630. delete hooks.stop;
  7631. stop( gotoEnd );
  7632. };
  7633. if ( typeof type !== "string" ) {
  7634. gotoEnd = clearQueue;
  7635. clearQueue = type;
  7636. type = undefined;
  7637. }
  7638. if ( clearQueue && type !== false ) {
  7639. this.queue( type || "fx", [] );
  7640. }
  7641. return this.each(function() {
  7642. var dequeue = true,
  7643. index = type != null && type + "queueHooks",
  7644. timers = jQuery.timers,
  7645. data = jQuery._data( this );
  7646. if ( index ) {
  7647. if ( data[ index ] && data[ index ].stop ) {
  7648. stopQueue( data[ index ] );
  7649. }
  7650. } else {
  7651. for ( index in data ) {
  7652. if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
  7653. stopQueue( data[ index ] );
  7654. }
  7655. }
  7656. }
  7657. for ( index = timers.length; index--; ) {
  7658. if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
  7659. timers[ index ].anim.stop( gotoEnd );
  7660. dequeue = false;
  7661. timers.splice( index, 1 );
  7662. }
  7663. }
  7664. // start the next in the queue if the last step wasn't forced
  7665. // timers currently will call their complete callbacks, which will dequeue
  7666. // but only if they were gotoEnd
  7667. if ( dequeue || !gotoEnd ) {
  7668. jQuery.dequeue( this, type );
  7669. }
  7670. });
  7671. }
  7672. });
  7673. // Generate parameters to create a standard animation
  7674. function genFx( type, includeWidth ) {
  7675. var which,
  7676. attrs = { height: type },
  7677. i = 0;
  7678. // if we include width, step value is 1 to do all cssExpand values,
  7679. // if we don't include width, step value is 2 to skip over Left and Right
  7680. includeWidth = includeWidth? 1 : 0;
  7681. for( ; i < 4 ; i += 2 - includeWidth ) {
  7682. which = cssExpand[ i ];
  7683. attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
  7684. }
  7685. if ( includeWidth ) {
  7686. attrs.opacity = attrs.width = type;
  7687. }
  7688. return attrs;
  7689. }
  7690. // Generate shortcuts for custom animations
  7691. jQuery.each({
  7692. slideDown: genFx("show"),
  7693. slideUp: genFx("hide"),
  7694. slideToggle: genFx("toggle"),
  7695. fadeIn: { opacity: "show" },
  7696. fadeOut: { opacity: "hide" },
  7697. fadeToggle: { opacity: "toggle" }
  7698. }, function( name, props ) {
  7699. jQuery.fn[ name ] = function( speed, easing, callback ) {
  7700. return this.animate( props, speed, easing, callback );
  7701. };
  7702. });
  7703. jQuery.speed = function( speed, easing, fn ) {
  7704. var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
  7705. complete: fn || !fn && easing ||
  7706. jQuery.isFunction( speed ) && speed,
  7707. duration: speed,
  7708. easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
  7709. };
  7710. opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
  7711. opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
  7712. // normalize opt.queue - true/undefined/null -> "fx"
  7713. if ( opt.queue == null || opt.queue === true ) {
  7714. opt.queue = "fx";
  7715. }
  7716. // Queueing
  7717. opt.old = opt.complete;
  7718. opt.complete = function() {
  7719. if ( jQuery.isFunction( opt.old ) ) {
  7720. opt.old.call( this );
  7721. }
  7722. if ( opt.queue ) {
  7723. jQuery.dequeue( this, opt.queue );
  7724. }
  7725. };
  7726. return opt;
  7727. };
  7728. jQuery.easing = {
  7729. linear: function( p ) {
  7730. return p;
  7731. },
  7732. swing: function( p ) {
  7733. return 0.5 - Math.cos( p*Math.PI ) / 2;
  7734. }
  7735. };
  7736. jQuery.timers = [];
  7737. jQuery.fx = Tween.prototype.init;
  7738. jQuery.fx.tick = function() {
  7739. var timer,
  7740. timers = jQuery.timers,
  7741. i = 0;
  7742. fxNow = jQuery.now();
  7743. for ( ; i < timers.length; i++ ) {
  7744. timer = timers[ i ];
  7745. // Checks the timer has not already been removed
  7746. if ( !timer() && timers[ i ] === timer ) {
  7747. timers.splice( i--, 1 );
  7748. }
  7749. }
  7750. if ( !timers.length ) {
  7751. jQuery.fx.stop();
  7752. }
  7753. fxNow = undefined;
  7754. };
  7755. jQuery.fx.timer = function( timer ) {
  7756. if ( timer() && jQuery.timers.push( timer ) && !timerId ) {
  7757. timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
  7758. }
  7759. };
  7760. jQuery.fx.interval = 13;
  7761. jQuery.fx.stop = function() {
  7762. clearInterval( timerId );
  7763. timerId = null;
  7764. };
  7765. jQuery.fx.speeds = {
  7766. slow: 600,
  7767. fast: 200,
  7768. // Default speed
  7769. _default: 400
  7770. };
  7771. // Back Compat <1.8 extension point
  7772. jQuery.fx.step = {};
  7773. if ( jQuery.expr && jQuery.expr.filters ) {
  7774. jQuery.expr.filters.animated = function( elem ) {
  7775. return jQuery.grep(jQuery.timers, function( fn ) {
  7776. return elem === fn.elem;
  7777. }).length;
  7778. };
  7779. }
  7780. var rroot = /^(?:body|html)$/i;
  7781. jQuery.fn.offset = function( options ) {
  7782. if ( arguments.length ) {
  7783. return options === undefined ?
  7784. this :
  7785. this.each(function( i ) {
  7786. jQuery.offset.setOffset( this, options, i );
  7787. });
  7788. }
  7789. var docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft,
  7790. box = { top: 0, left: 0 },
  7791. elem = this[ 0 ],
  7792. doc = elem && elem.ownerDocument;
  7793. if ( !doc ) {
  7794. return;
  7795. }
  7796. if ( (body = doc.body) === elem ) {
  7797. return jQuery.offset.bodyOffset( elem );
  7798. }
  7799. docElem = doc.documentElement;
  7800. // Make sure it's not a disconnected DOM node
  7801. if ( !jQuery.contains( docElem, elem ) ) {
  7802. return box;
  7803. }
  7804. // If we don't have gBCR, just use 0,0 rather than error
  7805. // BlackBerry 5, iOS 3 (original iPhone)
  7806. if ( typeof elem.getBoundingClientRect !== "undefined" ) {
  7807. box = elem.getBoundingClientRect();
  7808. }
  7809. win = getWindow( doc );
  7810. clientTop = docElem.clientTop || body.clientTop || 0;
  7811. clientLeft = docElem.clientLeft || body.clientLeft || 0;
  7812. scrollTop = win.pageYOffset || docElem.scrollTop;
  7813. scrollLeft = win.pageXOffset || docElem.scrollLeft;
  7814. return {
  7815. top: box.top + scrollTop - clientTop,
  7816. left: box.left + scrollLeft - clientLeft
  7817. };
  7818. };
  7819. jQuery.offset = {
  7820. bodyOffset: function( body ) {
  7821. var top = body.offsetTop,
  7822. left = body.offsetLeft;
  7823. if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
  7824. top += parseFloat( jQuery.css(body, "marginTop") ) || 0;
  7825. left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
  7826. }
  7827. return { top: top, left: left };
  7828. },
  7829. setOffset: function( elem, options, i ) {
  7830. var position = jQuery.css( elem, "position" );
  7831. // set position first, in-case top/left are set even on static elem
  7832. if ( position === "static" ) {
  7833. elem.style.position = "relative";
  7834. }
  7835. var curElem = jQuery( elem ),
  7836. curOffset = curElem.offset(),
  7837. curCSSTop = jQuery.css( elem, "top" ),
  7838. curCSSLeft = jQuery.css( elem, "left" ),
  7839. calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
  7840. props = {}, curPosition = {}, curTop, curLeft;
  7841. // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
  7842. if ( calculatePosition ) {
  7843. curPosition = curElem.position();
  7844. curTop = curPosition.top;
  7845. curLeft = curPosition.left;
  7846. } else {
  7847. curTop = parseFloat( curCSSTop ) || 0;
  7848. curLeft = parseFloat( curCSSLeft ) || 0;
  7849. }
  7850. if ( jQuery.isFunction( options ) ) {
  7851. options = options.call( elem, i, curOffset );
  7852. }
  7853. if ( options.top != null ) {
  7854. props.top = ( options.top - curOffset.top ) + curTop;
  7855. }
  7856. if ( options.left != null ) {
  7857. props.left = ( options.left - curOffset.left ) + curLeft;
  7858. }
  7859. if ( "using" in options ) {
  7860. options.using.call( elem, props );
  7861. } else {
  7862. curElem.css( props );
  7863. }
  7864. }
  7865. };
  7866. jQuery.fn.extend({
  7867. position: function() {
  7868. if ( !this[0] ) {
  7869. return;
  7870. }
  7871. var elem = this[0],
  7872. // Get *real* offsetParent
  7873. offsetParent = this.offsetParent(),
  7874. // Get correct offsets
  7875. offset = this.offset(),
  7876. parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
  7877. // Subtract element margins
  7878. // note: when an element has margin: auto the offsetLeft and marginLeft
  7879. // are the same in Safari causing offset.left to incorrectly be 0
  7880. offset.top -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
  7881. offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
  7882. // Add offsetParent borders
  7883. parentOffset.top += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
  7884. parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
  7885. // Subtract the two offsets
  7886. return {
  7887. top: offset.top - parentOffset.top,
  7888. left: offset.left - parentOffset.left
  7889. };
  7890. },
  7891. offsetParent: function() {
  7892. return this.map(function() {
  7893. var offsetParent = this.offsetParent || document.body;
  7894. while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
  7895. offsetParent = offsetParent.offsetParent;
  7896. }
  7897. return offsetParent || document.body;
  7898. });
  7899. }
  7900. });
  7901. // Create scrollLeft and scrollTop methods
  7902. jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
  7903. var top = /Y/.test( prop );
  7904. jQuery.fn[ method ] = function( val ) {
  7905. return jQuery.access( this, function( elem, method, val ) {
  7906. var win = getWindow( elem );
  7907. if ( val === undefined ) {
  7908. return win ? (prop in win) ? win[ prop ] :
  7909. win.document.documentElement[ method ] :
  7910. elem[ method ];
  7911. }
  7912. if ( win ) {
  7913. win.scrollTo(
  7914. !top ? val : jQuery( win ).scrollLeft(),
  7915. top ? val : jQuery( win ).scrollTop()
  7916. );
  7917. } else {
  7918. elem[ method ] = val;
  7919. }
  7920. }, method, val, arguments.length, null );
  7921. };
  7922. });
  7923. function getWindow( elem ) {
  7924. return jQuery.isWindow( elem ) ?
  7925. elem :
  7926. elem.nodeType === 9 ?
  7927. elem.defaultView || elem.parentWindow :
  7928. false;
  7929. }
  7930. // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
  7931. jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
  7932. jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
  7933. // margin is only for outerHeight, outerWidth
  7934. jQuery.fn[ funcName ] = function( margin, value ) {
  7935. var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
  7936. extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
  7937. return jQuery.access( this, function( elem, type, value ) {
  7938. var doc;
  7939. if ( jQuery.isWindow( elem ) ) {
  7940. // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
  7941. // isn't a whole lot we can do. See pull request at this URL for discussion:
  7942. // https://github.com/jquery/jquery/pull/764
  7943. return elem.document.documentElement[ "client" + name ];
  7944. }
  7945. // Get document width or height
  7946. if ( elem.nodeType === 9 ) {
  7947. doc = elem.documentElement;
  7948. // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
  7949. // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
  7950. return Math.max(
  7951. elem.body[ "scroll" + name ], doc[ "scroll" + name ],
  7952. elem.body[ "offset" + name ], doc[ "offset" + name ],
  7953. doc[ "client" + name ]
  7954. );
  7955. }
  7956. return value === undefined ?
  7957. // Get width or height on the element, requesting but not forcing parseFloat
  7958. jQuery.css( elem, type, value, extra ) :
  7959. // Set width or height on the element
  7960. jQuery.style( elem, type, value, extra );
  7961. }, type, chainable ? margin : undefined, chainable, null );
  7962. };
  7963. });
  7964. });
  7965. // Expose jQuery to the global object
  7966. window.jQuery = window.$ = jQuery;
  7967. // Expose jQuery as an AMD module, but only for AMD loaders that
  7968. // understand the issues with loading multiple versions of jQuery
  7969. // in a page that all might call define(). The loader will indicate
  7970. // they have special allowances for multiple jQuery versions by
  7971. // specifying define.amd.jQuery = true. Register as a named module,
  7972. // since jQuery can be concatenated with other files that may use define,
  7973. // but not use a proper concatenation script that understands anonymous
  7974. // AMD modules. A named AMD is safest and most robust way to register.
  7975. // Lowercase jquery is used because AMD module names are derived from
  7976. // file names, and jQuery is normally delivered in a lowercase file name.
  7977. // Do this after creating the global so that if an AMD module wants to call
  7978. // noConflict to hide this version of jQuery, it will work.
  7979. if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
  7980. define( "jquery", [], function () { return jQuery; } );
  7981. }
  7982. })( window );
  7983. </script>
  7984. <script type="application/javascript">
  7985. (function($){$.extend({tablesorter:new
  7986. function(){var parsers=[],widgets=[];this.defaults={cssHeader:"header",cssAsc:"headerSortUp",cssDesc:"headerSortDown",cssChildRow:"expand-child",sortInitialOrder:"asc",sortMultiSortKey:"shiftKey",sortForce:null,sortAppend:null,sortLocaleCompare:true,textExtraction:"simple",parsers:{},widgets:[],widgetZebra:{css:["even","odd"]},headers:{},widthFixed:false,cancelSelection:true,sortList:[],headerList:[],dateFormat:"us",decimal:'/\.|\,/g',onRenderHeader:null,selectorHeaders:'thead th',debug:false};function benchmark(s,d){log(s+","+(new Date().getTime()-d.getTime())+"ms");}this.benchmark=benchmark;function log(s){if(typeof console!="undefined"&&typeof console.debug!="undefined"){console.log(s);}else{alert(s);}}function buildParserCache(table,$headers){if(table.config.debug){var parsersDebug="";}if(table.tBodies.length==0)return;var rows=table.tBodies[0].rows;if(rows[0]){var list=[],cells=rows[0].cells,l=cells.length;for(var i=0;i<l;i++){var p=false;if($.metadata&&($($headers[i]).metadata()&&$($headers[i]).metadata().sorter)){p=getParserById($($headers[i]).metadata().sorter);}else if((table.config.headers[i]&&table.config.headers[i].sorter)){p=getParserById(table.config.headers[i].sorter);}if(!p){p=detectParserForColumn(table,rows,-1,i);}if(table.config.debug){parsersDebug+="column:"+i+" parser:"+p.id+"\n";}list.push(p);}}if(table.config.debug){log(parsersDebug);}return list;};function detectParserForColumn(table,rows,rowIndex,cellIndex){var l=parsers.length,node=false,nodeValue=false,keepLooking=true;while(nodeValue==''&&keepLooking){rowIndex++;if(rows[rowIndex]){node=getNodeFromRowAndCellIndex(rows,rowIndex,cellIndex);nodeValue=trimAndGetNodeText(table.config,node);if(table.config.debug){log('Checking if value was empty on row:'+rowIndex);}}else{keepLooking=false;}}for(var i=1;i<l;i++){if(parsers[i].is(nodeValue,table,node)){return parsers[i];}}return parsers[0];}function getNodeFromRowAndCellIndex(rows,rowIndex,cellIndex){return rows[rowIndex].cells[cellIndex];}function trimAndGetNodeText(config,node){return $.trim(getElementText(config,node));}function getParserById(name){var l=parsers.length;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==name.toLowerCase()){return parsers[i];}}return false;}function buildCache(table){if(table.config.debug){var cacheTime=new Date();}var totalRows=(table.tBodies[0]&&table.tBodies[0].rows.length)||0,totalCells=(table.tBodies[0].rows[0]&&table.tBodies[0].rows[0].cells.length)||0,parsers=table.config.parsers,cache={row:[],normalized:[]};for(var i=0;i<totalRows;++i){var c=$(table.tBodies[0].rows[i]),cols=[];if(c.hasClass(table.config.cssChildRow)){cache.row[cache.row.length-1]=cache.row[cache.row.length-1].add(c);continue;}cache.row.push(c);for(var j=0;j<totalCells;++j){cols.push(parsers[j].format(getElementText(table.config,c[0].cells[j]),table,c[0].cells[j]));}cols.push(cache.normalized.length);cache.normalized.push(cols);cols=null;};if(table.config.debug){benchmark("Building cache for "+totalRows+" rows:",cacheTime);}return cache;};function getElementText(config,node){var text="";if(!node)return"";if(!config.supportsTextContent)config.supportsTextContent=node.textContent||false;if(config.textExtraction=="simple"){if(config.supportsTextContent){text=node.textContent;}else{if(node.childNodes[0]&&node.childNodes[0].hasChildNodes()){text=node.childNodes[0].innerHTML;}else{text=node.innerHTML;}}}else{if(typeof(config.textExtraction)=="function"){text=config.textExtraction(node);}else{text=$(node).text();}}return text;}function appendToTable(table,cache){if(table.config.debug){var appendTime=new Date()}var c=cache,r=c.row,n=c.normalized,totalRows=n.length,checkCell=(n[0].length-1),tableBody=$(table.tBodies[0]),rows=[];for(var i=0;i<totalRows;i++){var pos=n[i][checkCell];rows.push(r[pos]);if(!table.config.appender){var l=r[pos].length;for(var j=0;j<l;j++){tableBody[0].appendChild(r[pos][j]);}}}if(table.config.appender){table.config.appender(table,rows);}rows=null;if(table.config.debug){benchmark("Rebuilt table:",appendTime);}applyWidget(table);setTimeout(function(){$(table).trigger("sortEnd");},0);};function buildHeaders(table){if(table.config.debug){var time=new Date();}var meta=($.metadata)?true:false;var header_index=computeTableHeaderCellIndexes(table);$tableHeaders=$(table.config.selectorHeaders,table).each(function(index){this.column=header_index[this.parentNode.rowIndex+"-"+this.cellIndex];this.order=formatSortingOrder(table.config.sortInitialOrder);this.count=this.order;if(checkHeaderMetadata(this)||checkHeaderOptions(table,index))this.sortDisabled=true;if(checkHeaderOptionsSortingLocked(table,index))this.order=this.lockedOrder=checkHeaderOptionsSortingLocked(table,index);if(!this.sortDisabled){var $th=$(this).addClass(table.config.cssHeader);if(table.config.onRenderHeader)table.config.onRenderHeader.apply($th);}table.config.headerList[index]=this;});if(table.config.debug){benchmark("Built headers:",time);log($tableHeaders);}return $tableHeaders;};function computeTableHeaderCellIndexes(t){var matrix=[];var lookup={};var thead=t.getElementsByTagName('THEAD')[0];var trs=thead.getElementsByTagName('TR');for(var i=0;i<trs.length;i++){var cells=trs[i].cells;for(var j=0;j<cells.length;j++){var c=cells[j];var rowIndex=c.parentNode.rowIndex;var cellId=rowIndex+"-"+c.cellIndex;var rowSpan=c.rowSpan||1;var colSpan=c.colSpan||1
  7987. var firstAvailCol;if(typeof(matrix[rowIndex])=="undefined"){matrix[rowIndex]=[];}for(var k=0;k<matrix[rowIndex].length+1;k++){if(typeof(matrix[rowIndex][k])=="undefined"){firstAvailCol=k;break;}}lookup[cellId]=firstAvailCol;for(var k=rowIndex;k<rowIndex+rowSpan;k++){if(typeof(matrix[k])=="undefined"){matrix[k]=[];}var matrixrow=matrix[k];for(var l=firstAvailCol;l<firstAvailCol+colSpan;l++){matrixrow[l]="x";}}}}return lookup;}function checkCellColSpan(table,rows,row){var arr=[],r=table.tHead.rows,c=r[row].cells;for(var i=0;i<c.length;i++){var cell=c[i];if(cell.colSpan>1){arr=arr.concat(checkCellColSpan(table,headerArr,row++));}else{if(table.tHead.length==1||(cell.rowSpan>1||!r[row+1])){arr.push(cell);}}}return arr;};function checkHeaderMetadata(cell){if(($.metadata)&&($(cell).metadata().sorter===false)){return true;};return false;}function checkHeaderOptions(table,i){if((table.config.headers[i])&&(table.config.headers[i].sorter===false)){return true;};return false;}function checkHeaderOptionsSortingLocked(table,i){if((table.config.headers[i])&&(table.config.headers[i].lockedOrder))return table.config.headers[i].lockedOrder;return false;}function applyWidget(table){var c=table.config.widgets;var l=c.length;for(var i=0;i<l;i++){getWidgetById(c[i]).format(table);}}function getWidgetById(name){var l=widgets.length;for(var i=0;i<l;i++){if(widgets[i].id.toLowerCase()==name.toLowerCase()){return widgets[i];}}};function formatSortingOrder(v){if(typeof(v)!="Number"){return(v.toLowerCase()=="desc")?1:0;}else{return(v==1)?1:0;}}function isValueInArray(v,a){var l=a.length;for(var i=0;i<l;i++){if(a[i][0]==v){return true;}}return false;}function setHeadersCss(table,$headers,list,css){$headers.removeClass(css[0]).removeClass(css[1]);var h=[];$headers.each(function(offset){if(!this.sortDisabled){h[this.column]=$(this);}});var l=list.length;for(var i=0;i<l;i++){h[list[i][0]].addClass(css[list[i][1]]);}}function fixColumnWidth(table,$headers){var c=table.config;if(c.widthFixed){var colgroup=$('<colgroup>');$("tr:first td",table.tBodies[0]).each(function(){colgroup.append($('<col>').css('width',$(this).width()));});$(table).prepend(colgroup);};}function updateHeaderSortCount(table,sortList){var c=table.config,l=sortList.length;for(var i=0;i<l;i++){var s=sortList[i],o=c.headerList[s[0]];o.count=s[1];o.count++;}}function multisort(table,sortList,cache){if(table.config.debug){var sortTime=new Date();}var dynamicExp="var sortWrapper = function(a,b) {",l=sortList.length;for(var i=0;i<l;i++){var c=sortList[i][0];var order=sortList[i][1];var s=(table.config.parsers[c].type=="text")?((order==0)?makeSortFunction("text","asc",c):makeSortFunction("text","desc",c)):((order==0)?makeSortFunction("numeric","asc",c):makeSortFunction("numeric","desc",c));var e="e"+i;dynamicExp+="var "+e+" = "+s;dynamicExp+="if("+e+") { return "+e+"; } ";dynamicExp+="else { ";}var orgOrderCol=cache.normalized[0].length-1;dynamicExp+="return a["+orgOrderCol+"]-b["+orgOrderCol+"];";for(var i=0;i<l;i++){dynamicExp+="}; ";}dynamicExp+="return 0; ";dynamicExp+="}; ";if(table.config.debug){benchmark("Evaling expression:"+dynamicExp,new Date());}eval(dynamicExp);cache.normalized.sort(sortWrapper);if(table.config.debug){benchmark("Sorting on "+sortList.toString()+" and dir "+order+" time:",sortTime);}return cache;};function makeSortFunction(type,direction,index){var a="a["+index+"]",b="b["+index+"]";if(type=='text'&&direction=='asc'){return"("+a+" == "+b+" ? 0 : ("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : ("+a+" < "+b+") ? -1 : 1 )));";}else if(type=='text'&&direction=='desc'){return"("+a+" == "+b+" ? 0 : ("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : ("+b+" < "+a+") ? -1 : 1 )));";}else if(type=='numeric'&&direction=='asc'){return"("+a+" === null && "+b+" === null) ? 0 :("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : "+a+" - "+b+"));";}else if(type=='numeric'&&direction=='desc'){return"("+a+" === null && "+b+" === null) ? 0 :("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : "+b+" - "+a+"));";}};function makeSortText(i){return"((a["+i+"] < b["+i+"]) ? -1 : ((a["+i+"] > b["+i+"]) ? 1 : 0));";};function makeSortTextDesc(i){return"((b["+i+"] < a["+i+"]) ? -1 : ((b["+i+"] > a["+i+"]) ? 1 : 0));";};function makeSortNumeric(i){return"a["+i+"]-b["+i+"];";};function makeSortNumericDesc(i){return"b["+i+"]-a["+i+"];";};function sortText(a,b){if(table.config.sortLocaleCompare)return a.localeCompare(b);return((a<b)?-1:((a>b)?1:0));};function sortTextDesc(a,b){if(table.config.sortLocaleCompare)return b.localeCompare(a);return((b<a)?-1:((b>a)?1:0));};function sortNumeric(a,b){return a-b;};function sortNumericDesc(a,b){return b-a;};function getCachedSortType(parsers,i){return parsers[i].type;};this.construct=function(settings){return this.each(function(){if(!this.tHead||!this.tBodies)return;var $this,$document,$headers,cache,config,shiftDown=0,sortOrder;this.config={};config=$.extend(this.config,$.tablesorter.defaults,settings);$this=$(this);$.data(this,"tablesorter",config);$headers=buildHeaders(this);this.config.parsers=buildParserCache(this,$headers);cache=buildCache(this);var sortCSS=[config.cssDesc,config.cssAsc];fixColumnWidth(this);$headers.click(function(e){var totalRows=($this[0].tBodies[0]&&$this[0].tBodies[0].rows.length)||0;if(!this.sortDisabled&&totalRows>0){$this.trigger("sortStart");var $cell=$(this);var i=this.column;this.order=this.count++%2;if(this.lockedOrder)this.order=this.lockedOrder;if(!e[config.sortMultiSortKey]){config.sortList=[];if(config.sortForce!=null){var a=config.sortForce;for(var j=0;j<a.length;j++){if(a[j][0]!=i){config.sortList.push(a[j]);}}}config.sortList.push([i,this.order]);}else{if(isValueInArray(i,config.sortList)){for(var j=0;j<config.sortList.length;j++){var s=config.sortList[j],o=config.headerList[s[0]];if(s[0]==i){o.count=s[1];o.count++;s[1]=o.count%2;}}}else{config.sortList.push([i,this.order]);}};setTimeout(function(){setHeadersCss($this[0],$headers,config.sortList,sortCSS);appendToTable($this[0],multisort($this[0],config.sortList,cache));},1);return false;}}).mousedown(function(){if(config.cancelSelection){this.onselectstart=function(){return false};return false;}});$this.bind("update",function(){var me=this;setTimeout(function(){me.config.parsers=buildParserCache(me,$headers);cache=buildCache(me);},1);}).bind("updateCell",function(e,cell){var config=this.config;var pos=[(cell.parentNode.rowIndex-1),cell.cellIndex];cache.normalized[pos[0]][pos[1]]=config.parsers[pos[1]].format(getElementText(config,cell),cell);}).bind("sorton",function(e,list){$(this).trigger("sortStart");config.sortList=list;var sortList=config.sortList;updateHeaderSortCount(this,sortList);setHeadersCss(this,$headers,sortList,sortCSS);appendToTable(this,multisort(this,sortList,cache));}).bind("appendCache",function(){appendToTable(this,cache);}).bind("applyWidgetId",function(e,id){getWidgetById(id).format(this);}).bind("applyWidgets",function(){applyWidget(this);});if($.metadata&&($(this).metadata()&&$(this).metadata().sortlist)){config.sortList=$(this).metadata().sortlist;}if(config.sortList.length>0){$this.trigger("sorton",[config.sortList]);}applyWidget(this);});};this.addParser=function(parser){var l=parsers.length,a=true;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==parser.id.toLowerCase()){a=false;}}if(a){parsers.push(parser);};};this.addWidget=function(widget){widgets.push(widget);};this.formatFloat=function(s){var i=parseFloat(s);return(isNaN(i))?0:i;};this.formatInt=function(s){var i=parseInt(s);return(isNaN(i))?0:i;};this.isDigit=function(s,config){return/^[-+]?\d*$/.test($.trim(s.replace(/[,.']/g,'')));};this.clearTableBody=function(table){if($.browser.msie){function empty(){while(this.firstChild)this.removeChild(this.firstChild);}empty.apply(table.tBodies[0]);}else{table.tBodies[0].innerHTML="";}};}});$.fn.extend({tablesorter:$.tablesorter.construct});var ts=$.tablesorter;ts.addParser({id:"text",is:function(s){return true;},format:function(s){return $.trim(s.toLocaleLowerCase());},type:"text"});ts.addParser({id:"digit",is:function(s,table){var c=table.config;return $.tablesorter.isDigit(s,c);},format:function(s){return $.tablesorter.formatFloat(s);},type:"numeric"});ts.addParser({id:"currency",is:function(s){return/^[£$?.]/.test(s);},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/[£$]/g),""));},type:"numeric"});ts.addParser({id:"ipAddress",is:function(s){return/^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s);},format:function(s){var a=s.split("."),r="",l=a.length;for(var i=0;i<l;i++){var item=a[i];if(item.length==2){r+="0"+item;}else{r+=item;}}return $.tablesorter.formatFloat(r);},type:"numeric"});ts.addParser({id:"url",is:function(s){return/^(https?|ftp|file):\/\/$/.test(s);},format:function(s){return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//),''));},type:"text"});ts.addParser({id:"isoDate",is:function(s){return/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s);},format:function(s){return $.tablesorter.formatFloat((s!="")?new Date(s.replace(new RegExp(/-/g),"/")).getTime():"0");},type:"numeric"});ts.addParser({id:"percent",is:function(s){return/\%$/.test($.trim(s));},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g),""));},type:"numeric"});ts.addParser({id:"usLongDate",is:function(s){return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/));},format:function(s){return $.tablesorter.formatFloat(new Date(s).getTime());},type:"numeric"});ts.addParser({id:"shortDate",is:function(s){return/\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s);},format:function(s,table){var c=table.config;s=s.replace(/\-/g,"/");if(c.dateFormat=="us"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$1/$2");}else if(c.dateFormat=="uk"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$2/$1");}else if(c.dateFormat=="dd/mm/yy"||c.dateFormat=="dd-mm-yy"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/,"$1/$2/$3");}return $.tablesorter.formatFloat(new Date(s).getTime());},type:"numeric"});ts.addParser({id:"time",is:function(s){return/^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s);},format:function(s){return $.tablesorter.formatFloat(new Date("2000/01/01 "+s).getTime());},type:"numeric"});ts.addParser({id:"metadata",is:function(s){return false;},format:function(s,table,cell){var c=table.config,p=(!c.parserMetadataName)?'sortValue':c.parserMetadataName;return $(cell).metadata()[p];},type:"numeric"});ts.addWidget({id:"zebra",format:function(table){if(table.config.debug){var time=new Date();}var $tr,row=-1,odd;$("tr:visible",table.tBodies[0]).each(function(i){$tr=$(this);if(!$tr.hasClass(table.config.cssChildRow))row++;odd=(row%2==0);$tr.removeClass(table.config.widgetZebra.css[odd?0:1]).addClass(table.config.widgetZebra.css[odd?1:0])});if(table.config.debug){$.tablesorter.benchmark("Applying Zebra widget",time);}}});})(jQuery);
  7988. </script>
  7989. <script type="application/javascript">/* Javascript plotting library for jQuery, version 0.8.1.
  7990. Copyright (c) 2007-2013 IOLA and Ole Laursen.
  7991. Licensed under the MIT license.
  7992. */
  7993. // first an inline dependency, jquery.colorhelpers.js, we inline it here
  7994. // for convenience
  7995. /* Plugin for jQuery for working with colors.
  7996. *
  7997. * Version 1.1.
  7998. *
  7999. * Inspiration from jQuery color animation plugin by John Resig.
  8000. *
  8001. * Released under the MIT license by Ole Laursen, October 2009.
  8002. *
  8003. * Examples:
  8004. *
  8005. * $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString()
  8006. * var c = $.color.extract($("#mydiv"), 'background-color');
  8007. * console.log(c.r, c.g, c.b, c.a);
  8008. * $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)"
  8009. *
  8010. * Note that .scale() and .add() return the same modified object
  8011. * instead of making a new one.
  8012. *
  8013. * V. 1.1: Fix error handling so e.g. parsing an empty string does
  8014. * produce a color rather than just crashing.
  8015. */
  8016. (function(B){B.color={};B.color.make=function(F,E,C,D){var G={};G.r=F||0;G.g=E||0;G.b=C||0;G.a=D!=null?D:1;G.add=function(J,I){for(var H=0;H<J.length;++H){G[J.charAt(H)]+=I}return G.normalize()};G.scale=function(J,I){for(var H=0;H<J.length;++H){G[J.charAt(H)]*=I}return G.normalize()};G.toString=function(){if(G.a>=1){return"rgb("+[G.r,G.g,G.b].join(",")+")"}else{return"rgba("+[G.r,G.g,G.b,G.a].join(",")+")"}};G.normalize=function(){function H(J,K,I){return K<J?J:(K>I?I:K)}G.r=H(0,parseInt(G.r),255);G.g=H(0,parseInt(G.g),255);G.b=H(0,parseInt(G.b),255);G.a=H(0,G.a,1);return G};G.clone=function(){return B.color.make(G.r,G.b,G.g,G.a)};return G.normalize()};B.color.extract=function(D,C){var E;do{E=D.css(C).toLowerCase();if(E!=""&&E!="transparent"){break}D=D.parent()}while(!B.nodeName(D.get(0),"body"));if(E=="rgba(0, 0, 0, 0)"){E="transparent"}return B.color.parse(E)};B.color.parse=function(F){var E,C=B.color.make;if(E=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(F)){return C(parseInt(E[1],10),parseInt(E[2],10),parseInt(E[3],10))}if(E=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(F)){return C(parseInt(E[1],10),parseInt(E[2],10),parseInt(E[3],10),parseFloat(E[4]))}if(E=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(F)){return C(parseFloat(E[1])*2.55,parseFloat(E[2])*2.55,parseFloat(E[3])*2.55)}if(E=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(F)){return C(parseFloat(E[1])*2.55,parseFloat(E[2])*2.55,parseFloat(E[3])*2.55,parseFloat(E[4]))}if(E=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(F)){return C(parseInt(E[1],16),parseInt(E[2],16),parseInt(E[3],16))}if(E=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(F)){return C(parseInt(E[1]+E[1],16),parseInt(E[2]+E[2],16),parseInt(E[3]+E[3],16))}var D=B.trim(F).toLowerCase();if(D=="transparent"){return C(255,255,255,0)}else{E=A[D]||[0,0,0];return C(E[0],E[1],E[2])}};var A={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery);
  8017. // the actual Flot code
  8018. (function($) {
  8019. // Cache the prototype hasOwnProperty for faster access
  8020. var hasOwnProperty = Object.prototype.hasOwnProperty;
  8021. ///////////////////////////////////////////////////////////////////////////
  8022. // The Canvas object is a wrapper around an HTML5 <canvas> tag.
  8023. //
  8024. // @constructor
  8025. // @param {string} cls List of classes to apply to the canvas.
  8026. // @param {element} container Element onto which to append the canvas.
  8027. //
  8028. // Requiring a container is a little iffy, but unfortunately canvas
  8029. // operations don't work unless the canvas is attached to the DOM.
  8030. function Canvas(cls, container) {
  8031. var element = container.children("." + cls)[0];
  8032. if (element == null) {
  8033. element = document.createElement("canvas");
  8034. element.className = cls;
  8035. $(element).css({ direction: "ltr", position: "absolute", left: 0, top: 0 })
  8036. .appendTo(container);
  8037. // If HTML5 Canvas isn't available, fall back to [Ex|Flash]canvas
  8038. if (!element.getContext) {
  8039. if (window.G_vmlCanvasManager) {
  8040. element = window.G_vmlCanvasManager.initElement(element);
  8041. } else {
  8042. throw new Error("Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode.");
  8043. }
  8044. }
  8045. }
  8046. this.element = element;
  8047. var context = this.context = element.getContext("2d");
  8048. // Determine the screen's ratio of physical to device-independent
  8049. // pixels. This is the ratio between the canvas width that the browser
  8050. // advertises and the number of pixels actually present in that space.
  8051. // The iPhone 4, for example, has a device-independent width of 320px,
  8052. // but its screen is actually 640px wide. It therefore has a pixel
  8053. // ratio of 2, while most normal devices have a ratio of 1.
  8054. var devicePixelRatio = window.devicePixelRatio || 1,
  8055. backingStoreRatio =
  8056. context.webkitBackingStorePixelRatio ||
  8057. context.mozBackingStorePixelRatio ||
  8058. context.msBackingStorePixelRatio ||
  8059. context.oBackingStorePixelRatio ||
  8060. context.backingStorePixelRatio || 1;
  8061. this.pixelRatio = devicePixelRatio / backingStoreRatio;
  8062. // Size the canvas to match the internal dimensions of its container
  8063. this.resize(container.width(), container.height());
  8064. // Collection of HTML div layers for text overlaid onto the canvas
  8065. this.textContainer = null;
  8066. this.text = {};
  8067. // Cache of text fragments and metrics, so we can avoid expensively
  8068. // re-calculating them when the plot is re-rendered in a loop.
  8069. this._textCache = {};
  8070. }
  8071. // Resizes the canvas to the given dimensions.
  8072. //
  8073. // @param {number} width New width of the canvas, in pixels.
  8074. // @param {number} width New height of the canvas, in pixels.
  8075. Canvas.prototype.resize = function(width, height) {
  8076. if (width <= 0 || height <= 0) {
  8077. throw new Error("Invalid dimensions for plot, width = " + width + ", height = " + height);
  8078. }
  8079. var element = this.element,
  8080. context = this.context,
  8081. pixelRatio = this.pixelRatio;
  8082. // Resize the canvas, increasing its density based on the display's
  8083. // pixel ratio; basically giving it more pixels without increasing the
  8084. // size of its element, to take advantage of the fact that retina
  8085. // displays have that many more pixels in the same advertised space.
  8086. // Resizing should reset the state (excanvas seems to be buggy though)
  8087. if (this.width != width) {
  8088. element.width = width * pixelRatio;
  8089. element.style.width = width + "px";
  8090. this.width = width;
  8091. }
  8092. if (this.height != height) {
  8093. element.height = height * pixelRatio;
  8094. element.style.height = height + "px";
  8095. this.height = height;
  8096. }
  8097. // Save the context, so we can reset in case we get replotted. The
  8098. // restore ensure that we're really back at the initial state, and
  8099. // should be safe even if we haven't saved the initial state yet.
  8100. context.restore();
  8101. context.save();
  8102. // Scale the coordinate space to match the display density; so even though we
  8103. // may have twice as many pixels, we still want lines and other drawing to
  8104. // appear at the same size; the extra pixels will just make them crisper.
  8105. context.scale(pixelRatio, pixelRatio);
  8106. };
  8107. // Clears the entire canvas area, not including any overlaid HTML text
  8108. Canvas.prototype.clear = function() {
  8109. this.context.clearRect(0, 0, this.width, this.height);
  8110. };
  8111. // Finishes rendering the canvas, including managing the text overlay.
  8112. Canvas.prototype.render = function() {
  8113. var cache = this._textCache;
  8114. // For each text layer, add elements marked as active that haven't
  8115. // already been rendered, and remove those that are no longer active.
  8116. for (var layerKey in cache) {
  8117. if (hasOwnProperty.call(cache, layerKey)) {
  8118. var layer = this.getTextLayer(layerKey),
  8119. layerCache = cache[layerKey];
  8120. layer.hide();
  8121. for (var styleKey in layerCache) {
  8122. if (hasOwnProperty.call(layerCache, styleKey)) {
  8123. var styleCache = layerCache[styleKey];
  8124. for (var key in styleCache) {
  8125. if (hasOwnProperty.call(styleCache, key)) {
  8126. var positions = styleCache[key].positions;
  8127. for (var i = 0, position; position = positions[i]; i++) {
  8128. if (position.active) {
  8129. if (!position.rendered) {
  8130. layer.append(position.element);
  8131. position.rendered = true;
  8132. }
  8133. } else {
  8134. positions.splice(i--, 1);
  8135. if (position.rendered) {
  8136. position.element.detach();
  8137. }
  8138. }
  8139. }
  8140. if (positions.length == 0) {
  8141. delete styleCache[key];
  8142. }
  8143. }
  8144. }
  8145. }
  8146. }
  8147. layer.show();
  8148. }
  8149. }
  8150. };
  8151. // Creates (if necessary) and returns the text overlay container.
  8152. //
  8153. // @param {string} classes String of space-separated CSS classes used to
  8154. // uniquely identify the text layer.
  8155. // @return {object} The jQuery-wrapped text-layer div.
  8156. Canvas.prototype.getTextLayer = function(classes) {
  8157. var layer = this.text[classes];
  8158. // Create the text layer if it doesn't exist
  8159. if (layer == null) {
  8160. // Create the text layer container, if it doesn't exist
  8161. if (this.textContainer == null) {
  8162. this.textContainer = $("<div class='flot-text'></div>")
  8163. .css({
  8164. position: "absolute",
  8165. top: 0,
  8166. left: 0,
  8167. bottom: 0,
  8168. right: 0,
  8169. 'font-size': "smaller",
  8170. color: "#545454"
  8171. })
  8172. .insertAfter(this.element);
  8173. }
  8174. layer = this.text[classes] = $("<div></div>")
  8175. .addClass(classes)
  8176. .css({
  8177. position: "absolute",
  8178. top: 0,
  8179. left: 0,
  8180. bottom: 0,
  8181. right: 0
  8182. })
  8183. .appendTo(this.textContainer);
  8184. }
  8185. return layer;
  8186. };
  8187. // Creates (if necessary) and returns a text info object.
  8188. //
  8189. // The object looks like this:
  8190. //
  8191. // {
  8192. // width: Width of the text's wrapper div.
  8193. // height: Height of the text's wrapper div.
  8194. // element: The jQuery-wrapped HTML div containing the text.
  8195. // positions: Array of positions at which this text is drawn.
  8196. // }
  8197. //
  8198. // The positions array contains objects that look like this:
  8199. //
  8200. // {
  8201. // active: Flag indicating whether the text should be visible.
  8202. // rendered: Flag indicating whether the text is currently visible.
  8203. // element: The jQuery-wrapped HTML div containing the text.
  8204. // x: X coordinate at which to draw the text.
  8205. // y: Y coordinate at which to draw the text.
  8206. // }
  8207. //
  8208. // Each position after the first receives a clone of the original element.
  8209. //
  8210. // The idea is that that the width, height, and general 'identity' of the
  8211. // text is constant no matter where it is placed; the placements are a
  8212. // secondary property.
  8213. //
  8214. // Canvas maintains a cache of recently-used text info objects; getTextInfo
  8215. // either returns the cached element or creates a new entry.
  8216. //
  8217. // @param {string} layer A string of space-separated CSS classes uniquely
  8218. // identifying the layer containing this text.
  8219. // @param {string} text Text string to retrieve info for.
  8220. // @param {(string|object)=} font Either a string of space-separated CSS
  8221. // classes or a font-spec object, defining the text's font and style.
  8222. // @param {number=} angle Angle at which to rotate the text, in degrees.
  8223. // Angle is currently unused, it will be implemented in the future.
  8224. // @param {number=} width Maximum width of the text before it wraps.
  8225. // @return {object} a text info object.
  8226. Canvas.prototype.getTextInfo = function(layer, text, font, angle, width) {
  8227. var textStyle, layerCache, styleCache, info;
  8228. // Cast the value to a string, in case we were given a number or such
  8229. text = "" + text;
  8230. // If the font is a font-spec object, generate a CSS font definition
  8231. if (typeof font === "object") {
  8232. textStyle = font.style + " " + font.variant + " " + font.weight + " " + font.size + "px/" + font.lineHeight + "px " + font.family;
  8233. } else {
  8234. textStyle = font;
  8235. }
  8236. // Retrieve (or create) the cache for the text's layer and styles
  8237. layerCache = this._textCache[layer];
  8238. if (layerCache == null) {
  8239. layerCache = this._textCache[layer] = {};
  8240. }
  8241. styleCache = layerCache[textStyle];
  8242. if (styleCache == null) {
  8243. styleCache = layerCache[textStyle] = {};
  8244. }
  8245. info = styleCache[text];
  8246. // If we can't find a matching element in our cache, create a new one
  8247. if (info == null) {
  8248. var element = $("<div></div>").html(text)
  8249. .css({
  8250. position: "absolute",
  8251. 'max-width': width,
  8252. top: -9999
  8253. })
  8254. .appendTo(this.getTextLayer(layer));
  8255. if (typeof font === "object") {
  8256. element.css({
  8257. font: textStyle,
  8258. color: font.color
  8259. });
  8260. } else if (typeof font === "string") {
  8261. element.addClass(font);
  8262. }
  8263. info = styleCache[text] = {
  8264. width: element.outerWidth(true),
  8265. height: element.outerHeight(true),
  8266. element: element,
  8267. positions: []
  8268. };
  8269. element.detach();
  8270. }
  8271. return info;
  8272. };
  8273. // Adds a text string to the canvas text overlay.
  8274. //
  8275. // The text isn't drawn immediately; it is marked as rendering, which will
  8276. // result in its addition to the canvas on the next render pass.
  8277. //
  8278. // @param {string} layer A string of space-separated CSS classes uniquely
  8279. // identifying the layer containing this text.
  8280. // @param {number} x X coordinate at which to draw the text.
  8281. // @param {number} y Y coordinate at which to draw the text.
  8282. // @param {string} text Text string to draw.
  8283. // @param {(string|object)=} font Either a string of space-separated CSS
  8284. // classes or a font-spec object, defining the text's font and style.
  8285. // @param {number=} angle Angle at which to rotate the text, in degrees.
  8286. // Angle is currently unused, it will be implemented in the future.
  8287. // @param {number=} width Maximum width of the text before it wraps.
  8288. // @param {string=} halign Horizontal alignment of the text; either "left",
  8289. // "center" or "right".
  8290. // @param {string=} valign Vertical alignment of the text; either "top",
  8291. // "middle" or "bottom".
  8292. Canvas.prototype.addText = function(layer, x, y, text, font, angle, width, halign, valign) {
  8293. var info = this.getTextInfo(layer, text, font, angle, width),
  8294. positions = info.positions;
  8295. // Tweak the div's position to match the text's alignment
  8296. if (halign == "center") {
  8297. x -= info.width / 2;
  8298. } else if (halign == "right") {
  8299. x -= info.width;
  8300. }
  8301. if (valign == "middle") {
  8302. y -= info.height / 2;
  8303. } else if (valign == "bottom") {
  8304. y -= info.height;
  8305. }
  8306. // Determine whether this text already exists at this position.
  8307. // If so, mark it for inclusion in the next render pass.
  8308. for (var i = 0, position; position = positions[i]; i++) {
  8309. if (position.x == x && position.y == y) {
  8310. position.active = true;
  8311. return;
  8312. }
  8313. }
  8314. // If the text doesn't exist at this position, create a new entry
  8315. // For the very first position we'll re-use the original element,
  8316. // while for subsequent ones we'll clone it.
  8317. position = {
  8318. active: true,
  8319. rendered: false,
  8320. element: positions.length ? info.element.clone() : info.element,
  8321. x: x,
  8322. y: y
  8323. }
  8324. positions.push(position);
  8325. // Move the element to its final position within the container
  8326. position.element.css({
  8327. top: Math.round(y),
  8328. left: Math.round(x),
  8329. 'text-align': halign // In case the text wraps
  8330. });
  8331. };
  8332. // Removes one or more text strings from the canvas text overlay.
  8333. //
  8334. // If no parameters are given, all text within the layer is removed.
  8335. //
  8336. // Note that the text is not immediately removed; it is simply marked as
  8337. // inactive, which will result in its removal on the next render pass.
  8338. // This avoids the performance penalty for 'clear and redraw' behavior,
  8339. // where we potentially get rid of all text on a layer, but will likely
  8340. // add back most or all of it later, as when redrawing axes, for example.
  8341. //
  8342. // @param {string} layer A string of space-separated CSS classes uniquely
  8343. // identifying the layer containing this text.
  8344. // @param {number=} x X coordinate of the text.
  8345. // @param {number=} y Y coordinate of the text.
  8346. // @param {string=} text Text string to remove.
  8347. // @param {(string|object)=} font Either a string of space-separated CSS
  8348. // classes or a font-spec object, defining the text's font and style.
  8349. // @param {number=} angle Angle at which the text is rotated, in degrees.
  8350. // Angle is currently unused, it will be implemented in the future.
  8351. Canvas.prototype.removeText = function(layer, x, y, text, font, angle) {
  8352. if (text == null) {
  8353. var layerCache = this._textCache[layer];
  8354. if (layerCache != null) {
  8355. for (var styleKey in layerCache) {
  8356. if (hasOwnProperty.call(layerCache, styleKey)) {
  8357. var styleCache = layerCache[styleKey];
  8358. for (var key in styleCache) {
  8359. if (hasOwnProperty.call(styleCache, key)) {
  8360. var positions = styleCache[key].positions;
  8361. for (var i = 0, position; position = positions[i]; i++) {
  8362. position.active = false;
  8363. }
  8364. }
  8365. }
  8366. }
  8367. }
  8368. }
  8369. } else {
  8370. var positions = this.getTextInfo(layer, text, font, angle).positions;
  8371. for (var i = 0, position; position = positions[i]; i++) {
  8372. if (position.x == x && position.y == y) {
  8373. position.active = false;
  8374. }
  8375. }
  8376. }
  8377. };
  8378. ///////////////////////////////////////////////////////////////////////////
  8379. // The top-level container for the entire plot.
  8380. function Plot(placeholder, data_, options_, plugins) {
  8381. // data is on the form:
  8382. // [ series1, series2 ... ]
  8383. // where series is either just the data as [ [x1, y1], [x2, y2], ... ]
  8384. // or { data: [ [x1, y1], [x2, y2], ... ], label: "some label", ... }
  8385. var series = [],
  8386. options = {
  8387. // the color theme used for graphs
  8388. colors: ["#edc240", "#afd8f8", "#cb4b4b", "#4da74d", "#9440ed"],
  8389. legend: {
  8390. show: true,
  8391. noColumns: 1, // number of colums in legend table
  8392. labelFormatter: null, // fn: string -> string
  8393. labelBoxBorderColor: "#ccc", // border color for the little label boxes
  8394. container: null, // container (as jQuery object) to put legend in, null means default on top of graph
  8395. position: "ne", // position of default legend container within plot
  8396. margin: 5, // distance from grid edge to default legend container within plot
  8397. backgroundColor: null, // null means auto-detect
  8398. backgroundOpacity: 0.85, // set to 0 to avoid background
  8399. sorted: null // default to no legend sorting
  8400. },
  8401. xaxis: {
  8402. show: null, // null = auto-detect, true = always, false = never
  8403. position: "bottom", // or "top"
  8404. mode: null, // null or "time"
  8405. font: null, // null (derived from CSS in placeholder) or object like { size: 11, lineHeight: 13, style: "italic", weight: "bold", family: "sans-serif", variant: "small-caps" }
  8406. color: null, // base color, labels, ticks
  8407. tickColor: null, // possibly different color of ticks, e.g. "rgba(0,0,0,0.15)"
  8408. transform: null, // null or f: number -> number to transform axis
  8409. inverseTransform: null, // if transform is set, this should be the inverse function
  8410. min: null, // min. value to show, null means set automatically
  8411. max: null, // max. value to show, null means set automatically
  8412. autoscaleMargin: null, // margin in % to add if auto-setting min/max
  8413. ticks: null, // either [1, 3] or [[1, "a"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks
  8414. tickFormatter: null, // fn: number -> string
  8415. labelWidth: null, // size of tick labels in pixels
  8416. labelHeight: null,
  8417. reserveSpace: null, // whether to reserve space even if axis isn't shown
  8418. tickLength: null, // size in pixels of ticks, or "full" for whole line
  8419. alignTicksWithAxis: null, // axis number or null for no sync
  8420. tickDecimals: null, // no. of decimals, null means auto
  8421. tickSize: null, // number or [number, "unit"]
  8422. minTickSize: null // number or [number, "unit"]
  8423. },
  8424. yaxis: {
  8425. autoscaleMargin: 0.02,
  8426. position: "left" // or "right"
  8427. },
  8428. xaxes: [],
  8429. yaxes: [],
  8430. series: {
  8431. points: {
  8432. show: false,
  8433. radius: 3,
  8434. lineWidth: 2, // in pixels
  8435. fill: true,
  8436. fillColor: "#ffffff",
  8437. symbol: "circle" // or callback
  8438. },
  8439. lines: {
  8440. // we don't put in show: false so we can see
  8441. // whether lines were actively disabled
  8442. lineWidth: 2, // in pixels
  8443. fill: false,
  8444. fillColor: null,
  8445. steps: false
  8446. // Omit 'zero', so we can later default its value to
  8447. // match that of the 'fill' option.
  8448. },
  8449. bars: {
  8450. show: false,
  8451. lineWidth: 2, // in pixels
  8452. barWidth: 1, // in units of the x axis
  8453. fill: true,
  8454. fillColor: null,
  8455. align: "left", // "left", "right", or "center"
  8456. horizontal: false,
  8457. zero: true
  8458. },
  8459. shadowSize: 3,
  8460. highlightColor: null
  8461. },
  8462. grid: {
  8463. show: true,
  8464. aboveData: false,
  8465. color: "#545454", // primary color used for outline and labels
  8466. backgroundColor: null, // null for transparent, else color
  8467. borderColor: null, // set if different from the grid color
  8468. tickColor: null, // color for the ticks, e.g. "rgba(0,0,0,0.15)"
  8469. margin: 0, // distance from the canvas edge to the grid
  8470. labelMargin: 5, // in pixels
  8471. axisMargin: 8, // in pixels
  8472. borderWidth: 2, // in pixels
  8473. minBorderMargin: null, // in pixels, null means taken from points radius
  8474. markings: null, // array of ranges or fn: axes -> array of ranges
  8475. markingsColor: "#f4f4f4",
  8476. markingsLineWidth: 2,
  8477. // interactive stuff
  8478. clickable: false,
  8479. hoverable: false,
  8480. autoHighlight: true, // highlight in case mouse is near
  8481. mouseActiveRadius: 10 // how far the mouse can be away to activate an item
  8482. },
  8483. interaction: {
  8484. redrawOverlayInterval: 1000/60 // time between updates, -1 means in same flow
  8485. },
  8486. hooks: {}
  8487. },
  8488. surface = null, // the canvas for the plot itself
  8489. overlay = null, // canvas for interactive stuff on top of plot
  8490. eventHolder = null, // jQuery object that events should be bound to
  8491. ctx = null, octx = null,
  8492. xaxes = [], yaxes = [],
  8493. plotOffset = { left: 0, right: 0, top: 0, bottom: 0},
  8494. plotWidth = 0, plotHeight = 0,
  8495. hooks = {
  8496. processOptions: [],
  8497. processRawData: [],
  8498. processDatapoints: [],
  8499. processOffset: [],
  8500. drawBackground: [],
  8501. drawSeries: [],
  8502. draw: [],
  8503. bindEvents: [],
  8504. drawOverlay: [],
  8505. shutdown: []
  8506. },
  8507. plot = this;
  8508. // public functions
  8509. plot.setData = setData;
  8510. plot.setupGrid = setupGrid;
  8511. plot.draw = draw;
  8512. plot.getPlaceholder = function() { return placeholder; };
  8513. plot.getCanvas = function() { return surface.element; };
  8514. plot.getPlotOffset = function() { return plotOffset; };
  8515. plot.width = function () { return plotWidth; };
  8516. plot.height = function () { return plotHeight; };
  8517. plot.offset = function () {
  8518. var o = eventHolder.offset();
  8519. o.left += plotOffset.left;
  8520. o.top += plotOffset.top;
  8521. return o;
  8522. };
  8523. plot.getData = function () { return series; };
  8524. plot.getAxes = function () {
  8525. var res = {}, i;
  8526. $.each(xaxes.concat(yaxes), function (_, axis) {
  8527. if (axis)
  8528. res[axis.direction + (axis.n != 1 ? axis.n : "") + "axis"] = axis;
  8529. });
  8530. return res;
  8531. };
  8532. plot.getXAxes = function () { return xaxes; };
  8533. plot.getYAxes = function () { return yaxes; };
  8534. plot.c2p = canvasToAxisCoords;
  8535. plot.p2c = axisToCanvasCoords;
  8536. plot.getOptions = function () { return options; };
  8537. plot.highlight = highlight;
  8538. plot.unhighlight = unhighlight;
  8539. plot.triggerRedrawOverlay = triggerRedrawOverlay;
  8540. plot.pointOffset = function(point) {
  8541. return {
  8542. left: parseInt(xaxes[axisNumber(point, "x") - 1].p2c(+point.x) + plotOffset.left, 10),
  8543. top: parseInt(yaxes[axisNumber(point, "y") - 1].p2c(+point.y) + plotOffset.top, 10)
  8544. };
  8545. };
  8546. plot.shutdown = shutdown;
  8547. plot.resize = function () {
  8548. var width = placeholder.width(),
  8549. height = placeholder.height();
  8550. surface.resize(width, height);
  8551. overlay.resize(width, height);
  8552. };
  8553. // public attributes
  8554. plot.hooks = hooks;
  8555. // initialize
  8556. initPlugins(plot);
  8557. parseOptions(options_);
  8558. setupCanvases();
  8559. setData(data_);
  8560. setupGrid();
  8561. draw();
  8562. bindEvents();
  8563. function executeHooks(hook, args) {
  8564. args = [plot].concat(args);
  8565. for (var i = 0; i < hook.length; ++i)
  8566. hook[i].apply(this, args);
  8567. }
  8568. function initPlugins() {
  8569. // References to key classes, allowing plugins to modify them
  8570. var classes = {
  8571. Canvas: Canvas
  8572. };
  8573. for (var i = 0; i < plugins.length; ++i) {
  8574. var p = plugins[i];
  8575. p.init(plot, classes);
  8576. if (p.options)
  8577. $.extend(true, options, p.options);
  8578. }
  8579. }
  8580. function parseOptions(opts) {
  8581. $.extend(true, options, opts);
  8582. // $.extend merges arrays, rather than replacing them. When less
  8583. // colors are provided than the size of the default palette, we
  8584. // end up with those colors plus the remaining defaults, which is
  8585. // not expected behavior; avoid it by replacing them here.
  8586. if (opts && opts.colors) {
  8587. options.colors = opts.colors;
  8588. }
  8589. if (options.xaxis.color == null)
  8590. options.xaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString();
  8591. if (options.yaxis.color == null)
  8592. options.yaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString();
  8593. if (options.xaxis.tickColor == null) // grid.tickColor for back-compatibility
  8594. options.xaxis.tickColor = options.grid.tickColor || options.xaxis.color;
  8595. if (options.yaxis.tickColor == null) // grid.tickColor for back-compatibility
  8596. options.yaxis.tickColor = options.grid.tickColor || options.yaxis.color;
  8597. if (options.grid.borderColor == null)
  8598. options.grid.borderColor = options.grid.color;
  8599. if (options.grid.tickColor == null)
  8600. options.grid.tickColor = $.color.parse(options.grid.color).scale('a', 0.22).toString();
  8601. // Fill in defaults for axis options, including any unspecified
  8602. // font-spec fields, if a font-spec was provided.
  8603. // If no x/y axis options were provided, create one of each anyway,
  8604. // since the rest of the code assumes that they exist.
  8605. var i, axisOptions, axisCount,
  8606. fontDefaults = {
  8607. style: placeholder.css("font-style"),
  8608. size: Math.round(0.8 * (+placeholder.css("font-size").replace("px", "") || 13)),
  8609. variant: placeholder.css("font-variant"),
  8610. weight: placeholder.css("font-weight"),
  8611. family: placeholder.css("font-family")
  8612. };
  8613. fontDefaults.lineHeight = fontDefaults.size * 1.15;
  8614. axisCount = options.xaxes.length || 1;
  8615. for (i = 0; i < axisCount; ++i) {
  8616. axisOptions = options.xaxes[i];
  8617. if (axisOptions && !axisOptions.tickColor) {
  8618. axisOptions.tickColor = axisOptions.color;
  8619. }
  8620. axisOptions = $.extend(true, {}, options.xaxis, axisOptions);
  8621. options.xaxes[i] = axisOptions;
  8622. if (axisOptions.font) {
  8623. axisOptions.font = $.extend({}, fontDefaults, axisOptions.font);
  8624. if (!axisOptions.font.color) {
  8625. axisOptions.font.color = axisOptions.color;
  8626. }
  8627. }
  8628. }
  8629. axisCount = options.yaxes.length || 1;
  8630. for (i = 0; i < axisCount; ++i) {
  8631. axisOptions = options.yaxes[i];
  8632. if (axisOptions && !axisOptions.tickColor) {
  8633. axisOptions.tickColor = axisOptions.color;
  8634. }
  8635. axisOptions = $.extend(true, {}, options.yaxis, axisOptions);
  8636. options.yaxes[i] = axisOptions;
  8637. if (axisOptions.font) {
  8638. axisOptions.font = $.extend({}, fontDefaults, axisOptions.font);
  8639. if (!axisOptions.font.color) {
  8640. axisOptions.font.color = axisOptions.color;
  8641. }
  8642. }
  8643. }
  8644. // backwards compatibility, to be removed in future
  8645. if (options.xaxis.noTicks && options.xaxis.ticks == null)
  8646. options.xaxis.ticks = options.xaxis.noTicks;
  8647. if (options.yaxis.noTicks && options.yaxis.ticks == null)
  8648. options.yaxis.ticks = options.yaxis.noTicks;
  8649. if (options.x2axis) {
  8650. options.xaxes[1] = $.extend(true, {}, options.xaxis, options.x2axis);
  8651. options.xaxes[1].position = "top";
  8652. }
  8653. if (options.y2axis) {
  8654. options.yaxes[1] = $.extend(true, {}, options.yaxis, options.y2axis);
  8655. options.yaxes[1].position = "right";
  8656. }
  8657. if (options.grid.coloredAreas)
  8658. options.grid.markings = options.grid.coloredAreas;
  8659. if (options.grid.coloredAreasColor)
  8660. options.grid.markingsColor = options.grid.coloredAreasColor;
  8661. if (options.lines)
  8662. $.extend(true, options.series.lines, options.lines);
  8663. if (options.points)
  8664. $.extend(true, options.series.points, options.points);
  8665. if (options.bars)
  8666. $.extend(true, options.series.bars, options.bars);
  8667. if (options.shadowSize != null)
  8668. options.series.shadowSize = options.shadowSize;
  8669. if (options.highlightColor != null)
  8670. options.series.highlightColor = options.highlightColor;
  8671. // save options on axes for future reference
  8672. for (i = 0; i < options.xaxes.length; ++i)
  8673. getOrCreateAxis(xaxes, i + 1).options = options.xaxes[i];
  8674. for (i = 0; i < options.yaxes.length; ++i)
  8675. getOrCreateAxis(yaxes, i + 1).options = options.yaxes[i];
  8676. // add hooks from options
  8677. for (var n in hooks)
  8678. if (options.hooks[n] && options.hooks[n].length)
  8679. hooks[n] = hooks[n].concat(options.hooks[n]);
  8680. executeHooks(hooks.processOptions, [options]);
  8681. }
  8682. function setData(d) {
  8683. series = parseData(d);
  8684. fillInSeriesOptions();
  8685. processData();
  8686. }
  8687. function parseData(d) {
  8688. var res = [];
  8689. for (var i = 0; i < d.length; ++i) {
  8690. var s = $.extend(true, {}, options.series);
  8691. if (d[i].data != null) {
  8692. s.data = d[i].data; // move the data instead of deep-copy
  8693. delete d[i].data;
  8694. $.extend(true, s, d[i]);
  8695. d[i].data = s.data;
  8696. }
  8697. else
  8698. s.data = d[i];
  8699. res.push(s);
  8700. }
  8701. return res;
  8702. }
  8703. function axisNumber(obj, coord) {
  8704. var a = obj[coord + "axis"];
  8705. if (typeof a == "object") // if we got a real axis, extract number
  8706. a = a.n;
  8707. if (typeof a != "number")
  8708. a = 1; // default to first axis
  8709. return a;
  8710. }
  8711. function allAxes() {
  8712. // return flat array without annoying null entries
  8713. return $.grep(xaxes.concat(yaxes), function (a) { return a; });
  8714. }
  8715. function canvasToAxisCoords(pos) {
  8716. // return an object with x/y corresponding to all used axes
  8717. var res = {}, i, axis;
  8718. for (i = 0; i < xaxes.length; ++i) {
  8719. axis = xaxes[i];
  8720. if (axis && axis.used)
  8721. res["x" + axis.n] = axis.c2p(pos.left);
  8722. }
  8723. for (i = 0; i < yaxes.length; ++i) {
  8724. axis = yaxes[i];
  8725. if (axis && axis.used)
  8726. res["y" + axis.n] = axis.c2p(pos.top);
  8727. }
  8728. if (res.x1 !== undefined)
  8729. res.x = res.x1;
  8730. if (res.y1 !== undefined)
  8731. res.y = res.y1;
  8732. return res;
  8733. }
  8734. function axisToCanvasCoords(pos) {
  8735. // get canvas coords from the first pair of x/y found in pos
  8736. var res = {}, i, axis, key;
  8737. for (i = 0; i < xaxes.length; ++i) {
  8738. axis = xaxes[i];
  8739. if (axis && axis.used) {
  8740. key = "x" + axis.n;
  8741. if (pos[key] == null && axis.n == 1)
  8742. key = "x";
  8743. if (pos[key] != null) {
  8744. res.left = axis.p2c(pos[key]);
  8745. break;
  8746. }
  8747. }
  8748. }
  8749. for (i = 0; i < yaxes.length; ++i) {
  8750. axis = yaxes[i];
  8751. if (axis && axis.used) {
  8752. key = "y" + axis.n;
  8753. if (pos[key] == null && axis.n == 1)
  8754. key = "y";
  8755. if (pos[key] != null) {
  8756. res.top = axis.p2c(pos[key]);
  8757. break;
  8758. }
  8759. }
  8760. }
  8761. return res;
  8762. }
  8763. function getOrCreateAxis(axes, number) {
  8764. if (!axes[number - 1])
  8765. axes[number - 1] = {
  8766. n: number, // save the number for future reference
  8767. direction: axes == xaxes ? "x" : "y",
  8768. options: $.extend(true, {}, axes == xaxes ? options.xaxis : options.yaxis)
  8769. };
  8770. return axes[number - 1];
  8771. }
  8772. function fillInSeriesOptions() {
  8773. var neededColors = series.length, maxIndex = -1, i;
  8774. // Subtract the number of series that already have fixed colors or
  8775. // color indexes from the number that we still need to generate.
  8776. for (i = 0; i < series.length; ++i) {
  8777. var sc = series[i].color;
  8778. if (sc != null) {
  8779. neededColors--;
  8780. if (typeof sc == "number" && sc > maxIndex) {
  8781. maxIndex = sc;
  8782. }
  8783. }
  8784. }
  8785. // If any of the series have fixed color indexes, then we need to
  8786. // generate at least as many colors as the highest index.
  8787. if (neededColors <= maxIndex) {
  8788. neededColors = maxIndex + 1;
  8789. }
  8790. // Generate all the colors, using first the option colors and then
  8791. // variations on those colors once they're exhausted.
  8792. var c, colors = [], colorPool = options.colors,
  8793. colorPoolSize = colorPool.length, variation = 0;
  8794. for (i = 0; i < neededColors; i++) {
  8795. c = $.color.parse(colorPool[i % colorPoolSize] || "#666");
  8796. // Each time we exhaust the colors in the pool we adjust
  8797. // a scaling factor used to produce more variations on
  8798. // those colors. The factor alternates negative/positive
  8799. // to produce lighter/darker colors.
  8800. // Reset the variation after every few cycles, or else
  8801. // it will end up producing only white or black colors.
  8802. if (i % colorPoolSize == 0 && i) {
  8803. if (variation >= 0) {
  8804. if (variation < 0.5) {
  8805. variation = -variation - 0.2;
  8806. } else variation = 0;
  8807. } else variation = -variation;
  8808. }
  8809. colors[i] = c.scale('rgb', 1 + variation);
  8810. }
  8811. // Finalize the series options, filling in their colors
  8812. var colori = 0, s;
  8813. for (i = 0; i < series.length; ++i) {
  8814. s = series[i];
  8815. // assign colors
  8816. if (s.color == null) {
  8817. s.color = colors[colori].toString();
  8818. ++colori;
  8819. }
  8820. else if (typeof s.color == "number")
  8821. s.color = colors[s.color].toString();
  8822. // turn on lines automatically in case nothing is set
  8823. if (s.lines.show == null) {
  8824. var v, show = true;
  8825. for (v in s)
  8826. if (s[v] && s[v].show) {
  8827. show = false;
  8828. break;
  8829. }
  8830. if (show)
  8831. s.lines.show = true;
  8832. }
  8833. // If nothing was provided for lines.zero, default it to match
  8834. // lines.fill, since areas by default should extend to zero.
  8835. if (s.lines.zero == null) {
  8836. s.lines.zero = !!s.lines.fill;
  8837. }
  8838. // setup axes
  8839. s.xaxis = getOrCreateAxis(xaxes, axisNumber(s, "x"));
  8840. s.yaxis = getOrCreateAxis(yaxes, axisNumber(s, "y"));
  8841. }
  8842. }
  8843. function processData() {
  8844. var topSentry = Number.POSITIVE_INFINITY,
  8845. bottomSentry = Number.NEGATIVE_INFINITY,
  8846. fakeInfinity = Number.MAX_VALUE,
  8847. i, j, k, m, length,
  8848. s, points, ps, x, y, axis, val, f, p,
  8849. data, format;
  8850. function updateAxis(axis, min, max) {
  8851. if (min < axis.datamin && min != -fakeInfinity)
  8852. axis.datamin = min;
  8853. if (max > axis.datamax && max != fakeInfinity)
  8854. axis.datamax = max;
  8855. }
  8856. $.each(allAxes(), function (_, axis) {
  8857. // init axis
  8858. axis.datamin = topSentry;
  8859. axis.datamax = bottomSentry;
  8860. axis.used = false;
  8861. });
  8862. for (i = 0; i < series.length; ++i) {
  8863. s = series[i];
  8864. s.datapoints = { points: [] };
  8865. executeHooks(hooks.processRawData, [ s, s.data, s.datapoints ]);
  8866. }
  8867. // first pass: clean and copy data
  8868. for (i = 0; i < series.length; ++i) {
  8869. s = series[i];
  8870. data = s.data;
  8871. format = s.datapoints.format;
  8872. if (!format) {
  8873. format = [];
  8874. // find out how to copy
  8875. format.push({ x: true, number: true, required: true });
  8876. format.push({ y: true, number: true, required: true });
  8877. if (s.bars.show || (s.lines.show && s.lines.fill)) {
  8878. var autoscale = !!((s.bars.show && s.bars.zero) || (s.lines.show && s.lines.zero));
  8879. format.push({ y: true, number: true, required: false, defaultValue: 0, autoscale: autoscale });
  8880. if (s.bars.horizontal) {
  8881. delete format[format.length - 1].y;
  8882. format[format.length - 1].x = true;
  8883. }
  8884. }
  8885. s.datapoints.format = format;
  8886. }
  8887. if (s.datapoints.pointsize != null)
  8888. continue; // already filled in
  8889. s.datapoints.pointsize = format.length;
  8890. ps = s.datapoints.pointsize;
  8891. points = s.datapoints.points;
  8892. var insertSteps = s.lines.show && s.lines.steps;
  8893. s.xaxis.used = s.yaxis.used = true;
  8894. for (j = k = 0; j < data.length; ++j, k += ps) {
  8895. p = data[j];
  8896. var nullify = p == null;
  8897. if (!nullify) {
  8898. for (m = 0; m < ps; ++m) {
  8899. val = p[m];
  8900. f = format[m];
  8901. if (f) {
  8902. if (f.number && val != null) {
  8903. val = +val; // convert to number
  8904. if (isNaN(val))
  8905. val = null;
  8906. else if (val == Infinity)
  8907. val = fakeInfinity;
  8908. else if (val == -Infinity)
  8909. val = -fakeInfinity;
  8910. }
  8911. if (val == null) {
  8912. if (f.required)
  8913. nullify = true;
  8914. if (f.defaultValue != null)
  8915. val = f.defaultValue;
  8916. }
  8917. }
  8918. points[k + m] = val;
  8919. }
  8920. }
  8921. if (nullify) {
  8922. for (m = 0; m < ps; ++m) {
  8923. val = points[k + m];
  8924. if (val != null) {
  8925. f = format[m];
  8926. // extract min/max info
  8927. if (f.autoscale) {
  8928. if (f.x) {
  8929. updateAxis(s.xaxis, val, val);
  8930. }
  8931. if (f.y) {
  8932. updateAxis(s.yaxis, val, val);
  8933. }
  8934. }
  8935. }
  8936. points[k + m] = null;
  8937. }
  8938. }
  8939. else {
  8940. // a little bit of line specific stuff that
  8941. // perhaps shouldn't be here, but lacking
  8942. // better means...
  8943. if (insertSteps && k > 0
  8944. && points[k - ps] != null
  8945. && points[k - ps] != points[k]
  8946. && points[k - ps + 1] != points[k + 1]) {
  8947. // copy the point to make room for a middle point
  8948. for (m = 0; m < ps; ++m)
  8949. points[k + ps + m] = points[k + m];
  8950. // middle point has same y
  8951. points[k + 1] = points[k - ps + 1];
  8952. // we've added a point, better reflect that
  8953. k += ps;
  8954. }
  8955. }
  8956. }
  8957. }
  8958. // give the hooks a chance to run
  8959. for (i = 0; i < series.length; ++i) {
  8960. s = series[i];
  8961. executeHooks(hooks.processDatapoints, [ s, s.datapoints]);
  8962. }
  8963. // second pass: find datamax/datamin for auto-scaling
  8964. for (i = 0; i < series.length; ++i) {
  8965. s = series[i];
  8966. points = s.datapoints.points;
  8967. ps = s.datapoints.pointsize;
  8968. format = s.datapoints.format;
  8969. var xmin = topSentry, ymin = topSentry,
  8970. xmax = bottomSentry, ymax = bottomSentry;
  8971. for (j = 0; j < points.length; j += ps) {
  8972. if (points[j] == null)
  8973. continue;
  8974. for (m = 0; m < ps; ++m) {
  8975. val = points[j + m];
  8976. f = format[m];
  8977. if (!f || f.autoscale === false || val == fakeInfinity || val == -fakeInfinity)
  8978. continue;
  8979. if (f.x) {
  8980. if (val < xmin)
  8981. xmin = val;
  8982. if (val > xmax)
  8983. xmax = val;
  8984. }
  8985. if (f.y) {
  8986. if (val < ymin)
  8987. ymin = val;
  8988. if (val > ymax)
  8989. ymax = val;
  8990. }
  8991. }
  8992. }
  8993. if (s.bars.show) {
  8994. // make sure we got room for the bar on the dancing floor
  8995. var delta;
  8996. switch (s.bars.align) {
  8997. case "left":
  8998. delta = 0;
  8999. break;
  9000. case "right":
  9001. delta = -s.bars.barWidth;
  9002. break;
  9003. case "center":
  9004. delta = -s.bars.barWidth / 2;
  9005. break;
  9006. default:
  9007. throw new Error("Invalid bar alignment: " + s.bars.align);
  9008. }
  9009. if (s.bars.horizontal) {
  9010. ymin += delta;
  9011. ymax += delta + s.bars.barWidth;
  9012. }
  9013. else {
  9014. xmin += delta;
  9015. xmax += delta + s.bars.barWidth;
  9016. }
  9017. }
  9018. updateAxis(s.xaxis, xmin, xmax);
  9019. updateAxis(s.yaxis, ymin, ymax);
  9020. }
  9021. $.each(allAxes(), function (_, axis) {
  9022. if (axis.datamin == topSentry)
  9023. axis.datamin = null;
  9024. if (axis.datamax == bottomSentry)
  9025. axis.datamax = null;
  9026. });
  9027. }
  9028. function setupCanvases() {
  9029. // Make sure the placeholder is clear of everything except canvases
  9030. // from a previous plot in this container that we'll try to re-use.
  9031. placeholder.css("padding", 0) // padding messes up the positioning
  9032. .children(":not(.flot-base,.flot-overlay)").remove();
  9033. if (placeholder.css("position") == 'static')
  9034. placeholder.css("position", "relative"); // for positioning labels and overlay
  9035. surface = new Canvas("flot-base", placeholder);
  9036. overlay = new Canvas("flot-overlay", placeholder); // overlay canvas for interactive features
  9037. ctx = surface.context;
  9038. octx = overlay.context;
  9039. // define which element we're listening for events on
  9040. eventHolder = $(overlay.element).unbind();
  9041. // If we're re-using a plot object, shut down the old one
  9042. var existing = placeholder.data("plot");
  9043. if (existing) {
  9044. existing.shutdown();
  9045. overlay.clear();
  9046. }
  9047. // save in case we get replotted
  9048. placeholder.data("plot", plot);
  9049. }
  9050. function bindEvents() {
  9051. // bind events
  9052. if (options.grid.hoverable) {
  9053. eventHolder.mousemove(onMouseMove);
  9054. // Use bind, rather than .mouseleave, because we officially
  9055. // still support jQuery 1.2.6, which doesn't define a shortcut
  9056. // for mouseenter or mouseleave. This was a bug/oversight that
  9057. // was fixed somewhere around 1.3.x. We can return to using
  9058. // .mouseleave when we drop support for 1.2.6.
  9059. eventHolder.bind("mouseleave", onMouseLeave);
  9060. }
  9061. if (options.grid.clickable)
  9062. eventHolder.click(onClick);
  9063. executeHooks(hooks.bindEvents, [eventHolder]);
  9064. }
  9065. function shutdown() {
  9066. if (redrawTimeout)
  9067. clearTimeout(redrawTimeout);
  9068. eventHolder.unbind("mousemove", onMouseMove);
  9069. eventHolder.unbind("mouseleave", onMouseLeave);
  9070. eventHolder.unbind("click", onClick);
  9071. executeHooks(hooks.shutdown, [eventHolder]);
  9072. }
  9073. function setTransformationHelpers(axis) {
  9074. // set helper functions on the axis, assumes plot area
  9075. // has been computed already
  9076. function identity(x) { return x; }
  9077. var s, m, t = axis.options.transform || identity,
  9078. it = axis.options.inverseTransform;
  9079. // precompute how much the axis is scaling a point
  9080. // in canvas space
  9081. if (axis.direction == "x") {
  9082. s = axis.scale = plotWidth / Math.abs(t(axis.max) - t(axis.min));
  9083. m = Math.min(t(axis.max), t(axis.min));
  9084. }
  9085. else {
  9086. s = axis.scale = plotHeight / Math.abs(t(axis.max) - t(axis.min));
  9087. s = -s;
  9088. m = Math.max(t(axis.max), t(axis.min));
  9089. }
  9090. // data point to canvas coordinate
  9091. if (t == identity) // slight optimization
  9092. axis.p2c = function (p) { return (p - m) * s; };
  9093. else
  9094. axis.p2c = function (p) { return (t(p) - m) * s; };
  9095. // canvas coordinate to data point
  9096. if (!it)
  9097. axis.c2p = function (c) { return m + c / s; };
  9098. else
  9099. axis.c2p = function (c) { return it(m + c / s); };
  9100. }
  9101. function measureTickLabels(axis) {
  9102. var opts = axis.options,
  9103. ticks = axis.ticks || [],
  9104. labelWidth = opts.labelWidth || 0,
  9105. labelHeight = opts.labelHeight || 0,
  9106. maxWidth = labelWidth || axis.direction == "x" ? Math.floor(surface.width / (ticks.length || 1)) : null;
  9107. legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis",
  9108. layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles,
  9109. font = opts.font || "flot-tick-label tickLabel";
  9110. for (var i = 0; i < ticks.length; ++i) {
  9111. var t = ticks[i];
  9112. if (!t.label)
  9113. continue;
  9114. var info = surface.getTextInfo(layer, t.label, font, null, maxWidth);
  9115. labelWidth = Math.max(labelWidth, info.width);
  9116. labelHeight = Math.max(labelHeight, info.height);
  9117. }
  9118. axis.labelWidth = opts.labelWidth || labelWidth;
  9119. axis.labelHeight = opts.labelHeight || labelHeight;
  9120. }
  9121. function allocateAxisBoxFirstPhase(axis) {
  9122. // find the bounding box of the axis by looking at label
  9123. // widths/heights and ticks, make room by diminishing the
  9124. // plotOffset; this first phase only looks at one
  9125. // dimension per axis, the other dimension depends on the
  9126. // other axes so will have to wait
  9127. var lw = axis.labelWidth,
  9128. lh = axis.labelHeight,
  9129. pos = axis.options.position,
  9130. tickLength = axis.options.tickLength,
  9131. axisMargin = options.grid.axisMargin,
  9132. padding = options.grid.labelMargin,
  9133. all = axis.direction == "x" ? xaxes : yaxes,
  9134. index, innermost;
  9135. // determine axis margin
  9136. var samePosition = $.grep(all, function (a) {
  9137. return a && a.options.position == pos && a.reserveSpace;
  9138. });
  9139. if ($.inArray(axis, samePosition) == samePosition.length - 1)
  9140. axisMargin = 0; // outermost
  9141. // determine tick length - if we're innermost, we can use "full"
  9142. if (tickLength == null) {
  9143. var sameDirection = $.grep(all, function (a) {
  9144. return a && a.reserveSpace;
  9145. });
  9146. innermost = $.inArray(axis, sameDirection) == 0;
  9147. if (innermost)
  9148. tickLength = "full";
  9149. else
  9150. tickLength = 5;
  9151. }
  9152. if (!isNaN(+tickLength))
  9153. padding += +tickLength;
  9154. // compute box
  9155. if (axis.direction == "x") {
  9156. lh += padding;
  9157. if (pos == "bottom") {
  9158. plotOffset.bottom += lh + axisMargin;
  9159. axis.box = { top: surface.height - plotOffset.bottom, height: lh };
  9160. }
  9161. else {
  9162. axis.box = { top: plotOffset.top + axisMargin, height: lh };
  9163. plotOffset.top += lh + axisMargin;
  9164. }
  9165. }
  9166. else {
  9167. lw += padding;
  9168. if (pos == "left") {
  9169. axis.box = { left: plotOffset.left + axisMargin, width: lw };
  9170. plotOffset.left += lw + axisMargin;
  9171. }
  9172. else {
  9173. plotOffset.right += lw + axisMargin;
  9174. axis.box = { left: surface.width - plotOffset.right, width: lw };
  9175. }
  9176. }
  9177. // save for future reference
  9178. axis.position = pos;
  9179. axis.tickLength = tickLength;
  9180. axis.box.padding = padding;
  9181. axis.innermost = innermost;
  9182. }
  9183. function allocateAxisBoxSecondPhase(axis) {
  9184. // now that all axis boxes have been placed in one
  9185. // dimension, we can set the remaining dimension coordinates
  9186. if (axis.direction == "x") {
  9187. axis.box.left = plotOffset.left - axis.labelWidth / 2;
  9188. axis.box.width = surface.width - plotOffset.left - plotOffset.right + axis.labelWidth;
  9189. }
  9190. else {
  9191. axis.box.top = plotOffset.top - axis.labelHeight / 2;
  9192. axis.box.height = surface.height - plotOffset.bottom - plotOffset.top + axis.labelHeight;
  9193. }
  9194. }
  9195. function adjustLayoutForThingsStickingOut() {
  9196. // possibly adjust plot offset to ensure everything stays
  9197. // inside the canvas and isn't clipped off
  9198. var minMargin = options.grid.minBorderMargin,
  9199. margins = { x: 0, y: 0 }, i, axis;
  9200. // check stuff from the plot (FIXME: this should just read
  9201. // a value from the series, otherwise it's impossible to
  9202. // customize)
  9203. if (minMargin == null) {
  9204. minMargin = 0;
  9205. for (i = 0; i < series.length; ++i)
  9206. minMargin = Math.max(minMargin, 2 * (series[i].points.radius + series[i].points.lineWidth/2));
  9207. }
  9208. margins.x = margins.y = Math.ceil(minMargin);
  9209. // check axis labels, note we don't check the actual
  9210. // labels but instead use the overall width/height to not
  9211. // jump as much around with replots
  9212. $.each(allAxes(), function (_, axis) {
  9213. var dir = axis.direction;
  9214. if (axis.reserveSpace)
  9215. margins[dir] = Math.ceil(Math.max(margins[dir], (dir == "x" ? axis.labelWidth : axis.labelHeight) / 2));
  9216. });
  9217. plotOffset.left = Math.max(margins.x, plotOffset.left);
  9218. plotOffset.right = Math.max(margins.x, plotOffset.right);
  9219. plotOffset.top = Math.max(margins.y, plotOffset.top);
  9220. plotOffset.bottom = Math.max(margins.y, plotOffset.bottom);
  9221. }
  9222. function setupGrid() {
  9223. var i, axes = allAxes(), showGrid = options.grid.show;
  9224. // Initialize the plot's offset from the edge of the canvas
  9225. for (var a in plotOffset) {
  9226. var margin = options.grid.margin || 0;
  9227. plotOffset[a] = typeof margin == "number" ? margin : margin[a] || 0;
  9228. }
  9229. executeHooks(hooks.processOffset, [plotOffset]);
  9230. // If the grid is visible, add its border width to the offset
  9231. for (var a in plotOffset) {
  9232. if(typeof(options.grid.borderWidth) == "object") {
  9233. plotOffset[a] += showGrid ? options.grid.borderWidth[a] : 0;
  9234. }
  9235. else {
  9236. plotOffset[a] += showGrid ? options.grid.borderWidth : 0;
  9237. }
  9238. }
  9239. // init axes
  9240. $.each(axes, function (_, axis) {
  9241. axis.show = axis.options.show;
  9242. if (axis.show == null)
  9243. axis.show = axis.used; // by default an axis is visible if it's got data
  9244. axis.reserveSpace = axis.show || axis.options.reserveSpace;
  9245. setRange(axis);
  9246. });
  9247. if (showGrid) {
  9248. var allocatedAxes = $.grep(axes, function (axis) { return axis.reserveSpace; });
  9249. $.each(allocatedAxes, function (_, axis) {
  9250. // make the ticks
  9251. setupTickGeneration(axis);
  9252. setTicks(axis);
  9253. snapRangeToTicks(axis, axis.ticks);
  9254. // find labelWidth/Height for axis
  9255. measureTickLabels(axis);
  9256. });
  9257. // with all dimensions calculated, we can compute the
  9258. // axis bounding boxes, start from the outside
  9259. // (reverse order)
  9260. for (i = allocatedAxes.length - 1; i >= 0; --i)
  9261. allocateAxisBoxFirstPhase(allocatedAxes[i]);
  9262. // make sure we've got enough space for things that
  9263. // might stick out
  9264. adjustLayoutForThingsStickingOut();
  9265. $.each(allocatedAxes, function (_, axis) {
  9266. allocateAxisBoxSecondPhase(axis);
  9267. });
  9268. }
  9269. plotWidth = surface.width - plotOffset.left - plotOffset.right;
  9270. plotHeight = surface.height - plotOffset.bottom - plotOffset.top;
  9271. // now we got the proper plot dimensions, we can compute the scaling
  9272. $.each(axes, function (_, axis) {
  9273. setTransformationHelpers(axis);
  9274. });
  9275. if (showGrid) {
  9276. drawAxisLabels();
  9277. }
  9278. insertLegend();
  9279. }
  9280. function setRange(axis) {
  9281. var opts = axis.options,
  9282. min = +(opts.min != null ? opts.min : axis.datamin),
  9283. max = +(opts.max != null ? opts.max : axis.datamax),
  9284. delta = max - min;
  9285. if (delta == 0.0) {
  9286. // degenerate case
  9287. var widen = max == 0 ? 1 : 0.01;
  9288. if (opts.min == null)
  9289. min -= widen;
  9290. // always widen max if we couldn't widen min to ensure we
  9291. // don't fall into min == max which doesn't work
  9292. if (opts.max == null || opts.min != null)
  9293. max += widen;
  9294. }
  9295. else {
  9296. // consider autoscaling
  9297. var margin = opts.autoscaleMargin;
  9298. if (margin != null) {
  9299. if (opts.min == null) {
  9300. min -= delta * margin;
  9301. // make sure we don't go below zero if all values
  9302. // are positive
  9303. if (min < 0 && axis.datamin != null && axis.datamin >= 0)
  9304. min = 0;
  9305. }
  9306. if (opts.max == null) {
  9307. max += delta * margin;
  9308. if (max > 0 && axis.datamax != null && axis.datamax <= 0)
  9309. max = 0;
  9310. }
  9311. }
  9312. }
  9313. axis.min = min;
  9314. axis.max = max;
  9315. }
  9316. function setupTickGeneration(axis) {
  9317. var opts = axis.options;
  9318. // estimate number of ticks
  9319. var noTicks;
  9320. if (typeof opts.ticks == "number" && opts.ticks > 0)
  9321. noTicks = opts.ticks;
  9322. else
  9323. // heuristic based on the model a*sqrt(x) fitted to
  9324. // some data points that seemed reasonable
  9325. noTicks = 0.3 * Math.sqrt(axis.direction == "x" ? surface.width : surface.height);
  9326. var delta = (axis.max - axis.min) / noTicks,
  9327. dec = -Math.floor(Math.log(delta) / Math.LN10),
  9328. maxDec = opts.tickDecimals;
  9329. if (maxDec != null && dec > maxDec) {
  9330. dec = maxDec;
  9331. }
  9332. var magn = Math.pow(10, -dec),
  9333. norm = delta / magn, // norm is between 1.0 and 10.0
  9334. size;
  9335. if (norm < 1.5) {
  9336. size = 1;
  9337. } else if (norm < 3) {
  9338. size = 2;
  9339. // special case for 2.5, requires an extra decimal
  9340. if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) {
  9341. size = 2.5;
  9342. ++dec;
  9343. }
  9344. } else if (norm < 7.5) {
  9345. size = 5;
  9346. } else {
  9347. size = 10;
  9348. }
  9349. size *= magn;
  9350. if (opts.minTickSize != null && size < opts.minTickSize) {
  9351. size = opts.minTickSize;
  9352. }
  9353. axis.delta = delta;
  9354. axis.tickDecimals = Math.max(0, maxDec != null ? maxDec : dec);
  9355. axis.tickSize = opts.tickSize || size;
  9356. // Time mode was moved to a plug-in in 0.8, but since so many people use this
  9357. // we'll add an especially friendly make sure they remembered to include it.
  9358. if (opts.mode == "time" && !axis.tickGenerator) {
  9359. throw new Error("Time mode requires the flot.time plugin.");
  9360. }
  9361. // Flot supports base-10 axes; any other mode else is handled by a plug-in,
  9362. // like flot.time.js.
  9363. if (!axis.tickGenerator) {
  9364. axis.tickGenerator = function (axis) {
  9365. var ticks = [],
  9366. start = floorInBase(axis.min, axis.tickSize),
  9367. i = 0,
  9368. v = Number.NaN,
  9369. prev;
  9370. do {
  9371. prev = v;
  9372. v = start + i * axis.tickSize;
  9373. ticks.push(v);
  9374. ++i;
  9375. } while (v < axis.max && v != prev);
  9376. return ticks;
  9377. };
  9378. axis.tickFormatter = function (value, axis) {
  9379. var factor = axis.tickDecimals ? Math.pow(10, axis.tickDecimals) : 1;
  9380. var formatted = "" + Math.round(value * factor) / factor;
  9381. // If tickDecimals was specified, ensure that we have exactly that
  9382. // much precision; otherwise default to the value's own precision.
  9383. if (axis.tickDecimals != null) {
  9384. var decimal = formatted.indexOf(".");
  9385. var precision = decimal == -1 ? 0 : formatted.length - decimal - 1;
  9386. if (precision < axis.tickDecimals) {
  9387. return (precision ? formatted : formatted + ".") + ("" + factor).substr(1, axis.tickDecimals - precision);
  9388. }
  9389. }
  9390. return formatted;
  9391. };
  9392. }
  9393. if ($.isFunction(opts.tickFormatter))
  9394. axis.tickFormatter = function (v, axis) { return "" + opts.tickFormatter(v, axis); };
  9395. if (opts.alignTicksWithAxis != null) {
  9396. var otherAxis = (axis.direction == "x" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1];
  9397. if (otherAxis && otherAxis.used && otherAxis != axis) {
  9398. // consider snapping min/max to outermost nice ticks
  9399. var niceTicks = axis.tickGenerator(axis);
  9400. if (niceTicks.length > 0) {
  9401. if (opts.min == null)
  9402. axis.min = Math.min(axis.min, niceTicks[0]);
  9403. if (opts.max == null && niceTicks.length > 1)
  9404. axis.max = Math.max(axis.max, niceTicks[niceTicks.length - 1]);
  9405. }
  9406. axis.tickGenerator = function (axis) {
  9407. // copy ticks, scaled to this axis
  9408. var ticks = [], v, i;
  9409. for (i = 0; i < otherAxis.ticks.length; ++i) {
  9410. v = (otherAxis.ticks[i].v - otherAxis.min) / (otherAxis.max - otherAxis.min);
  9411. v = axis.min + v * (axis.max - axis.min);
  9412. ticks.push(v);
  9413. }
  9414. return ticks;
  9415. };
  9416. // we might need an extra decimal since forced
  9417. // ticks don't necessarily fit naturally
  9418. if (!axis.mode && opts.tickDecimals == null) {
  9419. var extraDec = Math.max(0, -Math.floor(Math.log(axis.delta) / Math.LN10) + 1),
  9420. ts = axis.tickGenerator(axis);
  9421. // only proceed if the tick interval rounded
  9422. // with an extra decimal doesn't give us a
  9423. // zero at end
  9424. if (!(ts.length > 1 && /\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec))))
  9425. axis.tickDecimals = extraDec;
  9426. }
  9427. }
  9428. }
  9429. }
  9430. function setTicks(axis) {
  9431. var oticks = axis.options.ticks, ticks = [];
  9432. if (oticks == null || (typeof oticks == "number" && oticks > 0))
  9433. ticks = axis.tickGenerator(axis);
  9434. else if (oticks) {
  9435. if ($.isFunction(oticks))
  9436. // generate the ticks
  9437. ticks = oticks(axis);
  9438. else
  9439. ticks = oticks;
  9440. }
  9441. // clean up/labelify the supplied ticks, copy them over
  9442. var i, v;
  9443. axis.ticks = [];
  9444. for (i = 0; i < ticks.length; ++i) {
  9445. var label = null;
  9446. var t = ticks[i];
  9447. if (typeof t == "object") {
  9448. v = +t[0];
  9449. if (t.length > 1)
  9450. label = t[1];
  9451. }
  9452. else
  9453. v = +t;
  9454. if (label == null)
  9455. label = axis.tickFormatter(v, axis);
  9456. if (!isNaN(v))
  9457. axis.ticks.push({ v: v, label: label });
  9458. }
  9459. }
  9460. function snapRangeToTicks(axis, ticks) {
  9461. if (axis.options.autoscaleMargin && ticks.length > 0) {
  9462. // snap to ticks
  9463. if (axis.options.min == null)
  9464. axis.min = Math.min(axis.min, ticks[0].v);
  9465. if (axis.options.max == null && ticks.length > 1)
  9466. axis.max = Math.max(axis.max, ticks[ticks.length - 1].v);
  9467. }
  9468. }
  9469. function draw() {
  9470. surface.clear();
  9471. executeHooks(hooks.drawBackground, [ctx]);
  9472. var grid = options.grid;
  9473. // draw background, if any
  9474. if (grid.show && grid.backgroundColor)
  9475. drawBackground();
  9476. if (grid.show && !grid.aboveData) {
  9477. drawGrid();
  9478. }
  9479. for (var i = 0; i < series.length; ++i) {
  9480. executeHooks(hooks.drawSeries, [ctx, series[i]]);
  9481. drawSeries(series[i]);
  9482. }
  9483. executeHooks(hooks.draw, [ctx]);
  9484. if (grid.show && grid.aboveData) {
  9485. drawGrid();
  9486. }
  9487. surface.render();
  9488. // A draw implies that either the axes or data have changed, so we
  9489. // should probably update the overlay highlights as well.
  9490. triggerRedrawOverlay();
  9491. }
  9492. function extractRange(ranges, coord) {
  9493. var axis, from, to, key, axes = allAxes();
  9494. for (var i = 0; i < axes.length; ++i) {
  9495. axis = axes[i];
  9496. if (axis.direction == coord) {
  9497. key = coord + axis.n + "axis";
  9498. if (!ranges[key] && axis.n == 1)
  9499. key = coord + "axis"; // support x1axis as xaxis
  9500. if (ranges[key]) {
  9501. from = ranges[key].from;
  9502. to = ranges[key].to;
  9503. break;
  9504. }
  9505. }
  9506. }
  9507. // backwards-compat stuff - to be removed in future
  9508. if (!ranges[key]) {
  9509. axis = coord == "x" ? xaxes[0] : yaxes[0];
  9510. from = ranges[coord + "1"];
  9511. to = ranges[coord + "2"];
  9512. }
  9513. // auto-reverse as an added bonus
  9514. if (from != null && to != null && from > to) {
  9515. var tmp = from;
  9516. from = to;
  9517. to = tmp;
  9518. }
  9519. return { from: from, to: to, axis: axis };
  9520. }
  9521. function drawBackground() {
  9522. ctx.save();
  9523. ctx.translate(plotOffset.left, plotOffset.top);
  9524. ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, "rgba(255, 255, 255, 0)");
  9525. ctx.fillRect(0, 0, plotWidth, plotHeight);
  9526. ctx.restore();
  9527. }
  9528. function drawGrid() {
  9529. var i, axes, bw, bc;
  9530. ctx.save();
  9531. ctx.translate(plotOffset.left, plotOffset.top);
  9532. // draw markings
  9533. var markings = options.grid.markings;
  9534. if (markings) {
  9535. if ($.isFunction(markings)) {
  9536. axes = plot.getAxes();
  9537. // xmin etc. is backwards compatibility, to be
  9538. // removed in the future
  9539. axes.xmin = axes.xaxis.min;
  9540. axes.xmax = axes.xaxis.max;
  9541. axes.ymin = axes.yaxis.min;
  9542. axes.ymax = axes.yaxis.max;
  9543. markings = markings(axes);
  9544. }
  9545. for (i = 0; i < markings.length; ++i) {
  9546. var m = markings[i],
  9547. xrange = extractRange(m, "x"),
  9548. yrange = extractRange(m, "y");
  9549. // fill in missing
  9550. if (xrange.from == null)
  9551. xrange.from = xrange.axis.min;
  9552. if (xrange.to == null)
  9553. xrange.to = xrange.axis.max;
  9554. if (yrange.from == null)
  9555. yrange.from = yrange.axis.min;
  9556. if (yrange.to == null)
  9557. yrange.to = yrange.axis.max;
  9558. // clip
  9559. if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max ||
  9560. yrange.to < yrange.axis.min || yrange.from > yrange.axis.max)
  9561. continue;
  9562. xrange.from = Math.max(xrange.from, xrange.axis.min);
  9563. xrange.to = Math.min(xrange.to, xrange.axis.max);
  9564. yrange.from = Math.max(yrange.from, yrange.axis.min);
  9565. yrange.to = Math.min(yrange.to, yrange.axis.max);
  9566. if (xrange.from == xrange.to && yrange.from == yrange.to)
  9567. continue;
  9568. // then draw
  9569. xrange.from = xrange.axis.p2c(xrange.from);
  9570. xrange.to = xrange.axis.p2c(xrange.to);
  9571. yrange.from = yrange.axis.p2c(yrange.from);
  9572. yrange.to = yrange.axis.p2c(yrange.to);
  9573. if (xrange.from == xrange.to || yrange.from == yrange.to) {
  9574. // draw line
  9575. ctx.beginPath();
  9576. ctx.strokeStyle = m.color || options.grid.markingsColor;
  9577. ctx.lineWidth = m.lineWidth || options.grid.markingsLineWidth;
  9578. ctx.moveTo(xrange.from, yrange.from);
  9579. ctx.lineTo(xrange.to, yrange.to);
  9580. ctx.stroke();
  9581. }
  9582. else {
  9583. // fill area
  9584. ctx.fillStyle = m.color || options.grid.markingsColor;
  9585. ctx.fillRect(xrange.from, yrange.to,
  9586. xrange.to - xrange.from,
  9587. yrange.from - yrange.to);
  9588. }
  9589. }
  9590. }
  9591. // draw the ticks
  9592. axes = allAxes();
  9593. bw = options.grid.borderWidth;
  9594. for (var j = 0; j < axes.length; ++j) {
  9595. var axis = axes[j], box = axis.box,
  9596. t = axis.tickLength, x, y, xoff, yoff;
  9597. if (!axis.show || axis.ticks.length == 0)
  9598. continue;
  9599. ctx.lineWidth = 1;
  9600. // find the edges
  9601. if (axis.direction == "x") {
  9602. x = 0;
  9603. if (t == "full")
  9604. y = (axis.position == "top" ? 0 : plotHeight);
  9605. else
  9606. y = box.top - plotOffset.top + (axis.position == "top" ? box.height : 0);
  9607. }
  9608. else {
  9609. y = 0;
  9610. if (t == "full")
  9611. x = (axis.position == "left" ? 0 : plotWidth);
  9612. else
  9613. x = box.left - plotOffset.left + (axis.position == "left" ? box.width : 0);
  9614. }
  9615. // draw tick bar
  9616. if (!axis.innermost) {
  9617. ctx.strokeStyle = axis.options.color;
  9618. ctx.beginPath();
  9619. xoff = yoff = 0;
  9620. if (axis.direction == "x")
  9621. xoff = plotWidth + 1;
  9622. else
  9623. yoff = plotHeight + 1;
  9624. if (ctx.lineWidth == 1) {
  9625. if (axis.direction == "x") {
  9626. y = Math.floor(y) + 0.5;
  9627. } else {
  9628. x = Math.floor(x) + 0.5;
  9629. }
  9630. }
  9631. ctx.moveTo(x, y);
  9632. ctx.lineTo(x + xoff, y + yoff);
  9633. ctx.stroke();
  9634. }
  9635. // draw ticks
  9636. ctx.strokeStyle = axis.options.tickColor;
  9637. ctx.beginPath();
  9638. for (i = 0; i < axis.ticks.length; ++i) {
  9639. var v = axis.ticks[i].v;
  9640. xoff = yoff = 0;
  9641. if (isNaN(v) || v < axis.min || v > axis.max
  9642. // skip those lying on the axes if we got a border
  9643. || (t == "full"
  9644. && ((typeof bw == "object" && bw[axis.position] > 0) || bw > 0)
  9645. && (v == axis.min || v == axis.max)))
  9646. continue;
  9647. if (axis.direction == "x") {
  9648. x = axis.p2c(v);
  9649. yoff = t == "full" ? -plotHeight : t;
  9650. if (axis.position == "top")
  9651. yoff = -yoff;
  9652. }
  9653. else {
  9654. y = axis.p2c(v);
  9655. xoff = t == "full" ? -plotWidth : t;
  9656. if (axis.position == "left")
  9657. xoff = -xoff;
  9658. }
  9659. if (ctx.lineWidth == 1) {
  9660. if (axis.direction == "x")
  9661. x = Math.floor(x) + 0.5;
  9662. else
  9663. y = Math.floor(y) + 0.5;
  9664. }
  9665. ctx.moveTo(x, y);
  9666. ctx.lineTo(x + xoff, y + yoff);
  9667. }
  9668. ctx.stroke();
  9669. }
  9670. // draw border
  9671. if (bw) {
  9672. // If either borderWidth or borderColor is an object, then draw the border
  9673. // line by line instead of as one rectangle
  9674. bc = options.grid.borderColor;
  9675. if(typeof bw == "object" || typeof bc == "object") {
  9676. if (typeof bw !== "object") {
  9677. bw = {top: bw, right: bw, bottom: bw, left: bw};
  9678. }
  9679. if (typeof bc !== "object") {
  9680. bc = {top: bc, right: bc, bottom: bc, left: bc};
  9681. }
  9682. if (bw.top > 0) {
  9683. ctx.strokeStyle = bc.top;
  9684. ctx.lineWidth = bw.top;
  9685. ctx.beginPath();
  9686. ctx.moveTo(0 - bw.left, 0 - bw.top/2);
  9687. ctx.lineTo(plotWidth, 0 - bw.top/2);
  9688. ctx.stroke();
  9689. }
  9690. if (bw.right > 0) {
  9691. ctx.strokeStyle = bc.right;
  9692. ctx.lineWidth = bw.right;
  9693. ctx.beginPath();
  9694. ctx.moveTo(plotWidth + bw.right / 2, 0 - bw.top);
  9695. ctx.lineTo(plotWidth + bw.right / 2, plotHeight);
  9696. ctx.stroke();
  9697. }
  9698. if (bw.bottom > 0) {
  9699. ctx.strokeStyle = bc.bottom;
  9700. ctx.lineWidth = bw.bottom;
  9701. ctx.beginPath();
  9702. ctx.moveTo(plotWidth + bw.right, plotHeight + bw.bottom / 2);
  9703. ctx.lineTo(0, plotHeight + bw.bottom / 2);
  9704. ctx.stroke();
  9705. }
  9706. if (bw.left > 0) {
  9707. ctx.strokeStyle = bc.left;
  9708. ctx.lineWidth = bw.left;
  9709. ctx.beginPath();
  9710. ctx.moveTo(0 - bw.left/2, plotHeight + bw.bottom);
  9711. ctx.lineTo(0- bw.left/2, 0);
  9712. ctx.stroke();
  9713. }
  9714. }
  9715. else {
  9716. ctx.lineWidth = bw;
  9717. ctx.strokeStyle = options.grid.borderColor;
  9718. ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw);
  9719. }
  9720. }
  9721. ctx.restore();
  9722. }
  9723. function drawAxisLabels() {
  9724. $.each(allAxes(), function (_, axis) {
  9725. if (!axis.show || axis.ticks.length == 0)
  9726. return;
  9727. var box = axis.box,
  9728. legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis",
  9729. layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles,
  9730. font = axis.options.font || "flot-tick-label tickLabel",
  9731. tick, x, y, halign, valign;
  9732. surface.removeText(layer);
  9733. for (var i = 0; i < axis.ticks.length; ++i) {
  9734. tick = axis.ticks[i];
  9735. if (!tick.label || tick.v < axis.min || tick.v > axis.max)
  9736. continue;
  9737. if (axis.direction == "x") {
  9738. halign = "center";
  9739. x = plotOffset.left + axis.p2c(tick.v);
  9740. if (axis.position == "bottom") {
  9741. y = box.top + box.padding;
  9742. } else {
  9743. y = box.top + box.height - box.padding;
  9744. valign = "bottom";
  9745. }
  9746. } else {
  9747. valign = "middle";
  9748. y = plotOffset.top + axis.p2c(tick.v);
  9749. if (axis.position == "left") {
  9750. x = box.left + box.width - box.padding;
  9751. halign = "right";
  9752. } else {
  9753. x = box.left + box.padding;
  9754. }
  9755. }
  9756. surface.addText(layer, x, y, tick.label, font, null, null, halign, valign);
  9757. }
  9758. });
  9759. }
  9760. function drawSeries(series) {
  9761. if (series.lines.show)
  9762. drawSeriesLines(series);
  9763. if (series.bars.show)
  9764. drawSeriesBars(series);
  9765. if (series.points.show)
  9766. drawSeriesPoints(series);
  9767. }
  9768. function drawSeriesLines(series) {
  9769. function plotLine(datapoints, xoffset, yoffset, axisx, axisy) {
  9770. var points = datapoints.points,
  9771. ps = datapoints.pointsize,
  9772. prevx = null, prevy = null;
  9773. ctx.beginPath();
  9774. for (var i = ps; i < points.length; i += ps) {
  9775. var x1 = points[i - ps], y1 = points[i - ps + 1],
  9776. x2 = points[i], y2 = points[i + 1];
  9777. if (x1 == null || x2 == null)
  9778. continue;
  9779. // clip with ymin
  9780. if (y1 <= y2 && y1 < axisy.min) {
  9781. if (y2 < axisy.min)
  9782. continue; // line segment is outside
  9783. // compute new intersection point
  9784. x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
  9785. y1 = axisy.min;
  9786. }
  9787. else if (y2 <= y1 && y2 < axisy.min) {
  9788. if (y1 < axisy.min)
  9789. continue;
  9790. x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
  9791. y2 = axisy.min;
  9792. }
  9793. // clip with ymax
  9794. if (y1 >= y2 && y1 > axisy.max) {
  9795. if (y2 > axisy.max)
  9796. continue;
  9797. x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
  9798. y1 = axisy.max;
  9799. }
  9800. else if (y2 >= y1 && y2 > axisy.max) {
  9801. if (y1 > axisy.max)
  9802. continue;
  9803. x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
  9804. y2 = axisy.max;
  9805. }
  9806. // clip with xmin
  9807. if (x1 <= x2 && x1 < axisx.min) {
  9808. if (x2 < axisx.min)
  9809. continue;
  9810. y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
  9811. x1 = axisx.min;
  9812. }
  9813. else if (x2 <= x1 && x2 < axisx.min) {
  9814. if (x1 < axisx.min)
  9815. continue;
  9816. y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
  9817. x2 = axisx.min;
  9818. }
  9819. // clip with xmax
  9820. if (x1 >= x2 && x1 > axisx.max) {
  9821. if (x2 > axisx.max)
  9822. continue;
  9823. y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
  9824. x1 = axisx.max;
  9825. }
  9826. else if (x2 >= x1 && x2 > axisx.max) {
  9827. if (x1 > axisx.max)
  9828. continue;
  9829. y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
  9830. x2 = axisx.max;
  9831. }
  9832. if (x1 != prevx || y1 != prevy)
  9833. ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset);
  9834. prevx = x2;
  9835. prevy = y2;
  9836. ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset);
  9837. }
  9838. ctx.stroke();
  9839. }
  9840. function plotLineArea(datapoints, axisx, axisy) {
  9841. var points = datapoints.points,
  9842. ps = datapoints.pointsize,
  9843. bottom = Math.min(Math.max(0, axisy.min), axisy.max),
  9844. i = 0, top, areaOpen = false,
  9845. ypos = 1, segmentStart = 0, segmentEnd = 0;
  9846. // we process each segment in two turns, first forward
  9847. // direction to sketch out top, then once we hit the
  9848. // end we go backwards to sketch the bottom
  9849. while (true) {
  9850. if (ps > 0 && i > points.length + ps)
  9851. break;
  9852. i += ps; // ps is negative if going backwards
  9853. var x1 = points[i - ps],
  9854. y1 = points[i - ps + ypos],
  9855. x2 = points[i], y2 = points[i + ypos];
  9856. if (areaOpen) {
  9857. if (ps > 0 && x1 != null && x2 == null) {
  9858. // at turning point
  9859. segmentEnd = i;
  9860. ps = -ps;
  9861. ypos = 2;
  9862. continue;
  9863. }
  9864. if (ps < 0 && i == segmentStart + ps) {
  9865. // done with the reverse sweep
  9866. ctx.fill();
  9867. areaOpen = false;
  9868. ps = -ps;
  9869. ypos = 1;
  9870. i = segmentStart = segmentEnd + ps;
  9871. continue;
  9872. }
  9873. }
  9874. if (x1 == null || x2 == null)
  9875. continue;
  9876. // clip x values
  9877. // clip with xmin
  9878. if (x1 <= x2 && x1 < axisx.min) {
  9879. if (x2 < axisx.min)
  9880. continue;
  9881. y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
  9882. x1 = axisx.min;
  9883. }
  9884. else if (x2 <= x1 && x2 < axisx.min) {
  9885. if (x1 < axisx.min)
  9886. continue;
  9887. y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
  9888. x2 = axisx.min;
  9889. }
  9890. // clip with xmax
  9891. if (x1 >= x2 && x1 > axisx.max) {
  9892. if (x2 > axisx.max)
  9893. continue;
  9894. y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
  9895. x1 = axisx.max;
  9896. }
  9897. else if (x2 >= x1 && x2 > axisx.max) {
  9898. if (x1 > axisx.max)
  9899. continue;
  9900. y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
  9901. x2 = axisx.max;
  9902. }
  9903. if (!areaOpen) {
  9904. // open area
  9905. ctx.beginPath();
  9906. ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom));
  9907. areaOpen = true;
  9908. }
  9909. // now first check the case where both is outside
  9910. if (y1 >= axisy.max && y2 >= axisy.max) {
  9911. ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max));
  9912. ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max));
  9913. continue;
  9914. }
  9915. else if (y1 <= axisy.min && y2 <= axisy.min) {
  9916. ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min));
  9917. ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min));
  9918. continue;
  9919. }
  9920. // else it's a bit more complicated, there might
  9921. // be a flat maxed out rectangle first, then a
  9922. // triangular cutout or reverse; to find these
  9923. // keep track of the current x values
  9924. var x1old = x1, x2old = x2;
  9925. // clip the y values, without shortcutting, we
  9926. // go through all cases in turn
  9927. // clip with ymin
  9928. if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) {
  9929. x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
  9930. y1 = axisy.min;
  9931. }
  9932. else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) {
  9933. x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
  9934. y2 = axisy.min;
  9935. }
  9936. // clip with ymax
  9937. if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) {
  9938. x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
  9939. y1 = axisy.max;
  9940. }
  9941. else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) {
  9942. x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
  9943. y2 = axisy.max;
  9944. }
  9945. // if the x value was changed we got a rectangle
  9946. // to fill
  9947. if (x1 != x1old) {
  9948. ctx.lineTo(axisx.p2c(x1old), axisy.p2c(y1));
  9949. // it goes to (x1, y1), but we fill that below
  9950. }
  9951. // fill triangular section, this sometimes result
  9952. // in redundant points if (x1, y1) hasn't changed
  9953. // from previous line to, but we just ignore that
  9954. ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1));
  9955. ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));
  9956. // fill the other rectangle if it's there
  9957. if (x2 != x2old) {
  9958. ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));
  9959. ctx.lineTo(axisx.p2c(x2old), axisy.p2c(y2));
  9960. }
  9961. }
  9962. }
  9963. ctx.save();
  9964. ctx.translate(plotOffset.left, plotOffset.top);
  9965. ctx.lineJoin = "round";
  9966. var lw = series.lines.lineWidth,
  9967. sw = series.shadowSize;
  9968. // FIXME: consider another form of shadow when filling is turned on
  9969. if (lw > 0 && sw > 0) {
  9970. // draw shadow as a thick and thin line with transparency
  9971. ctx.lineWidth = sw;
  9972. ctx.strokeStyle = "rgba(0,0,0,0.1)";
  9973. // position shadow at angle from the mid of line
  9974. var angle = Math.PI/18;
  9975. plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/2), Math.cos(angle) * (lw/2 + sw/2), series.xaxis, series.yaxis);
  9976. ctx.lineWidth = sw/2;
  9977. plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/4), Math.cos(angle) * (lw/2 + sw/4), series.xaxis, series.yaxis);
  9978. }
  9979. ctx.lineWidth = lw;
  9980. ctx.strokeStyle = series.color;
  9981. var fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight);
  9982. if (fillStyle) {
  9983. ctx.fillStyle = fillStyle;
  9984. plotLineArea(series.datapoints, series.xaxis, series.yaxis);
  9985. }
  9986. if (lw > 0)
  9987. plotLine(series.datapoints, 0, 0, series.xaxis, series.yaxis);
  9988. ctx.restore();
  9989. }
  9990. function drawSeriesPoints(series) {
  9991. function plotPoints(datapoints, radius, fillStyle, offset, shadow, axisx, axisy, symbol) {
  9992. var points = datapoints.points, ps = datapoints.pointsize;
  9993. for (var i = 0; i < points.length; i += ps) {
  9994. var x = points[i], y = points[i + 1];
  9995. if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)
  9996. continue;
  9997. ctx.beginPath();
  9998. x = axisx.p2c(x);
  9999. y = axisy.p2c(y) + offset;
  10000. if (symbol == "circle")
  10001. ctx.arc(x, y, radius, 0, shadow ? Math.PI : Math.PI * 2, false);
  10002. else
  10003. symbol(ctx, x, y, radius, shadow);
  10004. ctx.closePath();
  10005. if (fillStyle) {
  10006. ctx.fillStyle = fillStyle;
  10007. ctx.fill();
  10008. }
  10009. ctx.stroke();
  10010. }
  10011. }
  10012. ctx.save();
  10013. ctx.translate(plotOffset.left, plotOffset.top);
  10014. var lw = series.points.lineWidth,
  10015. sw = series.shadowSize,
  10016. radius = series.points.radius,
  10017. symbol = series.points.symbol;
  10018. // If the user sets the line width to 0, we change it to a very
  10019. // small value. A line width of 0 seems to force the default of 1.
  10020. // Doing the conditional here allows the shadow setting to still be
  10021. // optional even with a lineWidth of 0.
  10022. if( lw == 0 )
  10023. lw = 0.0001;
  10024. if (lw > 0 && sw > 0) {
  10025. // draw shadow in two steps
  10026. var w = sw / 2;
  10027. ctx.lineWidth = w;
  10028. ctx.strokeStyle = "rgba(0,0,0,0.1)";
  10029. plotPoints(series.datapoints, radius, null, w + w/2, true,
  10030. series.xaxis, series.yaxis, symbol);
  10031. ctx.strokeStyle = "rgba(0,0,0,0.2)";
  10032. plotPoints(series.datapoints, radius, null, w/2, true,
  10033. series.xaxis, series.yaxis, symbol);
  10034. }
  10035. ctx.lineWidth = lw;
  10036. ctx.strokeStyle = series.color;
  10037. plotPoints(series.datapoints, radius,
  10038. getFillStyle(series.points, series.color), 0, false,
  10039. series.xaxis, series.yaxis, symbol);
  10040. ctx.restore();
  10041. }
  10042. function drawBar(x, y, b, barLeft, barRight, offset, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) {
  10043. var left, right, bottom, top,
  10044. drawLeft, drawRight, drawTop, drawBottom,
  10045. tmp;
  10046. // in horizontal mode, we start the bar from the left
  10047. // instead of from the bottom so it appears to be
  10048. // horizontal rather than vertical
  10049. if (horizontal) {
  10050. drawBottom = drawRight = drawTop = true;
  10051. drawLeft = false;
  10052. left = b;
  10053. right = x;
  10054. top = y + barLeft;
  10055. bottom = y + barRight;
  10056. // account for negative bars
  10057. if (right < left) {
  10058. tmp = right;
  10059. right = left;
  10060. left = tmp;
  10061. drawLeft = true;
  10062. drawRight = false;
  10063. }
  10064. }
  10065. else {
  10066. drawLeft = drawRight = drawTop = true;
  10067. drawBottom = false;
  10068. left = x + barLeft;
  10069. right = x + barRight;
  10070. bottom = b;
  10071. top = y;
  10072. // account for negative bars
  10073. if (top < bottom) {
  10074. tmp = top;
  10075. top = bottom;
  10076. bottom = tmp;
  10077. drawBottom = true;
  10078. drawTop = false;
  10079. }
  10080. }
  10081. // clip
  10082. if (right < axisx.min || left > axisx.max ||
  10083. top < axisy.min || bottom > axisy.max)
  10084. return;
  10085. if (left < axisx.min) {
  10086. left = axisx.min;
  10087. drawLeft = false;
  10088. }
  10089. if (right > axisx.max) {
  10090. right = axisx.max;
  10091. drawRight = false;
  10092. }
  10093. if (bottom < axisy.min) {
  10094. bottom = axisy.min;
  10095. drawBottom = false;
  10096. }
  10097. if (top > axisy.max) {
  10098. top = axisy.max;
  10099. drawTop = false;
  10100. }
  10101. left = axisx.p2c(left);
  10102. bottom = axisy.p2c(bottom);
  10103. right = axisx.p2c(right);
  10104. top = axisy.p2c(top);
  10105. // fill the bar
  10106. if (fillStyleCallback) {
  10107. c.beginPath();
  10108. c.moveTo(left, bottom);
  10109. c.lineTo(left, top);
  10110. c.lineTo(right, top);
  10111. c.lineTo(right, bottom);
  10112. c.fillStyle = fillStyleCallback(bottom, top);
  10113. c.fill();
  10114. }
  10115. // draw outline
  10116. if (lineWidth > 0 && (drawLeft || drawRight || drawTop || drawBottom)) {
  10117. c.beginPath();
  10118. // FIXME: inline moveTo is buggy with excanvas
  10119. c.moveTo(left, bottom + offset);
  10120. if (drawLeft)
  10121. c.lineTo(left, top + offset);
  10122. else
  10123. c.moveTo(left, top + offset);
  10124. if (drawTop)
  10125. c.lineTo(right, top + offset);
  10126. else
  10127. c.moveTo(right, top + offset);
  10128. if (drawRight)
  10129. c.lineTo(right, bottom + offset);
  10130. else
  10131. c.moveTo(right, bottom + offset);
  10132. if (drawBottom)
  10133. c.lineTo(left, bottom + offset);
  10134. else
  10135. c.moveTo(left, bottom + offset);
  10136. c.stroke();
  10137. }
  10138. }
  10139. function drawSeriesBars(series) {
  10140. function plotBars(datapoints, barLeft, barRight, offset, fillStyleCallback, axisx, axisy) {
  10141. var points = datapoints.points, ps = datapoints.pointsize;
  10142. for (var i = 0; i < points.length; i += ps) {
  10143. if (points[i] == null)
  10144. continue;
  10145. drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, offset, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth);
  10146. }
  10147. }
  10148. ctx.save();
  10149. ctx.translate(plotOffset.left, plotOffset.top);
  10150. // FIXME: figure out a way to add shadows (for instance along the right edge)
  10151. ctx.lineWidth = series.bars.lineWidth;
  10152. ctx.strokeStyle = series.color;
  10153. var barLeft;
  10154. switch (series.bars.align) {
  10155. case "left":
  10156. barLeft = 0;
  10157. break;
  10158. case "right":
  10159. barLeft = -series.bars.barWidth;
  10160. break;
  10161. case "center":
  10162. barLeft = -series.bars.barWidth / 2;
  10163. break;
  10164. default:
  10165. throw new Error("Invalid bar alignment: " + series.bars.align);
  10166. }
  10167. var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null;
  10168. plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, 0, fillStyleCallback, series.xaxis, series.yaxis);
  10169. ctx.restore();
  10170. }
  10171. function getFillStyle(filloptions, seriesColor, bottom, top) {
  10172. var fill = filloptions.fill;
  10173. if (!fill)
  10174. return null;
  10175. if (filloptions.fillColor)
  10176. return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor);
  10177. var c = $.color.parse(seriesColor);
  10178. c.a = typeof fill == "number" ? fill : 0.4;
  10179. c.normalize();
  10180. return c.toString();
  10181. }
  10182. function insertLegend() {
  10183. placeholder.find(".legend").remove();
  10184. if (!options.legend.show)
  10185. return;
  10186. var fragments = [], entries = [], rowStarted = false,
  10187. lf = options.legend.labelFormatter, s, label;
  10188. // Build a list of legend entries, with each having a label and a color
  10189. for (var i = 0; i < series.length; ++i) {
  10190. s = series[i];
  10191. if (s.label) {
  10192. label = lf ? lf(s.label, s) : s.label;
  10193. if (label) {
  10194. entries.push({
  10195. label: label,
  10196. color: s.color
  10197. });
  10198. }
  10199. }
  10200. }
  10201. // Sort the legend using either the default or a custom comparator
  10202. if (options.legend.sorted) {
  10203. if ($.isFunction(options.legend.sorted)) {
  10204. entries.sort(options.legend.sorted);
  10205. } else if (options.legend.sorted == "reverse") {
  10206. entries.reverse();
  10207. } else {
  10208. var ascending = options.legend.sorted != "descending";
  10209. entries.sort(function(a, b) {
  10210. return a.label == b.label ? 0 : (
  10211. (a.label < b.label) != ascending ? 1 : -1 // Logical XOR
  10212. );
  10213. });
  10214. }
  10215. }
  10216. // Generate markup for the list of entries, in their final order
  10217. for (var i = 0; i < entries.length; ++i) {
  10218. var entry = entries[i];
  10219. if (i % options.legend.noColumns == 0) {
  10220. if (rowStarted)
  10221. fragments.push('</tr>');
  10222. fragments.push('<tr>');
  10223. rowStarted = true;
  10224. }
  10225. fragments.push(
  10226. '<td class="legendColorBox"><div style="border:1px solid ' + options.legend.labelBoxBorderColor + ';padding:1px"><div style="width:4px;height:0;border:5px solid ' + entry.color + ';overflow:hidden"></div></div></td>' +
  10227. '<td class="legendLabel">' + entry.label + '</td>'
  10228. );
  10229. }
  10230. if (rowStarted)
  10231. fragments.push('</tr>');
  10232. if (fragments.length == 0)
  10233. return;
  10234. var table = '<table style="font-size:smaller;color:' + options.grid.color + '">' + fragments.join("") + '</table>';
  10235. if (options.legend.container != null)
  10236. $(options.legend.container).html(table);
  10237. else {
  10238. var pos = "",
  10239. p = options.legend.position,
  10240. m = options.legend.margin;
  10241. if (m[0] == null)
  10242. m = [m, m];
  10243. if (p.charAt(0) == "n")
  10244. pos += 'top:' + (m[1] + plotOffset.top) + 'px;';
  10245. else if (p.charAt(0) == "s")
  10246. pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;';
  10247. if (p.charAt(1) == "e")
  10248. pos += 'right:' + (m[0] + plotOffset.right) + 'px;';
  10249. else if (p.charAt(1) == "w")
  10250. pos += 'left:' + (m[0] + plotOffset.left) + 'px;';
  10251. var legend = $('<div class="legend">' + table.replace('style="', 'style="position:absolute;' + pos +';') + '</div>').appendTo(placeholder);
  10252. if (options.legend.backgroundOpacity != 0.0) {
  10253. // put in the transparent background
  10254. // separately to avoid blended labels and
  10255. // label boxes
  10256. var c = options.legend.backgroundColor;
  10257. if (c == null) {
  10258. c = options.grid.backgroundColor;
  10259. if (c && typeof c == "string")
  10260. c = $.color.parse(c);
  10261. else
  10262. c = $.color.extract(legend, 'background-color');
  10263. c.a = 1;
  10264. c = c.toString();
  10265. }
  10266. var div = legend.children();
  10267. $('<div style="position:absolute;width:' + div.width() + 'px;height:' + div.height() + 'px;' + pos +'background-color:' + c + ';"> </div>').prependTo(legend).css('opacity', options.legend.backgroundOpacity);
  10268. }
  10269. }
  10270. }
  10271. // interactive features
  10272. var highlights = [],
  10273. redrawTimeout = null;
  10274. // returns the data item the mouse is over, or null if none is found
  10275. function findNearbyItem(mouseX, mouseY, seriesFilter) {
  10276. var maxDistance = options.grid.mouseActiveRadius,
  10277. smallestDistance = maxDistance * maxDistance + 1,
  10278. item = null, foundPoint = false, i, j, ps;
  10279. for (i = series.length - 1; i >= 0; --i) {
  10280. if (!seriesFilter(series[i]))
  10281. continue;
  10282. var s = series[i],
  10283. axisx = s.xaxis,
  10284. axisy = s.yaxis,
  10285. points = s.datapoints.points,
  10286. mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster
  10287. my = axisy.c2p(mouseY),
  10288. maxx = maxDistance / axisx.scale,
  10289. maxy = maxDistance / axisy.scale;
  10290. ps = s.datapoints.pointsize;
  10291. // with inverse transforms, we can't use the maxx/maxy
  10292. // optimization, sadly
  10293. if (axisx.options.inverseTransform)
  10294. maxx = Number.MAX_VALUE;
  10295. if (axisy.options.inverseTransform)
  10296. maxy = Number.MAX_VALUE;
  10297. if (s.lines.show || s.points.show) {
  10298. for (j = 0; j < points.length; j += ps) {
  10299. var x = points[j], y = points[j + 1];
  10300. if (x == null)
  10301. continue;
  10302. // For points and lines, the cursor must be within a
  10303. // certain distance to the data point
  10304. if (x - mx > maxx || x - mx < -maxx ||
  10305. y - my > maxy || y - my < -maxy)
  10306. continue;
  10307. // We have to calculate distances in pixels, not in
  10308. // data units, because the scales of the axes may be different
  10309. var dx = Math.abs(axisx.p2c(x) - mouseX),
  10310. dy = Math.abs(axisy.p2c(y) - mouseY),
  10311. dist = dx * dx + dy * dy; // we save the sqrt
  10312. // use <= to ensure last point takes precedence
  10313. // (last generally means on top of)
  10314. if (dist < smallestDistance) {
  10315. smallestDistance = dist;
  10316. item = [i, j / ps];
  10317. }
  10318. }
  10319. }
  10320. if (s.bars.show && !item) { // no other point can be nearby
  10321. var barLeft = s.bars.align == "left" ? 0 : -s.bars.barWidth/2,
  10322. barRight = barLeft + s.bars.barWidth;
  10323. for (j = 0; j < points.length; j += ps) {
  10324. var x = points[j], y = points[j + 1], b = points[j + 2];
  10325. if (x == null)
  10326. continue;
  10327. // for a bar graph, the cursor must be inside the bar
  10328. if (series[i].bars.horizontal ?
  10329. (mx <= Math.max(b, x) && mx >= Math.min(b, x) &&
  10330. my >= y + barLeft && my <= y + barRight) :
  10331. (mx >= x + barLeft && mx <= x + barRight &&
  10332. my >= Math.min(b, y) && my <= Math.max(b, y)))
  10333. item = [i, j / ps];
  10334. }
  10335. }
  10336. }
  10337. if (item) {
  10338. i = item[0];
  10339. j = item[1];
  10340. ps = series[i].datapoints.pointsize;
  10341. return { datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps),
  10342. dataIndex: j,
  10343. series: series[i],
  10344. seriesIndex: i };
  10345. }
  10346. return null;
  10347. }
  10348. function onMouseMove(e) {
  10349. if (options.grid.hoverable)
  10350. triggerClickHoverEvent("plothover", e,
  10351. function (s) { return s["hoverable"] != false; });
  10352. }
  10353. function onMouseLeave(e) {
  10354. if (options.grid.hoverable)
  10355. triggerClickHoverEvent("plothover", e,
  10356. function (s) { return false; });
  10357. }
  10358. function onClick(e) {
  10359. triggerClickHoverEvent("plotclick", e,
  10360. function (s) { return s["clickable"] != false; });
  10361. }
  10362. // trigger click or hover event (they send the same parameters
  10363. // so we share their code)
  10364. function triggerClickHoverEvent(eventname, event, seriesFilter) {
  10365. var offset = eventHolder.offset(),
  10366. canvasX = event.pageX - offset.left - plotOffset.left,
  10367. canvasY = event.pageY - offset.top - plotOffset.top,
  10368. pos = canvasToAxisCoords({ left: canvasX, top: canvasY });
  10369. pos.pageX = event.pageX;
  10370. pos.pageY = event.pageY;
  10371. var item = findNearbyItem(canvasX, canvasY, seriesFilter);
  10372. if (item) {
  10373. // fill in mouse pos for any listeners out there
  10374. item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left, 10);
  10375. item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top, 10);
  10376. }
  10377. if (options.grid.autoHighlight) {
  10378. // clear auto-highlights
  10379. for (var i = 0; i < highlights.length; ++i) {
  10380. var h = highlights[i];
  10381. if (h.auto == eventname &&
  10382. !(item && h.series == item.series &&
  10383. h.point[0] == item.datapoint[0] &&
  10384. h.point[1] == item.datapoint[1]))
  10385. unhighlight(h.series, h.point);
  10386. }
  10387. if (item)
  10388. highlight(item.series, item.datapoint, eventname);
  10389. }
  10390. placeholder.trigger(eventname, [ pos, item ]);
  10391. }
  10392. function triggerRedrawOverlay() {
  10393. var t = options.interaction.redrawOverlayInterval;
  10394. if (t == -1) { // skip event queue
  10395. drawOverlay();
  10396. return;
  10397. }
  10398. if (!redrawTimeout)
  10399. redrawTimeout = setTimeout(drawOverlay, t);
  10400. }
  10401. function drawOverlay() {
  10402. redrawTimeout = null;
  10403. // draw highlights
  10404. octx.save();
  10405. overlay.clear();
  10406. octx.translate(plotOffset.left, plotOffset.top);
  10407. var i, hi;
  10408. for (i = 0; i < highlights.length; ++i) {
  10409. hi = highlights[i];
  10410. if (hi.series.bars.show)
  10411. drawBarHighlight(hi.series, hi.point);
  10412. else
  10413. drawPointHighlight(hi.series, hi.point);
  10414. }
  10415. octx.restore();
  10416. executeHooks(hooks.drawOverlay, [octx]);
  10417. }
  10418. function highlight(s, point, auto) {
  10419. if (typeof s == "number")
  10420. s = series[s];
  10421. if (typeof point == "number") {
  10422. var ps = s.datapoints.pointsize;
  10423. point = s.datapoints.points.slice(ps * point, ps * (point + 1));
  10424. }
  10425. var i = indexOfHighlight(s, point);
  10426. if (i == -1) {
  10427. highlights.push({ series: s, point: point, auto: auto });
  10428. triggerRedrawOverlay();
  10429. }
  10430. else if (!auto)
  10431. highlights[i].auto = false;
  10432. }
  10433. function unhighlight(s, point) {
  10434. if (s == null && point == null) {
  10435. highlights = [];
  10436. triggerRedrawOverlay();
  10437. return;
  10438. }
  10439. if (typeof s == "number")
  10440. s = series[s];
  10441. if (typeof point == "number") {
  10442. var ps = s.datapoints.pointsize;
  10443. point = s.datapoints.points.slice(ps * point, ps * (point + 1));
  10444. }
  10445. var i = indexOfHighlight(s, point);
  10446. if (i != -1) {
  10447. highlights.splice(i, 1);
  10448. triggerRedrawOverlay();
  10449. }
  10450. }
  10451. function indexOfHighlight(s, p) {
  10452. for (var i = 0; i < highlights.length; ++i) {
  10453. var h = highlights[i];
  10454. if (h.series == s && h.point[0] == p[0]
  10455. && h.point[1] == p[1])
  10456. return i;
  10457. }
  10458. return -1;
  10459. }
  10460. function drawPointHighlight(series, point) {
  10461. var x = point[0], y = point[1],
  10462. axisx = series.xaxis, axisy = series.yaxis,
  10463. highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString();
  10464. if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)
  10465. return;
  10466. var pointRadius = series.points.radius + series.points.lineWidth / 2;
  10467. octx.lineWidth = pointRadius;
  10468. octx.strokeStyle = highlightColor;
  10469. var radius = 1.5 * pointRadius;
  10470. x = axisx.p2c(x);
  10471. y = axisy.p2c(y);
  10472. octx.beginPath();
  10473. if (series.points.symbol == "circle")
  10474. octx.arc(x, y, radius, 0, 2 * Math.PI, false);
  10475. else
  10476. series.points.symbol(octx, x, y, radius, false);
  10477. octx.closePath();
  10478. octx.stroke();
  10479. }
  10480. function drawBarHighlight(series, point) {
  10481. var highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString(),
  10482. fillStyle = highlightColor,
  10483. barLeft = series.bars.align == "left" ? 0 : -series.bars.barWidth/2;
  10484. octx.lineWidth = series.bars.lineWidth;
  10485. octx.strokeStyle = highlightColor;
  10486. drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth,
  10487. 0, function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth);
  10488. }
  10489. function getColorOrGradient(spec, bottom, top, defaultColor) {
  10490. if (typeof spec == "string")
  10491. return spec;
  10492. else {
  10493. // assume this is a gradient spec; IE currently only
  10494. // supports a simple vertical gradient properly, so that's
  10495. // what we support too
  10496. var gradient = ctx.createLinearGradient(0, top, 0, bottom);
  10497. for (var i = 0, l = spec.colors.length; i < l; ++i) {
  10498. var c = spec.colors[i];
  10499. if (typeof c != "string") {
  10500. var co = $.color.parse(defaultColor);
  10501. if (c.brightness != null)
  10502. co = co.scale('rgb', c.brightness);
  10503. if (c.opacity != null)
  10504. co.a *= c.opacity;
  10505. c = co.toString();
  10506. }
  10507. gradient.addColorStop(i / (l - 1), c);
  10508. }
  10509. return gradient;
  10510. }
  10511. }
  10512. }
  10513. // Add the plot function to the top level of the jQuery object
  10514. $.plot = function(placeholder, data, options) {
  10515. //var t0 = new Date();
  10516. var plot = new Plot($(placeholder), data, options, $.plot.plugins);
  10517. //(window.console ? console.log : alert)("time used (msecs): " + ((new Date()).getTime() - t0.getTime()));
  10518. return plot;
  10519. };
  10520. $.plot.version = "0.8.1";
  10521. $.plot.plugins = [];
  10522. // Also add the plot function as a chainable property
  10523. $.fn.plot = function(data, options) {
  10524. return this.each(function() {
  10525. $.plot(this, data, options);
  10526. });
  10527. };
  10528. // round to nearby lower multiple of base
  10529. function floorInBase(n, base) {
  10530. return base * Math.floor(n / base);
  10531. }
  10532. })(jQuery);
  10533. </script>
  10534. <script type="application/javascript">/* Flot plugin for rendering pie charts.
  10535. Copyright (c) 2007-2013 IOLA and Ole Laursen.
  10536. Licensed under the MIT license.
  10537. The plugin assumes that each series has a single data value, and that each
  10538. value is a positive integer or zero. Negative numbers don't make sense for a
  10539. pie chart, and have unpredictable results. The values do NOT need to be
  10540. passed in as percentages; the plugin will calculate the total and per-slice
  10541. percentages internally.
  10542. * Created by Brian Medendorp
  10543. * Updated with contributions from btburnett3, Anthony Aragues and Xavi Ivars
  10544. The plugin supports these options:
  10545. series: {
  10546. pie: {
  10547. show: true/false
  10548. radius: 0-1 for percentage of fullsize, or a specified pixel length, or 'auto'
  10549. innerRadius: 0-1 for percentage of fullsize or a specified pixel length, for creating a donut effect
  10550. startAngle: 0-2 factor of PI used for starting angle (in radians) i.e 3/2 starts at the top, 0 and 2 have the same result
  10551. tilt: 0-1 for percentage to tilt the pie, where 1 is no tilt, and 0 is completely flat (nothing will show)
  10552. offset: {
  10553. top: integer value to move the pie up or down
  10554. left: integer value to move the pie left or right, or 'auto'
  10555. },
  10556. stroke: {
  10557. color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#FFF')
  10558. width: integer pixel width of the stroke
  10559. },
  10560. label: {
  10561. show: true/false, or 'auto'
  10562. formatter: a user-defined function that modifies the text/style of the label text
  10563. radius: 0-1 for percentage of fullsize, or a specified pixel length
  10564. background: {
  10565. color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#000')
  10566. opacity: 0-1
  10567. },
  10568. threshold: 0-1 for the percentage value at which to hide labels (if they're too small)
  10569. },
  10570. combine: {
  10571. threshold: 0-1 for the percentage value at which to combine slices (if they're too small)
  10572. color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#CCC'), if null, the plugin will automatically use the color of the first slice to be combined
  10573. label: any text value of what the combined slice should be labeled
  10574. }
  10575. highlight: {
  10576. opacity: 0-1
  10577. }
  10578. }
  10579. }
  10580. More detail and specific examples can be found in the included HTML file.
  10581. */
  10582. (function($) {
  10583. // Maximum redraw attempts when fitting labels within the plot
  10584. var REDRAW_ATTEMPTS = 10;
  10585. // Factor by which to shrink the pie when fitting labels within the plot
  10586. var REDRAW_SHRINK = 0.95;
  10587. function init(plot) {
  10588. var canvas = null,
  10589. target = null,
  10590. maxRadius = null,
  10591. centerLeft = null,
  10592. centerTop = null,
  10593. processed = false,
  10594. ctx = null;
  10595. // interactive variables
  10596. var highlights = [];
  10597. // add hook to determine if pie plugin in enabled, and then perform necessary operations
  10598. plot.hooks.processOptions.push(function(plot, options) {
  10599. if (options.series.pie.show) {
  10600. options.grid.show = false;
  10601. // set labels.show
  10602. if (options.series.pie.label.show == "auto") {
  10603. if (options.legend.show) {
  10604. options.series.pie.label.show = false;
  10605. } else {
  10606. options.series.pie.label.show = true;
  10607. }
  10608. }
  10609. // set radius
  10610. if (options.series.pie.radius == "auto") {
  10611. if (options.series.pie.label.show) {
  10612. options.series.pie.radius = 3/4;
  10613. } else {
  10614. options.series.pie.radius = 1;
  10615. }
  10616. }
  10617. // ensure sane tilt
  10618. if (options.series.pie.tilt > 1) {
  10619. options.series.pie.tilt = 1;
  10620. } else if (options.series.pie.tilt < 0) {
  10621. options.series.pie.tilt = 0;
  10622. }
  10623. }
  10624. });
  10625. plot.hooks.bindEvents.push(function(plot, eventHolder) {
  10626. var options = plot.getOptions();
  10627. if (options.series.pie.show) {
  10628. if (options.grid.hoverable) {
  10629. eventHolder.unbind("mousemove").mousemove(onMouseMove);
  10630. }
  10631. if (options.grid.clickable) {
  10632. eventHolder.unbind("click").click(onClick);
  10633. }
  10634. }
  10635. });
  10636. plot.hooks.processDatapoints.push(function(plot, series, data, datapoints) {
  10637. var options = plot.getOptions();
  10638. if (options.series.pie.show) {
  10639. processDatapoints(plot, series, data, datapoints);
  10640. }
  10641. });
  10642. plot.hooks.drawOverlay.push(function(plot, octx) {
  10643. var options = plot.getOptions();
  10644. if (options.series.pie.show) {
  10645. drawOverlay(plot, octx);
  10646. }
  10647. });
  10648. plot.hooks.draw.push(function(plot, newCtx) {
  10649. var options = plot.getOptions();
  10650. if (options.series.pie.show) {
  10651. draw(plot, newCtx);
  10652. }
  10653. });
  10654. function processDatapoints(plot, series, datapoints) {
  10655. if (!processed) {
  10656. processed = true;
  10657. canvas = plot.getCanvas();
  10658. target = $(canvas).parent();
  10659. options = plot.getOptions();
  10660. plot.setData(combine(plot.getData()));
  10661. }
  10662. }
  10663. function combine(data) {
  10664. var total = 0,
  10665. combined = 0,
  10666. numCombined = 0,
  10667. color = options.series.pie.combine.color,
  10668. newdata = [];
  10669. // Fix up the raw data from Flot, ensuring the data is numeric
  10670. for (var i = 0; i < data.length; ++i) {
  10671. var value = data[i].data;
  10672. // If the data is an array, we'll assume that it's a standard
  10673. // Flot x-y pair, and are concerned only with the second value.
  10674. // Note how we use the original array, rather than creating a
  10675. // new one; this is more efficient and preserves any extra data
  10676. // that the user may have stored in higher indexes.
  10677. if ($.isArray(value) && value.length == 1) {
  10678. value = value[0];
  10679. }
  10680. if ($.isArray(value)) {
  10681. // Equivalent to $.isNumeric() but compatible with jQuery < 1.7
  10682. if (!isNaN(parseFloat(value[1])) && isFinite(value[1])) {
  10683. value[1] = +value[1];
  10684. } else {
  10685. value[1] = 0;
  10686. }
  10687. } else if (!isNaN(parseFloat(value)) && isFinite(value)) {
  10688. value = [1, +value];
  10689. } else {
  10690. value = [1, 0];
  10691. }
  10692. data[i].data = [value];
  10693. }
  10694. // Sum up all the slices, so we can calculate percentages for each
  10695. for (var i = 0; i < data.length; ++i) {
  10696. total += data[i].data[0][1];
  10697. }
  10698. // Count the number of slices with percentages below the combine
  10699. // threshold; if it turns out to be just one, we won't combine.
  10700. for (var i = 0; i < data.length; ++i) {
  10701. var value = data[i].data[0][1];
  10702. if (value / total <= options.series.pie.combine.threshold) {
  10703. combined += value;
  10704. numCombined++;
  10705. if (!color) {
  10706. color = data[i].color;
  10707. }
  10708. }
  10709. }
  10710. for (var i = 0; i < data.length; ++i) {
  10711. var value = data[i].data[0][1];
  10712. if (numCombined < 2 || value / total > options.series.pie.combine.threshold) {
  10713. newdata.push({
  10714. data: [[1, value]],
  10715. color: data[i].color,
  10716. label: data[i].label,
  10717. angle: value * Math.PI * 2 / total,
  10718. percent: value / (total / 100)
  10719. });
  10720. }
  10721. }
  10722. if (numCombined > 1) {
  10723. newdata.push({
  10724. data: [[1, combined]],
  10725. color: color,
  10726. label: options.series.pie.combine.label,
  10727. angle: combined * Math.PI * 2 / total,
  10728. percent: combined / (total / 100)
  10729. });
  10730. }
  10731. return newdata;
  10732. }
  10733. function draw(plot, newCtx) {
  10734. if (!target) {
  10735. return; // if no series were passed
  10736. }
  10737. var canvasWidth = plot.getPlaceholder().width(),
  10738. canvasHeight = plot.getPlaceholder().height(),
  10739. legendWidth = target.children().filter(".legend").children().width() || 0;
  10740. ctx = newCtx;
  10741. // WARNING: HACK! REWRITE THIS CODE AS SOON AS POSSIBLE!
  10742. // When combining smaller slices into an 'other' slice, we need to
  10743. // add a new series. Since Flot gives plugins no way to modify the
  10744. // list of series, the pie plugin uses a hack where the first call
  10745. // to processDatapoints results in a call to setData with the new
  10746. // list of series, then subsequent processDatapoints do nothing.
  10747. // The plugin-global 'processed' flag is used to control this hack;
  10748. // it starts out false, and is set to true after the first call to
  10749. // processDatapoints.
  10750. // Unfortunately this turns future setData calls into no-ops; they
  10751. // call processDatapoints, the flag is true, and nothing happens.
  10752. // To fix this we'll set the flag back to false here in draw, when
  10753. // all series have been processed, so the next sequence of calls to
  10754. // processDatapoints once again starts out with a slice-combine.
  10755. // This is really a hack; in 0.9 we need to give plugins a proper
  10756. // way to modify series before any processing begins.
  10757. processed = false;
  10758. // calculate maximum radius and center point
  10759. maxRadius = Math.min(canvasWidth, canvasHeight / options.series.pie.tilt) / 2;
  10760. centerTop = canvasHeight / 2 + options.series.pie.offset.top;
  10761. centerLeft = canvasWidth / 2;
  10762. if (options.series.pie.offset.left == "auto") {
  10763. if (options.legend.position.match("w")) {
  10764. centerLeft += legendWidth / 2;
  10765. } else {
  10766. centerLeft -= legendWidth / 2;
  10767. }
  10768. } else {
  10769. centerLeft += options.series.pie.offset.left;
  10770. }
  10771. if (centerLeft < maxRadius) {
  10772. centerLeft = maxRadius;
  10773. } else if (centerLeft > canvasWidth - maxRadius) {
  10774. centerLeft = canvasWidth - maxRadius;
  10775. }
  10776. var slices = plot.getData(),
  10777. attempts = 0;
  10778. // Keep shrinking the pie's radius until drawPie returns true,
  10779. // indicating that all the labels fit, or we try too many times.
  10780. do {
  10781. if (attempts > 0) {
  10782. maxRadius *= REDRAW_SHRINK;
  10783. }
  10784. attempts += 1;
  10785. clear();
  10786. if (options.series.pie.tilt <= 0.8) {
  10787. drawShadow();
  10788. }
  10789. } while (!drawPie() && attempts < REDRAW_ATTEMPTS)
  10790. if (attempts >= REDRAW_ATTEMPTS) {
  10791. clear();
  10792. target.prepend("<div class='error'>Could not draw pie with labels contained inside canvas</div>");
  10793. }
  10794. if (plot.setSeries && plot.insertLegend) {
  10795. plot.setSeries(slices);
  10796. plot.insertLegend();
  10797. }
  10798. // we're actually done at this point, just defining internal functions at this point
  10799. function clear() {
  10800. ctx.clearRect(0, 0, canvasWidth, canvasHeight);
  10801. target.children().filter(".pieLabel, .pieLabelBackground").remove();
  10802. }
  10803. function drawShadow() {
  10804. var shadowLeft = options.series.pie.shadow.left;
  10805. var shadowTop = options.series.pie.shadow.top;
  10806. var edge = 10;
  10807. var alpha = options.series.pie.shadow.alpha;
  10808. var radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius;
  10809. if (radius >= canvasWidth / 2 - shadowLeft || radius * options.series.pie.tilt >= canvasHeight / 2 - shadowTop || radius <= edge) {
  10810. return; // shadow would be outside canvas, so don't draw it
  10811. }
  10812. ctx.save();
  10813. ctx.translate(shadowLeft,shadowTop);
  10814. ctx.globalAlpha = alpha;
  10815. ctx.fillStyle = "#000";
  10816. // center and rotate to starting position
  10817. ctx.translate(centerLeft,centerTop);
  10818. ctx.scale(1, options.series.pie.tilt);
  10819. //radius -= edge;
  10820. for (var i = 1; i <= edge; i++) {
  10821. ctx.beginPath();
  10822. ctx.arc(0, 0, radius, 0, Math.PI * 2, false);
  10823. ctx.fill();
  10824. radius -= i;
  10825. }
  10826. ctx.restore();
  10827. }
  10828. function drawPie() {
  10829. var startAngle = Math.PI * options.series.pie.startAngle;
  10830. var radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius;
  10831. // center and rotate to starting position
  10832. ctx.save();
  10833. ctx.translate(centerLeft,centerTop);
  10834. ctx.scale(1, options.series.pie.tilt);
  10835. //ctx.rotate(startAngle); // start at top; -- This doesn't work properly in Opera
  10836. // draw slices
  10837. ctx.save();
  10838. var currentAngle = startAngle;
  10839. for (var i = 0; i < slices.length; ++i) {
  10840. slices[i].startAngle = currentAngle;
  10841. drawSlice(slices[i].angle, slices[i].color, true);
  10842. }
  10843. ctx.restore();
  10844. // draw slice outlines
  10845. if (options.series.pie.stroke.width > 0) {
  10846. ctx.save();
  10847. ctx.lineWidth = options.series.pie.stroke.width;
  10848. currentAngle = startAngle;
  10849. for (var i = 0; i < slices.length; ++i) {
  10850. drawSlice(slices[i].angle, options.series.pie.stroke.color, false);
  10851. }
  10852. ctx.restore();
  10853. }
  10854. // draw donut hole
  10855. drawDonutHole(ctx);
  10856. ctx.restore();
  10857. // Draw the labels, returning true if they fit within the plot
  10858. if (options.series.pie.label.show) {
  10859. return drawLabels();
  10860. } else return true;
  10861. function drawSlice(angle, color, fill) {
  10862. if (angle <= 0 || isNaN(angle)) {
  10863. return;
  10864. }
  10865. if (fill) {
  10866. ctx.fillStyle = color;
  10867. } else {
  10868. ctx.strokeStyle = color;
  10869. ctx.lineJoin = "round";
  10870. }
  10871. ctx.beginPath();
  10872. if (Math.abs(angle - Math.PI * 2) > 0.000000001) {
  10873. ctx.moveTo(0, 0); // Center of the pie
  10874. }
  10875. //ctx.arc(0, 0, radius, 0, angle, false); // This doesn't work properly in Opera
  10876. ctx.arc(0, 0, radius,currentAngle, currentAngle + angle / 2, false);
  10877. ctx.arc(0, 0, radius,currentAngle + angle / 2, currentAngle + angle, false);
  10878. ctx.closePath();
  10879. //ctx.rotate(angle); // This doesn't work properly in Opera
  10880. currentAngle += angle;
  10881. if (fill) {
  10882. ctx.fill();
  10883. } else {
  10884. ctx.stroke();
  10885. }
  10886. }
  10887. function drawLabels() {
  10888. var currentAngle = startAngle;
  10889. var radius = options.series.pie.label.radius > 1 ? options.series.pie.label.radius : maxRadius * options.series.pie.label.radius;
  10890. for (var i = 0; i < slices.length; ++i) {
  10891. if (slices[i].percent >= options.series.pie.label.threshold * 100) {
  10892. if (!drawLabel(slices[i], currentAngle, i)) {
  10893. return false;
  10894. }
  10895. }
  10896. currentAngle += slices[i].angle;
  10897. }
  10898. return true;
  10899. function drawLabel(slice, startAngle, index) {
  10900. if (slice.data[0][1] == 0) {
  10901. return true;
  10902. }
  10903. // format label text
  10904. var lf = options.legend.labelFormatter, text, plf = options.series.pie.label.formatter;
  10905. if (lf) {
  10906. text = lf(slice.label, slice);
  10907. } else {
  10908. text = slice.label;
  10909. }
  10910. if (plf) {
  10911. text = plf(text, slice);
  10912. }
  10913. var halfAngle = ((startAngle + slice.angle) + startAngle) / 2;
  10914. var x = centerLeft + Math.round(Math.cos(halfAngle) * radius);
  10915. var y = centerTop + Math.round(Math.sin(halfAngle) * radius) * options.series.pie.tilt;
  10916. var html = "<span class='pieLabel' id='pieLabel" + index + "' style='position:absolute;top:" + y + "px;left:" + x + "px;'>" + text + "</span>";
  10917. target.append(html);
  10918. var label = target.children("#pieLabel" + index);
  10919. var labelTop = (y - label.height() / 2);
  10920. var labelLeft = (x - label.width() / 2);
  10921. label.css("top", labelTop);
  10922. label.css("left", labelLeft);
  10923. // check to make sure that the label is not outside the canvas
  10924. if (0 - labelTop > 0 || 0 - labelLeft > 0 || canvasHeight - (labelTop + label.height()) < 0 || canvasWidth - (labelLeft + label.width()) < 0) {
  10925. return false;
  10926. }
  10927. if (options.series.pie.label.background.opacity != 0) {
  10928. // put in the transparent background separately to avoid blended labels and label boxes
  10929. var c = options.series.pie.label.background.color;
  10930. if (c == null) {
  10931. c = slice.color;
  10932. }
  10933. var pos = "top:" + labelTop + "px;left:" + labelLeft + "px;";
  10934. $("<div class='pieLabelBackground' style='position:absolute;width:" + label.width() + "px;height:" + label.height() + "px;" + pos + "background-color:" + c + ";'></div>")
  10935. .css("opacity", options.series.pie.label.background.opacity)
  10936. .insertBefore(label);
  10937. }
  10938. return true;
  10939. } // end individual label function
  10940. } // end drawLabels function
  10941. } // end drawPie function
  10942. } // end draw function
  10943. // Placed here because it needs to be accessed from multiple locations
  10944. function drawDonutHole(layer) {
  10945. if (options.series.pie.innerRadius > 0) {
  10946. // subtract the center
  10947. layer.save();
  10948. var innerRadius = options.series.pie.innerRadius > 1 ? options.series.pie.innerRadius : maxRadius * options.series.pie.innerRadius;
  10949. layer.globalCompositeOperation = "destination-out"; // this does not work with excanvas, but it will fall back to using the stroke color
  10950. layer.beginPath();
  10951. layer.fillStyle = options.series.pie.stroke.color;
  10952. layer.arc(0, 0, innerRadius, 0, Math.PI * 2, false);
  10953. layer.fill();
  10954. layer.closePath();
  10955. layer.restore();
  10956. // add inner stroke
  10957. layer.save();
  10958. layer.beginPath();
  10959. layer.strokeStyle = options.series.pie.stroke.color;
  10960. layer.arc(0, 0, innerRadius, 0, Math.PI * 2, false);
  10961. layer.stroke();
  10962. layer.closePath();
  10963. layer.restore();
  10964. // TODO: add extra shadow inside hole (with a mask) if the pie is tilted.
  10965. }
  10966. }
  10967. //-- Additional Interactive related functions --
  10968. function isPointInPoly(poly, pt) {
  10969. for(var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i)
  10970. ((poly[i][1] <= pt[1] && pt[1] < poly[j][1]) || (poly[j][1] <= pt[1] && pt[1]< poly[i][1]))
  10971. && (pt[0] < (poly[j][0] - poly[i][0]) * (pt[1] - poly[i][1]) / (poly[j][1] - poly[i][1]) + poly[i][0])
  10972. && (c = !c);
  10973. return c;
  10974. }
  10975. function findNearbySlice(mouseX, mouseY) {
  10976. var slices = plot.getData(),
  10977. options = plot.getOptions(),
  10978. radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius,
  10979. x, y;
  10980. for (var i = 0; i < slices.length; ++i) {
  10981. var s = slices[i];
  10982. if (s.pie.show) {
  10983. ctx.save();
  10984. ctx.beginPath();
  10985. ctx.moveTo(0, 0); // Center of the pie
  10986. //ctx.scale(1, options.series.pie.tilt); // this actually seems to break everything when here.
  10987. ctx.arc(0, 0, radius, s.startAngle, s.startAngle + s.angle / 2, false);
  10988. ctx.arc(0, 0, radius, s.startAngle + s.angle / 2, s.startAngle + s.angle, false);
  10989. ctx.closePath();
  10990. x = mouseX - centerLeft;
  10991. y = mouseY - centerTop;
  10992. if (ctx.isPointInPath) {
  10993. if (ctx.isPointInPath(mouseX - centerLeft, mouseY - centerTop)) {
  10994. ctx.restore();
  10995. return {
  10996. datapoint: [s.percent, s.data],
  10997. dataIndex: 0,
  10998. series: s,
  10999. seriesIndex: i
  11000. };
  11001. }
  11002. } else {
  11003. // excanvas for IE doesn;t support isPointInPath, this is a workaround.
  11004. var p1X = radius * Math.cos(s.startAngle),
  11005. p1Y = radius * Math.sin(s.startAngle),
  11006. p2X = radius * Math.cos(s.startAngle + s.angle / 4),
  11007. p2Y = radius * Math.sin(s.startAngle + s.angle / 4),
  11008. p3X = radius * Math.cos(s.startAngle + s.angle / 2),
  11009. p3Y = radius * Math.sin(s.startAngle + s.angle / 2),
  11010. p4X = radius * Math.cos(s.startAngle + s.angle / 1.5),
  11011. p4Y = radius * Math.sin(s.startAngle + s.angle / 1.5),
  11012. p5X = radius * Math.cos(s.startAngle + s.angle),
  11013. p5Y = radius * Math.sin(s.startAngle + s.angle),
  11014. arrPoly = [[0, 0], [p1X, p1Y], [p2X, p2Y], [p3X, p3Y], [p4X, p4Y], [p5X, p5Y]],
  11015. arrPoint = [x, y];
  11016. // TODO: perhaps do some mathmatical trickery here with the Y-coordinate to compensate for pie tilt?
  11017. if (isPointInPoly(arrPoly, arrPoint)) {
  11018. ctx.restore();
  11019. return {
  11020. datapoint: [s.percent, s.data],
  11021. dataIndex: 0,
  11022. series: s,
  11023. seriesIndex: i
  11024. };
  11025. }
  11026. }
  11027. ctx.restore();
  11028. }
  11029. }
  11030. return null;
  11031. }
  11032. function onMouseMove(e) {
  11033. triggerClickHoverEvent("plothover", e);
  11034. }
  11035. function onClick(e) {
  11036. triggerClickHoverEvent("plotclick", e);
  11037. }
  11038. // trigger click or hover event (they send the same parameters so we share their code)
  11039. function triggerClickHoverEvent(eventname, e) {
  11040. var offset = plot.offset();
  11041. var canvasX = parseInt(e.pageX - offset.left);
  11042. var canvasY = parseInt(e.pageY - offset.top);
  11043. var item = findNearbySlice(canvasX, canvasY);
  11044. if (options.grid.autoHighlight) {
  11045. // clear auto-highlights
  11046. for (var i = 0; i < highlights.length; ++i) {
  11047. var h = highlights[i];
  11048. if (h.auto == eventname && !(item && h.series == item.series)) {
  11049. unhighlight(h.series);
  11050. }
  11051. }
  11052. }
  11053. // highlight the slice
  11054. if (item) {
  11055. highlight(item.series, eventname);
  11056. }
  11057. // trigger any hover bind events
  11058. var pos = { pageX: e.pageX, pageY: e.pageY };
  11059. target.trigger(eventname, [pos, item]);
  11060. }
  11061. function highlight(s, auto) {
  11062. //if (typeof s == "number") {
  11063. // s = series[s];
  11064. //}
  11065. var i = indexOfHighlight(s);
  11066. if (i == -1) {
  11067. highlights.push({ series: s, auto: auto });
  11068. plot.triggerRedrawOverlay();
  11069. } else if (!auto) {
  11070. highlights[i].auto = false;
  11071. }
  11072. }
  11073. function unhighlight(s) {
  11074. if (s == null) {
  11075. highlights = [];
  11076. plot.triggerRedrawOverlay();
  11077. }
  11078. //if (typeof s == "number") {
  11079. // s = series[s];
  11080. //}
  11081. var i = indexOfHighlight(s);
  11082. if (i != -1) {
  11083. highlights.splice(i, 1);
  11084. plot.triggerRedrawOverlay();
  11085. }
  11086. }
  11087. function indexOfHighlight(s) {
  11088. for (var i = 0; i < highlights.length; ++i) {
  11089. var h = highlights[i];
  11090. if (h.series == s)
  11091. return i;
  11092. }
  11093. return -1;
  11094. }
  11095. function drawOverlay(plot, octx) {
  11096. var options = plot.getOptions();
  11097. var radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius;
  11098. octx.save();
  11099. octx.translate(centerLeft, centerTop);
  11100. octx.scale(1, options.series.pie.tilt);
  11101. for (var i = 0; i < highlights.length; ++i) {
  11102. drawHighlight(highlights[i].series);
  11103. }
  11104. drawDonutHole(octx);
  11105. octx.restore();
  11106. function drawHighlight(series) {
  11107. if (series.angle <= 0 || isNaN(series.angle)) {
  11108. return;
  11109. }
  11110. //octx.fillStyle = parseColor(options.series.pie.highlight.color).scale(null, null, null, options.series.pie.highlight.opacity).toString();
  11111. octx.fillStyle = "rgba(255, 255, 255, " + options.series.pie.highlight.opacity + ")"; // this is temporary until we have access to parseColor
  11112. octx.beginPath();
  11113. if (Math.abs(series.angle - Math.PI * 2) > 0.000000001) {
  11114. octx.moveTo(0, 0); // Center of the pie
  11115. }
  11116. octx.arc(0, 0, radius, series.startAngle, series.startAngle + series.angle / 2, false);
  11117. octx.arc(0, 0, radius, series.startAngle + series.angle / 2, series.startAngle + series.angle, false);
  11118. octx.closePath();
  11119. octx.fill();
  11120. }
  11121. }
  11122. } // end init (plugin body)
  11123. // define pie specific options and their default values
  11124. var options = {
  11125. series: {
  11126. pie: {
  11127. show: false,
  11128. radius: "auto", // actual radius of the visible pie (based on full calculated radius if <=1, or hard pixel value)
  11129. innerRadius: 0, /* for donut */
  11130. startAngle: 3/2,
  11131. tilt: 1,
  11132. shadow: {
  11133. left: 5, // shadow left offset
  11134. top: 15, // shadow top offset
  11135. alpha: 0.02 // shadow alpha
  11136. },
  11137. offset: {
  11138. top: 0,
  11139. left: "auto"
  11140. },
  11141. stroke: {
  11142. color: "#fff",
  11143. width: 1
  11144. },
  11145. label: {
  11146. show: "auto",
  11147. formatter: function(label, slice) {
  11148. return "<div style='font-size:x-small;text-align:center;padding:2px;color:" + slice.color + ";'>" + label + "<br/>" + Math.round(slice.percent) + "%</div>";
  11149. }, // formatter function
  11150. radius: 1, // radius at which to place the labels (based on full calculated radius if <=1, or hard pixel value)
  11151. background: {
  11152. color: null,
  11153. opacity: 0
  11154. },
  11155. threshold: 0 // percentage at which to hide the label (i.e. the slice is too narrow)
  11156. },
  11157. combine: {
  11158. threshold: -1, // percentage at which to combine little slices into one larger slice
  11159. color: null, // color to give the new slice (auto-generated if null)
  11160. label: "Other" // label to give the new slice
  11161. },
  11162. highlight: {
  11163. //color: "#fff", // will add this functionality once parseColor is available
  11164. opacity: 0.5
  11165. }
  11166. }
  11167. }
  11168. };
  11169. $.plot.plugins.push({
  11170. init: init,
  11171. options: options,
  11172. name: "pie",
  11173. version: "1.1"
  11174. });
  11175. })(jQuery);
  11176. </script>
  11177. <script type="application/javascript">/* Flot plugin for automatically redrawing plots as the placeholder resizes.
  11178. Copyright (c) 2007-2013 IOLA and Ole Laursen.
  11179. Licensed under the MIT license.
  11180. It works by listening for changes on the placeholder div (through the jQuery
  11181. resize event plugin) - if the size changes, it will redraw the plot.
  11182. There are no options. If you need to disable the plugin for some plots, you
  11183. can just fix the size of their placeholders.
  11184. */
  11185. /* Inline dependency:
  11186. * jQuery resize event - v1.1 - 3/14/2010
  11187. * http://benalman.com/projects/jquery-resize-plugin/
  11188. *
  11189. * Copyright (c) 2010 "Cowboy" Ben Alman
  11190. * Dual licensed under the MIT and GPL licenses.
  11191. * http://benalman.com/about/license/
  11192. */
  11193. (function($,h,c){var a=$([]),e=$.resize=$.extend($.resize,{}),i,k="setTimeout",j="resize",d=j+"-special-event",b="delay",f="throttleWindow";e[b]=250;e[f]=true;$.event.special[j]={setup:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.add(l);$.data(this,d,{w:l.width(),h:l.height()});if(a.length===1){g()}},teardown:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.not(l);l.removeData(d);if(!a.length){clearTimeout(i)}},add:function(l){if(!e[f]&&this[k]){return false}var n;function m(s,o,p){var q=$(this),r=$.data(this,d);r.w=o!==c?o:q.width();r.h=p!==c?p:q.height();n.apply(this,arguments)}if($.isFunction(l)){n=l;return m}else{n=l.handler;l.handler=m}}};function g(){i=h[k](function(){a.each(function(){var n=$(this),m=n.width(),l=n.height(),o=$.data(this,d);if(m!==o.w||l!==o.h){n.trigger(j,[o.w=m,o.h=l])}});g()},e[b])}})(jQuery,this);
  11194. (function ($) {
  11195. var options = { }; // no options
  11196. function init(plot) {
  11197. function onResize() {
  11198. var placeholder = plot.getPlaceholder();
  11199. // somebody might have hidden us and we can't plot
  11200. // when we don't have the dimensions
  11201. if (placeholder.width() == 0 || placeholder.height() == 0)
  11202. return;
  11203. plot.resize();
  11204. plot.setupGrid();
  11205. plot.draw();
  11206. }
  11207. function bindEvents(plot, eventHolder) {
  11208. plot.getPlaceholder().resize(onResize);
  11209. }
  11210. function shutdown(plot, eventHolder) {
  11211. plot.getPlaceholder().unbind("resize", onResize);
  11212. }
  11213. plot.hooks.bindEvents.push(bindEvents);
  11214. plot.hooks.shutdown.push(shutdown);
  11215. }
  11216. $.plot.plugins.push({
  11217. init: init,
  11218. options: options,
  11219. name: 'resize',
  11220. version: '1.0'
  11221. });
  11222. })(jQuery);
  11223. </script>
  11224. <script type="application/javascript">
  11225. $(document).ready(function() {
  11226. var row = 0;
  11227. var MINOR_AUTHOR_PERCENTAGE = 1.00;
  11228. var isReversed = false;
  11229. var colorRows = function() {
  11230. $(this).removeClass("odd");
  11231. if (row++ % 2 == 1) {
  11232. $(this).addClass("odd");
  11233. }
  11234. if(this == $(this).parent().find("tr:visible").get(-1)) {
  11235. row = 0;
  11236. }
  11237. }
  11238. var filterResponsibilities = function() {
  11239. $("table#blame tbody tr td:last-child").filter(function() {
  11240. return parseFloat(this.innerHTML) < MINOR_AUTHOR_PERCENTAGE;
  11241. }).parent().find("td:first-child").each(function() {
  11242. $("div#responsibilities div h3:contains(\"" + $(this).text() + "\")").parent().hide();
  11243. });
  11244. }
  11245. var filterTimeLine = function() {
  11246. $("div#timeline table.git tbody tr").filter(function() {
  11247. return $(this).find("td:has(div)").length == 0;
  11248. }).hide();
  11249. }
  11250. $("table#changes tbody tr td:last-child").filter(function() {
  11251. return parseFloat(this.innerHTML) < MINOR_AUTHOR_PERCENTAGE;
  11252. }).parent().hide();
  11253. $("table#blame tbody tr td:last-child").filter(function() {
  11254. return parseFloat(this.innerHTML) < MINOR_AUTHOR_PERCENTAGE;
  11255. }).parent().hide();
  11256. $("table.git tbody tr:visible").each(colorRows);
  11257. $("table#changes, table#blame").tablesorter({
  11258. sortList: [[0,0]],
  11259. headers: {
  11260. 0: { sorter: "text" }
  11261. }
  11262. }).bind("sortEnd", function() {
  11263. $(this).find("tbody tr:visible").each(colorRows);
  11264. });
  11265. $("table#changes thead tr th, table#blame thead tr th").click(function() {
  11266. $(this).parent().find("th strong").remove();
  11267. var parentIndex = $(this).index();
  11268. if (this.isReversed) {
  11269. $(this).append("<strong> &and;</strong>");
  11270. } else {
  11271. $(this).append("<strong> &or;</strong>");
  11272. }
  11273. this.isReversed = !this.isReversed;
  11274. });
  11275. $("table#changes thead tr th:first-child, table#blame thead tr th:first-child").each(function() {
  11276. this.isReversed = true;
  11277. $(this).append("<strong> &or;</strong>");
  11278. });
  11279. $("table.git tfoot tr td:first-child").filter(function() {
  11280. this.hiddenCount = $(this).parent().parent().parent().find("tbody tr:hidden").length;
  11281. return this.hiddenCount > 0;
  11282. }).each(function() {
  11283. $(this).addClass("hoverable");
  11284. this.innerHTML = "Show minor authors (" + this.hiddenCount + ") &or;";
  11285. }).toggle(function() {
  11286. this.innerHTML = "Hide minor authors (" + this.hiddenCount + ") &and;";
  11287. $(this).parent().parent().parent().find("tbody tr").show().each(colorRows);
  11288. }, function() {
  11289. this.innerHTML = "Show minor authors (" + this.hiddenCount + ") &or;";
  11290. $(this).parent().parent().parent().find("tbody tr td:last-child").filter(function() {
  11291. return parseFloat(this.innerHTML) < MINOR_AUTHOR_PERCENTAGE;
  11292. }).parent().hide();
  11293. $("table.git tbody tr:visible").each(colorRows);
  11294. });
  11295. filterResponsibilities();
  11296. var hiddenResponsibilitiesCount = $("div#responsibilities div h3:hidden").length;
  11297. if (hiddenResponsibilitiesCount > 0) {
  11298. $("div#responsibilities div h3:visible").each(colorRows);
  11299. $("div#responsibilities").prepend("<div class=\"button\">Show minor authors (" + hiddenResponsibilitiesCount + ") &or;</div>");
  11300. $("div#responsibilities div.button").toggle(function() {
  11301. this.innerHTML = "Hide minor authors (" + hiddenResponsibilitiesCount + ") &and;";
  11302. $("div#responsibilities div").show();
  11303. }, function() {
  11304. this.innerHTML = "Show minor authors (" + hiddenResponsibilitiesCount + ") &or;";
  11305. filterResponsibilities();
  11306. });
  11307. }
  11308. filterTimeLine();
  11309. var hiddenTimelineCount = $("div#timeline table.git tbody tr:hidden").length;
  11310. if (hiddenTimelineCount > 0) {
  11311. $("div#timeline table.git tbody tr:visible").each(colorRows);
  11312. $("div#timeline").prepend("<div class=\"button\">Show rows with minor work (" + hiddenTimelineCount + ") &or;</div>");
  11313. $("div#timeline div.button").toggle(function() {
  11314. this.innerHTML = "Hide rows with minor work (" + hiddenTimelineCount + ") &and;";
  11315. $("div#timeline table.git tbody tr").show().each(colorRows);
  11316. }, function() {
  11317. this.innerHTML = "Show rows with minor work (" + hiddenTimelineCount + ") &or;";
  11318. filterTimeLine();
  11319. $("div#timeline table.git tbody tr:visible").each(colorRows);
  11320. });
  11321. }
  11322. $("#blame_chart, #changes_chart").bind("plothover", function(event, pos, obj) {
  11323. if (obj) {
  11324. var selection = "table tbody tr td:contains(\"" + obj.series.label + "\")";
  11325. var element = $(this).parent().find(selection);
  11326. if (element) {
  11327. if (this.hoveredElement && this.hoveredElement.html() != element.parent().html()) {
  11328. this.hoveredElement.removeClass("piehover");
  11329. }
  11330. element.parent().addClass("piehover");
  11331. this.hoveredElement = element.parent();
  11332. }
  11333. } else if (this.hoveredElement) {
  11334. this.hoveredElement.removeClass("piehover");
  11335. }
  11336. });
  11337. });
  11338. </script>
  11339. <style type="text/css">
  11340. body {
  11341. background: -webkit-linear-gradient(left, #8f8a9a, #dad2d7, #8f8a9a);
  11342. background: -moz-linear-gradient(left, #8f8a9a, #dad2d7, #8f8a9a);
  11343. }
  11344. html, body {
  11345. margin: 0;
  11346. height: 100%;
  11347. font-family: "Arial";
  11348. }
  11349. body > div {
  11350. margin: 0 auto;
  11351. width: 58em;
  11352. }
  11353. div.box {
  11354. border: 4px solid #ddd;
  11355. background-color: #eee;
  11356. margin: 0.75em;
  11357. padding: 5px;
  11358. font-size: small;
  11359. border-radius: 15px;
  11360. -moz-border-radius: 15px;
  11361. box-shadow: 1px 1px 3px #666;
  11362. -moz-box-shadow: 1px 1px 3px #666;
  11363. }
  11364. div.logo p {
  11365. margin-top: 18px;
  11366. }
  11367. div.logo img {
  11368. float: left;
  11369. padding: 2px 10px 2px 2px;
  11370. }
  11371. body > div {
  11372. display: block-inline;
  11373. }
  11374. body > div > div > div {
  11375. position: relative;
  11376. width: 100%;
  11377. min-height: 140px;
  11378. }
  11379. table.git {
  11380. font-size: small;
  11381. width: 65%;
  11382. padding-right: 5px;
  11383. }
  11384. table.full {
  11385. width: 100%;
  11386. }
  11387. table.git th, table.git tfoot tr td {
  11388. padding: 0.3em;
  11389. background-color: #ddcece;
  11390. border-radius: 8px 8px 0px 0px;
  11391. -moz-border-radius: 8px 8px 0px 0px;
  11392. }
  11393. table#changes thead tr th, table#blame thead tr th, table.git tfoot tr td {
  11394. border: 1px solid #eee;
  11395. text-align: center;
  11396. }
  11397. table.git tfoot tr td {
  11398. border-radius: 0px 0px 8px 8px;
  11399. -moz-border-radius: 0px 0px 8px 8px;
  11400. text-align: center;
  11401. }
  11402. table.git td, table.git th, table#timeline td, table#timeline th {
  11403. padding: 0.35em;
  11404. height: 2em;
  11405. }
  11406. table.git td div.insert {
  11407. background-color: #7a7;
  11408. }
  11409. table.git td div.remove {
  11410. background-color: #c66;
  11411. }
  11412. table.git td div.insert, table.git td div.remove {
  11413. height: 100%;
  11414. float: left;
  11415. }
  11416. table.git tr.odd {
  11417. background-color: #dbdbdb;
  11418. }
  11419. table.git tr.piehover {
  11420. background-color: #dddece;
  11421. }
  11422. div.chart {
  11423. position: absolute;
  11424. top: 5px;
  11425. bottom: 5px;
  11426. right: 0px;
  11427. width: 35%;
  11428. min-height: 100px;
  11429. max-height: 210px;
  11430. font-size: x-small;
  11431. }
  11432. p.error {
  11433. color: #700;
  11434. }
  11435. table#changes thead tr th:hover, table#blame thead tr th:hover,
  11436. table#changes tfoot tr td.hoverable:hover, table#blame tfoot tr td.hoverable:hover,
  11437. div.button:hover, div#responsibilities div.button:hover {
  11438. background-color: #eddede;
  11439. border: 1px solid #bbb;
  11440. cursor: hand;
  11441. }
  11442. div#responsibilities div, div#responsibilities div div {
  11443. min-height: 0px;
  11444. padding: 0.5em 0.2em;
  11445. width: auto;
  11446. }
  11447. div#responsibilities div.odd {
  11448. background-color: #dbdbdb;
  11449. }
  11450. div#responsibilities p {
  11451. margin-bottom: 0px;
  11452. }
  11453. td img, h3 img {
  11454. border-radius: 3px 3px 3px 3px;
  11455. -moz-border-radius: 3px 3px 3px 3px;
  11456. vertical-align: middle;
  11457. margin-right: 0.4em;
  11458. opacity: 0.85;
  11459. }
  11460. td img {
  11461. width: 20px;
  11462. height: 20px;
  11463. }
  11464. h3 img {
  11465. width: 32px;
  11466. height: 32px;
  11467. }
  11468. h3 {
  11469. border-radius: 8px 8px 8px 8px;
  11470. -moz-border-radius: 8px 8px 8px 8px;
  11471. background-color: #ddcece;
  11472. margin-bottom: 0.2em;
  11473. margin-top: 0.6em;
  11474. }
  11475. div.button, div#responsibilities div.button {
  11476. border-radius: 8px 8px 8px 8px;
  11477. -moz-border-radius: 8px 8px 8px 8px;
  11478. border: 1px solid #eee;
  11479. float: right;
  11480. width: auto;
  11481. padding: 0.5em;
  11482. background-color: #ddcece;
  11483. min-height: 0;
  11484. }
  11485. </style>
  11486. </head>
  11487. <body>
  11488. <div><div class="box logo">
  11489. <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAN1wAADdcBQiibeAAAAAd0SU1FB9wLDQATAE193qoAABEjSURBVGjevVprbBzXdf7OvTP75u6SFCk+JFkUJZKSbcmPSJbsyohtwQ2ch5omDYI4QYvUjpH+SFEkBYr+zI/+aX8U6R+7iIsmRosajREEbYo0jtvYiZMmsB09HD2tNyk+9sXdnZ2dmTv3nv6Yu+RKopykdrPAgofk7L3nfb5zzhLen5cAIAFkAWQAFAE4AFwADEDZdxtAACACEAPQ7/Vieo+fzYBojIARZp4AsMkK4fQJxn3vCIAHYIWIlhmogblmhdK/TQHKALYC2A1gBECOhDDpfD5202mdLRbhZjJwXBfMDB1FCIMAoeeRCkMR+r7LWgPAKoAlAOcArNjf/18FyAGYBXA3gDEhpcoPDsajU1M8PDmJ4ugossUiHNcFCQEiSlRvDNgYqCCA12igXalwbWGBqleuyND3nTiKGMAFAGcBLFhXe18FkFbj9wOYdlIpNTgxEd2xdy+N79oFN5MBM4O1htE6YbjvAgYAIkghQFKCKLnWbzaxcOYML77zDq0uLaV1FBkAx60gKzZu3rMALoA5AIcB5Iqjo925Bx+ksV274KZSiIIAzLymbQIAZrBlkjagyVpFOA7cdBp+q4XLx45h4fRptCqVHICrAN4AMG/j4101+6tc5n4AjznpNG+/555o/9GjNDQxAa0UYqXWtbwBk64xZITYUBAIARiDWCk4roux6WkMb9mC0PejwPPKJo53AGgC6Nrg/40FyAJ4EMChzMCAv/fIEZ47fJiM1oijKNE00Zrm0dMsCGnWsuJmw4aTVl3h6EEdpRQJQwD1u1TPlRiAVgq5YhETMzOkwlAHnueqINhpA9u/nRC3E8ABsB/AwXQ+793/kY+IrXv2IPA8IvR4JyJm4j7aELHLRr5VGFn98sKJg19cPvX7s0Ez/82RmbcnlJ9jgPk2nwUAozWBmcZ37YKOY9Op11mF4XYANRvY8a8jgARwJ4DHMoVCZ//HPkbjMzMIOh2Q1RoRrfl9P51h7fx8YLTxt5d+8sQhb/lILGS4NfR2HW4vjTw7tueNSeXnDEmDDT7bswYRQSuFidlZxGEIr1YTcRTdYYO61TPguwmwDcDj0nX1vU88wZNzcwg9D2R9WdhLb6QJLow4lym1v3r1zUf2eysfbDupGjFTJGR3OA62fLB1ffNz43ve2BZ6+VgII6wFNjoTRFBhiLHpaXQ9z3Tq9axWKm/dqfVuAmQAPApgeOeBA2rm4EFaY95e0PP1floAWErlu3+6+Pahh5vXP9x2UhUJCAYgQKSEDEbi7tZD7ZXy18bvfnMqbOcMiVvO6dG9u0wcY3jrVmqtrKh2rbYZQMMKEN5OgL0A7iuNjfkHjh4VcRQlpqX1bNuzRI8WbKjuZCIBpguZUuWgt7I9y7oYEymynBFAikQ4HvlTB73lwj+Mzp2YiPwcU2KEm89cl4XgpFLIl8tUv349DjudMQDLAOobCVAE8IiTTrv3fuhDKAwPwyhFfbmd1jRlaZeNOJ8peV9ePHH4gXZl27eHtp/7j+E73vpI/eo+l3VGC6Fs0AsBRiRkMBn5O+7vVPPfGJk5sUX5eU2CCZykr5vOpyQ7UWl0FIHnobm8nDFxHFsBuv0CkMU1ezdPT3fnHnxQ6CgiJmICCETEwBpts404lRtsfmnx7Q883Fx8fDLqTA2ZaPW/ihMLPy6NH/9w49r9eR0NCsA1ECqxBImIpL8l7OzaHTTk8yOzb28LOzlDwkbSrXdBCDZaU75cpvrCguq2WptsoWv2C5ADcJikzO597DHODw+TjmOb42yA9dEpsDifKbWfXj5z90frlz/hS3c1FiLY49fvG9Kq8XJpcv5UbvD09XThnflU4eJMsDrLJAw4QRSKRHd71N69O2jyiyPTZ8cjP2tIcJJR+ZZ72RjkymV4tRq3qtWsiWPfupKS1tm2ALivtHmzvvORRxAHAYQQG2QbwAXTdTcXfKp+ceYPqhc+4zmpqgALAlEgnc6+TvWAAywcyw9XrqYLrVfLEwuRkAv7vcp+LUTENmYVOf5U2NqzM2jrfx2ePjcZedkYxBtnueSVymZp+eJFjrpd16LYtrBxPwYgNTEzY4QQwC3VNaGdRPPex1avTH+qcuHTnnSrxCwAAhggMGmISIAFAJR1lLqrUy8dzw1XNJHqz+DELDrSqT/UWnr8zxePPfBGYbThMgtjg/fmiq2jCIWhIQyOj2sAQwDyAFwBwGHmSSGlHp6cJMO8BsjWXsxw2NCl9IB3tH55x2dWzn+2I51VWgODnDgwg4wgPRl5m66n8oE0hgyINRGDwQSW/c8LA+k5sn6kMf/Rv1g49sCp7GDTZSNM371rP4kgXRfFkRE46XTKCpGSAAYAPJAtFjH70EM3VMdefDtgasi0OtxeGn9m6dRTHZmqCTD1/r/+JJEmUncEnWkiLF3MFJuxEKxJ8OvFsV88vjp/SJPQ/TlfABQK6e/urt4zFAet75W3XhlT3UySnda9gIhAQkArhcqVK0IFQQTgquj1salczqTzedhOaQ0aSza04Oa79/q1TV9c/OXnO9Ktg9kqn/qSmHU7EBSJ6OO1Sx/6ZW6wfaQ5P/VQa3HyF/lNjb/act9zWRMXBMMRCd5igCAA4Qm39kTj6sf/qHJuz8n8UNNhQ9znSswMGINcsQjpuhpAoedCJQBiYGgoCZq+aiiYaSmVC/b71ZEvXT/5BV86rbXCwH2o5CZagCkU0pdg+MKNnlo+89TvNq9N/Lg4vvI3k/ueUyRCX8hW2ugCAwwGJFh2hNv4ZPXipz+/cnbPpUyxI9lQz31ABKM10oUC0tmssZkz05scUCqXIwiRQHtmYiJWIHNXtzH45fljzyQ+nxSYBDX3rHAjzcTrqMOGUyBk+yvzx59h0HMncsO1P5x55O884epnlk7dfbR++eOhkJ1EbwxPOvVPVS98WkH808vlyStlrdw1tMrMTipF0nEYRC6YpQCQAgAnleKkL2QwEUtmWnazwdNLpz8aCdkl22gxJ85/O9paghP+rUEBEQnRfXrp9O91hGOmuu3Cvk6t/PXNu09eS+fPusakerEqGOST0/xE/eLRppNWgg2BiEGJZoQQLByHyY5yBABzY5O5DqaIQAQWfYyswaLb07QW1r0IsfahluM2YhJGE3EkpC5o5TZkukGAWIsoAliQdphdh816QetPLD23skBSAYAKQ7JaAwFkAB5WQeqFkZnvpljnDWBAIDAsAtuYZmKbJNdbZDAQE8WTUWfnTHd1YNnNdhsypXJGyblgdW9MSYEDgQzIZLUq/7A08bLDLDRjLWOwbXq01sTMGkDsWAE48n1m5mQSZVFi1mj504HR5Szvef6Li798uiOdeh9T64XiRrq/5+glJgbDxBDhV6+98dTPCqM/iYRUh9rLhwSzo0HKtqOmoKPhH5UmvvfX4/t+dle3UdJE3PMAkfQJrOOYwBwDMI7F19prNJJxiHUhIkJMxFtDL/f90pb5Aa1eeLJy/klfyFUCEVOvAybcTDMzE7NMTGCTIREZQAuwfLi1eAQJxA40iQhgMhA6r9XwTwfGfvCX2w68eqC9PKiE5F5R7dWBsNNB1O1KAB0AgbCEH3Y60m+1IKRcby6YEQvJO8J2/tuD2y/84+jMC3kdDxkiTdzzn8S2tJ5G2WWTbjupRoa1bEs3IGMcBkzSB5MJSXZCkh4TaWIQg3TGxMW3CiOvfWX7wVcOtJeHesxzDxkAEFLCazRglJIWjSphu5tK6Ptuq1KBdJxbBkcxCd4etvMvDU9feGnTjhcLcTRiKAl+7klgaQcmtZLKXvncrkf/ZV+nVv5+eev89we3/lvG6AHuzY6IiZC0lCzY5HU8dDo3+MZXth/8z4PeypCdYGyYWFrVKqJuV9geORYAYiK6buJY1BcWmPo8uJ9WJM1sd3Xguc13nvzu0B3fyut4mMnCFk5yiCHSLpvMy6Wt/zMVtHOhkHpX0Cy8uGn6bUOkenVh/XmYXKwHT+UHf/7U9MPfua9THYwt8zfzwADiKEK7UiEVhoHtjyMBwHCCrTvXz54VURgmib2XRy1NBCiQuduvlZ7dvOf4vw9tfymn1SATGZBNFYlX8UjcHYhImKyOJQGiFEcpYpYgWyuIYYhMWuvcuWzpF1+Yfvg7v9Ne3qRA5uZ7e9p3UimsLi2hsbQkAVSs6ythfb0CoNZpNt2VS5eQyuUowTuJe/doAKRAPNtdLX5t/K63flge/14+VkO9UizAMhTS/2Bz4ZFx5WePFYZX38xvqv/Z4okPGyKN9QLNWaOK19IDZ5+ZfvilA+3EbdB31833SsehpQsXWAVB2g6Ab+jINABmY+biKIomZ2fJWoGT3gg30FoIM6787IvDO89NR614utu6UwnRTTIGsQCJJxpXDj/aXNz6x8tnHi/F0UhMIiSADEFnTVy8lh44++TMkX8+4K0MmV452eAuJmLhONSuVHDp2DF4tVoA4E077Orhc7Adoo6HnU4pVy6boclJ1koRAWzBVNLvJRWQDBFvUZ3ct4amz0+HLbMjaO+OhOySYAEQKxKqpMNhJuKYhBLExETGNSaznMpd/uzMoy8c8CpDOmklbzy/j2atKZXN8tnXX0fl0qW0ieMTtif2b55KRHa8t8tvNNSW3btJ9DLSTdNnsn7JIJ5Qfvabo7On9/nV1LbQm4tIdHso3pDQSYOeeEXK6HzVzc5/duaxb9zbqQ2yxTe9M/vP79FuJoOVixdx+fhx8ptN347fF243F/IAFMNOZzwKw3hybg5aqT6gQ7fQMQneEnZyz2/effL+TiW7JfJ3xiQDSnzYQjli1+hcw80sPjlz5Pl9nVqZkwq74Zn9M6LQ93H6Rz9C/dq1PIAf25H7bQdbyppmsl2rZRzH4dGpKcRRlIz8ehWxvzomaJDviLzcN0ZmT97XqWYno850JGRXMEskyNb1HLf+ybnHn93n1watj99yzg00AMdxcPKVV7h65Uo2Vuo0gPMAqr9qNuoD8NmY2WalYtLZLEanpqDC8MY9gNVYz9SaBG+LOrlnx/YcP9ReKU+G3k4lZJg2OteWbu1zM4/+/Z7uanGtBe1fiPTRPSiTzudx8pVXePnChVTgeasAfg5g8Wb0vJEAxuIjP46imfrionJcV4xs3444iqiXHdbdldaMHwuht0Ze7uub547d06llhuJwU8XJLvzJ9OFvbgu8vEiSyy2f7dEMkJCShOPg5A9+gMXz511/dbUL4DXLfPibrJiydlb6ULpQUDs/8AHeeeBAknOVWh/49pX5niZdY8TlzEDHAKxJ8FTYzvc/cwtNBGMMUpkMuu02Tr36KlevXUv5q6s+gP+2zLd/0w1NbItFS0fRjubysmzXaro0Nkb5UilZ5vUanx7zNqMYIbgYR+5wHKTKOkr1mvP+Z9A3tJKOAzeTwfLFizj12mtcu3o1G7TbTQCvvhvzv86OLLIj7YqO45HWykq5euWKMlojPzSEbKGwtkKlvnUTUQKiDdazys0rKQLguC6cdBrtahVnX38dl48dE/X5+ZxW6gyAn1nmO+/HmlUAGLfbyrul61JpdDQc37mTJmZnKVcu37gT7rPODXsEKQEpQczQcYzVxUUsvvOOqc3Pi1a1mtJR5Nvt5PUe2ny/F90Fu8GZAzAlXRfZgYF4aHJSl8fGuDg6StmBAWQLhRv2wcwMrRS6rRY6jQba1Soay8vUXFoSURCkVBB0AZwBcNmmyV97Y/9//arBoP2KwU5rmZKQUqbz+dhJpYybTmsnnYbjuklTpBTiKIIKQxlHkQx9X5o4VhZVXreMN/sXF7+NL3v0VlKb7HBs1L5zdvDafzbb9NyxKbq3ZWnbGOvevLz7bQnQv5Z17c+MfbsbfN0msLlc9/3tPb3+FxuOVUhZatL/AAAAAElFTkSuQmCC" />
  11490. <p>The output has been generated by <a href="http://gitinspector.googlecode.com">gitinspector</a>; the statistical analysis tool for git repositories.<p>
  11491. </div></div>
  11492. <div><div class="box"><p>The following historical commit information, by author, was found in the repository.</p><div><table id="changes" class="git"><thead><tr> <th>Author</th> <th>Commits</th> <th>Insertions</th> <th>Deletions</th> <th>% of changes</th></tr></thead><tbody><tr ><td>Abhijit Kundu</td><td>13</td><td>688</td><td>113</td><td>0.08</td></tr><tr class="odd"><td>Alex Cunningham</td><td>812</td><td>109567</td><td>92619</td><td>19.93</td></tr><tr ><td>Alireza Fathi</td><td>5</td><td>14</td><td>16</td><td>0.00</td></tr><tr class="odd"><td>Andrew Melim</td><td>36</td><td>1857</td><td>1232</td><td>0.30</td></tr><tr ><td>Brian Law</td><td>1</td><td>97</td><td>174</td><td>0.03</td></tr><tr class="odd"><td>Can Erdogan</td><td>3</td><td>87</td><td>24</td><td>0.01</td></tr><tr ><td>Chris Beall</td><td>160</td><td>5919</td><td>6043</td><td>1.18</td></tr><tr class="odd"><td>Duy-Nguyen Ta</td><td>127</td><td>8872</td><td>5350</td><td>1.40</td></tr><tr ><td>Eohan George</td><td>2</td><td>3</td><td>1</td><td>0.00</td></tr><tr class="odd"><td>Frank Dellaert</td><td>981</td><td>111395</td><td>86463</td><td>19.50</td></tr><tr ><td>Jing Dong</td><td>23</td><td>1234</td><td>1238</td><td>0.24</td></tr><tr class="odd"><td>John Rogers</td><td>7</td><td>28</td><td>14</td><td>0.00</td></tr><tr ><td>Julian Straub</td><td>1</td><td>2</td><td>0</td><td>0.00</td></tr><tr class="odd"><td>Kai Ni</td><td>177</td><td>20780</td><td>19820</td><td>4.00</td></tr><tr ><td>Kyel Ok</td><td>2</td><td>50</td><td>18</td><td>0.01</td></tr><tr class="odd"><td>Luca Carlone</td><td>80</td><td>8198</td><td>9027</td><td>1.70</td></tr><tr ><td>Manohar Paluri</td><td>61</td><td>3087</td><td>638</td><td>0.37</td></tr><tr class="odd"><td>Michael Kaess</td><td>69</td><td>9075</td><td>2558</td><td>1.15</td></tr><tr ><td>Natesh Srinivasan</td><td>4</td><td>67</td><td>100</td><td>0.02</td></tr><tr class="odd"><td>Nick Barrash</td><td>8</td><td>2178</td><td>925</td><td>0.31</td></tr><tr ><td>Pablo Fernandez Alcantarilla</td><td>8</td><td>608</td><td>153</td><td>0.08</td></tr><tr class="odd"><td>Paul Kippes</td><td>1</td><td>8</td><td>8</td><td>0.00</td></tr><tr ><td>Rahul Sawhney</td><td>8</td><td>834</td><td>1309</td><td>0.21</td></tr><tr class="odd"><td>Richard Roberts</td><td>1329</td><td>236825</td><td>191622</td><td>42.23</td></tr><tr ><td>Stephen Williams</td><td>171</td><td>28367</td><td>13181</td><td>4.10</td></tr><tr class="odd"><td>Summit Patel</td><td>5</td><td>79</td><td>84</td><td>0.02</td></tr><tr ><td>Vadim Indelman</td><td>27</td><td>3666</td><td>402</td><td>0.40</td></tr><tr class="odd"><td>Viorela Ila</td><td>27</td><td>1549</td><td>323</td><td>0.18</td></tr><tr ><td>Yong-Dian Jian</td><td>155</td><td>12704</td><td>8509</td><td>2.09</td></tr><tr class="odd"><td>Zsolt Kira</td><td>21</td><td>2268</td><td>769</td><td>0.30</td></tr><tr ><td>bpeasle</td><td>5</td><td>575</td><td>244</td><td>0.08</td></tr><tr class="odd"><td>djensen3</td><td>1</td><td>64</td><td>3</td><td>0.01</td></tr><tr ><td>jdurand7</td><td>4</td><td>141</td><td>88</td><td>0.02</td></tr><tr class="odd"><td>justinca</td><td>7</td><td>459</td><td>160</td><td>0.06</td></tr><tfoot><tr> <td colspan="5">&nbsp;</td> </tr></tfoot></tbody></table><div class="chart" id="changes_chart"></div></div><script type="text/javascript"> $.plot($("#changes_chart"), [{label: "Abhijit Kundu", data: 0.08}, {label: "Alex Cunningham", data: 19.93}, {label: "Alireza Fathi", data: 0.00}, {label: "Andrew Melim", data: 0.30}, {label: "Brian Law", data: 0.03}, {label: "Can Erdogan", data: 0.01}, {label: "Chris Beall", data: 1.18}, {label: "Duy-Nguyen Ta", data: 1.40}, {label: "Eohan George", data: 0.00}, {label: "Frank Dellaert", data: 19.50}, {label: "Jing Dong", data: 0.24}, {label: "John Rogers", data: 0.00}, {label: "Julian Straub", data: 0.00}, {label: "Kai Ni", data: 4.00}, {label: "Kyel Ok", data: 0.01}, {label: "Luca Carlone", data: 1.70}, {label: "Manohar Paluri", data: 0.37}, {label: "Michael Kaess", data: 1.15}, {label: "Natesh Srinivasan", data: 0.02}, {label: "Nick Barrash", data: 0.31}, {label: "Pablo Fernandez Alcantarilla", data: 0.08}, {label: "Paul Kippes", data: 0.00}, {label: "Rahul Sawhney", data: 0.21}, {label: "Richard Roberts", data: 42.23}, {label: "Stephen Williams", data: 4.10}, {label: "Summit Patel", data: 0.02}, {label: "Vadim Indelman", data: 0.40}, {label: "Viorela Ila", data: 0.18}, {label: "Yong-Dian Jian", data: 2.09}, {label: "Zsolt Kira", data: 0.30}, {label: "bpeasle", data: 0.08}, {label: "djensen3", data: 0.01}, {label: "jdurand7", data: 0.02}, {label: "justinca", data: 0.06}], { series: { pie: { innerRadius: 0.4, show: true, combine: { threshold: 0.01, label: "Minor Authors" } } }, grid: { hoverable: true } });</script></div></div>
  11493. <div><div class="box"><p>Below are the number of rows from each author that have survived and are still intact in the current revision.</p><div><table id="blame" class="git"><thead><tr> <th>Author</th> <th>Rows</th> <th>% in comments</th> </tr></thead><tbody><tr ><td>Abhijit Kundu</td><td>380</td><td>30.53</td><td style="display: none">0.31</td></tr><tr class="odd"><td>Alex Cunningham</td><td>21974</td><td>26.53</td><td style="display: none">17.98</td></tr><tr ><td>Alireza Fathi</td><td>6</td><td>33.33</td><td style="display: none">0.00</td></tr><tr class="odd"><td>Andrew Melim</td><td>587</td><td>41.40</td><td style="display: none">0.48</td></tr><tr ><td>Brian Law</td><td>28</td><td>21.43</td><td style="display: none">0.02</td></tr><tr class="odd"><td>Can Erdogan</td><td>3</td><td>0.00</td><td style="display: none">0.00</td></tr><tr ><td>Chris Beall</td><td>1414</td><td>37.55</td><td style="display: none">1.16</td></tr><tr class="odd"><td>Duy-Nguyen Ta</td><td>3638</td><td>35.13</td><td style="display: none">2.98</td></tr><tr ><td>Eohan George</td><td>1</td><td>0.00</td><td style="display: none">0.00</td></tr><tr class="odd"><td>Frank Dellaert</td><td>16084</td><td>35.07</td><td style="display: none">13.16</td></tr><tr ><td>Jing Dong</td><td>63</td><td>4.76</td><td style="display: none">0.05</td></tr><tr class="odd"><td>John Rogers</td><td>9</td><td>11.11</td><td style="display: none">0.01</td></tr><tr ><td>Julian Straub</td><td>2</td><td>0.00</td><td style="display: none">0.00</td></tr><tr class="odd"><td>Kai Ni</td><td>2744</td><td>58.67</td><td style="display: none">2.24</td></tr><tr ><td>Kyel Ok</td><td>48</td><td>33.33</td><td style="display: none">0.04</td></tr><tr class="odd"><td>Luca Carlone</td><td>1754</td><td>26.17</td><td style="display: none">1.43</td></tr><tr ><td>Manohar Paluri</td><td>234</td><td>2.99</td><td style="display: none">0.19</td></tr><tr class="odd"><td>Michael Kaess</td><td>89</td><td>37.08</td><td style="display: none">0.07</td></tr><tr ><td>Nick Barrash</td><td>892</td><td>58.63</td><td style="display: none">0.73</td></tr><tr class="odd"><td>Pablo Fernandez Alcantarilla</td><td>179</td><td>7.26</td><td style="display: none">0.15</td></tr><tr ><td>Rahul Sawhney</td><td>78</td><td>0.00</td><td style="display: none">0.06</td></tr><tr class="odd"><td>Richard Roberts</td><td>50081</td><td>27.74</td><td style="display: none">40.97</td></tr><tr ><td>Stephen Williams</td><td>16000</td><td>29.20</td><td style="display: none">13.09</td></tr><tr class="odd"><td>Summit Patel</td><td>59</td><td>100.00</td><td style="display: none">0.05</td></tr><tr ><td>Vadim Indelman</td><td>2938</td><td>21.34</td><td style="display: none">2.40</td></tr><tr class="odd"><td>Viorela Ila</td><td>9</td><td>44.44</td><td style="display: none">0.01</td></tr><tr ><td>Yong-Dian Jian</td><td>2471</td><td>23.35</td><td style="display: none">2.02</td></tr><tr class="odd"><td>Zsolt Kira</td><td>1</td><td>0.00</td><td style="display: none">0.00</td></tr><tr ><td>bpeasle</td><td>321</td><td>26.48</td><td style="display: none">0.26</td></tr><tr class="odd"><td>djensen3</td><td>64</td><td>0.00</td><td style="display: none">0.05</td></tr><tr ><td>jdurand7</td><td>20</td><td>130.00</td><td style="display: none">0.02</td></tr><tr class="odd"><td>justinca</td><td>70</td><td>44.29</td><td style="display: none">0.06</td></tr><tfoot><tr> <td colspan="3">&nbsp;</td> </tr></tfoot></tbody></table><div class="chart" id="blame_chart"></div></div><script type="text/javascript"> $.plot($("#blame_chart"), [{label: "Abhijit Kundu", data: 0.31}, {label: "Alex Cunningham", data: 17.98}, {label: "Alireza Fathi", data: 0.00}, {label: "Andrew Melim", data: 0.48}, {label: "Brian Law", data: 0.02}, {label: "Can Erdogan", data: 0.00}, {label: "Chris Beall", data: 1.16}, {label: "Duy-Nguyen Ta", data: 2.98}, {label: "Eohan George", data: 0.00}, {label: "Frank Dellaert", data: 13.16}, {label: "Jing Dong", data: 0.05}, {label: "John Rogers", data: 0.01}, {label: "Julian Straub", data: 0.00}, {label: "Kai Ni", data: 2.24}, {label: "Kyel Ok", data: 0.04}, {label: "Luca Carlone", data: 1.43}, {label: "Manohar Paluri", data: 0.19}, {label: "Michael Kaess", data: 0.07}, {label: "Nick Barrash", data: 0.73}, {label: "Pablo Fernandez Alcantarilla", data: 0.15}, {label: "Rahul Sawhney", data: 0.06}, {label: "Richard Roberts", data: 40.97}, {label: "Stephen Williams", data: 13.09}, {label: "Summit Patel", data: 0.05}, {label: "Vadim Indelman", data: 2.40}, {label: "Viorela Ila", data: 0.01}, {label: "Yong-Dian Jian", data: 2.02}, {label: "Zsolt Kira", data: 0.00}, {label: "bpeasle", data: 0.26}, {label: "djensen3", data: 0.05}, {label: "jdurand7", data: 0.02}, {label: "justinca", data: 0.06}], { series: { pie: { innerRadius: 0.4, show: true, combine: { threshold: 0.01, label: "Minor Authors" } } }, grid: { hoverable: true } });</script></div></div>
  11494. <div><div id="timeline" class="box"><p>The following history timeline has been gathered from the repository.</p>
  11495. <table class="git full"><thead><tr><th>Author</th><th>2009-08</th><th>2009-09</th><th>2009-10</th><th>2009-11</th><th>2009-12</th><th>2010-01</th><th>2010-02</th><th>2010-03</th></tr></thead><tbody><tr><td>Alex Cunningham</td><td>.</td><td>.</td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td></tr><tr class="odd"><td>Alireza Fathi</td><td></td><td>.</td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>Brian Law</td><td></td><td></td><td>.</td><td></td><td></td><td></td><td></td><td></td></tr><tr class="odd"><td>Chris Beall</td><td></td><td></td><td>.</td><td><div class="insert">&nbsp;</div></td><td>.</td><td><div class="insert">&nbsp;</div></td><td>.</td><td></td></tr><tr><td>Eohan George</td><td></td><td></td><td></td><td>.</td><td>.</td><td></td><td></td><td></td></tr><tr class="odd"><td>Frank Dellaert</td><td>.</td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td></tr><tr><td>John Rogers</td><td></td><td></td><td></td><td></td><td></td><td>.</td><td>.</td><td></td></tr><tr class="odd"><td>Kai Ni</td><td></td><td>.</td><td></td><td></td><td>.</td><td><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td></tr><tr><td>Manohar Paluri</td><td>.</td><td>.</td><td></td><td>.</td><td>.</td><td>.</td><td><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td>.</td></tr><tr class="odd"><td>Michael Kaess</td><td></td><td></td><td></td><td>.</td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="insert">&nbsp;</div></td><td></td><td></td></tr><tr><td>Richard Roberts</td><td><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td></td><td>.</td><td>.</td><td><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td>.</td><td>.</td></tr><tr class="odd"><td>Viorela Ila</td><td></td><td></td><td>.</td><td>.</td><td><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td>.</td><td>.</td><td>.</td></tr><tr><td>Yong-Dian Jian</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td>.</td></tr><tr class="odd"><td>justinca</td><td></td><td></td><td></td><td></td><td>.</td><td>.</td><td>.</td><td></td></tr><tfoot><tr><td><strong>Modified Rows:</strong></td><td>17798</td><td>2257</td><td>11451</td><td>24865</td><td>14512</td><td>31259</td><td>18233</td><td>4290</td></tr></tfoot></tbody></table>
  11496. <table class="git full"><thead><tr><th>Author</th><th>2010-04</th><th>2010-05</th><th>2010-06</th><th>2010-07</th><th>2010-08</th><th>2010-09</th><th>2010-10</th><th>2010-11</th></tr></thead><tbody><tr><td>Alex Cunningham</td><td><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td>.</td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td></tr><tr class="odd"><td>Chris Beall</td><td></td><td></td><td></td><td></td><td></td><td>.</td><td>.</td><td><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td></tr><tr><td>Duy-Nguyen Ta</td><td></td><td></td><td></td><td></td><td>.</td><td></td><td>.</td><td></td></tr><tr class="odd"><td>Frank Dellaert</td><td></td><td></td><td></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td>.</td><td><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td>.</td><td>.</td></tr><tr><td>John Rogers</td><td></td><td></td><td></td><td></td><td></td><td>.</td><td></td><td></td></tr><tr class="odd"><td>Kai Ni</td><td><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="insert">&nbsp;</div></td><td></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td></tr><tr><td>Manohar Paluri</td><td>.</td><td></td><td></td><td></td><td></td><td></td><td>.</td><td></td></tr><tr class="odd"><td>Michael Kaess</td><td></td><td></td><td></td><td><div class="insert">&nbsp;</div></td><td></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td></td><td></td></tr><tr><td>Rahul Sawhney</td><td></td><td></td><td></td><td></td><td></td><td></td><td>.</td><td></td></tr><tr class="odd"><td>Richard Roberts</td><td></td><td><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td></td><td>.</td><td><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div></td><td>.</td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td></tr><tr><td>Viorela Ila</td><td></td><td></td><td></td><td>.</td><td></td><td></td><td></td><td></td></tr><tr class="odd"><td>Yong-Dian Jian</td><td></td><td></td><td></td><td></td><td></td><td>.</td><td>.</td><td><div class="insert">&nbsp;</div></td></tr><tfoot><tr><td><strong>Modified Rows:</strong></td><td>2477</td><td>1036</td><td>880</td><td>139257</td><td>16831</td><td>2522</td><td>164005</td><td>4490</td></tr></tfoot></tbody></table>
  11497. <table class="git full"><thead><tr><th>Author</th><th>2010-12</th><th>2011-01</th><th>2011-02</th><th>2011-03</th><th>2011-04</th><th>2011-05</th><th>2011-06</th><th>2011-07</th></tr></thead><tbody><tr><td>Alex Cunningham</td><td>.</td><td>.</td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td>.</td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td></td></tr><tr class="odd"><td>Chris Beall</td><td>.</td><td></td><td>.</td><td><div class="insert">&nbsp;</div></td><td></td><td>.</td><td></td><td></td></tr><tr><td>Duy-Nguyen Ta</td><td></td><td></td><td></td><td></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td></td><td></td><td>.</td></tr><tr class="odd"><td>Frank Dellaert</td><td></td><td>.</td><td>.</td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td></td><td></td><td></td><td></td></tr><tr><td>John Rogers</td><td></td><td></td><td>.</td><td></td><td></td><td></td><td></td><td></td></tr><tr class="odd"><td>Julian Straub</td><td></td><td></td><td>.</td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>Kai Ni</td><td>.</td><td>.</td><td></td><td>.</td><td></td><td></td><td></td><td></td></tr><tr class="odd"><td>Richard Roberts</td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td>.</td><td>.</td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td></tr><tr><td>Yong-Dian Jian</td><td><div class="insert">&nbsp;</div></td><td></td><td></td><td>.</td><td><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td></td><td></td><td></td></tr><tfoot><tr><td><strong>Modified Rows:</strong></td><td>12190</td><td>5300</td><td>3635</td><td>6498</td><td>920</td><td>5536</td><td>12599</td><td>81</td></tr></tfoot></tbody></table>
  11498. <table class="git full"><thead><tr><th>Author</th><th>2011-08</th><th>2011-09</th><th>2011-10</th><th>2011-11</th><th>2011-12</th><th>2012-01</th><th>2012-02</th><th>2012-03</th></tr></thead><tbody><tr><td>Alex Cunningham</td><td>.</td><td>.</td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div></td><td>.</td><td>.</td></tr><tr class="odd"><td>Andrew Melim</td><td></td><td></td><td></td><td></td><td>.</td><td>.</td><td>.</td><td>.</td></tr><tr><td>Can Erdogan</td><td></td><td>.</td><td></td><td></td><td></td><td></td><td>.</td><td>.</td></tr><tr class="odd"><td>Chris Beall</td><td></td><td>.</td><td>.</td><td>.</td><td>.</td><td><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div></td><td>.</td><td></td></tr><tr><td>Duy-Nguyen Ta</td><td>.</td><td>.</td><td>.</td><td></td><td>.</td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td>.</td><td></td></tr><tr class="odd"><td>Frank Dellaert</td><td>.</td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td>.</td><td>.</td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td>.</td><td></td></tr><tr><td>Manohar Paluri</td><td></td><td></td><td>.</td><td></td><td></td><td></td><td></td><td></td></tr><tr class="odd"><td>Michael Kaess</td><td></td><td>.</td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>Natesh Srinivasan</td><td></td><td>.</td><td>.</td><td></td><td></td><td></td><td></td><td></td></tr><tr class="odd"><td>Nick Barrash</td><td></td><td></td><td></td><td>.</td><td></td><td><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td></td><td></td></tr><tr><td>Paul Kippes</td><td></td><td></td><td></td><td>.</td><td></td><td></td><td></td><td></td></tr><tr class="odd"><td>Richard Roberts</td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td></tr><tr><td>Stephen Williams</td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td></td><td></td><td>.</td><td>.</td><td><div class="insert">&nbsp;</div></td><td>.</td><td>.</td></tr><tr class="odd"><td>Vadim Indelman</td><td></td><td></td><td></td><td></td><td></td><td>.</td><td>.</td><td></td></tr><tr><td>Yong-Dian Jian</td><td><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td>.</td><td></td><td>.</td><td></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td>.</td><td><div class="remove">&nbsp;</div></td></tr><tfoot><tr><td><strong>Modified Rows:</strong></td><td>7262</td><td>7313</td><td>9784</td><td>16036</td><td>12173</td><td>19666</td><td>17514</td><td>12637</td></tr></tfoot></tbody></table>
  11499. <table class="git full"><thead><tr><th>Author</th><th>2012-04</th><th>2012-05</th><th>2012-06</th><th>2012-07</th><th>2012-08</th><th>2012-09</th><th>2012-10</th><th>2012-11</th></tr></thead><tbody><tr><td>Abhijit Kundu</td><td></td><td></td><td><div class="insert">&nbsp;</div></td><td></td><td></td><td></td><td></td><td></td></tr><tr class="odd"><td>Alex Cunningham</td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td>.</td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td></tr><tr><td>Andrew Melim</td><td></td><td>.</td><td>.</td><td><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="insert">&nbsp;</div></td><td><div class="insert">&nbsp;</div></td><td></td><td></td></tr><tr class="odd"><td>Chris Beall</td><td>.</td><td>.</td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div></td><td></td><td><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td>.</td><td></td><td>.</td></tr><tr><td>Duy-Nguyen Ta</td><td></td><td></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td>.</td><td></td><td>.</td><td>.</td><td></td></tr><tr class="odd"><td>Frank Dellaert</td><td></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td>.</td><td><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td></td><td>.</td></tr><tr><td>Kyel Ok</td><td></td><td></td><td></td><td>.</td><td></td><td></td><td></td><td></td></tr><tr class="odd"><td>Richard Roberts</td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td></tr><tr><td>Stephen Williams</td><td>.</td><td>.</td><td><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td>.</td><td></td><td><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="insert">&nbsp;</div></td></tr><tr class="odd"><td>Summit Patel</td><td></td><td></td><td>.</td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>Vadim Indelman</td><td></td><td>.</td><td>.</td><td>.</td><td></td><td></td><td></td><td></td></tr><tr class="odd"><td>Yong-Dian Jian</td><td>.</td><td>.</td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td>.</td><td>.</td></tr><tr><td>bpeasle</td><td></td><td>.</td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr class="odd"><td>jdurand7</td><td></td><td></td><td></td><td></td><td></td><td>.</td><td></td><td></td></tr><tfoot><tr><td><strong>Modified Rows:</strong></td><td>15990</td><td>39427</td><td>36781</td><td>19683</td><td>5415</td><td>9374</td><td>5345</td><td>4705</td></tr></tfoot></tbody></table>
  11500. <table class="git full"><thead><tr><th>Author</th><th>2012-12</th><th>2013-01</th><th>2013-02</th><th>2013-03</th><th>2013-04</th><th>2013-05</th><th>2013-06</th><th>2013-07</th></tr></thead><tbody><tr><td>Alex Cunningham</td><td>.</td><td>.</td><td>.</td><td><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td></td></tr><tr class="odd"><td>Andrew Melim</td><td>.</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>Chris Beall</td><td></td><td></td><td>.</td><td></td><td></td><td>.</td><td>.</td><td>.</td></tr><tr class="odd"><td>Duy-Nguyen Ta</td><td></td><td></td><td>.</td><td>.</td><td><div class="insert">&nbsp;</div></td><td>.</td><td></td><td></td></tr><tr><td>Frank Dellaert</td><td></td><td>.</td><td></td><td><div class="insert">&nbsp;</div></td><td>.</td><td><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="insert">&nbsp;</div></td><td></td></tr><tr class="odd"><td>Kyel Ok</td><td></td><td></td><td></td><td></td><td></td><td></td><td>.</td><td></td></tr><tr><td>Luca Carlone</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td>.</td></tr><tr class="odd"><td>Richard Roberts</td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td>.</td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td>.</td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td></tr><tr><td>Stephen Williams</td><td>.</td><td></td><td><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td>.</td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td></td><td></td></tr><tr class="odd"><td>Vadim Indelman</td><td></td><td><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td></td><td></td><td>.</td><td><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td>.</td><td></td></tr><tr><td>Yong-Dian Jian</td><td>.</td><td>.</td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tfoot><tr><td><strong>Modified Rows:</strong></td><td>1099</td><td>1815</td><td>8550</td><td>5297</td><td>20015</td><td>6251</td><td>28503</td><td>74012</td></tr></tfoot></tbody></table>
  11501. <table class="git full"><thead><tr><th>Author</th><th>2013-08</th><th>2013-09</th><th>2013-10</th><th>2013-11</th><th>2013-12</th></tr></thead><tbody><tr><td>Alex Cunningham</td><td>.</td><td><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td>.</td><td>.</td><td>.</td></tr><tr class="odd"><td>Andrew Melim</td><td></td><td></td><td>.</td><td></td><td></td></tr><tr><td>Chris Beall</td><td>.</td><td>.</td><td>.</td><td></td><td></td></tr><tr class="odd"><td>Duy-Nguyen Ta</td><td>.</td><td></td><td><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td></td><td>.</td></tr><tr><td>Frank Dellaert</td><td>.</td><td><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td></tr><tr class="odd"><td>Jing Dong</td><td></td><td></td><td><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td></td></tr><tr><td>Luca Carlone</td><td>.</td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td></td><td>.</td></tr><tr class="odd"><td>Natesh Srinivasan</td><td>.</td><td></td><td></td><td></td><td></td></tr><tr><td>Pablo Fernandez Alcantarilla</td><td></td><td></td><td>.</td><td></td><td></td></tr><tr class="odd"><td>Richard Roberts</td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td></tr><tr><td>Stephen Williams</td><td><div class="insert">&nbsp;</div></td><td></td><td></td><td></td><td></td></tr><tr class="odd"><td>Vadim Indelman</td><td>.</td><td></td><td></td><td></td><td></td></tr><tr><td>Zsolt Kira</td><td>.</td><td><div class="remove">&nbsp;</div><div class="remove">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div><div class="insert">&nbsp;</div></td><td>.</td><td></td><td></td></tr><tr class="odd"><td>djensen3</td><td></td><td></td><td></td><td>.</td><td></td></tr><tfoot><tr><td><strong>Modified Rows:</strong></td><td>81545</td><td>2554</td><td>27521</td><td>4904</td><td>10480</td></tr></tfoot></tbody></table>
  11502. </div></div>
  11503. <div><div class="box"><p>The following files are suspiciously big (in order of severity).</p><p>gtsam_unstable/nonlinear/tests/testConcurrentIncrementalFilter.cpp (1114 eloc)</p><p>gtsam/base/tests/testMatrix.cpp (1087 eloc)</p><p>gtsam_unstable/nonlinear/tests/testConcurrentBatchFilter.cpp (1034 eloc)</p><p>gtsam/nonlinear/ISAM2.cpp (972 eloc)</p><p>tests/testGaussianISAM2.cpp (712 eloc)</p><p>wrap/tests/expected/geometry_wrapper.cpp (652 eloc)</p><p>gtsam/geometry/tests/testPose3.cpp (650 eloc)</p><p>tests/testSerializationSLAM.cpp (641 eloc)</p><p>gtsam/geometry/tests/testPose2.cpp (639 eloc)</p><p>gtsam/base/Matrix.cpp (638 eloc)</p><p>wrap/Module.cpp (637 eloc)</p><p>gtsam/slam/dataset.cpp (624 eloc)</p><p>gtsam_unstable/nonlinear/tests/testConcurrentBatchSmoother.cpp (623 eloc)</p><p>gtsam/linear/NoiseModel.cpp (617 eloc)</p><p>gtsam/linear/NoiseModel.h (604 eloc)</p><p>gtsam_unstable/slam/tests/testInertialNavFactor_GlobalVelocity.cpp (599 eloc)</p><p>gtsam/symbolic/tests/testSymbolicBayesTree.cpp (574 eloc)</p><p>gtsam_unstable/nonlinear/ConcurrentBatchFilter.cpp (544 eloc)</p><p>gtsam/nonlinear/NonlinearFactor.h (544 eloc)</p><p>gtsam/linear/JacobianFactor.cpp (539 eloc)</p><p>gtsam_unstable/slam/EquivInertialNavFactor_GlobalVel.h (525 eloc)</p><p>gtsam/discrete/DecisionTree-inl.h (520 eloc)</p><p>gtsam/navigation/CombinedImuFactor.h (517 eloc)</p><p>gtsam_unstable/slam/CombinedImuFactor.h (511 eloc)</p><p>examples/SolverComparer.cpp (507 eloc)</p><p>gtsam_unstable/nonlinear/tests/testConcurrentIncrementalSmootherGN.cpp (502 eloc)</p><p>gtsam/base/numericalDerivative.h (486 eloc)</p><p>tests/smallExample.h (475 eloc)</p><p>gtsam_unstable/gtsam_unstable.h (465 eloc)</p><p>gtsam_unstable/slam/ImuFactor.h (462 eloc)</p><p>gtsam_unstable/slam/EquivInertialNavFactor_GlobalVel_NoBias.h (461 eloc)</p><p>gtsam/navigation/ImuFactor.h (454 eloc)</p><p>gtsam/inference/BayesTree-inst.h (426 eloc)</p><p>gtsam/nonlinear/ISAM2.h (401 eloc)</p><p>gtsam/geometry/PinholeCamera.h (382 eloc)</p><p>gtsam_unstable/base/BTree.h (322 eloc)</p></div></div>
  11504. <div><div class="box" id="responsibilities"><p>The following repsonsibilties, by author, were found in the current revision of the repository (comments are exluded from the line count, if possible).</p><div><h3>Abhijit Kundu is mostly responsible for</h3><div>examples/UGM_chain.cpp (74 eloc)</div><div class="odd">examples/DiscreteBayesNet_FG.cpp (72 eloc)</div><div>gtsam/discrete/tests/testDiscreteMarginals.cpp (34 eloc)</div><div class="odd">gtsam/discrete/Assignment.h (28 eloc)</div><div>gtsam/discrete/DiscreteConditional.cpp (21 eloc)</div><div class="odd">examples/UGM_small.cpp (21 eloc)</div><div>gtsam/discrete/DiscreteMarginals.h (12 eloc)</div><div class="odd">gtsam/inference/BayesTreeCliqueBase.h (1 eloc)</div><div>gtsam/inference/BayesTree.h (1 eloc)</div></div><div><h3>Alex Cunningham is mostly responsible for</h3><div>wrap/tests/expected/geometry_wrapper.cpp (607 eloc)</div><div class="odd">wrap/tests/expected_namespaces/testNamespaces_wrapper.cpp (392 eloc)</div><div>gtsam/base/tests/testMatrix.cpp (358 eloc)</div><div class="odd">wrap/tests/testWrap.cpp (355 eloc)</div><div>tests/smallExample.h (341 eloc)</div><div class="odd">gtsam_unstable/base/BTree.h (317 eloc)</div><div>tests/testNonlinearEquality.cpp (311 eloc)</div><div class="odd">gtsam/geometry/tests/testPose3.cpp (295 eloc)</div><div>wrap/Module.cpp (288 eloc)</div><div class="odd">gtsam_unstable/geometry/SimPolygon2D.cpp (286 eloc)</div></div><div><h3>Alireza Fathi is mostly responsible for</h3><div>gtsam/geometry/tests/testRot3Q.cpp (2 eloc)</div><div class="odd">gtsam/geometry/tests/testRot3M.cpp (2 eloc)</div></div><div><h3>Andrew Melim is mostly responsible for</h3><div>wrap/Method.cpp (51 eloc)</div><div class="odd">wrap/Class.cpp (47 eloc)</div><div>wrap/StaticMethod.cpp (42 eloc)</div><div class="odd">wrap/Module.cpp (34 eloc)</div><div>wrap/Deconstructor.cpp (31 eloc)</div><div class="odd">wrap/Deconstructor.h (29 eloc)</div><div>gtsam_unstable/base/tests/testDSFMap.cpp (20 eloc)</div><div class="odd">wrap/matlab.h (17 eloc)</div><div>wrap/Argument.cpp (13 eloc)</div><div class="odd">wrap/Constructor.cpp (9 eloc)</div></div><div><h3>Brian Law is mostly responsible for</h3><div>gtsam/geometry/Pose3.cpp (6 eloc)</div><div class="odd">gtsam/geometry/Pose2.h (4 eloc)</div><div>gtsam/geometry/Point3.cpp (4 eloc)</div><div class="odd">gtsam/geometry/Point3.h (3 eloc)</div><div>gtsam/geometry/Cal3_S2.h (3 eloc)</div><div class="odd">gtsam/geometry/Rot3M.cpp (2 eloc)</div></div><div><h3>Can Erdogan is mostly responsible for</h3><div>gtsam/nonlinear/Values-inl.h (2 eloc)</div><div class="odd">gtsam/base/LieScalar.h (1 eloc)</div></div><div><h3>Chris Beall is mostly responsible for</h3><div>gtsam_unstable/geometry/tests/testTriangulation.cpp (108 eloc)</div><div class="odd">gtsam_unstable/slam/InvDepthFactor3.h (80 eloc)</div><div>gtsam/slam/StereoFactor.h (70 eloc)</div><div class="odd">gtsam_unstable/slam/tests/testInvDepthFactor3.cpp (64 eloc)</div><div>gtsam/geometry/Rot3M.cpp (46 eloc)</div><div class="odd">gtsam/geometry/Cal3_S2Stereo.h (39 eloc)</div><div>gtsam/geometry/tests/testStereoPoint2.cpp (38 eloc)</div><div class="odd">gtsam/geometry/StereoCamera.h (37 eloc)</div><div>gtsam/geometry/Pose3.cpp (35 eloc)</div><div class="odd">gtsam/geometry/tests/testPose2.cpp (32 eloc)</div></div><div><h3>Duy-Nguyen Ta is mostly responsible for</h3><div>gtsam_unstable/discrete/tests/testLoopyBelief.cpp (209 eloc)</div><div class="odd">gtsam_unstable/dynamics/Pendulum.h (169 eloc)</div><div>gtsam_unstable/dynamics/SimpleHelicopter.h (161 eloc)</div><div class="odd">gtsam/base/numericalDerivative.h (135 eloc)</div><div>gtsam_unstable/dynamics/tests/testSimpleHelicopter.cpp (129 eloc)</div><div class="odd">gtsam/geometry/tests/testPose3.cpp (81 eloc)</div><div>gtsam/base/tests/testNumericalDerivative.cpp (71 eloc)</div><div class="odd">gtsam/nonlinear/ISAM2-inl.h (59 eloc)</div><div>gtsam_unstable/gtsam_unstable.h (52 eloc)</div><div class="odd">gtsam_unstable/dynamics/VelocityConstraint3.h (52 eloc)</div></div><div><h3>Eohan George is mostly responsible for</h3><div>gtsam/base/Testable.h (1 eloc)</div></div><div><h3>Frank Dellaert is mostly responsible for</h3><div>gtsam/geometry/tests/testPose2.cpp (240 eloc)</div><div class="odd">gtsam_unstable/discrete/examples/schedulingQuals13.cpp (234 eloc)</div><div>gtsam_unstable/examples/SmartRangeExample_plaza1.cpp (203 eloc)</div><div class="odd">gtsam/linear/tests/testKalmanFilter.cpp (202 eloc)</div><div>gtsam/geometry/PinholeCamera.h (199 eloc)</div><div class="odd">gtsam/linear/NoiseModel.cpp (193 eloc)</div><div>gtsam/geometry/tests/testRot3M.cpp (190 eloc)</div><div class="odd">gtsam_unstable/slam/AHRS.cpp (187 eloc)</div><div>gtsam_unstable/examples/SmartRangeExample_plaza2.cpp (157 eloc)</div><div class="odd">gtsam/linear/NoiseModel.h (154 eloc)</div></div><div><h3>Jing Dong is mostly responsible for</h3><div>gtsam/base/tests/testMatrix.cpp (34 eloc)</div><div class="odd">examples/elaboratePoint2KalmanFilter.cpp (7 eloc)</div><div>gtsam_unstable/slam/tests/timeInertialNavFactor_GlobalVelocity.cpp (6 eloc)</div><div class="odd">gtsam/linear/tests/timeGaussianFactor.cpp (3 eloc)</div><div>gtsam/linear/tests/testGaussianFactorGraphUnordered.cpp (3 eloc)</div><div class="odd">gtsam/geometry/tests/timePose3.cpp (2 eloc)</div><div>gtsam/geometry/tests/timeStereoCamera.cpp (1 eloc)</div><div class="odd">gtsam/geometry/tests/timePose2.cpp (1 eloc)</div><div>gtsam/geometry/tests/timePinholeCamera.cpp (1 eloc)</div><div class="odd">gtsam/geometry/tests/timeCalibratedCamera.cpp (1 eloc)</div></div><div><h3>John Rogers is mostly responsible for</h3><div>gtsam/base/FastMap.h (5 eloc)</div><div class="odd">gtsam/base/numericalDerivative.h (2 eloc)</div><div>gtsam/inference/graph-inl.h (1 eloc)</div></div><div><h3>Julian Straub is mostly responsible for</h3><div>gtsam/nonlinear/NonlinearISAM.cpp (2 eloc)</div></div><div><h3>Kai Ni is mostly responsible for</h3><div>gtsam/slam/dataset.cpp (96 eloc)</div><div class="odd">gtsam/linear/tests/testNoiseModel.cpp (93 eloc)</div><div>gtsam/inference/graph-inl.h (74 eloc)</div><div class="odd">gtsam/slam/tests/testGeneralSFMFactor.cpp (62 eloc)</div><div>gtsam/geometry/Cal3DS2.cpp (56 eloc)</div><div class="odd">gtsam/geometry/Cal3DS2.h (49 eloc)</div><div>gtsam/geometry/Cal3Bundler.cpp (38 eloc)</div><div class="odd">tests/simulated2DOriented.h (35 eloc)</div><div>gtsam/base/Vector.cpp (35 eloc)</div><div class="odd">gtsam/geometry/Cal3Bundler.h (34 eloc)</div></div><div><h3>Kyel Ok is mostly responsible for</h3><div>gtsam_unstable/slam/Mechanization_bRn2.cpp (13 eloc)</div><div class="odd">gtsam_unstable/slam/AHRS.cpp (13 eloc)</div><div>gtsam_unstable/slam/AHRS.h (4 eloc)</div><div class="odd">gtsam_unstable/slam/Mechanization_bRn2.h (2 eloc)</div></div><div><h3>Luca Carlone is mostly responsible for</h3><div>gtsam/slam/dataset.cpp (262 eloc)</div><div class="odd">gtsam/slam/tests/testDataset.cpp (155 eloc)</div><div>gtsam_unstable/slam/MultiProjectionFactor.h (137 eloc)</div><div class="odd">gtsam_unstable/nonlinear/tests/testConcurrentIncrementalFilter.cpp (88 eloc)</div><div>gtsam_unstable/nonlinear/tests/testConcurrentBatchFilter.cpp (73 eloc)</div><div class="odd">gtsam/geometry/tests/testPinholeCamera.cpp (60 eloc)</div><div>gtsam_unstable/slam/tests/testMultiProjectionFactor.cpp (59 eloc)</div><div class="odd">gtsam_unstable/geometry/triangulation.cpp (54 eloc)</div><div>gtsam_unstable/geometry/triangulation.h (41 eloc)</div><div class="odd">gtsam_unstable/nonlinear/tests/testConcurrentBatchSmoother.cpp (36 eloc)</div></div><div><h3>Manohar Paluri is mostly responsible for</h3><div>gtsam/base/tests/testMatrix.cpp (195 eloc)</div><div class="odd">gtsam/geometry/tests/testCal3_S2.cpp (7 eloc)</div><div>tests/testNonlinearFactorGraph.cpp (6 eloc)</div><div class="odd">gtsam/linear/GaussianBayesNet.cpp (4 eloc)</div><div>gtsam/geometry/tests/testPoint3.cpp (4 eloc)</div><div class="odd">gtsam/linear/NoiseModel.cpp (3 eloc)</div><div>gtsam/nonlinear/Values.h (2 eloc)</div><div class="odd">gtsam/inference/BayesTree.h (2 eloc)</div><div>gtsam/geometry/Point3.cpp (2 eloc)</div><div class="odd">gtsam/geometry/Cal3_S2.h (1 eloc)</div></div><div><h3>Michael Kaess is mostly responsible for</h3><div>gtsam/slam/PriorFactor.h (19 eloc)</div><div class="odd">tests/testGaussianISAM.cpp (16 eloc)</div><div>gtsam/symbolic/tests/testSymbolicISAM.cpp (14 eloc)</div><div class="odd">gtsam/base/Vector.cpp (3 eloc)</div><div>tests/smallExample.h (1 eloc)</div><div class="odd">gtsam/inference/BayesTree.h (1 eloc)</div><div>gtsam/base/Vector.h (1 eloc)</div><div class="odd">gtsam/base/Testable.h (1 eloc)</div></div><div><h3>Nick Barrash is mostly responsible for</h3><div>gtsam/geometry/Rot2.h (51 eloc)</div><div class="odd">gtsam/geometry/Point3.h (47 eloc)</div><div>gtsam/geometry/Pose3.h (30 eloc)</div><div class="odd">gtsam/geometry/Point2.h (29 eloc)</div><div>gtsam/geometry/StereoPoint2.h (23 eloc)</div><div class="odd">gtsam/geometry/Pose2.h (20 eloc)</div><div>gtsam/geometry/Cal3DS2.h (19 eloc)</div><div class="odd">gtsam/geometry/Cal3Bundler.h (15 eloc)</div><div>gtsam/inference/Factor.h (13 eloc)</div><div class="odd">gtsam/geometry/CalibratedCamera.h (12 eloc)</div></div><div><h3>Pablo Fernandez Alcantarilla is mostly responsible for</h3><div>gtsam/nonlinear/LevenbergMarquardtOptimizer.h (90 eloc)</div><div class="odd">gtsam/linear/VectorValues.cpp (23 eloc)</div><div>gtsam/linear/tests/testVectorValuesUnordered.cpp (20 eloc)</div><div class="odd">gtsam/linear/tests/testGaussianFactorGraphUnordered.cpp (15 eloc)</div><div>gtsam/geometry/PinholeCamera.h (6 eloc)</div><div class="odd">gtsam/linear/GaussianFactorGraph.cpp (5 eloc)</div><div>gtsam/linear/HessianFactor.cpp (3 eloc)</div><div class="odd">gtsam/linear/VectorValues.h (2 eloc)</div><div>gtsam/linear/GaussianFactorGraph.h (1 eloc)</div><div class="odd">gtsam/linear/GaussianFactor.h (1 eloc)</div></div><div><h3>Rahul Sawhney is mostly responsible for</h3><div>gtsam/inference/graph-inl.h (38 eloc)</div><div class="odd">gtsam/inference/graph.h (19 eloc)</div><div>gtsam/nonlinear/NonlinearFactor.h (8 eloc)</div><div class="odd">gtsam/inference/FactorGraph.h (3 eloc)</div><div>gtsam/geometry/Rot2.h (2 eloc)</div><div class="odd">gtsam/geometry/Point3.h (2 eloc)</div><div>gtsam/geometry/Point2.h (2 eloc)</div><div class="odd">gtsam/base/Vector.cpp (1 eloc)</div><div>gtsam/base/Matrix.cpp (1 eloc)</div><div class="odd">gtsam/base/FastSet.h (1 eloc)</div></div><div><h3>Richard Roberts is mostly responsible for</h3><div>gtsam/nonlinear/ISAM2.cpp (906 eloc)</div><div class="odd">tests/testGaussianISAM2.cpp (594 eloc)</div><div>gtsam/symbolic/tests/testSymbolicBayesTree.cpp (573 eloc)</div><div class="odd">gtsam/discrete/DecisionTree-inl.h (519 eloc)</div><div>gtsam/navigation/CombinedImuFactor.h (517 eloc)</div><div class="odd">gtsam_unstable/slam/CombinedImuFactor.h (509 eloc)</div><div>examples/SolverComparer.cpp (488 eloc)</div><div class="odd">gtsam/linear/JacobianFactor.cpp (485 eloc)</div><div>gtsam_unstable/slam/ImuFactor.h (462 eloc)</div><div class="odd">gtsam/linear/tests/testJacobianFactorUnordered.cpp (459 eloc)</div></div><div><h3>Stephen Williams is mostly responsible for</h3><div>gtsam_unstable/nonlinear/tests/testConcurrentIncrementalFilter.cpp (833 eloc)</div><div class="odd">gtsam_unstable/nonlinear/tests/testConcurrentBatchFilter.cpp (773 eloc)</div><div>gtsam_unstable/slam/EquivInertialNavFactor_GlobalVel.h (517 eloc)</div><div class="odd">gtsam_unstable/nonlinear/ConcurrentBatchFilter.cpp (496 eloc)</div><div>tests/testSerializationSLAM.cpp (485 eloc)</div><div class="odd">gtsam_unstable/nonlinear/tests/testConcurrentBatchSmoother.cpp (408 eloc)</div><div>gtsam_unstable/nonlinear/tests/testConcurrentIncrementalSmootherGN.cpp (399 eloc)</div><div class="odd">gtsam_unstable/nonlinear/tests/testConcurrentIncrementalSmootherDL.cpp (397 eloc)</div><div>gtsam_unstable/nonlinear/BatchFixedLagSmoother.cpp (390 eloc)</div><div class="odd">gtsam_unstable/nonlinear/ConcurrentIncrementalFilter.cpp (302 eloc)</div></div><div><h3>Vadim Indelman is mostly responsible for</h3><div>gtsam_unstable/slam/tests/testInertialNavFactor_GlobalVelocity.cpp (503 eloc)</div><div class="odd">gtsam_unstable/slam/EquivInertialNavFactor_GlobalVel_NoBias.h (459 eloc)</div><div>gtsam_unstable/slam/InertialNavFactor_GlobalVelocity.h (287 eloc)</div><div class="odd">gtsam_unstable/slam/TransformBtwRobotsUnaryFactorEM.h (262 eloc)</div><div>gtsam_unstable/slam/BetweenFactorEM.h (235 eloc)</div><div class="odd">gtsam_unstable/slam/tests/testTransformBtwRobotsUnaryFactorEM.cpp (225 eloc)</div><div>gtsam_unstable/slam/tests/testBetweenFactorEM.cpp (192 eloc)</div><div class="odd">gtsam/slam/dataset.cpp (86 eloc)</div><div>gtsam_unstable/gtsam_unstable.h (42 eloc)</div><div class="odd">gtsam/base/LieVector.h (5 eloc)</div></div><div><h3>Viorela Ila is mostly responsible for</h3><div>gtsam/geometry/Pose3.cpp (2 eloc)</div><div class="odd">tests/testNonlinearFactor.cpp (1 eloc)</div><div>gtsam/slam/dataset.cpp (1 eloc)</div><div class="odd">gtsam/nonlinear/NonlinearFactorGraph.h (1 eloc)</div></div><div><h3>Yong-Dian Jian is mostly responsible for</h3><div>gtsam/linear/NoiseModel.cpp (157 eloc)</div><div class="odd">gtsam/slam/tests/testGeneralSFMFactor_Cal3Bundler.cpp (152 eloc)</div><div>gtsam/nonlinear/NonlinearConjugateGradientOptimizer.h (146 eloc)</div><div class="odd">gtsam/slam/tests/testGeneralSFMFactor.cpp (109 eloc)</div><div>gtsam/linear/NoiseModel.h (100 eloc)</div><div class="odd">gtsam/geometry/PinholeCamera.h (99 eloc)</div><div>gtsam/slam/GeneralSFMFactor.h (83 eloc)</div><div class="odd">gtsam/linear/SubgraphSolver.cpp (72 eloc)</div><div>gtsam/inference/graph-inl.h (67 eloc)</div><div class="odd">gtsam/linear/ConjugateGradientSolver.h (61 eloc)</div></div><div><h3>Zsolt Kira is mostly responsible for</h3><div>gtsam_unstable/geometry/triangulation.h (1 eloc)</div></div><div><h3>bpeasle is mostly responsible for</h3><div>tests/testOccupancyGrid.cpp (236 eloc)</div></div><div><h3>djensen3 is mostly responsible for</h3><div>gtsam/nonlinear/NonlinearFactorGraph.cpp (60 eloc)</div><div class="odd">gtsam/nonlinear/NonlinearFactorGraph.h (4 eloc)</div></div><div><h3>justinca is mostly responsible for</h3><div>gtsam/base/Matrix.cpp (19 eloc)</div><div class="odd">gtsam/base/tests/testMatrix.cpp (16 eloc)</div><div>gtsam/base/Matrix.h (4 eloc)</div></div></div></div>
  11505. <div><div class="box"><p>The following files were excluded from the statistics due to the specified exclusion patterns.</p><p>gtsam/3rdparty/Eigen/src/Core/Replicate.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Sparse/SparseDot.h</p><p>gtsam/3rdparty/Eigen/bench/btl/cmake/FindBlitz.cmake</p><p>gtsam/3rdparty/Eigen/bench/btl/generic_bench/timers/portable_perf_analyzer.hh</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/BooleanRedux.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/misc/SparseSolve.h</p><p>gtsam/3rdparty/Eigen/test/sparselu.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigenvalues/ComplexSchur_MKL.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Geometry/Hyperplane.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_template_int_rightCols.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/IO.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/misc/Solve.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineMatrix.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_cwiseProduct.cpp</p><p>gtsam/3rdparty/Eigen/doc/examples/tut_arithmetic_redux_basic.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/DenseStorage.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/util/Constants.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/OrderingMethods/Ordering.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/Tutorial_AdvancedInitialization_Join.cpp</p><p>gtsam/3rdparty/Eigen/lapack/dlapy3.f</p><p>gtsam/3rdparty/Eigen/blas/testing/sblat2.f</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/Block.h</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/eigen3/main_vecmat.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/hand_vec/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/f77/daat.f</p><p>gtsam/3rdparty/Eigen/doc/snippets/JacobiSVD_basic.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCore/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/InsideEigenExample.dox</p><p>gtsam/3rdparty/Eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/fdjac1.h</p><p>gtsam/3rdparty/Eigen/doc/examples/Tutorial_BlockOperations_vector.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/Polynomials/PolynomialUtils.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/Fuzzy.h</p><p>gtsam/3rdparty/Eigen/test/schur_real.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/HessenbergDecomposition_compute.cpp</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_sparse_product.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/SelfAdjointEigenSolver_SelfAdjointEigenSolver.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/CommaInitializer.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Sparse/AmbiVector.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_inverse.cpp</p><p>gtsam/3rdparty/Eigen/src/Sparse/DynamicSparseMatrix.h</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/STL/main.cpp</p><p>gtsam/3rdparty/Eigen/src/Sparse/SparseBlock.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/util/BlasUtil.h</p><p>gtsam/3rdparty/Eigen/bench/BenchTimer.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Sparse/SparseDenseProduct.h</p><p>gtsam/3rdparty/Eigen/blas/level2_impl.h</p><p>gtsam/3rdparty/Eigen/doc/examples/Tutorial_PartialLU_solve.cpp</p><p>gtsam/3rdparty/Eigen/doc/C01_TutorialMatrixClass.dox</p><p>gtsam/3rdparty/Eigen/src/Core/util/Memory.h</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/mtl4/.kdbgrc.main</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_plus_equal.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/SVD/TODOBdcsvd.txt</p><p>gtsam/3rdparty/Eigen/unsupported/test/NonLinearOptimization.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/Map.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/ForceAlignedAccess.h</p><p>gtsam/3rdparty/Eigen/bench/product_threshold.cpp</p><p>gtsam/3rdparty/Eigen/doc/examples/TutorialLinAlgSVDSolve.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/SVD/JacobiSVD_MKL.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/OpenGLSupport</p><p>gtsam/3rdparty/Eigen/lapack/zlarfb.f</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/BLAS/blas.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/QR/FullPivHouseholderQR.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/Tutorial_solve_triangular.cpp</p><p>gtsam/3rdparty/Eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_broadcast_1nn.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/Product.h</p><p>gtsam/3rdparty/Eigen/bench/btl/actions/action_aat_product.hh</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/gmm/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/snippets/Matrix_resize_int_int.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/Geometry/RotationBase.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/FullPivLU_solve.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/Cholesky</p><p>gtsam/3rdparty/Eigen/doc/examples/function_taking_eigenbase.cpp</p><p>gtsam/3rdparty/Eigen/bench/BenchUtil.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCore/SparseProduct.h</p><p>gtsam/3rdparty/Eigen/test/eigen2/product.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_bottomRightCorner_int_int.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_cwiseEqual.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/doc/snippets/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineStorage.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/FullPivHouseholderQR_solve.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Cholesky/LDLT.h</p><p>gtsam/3rdparty/Eigen/test/testsuite.cmake</p><p>gtsam/3rdparty/Eigen/test/geo_orthomethods.cpp</p><p>gtsam/3rdparty/gtsam_eigen_includes.h.in</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_template_int_int_bottomRightCorner.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Sparse/SparseSparseProduct.h</p><p>gtsam/3rdparty/Eigen/test/exceptions.cpp</p><p>gtsam/3rdparty/Eigen/doc/examples/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h</p><p>gtsam/3rdparty/Eigen/unsupported/doc/Doxyfile.in</p><p>gtsam/3rdparty/Eigen/failtest/const_qualified_diagonal_method_retval.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_cwiseNotEqual.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/ReturnByValue.h</p><p>gtsam/3rdparty/Eigen/lapack/cholesky.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/hand_vec/main.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/Array</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/Assign_MKL.h</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_eigensolver.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/products/SelfadjointRank2Update.h</p><p>gtsam/3rdparty/Eigen/doc/examples/Tutorial_ArrayClass_interop.cpp</p><p>gtsam/3rdparty/Eigen/test/array.cpp</p><p>gtsam/3rdparty/Eigen/blas/common.h</p><p>gtsam/3rdparty/Eigen/test/spqr_support.cpp</p><p>gtsam/3rdparty/Eigen/doc/examples/TutorialLinAlgInverseDeterminant.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Sparse/SparseCwiseBinaryOp.h</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/TriangularSolver.h</p><p>gtsam/3rdparty/Eigen/doc/examples/class_VectorBlock.cpp</p><p>gtsam/3rdparty/CCOLAMD/MATLAB/csymamdtestmex.m</p><p>gtsam/3rdparty/ccolamd/ccolamd.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_topRows_int.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/Tridiagonalization_Tridiagonalization_MatrixType.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h</p><p>gtsam/3rdparty/CCOLAMD/MATLAB/csymamdtestmex.c</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/LevenbergMarquardt/LevenbergMarquardt.h</p><p>gtsam/3rdparty/ccolamd/ccolamd.c</p><p>gtsam/3rdparty/Eigen/failtest/const_qualified_block_method_retval_1.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/arch/Default/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/TopicResizing.dox</p><p>gtsam/3rdparty/ccolamd/core_ufconfig_Makefile.mk</p><p>gtsam/3rdparty/Eigen/src/LU/arch/Makefile.am</p><p>gtsam/3rdparty/Eigen/src/Core/GenericPacketMath.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/Reverse.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/CholmodSupport/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/FFT/ei_fftw_impl.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/EigenSolver_compute.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/cmake/MacroOptionalAddSubdirectory.cmake</p><p>gtsam/3rdparty/Eigen/bench/btl/cmake/FindGMM.cmake</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigenvalues/Tridiagonalization.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/AutoDiff/AutoDiffScalar.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/Dot.h</p><p>gtsam/3rdparty/CCOLAMD/Demo/my_ccolamd_example.out</p><p>gtsam/3rdparty/Eigen/src/Core/products/Parallelizer.h</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/mtl4/mtl4_LU_solve_interface.hh</p><p>gtsam/3rdparty/Eigen/failtest/block_nonconst_ctor_on_const_xpr_1.cpp</p><p>gtsam/3rdparty/Eigen/src/Geometry/AlignedBox.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/ArpackSupport</p><p>gtsam/3rdparty/Eigen/Eigen/src/StlSupport/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/src/Core/arch/NEON/Complex.h</p><p>gtsam/3rdparty/Eigen/lapack/ilaslr.f</p><p>gtsam/3rdparty/Eigen/lapack/dlarft.f</p><p>gtsam/3rdparty/Eigen/doc/snippets/GeneralizedEigenSolver.cpp</p><p>gtsam/3rdparty/Eigen/src/QR/HouseholderQR.h</p><p>gtsam/3rdparty/Eigen/lapack/dlarfb.f</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/StlSupport/details.h</p><p>gtsam/3rdparty/Eigen/src/Core/SolveTriangular.h</p><p>gtsam/3rdparty/Eigen/doc/I16_TemplateKeyword.dox</p><p>gtsam/3rdparty/Eigen/failtest/map_on_const_type_actually_const_1.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_template_int_int_topLeftCorner_int_int.cpp</p><p>gtsam/3rdparty/Eigen/test/umeyama.cpp</p><p>gtsam/3rdparty/Eigen/doc/examples/QuickStart_example2_fixed.cpp</p><p>gtsam/3rdparty/ccolamd/LGPL.txt</p><p>gtsam/3rdparty/Eigen/Eigen/src/LU/arch/Inverse_SSE.h</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_sparse_basic.cpp</p><p>gtsam/3rdparty/Eigen/src/plugins/Makefile.am</p><p>gtsam/3rdparty/Eigen/Eigen/CholmodSupport</p><p>gtsam/3rdparty/Eigen/blas/README.txt</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/eigen2/main_vecmat.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/MathFunctions.h</p><p>gtsam/3rdparty/Eigen/src/plugins/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/LevenbergMarquardt/LMonestep.h</p><p>gtsam/3rdparty/Eigen/bench/benchmarkX.cpp</p><p>gtsam/3rdparty/Eigen/demos/mix_eigen_and_c/binary_library.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/LeastSquares.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseLU/SparseLU_kernel_bmod.h</p><p>gtsam/3rdparty/Eigen/unsupported/README.txt</p><p>gtsam/3rdparty/Eigen/demos/opengl/trackball.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h</p><p>gtsam/3rdparty/Eigen/bench/sparse_cholesky.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/DenseBase.h</p><p>gtsam/3rdparty/Eigen/cmake/EigenConfigureTesting.cmake</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/KroneckerProduct</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_leftCols_int.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/Meta.h</p><p>gtsam/3rdparty/Eigen/lapack/dladiv.f</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/eigen3/main_matmat.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/qrsolv.h</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/MathFunctions.h</p><p>gtsam/3rdparty/Eigen/src/Core/Functors.h</p><p>gtsam/3rdparty/Eigen/test/cwiseop.cpp</p><p>gtsam/3rdparty/Eigen/test/jacobisvd.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/QR/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/test/basicstuff.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_replicate_int_int.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/EigenBase.h</p><p>gtsam/3rdparty/Eigen/src/Core/Stride.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_random_int.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/test/minres.cpp</p><p>gtsam/3rdparty/Eigen/demos/mandelbrot/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/blas/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/Eigen/src/StlSupport/StdVector.h</p><p>gtsam/3rdparty/Eigen/unsupported/doc/examples/MatrixExponential.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/actions/action_lu_decomp.hh</p><p>gtsam/3rdparty/Eigen/doc/snippets/PartialRedux_count.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/AutoDiff/AutoDiffJacobian.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/SelfAdjointEigenSolver_compute_MatrixType2.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/doc/Overview.dox</p><p>gtsam/3rdparty/Eigen/Eigen/src/Sparse/SparseMatrixBase.h</p><p>gtsam/3rdparty/Eigen/blas/testing/cblat3.dat</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/MatrixLogarithm.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_log.cpp</p><p>gtsam/3rdparty/Eigen/blas/chpr.f</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/Random.h</p><p>gtsam/3rdparty/Eigen/src/Core/DiagonalMatrix.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/OrderingMethods/Amd.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCore/SparseUtil.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_identity.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/CoreIterators.h</p><p>gtsam/3rdparty/Eigen/doc/TutorialArrayClass.dox</p><p>gtsam/3rdparty/Eigen/Eigen/Eigen2Support</p><p>gtsam/3rdparty/Eigen/test/lu.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/test/matrix_power.cpp</p><p>gtsam/3rdparty/Eigen/lapack/slapy2.f</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/Geometry/Rotation2D.h</p><p>gtsam/3rdparty/Eigen/failtest/map_nonconst_ctor_on_const_ptr_4.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/MetisSupport/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/Eigen/src/Sparse/SparseBlock.h</p><p>gtsam/3rdparty/Eigen/test/packetmath.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/MoreVectorization/MathFunctions.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/arch/CMakeLists.txt</p><p>gtsam/3rdparty/ccolamd/ChangeLog</p><p>gtsam/3rdparty/Eigen/bench/btl/actions/action_cholesky.hh</p><p>gtsam/3rdparty/Eigen/test/eigen2support.cpp</p><p>gtsam/3rdparty/Eigen/test/umfpack_support.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/PartialRedux_prod.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/actions/action_hessenberg.hh</p><p>gtsam/3rdparty/Eigen/test/map.cpp</p><p>gtsam/3rdparty/Eigen/doc/examples/Tutorial_BlockOperations_colrow.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/actions/action_trisolve_matrix.hh</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/f77/daxpy.f</p><p>gtsam/3rdparty/Eigen/doc/I01_TopicLazyEvaluation.dox</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/products/SelfadjointMatrixVector_MKL.h</p><p>gtsam/3rdparty/CCOLAMD/MATLAB/luflops.m</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/util/XprHelper.h</p><p>gtsam/3rdparty/Eigen/lapack/ilazlc.f</p><p>gtsam/3rdparty/Eigen/src/Core/StableNorm.h</p><p>gtsam/3rdparty/Eigen/bench/btl/actions/action_axpby.hh</p><p>gtsam/3rdparty/ccolamd/ccolamd_global.c</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_lu.cpp</p><p>gtsam/3rdparty/Eigen/.hg_archival.txt</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/util/Macros.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/Amd.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/MathFunctions.h</p><p>gtsam/3rdparty/Eigen/bench/spbench/spbenchsolver.cpp</p><p>gtsam/3rdparty/CCOLAMD/Demo/ccolamd_l_example.out</p><p>gtsam/3rdparty/Eigen/unsupported/doc/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/Eigen/src/misc/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/blas/drotm.f</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_setZero.cpp</p><p>gtsam/3rdparty/Eigen/test/nullary.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/Random.h</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/Memory.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_setIdentity.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/products/TriangularSolverMatrix_MKL.h</p><p>gtsam/3rdparty/Eigen/doc/examples/Tutorial_BlockOperations_block_assignment.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/SelfCwiseBinaryOp.h</p><p>gtsam/3rdparty/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/snippets/Vectorwise_reverse.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix_MKL.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/NumericalDiff/CMakeLists.txt</p><p>gtsam/3rdparty/CCOLAMD/Demo/ccolamd_l_example.c</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/util/DisableStupidWarnings.h</p><p>gtsam/3rdparty/Eigen/doc/TutorialGeometry.dox</p><p>gtsam/3rdparty/Eigen/blas/ssbmv.f</p><p>gtsam/3rdparty/Eigen/doc/snippets/RealQZ_compute.cpp</p><p>gtsam/3rdparty/Eigen/test/corners.cpp</p><p>gtsam/3rdparty/Eigen/cmake/FindScotch.cmake</p><p>gtsam/3rdparty/Eigen/doc/snippets/Matrix_setOnes_int.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/arch/NEON/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/lapack/clacgv.f</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/Transpose.h</p><p>gtsam/3rdparty/Eigen/unsupported/test/mpreal/mpreal.h</p><p>gtsam/3rdparty/Eigen/src/Core/VectorwiseOp.h</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/Minor.h</p><p>gtsam/3rdparty/Eigen/bench/benchBlasGemm.cpp</p><p>gtsam/3rdparty/CCOLAMD/Source/ccolamd.c</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/MatrixBase.h</p><p>gtsam/3rdparty/Eigen/doc/TemplateKeyword.dox</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/IterativeSolvers/IncompleteCholesky.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_less_equal.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/test/splines.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/BlockOfDynamicSparseMatrix.h</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/C_BLAS/main.cpp</p><p>gtsam/3rdparty/Eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_visitors.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/products/TriangularSolverMatrix.h</p><p>gtsam/3rdparty/Eigen/unsupported/doc/examples/MatrixSinh.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/Product.h</p><p>gtsam/3rdparty/Eigen/doc/I10_Assertions.dox</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_cwiseQuotient.cpp</p><p>gtsam/3rdparty/Eigen/cmake/EigenTesting.cmake</p><p>gtsam/3rdparty/Eigen/Eigenvalues</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/MarketIO.h</p><p>gtsam/3rdparty/Eigen/blas/ctbmv.f</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_cwiseAbs2.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/MetisSupport</p><p>gtsam/3rdparty/Eigen/blas/testing/dblat2.dat</p><p>gtsam/3rdparty/Eigen/src/Geometry/EulerAngles.h</p><p>gtsam/3rdparty/Eigen/src/plugins/MatrixCwiseUnaryOps.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/Eigenvalues/ArpackSelfAdjointEigenSolver.h</p><p>gtsam/3rdparty/Eigen/Eigen/SPQRSupport</p><p>gtsam/3rdparty/Eigen/src/Sparse/CoreIterators.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/covar.h</p><p>gtsam/3rdparty/Eigen/cmake/FindSPQR.cmake</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_exp.cpp</p><p>gtsam/3rdparty/Eigen/src/QR/FullPivHouseholderQR.h</p><p>gtsam/3rdparty/Eigen/unsupported/test/sparse_lu.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/actions/action_axpy.hh</p><p>gtsam/3rdparty/Eigen/Eigen/SparseCore</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/LevenbergMarquardt</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_template_int_topRows.cpp</p><p>gtsam/3rdparty/Eigen/test/pastix_support.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/actions/action_trisolve.hh</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCore/CoreIterators.h</p><p>gtsam/3rdparty/Eigen/src/Core/Transpositions.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/Transpositions.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Geometry/Transform.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_random.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/arch/NEON/Makefile.am</p><p>gtsam/3rdparty/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h</p><p>gtsam/3rdparty/Eigen/src/Core/GlobalFunctions.h</p><p>gtsam/3rdparty/Eigen/doc/eigendoxy.css</p><p>gtsam/3rdparty/Eigen/blas/testing/cblat2.dat</p><p>gtsam/3rdparty/Eigen/bench/btl/actions/action_trmm.hh</p><p>gtsam/3rdparty/Eigen/doc/TopicScalarTypes.dox</p><p>gtsam/3rdparty/Eigen/test/simplicial_cholesky.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/arch/SSE/Makefile.am</p><p>gtsam/3rdparty/Eigen/doc/LinearLeastSquares.dox</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/Geometry/ParametrizedLine.h</p><p>gtsam/3rdparty/Eigen/demos/mix_eigen_and_c/binary_library.h</p><p>gtsam/3rdparty/Eigen/doc/ClassHierarchy.dox</p><p>gtsam/3rdparty/Eigen/Eigen/src/OrderingMethods/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/cmake/CMakeDetermineVSServicePack.cmake</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/Assign.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/AlignedVector3</p><p>gtsam/3rdparty/Eigen/demos/opengl/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_max.cpp</p><p>gtsam/3rdparty/Eigen/test/diagonal.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Geometry/EulerAngles.h</p><p>gtsam/3rdparty/Eigen/Eigen/LeastSquares</p><p>gtsam/3rdparty/Eigen/src/Sparse/SparseCwiseBinaryOp.h</p><p>gtsam/3rdparty/Eigen/cmake/FindEigen3.cmake</p><p>gtsam/3rdparty/Eigen/test/vectorwiseop.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/IterativeSolvers/ConstrainedConjGrad.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_acos.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_eigenvalues.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_template_int_int_topLeftCorner.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_replicate.cpp</p><p>gtsam/3rdparty/Eigen/failtest/block_nonconst_ctor_on_const_xpr_0.cpp</p><p>gtsam/3rdparty/Eigen/blas/drotmg.f</p><p>gtsam/3rdparty/Eigen/Eigen/src/Jacobi/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/snippets/Map_simple.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/Fuzzy.h</p><p>gtsam/3rdparty/Eigen/doc/TopicLinearAlgebraDecompositions.dox</p><p>gtsam/3rdparty/Eigen/unsupported/doc/examples/MatrixSquareRoot.cpp</p><p>gtsam/3rdparty/Eigen/cmake/FindPastix.cmake</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_isUnitary.cpp</p><p>gtsam/3rdparty/Eigen/lapack/slarfb.f</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/CwiseBinaryOp.h</p><p>gtsam/3rdparty/Eigen/test/meta.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/generic_bench/timers/x86_timer.hh</p><p>gtsam/3rdparty/Eigen/Eigen2Support</p><p>gtsam/3rdparty/Eigen/test/qr_fullpivoting.cpp</p><p>gtsam/3rdparty/Eigen/blas/complexdots.f</p><p>gtsam/3rdparty/Eigen/doc/snippets/Tutorial_AdvancedInitialization_Zero.cpp</p><p>gtsam/3rdparty/Eigen/cmake/FindMPFR.cmake</p><p>gtsam/3rdparty/Eigen/test/product_notemporary.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_greater_equal.cpp</p><p>gtsam/3rdparty/CCOLAMD/MATLAB/csymamdmex.c</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/Splines/SplineFwd.h</p><p>gtsam/3rdparty/Eigen/test/sparse_permutations.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_sqrt.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/Matrix_setOnes_int_int.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_sin.cpp</p><p>gtsam/3rdparty/Eigen/doc/examples/Tutorial_ArrayClass_mult.cpp</p><p>gtsam/3rdparty/Eigen/test/eigensolver_generic.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/Matrix_resize_int_NoChange.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/util/XprHelper.h</p><p>gtsam/3rdparty/Eigen/bench/btl/actions/action_matrix_vector_product.hh</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/util/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/src/misc/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/failtest/transpose_on_const_type_actually_const.cpp</p><p>gtsam/3rdparty/Eigen/blas/ctpsv.f</p><p>gtsam/3rdparty/Eigen/test/upperbidiagonalization.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/BVH/BVAlgorithms.h</p><p>gtsam/3rdparty/Eigen/demos/mix_eigen_and_c/README</p><p>gtsam/3rdparty/Eigen/Eigen/src/CholmodSupport/CholmodSupport.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Sparse/SparseCwiseUnaryOp.h</p><p>gtsam/3rdparty/Eigen/bench/btl/cmake/FindMKL.cmake</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/Ref.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_topRightCorner_int_int.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/tvmet/tvmet_interface.hh</p><p>gtsam/3rdparty/Eigen/src/Eigenvalues/ComplexEigenSolver.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCore/SparseBlock.h</p><p>gtsam/3rdparty/Eigen/src/Core/DenseStorageBase.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/HybridNonLinearSolver.h</p><p>gtsam/3rdparty/Eigen/demos/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_isIdentity.cpp</p><p>gtsam/3rdparty/Eigen/test/product_trmm.cpp</p><p>gtsam/3rdparty/Eigen/blas/zhpr.f</p><p>gtsam/3rdparty/Eigen/Eigen/src/SVD/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/blas/srotmg.f</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_template_int_leftCols.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Sparse/CoreIterators.h</p><p>gtsam/3rdparty/Eigen/doc/TutorialSparse.dox</p><p>gtsam/3rdparty/Eigen/bench/btl/generic_bench/utils/utilities.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/NestByValue.h</p><p>gtsam/3rdparty/Eigen/Cholesky</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCore/SparseSparseProductWithPruning.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/SuperLUSupport</p><p>gtsam/3rdparty/Eigen/bench/btl/data/mean.cxx</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/SparseLLT.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/LU/PartialPivLU.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/arch/NEON/Complex.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/UmfPackSupport.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/SelfAdjointView_operatorNorm.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_eval.cpp</p><p>gtsam/3rdparty/Eigen/src/Sparse/Makefile.am</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_plus.cpp</p><p>gtsam/3rdparty/Eigen/blas/level2_cplx_impl.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_cwiseInverse.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/Tutorial_solve_matrix_inverse.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCore/SparseTriangularView.h</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/gmm/main.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/Select.h</p><p>gtsam/3rdparty/Eigen/bench/bench_multi_compilers.sh</p><p>gtsam/3rdparty/Eigen/Eigen/src/Householder/HouseholderSequence.h</p><p>gtsam/3rdparty/Eigen/src/Core/util/ForwardDeclarations.h</p><p>gtsam/3rdparty/Eigen/src/Geometry/Transform.h</p><p>gtsam/3rdparty/Eigen/demos/opengl/gpuhelper.h</p><p>gtsam/3rdparty/Eigen/blas/level3_impl.h</p><p>gtsam/3rdparty/Eigen/test/vectorization_logic.cpp</p><p>gtsam/3rdparty/Eigen/bench/benchmark_suite</p><p>gtsam/3rdparty/Eigen/src/Core/ForceAlignedAccess.h</p><p>gtsam/3rdparty/Eigen/test/product_extra.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/TopicAliasing.dox</p><p>gtsam/3rdparty/Eigen/test/block.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_slash_equal.cpp</p><p>gtsam/3rdparty/Eigen/blas/chpr2.f</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/products/CoeffBasedProduct.h</p><p>gtsam/3rdparty/Eigen/unsupported/test/kronecker_product.cpp</p><p>gtsam/3rdparty/Eigen/doc/UsingIntelMKL.dox</p><p>gtsam/3rdparty/Eigen/cmake/FindFFTW.cmake</p><p>gtsam/3rdparty/Eigen/src/plugins/CommonCwiseUnaryOps.h</p><p>gtsam/3rdparty/Eigen/src/Sparse/SparseView.h</p><p>gtsam/3rdparty/Eigen/bench/btl/data/smooth.cxx</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/FFT/ei_kissfft_impl.h</p><p>gtsam/3rdparty/Eigen/bench/btl/generic_bench/timers/mixed_perf_analyzer.hh</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h</p><p>gtsam/3rdparty/Eigen/cmake/FindAdolc.cmake</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/LevenbergMarquardt/CopyrightMINPACK.txt</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/DenseCoeffsBase.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_boolean_and.cpp</p><p>gtsam/3rdparty/Eigen/blas/ctpmv.f</p><p>gtsam/3rdparty/CCOLAMD/MATLAB/Contents.m</p><p>gtsam/3rdparty/Eigen/src/Sparse/SparseMatrix.h</p><p>gtsam/3rdparty/Eigen/INSTALL</p><p>gtsam/3rdparty/Eigen/doc/snippets/SelfAdjointView_eigenvalues.cpp</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/test/sizeof.cpp</p><p>gtsam/3rdparty/Eigen/failtest/block_on_const_type_actually_const_0.cpp</p><p>gtsam/3rdparty/Eigen/bench/spbench/sp_solver.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_tan.cpp</p><p>gtsam/3rdparty/Eigen/lapack/lapack_common.h</p><p>gtsam/3rdparty/Eigen/src/Eigenvalues/EigenSolver.h</p><p>gtsam/3rdparty/CCOLAMD/MATLAB/ccolamd_install.m</p><p>gtsam/3rdparty/Eigen/test/hessenberg.cpp</p><p>gtsam/3rdparty/CCOLAMD/MATLAB/ccolamd_demo.m</p><p>gtsam/3rdparty/Eigen/doc/snippets/tut_arithmetic_transpose_conjugate.cpp</p><p>gtsam/3rdparty/Eigen/blas/PackedSelfadjointProduct.h</p><p>gtsam/3rdparty/Eigen/LU</p><p>gtsam/3rdparty/Eigen/Makefile.am</p><p>gtsam/3rdparty/Eigen/bench/btl/data/go_mean</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/products/GeneralMatrixVector.h</p><p>gtsam/3rdparty/Eigen/src/Core/arch/NEON/PacketMath.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/SuperLUSupport/SuperLUSupport.h</p><p>gtsam/3rdparty/Eigen/Eigen/Eigenvalues</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/IterativeSolvers/GMRES.h</p><p>gtsam/3rdparty/Eigen/doc/C07_TutorialReductionsVisitorsBroadcasting.dox</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_alignedbox.cpp</p><p>gtsam/3rdparty/Eigen/doc/examples/TutorialLinAlgSelfAdjointEigenSolver.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/DiagonalMatrix.h</p><p>gtsam/3rdparty/Eigen/blas/level1_real_impl.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/QR/ColPivHouseholderQR.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/CwiseUnaryOp.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/f77/dmxm.f.mfr</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_part.cpp</p><p>gtsam/3rdparty/Eigen/doc/TutorialBlockOperations.dox</p><p>gtsam/3rdparty/Eigen/test/jacobi.cpp</p><p>gtsam/3rdparty/Eigen/bench/BenchSparseUtil.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/products/TriangularMatrixVector.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/util/Meta.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h</p><p>gtsam/3rdparty/Eigen/src/LU/Inverse.h</p><p>gtsam/3rdparty/Eigen/lapack/eigenvalues.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_ones_int.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/PaStiXSupport/PaStiXSupport.h</p><p>gtsam/3rdparty/Eigen/src/Core/NumTraits.h</p><p>gtsam/3rdparty/Eigen/test/eigensolver_complex.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/CwiseUnaryView.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/SVD.h</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/C/C_interface.hh</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/Geometry/AngleAxis.h</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_map.cpp</p><p>gtsam/3rdparty/Eigen/scripts/check.in</p><p>gtsam/3rdparty/Eigen/test/prec_inverse_4x4.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/f77/test_interface.hh</p><p>gtsam/3rdparty/Eigen/src/plugins/ArrayCwiseUnaryOps.h</p><p>gtsam/3rdparty/Eigen/src/Core/util/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/snippets/EigenSolver_eigenvectors.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/gmm/gmm_LU_solve_interface.hh</p><p>gtsam/3rdparty/Eigen/src/Eigenvalues/ComplexSchur.h</p><p>gtsam/3rdparty/Eigen/Eigen/IterativeLinearSolvers</p><p>gtsam/3rdparty/Eigen/src/Householder/HouseholderSequence.h</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/gmm/gmm_interface.hh</p><p>gtsam/3rdparty/Eigen/test/unalignedassert.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/SVD/JacobiSVD.h</p><p>gtsam/3rdparty/Eigen/src/Eigenvalues/Tridiagonalization.h</p><p>gtsam/3rdparty/Eigen/src/Core/ArrayBase.h</p><p>gtsam/3rdparty/Eigen/doc/examples/TutorialLinAlgRankRevealing.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/CwiseUnaryView.h</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/Geometry/All.h</p><p>gtsam/3rdparty/Eigen/src/Core/products/GeneralMatrixVector.h</p><p>gtsam/3rdparty/Eigen/lapack/ilaclr.f</p><p>gtsam/3rdparty/Eigen/Jacobi</p><p>gtsam/3rdparty/Eigen/doc/I02_HiPerformance.dox</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_ones.cpp</p><p>gtsam/3rdparty/Eigen/src/Geometry/Umeyama.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/Tutorial_solve_reuse_decomposition.cpp</p><p>gtsam/3rdparty/Eigen/test/bandmatrix.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/PardisoSupport</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/GeneralProduct.h</p><p>gtsam/3rdparty/Eigen/scripts/eigen_gen_credits.cpp</p><p>gtsam/3rdparty/Eigen/blas/testing/cblat1.f</p><p>gtsam/3rdparty/Eigen/doc/snippets/Jacobi_makeJacobi.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/util/DisableMSVCWarnings.h</p><p>gtsam/3rdparty/Eigen/doc/special_examples/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/test/mapped_matrix.cpp</p><p>gtsam/3rdparty/Eigen/doc/examples/DenseBase_middleRows_int.cpp</p><p>gtsam/3rdparty/Eigen/blas/testing/cblat3.f</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/Geometry/RotationBase.h</p><p>gtsam/3rdparty/Eigen/blas/dsbmv.f</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_geometry_with_eigen2_prefix.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseLU/SparseLU_Structs.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_template_int_end.cpp</p><p>gtsam/3rdparty/Eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_reductions_bool.cpp</p><p>gtsam/3rdparty/Eigen/doc/examples/Tutorial_ArrayClass_addition.cpp</p><p>gtsam/3rdparty/Eigen/blas/chpmv.f</p><p>gtsam/3rdparty/Eigen/test/geo_parametrizedline.cpp</p><p>gtsam/3rdparty/Eigen/bench/spmv.cpp</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/Makefile.am</p><p>gtsam/3rdparty/Eigen/doc/D07_PassingByValue.dox</p><p>gtsam/3rdparty/Eigen/lapack/iladlr.f</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/MatrixSquareRoot.h</p><p>gtsam/3rdparty/Eigen/doc/examples/tut_arithmetic_dot_cross.cpp</p><p>gtsam/3rdparty/Eigen/src/Makefile.am</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_sparse_vector.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/FFT/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/blas/dspmv.f</p><p>gtsam/3rdparty/Eigen/test/runtest.sh</p><p>gtsam/3rdparty/Eigen/doc/TutorialMapClass.dox</p><p>gtsam/3rdparty/Eigen/src/LU/PartialPivLU.h</p><p>gtsam/3rdparty/Eigen/doc/eigen_navtree_hacks.js</p><p>gtsam/3rdparty/Eigen/test/sparse_product.cpp</p><p>gtsam/3rdparty/Eigen/bench/benchmarkXcwise.cpp</p><p>gtsam/3rdparty/Eigen/test/sparseqr.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/PartialRedux_norm.cpp</p><p>gtsam/3rdparty/Eigen/test/geo_transformations.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Sparse/DynamicSparseMatrix.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/SelfAdjointEigenSolver_operatorSqrt.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/class_FullPivLU.cpp</p><p>gtsam/3rdparty/Eigen/doc/Manual.dox</p><p>gtsam/3rdparty/Eigen/doc/snippets/Matrix_setZero_int.cpp</p><p>gtsam/3rdparty/Eigen/lapack/double.cpp</p><p>gtsam/3rdparty/Eigen/debug/msvc/eigen_autoexp_part.dat</p><p>gtsam/3rdparty/Eigen/doc/AsciiQuickReference.txt</p><p>gtsam/3rdparty/Eigen/Eigen/src/PardisoSupport/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCore/SparseDiagonalProduct.h</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/blitz/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/arch/SSE/PacketMath.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/Tutorial_AdvancedInitialization_Block.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_start_int.cpp</p><p>gtsam/3rdparty/Eigen/COPYING.README</p><p>gtsam/3rdparty/Eigen/bench/bench_reverse.cpp</p><p>gtsam/3rdparty/Eigen/src/Householder/Makefile.am</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/Block.h</p><p>gtsam/3rdparty/Eigen/blas/dspr2.f</p><p>gtsam/3rdparty/Eigen/test/triangular.cpp</p><p>gtsam/3rdparty/Eigen/test/permutationmatrices.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/Visitor.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_template_int_int_bottomRightCorner_int_int.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/ComplexSchur_matrixU.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/MapBase.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseQR/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/blas/zhpr2.f</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineUtil.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/r1mpyq.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/SelfAdjointEigenSolver_SelfAdjointEigenSolver_MatrixType.cpp</p><p>gtsam/3rdparty/Eigen/src/Sparse/SparseVector.h</p><p>gtsam/3rdparty/Eigen/demos/opengl/README</p><p>gtsam/3rdparty/Eigen/src/Sparse/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/snippets/Tridiagonalization_packedMatrix.cpp</p><p>gtsam/3rdparty/Eigen/doc/examples/Tutorial_simple_example_fixed_size.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseLU/SparseLU_column_bmod.h</p><p>gtsam/3rdparty/Eigen/bench/btl/actions/basic_actions.hh</p><p>gtsam/3rdparty/Eigen/src/Core/BooleanRedux.h</p><p>gtsam/3rdparty/Eigen/doc/StorageOrders.dox</p><p>gtsam/3rdparty/Eigen/Eigen/src/SPQRSupport/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/bench/btl/generic_bench/init/init_vector.hh</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_diagonal.cpp</p><p>gtsam/3rdparty/Eigen/test/product_trmv.cpp</p><p>gtsam/3rdparty/Eigen/doc/examples/function_taking_ref.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/Matrix_setRandom_int.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/actions/action_symv.hh</p><p>gtsam/3rdparty/Eigen/doc/snippets/Map_placement_new.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/MetisSupport/MetisSupport.h</p><p>gtsam/3rdparty/Eigen/src/Geometry/RotationBase.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigenvalues/EigenvaluesCommon.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/Polynomials/PolynomialSolver.h</p><p>gtsam/3rdparty/Eigen/src/Geometry/ParametrizedLine.h</p><p>gtsam/3rdparty/Eigen/blas/double.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/eigen2/eigen2_interface.hh</p><p>gtsam/3rdparty/Eigen/.hgignore</p><p>gtsam/3rdparty/Eigen/bench/btl/actions/action_syr2.hh</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/f77/data.f</p><p>gtsam/3rdparty/Eigen/blas/ztbmv.f</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseLU/SparseLU_relax_snode.h</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/blitz/tiny_blitz_interface.hh</p><p>gtsam/3rdparty/Eigen/src/Core/arch/SSE/MathFunctions.h</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/f77/smxv.f</p><p>gtsam/3rdparty/Eigen/doc/snippets/Tutorial_AdvancedInitialization_LinSpaced.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/doc/examples/BVH_Example.cpp</p><p>gtsam/3rdparty/Eigen/test/special_numbers.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_zero.cpp</p><p>gtsam/3rdparty/Eigen/src/Cholesky/LDLT.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_bottomRows_int.cpp</p><p>gtsam/3rdparty/Eigen/scripts/release.in</p><p>gtsam/3rdparty/Eigen/cmake/FindGMP.cmake</p><p>gtsam/3rdparty/Eigen/unsupported/test/bdcsvd.cpp</p><p>gtsam/3rdparty/CCOLAMD/MATLAB/ccolamd_test.m</p><p>gtsam/3rdparty/Eigen/unsupported/test/mpreal/dlmalloc.c</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/util/ForwardDeclarations.h</p><p>gtsam/3rdparty/Eigen/unsupported/test/mpreal/dlmalloc.h</p><p>gtsam/3rdparty/Eigen/demos/opengl/camera.h</p><p>gtsam/3rdparty/Eigen/src/LU/FullPivLU.h</p><p>gtsam/3rdparty/Eigen/lapack/iladlc.f</p><p>gtsam/3rdparty/Eigen/doc/TopicVectorization.dox</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/ProductBase.h</p><p>gtsam/3rdparty/Eigen/Eigen/Geometry</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_times_equal.cpp</p><p>gtsam/3rdparty/Eigen/src/Sparse/SparseDiagonalProduct.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Geometry/RotationBase.h</p><p>gtsam/3rdparty/Eigen/src/Core/Array.h</p><p>gtsam/3rdparty/Eigen/blas/testing/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/src/Eigenvalues/EigenvaluesCommon.h</p><p>gtsam/3rdparty/ccolamd/Makefile.am</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_quotient.cpp</p><p>gtsam/3rdparty/Eigen/blas/level1_cplx_impl.h</p><p>gtsam/3rdparty/Eigen/doc/examples/TutorialLinAlgExComputeSolveError.cpp</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/CwiseOperators.h</p><p>gtsam/3rdparty/CCOLAMD/MATLAB/ccolamdmex.c</p><p>gtsam/3rdparty/Eigen/blas/stbsv.f</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_block_int_int_int_int.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/VectorwiseOp.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/Polynomials/Companion.h</p><p>gtsam/3rdparty/Eigen/test/product_mmtr.cpp</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_linearstructure.cpp</p><p>gtsam/3rdparty/Eigen/bench/sparse_lu.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/LevenbergMarquardt/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/Redux.h</p><p>gtsam/3rdparty/Makefile.am</p><p>gtsam/3rdparty/Eigen/doc/StlContainers.dox</p><p>gtsam/3rdparty/Eigen/test/product_small.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/Tutorial_solve_multiple_rhs.cpp</p><p>gtsam/3rdparty/Eigen/blas/testing/dblat3.dat</p><p>gtsam/3rdparty/Eigen/test/linearstructure.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/test/mpreal_support.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/MoreVectorization</p><p>gtsam/3rdparty/Eigen/src/Core/util/EnableMSVCWarnings.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Geometry/Umeyama.h</p><p>gtsam/3rdparty/Eigen/bench/btl/generic_bench/timers/portable_timer.hh</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_diagonal_template_int.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_inverse.cpp</p><p>gtsam/3rdparty/Eigen/test/stable_norm.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCore/SparseVector.h</p><p>gtsam/3rdparty/Eigen/failtest/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/src/Geometry/Scaling.h</p><p>gtsam/3rdparty/Eigen/src/StlSupport/StdVector.h</p><p>gtsam/3rdparty/Eigen/bench/btl/cmake/FindGOTO.cmake</p><p>gtsam/3rdparty/Eigen/cmake/FindEigen2.cmake</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/NumericalDiff</p><p>gtsam/3rdparty/Eigen/src/Geometry/OrthoMethods.h</p><p>gtsam/3rdparty/CCOLAMD/Demo/ccolamd_example.c</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/products/GeneralMatrixVector_MKL.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/Map_general_stride.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/generic_bench/timers/x86_perf_analyzer.hh</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_prec_inverse_4x4.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/products/Parallelizer.h</p><p>gtsam/3rdparty/Eigen/blas/BandTriangularSolver.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_product.cpp</p><p>gtsam/3rdparty/Eigen/COPYING.BSD</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_min.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Geometry/Translation.h</p><p>gtsam/3rdparty/Eigen/bench/btl/actions/action_partial_lu.hh</p><p>gtsam/3rdparty/Eigen/lapack/cladiv.f</p><p>gtsam/3rdparty/Eigen/bench/btl/generic_bench/utils/xy_file.hh</p><p>gtsam/3rdparty/Eigen/unsupported/test/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/src/Core/arch/Default/Settings.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/DirectionWise_replicate.cpp</p><p>gtsam/3rdparty/Eigen/src/Geometry/Rotation2D.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/dogleg.h</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/C_BLAS/C_BLAS_interface.hh</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/Macros.h</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/BLAS/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/HiPerformance.dox</p><p>gtsam/3rdparty/Eigen/bench/btl/COPYING</p><p>gtsam/3rdparty/Eigen/demos/opengl/quaternion_demo.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/StdVector</p><p>gtsam/3rdparty/Eigen/lapack/complex_double.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/SelfAdjointEigenSolver_eigenvectors.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/f77/dmxv.f</p><p>gtsam/3rdparty/Eigen/blas/ztpmv.f</p><p>gtsam/3rdparty/Eigen/cmake/FindUmfpack.cmake</p><p>gtsam/3rdparty/Eigen/cmake/FindBLAS.cmake</p><p>gtsam/3rdparty/Eigen/test/adjoint.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseQR/SparseQR.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_array.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/data/mk_mean_script.sh</p><p>gtsam/3rdparty/Eigen/bench/sparse_dense_product.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/eigen2/main_matmat.cpp</p><p>gtsam/3rdparty/Eigen/blas/testing/zblat2.dat</p><p>gtsam/3rdparty/Eigen/unsupported/test/mpreal.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_bottomLeftCorner_int_int.cpp</p><p>gtsam/3rdparty/Eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_maxnorm.cpp</p><p>gtsam/3rdparty/Eigen/doc/FixedSizeVectorizable.dox</p><p>gtsam/3rdparty/Eigen/doc/snippets/SelfAdjointEigenSolver_SelfAdjointEigenSolver_MatrixType2.cpp</p><p>gtsam/3rdparty/Eigen/doc/C02_TutorialMatrixArithmetic.dox</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/Meta.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/NoAlias.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/Matrix_setIdentity_int_int.cpp</p><p>gtsam/3rdparty/Eigen/bench/spbench/spbench.dtd</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/products/SelfadjointRank2Update.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Householder/Householder.h</p><p>gtsam/3rdparty/Eigen/test/product_selfadjoint.cpp</p><p>gtsam/3rdparty/Eigen/lapack/single.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/SolveTriangular.h</p><p>gtsam/3rdparty/Eigen/src/Core/Transpose.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Householder/BlockHouseholder.h</p><p>gtsam/3rdparty/Eigen/COPYING.LGPL</p><p>gtsam/3rdparty/Eigen/demos/opengl/icosphere.cpp</p><p>gtsam/3rdparty/Eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_broadcast_simple_rowwise.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/arch/NEON/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_reductions_norm.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_MKL.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/SuperLUSupport/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/snippets/Map_outer_stride.cpp</p><p>gtsam/3rdparty/Eigen/src/Eigenvalues/HessenbergDecomposition.h</p><p>gtsam/3rdparty/Eigen/test/dontalign.cpp</p><p>gtsam/3rdparty/CCOLAMD/Source/ccolamd_global.c</p><p>gtsam/3rdparty/Eigen/blas/GeneralRank1Update.h</p><p>gtsam/3rdparty/Eigen/unsupported/doc/examples/PolynomialUtils1.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/data/mk_gnuplot_script.sh</p><p>gtsam/3rdparty/Eigen/unsupported/doc/examples/MatrixSine.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_zero_int.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/CommaInitializer.h</p><p>gtsam/3rdparty/Eigen/Eigen/LU</p><p>gtsam/3rdparty/Eigen/Eigen/src/Geometry/Quaternion.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/Matrix_setConstant_int_int.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/products/SelfadjointProduct.h</p><p>gtsam/3rdparty/Eigen/doc/C08_TutorialGeometry.dox</p><p>gtsam/3rdparty/Eigen/blas/zhpmv.f</p><p>gtsam/3rdparty/Eigen/SVD</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/CholmodSupportLegacy.h</p><p>gtsam/3rdparty/Eigen/src/Geometry/arch/Geometry_SSE.h</p><p>gtsam/3rdparty/Eigen/unsupported/test/sparse_ldlt.cpp</p><p>gtsam/3rdparty/Eigen/test/stdvector_overload.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/IterativeSolvers/Scaling.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/TopicAliasing_block_correct.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/failtest/map_on_const_type_actually_const_0.cpp</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_parametrizedline.cpp</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/Lazy.h</p><p>gtsam/3rdparty/Eigen/unsupported/doc/eigendoxy_layout.xml.in</p><p>gtsam/3rdparty/Eigen/failtest/map_nonconst_ctor_on_const_ptr_1.cpp</p><p>gtsam/3rdparty/Eigen/src/Jacobi/Jacobi.h</p><p>gtsam/3rdparty/Eigen/doc/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/snippets/DenseBase_LinSpaced_seq.cpp</p><p>gtsam/3rdparty/Eigen/blas/Rank2Update.h</p><p>gtsam/3rdparty/Eigen/test/dynalloc.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Sparse/SparseUtil.h</p><p>gtsam/3rdparty/Eigen/test/selfadjoint.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_template_int_bottomRows.cpp</p><p>gtsam/3rdparty/Eigen/doc/examples/class_CwiseUnaryOp.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/STL/STL_interface.hh</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/f77/f77_interface_base.hh</p><p>gtsam/3rdparty/Eigen/Eigen/src/SVD/UpperBidiagonalization.h</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_product_large.cpp</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_smallvectors.cpp</p><p>gtsam/3rdparty/UFconfig/xerbla/xerbla.c</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/eigen3/main_adv.cpp</p><p>gtsam/3rdparty/UFconfig/xerbla/xerbla.f</p><p>gtsam/3rdparty/Eigen/cmake/FindMetis.cmake</p><p>gtsam/3rdparty/Eigen/bench/sparse_product.cpp</p><p>gtsam/3rdparty/Eigen/test/product_trsolve.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_select.cpp</p><p>gtsam/3rdparty/Eigen/doc/TopicAssertions.dox</p><p>gtsam/3rdparty/Eigen/Eigen/Dense</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/arch/SSE/Complex.h</p><p>gtsam/3rdparty/Eigen/debug/gdb/__init__.py</p><p>gtsam/3rdparty/Eigen/COPYING.MPL2</p><p>gtsam/3rdparty/Eigen/Dense</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_minus_equal.cpp</p><p>gtsam/3rdparty/Eigen/debug/gdb/printers.py</p><p>gtsam/3rdparty/Eigen/doc/snippets/Matrix_setConstant_int.cpp</p><p>gtsam/3rdparty/Eigen/doc/examples/class_FixedVectorBlock.cpp</p><p>gtsam/3rdparty/Eigen/doc/TopicMultithreading.dox</p><p>gtsam/3rdparty/Eigen/src/StlSupport/details.h</p><p>gtsam/3rdparty/Eigen/blas/testing/dblat1.f</p><p>gtsam/3rdparty/Eigen/Eigen/src/plugins/CommonCwiseUnaryOps.h</p><p>gtsam/3rdparty/Eigen/src/Core/arch/SSE/Complex.h</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_svd.cpp</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_nomalloc.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_boolean_or.cpp</p><p>gtsam/3rdparty/Eigen/bench/vdw_new.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/eigen3/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/src/Geometry/Homogeneous.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/products/GeneralMatrixMatrix_MKL.h</p><p>gtsam/3rdparty/Eigen/doc/I13_FunctionsTakingEigenTypes.dox</p><p>gtsam/3rdparty/Eigen/test/visitor.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/ComplexEigenSolver_eigenvalues.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/TopicAliasing_mult1.cpp</p><p>gtsam/3rdparty/Eigen/src/Sparse/SparseTriangularView.h</p><p>gtsam/3rdparty/Eigen/Eigen/SparseQR</p><p>gtsam/3rdparty/Eigen/blas/testing/zblat2.f</p><p>gtsam/3rdparty/Eigen/test/sparse_vector.cpp</p><p>gtsam/3rdparty/Eigen/doc/D01_StlContainers.dox</p><p>gtsam/3rdparty/ccolamd/Lib_Makefile.mk</p><p>gtsam/3rdparty/Eigen/doc/examples/Tutorial_ArrayClass_cwise_other.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/Diagonal.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/MatrixFunctionAtomic.h</p><p>gtsam/3rdparty/Eigen/Eigen/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/src/plugins/CommonCwiseBinaryOps.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_setRandom.cpp</p><p>gtsam/3rdparty/Eigen/blas/ctbsv.f</p><p>gtsam/3rdparty/Eigen/Eigen/src/Sparse/SparseTranspose.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/TopicAliasing_mult2.cpp</p><p>gtsam/3rdparty/Eigen/test/resize.cpp</p><p>gtsam/3rdparty/Eigen/doc/CustomizingEigen.dox</p><p>gtsam/3rdparty/Eigen/src/Sparse/AmbiVector.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/PardisoSupport/PardisoSupport.h</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_bug_132.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/QtAlignedMalloc</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/f77/smxm.f</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/Polynomials</p><p>gtsam/3rdparty/Eigen/lapack/dlamch.f</p><p>gtsam/3rdparty/Eigen/QR</p><p>gtsam/3rdparty/Eigen/src/QR/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/PassingByValue.dox</p><p>gtsam/3rdparty/Eigen/doc/snippets/DirectionWise_replicate_int.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_segment_int_int.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/test/FFTW.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/test/sparse_solver.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/r1updt.h</p><p>gtsam/3rdparty/Eigen/cmake/FindGoogleHash.cmake</p><p>gtsam/3rdparty/Eigen/doc/examples/Tutorial_ArrayClass_accessors.cpp</p><p>gtsam/3rdparty/Eigen/src/plugins/MatrixCwiseBinaryOps.h</p><p>gtsam/3rdparty/Eigen/doc/C04_TutorialBlockOperations.dox</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCore/SparseTranspose.h</p><p>gtsam/3rdparty/Eigen/src/Eigenvalues/Makefile.am</p><p>gtsam/3rdparty/UFconfig/README.txt</p><p>gtsam/3rdparty/Eigen/doc/snippets/tut_matrix_assignment_resizing.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/VectorBlock.h</p><p>gtsam/3rdparty/Eigen/doc/Overview.dox</p><p>gtsam/3rdparty/Eigen/test/geo_eulerangles.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/eigen2/main_linear.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/StableNorm.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Sparse/SparseVector.h</p><p>gtsam/3rdparty/Eigen/src/StlSupport/StdList.h</p><p>gtsam/3rdparty/Eigen/doc/PreprocessorDirectives.dox</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_regression.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_row.cpp</p><p>gtsam/3rdparty/Eigen/test/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/BLAS/c_interface_base.h</p><p>gtsam/3rdparty/Eigen/doc/C06_TutorialLinearAlgebra.dox</p><p>gtsam/3rdparty/Eigen/lapack/slarft.f</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_fixedBlock_int_int.cpp</p><p>gtsam/3rdparty/Eigen/doc/examples/QuickStart_example2_dynamic.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/NumericalDiff/NumericalDiff.h</p><p>gtsam/3rdparty/Eigen/src/Core/util/DisableStupidWarnings.h</p><p>gtsam/3rdparty/Eigen/test/mapstride.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/BandMatrix.h</p><p>gtsam/3rdparty/Eigen/test/main.h</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_stdvector.cpp</p><p>gtsam/3rdparty/Eigen/src/Sparse/SparseCwiseUnaryOp.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/Matrix_setRandom_int_int.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseLU/SparseLU_column_dfs.h</p><p>gtsam/3rdparty/Eigen/test/array_for_matrix.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/HouseholderSequence_HouseholderSequence.cpp</p><p>gtsam/3rdparty/Eigen/lapack/dsecnd_NONE.f</p><p>gtsam/3rdparty/Eigen/src/plugins/ArrayCwiseBinaryOps.h</p><p>gtsam/3rdparty/Eigen/src/Geometry/Hyperplane.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/SparseExtra</p><p>gtsam/3rdparty/Eigen/doc/snippets/ComplexEigenSolver_eigenvectors.cpp</p><p>gtsam/3rdparty/Eigen/blas/dtbsv.f</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/MatrixPower.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/TopicStorageOrders_example.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseLU/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/Splines/Spline.h</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/ublas/ublas_interface.hh</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/SparseLDLTLegacy.h</p><p>gtsam/3rdparty/Eigen/src/Core/arch/AltiVec/Complex.h</p><p>gtsam/3rdparty/Eigen/lapack/slamch.f</p><p>gtsam/3rdparty/Eigen/bench/README.txt</p><p>gtsam/3rdparty/Eigen/src/Core/products/GeneralMatrixMatrix.h</p><p>gtsam/3rdparty/Eigen/doc/UnalignedArrayAssert.dox</p><p>gtsam/3rdparty/Eigen/bench/btl/cmake/FindEigen3.cmake</p><p>gtsam/3rdparty/Eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h</p><p>gtsam/3rdparty/Eigen/src/Core/products/TriangularSolverVector.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Sparse/SparseProduct.h</p><p>gtsam/3rdparty/Eigen/Eigen/PaStiXSupport</p><p>gtsam/3rdparty/Eigen/Eigen/src/Sparse/SparseDiagonalProduct.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/LU/FullPivLU.h</p><p>gtsam/3rdparty/Eigen/src/Core/products/SelfadjointMatrixVector.h</p><p>gtsam/3rdparty/Eigen/src/Eigenvalues/RealSchur.h</p><p>gtsam/3rdparty/Eigen/test/sparse.h</p><p>gtsam/3rdparty/Eigen/src/Sparse/SparseRedux.h</p><p>gtsam/3rdparty/UFconfig/UFconfig.h</p><p>gtsam/3rdparty/Eigen/lapack/ilazlr.f</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_sizeof.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineMatrixBase.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/DynamicSparseMatrix.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/IterativeSolvers/IterationController.h</p><p>gtsam/3rdparty/Eigen/src/Core/Diagonal.h</p><p>gtsam/3rdparty/Eigen/src/Core/PermutationMatrix.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_prod.cpp</p><p>gtsam/3rdparty/Eigen/test/eigen2/main.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/SparseLU.h</p><p>gtsam/3rdparty/Eigen/failtest/const_qualified_block_method_retval_0.cpp</p><p>gtsam/3rdparty/Eigen/test/product_large.cpp</p><p>gtsam/3rdparty/Eigen/Array</p><p>gtsam/3rdparty/Eigen/blas/testing/sblat2.dat</p><p>gtsam/3rdparty/Eigen/test/product_syrk.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/SVD</p><p>gtsam/3rdparty/Eigen/doc/snippets/LLT_example.cpp</p><p>gtsam/3rdparty/Eigen/failtest/map_nonconst_ctor_on_const_ptr_2.cpp</p><p>gtsam/3rdparty/Eigen/blas/xerbla.cpp</p><p>gtsam/3rdparty/Eigen/test/geo_alignedbox.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseLU/SparseLU_gemm_kernel.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Geometry/arch/Geometry_SSE.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h</p><p>gtsam/3rdparty/Eigen/demos/mandelbrot/mandelbrot.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/arch/AltiVec/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/TriangularSolver.h</p><p>gtsam/3rdparty/Eigen/blas/complex_double.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/Geometry/Quaternion.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/products/TriangularMatrixMatrix.h</p><p>gtsam/3rdparty/Eigen/demos/opengl/icosphere.h</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/Geometry/Rotation2D.h</p><p>gtsam/3rdparty/Eigen/test/superlu_support.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_random_int_int.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/test/mpreal.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/misc/Image.h</p><p>gtsam/3rdparty/CCOLAMD/Include/ccolamd.h</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/f77/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/test/integer_types.cpp</p><p>gtsam/3rdparty/Eigen/doc/examples/tut_arithmetic_scalar_mul_div.cpp</p><p>gtsam/3rdparty/Eigen/src/SVD/JacobiSVD.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Geometry/ParametrizedLine.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/IterativeLinearSolvers/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/snippets/Tutorial_solve_singular.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Jacobi/Jacobi.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_equal_equal.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/tvmet/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/src/Core/products/Makefile.am</p><p>gtsam/3rdparty/Eigen/test/eigensolver_selfadjoint.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/StemFunction.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/IterativeSolvers/IncompleteLU.h</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/QR.h</p><p>gtsam/3rdparty/Eigen/bench/btl/actions/action_rot.hh</p><p>gtsam/3rdparty/Eigen/unsupported/test/gmres.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/util/Makefile.am</p><p>gtsam/3rdparty/Eigen/doc/snippets/SelfAdjointEigenSolver_operatorInverseSqrt.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_cwiseSqrt.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseLU/SparseLU_pivotL.h</p><p>gtsam/3rdparty/Eigen/doc/examples/tut_matrix_resize.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCore/TriangularSolver.h</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_cwiseop.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/PaStiXSupport/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/util/MKL_support.h</p><p>gtsam/3rdparty/Eigen/src/Geometry/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/src/Core/ArrayWrapper.h</p><p>gtsam/3rdparty/Eigen/src/Core/arch/AltiVec/PacketMath.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Sparse/MappedSparseMatrix.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/EigenSolver_pseudoEigenvectors.cpp</p><p>gtsam/3rdparty/Eigen/blas/dtpsv.f</p><p>gtsam/3rdparty/Eigen/Eigen/src/Sparse/SparseMatrix.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCore/AmbiVector.h</p><p>gtsam/3rdparty/Eigen/failtest/const_qualified_transpose_method_retval.cpp</p><p>gtsam/3rdparty/Eigen/test/sparse_basic.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/Makefile.am</p><p>gtsam/3rdparty/Eigen/src/Core/PlainObjectBase.h</p><p>gtsam/3rdparty/Eigen/src/Cholesky/Makefile.am</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/STL_algo/STL_algo_interface.hh</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/LU.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/MoreVectorization/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/snippets/HouseholderQR_solve.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/QR.h</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_geometry.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/Matrix_resize_int.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/util/ReenableStupidWarnings.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/Geometry/AlignedBox.h</p><p>gtsam/3rdparty/Eigen/lapack/clarft.f</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/products/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/demos/mandelbrot/mandelbrot.h</p><p>gtsam/3rdparty/Eigen/bench/spbench/test_sparseLU.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/ProductBase.h</p><p>gtsam/3rdparty/Eigen/src/Core/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_product_small.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/Geometry/Scaling.h</p><p>gtsam/3rdparty/Eigen/Geometry</p><p>gtsam/3rdparty/Eigen/doc/examples/Tutorial_BlockOperations_corner.cpp</p><p>gtsam/3rdparty/Eigen/StdVector</p><p>gtsam/3rdparty/Eigen/doc/snippets/FullPivLU_kernel.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/plugins/CommonCwiseBinaryOps.h</p><p>gtsam/3rdparty/Eigen/lapack/lu.cpp</p><p>gtsam/3rdparty/Eigen/doc/eigendoxy_layout.xml.in</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/Stride.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_qr.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/arch/Default/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/unsupported/test/matrix_square_root.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCore/SparseDenseProduct.h</p><p>gtsam/3rdparty/Eigen/LGPL</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/C_BLAS/blas.h</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/Geometry/Hyperplane.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/PlainObjectBase.h</p><p>gtsam/3rdparty/Eigen/blas/PackedTriangularSolverVector.h</p><p>gtsam/3rdparty/Eigen/src/Core/CwiseBinaryOp.h</p><p>gtsam/3rdparty/Eigen/unsupported/doc/examples/MatrixLogarithm.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/Tutorial_AdvancedInitialization_CommaTemporary.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_array_const.cpp</p><p>gtsam/3rdparty/Eigen/cmake/RegexUtils.cmake</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_visitor.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/test/matrix_exponential.cpp</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/Geometry/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/examples/TutorialLinAlgComputeTwice.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/KroneckerProduct/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/scripts/eigen_gen_docs</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineProduct.h</p><p>gtsam/3rdparty/Eigen/bench/btl/generic_bench/timers/STL_perf_analyzer.hh</p><p>gtsam/3rdparty/Eigen/blas/testing/dblat2.f</p><p>gtsam/3rdparty/Eigen/src/QR/Makefile.am</p><p>gtsam/3rdparty/Eigen/doc/I09_Vectorization.dox</p><p>gtsam/3rdparty/Eigen/test/pardiso_support.cpp</p><p>gtsam/3rdparty/Eigen/doc/TutorialSparse_example_details.dox</p><p>gtsam/3rdparty/Eigen/src/Sparse/SparseUtil.h</p><p>gtsam/3rdparty/Eigen/src/Core/ReturnByValue.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/AdolcForward</p><p>gtsam/3rdparty/Eigen/src/Core/util/BlasUtil.h</p><p>gtsam/3rdparty/Eigen/blas/dtbmv.f</p><p>gtsam/3rdparty/Eigen/failtest/block_nonconst_ctor_on_const_xpr_2.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/SelfAdjointView.h</p><p>gtsam/3rdparty/Eigen/test/sparseLM.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/eigen2/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/IO.h</p><p>gtsam/3rdparty/Eigen/doc/examples/tut_matrix_coefficient_accessors.cpp</p><p>gtsam/3rdparty/Eigen/failtest/failtest_sanity_check.cpp</p><p>gtsam/3rdparty/Eigen/lapack/zladiv.f</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/f77/sata.f</p><p>gtsam/3rdparty/Eigen/doc/snippets/ComplexEigenSolver_compute.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/arch/AltiVec/Complex.h</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_dynalloc.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_computeInverseWithCheck.cpp</p><p>gtsam/3rdparty/Eigen/StdList</p><p>gtsam/3rdparty/Eigen/unsupported/test/forward_adolc.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/LevenbergMarquardt/LMcovar.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Geometry/Rotation2D.h</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_determinant.cpp</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/Geometry/Quaternion.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/CwiseNullaryOp.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/RealSchur_compute.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/Array.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Cholesky/LLT_MKL.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseLU/SparseLU_pruneL.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Geometry/AngleAxis.h</p><p>gtsam/3rdparty/Eigen/bench/btl/actions/action_atv_product.hh</p><p>gtsam/3rdparty/Eigen/bench/btl/generic_bench/timers/portable_perf_analyzer_old.hh</p><p>gtsam/3rdparty/Eigen/doc/special_examples/Tutorial_sparse_example.cpp</p><p>gtsam/3rdparty/Eigen/bench/benchEigenSolver.cpp</p><p>gtsam/3rdparty/ccolamd/UFconfig.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/Tutorial_AdvancedInitialization_ThreeWays.cpp</p><p>gtsam/3rdparty/Eigen/test/determinant.cpp</p><p>gtsam/3rdparty/Eigen/bench/spbench/spbenchsolver.h</p><p>gtsam/3rdparty/Eigen/test/sparse_solvers.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/IterativeSolvers/DGMRES.h</p><p>gtsam/3rdparty/Eigen/scripts/buildtests.in</p><p>gtsam/3rdparty/Eigen/scripts/debug.in</p><p>gtsam/3rdparty/Eigen/doc/snippets/ComplexSchur_compute.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_identity_int_int.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/IterativeSolvers</p><p>gtsam/3rdparty/Eigen/blas/testing/sblat3.dat</p><p>gtsam/3rdparty/Eigen/Eigen/src/Sparse/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCore/SparseRedux.h</p><p>gtsam/3rdparty/Eigen/src/Core/SelfCwiseBinaryOp.h</p><p>gtsam/3rdparty/Eigen/lapack/slarf.f</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/blitz/btl_blitz.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/ublas/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCore/SparsePermutation.h</p><p>gtsam/3rdparty/Eigen/lapack/second_NONE.f</p><p>gtsam/3rdparty/Eigen/Eigen/src/Sparse/SparseFuzzy.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/ArrayBase.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/Matrix.h</p><p>gtsam/3rdparty/Eigen/src/Core/products/SelfadjointMatrixMatrix.h</p><p>gtsam/3rdparty/Eigen/doc/I05_FixedSizeVectorizable.dox</p><p>gtsam/3rdparty/Eigen/Eigen/OrderingMethods</p><p>gtsam/3rdparty/Eigen/src/Core/NestByValue.h</p><p>gtsam/3rdparty/Eigen/Eigen/Core</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/STL/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/test/cholesky.cpp</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/LU.h</p><p>gtsam/3rdparty/Eigen/Householder</p><p>gtsam/3rdparty/Eigen/doc/D03_WrongStackAlignment.dox</p><p>gtsam/3rdparty/Eigen/Eigen/src/LU/PartialPivLU_MKL.h</p><p>gtsam/3rdparty/ccolamd/UFconfig.c</p><p>gtsam/3rdparty/Eigen/cmake/FindGSL.cmake</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/eigen2/main_adv.cpp</p><p>gtsam/3rdparty/Eigen/bench/bench_sum.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/Dot.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/tut_arithmetic_redux_minmax.cpp</p><p>gtsam/3rdparty/Eigen/test/sizeoverflow.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/SimplicialCholesky.h</p><p>gtsam/3rdparty/Eigen/test/redux.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/test/jacobisvd.cpp</p><p>gtsam/3rdparty/Eigen/doc/C03_TutorialArrayClass.dox</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/eigen3/btl_tiny_eigen3.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCore/SparseSelfAdjointView.h</p><p>gtsam/3rdparty/Eigen/src/Core/products/TriangularMatrixMatrix.h</p><p>gtsam/3rdparty/Eigen/bench/btl/cmake/FindATLAS.cmake</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/RealSchur_RealSchur_MatrixType.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_cwiseMax.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/SVD/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseLU/SparseLU_Utils.h</p><p>gtsam/3rdparty/Eigen/test/denseLM.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/IterativeSolvers/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/arch/Default/Settings.h</p><p>gtsam/3rdparty/Eigen/test/householder.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/Solve.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/Tutorial_Map_using.cpp</p><p>gtsam/3rdparty/Eigen/doc/examples/DenseBase_middleCols_int.cpp</p><p>gtsam/3rdparty/Eigen/demos/mandelbrot/README</p><p>gtsam/3rdparty/Eigen/doc/QuickStartGuide.dox</p><p>gtsam/3rdparty/Eigen/test/first_aligned.cpp</p><p>gtsam/3rdparty/Eigen/src/Jacobi/Makefile.am</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/blitz/blitz_interface.hh</p><p>gtsam/3rdparty/Eigen/failtest/map_nonconst_ctor_on_const_ptr_3.cpp</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_qtvector.cpp</p><p>gtsam/3rdparty/Eigen/bench/benchmark.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/mtl4/main.cpp</p><p>gtsam/3rdparty/Eigen/test/stdlist.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/test/polynomialsolver.cpp</p><p>gtsam/3rdparty/Eigen/blas/zhbmv.f</p><p>gtsam/3rdparty/Eigen/test/cholmod_support.cpp</p><p>gtsam/3rdparty/Eigen/src/Geometry/arch/Makefile.am</p><p>gtsam/3rdparty/Eigen/src/Core/Swap.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCore/SparseColEtree.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_ones_int_int.cpp</p><p>gtsam/3rdparty/Eigen/lapack/dlapy2.f</p><p>gtsam/3rdparty/Eigen/blas/testing/sblat1.f</p><p>gtsam/3rdparty/Eigen/cmake/FindSuperLU.cmake</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_first_aligned.cpp</p><p>gtsam/3rdparty/Eigen/blas/testing/sblat3.f</p><p>gtsam/3rdparty/Eigen/unsupported/test/BVH.cpp</p><p>gtsam/3rdparty/Eigen/bench/basicbenchmark.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/Tutorial_commainit_01b.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_isOnes.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/ArrayWrapper.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_end_int.cpp</p><p>gtsam/3rdparty/Eigen/failtest/diagonal_on_const_type_actually_const.cpp</p><p>gtsam/3rdparty/Eigen/src/Geometry/Quaternion.h</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/hand_vec/hand_vec_interface.hh</p><p>gtsam/3rdparty/Eigen/Eigen</p><p>gtsam/3rdparty/CCOLAMD/README.txt</p><p>gtsam/3rdparty/Eigen/doc/snippets/Tutorial_Map_rowmajor.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/BLAS/blas_interface_impl.hh</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/SelfAdjointView.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/util/ReenableStupidWarnings.h</p><p>gtsam/3rdparty/Eigen/Eigen/Sparse</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/CholmodSupport.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/SVD/JacobiSVD.h</p><p>gtsam/3rdparty/Eigen/blas/testing/cblat2.f</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/FFT</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseLU/SparseLU_panel_dfs.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/Select.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/ColPivHouseholderQR_solve.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/test/sparse_extra.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/Redux.h</p><p>gtsam/3rdparty/Eigen/bench/bench_unrolling</p><p>gtsam/3rdparty/Eigen/bench/sparse_setter.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/cmake/FindGOTO2.cmake</p><p>gtsam/3rdparty/Eigen/unsupported/test/sparse_llt.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_diagonal_int.cpp</p><p>gtsam/3rdparty/Eigen/lapack/zlarfg.f</p><p>gtsam/3rdparty/Eigen/doc/snippets/tut_arithmetic_transpose_inplace.cpp</p><p>gtsam/3rdparty/Eigen/doc/QuickReference.dox</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/Splines/SplineFitting.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Geometry/Scaling.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseLU/SparseLU_Memory.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/PartialRedux_minCoeff.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/Tridiagonalization_diagonal.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/BLAS/blas_interface.hh</p><p>gtsam/3rdparty/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/Geometry/AngleAxis.h</p><p>gtsam/3rdparty/Eigen/blas/dtpmv.f</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/Geometry/Translation.h</p><p>gtsam/3rdparty/Eigen/src/Core/Matrix.h</p><p>gtsam/3rdparty/Eigen/debug/msvc/eigen.natvis</p><p>gtsam/3rdparty/Eigen/unsupported/test/openglsupport.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_operatorNorm.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/BandMatrix.h</p><p>gtsam/3rdparty/Eigen/unsupported/doc/examples/MatrixPower_optimal.cpp</p><p>gtsam/3rdparty/Eigen/failtest/diagonal_nonconst_ctor_on_const_xpr.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/Tutorial_commainit_02.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/TriangularMatrix.h</p><p>gtsam/3rdparty/Eigen/src/Jacobi/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/I08_Resizing.dox</p><p>gtsam/3rdparty/Eigen/bench/bench_norm.cpp</p><p>gtsam/3rdparty/Eigen/src/Cholesky/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCore/MappedSparseMatrix.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/UmfPackSupport</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_set.cpp</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_mixingtypes.cpp</p><p>gtsam/3rdparty/Eigen/bench/basicbenchmark.h</p><p>gtsam/3rdparty/UFconfig/xerbla/xerbla.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigenvalues/ComplexSchur.h</p><p>gtsam/3rdparty/Eigen/blas/complex_single.cpp</p><p>gtsam/3rdparty/Eigen/lapack/ilaclc.f</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_template_int_start.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/HessenbergDecomposition_packedMatrix.cpp</p><p>gtsam/3rdparty/Eigen/blas/srotm.f</p><p>gtsam/3rdparty/Eigen/doc/snippets/DenseBase_LinSpaced.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/HessenbergDecomposition_matrixH.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/UmfPackSupport/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/snippets/.krazy</p><p>gtsam/3rdparty/Eigen/test/inverse.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/Tridiagonalization_decomposeInPlace.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/generic_bench/utils/size_log.hh</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseLU/SparseLU_panel_bmod.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Sparse/SparseTriangularView.h</p><p>gtsam/3rdparty/Eigen/test/geo_quaternion.cpp</p><p>gtsam/3rdparty/Eigen/CTestConfig.cmake</p><p>gtsam/3rdparty/Eigen/Eigen/src/Geometry/OrthoMethods.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/Minor.h</p><p>gtsam/3rdparty/Eigen/doc/A05_PortingFrom2To3.dox</p><p>gtsam/3rdparty/Eigen/bench/btl/actions/action_lu_solve.hh</p><p>gtsam/3rdparty/Eigen/bench/benchGeometry.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/MatrixFunction.h</p><p>gtsam/3rdparty/Eigen/bench/btl/actions/action_ata_product.hh</p><p>gtsam/3rdparty/Eigen/bench/geometry.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/blitz/blitz_LU_solve_interface.hh</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/AutoDiff/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/src/plugins/BlockMethods.h</p><p>gtsam/3rdparty/CCOLAMD/Doc/lesser.txt</p><p>gtsam/3rdparty/Eigen/src/misc/Solve.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/BVH/KdBVH.h</p><p>gtsam/3rdparty/Eigen/src/Core/MatrixBase.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_isDiagonal.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/VectorBlock.h</p><p>gtsam/3rdparty/CCOLAMD/MATLAB/csymamd.m</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/NumTraits.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/IterativeSolvers/MINRES.h</p><p>gtsam/3rdparty/Eigen/test/eigensolver_generalized_real.cpp</p><p>gtsam/3rdparty/Eigen/lapack/zlacgv.f</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_swap.cpp</p><p>gtsam/3rdparty/Eigen/eigen3.pc.in</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h</p><p>gtsam/3rdparty/CCOLAMD/Demo/ccolamd_example.out</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/blitz/btl_tiny_blitz.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/ComplexSchur_matrixT.cpp</p><p>gtsam/3rdparty/Eigen/doc/SparseLinearSystems.dox</p><p>gtsam/3rdparty/Eigen/doc/examples/QuickStart_example.cpp</p><p>gtsam/3rdparty/Eigen/test/swap.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/AngleAxis_mimic_euler.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/generic_bench/static/bench_static.hh</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_computeInverseAndDetWithCheck.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/arch/SSE/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/bench/spbench/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/test/eigen2/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/Replicate.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/QR/HouseholderQR_MKL.h</p><p>gtsam/3rdparty/Eigen/src/Core/products/CoeffBasedProduct.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/SVD</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_isZero.cpp</p><p>gtsam/3rdparty/Eigen/doc/C09_TutorialSparse.dox</p><p>gtsam/3rdparty/Eigen/unsupported/test/autodiff.cpp</p><p>gtsam/3rdparty/Eigen/doc/examples/class_FixedBlock.cpp</p><p>gtsam/3rdparty/Eigen/src/Geometry/AngleAxis.h</p><p>gtsam/3rdparty/Eigen/test/miscmatrices.cpp</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_unalignedassert.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/LLT_solve.cpp</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/SVD.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/Tutorial_commainit_01.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_greater.cpp</p><p>gtsam/3rdparty/Eigen/lapack/ilaslc.f</p><p>gtsam/3rdparty/Eigen/doc/examples/Tutorial_simple_example_dynamic_size.cpp</p><p>gtsam/3rdparty/Eigen/src/misc/Makefile.am</p><p>gtsam/3rdparty/Eigen/src/Core/EigenBase.h</p><p>gtsam/3rdparty/Eigen/doc/examples/tut_matrix_resize_fixed_size.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/cmake/FindACML.cmake</p><p>gtsam/3rdparty/Eigen/doc/eigendoxy_footer.html.in</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/eigen3/eigen3_interface.hh</p><p>gtsam/3rdparty/Eigen/doc/TutorialReductionsVisitorsBroadcasting.dox</p><p>gtsam/3rdparty/Eigen/src/Core/CwiseNullaryOp.h</p><p>gtsam/3rdparty/Eigen/bench/btl/cmake/FindMTL4.cmake</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/Geometry/Translation.h</p><p>gtsam/3rdparty/Eigen/bench/btl/actions/action_ger.hh</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/products/TriangularSolverVector.h</p><p>gtsam/3rdparty/Eigen/bench/btl/README</p><p>gtsam/3rdparty/Eigen/src/Core/arch/SSE/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/examples/DenseBase_template_int_middleCols.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/arch/AltiVec/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_template_int_int_topRightCorner.cpp</p><p>gtsam/3rdparty/Eigen/src/Sparse/SparseTranspose.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/util/NonMPL2.h</p><p>gtsam/3rdparty/Eigen/src/Sparse/SparseDot.h</p><p>gtsam/3rdparty/Eigen/failtest/block_on_const_type_actually_const_1.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/KroneckerProduct/KroneckerTensorProduct.h</p><p>gtsam/3rdparty/Eigen/bench/btl/cmake/FindCBLAS.cmake</p><p>gtsam/3rdparty/Eigen/src/Geometry/Translation.h</p><p>gtsam/3rdparty/Eigen/doc/examples/TutorialLinAlgExSolveLDLT.cpp</p><p>gtsam/3rdparty/Eigen/bench/benchVecAdd.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/Functors.h</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/C_BLAS/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_template_int_int_block_int_int_int_int.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/MatrixStorage.h</p><p>gtsam/3rdparty/Eigen/src/StlSupport/StdDeque.h</p><p>gtsam/3rdparty/Eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_broadcast_simple.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/generic_bench/init/init_function.hh</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/lmpar.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_all.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/arch/SSE/PacketMath.h</p><p>gtsam/3rdparty/Eigen/lapack/slapy3.f</p><p>gtsam/3rdparty/Eigen/unsupported/test/dgmres.cpp</p><p>gtsam/3rdparty/Eigen/blas/sspr.f</p><p>gtsam/3rdparty/Eigen/Eigen/src/UmfPackSupport/UmfPackSupport.h</p><p>gtsam/3rdparty/Eigen/doc/D09_StructHavingEigenMembers.dox</p><p>gtsam/3rdparty/Eigen/test/zerosized.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_asin.cpp</p><p>gtsam/3rdparty/Eigen/blas/single.cpp</p><p>gtsam/3rdparty/Eigen/doc/examples/TemplateKeyword_simple.cpp</p><p>gtsam/3rdparty/UFconfig/UFconfig.c</p><p>gtsam/3rdparty/Eigen/test/geo_hyperplane.cpp</p><p>gtsam/3rdparty/Eigen/doc/A10_Eigen2SupportModes.dox</p><p>gtsam/3rdparty/Eigen/src/Sparse/SparseFuzzy.h</p><p>gtsam/3rdparty/Eigen/bench/btl/actions/action_matrix_matrix_product.hh</p><p>gtsam/3rdparty/Eigen/Eigen/src/plugins/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/unsupported/test/matrix_functions.h</p><p>gtsam/3rdparty/Eigen/blas/PackedTriangularMatrixVector.h</p><p>gtsam/3rdparty/Eigen/test/conservative_resize.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_setOnes.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_isOrthogonal.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCholesky/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/Eigen/src/Geometry/Homogeneous.h</p><p>gtsam/3rdparty/Eigen/test/unalignedcount.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/mtl4/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/src/misc/Image.h</p><p>gtsam/3rdparty/Eigen/src/Core/DiagonalProduct.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Cholesky/LLT.h</p><p>gtsam/3rdparty/Eigen/doc/TutorialMatrixArithmetic.dox</p><p>gtsam/3rdparty/Eigen/LeastSquares</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/src/Core/arch/Makefile.am</p><p>gtsam/3rdparty/Eigen/src/misc/Kernel.h</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_inverse.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/NoAlias.h</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/mtl4/mtl4_interface.hh</p><p>gtsam/3rdparty/Eigen/Eigen/src/Householder/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/Eigen/src/LU/Determinant.h</p><p>gtsam/3rdparty/Eigen/lapack/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/demos/opengl/gpuhelper.cpp</p><p>gtsam/3rdparty/ccolamd/UFconfig.mk</p><p>gtsam/3rdparty/Eigen/test/qtvector.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/eigen3/main_linear.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/Block.h</p><p>gtsam/3rdparty/Eigen/Eigen/Jacobi</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigenvalues/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/examples/tut_arithmetic_add_sub.cpp</p><p>gtsam/3rdparty/Eigen/demos/opengl/camera.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/arch/SSE/MathFunctions.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_abs.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/data/perlib_plot_settings.txt</p><p>gtsam/3rdparty/Eigen/blas/dspr.f</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_cwiseAbs.cpp</p><p>gtsam/3rdparty/Eigen/test/product_symm.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/QR</p><p>gtsam/3rdparty/Eigen/Eigen/src/Geometry/AlignedBox.h</p><p>gtsam/3rdparty/Eigen/bench/btl/generic_bench/timers/STL_timer.hh</p><p>gtsam/3rdparty/Eigen/src/Sparse/SparseMatrixBase.h</p><p>gtsam/3rdparty/Eigen/unsupported/doc/examples/PolynomialSolver1.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/products/TriangularMatrixVector_MKL.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/PartialRedux_squaredNorm.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/NonLinearOptimization</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/f77/saat.f</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigenvalues/RealQZ.h</p><p>gtsam/3rdparty/Eigen/src/Geometry/arch/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/snippets/EigenSolver_eigenvalues.cpp</p><p>gtsam/3rdparty/Eigen/doc/examples/.krazy</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_extract.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/Geometry/ParametrizedLine.h</p><p>gtsam/3rdparty/Eigen/src/Core/DenseCoeffsBase.h</p><p>gtsam/3rdparty/Eigen/cmake/FindStandardMathLibrary.cmake</p><p>gtsam/3rdparty/Eigen/src/Core/Reverse.h</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/f77/dmxm.f</p><p>gtsam/3rdparty/Eigen/Core</p><p>gtsam/3rdparty/Eigen/doc/I06_TopicEigenExpressionTemplates.dox</p><p>gtsam/3rdparty/Eigen/doc/examples/Tutorial_BlockOperations_print_block.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/DiagonalProduct.h</p><p>gtsam/3rdparty/Eigen/doc/examples/DenseBase_template_int_middleRows.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_col.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/products/TriangularSolverMatrix.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_zero_int_int.cpp</p><p>gtsam/3rdparty/Eigen/blas/chbmv.f</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_meta.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/DenseBase_setLinSpaced.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigenvalues/RealSchur.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h</p><p>gtsam/3rdparty/Eigen/doc/examples/Tutorial_ArrayClass_interop_matrix.cpp</p><p>gtsam/3rdparty/Eigen/lapack/clarfg.f</p><p>gtsam/3rdparty/Eigen/test/geo_homogeneous.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/TriangularMatrix.h</p><p>gtsam/3rdparty/Eigen/blas/testing/runblastest.sh</p><p>gtsam/3rdparty/Eigen/doc/snippets/IOFormat.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/Swap.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/Map_inner_stride.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h</p><p>gtsam/3rdparty/Eigen/bench/btl/generic_bench/static/intel_bench_fixed_size.hh</p><p>gtsam/3rdparty/Eigen/Eigen/SuperLUSupport</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_abs2.cpp</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_miscmatrices.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/test/alignedvector3.cpp</p><p>gtsam/3rdparty/Eigen/doc/B01_Experimental.dox</p><p>gtsam/3rdparty/Eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_colwise.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/test/NumericalDiff.cpp</p><p>gtsam/3rdparty/Eigen/CTestCustom.cmake.in</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_basicstuff.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/RandomSetter.h</p><p>gtsam/3rdparty/Eigen/signature_of_eigen3_matrix_library</p><p>gtsam/3rdparty/Eigen/src/Core/util/Macros.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_rightCols_int.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/Cwise.h</p><p>gtsam/3rdparty/Eigen/blas/ztpsv.f</p><p>gtsam/3rdparty/CCOLAMD/MATLAB/ccolamdtestmex.c</p><p>gtsam/3rdparty/Eigen/src/Householder/BlockHouseholder.h</p><p>gtsam/3rdparty/CCOLAMD/MATLAB/ccolamdtestmex.m</p><p>gtsam/3rdparty/Eigen/doc/eigendoxy_header.html.in</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/Geometry/AlignedBox.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_template_int_int_bottomLeftCorner.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/util/Constants.h</p><p>gtsam/3rdparty/Eigen/failtest/map_nonconst_ctor_on_const_ptr_0.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/Tridiagonalization_compute.cpp</p><p>gtsam/3rdparty/CCOLAMD/Doc/ChangeLog</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/Skyline/SkylineInplaceLU.h</p><p>gtsam/3rdparty/Eigen/bench/check_cache_queries.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/eigen2/btl_tiny_eigen2.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_marked.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_adjoint.cpp</p><p>gtsam/3rdparty/Eigen/test/smallvectors.cpp</p><p>gtsam/3rdparty/CCOLAMD/MATLAB/ccolamd_make.m</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/LevenbergMarquardt/LMpar.h</p><p>gtsam/3rdparty/Eigen/test/conjugate_gradient.cpp</p><p>gtsam/3rdparty/Eigen/doc/TutorialLinearAlgebra.dox</p><p>gtsam/3rdparty/Eigen/doc/examples/tut_arithmetic_matrix_mul.cpp</p><p>gtsam/3rdparty/Eigen/doc/unsupported_modules.dox</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_not_equal.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h</p><p>gtsam/3rdparty/Eigen/doc/TutorialAdvancedInitialization.dox</p><p>gtsam/3rdparty/Eigen/Eigen/src/Sparse/TriangularSolver.h</p><p>gtsam/3rdparty/Eigen/cmake/FindCholmod.cmake</p><p>gtsam/3rdparty/Eigen/test/stddeque.cpp</p><p>gtsam/3rdparty/Eigen/doc/examples/class_Block.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/chkder.h</p><p>gtsam/3rdparty/Eigen/bench/btl/generic_bench/bench_parameter.hh</p><p>gtsam/3rdparty/Eigen/src/Core/MathFunctions.h</p><p>gtsam/3rdparty/Eigen/lapack/slarfg.f</p><p>gtsam/3rdparty/Eigen/doc/examples/MatrixBase_cwise_const.cpp</p><p>gtsam/3rdparty/Eigen/src/Householder/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/bench/btl/generic_bench/bench.hh</p><p>gtsam/3rdparty/Eigen/src/Core/VectorBlock.h</p><p>gtsam/3rdparty/Eigen/bench/btl/generic_bench/static/static_size_generator.hh</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/util/Memory.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_transpose.cpp</p><p>gtsam/3rdparty/Eigen/blas/testing/zblat3.f</p><p>gtsam/3rdparty/Eigen/unsupported/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/src/Core/arch/AltiVec/Makefile.am</p><p>gtsam/3rdparty/Eigen/src/SVD/Makefile.am</p><p>gtsam/3rdparty/Eigen/src/Core/Flagged.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/MapBase.h</p><p>gtsam/3rdparty/Eigen/src/LU/Makefile.am</p><p>gtsam/3rdparty/Eigen/blas/sspr2.f</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_template_int_segment.cpp</p><p>gtsam/3rdparty/Eigen/bench/quatmul.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/f77/saxpy.f</p><p>gtsam/3rdparty/Eigen/scripts/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/src/Core/products/GeneralBlockPanelKernel.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/Polynomials/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/test/array_reverse.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/Map.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/AutoDiff</p><p>gtsam/3rdparty/Eigen/blas/stpsv.f</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/DenseBase.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_pow.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/TopicAliasing_mult3.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Sparse/SparseRedux.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/Geometry/Transform.h</p><p>gtsam/3rdparty/Eigen/bench/btl/actions/action_matrix_matrix_product_bis.hh</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/Geometry/All.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/QR/HouseholderQR.h</p><p>gtsam/3rdparty/Eigen/bench/btl/generic_bench/utils/size_lin_log.hh</p><p>gtsam/3rdparty/Eigen/unsupported/test/FFT.cpp</p><p>gtsam/3rdparty/Eigen/cmake/language_support.cmake</p><p>gtsam/3rdparty/Eigen/Eigen/src/LU/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/Eigen/StdDeque</p><p>gtsam/3rdparty/Eigen/Eigen/src/misc/blas.h</p><p>gtsam/3rdparty/Eigen/unsupported/doc/examples/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/C_BLAS/cblas.h</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_array.cpp</p><p>gtsam/3rdparty/Eigen/doc/SparseQuickReference.dox</p><p>gtsam/3rdparty/Eigen/doc/snippets/PartialPivLU_solve.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/doc/examples/MatrixPower.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_colwise.cpp</p><p>gtsam/3rdparty/Eigen/src/LU/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/examples/class_CwiseUnaryOp_ptrfun.cpp</p><p>gtsam/3rdparty/Eigen/src/Sparse/SparseProduct.h</p><p>gtsam/3rdparty/Eigen/src/Core/products/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/src/Core/util/Meta.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/Splines/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/blas/ztbsv.f</p><p>gtsam/3rdparty/Eigen/failtest/transpose_nonconst_ctor_on_const_xpr.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Geometry/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/Lazy.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/PartialRedux_sum.cpp</p><p>gtsam/3rdparty/Eigen/cmake/FindGLEW.cmake</p><p>gtsam/3rdparty/Eigen/src/LU/Determinant.h</p><p>gtsam/3rdparty/Eigen/src/SVD/UpperBidiagonalization.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h</p><p>gtsam/3rdparty/Eigen/unsupported/test/svd_common.h</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/Geometry/Makefile.am</p><p>gtsam/3rdparty/Eigen/bench/btl/data/mk_new_gnuplot.sh</p><p>gtsam/3rdparty/Eigen/test/commainitializer.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/Matrix_resize_NoChange_int.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/Tridiagonalization_householderCoefficients.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/TopicAliasing_block.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/HouseholderQR_householderQ.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/BVH/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/Eigen/src/misc/Kernel.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/MPRealSupport</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_topLeftCorner_int_int.cpp</p><p>gtsam/3rdparty/Eigen/doc/I07_TopicScalarTypes.dox</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_rowwise.cpp</p><p>gtsam/3rdparty/Eigen/doc/TopicEigenExpressionTemplates.dox</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_adjoint.cpp</p><p>gtsam/3rdparty/Eigen/test/metis_support.cpp</p><p>gtsam/3rdparty/Eigen/test/eigen2/testsuite.cmake</p><p>gtsam/3rdparty/Eigen/lapack/clarfb.f</p><p>gtsam/3rdparty/Eigen/test/mapstaticmethods.cpp</p><p>gtsam/3rdparty/Eigen/src/Householder/Householder.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/MatrixMarketIterator.h</p><p>gtsam/3rdparty/Eigen/lapack/clarf.f</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseLU/SparseLUImpl.h</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/f77/f77_interface.hh</p><p>gtsam/3rdparty/Eigen/scripts/relicense.py</p><p>gtsam/3rdparty/Eigen/src/Eigenvalues/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/cmake/EigenDetermineVSServicePack.cmake</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/Geometry/Scaling.h</p><p>gtsam/3rdparty/Eigen/unsupported/test/matrix_function.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/data/regularize.cxx</p><p>gtsam/3rdparty/Eigen/src/LU/arch/Inverse_SSE.h</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/BLAS/main.cpp</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_cholesky.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_cos.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/MatrixFunctions</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/LevenbergMarquardt/LMqrsolv.h</p><p>gtsam/3rdparty/Eigen/doc/I15_StorageOrders.dox</p><p>gtsam/3rdparty/Eigen/cmake/EigenDetermineOSVersion.cmake</p><p>gtsam/3rdparty/Eigen/bench/eig33.cpp</p><p>gtsam/3rdparty/Eigen/lapack/sladiv.f</p><p>gtsam/3rdparty/Eigen/unsupported/test/levenberg_marquardt.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/StlSupport/StdDeque.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/products/SelfadjointProduct.h</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/C/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_reverse.cpp</p><p>gtsam/3rdparty/Eigen/src/Geometry/Makefile.am</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCore/CompressedStorage.h</p><p>gtsam/3rdparty/Eigen/src/Sparse/MappedSparseMatrix.h</p><p>gtsam/3rdparty/Eigen/test/eigen2/gsl_helper.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/EigenSolver_EigenSolver_MatrixType.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/products/TriangularMatrixVector.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Sparse/SparseSelfAdjointView.h</p><p>gtsam/3rdparty/Eigen/bench/basicbench.cxxlist</p><p>gtsam/3rdparty/Eigen/bench/btl/cmake/FindPackageHandleStandardArgs.cmake</p><p>gtsam/3rdparty/Eigen/src/Core/arch/Default/Makefile.am</p><p>gtsam/3rdparty/Eigen/unsupported/test/mpreal/mpreal.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_block_int_int.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/CholmodSupport</p><p>gtsam/3rdparty/Eigen/doc/I12_ClassHierarchy.dox</p><p>gtsam/3rdparty/Eigen/src/Sparse/SparseDenseProduct.h</p><p>gtsam/3rdparty/Eigen/test/stdvector.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/doc/examples/MatrixFunction.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/plugins/BlockMethods.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/SVD/doneInBDCSVD.txt</p><p>gtsam/3rdparty/Eigen/src/LU/arch/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_hyperplane.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/Tutorial_solve_triangular_inplace.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/bench/bench_svd.cpp</p><p>gtsam/3rdparty/Eigen/doc/TopicLazyEvaluation.dox</p><p>gtsam/3rdparty/Eigen/test/nesting_ops.cpp</p><p>gtsam/3rdparty/Eigen/src/StlSupport/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/test/diagonalmatrices.cpp</p><p>gtsam/3rdparty/Eigen/test/gsl_helper.h</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/tvmet/main.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/Eigen</p><p>gtsam/3rdparty/Eigen/demos/opengl/quaternion_demo.h</p><p>gtsam/3rdparty/Eigen/.hgeol</p><p>gtsam/3rdparty/Eigen/doc/TutorialMatrixClass.dox</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/FullPivLU_image.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCore/SparseView.h</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/VectorBlock.h</p><p>gtsam/3rdparty/Eigen/demos/opengl/trackball.cpp</p><p>gtsam/3rdparty/Eigen/test/qr_colpivoting.cpp</p><p>gtsam/3rdparty/Eigen/bench/sparse_transpose.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/Matrix_setZero_int_int.cpp</p><p>gtsam/3rdparty/Eigen/src/QR/ColPivHouseholderQR.h</p><p>gtsam/3rdparty/Eigen/bench/bench_gemm.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/QR/ColPivHouseholderQR_MKL.h</p><p>gtsam/3rdparty/Eigen/unsupported/doc/examples/FFT.cpp</p><p>gtsam/3rdparty/Eigen/lapack/zlarf.f</p><p>gtsam/3rdparty/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/arch/AltiVec/PacketMath.h</p><p>gtsam/3rdparty/CCOLAMD/Demo/my_ccolamd_l_example.out</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_cast.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigenvalues/EigenSolver.h</p><p>gtsam/3rdparty/ccolamd/ccolamd_Makefile.mk</p><p>gtsam/3rdparty/Eigen/doc/snippets/Jacobi_makeGivens.cpp</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/STL_algo/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigenvalues/ComplexEigenSolver.h</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_sum.cpp</p><p>gtsam/3rdparty/Eigen/lapack/complex_single.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigenvalues/HessenbergDecomposition.h</p><p>gtsam/3rdparty/Eigen/doc/eigendoxy_tabs.css</p><p>gtsam/3rdparty/Eigen/bench/benchFFT.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/DenseStorage.h</p><p>gtsam/3rdparty/Eigen/src/Sparse/SparseSparseProduct.h</p><p>gtsam/3rdparty/Eigen/test/eigen2/sparse.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCore/SparseMatrixBase.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/GlobalFunctions.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/SparseExtra/SuperLUSupport.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/LevenbergMarquardt.h</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_commainitializer.cpp</p><p>gtsam/3rdparty/Eigen/test/nomalloc.cpp</p><p>gtsam/3rdparty/UFconfig/UFconfig.mk</p><p>gtsam/3rdparty/Eigen/test/array_replicate.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/Geometry/Hyperplane.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/Memory.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseLU/SparseLU.h</p><p>gtsam/3rdparty/Eigen/blas/lsame.f</p><p>gtsam/3rdparty/Eigen/doc/D11_UnalignedArrayAssert.dox</p><p>gtsam/3rdparty/Eigen/bench/sparse_randomsetter.cpp</p><p>gtsam/3rdparty/Eigen/doc/C05_TutorialAdvancedInitialization.dox</p><p>gtsam/3rdparty/Eigen/doc/FunctionsTakingEigenTypes.dox</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_minus.cpp</p><p>gtsam/3rdparty/Eigen/lapack/dlarf.f</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_template_int_int_bottomLeftCorner_int_int.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_cube.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigenvalues/RealSchur_MKL.h</p><p>gtsam/3rdparty/Eigen/src/Cholesky/LLT.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/TopicAliasing_cwise.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/PermutationMatrix.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Sparse/SparseView.h</p><p>gtsam/3rdparty/Eigen/src/Core/util/StaticAssert.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/LU/arch/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/Block.h</p><p>gtsam/3rdparty/Eigen/test/qr.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/NonLinearOptimization/rwupdt.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/Macros.h</p><p>gtsam/3rdparty/Eigen/Eigen/Householder</p><p>gtsam/3rdparty/Eigen/doc/snippets/SelfAdjointEigenSolver_compute_MatrixType.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/CwiseOperators.h</p><p>gtsam/3rdparty/Eigen/test/schur_complex.cpp</p><p>gtsam/3rdparty/Eigen/src/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/WrongStackAlignment.dox</p><p>gtsam/3rdparty/Eigen/bench/btl/data/action_settings.txt</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/BVH</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_packetmath.cpp</p><p>gtsam/3rdparty/Eigen/bench/spbench/spbenchstyle.h</p><p>gtsam/3rdparty/Eigen/bench/benchCholesky.cpp</p><p>gtsam/3rdparty/Eigen/blas/level1_impl.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/tut_arithmetic_transpose_aliasing.cpp</p><p>gtsam/3rdparty/Eigen/doc/tutorial.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Geometry/arch/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_template_int_int_topRightCorner_int_int.cpp</p><p>gtsam/3rdparty/Eigen/doc/C00_QuickStartGuide.dox</p><p>gtsam/3rdparty/Eigen/doc/snippets/SelfAdjointEigenSolver_eigenvalues.cpp</p><p>gtsam/3rdparty/Eigen/src/Sparse/TriangularSolver.h</p><p>gtsam/3rdparty/ccolamd/README.txt</p><p>gtsam/3rdparty/Eigen/doc/examples/Tutorial_ReductionsVisitorsBroadcasting_rowwise.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/AutoDiff/AutoDiffVector.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.h</p><p>gtsam/3rdparty/Eigen/Sparse</p><p>gtsam/3rdparty/Eigen/Eigen/src/LU/Inverse.h</p><p>gtsam/3rdparty/Eigen/doc/examples/TutorialLinAlgSetThreshold.cpp</p><p>gtsam/3rdparty/Eigen/test/bicgstab.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/arch/NEON/PacketMath.h</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/SVD/BDCSVD.h</p><p>gtsam/3rdparty/Eigen/bench/btl/data/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/blas/stpmv.f</p><p>gtsam/3rdparty/Eigen/blas/testing/dblat3.f</p><p>gtsam/3rdparty/Eigen/test/real_qz.cpp</p><p>gtsam/3rdparty/Eigen/src/Sparse/SparseSelfAdjointView.h</p><p>gtsam/3rdparty/Eigen/doc/examples/TemplateKeyword_flexible.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/Assign.h</p><p>gtsam/3rdparty/Eigen/test/product.h</p><p>gtsam/3rdparty/Eigen/StdDeque</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/Cwise.h</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_sparse_solvers.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_noalias.cpp</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/Geometry/Transform.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/compile_snippet.cpp.in</p><p>gtsam/3rdparty/Eigen/bench/benchmarkSlice.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/CwiseUnaryOp.h</p><p>gtsam/3rdparty/Eigen/src/Sparse/CompressedStorage.h</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/ublas/main.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/products/TriangularMatrixMatrix_MKL.h</p><p>gtsam/3rdparty/Eigen/Eigen/SparseLU</p><p>gtsam/3rdparty/Eigen/test/mixingtypes.cpp</p><p>gtsam/3rdparty/Eigen/blas/stbmv.f</p><p>gtsam/3rdparty/Eigen/Eigen/src/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/bench/btl/data/smooth_all.sh</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_asDiagonal.cpp</p><p>gtsam/3rdparty/Eigen/doc/Doxyfile.in</p><p>gtsam/3rdparty/Eigen/src/SVD/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCore/SparseDot.h</p><p>gtsam/3rdparty/Eigen/doc/examples/class_CwiseBinaryOp.cpp</p><p>gtsam/3rdparty/Eigen/scripts/cdashtesting.cmake.in</p><p>gtsam/3rdparty/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h</p><p>gtsam/3rdparty/Eigen/test/eigen2/runtest.sh</p><p>gtsam/3rdparty/Eigen/test/ref.cpp</p><p>gtsam/3rdparty/Eigen/doc/I00_CustomizingEigen.dox</p><p>gtsam/3rdparty/Eigen/COPYING.GPL</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/Visitor.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/util/StaticAssert.h</p><p>gtsam/3rdparty/Eigen/doc/examples/TutorialLinAlgExSolveColPivHouseholderQR.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/Splines</p><p>gtsam/3rdparty/Eigen/Eigen/StdList</p><p>gtsam/3rdparty/Eigen/lapack/dlarfg.f</p><p>gtsam/3rdparty/Eigen/Eigen/UmfPackSupport</p><p>gtsam/3rdparty/CCOLAMD/MATLAB/ccolamd.m</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/Flagged.h</p><p>gtsam/3rdparty/Eigen/doc/special_examples/Tutorial_sparse_example_details.cpp</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/Skyline</p><p>gtsam/3rdparty/Eigen/Eigen/src/Sparse/CompressedStorage.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCore/SparseMatrix.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/Core/GenericPacketMath.h</p><p>gtsam/3rdparty/Eigen/src/StlSupport/Makefile.am</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseCore/SparseFuzzy.h</p><p>gtsam/3rdparty/Eigen/bench/btl/generic_bench/init/init_matrix.hh</p><p>gtsam/3rdparty/Eigen/COPYING.MINPACK</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_submatrices.cpp</p><p>gtsam/3rdparty/Eigen/doc/C10_TutorialMapClass.dox</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_square.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/SparseCholesky</p><p>gtsam/3rdparty/Eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h</p><p>gtsam/3rdparty/Eigen/blas/testing/zblat1.f</p><p>gtsam/3rdparty/Eigen/.hgtags</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_triangular.cpp</p><p>gtsam/3rdparty/Eigen/doc/snippets/PartialRedux_maxCoeff.cpp</p><p>gtsam/3rdparty/Eigen/doc/StructHavingEigenMembers.dox</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/Geometry/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/doc/I03_InsideEigenExample.dox</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/STL_algo/main.cpp</p><p>gtsam/3rdparty/Eigen/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h</p><p>gtsam/3rdparty/Eigen/bench/btl/cmake/FindTvmet.cmake</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/MatrixExponential.h</p><p>gtsam/3rdparty/Eigen/bench/btl/generic_bench/btl.hh</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/C/main.cpp</p><p>gtsam/3rdparty/Eigen/cmake/FindLAPACK.cmake</p><p>gtsam/3rdparty/Eigen/Eigen/src/Cholesky/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/unsupported/Eigen/src/SVD/SVDBase.h</p><p>gtsam/3rdparty/Eigen/src/Eigen2Support/LeastSquares.h</p><p>gtsam/3rdparty/Eigen/Eigen/src/StlSupport/StdList.h</p><p>gtsam/3rdparty/Eigen/unsupported/test/polynomialutils.cpp</p><p>gtsam/3rdparty/Eigen/demos/mix_eigen_and_c/example.c</p><p>gtsam/3rdparty/Eigen/doc/I11_Aliasing.dox</p><p>gtsam/3rdparty/Eigen/bench/quat_slerp.cpp</p><p>gtsam/3rdparty/Eigen/test/eigen2/eigen2_newstdvector.cpp</p><p>gtsam/3rdparty/Eigen/blas/sspmv.f</p><p>gtsam/3rdparty/Eigen/lapack/zlarft.f</p><p>gtsam/3rdparty/Eigen/bench/btl/data/gnuplot_common_settings.hh</p><p>gtsam/3rdparty/Eigen/bench/btl/libs/f77/main.cpp</p><p>gtsam/3rdparty/Eigen/bench/sparse_trisolver.cpp</p><p>gtsam/3rdparty/Eigen/src/Core/arch/CMakeLists.txt</p><p>gtsam/3rdparty/Eigen/blas/level2_real_impl.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/Cwise_less.cpp</p><p>gtsam/3rdparty/Eigen/QtAlignedMalloc</p><p>gtsam/3rdparty/Eigen/doc/I14_PreprocessorDirectives.dox</p><p>gtsam/3rdparty/Eigen/blas/testing/zblat3.dat</p><p>gtsam/3rdparty/Eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_MKL.h</p><p>gtsam/3rdparty/Eigen/doc/snippets/MatrixBase_cwiseMin.cpp</p></div></div>