| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662 | 
							- //! moment.js
 
- //! version : 2.29.1
 
- //! authors : Tim Wood, Iskren Chernev, Moment.js contributors
 
- //! license : MIT
 
- //! momentjs.com
 
- var hookCallback;
 
- function hooks() {
 
-     return hookCallback.apply(null, arguments);
 
- }
 
- // This is done to register the method called with moment()
 
- // without creating circular dependencies.
 
- function setHookCallback(callback) {
 
-     hookCallback = callback;
 
- }
 
- function isArray(input) {
 
-     return (
 
-         input instanceof Array ||
 
-         Object.prototype.toString.call(input) === '[object Array]'
 
-     );
 
- }
 
- function isObject(input) {
 
-     // IE8 will treat undefined and null as object if it wasn't for
 
-     // input != null
 
-     return (
 
-         input != null &&
 
-         Object.prototype.toString.call(input) === '[object Object]'
 
-     );
 
- }
 
- function hasOwnProp(a, b) {
 
-     return Object.prototype.hasOwnProperty.call(a, b);
 
- }
 
- function isObjectEmpty(obj) {
 
-     if (Object.getOwnPropertyNames) {
 
-         return Object.getOwnPropertyNames(obj).length === 0;
 
-     } else {
 
-         var k;
 
-         for (k in obj) {
 
-             if (hasOwnProp(obj, 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 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() {
 
-     // We need to deep clone this object.
 
-     return {
 
-         empty: false,
 
-         unusedTokens: [],
 
-         unusedInput: [],
 
-         overflow: -2,
 
-         charsLeftOver: 0,
 
-         nullInput: false,
 
-         invalidEra: null,
 
-         invalidMonth: null,
 
-         invalidFormat: false,
 
-         userInvalidated: false,
 
-         iso: false,
 
-         parsedDateParts: [],
 
-         era: null,
 
-         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),
 
-             len = t.length >>> 0,
 
-             i;
 
-         for (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),
 
-             parsedParts = some.call(flags.parsedDateParts, function (i) {
 
-                 return i != null;
 
-             }),
 
-             isNowValid =
 
-                 !isNaN(m._d.getTime()) &&
 
-                 flags.overflow < 0 &&
 
-                 !flags.empty &&
 
-                 !flags.invalidEra &&
 
-                 !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;
 
- }
 
- // Plugins that add properties should also add the key here (null value),
 
- // so we can properly clone ourselves.
 
- var momentProperties = (hooks.momentProperties = []),
 
-     updateInProgress = false;
 
- 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;
 
- }
 
- // Moment prototype object
 
- 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);
 
-     }
 
-     // Prevent infinite loop in case updateOffset creates new moment
 
-     // objects.
 
-     if (updateInProgress === false) {
 
-         updateInProgress = true;
 
-         hooks.updateOffset(this);
 
-         updateInProgress = false;
 
-     }
 
- }
 
- function isMoment(obj) {
 
-     return (
 
-         obj instanceof Moment || (obj != null && obj._isAMomentObject != null)
 
-     );
 
- }
 
- 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 = [],
 
-                 arg,
 
-                 i,
 
-                 key;
 
-             for (i = 0; i < arguments.length; i++) {
 
-                 arg = '';
 
-                 if (typeof arguments[i] === 'object') {
 
-                     arg += '\n[' + i + '] ';
 
-                     for (key in arguments[0]) {
 
-                         if (hasOwnProp(arguments[0], key)) {
 
-                             arg += key + ': ' + arguments[0][key] + ', ';
 
-                         }
 
-                     }
 
-                     arg = arg.slice(0, -2); // Remove trailing comma and space
 
-                 } 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 (
 
-         (typeof Function !== 'undefined' && input instanceof Function) ||
 
-         Object.prototype.toString.call(input) === '[object Function]'
 
-     );
 
- }
 
- function set(config) {
 
-     var prop, i;
 
-     for (i in config) {
 
-         if (hasOwnProp(config, i)) {
 
-             prop = config[i];
 
-             if (isFunction(prop)) {
 
-                 this[i] = prop;
 
-             } else {
 
-                 this['_' + i] = prop;
 
-             }
 
-         }
 
-     }
 
-     this._config = config;
 
-     // Lenient ordinal parsing accepts just a number in addition to
 
-     // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.
 
-     // TODO: Remove "ordinalParse" fallback in next major release.
 
-     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])
 
-         ) {
 
-             // make sure changes to properties don't modify parent config
 
-             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;
 
- }
 
- 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?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,
 
-     localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,
 
-     formatFunctions = {},
 
-     formatTokenFunctions = {};
 
- // token:    'M'
 
- // padded:   ['MM', 2]
 
- // ordinal:  'Mo'
 
- // callback: function () { this.month() + 1 }
 
- 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;
 
-     };
 
- }
 
- // format date using native date object
 
- 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 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
 
-         .match(formattingTokens)
 
-         .map(function (tok) {
 
-             if (
 
-                 tok === 'MMMM' ||
 
-                 tok === 'MM' ||
 
-                 tok === 'DD' ||
 
-                 tok === 'dddd'
 
-             ) {
 
-                 return tok.slice(1);
 
-             }
 
-             return tok;
 
-         })
 
-         .join('');
 
-     return this._longDateFormat[key];
 
- }
 
- var defaultInvalidDate = 'Invalid date';
 
- function invalidDate() {
 
-     return this._invalidDate;
 
- }
 
- var defaultOrdinal = '%d',
 
-     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',
 
-     w: 'a week',
 
-     ww: '%d weeks',
 
-     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 = [],
 
-         u;
 
-     for (u in unitsObj) {
 
-         if (hasOwnProp(unitsObj, u)) {
 
-             units.push({ unit: u, priority: priorities[u] });
 
-         }
 
-     }
 
-     units.sort(function (a, b) {
 
-         return a.priority - b.priority;
 
-     });
 
-     return units;
 
- }
 
- function isLeapYear(year) {
 
-     return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
 
- }
 
- function absFloor(number) {
 
-     if (number < 0) {
 
-         // -0 -> 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 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
 
-         ) {
 
-             value = toInt(value);
 
-             mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](
 
-                 value,
 
-                 mom.month(),
 
-                 daysInMonth(value, mom.month())
 
-             );
 
-         } else {
 
-             mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
 
-         }
 
-     }
 
- }
 
- // MOMENTS
 
- 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),
 
-             i;
 
-         for (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;
 
- }
 
- var match1 = /\d/, //       0 - 9
 
-     match2 = /\d\d/, //      00 - 99
 
-     match3 = /\d{3}/, //     000 - 999
 
-     match4 = /\d{4}/, //    0000 - 9999
 
-     match6 = /[+-]?\d{6}/, // -999999 - 999999
 
-     match1to2 = /\d\d?/, //       0 - 99
 
-     match3to4 = /\d\d\d\d?/, //     999 - 9999
 
-     match5to6 = /\d\d\d\d\d\d?/, //   99999 - 999999
 
-     match1to3 = /\d{1,3}/, //       0 - 999
 
-     match1to4 = /\d{1,4}/, //       0 - 9999
 
-     match1to6 = /[+-]?\d{1,6}/, // -999999 - 999999
 
-     matchUnsigned = /\d+/, //       0 - inf
 
-     matchSigned = /[+-]?\d+/, //    -inf - inf
 
-     matchOffset = /Z|[+-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z
 
-     matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi, // +00 -00 +00:00 -00:00 +0000 -0000 or Z
 
-     matchTimestamp = /[+-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123
 
-     // any word (or two) characters or numbers including two/three word month in arabic.
 
-     // includes scottish gaelic two word and hyphenated months
 
-     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,
 
-     regexes;
 
- 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);
 
- }
 
- // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
 
- 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,
 
-     MONTH = 1,
 
-     DATE = 2,
 
-     HOUR = 3,
 
-     MINUTE = 4,
 
-     SECOND = 5,
 
-     MILLISECOND = 6,
 
-     WEEK = 7,
 
-     WEEKDAY = 8;
 
- function mod(n, x) {
 
-     return ((n % x) + x) % x;
 
- }
 
- var indexOf;
 
- if (Array.prototype.indexOf) {
 
-     indexOf = Array.prototype.indexOf;
 
- } else {
 
-     indexOf = function (o) {
 
-         // I know
 
-         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);
 
- }
 
- // FORMATTING
 
- 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);
 
- });
 
- // ALIASES
 
- addUnitAlias('month', 'M');
 
- // PRIORITY
 
- addUnitPriority('month', 8);
 
- // PARSING
 
- 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 we didn't find a month name, mark the date as invalid.
 
-     if (month != null) {
 
-         array[MONTH] = month;
 
-     } else {
 
-         getParsingFlags(config).invalidMonth = input;
 
-     }
 
- });
 
- // LOCALES
 
- var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
 
-         '_'
 
-     ),
 
-     defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split(
 
-         '_'
 
-     ),
 
-     MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,
 
-     defaultMonthsShortRegex = matchWord,
 
-     defaultMonthsRegex = matchWord;
 
- 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()];
 
- }
 
- 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 is not used
 
-         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 = [];
 
-     }
 
-     // TODO: add sorting
 
