123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778 |
- (function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, global.Chart = factory());
- }(this, (function () { 'use strict';
- var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
- function commonjsRequire () {
- throw new Error('Dynamic requires are not currently supported by rollup-plugin-commonjs');
- }
- function createCommonjsModule(fn, module) {
- return module = { exports: {} }, fn(module, module.exports), module.exports;
- }
- function getCjsExportFromNamespace (n) {
- return n && n['default'] || n;
- }
- var colorName = {
- "aliceblue": [240, 248, 255],
- "antiquewhite": [250, 235, 215],
- "aqua": [0, 255, 255],
- "aquamarine": [127, 255, 212],
- "azure": [240, 255, 255],
- "beige": [245, 245, 220],
- "bisque": [255, 228, 196],
- "black": [0, 0, 0],
- "blanchedalmond": [255, 235, 205],
- "blue": [0, 0, 255],
- "blueviolet": [138, 43, 226],
- "brown": [165, 42, 42],
- "burlywood": [222, 184, 135],
- "cadetblue": [95, 158, 160],
- "chartreuse": [127, 255, 0],
- "chocolate": [210, 105, 30],
- "coral": [255, 127, 80],
- "cornflowerblue": [100, 149, 237],
- "cornsilk": [255, 248, 220],
- "crimson": [220, 20, 60],
- "cyan": [0, 255, 255],
- "darkblue": [0, 0, 139],
- "darkcyan": [0, 139, 139],
- "darkgoldenrod": [184, 134, 11],
- "darkgray": [169, 169, 169],
- "darkgreen": [0, 100, 0],
- "darkgrey": [169, 169, 169],
- "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],
- "darkseagreen": [143, 188, 143],
- "darkslateblue": [72, 61, 139],
- "darkslategray": [47, 79, 79],
- "darkslategrey": [47, 79, 79],
- "darkturquoise": [0, 206, 209],
- "darkviolet": [148, 0, 211],
- "deeppink": [255, 20, 147],
- "deepskyblue": [0, 191, 255],
- "dimgray": [105, 105, 105],
- "dimgrey": [105, 105, 105],
- "dodgerblue": [30, 144, 255],
- "firebrick": [178, 34, 34],
- "floralwhite": [255, 250, 240],
- "forestgreen": [34, 139, 34],
- "fuchsia": [255, 0, 255],
- "gainsboro": [220, 220, 220],
- "ghostwhite": [248, 248, 255],
- "gold": [255, 215, 0],
- "goldenrod": [218, 165, 32],
- "gray": [128, 128, 128],
- "green": [0, 128, 0],
- "greenyellow": [173, 255, 47],
- "grey": [128, 128, 128],
- "honeydew": [240, 255, 240],
- "hotpink": [255, 105, 180],
- "indianred": [205, 92, 92],
- "indigo": [75, 0, 130],
- "ivory": [255, 255, 240],
- "khaki": [240, 230, 140],
- "lavender": [230, 230, 250],
- "lavenderblush": [255, 240, 245],
- "lawngreen": [124, 252, 0],
- "lemonchiffon": [255, 250, 205],
- "lightblue": [173, 216, 230],
- "lightcoral": [240, 128, 128],
- "lightcyan": [224, 255, 255],
- "lightgoldenrodyellow": [250, 250, 210],
- "lightgray": [211, 211, 211],
- "lightgreen": [144, 238, 144],
- "lightgrey": [211, 211, 211],
- "lightpink": [255, 182, 193],
- "lightsalmon": [255, 160, 122],
- "lightseagreen": [32, 178, 170],
- "lightskyblue": [135, 206, 250],
- "lightslategray": [119, 136, 153],
- "lightslategrey": [119, 136, 153],
- "lightsteelblue": [176, 196, 222],
- "lightyellow": [255, 255, 224],
- "lime": [0, 255, 0],
- "limegreen": [50, 205, 50],
- "linen": [250, 240, 230],
- "magenta": [255, 0, 255],
- "maroon": [128, 0, 0],
- "mediumaquamarine": [102, 205, 170],
- "mediumblue": [0, 0, 205],
- "mediumorchid": [186, 85, 211],
- "mediumpurple": [147, 112, 219],
- "mediumseagreen": [60, 179, 113],
- "mediumslateblue": [123, 104, 238],
- "mediumspringgreen": [0, 250, 154],
- "mediumturquoise": [72, 209, 204],
- "mediumvioletred": [199, 21, 133],
- "midnightblue": [25, 25, 112],
- "mintcream": [245, 255, 250],
- "mistyrose": [255, 228, 225],
- "moccasin": [255, 228, 181],
- "navajowhite": [255, 222, 173],
- "navy": [0, 0, 128],
- "oldlace": [253, 245, 230],
- "olive": [128, 128, 0],
- "olivedrab": [107, 142, 35],
- "orange": [255, 165, 0],
- "orangered": [255, 69, 0],
- "orchid": [218, 112, 214],
- "palegoldenrod": [238, 232, 170],
- "palegreen": [152, 251, 152],
- "paleturquoise": [175, 238, 238],
- "palevioletred": [219, 112, 147],
- "papayawhip": [255, 239, 213],
- "peachpuff": [255, 218, 185],
- "peru": [205, 133, 63],
- "pink": [255, 192, 203],
- "plum": [221, 160, 221],
- "powderblue": [176, 224, 230],
- "purple": [128, 0, 128],
- "rebeccapurple": [102, 51, 153],
- "red": [255, 0, 0],
- "rosybrown": [188, 143, 143],
- "royalblue": [65, 105, 225],
- "saddlebrown": [139, 69, 19],
- "salmon": [250, 128, 114],
- "sandybrown": [244, 164, 96],
- "seagreen": [46, 139, 87],
- "seashell": [255, 245, 238],
- "sienna": [160, 82, 45],
- "silver": [192, 192, 192],
- "skyblue": [135, 206, 235],
- "slateblue": [106, 90, 205],
- "slategray": [112, 128, 144],
- "slategrey": [112, 128, 144],
- "snow": [255, 250, 250],
- "springgreen": [0, 255, 127],
- "steelblue": [70, 130, 180],
- "tan": [210, 180, 140],
- "teal": [0, 128, 128],
- "thistle": [216, 191, 216],
- "tomato": [255, 99, 71],
- "turquoise": [64, 224, 208],
- "violet": [238, 130, 238],
- "wheat": [245, 222, 179],
- "white": [255, 255, 255],
- "whitesmoke": [245, 245, 245],
- "yellow": [255, 255, 0],
- "yellowgreen": [154, 205, 50]
- };
- var conversions = createCommonjsModule(function (module) {
- var reverseKeywords = {};
- for (var key in colorName) {
- if (colorName.hasOwnProperty(key)) {
- reverseKeywords[colorName[key]] = key;
- }
- }
- var convert = module.exports = {
- rgb: {channels: 3, labels: 'rgb'},
- hsl: {channels: 3, labels: 'hsl'},
- hsv: {channels: 3, labels: 'hsv'},
- hwb: {channels: 3, labels: 'hwb'},
- cmyk: {channels: 4, labels: 'cmyk'},
- xyz: {channels: 3, labels: 'xyz'},
- lab: {channels: 3, labels: 'lab'},
- lch: {channels: 3, labels: 'lch'},
- hex: {channels: 1, labels: ['hex']},
- keyword: {channels: 1, labels: ['keyword']},
- ansi16: {channels: 1, labels: ['ansi16']},
- ansi256: {channels: 1, labels: ['ansi256']},
- hcg: {channels: 3, labels: ['h', 'c', 'g']},
- apple: {channels: 3, labels: ['r16', 'g16', 'b16']},
- gray: {channels: 1, labels: ['gray']}
- };
- for (var model in convert) {
- if (convert.hasOwnProperty(model)) {
- if (!('channels' in convert[model])) {
- throw new Error('missing channels property: ' + model);
- }
- if (!('labels' in convert[model])) {
- throw new Error('missing channel labels property: ' + model);
- }
- if (convert[model].labels.length !== convert[model].channels) {
- throw new Error('channel and label counts mismatch: ' + model);
- }
- var channels = convert[model].channels;
- var labels = convert[model].labels;
- delete convert[model].channels;
- delete convert[model].labels;
- Object.defineProperty(convert[model], 'channels', {value: channels});
- Object.defineProperty(convert[model], 'labels', {value: labels});
- }
- }
- convert.rgb.hsl = function (rgb) {
- var r = rgb[0] / 255;
- var g = rgb[1] / 255;
- var b = rgb[2] / 255;
- var min = Math.min(r, g, b);
- var max = Math.max(r, g, b);
- var delta = max - min;
- var h;
- var s;
- var l;
- if (max === min) {
- h = 0;
- } else if (r === max) {
- h = (g - b) / delta;
- } else if (g === max) {
- h = 2 + (b - r) / delta;
- } else if (b === max) {
- h = 4 + (r - g) / delta;
- }
- h = Math.min(h * 60, 360);
- if (h < 0) {
- h += 360;
- }
- l = (min + max) / 2;
- if (max === min) {
- s = 0;
- } else if (l <= 0.5) {
- s = delta / (max + min);
- } else {
- s = delta / (2 - max - min);
- }
- return [h, s * 100, l * 100];
- };
- convert.rgb.hsv = function (rgb) {
- var rdif;
- var gdif;
- var bdif;
- var h;
- var s;
- var r = rgb[0] / 255;
- var g = rgb[1] / 255;
- var b = rgb[2] / 255;
- var v = Math.max(r, g, b);
- var diff = v - Math.min(r, g, b);
- var diffc = function (c) {
- return (v - c) / 6 / diff + 1 / 2;
- };
- if (diff === 0) {
- h = s = 0;
- } else {
- s = diff / v;
- rdif = diffc(r);
- gdif = diffc(g);
- bdif = diffc(b);
- if (r === v) {
- h = bdif - gdif;
- } else if (g === v) {
- h = (1 / 3) + rdif - bdif;
- } else if (b === v) {
- h = (2 / 3) + gdif - rdif;
- }
- if (h < 0) {
- h += 1;
- } else if (h > 1) {
- h -= 1;
- }
- }
- return [
- h * 360,
- s * 100,
- v * 100
- ];
- };
- convert.rgb.hwb = function (rgb) {
- var r = rgb[0];
- var g = rgb[1];
- var b = rgb[2];
- var h = convert.rgb.hsl(rgb)[0];
- var w = 1 / 255 * Math.min(r, Math.min(g, b));
- b = 1 - 1 / 255 * Math.max(r, Math.max(g, b));
- return [h, w * 100, b * 100];
- };
- convert.rgb.cmyk = function (rgb) {
- var r = rgb[0] / 255;
- var g = rgb[1] / 255;
- var b = rgb[2] / 255;
- var c;
- var m;
- var y;
- var k;
- k = Math.min(1 - r, 1 - g, 1 - b);
- c = (1 - r - k) / (1 - k) || 0;
- m = (1 - g - k) / (1 - k) || 0;
- y = (1 - b - k) / (1 - k) || 0;
- return [c * 100, m * 100, y * 100, k * 100];
- };
- function comparativeDistance(x, y) {
- return (
- Math.pow(x[0] - y[0], 2) +
- Math.pow(x[1] - y[1], 2) +
- Math.pow(x[2] - y[2], 2)
- );
- }
- convert.rgb.keyword = function (rgb) {
- var reversed = reverseKeywords[rgb];
- if (reversed) {
- return reversed;
- }
- var currentClosestDistance = Infinity;
- var currentClosestKeyword;
- for (var keyword in colorName) {
- if (colorName.hasOwnProperty(keyword)) {
- var value = colorName[keyword];
-
- var distance = comparativeDistance(rgb, value);
-
- if (distance < currentClosestDistance) {
- currentClosestDistance = distance;
- currentClosestKeyword = keyword;
- }
- }
- }
- return currentClosestKeyword;
- };
- convert.keyword.rgb = function (keyword) {
- return colorName[keyword];
- };
- convert.rgb.xyz = function (rgb) {
- var r = rgb[0] / 255;
- var g = rgb[1] / 255;
- var b = rgb[2] / 255;
-
- r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);
- g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);
- b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);
- var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);
- var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);
- var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);
- return [x * 100, y * 100, z * 100];
- };
- convert.rgb.lab = function (rgb) {
- var xyz = convert.rgb.xyz(rgb);
- var x = xyz[0];
- var y = xyz[1];
- var z = xyz[2];
- var l;
- var a;
- var b;
- x /= 95.047;
- y /= 100;
- z /= 108.883;
- x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);
- y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);
- z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);
- l = (116 * y) - 16;
- a = 500 * (x - y);
- b = 200 * (y - z);
- return [l, a, b];
- };
- convert.hsl.rgb = function (hsl) {
- var h = hsl[0] / 360;
- var s = hsl[1] / 100;
- var l = hsl[2] / 100;
- var t1;
- var t2;
- var t3;
- var rgb;
- var val;
- if (s === 0) {
- val = l * 255;
- return [val, val, val];
- }
- if (l < 0.5) {
- t2 = l * (1 + s);
- } else {
- t2 = l + s - l * s;
- }
- t1 = 2 * l - t2;
- rgb = [0, 0, 0];
- for (var i = 0; i < 3; i++) {
- t3 = h + 1 / 3 * -(i - 1);
- if (t3 < 0) {
- t3++;
- }
- if (t3 > 1) {
- t3--;
- }
- if (6 * t3 < 1) {
- val = t1 + (t2 - t1) * 6 * t3;
- } else if (2 * t3 < 1) {
- val = t2;
- } else if (3 * t3 < 2) {
- val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
- } else {
- val = t1;
- }
- rgb[i] = val * 255;
- }
- return rgb;
- };
- convert.hsl.hsv = function (hsl) {
- var h = hsl[0];
- var s = hsl[1] / 100;
- var l = hsl[2] / 100;
- var smin = s;
- var lmin = Math.max(l, 0.01);
- var sv;
- var v;
- l *= 2;
- s *= (l <= 1) ? l : 2 - l;
- smin *= lmin <= 1 ? lmin : 2 - lmin;
- v = (l + s) / 2;
- sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);
- return [h, sv * 100, v * 100];
- };
- convert.hsv.rgb = function (hsv) {
- var h = hsv[0] / 60;
- var s = hsv[1] / 100;
- var v = hsv[2] / 100;
- var hi = Math.floor(h) % 6;
- var f = h - Math.floor(h);
- var p = 255 * v * (1 - s);
- var q = 255 * v * (1 - (s * f));
- var t = 255 * v * (1 - (s * (1 - f)));
- v *= 255;
- switch (hi) {
- case 0:
- return [v, t, p];
- case 1:
- return [q, v, p];
- case 2:
- return [p, v, t];
- case 3:
- return [p, q, v];
- case 4:
- return [t, p, v];
- case 5:
- return [v, p, q];
- }
- };
- convert.hsv.hsl = function (hsv) {
- var h = hsv[0];
- var s = hsv[1] / 100;
- var v = hsv[2] / 100;
- var vmin = Math.max(v, 0.01);
- var lmin;
- var sl;
- var l;
- l = (2 - s) * v;
- lmin = (2 - s) * vmin;
- sl = s * vmin;
- sl /= (lmin <= 1) ? lmin : 2 - lmin;
- sl = sl || 0;
- l /= 2;
- return [h, sl * 100, l * 100];
- };
- convert.hwb.rgb = function (hwb) {
- var h = hwb[0] / 360;
- var wh = hwb[1] / 100;
- var bl = hwb[2] / 100;
- var ratio = wh + bl;
- var i;
- var v;
- var f;
- var n;
-
- if (ratio > 1) {
- wh /= ratio;
- bl /= ratio;
- }
- i = Math.floor(6 * h);
- v = 1 - bl;
- f = 6 * h - i;
- if ((i & 0x01) !== 0) {
- f = 1 - f;
- }
- n = wh + f * (v - wh);
- var r;
- var g;
- var b;
- switch (i) {
- default:
- case 6:
- case 0: r = v; g = n; b = wh; break;
- case 1: r = n; g = v; b = wh; break;
- case 2: r = wh; g = v; b = n; break;
- case 3: r = wh; g = n; b = v; break;
- case 4: r = n; g = wh; b = v; break;
- case 5: r = v; g = wh; b = n; break;
- }
- return [r * 255, g * 255, b * 255];
- };
- convert.cmyk.rgb = function (cmyk) {
- var c = cmyk[0] / 100;
- var m = cmyk[1] / 100;
- var y = cmyk[2] / 100;
- var k = cmyk[3] / 100;
- var r;
- var g;
- var b;
- r = 1 - Math.min(1, c * (1 - k) + k);
- g = 1 - Math.min(1, m * (1 - k) + k);
- b = 1 - Math.min(1, y * (1 - k) + k);
- return [r * 255, g * 255, b * 255];
- };
- convert.xyz.rgb = function (xyz) {
- var x = xyz[0] / 100;
- var y = xyz[1] / 100;
- var z = xyz[2] / 100;
- var r;
- var g;
- var b;
- r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);
- g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);
- b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);
-
- r = r > 0.0031308
- ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)
- : r * 12.92;
- g = g > 0.0031308
- ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)
- : g * 12.92;
- b = b > 0.0031308
- ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)
- : b * 12.92;
- r = Math.min(Math.max(0, r), 1);
- g = Math.min(Math.max(0, g), 1);
- b = Math.min(Math.max(0, b), 1);
- return [r * 255, g * 255, b * 255];
- };
- convert.xyz.lab = function (xyz) {
- var x = xyz[0];
- var y = xyz[1];
- var z = xyz[2];
- var l;
- var a;
- var b;
- x /= 95.047;
- y /= 100;
- z /= 108.883;
- x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);
- y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);
- z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);
- l = (116 * y) - 16;
- a = 500 * (x - y);
- b = 200 * (y - z);
- return [l, a, b];
- };
- convert.lab.xyz = function (lab) {
- var l = lab[0];
- var a = lab[1];
- var b = lab[2];
- var x;
- var y;
- var z;
- y = (l + 16) / 116;
- x = a / 500 + y;
- z = y - b / 200;
- var y2 = Math.pow(y, 3);
- var x2 = Math.pow(x, 3);
- var z2 = Math.pow(z, 3);
- y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;
- x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;
- z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;
- x *= 95.047;
- y *= 100;
- z *= 108.883;
- return [x, y, z];
- };
- convert.lab.lch = function (lab) {
- var l = lab[0];
- var a = lab[1];
- var b = lab[2];
- var hr;
- var h;
- var c;
- hr = Math.atan2(b, a);
- h = hr * 360 / 2 / Math.PI;
- if (h < 0) {
- h += 360;
- }
- c = Math.sqrt(a * a + b * b);
- return [l, c, h];
- };
- convert.lch.lab = function (lch) {
- var l = lch[0];
- var c = lch[1];
- var h = lch[2];
- var a;
- var b;
- var hr;
- hr = h / 360 * 2 * Math.PI;
- a = c * Math.cos(hr);
- b = c * Math.sin(hr);
- return [l, a, b];
- };
- convert.rgb.ansi16 = function (args) {
- var r = args[0];
- var g = args[1];
- var b = args[2];
- var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2];
- value = Math.round(value / 50);
- if (value === 0) {
- return 30;
- }
- var ansi = 30
- + ((Math.round(b / 255) << 2)
- | (Math.round(g / 255) << 1)
- | Math.round(r / 255));
- if (value === 2) {
- ansi += 60;
- }
- return ansi;
- };
- convert.hsv.ansi16 = function (args) {
-
-
- return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);
- };
- convert.rgb.ansi256 = function (args) {
- var r = args[0];
- var g = args[1];
- var b = args[2];
-
-
- if (r === g && g === b) {
- if (r < 8) {
- return 16;
- }
- if (r > 248) {
- return 231;
- }
- return Math.round(((r - 8) / 247) * 24) + 232;
- }
- var ansi = 16
- + (36 * Math.round(r / 255 * 5))
- + (6 * Math.round(g / 255 * 5))
- + Math.round(b / 255 * 5);
- return ansi;
- };
- convert.ansi16.rgb = function (args) {
- var color = args % 10;
-
- if (color === 0 || color === 7) {
- if (args > 50) {
- color += 3.5;
- }
- color = color / 10.5 * 255;
- return [color, color, color];
- }
- var mult = (~~(args > 50) + 1) * 0.5;
- var r = ((color & 1) * mult) * 255;
- var g = (((color >> 1) & 1) * mult) * 255;
- var b = (((color >> 2) & 1) * mult) * 255;
- return [r, g, b];
- };
- convert.ansi256.rgb = function (args) {
-
- if (args >= 232) {
- var c = (args - 232) * 10 + 8;
- return [c, c, c];
- }
- args -= 16;
- var rem;
- var r = Math.floor(args / 36) / 5 * 255;
- var g = Math.floor((rem = args % 36) / 6) / 5 * 255;
- var b = (rem % 6) / 5 * 255;
- return [r, g, b];
- };
- convert.rgb.hex = function (args) {
- var integer = ((Math.round(args[0]) & 0xFF) << 16)
- + ((Math.round(args[1]) & 0xFF) << 8)
- + (Math.round(args[2]) & 0xFF);
- var string = integer.toString(16).toUpperCase();
- return '000000'.substring(string.length) + string;
- };
- convert.hex.rgb = function (args) {
- var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);
- if (!match) {
- return [0, 0, 0];
- }
- var colorString = match[0];
- if (match[0].length === 3) {
- colorString = colorString.split('').map(function (char) {
- return char + char;
- }).join('');
- }
- var integer = parseInt(colorString, 16);
- var r = (integer >> 16) & 0xFF;
- var g = (integer >> 8) & 0xFF;
- var b = integer & 0xFF;
- return [r, g, b];
- };
- convert.rgb.hcg = function (rgb) {
- var r = rgb[0] / 255;
- var g = rgb[1] / 255;
- var b = rgb[2] / 255;
- var max = Math.max(Math.max(r, g), b);
- var min = Math.min(Math.min(r, g), b);
- var chroma = (max - min);
- var grayscale;
- var hue;
- if (chroma < 1) {
- grayscale = min / (1 - chroma);
- } else {
- grayscale = 0;
- }
- if (chroma <= 0) {
- hue = 0;
- } else
- if (max === r) {
- hue = ((g - b) / chroma) % 6;
- } else
- if (max === g) {
- hue = 2 + (b - r) / chroma;
- } else {
- hue = 4 + (r - g) / chroma + 4;
- }
- hue /= 6;
- hue %= 1;
- return [hue * 360, chroma * 100, grayscale * 100];
- };
- convert.hsl.hcg = function (hsl) {
- var s = hsl[1] / 100;
- var l = hsl[2] / 100;
- var c = 1;
- var f = 0;
- if (l < 0.5) {
- c = 2.0 * s * l;
- } else {
- c = 2.0 * s * (1.0 - l);
- }
- if (c < 1.0) {
- f = (l - 0.5 * c) / (1.0 - c);
- }
- return [hsl[0], c * 100, f * 100];
- };
- convert.hsv.hcg = function (hsv) {
- var s = hsv[1] / 100;
- var v = hsv[2] / 100;
- var c = s * v;
- var f = 0;
- if (c < 1.0) {
- f = (v - c) / (1 - c);
- }
- return [hsv[0], c * 100, f * 100];
- };
- convert.hcg.rgb = function (hcg) {
- var h = hcg[0] / 360;
- var c = hcg[1] / 100;
- var g = hcg[2] / 100;
- if (c === 0.0) {
- return [g * 255, g * 255, g * 255];
- }
- var pure = [0, 0, 0];
- var hi = (h % 1) * 6;
- var v = hi % 1;
- var w = 1 - v;
- var mg = 0;
- switch (Math.floor(hi)) {
- case 0:
- pure[0] = 1; pure[1] = v; pure[2] = 0; break;
- case 1:
- pure[0] = w; pure[1] = 1; pure[2] = 0; break;
- case 2:
- pure[0] = 0; pure[1] = 1; pure[2] = v; break;
- case 3:
- pure[0] = 0; pure[1] = w; pure[2] = 1; break;
- case 4:
- pure[0] = v; pure[1] = 0; pure[2] = 1; break;
- default:
- pure[0] = 1; pure[1] = 0; pure[2] = w;
- }
- mg = (1.0 - c) * g;
- return [
- (c * pure[0] + mg) * 255,
- (c * pure[1] + mg) * 255,
- (c * pure[2] + mg) * 255
- ];
- };
- convert.hcg.hsv = function (hcg) {
- var c = hcg[1] / 100;
- var g = hcg[2] / 100;
- var v = c + g * (1.0 - c);
- var f = 0;
- if (v > 0.0) {
- f = c / v;
- }
- return [hcg[0], f * 100, v * 100];
- };
- convert.hcg.hsl = function (hcg) {
- var c = hcg[1] / 100;
- var g = hcg[2] / 100;
- var l = g * (1.0 - c) + 0.5 * c;
- var s = 0;
- if (l > 0.0 && l < 0.5) {
- s = c / (2 * l);
- } else
- if (l >= 0.5 && l < 1.0) {
- s = c / (2 * (1 - l));
- }
- return [hcg[0], s * 100, l * 100];
- };
- convert.hcg.hwb = function (hcg) {
- var c = hcg[1] / 100;
- var g = hcg[2] / 100;
- var v = c + g * (1.0 - c);
- return [hcg[0], (v - c) * 100, (1 - v) * 100];
- };
- convert.hwb.hcg = function (hwb) {
- var w = hwb[1] / 100;
- var b = hwb[2] / 100;
- var v = 1 - b;
- var c = v - w;
- var g = 0;
- if (c < 1) {
- g = (v - c) / (1 - c);
- }
- return [hwb[0], c * 100, g * 100];
- };
- convert.apple.rgb = function (apple) {
- return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];
- };
- convert.rgb.apple = function (rgb) {
- return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];
- };
- convert.gray.rgb = function (args) {
- return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];
- };
- convert.gray.hsl = convert.gray.hsv = function (args) {
- return [0, 0, args[0]];
- };
- convert.gray.hwb = function (gray) {
- return [0, 100, gray[0]];
- };
- convert.gray.cmyk = function (gray) {
- return [0, 0, 0, gray[0]];
- };
- convert.gray.lab = function (gray) {
- return [gray[0], 0, 0];
- };
- convert.gray.hex = function (gray) {
- var val = Math.round(gray[0] / 100 * 255) & 0xFF;
- var integer = (val << 16) + (val << 8) + val;
- var string = integer.toString(16).toUpperCase();
- return '000000'.substring(string.length) + string;
- };
- convert.rgb.gray = function (rgb) {
- var val = (rgb[0] + rgb[1] + rgb[2]) / 3;
- return [val / 255 * 100];
- };
- });
- var conversions_1 = conversions.rgb;
- var conversions_2 = conversions.hsl;
- var conversions_3 = conversions.hsv;
- var conversions_4 = conversions.hwb;
- var conversions_5 = conversions.cmyk;
- var conversions_6 = conversions.xyz;
- var conversions_7 = conversions.lab;
- var conversions_8 = conversions.lch;
- var conversions_9 = conversions.hex;
- var conversions_10 = conversions.keyword;
- var conversions_11 = conversions.ansi16;
- var conversions_12 = conversions.ansi256;
- var conversions_13 = conversions.hcg;
- var conversions_14 = conversions.apple;
- var conversions_15 = conversions.gray;
- function buildGraph() {
- var graph = {};
-
- var models = Object.keys(conversions);
- for (var len = models.length, i = 0; i < len; i++) {
- graph[models[i]] = {
-
-
- distance: -1,
- parent: null
- };
- }
- return graph;
- }
- function deriveBFS(fromModel) {
- var graph = buildGraph();
- var queue = [fromModel];
- graph[fromModel].distance = 0;
- while (queue.length) {
- var current = queue.pop();
- var adjacents = Object.keys(conversions[current]);
- for (var len = adjacents.length, i = 0; i < len; i++) {
- var adjacent = adjacents[i];
- var node = graph[adjacent];
- if (node.distance === -1) {
- node.distance = graph[current].distance + 1;
- node.parent = current;
- queue.unshift(adjacent);
- }
- }
- }
- return graph;
- }
- function link(from, to) {
- return function (args) {
- return to(from(args));
- };
- }
- function wrapConversion(toModel, graph) {
- var path = [graph[toModel].parent, toModel];
- var fn = conversions[graph[toModel].parent][toModel];
- var cur = graph[toModel].parent;
- while (graph[cur].parent) {
- path.unshift(graph[cur].parent);
- fn = link(conversions[graph[cur].parent][cur], fn);
- cur = graph[cur].parent;
- }
- fn.conversion = path;
- return fn;
- }
- var route = function (fromModel) {
- var graph = deriveBFS(fromModel);
- var conversion = {};
- var models = Object.keys(graph);
- for (var len = models.length, i = 0; i < len; i++) {
- var toModel = models[i];
- var node = graph[toModel];
- if (node.parent === null) {
-
- continue;
- }
- conversion[toModel] = wrapConversion(toModel, graph);
- }
- return conversion;
- };
- var convert = {};
- var models = Object.keys(conversions);
- function wrapRaw(fn) {
- var wrappedFn = function (args) {
- if (args === undefined || args === null) {
- return args;
- }
- if (arguments.length > 1) {
- args = Array.prototype.slice.call(arguments);
- }
- return fn(args);
- };
-
- if ('conversion' in fn) {
- wrappedFn.conversion = fn.conversion;
- }
- return wrappedFn;
- }
- function wrapRounded(fn) {
- var wrappedFn = function (args) {
- if (args === undefined || args === null) {
- return args;
- }
- if (arguments.length > 1) {
- args = Array.prototype.slice.call(arguments);
- }
- var result = fn(args);
-
-
-
- if (typeof result === 'object') {
- for (var len = result.length, i = 0; i < len; i++) {
- result[i] = Math.round(result[i]);
- }
- }
- return result;
- };
-
- if ('conversion' in fn) {
- wrappedFn.conversion = fn.conversion;
- }
- return wrappedFn;
- }
- models.forEach(function (fromModel) {
- convert[fromModel] = {};
- Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});
- Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});
- var routes = route(fromModel);
- var routeModels = Object.keys(routes);
- routeModels.forEach(function (toModel) {
- var fn = routes[toModel];
- convert[fromModel][toModel] = wrapRounded(fn);
- convert[fromModel][toModel].raw = wrapRaw(fn);
- });
- });
- var colorConvert = convert;
- var colorName$1 = {
- "aliceblue": [240, 248, 255],
- "antiquewhite": [250, 235, 215],
- "aqua": [0, 255, 255],
- "aquamarine": [127, 255, 212],
- "azure": [240, 255, 255],
- "beige": [245, 245, 220],
- "bisque": [255, 228, 196],
- "black": [0, 0, 0],
- "blanchedalmond": [255, 235, 205],
- "blue": [0, 0, 255],
- "blueviolet": [138, 43, 226],
- "brown": [165, 42, 42],
- "burlywood": [222, 184, 135],
- "cadetblue": [95, 158, 160],
- "chartreuse": [127, 255, 0],
- "chocolate": [210, 105, 30],
- "coral": [255, 127, 80],
- "cornflowerblue": [100, 149, 237],
- "cornsilk": [255, 248, 220],
- "crimson": [220, 20, 60],
- "cyan": [0, 255, 255],
- "darkblue": [0, 0, 139],
- "darkcyan": [0, 139, 139],
- "darkgoldenrod": [184, 134, 11],
- "darkgray": [169, 169, 169],
- "darkgreen": [0, 100, 0],
- "darkgrey": [169, 169, 169],
- "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],
- "darkseagreen": [143, 188, 143],
- "darkslateblue": [72, 61, 139],
- "darkslategray": [47, 79, 79],
- "darkslategrey": [47, 79, 79],
- "darkturquoise": [0, 206, 209],
- "darkviolet": [148, 0, 211],
- "deeppink": [255, 20, 147],
- "deepskyblue": [0, 191, 255],
- "dimgray": [105, 105, 105],
- "dimgrey": [105, 105, 105],
- "dodgerblue": [30, 144, 255],
- "firebrick": [178, 34, 34],
- "floralwhite": [255, 250, 240],
- "forestgreen": [34, 139, 34],
- "fuchsia": [255, 0, 255],
- "gainsboro": [220, 220, 220],
- "ghostwhite": [248, 248, 255],
- "gold": [255, 215, 0],
- "goldenrod": [218, 165, 32],
- "gray": [128, 128, 128],
- "green": [0, 128, 0],
- "greenyellow": [173, 255, 47],
- "grey": [128, 128, 128],
- "honeydew": [240, 255, 240],
- "hotpink": [255, 105, 180],
- "indianred": [205, 92, 92],
- "indigo": [75, 0, 130],
- "ivory": [255, 255, 240],
- "khaki": [240, 230, 140],
- "lavender": [230, 230, 250],
- "lavenderblush": [255, 240, 245],
- "lawngreen": [124, 252, 0],
- "lemonchiffon": [255, 250, 205],
- "lightblue": [173, 216, 230],
- "lightcoral": [240, 128, 128],
- "lightcyan": [224, 255, 255],
- "lightgoldenrodyellow": [250, 250, 210],
- "lightgray": [211, 211, 211],
- "lightgreen": [144, 238, 144],
- "lightgrey": [211, 211, 211],
- "lightpink": [255, 182, 193],
- "lightsalmon": [255, 160, 122],
- "lightseagreen": [32, 178, 170],
- "lightskyblue": [135, 206, 250],
- "lightslategray": [119, 136, 153],
- "lightslategrey": [119, 136, 153],
- "lightsteelblue": [176, 196, 222],
- "lightyellow": [255, 255, 224],
- "lime": [0, 255, 0],
- "limegreen": [50, 205, 50],
- "linen": [250, 240, 230],
- "magenta": [255, 0, 255],
- "maroon": [128, 0, 0],
- "mediumaquamarine": [102, 205, 170],
- "mediumblue": [0, 0, 205],
- "mediumorchid": [186, 85, 211],
- "mediumpurple": [147, 112, 219],
- "mediumseagreen": [60, 179, 113],
- "mediumslateblue": [123, 104, 238],
- "mediumspringgreen": [0, 250, 154],
- "mediumturquoise": [72, 209, 204],
- "mediumvioletred": [199, 21, 133],
- "midnightblue": [25, 25, 112],
- "mintcream": [245, 255, 250],
- "mistyrose": [255, 228, 225],
- "moccasin": [255, 228, 181],
- "navajowhite": [255, 222, 173],
- "navy": [0, 0, 128],
- "oldlace": [253, 245, 230],
- "olive": [128, 128, 0],
- "olivedrab": [107, 142, 35],
- "orange": [255, 165, 0],
- "orangered": [255, 69, 0],
- "orchid": [218, 112, 214],
- "palegoldenrod": [238, 232, 170],
- "palegreen": [152, 251, 152],
- "paleturquoise": [175, 238, 238],
- "palevioletred": [219, 112, 147],
- "papayawhip": [255, 239, 213],
- "peachpuff": [255, 218, 185],
- "peru": [205, 133, 63],
- "pink": [255, 192, 203],
- "plum": [221, 160, 221],
- "powderblue": [176, 224, 230],
- "purple": [128, 0, 128],
- "rebeccapurple": [102, 51, 153],
- "red": [255, 0, 0],
- "rosybrown": [188, 143, 143],
- "royalblue": [65, 105, 225],
- "saddlebrown": [139, 69, 19],
- "salmon": [250, 128, 114],
- "sandybrown": [244, 164, 96],
- "seagreen": [46, 139, 87],
- "seashell": [255, 245, 238],
- "sienna": [160, 82, 45],
- "silver": [192, 192, 192],
- "skyblue": [135, 206, 235],
- "slateblue": [106, 90, 205],
- "slategray": [112, 128, 144],
- "slategrey": [112, 128, 144],
- "snow": [255, 250, 250],
- "springgreen": [0, 255, 127],
- "steelblue": [70, 130, 180],
- "tan": [210, 180, 140],
- "teal": [0, 128, 128],
- "thistle": [216, 191, 216],
- "tomato": [255, 99, 71],
- "turquoise": [64, 224, 208],
- "violet": [238, 130, 238],
- "wheat": [245, 222, 179],
- "white": [255, 255, 255],
- "whitesmoke": [245, 245, 245],
- "yellow": [255, 255, 0],
- "yellowgreen": [154, 205, 50]
- };
- var colorString = {
- getRgba: getRgba,
- getHsla: getHsla,
- getRgb: getRgb,
- getHsl: getHsl,
- getHwb: getHwb,
- getAlpha: getAlpha,
- hexString: hexString,
- rgbString: rgbString,
- rgbaString: rgbaString,
- percentString: percentString,
- percentaString: percentaString,
- hslString: hslString,
- hslaString: hslaString,
- hwbString: hwbString,
- keyword: keyword
- };
- function getRgba(string) {
- if (!string) {
- return;
- }
- var abbr = /^#([a-fA-F0-9]{3,4})$/i,
- hex = /^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i,
- rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i,
- per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i,
- keyword = /(\w+)/;
- var rgb = [0, 0, 0],
- a = 1,
- match = string.match(abbr),
- hexAlpha = "";
- if (match) {
- match = match[1];
- hexAlpha = match[3];
- for (var i = 0; i < rgb.length; i++) {
- rgb[i] = parseInt(match[i] + match[i], 16);
- }
- if (hexAlpha) {
- a = Math.round((parseInt(hexAlpha + hexAlpha, 16) / 255) * 100) / 100;
- }
- }
- else if (match = string.match(hex)) {
- hexAlpha = match[2];
- match = match[1];
- for (var i = 0; i < rgb.length; i++) {
- rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16);
- }
- if (hexAlpha) {
- a = Math.round((parseInt(hexAlpha, 16) / 255) * 100) / 100;
- }
- }
- else if (match = string.match(rgba)) {
- for (var i = 0; i < rgb.length; i++) {
- rgb[i] = parseInt(match[i + 1]);
- }
- a = parseFloat(match[4]);
- }
- else if (match = string.match(per)) {
- for (var i = 0; i < rgb.length; i++) {
- rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);
- }
- a = parseFloat(match[4]);
- }
- else if (match = string.match(keyword)) {
- if (match[1] == "transparent") {
- return [0, 0, 0, 0];
- }
- rgb = colorName$1[match[1]];
- if (!rgb) {
- return;
- }
- }
- for (var i = 0; i < rgb.length; i++) {
- rgb[i] = scale(rgb[i], 0, 255);
- }
- if (!a && a != 0) {
- a = 1;
- }
- else {
- a = scale(a, 0, 1);
- }
- rgb[3] = a;
- return rgb;
- }
- function getHsla(string) {
- if (!string) {
- return;
- }
- var hsl = /^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/;
- var match = string.match(hsl);
- if (match) {
- var alpha = parseFloat(match[4]);
- var h = scale(parseInt(match[1]), 0, 360),
- s = scale(parseFloat(match[2]), 0, 100),
- l = scale(parseFloat(match[3]), 0, 100),
- a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);
- return [h, s, l, a];
- }
- }
- function getHwb(string) {
- if (!string) {
- return;
- }
- var hwb = /^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/;
- var match = string.match(hwb);
- if (match) {
- var alpha = parseFloat(match[4]);
- var h = scale(parseInt(match[1]), 0, 360),
- w = scale(parseFloat(match[2]), 0, 100),
- b = scale(parseFloat(match[3]), 0, 100),
- a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);
- return [h, w, b, a];
- }
- }
- function getRgb(string) {
- var rgba = getRgba(string);
- return rgba && rgba.slice(0, 3);
- }
- function getHsl(string) {
- var hsla = getHsla(string);
- return hsla && hsla.slice(0, 3);
- }
- function getAlpha(string) {
- var vals = getRgba(string);
- if (vals) {
- return vals[3];
- }
- else if (vals = getHsla(string)) {
- return vals[3];
- }
- else if (vals = getHwb(string)) {
- return vals[3];
- }
- }
- function hexString(rgba, a) {
- var a = (a !== undefined && rgba.length === 3) ? a : rgba[3];
- return "#" + hexDouble(rgba[0])
- + hexDouble(rgba[1])
- + hexDouble(rgba[2])
- + (
- (a >= 0 && a < 1)
- ? hexDouble(Math.round(a * 255))
- : ""
- );
- }
- function rgbString(rgba, alpha) {
- if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {
- return rgbaString(rgba, alpha);
- }
- return "rgb(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ")";
- }
- function rgbaString(rgba, alpha) {
- if (alpha === undefined) {
- alpha = (rgba[3] !== undefined ? rgba[3] : 1);
- }
- return "rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2]
- + ", " + alpha + ")";
- }
- function percentString(rgba, alpha) {
- if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {
- return percentaString(rgba, alpha);
- }
- var r = Math.round(rgba[0]/255 * 100),
- g = Math.round(rgba[1]/255 * 100),
- b = Math.round(rgba[2]/255 * 100);
- return "rgb(" + r + "%, " + g + "%, " + b + "%)";
- }
- function percentaString(rgba, alpha) {
- var r = Math.round(rgba[0]/255 * 100),
- g = Math.round(rgba[1]/255 * 100),
- b = Math.round(rgba[2]/255 * 100);
- return "rgba(" + r + "%, " + g + "%, " + b + "%, " + (alpha || rgba[3] || 1) + ")";
- }
- function hslString(hsla, alpha) {
- if (alpha < 1 || (hsla[3] && hsla[3] < 1)) {
- return hslaString(hsla, alpha);
- }
- return "hsl(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%)";
- }
- function hslaString(hsla, alpha) {
- if (alpha === undefined) {
- alpha = (hsla[3] !== undefined ? hsla[3] : 1);
- }
- return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, "
- + alpha + ")";
- }
- function hwbString(hwb, alpha) {
- if (alpha === undefined) {
- alpha = (hwb[3] !== undefined ? hwb[3] : 1);
- }
- return "hwb(" + hwb[0] + ", " + hwb[1] + "%, " + hwb[2] + "%"
- + (alpha !== undefined && alpha !== 1 ? ", " + alpha : "") + ")";
- }
- function keyword(rgb) {
- return reverseNames[rgb.slice(0, 3)];
- }
- function scale(num, min, max) {
- return Math.min(Math.max(min, num), max);
- }
- function hexDouble(num) {
- var str = num.toString(16).toUpperCase();
- return (str.length < 2) ? "0" + str : str;
- }
- var reverseNames = {};
- for (var name in colorName$1) {
- reverseNames[colorName$1[name]] = name;
- }
- var Color = function (obj) {
- if (obj instanceof Color) {
- return obj;
- }
- if (!(this instanceof Color)) {
- return new Color(obj);
- }
- this.valid = false;
- this.values = {
- rgb: [0, 0, 0],
- hsl: [0, 0, 0],
- hsv: [0, 0, 0],
- hwb: [0, 0, 0],
- cmyk: [0, 0, 0, 0],
- alpha: 1
- };
-
- var vals;
- if (typeof obj === 'string') {
- vals = colorString.getRgba(obj);
- if (vals) {
- this.setValues('rgb', vals);
- } else if (vals = colorString.getHsla(obj)) {
- this.setValues('hsl', vals);
- } else if (vals = colorString.getHwb(obj)) {
- this.setValues('hwb', vals);
- }
- } else if (typeof obj === 'object') {
- vals = obj;
- if (vals.r !== undefined || vals.red !== undefined) {
- this.setValues('rgb', vals);
- } else if (vals.l !== undefined || vals.lightness !== undefined) {
- this.setValues('hsl', vals);
- } else if (vals.v !== undefined || vals.value !== undefined) {
- this.setValues('hsv', vals);
- } else if (vals.w !== undefined || vals.whiteness !== undefined) {
- this.setValues('hwb', vals);
- } else if (vals.c !== undefined || vals.cyan !== undefined) {
- this.setValues('cmyk', vals);
- }
- }
- };
- Color.prototype = {
- isValid: function () {
- return this.valid;
- },
- rgb: function () {
- return this.setSpace('rgb', arguments);
- },
- hsl: function () {
- return this.setSpace('hsl', arguments);
- },
- hsv: function () {
- return this.setSpace('hsv', arguments);
- },
- hwb: function () {
- return this.setSpace('hwb', arguments);
- },
- cmyk: function () {
- return this.setSpace('cmyk', arguments);
- },
- rgbArray: function () {
- return this.values.rgb;
- },
- hslArray: function () {
- return this.values.hsl;
- },
- hsvArray: function () {
- return this.values.hsv;
- },
- hwbArray: function () {
- var values = this.values;
- if (values.alpha !== 1) {
- return values.hwb.concat([values.alpha]);
- }
- return values.hwb;
- },
- cmykArray: function () {
- return this.values.cmyk;
- },
- rgbaArray: function () {
- var values = this.values;
- return values.rgb.concat([values.alpha]);
- },
- hslaArray: function () {
- var values = this.values;
- return values.hsl.concat([values.alpha]);
- },
- alpha: function (val) {
- if (val === undefined) {
- return this.values.alpha;
- }
- this.setValues('alpha', val);
- return this;
- },
- red: function (val) {
- return this.setChannel('rgb', 0, val);
- },
- green: function (val) {
- return this.setChannel('rgb', 1, val);
- },
- blue: function (val) {
- return this.setChannel('rgb', 2, val);
- },
- hue: function (val) {
- if (val) {
- val %= 360;
- val = val < 0 ? 360 + val : val;
- }
- return this.setChannel('hsl', 0, val);
- },
- saturation: function (val) {
- return this.setChannel('hsl', 1, val);
- },
- lightness: function (val) {
- return this.setChannel('hsl', 2, val);
- },
- saturationv: function (val) {
- return this.setChannel('hsv', 1, val);
- },
- whiteness: function (val) {
- return this.setChannel('hwb', 1, val);
- },
- blackness: function (val) {
- return this.setChannel('hwb', 2, val);
- },
- value: function (val) {
- return this.setChannel('hsv', 2, val);
- },
- cyan: function (val) {
- return this.setChannel('cmyk', 0, val);
- },
- magenta: function (val) {
- return this.setChannel('cmyk', 1, val);
- },
- yellow: function (val) {
- return this.setChannel('cmyk', 2, val);
- },
- black: function (val) {
- return this.setChannel('cmyk', 3, val);
- },
- hexString: function () {
- return colorString.hexString(this.values.rgb);
- },
- rgbString: function () {
- return colorString.rgbString(this.values.rgb, this.values.alpha);
- },
- rgbaString: function () {
- return colorString.rgbaString(this.values.rgb, this.values.alpha);
- },
- percentString: function () {
- return colorString.percentString(this.values.rgb, this.values.alpha);
- },
- hslString: function () {
- return colorString.hslString(this.values.hsl, this.values.alpha);
- },
- hslaString: function () {
- return colorString.hslaString(this.values.hsl, this.values.alpha);
- },
- hwbString: function () {
- return colorString.hwbString(this.values.hwb, this.values.alpha);
- },
- keyword: function () {
- return colorString.keyword(this.values.rgb, this.values.alpha);
- },
- rgbNumber: function () {
- var rgb = this.values.rgb;
- return (rgb[0] << 16) | (rgb[1] << 8) | rgb[2];
- },
- luminosity: function () {
-
- var rgb = this.values.rgb;
- var lum = [];
- for (var i = 0; i < rgb.length; i++) {
- var chan = rgb[i] / 255;
- lum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4);
- }
- return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];
- },
- contrast: function (color2) {
-
- var lum1 = this.luminosity();
- var lum2 = color2.luminosity();
- if (lum1 > lum2) {
- return (lum1 + 0.05) / (lum2 + 0.05);
- }
- return (lum2 + 0.05) / (lum1 + 0.05);
- },
- level: function (color2) {
- var contrastRatio = this.contrast(color2);
- if (contrastRatio >= 7.1) {
- return 'AAA';
- }
- return (contrastRatio >= 4.5) ? 'AA' : '';
- },
- dark: function () {
-
- var rgb = this.values.rgb;
- var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;
- return yiq < 128;
- },
- light: function () {
- return !this.dark();
- },
- negate: function () {
- var rgb = [];
- for (var i = 0; i < 3; i++) {
- rgb[i] = 255 - this.values.rgb[i];
- }
- this.setValues('rgb', rgb);
- return this;
- },
- lighten: function (ratio) {
- var hsl = this.values.hsl;
- hsl[2] += hsl[2] * ratio;
- this.setValues('hsl', hsl);
- return this;
- },
- darken: function (ratio) {
- var hsl = this.values.hsl;
- hsl[2] -= hsl[2] * ratio;
- this.setValues('hsl', hsl);
- return this;
- },
- saturate: function (ratio) {
- var hsl = this.values.hsl;
- hsl[1] += hsl[1] * ratio;
- this.setValues('hsl', hsl);
- return this;
- },
- desaturate: function (ratio) {
- var hsl = this.values.hsl;
- hsl[1] -= hsl[1] * ratio;
- this.setValues('hsl', hsl);
- return this;
- },
- whiten: function (ratio) {
- var hwb = this.values.hwb;
- hwb[1] += hwb[1] * ratio;
- this.setValues('hwb', hwb);
- return this;
- },
- blacken: function (ratio) {
- var hwb = this.values.hwb;
- hwb[2] += hwb[2] * ratio;
- this.setValues('hwb', hwb);
- return this;
- },
- greyscale: function () {
- var rgb = this.values.rgb;
-
- var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;
- this.setValues('rgb', [val, val, val]);
- return this;
- },
- clearer: function (ratio) {
- var alpha = this.values.alpha;
- this.setValues('alpha', alpha - (alpha * ratio));
- return this;
- },
- opaquer: function (ratio) {
- var alpha = this.values.alpha;
- this.setValues('alpha', alpha + (alpha * ratio));
- return this;
- },
- rotate: function (degrees) {
- var hsl = this.values.hsl;
- var hue = (hsl[0] + degrees) % 360;
- hsl[0] = hue < 0 ? 360 + hue : hue;
- this.setValues('hsl', hsl);
- return this;
- },
-
- mix: function (mixinColor, weight) {
- var color1 = this;
- var color2 = mixinColor;
- var p = weight === undefined ? 0.5 : weight;
- var w = 2 * p - 1;
- var a = color1.alpha() - color2.alpha();
- var w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;
- var w2 = 1 - w1;
- return this
- .rgb(
- w1 * color1.red() + w2 * color2.red(),
- w1 * color1.green() + w2 * color2.green(),
- w1 * color1.blue() + w2 * color2.blue()
- )
- .alpha(color1.alpha() * p + color2.alpha() * (1 - p));
- },
- toJSON: function () {
- return this.rgb();
- },
- clone: function () {
-
-
-
-
- var result = new Color();
- var source = this.values;
- var target = result.values;
- var value, type;
- for (var prop in source) {
- if (source.hasOwnProperty(prop)) {
- value = source[prop];
- type = ({}).toString.call(value);
- if (type === '[object Array]') {
- target[prop] = value.slice(0);
- } else if (type === '[object Number]') {
- target[prop] = value;
- } else {
- console.error('unexpected color value:', value);
- }
- }
- }
- return result;
- }
- };
- Color.prototype.spaces = {
- rgb: ['red', 'green', 'blue'],
- hsl: ['hue', 'saturation', 'lightness'],
- hsv: ['hue', 'saturation', 'value'],
- hwb: ['hue', 'whiteness', 'blackness'],
- cmyk: ['cyan', 'magenta', 'yellow', 'black']
- };
- Color.prototype.maxes = {
- rgb: [255, 255, 255],
- hsl: [360, 100, 100],
- hsv: [360, 100, 100],
- hwb: [360, 100, 100],
- cmyk: [100, 100, 100, 100]
- };
- Color.prototype.getValues = function (space) {
- var values = this.values;
- var vals = {};
- for (var i = 0; i < space.length; i++) {
- vals[space.charAt(i)] = values[space][i];
- }
- if (values.alpha !== 1) {
- vals.a = values.alpha;
- }
-
- return vals;
- };
- Color.prototype.setValues = function (space, vals) {
- var values = this.values;
- var spaces = this.spaces;
- var maxes = this.maxes;
- var alpha = 1;
- var i;
- this.valid = true;
- if (space === 'alpha') {
- alpha = vals;
- } else if (vals.length) {
-
- values[space] = vals.slice(0, space.length);
- alpha = vals[space.length];
- } else if (vals[space.charAt(0)] !== undefined) {
-
- for (i = 0; i < space.length; i++) {
- values[space][i] = vals[space.charAt(i)];
- }
- alpha = vals.a;
- } else if (vals[spaces[space][0]] !== undefined) {
-
- var chans = spaces[space];
- for (i = 0; i < space.length; i++) {
- values[space][i] = vals[chans[i]];
- }
- alpha = vals.alpha;
- }
- values.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha)));
- if (space === 'alpha') {
- return false;
- }
- var capped;
-
- for (i = 0; i < space.length; i++) {
- capped = Math.max(0, Math.min(maxes[space][i], values[space][i]));
- values[space][i] = Math.round(capped);
- }
-
- for (var sname in spaces) {
- if (sname !== space) {
- values[sname] = colorConvert[space][sname](values[space]);
- }
- }
- return true;
- };
- Color.prototype.setSpace = function (space, args) {
- var vals = args[0];
- if (vals === undefined) {
-
- return this.getValues(space);
- }
-
- if (typeof vals === 'number') {
- vals = Array.prototype.slice.call(args);
- }
- this.setValues(space, vals);
- return this;
- };
- Color.prototype.setChannel = function (space, index, val) {
- var svalues = this.values[space];
- if (val === undefined) {
-
- return svalues[index];
- } else if (val === svalues[index]) {
-
- return this;
- }
-
- svalues[index] = val;
- this.setValues(space, svalues);
- return this;
- };
- if (typeof window !== 'undefined') {
- window.Color = Color;
- }
- var chartjsColor = Color;
- var helpers = {
-
- noop: function() {},
-
- uid: (function() {
- var id = 0;
- return function() {
- return id++;
- };
- }()),
-
- isNullOrUndef: function(value) {
- return value === null || typeof value === 'undefined';
- },
-
- isArray: function(value) {
- if (Array.isArray && Array.isArray(value)) {
- return true;
- }
- var type = Object.prototype.toString.call(value);
- if (type.substr(0, 7) === '[object' && type.substr(-6) === 'Array]') {
- return true;
- }
- return false;
- },
-
- isObject: function(value) {
- return value !== null && Object.prototype.toString.call(value) === '[object Object]';
- },
-
- isFinite: function(value) {
- return (typeof value === 'number' || value instanceof Number) && isFinite(value);
- },
-
- valueOrDefault: function(value, defaultValue) {
- return typeof value === 'undefined' ? defaultValue : value;
- },
-
- valueAtIndexOrDefault: function(value, index, defaultValue) {
- return helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue);
- },
-
- callback: function(fn, args, thisArg) {
- if (fn && typeof fn.call === 'function') {
- return fn.apply(thisArg, args);
- }
- },
-
- each: function(loopable, fn, thisArg, reverse) {
- var i, len, keys;
- if (helpers.isArray(loopable)) {
- len = loopable.length;
- if (reverse) {
- for (i = len - 1; i >= 0; i--) {
- fn.call(thisArg, loopable[i], i);
- }
- } else {
- for (i = 0; i < len; i++) {
- fn.call(thisArg, loopable[i], i);
- }
- }
- } else if (helpers.isObject(loopable)) {
- keys = Object.keys(loopable);
- len = keys.length;
- for (i = 0; i < len; i++) {
- fn.call(thisArg, loopable[keys[i]], keys[i]);
- }
- }
- },
-
- arrayEquals: function(a0, a1) {
- var i, ilen, v0, v1;
- if (!a0 || !a1 || a0.length !== a1.length) {
- return false;
- }
- for (i = 0, ilen = a0.length; i < ilen; ++i) {
- v0 = a0[i];
- v1 = a1[i];
- if (v0 instanceof Array && v1 instanceof Array) {
- if (!helpers.arrayEquals(v0, v1)) {
- return false;
- }
- } else if (v0 !== v1) {
-
- return false;
- }
- }
- return true;
- },
-
- clone: function(source) {
- if (helpers.isArray(source)) {
- return source.map(helpers.clone);
- }
- if (helpers.isObject(source)) {
- var target = {};
- var keys = Object.keys(source);
- var klen = keys.length;
- var k = 0;
- for (; k < klen; ++k) {
- target[keys[k]] = helpers.clone(source[keys[k]]);
- }
- return target;
- }
- return source;
- },
-
- _merger: function(key, target, source, options) {
- var tval = target[key];
- var sval = source[key];
- if (helpers.isObject(tval) && helpers.isObject(sval)) {
- helpers.merge(tval, sval, options);
- } else {
- target[key] = helpers.clone(sval);
- }
- },
-
- _mergerIf: function(key, target, source) {
- var tval = target[key];
- var sval = source[key];
- if (helpers.isObject(tval) && helpers.isObject(sval)) {
- helpers.mergeIf(tval, sval);
- } else if (!target.hasOwnProperty(key)) {
- target[key] = helpers.clone(sval);
- }
- },
-
- merge: function(target, source, options) {
- var sources = helpers.isArray(source) ? source : [source];
- var ilen = sources.length;
- var merge, i, keys, klen, k;
- if (!helpers.isObject(target)) {
- return target;
- }
- options = options || {};
- merge = options.merger || helpers._merger;
- for (i = 0; i < ilen; ++i) {
- source = sources[i];
- if (!helpers.isObject(source)) {
- continue;
- }
- keys = Object.keys(source);
- for (k = 0, klen = keys.length; k < klen; ++k) {
- merge(keys[k], target, source, options);
- }
- }
- return target;
- },
-
- mergeIf: function(target, source) {
- return helpers.merge(target, source, {merger: helpers._mergerIf});
- },
-
- extend: Object.assign || function(target) {
- return helpers.merge(target, [].slice.call(arguments, 1), {
- merger: function(key, dst, src) {
- dst[key] = src[key];
- }
- });
- },
-
- inherits: function(extensions) {
- var me = this;
- var ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function() {
- return me.apply(this, arguments);
- };
- var Surrogate = function() {
- this.constructor = ChartElement;
- };
- Surrogate.prototype = me.prototype;
- ChartElement.prototype = new Surrogate();
- ChartElement.extend = helpers.inherits;
- if (extensions) {
- helpers.extend(ChartElement.prototype, extensions);
- }
- ChartElement.__super__ = me.prototype;
- return ChartElement;
- },
- _deprecated: function(scope, value, previous, current) {
- if (value !== undefined) {
- console.warn(scope + ': "' + previous +
- '" is deprecated. Please use "' + current + '" instead');
- }
- }
- };
- var helpers_core = helpers;
- helpers.callCallback = helpers.callback;
- helpers.indexOf = function(array, item, fromIndex) {
- return Array.prototype.indexOf.call(array, item, fromIndex);
- };
- helpers.getValueOrDefault = helpers.valueOrDefault;
- helpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault;
- var effects = {
- linear: function(t) {
- return t;
- },
- easeInQuad: function(t) {
- return t * t;
- },
- easeOutQuad: function(t) {
- return -t * (t - 2);
- },
- easeInOutQuad: function(t) {
- if ((t /= 0.5) < 1) {
- return 0.5 * t * t;
- }
- return -0.5 * ((--t) * (t - 2) - 1);
- },
- easeInCubic: function(t) {
- return t * t * t;
- },
- easeOutCubic: function(t) {
- return (t = t - 1) * t * t + 1;
- },
- easeInOutCubic: function(t) {
- if ((t /= 0.5) < 1) {
- return 0.5 * t * t * t;
- }
- return 0.5 * ((t -= 2) * t * t + 2);
- },
- easeInQuart: function(t) {
- return t * t * t * t;
- },
- easeOutQuart: function(t) {
- return -((t = t - 1) * t * t * t - 1);
- },
- easeInOutQuart: function(t) {
- if ((t /= 0.5) < 1) {
- return 0.5 * t * t * t * t;
- }
- return -0.5 * ((t -= 2) * t * t * t - 2);
- },
- easeInQuint: function(t) {
- return t * t * t * t * t;
- },
- easeOutQuint: function(t) {
- return (t = t - 1) * t * t * t * t + 1;
- },
- easeInOutQuint: function(t) {
- if ((t /= 0.5) < 1) {
- return 0.5 * t * t * t * t * t;
- }
- return 0.5 * ((t -= 2) * t * t * t * t + 2);
- },
- easeInSine: function(t) {
- return -Math.cos(t * (Math.PI / 2)) + 1;
- },
- easeOutSine: function(t) {
- return Math.sin(t * (Math.PI / 2));
- },
- easeInOutSine: function(t) {
- return -0.5 * (Math.cos(Math.PI * t) - 1);
- },
- easeInExpo: function(t) {
- return (t === 0) ? 0 : Math.pow(2, 10 * (t - 1));
- },
- easeOutExpo: function(t) {
- return (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1;
- },
- easeInOutExpo: function(t) {
- if (t === 0) {
- return 0;
- }
- if (t === 1) {
- return 1;
- }
- if ((t /= 0.5) < 1) {
- return 0.5 * Math.pow(2, 10 * (t - 1));
- }
- return 0.5 * (-Math.pow(2, -10 * --t) + 2);
- },
- easeInCirc: function(t) {
- if (t >= 1) {
- return t;
- }
- return -(Math.sqrt(1 - t * t) - 1);
- },
- easeOutCirc: function(t) {
- return Math.sqrt(1 - (t = t - 1) * t);
- },
- easeInOutCirc: function(t) {
- if ((t /= 0.5) < 1) {
- return -0.5 * (Math.sqrt(1 - t * t) - 1);
- }
- return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1);
- },
- easeInElastic: function(t) {
- var s = 1.70158;
- var p = 0;
- var a = 1;
- if (t === 0) {
- return 0;
- }
- if (t === 1) {
- return 1;
- }
- if (!p) {
- p = 0.3;
- }
- if (a < 1) {
- a = 1;
- s = p / 4;
- } else {
- s = p / (2 * Math.PI) * Math.asin(1 / a);
- }
- return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));
- },
- easeOutElastic: function(t) {
- var s = 1.70158;
- var p = 0;
- var a = 1;
- if (t === 0) {
- return 0;
- }
- if (t === 1) {
- return 1;
- }
- if (!p) {
- p = 0.3;
- }
- if (a < 1) {
- a = 1;
- s = p / 4;
- } else {
- s = p / (2 * Math.PI) * Math.asin(1 / a);
- }
- return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1;
- },
- easeInOutElastic: function(t) {
- var s = 1.70158;
- var p = 0;
- var a = 1;
- if (t === 0) {
- return 0;
- }
- if ((t /= 0.5) === 2) {
- return 1;
- }
- if (!p) {
- p = 0.45;
- }
- if (a < 1) {
- a = 1;
- s = p / 4;
- } else {
- s = p / (2 * Math.PI) * Math.asin(1 / a);
- }
- if (t < 1) {
- return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));
- }
- return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1;
- },
- easeInBack: function(t) {
- var s = 1.70158;
- return t * t * ((s + 1) * t - s);
- },
- easeOutBack: function(t) {
- var s = 1.70158;
- return (t = t - 1) * t * ((s + 1) * t + s) + 1;
- },
- easeInOutBack: function(t) {
- var s = 1.70158;
- if ((t /= 0.5) < 1) {
- return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));
- }
- return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);
- },
- easeInBounce: function(t) {
- return 1 - effects.easeOutBounce(1 - t);
- },
- easeOutBounce: function(t) {
- if (t < (1 / 2.75)) {
- return 7.5625 * t * t;
- }
- if (t < (2 / 2.75)) {
- return 7.5625 * (t -= (1.5 / 2.75)) * t + 0.75;
- }
- if (t < (2.5 / 2.75)) {
- return 7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375;
- }
- return 7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375;
- },
- easeInOutBounce: function(t) {
- if (t < 0.5) {
- return effects.easeInBounce(t * 2) * 0.5;
- }
- return effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5;
- }
- };
- var helpers_easing = {
- effects: effects
- };
- helpers_core.easingEffects = effects;
- var PI = Math.PI;
- var RAD_PER_DEG = PI / 180;
- var DOUBLE_PI = PI * 2;
- var HALF_PI = PI / 2;
- var QUARTER_PI = PI / 4;
- var TWO_THIRDS_PI = PI * 2 / 3;
- var exports$1 = {
-
- clear: function(chart) {
- chart.ctx.clearRect(0, 0, chart.width, chart.height);
- },
-
- roundedRect: function(ctx, x, y, width, height, radius) {
- if (radius) {
- var r = Math.min(radius, height / 2, width / 2);
- var left = x + r;
- var top = y + r;
- var right = x + width - r;
- var bottom = y + height - r;
- ctx.moveTo(x, top);
- if (left < right && top < bottom) {
- ctx.arc(left, top, r, -PI, -HALF_PI);
- ctx.arc(right, top, r, -HALF_PI, 0);
- ctx.arc(right, bottom, r, 0, HALF_PI);
- ctx.arc(left, bottom, r, HALF_PI, PI);
- } else if (left < right) {
- ctx.moveTo(left, y);
- ctx.arc(right, top, r, -HALF_PI, HALF_PI);
- ctx.arc(left, top, r, HALF_PI, PI + HALF_PI);
- } else if (top < bottom) {
- ctx.arc(left, top, r, -PI, 0);
- ctx.arc(left, bottom, r, 0, PI);
- } else {
- ctx.arc(left, top, r, -PI, PI);
- }
- ctx.closePath();
- ctx.moveTo(x, y);
- } else {
- ctx.rect(x, y, width, height);
- }
- },
- drawPoint: function(ctx, style, radius, x, y, rotation) {
- var type, xOffset, yOffset, size, cornerRadius;
- var rad = (rotation || 0) * RAD_PER_DEG;
- if (style && typeof style === 'object') {
- type = style.toString();
- if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {
- ctx.save();
- ctx.translate(x, y);
- ctx.rotate(rad);
- ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);
- ctx.restore();
- return;
- }
- }
- if (isNaN(radius) || radius <= 0) {
- return;
- }
- ctx.beginPath();
- switch (style) {
-
- default:
- ctx.arc(x, y, radius, 0, DOUBLE_PI);
- ctx.closePath();
- break;
- case 'triangle':
- ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);
- rad += TWO_THIRDS_PI;
- ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);
- rad += TWO_THIRDS_PI;
- ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);
- ctx.closePath();
- break;
- case 'rectRounded':
-
-
-
-
-
-
-
- cornerRadius = radius * 0.516;
- size = radius - cornerRadius;
- xOffset = Math.cos(rad + QUARTER_PI) * size;
- yOffset = Math.sin(rad + QUARTER_PI) * size;
- ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);
- ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad);
- ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI);
- ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);
- ctx.closePath();
- break;
- case 'rect':
- if (!rotation) {
- size = Math.SQRT1_2 * radius;
- ctx.rect(x - size, y - size, 2 * size, 2 * size);
- break;
- }
- rad += QUARTER_PI;
-
- case 'rectRot':
- xOffset = Math.cos(rad) * radius;
- yOffset = Math.sin(rad) * radius;
- ctx.moveTo(x - xOffset, y - yOffset);
- ctx.lineTo(x + yOffset, y - xOffset);
- ctx.lineTo(x + xOffset, y + yOffset);
- ctx.lineTo(x - yOffset, y + xOffset);
- ctx.closePath();
- break;
- case 'crossRot':
- rad += QUARTER_PI;
-
- case 'cross':
- xOffset = Math.cos(rad) * radius;
- yOffset = Math.sin(rad) * radius;
- ctx.moveTo(x - xOffset, y - yOffset);
- ctx.lineTo(x + xOffset, y + yOffset);
- ctx.moveTo(x + yOffset, y - xOffset);
- ctx.lineTo(x - yOffset, y + xOffset);
- break;
- case 'star':
- xOffset = Math.cos(rad) * radius;
- yOffset = Math.sin(rad) * radius;
- ctx.moveTo(x - xOffset, y - yOffset);
- ctx.lineTo(x + xOffset, y + yOffset);
- ctx.moveTo(x + yOffset, y - xOffset);
- ctx.lineTo(x - yOffset, y + xOffset);
- rad += QUARTER_PI;
- xOffset = Math.cos(rad) * radius;
- yOffset = Math.sin(rad) * radius;
- ctx.moveTo(x - xOffset, y - yOffset);
- ctx.lineTo(x + xOffset, y + yOffset);
- ctx.moveTo(x + yOffset, y - xOffset);
- ctx.lineTo(x - yOffset, y + xOffset);
- break;
- case 'line':
- xOffset = Math.cos(rad) * radius;
- yOffset = Math.sin(rad) * radius;
- ctx.moveTo(x - xOffset, y - yOffset);
- ctx.lineTo(x + xOffset, y + yOffset);
- break;
- case 'dash':
- ctx.moveTo(x, y);
- ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius);
- break;
- }
- ctx.fill();
- ctx.stroke();
- },
-
- _isPointInArea: function(point, area) {
- var epsilon = 1e-6;
- return point.x > area.left - epsilon && point.x < area.right + epsilon &&
- point.y > area.top - epsilon && point.y < area.bottom + epsilon;
- },
- clipArea: function(ctx, area) {
- ctx.save();
- ctx.beginPath();
- ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);
- ctx.clip();
- },
- unclipArea: function(ctx) {
- ctx.restore();
- },
- lineTo: function(ctx, previous, target, flip) {
- var stepped = target.steppedLine;
- if (stepped) {
- if (stepped === 'middle') {
- var midpoint = (previous.x + target.x) / 2.0;
- ctx.lineTo(midpoint, flip ? target.y : previous.y);
- ctx.lineTo(midpoint, flip ? previous.y : target.y);
- } else if ((stepped === 'after' && !flip) || (stepped !== 'after' && flip)) {
- ctx.lineTo(previous.x, target.y);
- } else {
- ctx.lineTo(target.x, previous.y);
- }
- ctx.lineTo(target.x, target.y);
- return;
- }
- if (!target.tension) {
- ctx.lineTo(target.x, target.y);
- return;
- }
- ctx.bezierCurveTo(
- flip ? previous.controlPointPreviousX : previous.controlPointNextX,
- flip ? previous.controlPointPreviousY : previous.controlPointNextY,
- flip ? target.controlPointNextX : target.controlPointPreviousX,
- flip ? target.controlPointNextY : target.controlPointPreviousY,
- target.x,
- target.y);
- }
- };
- var helpers_canvas = exports$1;
- helpers_core.clear = exports$1.clear;
- helpers_core.drawRoundedRectangle = function(ctx) {
- ctx.beginPath();
- exports$1.roundedRect.apply(exports$1, arguments);
- };
- var defaults = {
-
- _set: function(scope, values) {
- return helpers_core.merge(this[scope] || (this[scope] = {}), values);
- }
- };
- defaults._set('global', {
- defaultColor: 'rgba(0,0,0,0.1)',
- defaultFontColor: '#666',
- defaultFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",
- defaultFontSize: 12,
- defaultFontStyle: 'normal',
- defaultLineHeight: 1.2,
- showLines: true
- });
- var core_defaults = defaults;
- var valueOrDefault = helpers_core.valueOrDefault;
- function toFontString(font) {
- if (!font || helpers_core.isNullOrUndef(font.size) || helpers_core.isNullOrUndef(font.family)) {
- return null;
- }
- return (font.style ? font.style + ' ' : '')
- + (font.weight ? font.weight + ' ' : '')
- + font.size + 'px '
- + font.family;
- }
- var helpers_options = {
-
- toLineHeight: function(value, size) {
- var matches = ('' + value).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/);
- if (!matches || matches[1] === 'normal') {
- return size * 1.2;
- }
- value = +matches[2];
- switch (matches[3]) {
- case 'px':
- return value;
- case '%':
- value /= 100;
- break;
- }
- return size * value;
- },
-
- toPadding: function(value) {
- var t, r, b, l;
- if (helpers_core.isObject(value)) {
- t = +value.top || 0;
- r = +value.right || 0;
- b = +value.bottom || 0;
- l = +value.left || 0;
- } else {
- t = r = b = l = +value || 0;
- }
- return {
- top: t,
- right: r,
- bottom: b,
- left: l,
- height: t + b,
- width: l + r
- };
- },
-
- _parseFont: function(options) {
- var globalDefaults = core_defaults.global;
- var size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize);
- var font = {
- family: valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily),
- lineHeight: helpers_core.options.toLineHeight(valueOrDefault(options.lineHeight, globalDefaults.defaultLineHeight), size),
- size: size,
- style: valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle),
- weight: null,
- string: ''
- };
- font.string = toFontString(font);
- return font;
- },
-
- resolve: function(inputs, context, index, info) {
- var cacheable = true;
- var i, ilen, value;
- for (i = 0, ilen = inputs.length; i < ilen; ++i) {
- value = inputs[i];
- if (value === undefined) {
- continue;
- }
- if (context !== undefined && typeof value === 'function') {
- value = value(context);
- cacheable = false;
- }
- if (index !== undefined && helpers_core.isArray(value)) {
- value = value[index];
- cacheable = false;
- }
- if (value !== undefined) {
- if (info && !cacheable) {
- info.cacheable = false;
- }
- return value;
- }
- }
- }
- };
- var exports$2 = {
-
- _factorize: function(value) {
- var result = [];
- var sqrt = Math.sqrt(value);
- var i;
- for (i = 1; i < sqrt; i++) {
- if (value % i === 0) {
- result.push(i);
- result.push(value / i);
- }
- }
- if (sqrt === (sqrt | 0)) {
- result.push(sqrt);
- }
- result.sort(function(a, b) {
- return a - b;
- }).pop();
- return result;
- },
- log10: Math.log10 || function(x) {
- var exponent = Math.log(x) * Math.LOG10E;
-
-
- var powerOf10 = Math.round(exponent);
- var isPowerOf10 = x === Math.pow(10, powerOf10);
- return isPowerOf10 ? powerOf10 : exponent;
- }
- };
- var helpers_math = exports$2;
- helpers_core.log10 = exports$2.log10;
- var getRtlAdapter = function(rectX, width) {
- return {
- x: function(x) {
- return rectX + rectX + width - x;
- },
- setWidth: function(w) {
- width = w;
- },
- textAlign: function(align) {
- if (align === 'center') {
- return align;
- }
- return align === 'right' ? 'left' : 'right';
- },
- xPlus: function(x, value) {
- return x - value;
- },
- leftForLtr: function(x, itemWidth) {
- return x - itemWidth;
- },
- };
- };
- var getLtrAdapter = function() {
- return {
- x: function(x) {
- return x;
- },
- setWidth: function(w) {
- },
- textAlign: function(align) {
- return align;
- },
- xPlus: function(x, value) {
- return x + value;
- },
- leftForLtr: function(x, _itemWidth) {
- return x;
- },
- };
- };
- var getAdapter = function(rtl, rectX, width) {
- return rtl ? getRtlAdapter(rectX, width) : getLtrAdapter();
- };
- var overrideTextDirection = function(ctx, direction) {
- var style, original;
- if (direction === 'ltr' || direction === 'rtl') {
- style = ctx.canvas.style;
- original = [
- style.getPropertyValue('direction'),
- style.getPropertyPriority('direction'),
- ];
- style.setProperty('direction', direction, 'important');
- ctx.prevTextDirection = original;
- }
- };
- var restoreTextDirection = function(ctx) {
- var original = ctx.prevTextDirection;
- if (original !== undefined) {
- delete ctx.prevTextDirection;
- ctx.canvas.style.setProperty('direction', original[0], original[1]);
- }
- };
- var helpers_rtl = {
- getRtlAdapter: getAdapter,
- overrideTextDirection: overrideTextDirection,
- restoreTextDirection: restoreTextDirection,
- };
- var helpers$1 = helpers_core;
- var easing = helpers_easing;
- var canvas = helpers_canvas;
- var options = helpers_options;
- var math = helpers_math;
- var rtl = helpers_rtl;
- helpers$1.easing = easing;
- helpers$1.canvas = canvas;
- helpers$1.options = options;
- helpers$1.math = math;
- helpers$1.rtl = rtl;
- function interpolate(start, view, model, ease) {
- var keys = Object.keys(model);
- var i, ilen, key, actual, origin, target, type, c0, c1;
- for (i = 0, ilen = keys.length; i < ilen; ++i) {
- key = keys[i];
- target = model[key];
-
-
- if (!view.hasOwnProperty(key)) {
- view[key] = target;
- }
- actual = view[key];
- if (actual === target || key[0] === '_') {
- continue;
- }
- if (!start.hasOwnProperty(key)) {
- start[key] = actual;
- }
- origin = start[key];
- type = typeof target;
- if (type === typeof origin) {
- if (type === 'string') {
- c0 = chartjsColor(origin);
- if (c0.valid) {
- c1 = chartjsColor(target);
- if (c1.valid) {
- view[key] = c1.mix(c0, ease).rgbString();
- continue;
- }
- }
- } else if (helpers$1.isFinite(origin) && helpers$1.isFinite(target)) {
- view[key] = origin + (target - origin) * ease;
- continue;
- }
- }
- view[key] = target;
- }
- }
- var Element = function(configuration) {
- helpers$1.extend(this, configuration);
- this.initialize.apply(this, arguments);
- };
- helpers$1.extend(Element.prototype, {
- _type: undefined,
- initialize: function() {
- this.hidden = false;
- },
- pivot: function() {
- var me = this;
- if (!me._view) {
- me._view = helpers$1.extend({}, me._model);
- }
- me._start = {};
- return me;
- },
- transition: function(ease) {
- var me = this;
- var model = me._model;
- var start = me._start;
- var view = me._view;
-
- if (!model || ease === 1) {
- me._view = helpers$1.extend({}, model);
- me._start = null;
- return me;
- }
- if (!view) {
- view = me._view = {};
- }
- if (!start) {
- start = me._start = {};
- }
- interpolate(start, view, model, ease);
- return me;
- },
- tooltipPosition: function() {
- return {
- x: this._model.x,
- y: this._model.y
- };
- },
- hasValue: function() {
- return helpers$1.isNumber(this._model.x) && helpers$1.isNumber(this._model.y);
- }
- });
- Element.extend = helpers$1.inherits;
- var core_element = Element;
- var exports$3 = core_element.extend({
- chart: null,
- currentStep: 0,
- numSteps: 60,
- easing: '',
- render: null,
- onAnimationProgress: null,
- onAnimationComplete: null,
- });
- var core_animation = exports$3;
- Object.defineProperty(exports$3.prototype, 'animationObject', {
- get: function() {
- return this;
- }
- });
- Object.defineProperty(exports$3.prototype, 'chartInstance', {
- get: function() {
- return this.chart;
- },
- set: function(value) {
- this.chart = value;
- }
- });
- core_defaults._set('global', {
- animation: {
- duration: 1000,
- easing: 'easeOutQuart',
- onProgress: helpers$1.noop,
- onComplete: helpers$1.noop
- }
- });
- var core_animations = {
- animations: [],
- request: null,
-
- addAnimation: function(chart, animation, duration, lazy) {
- var animations = this.animations;
- var i, ilen;
- animation.chart = chart;
- animation.startTime = Date.now();
- animation.duration = duration;
- if (!lazy) {
- chart.animating = true;
- }
- for (i = 0, ilen = animations.length; i < ilen; ++i) {
- if (animations[i].chart === chart) {
- animations[i] = animation;
- return;
- }
- }
- animations.push(animation);
-
- if (animations.length === 1) {
- this.requestAnimationFrame();
- }
- },
- cancelAnimation: function(chart) {
- var index = helpers$1.findIndex(this.animations, function(animation) {
- return animation.chart === chart;
- });
- if (index !== -1) {
- this.animations.splice(index, 1);
- chart.animating = false;
- }
- },
- requestAnimationFrame: function() {
- var me = this;
- if (me.request === null) {
-
-
-
- me.request = helpers$1.requestAnimFrame.call(window, function() {
- me.request = null;
- me.startDigest();
- });
- }
- },
-
- startDigest: function() {
- var me = this;
- me.advance();
-
- if (me.animations.length > 0) {
- me.requestAnimationFrame();
- }
- },
-
- advance: function() {
- var animations = this.animations;
- var animation, chart, numSteps, nextStep;
- var i = 0;
-
- while (i < animations.length) {
- animation = animations[i];
- chart = animation.chart;
- numSteps = animation.numSteps;
-
-
- nextStep = Math.floor((Date.now() - animation.startTime) / animation.duration * numSteps) + 1;
- animation.currentStep = Math.min(nextStep, numSteps);
- helpers$1.callback(animation.render, [chart, animation], chart);
- helpers$1.callback(animation.onAnimationProgress, [animation], chart);
- if (animation.currentStep >= numSteps) {
- helpers$1.callback(animation.onAnimationComplete, [animation], chart);
- chart.animating = false;
- animations.splice(i, 1);
- } else {
- ++i;
- }
- }
- }
- };
- var resolve = helpers$1.options.resolve;
- var arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'];
- function listenArrayEvents(array, listener) {
- if (array._chartjs) {
- array._chartjs.listeners.push(listener);
- return;
- }
- Object.defineProperty(array, '_chartjs', {
- configurable: true,
- enumerable: false,
- value: {
- listeners: [listener]
- }
- });
- arrayEvents.forEach(function(key) {
- var method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1);
- var base = array[key];
- Object.defineProperty(array, key, {
- configurable: true,
- enumerable: false,
- value: function() {
- var args = Array.prototype.slice.call(arguments);
- var res = base.apply(this, args);
- helpers$1.each(array._chartjs.listeners, function(object) {
- if (typeof object[method] === 'function') {
- object[method].apply(object, args);
- }
- });
- return res;
- }
- });
- });
- }
- function unlistenArrayEvents(array, listener) {
- var stub = array._chartjs;
- if (!stub) {
- return;
- }
- var listeners = stub.listeners;
- var index = listeners.indexOf(listener);
- if (index !== -1) {
- listeners.splice(index, 1);
- }
- if (listeners.length > 0) {
- return;
- }
- arrayEvents.forEach(function(key) {
- delete array[key];
- });
- delete array._chartjs;
- }
- var DatasetController = function(chart, datasetIndex) {
- this.initialize(chart, datasetIndex);
- };
- helpers$1.extend(DatasetController.prototype, {
-
- datasetElementType: null,
-
- dataElementType: null,
-
- _datasetElementOptions: [
- 'backgroundColor',
- 'borderCapStyle',
- 'borderColor',
- 'borderDash',
- 'borderDashOffset',
- 'borderJoinStyle',
- 'borderWidth'
- ],
-
- _dataElementOptions: [
- 'backgroundColor',
- 'borderColor',
- 'borderWidth',
- 'pointStyle'
- ],
- initialize: function(chart, datasetIndex) {
- var me = this;
- me.chart = chart;
- me.index = datasetIndex;
- me.linkScales();
- me.addElements();
- me._type = me.getMeta().type;
- },
- updateIndex: function(datasetIndex) {
- this.index = datasetIndex;
- },
- linkScales: function() {
- var me = this;
- var meta = me.getMeta();
- var chart = me.chart;
- var scales = chart.scales;
- var dataset = me.getDataset();
- var scalesOpts = chart.options.scales;
- if (meta.xAxisID === null || !(meta.xAxisID in scales) || dataset.xAxisID) {
- meta.xAxisID = dataset.xAxisID || scalesOpts.xAxes[0].id;
- }
- if (meta.yAxisID === null || !(meta.yAxisID in scales) || dataset.yAxisID) {
- meta.yAxisID = dataset.yAxisID || scalesOpts.yAxes[0].id;
- }
- },
- getDataset: function() {
- return this.chart.data.datasets[this.index];
- },
- getMeta: function() {
- return this.chart.getDatasetMeta(this.index);
- },
- getScaleForId: function(scaleID) {
- return this.chart.scales[scaleID];
- },
-
- _getValueScaleId: function() {
- return this.getMeta().yAxisID;
- },
-
- _getIndexScaleId: function() {
- return this.getMeta().xAxisID;
- },
-
- _getValueScale: function() {
- return this.getScaleForId(this._getValueScaleId());
- },
-
- _getIndexScale: function() {
- return this.getScaleForId(this._getIndexScaleId());
- },
- reset: function() {
- this._update(true);
- },
-
- destroy: function() {
- if (this._data) {
- unlistenArrayEvents(this._data, this);
- }
- },
- createMetaDataset: function() {
- var me = this;
- var type = me.datasetElementType;
- return type && new type({
- _chart: me.chart,
- _datasetIndex: me.index
- });
- },
- createMetaData: function(index) {
- var me = this;
- var type = me.dataElementType;
- return type && new type({
- _chart: me.chart,
- _datasetIndex: me.index,
- _index: index
- });
- },
- addElements: function() {
- var me = this;
- var meta = me.getMeta();
- var data = me.getDataset().data || [];
- var metaData = meta.data;
- var i, ilen;
- for (i = 0, ilen = data.length; i < ilen; ++i) {
- metaData[i] = metaData[i] || me.createMetaData(i);
- }
- meta.dataset = meta.dataset || me.createMetaDataset();
- },
- addElementAndReset: function(index) {
- var element = this.createMetaData(index);
- this.getMeta().data.splice(index, 0, element);
- this.updateElement(element, index, true);
- },
- buildOrUpdateElements: function() {
- var me = this;
- var dataset = me.getDataset();
- var data = dataset.data || (dataset.data = []);
-
-
-
- if (me._data !== data) {
- if (me._data) {
-
- unlistenArrayEvents(me._data, me);
- }
- if (data && Object.isExtensible(data)) {
- listenArrayEvents(data, me);
- }
- me._data = data;
- }
-
-
- me.resyncElements();
- },
-
- _configure: function() {
- var me = this;
- me._config = helpers$1.merge({}, [
- me.chart.options.datasets[me._type],
- me.getDataset(),
- ], {
- merger: function(key, target, source) {
- if (key !== '_meta' && key !== 'data') {
- helpers$1._merger(key, target, source);
- }
- }
- });
- },
- _update: function(reset) {
- var me = this;
- me._configure();
- me._cachedDataOpts = null;
- me.update(reset);
- },
- update: helpers$1.noop,
- transition: function(easingValue) {
- var meta = this.getMeta();
- var elements = meta.data || [];
- var ilen = elements.length;
- var i = 0;
- for (; i < ilen; ++i) {
- elements[i].transition(easingValue);
- }
- if (meta.dataset) {
- meta.dataset.transition(easingValue);
- }
- },
- draw: function() {
- var meta = this.getMeta();
- var elements = meta.data || [];
- var ilen = elements.length;
- var i = 0;
- if (meta.dataset) {
- meta.dataset.draw();
- }
- for (; i < ilen; ++i) {
- elements[i].draw();
- }
- },
-
- getStyle: function(index) {
- var me = this;
- var meta = me.getMeta();
- var dataset = meta.dataset;
- var style;
- me._configure();
- if (dataset && index === undefined) {
- style = me._resolveDatasetElementOptions(dataset || {});
- } else {
- index = index || 0;
- style = me._resolveDataElementOptions(meta.data[index] || {}, index);
- }
- if (style.fill === false || style.fill === null) {
- style.backgroundColor = style.borderColor;
- }
- return style;
- },
-
- _resolveDatasetElementOptions: function(element, hover) {
- var me = this;
- var chart = me.chart;
- var datasetOpts = me._config;
- var custom = element.custom || {};
- var options = chart.options.elements[me.datasetElementType.prototype._type] || {};
- var elementOptions = me._datasetElementOptions;
- var values = {};
- var i, ilen, key, readKey;
-
- var context = {
- chart: chart,
- dataset: me.getDataset(),
- datasetIndex: me.index,
- hover: hover
- };
- for (i = 0, ilen = elementOptions.length; i < ilen; ++i) {
- key = elementOptions[i];
- readKey = hover ? 'hover' + key.charAt(0).toUpperCase() + key.slice(1) : key;
- values[key] = resolve([
- custom[readKey],
- datasetOpts[readKey],
- options[readKey]
- ], context);
- }
- return values;
- },
-
- _resolveDataElementOptions: function(element, index) {
- var me = this;
- var custom = element && element.custom;
- var cached = me._cachedDataOpts;
- if (cached && !custom) {
- return cached;
- }
- var chart = me.chart;
- var datasetOpts = me._config;
- var options = chart.options.elements[me.dataElementType.prototype._type] || {};
- var elementOptions = me._dataElementOptions;
- var values = {};
-
- var context = {
- chart: chart,
- dataIndex: index,
- dataset: me.getDataset(),
- datasetIndex: me.index
- };
-
- var info = {cacheable: !custom};
- var keys, i, ilen, key;
- custom = custom || {};
- if (helpers$1.isArray(elementOptions)) {
- for (i = 0, ilen = elementOptions.length; i < ilen; ++i) {
- key = elementOptions[i];
- values[key] = resolve([
- custom[key],
- datasetOpts[key],
- options[key]
- ], context, index, info);
- }
- } else {
- keys = Object.keys(elementOptions);
- for (i = 0, ilen = keys.length; i < ilen; ++i) {
- key = keys[i];
- values[key] = resolve([
- custom[key],
- datasetOpts[elementOptions[key]],
- datasetOpts[key],
- options[key]
- ], context, index, info);
- }
- }
- if (info.cacheable) {
- me._cachedDataOpts = Object.freeze(values);
- }
- return values;
- },
- removeHoverStyle: function(element) {
- helpers$1.merge(element._model, element.$previousStyle || {});
- delete element.$previousStyle;
- },
- setHoverStyle: function(element) {
- var dataset = this.chart.data.datasets[element._datasetIndex];
- var index = element._index;
- var custom = element.custom || {};
- var model = element._model;
- var getHoverColor = helpers$1.getHoverColor;
- element.$previousStyle = {
- backgroundColor: model.backgroundColor,
- borderColor: model.borderColor,
- borderWidth: model.borderWidth
- };
- model.backgroundColor = resolve([custom.hoverBackgroundColor, dataset.hoverBackgroundColor, getHoverColor(model.backgroundColor)], undefined, index);
- model.borderColor = resolve([custom.hoverBorderColor, dataset.hoverBorderColor, getHoverColor(model.borderColor)], undefined, index);
- model.borderWidth = resolve([custom.hoverBorderWidth, dataset.hoverBorderWidth, model.borderWidth], undefined, index);
- },
-
- _removeDatasetHoverStyle: function() {
- var element = this.getMeta().dataset;
- if (element) {
- this.removeHoverStyle(element);
- }
- },
-
- _setDatasetHoverStyle: function() {
- var element = this.getMeta().dataset;
- var prev = {};
- var i, ilen, key, keys, hoverOptions, model;
- if (!element) {
- return;
- }
- model = element._model;
- hoverOptions = this._resolveDatasetElementOptions(element, true);
- keys = Object.keys(hoverOptions);
- for (i = 0, ilen = keys.length; i < ilen; ++i) {
- key = keys[i];
- prev[key] = model[key];
- model[key] = hoverOptions[key];
- }
- element.$previousStyle = prev;
- },
-
- resyncElements: function() {
- var me = this;
- var meta = me.getMeta();
- var data = me.getDataset().data;
- var numMeta = meta.data.length;
- var numData = data.length;
- if (numData < numMeta) {
- meta.data.splice(numData, numMeta - numData);
- } else if (numData > numMeta) {
- me.insertElements(numMeta, numData - numMeta);
- }
- },
-
- insertElements: function(start, count) {
- for (var i = 0; i < count; ++i) {
- this.addElementAndReset(start + i);
- }
- },
-
- onDataPush: function() {
- var count = arguments.length;
- this.insertElements(this.getDataset().data.length - count, count);
- },
-
- onDataPop: function() {
- this.getMeta().data.pop();
- },
-
- onDataShift: function() {
- this.getMeta().data.shift();
- },
-
- onDataSplice: function(start, count) {
- this.getMeta().data.splice(start, count);
- this.insertElements(start, arguments.length - 2);
- },
-
- onDataUnshift: function() {
- this.insertElements(0, arguments.length);
- }
- });
- DatasetController.extend = helpers$1.inherits;
- var core_datasetController = DatasetController;
- var TAU = Math.PI * 2;
- core_defaults._set('global', {
- elements: {
- arc: {
- backgroundColor: core_defaults.global.defaultColor,
- borderColor: '#fff',
- borderWidth: 2,
- borderAlign: 'center'
- }
- }
- });
- function clipArc(ctx, arc) {
- var startAngle = arc.startAngle;
- var endAngle = arc.endAngle;
- var pixelMargin = arc.pixelMargin;
- var angleMargin = pixelMargin / arc.outerRadius;
- var x = arc.x;
- var y = arc.y;
-
-
- ctx.beginPath();
- ctx.arc(x, y, arc.outerRadius, startAngle - angleMargin, endAngle + angleMargin);
- if (arc.innerRadius > pixelMargin) {
- angleMargin = pixelMargin / arc.innerRadius;
- ctx.arc(x, y, arc.innerRadius - pixelMargin, endAngle + angleMargin, startAngle - angleMargin, true);
- } else {
- ctx.arc(x, y, pixelMargin, endAngle + Math.PI / 2, startAngle - Math.PI / 2);
- }
- ctx.closePath();
- ctx.clip();
- }
- function drawFullCircleBorders(ctx, vm, arc, inner) {
- var endAngle = arc.endAngle;
- var i;
- if (inner) {
- arc.endAngle = arc.startAngle + TAU;
- clipArc(ctx, arc);
- arc.endAngle = endAngle;
- if (arc.endAngle === arc.startAngle && arc.fullCircles) {
- arc.endAngle += TAU;
- arc.fullCircles--;
- }
- }
- ctx.beginPath();
- ctx.arc(arc.x, arc.y, arc.innerRadius, arc.startAngle + TAU, arc.startAngle, true);
- for (i = 0; i < arc.fullCircles; ++i) {
- ctx.stroke();
- }
- ctx.beginPath();
- ctx.arc(arc.x, arc.y, vm.outerRadius, arc.startAngle, arc.startAngle + TAU);
- for (i = 0; i < arc.fullCircles; ++i) {
- ctx.stroke();
- }
- }
- function drawBorder(ctx, vm, arc) {
- var inner = vm.borderAlign === 'inner';
- if (inner) {
- ctx.lineWidth = vm.borderWidth * 2;
- ctx.lineJoin = 'round';
- } else {
- ctx.lineWidth = vm.borderWidth;
- ctx.lineJoin = 'bevel';
- }
- if (arc.fullCircles) {
- drawFullCircleBorders(ctx, vm, arc, inner);
- }
- if (inner) {
- clipArc(ctx, arc);
- }
- ctx.beginPath();
- ctx.arc(arc.x, arc.y, vm.outerRadius, arc.startAngle, arc.endAngle);
- ctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true);
- ctx.closePath();
- ctx.stroke();
- }
- var element_arc = core_element.extend({
- _type: 'arc',
- inLabelRange: function(mouseX) {
- var vm = this._view;
- if (vm) {
- return (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2));
- }
- return false;
- },
- inRange: function(chartX, chartY) {
- var vm = this._view;
- if (vm) {
- var pointRelativePosition = helpers$1.getAngleFromPoint(vm, {x: chartX, y: chartY});
- var angle = pointRelativePosition.angle;
- var distance = pointRelativePosition.distance;
-
- var startAngle = vm.startAngle;
- var endAngle = vm.endAngle;
- while (endAngle < startAngle) {
- endAngle += TAU;
- }
- while (angle > endAngle) {
- angle -= TAU;
- }
- while (angle < startAngle) {
- angle += TAU;
- }
-
- var betweenAngles = (angle >= startAngle && angle <= endAngle);
- var withinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius);
- return (betweenAngles && withinRadius);
- }
- return false;
- },
- getCenterPoint: function() {
- var vm = this._view;
- var halfAngle = (vm.startAngle + vm.endAngle) / 2;
- var halfRadius = (vm.innerRadius + vm.outerRadius) / 2;
- return {
- x: vm.x + Math.cos(halfAngle) * halfRadius,
- y: vm.y + Math.sin(halfAngle) * halfRadius
- };
- },
- getArea: function() {
- var vm = this._view;
- return Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2));
- },
- tooltipPosition: function() {
- var vm = this._view;
- var centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2);
- var rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius;
- return {
- x: vm.x + (Math.cos(centreAngle) * rangeFromCentre),
- y: vm.y + (Math.sin(centreAngle) * rangeFromCentre)
- };
- },
- draw: function() {
- var ctx = this._chart.ctx;
- var vm = this._view;
- var pixelMargin = (vm.borderAlign === 'inner') ? 0.33 : 0;
- var arc = {
- x: vm.x,
- y: vm.y,
- innerRadius: vm.innerRadius,
- outerRadius: Math.max(vm.outerRadius - pixelMargin, 0),
- pixelMargin: pixelMargin,
- startAngle: vm.startAngle,
- endAngle: vm.endAngle,
- fullCircles: Math.floor(vm.circumference / TAU)
- };
- var i;
- ctx.save();
- ctx.fillStyle = vm.backgroundColor;
- ctx.strokeStyle = vm.borderColor;
- if (arc.fullCircles) {
- arc.endAngle = arc.startAngle + TAU;
- ctx.beginPath();
- ctx.arc(arc.x, arc.y, arc.outerRadius, arc.startAngle, arc.endAngle);
- ctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true);
- ctx.closePath();
- for (i = 0; i < arc.fullCircles; ++i) {
- ctx.fill();
- }
- arc.endAngle = arc.startAngle + vm.circumference % TAU;
- }
- ctx.beginPath();
- ctx.arc(arc.x, arc.y, arc.outerRadius, arc.startAngle, arc.endAngle);
- ctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true);
- ctx.closePath();
- ctx.fill();
- if (vm.borderWidth) {
- drawBorder(ctx, vm, arc);
- }
- ctx.restore();
- }
- });
- var valueOrDefault$1 = helpers$1.valueOrDefault;
- var defaultColor = core_defaults.global.defaultColor;
- core_defaults._set('global', {
- elements: {
- line: {
- tension: 0.4,
- backgroundColor: defaultColor,
- borderWidth: 3,
- borderColor: defaultColor,
- borderCapStyle: 'butt',
- borderDash: [],
- borderDashOffset: 0.0,
- borderJoinStyle: 'miter',
- capBezierPoints: true,
- fill: true,
- }
- }
- });
- var element_line = core_element.extend({
- _type: 'line',
- draw: function() {
- var me = this;
- var vm = me._view;
- var ctx = me._chart.ctx;
- var spanGaps = vm.spanGaps;
- var points = me._children.slice();
- var globalDefaults = core_defaults.global;
- var globalOptionLineElements = globalDefaults.elements.line;
- var lastDrawnIndex = -1;
- var closePath = me._loop;
- var index, previous, currentVM;
- if (!points.length) {
- return;
- }
- if (me._loop) {
- for (index = 0; index < points.length; ++index) {
- previous = helpers$1.previousItem(points, index);
-
- if (!points[index]._view.skip && previous._view.skip) {
- points = points.slice(index).concat(points.slice(0, index));
- closePath = spanGaps;
- break;
- }
- }
-
- if (closePath) {
- points.push(points[0]);
- }
- }
- ctx.save();
-
- ctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle;
-
- if (ctx.setLineDash) {
- ctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash);
- }
- ctx.lineDashOffset = valueOrDefault$1(vm.borderDashOffset, globalOptionLineElements.borderDashOffset);
- ctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle;
- ctx.lineWidth = valueOrDefault$1(vm.borderWidth, globalOptionLineElements.borderWidth);
- ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor;
-
- ctx.beginPath();
-
- currentVM = points[0]._view;
- if (!currentVM.skip) {
- ctx.moveTo(currentVM.x, currentVM.y);
- lastDrawnIndex = 0;
- }
- for (index = 1; index < points.length; ++index) {
- currentVM = points[index]._view;
- previous = lastDrawnIndex === -1 ? helpers$1.previousItem(points, index) : points[lastDrawnIndex];
- if (!currentVM.skip) {
- if ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) {
-
- ctx.moveTo(currentVM.x, currentVM.y);
- } else {
-
- helpers$1.canvas.lineTo(ctx, previous._view, currentVM);
- }
- lastDrawnIndex = index;
- }
- }
- if (closePath) {
- ctx.closePath();
- }
- ctx.stroke();
- ctx.restore();
- }
- });
- var valueOrDefault$2 = helpers$1.valueOrDefault;
- var defaultColor$1 = core_defaults.global.defaultColor;
- core_defaults._set('global', {
- elements: {
- point: {
- radius: 3,
- pointStyle: 'circle',
- backgroundColor: defaultColor$1,
- borderColor: defaultColor$1,
- borderWidth: 1,
-
- hitRadius: 1,
- hoverRadius: 4,
- hoverBorderWidth: 1
- }
- }
- });
- function xRange(mouseX) {
- var vm = this._view;
- return vm ? (Math.abs(mouseX - vm.x) < vm.radius + vm.hitRadius) : false;
- }
- function yRange(mouseY) {
- var vm = this._view;
- return vm ? (Math.abs(mouseY - vm.y) < vm.radius + vm.hitRadius) : false;
- }
- var element_point = core_element.extend({
- _type: 'point',
- inRange: function(mouseX, mouseY) {
- var vm = this._view;
- return vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false;
- },
- inLabelRange: xRange,
- inXRange: xRange,
- inYRange: yRange,
- getCenterPoint: function() {
- var vm = this._view;
- return {
- x: vm.x,
- y: vm.y
- };
- },
- getArea: function() {
- return Math.PI * Math.pow(this._view.radius, 2);
- },
- tooltipPosition: function() {
- var vm = this._view;
- return {
- x: vm.x,
- y: vm.y,
- padding: vm.radius + vm.borderWidth
- };
- },
- draw: function(chartArea) {
- var vm = this._view;
- var ctx = this._chart.ctx;
- var pointStyle = vm.pointStyle;
- var rotation = vm.rotation;
- var radius = vm.radius;
- var x = vm.x;
- var y = vm.y;
- var globalDefaults = core_defaults.global;
- var defaultColor = globalDefaults.defaultColor;
- if (vm.skip) {
- return;
- }
-
- if (chartArea === undefined || helpers$1.canvas._isPointInArea(vm, chartArea)) {
- ctx.strokeStyle = vm.borderColor || defaultColor;
- ctx.lineWidth = valueOrDefault$2(vm.borderWidth, globalDefaults.elements.point.borderWidth);
- ctx.fillStyle = vm.backgroundColor || defaultColor;
- helpers$1.canvas.drawPoint(ctx, pointStyle, radius, x, y, rotation);
- }
- }
- });
- var defaultColor$2 = core_defaults.global.defaultColor;
- core_defaults._set('global', {
- elements: {
- rectangle: {
- backgroundColor: defaultColor$2,
- borderColor: defaultColor$2,
- borderSkipped: 'bottom',
- borderWidth: 0
- }
- }
- });
- function isVertical(vm) {
- return vm && vm.width !== undefined;
- }
- function getBarBounds(vm) {
- var x1, x2, y1, y2, half;
- if (isVertical(vm)) {
- half = vm.width / 2;
- x1 = vm.x - half;
- x2 = vm.x + half;
- y1 = Math.min(vm.y, vm.base);
- y2 = Math.max(vm.y, vm.base);
- } else {
- half = vm.height / 2;
- x1 = Math.min(vm.x, vm.base);
- x2 = Math.max(vm.x, vm.base);
- y1 = vm.y - half;
- y2 = vm.y + half;
- }
- return {
- left: x1,
- top: y1,
- right: x2,
- bottom: y2
- };
- }
- function swap(orig, v1, v2) {
- return orig === v1 ? v2 : orig === v2 ? v1 : orig;
- }
- function parseBorderSkipped(vm) {
- var edge = vm.borderSkipped;
- var res = {};
- if (!edge) {
- return res;
- }
- if (vm.horizontal) {
- if (vm.base > vm.x) {
- edge = swap(edge, 'left', 'right');
- }
- } else if (vm.base < vm.y) {
- edge = swap(edge, 'bottom', 'top');
- }
- res[edge] = true;
- return res;
- }
- function parseBorderWidth(vm, maxW, maxH) {
- var value = vm.borderWidth;
- var skip = parseBorderSkipped(vm);
- var t, r, b, l;
- if (helpers$1.isObject(value)) {
- t = +value.top || 0;
- r = +value.right || 0;
- b = +value.bottom || 0;
- l = +value.left || 0;
- } else {
- t = r = b = l = +value || 0;
- }
- return {
- t: skip.top || (t < 0) ? 0 : t > maxH ? maxH : t,
- r: skip.right || (r < 0) ? 0 : r > maxW ? maxW : r,
- b: skip.bottom || (b < 0) ? 0 : b > maxH ? maxH : b,
- l: skip.left || (l < 0) ? 0 : l > maxW ? maxW : l
- };
- }
- function boundingRects(vm) {
- var bounds = getBarBounds(vm);
- var width = bounds.right - bounds.left;
- var height = bounds.bottom - bounds.top;
- var border = parseBorderWidth(vm, width / 2, height / 2);
- return {
- outer: {
- x: bounds.left,
- y: bounds.top,
- w: width,
- h: height
- },
- inner: {
- x: bounds.left + border.l,
- y: bounds.top + border.t,
- w: width - border.l - border.r,
- h: height - border.t - border.b
- }
- };
- }
- function inRange(vm, x, y) {
- var skipX = x === null;
- var skipY = y === null;
- var bounds = !vm || (skipX && skipY) ? false : getBarBounds(vm);
- return bounds
- && (skipX || x >= bounds.left && x <= bounds.right)
- && (skipY || y >= bounds.top && y <= bounds.bottom);
- }
- var element_rectangle = core_element.extend({
- _type: 'rectangle',
- draw: function() {
- var ctx = this._chart.ctx;
- var vm = this._view;
- var rects = boundingRects(vm);
- var outer = rects.outer;
- var inner = rects.inner;
- ctx.fillStyle = vm.backgroundColor;
- ctx.fillRect(outer.x, outer.y, outer.w, outer.h);
- if (outer.w === inner.w && outer.h === inner.h) {
- return;
- }
- ctx.save();
- ctx.beginPath();
- ctx.rect(outer.x, outer.y, outer.w, outer.h);
- ctx.clip();
- ctx.fillStyle = vm.borderColor;
- ctx.rect(inner.x, inner.y, inner.w, inner.h);
- ctx.fill('evenodd');
- ctx.restore();
- },
- height: function() {
- var vm = this._view;
- return vm.base - vm.y;
- },
- inRange: function(mouseX, mouseY) {
- return inRange(this._view, mouseX, mouseY);
- },
- inLabelRange: function(mouseX, mouseY) {
- var vm = this._view;
- return isVertical(vm)
- ? inRange(vm, mouseX, null)
- : inRange(vm, null, mouseY);
- },
- inXRange: function(mouseX) {
- return inRange(this._view, mouseX, null);
- },
- inYRange: function(mouseY) {
- return inRange(this._view, null, mouseY);
- },
- getCenterPoint: function() {
- var vm = this._view;
- var x, y;
- if (isVertical(vm)) {
- x = vm.x;
- y = (vm.y + vm.base) / 2;
- } else {
- x = (vm.x + vm.base) / 2;
- y = vm.y;
- }
- return {x: x, y: y};
- },
- getArea: function() {
- var vm = this._view;
- return isVertical(vm)
- ? vm.width * Math.abs(vm.y - vm.base)
- : vm.height * Math.abs(vm.x - vm.base);
- },
- tooltipPosition: function() {
- var vm = this._view;
- return {
- x: vm.x,
- y: vm.y
- };
- }
- });
- var elements = {};
- var Arc = element_arc;
- var Line = element_line;
- var Point = element_point;
- var Rectangle = element_rectangle;
- elements.Arc = Arc;
- elements.Line = Line;
- elements.Point = Point;
- elements.Rectangle = Rectangle;
- var deprecated = helpers$1._deprecated;
- var valueOrDefault$3 = helpers$1.valueOrDefault;
- core_defaults._set('bar', {
- hover: {
- mode: 'label'
- },
- scales: {
- xAxes: [{
- type: 'category',
- offset: true,
- gridLines: {
- offsetGridLines: true
- }
- }],
- yAxes: [{
- type: 'linear'
- }]
- }
- });
- core_defaults._set('global', {
- datasets: {
- bar: {
- categoryPercentage: 0.8,
- barPercentage: 0.9
- }
- }
- });
- function computeMinSampleSize(scale, pixels) {
- var min = scale._length;
- var prev, curr, i, ilen;
- for (i = 1, ilen = pixels.length; i < ilen; ++i) {
- min = Math.min(min, Math.abs(pixels[i] - pixels[i - 1]));
- }
- for (i = 0, ilen = scale.getTicks().length; i < ilen; ++i) {
- curr = scale.getPixelForTick(i);
- min = i > 0 ? Math.min(min, Math.abs(curr - prev)) : min;
- prev = curr;
- }
- return min;
- }
- function computeFitCategoryTraits(index, ruler, options) {
- var thickness = options.barThickness;
- var count = ruler.stackCount;
- var curr = ruler.pixels[index];
- var min = helpers$1.isNullOrUndef(thickness)
- ? computeMinSampleSize(ruler.scale, ruler.pixels)
- : -1;
- var size, ratio;
- if (helpers$1.isNullOrUndef(thickness)) {
- size = min * options.categoryPercentage;
- ratio = options.barPercentage;
- } else {
-
-
-
- size = thickness * count;
- ratio = 1;
- }
- return {
- chunk: size / count,
- ratio: ratio,
- start: curr - (size / 2)
- };
- }
- function computeFlexCategoryTraits(index, ruler, options) {
- var pixels = ruler.pixels;
- var curr = pixels[index];
- var prev = index > 0 ? pixels[index - 1] : null;
- var next = index < pixels.length - 1 ? pixels[index + 1] : null;
- var percent = options.categoryPercentage;
- var start, size;
- if (prev === null) {
-
-
- prev = curr - (next === null ? ruler.end - ruler.start : next - curr);
- }
- if (next === null) {
-
- next = curr + curr - prev;
- }
- start = curr - (curr - Math.min(prev, next)) / 2 * percent;
- size = Math.abs(next - prev) / 2 * percent;
- return {
- chunk: size / ruler.stackCount,
- ratio: options.barPercentage,
- start: start
- };
- }
- var controller_bar = core_datasetController.extend({
- dataElementType: elements.Rectangle,
-
- _dataElementOptions: [
- 'backgroundColor',
- 'borderColor',
- 'borderSkipped',
- 'borderWidth',
- 'barPercentage',
- 'barThickness',
- 'categoryPercentage',
- 'maxBarThickness',
- 'minBarLength'
- ],
- initialize: function() {
- var me = this;
- var meta, scaleOpts;
- core_datasetController.prototype.initialize.apply(me, arguments);
- meta = me.getMeta();
- meta.stack = me.getDataset().stack;
- meta.bar = true;
- scaleOpts = me._getIndexScale().options;
- deprecated('bar chart', scaleOpts.barPercentage, 'scales.[x/y]Axes.barPercentage', 'dataset.barPercentage');
- deprecated('bar chart', scaleOpts.barThickness, 'scales.[x/y]Axes.barThickness', 'dataset.barThickness');
- deprecated('bar chart', scaleOpts.categoryPercentage, 'scales.[x/y]Axes.categoryPercentage', 'dataset.categoryPercentage');
- deprecated('bar chart', me._getValueScale().options.minBarLength, 'scales.[x/y]Axes.minBarLength', 'dataset.minBarLength');
- deprecated('bar chart', scaleOpts.maxBarThickness, 'scales.[x/y]Axes.maxBarThickness', 'dataset.maxBarThickness');
- },
- update: function(reset) {
- var me = this;
- var rects = me.getMeta().data;
- var i, ilen;
- me._ruler = me.getRuler();
- for (i = 0, ilen = rects.length; i < ilen; ++i) {
- me.updateElement(rects[i], i, reset);
- }
- },
- updateElement: function(rectangle, index, reset) {
- var me = this;
- var meta = me.getMeta();
- var dataset = me.getDataset();
- var options = me._resolveDataElementOptions(rectangle, index);
- rectangle._xScale = me.getScaleForId(meta.xAxisID);
- rectangle._yScale = me.getScaleForId(meta.yAxisID);
- rectangle._datasetIndex = me.index;
- rectangle._index = index;
- rectangle._model = {
- backgroundColor: options.backgroundColor,
- borderColor: options.borderColor,
- borderSkipped: options.borderSkipped,
- borderWidth: options.borderWidth,
- datasetLabel: dataset.label,
- label: me.chart.data.labels[index]
- };
- if (helpers$1.isArray(dataset.data[index])) {
- rectangle._model.borderSkipped = null;
- }
- me._updateElementGeometry(rectangle, index, reset, options);
- rectangle.pivot();
- },
-
- _updateElementGeometry: function(rectangle, index, reset, options) {
- var me = this;
- var model = rectangle._model;
- var vscale = me._getValueScale();
- var base = vscale.getBasePixel();
- var horizontal = vscale.isHorizontal();
- var ruler = me._ruler || me.getRuler();
- var vpixels = me.calculateBarValuePixels(me.index, index, options);
- var ipixels = me.calculateBarIndexPixels(me.index, index, ruler, options);
- model.horizontal = horizontal;
- model.base = reset ? base : vpixels.base;
- model.x = horizontal ? reset ? base : vpixels.head : ipixels.center;
- model.y = horizontal ? ipixels.center : reset ? base : vpixels.head;
- model.height = horizontal ? ipixels.size : undefined;
- model.width = horizontal ? undefined : ipixels.size;
- },
-
- _getStacks: function(last) {
- var me = this;
- var scale = me._getIndexScale();
- var metasets = scale._getMatchingVisibleMetas(me._type);
- var stacked = scale.options.stacked;
- var ilen = metasets.length;
- var stacks = [];
- var i, meta;
- for (i = 0; i < ilen; ++i) {
- meta = metasets[i];
-
-
-
-
-
- if (stacked === false || stacks.indexOf(meta.stack) === -1 ||
- (stacked === undefined && meta.stack === undefined)) {
- stacks.push(meta.stack);
- }
- if (meta.index === last) {
- break;
- }
- }
- return stacks;
- },
-
- getStackCount: function() {
- return this._getStacks().length;
- },
-
- getStackIndex: function(datasetIndex, name) {
- var stacks = this._getStacks(datasetIndex);
- var index = (name !== undefined)
- ? stacks.indexOf(name)
- : -1;
- return (index === -1)
- ? stacks.length - 1
- : index;
- },
-
- getRuler: function() {
- var me = this;
- var scale = me._getIndexScale();
- var pixels = [];
- var i, ilen;
- for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) {
- pixels.push(scale.getPixelForValue(null, i, me.index));
- }
- return {
- pixels: pixels,
- start: scale._startPixel,
- end: scale._endPixel,
- stackCount: me.getStackCount(),
- scale: scale
- };
- },
-
- calculateBarValuePixels: function(datasetIndex, index, options) {
- var me = this;
- var chart = me.chart;
- var scale = me._getValueScale();
- var isHorizontal = scale.isHorizontal();
- var datasets = chart.data.datasets;
- var metasets = scale._getMatchingVisibleMetas(me._type);
- var value = scale._parseValue(datasets[datasetIndex].data[index]);
- var minBarLength = options.minBarLength;
- var stacked = scale.options.stacked;
- var stack = me.getMeta().stack;
- var start = value.start === undefined ? 0 : value.max >= 0 && value.min >= 0 ? value.min : value.max;
- var length = value.start === undefined ? value.end : value.max >= 0 && value.min >= 0 ? value.max - value.min : value.min - value.max;
- var ilen = metasets.length;
- var i, imeta, ivalue, base, head, size, stackLength;
- if (stacked || (stacked === undefined && stack !== undefined)) {
- for (i = 0; i < ilen; ++i) {
- imeta = metasets[i];
- if (imeta.index === datasetIndex) {
- break;
- }
- if (imeta.stack === stack) {
- stackLength = scale._parseValue(datasets[imeta.index].data[index]);
- ivalue = stackLength.start === undefined ? stackLength.end : stackLength.min >= 0 && stackLength.max >= 0 ? stackLength.max : stackLength.min;
- if ((value.min < 0 && ivalue < 0) || (value.max >= 0 && ivalue > 0)) {
- start += ivalue;
- }
- }
- }
- }
- base = scale.getPixelForValue(start);
- head = scale.getPixelForValue(start + length);
- size = head - base;
- if (minBarLength !== undefined && Math.abs(size) < minBarLength) {
- size = minBarLength;
- if (length >= 0 && !isHorizontal || length < 0 && isHorizontal) {
- head = base - minBarLength;
- } else {
- head = base + minBarLength;
- }
- }
- return {
- size: size,
- base: base,
- head: head,
- center: head + size / 2
- };
- },
-
- calculateBarIndexPixels: function(datasetIndex, index, ruler, options) {
- var me = this;
- var range = options.barThickness === 'flex'
- ? computeFlexCategoryTraits(index, ruler, options)
- : computeFitCategoryTraits(index, ruler, options);
- var stackIndex = me.getStackIndex(datasetIndex, me.getMeta().stack);
- var center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);
- var size = Math.min(
- valueOrDefault$3(options.maxBarThickness, Infinity),
- range.chunk * range.ratio);
- return {
- base: center - size / 2,
- head: center + size / 2,
- center: center,
- size: size
- };
- },
- draw: function() {
- var me = this;
- var chart = me.chart;
- var scale = me._getValueScale();
- var rects = me.getMeta().data;
- var dataset = me.getDataset();
- var ilen = rects.length;
- var i = 0;
- helpers$1.canvas.clipArea(chart.ctx, chart.chartArea);
- for (; i < ilen; ++i) {
- var val = scale._parseValue(dataset.data[i]);
- if (!isNaN(val.min) && !isNaN(val.max)) {
- rects[i].draw();
- }
- }
- helpers$1.canvas.unclipArea(chart.ctx);
- },
-
- _resolveDataElementOptions: function() {
- var me = this;
- var values = helpers$1.extend({}, core_datasetController.prototype._resolveDataElementOptions.apply(me, arguments));
- var indexOpts = me._getIndexScale().options;
- var valueOpts = me._getValueScale().options;
- values.barPercentage = valueOrDefault$3(indexOpts.barPercentage, values.barPercentage);
- values.barThickness = valueOrDefault$3(indexOpts.barThickness, values.barThickness);
- values.categoryPercentage = valueOrDefault$3(indexOpts.categoryPercentage, values.categoryPercentage);
- values.maxBarThickness = valueOrDefault$3(indexOpts.maxBarThickness, values.maxBarThickness);
- values.minBarLength = valueOrDefault$3(valueOpts.minBarLength, values.minBarLength);
- return values;
- }
- });
- var valueOrDefault$4 = helpers$1.valueOrDefault;
- var resolve$1 = helpers$1.options.resolve;
- core_defaults._set('bubble', {
- hover: {
- mode: 'single'
- },
- scales: {
- xAxes: [{
- type: 'linear',
- position: 'bottom',
- id: 'x-axis-0'
- }],
- yAxes: [{
- type: 'linear',
- position: 'left',
- id: 'y-axis-0'
- }]
- },
- tooltips: {
- callbacks: {
- title: function() {
-
- return '';
- },
- label: function(item, data) {
- var datasetLabel = data.datasets[item.datasetIndex].label || '';
- var dataPoint = data.datasets[item.datasetIndex].data[item.index];
- return datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')';
- }
- }
- }
- });
- var controller_bubble = core_datasetController.extend({
-
- dataElementType: elements.Point,
-
- _dataElementOptions: [
- 'backgroundColor',
- 'borderColor',
- 'borderWidth',
- 'hoverBackgroundColor',
- 'hoverBorderColor',
- 'hoverBorderWidth',
- 'hoverRadius',
- 'hitRadius',
- 'pointStyle',
- 'rotation'
- ],
-
- update: function(reset) {
- var me = this;
- var meta = me.getMeta();
- var points = meta.data;
-
- helpers$1.each(points, function(point, index) {
- me.updateElement(point, index, reset);
- });
- },
-
- updateElement: function(point, index, reset) {
- var me = this;
- var meta = me.getMeta();
- var custom = point.custom || {};
- var xScale = me.getScaleForId(meta.xAxisID);
- var yScale = me.getScaleForId(meta.yAxisID);
- var options = me._resolveDataElementOptions(point, index);
- var data = me.getDataset().data[index];
- var dsIndex = me.index;
- var x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex);
- var y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex);
- point._xScale = xScale;
- point._yScale = yScale;
- point._options = options;
- point._datasetIndex = dsIndex;
- point._index = index;
- point._model = {
- backgroundColor: options.backgroundColor,
- borderColor: options.borderColor,
- borderWidth: options.borderWidth,
- hitRadius: options.hitRadius,
- pointStyle: options.pointStyle,
- rotation: options.rotation,
- radius: reset ? 0 : options.radius,
- skip: custom.skip || isNaN(x) || isNaN(y),
- x: x,
- y: y,
- };
- point.pivot();
- },
-
- setHoverStyle: function(point) {
- var model = point._model;
- var options = point._options;
- var getHoverColor = helpers$1.getHoverColor;
- point.$previousStyle = {
- backgroundColor: model.backgroundColor,
- borderColor: model.borderColor,
- borderWidth: model.borderWidth,
- radius: model.radius
- };
- model.backgroundColor = valueOrDefault$4(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
- model.borderColor = valueOrDefault$4(options.hoverBorderColor, getHoverColor(options.borderColor));
- model.borderWidth = valueOrDefault$4(options.hoverBorderWidth, options.borderWidth);
- model.radius = options.radius + options.hoverRadius;
- },
-
- _resolveDataElementOptions: function(point, index) {
- var me = this;
- var chart = me.chart;
- var dataset = me.getDataset();
- var custom = point.custom || {};
- var data = dataset.data[index] || {};
- var values = core_datasetController.prototype._resolveDataElementOptions.apply(me, arguments);
-
- var context = {
- chart: chart,
- dataIndex: index,
- dataset: dataset,
- datasetIndex: me.index
- };
-
- if (me._cachedDataOpts === values) {
- values = helpers$1.extend({}, values);
- }
-
- values.radius = resolve$1([
- custom.radius,
- data.r,
- me._config.radius,
- chart.options.elements.point.radius
- ], context, index);
- return values;
- }
- });
- var valueOrDefault$5 = helpers$1.valueOrDefault;
- var PI$1 = Math.PI;
- var DOUBLE_PI$1 = PI$1 * 2;
- var HALF_PI$1 = PI$1 / 2;
- core_defaults._set('doughnut', {
- animation: {
-
- animateRotate: true,
-
- animateScale: false
- },
- hover: {
- mode: 'single'
- },
- legendCallback: function(chart) {
- var list = document.createElement('ul');
- var data = chart.data;
- var datasets = data.datasets;
- var labels = data.labels;
- var i, ilen, listItem, listItemSpan;
- list.setAttribute('class', chart.id + '-legend');
- if (datasets.length) {
- for (i = 0, ilen = datasets[0].data.length; i < ilen; ++i) {
- listItem = list.appendChild(document.createElement('li'));
- listItemSpan = listItem.appendChild(document.createElement('span'));
- listItemSpan.style.backgroundColor = datasets[0].backgroundColor[i];
- if (labels[i]) {
- listItem.appendChild(document.createTextNode(labels[i]));
- }
- }
- }
- return list.outerHTML;
- },
- legend: {
- labels: {
- generateLabels: function(chart) {
- var data = chart.data;
- if (data.labels.length && data.datasets.length) {
- return data.labels.map(function(label, i) {
- var meta = chart.getDatasetMeta(0);
- var style = meta.controller.getStyle(i);
- return {
- text: label,
- fillStyle: style.backgroundColor,
- strokeStyle: style.borderColor,
- lineWidth: style.borderWidth,
- hidden: isNaN(data.datasets[0].data[i]) || meta.data[i].hidden,
-
- index: i
- };
- });
- }
- return [];
- }
- },
- onClick: function(e, legendItem) {
- var index = legendItem.index;
- var chart = this.chart;
- var i, ilen, meta;
- for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {
- meta = chart.getDatasetMeta(i);
-
- if (meta.data[index]) {
- meta.data[index].hidden = !meta.data[index].hidden;
- }
- }
- chart.update();
- }
- },
-
- cutoutPercentage: 50,
-
- rotation: -HALF_PI$1,
-
- circumference: DOUBLE_PI$1,
-
- tooltips: {
- callbacks: {
- title: function() {
- return '';
- },
- label: function(tooltipItem, data) {
- var dataLabel = data.labels[tooltipItem.index];
- var value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];
- if (helpers$1.isArray(dataLabel)) {
-
-
- dataLabel = dataLabel.slice();
- dataLabel[0] += value;
- } else {
- dataLabel += value;
- }
- return dataLabel;
- }
- }
- }
- });
- var controller_doughnut = core_datasetController.extend({
- dataElementType: elements.Arc,
- linkScales: helpers$1.noop,
-
- _dataElementOptions: [
- 'backgroundColor',
- 'borderColor',
- 'borderWidth',
- 'borderAlign',
- 'hoverBackgroundColor',
- 'hoverBorderColor',
- 'hoverBorderWidth',
- ],
-
- getRingIndex: function(datasetIndex) {
- var ringIndex = 0;
- for (var j = 0; j < datasetIndex; ++j) {
- if (this.chart.isDatasetVisible(j)) {
- ++ringIndex;
- }
- }
- return ringIndex;
- },
- update: function(reset) {
- var me = this;
- var chart = me.chart;
- var chartArea = chart.chartArea;
- var opts = chart.options;
- var ratioX = 1;
- var ratioY = 1;
- var offsetX = 0;
- var offsetY = 0;
- var meta = me.getMeta();
- var arcs = meta.data;
- var cutout = opts.cutoutPercentage / 100 || 0;
- var circumference = opts.circumference;
- var chartWeight = me._getRingWeight(me.index);
- var maxWidth, maxHeight, i, ilen;
-
- if (circumference < DOUBLE_PI$1) {
- var startAngle = opts.rotation % DOUBLE_PI$1;
- startAngle += startAngle >= PI$1 ? -DOUBLE_PI$1 : startAngle < -PI$1 ? DOUBLE_PI$1 : 0;
- var endAngle = startAngle + circumference;
- var startX = Math.cos(startAngle);
- var startY = Math.sin(startAngle);
- var endX = Math.cos(endAngle);
- var endY = Math.sin(endAngle);
- var contains0 = (startAngle <= 0 && endAngle >= 0) || endAngle >= DOUBLE_PI$1;
- var contains90 = (startAngle <= HALF_PI$1 && endAngle >= HALF_PI$1) || endAngle >= DOUBLE_PI$1 + HALF_PI$1;
- var contains180 = startAngle === -PI$1 || endAngle >= PI$1;
- var contains270 = (startAngle <= -HALF_PI$1 && endAngle >= -HALF_PI$1) || endAngle >= PI$1 + HALF_PI$1;
- var minX = contains180 ? -1 : Math.min(startX, startX * cutout, endX, endX * cutout);
- var minY = contains270 ? -1 : Math.min(startY, startY * cutout, endY, endY * cutout);
- var maxX = contains0 ? 1 : Math.max(startX, startX * cutout, endX, endX * cutout);
- var maxY = contains90 ? 1 : Math.max(startY, startY * cutout, endY, endY * cutout);
- ratioX = (maxX - minX) / 2;
- ratioY = (maxY - minY) / 2;
- offsetX = -(maxX + minX) / 2;
- offsetY = -(maxY + minY) / 2;
- }
- for (i = 0, ilen = arcs.length; i < ilen; ++i) {
- arcs[i]._options = me._resolveDataElementOptions(arcs[i], i);
- }
- chart.borderWidth = me.getMaxBorderWidth();
- maxWidth = (chartArea.right - chartArea.left - chart.borderWidth) / ratioX;
- maxHeight = (chartArea.bottom - chartArea.top - chart.borderWidth) / ratioY;
- chart.outerRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);
- chart.innerRadius = Math.max(chart.outerRadius * cutout, 0);
- chart.radiusLength = (chart.outerRadius - chart.innerRadius) / (me._getVisibleDatasetWeightTotal() || 1);
- chart.offsetX = offsetX * chart.outerRadius;
- chart.offsetY = offsetY * chart.outerRadius;
- meta.total = me.calculateTotal();
- me.outerRadius = chart.outerRadius - chart.radiusLength * me._getRingWeightOffset(me.index);
- me.innerRadius = Math.max(me.outerRadius - chart.radiusLength * chartWeight, 0);
- for (i = 0, ilen = arcs.length; i < ilen; ++i) {
- me.updateElement(arcs[i], i, reset);
- }
- },
- updateElement: function(arc, index, reset) {
- var me = this;
- var chart = me.chart;
- var chartArea = chart.chartArea;
- var opts = chart.options;
- var animationOpts = opts.animation;
- var centerX = (chartArea.left + chartArea.right) / 2;
- var centerY = (chartArea.top + chartArea.bottom) / 2;
- var startAngle = opts.rotation;
- var endAngle = opts.rotation;
- var dataset = me.getDataset();
- var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / DOUBLE_PI$1);
- var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius;
- var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius;
- var options = arc._options || {};
- helpers$1.extend(arc, {
-
- _datasetIndex: me.index,
- _index: index,
-
- _model: {
- backgroundColor: options.backgroundColor,
- borderColor: options.borderColor,
- borderWidth: options.borderWidth,
- borderAlign: options.borderAlign,
- x: centerX + chart.offsetX,
- y: centerY + chart.offsetY,
- startAngle: startAngle,
- endAngle: endAngle,
- circumference: circumference,
- outerRadius: outerRadius,
- innerRadius: innerRadius,
- label: helpers$1.valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index])
- }
- });
- var model = arc._model;
-
- if (!reset || !animationOpts.animateRotate) {
- if (index === 0) {
- model.startAngle = opts.rotation;
- } else {
- model.startAngle = me.getMeta().data[index - 1]._model.endAngle;
- }
- model.endAngle = model.startAngle + model.circumference;
- }
- arc.pivot();
- },
- calculateTotal: function() {
- var dataset = this.getDataset();
- var meta = this.getMeta();
- var total = 0;
- var value;
- helpers$1.each(meta.data, function(element, index) {
- value = dataset.data[index];
- if (!isNaN(value) && !element.hidden) {
- total += Math.abs(value);
- }
- });
-
- return total;
- },
- calculateCircumference: function(value) {
- var total = this.getMeta().total;
- if (total > 0 && !isNaN(value)) {
- return DOUBLE_PI$1 * (Math.abs(value) / total);
- }
- return 0;
- },
-
- getMaxBorderWidth: function(arcs) {
- var me = this;
- var max = 0;
- var chart = me.chart;
- var i, ilen, meta, arc, controller, options, borderWidth, hoverWidth;
- if (!arcs) {
-
- for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {
- if (chart.isDatasetVisible(i)) {
- meta = chart.getDatasetMeta(i);
- arcs = meta.data;
- if (i !== me.index) {
- controller = meta.controller;
- }
- break;
- }
- }
- }
- if (!arcs) {
- return 0;
- }
- for (i = 0, ilen = arcs.length; i < ilen; ++i) {
- arc = arcs[i];
- if (controller) {
- controller._configure();
- options = controller._resolveDataElementOptions(arc, i);
- } else {
- options = arc._options;
- }
- if (options.borderAlign !== 'inner') {
- borderWidth = options.borderWidth;
- hoverWidth = options.hoverBorderWidth;
- max = borderWidth > max ? borderWidth : max;
- max = hoverWidth > max ? hoverWidth : max;
- }
- }
- return max;
- },
-
- setHoverStyle: function(arc) {
- var model = arc._model;
- var options = arc._options;
- var getHoverColor = helpers$1.getHoverColor;
- arc.$previousStyle = {
- backgroundColor: model.backgroundColor,
- borderColor: model.borderColor,
- borderWidth: model.borderWidth,
- };
- model.backgroundColor = valueOrDefault$5(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
- model.borderColor = valueOrDefault$5(options.hoverBorderColor, getHoverColor(options.borderColor));
- model.borderWidth = valueOrDefault$5(options.hoverBorderWidth, options.borderWidth);
- },
-
- _getRingWeightOffset: function(datasetIndex) {
- var ringWeightOffset = 0;
- for (var i = 0; i < datasetIndex; ++i) {
- if (this.chart.isDatasetVisible(i)) {
- ringWeightOffset += this._getRingWeight(i);
- }
- }
- return ringWeightOffset;
- },
-
- _getRingWeight: function(dataSetIndex) {
- return Math.max(valueOrDefault$5(this.chart.data.datasets[dataSetIndex].weight, 1), 0);
- },
-
- _getVisibleDatasetWeightTotal: function() {
- return this._getRingWeightOffset(this.chart.data.datasets.length);
- }
- });
- core_defaults._set('horizontalBar', {
- hover: {
- mode: 'index',
- axis: 'y'
- },
- scales: {
- xAxes: [{
- type: 'linear',
- position: 'bottom'
- }],
- yAxes: [{
- type: 'category',
- position: 'left',
- offset: true,
- gridLines: {
- offsetGridLines: true
- }
- }]
- },
- elements: {
- rectangle: {
- borderSkipped: 'left'
- }
- },
- tooltips: {
- mode: 'index',
- axis: 'y'
- }
- });
- core_defaults._set('global', {
- datasets: {
- horizontalBar: {
- categoryPercentage: 0.8,
- barPercentage: 0.9
- }
- }
- });
- var controller_horizontalBar = controller_bar.extend({
-
- _getValueScaleId: function() {
- return this.getMeta().xAxisID;
- },
-
- _getIndexScaleId: function() {
- return this.getMeta().yAxisID;
- }
- });
- var valueOrDefault$6 = helpers$1.valueOrDefault;
- var resolve$2 = helpers$1.options.resolve;
- var isPointInArea = helpers$1.canvas._isPointInArea;
- core_defaults._set('line', {
- showLines: true,
- spanGaps: false,
- hover: {
- mode: 'label'
- },
- scales: {
- xAxes: [{
- type: 'category',
- id: 'x-axis-0'
- }],
- yAxes: [{
- type: 'linear',
- id: 'y-axis-0'
- }]
- }
- });
- function scaleClip(scale, halfBorderWidth) {
- var tickOpts = scale && scale.options.ticks || {};
- var reverse = tickOpts.reverse;
- var min = tickOpts.min === undefined ? halfBorderWidth : 0;
- var max = tickOpts.max === undefined ? halfBorderWidth : 0;
- return {
- start: reverse ? max : min,
- end: reverse ? min : max
- };
- }
- function defaultClip(xScale, yScale, borderWidth) {
- var halfBorderWidth = borderWidth / 2;
- var x = scaleClip(xScale, halfBorderWidth);
- var y = scaleClip(yScale, halfBorderWidth);
- return {
- top: y.end,
- right: x.end,
- bottom: y.start,
- left: x.start
- };
- }
- function toClip(value) {
- var t, r, b, l;
- if (helpers$1.isObject(value)) {
- t = value.top;
- r = value.right;
- b = value.bottom;
- l = value.left;
- } else {
- t = r = b = l = value;
- }
- return {
- top: t,
- right: r,
- bottom: b,
- left: l
- };
- }
- var controller_line = core_datasetController.extend({
- datasetElementType: elements.Line,
- dataElementType: elements.Point,
-
- _datasetElementOptions: [
- 'backgroundColor',
- 'borderCapStyle',
- 'borderColor',
- 'borderDash',
- 'borderDashOffset',
- 'borderJoinStyle',
- 'borderWidth',
- 'cubicInterpolationMode',
- 'fill'
- ],
-
- _dataElementOptions: {
- backgroundColor: 'pointBackgroundColor',
- borderColor: 'pointBorderColor',
- borderWidth: 'pointBorderWidth',
- hitRadius: 'pointHitRadius',
- hoverBackgroundColor: 'pointHoverBackgroundColor',
- hoverBorderColor: 'pointHoverBorderColor',
- hoverBorderWidth: 'pointHoverBorderWidth',
- hoverRadius: 'pointHoverRadius',
- pointStyle: 'pointStyle',
- radius: 'pointRadius',
- rotation: 'pointRotation'
- },
- update: function(reset) {
- var me = this;
- var meta = me.getMeta();
- var line = meta.dataset;
- var points = meta.data || [];
- var options = me.chart.options;
- var config = me._config;
- var showLine = me._showLine = valueOrDefault$6(config.showLine, options.showLines);
- var i, ilen;
- me._xScale = me.getScaleForId(meta.xAxisID);
- me._yScale = me.getScaleForId(meta.yAxisID);
-
- if (showLine) {
-
- if (config.tension !== undefined && config.lineTension === undefined) {
- config.lineTension = config.tension;
- }
-
- line._scale = me._yScale;
- line._datasetIndex = me.index;
-
- line._children = points;
-
- line._model = me._resolveDatasetElementOptions(line);
- line.pivot();
- }
-
- for (i = 0, ilen = points.length; i < ilen; ++i) {
- me.updateElement(points[i], i, reset);
- }
- if (showLine && line._model.tension !== 0) {
- me.updateBezierControlPoints();
- }
-
- for (i = 0, ilen = points.length; i < ilen; ++i) {
- points[i].pivot();
- }
- },
- updateElement: function(point, index, reset) {
- var me = this;
- var meta = me.getMeta();
- var custom = point.custom || {};
- var dataset = me.getDataset();
- var datasetIndex = me.index;
- var value = dataset.data[index];
- var xScale = me._xScale;
- var yScale = me._yScale;
- var lineModel = meta.dataset._model;
- var x, y;
- var options = me._resolveDataElementOptions(point, index);
- x = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex);
- y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex);
-
- point._xScale = xScale;
- point._yScale = yScale;
- point._options = options;
- point._datasetIndex = datasetIndex;
- point._index = index;
-
- point._model = {
- x: x,
- y: y,
- skip: custom.skip || isNaN(x) || isNaN(y),
-
- radius: options.radius,
- pointStyle: options.pointStyle,
- rotation: options.rotation,
- backgroundColor: options.backgroundColor,
- borderColor: options.borderColor,
- borderWidth: options.borderWidth,
- tension: valueOrDefault$6(custom.tension, lineModel ? lineModel.tension : 0),
- steppedLine: lineModel ? lineModel.steppedLine : false,
-
- hitRadius: options.hitRadius
- };
- },
-
- _resolveDatasetElementOptions: function(element) {
- var me = this;
- var config = me._config;
- var custom = element.custom || {};
- var options = me.chart.options;
- var lineOptions = options.elements.line;
- var values = core_datasetController.prototype._resolveDatasetElementOptions.apply(me, arguments);
-
-
-
- values.spanGaps = valueOrDefault$6(config.spanGaps, options.spanGaps);
- values.tension = valueOrDefault$6(config.lineTension, lineOptions.tension);
- values.steppedLine = resolve$2([custom.steppedLine, config.steppedLine, lineOptions.stepped]);
- values.clip = toClip(valueOrDefault$6(config.clip, defaultClip(me._xScale, me._yScale, values.borderWidth)));
- return values;
- },
- calculatePointY: function(value, index, datasetIndex) {
- var me = this;
- var chart = me.chart;
- var yScale = me._yScale;
- var sumPos = 0;
- var sumNeg = 0;
- var i, ds, dsMeta, stackedRightValue, rightValue, metasets, ilen;
- if (yScale.options.stacked) {
- rightValue = +yScale.getRightValue(value);
- metasets = chart._getSortedVisibleDatasetMetas();
- ilen = metasets.length;
- for (i = 0; i < ilen; ++i) {
- dsMeta = metasets[i];
- if (dsMeta.index === datasetIndex) {
- break;
- }
- ds = chart.data.datasets[dsMeta.index];
- if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id) {
- stackedRightValue = +yScale.getRightValue(ds.data[index]);
- if (stackedRightValue < 0) {
- sumNeg += stackedRightValue || 0;
- } else {
- sumPos += stackedRightValue || 0;
- }
- }
- }
- if (rightValue < 0) {
- return yScale.getPixelForValue(sumNeg + rightValue);
- }
- return yScale.getPixelForValue(sumPos + rightValue);
- }
- return yScale.getPixelForValue(value);
- },
- updateBezierControlPoints: function() {
- var me = this;
- var chart = me.chart;
- var meta = me.getMeta();
- var lineModel = meta.dataset._model;
- var area = chart.chartArea;
- var points = meta.data || [];
- var i, ilen, model, controlPoints;
-
- if (lineModel.spanGaps) {
- points = points.filter(function(pt) {
- return !pt._model.skip;
- });
- }
- function capControlPoint(pt, min, max) {
- return Math.max(Math.min(pt, max), min);
- }
- if (lineModel.cubicInterpolationMode === 'monotone') {
- helpers$1.splineCurveMonotone(points);
- } else {
- for (i = 0, ilen = points.length; i < ilen; ++i) {
- model = points[i]._model;
- controlPoints = helpers$1.splineCurve(
- helpers$1.previousItem(points, i)._model,
- model,
- helpers$1.nextItem(points, i)._model,
- lineModel.tension
- );
- model.controlPointPreviousX = controlPoints.previous.x;
- model.controlPointPreviousY = controlPoints.previous.y;
- model.controlPointNextX = controlPoints.next.x;
- model.controlPointNextY = controlPoints.next.y;
- }
- }
- if (chart.options.elements.line.capBezierPoints) {
- for (i = 0, ilen = points.length; i < ilen; ++i) {
- model = points[i]._model;
- if (isPointInArea(model, area)) {
- if (i > 0 && isPointInArea(points[i - 1]._model, area)) {
- model.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right);
- model.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom);
- }
- if (i < points.length - 1 && isPointInArea(points[i + 1]._model, area)) {
- model.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right);
- model.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom);
- }
- }
- }
- }
- },
- draw: function() {
- var me = this;
- var chart = me.chart;
- var meta = me.getMeta();
- var points = meta.data || [];
- var area = chart.chartArea;
- var canvas = chart.canvas;
- var i = 0;
- var ilen = points.length;
- var clip;
- if (me._showLine) {
- clip = meta.dataset._model.clip;
- helpers$1.canvas.clipArea(chart.ctx, {
- left: clip.left === false ? 0 : area.left - clip.left,
- right: clip.right === false ? canvas.width : area.right + clip.right,
- top: clip.top === false ? 0 : area.top - clip.top,
- bottom: clip.bottom === false ? canvas.height : area.bottom + clip.bottom
- });
- meta.dataset.draw();
- helpers$1.canvas.unclipArea(chart.ctx);
- }
-
- for (; i < ilen; ++i) {
- points[i].draw(area);
- }
- },
-
- setHoverStyle: function(point) {
- var model = point._model;
- var options = point._options;
- var getHoverColor = helpers$1.getHoverColor;
- point.$previousStyle = {
- backgroundColor: model.backgroundColor,
- borderColor: model.borderColor,
- borderWidth: model.borderWidth,
- radius: model.radius
- };
- model.backgroundColor = valueOrDefault$6(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
- model.borderColor = valueOrDefault$6(options.hoverBorderColor, getHoverColor(options.borderColor));
- model.borderWidth = valueOrDefault$6(options.hoverBorderWidth, options.borderWidth);
- model.radius = valueOrDefault$6(options.hoverRadius, options.radius);
- },
- });
- var resolve$3 = helpers$1.options.resolve;
- core_defaults._set('polarArea', {
- scale: {
- type: 'radialLinear',
- angleLines: {
- display: false
- },
- gridLines: {
- circular: true
- },
- pointLabels: {
- display: false
- },
- ticks: {
- beginAtZero: true
- }
- },
-
- animation: {
- animateRotate: true,
- animateScale: true
- },
- startAngle: -0.5 * Math.PI,
- legendCallback: function(chart) {
- var list = document.createElement('ul');
- var data = chart.data;
- var datasets = data.datasets;
- var labels = data.labels;
- var i, ilen, listItem, listItemSpan;
- list.setAttribute('class', chart.id + '-legend');
- if (datasets.length) {
- for (i = 0, ilen = datasets[0].data.length; i < ilen; ++i) {
- listItem = list.appendChild(document.createElement('li'));
- listItemSpan = listItem.appendChild(document.createElement('span'));
- listItemSpan.style.backgroundColor = datasets[0].backgroundColor[i];
- if (labels[i]) {
- listItem.appendChild(document.createTextNode(labels[i]));
- }
- }
- }
- return list.outerHTML;
- },
- legend: {
- labels: {
- generateLabels: function(chart) {
- var data = chart.data;
- if (data.labels.length && data.datasets.length) {
- return data.labels.map(function(label, i) {
- var meta = chart.getDatasetMeta(0);
- var style = meta.controller.getStyle(i);
- return {
- text: label,
- fillStyle: style.backgroundColor,
- strokeStyle: style.borderColor,
- lineWidth: style.borderWidth,
- hidden: isNaN(data.datasets[0].data[i]) || meta.data[i].hidden,
-
- index: i
- };
- });
- }
- return [];
- }
- },
- onClick: function(e, legendItem) {
- var index = legendItem.index;
- var chart = this.chart;
- var i, ilen, meta;
- for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {
- meta = chart.getDatasetMeta(i);
- meta.data[index].hidden = !meta.data[index].hidden;
- }
- chart.update();
- }
- },
-
- tooltips: {
- callbacks: {
- title: function() {
- return '';
- },
- label: function(item, data) {
- return data.labels[item.index] + ': ' + item.yLabel;
- }
- }
- }
- });
- var controller_polarArea = core_datasetController.extend({
- dataElementType: elements.Arc,
- linkScales: helpers$1.noop,
-
- _dataElementOptions: [
- 'backgroundColor',
- 'borderColor',
- 'borderWidth',
- 'borderAlign',
- 'hoverBackgroundColor',
- 'hoverBorderColor',
- 'hoverBorderWidth',
- ],
-
- _getIndexScaleId: function() {
- return this.chart.scale.id;
- },
-
- _getValueScaleId: function() {
- return this.chart.scale.id;
- },
- update: function(reset) {
- var me = this;
- var dataset = me.getDataset();
- var meta = me.getMeta();
- var start = me.chart.options.startAngle || 0;
- var starts = me._starts = [];
- var angles = me._angles = [];
- var arcs = meta.data;
- var i, ilen, angle;
- me._updateRadius();
- meta.count = me.countVisibleElements();
- for (i = 0, ilen = dataset.data.length; i < ilen; i++) {
- starts[i] = start;
- angle = me._computeAngle(i);
- angles[i] = angle;
- start += angle;
- }
- for (i = 0, ilen = arcs.length; i < ilen; ++i) {
- arcs[i]._options = me._resolveDataElementOptions(arcs[i], i);
- me.updateElement(arcs[i], i, reset);
- }
- },
-
- _updateRadius: function() {
- var me = this;
- var chart = me.chart;
- var chartArea = chart.chartArea;
- var opts = chart.options;
- var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);
- chart.outerRadius = Math.max(minSize / 2, 0);
- chart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);
- chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();
- me.outerRadius = chart.outerRadius - (chart.radiusLength * me.index);
- me.innerRadius = me.outerRadius - chart.radiusLength;
- },
- updateElement: function(arc, index, reset) {
- var me = this;
- var chart = me.chart;
- var dataset = me.getDataset();
- var opts = chart.options;
- var animationOpts = opts.animation;
- var scale = chart.scale;
- var labels = chart.data.labels;
- var centerX = scale.xCenter;
- var centerY = scale.yCenter;
-
- var datasetStartAngle = opts.startAngle;
- var distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);
- var startAngle = me._starts[index];
- var endAngle = startAngle + (arc.hidden ? 0 : me._angles[index]);
- var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);
- var options = arc._options || {};
- helpers$1.extend(arc, {
-
- _datasetIndex: me.index,
- _index: index,
- _scale: scale,
-
- _model: {
- backgroundColor: options.backgroundColor,
- borderColor: options.borderColor,
- borderWidth: options.borderWidth,
- borderAlign: options.borderAlign,
- x: centerX,
- y: centerY,
- innerRadius: 0,
- outerRadius: reset ? resetRadius : distance,
- startAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle,
- endAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle,
- label: helpers$1.valueAtIndexOrDefault(labels, index, labels[index])
- }
- });
- arc.pivot();
- },
- countVisibleElements: function() {
- var dataset = this.getDataset();
- var meta = this.getMeta();
- var count = 0;
- helpers$1.each(meta.data, function(element, index) {
- if (!isNaN(dataset.data[index]) && !element.hidden) {
- count++;
- }
- });
- return count;
- },
-
- setHoverStyle: function(arc) {
- var model = arc._model;
- var options = arc._options;
- var getHoverColor = helpers$1.getHoverColor;
- var valueOrDefault = helpers$1.valueOrDefault;
- arc.$previousStyle = {
- backgroundColor: model.backgroundColor,
- borderColor: model.borderColor,
- borderWidth: model.borderWidth,
- };
- model.backgroundColor = valueOrDefault(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
- model.borderColor = valueOrDefault(options.hoverBorderColor, getHoverColor(options.borderColor));
- model.borderWidth = valueOrDefault(options.hoverBorderWidth, options.borderWidth);
- },
-
- _computeAngle: function(index) {
- var me = this;
- var count = this.getMeta().count;
- var dataset = me.getDataset();
- var meta = me.getMeta();
- if (isNaN(dataset.data[index]) || meta.data[index].hidden) {
- return 0;
- }
-
- var context = {
- chart: me.chart,
- dataIndex: index,
- dataset: dataset,
- datasetIndex: me.index
- };
- return resolve$3([
- me.chart.options.elements.arc.angle,
- (2 * Math.PI) / count
- ], context, index);
- }
- });
- core_defaults._set('pie', helpers$1.clone(core_defaults.doughnut));
- core_defaults._set('pie', {
- cutoutPercentage: 0
- });
- var controller_pie = controller_doughnut;
- var valueOrDefault$7 = helpers$1.valueOrDefault;
- core_defaults._set('radar', {
- spanGaps: false,
- scale: {
- type: 'radialLinear'
- },
- elements: {
- line: {
- fill: 'start',
- tension: 0
- }
- }
- });
- var controller_radar = core_datasetController.extend({
- datasetElementType: elements.Line,
- dataElementType: elements.Point,
- linkScales: helpers$1.noop,
-
- _datasetElementOptions: [
- 'backgroundColor',
- 'borderWidth',
- 'borderColor',
- 'borderCapStyle',
- 'borderDash',
- 'borderDashOffset',
- 'borderJoinStyle',
- 'fill'
- ],
-
- _dataElementOptions: {
- backgroundColor: 'pointBackgroundColor',
- borderColor: 'pointBorderColor',
- borderWidth: 'pointBorderWidth',
- hitRadius: 'pointHitRadius',
- hoverBackgroundColor: 'pointHoverBackgroundColor',
- hoverBorderColor: 'pointHoverBorderColor',
- hoverBorderWidth: 'pointHoverBorderWidth',
- hoverRadius: 'pointHoverRadius',
- pointStyle: 'pointStyle',
- radius: 'pointRadius',
- rotation: 'pointRotation'
- },
-
- _getIndexScaleId: function() {
- return this.chart.scale.id;
- },
-
- _getValueScaleId: function() {
- return this.chart.scale.id;
- },
- update: function(reset) {
- var me = this;
- var meta = me.getMeta();
- var line = meta.dataset;
- var points = meta.data || [];
- var scale = me.chart.scale;
- var config = me._config;
- var i, ilen;
-
- if (config.tension !== undefined && config.lineTension === undefined) {
- config.lineTension = config.tension;
- }
-
- line._scale = scale;
- line._datasetIndex = me.index;
-
- line._children = points;
- line._loop = true;
-
- line._model = me._resolveDatasetElementOptions(line);
- line.pivot();
-
- for (i = 0, ilen = points.length; i < ilen; ++i) {
- me.updateElement(points[i], i, reset);
- }
-
- me.updateBezierControlPoints();
-
- for (i = 0, ilen = points.length; i < ilen; ++i) {
- points[i].pivot();
- }
- },
- updateElement: function(point, index, reset) {
- var me = this;
- var custom = point.custom || {};
- var dataset = me.getDataset();
- var scale = me.chart.scale;
- var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]);
- var options = me._resolveDataElementOptions(point, index);
- var lineModel = me.getMeta().dataset._model;
- var x = reset ? scale.xCenter : pointPosition.x;
- var y = reset ? scale.yCenter : pointPosition.y;
-
- point._scale = scale;
- point._options = options;
- point._datasetIndex = me.index;
- point._index = index;
-
- point._model = {
- x: x,
- y: y,
- skip: custom.skip || isNaN(x) || isNaN(y),
-
- radius: options.radius,
- pointStyle: options.pointStyle,
- rotation: options.rotation,
- backgroundColor: options.backgroundColor,
- borderColor: options.borderColor,
- borderWidth: options.borderWidth,
- tension: valueOrDefault$7(custom.tension, lineModel ? lineModel.tension : 0),
-
- hitRadius: options.hitRadius
- };
- },
-
- _resolveDatasetElementOptions: function() {
- var me = this;
- var config = me._config;
- var options = me.chart.options;
- var values = core_datasetController.prototype._resolveDatasetElementOptions.apply(me, arguments);
- values.spanGaps = valueOrDefault$7(config.spanGaps, options.spanGaps);
- values.tension = valueOrDefault$7(config.lineTension, options.elements.line.tension);
- return values;
- },
- updateBezierControlPoints: function() {
- var me = this;
- var meta = me.getMeta();
- var area = me.chart.chartArea;
- var points = meta.data || [];
- var i, ilen, model, controlPoints;
-
- if (meta.dataset._model.spanGaps) {
- points = points.filter(function(pt) {
- return !pt._model.skip;
- });
- }
- function capControlPoint(pt, min, max) {
- return Math.max(Math.min(pt, max), min);
- }
- for (i = 0, ilen = points.length; i < ilen; ++i) {
- model = points[i]._model;
- controlPoints = helpers$1.splineCurve(
- helpers$1.previousItem(points, i, true)._model,
- model,
- helpers$1.nextItem(points, i, true)._model,
- model.tension
- );
-
- model.controlPointPreviousX = capControlPoint(controlPoints.previous.x, area.left, area.right);
- model.controlPointPreviousY = capControlPoint(controlPoints.previous.y, area.top, area.bottom);
- model.controlPointNextX = capControlPoint(controlPoints.next.x, area.left, area.right);
- model.controlPointNextY = capControlPoint(controlPoints.next.y, area.top, area.bottom);
- }
- },
- setHoverStyle: function(point) {
- var model = point._model;
- var options = point._options;
- var getHoverColor = helpers$1.getHoverColor;
- point.$previousStyle = {
- backgroundColor: model.backgroundColor,
- borderColor: model.borderColor,
- borderWidth: model.borderWidth,
- radius: model.radius
- };
- model.backgroundColor = valueOrDefault$7(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
- model.borderColor = valueOrDefault$7(options.hoverBorderColor, getHoverColor(options.borderColor));
- model.borderWidth = valueOrDefault$7(options.hoverBorderWidth, options.borderWidth);
- model.radius = valueOrDefault$7(options.hoverRadius, options.radius);
- }
- });
- core_defaults._set('scatter', {
- hover: {
- mode: 'single'
- },
- scales: {
- xAxes: [{
- id: 'x-axis-1',
- type: 'linear',
- position: 'bottom'
- }],
- yAxes: [{
- id: 'y-axis-1',
- type: 'linear',
- position: 'left'
- }]
- },
- tooltips: {
- callbacks: {
- title: function() {
- return '';
- },
- label: function(item) {
- return '(' + item.xLabel + ', ' + item.yLabel + ')';
- }
- }
- }
- });
- core_defaults._set('global', {
- datasets: {
- scatter: {
- showLine: false
- }
- }
- });
- var controller_scatter = controller_line;
- var controllers = {
- bar: controller_bar,
- bubble: controller_bubble,
- doughnut: controller_doughnut,
- horizontalBar: controller_horizontalBar,
- line: controller_line,
- polarArea: controller_polarArea,
- pie: controller_pie,
- radar: controller_radar,
- scatter: controller_scatter
- };
- function getRelativePosition(e, chart) {
- if (e.native) {
- return {
- x: e.x,
- y: e.y
- };
- }
- return helpers$1.getRelativePosition(e, chart);
- }
- function parseVisibleItems(chart, handler) {
- var metasets = chart._getSortedVisibleDatasetMetas();
- var metadata, i, j, ilen, jlen, element;
- for (i = 0, ilen = metasets.length; i < ilen; ++i) {
- metadata = metasets[i].data;
- for (j = 0, jlen = metadata.length; j < jlen; ++j) {
- element = metadata[j];
- if (!element._view.skip) {
- handler(element);
- }
- }
- }
- }
- function getIntersectItems(chart, position) {
- var elements = [];
- parseVisibleItems(chart, function(element) {
- if (element.inRange(position.x, position.y)) {
- elements.push(element);
- }
- });
- return elements;
- }
- function getNearestItems(chart, position, intersect, distanceMetric) {
- var minDistance = Number.POSITIVE_INFINITY;
- var nearestItems = [];
- parseVisibleItems(chart, function(element) {
- if (intersect && !element.inRange(position.x, position.y)) {
- return;
- }
- var center = element.getCenterPoint();
- var distance = distanceMetric(position, center);
- if (distance < minDistance) {
- nearestItems = [element];
- minDistance = distance;
- } else if (distance === minDistance) {
-
- nearestItems.push(element);
- }
- });
- return nearestItems;
- }
- function getDistanceMetricForAxis(axis) {
- var useX = axis.indexOf('x') !== -1;
- var useY = axis.indexOf('y') !== -1;
- return function(pt1, pt2) {
- var deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;
- var deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;
- return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));
- };
- }
- function indexMode(chart, e, options) {
- var position = getRelativePosition(e, chart);
-
- options.axis = options.axis || 'x';
- var distanceMetric = getDistanceMetricForAxis(options.axis);
- var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);
- var elements = [];
- if (!items.length) {
- return [];
- }
- chart._getSortedVisibleDatasetMetas().forEach(function(meta) {
- var element = meta.data[items[0]._index];
-
- if (element && !element._view.skip) {
- elements.push(element);
- }
- });
- return elements;
- }
- var core_interaction = {
-
- modes: {
- single: function(chart, e) {
- var position = getRelativePosition(e, chart);
- var elements = [];
- parseVisibleItems(chart, function(element) {
- if (element.inRange(position.x, position.y)) {
- elements.push(element);
- return elements;
- }
- });
- return elements.slice(0, 1);
- },
-
- label: indexMode,
-
- index: indexMode,
-
- dataset: function(chart, e, options) {
- var position = getRelativePosition(e, chart);
- options.axis = options.axis || 'xy';
- var distanceMetric = getDistanceMetricForAxis(options.axis);
- var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);
- if (items.length > 0) {
- items = chart.getDatasetMeta(items[0]._datasetIndex).data;
- }
- return items;
- },
-
- 'x-axis': function(chart, e) {
- return indexMode(chart, e, {intersect: false});
- },
-
- point: function(chart, e) {
- var position = getRelativePosition(e, chart);
- return getIntersectItems(chart, position);
- },
-
- nearest: function(chart, e, options) {
- var position = getRelativePosition(e, chart);
- options.axis = options.axis || 'xy';
- var distanceMetric = getDistanceMetricForAxis(options.axis);
- return getNearestItems(chart, position, options.intersect, distanceMetric);
- },
-
- x: function(chart, e, options) {
- var position = getRelativePosition(e, chart);
- var items = [];
- var intersectsItem = false;
- parseVisibleItems(chart, function(element) {
- if (element.inXRange(position.x)) {
- items.push(element);
- }
- if (element.inRange(position.x, position.y)) {
- intersectsItem = true;
- }
- });
-
-
- if (options.intersect && !intersectsItem) {
- items = [];
- }
- return items;
- },
-
- y: function(chart, e, options) {
- var position = getRelativePosition(e, chart);
- var items = [];
- var intersectsItem = false;
- parseVisibleItems(chart, function(element) {
- if (element.inYRange(position.y)) {
- items.push(element);
- }
- if (element.inRange(position.x, position.y)) {
- intersectsItem = true;
- }
- });
-
-
- if (options.intersect && !intersectsItem) {
- items = [];
- }
- return items;
- }
- }
- };
- var extend = helpers$1.extend;
- function filterByPosition(array, position) {
- return helpers$1.where(array, function(v) {
- return v.pos === position;
- });
- }
- function sortByWeight(array, reverse) {
- return array.sort(function(a, b) {
- var v0 = reverse ? b : a;
- var v1 = reverse ? a : b;
- return v0.weight === v1.weight ?
- v0.index - v1.index :
- v0.weight - v1.weight;
- });
- }
- function wrapBoxes(boxes) {
- var layoutBoxes = [];
- var i, ilen, box;
- for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) {
- box = boxes[i];
- layoutBoxes.push({
- index: i,
- box: box,
- pos: box.position,
- horizontal: box.isHorizontal(),
- weight: box.weight
- });
- }
- return layoutBoxes;
- }
- function setLayoutDims(layouts, params) {
- var i, ilen, layout;
- for (i = 0, ilen = layouts.length; i < ilen; ++i) {
- layout = layouts[i];
-
- layout.width = layout.horizontal
- ? layout.box.fullWidth && params.availableWidth
- : params.vBoxMaxWidth;
-
- layout.height = layout.horizontal && params.hBoxMaxHeight;
- }
- }
- function buildLayoutBoxes(boxes) {
- var layoutBoxes = wrapBoxes(boxes);
- var left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);
- var right = sortByWeight(filterByPosition(layoutBoxes, 'right'));
- var top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);
- var bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));
- return {
- leftAndTop: left.concat(top),
- rightAndBottom: right.concat(bottom),
- chartArea: filterByPosition(layoutBoxes, 'chartArea'),
- vertical: left.concat(right),
- horizontal: top.concat(bottom)
- };
- }
- function getCombinedMax(maxPadding, chartArea, a, b) {
- return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);
- }
- function updateDims(chartArea, params, layout) {
- var box = layout.box;
- var maxPadding = chartArea.maxPadding;
- var newWidth, newHeight;
- if (layout.size) {
-
- chartArea[layout.pos] -= layout.size;
- }
- layout.size = layout.horizontal ? box.height : box.width;
- chartArea[layout.pos] += layout.size;
- if (box.getPadding) {
- var boxPadding = box.getPadding();
- maxPadding.top = Math.max(maxPadding.top, boxPadding.top);
- maxPadding.left = Math.max(maxPadding.left, boxPadding.left);
- maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);
- maxPadding.right = Math.max(maxPadding.right, boxPadding.right);
- }
- newWidth = params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right');
- newHeight = params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom');
- if (newWidth !== chartArea.w || newHeight !== chartArea.h) {
- chartArea.w = newWidth;
- chartArea.h = newHeight;
-
- return layout.horizontal ? newWidth !== chartArea.w : newHeight !== chartArea.h;
- }
- }
- function handleMaxPadding(chartArea) {
- var maxPadding = chartArea.maxPadding;
- function updatePos(pos) {
- var change = Math.max(maxPadding[pos] - chartArea[pos], 0);
- chartArea[pos] += change;
- return change;
- }
- chartArea.y += updatePos('top');
- chartArea.x += updatePos('left');
- updatePos('right');
- updatePos('bottom');
- }
- function getMargins(horizontal, chartArea) {
- var maxPadding = chartArea.maxPadding;
- function marginForPositions(positions) {
- var margin = {left: 0, top: 0, right: 0, bottom: 0};
- positions.forEach(function(pos) {
- margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);
- });
- return margin;
- }
- return horizontal
- ? marginForPositions(['left', 'right'])
- : marginForPositions(['top', 'bottom']);
- }
- function fitBoxes(boxes, chartArea, params) {
- var refitBoxes = [];
- var i, ilen, layout, box, refit, changed;
- for (i = 0, ilen = boxes.length; i < ilen; ++i) {
- layout = boxes[i];
- box = layout.box;
- box.update(
- layout.width || chartArea.w,
- layout.height || chartArea.h,
- getMargins(layout.horizontal, chartArea)
- );
- if (updateDims(chartArea, params, layout)) {
- changed = true;
- if (refitBoxes.length) {
-
-
- refit = true;
- }
- }
- if (!box.fullWidth) {
- refitBoxes.push(layout);
- }
- }
- return refit ? fitBoxes(refitBoxes, chartArea, params) || changed : changed;
- }
- function placeBoxes(boxes, chartArea, params) {
- var userPadding = params.padding;
- var x = chartArea.x;
- var y = chartArea.y;
- var i, ilen, layout, box;
- for (i = 0, ilen = boxes.length; i < ilen; ++i) {
- layout = boxes[i];
- box = layout.box;
- if (layout.horizontal) {
- box.left = box.fullWidth ? userPadding.left : chartArea.left;
- box.right = box.fullWidth ? params.outerWidth - userPadding.right : chartArea.left + chartArea.w;
- box.top = y;
- box.bottom = y + box.height;
- box.width = box.right - box.left;
- y = box.bottom;
- } else {
- box.left = x;
- box.right = x + box.width;
- box.top = chartArea.top;
- box.bottom = chartArea.top + chartArea.h;
- box.height = box.bottom - box.top;
- x = box.right;
- }
- }
- chartArea.x = x;
- chartArea.y = y;
- }
- core_defaults._set('global', {
- layout: {
- padding: {
- top: 0,
- right: 0,
- bottom: 0,
- left: 0
- }
- }
- });
- var core_layouts = {
- defaults: {},
-
- addBox: function(chart, item) {
- if (!chart.boxes) {
- chart.boxes = [];
- }
-
- item.fullWidth = item.fullWidth || false;
- item.position = item.position || 'top';
- item.weight = item.weight || 0;
- item._layers = item._layers || function() {
- return [{
- z: 0,
- draw: function() {
- item.draw.apply(item, arguments);
- }
- }];
- };
- chart.boxes.push(item);
- },
-
- removeBox: function(chart, layoutItem) {
- var index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;
- if (index !== -1) {
- chart.boxes.splice(index, 1);
- }
- },
-
- configure: function(chart, item, options) {
- var props = ['fullWidth', 'position', 'weight'];
- var ilen = props.length;
- var i = 0;
- var prop;
- for (; i < ilen; ++i) {
- prop = props[i];
- if (options.hasOwnProperty(prop)) {
- item[prop] = options[prop];
- }
- }
- },
-
- update: function(chart, width, height) {
- if (!chart) {
- return;
- }
- var layoutOptions = chart.options.layout || {};
- var padding = helpers$1.options.toPadding(layoutOptions.padding);
- var availableWidth = width - padding.width;
- var availableHeight = height - padding.height;
- var boxes = buildLayoutBoxes(chart.boxes);
- var verticalBoxes = boxes.vertical;
- var horizontalBoxes = boxes.horizontal;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- var params = Object.freeze({
- outerWidth: width,
- outerHeight: height,
- padding: padding,
- availableWidth: availableWidth,
- vBoxMaxWidth: availableWidth / 2 / verticalBoxes.length,
- hBoxMaxHeight: availableHeight / 2
- });
- var chartArea = extend({
- maxPadding: extend({}, padding),
- w: availableWidth,
- h: availableHeight,
- x: padding.left,
- y: padding.top
- }, padding);
- setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);
-
- fitBoxes(verticalBoxes, chartArea, params);
-
- if (fitBoxes(horizontalBoxes, chartArea, params)) {
-
- fitBoxes(verticalBoxes, chartArea, params);
- }
- handleMaxPadding(chartArea);
-
- placeBoxes(boxes.leftAndTop, chartArea, params);
-
- chartArea.x += chartArea.w;
- chartArea.y += chartArea.h;
- placeBoxes(boxes.rightAndBottom, chartArea, params);
- chart.chartArea = {
- left: chartArea.left,
- top: chartArea.top,
- right: chartArea.left + chartArea.w,
- bottom: chartArea.top + chartArea.h
- };
-
- helpers$1.each(boxes.chartArea, function(layout) {
- var box = layout.box;
- extend(box, chart.chartArea);
- box.update(chartArea.w, chartArea.h);
- });
- }
- };
- var platform_basic = {
- acquireContext: function(item) {
- if (item && item.canvas) {
-
- item = item.canvas;
- }
- return item && item.getContext('2d') || null;
- }
- };
- var platform_dom = "/*\n * DOM element rendering detection\n * https://davidwalsh.name/detect-node-insertion\n */\n@keyframes chartjs-render-animation {\n\tfrom { opacity: 0.99; }\n\tto { opacity: 1; }\n}\n\n.chartjs-render-monitor {\n\tanimation: chartjs-render-animation 0.001s;\n}\n\n/*\n * DOM element resizing detection\n * https://github.com/marcj/css-element-queries\n */\n.chartjs-size-monitor,\n.chartjs-size-monitor-expand,\n.chartjs-size-monitor-shrink {\n\tposition: absolute;\n\tdirection: ltr;\n\tleft: 0;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\toverflow: hidden;\n\tpointer-events: none;\n\tvisibility: hidden;\n\tz-index: -1;\n}\n\n.chartjs-size-monitor-expand > div {\n\tposition: absolute;\n\twidth: 1000000px;\n\theight: 1000000px;\n\tleft: 0;\n\ttop: 0;\n}\n\n.chartjs-size-monitor-shrink > div {\n\tposition: absolute;\n\twidth: 200%;\n\theight: 200%;\n\tleft: 0;\n\ttop: 0;\n}\n";
- var platform_dom$1 = Object.freeze({
- __proto__: null,
- 'default': platform_dom
- });
- var stylesheet = getCjsExportFromNamespace(platform_dom$1);
- var EXPANDO_KEY = '$chartjs';
- var CSS_PREFIX = 'chartjs-';
- var CSS_SIZE_MONITOR = CSS_PREFIX + 'size-monitor';
- var CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor';
- var CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation';
- var ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart'];
- var EVENT_TYPES = {
- touchstart: 'mousedown',
- touchmove: 'mousemove',
- touchend: 'mouseup',
- pointerenter: 'mouseenter',
- pointerdown: 'mousedown',
- pointermove: 'mousemove',
- pointerup: 'mouseup',
- pointerleave: 'mouseout',
- pointerout: 'mouseout'
- };
- function readUsedSize(element, property) {
- var value = helpers$1.getStyle(element, property);
- var matches = value && value.match(/^(\d+)(\.\d+)?px$/);
- return matches ? Number(matches[1]) : undefined;
- }
- function initCanvas(canvas, config) {
- var style = canvas.style;
-
-
- var renderHeight = canvas.getAttribute('height');
- var renderWidth = canvas.getAttribute('width');
-
- canvas[EXPANDO_KEY] = {
- initial: {
- height: renderHeight,
- width: renderWidth,
- style: {
- display: style.display,
- height: style.height,
- width: style.width
- }
- }
- };
-
-
-
- style.display = style.display || 'block';
- if (renderWidth === null || renderWidth === '') {
- var displayWidth = readUsedSize(canvas, 'width');
- if (displayWidth !== undefined) {
- canvas.width = displayWidth;
- }
- }
- if (renderHeight === null || renderHeight === '') {
- if (canvas.style.height === '') {
-
-
-
- canvas.height = canvas.width / (config.options.aspectRatio || 2);
- } else {
- var displayHeight = readUsedSize(canvas, 'height');
- if (displayWidth !== undefined) {
- canvas.height = displayHeight;
- }
- }
- }
- return canvas;
- }
- var supportsEventListenerOptions = (function() {
- var supports = false;
- try {
- var options = Object.defineProperty({}, 'passive', {
-
- get: function() {
- supports = true;
- }
- });
- window.addEventListener('e', null, options);
- } catch (e) {
-
- }
- return supports;
- }());
- var eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;
- function addListener(node, type, listener) {
- node.addEventListener(type, listener, eventListenerOptions);
- }
- function removeListener(node, type, listener) {
- node.removeEventListener(type, listener, eventListenerOptions);
- }
- function createEvent(type, chart, x, y, nativeEvent) {
- return {
- type: type,
- chart: chart,
- native: nativeEvent || null,
- x: x !== undefined ? x : null,
- y: y !== undefined ? y : null,
- };
- }
- function fromNativeEvent(event, chart) {
- var type = EVENT_TYPES[event.type] || event.type;
- var pos = helpers$1.getRelativePosition(event, chart);
- return createEvent(type, chart, pos.x, pos.y, event);
- }
- function throttled(fn, thisArg) {
- var ticking = false;
- var args = [];
- return function() {
- args = Array.prototype.slice.call(arguments);
- thisArg = thisArg || this;
- if (!ticking) {
- ticking = true;
- helpers$1.requestAnimFrame.call(window, function() {
- ticking = false;
- fn.apply(thisArg, args);
- });
- }
- };
- }
- function createDiv(cls) {
- var el = document.createElement('div');
- el.className = cls || '';
- return el;
- }
- function createResizer(handler) {
- var maxSize = 1000000;
-
-
- var resizer = createDiv(CSS_SIZE_MONITOR);
- var expand = createDiv(CSS_SIZE_MONITOR + '-expand');
- var shrink = createDiv(CSS_SIZE_MONITOR + '-shrink');
- expand.appendChild(createDiv());
- shrink.appendChild(createDiv());
- resizer.appendChild(expand);
- resizer.appendChild(shrink);
- resizer._reset = function() {
- expand.scrollLeft = maxSize;
- expand.scrollTop = maxSize;
- shrink.scrollLeft = maxSize;
- shrink.scrollTop = maxSize;
- };
- var onScroll = function() {
- resizer._reset();
- handler();
- };
- addListener(expand, 'scroll', onScroll.bind(expand, 'expand'));
- addListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink'));
- return resizer;
- }
- function watchForRender(node, handler) {
- var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {});
- var proxy = expando.renderProxy = function(e) {
- if (e.animationName === CSS_RENDER_ANIMATION) {
- handler();
- }
- };
- helpers$1.each(ANIMATION_START_EVENTS, function(type) {
- addListener(node, type, proxy);
- });
-
-
-
-
-
- expando.reflow = !!node.offsetParent;
- node.classList.add(CSS_RENDER_MONITOR);
- }
- function unwatchForRender(node) {
- var expando = node[EXPANDO_KEY] || {};
- var proxy = expando.renderProxy;
- if (proxy) {
- helpers$1.each(ANIMATION_START_EVENTS, function(type) {
- removeListener(node, type, proxy);
- });
- delete expando.renderProxy;
- }
- node.classList.remove(CSS_RENDER_MONITOR);
- }
- function addResizeListener(node, listener, chart) {
- var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {});
-
- var resizer = expando.resizer = createResizer(throttled(function() {
- if (expando.resizer) {
- var container = chart.options.maintainAspectRatio && node.parentNode;
- var w = container ? container.clientWidth : 0;
- listener(createEvent('resize', chart));
- if (container && container.clientWidth < w && chart.canvas) {
-
-
-
-
-
-
-
- listener(createEvent('resize', chart));
- }
- }
- }));
-
-
- watchForRender(node, function() {
- if (expando.resizer) {
- var container = node.parentNode;
- if (container && container !== resizer.parentNode) {
- container.insertBefore(resizer, container.firstChild);
- }
-
- resizer._reset();
- }
- });
- }
- function removeResizeListener(node) {
- var expando = node[EXPANDO_KEY] || {};
- var resizer = expando.resizer;
- delete expando.resizer;
- unwatchForRender(node);
- if (resizer && resizer.parentNode) {
- resizer.parentNode.removeChild(resizer);
- }
- }
- function injectCSS(rootNode, css) {
-
- var expando = rootNode[EXPANDO_KEY] || (rootNode[EXPANDO_KEY] = {});
- if (!expando.containsStyles) {
- expando.containsStyles = true;
- css = '/* Chart.js */\n' + css;
- var style = document.createElement('style');
- style.setAttribute('type', 'text/css');
- style.appendChild(document.createTextNode(css));
- rootNode.appendChild(style);
- }
- }
- var platform_dom$2 = {
-
- disableCSSInjection: false,
-
- _enabled: typeof window !== 'undefined' && typeof document !== 'undefined',
-
- _ensureLoaded: function(canvas) {
- if (!this.disableCSSInjection) {
-
-
-
- var root = canvas.getRootNode ? canvas.getRootNode() : document;
- var targetNode = root.host ? root : document.head;
- injectCSS(targetNode, stylesheet);
- }
- },
- acquireContext: function(item, config) {
- if (typeof item === 'string') {
- item = document.getElementById(item);
- } else if (item.length) {
-
- item = item[0];
- }
- if (item && item.canvas) {
-
- item = item.canvas;
- }
-
-
-
- var context = item && item.getContext && item.getContext('2d');
-
-
-
-
-
-
-
- if (context && context.canvas === item) {
-
-
- this._ensureLoaded(item);
- initCanvas(item, config);
- return context;
- }
- return null;
- },
- releaseContext: function(context) {
- var canvas = context.canvas;
- if (!canvas[EXPANDO_KEY]) {
- return;
- }
- var initial = canvas[EXPANDO_KEY].initial;
- ['height', 'width'].forEach(function(prop) {
- var value = initial[prop];
- if (helpers$1.isNullOrUndef(value)) {
- canvas.removeAttribute(prop);
- } else {
- canvas.setAttribute(prop, value);
- }
- });
- helpers$1.each(initial.style || {}, function(value, key) {
- canvas.style[key] = value;
- });
-
-
-
-
-
- canvas.width = canvas.width;
- delete canvas[EXPANDO_KEY];
- },
- addEventListener: function(chart, type, listener) {
- var canvas = chart.canvas;
- if (type === 'resize') {
-
- addResizeListener(canvas, listener, chart);
- return;
- }
- var expando = listener[EXPANDO_KEY] || (listener[EXPANDO_KEY] = {});
- var proxies = expando.proxies || (expando.proxies = {});
- var proxy = proxies[chart.id + '_' + type] = function(event) {
- listener(fromNativeEvent(event, chart));
- };
- addListener(canvas, type, proxy);
- },
- removeEventListener: function(chart, type, listener) {
- var canvas = chart.canvas;
- if (type === 'resize') {
-
- removeResizeListener(canvas);
- return;
- }
- var expando = listener[EXPANDO_KEY] || {};
- var proxies = expando.proxies || {};
- var proxy = proxies[chart.id + '_' + type];
- if (!proxy) {
- return;
- }
- removeListener(canvas, type, proxy);
- }
- };
- helpers$1.addEvent = addListener;
- helpers$1.removeEvent = removeListener;
- var implementation = platform_dom$2._enabled ? platform_dom$2 : platform_basic;
- var platform = helpers$1.extend({
-
- initialize: function() {},
-
- acquireContext: function() {},
-
- releaseContext: function() {},
-
- addEventListener: function() {},
-
- removeEventListener: function() {}
- }, implementation);
- core_defaults._set('global', {
- plugins: {}
- });
- var core_plugins = {
-
- _plugins: [],
-
- _cacheId: 0,
-
- register: function(plugins) {
- var p = this._plugins;
- ([]).concat(plugins).forEach(function(plugin) {
- if (p.indexOf(plugin) === -1) {
- p.push(plugin);
- }
- });
- this._cacheId++;
- },
-
- unregister: function(plugins) {
- var p = this._plugins;
- ([]).concat(plugins).forEach(function(plugin) {
- var idx = p.indexOf(plugin);
- if (idx !== -1) {
- p.splice(idx, 1);
- }
- });
- this._cacheId++;
- },
-
- clear: function() {
- this._plugins = [];
- this._cacheId++;
- },
-
- count: function() {
- return this._plugins.length;
- },
-
- getAll: function() {
- return this._plugins;
- },
-
- notify: function(chart, hook, args) {
- var descriptors = this.descriptors(chart);
- var ilen = descriptors.length;
- var i, descriptor, plugin, params, method;
- for (i = 0; i < ilen; ++i) {
- descriptor = descriptors[i];
- plugin = descriptor.plugin;
- method = plugin[hook];
- if (typeof method === 'function') {
- params = [chart].concat(args || []);
- params.push(descriptor.options);
- if (method.apply(plugin, params) === false) {
- return false;
- }
- }
- }
- return true;
- },
-
- descriptors: function(chart) {
- var cache = chart.$plugins || (chart.$plugins = {});
- if (cache.id === this._cacheId) {
- return cache.descriptors;
- }
- var plugins = [];
- var descriptors = [];
- var config = (chart && chart.config) || {};
- var options = (config.options && config.options.plugins) || {};
- this._plugins.concat(config.plugins || []).forEach(function(plugin) {
- var idx = plugins.indexOf(plugin);
- if (idx !== -1) {
- return;
- }
- var id = plugin.id;
- var opts = options[id];
- if (opts === false) {
- return;
- }
- if (opts === true) {
- opts = helpers$1.clone(core_defaults.global.plugins[id]);
- }
- plugins.push(plugin);
- descriptors.push({
- plugin: plugin,
- options: opts || {}
- });
- });
- cache.descriptors = descriptors;
- cache.id = this._cacheId;
- return descriptors;
- },
-
- _invalidate: function(chart) {
- delete chart.$plugins;
- }
- };
- var core_scaleService = {
-
-
- constructors: {},
-
-
-
- defaults: {},
- registerScaleType: function(type, scaleConstructor, scaleDefaults) {
- this.constructors[type] = scaleConstructor;
- this.defaults[type] = helpers$1.clone(scaleDefaults);
- },
- getScaleConstructor: function(type) {
- return this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined;
- },
- getScaleDefaults: function(type) {
-
- return this.defaults.hasOwnProperty(type) ? helpers$1.merge({}, [core_defaults.scale, this.defaults[type]]) : {};
- },
- updateScaleDefaults: function(type, additions) {
- var me = this;
- if (me.defaults.hasOwnProperty(type)) {
- me.defaults[type] = helpers$1.extend(me.defaults[type], additions);
- }
- },
- addScalesToLayout: function(chart) {
-
- helpers$1.each(chart.scales, function(scale) {
-
- scale.fullWidth = scale.options.fullWidth;
- scale.position = scale.options.position;
- scale.weight = scale.options.weight;
- core_layouts.addBox(chart, scale);
- });
- }
- };
- var valueOrDefault$8 = helpers$1.valueOrDefault;
- var getRtlHelper = helpers$1.rtl.getRtlAdapter;
- core_defaults._set('global', {
- tooltips: {
- enabled: true,
- custom: null,
- mode: 'nearest',
- position: 'average',
- intersect: true,
- backgroundColor: 'rgba(0,0,0,0.8)',
- titleFontStyle: 'bold',
- titleSpacing: 2,
- titleMarginBottom: 6,
- titleFontColor: '#fff',
- titleAlign: 'left',
- bodySpacing: 2,
- bodyFontColor: '#fff',
- bodyAlign: 'left',
- footerFontStyle: 'bold',
- footerSpacing: 2,
- footerMarginTop: 6,
- footerFontColor: '#fff',
- footerAlign: 'left',
- yPadding: 6,
- xPadding: 6,
- caretPadding: 2,
- caretSize: 5,
- cornerRadius: 6,
- multiKeyBackground: '#fff',
- displayColors: true,
- borderColor: 'rgba(0,0,0,0)',
- borderWidth: 0,
- callbacks: {
-
- beforeTitle: helpers$1.noop,
- title: function(tooltipItems, data) {
- var title = '';
- var labels = data.labels;
- var labelCount = labels ? labels.length : 0;
- if (tooltipItems.length > 0) {
- var item = tooltipItems[0];
- if (item.label) {
- title = item.label;
- } else if (item.xLabel) {
- title = item.xLabel;
- } else if (labelCount > 0 && item.index < labelCount) {
- title = labels[item.index];
- }
- }
- return title;
- },
- afterTitle: helpers$1.noop,
-
- beforeBody: helpers$1.noop,
-
- beforeLabel: helpers$1.noop,
- label: function(tooltipItem, data) {
- var label = data.datasets[tooltipItem.datasetIndex].label || '';
- if (label) {
- label += ': ';
- }
- if (!helpers$1.isNullOrUndef(tooltipItem.value)) {
- label += tooltipItem.value;
- } else {
- label += tooltipItem.yLabel;
- }
- return label;
- },
- labelColor: function(tooltipItem, chart) {
- var meta = chart.getDatasetMeta(tooltipItem.datasetIndex);
- var activeElement = meta.data[tooltipItem.index];
- var view = activeElement._view;
- return {
- borderColor: view.borderColor,
- backgroundColor: view.backgroundColor
- };
- },
- labelTextColor: function() {
- return this._options.bodyFontColor;
- },
- afterLabel: helpers$1.noop,
-
- afterBody: helpers$1.noop,
-
- beforeFooter: helpers$1.noop,
- footer: helpers$1.noop,
- afterFooter: helpers$1.noop
- }
- }
- });
- var positioners = {
-
- average: function(elements) {
- if (!elements.length) {
- return false;
- }
- var i, len;
- var x = 0;
- var y = 0;
- var count = 0;
- for (i = 0, len = elements.length; i < len; ++i) {
- var el = elements[i];
- if (el && el.hasValue()) {
- var pos = el.tooltipPosition();
- x += pos.x;
- y += pos.y;
- ++count;
- }
- }
- return {
- x: x / count,
- y: y / count
- };
- },
-
- nearest: function(elements, eventPosition) {
- var x = eventPosition.x;
- var y = eventPosition.y;
- var minDistance = Number.POSITIVE_INFINITY;
- var i, len, nearestElement;
- for (i = 0, len = elements.length; i < len; ++i) {
- var el = elements[i];
- if (el && el.hasValue()) {
- var center = el.getCenterPoint();
- var d = helpers$1.distanceBetweenPoints(eventPosition, center);
- if (d < minDistance) {
- minDistance = d;
- nearestElement = el;
- }
- }
- }
- if (nearestElement) {
- var tp = nearestElement.tooltipPosition();
- x = tp.x;
- y = tp.y;
- }
- return {
- x: x,
- y: y
- };
- }
- };
- function pushOrConcat(base, toPush) {
- if (toPush) {
- if (helpers$1.isArray(toPush)) {
-
- Array.prototype.push.apply(base, toPush);
- } else {
- base.push(toPush);
- }
- }
- return base;
- }
- function splitNewlines(str) {
- if ((typeof str === 'string' || str instanceof String) && str.indexOf('\n') > -1) {
- return str.split('\n');
- }
- return str;
- }
- function createTooltipItem(element) {
- var xScale = element._xScale;
- var yScale = element._yScale || element._scale;
- var index = element._index;
- var datasetIndex = element._datasetIndex;
- var controller = element._chart.getDatasetMeta(datasetIndex).controller;
- var indexScale = controller._getIndexScale();
- var valueScale = controller._getValueScale();
- return {
- xLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '',
- yLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '',
- label: indexScale ? '' + indexScale.getLabelForIndex(index, datasetIndex) : '',
- value: valueScale ? '' + valueScale.getLabelForIndex(index, datasetIndex) : '',
- index: index,
- datasetIndex: datasetIndex,
- x: element._model.x,
- y: element._model.y
- };
- }
- function getBaseModel(tooltipOpts) {
- var globalDefaults = core_defaults.global;
- return {
-
- xPadding: tooltipOpts.xPadding,
- yPadding: tooltipOpts.yPadding,
- xAlign: tooltipOpts.xAlign,
- yAlign: tooltipOpts.yAlign,
-
- rtl: tooltipOpts.rtl,
- textDirection: tooltipOpts.textDirection,
-
- bodyFontColor: tooltipOpts.bodyFontColor,
- _bodyFontFamily: valueOrDefault$8(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily),
- _bodyFontStyle: valueOrDefault$8(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle),
- _bodyAlign: tooltipOpts.bodyAlign,
- bodyFontSize: valueOrDefault$8(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize),
- bodySpacing: tooltipOpts.bodySpacing,
-
- titleFontColor: tooltipOpts.titleFontColor,
- _titleFontFamily: valueOrDefault$8(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily),
- _titleFontStyle: valueOrDefault$8(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle),
- titleFontSize: valueOrDefault$8(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize),
- _titleAlign: tooltipOpts.titleAlign,
- titleSpacing: tooltipOpts.titleSpacing,
- titleMarginBottom: tooltipOpts.titleMarginBottom,
-
- footerFontColor: tooltipOpts.footerFontColor,
- _footerFontFamily: valueOrDefault$8(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily),
- _footerFontStyle: valueOrDefault$8(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle),
- footerFontSize: valueOrDefault$8(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize),
- _footerAlign: tooltipOpts.footerAlign,
- footerSpacing: tooltipOpts.footerSpacing,
- footerMarginTop: tooltipOpts.footerMarginTop,
-
- caretSize: tooltipOpts.caretSize,
- cornerRadius: tooltipOpts.cornerRadius,
- backgroundColor: tooltipOpts.backgroundColor,
- opacity: 0,
- legendColorBackground: tooltipOpts.multiKeyBackground,
- displayColors: tooltipOpts.displayColors,
- borderColor: tooltipOpts.borderColor,
- borderWidth: tooltipOpts.borderWidth
- };
- }
- function getTooltipSize(tooltip, model) {
- var ctx = tooltip._chart.ctx;
- var height = model.yPadding * 2;
- var width = 0;
-
- var body = model.body;
- var combinedBodyLength = body.reduce(function(count, bodyItem) {
- return count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length;
- }, 0);
- combinedBodyLength += model.beforeBody.length + model.afterBody.length;
- var titleLineCount = model.title.length;
- var footerLineCount = model.footer.length;
- var titleFontSize = model.titleFontSize;
- var bodyFontSize = model.bodyFontSize;
- var footerFontSize = model.footerFontSize;
- height += titleLineCount * titleFontSize;
- height += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0;
- height += titleLineCount ? model.titleMarginBottom : 0;
- height += combinedBodyLength * bodyFontSize;
- height += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0;
- height += footerLineCount ? model.footerMarginTop : 0;
- height += footerLineCount * (footerFontSize);
- height += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0;
-
- var widthPadding = 0;
- var maxLineWidth = function(line) {
- width = Math.max(width, ctx.measureText(line).width + widthPadding);
- };
- ctx.font = helpers$1.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily);
- helpers$1.each(model.title, maxLineWidth);
-
- ctx.font = helpers$1.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily);
- helpers$1.each(model.beforeBody.concat(model.afterBody), maxLineWidth);
-
- widthPadding = model.displayColors ? (bodyFontSize + 2) : 0;
- helpers$1.each(body, function(bodyItem) {
- helpers$1.each(bodyItem.before, maxLineWidth);
- helpers$1.each(bodyItem.lines, maxLineWidth);
- helpers$1.each(bodyItem.after, maxLineWidth);
- });
-
- widthPadding = 0;
-
- ctx.font = helpers$1.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily);
- helpers$1.each(model.footer, maxLineWidth);
-
- width += 2 * model.xPadding;
- return {
- width: width,
- height: height
- };
- }
- function determineAlignment(tooltip, size) {
- var model = tooltip._model;
- var chart = tooltip._chart;
- var chartArea = tooltip._chart.chartArea;
- var xAlign = 'center';
- var yAlign = 'center';
- if (model.y < size.height) {
- yAlign = 'top';
- } else if (model.y > (chart.height - size.height)) {
- yAlign = 'bottom';
- }
- var lf, rf;
- var olf, orf;
- var yf;
- var midX = (chartArea.left + chartArea.right) / 2;
- var midY = (chartArea.top + chartArea.bottom) / 2;
- if (yAlign === 'center') {
- lf = function(x) {
- return x <= midX;
- };
- rf = function(x) {
- return x > midX;
- };
- } else {
- lf = function(x) {
- return x <= (size.width / 2);
- };
- rf = function(x) {
- return x >= (chart.width - (size.width / 2));
- };
- }
- olf = function(x) {
- return x + size.width + model.caretSize + model.caretPadding > chart.width;
- };
- orf = function(x) {
- return x - size.width - model.caretSize - model.caretPadding < 0;
- };
- yf = function(y) {
- return y <= midY ? 'top' : 'bottom';
- };
- if (lf(model.x)) {
- xAlign = 'left';
-
- if (olf(model.x)) {
- xAlign = 'center';
- yAlign = yf(model.y);
- }
- } else if (rf(model.x)) {
- xAlign = 'right';
-
- if (orf(model.x)) {
- xAlign = 'center';
- yAlign = yf(model.y);
- }
- }
- var opts = tooltip._options;
- return {
- xAlign: opts.xAlign ? opts.xAlign : xAlign,
- yAlign: opts.yAlign ? opts.yAlign : yAlign
- };
- }
- function getBackgroundPoint(vm, size, alignment, chart) {
-
- var x = vm.x;
- var y = vm.y;
- var caretSize = vm.caretSize;
- var caretPadding = vm.caretPadding;
- var cornerRadius = vm.cornerRadius;
- var xAlign = alignment.xAlign;
- var yAlign = alignment.yAlign;
- var paddingAndSize = caretSize + caretPadding;
- var radiusAndPadding = cornerRadius + caretPadding;
- if (xAlign === 'right') {
- x -= size.width;
- } else if (xAlign === 'center') {
- x -= (size.width / 2);
- if (x + size.width > chart.width) {
- x = chart.width - size.width;
- }
- if (x < 0) {
- x = 0;
- }
- }
- if (yAlign === 'top') {
- y += paddingAndSize;
- } else if (yAlign === 'bottom') {
- y -= size.height + paddingAndSize;
- } else {
- y -= (size.height / 2);
- }
- if (yAlign === 'center') {
- if (xAlign === 'left') {
- x += paddingAndSize;
- } else if (xAlign === 'right') {
- x -= paddingAndSize;
- }
- } else if (xAlign === 'left') {
- x -= radiusAndPadding;
- } else if (xAlign === 'right') {
- x += radiusAndPadding;
- }
- return {
- x: x,
- y: y
- };
- }
- function getAlignedX(vm, align) {
- return align === 'center'
- ? vm.x + vm.width / 2
- : align === 'right'
- ? vm.x + vm.width - vm.xPadding
- : vm.x + vm.xPadding;
- }
- function getBeforeAfterBodyLines(callback) {
- return pushOrConcat([], splitNewlines(callback));
- }
- var exports$4 = core_element.extend({
- initialize: function() {
- this._model = getBaseModel(this._options);
- this._lastActive = [];
- },
-
-
- getTitle: function() {
- var me = this;
- var opts = me._options;
- var callbacks = opts.callbacks;
- var beforeTitle = callbacks.beforeTitle.apply(me, arguments);
- var title = callbacks.title.apply(me, arguments);
- var afterTitle = callbacks.afterTitle.apply(me, arguments);
- var lines = [];
- lines = pushOrConcat(lines, splitNewlines(beforeTitle));
- lines = pushOrConcat(lines, splitNewlines(title));
- lines = pushOrConcat(lines, splitNewlines(afterTitle));
- return lines;
- },
-
- getBeforeBody: function() {
- return getBeforeAfterBodyLines(this._options.callbacks.beforeBody.apply(this, arguments));
- },
-
- getBody: function(tooltipItems, data) {
- var me = this;
- var callbacks = me._options.callbacks;
- var bodyItems = [];
- helpers$1.each(tooltipItems, function(tooltipItem) {
- var bodyItem = {
- before: [],
- lines: [],
- after: []
- };
- pushOrConcat(bodyItem.before, splitNewlines(callbacks.beforeLabel.call(me, tooltipItem, data)));
- pushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data));
- pushOrConcat(bodyItem.after, splitNewlines(callbacks.afterLabel.call(me, tooltipItem, data)));
- bodyItems.push(bodyItem);
- });
- return bodyItems;
- },
-
- getAfterBody: function() {
- return getBeforeAfterBodyLines(this._options.callbacks.afterBody.apply(this, arguments));
- },
-
-
- getFooter: function() {
- var me = this;
- var callbacks = me._options.callbacks;
- var beforeFooter = callbacks.beforeFooter.apply(me, arguments);
- var footer = callbacks.footer.apply(me, arguments);
- var afterFooter = callbacks.afterFooter.apply(me, arguments);
- var lines = [];
- lines = pushOrConcat(lines, splitNewlines(beforeFooter));
- lines = pushOrConcat(lines, splitNewlines(footer));
- lines = pushOrConcat(lines, splitNewlines(afterFooter));
- return lines;
- },
- update: function(changed) {
- var me = this;
- var opts = me._options;
-
-
-
- var existingModel = me._model;
- var model = me._model = getBaseModel(opts);
- var active = me._active;
- var data = me._data;
-
- var alignment = {
- xAlign: existingModel.xAlign,
- yAlign: existingModel.yAlign
- };
- var backgroundPoint = {
- x: existingModel.x,
- y: existingModel.y
- };
- var tooltipSize = {
- width: existingModel.width,
- height: existingModel.height
- };
- var tooltipPosition = {
- x: existingModel.caretX,
- y: existingModel.caretY
- };
- var i, len;
- if (active.length) {
- model.opacity = 1;
- var labelColors = [];
- var labelTextColors = [];
- tooltipPosition = positioners[opts.position].call(me, active, me._eventPosition);
- var tooltipItems = [];
- for (i = 0, len = active.length; i < len; ++i) {
- tooltipItems.push(createTooltipItem(active[i]));
- }
-
- if (opts.filter) {
- tooltipItems = tooltipItems.filter(function(a) {
- return opts.filter(a, data);
- });
- }
-
- if (opts.itemSort) {
- tooltipItems = tooltipItems.sort(function(a, b) {
- return opts.itemSort(a, b, data);
- });
- }
-
- helpers$1.each(tooltipItems, function(tooltipItem) {
- labelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart));
- labelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart));
- });
-
- model.title = me.getTitle(tooltipItems, data);
- model.beforeBody = me.getBeforeBody(tooltipItems, data);
- model.body = me.getBody(tooltipItems, data);
- model.afterBody = me.getAfterBody(tooltipItems, data);
- model.footer = me.getFooter(tooltipItems, data);
-
- model.x = tooltipPosition.x;
- model.y = tooltipPosition.y;
- model.caretPadding = opts.caretPadding;
- model.labelColors = labelColors;
- model.labelTextColors = labelTextColors;
-
- model.dataPoints = tooltipItems;
-
- tooltipSize = getTooltipSize(this, model);
- alignment = determineAlignment(this, tooltipSize);
-
- backgroundPoint = getBackgroundPoint(model, tooltipSize, alignment, me._chart);
- } else {
- model.opacity = 0;
- }
- model.xAlign = alignment.xAlign;
- model.yAlign = alignment.yAlign;
- model.x = backgroundPoint.x;
- model.y = backgroundPoint.y;
- model.width = tooltipSize.width;
- model.height = tooltipSize.height;
-
- model.caretX = tooltipPosition.x;
- model.caretY = tooltipPosition.y;
- me._model = model;
- if (changed && opts.custom) {
- opts.custom.call(me, model);
- }
- return me;
- },
- drawCaret: function(tooltipPoint, size) {
- var ctx = this._chart.ctx;
- var vm = this._view;
- var caretPosition = this.getCaretPosition(tooltipPoint, size, vm);
- ctx.lineTo(caretPosition.x1, caretPosition.y1);
- ctx.lineTo(caretPosition.x2, caretPosition.y2);
- ctx.lineTo(caretPosition.x3, caretPosition.y3);
- },
- getCaretPosition: function(tooltipPoint, size, vm) {
- var x1, x2, x3, y1, y2, y3;
- var caretSize = vm.caretSize;
- var cornerRadius = vm.cornerRadius;
- var xAlign = vm.xAlign;
- var yAlign = vm.yAlign;
- var ptX = tooltipPoint.x;
- var ptY = tooltipPoint.y;
- var width = size.width;
- var height = size.height;
- if (yAlign === 'center') {
- y2 = ptY + (height / 2);
- if (xAlign === 'left') {
- x1 = ptX;
- x2 = x1 - caretSize;
- x3 = x1;
- y1 = y2 + caretSize;
- y3 = y2 - caretSize;
- } else {
- x1 = ptX + width;
- x2 = x1 + caretSize;
- x3 = x1;
- y1 = y2 - caretSize;
- y3 = y2 + caretSize;
- }
- } else {
- if (xAlign === 'left') {
- x2 = ptX + cornerRadius + (caretSize);
- x1 = x2 - caretSize;
- x3 = x2 + caretSize;
- } else if (xAlign === 'right') {
- x2 = ptX + width - cornerRadius - caretSize;
- x1 = x2 - caretSize;
- x3 = x2 + caretSize;
- } else {
- x2 = vm.caretX;
- x1 = x2 - caretSize;
- x3 = x2 + caretSize;
- }
- if (yAlign === 'top') {
- y1 = ptY;
- y2 = y1 - caretSize;
- y3 = y1;
- } else {
- y1 = ptY + height;
- y2 = y1 + caretSize;
- y3 = y1;
-
- var tmp = x3;
- x3 = x1;
- x1 = tmp;
- }
- }
- return {x1: x1, x2: x2, x3: x3, y1: y1, y2: y2, y3: y3};
- },
- drawTitle: function(pt, vm, ctx) {
- var title = vm.title;
- var length = title.length;
- var titleFontSize, titleSpacing, i;
- if (length) {
- var rtlHelper = getRtlHelper(vm.rtl, vm.x, vm.width);
- pt.x = getAlignedX(vm, vm._titleAlign);
- ctx.textAlign = rtlHelper.textAlign(vm._titleAlign);
- ctx.textBaseline = 'middle';
- titleFontSize = vm.titleFontSize;
- titleSpacing = vm.titleSpacing;
- ctx.fillStyle = vm.titleFontColor;
- ctx.font = helpers$1.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily);
- for (i = 0; i < length; ++i) {
- ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFontSize / 2);
- pt.y += titleFontSize + titleSpacing;
- if (i + 1 === length) {
- pt.y += vm.titleMarginBottom - titleSpacing;
- }
- }
- }
- },
- drawBody: function(pt, vm, ctx) {
- var bodyFontSize = vm.bodyFontSize;
- var bodySpacing = vm.bodySpacing;
- var bodyAlign = vm._bodyAlign;
- var body = vm.body;
- var drawColorBoxes = vm.displayColors;
- var xLinePadding = 0;
- var colorX = drawColorBoxes ? getAlignedX(vm, 'left') : 0;
- var rtlHelper = getRtlHelper(vm.rtl, vm.x, vm.width);
- var fillLineOfText = function(line) {
- ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyFontSize / 2);
- pt.y += bodyFontSize + bodySpacing;
- };
- var bodyItem, textColor, labelColors, lines, i, j, ilen, jlen;
- var bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);
- ctx.textAlign = bodyAlign;
- ctx.textBaseline = 'middle';
- ctx.font = helpers$1.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);
- pt.x = getAlignedX(vm, bodyAlignForCalculation);
-
- ctx.fillStyle = vm.bodyFontColor;
- helpers$1.each(vm.beforeBody, fillLineOfText);
- xLinePadding = drawColorBoxes && bodyAlignForCalculation !== 'right'
- ? bodyAlign === 'center' ? (bodyFontSize / 2 + 1) : (bodyFontSize + 2)
- : 0;
-
- for (i = 0, ilen = body.length; i < ilen; ++i) {
- bodyItem = body[i];
- textColor = vm.labelTextColors[i];
- labelColors = vm.labelColors[i];
- ctx.fillStyle = textColor;
- helpers$1.each(bodyItem.before, fillLineOfText);
- lines = bodyItem.lines;
- for (j = 0, jlen = lines.length; j < jlen; ++j) {
-
- if (drawColorBoxes) {
- var rtlColorX = rtlHelper.x(colorX);
-
- ctx.fillStyle = vm.legendColorBackground;
- ctx.fillRect(rtlHelper.leftForLtr(rtlColorX, bodyFontSize), pt.y, bodyFontSize, bodyFontSize);
-
- ctx.lineWidth = 1;
- ctx.strokeStyle = labelColors.borderColor;
- ctx.strokeRect(rtlHelper.leftForLtr(rtlColorX, bodyFontSize), pt.y, bodyFontSize, bodyFontSize);
-
- ctx.fillStyle = labelColors.backgroundColor;
- ctx.fillRect(rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), bodyFontSize - 2), pt.y + 1, bodyFontSize - 2, bodyFontSize - 2);
- ctx.fillStyle = textColor;
- }
- fillLineOfText(lines[j]);
- }
- helpers$1.each(bodyItem.after, fillLineOfText);
- }
-
- xLinePadding = 0;
-
- helpers$1.each(vm.afterBody, fillLineOfText);
- pt.y -= bodySpacing;
- },
- drawFooter: function(pt, vm, ctx) {
- var footer = vm.footer;
- var length = footer.length;
- var footerFontSize, i;
- if (length) {
- var rtlHelper = getRtlHelper(vm.rtl, vm.x, vm.width);
- pt.x = getAlignedX(vm, vm._footerAlign);
- pt.y += vm.footerMarginTop;
- ctx.textAlign = rtlHelper.textAlign(vm._footerAlign);
- ctx.textBaseline = 'middle';
- footerFontSize = vm.footerFontSize;
- ctx.fillStyle = vm.footerFontColor;
- ctx.font = helpers$1.fontString(footerFontSize, vm._footerFontStyle, vm._footerFontFamily);
- for (i = 0; i < length; ++i) {
- ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFontSize / 2);
- pt.y += footerFontSize + vm.footerSpacing;
- }
- }
- },
- drawBackground: function(pt, vm, ctx, tooltipSize) {
- ctx.fillStyle = vm.backgroundColor;
- ctx.strokeStyle = vm.borderColor;
- ctx.lineWidth = vm.borderWidth;
- var xAlign = vm.xAlign;
- var yAlign = vm.yAlign;
- var x = pt.x;
- var y = pt.y;
- var width = tooltipSize.width;
- var height = tooltipSize.height;
- var radius = vm.cornerRadius;
- ctx.beginPath();
- ctx.moveTo(x + radius, y);
- if (yAlign === 'top') {
- this.drawCaret(pt, tooltipSize);
- }
- ctx.lineTo(x + width - radius, y);
- ctx.quadraticCurveTo(x + width, y, x + width, y + radius);
- if (yAlign === 'center' && xAlign === 'right') {
- this.drawCaret(pt, tooltipSize);
- }
- ctx.lineTo(x + width, y + height - radius);
- ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);
- if (yAlign === 'bottom') {
- this.drawCaret(pt, tooltipSize);
- }
- ctx.lineTo(x + radius, y + height);
- ctx.quadraticCurveTo(x, y + height, x, y + height - radius);
- if (yAlign === 'center' && xAlign === 'left') {
- this.drawCaret(pt, tooltipSize);
- }
- ctx.lineTo(x, y + radius);
- ctx.quadraticCurveTo(x, y, x + radius, y);
- ctx.closePath();
- ctx.fill();
- if (vm.borderWidth > 0) {
- ctx.stroke();
- }
- },
- draw: function() {
- var ctx = this._chart.ctx;
- var vm = this._view;
- if (vm.opacity === 0) {
- return;
- }
- var tooltipSize = {
- width: vm.width,
- height: vm.height
- };
- var pt = {
- x: vm.x,
- y: vm.y
- };
-
- var opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity;
-
- var hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length;
- if (this._options.enabled && hasTooltipContent) {
- ctx.save();
- ctx.globalAlpha = opacity;
-
- this.drawBackground(pt, vm, ctx, tooltipSize);
-
- pt.y += vm.yPadding;
- helpers$1.rtl.overrideTextDirection(ctx, vm.textDirection);
-
- this.drawTitle(pt, vm, ctx);
-
- this.drawBody(pt, vm, ctx);
-
- this.drawFooter(pt, vm, ctx);
- helpers$1.rtl.restoreTextDirection(ctx, vm.textDirection);
- ctx.restore();
- }
- },
-
- handleEvent: function(e) {
- var me = this;
- var options = me._options;
- var changed = false;
- me._lastActive = me._lastActive || [];
-
- if (e.type === 'mouseout') {
- me._active = [];
- } else {
- me._active = me._chart.getElementsAtEventForMode(e, options.mode, options);
- if (options.reverse) {
- me._active.reverse();
- }
- }
-
- changed = !helpers$1.arrayEquals(me._active, me._lastActive);
-
- if (changed) {
- me._lastActive = me._active;
- if (options.enabled || options.custom) {
- me._eventPosition = {
- x: e.x,
- y: e.y
- };
- me.update(true);
- me.pivot();
- }
- }
- return changed;
- }
- });
- var positioners_1 = positioners;
- var core_tooltip = exports$4;
- core_tooltip.positioners = positioners_1;
- var valueOrDefault$9 = helpers$1.valueOrDefault;
- core_defaults._set('global', {
- elements: {},
- events: [
- 'mousemove',
- 'mouseout',
- 'click',
- 'touchstart',
- 'touchmove'
- ],
- hover: {
- onHover: null,
- mode: 'nearest',
- intersect: true,
- animationDuration: 400
- },
- onClick: null,
- maintainAspectRatio: true,
- responsive: true,
- responsiveAnimationDuration: 0
- });
- function mergeScaleConfig(/* config objects ... */) {
- return helpers$1.merge({}, [].slice.call(arguments), {
- merger: function(key, target, source, options) {
- if (key === 'xAxes' || key === 'yAxes') {
- var slen = source[key].length;
- var i, type, scale;
- if (!target[key]) {
- target[key] = [];
- }
- for (i = 0; i < slen; ++i) {
- scale = source[key][i];
- type = valueOrDefault$9(scale.type, key === 'xAxes' ? 'category' : 'linear');
- if (i >= target[key].length) {
- target[key].push({});
- }
- if (!target[key][i].type || (scale.type && scale.type !== target[key][i].type)) {
-
-
- helpers$1.merge(target[key][i], [core_scaleService.getScaleDefaults(type), scale]);
- } else {
-
- helpers$1.merge(target[key][i], scale);
- }
- }
- } else {
- helpers$1._merger(key, target, source, options);
- }
- }
- });
- }
- function mergeConfig(/* config objects ... */) {
- return helpers$1.merge({}, [].slice.call(arguments), {
- merger: function(key, target, source, options) {
- var tval = target[key] || {};
- var sval = source[key];
- if (key === 'scales') {
-
- target[key] = mergeScaleConfig(tval, sval);
- } else if (key === 'scale') {
-
- target[key] = helpers$1.merge(tval, [core_scaleService.getScaleDefaults(sval.type), sval]);
- } else {
- helpers$1._merger(key, target, source, options);
- }
- }
- });
- }
- function initConfig(config) {
- config = config || {};
-
-
- var data = config.data = config.data || {};
- data.datasets = data.datasets || [];
- data.labels = data.labels || [];
- config.options = mergeConfig(
- core_defaults.global,
- core_defaults[config.type],
- config.options || {});
- return config;
- }
- function updateConfig(chart) {
- var newOptions = chart.options;
- helpers$1.each(chart.scales, function(scale) {
- core_layouts.removeBox(chart, scale);
- });
- newOptions = mergeConfig(
- core_defaults.global,
- core_defaults[chart.config.type],
- newOptions);
- chart.options = chart.config.options = newOptions;
- chart.ensureScalesHaveIDs();
- chart.buildOrUpdateScales();
-
- chart.tooltip._options = newOptions.tooltips;
- chart.tooltip.initialize();
- }
- function nextAvailableScaleId(axesOpts, prefix, index) {
- var id;
- var hasId = function(obj) {
- return obj.id === id;
- };
- do {
- id = prefix + index++;
- } while (helpers$1.findIndex(axesOpts, hasId) >= 0);
- return id;
- }
- function positionIsHorizontal(position) {
- return position === 'top' || position === 'bottom';
- }
- function compare2Level(l1, l2) {
- return function(a, b) {
- return a[l1] === b[l1]
- ? a[l2] - b[l2]
- : a[l1] - b[l1];
- };
- }
- var Chart = function(item, config) {
- this.construct(item, config);
- return this;
- };
- helpers$1.extend(Chart.prototype, {
-
- construct: function(item, config) {
- var me = this;
- config = initConfig(config);
- var context = platform.acquireContext(item, config);
- var canvas = context && context.canvas;
- var height = canvas && canvas.height;
- var width = canvas && canvas.width;
- me.id = helpers$1.uid();
- me.ctx = context;
- me.canvas = canvas;
- me.config = config;
- me.width = width;
- me.height = height;
- me.aspectRatio = height ? width / height : null;
- me.options = config.options;
- me._bufferedRender = false;
- me._layers = [];
-
- me.chart = me;
- me.controller = me;
-
- Chart.instances[me.id] = me;
-
- Object.defineProperty(me, 'data', {
- get: function() {
- return me.config.data;
- },
- set: function(value) {
- me.config.data = value;
- }
- });
- if (!context || !canvas) {
-
-
-
-
- console.error("Failed to create chart: can't acquire context from the given item");
- return;
- }
- me.initialize();
- me.update();
- },
-
- initialize: function() {
- var me = this;
-
- core_plugins.notify(me, 'beforeInit');
- helpers$1.retinaScale(me, me.options.devicePixelRatio);
- me.bindEvents();
- if (me.options.responsive) {
-
- me.resize(true);
- }
- me.initToolTip();
-
- core_plugins.notify(me, 'afterInit');
- return me;
- },
- clear: function() {
- helpers$1.canvas.clear(this);
- return this;
- },
- stop: function() {
-
- core_animations.cancelAnimation(this);
- return this;
- },
- resize: function(silent) {
- var me = this;
- var options = me.options;
- var canvas = me.canvas;
- var aspectRatio = (options.maintainAspectRatio && me.aspectRatio) || null;
-
-
-
- var newWidth = Math.max(0, Math.floor(helpers$1.getMaximumWidth(canvas)));
- var newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers$1.getMaximumHeight(canvas)));
- if (me.width === newWidth && me.height === newHeight) {
- return;
- }
- canvas.width = me.width = newWidth;
- canvas.height = me.height = newHeight;
- canvas.style.width = newWidth + 'px';
- canvas.style.height = newHeight + 'px';
- helpers$1.retinaScale(me, options.devicePixelRatio);
- if (!silent) {
-
- var newSize = {width: newWidth, height: newHeight};
- core_plugins.notify(me, 'resize', [newSize]);
-
- if (options.onResize) {
- options.onResize(me, newSize);
- }
- me.stop();
- me.update({
- duration: options.responsiveAnimationDuration
- });
- }
- },
- ensureScalesHaveIDs: function() {
- var options = this.options;
- var scalesOptions = options.scales || {};
- var scaleOptions = options.scale;
- helpers$1.each(scalesOptions.xAxes, function(xAxisOptions, index) {
- if (!xAxisOptions.id) {
- xAxisOptions.id = nextAvailableScaleId(scalesOptions.xAxes, 'x-axis-', index);
- }
- });
- helpers$1.each(scalesOptions.yAxes, function(yAxisOptions, index) {
- if (!yAxisOptions.id) {
- yAxisOptions.id = nextAvailableScaleId(scalesOptions.yAxes, 'y-axis-', index);
- }
- });
- if (scaleOptions) {
- scaleOptions.id = scaleOptions.id || 'scale';
- }
- },
-
- buildOrUpdateScales: function() {
- var me = this;
- var options = me.options;
- var scales = me.scales || {};
- var items = [];
- var updated = Object.keys(scales).reduce(function(obj, id) {
- obj[id] = false;
- return obj;
- }, {});
- if (options.scales) {
- items = items.concat(
- (options.scales.xAxes || []).map(function(xAxisOptions) {
- return {options: xAxisOptions, dtype: 'category', dposition: 'bottom'};
- }),
- (options.scales.yAxes || []).map(function(yAxisOptions) {
- return {options: yAxisOptions, dtype: 'linear', dposition: 'left'};
- })
- );
- }
- if (options.scale) {
- items.push({
- options: options.scale,
- dtype: 'radialLinear',
- isDefault: true,
- dposition: 'chartArea'
- });
- }
- helpers$1.each(items, function(item) {
- var scaleOptions = item.options;
- var id = scaleOptions.id;
- var scaleType = valueOrDefault$9(scaleOptions.type, item.dtype);
- if (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) {
- scaleOptions.position = item.dposition;
- }
- updated[id] = true;
- var scale = null;
- if (id in scales && scales[id].type === scaleType) {
- scale = scales[id];
- scale.options = scaleOptions;
- scale.ctx = me.ctx;
- scale.chart = me;
- } else {
- var scaleClass = core_scaleService.getScaleConstructor(scaleType);
- if (!scaleClass) {
- return;
- }
- scale = new scaleClass({
- id: id,
- type: scaleType,
- options: scaleOptions,
- ctx: me.ctx,
- chart: me
- });
- scales[scale.id] = scale;
- }
- scale.mergeTicksOptions();
-
-
-
- if (item.isDefault) {
- me.scale = scale;
- }
- });
-
- helpers$1.each(updated, function(hasUpdated, id) {
- if (!hasUpdated) {
- delete scales[id];
- }
- });
- me.scales = scales;
- core_scaleService.addScalesToLayout(this);
- },
- buildOrUpdateControllers: function() {
- var me = this;
- var newControllers = [];
- var datasets = me.data.datasets;
- var i, ilen;
- for (i = 0, ilen = datasets.length; i < ilen; i++) {
- var dataset = datasets[i];
- var meta = me.getDatasetMeta(i);
- var type = dataset.type || me.config.type;
- if (meta.type && meta.type !== type) {
- me.destroyDatasetMeta(i);
- meta = me.getDatasetMeta(i);
- }
- meta.type = type;
- meta.order = dataset.order || 0;
- meta.index = i;
- if (meta.controller) {
- meta.controller.updateIndex(i);
- meta.controller.linkScales();
- } else {
- var ControllerClass = controllers[meta.type];
- if (ControllerClass === undefined) {
- throw new Error('"' + meta.type + '" is not a chart type.');
- }
- meta.controller = new ControllerClass(me, i);
- newControllers.push(meta.controller);
- }
- }
- return newControllers;
- },
-
- resetElements: function() {
- var me = this;
- helpers$1.each(me.data.datasets, function(dataset, datasetIndex) {
- me.getDatasetMeta(datasetIndex).controller.reset();
- }, me);
- },
-
- reset: function() {
- this.resetElements();
- this.tooltip.initialize();
- },
- update: function(config) {
- var me = this;
- var i, ilen;
- if (!config || typeof config !== 'object') {
-
- config = {
- duration: config,
- lazy: arguments[1]
- };
- }
- updateConfig(me);
-
-
- core_plugins._invalidate(me);
- if (core_plugins.notify(me, 'beforeUpdate') === false) {
- return;
- }
-
- me.tooltip._data = me.data;
-
- var newControllers = me.buildOrUpdateControllers();
-
- for (i = 0, ilen = me.data.datasets.length; i < ilen; i++) {
- me.getDatasetMeta(i).controller.buildOrUpdateElements();
- }
- me.updateLayout();
-
- if (me.options.animation && me.options.animation.duration) {
- helpers$1.each(newControllers, function(controller) {
- controller.reset();
- });
- }
- me.updateDatasets();
-
-
- me.tooltip.initialize();
-
-
- me.lastActive = [];
-
- core_plugins.notify(me, 'afterUpdate');
- me._layers.sort(compare2Level('z', '_idx'));
- if (me._bufferedRender) {
- me._bufferedRequest = {
- duration: config.duration,
- easing: config.easing,
- lazy: config.lazy
- };
- } else {
- me.render(config);
- }
- },
-
- updateLayout: function() {
- var me = this;
- if (core_plugins.notify(me, 'beforeLayout') === false) {
- return;
- }
- core_layouts.update(this, this.width, this.height);
- me._layers = [];
- helpers$1.each(me.boxes, function(box) {
-
-
- if (box._configure) {
- box._configure();
- }
- me._layers.push.apply(me._layers, box._layers());
- }, me);
- me._layers.forEach(function(item, index) {
- item._idx = index;
- });
-
- core_plugins.notify(me, 'afterScaleUpdate');
- core_plugins.notify(me, 'afterLayout');
- },
-
- updateDatasets: function() {
- var me = this;
- if (core_plugins.notify(me, 'beforeDatasetsUpdate') === false) {
- return;
- }
- for (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {
- me.updateDataset(i);
- }
- core_plugins.notify(me, 'afterDatasetsUpdate');
- },
-
- updateDataset: function(index) {
- var me = this;
- var meta = me.getDatasetMeta(index);
- var args = {
- meta: meta,
- index: index
- };
- if (core_plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) {
- return;
- }
- meta.controller._update();
- core_plugins.notify(me, 'afterDatasetUpdate', [args]);
- },
- render: function(config) {
- var me = this;
- if (!config || typeof config !== 'object') {
-
- config = {
- duration: config,
- lazy: arguments[1]
- };
- }
- var animationOptions = me.options.animation;
- var duration = valueOrDefault$9(config.duration, animationOptions && animationOptions.duration);
- var lazy = config.lazy;
- if (core_plugins.notify(me, 'beforeRender') === false) {
- return;
- }
- var onComplete = function(animation) {
- core_plugins.notify(me, 'afterRender');
- helpers$1.callback(animationOptions && animationOptions.onComplete, [animation], me);
- };
- if (animationOptions && duration) {
- var animation = new core_animation({
- numSteps: duration / 16.66,
- easing: config.easing || animationOptions.easing,
- render: function(chart, animationObject) {
- var easingFunction = helpers$1.easing.effects[animationObject.easing];
- var currentStep = animationObject.currentStep;
- var stepDecimal = currentStep / animationObject.numSteps;
- chart.draw(easingFunction(stepDecimal), stepDecimal, currentStep);
- },
- onAnimationProgress: animationOptions.onProgress,
- onAnimationComplete: onComplete
- });
- core_animations.addAnimation(me, animation, duration, lazy);
- } else {
- me.draw();
-
- onComplete(new core_animation({numSteps: 0, chart: me}));
- }
- return me;
- },
- draw: function(easingValue) {
- var me = this;
- var i, layers;
- me.clear();
- if (helpers$1.isNullOrUndef(easingValue)) {
- easingValue = 1;
- }
- me.transition(easingValue);
- if (me.width <= 0 || me.height <= 0) {
- return;
- }
- if (core_plugins.notify(me, 'beforeDraw', [easingValue]) === false) {
- return;
- }
-
-
-
- layers = me._layers;
- for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {
- layers[i].draw(me.chartArea);
- }
- me.drawDatasets(easingValue);
-
- for (; i < layers.length; ++i) {
- layers[i].draw(me.chartArea);
- }
- me._drawTooltip(easingValue);
- core_plugins.notify(me, 'afterDraw', [easingValue]);
- },
-
- transition: function(easingValue) {
- var me = this;
- for (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) {
- if (me.isDatasetVisible(i)) {
- me.getDatasetMeta(i).controller.transition(easingValue);
- }
- }
- me.tooltip.transition(easingValue);
- },
-
- _getSortedDatasetMetas: function(filterVisible) {
- var me = this;
- var datasets = me.data.datasets || [];
- var result = [];
- var i, ilen;
- for (i = 0, ilen = datasets.length; i < ilen; ++i) {
- if (!filterVisible || me.isDatasetVisible(i)) {
- result.push(me.getDatasetMeta(i));
- }
- }
- result.sort(compare2Level('order', 'index'));
- return result;
- },
-
- _getSortedVisibleDatasetMetas: function() {
- return this._getSortedDatasetMetas(true);
- },
-
- drawDatasets: function(easingValue) {
- var me = this;
- var metasets, i;
- if (core_plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) {
- return;
- }
- metasets = me._getSortedVisibleDatasetMetas();
- for (i = metasets.length - 1; i >= 0; --i) {
- me.drawDataset(metasets[i], easingValue);
- }
- core_plugins.notify(me, 'afterDatasetsDraw', [easingValue]);
- },
-
- drawDataset: function(meta, easingValue) {
- var me = this;
- var args = {
- meta: meta,
- index: meta.index,
- easingValue: easingValue
- };
- if (core_plugins.notify(me, 'beforeDatasetDraw', [args]) === false) {
- return;
- }
- meta.controller.draw(easingValue);
- core_plugins.notify(me, 'afterDatasetDraw', [args]);
- },
-
- _drawTooltip: function(easingValue) {
- var me = this;
- var tooltip = me.tooltip;
- var args = {
- tooltip: tooltip,
- easingValue: easingValue
- };
- if (core_plugins.notify(me, 'beforeTooltipDraw', [args]) === false) {
- return;
- }
- tooltip.draw();
- core_plugins.notify(me, 'afterTooltipDraw', [args]);
- },
-
- getElementAtEvent: function(e) {
- return core_interaction.modes.single(this, e);
- },
- getElementsAtEvent: function(e) {
- return core_interaction.modes.label(this, e, {intersect: true});
- },
- getElementsAtXAxis: function(e) {
- return core_interaction.modes['x-axis'](this, e, {intersect: true});
- },
- getElementsAtEventForMode: function(e, mode, options) {
- var method = core_interaction.modes[mode];
- if (typeof method === 'function') {
- return method(this, e, options);
- }
- return [];
- },
- getDatasetAtEvent: function(e) {
- return core_interaction.modes.dataset(this, e, {intersect: true});
- },
- getDatasetMeta: function(datasetIndex) {
- var me = this;
- var dataset = me.data.datasets[datasetIndex];
- if (!dataset._meta) {
- dataset._meta = {};
- }
- var meta = dataset._meta[me.id];
- if (!meta) {
- meta = dataset._meta[me.id] = {
- type: null,
- data: [],
- dataset: null,
- controller: null,
- hidden: null,
- xAxisID: null,
- yAxisID: null,
- order: dataset.order || 0,
- index: datasetIndex
- };
- }
- return meta;
- },
- getVisibleDatasetCount: function() {
- var count = 0;
- for (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {
- if (this.isDatasetVisible(i)) {
- count++;
- }
- }
- return count;
- },
- isDatasetVisible: function(datasetIndex) {
- var meta = this.getDatasetMeta(datasetIndex);
-
-
- return typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden;
- },
- generateLegend: function() {
- return this.options.legendCallback(this);
- },
-
- destroyDatasetMeta: function(datasetIndex) {
- var id = this.id;
- var dataset = this.data.datasets[datasetIndex];
- var meta = dataset._meta && dataset._meta[id];
- if (meta) {
- meta.controller.destroy();
- delete dataset._meta[id];
- }
- },
- destroy: function() {
- var me = this;
- var canvas = me.canvas;
- var i, ilen;
- me.stop();
-
- for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {
- me.destroyDatasetMeta(i);
- }
- if (canvas) {
- me.unbindEvents();
- helpers$1.canvas.clear(me);
- platform.releaseContext(me.ctx);
- me.canvas = null;
- me.ctx = null;
- }
- core_plugins.notify(me, 'destroy');
- delete Chart.instances[me.id];
- },
- toBase64Image: function() {
- return this.canvas.toDataURL.apply(this.canvas, arguments);
- },
- initToolTip: function() {
- var me = this;
- me.tooltip = new core_tooltip({
- _chart: me,
- _chartInstance: me,
- _data: me.data,
- _options: me.options.tooltips
- }, me);
- },
-
- bindEvents: function() {
- var me = this;
- var listeners = me._listeners = {};
- var listener = function() {
- me.eventHandler.apply(me, arguments);
- };
- helpers$1.each(me.options.events, function(type) {
- platform.addEventListener(me, type, listener);
- listeners[type] = listener;
- });
-
-
- if (me.options.responsive) {
- listener = function() {
- me.resize();
- };
- platform.addEventListener(me, 'resize', listener);
- listeners.resize = listener;
- }
- },
-
- unbindEvents: function() {
- var me = this;
- var listeners = me._listeners;
- if (!listeners) {
- return;
- }
- delete me._listeners;
- helpers$1.each(listeners, function(listener, type) {
- platform.removeEventListener(me, type, listener);
- });
- },
- updateHoverStyle: function(elements, mode, enabled) {
- var prefix = enabled ? 'set' : 'remove';
- var element, i, ilen;
- for (i = 0, ilen = elements.length; i < ilen; ++i) {
- element = elements[i];
- if (element) {
- this.getDatasetMeta(element._datasetIndex).controller[prefix + 'HoverStyle'](element);
- }
- }
- if (mode === 'dataset') {
- this.getDatasetMeta(elements[0]._datasetIndex).controller['_' + prefix + 'DatasetHoverStyle']();
- }
- },
-
- eventHandler: function(e) {
- var me = this;
- var tooltip = me.tooltip;
- if (core_plugins.notify(me, 'beforeEvent', [e]) === false) {
- return;
- }
-
- me._bufferedRender = true;
- me._bufferedRequest = null;
- var changed = me.handleEvent(e);
-
-
-
-
- if (tooltip) {
- changed = tooltip._start
- ? tooltip.handleEvent(e)
- : changed | tooltip.handleEvent(e);
- }
- core_plugins.notify(me, 'afterEvent', [e]);
- var bufferedRequest = me._bufferedRequest;
- if (bufferedRequest) {
-
- me.render(bufferedRequest);
- } else if (changed && !me.animating) {
-
- me.stop();
-
-
- me.render({
- duration: me.options.hover.animationDuration,
- lazy: true
- });
- }
- me._bufferedRender = false;
- me._bufferedRequest = null;
- return me;
- },
-
- handleEvent: function(e) {
- var me = this;
- var options = me.options || {};
- var hoverOptions = options.hover;
- var changed = false;
- me.lastActive = me.lastActive || [];
-
- if (e.type === 'mouseout') {
- me.active = [];
- } else {
- me.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions);
- }
-
-
- helpers$1.callback(options.onHover || options.hover.onHover, [e.native, me.active], me);
- if (e.type === 'mouseup' || e.type === 'click') {
- if (options.onClick) {
-
- options.onClick.call(me, e.native, me.active);
- }
- }
-
- if (me.lastActive.length) {
- me.updateHoverStyle(me.lastActive, hoverOptions.mode, false);
- }
-
- if (me.active.length && hoverOptions.mode) {
- me.updateHoverStyle(me.active, hoverOptions.mode, true);
- }
- changed = !helpers$1.arrayEquals(me.active, me.lastActive);
-
- me.lastActive = me.active;
- return changed;
- }
- });
- Chart.instances = {};
- var core_controller = Chart;
- Chart.Controller = Chart;
- Chart.types = {};
- helpers$1.configMerge = mergeConfig;
- helpers$1.scaleMerge = mergeScaleConfig;
- var core_helpers = function() {
-
- helpers$1.where = function(collection, filterCallback) {
- if (helpers$1.isArray(collection) && Array.prototype.filter) {
- return collection.filter(filterCallback);
- }
- var filtered = [];
- helpers$1.each(collection, function(item) {
- if (filterCallback(item)) {
- filtered.push(item);
- }
- });
- return filtered;
- };
- helpers$1.findIndex = Array.prototype.findIndex ?
- function(array, callback, scope) {
- return array.findIndex(callback, scope);
- } :
- function(array, callback, scope) {
- scope = scope === undefined ? array : scope;
- for (var i = 0, ilen = array.length; i < ilen; ++i) {
- if (callback.call(scope, array[i], i, array)) {
- return i;
- }
- }
- return -1;
- };
- helpers$1.findNextWhere = function(arrayToSearch, filterCallback, startIndex) {
-
- if (helpers$1.isNullOrUndef(startIndex)) {
- startIndex = -1;
- }
- for (var i = startIndex + 1; i < arrayToSearch.length; i++) {
- var currentItem = arrayToSearch[i];
- if (filterCallback(currentItem)) {
- return currentItem;
- }
- }
- };
- helpers$1.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) {
-
- if (helpers$1.isNullOrUndef(startIndex)) {
- startIndex = arrayToSearch.length;
- }
- for (var i = startIndex - 1; i >= 0; i--) {
- var currentItem = arrayToSearch[i];
- if (filterCallback(currentItem)) {
- return currentItem;
- }
- }
- };
-
- helpers$1.isNumber = function(n) {
- return !isNaN(parseFloat(n)) && isFinite(n);
- };
- helpers$1.almostEquals = function(x, y, epsilon) {
- return Math.abs(x - y) < epsilon;
- };
- helpers$1.almostWhole = function(x, epsilon) {
- var rounded = Math.round(x);
- return ((rounded - epsilon) <= x) && ((rounded + epsilon) >= x);
- };
- helpers$1.max = function(array) {
- return array.reduce(function(max, value) {
- if (!isNaN(value)) {
- return Math.max(max, value);
- }
- return max;
- }, Number.NEGATIVE_INFINITY);
- };
- helpers$1.min = function(array) {
- return array.reduce(function(min, value) {
- if (!isNaN(value)) {
- return Math.min(min, value);
- }
- return min;
- }, Number.POSITIVE_INFINITY);
- };
- helpers$1.sign = Math.sign ?
- function(x) {
- return Math.sign(x);
- } :
- function(x) {
- x = +x;
- if (x === 0 || isNaN(x)) {
- return x;
- }
- return x > 0 ? 1 : -1;
- };
- helpers$1.toRadians = function(degrees) {
- return degrees * (Math.PI / 180);
- };
- helpers$1.toDegrees = function(radians) {
- return radians * (180 / Math.PI);
- };
-
- helpers$1._decimalPlaces = function(x) {
- if (!helpers$1.isFinite(x)) {
- return;
- }
- var e = 1;
- var p = 0;
- while (Math.round(x * e) / e !== x) {
- e *= 10;
- p++;
- }
- return p;
- };
-
- helpers$1.getAngleFromPoint = function(centrePoint, anglePoint) {
- var distanceFromXCenter = anglePoint.x - centrePoint.x;
- var distanceFromYCenter = anglePoint.y - centrePoint.y;
- var radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);
- var angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);
- if (angle < (-0.5 * Math.PI)) {
- angle += 2.0 * Math.PI;
- }
- return {
- angle: angle,
- distance: radialDistanceFromCenter
- };
- };
- helpers$1.distanceBetweenPoints = function(pt1, pt2) {
- return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));
- };
-
- helpers$1.aliasPixel = function(pixelWidth) {
- return (pixelWidth % 2 === 0) ? 0 : 0.5;
- };
-
- helpers$1._alignPixel = function(chart, pixel, width) {
- var devicePixelRatio = chart.currentDevicePixelRatio;
- var halfWidth = width / 2;
- return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;
- };
- helpers$1.splineCurve = function(firstPoint, middlePoint, afterPoint, t) {
-
-
-
- var previous = firstPoint.skip ? middlePoint : firstPoint;
- var current = middlePoint;
- var next = afterPoint.skip ? middlePoint : afterPoint;
- var d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2));
- var d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2));
- var s01 = d01 / (d01 + d12);
- var s12 = d12 / (d01 + d12);
-
- s01 = isNaN(s01) ? 0 : s01;
- s12 = isNaN(s12) ? 0 : s12;
- var fa = t * s01;
- var fb = t * s12;
- return {
- previous: {
- x: current.x - fa * (next.x - previous.x),
- y: current.y - fa * (next.y - previous.y)
- },
- next: {
- x: current.x + fb * (next.x - previous.x),
- y: current.y + fb * (next.y - previous.y)
- }
- };
- };
- helpers$1.EPSILON = Number.EPSILON || 1e-14;
- helpers$1.splineCurveMonotone = function(points) {
-
-
-
-
- var pointsWithTangents = (points || []).map(function(point) {
- return {
- model: point._model,
- deltaK: 0,
- mK: 0
- };
- });
-
- var pointsLen = pointsWithTangents.length;
- var i, pointBefore, pointCurrent, pointAfter;
- for (i = 0; i < pointsLen; ++i) {
- pointCurrent = pointsWithTangents[i];
- if (pointCurrent.model.skip) {
- continue;
- }
- pointBefore = i > 0 ? pointsWithTangents[i - 1] : null;
- pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;
- if (pointAfter && !pointAfter.model.skip) {
- var slopeDeltaX = (pointAfter.model.x - pointCurrent.model.x);
-
- pointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0;
- }
- if (!pointBefore || pointBefore.model.skip) {
- pointCurrent.mK = pointCurrent.deltaK;
- } else if (!pointAfter || pointAfter.model.skip) {
- pointCurrent.mK = pointBefore.deltaK;
- } else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) {
- pointCurrent.mK = 0;
- } else {
- pointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2;
- }
- }
-
- var alphaK, betaK, tauK, squaredMagnitude;
- for (i = 0; i < pointsLen - 1; ++i) {
- pointCurrent = pointsWithTangents[i];
- pointAfter = pointsWithTangents[i + 1];
- if (pointCurrent.model.skip || pointAfter.model.skip) {
- continue;
- }
- if (helpers$1.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) {
- pointCurrent.mK = pointAfter.mK = 0;
- continue;
- }
- alphaK = pointCurrent.mK / pointCurrent.deltaK;
- betaK = pointAfter.mK / pointCurrent.deltaK;
- squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);
- if (squaredMagnitude <= 9) {
- continue;
- }
- tauK = 3 / Math.sqrt(squaredMagnitude);
- pointCurrent.mK = alphaK * tauK * pointCurrent.deltaK;
- pointAfter.mK = betaK * tauK * pointCurrent.deltaK;
- }
-
- var deltaX;
- for (i = 0; i < pointsLen; ++i) {
- pointCurrent = pointsWithTangents[i];
- if (pointCurrent.model.skip) {
- continue;
- }
- pointBefore = i > 0 ? pointsWithTangents[i - 1] : null;
- pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;
- if (pointBefore && !pointBefore.model.skip) {
- deltaX = (pointCurrent.model.x - pointBefore.model.x) / 3;
- pointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX;
- pointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK;
- }
- if (pointAfter && !pointAfter.model.skip) {
- deltaX = (pointAfter.model.x - pointCurrent.model.x) / 3;
- pointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX;
- pointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK;
- }
- }
- };
- helpers$1.nextItem = function(collection, index, loop) {
- if (loop) {
- return index >= collection.length - 1 ? collection[0] : collection[index + 1];
- }
- return index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1];
- };
- helpers$1.previousItem = function(collection, index, loop) {
- if (loop) {
- return index <= 0 ? collection[collection.length - 1] : collection[index - 1];
- }
- return index <= 0 ? collection[0] : collection[index - 1];
- };
-
- helpers$1.niceNum = function(range, round) {
- var exponent = Math.floor(helpers$1.log10(range));
- var fraction = range / Math.pow(10, exponent);
- var niceFraction;
- if (round) {
- if (fraction < 1.5) {
- niceFraction = 1;
- } else if (fraction < 3) {
- niceFraction = 2;
- } else if (fraction < 7) {
- niceFraction = 5;
- } else {
- niceFraction = 10;
- }
- } else if (fraction <= 1.0) {
- niceFraction = 1;
- } else if (fraction <= 2) {
- niceFraction = 2;
- } else if (fraction <= 5) {
- niceFraction = 5;
- } else {
- niceFraction = 10;
- }
- return niceFraction * Math.pow(10, exponent);
- };
-
- helpers$1.requestAnimFrame = (function() {
- if (typeof window === 'undefined') {
- return function(callback) {
- callback();
- };
- }
- return window.requestAnimationFrame ||
- window.webkitRequestAnimationFrame ||
- window.mozRequestAnimationFrame ||
- window.oRequestAnimationFrame ||
- window.msRequestAnimationFrame ||
- function(callback) {
- return window.setTimeout(callback, 1000 / 60);
- };
- }());
-
- helpers$1.getRelativePosition = function(evt, chart) {
- var mouseX, mouseY;
- var e = evt.originalEvent || evt;
- var canvas = evt.target || evt.srcElement;
- var boundingRect = canvas.getBoundingClientRect();
- var touches = e.touches;
- if (touches && touches.length > 0) {
- mouseX = touches[0].clientX;
- mouseY = touches[0].clientY;
- } else {
- mouseX = e.clientX;
- mouseY = e.clientY;
- }
-
-
-
- var paddingLeft = parseFloat(helpers$1.getStyle(canvas, 'padding-left'));
- var paddingTop = parseFloat(helpers$1.getStyle(canvas, 'padding-top'));
- var paddingRight = parseFloat(helpers$1.getStyle(canvas, 'padding-right'));
- var paddingBottom = parseFloat(helpers$1.getStyle(canvas, 'padding-bottom'));
- var width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight;
- var height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom;
-
-
- mouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio);
- mouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio);
- return {
- x: mouseX,
- y: mouseY
- };
- };
-
- function parseMaxStyle(styleValue, node, parentProperty) {
- var valueInPixels;
- if (typeof styleValue === 'string') {
- valueInPixels = parseInt(styleValue, 10);
- if (styleValue.indexOf('%') !== -1) {
-
- valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];
- }
- } else {
- valueInPixels = styleValue;
- }
- return valueInPixels;
- }
-
- function isConstrainedValue(value) {
- return value !== undefined && value !== null && value !== 'none';
- }
-
- function getConstraintDimension(domNode, maxStyle, percentageProperty) {
- var view = document.defaultView;
- var parentNode = helpers$1._getParentNode(domNode);
- var constrainedNode = view.getComputedStyle(domNode)[maxStyle];
- var constrainedContainer = view.getComputedStyle(parentNode)[maxStyle];
- var hasCNode = isConstrainedValue(constrainedNode);
- var hasCContainer = isConstrainedValue(constrainedContainer);
- var infinity = Number.POSITIVE_INFINITY;
- if (hasCNode || hasCContainer) {
- return Math.min(
- hasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity,
- hasCContainer ? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity);
- }
- return 'none';
- }
-
- helpers$1.getConstraintWidth = function(domNode) {
- return getConstraintDimension(domNode, 'max-width', 'clientWidth');
- };
-
- helpers$1.getConstraintHeight = function(domNode) {
- return getConstraintDimension(domNode, 'max-height', 'clientHeight');
- };
-
- helpers$1._calculatePadding = function(container, padding, parentDimension) {
- padding = helpers$1.getStyle(container, padding);
- return padding.indexOf('%') > -1 ? parentDimension * parseInt(padding, 10) / 100 : parseInt(padding, 10);
- };
-
- helpers$1._getParentNode = function(domNode) {
- var parent = domNode.parentNode;
- if (parent && parent.toString() === '[object ShadowRoot]') {
- parent = parent.host;
- }
- return parent;
- };
- helpers$1.getMaximumWidth = function(domNode) {
- var container = helpers$1._getParentNode(domNode);
- if (!container) {
- return domNode.clientWidth;
- }
- var clientWidth = container.clientWidth;
- var paddingLeft = helpers$1._calculatePadding(container, 'padding-left', clientWidth);
- var paddingRight = helpers$1._calculatePadding(container, 'padding-right', clientWidth);
- var w = clientWidth - paddingLeft - paddingRight;
- var cw = helpers$1.getConstraintWidth(domNode);
- return isNaN(cw) ? w : Math.min(w, cw);
- };
- helpers$1.getMaximumHeight = function(domNode) {
- var container = helpers$1._getParentNode(domNode);
- if (!container) {
- return domNode.clientHeight;
- }
- var clientHeight = container.clientHeight;
- var paddingTop = helpers$1._calculatePadding(container, 'padding-top', clientHeight);
- var paddingBottom = helpers$1._calculatePadding(container, 'padding-bottom', clientHeight);
- var h = clientHeight - paddingTop - paddingBottom;
- var ch = helpers$1.getConstraintHeight(domNode);
- return isNaN(ch) ? h : Math.min(h, ch);
- };
- helpers$1.getStyle = function(el, property) {
- return el.currentStyle ?
- el.currentStyle[property] :
- document.defaultView.getComputedStyle(el, null).getPropertyValue(property);
- };
- helpers$1.retinaScale = function(chart, forceRatio) {
- var pixelRatio = chart.currentDevicePixelRatio = forceRatio || (typeof window !== 'undefined' && window.devicePixelRatio) || 1;
- if (pixelRatio === 1) {
- return;
- }
- var canvas = chart.canvas;
- var height = chart.height;
- var width = chart.width;
- canvas.height = height * pixelRatio;
- canvas.width = width * pixelRatio;
- chart.ctx.scale(pixelRatio, pixelRatio);
-
-
-
- if (!canvas.style.height && !canvas.style.width) {
- canvas.style.height = height + 'px';
- canvas.style.width = width + 'px';
- }
- };
-
- helpers$1.fontString = function(pixelSize, fontStyle, fontFamily) {
- return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;
- };
- helpers$1.longestText = function(ctx, font, arrayOfThings, cache) {
- cache = cache || {};
- var data = cache.data = cache.data || {};
- var gc = cache.garbageCollect = cache.garbageCollect || [];
- if (cache.font !== font) {
- data = cache.data = {};
- gc = cache.garbageCollect = [];
- cache.font = font;
- }
- ctx.font = font;
- var longest = 0;
- var ilen = arrayOfThings.length;
- var i, j, jlen, thing, nestedThing;
- for (i = 0; i < ilen; i++) {
- thing = arrayOfThings[i];
-
- if (thing !== undefined && thing !== null && helpers$1.isArray(thing) !== true) {
- longest = helpers$1.measureText(ctx, data, gc, longest, thing);
- } else if (helpers$1.isArray(thing)) {
-
-
- for (j = 0, jlen = thing.length; j < jlen; j++) {
- nestedThing = thing[j];
-
- if (nestedThing !== undefined && nestedThing !== null && !helpers$1.isArray(nestedThing)) {
- longest = helpers$1.measureText(ctx, data, gc, longest, nestedThing);
- }
- }
- }
- }
- var gcLen = gc.length / 2;
- if (gcLen > arrayOfThings.length) {
- for (i = 0; i < gcLen; i++) {
- delete data[gc[i]];
- }
- gc.splice(0, gcLen);
- }
- return longest;
- };
- helpers$1.measureText = function(ctx, data, gc, longest, string) {
- var textWidth = data[string];
- if (!textWidth) {
- textWidth = data[string] = ctx.measureText(string).width;
- gc.push(string);
- }
- if (textWidth > longest) {
- longest = textWidth;
- }
- return longest;
- };
-
- helpers$1.numberOfLabelLines = function(arrayOfThings) {
- var numberOfLines = 1;
- helpers$1.each(arrayOfThings, function(thing) {
- if (helpers$1.isArray(thing)) {
- if (thing.length > numberOfLines) {
- numberOfLines = thing.length;
- }
- }
- });
- return numberOfLines;
- };
- helpers$1.color = !chartjsColor ?
- function(value) {
- console.error('Color.js not found!');
- return value;
- } :
- function(value) {
-
- if (value instanceof CanvasGradient) {
- value = core_defaults.global.defaultColor;
- }
- return chartjsColor(value);
- };
- helpers$1.getHoverColor = function(colorValue) {
-
- return (colorValue instanceof CanvasPattern || colorValue instanceof CanvasGradient) ?
- colorValue :
- helpers$1.color(colorValue).saturate(0.5).darken(0.1).rgbString();
- };
- };
- function abstract() {
- throw new Error(
- 'This method is not implemented: either no adapter can ' +
- 'be found or an incomplete integration was provided.'
- );
- }
- function DateAdapter(options) {
- this.options = options || {};
- }
- helpers$1.extend(DateAdapter.prototype, {
-
- formats: abstract,
-
- parse: abstract,
-
- format: abstract,
-
- add: abstract,
-
- diff: abstract,
-
- startOf: abstract,
-
- endOf: abstract,
-
-
- _create: function(value) {
- return value;
- }
- });
- DateAdapter.override = function(members) {
- helpers$1.extend(DateAdapter.prototype, members);
- };
- var _date = DateAdapter;
- var core_adapters = {
- _date: _date
- };
- var core_ticks = {
-
- formatters: {
-
- values: function(value) {
- return helpers$1.isArray(value) ? value : '' + value;
- },
-
- linear: function(tickValue, index, ticks) {
-
- var delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0];
-
- if (Math.abs(delta) > 1) {
- if (tickValue !== Math.floor(tickValue)) {
-
- delta = tickValue - Math.floor(tickValue);
- }
- }
- var logDelta = helpers$1.log10(Math.abs(delta));
- var tickString = '';
- if (tickValue !== 0) {
- var maxTick = Math.max(Math.abs(ticks[0]), Math.abs(ticks[ticks.length - 1]));
- if (maxTick < 1e-4) {
- var logTick = helpers$1.log10(Math.abs(tickValue));
- var numExponential = Math.floor(logTick) - Math.floor(logDelta);
- numExponential = Math.max(Math.min(numExponential, 20), 0);
- tickString = tickValue.toExponential(numExponential);
- } else {
- var numDecimal = -1 * Math.floor(logDelta);
- numDecimal = Math.max(Math.min(numDecimal, 20), 0);
- tickString = tickValue.toFixed(numDecimal);
- }
- } else {
- tickString = '0';
- }
- return tickString;
- },
- logarithmic: function(tickValue, index, ticks) {
- var remain = tickValue / (Math.pow(10, Math.floor(helpers$1.log10(tickValue))));
- if (tickValue === 0) {
- return '0';
- } else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) {
- return tickValue.toExponential();
- }
- return '';
- }
- }
- };
- var isArray = helpers$1.isArray;
- var isNullOrUndef = helpers$1.isNullOrUndef;
- var valueOrDefault$a = helpers$1.valueOrDefault;
- var valueAtIndexOrDefault = helpers$1.valueAtIndexOrDefault;
- core_defaults._set('scale', {
- display: true,
- position: 'left',
- offset: false,
-
- gridLines: {
- display: true,
- color: 'rgba(0,0,0,0.1)',
- lineWidth: 1,
- drawBorder: true,
- drawOnChartArea: true,
- drawTicks: true,
- tickMarkLength: 10,
- zeroLineWidth: 1,
- zeroLineColor: 'rgba(0,0,0,0.25)',
- zeroLineBorderDash: [],
- zeroLineBorderDashOffset: 0.0,
- offsetGridLines: false,
- borderDash: [],
- borderDashOffset: 0.0
- },
-
- scaleLabel: {
-
- display: false,
-
- labelString: '',
-
- padding: {
- top: 4,
- bottom: 4
- }
- },
-
- ticks: {
- beginAtZero: false,
- minRotation: 0,
- maxRotation: 50,
- mirror: false,
- padding: 0,
- reverse: false,
- display: true,
- autoSkip: true,
- autoSkipPadding: 0,
- labelOffset: 0,
-
- callback: core_ticks.formatters.values,
- minor: {},
- major: {}
- }
- });
- function sample(arr, numItems) {
- var result = [];
- var increment = arr.length / numItems;
- var i = 0;
- var len = arr.length;
- for (; i < len; i += increment) {
- result.push(arr[Math.floor(i)]);
- }
- return result;
- }
- function getPixelForGridLine(scale, index, offsetGridLines) {
- var length = scale.getTicks().length;
- var validIndex = Math.min(index, length - 1);
- var lineValue = scale.getPixelForTick(validIndex);
- var start = scale._startPixel;
- var end = scale._endPixel;
- var epsilon = 1e-6;
- var offset;
- if (offsetGridLines) {
- if (length === 1) {
- offset = Math.max(lineValue - start, end - lineValue);
- } else if (index === 0) {
- offset = (scale.getPixelForTick(1) - lineValue) / 2;
- } else {
- offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;
- }
- lineValue += validIndex < index ? offset : -offset;
-
- if (lineValue < start - epsilon || lineValue > end + epsilon) {
- return;
- }
- }
- return lineValue;
- }
- function garbageCollect(caches, length) {
- helpers$1.each(caches, function(cache) {
- var gc = cache.gc;
- var gcLen = gc.length / 2;
- var i;
- if (gcLen > length) {
- for (i = 0; i < gcLen; ++i) {
- delete cache.data[gc[i]];
- }
- gc.splice(0, gcLen);
- }
- });
- }
- function computeLabelSizes(ctx, tickFonts, ticks, caches) {
- var length = ticks.length;
- var widths = [];
- var heights = [];
- var offsets = [];
- var i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel, widest, highest;
- for (i = 0; i < length; ++i) {
- label = ticks[i].label;
- tickFont = ticks[i].major ? tickFonts.major : tickFonts.minor;
- ctx.font = fontString = tickFont.string;
- cache = caches[fontString] = caches[fontString] || {data: {}, gc: []};
- lineHeight = tickFont.lineHeight;
- width = height = 0;
-
- if (!isNullOrUndef(label) && !isArray(label)) {
- width = helpers$1.measureText(ctx, cache.data, cache.gc, width, label);
- height = lineHeight;
- } else if (isArray(label)) {
-
- for (j = 0, jlen = label.length; j < jlen; ++j) {
- nestedLabel = label[j];
-
- if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {
- width = helpers$1.measureText(ctx, cache.data, cache.gc, width, nestedLabel);
- height += lineHeight;
- }
- }
- }
- widths.push(width);
- heights.push(height);
- offsets.push(lineHeight / 2);
- }
- garbageCollect(caches, length);
- widest = widths.indexOf(Math.max.apply(null, widths));
- highest = heights.indexOf(Math.max.apply(null, heights));
- function valueAt(idx) {
- return {
- width: widths[idx] || 0,
- height: heights[idx] || 0,
- offset: offsets[idx] || 0
- };
- }
- return {
- first: valueAt(0),
- last: valueAt(length - 1),
- widest: valueAt(widest),
- highest: valueAt(highest)
- };
- }
- function getTickMarkLength(options) {
- return options.drawTicks ? options.tickMarkLength : 0;
- }
- function getScaleLabelHeight(options) {
- var font, padding;
- if (!options.display) {
- return 0;
- }
- font = helpers$1.options._parseFont(options);
- padding = helpers$1.options.toPadding(options.padding);
- return font.lineHeight + padding.height;
- }
- function parseFontOptions(options, nestedOpts) {
- return helpers$1.extend(helpers$1.options._parseFont({
- fontFamily: valueOrDefault$a(nestedOpts.fontFamily, options.fontFamily),
- fontSize: valueOrDefault$a(nestedOpts.fontSize, options.fontSize),
- fontStyle: valueOrDefault$a(nestedOpts.fontStyle, options.fontStyle),
- lineHeight: valueOrDefault$a(nestedOpts.lineHeight, options.lineHeight)
- }), {
- color: helpers$1.options.resolve([nestedOpts.fontColor, options.fontColor, core_defaults.global.defaultFontColor])
- });
- }
- function parseTickFontOptions(options) {
- var minor = parseFontOptions(options, options.minor);
- var major = options.major.enabled ? parseFontOptions(options, options.major) : minor;
- return {minor: minor, major: major};
- }
- function nonSkipped(ticksToFilter) {
- var filtered = [];
- var item, index, len;
- for (index = 0, len = ticksToFilter.length; index < len; ++index) {
- item = ticksToFilter[index];
- if (typeof item._index !== 'undefined') {
- filtered.push(item);
- }
- }
- return filtered;
- }
- function getEvenSpacing(arr) {
- var len = arr.length;
- var i, diff;
- if (len < 2) {
- return false;
- }
- for (diff = arr[0], i = 1; i < len; ++i) {
- if (arr[i] - arr[i - 1] !== diff) {
- return false;
- }
- }
- return diff;
- }
- function calculateSpacing(majorIndices, ticks, axisLength, ticksLimit) {
- var evenMajorSpacing = getEvenSpacing(majorIndices);
- var spacing = (ticks.length - 1) / ticksLimit;
- var factors, factor, i, ilen;
-
-
- if (!evenMajorSpacing) {
- return Math.max(spacing, 1);
- }
- factors = helpers$1.math._factorize(evenMajorSpacing);
- for (i = 0, ilen = factors.length - 1; i < ilen; i++) {
- factor = factors[i];
- if (factor > spacing) {
- return factor;
- }
- }
- return Math.max(spacing, 1);
- }
- function getMajorIndices(ticks) {
- var result = [];
- var i, ilen;
- for (i = 0, ilen = ticks.length; i < ilen; i++) {
- if (ticks[i].major) {
- result.push(i);
- }
- }
- return result;
- }
- function skipMajors(ticks, majorIndices, spacing) {
- var count = 0;
- var next = majorIndices[0];
- var i, tick;
- spacing = Math.ceil(spacing);
- for (i = 0; i < ticks.length; i++) {
- tick = ticks[i];
- if (i === next) {
- tick._index = i;
- count++;
- next = majorIndices[count * spacing];
- } else {
- delete tick.label;
- }
- }
- }
- function skip(ticks, spacing, majorStart, majorEnd) {
- var start = valueOrDefault$a(majorStart, 0);
- var end = Math.min(valueOrDefault$a(majorEnd, ticks.length), ticks.length);
- var count = 0;
- var length, i, tick, next;
- spacing = Math.ceil(spacing);
- if (majorEnd) {
- length = majorEnd - majorStart;
- spacing = length / Math.floor(length / spacing);
- }
- next = start;
- while (next < 0) {
- count++;
- next = Math.round(start + count * spacing);
- }
- for (i = Math.max(start, 0); i < end; i++) {
- tick = ticks[i];
- if (i === next) {
- tick._index = i;
- count++;
- next = Math.round(start + count * spacing);
- } else {
- delete tick.label;
- }
- }
- }
- var Scale = core_element.extend({
- zeroLineIndex: 0,
-
- getPadding: function() {
- var me = this;
- return {
- left: me.paddingLeft || 0,
- top: me.paddingTop || 0,
- right: me.paddingRight || 0,
- bottom: me.paddingBottom || 0
- };
- },
-
- getTicks: function() {
- return this._ticks;
- },
-
- _getLabels: function() {
- var data = this.chart.data;
- return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];
- },
-
-
-
-
- mergeTicksOptions: function() {
-
- },
- beforeUpdate: function() {
- helpers$1.callback(this.options.beforeUpdate, [this]);
- },
-
- update: function(maxWidth, maxHeight, margins) {
- var me = this;
- var tickOpts = me.options.ticks;
- var sampleSize = tickOpts.sampleSize;
- var i, ilen, labels, ticks, samplingEnabled;
-
- me.beforeUpdate();
-
- me.maxWidth = maxWidth;
- me.maxHeight = maxHeight;
- me.margins = helpers$1.extend({
- left: 0,
- right: 0,
- top: 0,
- bottom: 0
- }, margins);
- me._ticks = null;
- me.ticks = null;
- me._labelSizes = null;
- me._maxLabelLines = 0;
- me.longestLabelWidth = 0;
- me.longestTextCache = me.longestTextCache || {};
- me._gridLineItems = null;
- me._labelItems = null;
-
- me.beforeSetDimensions();
- me.setDimensions();
- me.afterSetDimensions();
-
- me.beforeDataLimits();
- me.determineDataLimits();
- me.afterDataLimits();
-
-
-
-
-
-
- me.beforeBuildTicks();
-
-
- ticks = me.buildTicks() || [];
-
- ticks = me.afterBuildTicks(ticks) || ticks;
-
- if ((!ticks || !ticks.length) && me.ticks) {
- ticks = [];
- for (i = 0, ilen = me.ticks.length; i < ilen; ++i) {
- ticks.push({
- value: me.ticks[i],
- major: false
- });
- }
- }
- me._ticks = ticks;
-
-
- samplingEnabled = sampleSize < ticks.length;
- labels = me._convertTicksToLabels(samplingEnabled ? sample(ticks, sampleSize) : ticks);
-
-
-
-
- me._configure();
-
- me.beforeCalculateTickRotation();
- me.calculateTickRotation();
- me.afterCalculateTickRotation();
- me.beforeFit();
- me.fit();
- me.afterFit();
-
- me._ticksToDraw = tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto') ? me._autoSkip(ticks) : ticks;
- if (samplingEnabled) {
-
- labels = me._convertTicksToLabels(me._ticksToDraw);
- }
- me.ticks = labels;
-
- me.afterUpdate();
-
-
- return me.minSize;
- },
-
- _configure: function() {
- var me = this;
- var reversePixels = me.options.ticks.reverse;
- var startPixel, endPixel;
- if (me.isHorizontal()) {
- startPixel = me.left;
- endPixel = me.right;
- } else {
- startPixel = me.top;
- endPixel = me.bottom;
-
- reversePixels = !reversePixels;
- }
- me._startPixel = startPixel;
- me._endPixel = endPixel;
- me._reversePixels = reversePixels;
- me._length = endPixel - startPixel;
- },
- afterUpdate: function() {
- helpers$1.callback(this.options.afterUpdate, [this]);
- },
-
- beforeSetDimensions: function() {
- helpers$1.callback(this.options.beforeSetDimensions, [this]);
- },
- setDimensions: function() {
- var me = this;
-
- if (me.isHorizontal()) {
-
- me.width = me.maxWidth;
- me.left = 0;
- me.right = me.width;
- } else {
- me.height = me.maxHeight;
-
- me.top = 0;
- me.bottom = me.height;
- }
-
- me.paddingLeft = 0;
- me.paddingTop = 0;
- me.paddingRight = 0;
- me.paddingBottom = 0;
- },
- afterSetDimensions: function() {
- helpers$1.callback(this.options.afterSetDimensions, [this]);
- },
-
- beforeDataLimits: function() {
- helpers$1.callback(this.options.beforeDataLimits, [this]);
- },
- determineDataLimits: helpers$1.noop,
- afterDataLimits: function() {
- helpers$1.callback(this.options.afterDataLimits, [this]);
- },
-
- beforeBuildTicks: function() {
- helpers$1.callback(this.options.beforeBuildTicks, [this]);
- },
- buildTicks: helpers$1.noop,
- afterBuildTicks: function(ticks) {
- var me = this;
-
- if (isArray(ticks) && ticks.length) {
- return helpers$1.callback(me.options.afterBuildTicks, [me, ticks]);
- }
-
- me.ticks = helpers$1.callback(me.options.afterBuildTicks, [me, me.ticks]) || me.ticks;
- return ticks;
- },
- beforeTickToLabelConversion: function() {
- helpers$1.callback(this.options.beforeTickToLabelConversion, [this]);
- },
- convertTicksToLabels: function() {
- var me = this;
-
- var tickOpts = me.options.ticks;
- me.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this);
- },
- afterTickToLabelConversion: function() {
- helpers$1.callback(this.options.afterTickToLabelConversion, [this]);
- },
-
- beforeCalculateTickRotation: function() {
- helpers$1.callback(this.options.beforeCalculateTickRotation, [this]);
- },
- calculateTickRotation: function() {
- var me = this;
- var options = me.options;
- var tickOpts = options.ticks;
- var numTicks = me.getTicks().length;
- var minRotation = tickOpts.minRotation || 0;
- var maxRotation = tickOpts.maxRotation;
- var labelRotation = minRotation;
- var labelSizes, maxLabelWidth, maxLabelHeight, maxWidth, tickWidth, maxHeight, maxLabelDiagonal;
- if (!me._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !me.isHorizontal()) {
- me.labelRotation = minRotation;
- return;
- }
- labelSizes = me._getLabelSizes();
- maxLabelWidth = labelSizes.widest.width;
- maxLabelHeight = labelSizes.highest.height - labelSizes.highest.offset;
-
-
- maxWidth = Math.min(me.maxWidth, me.chart.width - maxLabelWidth);
- tickWidth = options.offset ? me.maxWidth / numTicks : maxWidth / (numTicks - 1);
-
- if (maxLabelWidth + 6 > tickWidth) {
- tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));
- maxHeight = me.maxHeight - getTickMarkLength(options.gridLines)
- - tickOpts.padding - getScaleLabelHeight(options.scaleLabel);
- maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);
- labelRotation = helpers$1.toDegrees(Math.min(
- Math.asin(Math.min((labelSizes.highest.height + 6) / tickWidth, 1)),
- Math.asin(Math.min(maxHeight / maxLabelDiagonal, 1)) - Math.asin(maxLabelHeight / maxLabelDiagonal)
- ));
- labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));
- }
- me.labelRotation = labelRotation;
- },
- afterCalculateTickRotation: function() {
- helpers$1.callback(this.options.afterCalculateTickRotation, [this]);
- },
-
- beforeFit: function() {
- helpers$1.callback(this.options.beforeFit, [this]);
- },
- fit: function() {
- var me = this;
-
- var minSize = me.minSize = {
- width: 0,
- height: 0
- };
- var chart = me.chart;
- var opts = me.options;
- var tickOpts = opts.ticks;
- var scaleLabelOpts = opts.scaleLabel;
- var gridLineOpts = opts.gridLines;
- var display = me._isVisible();
- var isBottom = opts.position === 'bottom';
- var isHorizontal = me.isHorizontal();
-
- if (isHorizontal) {
- minSize.width = me.maxWidth;
- } else if (display) {
- minSize.width = getTickMarkLength(gridLineOpts) + getScaleLabelHeight(scaleLabelOpts);
- }
-
- if (!isHorizontal) {
- minSize.height = me.maxHeight;
- } else if (display) {
- minSize.height = getTickMarkLength(gridLineOpts) + getScaleLabelHeight(scaleLabelOpts);
- }
-
- if (tickOpts.display && display) {
- var tickFonts = parseTickFontOptions(tickOpts);
- var labelSizes = me._getLabelSizes();
- var firstLabelSize = labelSizes.first;
- var lastLabelSize = labelSizes.last;
- var widestLabelSize = labelSizes.widest;
- var highestLabelSize = labelSizes.highest;
- var lineSpace = tickFonts.minor.lineHeight * 0.4;
- var tickPadding = tickOpts.padding;
- if (isHorizontal) {
-
- var isRotated = me.labelRotation !== 0;
- var angleRadians = helpers$1.toRadians(me.labelRotation);
- var cosRotation = Math.cos(angleRadians);
- var sinRotation = Math.sin(angleRadians);
- var labelHeight = sinRotation * widestLabelSize.width
- + cosRotation * (highestLabelSize.height - (isRotated ? highestLabelSize.offset : 0))
- + (isRotated ? 0 : lineSpace);
- minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding);
- var offsetLeft = me.getPixelForTick(0) - me.left;
- var offsetRight = me.right - me.getPixelForTick(me.getTicks().length - 1);
- var paddingLeft, paddingRight;
-
-
- if (isRotated) {
- paddingLeft = isBottom ?
- cosRotation * firstLabelSize.width + sinRotation * firstLabelSize.offset :
- sinRotation * (firstLabelSize.height - firstLabelSize.offset);
- paddingRight = isBottom ?
- sinRotation * (lastLabelSize.height - lastLabelSize.offset) :
- cosRotation * lastLabelSize.width + sinRotation * lastLabelSize.offset;
- } else {
- paddingLeft = firstLabelSize.width / 2;
- paddingRight = lastLabelSize.width / 2;
- }
-
-
- me.paddingLeft = Math.max((paddingLeft - offsetLeft) * me.width / (me.width - offsetLeft), 0) + 3;
- me.paddingRight = Math.max((paddingRight - offsetRight) * me.width / (me.width - offsetRight), 0) + 3;
- } else {
-
-
- var labelWidth = tickOpts.mirror ? 0 :
-
-
- widestLabelSize.width + tickPadding + lineSpace;
- minSize.width = Math.min(me.maxWidth, minSize.width + labelWidth);
- me.paddingTop = firstLabelSize.height / 2;
- me.paddingBottom = lastLabelSize.height / 2;
- }
- }
- me.handleMargins();
- if (isHorizontal) {
- me.width = me._length = chart.width - me.margins.left - me.margins.right;
- me.height = minSize.height;
- } else {
- me.width = minSize.width;
- me.height = me._length = chart.height - me.margins.top - me.margins.bottom;
- }
- },
-
- handleMargins: function() {
- var me = this;
- if (me.margins) {
- me.margins.left = Math.max(me.paddingLeft, me.margins.left);
- me.margins.top = Math.max(me.paddingTop, me.margins.top);
- me.margins.right = Math.max(me.paddingRight, me.margins.right);
- me.margins.bottom = Math.max(me.paddingBottom, me.margins.bottom);
- }
- },
- afterFit: function() {
- helpers$1.callback(this.options.afterFit, [this]);
- },
-
- isHorizontal: function() {
- var pos = this.options.position;
- return pos === 'top' || pos === 'bottom';
- },
- isFullWidth: function() {
- return this.options.fullWidth;
- },
-
- getRightValue: function(rawValue) {
-
- if (isNullOrUndef(rawValue)) {
- return NaN;
- }
-
- if ((typeof rawValue === 'number' || rawValue instanceof Number) && !isFinite(rawValue)) {
- return NaN;
- }
-
- if (rawValue) {
- if (this.isHorizontal()) {
- if (rawValue.x !== undefined) {
- return this.getRightValue(rawValue.x);
- }
- } else if (rawValue.y !== undefined) {
- return this.getRightValue(rawValue.y);
- }
- }
-
- return rawValue;
- },
- _convertTicksToLabels: function(ticks) {
- var me = this;
- var labels, i, ilen;
- me.ticks = ticks.map(function(tick) {
- return tick.value;
- });
- me.beforeTickToLabelConversion();
-
-
-
- labels = me.convertTicksToLabels(ticks) || me.ticks;
- me.afterTickToLabelConversion();
-
- for (i = 0, ilen = ticks.length; i < ilen; ++i) {
- ticks[i].label = labels[i];
- }
- return labels;
- },
-
- _getLabelSizes: function() {
- var me = this;
- var labelSizes = me._labelSizes;
- if (!labelSizes) {
- me._labelSizes = labelSizes = computeLabelSizes(me.ctx, parseTickFontOptions(me.options.ticks), me.getTicks(), me.longestTextCache);
- me.longestLabelWidth = labelSizes.widest.width;
- }
- return labelSizes;
- },
-
- _parseValue: function(value) {
- var start, end, min, max;
- if (isArray(value)) {
- start = +this.getRightValue(value[0]);
- end = +this.getRightValue(value[1]);
- min = Math.min(start, end);
- max = Math.max(start, end);
- } else {
- value = +this.getRightValue(value);
- start = undefined;
- end = value;
- min = value;
- max = value;
- }
- return {
- min: min,
- max: max,
- start: start,
- end: end
- };
- },
-
- _getScaleLabel: function(rawValue) {
- var v = this._parseValue(rawValue);
- if (v.start !== undefined) {
- return '[' + v.start + ', ' + v.end + ']';
- }
- return +this.getRightValue(rawValue);
- },
-
- getLabelForIndex: helpers$1.noop,
-
- getPixelForValue: helpers$1.noop,
-
- getValueForPixel: helpers$1.noop,
-
- getPixelForTick: function(index) {
- var me = this;
- var offset = me.options.offset;
- var numTicks = me._ticks.length;
- var tickWidth = 1 / Math.max(numTicks - (offset ? 0 : 1), 1);
- return index < 0 || index > numTicks - 1
- ? null
- : me.getPixelForDecimal(index * tickWidth + (offset ? tickWidth / 2 : 0));
- },
-
- getPixelForDecimal: function(decimal) {
- var me = this;
- if (me._reversePixels) {
- decimal = 1 - decimal;
- }
- return me._startPixel + decimal * me._length;
- },
- getDecimalForPixel: function(pixel) {
- var decimal = (pixel - this._startPixel) / this._length;
- return this._reversePixels ? 1 - decimal : decimal;
- },
-
- getBasePixel: function() {
- return this.getPixelForValue(this.getBaseValue());
- },
- getBaseValue: function() {
- var me = this;
- var min = me.min;
- var max = me.max;
- return me.beginAtZero ? 0 :
- min < 0 && max < 0 ? max :
- min > 0 && max > 0 ? min :
- 0;
- },
-
- _autoSkip: function(ticks) {
- var me = this;
- var tickOpts = me.options.ticks;
- var axisLength = me._length;
- var ticksLimit = tickOpts.maxTicksLimit || axisLength / me._tickSize() + 1;
- var majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];
- var numMajorIndices = majorIndices.length;
- var first = majorIndices[0];
- var last = majorIndices[numMajorIndices - 1];
- var i, ilen, spacing, avgMajorSpacing;
-
- if (numMajorIndices > ticksLimit) {
- skipMajors(ticks, majorIndices, numMajorIndices / ticksLimit);
- return nonSkipped(ticks);
- }
- spacing = calculateSpacing(majorIndices, ticks, axisLength, ticksLimit);
- if (numMajorIndices > 0) {
- for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) {
- skip(ticks, spacing, majorIndices[i], majorIndices[i + 1]);
- }
- avgMajorSpacing = numMajorIndices > 1 ? (last - first) / (numMajorIndices - 1) : null;
- skip(ticks, spacing, helpers$1.isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);
- skip(ticks, spacing, last, helpers$1.isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);
- return nonSkipped(ticks);
- }
- skip(ticks, spacing);
- return nonSkipped(ticks);
- },
-
- _tickSize: function() {
- var me = this;
- var optionTicks = me.options.ticks;
-
- var rot = helpers$1.toRadians(me.labelRotation);
- var cos = Math.abs(Math.cos(rot));
- var sin = Math.abs(Math.sin(rot));
- var labelSizes = me._getLabelSizes();
- var padding = optionTicks.autoSkipPadding || 0;
- var w = labelSizes ? labelSizes.widest.width + padding : 0;
- var h = labelSizes ? labelSizes.highest.height + padding : 0;
-
- return me.isHorizontal()
- ? h * cos > w * sin ? w / cos : h / sin
- : h * sin < w * cos ? h / cos : w / sin;
- },
-
- _isVisible: function() {
- var me = this;
- var chart = me.chart;
- var display = me.options.display;
- var i, ilen, meta;
- if (display !== 'auto') {
- return !!display;
- }
-
- for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {
- if (chart.isDatasetVisible(i)) {
- meta = chart.getDatasetMeta(i);
- if (meta.xAxisID === me.id || meta.yAxisID === me.id) {
- return true;
- }
- }
- }
- return false;
- },
-
- _computeGridLineItems: function(chartArea) {
- var me = this;
- var chart = me.chart;
- var options = me.options;
- var gridLines = options.gridLines;
- var position = options.position;
- var offsetGridLines = gridLines.offsetGridLines;
- var isHorizontal = me.isHorizontal();
- var ticks = me._ticksToDraw;
- var ticksLength = ticks.length + (offsetGridLines ? 1 : 0);
- var tl = getTickMarkLength(gridLines);
- var items = [];
- var axisWidth = gridLines.drawBorder ? valueAtIndexOrDefault(gridLines.lineWidth, 0, 0) : 0;
- var axisHalfWidth = axisWidth / 2;
- var alignPixel = helpers$1._alignPixel;
- var alignBorderValue = function(pixel) {
- return alignPixel(chart, pixel, axisWidth);
- };
- var borderValue, i, tick, lineValue, alignedLineValue;
- var tx1, ty1, tx2, ty2, x1, y1, x2, y2, lineWidth, lineColor, borderDash, borderDashOffset;
- if (position === 'top') {
- borderValue = alignBorderValue(me.bottom);
- ty1 = me.bottom - tl;
- ty2 = borderValue - axisHalfWidth;
- y1 = alignBorderValue(chartArea.top) + axisHalfWidth;
- y2 = chartArea.bottom;
- } else if (position === 'bottom') {
- borderValue = alignBorderValue(me.top);
- y1 = chartArea.top;
- y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;
- ty1 = borderValue + axisHalfWidth;
- ty2 = me.top + tl;
- } else if (position === 'left') {
- borderValue = alignBorderValue(me.right);
- tx1 = me.right - tl;
- tx2 = borderValue - axisHalfWidth;
- x1 = alignBorderValue(chartArea.left) + axisHalfWidth;
- x2 = chartArea.right;
- } else {
- borderValue = alignBorderValue(me.left);
- x1 = chartArea.left;
- x2 = alignBorderValue(chartArea.right) - axisHalfWidth;
- tx1 = borderValue + axisHalfWidth;
- tx2 = me.left + tl;
- }
- for (i = 0; i < ticksLength; ++i) {
- tick = ticks[i] || {};
-
- if (isNullOrUndef(tick.label) && i < ticks.length) {
- continue;
- }
- if (i === me.zeroLineIndex && options.offset === offsetGridLines) {
-
- lineWidth = gridLines.zeroLineWidth;
- lineColor = gridLines.zeroLineColor;
- borderDash = gridLines.zeroLineBorderDash || [];
- borderDashOffset = gridLines.zeroLineBorderDashOffset || 0.0;
- } else {
- lineWidth = valueAtIndexOrDefault(gridLines.lineWidth, i, 1);
- lineColor = valueAtIndexOrDefault(gridLines.color, i, 'rgba(0,0,0,0.1)');
- borderDash = gridLines.borderDash || [];
- borderDashOffset = gridLines.borderDashOffset || 0.0;
- }
- lineValue = getPixelForGridLine(me, tick._index || i, offsetGridLines);
-
- if (lineValue === undefined) {
- continue;
- }
- alignedLineValue = alignPixel(chart, lineValue, lineWidth);
- if (isHorizontal) {
- tx1 = tx2 = x1 = x2 = alignedLineValue;
- } else {
- ty1 = ty2 = y1 = y2 = alignedLineValue;
- }
- items.push({
- tx1: tx1,
- ty1: ty1,
- tx2: tx2,
- ty2: ty2,
- x1: x1,
- y1: y1,
- x2: x2,
- y2: y2,
- width: lineWidth,
- color: lineColor,
- borderDash: borderDash,
- borderDashOffset: borderDashOffset,
- });
- }
- items.ticksLength = ticksLength;
- items.borderValue = borderValue;
- return items;
- },
-
- _computeLabelItems: function() {
- var me = this;
- var options = me.options;
- var optionTicks = options.ticks;
- var position = options.position;
- var isMirrored = optionTicks.mirror;
- var isHorizontal = me.isHorizontal();
- var ticks = me._ticksToDraw;
- var fonts = parseTickFontOptions(optionTicks);
- var tickPadding = optionTicks.padding;
- var tl = getTickMarkLength(options.gridLines);
- var rotation = -helpers$1.toRadians(me.labelRotation);
- var items = [];
- var i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;
- if (position === 'top') {
- y = me.bottom - tl - tickPadding;
- textAlign = !rotation ? 'center' : 'left';
- } else if (position === 'bottom') {
- y = me.top + tl + tickPadding;
- textAlign = !rotation ? 'center' : 'right';
- } else if (position === 'left') {
- x = me.right - (isMirrored ? 0 : tl) - tickPadding;
- textAlign = isMirrored ? 'left' : 'right';
- } else {
- x = me.left + (isMirrored ? 0 : tl) + tickPadding;
- textAlign = isMirrored ? 'right' : 'left';
- }
- for (i = 0, ilen = ticks.length; i < ilen; ++i) {
- tick = ticks[i];
- label = tick.label;
-
- if (isNullOrUndef(label)) {
- continue;
- }
- pixel = me.getPixelForTick(tick._index || i) + optionTicks.labelOffset;
- font = tick.major ? fonts.major : fonts.minor;
- lineHeight = font.lineHeight;
- lineCount = isArray(label) ? label.length : 1;
- if (isHorizontal) {
- x = pixel;
- textOffset = position === 'top'
- ? ((!rotation ? 0.5 : 1) - lineCount) * lineHeight
- : (!rotation ? 0.5 : 0) * lineHeight;
- } else {
- y = pixel;
- textOffset = (1 - lineCount) * lineHeight / 2;
- }
- items.push({
- x: x,
- y: y,
- rotation: rotation,
- label: label,
- font: font,
- textOffset: textOffset,
- textAlign: textAlign
- });
- }
- return items;
- },
-
- _drawGrid: function(chartArea) {
- var me = this;
- var gridLines = me.options.gridLines;
- if (!gridLines.display) {
- return;
- }
- var ctx = me.ctx;
- var chart = me.chart;
- var alignPixel = helpers$1._alignPixel;
- var axisWidth = gridLines.drawBorder ? valueAtIndexOrDefault(gridLines.lineWidth, 0, 0) : 0;
- var items = me._gridLineItems || (me._gridLineItems = me._computeGridLineItems(chartArea));
- var width, color, i, ilen, item;
- let xtmp = 70;
- for (i = 0, ilen = items.length; i < ilen; ++i) {
- item = items[i];
- if (Math.abs(item.x1 - item.x2) > 0.1) {
- xtmp = item.x1;
- break;
- }
- }
- for (i = 0, ilen = items.length; i < ilen; ++i) {
- item = items[i];
- width = item.width;
- color = item.color;
- if (width && color) {
- ctx.save();
- ctx.lineWidth = width;
- ctx.strokeStyle = color;
- if (ctx.setLineDash) {
- ctx.setLineDash(item.borderDash);
- ctx.lineDashOffset = item.borderDashOffset;
- }
- ctx.beginPath();
- if (gridLines.drawTicks) {
- ctx.moveTo(item.tx1, item.ty1);
- ctx.lineTo(item.tx2, item.ty2);
- }
- if (gridLines.drawOnChartArea) {
- if (Math.abs(item.x1 - item.x2) < 0.1) {
- item.x1 = xtmp;
- item.x2 = xtmp;
- }
- ctx.moveTo(item.x1, item.y1);
- ctx.lineTo(item.x2, item.y2);
- }
- ctx.stroke();
- ctx.restore();
- }
- }
- if (axisWidth) {
-
- var firstLineWidth = axisWidth;
- var lastLineWidth = valueAtIndexOrDefault(gridLines.lineWidth, items.ticksLength - 1, 1);
- var borderValue = items.borderValue;
- var x1, x2, y1, y2;
- if (me.isHorizontal()) {
- x1 = alignPixel(chart, me.left, firstLineWidth) - firstLineWidth / 2;
- x2 = alignPixel(chart, me.right, lastLineWidth) + lastLineWidth / 2;
- y1 = y2 = borderValue;
- } else {
- y1 = alignPixel(chart, me.top, firstLineWidth) - firstLineWidth / 2;
- y2 = alignPixel(chart, me.bottom, lastLineWidth) + lastLineWidth / 2;
- x1 = x2 = borderValue;
- }
- ctx.lineWidth = axisWidth;
- ctx.strokeStyle = valueAtIndexOrDefault(gridLines.color, 0);
- ctx.beginPath();
- ctx.moveTo(x1, y1);
- ctx.lineTo(x2, y2);
- ctx.stroke();
- }
- },
-
- _drawLabels: function() {
- var me = this;
- var optionTicks = me.options.ticks;
- if (!optionTicks.display) {
- return;
- }
- var ctx = me.ctx;
- var items = me._labelItems || (me._labelItems = me._computeLabelItems());
- var i, j, ilen, jlen, item, tickFont, label, y;
- for (i = 0, ilen = items.length; i < ilen; ++i) {
- item = items[i];
- tickFont = item.font;
-
- ctx.save();
- ctx.translate(item.x, item.y);
- ctx.rotate(item.rotation);
- ctx.font = tickFont.string;
- ctx.fillStyle = tickFont.color;
- ctx.textBaseline = 'middle';
- ctx.textAlign = item.textAlign;
- label = item.label;
- y = item.textOffset;
- if (isArray(label)) {
- for (j = 0, jlen = label.length; j < jlen; ++j) {
-
- ctx.fillText('' + label[j], 0, y);
- y += tickFont.lineHeight;
- }
- } else {
- ctx.fillText(label, 0, y);
- }
- ctx.restore();
- }
- },
-
- _drawTitle: function() {
- var me = this;
- var ctx = me.ctx;
- var options = me.options;
- var scaleLabel = options.scaleLabel;
- if (!scaleLabel.display) {
- return;
- }
- var scaleLabelFontColor = valueOrDefault$a(scaleLabel.fontColor, core_defaults.global.defaultFontColor);
- var scaleLabelFont = helpers$1.options._parseFont(scaleLabel);
- var scaleLabelPadding = helpers$1.options.toPadding(scaleLabel.padding);
- var halfLineHeight = scaleLabelFont.lineHeight / 2;
- var position = options.position;
- var rotation = 0;
- var scaleLabelX, scaleLabelY;
- if (me.isHorizontal()) {
- scaleLabelX = me.left + me.width / 2;
- scaleLabelY = position === 'bottom'
- ? me.bottom - halfLineHeight - scaleLabelPadding.bottom
- : me.top + halfLineHeight + scaleLabelPadding.top;
- } else {
- var isLeft = position === 'left';
- scaleLabelX = isLeft
- ? me.left + halfLineHeight + scaleLabelPadding.top
- : me.right - halfLineHeight - scaleLabelPadding.top;
- scaleLabelY = me.top + me.height / 2;
- rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI;
- }
- ctx.save();
- ctx.translate(scaleLabelX, scaleLabelY);
- ctx.rotate(rotation);
- ctx.textAlign = 'center';
- ctx.textBaseline = 'middle';
- ctx.fillStyle = scaleLabelFontColor;
- ctx.font = scaleLabelFont.string;
- ctx.fillText(scaleLabel.labelString, 0, 0);
- ctx.restore();
- },
- draw: function(chartArea) {
- var me = this;
- if (!me._isVisible()) {
- return;
- }
- me._drawGrid(chartArea);
- me._drawTitle();
- me._drawLabels();
- },
-
- _layers: function() {
- var me = this;
- var opts = me.options;
- var tz = opts.ticks && opts.ticks.z || 0;
- var gz = opts.gridLines && opts.gridLines.z || 0;
- if (!me._isVisible() || tz === gz || me.draw !== me._draw) {
-
- return [{
- z: tz,
- draw: function() {
- me.draw.apply(me, arguments);
- }
- }];
- }
- return [{
- z: gz,
- draw: function() {
- me._drawGrid.apply(me, arguments);
- me._drawTitle.apply(me, arguments);
- }
- }, {
- z: tz,
- draw: function() {
- me._drawLabels.apply(me, arguments);
- }
- }];
- },
-
- _getMatchingVisibleMetas: function(type) {
- var me = this;
- var isHorizontal = me.isHorizontal();
- return me.chart._getSortedVisibleDatasetMetas()
- .filter(function(meta) {
- return (!type || meta.type === type)
- && (isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id);
- });
- }
- });
- Scale.prototype._draw = Scale.prototype.draw;
- var core_scale = Scale;
- var isNullOrUndef$1 = helpers$1.isNullOrUndef;
- var defaultConfig = {
- position: 'bottom'
- };
- var scale_category = core_scale.extend({
- determineDataLimits: function() {
- var me = this;
- var labels = me._getLabels();
- var ticksOpts = me.options.ticks;
- var min = ticksOpts.min;
- var max = ticksOpts.max;
- var minIndex = 0;
- var maxIndex = labels.length - 1;
- var findIndex;
- if (min !== undefined) {
-
- findIndex = labels.indexOf(min);
- if (findIndex >= 0) {
- minIndex = findIndex;
- }
- }
- if (max !== undefined) {
-
- findIndex = labels.indexOf(max);
- if (findIndex >= 0) {
- maxIndex = findIndex;
- }
- }
- me.minIndex = minIndex;
- me.maxIndex = maxIndex;
- me.min = labels[minIndex];
- me.max = labels[maxIndex];
- },
- buildTicks: function() {
- var me = this;
- var labels = me._getLabels();
- var minIndex = me.minIndex;
- var maxIndex = me.maxIndex;
-
- me.ticks = (minIndex === 0 && maxIndex === labels.length - 1) ? labels : labels.slice(minIndex, maxIndex + 1);
- },
- getLabelForIndex: function(index, datasetIndex) {
- var me = this;
- var chart = me.chart;
- if (chart.getDatasetMeta(datasetIndex).controller._getValueScaleId() === me.id) {
- return me.getRightValue(chart.data.datasets[datasetIndex].data[index]);
- }
- return me._getLabels()[index];
- },
- _configure: function() {
- var me = this;
- var offset = me.options.offset;
- var ticks = me.ticks;
- core_scale.prototype._configure.call(me);
- if (!me.isHorizontal()) {
-
- me._reversePixels = !me._reversePixels;
- }
- if (!ticks) {
- return;
- }
- me._startValue = me.minIndex - (offset ? 0.5 : 0);
- me._valueRange = Math.max(ticks.length - (offset ? 0 : 1), 1);
- },
-
- getPixelForValue: function(value, index, datasetIndex) {
- var me = this;
- var valueCategory, labels, idx;
- if (!isNullOrUndef$1(index) && !isNullOrUndef$1(datasetIndex)) {
- value = me.chart.data.datasets[datasetIndex].data[index];
- }
-
-
- if (!isNullOrUndef$1(value)) {
- valueCategory = me.isHorizontal() ? value.x : value.y;
- }
- if (valueCategory !== undefined || (value !== undefined && isNaN(index))) {
- labels = me._getLabels();
- value = helpers$1.valueOrDefault(valueCategory, value);
- idx = labels.indexOf(value);
- index = idx !== -1 ? idx : index;
- if (isNaN(index)) {
- index = value;
- }
- }
- return me.getPixelForDecimal((index - me._startValue) / me._valueRange);
- },
- getPixelForTick: function(index) {
- var ticks = this.ticks;
- return index < 0 || index > ticks.length - 1
- ? null
- : this.getPixelForValue(ticks[index], index + this.minIndex);
- },
- getValueForPixel: function(pixel) {
- var me = this;
- var value = Math.round(me._startValue + me.getDecimalForPixel(pixel) * me._valueRange);
- return Math.min(Math.max(value, 0), me.ticks.length - 1);
- },
- getBasePixel: function() {
- return this.bottom;
- }
- });
- var _defaults = defaultConfig;
- scale_category._defaults = _defaults;
- var noop = helpers$1.noop;
- var isNullOrUndef$2 = helpers$1.isNullOrUndef;
- function generateTicks(generationOptions, dataRange) {
- var ticks = [];
-
-
-
- var MIN_SPACING = 1e-14;
- var stepSize = generationOptions.stepSize;
- var unit = stepSize || 1;
- var maxNumSpaces = generationOptions.maxTicks - 1;
- var min = generationOptions.min;
- var max = generationOptions.max;
- var precision = generationOptions.precision;
- var rmin = dataRange.min;
- var rmax = dataRange.max;
- var spacing = helpers$1.niceNum((rmax - rmin) / maxNumSpaces / unit) * unit;
- var factor, niceMin, niceMax, numSpaces;
-
-
- if (spacing < MIN_SPACING && isNullOrUndef$2(min) && isNullOrUndef$2(max)) {
- return [rmin, rmax];
- }
- numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);
- if (numSpaces > maxNumSpaces) {
-
- spacing = helpers$1.niceNum(numSpaces * spacing / maxNumSpaces / unit) * unit;
- }
- if (stepSize || isNullOrUndef$2(precision)) {
-
- factor = Math.pow(10, helpers$1._decimalPlaces(spacing));
- } else {
-
- factor = Math.pow(10, precision);
- spacing = Math.ceil(spacing * factor) / factor;
- }
- niceMin = Math.floor(rmin / spacing) * spacing;
- niceMax = Math.ceil(rmax / spacing) * spacing;
-
- if (stepSize) {
-
- if (!isNullOrUndef$2(min) && helpers$1.almostWhole(min / spacing, spacing / 1000)) {
- niceMin = min;
- }
- if (!isNullOrUndef$2(max) && helpers$1.almostWhole(max / spacing, spacing / 1000)) {
- niceMax = max;
- }
- }
- numSpaces = (niceMax - niceMin) / spacing;
-
- if (helpers$1.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {
- numSpaces = Math.round(numSpaces);
- } else {
- numSpaces = Math.ceil(numSpaces);
- }
- niceMin = Math.round(niceMin * factor) / factor;
- niceMax = Math.round(niceMax * factor) / factor;
- ticks.push(isNullOrUndef$2(min) ? niceMin : min);
- for (var j = 1; j < numSpaces; ++j) {
- ticks.push(Math.round((niceMin + j * spacing) * factor) / factor);
- }
- ticks.push(isNullOrUndef$2(max) ? niceMax : max);
- return ticks;
- }
- var scale_linearbase = core_scale.extend({
- getRightValue: function(value) {
- if (typeof value === 'string') {
- return +value;
- }
- return core_scale.prototype.getRightValue.call(this, value);
- },
- handleTickRangeOptions: function() {
- var me = this;
- var opts = me.options;
- var tickOpts = opts.ticks;
-
-
-
- if (tickOpts.beginAtZero) {
- var minSign = helpers$1.sign(me.min);
- var maxSign = helpers$1.sign(me.max);
- if (minSign < 0 && maxSign < 0) {
-
- me.max = 0;
- } else if (minSign > 0 && maxSign > 0) {
-
- me.min = 0;
- }
- }
- var setMin = tickOpts.min !== undefined || tickOpts.suggestedMin !== undefined;
- var setMax = tickOpts.max !== undefined || tickOpts.suggestedMax !== undefined;
- if (tickOpts.min !== undefined) {
- me.min = tickOpts.min;
- } else if (tickOpts.suggestedMin !== undefined) {
- if (me.min === null) {
- me.min = tickOpts.suggestedMin;
- } else {
- me.min = Math.min(me.min, tickOpts.suggestedMin);
- }
- }
- if (tickOpts.max !== undefined) {
- me.max = tickOpts.max;
- } else if (tickOpts.suggestedMax !== undefined) {
- if (me.max === null) {
- me.max = tickOpts.suggestedMax;
- } else {
- me.max = Math.max(me.max, tickOpts.suggestedMax);
- }
- }
- if (setMin !== setMax) {
-
-
-
-
- if (me.min >= me.max) {
- if (setMin) {
- me.max = me.min + 1;
- } else {
- me.min = me.max - 1;
- }
- }
- }
- if (me.min === me.max) {
- me.max++;
- if (!tickOpts.beginAtZero) {
- me.min--;
- }
- }
- },
- getTickLimit: function() {
- var me = this;
- var tickOpts = me.options.ticks;
- var stepSize = tickOpts.stepSize;
- var maxTicksLimit = tickOpts.maxTicksLimit;
- var maxTicks;
- if (stepSize) {
- maxTicks = Math.ceil(me.max / stepSize) - Math.floor(me.min / stepSize) + 1;
- } else {
- maxTicks = me._computeTickLimit();
- maxTicksLimit = maxTicksLimit || 11;
- }
- if (maxTicksLimit) {
- maxTicks = Math.min(maxTicksLimit, maxTicks);
- }
- return maxTicks;
- },
- _computeTickLimit: function() {
- return Number.POSITIVE_INFINITY;
- },
- handleDirectionalChanges: noop,
- buildTicks: function() {
- var me = this;
- var opts = me.options;
- var tickOpts = opts.ticks;
-
-
-
-
- var maxTicks = me.getTickLimit();
- maxTicks = Math.max(2, maxTicks);
- var numericGeneratorOptions = {
- maxTicks: maxTicks,
- min: tickOpts.min,
- max: tickOpts.max,
- precision: tickOpts.precision,
- stepSize: helpers$1.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize)
- };
- var ticks = me.ticks = generateTicks(numericGeneratorOptions, me);
- me.handleDirectionalChanges();
-
-
- me.max = helpers$1.max(ticks);
- me.min = helpers$1.min(ticks);
- if (tickOpts.reverse) {
- ticks.reverse();
- me.start = me.max;
- me.end = me.min;
- } else {
- me.start = me.min;
- me.end = me.max;
- }
- },
- convertTicksToLabels: function() {
- var me = this;
- me.ticksAsNumbers = me.ticks.slice();
- me.zeroLineIndex = me.ticks.indexOf(0);
- core_scale.prototype.convertTicksToLabels.call(me);
- },
- _configure: function() {
- var me = this;
- var ticks = me.getTicks();
- var start = me.min;
- var end = me.max;
- var offset;
- core_scale.prototype._configure.call(me);
- if (me.options.offset && ticks.length) {
- offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;
- start -= offset;
- end += offset;
- }
- me._startValue = start;
- me._endValue = end;
- me._valueRange = end - start;
- }
- });
- var defaultConfig$1 = {
- position: 'left',
- ticks: {
- callback: core_ticks.formatters.linear
- }
- };
- var DEFAULT_MIN = 0;
- var DEFAULT_MAX = 1;
- function getOrCreateStack(stacks, stacked, meta) {
- var key = [
- meta.type,
-
- stacked === undefined && meta.stack === undefined ? meta.index : '',
- meta.stack
- ].join('.');
- if (stacks[key] === undefined) {
- stacks[key] = {
- pos: [],
- neg: []
- };
- }
- return stacks[key];
- }
- function stackData(scale, stacks, meta, data) {
- var opts = scale.options;
- var stacked = opts.stacked;
- var stack = getOrCreateStack(stacks, stacked, meta);
- var pos = stack.pos;
- var neg = stack.neg;
- var ilen = data.length;
- var i, value;
- for (i = 0; i < ilen; ++i) {
- value = scale._parseValue(data[i]);
- if (isNaN(value.min) || isNaN(value.max) || meta.data[i].hidden) {
- continue;
- }
- pos[i] = pos[i] || 0;
- neg[i] = neg[i] || 0;
- if (opts.relativePoints) {
- pos[i] = 100;
- } else if (value.min < 0 || value.max < 0) {
- neg[i] += value.min;
- } else {
- pos[i] += value.max;
- }
- }
- }
- function updateMinMax(scale, meta, data) {
- var ilen = data.length;
- var i, value;
- for (i = 0; i < ilen; ++i) {
- value = scale._parseValue(data[i]);
- if (isNaN(value.min) || isNaN(value.max) || meta.data[i].hidden) {
- continue;
- }
- scale.min = Math.min(scale.min, value.min);
- scale.max = Math.max(scale.max, value.max);
- }
- }
- var scale_linear = scale_linearbase.extend({
- determineDataLimits: function() {
- var me = this;
- var opts = me.options;
- var chart = me.chart;
- var datasets = chart.data.datasets;
- var metasets = me._getMatchingVisibleMetas();
- var hasStacks = opts.stacked;
- var stacks = {};
- var ilen = metasets.length;
- var i, meta, data, values;
- me.min = Number.POSITIVE_INFINITY;
- me.max = Number.NEGATIVE_INFINITY;
- if (hasStacks === undefined) {
- for (i = 0; !hasStacks && i < ilen; ++i) {
- meta = metasets[i];
- hasStacks = meta.stack !== undefined;
- }
- }
- for (i = 0; i < ilen; ++i) {
- meta = metasets[i];
- data = datasets[meta.index].data;
- if (hasStacks) {
- stackData(me, stacks, meta, data);
- } else {
- updateMinMax(me, meta, data);
- }
- }
- helpers$1.each(stacks, function(stackValues) {
- values = stackValues.pos.concat(stackValues.neg);
- me.min = Math.min(me.min, helpers$1.min(values));
- me.max = Math.max(me.max, helpers$1.max(values));
- });
- me.min = helpers$1.isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN;
- me.max = helpers$1.isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX;
-
- me.handleTickRangeOptions();
- },
-
- _computeTickLimit: function() {
- var me = this;
- var tickFont;
- if (me.isHorizontal()) {
- return Math.ceil(me.width / 40);
- }
- tickFont = helpers$1.options._parseFont(me.options.ticks);
- return Math.ceil(me.height / tickFont.lineHeight);
- },
-
- handleDirectionalChanges: function() {
- if (!this.isHorizontal()) {
-
- this.ticks.reverse();
- }
- },
- getLabelForIndex: function(index, datasetIndex) {
- return this._getScaleLabel(this.chart.data.datasets[datasetIndex].data[index]);
- },
-
- getPixelForValue: function(value) {
- var me = this;
- return me.getPixelForDecimal((+me.getRightValue(value) - me._startValue) / me._valueRange);
- },
- getValueForPixel: function(pixel) {
- return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;
- },
- getPixelForTick: function(index) {
- var ticks = this.ticksAsNumbers;
- if (index < 0 || index > ticks.length - 1) {
- return null;
- }
- return this.getPixelForValue(ticks[index]);
- }
- });
- var _defaults$1 = defaultConfig$1;
- scale_linear._defaults = _defaults$1;
- var valueOrDefault$b = helpers$1.valueOrDefault;
- var log10 = helpers$1.math.log10;
- function generateTicks$1(generationOptions, dataRange) {
- var ticks = [];
- var tickVal = valueOrDefault$b(generationOptions.min, Math.pow(10, Math.floor(log10(dataRange.min))));
- var endExp = Math.floor(log10(dataRange.max));
- var endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp));
- var exp, significand;
- if (tickVal === 0) {
- exp = Math.floor(log10(dataRange.minNotZero));
- significand = Math.floor(dataRange.minNotZero / Math.pow(10, exp));
- ticks.push(tickVal);
- tickVal = significand * Math.pow(10, exp);
- } else {
- exp = Math.floor(log10(tickVal));
- significand = Math.floor(tickVal / Math.pow(10, exp));
- }
- var precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;
- do {
- ticks.push(tickVal);
- ++significand;
- if (significand === 10) {
- significand = 1;
- ++exp;
- precision = exp >= 0 ? 1 : precision;
- }
- tickVal = Math.round(significand * Math.pow(10, exp) * precision) / precision;
- } while (exp < endExp || (exp === endExp && significand < endSignificand));
- var lastTick = valueOrDefault$b(generationOptions.max, tickVal);
- ticks.push(lastTick);
- return ticks;
- }
- var defaultConfig$2 = {
- position: 'left',
-
- ticks: {
- callback: core_ticks.formatters.logarithmic
- }
- };
- function nonNegativeOrDefault(value, defaultValue) {
- return helpers$1.isFinite(value) && value >= 0 ? value : defaultValue;
- }
- var scale_logarithmic = core_scale.extend({
- determineDataLimits: function() {
- var me = this;
- var opts = me.options;
- var chart = me.chart;
- var datasets = chart.data.datasets;
- var isHorizontal = me.isHorizontal();
- function IDMatches(meta) {
- return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;
- }
- var datasetIndex, meta, value, data, i, ilen;
-
- me.min = Number.POSITIVE_INFINITY;
- me.max = Number.NEGATIVE_INFINITY;
- me.minNotZero = Number.POSITIVE_INFINITY;
- var hasStacks = opts.stacked;
- if (hasStacks === undefined) {
- for (datasetIndex = 0; datasetIndex < datasets.length; datasetIndex++) {
- meta = chart.getDatasetMeta(datasetIndex);
- if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) &&
- meta.stack !== undefined) {
- hasStacks = true;
- break;
- }
- }
- }
- if (opts.stacked || hasStacks) {
- var valuesPerStack = {};
- for (datasetIndex = 0; datasetIndex < datasets.length; datasetIndex++) {
- meta = chart.getDatasetMeta(datasetIndex);
- var key = [
- meta.type,
-
- ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''),
- meta.stack
- ].join('.');
- if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {
- if (valuesPerStack[key] === undefined) {
- valuesPerStack[key] = [];
- }
- data = datasets[datasetIndex].data;
- for (i = 0, ilen = data.length; i < ilen; i++) {
- var values = valuesPerStack[key];
- value = me._parseValue(data[i]);
-
- if (isNaN(value.min) || isNaN(value.max) || meta.data[i].hidden || value.min < 0 || value.max < 0) {
- continue;
- }
- values[i] = values[i] || 0;
- values[i] += value.max;
- }
- }
- }
- helpers$1.each(valuesPerStack, function(valuesForType) {
- if (valuesForType.length > 0) {
- var minVal = helpers$1.min(valuesForType);
- var maxVal = helpers$1.max(valuesForType);
- me.min = Math.min(me.min, minVal);
- me.max = Math.max(me.max, maxVal);
- }
- });
- } else {
- for (datasetIndex = 0; datasetIndex < datasets.length; datasetIndex++) {
- meta = chart.getDatasetMeta(datasetIndex);
- if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {
- data = datasets[datasetIndex].data;
- for (i = 0, ilen = data.length; i < ilen; i++) {
- value = me._parseValue(data[i]);
-
- if (isNaN(value.min) || isNaN(value.max) || meta.data[i].hidden || value.min < 0 || value.max < 0) {
- continue;
- }
- me.min = Math.min(value.min, me.min);
- me.max = Math.max(value.max, me.max);
- if (value.min !== 0) {
- me.minNotZero = Math.min(value.min, me.minNotZero);
- }
- }
- }
- }
- }
- me.min = helpers$1.isFinite(me.min) ? me.min : null;
- me.max = helpers$1.isFinite(me.max) ? me.max : null;
- me.minNotZero = helpers$1.isFinite(me.minNotZero) ? me.minNotZero : null;
-
- this.handleTickRangeOptions();
- },
- handleTickRangeOptions: function() {
- var me = this;
- var tickOpts = me.options.ticks;
- var DEFAULT_MIN = 1;
- var DEFAULT_MAX = 10;
- me.min = nonNegativeOrDefault(tickOpts.min, me.min);
- me.max = nonNegativeOrDefault(tickOpts.max, me.max);
- if (me.min === me.max) {
- if (me.min !== 0 && me.min !== null) {
- me.min = Math.pow(10, Math.floor(log10(me.min)) - 1);
- me.max = Math.pow(10, Math.floor(log10(me.max)) + 1);
- } else {
- me.min = DEFAULT_MIN;
- me.max = DEFAULT_MAX;
- }
- }
- if (me.min === null) {
- me.min = Math.pow(10, Math.floor(log10(me.max)) - 1);
- }
- if (me.max === null) {
- me.max = me.min !== 0
- ? Math.pow(10, Math.floor(log10(me.min)) + 1)
- : DEFAULT_MAX;
- }
- if (me.minNotZero === null) {
- if (me.min > 0) {
- me.minNotZero = me.min;
- } else if (me.max < 1) {
- me.minNotZero = Math.pow(10, Math.floor(log10(me.max)));
- } else {
- me.minNotZero = DEFAULT_MIN;
- }
- }
- },
- buildTicks: function() {
- var me = this;
- var tickOpts = me.options.ticks;
- var reverse = !me.isHorizontal();
- var generationOptions = {
- min: nonNegativeOrDefault(tickOpts.min),
- max: nonNegativeOrDefault(tickOpts.max)
- };
- var ticks = me.ticks = generateTicks$1(generationOptions, me);
-
-
- me.max = helpers$1.max(ticks);
- me.min = helpers$1.min(ticks);
- if (tickOpts.reverse) {
- reverse = !reverse;
- me.start = me.max;
- me.end = me.min;
- } else {
- me.start = me.min;
- me.end = me.max;
- }
- if (reverse) {
- ticks.reverse();
- }
- },
- convertTicksToLabels: function() {
- this.tickValues = this.ticks.slice();
- core_scale.prototype.convertTicksToLabels.call(this);
- },
-
- getLabelForIndex: function(index, datasetIndex) {
- return this._getScaleLabel(this.chart.data.datasets[datasetIndex].data[index]);
- },
- getPixelForTick: function(index) {
- var ticks = this.tickValues;
- if (index < 0 || index > ticks.length - 1) {
- return null;
- }
- return this.getPixelForValue(ticks[index]);
- },
-
- _getFirstTickValue: function(value) {
- var exp = Math.floor(log10(value));
- var significand = Math.floor(value / Math.pow(10, exp));
- return significand * Math.pow(10, exp);
- },
- _configure: function() {
- var me = this;
- var start = me.min;
- var offset = 0;
- core_scale.prototype._configure.call(me);
- if (start === 0) {
- start = me._getFirstTickValue(me.minNotZero);
- offset = valueOrDefault$b(me.options.ticks.fontSize, core_defaults.global.defaultFontSize) / me._length;
- }
- me._startValue = log10(start);
- me._valueOffset = offset;
- me._valueRange = (log10(me.max) - log10(start)) / (1 - offset);
- },
- getPixelForValue: function(value) {
- var me = this;
- var decimal = 0;
- value = +me.getRightValue(value);
- if (value > me.min && value > 0) {
- decimal = (log10(value) - me._startValue) / me._valueRange + me._valueOffset;
- }
- return me.getPixelForDecimal(decimal);
- },
- getValueForPixel: function(pixel) {
- var me = this;
- var decimal = me.getDecimalForPixel(pixel);
- return decimal === 0 && me.min === 0
- ? 0
- : Math.pow(10, me._startValue + (decimal - me._valueOffset) * me._valueRange);
- }
- });
- var _defaults$2 = defaultConfig$2;
- scale_logarithmic._defaults = _defaults$2;
- var valueOrDefault$c = helpers$1.valueOrDefault;
- var valueAtIndexOrDefault$1 = helpers$1.valueAtIndexOrDefault;
- var resolve$4 = helpers$1.options.resolve;
- var defaultConfig$3 = {
- display: true,
-
- animate: true,
- position: 'chartArea',
- angleLines: {
- display: true,
- color: 'rgba(0,0,0,0.1)',
- lineWidth: 1,
- borderDash: [],
- borderDashOffset: 0.0
- },
- gridLines: {
- circular: false
- },
-
- ticks: {
-
- showLabelBackdrop: true,
-
- backdropColor: 'rgba(255,255,255,0.75)',
-
- backdropPaddingY: 2,
-
- backdropPaddingX: 2,
- callback: core_ticks.formatters.linear
- },
- pointLabels: {
-
- display: true,
-
- fontSize: 10,
-
- callback: function(label) {
- return label;
- }
- }
- };
- function getTickBackdropHeight(opts) {
- var tickOpts = opts.ticks;
- if (tickOpts.display && opts.display) {
- return valueOrDefault$c(tickOpts.fontSize, core_defaults.global.defaultFontSize) + tickOpts.backdropPaddingY * 2;
- }
- return 0;
- }
- function measureLabelSize(ctx, lineHeight, label) {
- if (helpers$1.isArray(label)) {
- return {
- w: helpers$1.longestText(ctx, ctx.font, label),
- h: label.length * lineHeight
- };
- }
- return {
- w: ctx.measureText(label).width,
- h: lineHeight
- };
- }
- function determineLimits(angle, pos, size, min, max) {
- if (angle === min || angle === max) {
- return {
- start: pos - (size / 2),
- end: pos + (size / 2)
- };
- } else if (angle < min || angle > max) {
- return {
- start: pos - size,
- end: pos
- };
- }
- return {
- start: pos,
- end: pos + size
- };
- }
- function fitWithPointLabels(scale) {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- var plFont = helpers$1.options._parseFont(scale.options.pointLabels);
-
-
- var furthestLimits = {
- l: 0,
- r: scale.width,
- t: 0,
- b: scale.height - scale.paddingTop
- };
- var furthestAngles = {};
- var i, textSize, pointPosition;
- scale.ctx.font = plFont.string;
- scale._pointLabelSizes = [];
- var valueCount = scale.chart.data.labels.length;
- for (i = 0; i < valueCount; i++) {
- pointPosition = scale.getPointPosition(i, scale.drawingArea + 5);
- textSize = measureLabelSize(scale.ctx, plFont.lineHeight, scale.pointLabels[i]);
- scale._pointLabelSizes[i] = textSize;
-
- var angleRadians = scale.getIndexAngle(i);
- var angle = helpers$1.toDegrees(angleRadians) % 360;
- var hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);
- var vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);
- if (hLimits.start < furthestLimits.l) {
- furthestLimits.l = hLimits.start;
- furthestAngles.l = angleRadians;
- }
- if (hLimits.end > furthestLimits.r) {
- furthestLimits.r = hLimits.end;
- furthestAngles.r = angleRadians;
- }
- if (vLimits.start < furthestLimits.t) {
- furthestLimits.t = vLimits.start;
- furthestAngles.t = angleRadians;
- }
- if (vLimits.end > furthestLimits.b) {
- furthestLimits.b = vLimits.end;
- furthestAngles.b = angleRadians;
- }
- }
- scale.setReductions(scale.drawingArea, furthestLimits, furthestAngles);
- }
- function getTextAlignForAngle(angle) {
- if (angle === 0 || angle === 180) {
- return 'center';
- } else if (angle < 180) {
- return 'left';
- }
- return 'right';
- }
- function fillText(ctx, text, position, lineHeight) {
- var y = position.y + lineHeight / 2;
- var i, ilen;
- if (helpers$1.isArray(text)) {
- for (i = 0, ilen = text.length; i < ilen; ++i) {
- ctx.fillText(text[i], position.x, y);
- y += lineHeight;
- }
- } else {
- ctx.fillText(text, position.x, y);
- }
- }
- function adjustPointPositionForLabelHeight(angle, textSize, position) {
- if (angle === 90 || angle === 270) {
- position.y -= (textSize.h / 2);
- } else if (angle > 270 || angle < 90) {
- position.y -= textSize.h;
- }
- }
- function drawPointLabels(scale) {
- var ctx = scale.ctx;
- var opts = scale.options;
- var pointLabelOpts = opts.pointLabels;
- var tickBackdropHeight = getTickBackdropHeight(opts);
- var outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max);
- var plFont = helpers$1.options._parseFont(pointLabelOpts);
- ctx.save();
- ctx.font = plFont.string;
- ctx.textBaseline = 'middle';
- for (var i = scale.chart.data.labels.length - 1; i >= 0; i--) {
-
- var extra = (i === 0 ? tickBackdropHeight / 2 : 0);
- var pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + 5);
-
- var pointLabelFontColor = valueAtIndexOrDefault$1(pointLabelOpts.fontColor, i, core_defaults.global.defaultFontColor);
- ctx.fillStyle = pointLabelFontColor;
- var angleRadians = scale.getIndexAngle(i);
- var angle = helpers$1.toDegrees(angleRadians);
- ctx.textAlign = getTextAlignForAngle(angle);
- adjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition);
- fillText(ctx, scale.pointLabels[i], pointLabelPosition, plFont.lineHeight);
- }
- ctx.restore();
- }
- function drawRadiusLine(scale, gridLineOpts, radius, index) {
- var ctx = scale.ctx;
- var circular = gridLineOpts.circular;
- var valueCount = scale.chart.data.labels.length;
- var lineColor = valueAtIndexOrDefault$1(gridLineOpts.color, index - 1);
- var lineWidth = valueAtIndexOrDefault$1(gridLineOpts.lineWidth, index - 1);
- var pointPosition;
- if ((!circular && !valueCount) || !lineColor || !lineWidth) {
- return;
- }
- ctx.save();
- ctx.strokeStyle = lineColor;
- ctx.lineWidth = lineWidth;
- if (ctx.setLineDash) {
- ctx.setLineDash(gridLineOpts.borderDash || []);
- ctx.lineDashOffset = gridLineOpts.borderDashOffset || 0.0;
- }
- ctx.beginPath();
- if (circular) {
-
- ctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2);
- } else {
-
- pointPosition = scale.getPointPosition(0, radius);
- ctx.moveTo(pointPosition.x, pointPosition.y);
- for (var i = 1; i < valueCount; i++) {
- pointPosition = scale.getPointPosition(i, radius);
- ctx.lineTo(pointPosition.x, pointPosition.y);
- }
- }
- ctx.closePath();
- ctx.stroke();
- ctx.restore();
- }
- function numberOrZero(param) {
- return helpers$1.isNumber(param) ? param : 0;
- }
- var scale_radialLinear = scale_linearbase.extend({
- setDimensions: function() {
- var me = this;
-
- me.width = me.maxWidth;
- me.height = me.maxHeight;
- me.paddingTop = getTickBackdropHeight(me.options) / 2;
- me.xCenter = Math.floor(me.width / 2);
- me.yCenter = Math.floor((me.height - me.paddingTop) / 2);
- me.drawingArea = Math.min(me.height - me.paddingTop, me.width) / 2;
- },
- determineDataLimits: function() {
- var me = this;
- var chart = me.chart;
- var min = Number.POSITIVE_INFINITY;
- var max = Number.NEGATIVE_INFINITY;
- helpers$1.each(chart.data.datasets, function(dataset, datasetIndex) {
- if (chart.isDatasetVisible(datasetIndex)) {
- var meta = chart.getDatasetMeta(datasetIndex);
- helpers$1.each(dataset.data, function(rawValue, index) {
- var value = +me.getRightValue(rawValue);
- if (isNaN(value) || meta.data[index].hidden) {
- return;
- }
- min = Math.min(value, min);
- max = Math.max(value, max);
- });
- }
- });
- me.min = (min === Number.POSITIVE_INFINITY ? 0 : min);
- me.max = (max === Number.NEGATIVE_INFINITY ? 0 : max);
-
- me.handleTickRangeOptions();
- },
-
- _computeTickLimit: function() {
- return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));
- },
- convertTicksToLabels: function() {
- var me = this;
- scale_linearbase.prototype.convertTicksToLabels.call(me);
-
- me.pointLabels = me.chart.data.labels.map(function() {
- var label = helpers$1.callback(me.options.pointLabels.callback, arguments, me);
- return label || label === 0 ? label : '';
- });
- },
- getLabelForIndex: function(index, datasetIndex) {
- return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);
- },
- fit: function() {
- var me = this;
- var opts = me.options;
- if (opts.display && opts.pointLabels.display) {
- fitWithPointLabels(me);
- } else {
- me.setCenterPoint(0, 0, 0, 0);
- }
- },
-
- setReductions: function(largestPossibleRadius, furthestLimits, furthestAngles) {
- var me = this;
- var radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l);
- var radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r);
- var radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t);
- var radiusReductionBottom = -Math.max(furthestLimits.b - (me.height - me.paddingTop), 0) / Math.cos(furthestAngles.b);
- radiusReductionLeft = numberOrZero(radiusReductionLeft);
- radiusReductionRight = numberOrZero(radiusReductionRight);
- radiusReductionTop = numberOrZero(radiusReductionTop);
- radiusReductionBottom = numberOrZero(radiusReductionBottom);
- me.drawingArea = Math.min(
- Math.floor(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2),
- Math.floor(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2));
- me.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom);
- },
- setCenterPoint: function(leftMovement, rightMovement, topMovement, bottomMovement) {
- var me = this;
- var maxRight = me.width - rightMovement - me.drawingArea;
- var maxLeft = leftMovement + me.drawingArea;
- var maxTop = topMovement + me.drawingArea;
- var maxBottom = (me.height - me.paddingTop) - bottomMovement - me.drawingArea;
- me.xCenter = Math.floor(((maxLeft + maxRight) / 2) + me.left);
- me.yCenter = Math.floor(((maxTop + maxBottom) / 2) + me.top + me.paddingTop);
- },
- getIndexAngle: function(index) {
- var chart = this.chart;
- var angleMultiplier = 360 / chart.data.labels.length;
- var options = chart.options || {};
- var startAngle = options.startAngle || 0;
-
- var angle = (index * angleMultiplier + startAngle) % 360;
- return (angle < 0 ? angle + 360 : angle) * Math.PI * 2 / 360;
- },
- getDistanceFromCenterForValue: function(value) {
- var me = this;
- if (helpers$1.isNullOrUndef(value)) {
- return NaN;
- }
-
- var scalingFactor = me.drawingArea / (me.max - me.min);
- if (me.options.ticks.reverse) {
- return (me.max - value) * scalingFactor;
- }
- return (value - me.min) * scalingFactor;
- },
- getPointPosition: function(index, distanceFromCenter) {
- var me = this;
- var thisAngle = me.getIndexAngle(index) - (Math.PI / 2);
- return {
- x: Math.cos(thisAngle) * distanceFromCenter + me.xCenter,
- y: Math.sin(thisAngle) * distanceFromCenter + me.yCenter
- };
- },
- getPointPositionForValue: function(index, value) {
- return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));
- },
- getBasePosition: function(index) {
- var me = this;
- var min = me.min;
- var max = me.max;
- return me.getPointPositionForValue(index || 0,
- me.beginAtZero ? 0 :
- min < 0 && max < 0 ? max :
- min > 0 && max > 0 ? min :
- 0);
- },
-
- _drawGrid: function() {
- var me = this;
- var ctx = me.ctx;
- var opts = me.options;
- var gridLineOpts = opts.gridLines;
- var angleLineOpts = opts.angleLines;
- var lineWidth = valueOrDefault$c(angleLineOpts.lineWidth, gridLineOpts.lineWidth);
- var lineColor = valueOrDefault$c(angleLineOpts.color, gridLineOpts.color);
- var i, offset, position;
- if (opts.pointLabels.display) {
- drawPointLabels(me);
- }
- if (gridLineOpts.display) {
- helpers$1.each(me.ticks, function(label, index) {
- if (index !== 0) {
- offset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);
- drawRadiusLine(me, gridLineOpts, offset, index);
- }
- });
- }
- if (angleLineOpts.display && lineWidth && lineColor) {
- ctx.save();
- ctx.lineWidth = lineWidth;
- ctx.strokeStyle = lineColor;
- if (ctx.setLineDash) {
- ctx.setLineDash(resolve$4([angleLineOpts.borderDash, gridLineOpts.borderDash, []]));
- ctx.lineDashOffset = resolve$4([angleLineOpts.borderDashOffset, gridLineOpts.borderDashOffset, 0.0]);
- }
- for (i = me.chart.data.labels.length - 1; i >= 0; i--) {
- offset = me.getDistanceFromCenterForValue(opts.ticks.reverse ? me.min : me.max);
- position = me.getPointPosition(i, offset);
- ctx.beginPath();
- ctx.moveTo(me.xCenter, me.yCenter);
- ctx.lineTo(position.x, position.y);
- ctx.stroke();
- }
- ctx.restore();
- }
- },
-
- _drawLabels: function() {
- var me = this;
- var ctx = me.ctx;
- var opts = me.options;
- var tickOpts = opts.ticks;
- if (!tickOpts.display) {
- return;
- }
- var startAngle = me.getIndexAngle(0);
- var tickFont = helpers$1.options._parseFont(tickOpts);
- var tickFontColor = valueOrDefault$c(tickOpts.fontColor, core_defaults.global.defaultFontColor);
- var offset, width;
- ctx.save();
- ctx.font = tickFont.string;
- ctx.translate(me.xCenter, me.yCenter);
- ctx.rotate(startAngle);
- ctx.textAlign = 'center';
- ctx.textBaseline = 'middle';
- helpers$1.each(me.ticks, function(label, index) {
- if (index === 0 && !tickOpts.reverse) {
- return;
- }
- offset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);
- if (tickOpts.showLabelBackdrop) {
- width = ctx.measureText(label).width;
- ctx.fillStyle = tickOpts.backdropColor;
- ctx.fillRect(
- -width / 2 - tickOpts.backdropPaddingX,
- -offset - tickFont.size / 2 - tickOpts.backdropPaddingY,
- width + tickOpts.backdropPaddingX * 2,
- tickFont.size + tickOpts.backdropPaddingY * 2
- );
- }
- ctx.fillStyle = tickFontColor;
- ctx.fillText(label, 0, -offset);
- });
- ctx.restore();
- },
-
- _drawTitle: helpers$1.noop
- });
- var _defaults$3 = defaultConfig$3;
- scale_radialLinear._defaults = _defaults$3;
- var deprecated$1 = helpers$1._deprecated;
- var resolve$5 = helpers$1.options.resolve;
- var valueOrDefault$d = helpers$1.valueOrDefault;
- var MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;
- var MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;
- var INTERVALS = {
- millisecond: {
- common: true,
- size: 1,
- steps: 1000
- },
- second: {
- common: true,
- size: 1000,
- steps: 60
- },
- minute: {
- common: true,
- size: 60000,
- steps: 60
- },
- hour: {
- common: true,
- size: 3600000,
- steps: 24
- },
- day: {
- common: true,
- size: 86400000,
- steps: 30
- },
- week: {
- common: false,
- size: 604800000,
- steps: 4
- },
- month: {
- common: true,
- size: 2.628e9,
- steps: 12
- },
- quarter: {
- common: false,
- size: 7.884e9,
- steps: 4
- },
- year: {
- common: true,
- size: 3.154e10
- }
- };
- var UNITS = Object.keys(INTERVALS);
- function sorter(a, b) {
- return a - b;
- }
- function arrayUnique(items) {
- var hash = {};
- var out = [];
- var i, ilen, item;
- for (i = 0, ilen = items.length; i < ilen; ++i) {
- item = items[i];
- if (!hash[item]) {
- hash[item] = true;
- out.push(item);
- }
- }
- return out;
- }
- function getMin(options) {
- return helpers$1.valueOrDefault(options.time.min, options.ticks.min);
- }
- function getMax(options) {
- return helpers$1.valueOrDefault(options.time.max, options.ticks.max);
- }
- function buildLookupTable(timestamps, min, max, distribution) {
- if (distribution === 'linear' || !timestamps.length) {
- return [
- {time: min, pos: 0},
- {time: max, pos: 1}
- ];
- }
- var table = [];
- var items = [min];
- var i, ilen, prev, curr, next;
- for (i = 0, ilen = timestamps.length; i < ilen; ++i) {
- curr = timestamps[i];
- if (curr > min && curr < max) {
- items.push(curr);
- }
- }
- items.push(max);
- for (i = 0, ilen = items.length; i < ilen; ++i) {
- next = items[i + 1];
- prev = items[i - 1];
- curr = items[i];
-
- if (prev === undefined || next === undefined || Math.round((next + prev) / 2) !== curr) {
- table.push({time: curr, pos: i / (ilen - 1)});
- }
- }
- return table;
- }
- function lookup(table, key, value) {
- var lo = 0;
- var hi = table.length - 1;
- var mid, i0, i1;
- while (lo >= 0 && lo <= hi) {
- mid = (lo + hi) >> 1;
- i0 = table[mid - 1] || null;
- i1 = table[mid];
- if (!i0) {
-
- return {lo: null, hi: i1};
- } else if (i1[key] < value) {
- lo = mid + 1;
- } else if (i0[key] > value) {
- hi = mid - 1;
- } else {
- return {lo: i0, hi: i1};
- }
- }
-
- return {lo: i1, hi: null};
- }
- function interpolate$1(table, skey, sval, tkey) {
- var range = lookup(table, skey, sval);
-
- var prev = !range.lo ? table[0] : !range.hi ? table[table.length - 2] : range.lo;
- var next = !range.lo ? table[1] : !range.hi ? table[table.length - 1] : range.hi;
- var span = next[skey] - prev[skey];
- var ratio = span ? (sval - prev[skey]) / span : 0;
- var offset = (next[tkey] - prev[tkey]) * ratio;
- return prev[tkey] + offset;
- }
- function toTimestamp(scale, input) {
- var adapter = scale._adapter;
- var options = scale.options.time;
- var parser = options.parser;
- var format = parser || options.format;
- var value = input;
- if (typeof parser === 'function') {
- value = parser(value);
- }
-
- if (!helpers$1.isFinite(value)) {
- value = typeof format === 'string'
- ? adapter.parse(value, format)
- : adapter.parse(value);
- }
- if (value !== null) {
- return +value;
- }
-
-
- if (!parser && typeof format === 'function') {
- value = format(input);
-
- if (!helpers$1.isFinite(value)) {
- value = adapter.parse(value);
- }
- }
- return value;
- }
- function parse(scale, input) {
- if (helpers$1.isNullOrUndef(input)) {
- return null;
- }
- var options = scale.options.time;
- var value = toTimestamp(scale, scale.getRightValue(input));
- if (value === null) {
- return value;
- }
- if (options.round) {
- value = +scale._adapter.startOf(value, options.round);
- }
- return value;
- }
- function determineUnitForAutoTicks(minUnit, min, max, capacity) {
- var ilen = UNITS.length;
- var i, interval, factor;
- for (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {
- interval = INTERVALS[UNITS[i]];
- factor = interval.steps ? interval.steps : MAX_INTEGER;
- if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {
- return UNITS[i];
- }
- }
- return UNITS[ilen - 1];
- }
- function determineUnitForFormatting(scale, numTicks, minUnit, min, max) {
- var i, unit;
- for (i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) {
- unit = UNITS[i];
- if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {
- return unit;
- }
- }
- return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];
- }
- function determineMajorUnit(unit) {
- for (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {
- if (INTERVALS[UNITS[i]].common) {
- return UNITS[i];
- }
- }
- }
- function generate(scale, min, max, capacity) {
- var adapter = scale._adapter;
- var options = scale.options;
- var timeOpts = options.time;
- var minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, capacity);
- var stepSize = resolve$5([timeOpts.stepSize, timeOpts.unitStepSize, 1]);
- var weekday = minor === 'week' ? timeOpts.isoWeekday : false;
- var first = min;
- var ticks = [];
- var time;
-
- if (weekday) {
- first = +adapter.startOf(first, 'isoWeek', weekday);
- }
-
- first = +adapter.startOf(first, weekday ? 'day' : minor);
-
- if (adapter.diff(max, min, minor) > 100000 * stepSize) {
- throw min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor;
- }
- for (time = first; time < max; time = +adapter.add(time, stepSize, minor)) {
- ticks.push(time);
- }
- if (time === max || options.bounds === 'ticks') {
- ticks.push(time);
- }
- return ticks;
- }
- function computeOffsets(table, ticks, min, max, options) {
- var start = 0;
- var end = 0;
- var first, last;
- if (options.offset && ticks.length) {
- first = interpolate$1(table, 'time', ticks[0], 'pos');
- if (ticks.length === 1) {
- start = 1 - first;
- } else {
- start = (interpolate$1(table, 'time', ticks[1], 'pos') - first) / 2;
- }
- last = interpolate$1(table, 'time', ticks[ticks.length - 1], 'pos');
- if (ticks.length === 1) {
- end = last;
- } else {
- end = (last - interpolate$1(table, 'time', ticks[ticks.length - 2], 'pos')) / 2;
- }
- }
- return {start: start, end: end, factor: 1 / (start + 1 + end)};
- }
- function setMajorTicks(scale, ticks, map, majorUnit) {
- var adapter = scale._adapter;
- var first = +adapter.startOf(ticks[0].value, majorUnit);
- var last = ticks[ticks.length - 1].value;
- var major, index;
- for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) {
- index = map[major];
- if (index >= 0) {
- ticks[index].major = true;
- }
- }
- return ticks;
- }
- function ticksFromTimestamps(scale, values, majorUnit) {
- var ticks = [];
- var map = {};
- var ilen = values.length;
- var i, value;
- for (i = 0; i < ilen; ++i) {
- value = values[i];
- map[value] = i;
- ticks.push({
- value: value,
- major: false
- });
- }
-
-
- return (ilen === 0 || !majorUnit) ? ticks : setMajorTicks(scale, ticks, map, majorUnit);
- }
- var defaultConfig$4 = {
- position: 'bottom',
-
- distribution: 'linear',
-
- bounds: 'data',
- adapters: {},
- time: {
- parser: false,
- unit: false,
- round: false,
- displayFormat: false,
- isoWeekday: false,
- minUnit: 'millisecond',
- displayFormats: {}
- },
- ticks: {
- autoSkip: false,
-
- source: 'auto',
- major: {
- enabled: false
- }
- }
- };
- var scale_time = core_scale.extend({
- initialize: function() {
- this.mergeTicksOptions();
- core_scale.prototype.initialize.call(this);
- },
- update: function() {
- var me = this;
- var options = me.options;
- var time = options.time || (options.time = {});
- var adapter = me._adapter = new core_adapters._date(options.adapters.date);
-
- deprecated$1('time scale', time.format, 'time.format', 'time.parser');
- deprecated$1('time scale', time.min, 'time.min', 'ticks.min');
- deprecated$1('time scale', time.max, 'time.max', 'ticks.max');
-
-
-
-
- helpers$1.mergeIf(time.displayFormats, adapter.formats());
- return core_scale.prototype.update.apply(me, arguments);
- },
-
- getRightValue: function(rawValue) {
- if (rawValue && rawValue.t !== undefined) {
- rawValue = rawValue.t;
- }
- return core_scale.prototype.getRightValue.call(this, rawValue);
- },
- determineDataLimits: function() {
- var me = this;
- var chart = me.chart;
- var adapter = me._adapter;
- var options = me.options;
- var unit = options.time.unit || 'day';
- var min = MAX_INTEGER;
- var max = MIN_INTEGER;
- var timestamps = [];
- var datasets = [];
- var labels = [];
- var i, j, ilen, jlen, data, timestamp, labelsAdded;
- var dataLabels = me._getLabels();
- for (i = 0, ilen = dataLabels.length; i < ilen; ++i) {
- labels.push(parse(me, dataLabels[i]));
- }
- for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {
- if (chart.isDatasetVisible(i)) {
- data = chart.data.datasets[i].data;
-
- if (helpers$1.isObject(data[0])) {
- datasets[i] = [];
- for (j = 0, jlen = data.length; j < jlen; ++j) {
- timestamp = parse(me, data[j]);
- timestamps.push(timestamp);
- datasets[i][j] = timestamp;
- }
- } else {
- datasets[i] = labels.slice(0);
- if (!labelsAdded) {
- timestamps = timestamps.concat(labels);
- labelsAdded = true;
- }
- }
- } else {
- datasets[i] = [];
- }
- }
- if (labels.length) {
- min = Math.min(min, labels[0]);
- max = Math.max(max, labels[labels.length - 1]);
- }
- if (timestamps.length) {
- timestamps = ilen > 1 ? arrayUnique(timestamps).sort(sorter) : timestamps.sort(sorter);
- min = Math.min(min, timestamps[0]);
- max = Math.max(max, timestamps[timestamps.length - 1]);
- }
- min = parse(me, getMin(options)) || min;
- max = parse(me, getMax(options)) || max;
-
- min = min === MAX_INTEGER ? +adapter.startOf(Date.now(), unit) : min;
- max = max === MIN_INTEGER ? +adapter.endOf(Date.now(), unit) + 1 : max;
-
- me.min = Math.min(min, max);
- me.max = Math.max(min + 1, max);
-
- me._table = [];
- me._timestamps = {
- data: timestamps,
- datasets: datasets,
- labels: labels
- };
- },
- buildTicks: function() {
- var me = this;
- var min = me.min;
- var max = me.max;
- var options = me.options;
- var tickOpts = options.ticks;
- var timeOpts = options.time;
- var timestamps = me._timestamps;
- var ticks = [];
- var capacity = me.getLabelCapacity(min);
- var source = tickOpts.source;
- var distribution = options.distribution;
- var i, ilen, timestamp;
- if (source === 'data' || (source === 'auto' && distribution === 'series')) {
- timestamps = timestamps.data;
- } else if (source === 'labels') {
- timestamps = timestamps.labels;
- } else {
- timestamps = generate(me, min, max, capacity);
- }
- if (options.bounds === 'ticks' && timestamps.length) {
- min = timestamps[0];
- max = timestamps[timestamps.length - 1];
- }
-
- min = parse(me, getMin(options)) || min;
- max = parse(me, getMax(options)) || max;
-
- for (i = 0, ilen = timestamps.length; i < ilen; ++i) {
- timestamp = timestamps[i];
- if (timestamp >= min && timestamp <= max) {
- ticks.push(timestamp);
- }
- }
- me.min = min;
- me.max = max;
-
-
-
- me._unit = timeOpts.unit || (tickOpts.autoSkip
- ? determineUnitForAutoTicks(timeOpts.minUnit, me.min, me.max, capacity)
- : determineUnitForFormatting(me, ticks.length, timeOpts.minUnit, me.min, me.max));
- me._majorUnit = !tickOpts.major.enabled || me._unit === 'year' ? undefined
- : determineMajorUnit(me._unit);
- me._table = buildLookupTable(me._timestamps.data, min, max, distribution);
- me._offsets = computeOffsets(me._table, ticks, min, max, options);
- if (tickOpts.reverse) {
- ticks.reverse();
- }
- return ticksFromTimestamps(me, ticks, me._majorUnit);
- },
- getLabelForIndex: function(index, datasetIndex) {
- var me = this;
- var adapter = me._adapter;
- var data = me.chart.data;
- var timeOpts = me.options.time;
- var label = data.labels && index < data.labels.length ? data.labels[index] : '';
- var value = data.datasets[datasetIndex].data[index];
- if (helpers$1.isObject(value)) {
- label = me.getRightValue(value);
- }
- if (timeOpts.tooltipFormat) {
- return adapter.format(toTimestamp(me, label), timeOpts.tooltipFormat);
- }
- if (typeof label === 'string') {
- return label;
- }
- return adapter.format(toTimestamp(me, label), timeOpts.displayFormats.datetime);
- },
-
- tickFormatFunction: function(time, index, ticks, format) {
- var me = this;
- var adapter = me._adapter;
- var options = me.options;
- var formats = options.time.displayFormats;
- var minorFormat = formats[me._unit];
- var majorUnit = me._majorUnit;
- var majorFormat = formats[majorUnit];
- var tick = ticks[index];
- var tickOpts = options.ticks;
- var major = majorUnit && majorFormat && tick && tick.major;
- var label = adapter.format(time, format ? format : major ? majorFormat : minorFormat);
- var nestedTickOpts = major ? tickOpts.major : tickOpts.minor;
- var formatter = resolve$5([
- nestedTickOpts.callback,
- nestedTickOpts.userCallback,
- tickOpts.callback,
- tickOpts.userCallback
- ]);
- return formatter ? formatter(label, index, ticks) : label;
- },
- convertTicksToLabels: function(ticks) {
- var labels = [];
- var i, ilen;
- for (i = 0, ilen = ticks.length; i < ilen; ++i) {
- labels.push(this.tickFormatFunction(ticks[i].value, i, ticks));
- }
- return labels;
- },
-
- getPixelForOffset: function(time) {
- var me = this;
- var offsets = me._offsets;
- var pos = interpolate$1(me._table, 'time', time, 'pos');
- return me.getPixelForDecimal((offsets.start + pos) * offsets.factor);
- },
- getPixelForValue: function(value, index, datasetIndex) {
- var me = this;
- var time = null;
- if (index !== undefined && datasetIndex !== undefined) {
- time = me._timestamps.datasets[datasetIndex][index];
- }
- if (time === null) {
- time = parse(me, value);
- }
- if (time !== null) {
- return me.getPixelForOffset(time);
- }
- },
- getPixelForTick: function(index) {
- var ticks = this.getTicks();
- return index >= 0 && index < ticks.length ?
- this.getPixelForOffset(ticks[index].value) :
- null;
- },
- getValueForPixel: function(pixel) {
- var me = this;
- var offsets = me._offsets;
- var pos = me.getDecimalForPixel(pixel) / offsets.factor - offsets.end;
- var time = interpolate$1(me._table, 'pos', pos, 'time');
-
- return me._adapter._create(time);
- },
-
- _getLabelSize: function(label) {
- var me = this;
- var ticksOpts = me.options.ticks;
- var tickLabelWidth = me.ctx.measureText(label).width;
- var angle = helpers$1.toRadians(me.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);
- var cosRotation = Math.cos(angle);
- var sinRotation = Math.sin(angle);
- var tickFontSize = valueOrDefault$d(ticksOpts.fontSize, core_defaults.global.defaultFontSize);
- return {
- w: (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation),
- h: (tickLabelWidth * sinRotation) + (tickFontSize * cosRotation)
- };
- },
-
- getLabelWidth: function(label) {
- return this._getLabelSize(label).w;
- },
-
- getLabelCapacity: function(exampleTime) {
- var me = this;
- var timeOpts = me.options.time;
- var displayFormats = timeOpts.displayFormats;
-
- var format = displayFormats[timeOpts.unit] || displayFormats.millisecond;
- var exampleLabel = me.tickFormatFunction(exampleTime, 0, ticksFromTimestamps(me, [exampleTime], me._majorUnit), format);
- var size = me._getLabelSize(exampleLabel);
- var capacity = Math.floor(me.isHorizontal() ? me.width / size.w : me.height / size.h);
- if (me.options.offset) {
- capacity--;
- }
- return capacity > 0 ? capacity : 1;
- }
- });
- var _defaults$4 = defaultConfig$4;
- scale_time._defaults = _defaults$4;
- var scales = {
- category: scale_category,
- linear: scale_linear,
- logarithmic: scale_logarithmic,
- radialLinear: scale_radialLinear,
- time: scale_time
- };
- var moment = createCommonjsModule(function (module, exports) {
- (function (global, factory) {
- module.exports = factory() ;
- }(commonjsGlobal, (function () {
- var hookCallback;
- function hooks () {
- return hookCallback.apply(null, arguments);
- }
-
-
- function setHookCallback (callback) {
- hookCallback = callback;
- }
- function isArray(input) {
- return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';
- }
- function isObject(input) {
-
-
- return input != null && Object.prototype.toString.call(input) === '[object Object]';
- }
- function isObjectEmpty(obj) {
- if (Object.getOwnPropertyNames) {
- return (Object.getOwnPropertyNames(obj).length === 0);
- } else {
- var k;
- for (k in obj) {
- if (obj.hasOwnProperty(k)) {
- return false;
- }
- }
- return true;
- }
- }
- function isUndefined(input) {
- return input === void 0;
- }
- function isNumber(input) {
- return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';
- }
- function isDate(input) {
- return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';
- }
- function map(arr, fn) {
- var res = [], i;
- for (i = 0; i < arr.length; ++i) {
- res.push(fn(arr[i], i));
- }
- return res;
- }
- function hasOwnProp(a, b) {
- return Object.prototype.hasOwnProperty.call(a, b);
- }
- function extend(a, b) {
- for (var i in b) {
- if (hasOwnProp(b, i)) {
- a[i] = b[i];
- }
- }
- if (hasOwnProp(b, 'toString')) {
- a.toString = b.toString;
- }
- if (hasOwnProp(b, 'valueOf')) {
- a.valueOf = b.valueOf;
- }
- return a;
- }
- function createUTC (input, format, locale, strict) {
- return createLocalOrUTC(input, format, locale, strict, true).utc();
- }
- function defaultParsingFlags() {
-
- return {
- empty : false,
- unusedTokens : [],
- unusedInput : [],
- overflow : -2,
- charsLeftOver : 0,
- nullInput : false,
- invalidMonth : null,
- invalidFormat : false,
- userInvalidated : false,
- iso : false,
- parsedDateParts : [],
- meridiem : null,
- rfc2822 : false,
- weekdayMismatch : false
- };
- }
- function getParsingFlags(m) {
- if (m._pf == null) {
- m._pf = defaultParsingFlags();
- }
- return m._pf;
- }
- var some;
- if (Array.prototype.some) {
- some = Array.prototype.some;
- } else {
- some = function (fun) {
- var t = Object(this);
- var len = t.length >>> 0;
- for (var i = 0; i < len; i++) {
- if (i in t && fun.call(this, t[i], i, t)) {
- return true;
- }
- }
- return false;
- };
- }
- function isValid(m) {
- if (m._isValid == null) {
- var flags = getParsingFlags(m);
- var parsedParts = some.call(flags.parsedDateParts, function (i) {
- return i != null;
- });
- var isNowValid = !isNaN(m._d.getTime()) &&
- flags.overflow < 0 &&
- !flags.empty &&
- !flags.invalidMonth &&
- !flags.invalidWeekday &&
- !flags.weekdayMismatch &&
- !flags.nullInput &&
- !flags.invalidFormat &&
- !flags.userInvalidated &&
- (!flags.meridiem || (flags.meridiem && parsedParts));
- if (m._strict) {
- isNowValid = isNowValid &&
- flags.charsLeftOver === 0 &&
- flags.unusedTokens.length === 0 &&
- flags.bigHour === undefined;
- }
- if (Object.isFrozen == null || !Object.isFrozen(m)) {
- m._isValid = isNowValid;
- }
- else {
- return isNowValid;
- }
- }
- return m._isValid;
- }
- function createInvalid (flags) {
- var m = createUTC(NaN);
- if (flags != null) {
- extend(getParsingFlags(m), flags);
- }
- else {
- getParsingFlags(m).userInvalidated = true;
- }
- return m;
- }
-
-
- var momentProperties = hooks.momentProperties = [];
- function copyConfig(to, from) {
- var i, prop, val;
- if (!isUndefined(from._isAMomentObject)) {
- to._isAMomentObject = from._isAMomentObject;
- }
- if (!isUndefined(from._i)) {
- to._i = from._i;
- }
- if (!isUndefined(from._f)) {
- to._f = from._f;
- }
- if (!isUndefined(from._l)) {
- to._l = from._l;
- }
- if (!isUndefined(from._strict)) {
- to._strict = from._strict;
- }
- if (!isUndefined(from._tzm)) {
- to._tzm = from._tzm;
- }
- if (!isUndefined(from._isUTC)) {
- to._isUTC = from._isUTC;
- }
- if (!isUndefined(from._offset)) {
- to._offset = from._offset;
- }
- if (!isUndefined(from._pf)) {
- to._pf = getParsingFlags(from);
- }
- if (!isUndefined(from._locale)) {
- to._locale = from._locale;
- }
- if (momentProperties.length > 0) {
- for (i = 0; i < momentProperties.length; i++) {
- prop = momentProperties[i];
- val = from[prop];
- if (!isUndefined(val)) {
- to[prop] = val;
- }
- }
- }
- return to;
- }
- var updateInProgress = false;
-
- function Moment(config) {
- copyConfig(this, config);
- this._d = new Date(config._d != null ? config._d.getTime() : NaN);
- if (!this.isValid()) {
- this._d = new Date(NaN);
- }
-
-
- if (updateInProgress === false) {
- updateInProgress = true;
- hooks.updateOffset(this);
- updateInProgress = false;
- }
- }
- function isMoment (obj) {
- return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);
- }
- function absFloor (number) {
- if (number < 0) {
-
- return Math.ceil(number) || 0;
- } else {
- return Math.floor(number);
- }
- }
- function toInt(argumentForCoercion) {
- var coercedNumber = +argumentForCoercion,
- value = 0;
- if (coercedNumber !== 0 && isFinite(coercedNumber)) {
- value = absFloor(coercedNumber);
- }
- return value;
- }
-
- function compareArrays(array1, array2, dontConvert) {
- var len = Math.min(array1.length, array2.length),
- lengthDiff = Math.abs(array1.length - array2.length),
- diffs = 0,
- i;
- for (i = 0; i < len; i++) {
- if ((dontConvert && array1[i] !== array2[i]) ||
- (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {
- diffs++;
- }
- }
- return diffs + lengthDiff;
- }
- function warn(msg) {
- if (hooks.suppressDeprecationWarnings === false &&
- (typeof console !== 'undefined') && console.warn) {
- console.warn('Deprecation warning: ' + msg);
- }
- }
- function deprecate(msg, fn) {
- var firstTime = true;
- return extend(function () {
- if (hooks.deprecationHandler != null) {
- hooks.deprecationHandler(null, msg);
- }
- if (firstTime) {
- var args = [];
- var arg;
- for (var i = 0; i < arguments.length; i++) {
- arg = '';
- if (typeof arguments[i] === 'object') {
- arg += '\n[' + i + '] ';
- for (var key in arguments[0]) {
- arg += key + ': ' + arguments[0][key] + ', ';
- }
- arg = arg.slice(0, -2);
- } else {
- arg = arguments[i];
- }
- args.push(arg);
- }
- warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack);
- firstTime = false;
- }
- return fn.apply(this, arguments);
- }, fn);
- }
- var deprecations = {};
- function deprecateSimple(name, msg) {
- if (hooks.deprecationHandler != null) {
- hooks.deprecationHandler(name, msg);
- }
- if (!deprecations[name]) {
- warn(msg);
- deprecations[name] = true;
- }
- }
- hooks.suppressDeprecationWarnings = false;
- hooks.deprecationHandler = null;
- function isFunction(input) {
- return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';
- }
- function set (config) {
- var prop, i;
- for (i in config) {
- prop = config[i];
- if (isFunction(prop)) {
- this[i] = prop;
- } else {
- this['_' + i] = prop;
- }
- }
- this._config = config;
-
-
-
- this._dayOfMonthOrdinalParseLenient = new RegExp(
- (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +
- '|' + (/\d{1,2}/).source);
- }
- function mergeConfigs(parentConfig, childConfig) {
- var res = extend({}, parentConfig), prop;
- for (prop in childConfig) {
- if (hasOwnProp(childConfig, prop)) {
- if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {
- res[prop] = {};
- extend(res[prop], parentConfig[prop]);
- extend(res[prop], childConfig[prop]);
- } else if (childConfig[prop] != null) {
- res[prop] = childConfig[prop];
- } else {
- delete res[prop];
- }
- }
- }
- for (prop in parentConfig) {
- if (hasOwnProp(parentConfig, prop) &&
- !hasOwnProp(childConfig, prop) &&
- isObject(parentConfig[prop])) {
-
- res[prop] = extend({}, res[prop]);
- }
- }
- return res;
- }
- function Locale(config) {
- if (config != null) {
- this.set(config);
- }
- }
- var keys;
- if (Object.keys) {
- keys = Object.keys;
- } else {
- keys = function (obj) {
- var i, res = [];
- for (i in obj) {
- if (hasOwnProp(obj, i)) {
- res.push(i);
- }
- }
- return res;
- };
- }
- var defaultCalendar = {
- sameDay : '[Today at] LT',
- nextDay : '[Tomorrow at] LT',
- nextWeek : 'dddd [at] LT',
- lastDay : '[Yesterday at] LT',
- lastWeek : '[Last] dddd [at] LT',
- sameElse : 'L'
- };
- function calendar (key, mom, now) {
- var output = this._calendar[key] || this._calendar['sameElse'];
- return isFunction(output) ? output.call(mom, now) : output;
- }
- var defaultLongDateFormat = {
- LTS : 'h:mm:ss A',
- LT : 'h:mm A',
- L : 'MM/DD/YYYY',
- LL : 'MMMM D, YYYY',
- LLL : 'MMMM D, YYYY h:mm A',
- LLLL : 'dddd, MMMM D, YYYY h:mm A'
- };
- function longDateFormat (key) {
- var format = this._longDateFormat[key],
- formatUpper = this._longDateFormat[key.toUpperCase()];
- if (format || !formatUpper) {
- return format;
- }
- this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {
- return val.slice(1);
- });
- return this._longDateFormat[key];
- }
- var defaultInvalidDate = 'Invalid date';
- function invalidDate () {
- return this._invalidDate;
- }
- var defaultOrdinal = '%d';
- var defaultDayOfMonthOrdinalParse = /\d{1,2}/;
- function ordinal (number) {
- return this._ordinal.replace('%d', number);
- }
- var defaultRelativeTime = {
- future : 'in %s',
- past : '%s ago',
- s : 'a few seconds',
- ss : '%d seconds',
- m : 'a minute',
- mm : '%d minutes',
- h : 'an hour',
- hh : '%d hours',
- d : 'a day',
- dd : '%d days',
- M : 'a month',
- MM : '%d months',
- y : 'a year',
- yy : '%d years'
- };
- function relativeTime (number, withoutSuffix, string, isFuture) {
- var output = this._relativeTime[string];
- return (isFunction(output)) ?
- output(number, withoutSuffix, string, isFuture) :
- output.replace(/%d/i, number);
- }
- function pastFuture (diff, output) {
- var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
- return isFunction(format) ? format(output) : format.replace(/%s/i, output);
- }
- var aliases = {};
- function addUnitAlias (unit, shorthand) {
- var lowerCase = unit.toLowerCase();
- aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;
- }
- function normalizeUnits(units) {
- return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;
- }
- function normalizeObjectUnits(inputObject) {
- var normalizedInput = {},
- normalizedProp,
- prop;
- for (prop in inputObject) {
- if (hasOwnProp(inputObject, prop)) {
- normalizedProp = normalizeUnits(prop);
- if (normalizedProp) {
- normalizedInput[normalizedProp] = inputObject[prop];
- }
- }
- }
- return normalizedInput;
- }
- var priorities = {};
- function addUnitPriority(unit, priority) {
- priorities[unit] = priority;
- }
- function getPrioritizedUnits(unitsObj) {
- var units = [];
- for (var u in unitsObj) {
- units.push({unit: u, priority: priorities[u]});
- }
- units.sort(function (a, b) {
- return a.priority - b.priority;
- });
- return units;
- }
- function zeroFill(number, targetLength, forceSign) {
- var absNumber = '' + Math.abs(number),
- zerosToFill = targetLength - absNumber.length,
- sign = number >= 0;
- return (sign ? (forceSign ? '+' : '') : '-') +
- Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;
- }
- var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;
- var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g;
- var formatFunctions = {};
- var formatTokenFunctions = {};
-
-
-
-
- function addFormatToken (token, padded, ordinal, callback) {
- var func = callback;
- if (typeof callback === 'string') {
- func = function () {
- return this[callback]();
- };
- }
- if (token) {
- formatTokenFunctions[token] = func;
- }
- if (padded) {
- formatTokenFunctions[padded[0]] = function () {
- return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
- };
- }
- if (ordinal) {
- formatTokenFunctions[ordinal] = function () {
- return this.localeData().ordinal(func.apply(this, arguments), token);
- };
- }
- }
- function removeFormattingTokens(input) {
- if (input.match(/\[[\s\S]/)) {
- return input.replace(/^\[|\]$/g, '');
- }
- return input.replace(/\\/g, '');
- }
- function makeFormatFunction(format) {
- var array = format.match(formattingTokens), i, length;
- for (i = 0, length = array.length; i < length; i++) {
- if (formatTokenFunctions[array[i]]) {
- array[i] = formatTokenFunctions[array[i]];
- } else {
- array[i] = removeFormattingTokens(array[i]);
- }
- }
- return function (mom) {
- var output = '', i;
- for (i = 0; i < length; i++) {
- output += isFunction(array[i]) ? array[i].call(mom, format) : array[i];
- }
- return output;
- };
- }
-
- function formatMoment(m, format) {
- if (!m.isValid()) {
- return m.localeData().invalidDate();
- }
- format = expandFormat(format, m.localeData());
- formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);
- return formatFunctions[format](m);
- }
- function expandFormat(format, locale) {
- var i = 5;
- function replaceLongDateFormatTokens(input) {
- return locale.longDateFormat(input) || input;
- }
- localFormattingTokens.lastIndex = 0;
- while (i >= 0 && localFormattingTokens.test(format)) {
- format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);
- localFormattingTokens.lastIndex = 0;
- i -= 1;
- }
- return format;
- }
- var match1 = /\d/;
- var match2 = /\d\d/;
- var match3 = /\d{3}/;
- var match4 = /\d{4}/;
- var match6 = /[+-]?\d{6}/;
- var match1to2 = /\d\d?/;
- var match3to4 = /\d\d\d\d?/;
- var match5to6 = /\d\d\d\d\d\d?/;
- var match1to3 = /\d{1,3}/;
- var match1to4 = /\d{1,4}/;
- var match1to6 = /[+-]?\d{1,6}/;
- var matchUnsigned = /\d+/;
- var matchSigned = /[+-]?\d+/;
- var matchOffset = /Z|[+-]\d\d:?\d\d/gi;
- var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi;
- var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/;
-
-
- var matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i;
- var regexes = {};
- function addRegexToken (token, regex, strictRegex) {
- regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {
- return (isStrict && strictRegex) ? strictRegex : regex;
- };
- }
- function getParseRegexForToken (token, config) {
- if (!hasOwnProp(regexes, token)) {
- return new RegExp(unescapeFormat(token));
- }
- return regexes[token](config._strict, config._locale);
- }
-
- function unescapeFormat(s) {
- return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) {
- return p1 || p2 || p3 || p4;
- }));
- }
- function regexEscape(s) {
- return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
- }
- var tokens = {};
- function addParseToken (token, callback) {
- var i, func = callback;
- if (typeof token === 'string') {
- token = [token];
- }
- if (isNumber(callback)) {
- func = function (input, array) {
- array[callback] = toInt(input);
- };
- }
- for (i = 0; i < token.length; i++) {
- tokens[token[i]] = func;
- }
- }
- function addWeekParseToken (token, callback) {
- addParseToken(token, function (input, array, config, token) {
- config._w = config._w || {};
- callback(input, config._w, config, token);
- });
- }
- function addTimeToArrayFromToken(token, input, config) {
- if (input != null && hasOwnProp(tokens, token)) {
- tokens[token](input, config._a, config, token);
- }
- }
- var YEAR = 0;
- var MONTH = 1;
- var DATE = 2;
- var HOUR = 3;
- var MINUTE = 4;
- var SECOND = 5;
- var MILLISECOND = 6;
- var WEEK = 7;
- var WEEKDAY = 8;
-
- addFormatToken('Y', 0, 0, function () {
- var y = this.year();
- return y <= 9999 ? '' + y : '+' + y;
- });
- addFormatToken(0, ['YY', 2], 0, function () {
- return this.year() % 100;
- });
- addFormatToken(0, ['YYYY', 4], 0, 'year');
- addFormatToken(0, ['YYYYY', 5], 0, 'year');
- addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');
-
- addUnitAlias('year', 'y');
-
- addUnitPriority('year', 1);
-
- addRegexToken('Y', matchSigned);
- addRegexToken('YY', match1to2, match2);
- addRegexToken('YYYY', match1to4, match4);
- addRegexToken('YYYYY', match1to6, match6);
- addRegexToken('YYYYYY', match1to6, match6);
- addParseToken(['YYYYY', 'YYYYYY'], YEAR);
- addParseToken('YYYY', function (input, array) {
- array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);
- });
- addParseToken('YY', function (input, array) {
- array[YEAR] = hooks.parseTwoDigitYear(input);
- });
- addParseToken('Y', function (input, array) {
- array[YEAR] = parseInt(input, 10);
- });
-
- function daysInYear(year) {
- return isLeapYear(year) ? 366 : 365;
- }
- function isLeapYear(year) {
- return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
- }
-
- hooks.parseTwoDigitYear = function (input) {
- return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
- };
-
- var getSetYear = makeGetSet('FullYear', true);
- function getIsLeapYear () {
- return isLeapYear(this.year());
- }
- function makeGetSet (unit, keepTime) {
- return function (value) {
- if (value != null) {
- set$1(this, unit, value);
- hooks.updateOffset(this, keepTime);
- return this;
- } else {
- return get(this, unit);
- }
- };
- }
- function get (mom, unit) {
- return mom.isValid() ?
- mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;
- }
- function set$1 (mom, unit, value) {
- if (mom.isValid() && !isNaN(value)) {
- if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) {
- mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month()));
- }
- else {
- mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
- }
- }
- }
-
- function stringGet (units) {
- units = normalizeUnits(units);
- if (isFunction(this[units])) {
- return this[units]();
- }
- return this;
- }
- function stringSet (units, value) {
- if (typeof units === 'object') {
- units = normalizeObjectUnits(units);
- var prioritized = getPrioritizedUnits(units);
- for (var i = 0; i < prioritized.length; i++) {
- this[prioritized[i].unit](units[prioritized[i].unit]);
- }
- } else {
- units = normalizeUnits(units);
- if (isFunction(this[units])) {
- return this[units](value);
- }
- }
- return this;
- }
- function mod(n, x) {
- return ((n % x) + x) % x;
- }
- var indexOf;
- if (Array.prototype.indexOf) {
- indexOf = Array.prototype.indexOf;
- } else {
- indexOf = function (o) {
-
- var i;
- for (i = 0; i < this.length; ++i) {
- if (this[i] === o) {
- return i;
- }
- }
- return -1;
- };
- }
- function daysInMonth(year, month) {
- if (isNaN(year) || isNaN(month)) {
- return NaN;
- }
- var modMonth = mod(month, 12);
- year += (month - modMonth) / 12;
- return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2);
- }
-
- addFormatToken('M', ['MM', 2], 'Mo', function () {
- return this.month() + 1;
- });
- addFormatToken('MMM', 0, 0, function (format) {
- return this.localeData().monthsShort(this, format);
- });
- addFormatToken('MMMM', 0, 0, function (format) {
- return this.localeData().months(this, format);
- });
-
- addUnitAlias('month', 'M');
-
- addUnitPriority('month', 8);
-
- addRegexToken('M', match1to2);
- addRegexToken('MM', match1to2, match2);
- addRegexToken('MMM', function (isStrict, locale) {
- return locale.monthsShortRegex(isStrict);
- });
- addRegexToken('MMMM', function (isStrict, locale) {
- return locale.monthsRegex(isStrict);
- });
- addParseToken(['M', 'MM'], function (input, array) {
- array[MONTH] = toInt(input) - 1;
- });
- addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {
- var month = config._locale.monthsParse(input, token, config._strict);
-
- if (month != null) {
- array[MONTH] = month;
- } else {
- getParsingFlags(config).invalidMonth = input;
- }
- });
-
- var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/;
- var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');
- function localeMonths (m, format) {
- if (!m) {
- return isArray(this._months) ? this._months :
- this._months['standalone'];
- }
- return isArray(this._months) ? this._months[m.month()] :
- this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];
- }
- var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');
- function localeMonthsShort (m, format) {
- if (!m) {
- return isArray(this._monthsShort) ? this._monthsShort :
- this._monthsShort['standalone'];
- }
- return isArray(this._monthsShort) ? this._monthsShort[m.month()] :
- this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];
- }
- function handleStrictParse(monthName, format, strict) {
- var i, ii, mom, llc = monthName.toLocaleLowerCase();
- if (!this._monthsParse) {
-
- this._monthsParse = [];
- this._longMonthsParse = [];
- this._shortMonthsParse = [];
- for (i = 0; i < 12; ++i) {
- mom = createUTC([2000, i]);
- this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();
- this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();
- }
- }
- if (strict) {
- if (format === 'MMM') {
- ii = indexOf.call(this._shortMonthsParse, llc);
- return ii !== -1 ? ii : null;
- } else {
- ii = indexOf.call(this._longMonthsParse, llc);
- return ii !== -1 ? ii : null;
- }
- } else {
- if (format === 'MMM') {
- ii = indexOf.call(this._shortMonthsParse, llc);
- if (ii !== -1) {
- return ii;
- }
- ii = indexOf.call(this._longMonthsParse, llc);
- return ii !== -1 ? ii : null;
- } else {
- ii = indexOf.call(this._longMonthsParse, llc);
- if (ii !== -1) {
- return ii;
- }
- ii = indexOf.call(this._shortMonthsParse, llc);
- return ii !== -1 ? ii : null;
- }
- }
- }
- function localeMonthsParse (monthName, format, strict) {
- var i, mom, regex;
- if (this._monthsParseExact) {
- return handleStrictParse.call(this, monthName, format, strict);
- }
- if (!this._monthsParse) {
- this._monthsParse = [];
- this._longMonthsParse = [];
- this._shortMonthsParse = [];
- }
-
-
-
- for (i = 0; i < 12; i++) {
-
- mom = createUTC([2000, i]);
- if (strict && !this._longMonthsParse[i]) {
- this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');
- this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');
- }
- if (!strict && !this._monthsParse[i]) {
- regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
- this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
- }
-
- if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {
- return i;
- } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {
- return i;
- } else if (!strict && this._monthsParse[i].test(monthName)) {
- return i;
- }
- }
- }
-
- function setMonth (mom, value) {
- var dayOfMonth;
- if (!mom.isValid()) {
-
- return mom;
- }
- if (typeof value === 'string') {
- if (/^\d+$/.test(value)) {
- value = toInt(value);
- } else {
- value = mom.localeData().monthsParse(value);
-
- if (!isNumber(value)) {
- return mom;
- }
- }
- }
- dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));
- mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
- return mom;
- }
- function getSetMonth (value) {
- if (value != null) {
- setMonth(this, value);
- hooks.updateOffset(this, true);
- return this;
- } else {
- return get(this, 'Month');
- }
- }
- function getDaysInMonth () {
- return daysInMonth(this.year(), this.month());
- }
- var defaultMonthsShortRegex = matchWord;
- function monthsShortRegex (isStrict) {
- if (this._monthsParseExact) {
- if (!hasOwnProp(this, '_monthsRegex')) {
- computeMonthsParse.call(this);
- }
- if (isStrict) {
- return this._monthsShortStrictRegex;
- } else {
- return this._monthsShortRegex;
- }
- } else {
- if (!hasOwnProp(this, '_monthsShortRegex')) {
- this._monthsShortRegex = defaultMonthsShortRegex;
- }
- return this._monthsShortStrictRegex && isStrict ?
- this._monthsShortStrictRegex : this._monthsShortRegex;
- }
- }
- var defaultMonthsRegex = matchWord;
- function monthsRegex (isStrict) {
- if (this._monthsParseExact) {
- if (!hasOwnProp(this, '_monthsRegex')) {
- computeMonthsParse.call(this);
- }
- if (isStrict) {
- return this._monthsStrictRegex;
- } else {
- return this._monthsRegex;
- }
- } else {
- if (!hasOwnProp(this, '_monthsRegex')) {
- this._monthsRegex = defaultMonthsRegex;
- }
- return this._monthsStrictRegex && isStrict ?
- this._monthsStrictRegex : this._monthsRegex;
- }
- }
- function computeMonthsParse () {
- function cmpLenRev(a, b) {
- return b.length - a.length;
- }
- var shortPieces = [], longPieces = [], mixedPieces = [],
- i, mom;
- for (i = 0; i < 12; i++) {
-
- mom = createUTC([2000, i]);
- shortPieces.push(this.monthsShort(mom, ''));
- longPieces.push(this.months(mom, ''));
- mixedPieces.push(this.months(mom, ''));
- mixedPieces.push(this.monthsShort(mom, ''));
- }
-
-
- shortPieces.sort(cmpLenRev);
- longPieces.sort(cmpLenRev);
- mixedPieces.sort(cmpLenRev);
- for (i = 0; i < 12; i++) {
- shortPieces[i] = regexEscape(shortPieces[i]);
- longPieces[i] = regexEscape(longPieces[i]);
- }
- for (i = 0; i < 24; i++) {
- mixedPieces[i] = regexEscape(mixedPieces[i]);
- }
- this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
- this._monthsShortRegex = this._monthsRegex;
- this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');
- this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
- }
- function createDate (y, m, d, h, M, s, ms) {
-
-
- var date;
-
- if (y < 100 && y >= 0) {
-
- date = new Date(y + 400, m, d, h, M, s, ms);
- if (isFinite(date.getFullYear())) {
- date.setFullYear(y);
- }
- } else {
- date = new Date(y, m, d, h, M, s, ms);
- }
- return date;
- }
- function createUTCDate (y) {
- var date;
-
- if (y < 100 && y >= 0) {
- var args = Array.prototype.slice.call(arguments);
-
- args[0] = y + 400;
- date = new Date(Date.UTC.apply(null, args));
- if (isFinite(date.getUTCFullYear())) {
- date.setUTCFullYear(y);
- }
- } else {
- date = new Date(Date.UTC.apply(null, arguments));
- }
- return date;
- }
-
- function firstWeekOffset(year, dow, doy) {
- var
- fwd = 7 + dow - doy,
-
- fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;
- return -fwdlw + fwd - 1;
- }
-
- function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
- var localWeekday = (7 + weekday - dow) % 7,
- weekOffset = firstWeekOffset(year, dow, doy),
- dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,
- resYear, resDayOfYear;
- if (dayOfYear <= 0) {
- resYear = year - 1;
- resDayOfYear = daysInYear(resYear) + dayOfYear;
- } else if (dayOfYear > daysInYear(year)) {
- resYear = year + 1;
- resDayOfYear = dayOfYear - daysInYear(year);
- } else {
- resYear = year;
- resDayOfYear = dayOfYear;
- }
- return {
- year: resYear,
- dayOfYear: resDayOfYear
- };
- }
- function weekOfYear(mom, dow, doy) {
- var weekOffset = firstWeekOffset(mom.year(), dow, doy),
- week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,
- resWeek, resYear;
- if (week < 1) {
- resYear = mom.year() - 1;
- resWeek = week + weeksInYear(resYear, dow, doy);
- } else if (week > weeksInYear(mom.year(), dow, doy)) {
- resWeek = week - weeksInYear(mom.year(), dow, doy);
- resYear = mom.year() + 1;
- } else {
- resYear = mom.year();
- resWeek = week;
- }
- return {
- week: resWeek,
- year: resYear
- };
- }
- function weeksInYear(year, dow, doy) {
- var weekOffset = firstWeekOffset(year, dow, doy),
- weekOffsetNext = firstWeekOffset(year + 1, dow, doy);
- return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;
- }
-
- addFormatToken('w', ['ww', 2], 'wo', 'week');
- addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');
-
- addUnitAlias('week', 'w');
- addUnitAlias('isoWeek', 'W');
-
- addUnitPriority('week', 5);
- addUnitPriority('isoWeek', 5);
-
- addRegexToken('w', match1to2);
- addRegexToken('ww', match1to2, match2);
- addRegexToken('W', match1to2);
- addRegexToken('WW', match1to2, match2);
- addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {
- week[token.substr(0, 1)] = toInt(input);
- });
-
-
- function localeWeek (mom) {
- return weekOfYear(mom, this._week.dow, this._week.doy).week;
- }
- var defaultLocaleWeek = {
- dow : 0,
- doy : 6
- };
- function localeFirstDayOfWeek () {
- return this._week.dow;
- }
- function localeFirstDayOfYear () {
- return this._week.doy;
- }
-
- function getSetWeek (input) {
- var week = this.localeData().week(this);
- return input == null ? week : this.add((input - week) * 7, 'd');
- }
- function getSetISOWeek (input) {
- var week = weekOfYear(this, 1, 4).week;
- return input == null ? week : this.add((input - week) * 7, 'd');
- }
-
- addFormatToken('d', 0, 'do', 'day');
- addFormatToken('dd', 0, 0, function (format) {
- return this.localeData().weekdaysMin(this, format);
- });
- addFormatToken('ddd', 0, 0, function (format) {
- return this.localeData().weekdaysShort(this, format);
- });
- addFormatToken('dddd', 0, 0, function (format) {
- return this.localeData().weekdays(this, format);
- });
- addFormatToken('e', 0, 0, 'weekday');
- addFormatToken('E', 0, 0, 'isoWeekday');
-
- addUnitAlias('day', 'd');
- addUnitAlias('weekday', 'e');
- addUnitAlias('isoWeekday', 'E');
-
- addUnitPriority('day', 11);
- addUnitPriority('weekday', 11);
- addUnitPriority('isoWeekday', 11);
-
- addRegexToken('d', match1to2);
- addRegexToken('e', match1to2);
- addRegexToken('E', match1to2);
- addRegexToken('dd', function (isStrict, locale) {
- return locale.weekdaysMinRegex(isStrict);
- });
- addRegexToken('ddd', function (isStrict, locale) {
- return locale.weekdaysShortRegex(isStrict);
- });
- addRegexToken('dddd', function (isStrict, locale) {
- return locale.weekdaysRegex(isStrict);
- });
- addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {
- var weekday = config._locale.weekdaysParse(input, token, config._strict);
-
- if (weekday != null) {
- week.d = weekday;
- } else {
- getParsingFlags(config).invalidWeekday = input;
- }
- });
- addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {
- week[token] = toInt(input);
- });
-
- function parseWeekday(input, locale) {
- if (typeof input !== 'string') {
- return input;
- }
- if (!isNaN(input)) {
- return parseInt(input, 10);
- }
- input = locale.weekdaysParse(input);
- if (typeof input === 'number') {
- return input;
- }
- return null;
- }
- function parseIsoWeekday(input, locale) {
- if (typeof input === 'string') {
- return locale.weekdaysParse(input) % 7 || 7;
- }
- return isNaN(input) ? null : input;
- }
-
- function shiftWeekdays (ws, n) {
- return ws.slice(n, 7).concat(ws.slice(0, n));
- }
- var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');
- function localeWeekdays (m, format) {
- var weekdays = isArray(this._weekdays) ? this._weekdays :
- this._weekdays[(m && m !== true && this._weekdays.isFormat.test(format)) ? 'format' : 'standalone'];
- return (m === true) ? shiftWeekdays(weekdays, this._week.dow)
- : (m) ? weekdays[m.day()] : weekdays;
- }
- var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');
- function localeWeekdaysShort (m) {
- return (m === true) ? shiftWeekdays(this._weekdaysShort, this._week.dow)
- : (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;
- }
- var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');
- function localeWeekdaysMin (m) {
- return (m === true) ? shiftWeekdays(this._weekdaysMin, this._week.dow)
- : (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;
- }
- function handleStrictParse$1(weekdayName, format, strict) {
- var i, ii, mom, llc = weekdayName.toLocaleLowerCase();
- if (!this._weekdaysParse) {
- this._weekdaysParse = [];
- this._shortWeekdaysParse = [];
- this._minWeekdaysParse = [];
- for (i = 0; i < 7; ++i) {
- mom = createUTC([2000, 1]).day(i);
- this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();
- this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();
- this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();
- }
- }
- if (strict) {
- if (format === 'dddd') {
- ii = indexOf.call(this._weekdaysParse, llc);
- return ii !== -1 ? ii : null;
- } else if (format === 'ddd') {
- ii = indexOf.call(this._shortWeekdaysParse, llc);
- return ii !== -1 ? ii : null;
- } else {
- ii = indexOf.call(this._minWeekdaysParse, llc);
- return ii !== -1 ? ii : null;
- }
- } else {
- if (format === 'dddd') {
- ii = indexOf.call(this._weekdaysParse, llc);
- if (ii !== -1) {
- return ii;
- }
- ii = indexOf.call(this._shortWeekdaysParse, llc);
- if (ii !== -1) {
- return ii;
- }
- ii = indexOf.call(this._minWeekdaysParse, llc);
- return ii !== -1 ? ii : null;
- } else if (format === 'ddd') {
- ii = indexOf.call(this._shortWeekdaysParse, llc);
- if (ii !== -1) {
- return ii;
- }
- ii = indexOf.call(this._weekdaysParse, llc);
- if (ii !== -1) {
- return ii;
- }
- ii = indexOf.call(this._minWeekdaysParse, llc);
- return ii !== -1 ? ii : null;
- } else {
- ii = indexOf.call(this._minWeekdaysParse, llc);
- if (ii !== -1) {
- return ii;
- }
- ii = indexOf.call(this._weekdaysParse, llc);
- if (ii !== -1) {
- return ii;
- }
- ii = indexOf.call(this._shortWeekdaysParse, llc);
- return ii !== -1 ? ii : null;
- }
- }
- }
- function localeWeekdaysParse (weekdayName, format, strict) {
- var i, mom, regex;
- if (this._weekdaysParseExact) {
- return handleStrictParse$1.call(this, weekdayName, format, strict);
- }
- if (!this._weekdaysParse) {
- this._weekdaysParse = [];
- this._minWeekdaysParse = [];
- this._shortWeekdaysParse = [];
- this._fullWeekdaysParse = [];
- }
- for (i = 0; i < 7; i++) {
-
- mom = createUTC([2000, 1]).day(i);
- if (strict && !this._fullWeekdaysParse[i]) {
- this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i');
- this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i');
- this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i');
- }
- if (!this._weekdaysParse[i]) {
- regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');
- this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
- }
-
- if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {
- return i;
- } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {
- return i;
- } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {
- return i;
- } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {
- return i;
- }
- }
- }
-
- function getSetDayOfWeek (input) {
- if (!this.isValid()) {
- return input != null ? this : NaN;
- }
- var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
- if (input != null) {
- input = parseWeekday(input, this.localeData());
- return this.add(input - day, 'd');
- } else {
- return day;
- }
- }
- function getSetLocaleDayOfWeek (input) {
- if (!this.isValid()) {
- return input != null ? this : NaN;
- }
- var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
- return input == null ? weekday : this.add(input - weekday, 'd');
- }
- function getSetISODayOfWeek (input) {
- if (!this.isValid()) {
- return input != null ? this : NaN;
- }
-
-
-
- if (input != null) {
- var weekday = parseIsoWeekday(input, this.localeData());
- return this.day(this.day() % 7 ? weekday : weekday - 7);
- } else {
- return this.day() || 7;
- }
- }
- var defaultWeekdaysRegex = matchWord;
- function weekdaysRegex (isStrict) {
- if (this._weekdaysParseExact) {
- if (!hasOwnProp(this, '_weekdaysRegex')) {
- computeWeekdaysParse.call(this);
- }
- if (isStrict) {
- return this._weekdaysStrictRegex;
- } else {
- return this._weekdaysRegex;
- }
- } else {
- if (!hasOwnProp(this, '_weekdaysRegex')) {
- this._weekdaysRegex = defaultWeekdaysRegex;
- }
- return this._weekdaysStrictRegex && isStrict ?
- this._weekdaysStrictRegex : this._weekdaysRegex;
- }
- }
- var defaultWeekdaysShortRegex = matchWord;
- function weekdaysShortRegex (isStrict) {
- if (this._weekdaysParseExact) {
- if (!hasOwnProp(this, '_weekdaysRegex')) {
- computeWeekdaysParse.call(this);
- }
- if (isStrict) {
- return this._weekdaysShortStrictRegex;
- } else {
- return this._weekdaysShortRegex;
- }
- } else {
- if (!hasOwnProp(this, '_weekdaysShortRegex')) {
- this._weekdaysShortRegex = defaultWeekdaysShortRegex;
- }
- return this._weekdaysShortStrictRegex && isStrict ?
- this._weekdaysShortStrictRegex : this._weekdaysShortRegex;
- }
- }
- var defaultWeekdaysMinRegex = matchWord;
- function weekdaysMinRegex (isStrict) {
- if (this._weekdaysParseExact) {
- if (!hasOwnProp(this, '_weekdaysRegex')) {
- computeWeekdaysParse.call(this);
- }
- if (isStrict) {
- return this._weekdaysMinStrictRegex;
- } else {
- return this._weekdaysMinRegex;
- }
- } else {
- if (!hasOwnProp(this, '_weekdaysMinRegex')) {
- this._weekdaysMinRegex = defaultWeekdaysMinRegex;
- }
- return this._weekdaysMinStrictRegex && isStrict ?
- this._weekdaysMinStrictRegex : this._weekdaysMinRegex;
- }
- }
- function computeWeekdaysParse () {
- function cmpLenRev(a, b) {
- return b.length - a.length;
- }
- var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],
- i, mom, minp, shortp, longp;
- for (i = 0; i < 7; i++) {
-
- mom = createUTC([2000, 1]).day(i);
- minp = this.weekdaysMin(mom, '');
- shortp = this.weekdaysShort(mom, '');
- longp = this.weekdays(mom, '');
- minPieces.push(minp);
- shortPieces.push(shortp);
- longPieces.push(longp);
- mixedPieces.push(minp);
- mixedPieces.push(shortp);
- mixedPieces.push(longp);
- }
-
-
- minPieces.sort(cmpLenRev);
- shortPieces.sort(cmpLenRev);
- longPieces.sort(cmpLenRev);
- mixedPieces.sort(cmpLenRev);
- for (i = 0; i < 7; i++) {
- shortPieces[i] = regexEscape(shortPieces[i]);
- longPieces[i] = regexEscape(longPieces[i]);
- mixedPieces[i] = regexEscape(mixedPieces[i]);
- }
- this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
- this._weekdaysShortRegex = this._weekdaysRegex;
- this._weekdaysMinRegex = this._weekdaysRegex;
- this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');
- this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
- this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');
- }
-
- function hFormat() {
- return this.hours() % 12 || 12;
- }
- function kFormat() {
- return this.hours() || 24;
- }
- addFormatToken('H', ['HH', 2], 0, 'hour');
- addFormatToken('h', ['hh', 2], 0, hFormat);
- addFormatToken('k', ['kk', 2], 0, kFormat);
- addFormatToken('hmm', 0, 0, function () {
- return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);
- });
- addFormatToken('hmmss', 0, 0, function () {
- return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +
- zeroFill(this.seconds(), 2);
- });
- addFormatToken('Hmm', 0, 0, function () {
- return '' + this.hours() + zeroFill(this.minutes(), 2);
- });
- addFormatToken('Hmmss', 0, 0, function () {
- return '' + this.hours() + zeroFill(this.minutes(), 2) +
- zeroFill(this.seconds(), 2);
- });
- function meridiem (token, lowercase) {
- addFormatToken(token, 0, 0, function () {
- return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);
- });
- }
- meridiem('a', true);
- meridiem('A', false);
-
- addUnitAlias('hour', 'h');
-
- addUnitPriority('hour', 13);
-
- function matchMeridiem (isStrict, locale) {
- return locale._meridiemParse;
- }
- addRegexToken('a', matchMeridiem);
- addRegexToken('A', matchMeridiem);
- addRegexToken('H', match1to2);
- addRegexToken('h', match1to2);
- addRegexToken('k', match1to2);
- addRegexToken('HH', match1to2, match2);
- addRegexToken('hh', match1to2, match2);
- addRegexToken('kk', match1to2, match2);
- addRegexToken('hmm', match3to4);
- addRegexToken('hmmss', match5to6);
- addRegexToken('Hmm', match3to4);
- addRegexToken('Hmmss', match5to6);
- addParseToken(['H', 'HH'], HOUR);
- addParseToken(['k', 'kk'], function (input, array, config) {
- var kInput = toInt(input);
- array[HOUR] = kInput === 24 ? 0 : kInput;
- });
- addParseToken(['a', 'A'], function (input, array, config) {
- config._isPm = config._locale.isPM(input);
- config._meridiem = input;
- });
- addParseToken(['h', 'hh'], function (input, array, config) {
- array[HOUR] = toInt(input);
- getParsingFlags(config).bigHour = true;
- });
- addParseToken('hmm', function (input, array, config) {
- var pos = input.length - 2;
- array[HOUR] = toInt(input.substr(0, pos));
- array[MINUTE] = toInt(input.substr(pos));
- getParsingFlags(config).bigHour = true;
- });
- addParseToken('hmmss', function (input, array, config) {
- var pos1 = input.length - 4;
- var pos2 = input.length - 2;
- array[HOUR] = toInt(input.substr(0, pos1));
- array[MINUTE] = toInt(input.substr(pos1, 2));
- array[SECOND] = toInt(input.substr(pos2));
- getParsingFlags(config).bigHour = true;
- });
- addParseToken('Hmm', function (input, array, config) {
- var pos = input.length - 2;
- array[HOUR] = toInt(input.substr(0, pos));
- array[MINUTE] = toInt(input.substr(pos));
- });
- addParseToken('Hmmss', function (input, array, config) {
- var pos1 = input.length - 4;
- var pos2 = input.length - 2;
- array[HOUR] = toInt(input.substr(0, pos1));
- array[MINUTE] = toInt(input.substr(pos1, 2));
- array[SECOND] = toInt(input.substr(pos2));
- });
-
- function localeIsPM (input) {
-
-
- return ((input + '').toLowerCase().charAt(0) === 'p');
- }
- var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i;
- function localeMeridiem (hours, minutes, isLower) {
- if (hours > 11) {
- return isLower ? 'pm' : 'PM';
- } else {
- return isLower ? 'am' : 'AM';
- }
- }
-
-
-
-
-
- var getSetHour = makeGetSet('Hours', true);
- var baseConfig = {
- calendar: defaultCalendar,
- longDateFormat: defaultLongDateFormat,
- invalidDate: defaultInvalidDate,
- ordinal: defaultOrdinal,
- dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,
- relativeTime: defaultRelativeTime,
- months: defaultLocaleMonths,
- monthsShort: defaultLocaleMonthsShort,
- week: defaultLocaleWeek,
- weekdays: defaultLocaleWeekdays,
- weekdaysMin: defaultLocaleWeekdaysMin,
- weekdaysShort: defaultLocaleWeekdaysShort,
- meridiemParse: defaultLocaleMeridiemParse
- };
-
- var locales = {};
- var localeFamilies = {};
- var globalLocale;
- function normalizeLocale(key) {
- return key ? key.toLowerCase().replace('_', '-') : key;
- }
-
-
-
- function chooseLocale(names) {
- var i = 0, j, next, locale, split;
- while (i < names.length) {
- split = normalizeLocale(names[i]).split('-');
- j = split.length;
- next = normalizeLocale(names[i + 1]);
- next = next ? next.split('-') : null;
- while (j > 0) {
- locale = loadLocale(split.slice(0, j).join('-'));
- if (locale) {
- return locale;
- }
- if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {
-
- break;
- }
- j--;
- }
- i++;
- }
- return globalLocale;
- }
- function loadLocale(name) {
- var oldLocale = null;
-
- if (!locales[name] && ('object' !== 'undefined') &&
- module && module.exports) {
- try {
- oldLocale = globalLocale._abbr;
- var aliasedRequire = commonjsRequire;
- aliasedRequire('./locale/' + name);
- getSetGlobalLocale(oldLocale);
- } catch (e) {}
- }
- return locales[name];
- }
-
-
-
- function getSetGlobalLocale (key, values) {
- var data;
- if (key) {
- if (isUndefined(values)) {
- data = getLocale(key);
- }
- else {
- data = defineLocale(key, values);
- }
- if (data) {
-
- globalLocale = data;
- }
- else {
- if ((typeof console !== 'undefined') && console.warn) {
-
- console.warn('Locale ' + key + ' not found. Did you forget to load it?');
- }
- }
- }
- return globalLocale._abbr;
- }
- function defineLocale (name, config) {
- if (config !== null) {
- var locale, parentConfig = baseConfig;
- config.abbr = name;
- if (locales[name] != null) {
- deprecateSimple('defineLocaleOverride',
- 'use moment.updateLocale(localeName, config) to change ' +
- 'an existing locale. moment.defineLocale(localeName, ' +
- 'config) should only be used for creating a new locale ' +
- 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');
- parentConfig = locales[name]._config;
- } else if (config.parentLocale != null) {
- if (locales[config.parentLocale] != null) {
- parentConfig = locales[config.parentLocale]._config;
- } else {
- locale = loadLocale(config.parentLocale);
- if (locale != null) {
- parentConfig = locale._config;
- } else {
- if (!localeFamilies[config.parentLocale]) {
- localeFamilies[config.parentLocale] = [];
- }
- localeFamilies[config.parentLocale].push({
- name: name,
- config: config
- });
- return null;
- }
- }
- }
- locales[name] = new Locale(mergeConfigs(parentConfig, config));
- if (localeFamilies[name]) {
- localeFamilies[name].forEach(function (x) {
- defineLocale(x.name, x.config);
- });
- }
-
-
-
- getSetGlobalLocale(name);
- return locales[name];
- } else {
-
- delete locales[name];
- return null;
- }
- }
- function updateLocale(name, config) {
- if (config != null) {
- var locale, tmpLocale, parentConfig = baseConfig;
-
- tmpLocale = loadLocale(name);
- if (tmpLocale != null) {
- parentConfig = tmpLocale._config;
- }
- config = mergeConfigs(parentConfig, config);
- locale = new Locale(config);
- locale.parentLocale = locales[name];
- locales[name] = locale;
-
- getSetGlobalLocale(name);
- } else {
-
- if (locales[name] != null) {
- if (locales[name].parentLocale != null) {
- locales[name] = locales[name].parentLocale;
- } else if (locales[name] != null) {
- delete locales[name];
- }
- }
- }
- return locales[name];
- }
-
- function getLocale (key) {
- var locale;
- if (key && key._locale && key._locale._abbr) {
- key = key._locale._abbr;
- }
- if (!key) {
- return globalLocale;
- }
- if (!isArray(key)) {
-
- locale = loadLocale(key);
- if (locale) {
- return locale;
- }
- key = [key];
- }
- return chooseLocale(key);
- }
- function listLocales() {
- return keys(locales);
- }
- function checkOverflow (m) {
- var overflow;
- var a = m._a;
- if (a && getParsingFlags(m).overflow === -2) {
- overflow =
- a[MONTH] < 0 || a[MONTH] > 11 ? MONTH :
- a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE :
- a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :
- a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE :
- a[SECOND] < 0 || a[SECOND] > 59 ? SECOND :
- a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :
- -1;
- if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
- overflow = DATE;
- }
- if (getParsingFlags(m)._overflowWeeks && overflow === -1) {
- overflow = WEEK;
- }
- if (getParsingFlags(m)._overflowWeekday && overflow === -1) {
- overflow = WEEKDAY;
- }
- getParsingFlags(m).overflow = overflow;
- }
- return m;
- }
-
- function defaults(a, b, c) {
- if (a != null) {
- return a;
- }
- if (b != null) {
- return b;
- }
- return c;
- }
- function currentDateArray(config) {
-
- var nowValue = new Date(hooks.now());
- if (config._useUTC) {
- return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];
- }
- return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];
- }
-
-
-
-
- function configFromArray (config) {
- var i, date, input = [], currentDate, expectedWeekday, yearToUse;
- if (config._d) {
- return;
- }
- currentDate = currentDateArray(config);
-
- if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
- dayOfYearFromWeekInfo(config);
- }
-
- if (config._dayOfYear != null) {
- yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);
- if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) {
- getParsingFlags(config)._overflowDayOfYear = true;
- }
- date = createUTCDate(yearToUse, 0, config._dayOfYear);
- config._a[MONTH] = date.getUTCMonth();
- config._a[DATE] = date.getUTCDate();
- }
-
-
-
-
-
- for (i = 0; i < 3 && config._a[i] == null; ++i) {
- config._a[i] = input[i] = currentDate[i];
- }
-
- for (; i < 7; i++) {
- config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];
- }
-
- if (config._a[HOUR] === 24 &&
- config._a[MINUTE] === 0 &&
- config._a[SECOND] === 0 &&
- config._a[MILLISECOND] === 0) {
- config._nextDay = true;
- config._a[HOUR] = 0;
- }
- config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);
- expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay();
-
-
- if (config._tzm != null) {
- config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
- }
- if (config._nextDay) {
- config._a[HOUR] = 24;
- }
-
- if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) {
- getParsingFlags(config).weekdayMismatch = true;
- }
- }
- function dayOfYearFromWeekInfo(config) {
- var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;
- w = config._w;
- if (w.GG != null || w.W != null || w.E != null) {
- dow = 1;
- doy = 4;
-
-
-
-
- weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);
- week = defaults(w.W, 1);
- weekday = defaults(w.E, 1);
- if (weekday < 1 || weekday > 7) {
- weekdayOverflow = true;
- }
- } else {
- dow = config._locale._week.dow;
- doy = config._locale._week.doy;
- var curWeek = weekOfYear(createLocal(), dow, doy);
- weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);
-
- week = defaults(w.w, curWeek.week);
- if (w.d != null) {
-
- weekday = w.d;
- if (weekday < 0 || weekday > 6) {
- weekdayOverflow = true;
- }
- } else if (w.e != null) {
-
- weekday = w.e + dow;
- if (w.e < 0 || w.e > 6) {
- weekdayOverflow = true;
- }
- } else {
-
- weekday = dow;
- }
- }
- if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {
- getParsingFlags(config)._overflowWeeks = true;
- } else if (weekdayOverflow != null) {
- getParsingFlags(config)._overflowWeekday = true;
- } else {
- temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);
- config._a[YEAR] = temp.year;
- config._dayOfYear = temp.dayOfYear;
- }
- }
-
-
- var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/;
- var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/;
- var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/;
- var isoDates = [
- ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/],
- ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/],
- ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/],
- ['GGGG-[W]WW', /\d{4}-W\d\d/, false],
- ['YYYY-DDD', /\d{4}-\d{3}/],
- ['YYYY-MM', /\d{4}-\d\d/, false],
- ['YYYYYYMMDD', /[+-]\d{10}/],
- ['YYYYMMDD', /\d{8}/],
-
- ['GGGG[W]WWE', /\d{4}W\d{3}/],
- ['GGGG[W]WW', /\d{4}W\d{2}/, false],
- ['YYYYDDD', /\d{7}/]
- ];
-
- var isoTimes = [
- ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/],
- ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/],
- ['HH:mm:ss', /\d\d:\d\d:\d\d/],
- ['HH:mm', /\d\d:\d\d/],
- ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/],
- ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/],
- ['HHmmss', /\d\d\d\d\d\d/],
- ['HHmm', /\d\d\d\d/],
- ['HH', /\d\d/]
- ];
- var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i;
-
- function configFromISO(config) {
- var i, l,
- string = config._i,
- match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),
- allowTime, dateFormat, timeFormat, tzFormat;
- if (match) {
- getParsingFlags(config).iso = true;
- for (i = 0, l = isoDates.length; i < l; i++) {
- if (isoDates[i][1].exec(match[1])) {
- dateFormat = isoDates[i][0];
- allowTime = isoDates[i][2] !== false;
- break;
- }
- }
- if (dateFormat == null) {
- config._isValid = false;
- return;
- }
- if (match[3]) {
- for (i = 0, l = isoTimes.length; i < l; i++) {
- if (isoTimes[i][1].exec(match[3])) {
-
- timeFormat = (match[2] || ' ') + isoTimes[i][0];
- break;
- }
- }
- if (timeFormat == null) {
- config._isValid = false;
- return;
- }
- }
- if (!allowTime && timeFormat != null) {
- config._isValid = false;
- return;
- }
- if (match[4]) {
- if (tzRegex.exec(match[4])) {
- tzFormat = 'Z';
- } else {
- config._isValid = false;
- return;
- }
- }
- config._f = dateFormat + (timeFormat || '') + (tzFormat || '');
- configFromStringAndFormat(config);
- } else {
- config._isValid = false;
- }
- }
-
- var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/;
- function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {
- var result = [
- untruncateYear(yearStr),
- defaultLocaleMonthsShort.indexOf(monthStr),
- parseInt(dayStr, 10),
- parseInt(hourStr, 10),
- parseInt(minuteStr, 10)
- ];
- if (secondStr) {
- result.push(parseInt(secondStr, 10));
- }
- return result;
- }
- function untruncateYear(yearStr) {
- var year = parseInt(yearStr, 10);
- if (year <= 49) {
- return 2000 + year;
- } else if (year <= 999) {
- return 1900 + year;
- }
- return year;
- }
- function preprocessRFC2822(s) {
-
- return s.replace(/\([^)]*\)|[\n\t]/g, ' ').replace(/(\s\s+)/g, ' ').replace(/^\s\s*/, '').replace(/\s\s*$/, '');
- }
- function checkWeekday(weekdayStr, parsedInput, config) {
- if (weekdayStr) {
-
- var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),
- weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay();
- if (weekdayProvided !== weekdayActual) {
- getParsingFlags(config).weekdayMismatch = true;
- config._isValid = false;
- return false;
- }
- }
- return true;
- }
- var obsOffsets = {
- UT: 0,
- GMT: 0,
- EDT: -4 * 60,
- EST: -5 * 60,
- CDT: -5 * 60,
- CST: -6 * 60,
- MDT: -6 * 60,
- MST: -7 * 60,
- PDT: -7 * 60,
- PST: -8 * 60
- };
- function calculateOffset(obsOffset, militaryOffset, numOffset) {
- if (obsOffset) {
- return obsOffsets[obsOffset];
- } else if (militaryOffset) {
-
- return 0;
- } else {
- var hm = parseInt(numOffset, 10);
- var m = hm % 100, h = (hm - m) / 100;
- return h * 60 + m;
- }
- }
-
- function configFromRFC2822(config) {
- var match = rfc2822.exec(preprocessRFC2822(config._i));
- if (match) {
- var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]);
- if (!checkWeekday(match[1], parsedArray, config)) {
- return;
- }
- config._a = parsedArray;
- config._tzm = calculateOffset(match[8], match[9], match[10]);
- config._d = createUTCDate.apply(null, config._a);
- config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
- getParsingFlags(config).rfc2822 = true;
- } else {
- config._isValid = false;
- }
- }
-
- function configFromString(config) {
- var matched = aspNetJsonRegex.exec(config._i);
- if (matched !== null) {
- config._d = new Date(+matched[1]);
- return;
- }
- configFromISO(config);
- if (config._isValid === false) {
- delete config._isValid;
- } else {
- return;
- }
- configFromRFC2822(config);
- if (config._isValid === false) {
- delete config._isValid;
- } else {
- return;
- }
-
- hooks.createFromInputFallback(config);
- }
- hooks.createFromInputFallback = deprecate(
- 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +
- 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +
- 'discouraged and will be removed in an upcoming major release. Please refer to ' +
- 'http://momentjs.com/guides/#/warnings/js-date/ for more info.',
- function (config) {
- config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
- }
- );
-
- hooks.ISO_8601 = function () {};
-
- hooks.RFC_2822 = function () {};
-
- function configFromStringAndFormat(config) {
-
- if (config._f === hooks.ISO_8601) {
- configFromISO(config);
- return;
- }
- if (config._f === hooks.RFC_2822) {
- configFromRFC2822(config);
- return;
- }
- config._a = [];
- getParsingFlags(config).empty = true;
-
- var string = '' + config._i,
- i, parsedInput, tokens, token, skipped,
- stringLength = string.length,
- totalParsedInputLength = 0;
- tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];
- for (i = 0; i < tokens.length; i++) {
- token = tokens[i];
- parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];
-
-
- if (parsedInput) {
- skipped = string.substr(0, string.indexOf(parsedInput));
- if (skipped.length > 0) {
- getParsingFlags(config).unusedInput.push(skipped);
- }
- string = string.slice(string.indexOf(parsedInput) + parsedInput.length);
- totalParsedInputLength += parsedInput.length;
- }
-
- if (formatTokenFunctions[token]) {
- if (parsedInput) {
- getParsingFlags(config).empty = false;
- }
- else {
- getParsingFlags(config).unusedTokens.push(token);
- }
- addTimeToArrayFromToken(token, parsedInput, config);
- }
- else if (config._strict && !parsedInput) {
- getParsingFlags(config).unusedTokens.push(token);
- }
- }
-
- getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;
- if (string.length > 0) {
- getParsingFlags(config).unusedInput.push(string);
- }
-
- if (config._a[HOUR] <= 12 &&
- getParsingFlags(config).bigHour === true &&
- config._a[HOUR] > 0) {
- getParsingFlags(config).bigHour = undefined;
- }
- getParsingFlags(config).parsedDateParts = config._a.slice(0);
- getParsingFlags(config).meridiem = config._meridiem;
-
- config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);
- configFromArray(config);
- checkOverflow(config);
- }
- function meridiemFixWrap (locale, hour, meridiem) {
- var isPm;
- if (meridiem == null) {
-
- return hour;
- }
- if (locale.meridiemHour != null) {
- return locale.meridiemHour(hour, meridiem);
- } else if (locale.isPM != null) {
-
- isPm = locale.isPM(meridiem);
- if (isPm && hour < 12) {
- hour += 12;
- }
- if (!isPm && hour === 12) {
- hour = 0;
- }
- return hour;
- } else {
-
- return hour;
- }
- }
-
- function configFromStringAndArray(config) {
- var tempConfig,
- bestMoment,
- scoreToBeat,
- i,
- currentScore;
- if (config._f.length === 0) {
- getParsingFlags(config).invalidFormat = true;
- config._d = new Date(NaN);
- return;
- }
- for (i = 0; i < config._f.length; i++) {
- currentScore = 0;
- tempConfig = copyConfig({}, config);
- if (config._useUTC != null) {
- tempConfig._useUTC = config._useUTC;
- }
- tempConfig._f = config._f[i];
- configFromStringAndFormat(tempConfig);
- if (!isValid(tempConfig)) {
- continue;
- }
-
- currentScore += getParsingFlags(tempConfig).charsLeftOver;
-
- currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;
- getParsingFlags(tempConfig).score = currentScore;
- if (scoreToBeat == null || currentScore < scoreToBeat) {
- scoreToBeat = currentScore;
- bestMoment = tempConfig;
- }
- }
- extend(config, bestMoment || tempConfig);
- }
- function configFromObject(config) {
- if (config._d) {
- return;
- }
- var i = normalizeObjectUnits(config._i);
- config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {
- return obj && parseInt(obj, 10);
- });
- configFromArray(config);
- }
- function createFromConfig (config) {
- var res = new Moment(checkOverflow(prepareConfig(config)));
- if (res._nextDay) {
-
- res.add(1, 'd');
- res._nextDay = undefined;
- }
- return res;
- }
- function prepareConfig (config) {
- var input = config._i,
- format = config._f;
- config._locale = config._locale || getLocale(config._l);
- if (input === null || (format === undefined && input === '')) {
- return createInvalid({nullInput: true});
- }
- if (typeof input === 'string') {
- config._i = input = config._locale.preparse(input);
- }
- if (isMoment(input)) {
- return new Moment(checkOverflow(input));
- } else if (isDate(input)) {
- config._d = input;
- } else if (isArray(format)) {
- configFromStringAndArray(config);
- } else if (format) {
- configFromStringAndFormat(config);
- } else {
- configFromInput(config);
- }
- if (!isValid(config)) {
- config._d = null;
- }
- return config;
- }
- function configFromInput(config) {
- var input = config._i;
- if (isUndefined(input)) {
- config._d = new Date(hooks.now());
- } else if (isDate(input)) {
- config._d = new Date(input.valueOf());
- } else if (typeof input === 'string') {
- configFromString(config);
- } else if (isArray(input)) {
- config._a = map(input.slice(0), function (obj) {
- return parseInt(obj, 10);
- });
- configFromArray(config);
- } else if (isObject(input)) {
- configFromObject(config);
- } else if (isNumber(input)) {
-
- config._d = new Date(input);
- } else {
- hooks.createFromInputFallback(config);
- }
- }
- function createLocalOrUTC (input, format, locale, strict, isUTC) {
- var c = {};
- if (locale === true || locale === false) {
- strict = locale;
- locale = undefined;
- }
- if ((isObject(input) && isObjectEmpty(input)) ||
- (isArray(input) && input.length === 0)) {
- input = undefined;
- }
-
-
- c._isAMomentObject = true;
- c._useUTC = c._isUTC = isUTC;
- c._l = locale;
- c._i = input;
- c._f = format;
- c._strict = strict;
- return createFromConfig(c);
- }
- function createLocal (input, format, locale, strict) {
- return createLocalOrUTC(input, format, locale, strict, false);
- }
- var prototypeMin = deprecate(
- 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',
- function () {
- var other = createLocal.apply(null, arguments);
- if (this.isValid() && other.isValid()) {
- return other < this ? this : other;
- } else {
- return createInvalid();
- }
- }
- );
- var prototypeMax = deprecate(
- 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',
- function () {
- var other = createLocal.apply(null, arguments);
- if (this.isValid() && other.isValid()) {
- return other > this ? this : other;
- } else {
- return createInvalid();
- }
- }
- );
-
-
-
-
-
- function pickBy(fn, moments) {
- var res, i;
- if (moments.length === 1 && isArray(moments[0])) {
- moments = moments[0];
- }
- if (!moments.length) {
- return createLocal();
- }
- res = moments[0];
- for (i = 1; i < moments.length; ++i) {
- if (!moments[i].isValid() || moments[i][fn](res)) {
- res = moments[i];
- }
- }
- return res;
- }
-
- function min () {
- var args = [].slice.call(arguments, 0);
- return pickBy('isBefore', args);
- }
- function max () {
- var args = [].slice.call(arguments, 0);
- return pickBy('isAfter', args);
- }
- var now = function () {
- return Date.now ? Date.now() : +(new Date());
- };
- var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];
- function isDurationValid(m) {
- for (var key in m) {
- if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) {
- return false;
- }
- }
- var unitHasDecimal = false;
- for (var i = 0; i < ordering.length; ++i) {
- if (m[ordering[i]]) {
- if (unitHasDecimal) {
- return false;
- }
- if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {
- unitHasDecimal = true;
- }
- }
- }
- return true;
- }
- function isValid$1() {
- return this._isValid;
- }
- function createInvalid$1() {
- return createDuration(NaN);
- }
- function Duration (duration) {
- var normalizedInput = normalizeObjectUnits(duration),
- years = normalizedInput.year || 0,
- quarters = normalizedInput.quarter || 0,
- months = normalizedInput.month || 0,
- weeks = normalizedInput.week || normalizedInput.isoWeek || 0,
- days = normalizedInput.day || 0,
- hours = normalizedInput.hour || 0,
- minutes = normalizedInput.minute || 0,
- seconds = normalizedInput.second || 0,
- milliseconds = normalizedInput.millisecond || 0;
- this._isValid = isDurationValid(normalizedInput);
-
- this._milliseconds = +milliseconds +
- seconds * 1e3 +
- minutes * 6e4 +
- hours * 1000 * 60 * 60;
-
-
- this._days = +days +
- weeks * 7;
-
-
-
- this._months = +months +
- quarters * 3 +
- years * 12;
- this._data = {};
- this._locale = getLocale();
- this._bubble();
- }
- function isDuration (obj) {
- return obj instanceof Duration;
- }
- function absRound (number) {
- if (number < 0) {
- return Math.round(-1 * number) * -1;
- } else {
- return Math.round(number);
- }
- }
-
- function offset (token, separator) {
- addFormatToken(token, 0, 0, function () {
- var offset = this.utcOffset();
- var sign = '+';
- if (offset < 0) {
- offset = -offset;
- sign = '-';
- }
- return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);
- });
- }
- offset('Z', ':');
- offset('ZZ', '');
-
- addRegexToken('Z', matchShortOffset);
- addRegexToken('ZZ', matchShortOffset);
- addParseToken(['Z', 'ZZ'], function (input, array, config) {
- config._useUTC = true;
- config._tzm = offsetFromString(matchShortOffset, input);
- });
-
-
-
-
- var chunkOffset = /([\+\-]|\d\d)/gi;
- function offsetFromString(matcher, string) {
- var matches = (string || '').match(matcher);
- if (matches === null) {
- return null;
- }
- var chunk = matches[matches.length - 1] || [];
- var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];
- var minutes = +(parts[1] * 60) + toInt(parts[2]);
- return minutes === 0 ?
- 0 :
- parts[0] === '+' ? minutes : -minutes;
- }
-
- function cloneWithOffset(input, model) {
- var res, diff;
- if (model._isUTC) {
- res = model.clone();
- diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();
-
- res._d.setTime(res._d.valueOf() + diff);
- hooks.updateOffset(res, false);
- return res;
- } else {
- return createLocal(input).local();
- }
- }
- function getDateOffset (m) {
-
-
- return -Math.round(m._d.getTimezoneOffset() / 15) * 15;
- }
-
-
-
- hooks.updateOffset = function () {};
-
-
-
-
-
-
-
-
-
-
-
- function getSetOffset (input, keepLocalTime, keepMinutes) {
- var offset = this._offset || 0,
- localAdjust;
- if (!this.isValid()) {
- return input != null ? this : NaN;
- }
- if (input != null) {
- if (typeof input === 'string') {
- input = offsetFromString(matchShortOffset, input);
- if (input === null) {
- return this;
- }
- } else if (Math.abs(input) < 16 && !keepMinutes) {
- input = input * 60;
- }
- if (!this._isUTC && keepLocalTime) {
- localAdjust = getDateOffset(this);
- }
- this._offset = input;
- this._isUTC = true;
- if (localAdjust != null) {
- this.add(localAdjust, 'm');
- }
- if (offset !== input) {
- if (!keepLocalTime || this._changeInProgress) {
- addSubtract(this, createDuration(input - offset, 'm'), 1, false);
- } else if (!this._changeInProgress) {
- this._changeInProgress = true;
- hooks.updateOffset(this, true);
- this._changeInProgress = null;
- }
- }
- return this;
- } else {
- return this._isUTC ? offset : getDateOffset(this);
- }
- }
- function getSetZone (input, keepLocalTime) {
- if (input != null) {
- if (typeof input !== 'string') {
- input = -input;
- }
- this.utcOffset(input, keepLocalTime);
- return this;
- } else {
- return -this.utcOffset();
- }
- }
- function setOffsetToUTC (keepLocalTime) {
- return this.utcOffset(0, keepLocalTime);
- }
- function setOffsetToLocal (keepLocalTime) {
- if (this._isUTC) {
- this.utcOffset(0, keepLocalTime);
- this._isUTC = false;
- if (keepLocalTime) {
- this.subtract(getDateOffset(this), 'm');
- }
- }
- return this;
- }
- function setOffsetToParsedOffset () {
- if (this._tzm != null) {
- this.utcOffset(this._tzm, false, true);
- } else if (typeof this._i === 'string') {
- var tZone = offsetFromString(matchOffset, this._i);
- if (tZone != null) {
- this.utcOffset(tZone);
- }
- else {
- this.utcOffset(0, true);
- }
- }
- return this;
- }
- function hasAlignedHourOffset (input) {
- if (!this.isValid()) {
- return false;
- }
- input = input ? createLocal(input).utcOffset() : 0;
- return (this.utcOffset() - input) % 60 === 0;
- }
- function isDaylightSavingTime () {
- return (
- this.utcOffset() > this.clone().month(0).utcOffset() ||
- this.utcOffset() > this.clone().month(5).utcOffset()
- );
- }
- function isDaylightSavingTimeShifted () {
- if (!isUndefined(this._isDSTShifted)) {
- return this._isDSTShifted;
- }
- var c = {};
- copyConfig(c, this);
- c = prepareConfig(c);
- if (c._a) {
- var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);
- this._isDSTShifted = this.isValid() &&
- compareArrays(c._a, other.toArray()) > 0;
- } else {
- this._isDSTShifted = false;
- }
- return this._isDSTShifted;
- }
- function isLocal () {
- return this.isValid() ? !this._isUTC : false;
- }
- function isUtcOffset () {
- return this.isValid() ? this._isUTC : false;
- }
- function isUtc () {
- return this.isValid() ? this._isUTC && this._offset === 0 : false;
- }
-
- var aspNetRegex = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/;
-
-
-
- var isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;
- function createDuration (input, key) {
- var duration = input,
-
- match = null,
- sign,
- ret,
- diffRes;
- if (isDuration(input)) {
- duration = {
- ms : input._milliseconds,
- d : input._days,
- M : input._months
- };
- } else if (isNumber(input)) {
- duration = {};
- if (key) {
- duration[key] = input;
- } else {
- duration.milliseconds = input;
- }
- } else if (!!(match = aspNetRegex.exec(input))) {
- sign = (match[1] === '-') ? -1 : 1;
- duration = {
- y : 0,
- d : toInt(match[DATE]) * sign,
- h : toInt(match[HOUR]) * sign,
- m : toInt(match[MINUTE]) * sign,
- s : toInt(match[SECOND]) * sign,
- ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign
- };
- } else if (!!(match = isoRegex.exec(input))) {
- sign = (match[1] === '-') ? -1 : 1;
- duration = {
- y : parseIso(match[2], sign),
- M : parseIso(match[3], sign),
- w : parseIso(match[4], sign),
- d : parseIso(match[5], sign),
- h : parseIso(match[6], sign),
- m : parseIso(match[7], sign),
- s : parseIso(match[8], sign)
- };
- } else if (duration == null) {
- duration = {};
- } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {
- diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));
- duration = {};
- duration.ms = diffRes.milliseconds;
- duration.M = diffRes.months;
- }
- ret = new Duration(duration);
- if (isDuration(input) && hasOwnProp(input, '_locale')) {
- ret._locale = input._locale;
- }
- return ret;
- }
- createDuration.fn = Duration.prototype;
- createDuration.invalid = createInvalid$1;
- function parseIso (inp, sign) {
-
-
-
- var res = inp && parseFloat(inp.replace(',', '.'));
-
- return (isNaN(res) ? 0 : res) * sign;
- }
- function positiveMomentsDifference(base, other) {
- var res = {};
- res.months = other.month() - base.month() +
- (other.year() - base.year()) * 12;
- if (base.clone().add(res.months, 'M').isAfter(other)) {
- --res.months;
- }
- res.milliseconds = +other - +(base.clone().add(res.months, 'M'));
- return res;
- }
- function momentsDifference(base, other) {
- var res;
- if (!(base.isValid() && other.isValid())) {
- return {milliseconds: 0, months: 0};
- }
- other = cloneWithOffset(other, base);
- if (base.isBefore(other)) {
- res = positiveMomentsDifference(base, other);
- } else {
- res = positiveMomentsDifference(other, base);
- res.milliseconds = -res.milliseconds;
- res.months = -res.months;
- }
- return res;
- }
-
- function createAdder(direction, name) {
- return function (val, period) {
- var dur, tmp;
-
- if (period !== null && !isNaN(+period)) {
- deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +
- 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');
- tmp = val; val = period; period = tmp;
- }
- val = typeof val === 'string' ? +val : val;
- dur = createDuration(val, period);
- addSubtract(this, dur, direction);
- return this;
- };
- }
- function addSubtract (mom, duration, isAdding, updateOffset) {
- var milliseconds = duration._milliseconds,
- days = absRound(duration._days),
- months = absRound(duration._months);
- if (!mom.isValid()) {
-
- return;
- }
- updateOffset = updateOffset == null ? true : updateOffset;
- if (months) {
- setMonth(mom, get(mom, 'Month') + months * isAdding);
- }
- if (days) {
- set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);
- }
- if (milliseconds) {
- mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
- }
- if (updateOffset) {
- hooks.updateOffset(mom, days || months);
- }
- }
- var add = createAdder(1, 'add');
- var subtract = createAdder(-1, 'subtract');
- function getCalendarFormat(myMoment, now) {
- var diff = myMoment.diff(now, 'days', true);
- return diff < -6 ? 'sameElse' :
- diff < -1 ? 'lastWeek' :
- diff < 0 ? 'lastDay' :
- diff < 1 ? 'sameDay' :
- diff < 2 ? 'nextDay' :
- diff < 7 ? 'nextWeek' : 'sameElse';
- }
- function calendar$1 (time, formats) {
-
-
- var now = time || createLocal(),
- sod = cloneWithOffset(now, this).startOf('day'),
- format = hooks.calendarFormat(this, sod) || 'sameElse';
- var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);
- return this.format(output || this.localeData().calendar(format, this, createLocal(now)));
- }
- function clone () {
- return new Moment(this);
- }
- function isAfter (input, units) {
- var localInput = isMoment(input) ? input : createLocal(input);
- if (!(this.isValid() && localInput.isValid())) {
- return false;
- }
- units = normalizeUnits(units) || 'millisecond';
- if (units === 'millisecond') {
- return this.valueOf() > localInput.valueOf();
- } else {
- return localInput.valueOf() < this.clone().startOf(units).valueOf();
- }
- }
- function isBefore (input, units) {
- var localInput = isMoment(input) ? input : createLocal(input);
- if (!(this.isValid() && localInput.isValid())) {
- return false;
- }
- units = normalizeUnits(units) || 'millisecond';
- if (units === 'millisecond') {
- return this.valueOf() < localInput.valueOf();
- } else {
- return this.clone().endOf(units).valueOf() < localInput.valueOf();
- }
- }
- function isBetween (from, to, units, inclusivity) {
- var localFrom = isMoment(from) ? from : createLocal(from),
- localTo = isMoment(to) ? to : createLocal(to);
- if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) {
- return false;
- }
- inclusivity = inclusivity || '()';
- return (inclusivity[0] === '(' ? this.isAfter(localFrom, units) : !this.isBefore(localFrom, units)) &&
- (inclusivity[1] === ')' ? this.isBefore(localTo, units) : !this.isAfter(localTo, units));
- }
- function isSame (input, units) {
- var localInput = isMoment(input) ? input : createLocal(input),
- inputMs;
- if (!(this.isValid() && localInput.isValid())) {
- return false;
- }
- units = normalizeUnits(units) || 'millisecond';
- if (units === 'millisecond') {
- return this.valueOf() === localInput.valueOf();
- } else {
- inputMs = localInput.valueOf();
- return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();
- }
- }
- function isSameOrAfter (input, units) {
- return this.isSame(input, units) || this.isAfter(input, units);
- }
- function isSameOrBefore (input, units) {
- return this.isSame(input, units) || this.isBefore(input, units);
- }
- function diff (input, units, asFloat) {
- var that,
- zoneDelta,
- output;
- if (!this.isValid()) {
- return NaN;
- }
- that = cloneWithOffset(input, this);
- if (!that.isValid()) {
- return NaN;
- }
- zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;
- units = normalizeUnits(units);
- switch (units) {
- case 'year': output = monthDiff(this, that) / 12; break;
- case 'month': output = monthDiff(this, that); break;
- case 'quarter': output = monthDiff(this, that) / 3; break;
- case 'second': output = (this - that) / 1e3; break;
- case 'minute': output = (this - that) / 6e4; break;
- case 'hour': output = (this - that) / 36e5; break;
- case 'day': output = (this - that - zoneDelta) / 864e5; break;
- case 'week': output = (this - that - zoneDelta) / 6048e5; break;
- default: output = this - that;
- }
- return asFloat ? output : absFloor(output);
- }
- function monthDiff (a, b) {
-
- var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),
-
- anchor = a.clone().add(wholeMonthDiff, 'months'),
- anchor2, adjust;
- if (b - anchor < 0) {
- anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');
-
- adjust = (b - anchor) / (anchor - anchor2);
- } else {
- anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');
-
- adjust = (b - anchor) / (anchor2 - anchor);
- }
-
- return -(wholeMonthDiff + adjust) || 0;
- }
- hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';
- hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';
- function toString () {
- return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
- }
- function toISOString(keepOffset) {
- if (!this.isValid()) {
- return null;
- }
- var utc = keepOffset !== true;
- var m = utc ? this.clone().utc() : this;
- if (m.year() < 0 || m.year() > 9999) {
- return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ');
- }
- if (isFunction(Date.prototype.toISOString)) {
-
- if (utc) {
- return this.toDate().toISOString();
- } else {
- return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z'));
- }
- }
- return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ');
- }
-
- function inspect () {
- if (!this.isValid()) {
- return 'moment.invalid(/* ' + this._i + ' */)';
- }
- var func = 'moment';
- var zone = '';
- if (!this.isLocal()) {
- func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';
- zone = 'Z';
- }
- var prefix = '[' + func + '("]';
- var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';
- var datetime = '-MM-DD[T]HH:mm:ss.SSS';
- var suffix = zone + '[")]';
- return this.format(prefix + year + datetime + suffix);
- }
- function format (inputString) {
- if (!inputString) {
- inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;
- }
- var output = formatMoment(this, inputString);
- return this.localeData().postformat(output);
- }
- function from (time, withoutSuffix) {
- if (this.isValid() &&
- ((isMoment(time) && time.isValid()) ||
- createLocal(time).isValid())) {
- return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);
- } else {
- return this.localeData().invalidDate();
- }
- }
- function fromNow (withoutSuffix) {
- return this.from(createLocal(), withoutSuffix);
- }
- function to (time, withoutSuffix) {
- if (this.isValid() &&
- ((isMoment(time) && time.isValid()) ||
- createLocal(time).isValid())) {
- return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);
- } else {
- return this.localeData().invalidDate();
- }
- }
- function toNow (withoutSuffix) {
- return this.to(createLocal(), withoutSuffix);
- }
-
-
-
- function locale (key) {
- var newLocaleData;
- if (key === undefined) {
- return this._locale._abbr;
- } else {
- newLocaleData = getLocale(key);
- if (newLocaleData != null) {
- this._locale = newLocaleData;
- }
- return this;
- }
- }
- var lang = deprecate(
- 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
- function (key) {
- if (key === undefined) {
- return this.localeData();
- } else {
- return this.locale(key);
- }
- }
- );
- function localeData () {
- return this._locale;
- }
- var MS_PER_SECOND = 1000;
- var MS_PER_MINUTE = 60 * MS_PER_SECOND;
- var MS_PER_HOUR = 60 * MS_PER_MINUTE;
- var MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR;
-
- function mod$1(dividend, divisor) {
- return (dividend % divisor + divisor) % divisor;
- }
- function localStartOfDate(y, m, d) {
-
- if (y < 100 && y >= 0) {
-
- return new Date(y + 400, m, d) - MS_PER_400_YEARS;
- } else {
- return new Date(y, m, d).valueOf();
- }
- }
- function utcStartOfDate(y, m, d) {
-
- if (y < 100 && y >= 0) {
-
- return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS;
- } else {
- return Date.UTC(y, m, d);
- }
- }
- function startOf (units) {
- var time;
- units = normalizeUnits(units);
- if (units === undefined || units === 'millisecond' || !this.isValid()) {
- return this;
- }
- var startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;
- switch (units) {
- case 'year':
- time = startOfDate(this.year(), 0, 1);
- break;
- case 'quarter':
- time = startOfDate(this.year(), this.month() - this.month() % 3, 1);
- break;
- case 'month':
- time = startOfDate(this.year(), this.month(), 1);
- break;
- case 'week':
- time = startOfDate(this.year(), this.month(), this.date() - this.weekday());
- break;
- case 'isoWeek':
- time = startOfDate(this.year(), this.month(), this.date() - (this.isoWeekday() - 1));
- break;
- case 'day':
- case 'date':
- time = startOfDate(this.year(), this.month(), this.date());
- break;
- case 'hour':
- time = this._d.valueOf();
- time -= mod$1(time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR);
- break;
- case 'minute':
- time = this._d.valueOf();
- time -= mod$1(time, MS_PER_MINUTE);
- break;
- case 'second':
- time = this._d.valueOf();
- time -= mod$1(time, MS_PER_SECOND);
- break;
- }
- this._d.setTime(time);
- hooks.updateOffset(this, true);
- return this;
- }
- function endOf (units) {
- var time;
- units = normalizeUnits(units);
- if (units === undefined || units === 'millisecond' || !this.isValid()) {
- return this;
- }
- var startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;
- switch (units) {
- case 'year':
- time = startOfDate(this.year() + 1, 0, 1) - 1;
- break;
- case 'quarter':
- time = startOfDate(this.year(), this.month() - this.month() % 3 + 3, 1) - 1;
- break;
- case 'month':
- time = startOfDate(this.year(), this.month() + 1, 1) - 1;
- break;
- case 'week':
- time = startOfDate(this.year(), this.month(), this.date() - this.weekday() + 7) - 1;
- break;
- case 'isoWeek':
- time = startOfDate(this.year(), this.month(), this.date() - (this.isoWeekday() - 1) + 7) - 1;
- break;
- case 'day':
- case 'date':
- time = startOfDate(this.year(), this.month(), this.date() + 1) - 1;
- break;
- case 'hour':
- time = this._d.valueOf();
- time += MS_PER_HOUR - mod$1(time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR) - 1;
- break;
- case 'minute':
- time = this._d.valueOf();
- time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1;
- break;
- case 'second':
- time = this._d.valueOf();
- time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1;
- break;
- }
- this._d.setTime(time);
- hooks.updateOffset(this, true);
- return this;
- }
- function valueOf () {
- return this._d.valueOf() - ((this._offset || 0) * 60000);
- }
- function unix () {
- return Math.floor(this.valueOf() / 1000);
- }
- function toDate () {
- return new Date(this.valueOf());
- }
- function toArray () {
- var m = this;
- return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];
- }
- function toObject () {
- var m = this;
- return {
- years: m.year(),
- months: m.month(),
- date: m.date(),
- hours: m.hours(),
- minutes: m.minutes(),
- seconds: m.seconds(),
- milliseconds: m.milliseconds()
- };
- }
- function toJSON () {
-
- return this.isValid() ? this.toISOString() : null;
- }
- function isValid$2 () {
- return isValid(this);
- }
- function parsingFlags () {
- return extend({}, getParsingFlags(this));
- }
- function invalidAt () {
- return getParsingFlags(this).overflow;
- }
- function creationData() {
- return {
- input: this._i,
- format: this._f,
- locale: this._locale,
- isUTC: this._isUTC,
- strict: this._strict
- };
- }
-
- addFormatToken(0, ['gg', 2], 0, function () {
- return this.weekYear() % 100;
- });
- addFormatToken(0, ['GG', 2], 0, function () {
- return this.isoWeekYear() % 100;
- });
- function addWeekYearFormatToken (token, getter) {
- addFormatToken(0, [token, token.length], 0, getter);
- }
- addWeekYearFormatToken('gggg', 'weekYear');
- addWeekYearFormatToken('ggggg', 'weekYear');
- addWeekYearFormatToken('GGGG', 'isoWeekYear');
- addWeekYearFormatToken('GGGGG', 'isoWeekYear');
-
- addUnitAlias('weekYear', 'gg');
- addUnitAlias('isoWeekYear', 'GG');
-
- addUnitPriority('weekYear', 1);
- addUnitPriority('isoWeekYear', 1);
-
- addRegexToken('G', matchSigned);
- addRegexToken('g', matchSigned);
- addRegexToken('GG', match1to2, match2);
- addRegexToken('gg', match1to2, match2);
- addRegexToken('GGGG', match1to4, match4);
- addRegexToken('gggg', match1to4, match4);
- addRegexToken('GGGGG', match1to6, match6);
- addRegexToken('ggggg', match1to6, match6);
- addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {
- week[token.substr(0, 2)] = toInt(input);
- });
- addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {
- week[token] = hooks.parseTwoDigitYear(input);
- });
-
- function getSetWeekYear (input) {
- return getSetWeekYearHelper.call(this,
- input,
- this.week(),
- this.weekday(),
- this.localeData()._week.dow,
- this.localeData()._week.doy);
- }
- function getSetISOWeekYear (input) {
- return getSetWeekYearHelper.call(this,
- input, this.isoWeek(), this.isoWeekday(), 1, 4);
- }
- function getISOWeeksInYear () {
- return weeksInYear(this.year(), 1, 4);
- }
- function getWeeksInYear () {
- var weekInfo = this.localeData()._week;
- return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
- }
- function getSetWeekYearHelper(input, week, weekday, dow, doy) {
- var weeksTarget;
- if (input == null) {
- return weekOfYear(this, dow, doy).year;
- } else {
- weeksTarget = weeksInYear(input, dow, doy);
- if (week > weeksTarget) {
- week = weeksTarget;
- }
- return setWeekAll.call(this, input, week, weekday, dow, doy);
- }
- }
- function setWeekAll(weekYear, week, weekday, dow, doy) {
- var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),
- date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);
- this.year(date.getUTCFullYear());
- this.month(date.getUTCMonth());
- this.date(date.getUTCDate());
- return this;
- }
-
- addFormatToken('Q', 0, 'Qo', 'quarter');
-
- addUnitAlias('quarter', 'Q');
-
- addUnitPriority('quarter', 7);
-
- addRegexToken('Q', match1);
- addParseToken('Q', function (input, array) {
- array[MONTH] = (toInt(input) - 1) * 3;
- });
-
- function getSetQuarter (input) {
- return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);
- }
-
- addFormatToken('D', ['DD', 2], 'Do', 'date');
-
- addUnitAlias('date', 'D');
-
- addUnitPriority('date', 9);
-
- addRegexToken('D', match1to2);
- addRegexToken('DD', match1to2, match2);
- addRegexToken('Do', function (isStrict, locale) {
-
- return isStrict ?
- (locale._dayOfMonthOrdinalParse || locale._ordinalParse) :
- locale._dayOfMonthOrdinalParseLenient;
- });
- addParseToken(['D', 'DD'], DATE);
- addParseToken('Do', function (input, array) {
- array[DATE] = toInt(input.match(match1to2)[0]);
- });
-
- var getSetDayOfMonth = makeGetSet('Date', true);
-
- addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');
-
- addUnitAlias('dayOfYear', 'DDD');
-
- addUnitPriority('dayOfYear', 4);
-
- addRegexToken('DDD', match1to3);
- addRegexToken('DDDD', match3);
- addParseToken(['DDD', 'DDDD'], function (input, array, config) {
- config._dayOfYear = toInt(input);
- });
-
-
- function getSetDayOfYear (input) {
- var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;
- return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');
- }
-
- addFormatToken('m', ['mm', 2], 0, 'minute');
-
- addUnitAlias('minute', 'm');
-
- addUnitPriority('minute', 14);
-
- addRegexToken('m', match1to2);
- addRegexToken('mm', match1to2, match2);
- addParseToken(['m', 'mm'], MINUTE);
-
- var getSetMinute = makeGetSet('Minutes', false);
-
- addFormatToken('s', ['ss', 2], 0, 'second');
-
- addUnitAlias('second', 's');
-
- addUnitPriority('second', 15);
-
- addRegexToken('s', match1to2);
- addRegexToken('ss', match1to2, match2);
- addParseToken(['s', 'ss'], SECOND);
-
- var getSetSecond = makeGetSet('Seconds', false);
-
- addFormatToken('S', 0, 0, function () {
- return ~~(this.millisecond() / 100);
- });
- addFormatToken(0, ['SS', 2], 0, function () {
- return ~~(this.millisecond() / 10);
- });
- addFormatToken(0, ['SSS', 3], 0, 'millisecond');
- addFormatToken(0, ['SSSS', 4], 0, function () {
- return this.millisecond() * 10;
- });
- addFormatToken(0, ['SSSSS', 5], 0, function () {
- return this.millisecond() * 100;
- });
- addFormatToken(0, ['SSSSSS', 6], 0, function () {
- return this.millisecond() * 1000;
- });
- addFormatToken(0, ['SSSSSSS', 7], 0, function () {
- return this.millisecond() * 10000;
- });
- addFormatToken(0, ['SSSSSSSS', 8], 0, function () {
- return this.millisecond() * 100000;
- });
- addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {
- return this.millisecond() * 1000000;
- });
-
- addUnitAlias('millisecond', 'ms');
-
- addUnitPriority('millisecond', 16);
-
- addRegexToken('S', match1to3, match1);
- addRegexToken('SS', match1to3, match2);
- addRegexToken('SSS', match1to3, match3);
- var token;
- for (token = 'SSSS'; token.length <= 9; token += 'S') {
- addRegexToken(token, matchUnsigned);
- }
- function parseMs(input, array) {
- array[MILLISECOND] = toInt(('0.' + input) * 1000);
- }
- for (token = 'S'; token.length <= 9; token += 'S') {
- addParseToken(token, parseMs);
- }
-
- var getSetMillisecond = makeGetSet('Milliseconds', false);
-
- addFormatToken('z', 0, 0, 'zoneAbbr');
- addFormatToken('zz', 0, 0, 'zoneName');
-
- function getZoneAbbr () {
- return this._isUTC ? 'UTC' : '';
- }
- function getZoneName () {
- return this._isUTC ? 'Coordinated Universal Time' : '';
- }
- var proto = Moment.prototype;
- proto.add = add;
- proto.calendar = calendar$1;
- proto.clone = clone;
- proto.diff = diff;
- proto.endOf = endOf;
- proto.format = format;
- proto.from = from;
- proto.fromNow = fromNow;
- proto.to = to;
- proto.toNow = toNow;
- proto.get = stringGet;
- proto.invalidAt = invalidAt;
- proto.isAfter = isAfter;
- proto.isBefore = isBefore;
- proto.isBetween = isBetween;
- proto.isSame = isSame;
- proto.isSameOrAfter = isSameOrAfter;
- proto.isSameOrBefore = isSameOrBefore;
- proto.isValid = isValid$2;
- proto.lang = lang;
- proto.locale = locale;
- proto.localeData = localeData;
- proto.max = prototypeMax;
- proto.min = prototypeMin;
- proto.parsingFlags = parsingFlags;
- proto.set = stringSet;
- proto.startOf = startOf;
- proto.subtract = subtract;
- proto.toArray = toArray;
- proto.toObject = toObject;
- proto.toDate = toDate;
- proto.toISOString = toISOString;
- proto.inspect = inspect;
- proto.toJSON = toJSON;
- proto.toString = toString;
- proto.unix = unix;
- proto.valueOf = valueOf;
- proto.creationData = creationData;
- proto.year = getSetYear;
- proto.isLeapYear = getIsLeapYear;
- proto.weekYear = getSetWeekYear;
- proto.isoWeekYear = getSetISOWeekYear;
- proto.quarter = proto.quarters = getSetQuarter;
- proto.month = getSetMonth;
- proto.daysInMonth = getDaysInMonth;
- proto.week = proto.weeks = getSetWeek;
- proto.isoWeek = proto.isoWeeks = getSetISOWeek;
- proto.weeksInYear = getWeeksInYear;
- proto.isoWeeksInYear = getISOWeeksInYear;
- proto.date = getSetDayOfMonth;
- proto.day = proto.days = getSetDayOfWeek;
- proto.weekday = getSetLocaleDayOfWeek;
- proto.isoWeekday = getSetISODayOfWeek;
- proto.dayOfYear = getSetDayOfYear;
- proto.hour = proto.hours = getSetHour;
- proto.minute = proto.minutes = getSetMinute;
- proto.second = proto.seconds = getSetSecond;
- proto.millisecond = proto.milliseconds = getSetMillisecond;
- proto.utcOffset = getSetOffset;
- proto.utc = setOffsetToUTC;
- proto.local = setOffsetToLocal;
- proto.parseZone = setOffsetToParsedOffset;
- proto.hasAlignedHourOffset = hasAlignedHourOffset;
- proto.isDST = isDaylightSavingTime;
- proto.isLocal = isLocal;
- proto.isUtcOffset = isUtcOffset;
- proto.isUtc = isUtc;
- proto.isUTC = isUtc;
- proto.zoneAbbr = getZoneAbbr;
- proto.zoneName = getZoneName;
- proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);
- proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);
- proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear);
- proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);
- proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);
- function createUnix (input) {
- return createLocal(input * 1000);
- }
- function createInZone () {
- return createLocal.apply(null, arguments).parseZone();
- }
- function preParsePostFormat (string) {
- return string;
- }
- var proto$1 = Locale.prototype;
- proto$1.calendar = calendar;
- proto$1.longDateFormat = longDateFormat;
- proto$1.invalidDate = invalidDate;
- proto$1.ordinal = ordinal;
- proto$1.preparse = preParsePostFormat;
- proto$1.postformat = preParsePostFormat;
- proto$1.relativeTime = relativeTime;
- proto$1.pastFuture = pastFuture;
- proto$1.set = set;
- proto$1.months = localeMonths;
- proto$1.monthsShort = localeMonthsShort;
- proto$1.monthsParse = localeMonthsParse;
- proto$1.monthsRegex = monthsRegex;
- proto$1.monthsShortRegex = monthsShortRegex;
- proto$1.week = localeWeek;
- proto$1.firstDayOfYear = localeFirstDayOfYear;
- proto$1.firstDayOfWeek = localeFirstDayOfWeek;
- proto$1.weekdays = localeWeekdays;
- proto$1.weekdaysMin = localeWeekdaysMin;
- proto$1.weekdaysShort = localeWeekdaysShort;
- proto$1.weekdaysParse = localeWeekdaysParse;
- proto$1.weekdaysRegex = weekdaysRegex;
- proto$1.weekdaysShortRegex = weekdaysShortRegex;
- proto$1.weekdaysMinRegex = weekdaysMinRegex;
- proto$1.isPM = localeIsPM;
- proto$1.meridiem = localeMeridiem;
- function get$1 (format, index, field, setter) {
- var locale = getLocale();
- var utc = createUTC().set(setter, index);
- return locale[field](utc, format);
- }
- function listMonthsImpl (format, index, field) {
- if (isNumber(format)) {
- index = format;
- format = undefined;
- }
- format = format || '';
- if (index != null) {
- return get$1(format, index, field, 'month');
- }
- var i;
- var out = [];
- for (i = 0; i < 12; i++) {
- out[i] = get$1(format, i, field, 'month');
- }
- return out;
- }
- // ()
- // (5)
- // (fmt, 5)
- // (fmt)
- // (true)
- // (true, 5)
- // (true, fmt, 5)
- // (true, fmt)
- function listWeekdaysImpl (localeSorted, format, index, field) {
- if (typeof localeSorted === 'boolean') {
- if (isNumber(format)) {
- index = format;
- format = undefined;
- }
- format = format || '';
- } else {
- format = localeSorted;
- index = format;
- localeSorted = false;
- if (isNumber(format)) {
- index = format;
- format = undefined;
- }
- format = format || '';
- }
- var locale = getLocale(),
- shift = localeSorted ? locale._week.dow : 0;
- if (index != null) {
- return get$1(format, (index + shift) % 7, field, 'day');
- }
- var i;
- var out = [];
- for (i = 0; i < 7; i++) {
- out[i] = get$1(format, (i + shift) % 7, field, 'day');
- }
- return out;
- }
- function listMonths (format, index) {
- return listMonthsImpl(format, index, 'months');
- }
- function listMonthsShort (format, index) {
- return listMonthsImpl(format, index, 'monthsShort');
- }
- function listWeekdays (localeSorted, format, index) {
- return listWeekdaysImpl(localeSorted, format, index, 'weekdays');
- }
- function listWeekdaysShort (localeSorted, format, index) {
- return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');
- }
- function listWeekdaysMin (localeSorted, format, index) {
- return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');
- }
- getSetGlobalLocale('en', {
- dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/,
- ordinal : function (number) {
- var b = number % 10,
- output = (toInt(number % 100 / 10) === 1) ? 'th' :
- (b === 1) ? 'st' :
- (b === 2) ? 'nd' :
- (b === 3) ? 'rd' : 'th';
- return number + output;
- }
- });
-
- hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);
- hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);
- var mathAbs = Math.abs;
- function abs () {
- var data = this._data;
- this._milliseconds = mathAbs(this._milliseconds);
- this._days = mathAbs(this._days);
- this._months = mathAbs(this._months);
- data.milliseconds = mathAbs(data.milliseconds);
- data.seconds = mathAbs(data.seconds);
- data.minutes = mathAbs(data.minutes);
- data.hours = mathAbs(data.hours);
- data.months = mathAbs(data.months);
- data.years = mathAbs(data.years);
- return this;
- }
- function addSubtract$1 (duration, input, value, direction) {
- var other = createDuration(input, value);
- duration._milliseconds += direction * other._milliseconds;
- duration._days += direction * other._days;
- duration._months += direction * other._months;
- return duration._bubble();
- }
-
- function add$1 (input, value) {
- return addSubtract$1(this, input, value, 1);
- }
-
- function subtract$1 (input, value) {
- return addSubtract$1(this, input, value, -1);
- }
- function absCeil (number) {
- if (number < 0) {
- return Math.floor(number);
- } else {
- return Math.ceil(number);
- }
- }
- function bubble () {
- var milliseconds = this._milliseconds;
- var days = this._days;
- var months = this._months;
- var data = this._data;
- var seconds, minutes, hours, years, monthsFromDays;
-
-
- if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||
- (milliseconds <= 0 && days <= 0 && months <= 0))) {
- milliseconds += absCeil(monthsToDays(months) + days) * 864e5;
- days = 0;
- months = 0;
- }
-
-
- data.milliseconds = milliseconds % 1000;
- seconds = absFloor(milliseconds / 1000);
- data.seconds = seconds % 60;
- minutes = absFloor(seconds / 60);
- data.minutes = minutes % 60;
- hours = absFloor(minutes / 60);
- data.hours = hours % 24;
- days += absFloor(hours / 24);
-
- monthsFromDays = absFloor(daysToMonths(days));
- months += monthsFromDays;
- days -= absCeil(monthsToDays(monthsFromDays));
-
- years = absFloor(months / 12);
- months %= 12;
- data.days = days;
- data.months = months;
- data.years = years;
- return this;
- }
- function daysToMonths (days) {
-
-
- return days * 4800 / 146097;
- }
- function monthsToDays (months) {
-
- return months * 146097 / 4800;
- }
- function as (units) {
- if (!this.isValid()) {
- return NaN;
- }
- var days;
- var months;
- var milliseconds = this._milliseconds;
- units = normalizeUnits(units);
- if (units === 'month' || units === 'quarter' || units === 'year') {
- days = this._days + milliseconds / 864e5;
- months = this._months + daysToMonths(days);
- switch (units) {
- case 'month': return months;
- case 'quarter': return months / 3;
- case 'year': return months / 12;
- }
- } else {
-
- days = this._days + Math.round(monthsToDays(this._months));
- switch (units) {
- case 'week' : return days / 7 + milliseconds / 6048e5;
- case 'day' : return days + milliseconds / 864e5;
- case 'hour' : return days * 24 + milliseconds / 36e5;
- case 'minute' : return days * 1440 + milliseconds / 6e4;
- case 'second' : return days * 86400 + milliseconds / 1000;
-
- case 'millisecond': return Math.floor(days * 864e5) + milliseconds;
- default: throw new Error('Unknown unit ' + units);
- }
- }
- }
-
- function valueOf$1 () {
- if (!this.isValid()) {
- return NaN;
- }
- return (
- this._milliseconds +
- this._days * 864e5 +
- (this._months % 12) * 2592e6 +
- toInt(this._months / 12) * 31536e6
- );
- }
- function makeAs (alias) {
- return function () {
- return this.as(alias);
- };
- }
- var asMilliseconds = makeAs('ms');
- var asSeconds = makeAs('s');
- var asMinutes = makeAs('m');
- var asHours = makeAs('h');
- var asDays = makeAs('d');
- var asWeeks = makeAs('w');
- var asMonths = makeAs('M');
- var asQuarters = makeAs('Q');
- var asYears = makeAs('y');
- function clone$1 () {
- return createDuration(this);
- }
- function get$2 (units) {
- units = normalizeUnits(units);
- return this.isValid() ? this[units + 's']() : NaN;
- }
- function makeGetter(name) {
- return function () {
- return this.isValid() ? this._data[name] : NaN;
- };
- }
- var milliseconds = makeGetter('milliseconds');
- var seconds = makeGetter('seconds');
- var minutes = makeGetter('minutes');
- var hours = makeGetter('hours');
- var days = makeGetter('days');
- var months = makeGetter('months');
- var years = makeGetter('years');
- function weeks () {
- return absFloor(this.days() / 7);
- }
- var round = Math.round;
- var thresholds = {
- ss: 44,
- s : 45,
- m : 45,
- h : 22,
- d : 26,
- M : 11
- };
-
- function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
- return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
- }
- function relativeTime$1 (posNegDuration, withoutSuffix, locale) {
- var duration = createDuration(posNegDuration).abs();
- var seconds = round(duration.as('s'));
- var minutes = round(duration.as('m'));
- var hours = round(duration.as('h'));
- var days = round(duration.as('d'));
- var months = round(duration.as('M'));
- var years = round(duration.as('y'));
- var a = seconds <= thresholds.ss && ['s', seconds] ||
- seconds < thresholds.s && ['ss', seconds] ||
- minutes <= 1 && ['m'] ||
- minutes < thresholds.m && ['mm', minutes] ||
- hours <= 1 && ['h'] ||
- hours < thresholds.h && ['hh', hours] ||
- days <= 1 && ['d'] ||
- days < thresholds.d && ['dd', days] ||
- months <= 1 && ['M'] ||
- months < thresholds.M && ['MM', months] ||
- years <= 1 && ['y'] || ['yy', years];
- a[2] = withoutSuffix;
- a[3] = +posNegDuration > 0;
- a[4] = locale;
- return substituteTimeAgo.apply(null, a);
- }
-
- function getSetRelativeTimeRounding (roundingFunction) {
- if (roundingFunction === undefined) {
- return round;
- }
- if (typeof(roundingFunction) === 'function') {
- round = roundingFunction;
- return true;
- }
- return false;
- }
-
- function getSetRelativeTimeThreshold (threshold, limit) {
- if (thresholds[threshold] === undefined) {
- return false;
- }
- if (limit === undefined) {
- return thresholds[threshold];
- }
- thresholds[threshold] = limit;
- if (threshold === 's') {
- thresholds.ss = limit - 1;
- }
- return true;
- }
- function humanize (withSuffix) {
- if (!this.isValid()) {
- return this.localeData().invalidDate();
- }
- var locale = this.localeData();
- var output = relativeTime$1(this, !withSuffix, locale);
- if (withSuffix) {
- output = locale.pastFuture(+this, output);
- }
- return locale.postformat(output);
- }
- var abs$1 = Math.abs;
- function sign(x) {
- return ((x > 0) - (x < 0)) || +x;
- }
- function toISOString$1() {
-
-
-
-
-
-
-
- if (!this.isValid()) {
- return this.localeData().invalidDate();
- }
- var seconds = abs$1(this._milliseconds) / 1000;
- var days = abs$1(this._days);
- var months = abs$1(this._months);
- var minutes, hours, years;
-
- minutes = absFloor(seconds / 60);
- hours = absFloor(minutes / 60);
- seconds %= 60;
- minutes %= 60;
-
- years = absFloor(months / 12);
- months %= 12;
-
- var Y = years;
- var M = months;
- var D = days;
- var h = hours;
- var m = minutes;
- var s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : '';
- var total = this.asSeconds();
- if (!total) {
-
-
- return 'P0D';
- }
- var totalSign = total < 0 ? '-' : '';
- var ymSign = sign(this._months) !== sign(total) ? '-' : '';
- var daysSign = sign(this._days) !== sign(total) ? '-' : '';
- var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';
- return totalSign + 'P' +
- (Y ? ymSign + Y + 'Y' : '') +
- (M ? ymSign + M + 'M' : '') +
- (D ? daysSign + D + 'D' : '') +
- ((h || m || s) ? 'T' : '') +
- (h ? hmsSign + h + 'H' : '') +
- (m ? hmsSign + m + 'M' : '') +
- (s ? hmsSign + s + 'S' : '');
- }
- var proto$2 = Duration.prototype;
- proto$2.isValid = isValid$1;
- proto$2.abs = abs;
- proto$2.add = add$1;
- proto$2.subtract = subtract$1;
- proto$2.as = as;
- proto$2.asMilliseconds = asMilliseconds;
- proto$2.asSeconds = asSeconds;
- proto$2.asMinutes = asMinutes;
- proto$2.asHours = asHours;
- proto$2.asDays = asDays;
- proto$2.asWeeks = asWeeks;
- proto$2.asMonths = asMonths;
- proto$2.asQuarters = asQuarters;
- proto$2.asYears = asYears;
- proto$2.valueOf = valueOf$1;
- proto$2._bubble = bubble;
- proto$2.clone = clone$1;
- proto$2.get = get$2;
- proto$2.milliseconds = milliseconds;
- proto$2.seconds = seconds;
- proto$2.minutes = minutes;
- proto$2.hours = hours;
- proto$2.days = days;
- proto$2.weeks = weeks;
- proto$2.months = months;
- proto$2.years = years;
- proto$2.humanize = humanize;
- proto$2.toISOString = toISOString$1;
- proto$2.toString = toISOString$1;
- proto$2.toJSON = toISOString$1;
- proto$2.locale = locale;
- proto$2.localeData = localeData;
- proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);
- proto$2.lang = lang;
- // Side effect imports
- // FORMATTING
- addFormatToken('X', 0, 0, 'unix');
- addFormatToken('x', 0, 0, 'valueOf');
- // PARSING
- addRegexToken('x', matchSigned);
- addRegexToken('X', matchTimestamp);
- addParseToken('X', function (input, array, config) {
- config._d = new Date(parseFloat(input, 10) * 1000);
- });
- addParseToken('x', function (input, array, config) {
- config._d = new Date(toInt(input));
- });
-
- hooks.version = '2.24.0';
- setHookCallback(createLocal);
- hooks.fn = proto;
- hooks.min = min;
- hooks.max = max;
- hooks.now = now;
- hooks.utc = createUTC;
- hooks.unix = createUnix;
- hooks.months = listMonths;
- hooks.isDate = isDate;
- hooks.locale = getSetGlobalLocale;
- hooks.invalid = createInvalid;
- hooks.duration = createDuration;
- hooks.isMoment = isMoment;
- hooks.weekdays = listWeekdays;
- hooks.parseZone = createInZone;
- hooks.localeData = getLocale;
- hooks.isDuration = isDuration;
- hooks.monthsShort = listMonthsShort;
- hooks.weekdaysMin = listWeekdaysMin;
- hooks.defineLocale = defineLocale;
- hooks.updateLocale = updateLocale;
- hooks.locales = listLocales;
- hooks.weekdaysShort = listWeekdaysShort;
- hooks.normalizeUnits = normalizeUnits;
- hooks.relativeTimeRounding = getSetRelativeTimeRounding;
- hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;
- hooks.calendarFormat = getCalendarFormat;
- hooks.prototype = proto;
-
- hooks.HTML5_FMT = {
- DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm',
- DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss',
- DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS',
- DATE: 'YYYY-MM-DD',
- TIME: 'HH:mm',
- TIME_SECONDS: 'HH:mm:ss',
- TIME_MS: 'HH:mm:ss.SSS',
- WEEK: 'GGGG-[W]WW',
- MONTH: 'YYYY-MM'
- };
- return hooks;
- })));
- });
- var FORMATS = {
- datetime: 'MMM D, YYYY, h:mm:ss a',
- millisecond: 'h:mm:ss.SSS a',
- second: 'h:mm:ss a',
- minute: 'h:mm a',
- hour: 'hA',
- day: 'MMM D',
- week: 'll',
- month: 'MMM YYYY',
- quarter: '[Q]Q - YYYY',
- year: 'YYYY'
- };
- core_adapters._date.override(typeof moment === 'function' ? {
- _id: 'moment',
- formats: function() {
- return FORMATS;
- },
- parse: function(value, format) {
- if (typeof value === 'string' && typeof format === 'string') {
- value = moment(value, format);
- } else if (!(value instanceof moment)) {
- value = moment(value);
- }
- return value.isValid() ? value.valueOf() : null;
- },
- format: function(time, format) {
- return moment(time).format(format);
- },
- add: function(time, amount, unit) {
- return moment(time).add(amount, unit).valueOf();
- },
- diff: function(max, min, unit) {
- return moment(max).diff(moment(min), unit);
- },
- startOf: function(time, unit, weekday) {
- time = moment(time);
- if (unit === 'isoWeek') {
- return time.isoWeekday(weekday).valueOf();
- }
- return time.startOf(unit).valueOf();
- },
- endOf: function(time, unit) {
- return moment(time).endOf(unit).valueOf();
- },
-
-
- _create: function(time) {
- return moment(time);
- },
- } : {});
- core_defaults._set('global', {
- plugins: {
- filler: {
- propagate: true
- }
- }
- });
- var mappers = {
- dataset: function(source) {
- var index = source.fill;
- var chart = source.chart;
- var meta = chart.getDatasetMeta(index);
- var visible = meta && chart.isDatasetVisible(index);
- var points = (visible && meta.dataset._children) || [];
- var length = points.length || 0;
- return !length ? null : function(point, i) {
- return (i < length && points[i]._view) || null;
- };
- },
- boundary: function(source) {
- var boundary = source.boundary;
- var x = boundary ? boundary.x : null;
- var y = boundary ? boundary.y : null;
- if (helpers$1.isArray(boundary)) {
- return function(point, i) {
- return boundary[i];
- };
- }
- return function(point) {
- return {
- x: x === null ? point.x : x,
- y: y === null ? point.y : y,
- };
- };
- }
- };
- function decodeFill(el, index, count) {
- var model = el._model || {};
- var fill = model.fill;
- var target;
- if (fill === undefined) {
- fill = !!model.backgroundColor;
- }
- if (fill === false || fill === null) {
- return false;
- }
- if (fill === true) {
- return 'origin';
- }
- target = parseFloat(fill, 10);
- if (isFinite(target) && Math.floor(target) === target) {
- if (fill[0] === '-' || fill[0] === '+') {
- target = index + target;
- }
- if (target === index || target < 0 || target >= count) {
- return false;
- }
- return target;
- }
- switch (fill) {
-
- case 'bottom':
- return 'start';
- case 'top':
- return 'end';
- case 'zero':
- return 'origin';
-
- case 'origin':
- case 'start':
- case 'end':
- return fill;
-
- default:
- return false;
- }
- }
- function computeLinearBoundary(source) {
- var model = source.el._model || {};
- var scale = source.el._scale || {};
- var fill = source.fill;
- var target = null;
- var horizontal;
- if (isFinite(fill)) {
- return null;
- }
-
-
-
- if (fill === 'start') {
- target = model.scaleBottom === undefined ? scale.bottom : model.scaleBottom;
- } else if (fill === 'end') {
- target = model.scaleTop === undefined ? scale.top : model.scaleTop;
- } else if (model.scaleZero !== undefined) {
- target = model.scaleZero;
- } else if (scale.getBasePixel) {
- target = scale.getBasePixel();
- }
- if (target !== undefined && target !== null) {
- if (target.x !== undefined && target.y !== undefined) {
- return target;
- }
- if (helpers$1.isFinite(target)) {
- horizontal = scale.isHorizontal();
- return {
- x: horizontal ? target : null,
- y: horizontal ? null : target
- };
- }
- }
- return null;
- }
- function computeCircularBoundary(source) {
- var scale = source.el._scale;
- var options = scale.options;
- var length = scale.chart.data.labels.length;
- var fill = source.fill;
- var target = [];
- var start, end, center, i, point;
- if (!length) {
- return null;
- }
- start = options.ticks.reverse ? scale.max : scale.min;
- end = options.ticks.reverse ? scale.min : scale.max;
- center = scale.getPointPositionForValue(0, start);
- for (i = 0; i < length; ++i) {
- point = fill === 'start' || fill === 'end'
- ? scale.getPointPositionForValue(i, fill === 'start' ? start : end)
- : scale.getBasePosition(i);
- if (options.gridLines.circular) {
- point.cx = center.x;
- point.cy = center.y;
- point.angle = scale.getIndexAngle(i) - Math.PI / 2;
- }
- target.push(point);
- }
- return target;
- }
- function computeBoundary(source) {
- var scale = source.el._scale || {};
- if (scale.getPointPositionForValue) {
- return computeCircularBoundary(source);
- }
- return computeLinearBoundary(source);
- }
- function resolveTarget(sources, index, propagate) {
- var source = sources[index];
- var fill = source.fill;
- var visited = [index];
- var target;
- if (!propagate) {
- return fill;
- }
- while (fill !== false && visited.indexOf(fill) === -1) {
- if (!isFinite(fill)) {
- return fill;
- }
- target = sources[fill];
- if (!target) {
- return false;
- }
- if (target.visible) {
- return fill;
- }
- visited.push(fill);
- fill = target.fill;
- }
- return false;
- }
- function createMapper(source) {
- var fill = source.fill;
- var type = 'dataset';
- if (fill === false) {
- return null;
- }
- if (!isFinite(fill)) {
- type = 'boundary';
- }
- return mappers[type](source);
- }
- function isDrawable(point) {
- return point && !point.skip;
- }
- function drawArea(ctx, curve0, curve1, len0, len1) {
- var i, cx, cy, r;
- if (!len0 || !len1) {
- return;
- }
-
- ctx.moveTo(curve0[0].x, curve0[0].y);
- for (i = 1; i < len0; ++i) {
- helpers$1.canvas.lineTo(ctx, curve0[i - 1], curve0[i]);
- }
- if (curve1[0].angle !== undefined) {
- cx = curve1[0].cx;
- cy = curve1[0].cy;
- r = Math.sqrt(Math.pow(curve1[0].x - cx, 2) + Math.pow(curve1[0].y - cy, 2));
- for (i = len1 - 1; i > 0; --i) {
- ctx.arc(cx, cy, r, curve1[i].angle, curve1[i - 1].angle, true);
- }
- return;
- }
-
- ctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y);
-
- for (i = len1 - 1; i > 0; --i) {
- helpers$1.canvas.lineTo(ctx, curve1[i], curve1[i - 1], true);
- }
- }
- function doFill(ctx, points, mapper, view, color, loop) {
- var count = points.length;
- var span = view.spanGaps;
- var curve0 = [];
- var curve1 = [];
- var len0 = 0;
- var len1 = 0;
- var i, ilen, index, p0, p1, d0, d1, loopOffset;
- ctx.beginPath();
- for (i = 0, ilen = count; i < ilen; ++i) {
- index = i % count;
- p0 = points[index]._view;
- p1 = mapper(p0, index, view);
- d0 = isDrawable(p0);
- d1 = isDrawable(p1);
- if (loop && loopOffset === undefined && d0) {
- loopOffset = i + 1;
- ilen = count + loopOffset;
- }
- if (d0 && d1) {
- len0 = curve0.push(p0);
- len1 = curve1.push(p1);
- } else if (len0 && len1) {
- if (!span) {
- drawArea(ctx, curve0, curve1, len0, len1);
- len0 = len1 = 0;
- curve0 = [];
- curve1 = [];
- } else {
- if (d0) {
- curve0.push(p0);
- }
- if (d1) {
- curve1.push(p1);
- }
- }
- }
- }
- drawArea(ctx, curve0, curve1, len0, len1);
- ctx.closePath();
- ctx.fillStyle = color;
- ctx.fill();
- }
- var plugin_filler = {
- id: 'filler',
- afterDatasetsUpdate: function(chart, options) {
- var count = (chart.data.datasets || []).length;
- var propagate = options.propagate;
- var sources = [];
- var meta, i, el, source;
- for (i = 0; i < count; ++i) {
- meta = chart.getDatasetMeta(i);
- el = meta.dataset;
- source = null;
- if (el && el._model && el instanceof elements.Line) {
- source = {
- visible: chart.isDatasetVisible(i),
- fill: decodeFill(el, i, count),
- chart: chart,
- el: el
- };
- }
- meta.$filler = source;
- sources.push(source);
- }
- for (i = 0; i < count; ++i) {
- source = sources[i];
- if (!source) {
- continue;
- }
- source.fill = resolveTarget(sources, i, propagate);
- source.boundary = computeBoundary(source);
- source.mapper = createMapper(source);
- }
- },
- beforeDatasetsDraw: function(chart) {
- var metasets = chart._getSortedVisibleDatasetMetas();
- var ctx = chart.ctx;
- var meta, i, el, view, points, mapper, color;
- for (i = metasets.length - 1; i >= 0; --i) {
- meta = metasets[i].$filler;
- if (!meta || !meta.visible) {
- continue;
- }
- el = meta.el;
- view = el._view;
- points = el._children || [];
- mapper = meta.mapper;
- color = view.backgroundColor || core_defaults.global.defaultColor;
- if (mapper && color && points.length) {
- helpers$1.canvas.clipArea(ctx, chart.chartArea);
- doFill(ctx, points, mapper, view, color, el._loop);
- helpers$1.canvas.unclipArea(ctx);
- }
- }
- }
- };
- var getRtlHelper$1 = helpers$1.rtl.getRtlAdapter;
- var noop$1 = helpers$1.noop;
- var valueOrDefault$e = helpers$1.valueOrDefault;
- core_defaults._set('global', {
- legend: {
- display: true,
- position: 'top',
- align: 'center',
- fullWidth: true,
- reverse: false,
- weight: 1000,
-
- onClick: function(e, legendItem) {
- var index = legendItem.datasetIndex;
- var ci = this.chart;
- var meta = ci.getDatasetMeta(index);
-
- meta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null;
-
- ci.update();
- },
- onHover: null,
- onLeave: null,
- labels: {
- boxWidth: 40,
- padding: 10,
-
-
-
-
-
-
-
-
-
-
-
- generateLabels: function(chart) {
- var datasets = chart.data.datasets;
- var options = chart.options.legend || {};
- var usePointStyle = options.labels && options.labels.usePointStyle;
- return chart._getSortedDatasetMetas().map(function(meta) {
- var style = meta.controller.getStyle(usePointStyle ? 0 : undefined);
- return {
- text: datasets[meta.index].label,
- fillStyle: style.backgroundColor,
- hidden: !chart.isDatasetVisible(meta.index),
- lineCap: style.borderCapStyle,
- lineDash: style.borderDash,
- lineDashOffset: style.borderDashOffset,
- lineJoin: style.borderJoinStyle,
- lineWidth: style.borderWidth,
- strokeStyle: style.borderColor,
- pointStyle: style.pointStyle,
- rotation: style.rotation,
-
- datasetIndex: meta.index
- };
- }, this);
- }
- }
- },
- legendCallback: function(chart) {
- var list = document.createElement('ul');
- var datasets = chart.data.datasets;
- var i, ilen, listItem, listItemSpan;
- list.setAttribute('class', chart.id + '-legend');
- for (i = 0, ilen = datasets.length; i < ilen; i++) {
- listItem = list.appendChild(document.createElement('li'));
- listItemSpan = listItem.appendChild(document.createElement('span'));
- listItemSpan.style.backgroundColor = datasets[i].backgroundColor;
- if (datasets[i].label) {
- listItem.appendChild(document.createTextNode(datasets[i].label));
- }
- }
- return list.outerHTML;
- }
- });
- function getBoxWidth(labelOpts, fontSize) {
- return labelOpts.usePointStyle && labelOpts.boxWidth > fontSize ?
- fontSize :
- labelOpts.boxWidth;
- }
- var Legend = core_element.extend({
- initialize: function(config) {
- var me = this;
- helpers$1.extend(me, config);
-
- me.legendHitBoxes = [];
-
- me._hoveredItem = null;
-
- me.doughnutMode = false;
- },
-
-
-
- beforeUpdate: noop$1,
- update: function(maxWidth, maxHeight, margins) {
- var me = this;
-
- me.beforeUpdate();
-
- me.maxWidth = maxWidth;
- me.maxHeight = maxHeight;
- me.margins = margins;
-
- me.beforeSetDimensions();
- me.setDimensions();
- me.afterSetDimensions();
-
- me.beforeBuildLabels();
- me.buildLabels();
- me.afterBuildLabels();
-
- me.beforeFit();
- me.fit();
- me.afterFit();
-
- me.afterUpdate();
- return me.minSize;
- },
- afterUpdate: noop$1,
-
- beforeSetDimensions: noop$1,
- setDimensions: function() {
- var me = this;
-
- if (me.isHorizontal()) {
-
- me.width = me.maxWidth;
- me.left = 0;
- me.right = me.width;
- } else {
- me.height = me.maxHeight;
-
- me.top = 0;
- me.bottom = me.height;
- }
-
- me.paddingLeft = 0;
- me.paddingTop = 0;
- me.paddingRight = 0;
- me.paddingBottom = 0;
-
- me.minSize = {
- width: 0,
- height: 0
- };
- },
- afterSetDimensions: noop$1,
-
- beforeBuildLabels: noop$1,
- buildLabels: function() {
- var me = this;
- var labelOpts = me.options.labels || {};
- var legendItems = helpers$1.callback(labelOpts.generateLabels, [me.chart], me) || [];
- if (labelOpts.filter) {
- legendItems = legendItems.filter(function(item) {
- return labelOpts.filter(item, me.chart.data);
- });
- }
- if (me.options.reverse) {
- legendItems.reverse();
- }
- me.legendItems = legendItems;
- },
- afterBuildLabels: noop$1,
-
- beforeFit: noop$1,
- fit: function() {
- var me = this;
- var opts = me.options;
- var labelOpts = opts.labels;
- var display = opts.display;
- var ctx = me.ctx;
- var labelFont = helpers$1.options._parseFont(labelOpts);
- var fontSize = labelFont.size;
-
- var hitboxes = me.legendHitBoxes = [];
- var minSize = me.minSize;
- var isHorizontal = me.isHorizontal();
- if (isHorizontal) {
- minSize.width = me.maxWidth;
- minSize.height = display ? 10 : 0;
- } else {
- minSize.width = display ? 10 : 0;
- minSize.height = me.maxHeight;
- }
-
- if (!display) {
- me.width = minSize.width = me.height = minSize.height = 0;
- return;
- }
- ctx.font = labelFont.string;
- if (isHorizontal) {
-
-
- var lineWidths = me.lineWidths = [0];
- var totalHeight = 0;
- ctx.textAlign = 'left';
- ctx.textBaseline = 'middle';
- helpers$1.each(me.legendItems, function(legendItem, i) {
- var boxWidth = getBoxWidth(labelOpts, fontSize);
- var width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;
- if (i === 0 || lineWidths[lineWidths.length - 1] + width + 2 * labelOpts.padding > minSize.width) {
- totalHeight += fontSize + labelOpts.padding;
- lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;
- }
-
- hitboxes[i] = {
- left: 0,
- top: 0,
- width: width,
- height: fontSize
- };
- lineWidths[lineWidths.length - 1] += width + labelOpts.padding;
- });
- minSize.height += totalHeight;
- } else {
- var vPadding = labelOpts.padding;
- var columnWidths = me.columnWidths = [];
- var columnHeights = me.columnHeights = [];
- var totalWidth = labelOpts.padding;
- var currentColWidth = 0;
- var currentColHeight = 0;
- helpers$1.each(me.legendItems, function(legendItem, i) {
- var boxWidth = getBoxWidth(labelOpts, fontSize);
- var itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;
-
- if (i > 0 && currentColHeight + fontSize + 2 * vPadding > minSize.height) {
- totalWidth += currentColWidth + labelOpts.padding;
- columnWidths.push(currentColWidth);
- columnHeights.push(currentColHeight);
- currentColWidth = 0;
- currentColHeight = 0;
- }
-
- currentColWidth = Math.max(currentColWidth, itemWidth);
- currentColHeight += fontSize + vPadding;
-
- hitboxes[i] = {
- left: 0,
- top: 0,
- width: itemWidth,
- height: fontSize
- };
- });
- totalWidth += currentColWidth;
- columnWidths.push(currentColWidth);
- columnHeights.push(currentColHeight);
- minSize.width += totalWidth;
- }
- me.width = minSize.width;
- me.height = minSize.height;
- },
- afterFit: noop$1,
-
- isHorizontal: function() {
- return this.options.position === 'top' || this.options.position === 'bottom';
- },
-
- draw: function() {
- var me = this;
- var opts = me.options;
- var labelOpts = opts.labels;
- var globalDefaults = core_defaults.global;
- var defaultColor = globalDefaults.defaultColor;
- var lineDefault = globalDefaults.elements.line;
- var legendHeight = me.height;
- var columnHeights = me.columnHeights;
- var legendWidth = me.width;
- var lineWidths = me.lineWidths;
- if (!opts.display) {
- return;
- }
- var rtlHelper = getRtlHelper$1(opts.rtl, me.left, me.minSize.width);
- var ctx = me.ctx;
- var fontColor = valueOrDefault$e(labelOpts.fontColor, globalDefaults.defaultFontColor);
- var labelFont = helpers$1.options._parseFont(labelOpts);
- var fontSize = labelFont.size;
- var cursor;
-
- ctx.textAlign = rtlHelper.textAlign('left');
- ctx.textBaseline = 'middle';
- ctx.lineWidth = 0.5;
- ctx.strokeStyle = fontColor;
- ctx.fillStyle = fontColor;
- ctx.font = labelFont.string;
- var boxWidth = getBoxWidth(labelOpts, fontSize);
- var hitboxes = me.legendHitBoxes;
- var labelFontSize = 16;
-
- var drawLegendBox = function(x, y, legendItem) {
- if (isNaN(boxWidth) || boxWidth <= 0) {
- return;
- }
-
- ctx.save();
- var lineWidth = valueOrDefault$e(legendItem.lineWidth, lineDefault.borderWidth);
- ctx.fillStyle = valueOrDefault$e(legendItem.fillStyle, defaultColor);
- ctx.lineCap = valueOrDefault$e(legendItem.lineCap, lineDefault.borderCapStyle);
- ctx.lineDashOffset = valueOrDefault$e(legendItem.lineDashOffset, lineDefault.borderDashOffset);
- ctx.lineJoin = valueOrDefault$e(legendItem.lineJoin, lineDefault.borderJoinStyle);
- ctx.lineWidth = lineWidth;
- ctx.strokeStyle = valueOrDefault$e(legendItem.strokeStyle, defaultColor);
- if (ctx.setLineDash) {
-
- ctx.setLineDash(valueOrDefault$e(legendItem.lineDash, lineDefault.borderDash));
- }
-
- if (true) {
-
-
- boxWidth = labelFontSize - 5;
- var radius = boxWidth * Math.SQRT2 / 2;
- var centerX = rtlHelper.xPlus(x, boxWidth / 2);
- var centerY = y + fontSize / 2;
-
- helpers$1.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY, legendItem.rotation);
- } else {
-
- ctx.fillRect(rtlHelper.leftForLtr(x, boxWidth), y, boxWidth, fontSize);
- if (lineWidth !== 0) {
- ctx.strokeRect(rtlHelper.leftForLtr(x, boxWidth), y, boxWidth, fontSize);
- }
- }
- ctx.restore();
- };
- var fillText = function(x, y, legendItem, textWidth) {
- var halfFontSize = labelFontSize / 2;
- var xLeft = rtlHelper.xPlus(x, boxWidth + halfFontSize);
- var yMiddle = y + halfFontSize;
- let font_ = ctx.font
- ctx.font = ctx.font.replace(/12px/g, labelFontSize + "px")
- ctx.fillText(legendItem.text, xLeft, yMiddle);
- ctx.font = font_
- if (legendItem.hidden) {
-
- ctx.beginPath();
- ctx.lineWidth = 2;
- ctx.moveTo(xLeft, yMiddle);
- ctx.lineTo(rtlHelper.xPlus(xLeft, textWidth), yMiddle);
- ctx.stroke();
- }
- };
- var alignmentOffset = function(dimension, blockSize) {
- switch (opts.align) {
- case 'start':
- return labelOpts.padding;
- case 'end':
- return dimension - blockSize;
- default:
- return (dimension - blockSize + labelOpts.padding) / 2;
- }
- };
-
- var isHorizontal = me.isHorizontal();
- if (isHorizontal) {
- cursor = {
- x: me.left + alignmentOffset(legendWidth, lineWidths[0]),
- y: me.top + labelOpts.padding,
- line: 0
- };
- } else {
- cursor = {
- x: me.left + labelOpts.padding,
- y: me.top + alignmentOffset(legendHeight, columnHeights[0]),
- line: 0
- };
- }
- helpers$1.rtl.overrideTextDirection(me.ctx, opts.textDirection);
- var itemHeight = fontSize + labelOpts.padding;
- helpers$1.each(me.legendItems, function(legendItem, i) {
- let font_ = ctx.font
- ctx.font = ctx.font.replace(/12px/g, labelFontSize + "px")
- var textWidth = ctx.measureText(legendItem.text).width;
- ctx.font = font_
- var width = boxWidth + (fontSize / 2) + textWidth;
- var x = cursor.x;
- var y = cursor.y;
- rtlHelper.setWidth(me.minSize.width);
-
-
-
- if (isHorizontal) {
- if (i > 0 && x + width + labelOpts.padding > me.left + me.minSize.width) {
- y = cursor.y += itemHeight;
- cursor.line++;
- x = cursor.x = me.left + alignmentOffset(legendWidth, lineWidths[cursor.line]);
- }
- } else if (i > 0 && y + itemHeight > me.top + me.minSize.height) {
- x = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding;
- cursor.line++;
- y = cursor.y = me.top + alignmentOffset(legendHeight, columnHeights[cursor.line]);
- }
- if (i === 0)
- x += 28
- var realX = rtlHelper.x(x);
- drawLegendBox(realX, y, legendItem);
- hitboxes[i].left = rtlHelper.leftForLtr(realX, hitboxes[i].width);
- hitboxes[i].top = y;
-
- fillText(realX, y, legendItem, textWidth);
- if (isHorizontal) {
- cursor.x += width + labelOpts.padding;
- } else {
- cursor.y += itemHeight;
- }
- });
- helpers$1.rtl.restoreTextDirection(me.ctx, opts.textDirection);
- },
-
- _getLegendItemAt: function(x, y) {
- var me = this;
- var i, hitBox, lh;
- if (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) {
-
- lh = me.legendHitBoxes;
- for (i = 0; i < lh.length; ++i) {
- hitBox = lh[i];
- if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) {
-
- return me.legendItems[i];
- }
- }
- }
- return null;
- },
-
- handleEvent: function(e) {
- var me = this;
- var opts = me.options;
- var type = e.type === 'mouseup' ? 'click' : e.type;
- var hoveredItem;
- if (type === 'mousemove') {
- if (!opts.onHover && !opts.onLeave) {
- return;
- }
- } else if (type === 'click') {
- if (!opts.onClick) {
- return;
- }
- } else {
- return;
- }
-
- hoveredItem = me._getLegendItemAt(e.x, e.y);
- if (type === 'click') {
- if (hoveredItem && opts.onClick) {
-
- opts.onClick.call(me, e.native, hoveredItem);
- }
- } else {
- if (opts.onLeave && hoveredItem !== me._hoveredItem) {
- if (me._hoveredItem) {
- opts.onLeave.call(me, e.native, me._hoveredItem);
- }
- me._hoveredItem = hoveredItem;
- }
- if (opts.onHover && hoveredItem) {
-
- opts.onHover.call(me, e.native, hoveredItem);
- }
- }
- }
- });
- function createNewLegendAndAttach(chart, legendOpts) {
- var legend = new Legend({
- ctx: chart.ctx,
- options: legendOpts,
- chart: chart
- });
- core_layouts.configure(chart, legend, legendOpts);
- core_layouts.addBox(chart, legend);
- chart.legend = legend;
- }
- var plugin_legend = {
- id: 'legend',
-
- _element: Legend,
- beforeInit: function(chart) {
- var legendOpts = chart.options.legend;
- if (legendOpts) {
- createNewLegendAndAttach(chart, legendOpts);
- }
- },
- beforeUpdate: function(chart) {
- var legendOpts = chart.options.legend;
- var legend = chart.legend;
- if (legendOpts) {
- helpers$1.mergeIf(legendOpts, core_defaults.global.legend);
- if (legend) {
- core_layouts.configure(chart, legend, legendOpts);
- legend.options = legendOpts;
- } else {
- createNewLegendAndAttach(chart, legendOpts);
- }
- } else if (legend) {
- core_layouts.removeBox(chart, legend);
- delete chart.legend;
- }
- },
- afterEvent: function(chart, e) {
- var legend = chart.legend;
- if (legend) {
- legend.handleEvent(e);
- }
- }
- };
- var noop$2 = helpers$1.noop;
- core_defaults._set('global', {
- title: {
- display: false,
- fontStyle: 'bold',
- fullWidth: true,
- padding: 10,
- position: 'top',
- text: '',
- weight: 2000
- }
- });
- var Title = core_element.extend({
- initialize: function(config) {
- var me = this;
- helpers$1.extend(me, config);
-
- me.legendHitBoxes = [];
- },
-
- beforeUpdate: noop$2,
- update: function(maxWidth, maxHeight, margins) {
- var me = this;
-
- me.beforeUpdate();
-
- me.maxWidth = maxWidth;
- me.maxHeight = maxHeight;
- me.margins = margins;
-
- me.beforeSetDimensions();
- me.setDimensions();
- me.afterSetDimensions();
-
- me.beforeBuildLabels();
- me.buildLabels();
- me.afterBuildLabels();
-
- me.beforeFit();
- me.fit();
- me.afterFit();
-
- me.afterUpdate();
- return me.minSize;
- },
- afterUpdate: noop$2,
-
- beforeSetDimensions: noop$2,
- setDimensions: function() {
- var me = this;
-
- if (me.isHorizontal()) {
-
- me.width = me.maxWidth;
- me.left = 0;
- me.right = me.width;
- } else {
- me.height = me.maxHeight;
-
- me.top = 0;
- me.bottom = me.height;
- }
-
- me.paddingLeft = 0;
- me.paddingTop = 0;
- me.paddingRight = 0;
- me.paddingBottom = 0;
-
- me.minSize = {
- width: 0,
- height: 0
- };
- },
- afterSetDimensions: noop$2,
-
- beforeBuildLabels: noop$2,
- buildLabels: noop$2,
- afterBuildLabels: noop$2,
-
- beforeFit: noop$2,
- fit: function() {
- var me = this;
- var opts = me.options;
- var minSize = me.minSize = {};
- var isHorizontal = me.isHorizontal();
- var lineCount, textSize;
- if (!opts.display) {
- me.width = minSize.width = me.height = minSize.height = 0;
- return;
- }
- lineCount = helpers$1.isArray(opts.text) ? opts.text.length : 1;
- textSize = lineCount * helpers$1.options._parseFont(opts).lineHeight + opts.padding * 2;
- me.width = minSize.width = isHorizontal ? me.maxWidth : textSize;
- me.height = minSize.height = isHorizontal ? textSize : me.maxHeight;
- },
- afterFit: noop$2,
-
- isHorizontal: function() {
- var pos = this.options.position;
- return pos === 'top' || pos === 'bottom';
- },
-
- draw: function() {
- var me = this;
- var ctx = me.ctx;
- var opts = me.options;
- if (!opts.display) {
- return;
- }
- var fontOpts = helpers$1.options._parseFont(opts);
- var lineHeight = fontOpts.lineHeight;
- var offset = lineHeight / 2 + opts.padding;
- var rotation = 0;
- var top = me.top;
- var left = me.left;
- var bottom = me.bottom;
- var right = me.right;
- var maxWidth, titleX, titleY;
- ctx.fillStyle = helpers$1.valueOrDefault(opts.fontColor, core_defaults.global.defaultFontColor);
- ctx.font = fontOpts.string;
-
- if (me.isHorizontal()) {
- titleX = left + ((right - left) / 2);
- titleY = top + offset;
- maxWidth = right - left;
- } else {
- titleX = opts.position === 'left' ? left + offset : right - offset;
- titleY = top + ((bottom - top) / 2);
- maxWidth = bottom - top;
- rotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5);
- }
- ctx.save();
- ctx.translate(titleX, titleY);
- ctx.rotate(rotation);
- ctx.textAlign = 'center';
- ctx.textBaseline = 'middle';
- var text = opts.text;
- if (helpers$1.isArray(text)) {
- var y = 0;
- for (var i = 0; i < text.length; ++i) {
- ctx.fillText(text[i], 0, y, maxWidth);
- y += lineHeight;
- }
- } else {
- ctx.fillText(text, 0, 0, maxWidth);
- }
- ctx.restore();
- }
- });
- function createNewTitleBlockAndAttach(chart, titleOpts) {
- var title = new Title({
- ctx: chart.ctx,
- options: titleOpts,
- chart: chart
- });
- core_layouts.configure(chart, title, titleOpts);
- core_layouts.addBox(chart, title);
- chart.titleBlock = title;
- }
- var plugin_title = {
- id: 'title',
-
- _element: Title,
- beforeInit: function(chart) {
- var titleOpts = chart.options.title;
- if (titleOpts) {
- createNewTitleBlockAndAttach(chart, titleOpts);
- }
- },
- beforeUpdate: function(chart) {
- var titleOpts = chart.options.title;
- var titleBlock = chart.titleBlock;
- if (titleOpts) {
- helpers$1.mergeIf(titleOpts, core_defaults.global.title);
- if (titleBlock) {
- core_layouts.configure(chart, titleBlock, titleOpts);
- titleBlock.options = titleOpts;
- } else {
- createNewTitleBlockAndAttach(chart, titleOpts);
- }
- } else if (titleBlock) {
- core_layouts.removeBox(chart, titleBlock);
- delete chart.titleBlock;
- }
- }
- };
- var plugins = {};
- var filler = plugin_filler;
- var legend = plugin_legend;
- var title = plugin_title;
- plugins.filler = filler;
- plugins.legend = legend;
- plugins.title = title;
- core_controller.helpers = helpers$1;
- core_helpers();
- core_controller._adapters = core_adapters;
- core_controller.Animation = core_animation;
- core_controller.animationService = core_animations;
- core_controller.controllers = controllers;
- core_controller.DatasetController = core_datasetController;
- core_controller.defaults = core_defaults;
- core_controller.Element = core_element;
- core_controller.elements = elements;
- core_controller.Interaction = core_interaction;
- core_controller.layouts = core_layouts;
- core_controller.platform = platform;
- core_controller.plugins = core_plugins;
- core_controller.Scale = core_scale;
- core_controller.scaleService = core_scaleService;
- core_controller.Ticks = core_ticks;
- core_controller.Tooltip = core_tooltip;
- core_controller.helpers.each(scales, function(scale, type) {
- core_controller.scaleService.registerScaleType(type, scale, scale._defaults);
- });
- for (var k in plugins) {
- if (plugins.hasOwnProperty(k)) {
- core_controller.plugins.register(plugins[k]);
- }
- }
- core_controller.platform.initialize();
- var src = core_controller;
- if (typeof window !== 'undefined') {
- window.Chart = core_controller;
- }
- core_controller.Chart = core_controller;
- core_controller.Legend = plugins.legend._element;
- core_controller.Title = plugins.title._element;
- core_controller.pluginService = core_controller.plugins;
- core_controller.PluginBase = core_controller.Element.extend({});
- core_controller.canvasHelpers = core_controller.helpers.canvas;
- core_controller.layoutService = core_controller.layouts;
- core_controller.LinearScaleBase = scale_linearbase;
- core_controller.helpers.each(
- [
- 'Bar',
- 'Bubble',
- 'Doughnut',
- 'Line',
- 'PolarArea',
- 'Radar',
- 'Scatter'
- ],
- function(klass) {
- core_controller[klass] = function(ctx, cfg) {
- return new core_controller(ctx, core_controller.helpers.merge(cfg || {}, {
- type: klass.charAt(0).toLowerCase() + klass.slice(1)
- }));
- };
- }
- );
- return src;
- })));
|