-     // Sorting makes sure if one month (or abbr) is a prefix of another
 
-     // see sorting in computeMonthsParse
 
-     for (i = 0; i < 12; i++) {
 
-         // make the regex if we don't have it already
 
-         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');
 
-         }
 
-         // test the regex
 
-         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;
 
-         }
 
-     }
 
- }
 
- // MOMENTS
 
- function setMonth(mom, value) {
 
-     var dayOfMonth;
 
-     if (!mom.isValid()) {
 
-         // No op
 
-         return mom;
 
-     }
 
-     if (typeof value === 'string') {
 
-         if (/^\d+$/.test(value)) {
 
-             value = toInt(value);
 
-         } else {
 
-             value = mom.localeData().monthsParse(value);
 
-             // TODO: Another silent failure?
 
-             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());
 
- }
 
- 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;
 
-     }
 
- }
 
- 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++) {
 
-         // make the regex if we don't have it already
 
-         mom = createUTC([2000, i]);
 
-         shortPieces.push(this.monthsShort(mom, ''));
 
-         longPieces.push(this.months(mom, ''));
 
-         mixedPieces.push(this.months(mom, ''));
 
-         mixedPieces.push(this.monthsShort(mom, ''));
 
-     }
 
-     // Sorting makes sure if one month (or abbr) is a prefix of another it
 
-     // will match the longer piece.
 
-     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'
 
-     );
 
- }
 
- // FORMATTING
 
- addFormatToken('Y', 0, 0, function () {
 
-     var y = this.year();
 
-     return y <= 9999 ? zeroFill(y, 4) : '+' + 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');
 
- // ALIASES
 
- addUnitAlias('year', 'y');
 
- // PRIORITIES
 
- addUnitPriority('year', 1);
 
- // PARSING
 
- 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);
 
- });
 
- // HELPERS
 
- function daysInYear(year) {
 
-     return isLeapYear(year) ? 366 : 365;
 
- }
 
- // HOOKS
 
- hooks.parseTwoDigitYear = function (input) {
 
-     return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
 
- };
 
- // MOMENTS
 
- var getSetYear = makeGetSet('FullYear', true);
 
- function getIsLeapYear() {
 
-     return isLeapYear(this.year());
 
- }
 
- function createDate(y, m, d, h, M, s, ms) {
 
-     // can't just apply() to create a date:
 
-     // https://stackoverflow.com/q/181348
 
-     var date;
 
-     // the date constructor remaps years 0-99 to 1900-1999
 
-     if (y < 100 && y >= 0) {
 
-         // preserve leap years using a full 400 year cycle, then reset
 
-         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, args;
 
-     // the Date.UTC function remaps years 0-99 to 1900-1999
 
-     if (y < 100 && y >= 0) {
 
-         args = Array.prototype.slice.call(arguments);
 
-         // preserve leap years using a full 400 year cycle, then reset
 
-         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;
 
- }
 
- // start-of-first-week - start-of-year
 
- function firstWeekOffset(year, dow, doy) {
 
-     var // first-week day -- which january is always in the first week (4 for iso, 1 for other)
 
-         fwd = 7 + dow - doy,
 
-         // first-week day local weekday -- which local weekday is fwd
 
-         fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;
 
-     return -fwdlw + fwd - 1;
 
- }
 
- // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
 
- 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;
 
- }
 
- // FORMATTING
 
- addFormatToken('w', ['ww', 2], 'wo', 'week');
 
- addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');
 
- // ALIASES
 
- addUnitAlias('week', 'w');
 
- addUnitAlias('isoWeek', 'W');
 
- // PRIORITIES
 
- addUnitPriority('week', 5);
 
- addUnitPriority('isoWeek', 5);
 
- // PARSING
 
- 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);
 
- });
 
- // HELPERS
 
- // LOCALES
 
- function localeWeek(mom) {
 
-     return weekOfYear(mom, this._week.dow, this._week.doy).week;
 
- }
 
- var defaultLocaleWeek = {
 
-     dow: 0, // Sunday is the first day of the week.
 
-     doy: 6, // The week that contains Jan 6th is the first week of the year.
 
- };
 
- function localeFirstDayOfWeek() {
 
-     return this._week.dow;
 
- }
 
- function localeFirstDayOfYear() {
 
-     return this._week.doy;
 
- }
 
- // MOMENTS
 
- 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');
 
- }
 
- // FORMATTING
 
- 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');
 
- // ALIASES
 
- addUnitAlias('day', 'd');
 
- addUnitAlias('weekday', 'e');
 
- addUnitAlias('isoWeekday', 'E');
 
- // PRIORITY
 
- addUnitPriority('day', 11);
 
- addUnitPriority('weekday', 11);
 
- addUnitPriority('isoWeekday', 11);
 
- // PARSING
 
- 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 we didn't get a weekday name, mark the date as invalid
 
-     if (weekday != null) {
 
-         week.d = weekday;
 
-     } else {
 
-         getParsingFlags(config).invalidWeekday = input;
 
-     }
 
- });
 
- addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {
 
-     week[token] = toInt(input);
 
- });
 
- // HELPERS
 
- 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;
 
- }
 
- // LOCALES
 
- function shiftWeekdays(ws, n) {
 
-     return ws.slice(n, 7).concat(ws.slice(0, n));
 
- }
 
- var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
 
-         '_'
 
-     ),
 
-     defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
 
-     defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
 
-     defaultWeekdaysRegex = matchWord,
 
-     defaultWeekdaysShortRegex = matchWord,
 
-     defaultWeekdaysMinRegex = matchWord;
 
- 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;
 
- }
 
- function localeWeekdaysShort(m) {
 
-     return m === true
 
-         ? shiftWeekdays(this._weekdaysShort, this._week.dow)
 
-         : m
 
-         ? this._weekdaysShort[m.day()]
 
-         : this._weekdaysShort;
 
- }
 
- 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++) {
 
-         // make the regex if we don't have it already
 
-         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');
 
-         }
 
-         // test the regex
 
-         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;
 
-         }
 
-     }
 
- }
 
- // MOMENTS
 
- 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;
 
-     }
 
-     // behaves the same as moment#day except
 
-     // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
 
-     // as a setter, sunday should belong to the previous week.
 
-     if (input != null) {
 
-         var weekday = parseIsoWeekday(input, this.localeData());
 
-         return this.day(this.day() % 7 ? weekday : weekday - 7);
 
-     } else {
 
-         return this.day() || 7;
 
-     }
 
- }
 
- 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;
 
-     }
 
- }
 
- 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;
 
-     }
 
- }
 
- 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++) {
 
-         // make the regex if we don't have it already
 
-         mom = createUTC([2000, 1]).day(i);
 
-         minp = regexEscape(this.weekdaysMin(mom, ''));
 
-         shortp = regexEscape(this.weekdaysShort(mom, ''));
 
-         longp = regexEscape(this.weekdays(mom, ''));
 
-         minPieces.push(minp);
 
-         shortPieces.push(shortp);
 
-         longPieces.push(longp);
 
-         mixedPieces.push(minp);
 
-         mixedPieces.push(shortp);
 
-         mixedPieces.push(longp);
 
-     }
 
-     // Sorting makes sure if one weekday (or abbr) is a prefix of another it
 
-     // will match the longer piece.
 
-     minPieces.sort(cmpLenRev);
 
-     shortPieces.sort(cmpLenRev);
 
-     longPieces.sort(cmpLenRev);
 
-     mixedPieces.sort(cmpLenRev);
 
-     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'
 
-     );
 
- }
 
- // FORMATTING
 
- 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);
 
- // ALIASES
 
- addUnitAlias('hour', 'h');
 
- // PRIORITY
 
- addUnitPriority('hour', 13);
 
- // PARSING
 
- 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,
 
-         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,
 
-         pos2 = input.length - 2;
 
-     array[HOUR] = toInt(input.substr(0, pos1));
 
-     array[MINUTE] = toInt(input.substr(pos1, 2));
 
-     array[SECOND] = toInt(input.substr(pos2));
 
- });
 
- // LOCALES
 
- function localeIsPM(input) {
 
-     // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
 
-     // Using charAt should be more compatible.
 
-     return (input + '').toLowerCase().charAt(0) === 'p';
 
- }
 
- var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i,
 
-     // Setting the hour should keep the time, because the user explicitly
 
-     // specified which hour they want. So trying to maintain the same hour (in
 
-     // a new timezone) makes sense. Adding/subtracting hours does not follow
 
-     // this rule.
 
-     getSetHour = makeGetSet('Hours', true);
 
- function localeMeridiem(hours, minutes, isLower) {
 
-     if (hours > 11) {
 
-         return isLower ? 'pm' : 'PM';
 
-     } else {
 
-         return isLower ? 'am' : 'AM';
 
-     }
 
- }
 
- 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,
 
- };
 
- // internal storage for locale config files
 
- var locales = {},
 
-     localeFamilies = {},
 
-     globalLocale;
 
- function commonPrefix(arr1, arr2) {
 
-     var i,
 
-         minl = Math.min(arr1.length, arr2.length);
 
-     for (i = 0; i < minl; i += 1) {
 
-         if (arr1[i] !== arr2[i]) {
 
-             return i;
 
-         }
 
-     }
 
-     return minl;
 
- }
 
- function normalizeLocale(key) {
 
-     return key ? key.toLowerCase().replace('_', '-') : key;
 
- }
 
- // pick the locale from the array
 
- // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
 
- // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
 
- 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 &&
 
-                 commonPrefix(split, next) >= j - 1
 
-             ) {
 
-                 //the next array item is better than a shallower substring of this one
 
-                 break;
 
-             }
 
-             j--;
 
-         }
 
-         i++;
 
-     }
 
-     return globalLocale;
 
- }
 
- function loadLocale(name) {
 
-     var oldLocale = null,
 
-         aliasedRequire;
 
-     // TODO: Find a better way to register and load all the locales in Node
 
-     if (
 
-         locales[name] === undefined &&
 
-         typeof module !== 'undefined' &&
 
-         module &&
 
-         module.exports
 
-     ) {
 
-         try {
 
-             oldLocale = globalLocale._abbr;
 
-             aliasedRequire = require;
 
-             aliasedRequire('./locale/' + name);
 
-             getSetGlobalLocale(oldLocale);
 
-         } catch (e) {
 
-             // mark as not found to avoid repeating expensive file require call causing high CPU
 
-             // when trying to find en-US, en_US, en-us for every format call
 
-             locales[name] = null; // null means not found
 
-         }
 
-     }
 
-     return locales[name];
 
- }
 
- // This function will load locale and then set the global locale.  If
 
- // no arguments are passed in, it will simply return the current global
 
- // locale key.
 
- function getSetGlobalLocale(key, values) {
 
-     var data;
 
-     if (key) {
 
-         if (isUndefined(values)) {
 
-             data = getLocale(key);
 
-         } else {
 
-             data = defineLocale(key, values);
 
-         }
 
-         if (data) {
 
-             // moment.duration._locale = moment._locale = data;
 
-             globalLocale = data;
 
-         } else {
 
-             if (typeof console !== 'undefined' && console.warn) {
 
-                 //warn user if arguments are passed but the locale could not be set
 
-                 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);
 
-             });
 
-         }
 
-         // backwards compat for now: also set the locale
 
-         // make sure we set the locale AFTER all child locales have been
 
-         // created, so we won't end up with the child locale set.
 
-         getSetGlobalLocale(name);
 
-         return locales[name];
 
-     } else {
 
-         // useful for testing
 
-         delete locales[name];
 
-         return null;
 
-     }
 
- }
 
- function updateLocale(name, config) {
 
-     if (config != null) {
 
-         var locale,
 
-             tmpLocale,
 
-             parentConfig = baseConfig;
 
-         if (locales[name] != null && locales[name].parentLocale != null) {
 
-             // Update existing child locale in-place to avoid memory-leaks
 
-             locales[name].set(mergeConfigs(locales[name]._config, config));
 
-         } else {
 
-             // MERGE
 
-             tmpLocale = loadLocale(name);
 
-             if (tmpLocale != null) {
 
-                 parentConfig = tmpLocale._config;
 
-             }
 
-             config = mergeConfigs(parentConfig, config);
 
-             if (tmpLocale == null) {
 
-                 // updateLocale is called for creating a new locale
 
-                 // Set abbr so it will have a name (getters return
 
-                 // undefined otherwise).
 
-                 config.abbr = name;
 
-             }
 
-             locale = new Locale(config);
 
-             locale.parentLocale = locales[name];
 
-             locales[name] = locale;
 
-         }
 
-         // backwards compat for now: also set the locale
 
-         getSetGlobalLocale(name);
 
-     } else {
 
-         // pass null for config to unupdate, useful for tests
 
-         if (locales[name] != null) {
 
-             if (locales[name].parentLocale != null) {
 
-                 locales[name] = locales[name].parentLocale;
 
-                 if (name === getSetGlobalLocale()) {
 
-                     getSetGlobalLocale(name);
 
-                 }
 
-             } else if (locales[name] != null) {
 
-                 delete locales[name];
 
-             }
 
-         }
 
-     }
 
-     return locales[name];
 
- }
 
- // returns locale data
 
- function getLocale(key) {
 
-     var locale;
 
-     if (key && key._locale && key._locale._abbr) {
 
-         key = key._locale._abbr;
 
-     }
 
-     if (!key) {
 
-         return globalLocale;
 
-     }
 
-     if (!isArray(key)) {
 
-         //short-circuit everything else
 
-         locale = loadLocale(key);
 
-         if (locale) {
 
-             return locale;
 
-         }
 
-         key = [key];
 
-     }
 
-     return chooseLocale(key);
 
- }
 
- function listLocales() {
 
-     return keys(locales);
 
- }
 
- function checkOverflow(m) {
 
-     var overflow,
 
-         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;
 
- }
 
- // iso 8601 regex
 
- // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
 
- 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)?)?$/,
 
-     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)?)?$/,
 
-     tzRegex = /Z|[+-]\d\d(?::?\d\d)?/,
 
-     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}/],
 
-         ['YYYYMM', /\d{6}/, false],
 
-         ['YYYY', /\d{4}/, false],
 
-     ],
 
-     // iso time formats and regexes
 
-     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/],
 
-     ],
 
-     aspNetJsonRegex = /^\/?Date\((-?\d+)/i,
 
-     // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3
 
-     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}))$/,
 
-     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,
 
-     };
 
- // date from iso format
 
- 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])) {
 
-                     // match[2] should be 'T' or space
 
-                     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;
 
-     }
 
- }
 
- 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) {
 
-     // Remove comments and folding whitespace and replace multiple-spaces with a single space
 
-     return s
 
-         .replace(/\([^)]*\)|[\n\t]/g, ' ')
 
-         .replace(/(\s\s+)/g, ' ')
 
-         .replace(/^\s\s*/, '')
 
-         .replace(/\s\s*$/, '');
 
- }
 
- function checkWeekday(weekdayStr, parsedInput, config) {
 
-     if (weekdayStr) {
 
-         // TODO: Replace the vanilla JS Date object with an independent day-of-week check.
 
-         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;
 
- }
 
- function calculateOffset(obsOffset, militaryOffset, numOffset) {
 
-     if (obsOffset) {
 
-         return obsOffsets[obsOffset];
 
-     } else if (militaryOffset) {
 
-         // the only allowed military tz is Z
 
-         return 0;
 
-     } else {
 
-         var hm = parseInt(numOffset, 10),
 
-             m = hm % 100,
 
-             h = (hm - m) / 100;
 
-         return h * 60 + m;
 
-     }
 
- }
 
- // date and time from ref 2822 format
 
- function configFromRFC2822(config) {
 
-     var match = rfc2822.exec(preprocessRFC2822(config._i)),
 
-         parsedArray;
 
-     if (match) {
 
-         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;
 
-     }
 
- }
 
- // date from 1) ASP.NET, 2) ISO, 3) RFC 2822 formats, or 4) optional fallback if parsing isn't strict
 
- 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;
 
-     }
 
-     if (config._strict) {
 
-         config._isValid = false;
 
-     } else {
 
-         // Final attempt, use Input Fallback
 
-         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. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.',
 
-     function (config) {
 
-         config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
 
-     }
 
- );
 
- // Pick the first defined of two or three arguments.
 
- function defaults(a, b, c) {
 
-     if (a != null) {
 
-         return a;
 
-     }
 
-     if (b != null) {
 
-         return b;
 
-     }
 
-     return c;
 
- }
 
- function currentDateArray(config) {
 
-     // hooks is actually the exported moment object
 
-     var nowValue = new Date(hooks.now());
 
-     if (config._useUTC) {
 
-         return [
 
-             nowValue.getUTCFullYear(),
 
-             nowValue.getUTCMonth(),
 
-             nowValue.getUTCDate(),
 
-         ];
 
-     }
 
-     return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];
 
- }
 
- // convert an array to a date.
 
- // the array should mirror the parameters below
 
- // note: all values past the year are optional and will default to the lowest possible value.
 
- // [year, month, day , hour, minute, second, millisecond]
 
- function configFromArray(config) {
 
-     var i,
 
-         date,
 
-         input = [],
 
-         currentDate,
 
-         expectedWeekday,
 
-         yearToUse;
 
-     if (config._d) {
 
-         return;
 
-     }
 
-     currentDate = currentDateArray(config);
 
-     //compute day of the year from weeks and weekdays
 
-     if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
 
-         dayOfYearFromWeekInfo(config);
 
-     }
 
-     //if the day of the year is set, figure out what it is
 
-     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();
 
-     }
 
-     // Default to current date.
 
-     // * if no year, month, day of month are given, default to today
 
-     // * if day of month is given, default month and year
 
-     // * if month is given, default only year
 
-     // * if year is given, don't default anything
 
-     for (i = 0; i < 3 && config._a[i] == null; ++i) {
 
-         config._a[i] = input[i] = currentDate[i];
 
-     }
 
-     // Zero out whatever was not defaulted, including time
 
-     for (; i < 7; i++) {
 
-         config._a[i] = input[i] =
 
-             config._a[i] == null ? (i === 2 ? 1 : 0) : config._a[i];
 
-     }
 
-     // Check for 24:00:00.000
 
-     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();
 
-     // Apply timezone offset from input. The actual utcOffset can be changed
 
-     // with parseZone.
 
-     if (config._tzm != null) {
 
-         config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
 
-     }
 
-     if (config._nextDay) {
 
-         config._a[HOUR] = 24;
 
-     }
 
-     // check for mismatching day of week
 
-     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, curWeek;
 
-     w = config._w;
 
-     if (w.GG != null || w.W != null || w.E != null) {
 
-         dow = 1;
 
-         doy = 4;
 
-         // TODO: We need to take the current isoWeekYear, but that depends on
 
-         // how we interpret now (local, utc, fixed offset). So create
 
-         // a now version of current config (take local/utc/offset flags, and
 
-         // create now).
 
-         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;
 
-         curWeek = weekOfYear(createLocal(), dow, doy);
 
-         weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);
 
-         // Default to current week.
 
-         week = defaults(w.w, curWeek.week);
 
-         if (w.d != null) {
 
-             // weekday -- low day numbers are considered next week
 
-             weekday = w.d;
 
-             if (weekday < 0 || weekday > 6) {
 
-                 weekdayOverflow = true;
 
-             }
 
-         } else if (w.e != null) {
 
-             // local weekday -- counting starts from beginning of week
 
-             weekday = w.e + dow;
 
-             if (w.e < 0 || w.e > 6) {
 
-                 weekdayOverflow = true;
 
-             }
 
-         } else {
 
-             // default to beginning of week
 
-             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;
 
-     }
 
- }
 
- // constant that refers to the ISO standard
 
- hooks.ISO_8601 = function () {};
 
- // constant that refers to the RFC 2822 form
 
- hooks.RFC_2822 = function () {};
 
- // date from string and format string
 
- function configFromStringAndFormat(config) {
 
-     // TODO: Move this to another part of the creation flow to prevent circular deps
 
-     if (config._f === hooks.ISO_8601) {
 
-         configFromISO(config);
 
-         return;
 
-     }
 
-     if (config._f === hooks.RFC_2822) {
 
-         configFromRFC2822(config);
 
-         return;
 
-     }
 
-     config._a = [];
 
-     getParsingFlags(config).empty = true;
 
-     // This array is used to make a Date, either with `new Date` or `Date.UTC`
 
-     var string = '' + config._i,
 
-         i,
 
-         parsedInput,
 
-         tokens,
 
-         token,
 
-         skipped,
 
-         stringLength = string.length,
 
-         totalParsedInputLength = 0,
 
-         era;
 
-     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;
 
-         }
 
-         // don't parse if it's not a known token
 
-         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);
 
-         }
 
-     }
 
-     // add remaining unparsed input length to the string
 
-     getParsingFlags(config).charsLeftOver =
 
-         stringLength - totalParsedInputLength;
 
-     if (string.length > 0) {
 
-         getParsingFlags(config).unusedInput.push(string);
 
-     }
 
-     // clear _12h flag if hour is <= 12
 
-     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;
 
-     // handle meridiem
 
-     config._a[HOUR] = meridiemFixWrap(
 
-         config._locale,
 
-         config._a[HOUR],
 
-         config._meridiem
 
-     );
 
-     // handle era
 
-     era = getParsingFlags(config).era;
 
-     if (era !== null) {
 
-         config._a[YEAR] = config._locale.erasConvertYear(era, config._a[YEAR]);
 
-     }
 
-     configFromArray(config);
 
-     checkOverflow(config);
 
- }
 
- function meridiemFixWrap(locale, hour, meridiem) {
 
-     var isPm;
 
-     if (meridiem == null) {
 
-         // nothing to do
 
-         return hour;
 
-     }
 
-     if (locale.meridiemHour != null) {
 
-         return locale.meridiemHour(hour, meridiem);
 
-     } else if (locale.isPM != null) {
 
-         // Fallback
 
-         isPm = locale.isPM(meridiem);
 
-         if (isPm && hour < 12) {
 
-             hour += 12;
 
-         }
 
-         if (!isPm && hour === 12) {
 
-             hour = 0;
 
-         }
 
-         return hour;
 
-     } else {
 
-         // this is not supposed to happen
 
-         return hour;
 
-     }
 
- }
 
- // date from string and array of format strings
 
- function configFromStringAndArray(config) {
 
-     var tempConfig,
 
-         bestMoment,
 
-         scoreToBeat,
 
-         i,
 
-         currentScore,
 
-         validFormatFound,
 
-         bestFormatIsValid = false;
 
-     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;
 
-         validFormatFound = false;
 
-         tempConfig = copyConfig({}, config);
 
-         if (config._useUTC != null) {
 
-             tempConfig._useUTC = config._useUTC;
 
-         }
 
-         tempConfig._f = config._f[i];
 
-         configFromStringAndFormat(tempConfig);
 
-         if (isValid(tempConfig)) {
 
-             validFormatFound = true;
 
-         }
 
-         // if there is any input that was not parsed add a penalty for that format
 
-         currentScore += getParsingFlags(tempConfig).charsLeftOver;
 
-         //or tokens
 
-         currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;
 
-         getParsingFlags(tempConfig).score = currentScore;
 
-         if (!bestFormatIsValid) {
 
-             if (
 
-                 scoreToBeat == null ||
 
-                 currentScore < scoreToBeat ||
 
-                 validFormatFound
 
-             ) {
 
-                 scoreToBeat = currentScore;
 
-                 bestMoment = tempConfig;
 
-                 if (validFormatFound) {
 
-                     bestFormatIsValid = true;
 
-                 }
 
-             }
 
-         } else {
 
-             if (currentScore < scoreToBeat) {
 
-                 scoreToBeat = currentScore;
 
-                 bestMoment = tempConfig;
 
-             }
 
-         }
 
-     }
 
-     extend(config, bestMoment || tempConfig);
 
- }
 
- function configFromObject(config) {
 
-     if (config._d) {
 
-         return;
 
-     }
 
-     var i = normalizeObjectUnits(config._i),
 
-         dayOrDate = i.day === undefined ? i.date : i.day;
 
-     config._a = map(
 
-         [i.year, i.month, dayOrDate, 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) {
 
-         // Adding is smart enough around DST
 
-         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)) {
 
-         // from milliseconds
 
-         config._d = new Date(input);
 
-     } else {
 
-         hooks.createFromInputFallback(config);
 
-     }
 
- }
 
- function createLocalOrUTC(input, format, locale, strict, isUTC) {
 
-     var c = {};
 
-     if (format === true || format === false) {
 
-         strict = format;
 
-         format = undefined;
 
-     }
 
-     if (locale === true || locale === false) {
 
-         strict = locale;
 
-         locale = undefined;
 
-     }
 
-     if (
 
-         (isObject(input) && isObjectEmpty(input)) ||
 
-         (isArray(input) && input.length === 0)
 
-     ) {
 
-         input = undefined;
 
-     }
 
-     // object construction must be done this way.
 
-     // https://github.com/moment/moment/issues/1423
 
-     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();
 
-             }
 
-         }
 
-     ),
 
-     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();
 
-             }
 
-         }
 
-     );
 
- // Pick a moment m from moments so that m[fn](other) is true for all
 
- // other. This relies on the function fn to be transitive.
 
- //
 
- // moments should either be an array of moment objects or an array, whose
 
- // first element is an array of moment objects.
 
- 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;
 
- }
 
- // TODO: Use [].sort instead?
 
- 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) {
 
-     var key,
 
-         unitHasDecimal = false,
 
-         i;
 
-     for (key in m) {
 
-         if (
 
-             hasOwnProp(m, key) &&
 
-             !(
 
-                 indexOf.call(ordering, key) !== -1 &&
 
-                 (m[key] == null || !isNaN(m[key]))
 
-             )
 
-         ) {
 
-             return false;
 
-         }
 
-     }
 
-     for (i = 0; i < ordering.length; ++i) {
 
-         if (m[ordering[i]]) {
 
-             if (unitHasDecimal) {
 
-                 return false; // only allow non-integers for smallest unit
 
-             }
 
-             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);
 
-     // representation for dateAddRemove
 
-     this._milliseconds =
 
-         +milliseconds +
 
-         seconds * 1e3 + // 1000
 
-         minutes * 6e4 + // 1000 * 60
 
-         hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978
 
-     // Because of dateAddRemove treats 24 hours as different from a
 
-     // day when working around DST, we need to store them separately
 
-     this._days = +days + weeks * 7;
 
-     // It is impossible to translate months into days without knowing
 
-     // which months you are are talking about, so we have to store
 
-     // it separately.
 
-     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);
 
-     }
 
- }
 
- // compare two arrays, return the number of differences
 
- 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;
 
- }
 
- // FORMATTING
 
- function offset(token, separator) {
 
-     addFormatToken(token, 0, 0, function () {
 
-         var offset = this.utcOffset(),
 
-             sign = '+';
 
-         if (offset < 0) {
 
-             offset = -offset;
 
-             sign = '-';
 
-         }
 
-         return (
 
-             sign +
 
-             zeroFill(~~(offset / 60), 2) +
 
-             separator +
 
-             zeroFill(~~offset % 60, 2)
 
-         );
 
-     });
 
- }
 
- offset('Z', ':');
 
- offset('ZZ', '');
 
- // PARSING
 
- addRegexToken('Z', matchShortOffset);
 
- addRegexToken('ZZ', matchShortOffset);
 
- addParseToken(['Z', 'ZZ'], function (input, array, config) {
 
-     config._useUTC = true;
 
-     config._tzm = offsetFromString(matchShortOffset, input);
 
- });
 
- // HELPERS
 
- // timezone chunker
 
- // '+10:00' > ['10',  '00']
 
- // '-1530'  > ['-15', '30']
 
- var chunkOffset = /([\+\-]|\d\d)/gi;
 
- function offsetFromString(matcher, string) {
 
-     var matches = (string || '').match(matcher),
 
-         chunk,
 
-         parts,
 
-         minutes;
 
-     if (matches === null) {
 
-         return null;
 
-     }
 
-     chunk = matches[matches.length - 1] || [];
 
-     parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];
 
-     minutes = +(parts[1] * 60) + toInt(parts[2]);
 
-     return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes;
 
- }
 
- // Return a moment from input, that is local/utc/zone equivalent to model.
 
- 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();
 
-         // Use low-level api, because this fn is low-level api.
 
-         res._d.setTime(res._d.valueOf() + diff);
 
-         hooks.updateOffset(res, false);
 
-         return res;
 
-     } else {
 
-         return createLocal(input).local();
 
-     }
 
- }
 
- function getDateOffset(m) {
 
-     // On Firefox.24 Date#getTimezoneOffset returns a floating point.
 
-     // https://github.com/moment/moment/pull/1871
 
-     return -Math.round(m._d.getTimezoneOffset());
 
- }
 
- // HOOKS
 
- // This function will be called whenever a moment is mutated.
 
- // It is intended to keep the offset in sync with the timezone.
 
- hooks.updateOffset = function () {};
 
- // MOMENTS
 
- // keepLocalTime = true means only change the timezone, without
 
- // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
 
- // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
 
- // +0200, so we adjust the time as needed, to be valid.
 
- //
 
- // Keeping the time actually adds/subtracts (one hour)
 
- // from the actual represented time. That is why we call updateOffset
 
- // a second time. In case it wants us to change the offset again
 
- // _changeInProgress == true case, then we have to adjust, because
 
- // there is no such time in the given timezone.
 
- 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 = {},
 
-         other;
 
-     copyConfig(c, this);
 
-     c = prepareConfig(c);
 
-     if (c._a) {
 
-         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;
 
- }
 
- // ASP.NET json date format regex
 
- var aspNetRegex = /^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,
 
-     // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
 
-     // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
 
-     // and further modified to allow for strings containing both week and day
 
-     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,
 
-         // matching against regexp is expensive, do it on demand
 
-         match = null,
 
-         sign,
 
-         ret,
 
-         diffRes;
 
-     if (isDuration(input)) {
 
-         duration = {
 
-             ms: input._milliseconds,
 
-             d: input._days,
 
-             M: input._months,
 
-         };
 
-     } else if (isNumber(input) || !isNaN(+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, // the millisecond decimal point is included in the match
 
-         };
 
-     } 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) {
 
-         // checks for null or undefined
 
-         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;
 
-     }
 
-     if (isDuration(input) && hasOwnProp(input, '_isValid')) {
 
-         ret._isValid = input._isValid;
 
-     }
 
-     return ret;
 
- }
 
- createDuration.fn = Duration.prototype;
 
- createDuration.invalid = createInvalid$1;
 
- function parseIso(inp, sign) {
 
-     // We'd normally use ~~inp for this, but unfortunately it also
 
-     // converts floats to ints.
 
-     // inp may be undefined, so careful calling replace on it.
 
-     var res = inp && parseFloat(inp.replace(',', '.'));
 
-     // apply sign while we're at it
 
-     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;
 
- }
 
- // TODO: remove 'name' arg after deprecation is removed
 
- function createAdder(direction, name) {
 
-     return function (val, period) {
 
-         var dur, tmp;
 
-         //invert the arguments, but complain about it
 
-         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;
 
-         }
 
-         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()) {
 
-         // No op
 
-         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'),
 
-     subtract = createAdder(-1, 'subtract');
 
- function isString(input) {
 
-     return typeof input === 'string' || input instanceof String;
 
- }
 
- // type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined
 
- function isMomentInput(input) {
 
-     return (
 
-         isMoment(input) ||
 
-         isDate(input) ||
 
-         isString(input) ||
 
-         isNumber(input) ||
 
-         isNumberOrStringArray(input) ||
 
-         isMomentInputObject(input) ||
 
-         input === null ||
 
-         input === undefined
 
-     );
 
- }
 
- function isMomentInputObject(input) {
 
-     var objectTest = isObject(input) && !isObjectEmpty(input),
 
-         propertyTest = false,
 
-         properties = [
 
-             'years',
 
-             'year',
 
-             'y',
 
-             'months',
 
-             'month',
 
-             'M',
 
-             'days',
 
-             'day',
 
-             'd',
 
-             'dates',
 
-             'date',
 
-             'D',
 
-             'hours',
 
-             'hour',
 
-             'h',
 
-             'minutes',
 
-             'minute',
 
-             'm',
 
-             'seconds',
 
-             'second',
 
-             's',
 
-             'milliseconds',
 
-             'millisecond',
 
-             'ms',
 
-         ],
 
-         i,
 
-         property;
 
-     for (i = 0; i < properties.length; i += 1) {
 
-         property = properties[i];
 
-         propertyTest = propertyTest || hasOwnProp(input, property);
 
-     }
 
-     return objectTest && propertyTest;
 
- }
 
- function isNumberOrStringArray(input) {
 
-     var arrayTest = isArray(input),
 
-         dataTypeTest = false;
 
-     if (arrayTest) {
 
-         dataTypeTest =
 
-             input.filter(function (item) {
 
-                 return !isNumber(item) && isString(input);
 
-             }).length === 0;
 
-     }
 
-     return arrayTest && dataTypeTest;
 
- }
 
- function isCalendarSpec(input) {
 
-     var objectTest = isObject(input) && !isObjectEmpty(input),
 
-         propertyTest = false,
 
-         properties = [
 
-             'sameDay',
 
-             'nextDay',
 
-             'lastDay',
 
-             'nextWeek',
 
-             'lastWeek',
 
-             'sameElse',
 
-         ],
 
-         i,
 
-         property;
 
-     for (i = 0; i < properties.length; i += 1) {
 
-         property = properties[i];
 
-         propertyTest = propertyTest || hasOwnProp(input, property);
 
-     }
 
-     return objectTest && propertyTest;
 
- }
 
- 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) {
 
-     // Support for single parameter, formats only overload to the calendar function
 
-     if (arguments.length === 1) {
 
-         if (!arguments[0]) {
 
-             time = undefined;
 
-             formats = undefined;
 
-         } else if (isMomentInput(arguments[0])) {
 
-             time = arguments[0];
 
-             formats = undefined;
 
-         } else if (isCalendarSpec(arguments[0])) {
 
-             formats = arguments[0];
 
-             time = undefined;
 
-         }
 
-     }
 
-     // We want to compare the start of today, vs this.
 
-     // Getting start-of-today depends on whether we're local/utc/offset or not.
 
-     var now = time || createLocal(),
 
-         sod = cloneWithOffset(now, this).startOf('day'),
 
-         format = hooks.calendarFormat(this, sod) || 'sameElse',
 
-         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; // 1000
 
-         case 'minute':
 
-             output = (this - that) / 6e4;
 
-             break; // 1000 * 60
 
-         case 'hour':
 
-             output = (this - that) / 36e5;
 
-             break; // 1000 * 60 * 60
 
-         case 'day':
 
-             output = (this - that - zoneDelta) / 864e5;
 
-             break; // 1000 * 60 * 60 * 24, negate dst
 
-         case 'week':
 
-             output = (this - that - zoneDelta) / 6048e5;
 
-             break; // 1000 * 60 * 60 * 24 * 7, negate dst
 
-         default:
 
-             output = this - that;
 
-     }
 
-     return asFloat ? output : absFloor(output);
 
- }
 
- function monthDiff(a, b) {
 
-     if (a.date() < b.date()) {
 
-         // end-of-month calculations work correct when the start month has more
 
-         // days than the end month.
 
-         return -monthDiff(b, a);
 
-     }
 
-     // difference in months
 
-     var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()),
 
-         // b is in (anchor - 1 month, anchor + 1 month)
 
-         anchor = a.clone().add(wholeMonthDiff, 'months'),
 
-         anchor2,
 
-         adjust;
 
-     if (b - anchor < 0) {
 
-         anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');
 
-         // linear across the month
 
-         adjust = (b - anchor) / (anchor - anchor2);
 
-     } else {
 
-         anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');
 
-         // linear across the month
 
-         adjust = (b - anchor) / (anchor2 - anchor);
 
-     }
 
-     //check for negative zero, return zero if negative zero
 
-     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,
 
-         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)) {
 
-         // native implementation is ~50x faster, use it when we can
 
-         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'
 
-     );
 
- }
 
- /**
 
-  * Return a human readable representation of a moment that can
 
-  * also be evaluated to get a new moment which is the same
 
-  *
 
-  * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects
 
-  */
 
- function inspect() {
 
-     if (!this.isValid()) {
 
-         return 'moment.invalid(/* ' + this._i + ' */)';
 
-     }
 
-     var func = 'moment',
 
-         zone = '',
 
-         prefix,
 
-         year,
 
-         datetime,
 
-         suffix;
 
-     if (!this.isLocal()) {
 
-         func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';
 
-         zone = 'Z';
 
-     }
 
-     prefix = '[' + func + '("]';
 
-     year = 0 <= this.year() && this.year() <= 9999 ? 'YYYY' : 'YYYYYY';
 
-     datetime = '-MM-DD[T]HH:mm:ss.SSS';
 
-     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);
 
- }
 
- // If passed a locale key, it will set the locale for this
 
- // instance.  Otherwise, it will return the locale configuration
 
- // variables for this instance.
 
- 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,
 
-     MS_PER_MINUTE = 60 * MS_PER_SECOND,
 
-     MS_PER_HOUR = 60 * MS_PER_MINUTE,
 
-     MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR;
 
- // actual modulo - handles negative numbers (for dates before 1970):
 
- function mod$1(dividend, divisor) {
 
-     return ((dividend % divisor) + divisor) % divisor;
 
- }
 
- function localStartOfDate(y, m, d) {
 
-     // the date constructor remaps years 0-99 to 1900-1999
 
-     if (y < 100 && y >= 0) {
 
-         // preserve leap years using a full 400 year cycle, then reset
 
-         return new Date(y + 400, m, d) - MS_PER_400_YEARS;
 
-     } else {
 
-         return new Date(y, m, d).valueOf();
 
-     }
 
- }
 
- function utcStartOfDate(y, m, d) {
 
-     // Date.UTC remaps years 0-99 to 1900-1999
 
-     if (y < 100 && y >= 0) {
 
-         // preserve leap years using a full 400 year cycle, then reset
 
-         return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS;
 
-     } else {
 
-         return Date.UTC(y, m, d);
 
-     }
 
- }
 
- function startOf(units) {
 
-     var time, startOfDate;
 
-     units = normalizeUnits(units);
 
-     if (units === undefined || units === 'millisecond' || !this.isValid()) {
 
-         return this;
 
-     }
 
-     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, startOfDate;
 
-     units = normalizeUnits(units);
 
-     if (units === undefined || units === 'millisecond' || !this.isValid()) {
 
-         return this;
 
-     }
 
-     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() {
 
-     // new Date(NaN).toJSON() === null
 
-     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('N', 0, 0, 'eraAbbr');
 
- addFormatToken('NN', 0, 0, 'eraAbbr');
 
- addFormatToken('NNN', 0, 0, 'eraAbbr');
 
- addFormatToken('NNNN', 0, 0, 'eraName');
 
- addFormatToken('NNNNN', 0, 0, 'eraNarrow');
 
- addFormatToken('y', ['y', 1], 'yo', 'eraYear');
 
- addFormatToken('y', ['yy', 2], 0, 'eraYear');
 
- addFormatToken('y', ['yyy', 3], 0, 'eraYear');
 
- addFormatToken('y', ['yyyy', 4], 0, 'eraYear');
 
- addRegexToken('N', matchEraAbbr);
 
- addRegexToken('NN', matchEraAbbr);
 
- addRegexToken('NNN', matchEraAbbr);
 
- addRegexToken('NNNN', matchEraName);
 
- addRegexToken('NNNNN', matchEraNarrow);
 
- addParseToken(['N', 'NN', 'NNN', 'NNNN', 'NNNNN'], function (
 
-     input,
 
-     array,
 
-     config,
 
-     token
 
- ) {
 
-     var era = config._locale.erasParse(input, token, config._strict);
 
-     if (era) {
 
-         getParsingFlags(config).era = era;
 
-     } else {
 
-         getParsingFlags(config).invalidEra = input;
 
-     }
 
- });
 
- addRegexToken('y', matchUnsigned);
 
- addRegexToken('yy', matchUnsigned);
 
- addRegexToken('yyy', matchUnsigned);
 
- addRegexToken('yyyy', matchUnsigned);
 
- addRegexToken('yo', matchEraYearOrdinal);
 
- addParseToken(['y', 'yy', 'yyy', 'yyyy'], YEAR);
 
- addParseToken(['yo'], function (input, array, config, token) {
 
-     var match;
 
-     if (config._locale._eraYearOrdinalRegex) {
 
-         match = input.match(config._locale._eraYearOrdinalRegex);
 
-     }
 
-     if (config._locale.eraYearOrdinalParse) {
 
-         array[YEAR] = config._locale.eraYearOrdinalParse(input, match);
 
-     } else {
 
-         array[YEAR] = parseInt(input, 10);
 
-     }
 
- });
 
- function localeEras(m, format) {
 
-     var i,
 
-         l,
 
-         date,
 
-         eras = this._eras || getLocale('en')._eras;
 
-     for (i = 0, l = eras.length; i < l; ++i) {
 
-         switch (typeof eras[i].since) {
 
-             case 'string':
 
-                 // truncate time
 
-                 date = hooks(eras[i].since).startOf('day');
 
-                 eras[i].since = date.valueOf();
 
-                 break;
 
-         }
 
-         switch (typeof eras[i].until) {
 
-             case 'undefined':
 
-                 eras[i].until = +Infinity;
 
-                 break;
 
-             case 'string':
 
-                 // truncate time
 
-                 date = hooks(eras[i].until).startOf('day').valueOf();
 
-                 eras[i].until = date.valueOf();
 
-                 break;
 
-         }
 
-     }
 
-     return eras;
 
- }
 
- function localeErasParse(eraName, format, strict) {
 
-     var i,
 
-         l,
 
-         eras = this.eras(),
 
-         name,
 
-         abbr,
 
-         narrow;
 
-     eraName = eraName.toUpperCase();
 
-     for (i = 0, l = eras.length; i < l; ++i) {
 
-         name = eras[i].name.toUpperCase();
 
-         abbr = eras[i].abbr.toUpperCase();
 
-         narrow = eras[i].narrow.toUpperCase();
 
-         if (strict) {
 
-             switch (format) {
 
-                 case 'N':
 
-                 case 'NN':
 
-                 case 'NNN':
 
-                     if (abbr === eraName) {
 
-                         return eras[i];
 
-                     }
 
-                     break;
 
-                 case 'NNNN':
 
-                     if (name === eraName) {
 
-                         return eras[i];
 
-                     }
 
-                     break;
 
-                 case 'NNNNN':
 
-                     if (narrow === eraName) {
 
-                         return eras[i];
 
-                     }
 
-                     break;
 
-             }
 
-         } else if ([name, abbr, narrow].indexOf(eraName) >= 0) {
 
-             return eras[i];
 
-         }
 
-     }
 
- }
 
- function localeErasConvertYear(era, year) {
 
-     var dir = era.since <= era.until ? +1 : -1;
 
-     if (year === undefined) {
 
-         return hooks(era.since).year();
 
-     } else {
 
-         return hooks(era.since).year() + (year - era.offset) * dir;
 
-     }
 
- }
 
- function getEraName() {
 
-     var i,
 
-         l,
 
-         val,
 
-         eras = this.localeData().eras();
 
-     for (i = 0, l = eras.length; i < l; ++i) {
 
-         // truncate time
 
-         val = this.clone().startOf('day').valueOf();
 
-         if (eras[i].since <= val && val <= eras[i].until) {
 
-             return eras[i].name;
 
-         }
 
-         if (eras[i].until <= val && val <= eras[i].since) {
 
-             return eras[i].name;
 
-         }
 
-     }
 
-     return '';
 
- }
 
- function getEraNarrow() {
 
-     var i,
 
-         l,
 
-         val,
 
-         eras = this.localeData().eras();
 
-     for (i = 0, l = eras.length; i < l; ++i) {
 
-         // truncate time
 
-         val = this.clone().startOf('day').valueOf();
 
-         if (eras[i].since <= val && val <= eras[i].until) {
 
-             return eras[i].narrow;
 
-         }
 
-         if (eras[i].until <= val && val <= eras[i].since) {
 
-             return eras[i].narrow;
 
-         }
 
-     }
 
-     return '';
 
- }
 
- function getEraAbbr() {
 
-     var i,
 
-         l,
 
-         val,
 
-         eras = this.localeData().eras();
 
-     for (i = 0, l = eras.length; i < l; ++i) {
 
-         // truncate time
 
-         val = this.clone().startOf('day').valueOf();
 
-         if (eras[i].since <= val && val <= eras[i].until) {
 
-             return eras[i].abbr;
 
-         }
 
-         if (eras[i].until <= val && val <= eras[i].since) {
 
-             return eras[i].abbr;
 
-         }
 
-     }
 
-     return '';
 
- }
 
- function getEraYear() {
 
-     var i,
 
-         l,
 
-         dir,
 
-         val,
 
-         eras = this.localeData().eras();
 
-     for (i = 0, l = eras.length; i < l; ++i) {
 
-         dir = eras[i].since <= eras[i].until ? +1 : -1;
 
-         // truncate time
 
-         val = this.clone().startOf('day').valueOf();
 
-         if (
 
-             (eras[i].since <= val && val <= eras[i].until) ||
 
-             (eras[i].until <= val && val <= eras[i].since)
 
-         ) {
 
-             return (
 
-                 (this.year() - hooks(eras[i].since).year()) * dir +
 
-                 eras[i].offset
 
-             );
 
-         }
 
-     }
 
-     return this.year();
 
- }
 
- function erasNameRegex(isStrict) {
 
-     if (!hasOwnProp(this, '_erasNameRegex')) {
 
-         computeErasParse.call(this);
 
-     }
 
-     return isStrict ? this._erasNameRegex : this._erasRegex;
 
- }
 
- function erasAbbrRegex(isStrict) {
 
-     if (!hasOwnProp(this, '_erasAbbrRegex')) {
 
-         computeErasParse.call(this);
 
-     }
 
-     return isStrict ? this._erasAbbrRegex : this._erasRegex;
 
- }
 
- function erasNarrowRegex(isStrict) {
 
-     if (!hasOwnProp(this, '_erasNarrowRegex')) {
 
-         computeErasParse.call(this);
 
-     }
 
-     return isStrict ? this._erasNarrowRegex : this._erasRegex;
 
- }
 
- function matchEraAbbr(isStrict, locale) {
 
-     return locale.erasAbbrRegex(isStrict);
 
- }
 
- function matchEraName(isStrict, locale) {
 
-     return locale.erasNameRegex(isStrict);
 
- }
 
- function matchEraNarrow(isStrict, locale) {
 
-     return locale.erasNarrowRegex(isStrict);
 
- }
 
- function matchEraYearOrdinal(isStrict, locale) {
 
-     return locale._eraYearOrdinalRegex || matchUnsigned;
 
- }
 
- function computeErasParse() {
 
-     var abbrPieces = [],
 
-         namePieces = [],
 
-         narrowPieces = [],
 
-         mixedPieces = [],
 
-         i,
 
-         l,
 
-         eras = this.eras();
 
-     for (i = 0, l = eras.length; i < l; ++i) {
 
-         namePieces.push(regexEscape(eras[i].name));
 
-         abbrPieces.push(regexEscape(eras[i].abbr));
 
-         narrowPieces.push(regexEscape(eras[i].narrow));
 
-         mixedPieces.push(regexEscape(eras[i].name));
 
-         mixedPieces.push(regexEscape(eras[i].abbr));
 
-         mixedPieces.push(regexEscape(eras[i].narrow));
 
-     }
 
-     this._erasRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
 
-     this._erasNameRegex = new RegExp('^(' + namePieces.join('|') + ')', 'i');
 
-     this._erasAbbrRegex = new RegExp('^(' + abbrPieces.join('|') + ')', 'i');
 
-     this._erasNarrowRegex = new RegExp(
 
-         '^(' + narrowPieces.join('|') + ')',
 
-         'i'
 
-     );
 
- }
 
- // FORMATTING
 
- 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');
 
- // ALIASES
 
- addUnitAlias('weekYear', 'gg');
 
- addUnitAlias('isoWeekYear', 'GG');
 
- // PRIORITY
 
- addUnitPriority('weekYear', 1);
 
- addUnitPriority('isoWeekYear', 1);
 
- // PARSING
 
- 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);
 
- });
 
- // MOMENTS
 
- 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 getISOWeeksInISOWeekYear() {
 
-     return weeksInYear(this.isoWeekYear(), 1, 4);
 
- }
 
- function getWeeksInYear() {
 
-     var weekInfo = this.localeData()._week;
 
-     return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
 
- }
 
- function getWeeksInWeekYear() {
 
-     var weekInfo = this.localeData()._week;
 
-     return weeksInYear(this.weekYear(), 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;
 
- }
 
- // FORMATTING
 
- addFormatToken('Q', 0, 'Qo', 'quarter');
 
- // ALIASES
 
- addUnitAlias('quarter', 'Q');
 
- // PRIORITY
 
- addUnitPriority('quarter', 7);
 
- // PARSING
 
- addRegexToken('Q', match1);
 
- addParseToken('Q', function (input, array) {
 
-     array[MONTH] = (toInt(input) - 1) * 3;
 
- });
 
- // MOMENTS
 
- function getSetQuarter(input) {
 
-     return input == null
 
-         ? Math.ceil((this.month() + 1) / 3)
 
-         : this.month((input - 1) * 3 + (this.month() % 3));
 
- }
 
- // FORMATTING
 
- addFormatToken('D', ['DD', 2], 'Do', 'date');
 
- // ALIASES
 
- addUnitAlias('date', 'D');
 
- // PRIORITY
 
- addUnitPriority('date', 9);
 
- // PARSING
 
- addRegexToken('D', match1to2);
 
- addRegexToken('DD', match1to2, match2);
 
- addRegexToken('Do', function (isStrict, locale) {
 
-     // TODO: Remove "ordinalParse" fallback in next major release.
 
-     return isStrict
 
-         ? locale._dayOfMonthOrdinalParse || locale._ordinalParse
 
-         : locale._dayOfMonthOrdinalParseLenient;
 
- });
 
- addParseToken(['D', 'DD'], DATE);
 
- addParseToken('Do', function (input, array) {
 
-     array[DATE] = toInt(input.match(match1to2)[0]);
 
- });
 
- // MOMENTS
 
- var getSetDayOfMonth = makeGetSet('Date', true);
 
- // FORMATTING
 
- addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');
 
- // ALIASES
 
- addUnitAlias('dayOfYear', 'DDD');
 
- // PRIORITY
 
- addUnitPriority('dayOfYear', 4);
 
- // PARSING
 
- addRegexToken('DDD', match1to3);
 
- addRegexToken('DDDD', match3);
 
- addParseToken(['DDD', 'DDDD'], function (input, array, config) {
 
-     config._dayOfYear = toInt(input);
 
- });
 
- // HELPERS
 
- // MOMENTS
 
- 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');
 
- }
 
- // FORMATTING
 
- addFormatToken('m', ['mm', 2], 0, 'minute');
 
- // ALIASES
 
- addUnitAlias('minute', 'm');
 
- // PRIORITY
 
- addUnitPriority('minute', 14);
 
- // PARSING
 
- addRegexToken('m', match1to2);
 
- addRegexToken('mm', match1to2, match2);
 
- addParseToken(['m', 'mm'], MINUTE);
 
- // MOMENTS
 
- var getSetMinute = makeGetSet('Minutes', false);
 
- // FORMATTING
 
- addFormatToken('s', ['ss', 2], 0, 'second');
 
- // ALIASES
 
- addUnitAlias('second', 's');
 
- // PRIORITY
 
- addUnitPriority('second', 15);
 
- // PARSING
 
- addRegexToken('s', match1to2);
 
- addRegexToken('ss', match1to2, match2);
 
- addParseToken(['s', 'ss'], SECOND);
 
- // MOMENTS
 
- var getSetSecond = makeGetSet('Seconds', false);
 
- // FORMATTING
 
- 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;
 
- });
 
- // ALIASES
 
- addUnitAlias('millisecond', 'ms');
 
- // PRIORITY
 
- addUnitPriority('millisecond', 16);
 
- // PARSING
 
- addRegexToken('S', match1to3, match1);
 
- addRegexToken('SS', match1to3, match2);
 
- addRegexToken('SSS', match1to3, match3);
 
- var token, getSetMillisecond;
 
- 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);
 
- }
 
- getSetMillisecond = makeGetSet('Milliseconds', false);
 
- // FORMATTING
 
- addFormatToken('z', 0, 0, 'zoneAbbr');
 
- addFormatToken('zz', 0, 0, 'zoneName');
 
- // MOMENTS
 
- 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;
 
- if (typeof Symbol !== 'undefined' && Symbol.for != null) {
 
-     proto[Symbol.for('nodejs.util.inspect.custom')] = function () {
 
-         return 'Moment<' + this.format() + '>';
 
-     };
 
- }
 
- proto.toJSON = toJSON;
 
- proto.toString = toString;
 
- proto.unix = unix;
 
- proto.valueOf = valueOf;
 
- proto.creationData = creationData;
 
- proto.eraName = getEraName;
 
- proto.eraNarrow = getEraNarrow;
 
- proto.eraAbbr = getEraAbbr;
 
- proto.eraYear = getEraYear;
 
- 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.weeksInWeekYear = getWeeksInWeekYear;
 
- proto.isoWeeksInYear = getISOWeeksInYear;
 
- proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear;
 
- 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.eras = localeEras;
 
- proto$1.erasParse = localeErasParse;
 
- proto$1.erasConvertYear = localeErasConvertYear;
 
- proto$1.erasAbbrRegex = erasAbbrRegex;
 
- proto$1.erasNameRegex = erasNameRegex;
 
- proto$1.erasNarrowRegex = erasNarrowRegex;
 
- 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(),
 
-         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,
 
-         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,
 
-         i,
 
-         out = [];
 
-     if (index != null) {
 
-         return get$1(format, (index + shift) % 7, field, 'day');
 
-     }
 
-     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', {
 
-     eras: [
 
-         {
 
-             since: '0001-01-01',
 
-             until: +Infinity,
 
-             offset: 1,
 
-             name: 'Anno Domini',
 
-             narrow: 'AD',
 
-             abbr: 'AD',
 
-         },
 
-         {
 
-             since: '0000-12-31',
 
-             until: -Infinity,
 
-             offset: 1,
 
-             name: 'Before Christ',
 
-             narrow: 'BC',
 
-             abbr: 'BC',
 
-         },
 
-     ],
 
-     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;
 
-     },
 
- });
 
- // Side effect imports
 
- 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();
 
- }
 
- // supports only 2.0-style add(1, 's') or add(duration)
 
- function add$1(input, value) {
 
-     return addSubtract$1(this, input, value, 1);
 
- }
 
- // supports only 2.0-style subtract(1, 's') or subtract(duration)
 
- 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,
 
-         days = this._days,
 
-         months = this._months,
 
-         data = this._data,
 
-         seconds,
 
-         minutes,
 
-         hours,
 
-         years,
 
-         monthsFromDays;
 
-     // if we have a mix of positive and negative values, bubble down first
 
-     // check: https://github.com/moment/moment/issues/2166
 
-     if (
 
-         !(
 
-             (milliseconds >= 0 && days >= 0 && months >= 0) ||
 
-             (milliseconds <= 0 && days <= 0 && months <= 0)
 
-         )
 
-     ) {
 
-         milliseconds += absCeil(monthsToDays(months) + days) * 864e5;
 
-         days = 0;
 
-         months = 0;
 
-     }
 
-     // The following code bubbles up values, see the tests for
 
-     // examples of what that means.
 
-     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);
 
-     // convert days to months
 
-     monthsFromDays = absFloor(daysToMonths(days));
 
-     months += monthsFromDays;
 
-     days -= absCeil(monthsToDays(monthsFromDays));
 
-     // 12 months -> 1 year
 
-     years = absFloor(months / 12);
 
-     months %= 12;
 
-     data.days = days;
 
-     data.months = months;
 
-     data.years = years;
 
-     return this;
 
- }
 
- function daysToMonths(days) {
 
-     // 400 years have 146097 days (taking into account leap year rules)
 
-     // 400 years have 12 months === 4800
 
-     return (days * 4800) / 146097;
 
- }
 
- function monthsToDays(months) {
 
-     // the reverse of daysToMonths
 
-     return (months * 146097) / 4800;
 
- }
 
- function as(units) {
 
-     if (!this.isValid()) {
 
-         return NaN;
 
-     }
 
-     var days,
 
-         months,
 
-         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 {
 
-         // handle milliseconds separately because of floating point math errors (issue #1867)
 
-         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;
 
-             // Math.floor prevents floating point math errors here
 
-             case 'millisecond':
 
-                 return Math.floor(days * 864e5) + milliseconds;
 
-             default:
 
-                 throw new Error('Unknown unit ' + units);
 
-         }
 
-     }
 
- }
 
- // TODO: Use this.as('ms')?
 
- 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'),
 
-     asSeconds = makeAs('s'),
 
-     asMinutes = makeAs('m'),
 
-     asHours = makeAs('h'),
 
-     asDays = makeAs('d'),
 
-     asWeeks = makeAs('w'),
 
-     asMonths = makeAs('M'),
 
-     asQuarters = makeAs('Q'),
 
-     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'),
 
-     seconds = makeGetter('seconds'),
 
-     minutes = makeGetter('minutes'),
 
-     hours = makeGetter('hours'),
 
-     days = makeGetter('days'),
 
-     months = makeGetter('months'),
 
-     years = makeGetter('years');
 
- function weeks() {
 
-     return absFloor(this.days() / 7);
 
- }
 
- var round = Math.round,
 
-     thresholds = {
 
-         ss: 44, // a few seconds to seconds
 
-         s: 45, // seconds to minute
 
-         m: 45, // minutes to hour
 
-         h: 22, // hours to day
 
-         d: 26, // days to month/week
 
-         w: null, // weeks to month
 
-         M: 11, // months to year
 
-     };
 
- // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
 
- function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
 
-     return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
 
- }
 
- function relativeTime$1(posNegDuration, withoutSuffix, thresholds, locale) {
 
-     var duration = createDuration(posNegDuration).abs(),
 
-         seconds = round(duration.as('s')),
 
-         minutes = round(duration.as('m')),
 
-         hours = round(duration.as('h')),
 
-         days = round(duration.as('d')),
 
-         months = round(duration.as('M')),
 
-         weeks = round(duration.as('w')),
 
-         years = round(duration.as('y')),
 
-         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]);
 
-     if (thresholds.w != null) {
 
-         a =
 
-             a ||
 
-             (weeks <= 1 && ['w']) ||
 
-             (weeks < thresholds.w && ['ww', weeks]);
 
-     }
 
-     a = a ||
 
-         (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);
 
- }
 
- // This function allows you to set the rounding function for relative time strings
 
- function getSetRelativeTimeRounding(roundingFunction) {
 
-     if (roundingFunction === undefined) {
 
-         return round;
 
-     }
 
-     if (typeof roundingFunction === 'function') {
 
-         round = roundingFunction;
 
-         return true;
 
-     }
 
-     return false;
 
- }
 
- // This function allows you to set a threshold for relative time strings
 
- 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(argWithSuffix, argThresholds) {
 
-     if (!this.isValid()) {
 
-         return this.localeData().invalidDate();
 
-     }
 
-     var withSuffix = false,
 
-         th = thresholds,
 
-         locale,
 
-         output;
 
-     if (typeof argWithSuffix === 'object') {
 
-         argThresholds = argWithSuffix;
 
-         argWithSuffix = false;
 
-     }
 
-     if (typeof argWithSuffix === 'boolean') {
 
-         withSuffix = argWithSuffix;
 
-     }
 
-     if (typeof argThresholds === 'object') {
 
-         th = Object.assign({}, thresholds, argThresholds);
 
-         if (argThresholds.s != null && argThresholds.ss == null) {
 
-             th.ss = argThresholds.s - 1;
 
-         }
 
-     }
 
-     locale = this.localeData();
 
-     output = relativeTime$1(this, !withSuffix, th, 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() {
 
-     // for ISO strings we do not use the normal bubbling rules:
 
-     //  * milliseconds bubble up until they become hours
 
-     //  * days do not bubble at all
 
-     //  * months bubble up until they become years
 
-     // This is because there is no context-free conversion between hours and days
 
-     // (think of clock changes)
 
-     // and also not between days and months (28-31 days per month)
 
-     if (!this.isValid()) {
 
-         return this.localeData().invalidDate();
 
-     }
 
-     var seconds = abs$1(this._milliseconds) / 1000,
 
-         days = abs$1(this._days),
 
-         months = abs$1(this._months),
 
-         minutes,
 
-         hours,
 
-         years,
 
-         s,
 
-         total = this.asSeconds(),
 
-         totalSign,
 
-         ymSign,
 
-         daysSign,
 
-         hmsSign;
 
-     if (!total) {
 
-         // this is the same as C#'s (Noda) and python (isodate)...
 
-         // but not other JS (goog.date)
 
-         return 'P0D';
 
-     }
 
-     // 3600 seconds -> 60 minutes -> 1 hour
 
-     minutes = absFloor(seconds / 60);
 
-     hours = absFloor(minutes / 60);
 
-     seconds %= 60;
 
-     minutes %= 60;
 
-     // 12 months -> 1 year
 
-     years = absFloor(months / 12);
 
-     months %= 12;
 
-     // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
 
-     s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : '';
 
-     totalSign = total < 0 ? '-' : '';
 
-     ymSign = sign(this._months) !== sign(total) ? '-' : '';
 
-     daysSign = sign(this._days) !== sign(total) ? '-' : '';
 
-     hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';
 
-     return (
 
-         totalSign +
 
-         'P' +
 
-         (years ? ymSign + years + 'Y' : '') +
 
-         (months ? ymSign + months + 'M' : '') +
 
-         (days ? daysSign + days + 'D' : '') +
 
-         (hours || minutes || seconds ? 'T' : '') +
 
-         (hours ? hmsSign + hours + 'H' : '') +
 
-         (minutes ? hmsSign + minutes + 'M' : '') +
 
-         (seconds ? 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;
 
- // 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) * 1000);
 
- });
 
- addParseToken('x', function (input, array, config) {
 
-     config._d = new Date(toInt(input));
 
- });
 
- //! moment.js
 
- hooks.version = '2.29.1';
 
- 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;
 
- // currently HTML5 input type only supports 24-hour formats
 
- hooks.HTML5_FMT = {
 
-     DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // <input type="datetime-local" />
 
-     DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // <input type="datetime-local" step="1" />
 
-     DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // <input type="datetime-local" step="0.001" />
 
-     DATE: 'YYYY-MM-DD', // <input type="date" />
 
-     TIME: 'HH:mm', // <input type="time" />
 
-     TIME_SECONDS: 'HH:mm:ss', // <input type="time" step="1" />
 
-     TIME_MS: 'HH:mm:ss.SSS', // <input type="time" step="0.001" />
 
-     WEEK: 'GGGG-[W]WW', // <input type="week" />
 
-     MONTH: 'YYYY-MM', // <input type="month" />
 
- };
 
- export default hooks;
 
 
  |