summaryrefslogtreecommitdiff
path: root/bin/wiki/ImportarDesdeURL/node_modules/chrono-node/chrono.map.json
blob: d7dba024fca00115bab3223dd2dad41c69f3abe0 (plain)
1
{"version":3,"sources":["node_modules/browser-pack/_prelude.js","node_modules/moment/locale/fr.js","node_modules/moment/moment.js","src/chrono.js","src/options.js","src/parsers/de/DECasualDateParser.js","src/parsers/de/DEDeadlineFormatParser.js","src/parsers/de/DEMonthNameLittleEndianParser.js","src/parsers/de/DEMonthNameParser.js","src/parsers/de/DESlashDateFormatParser.js","src/parsers/de/DETimeAgoFormatParser.js","src/parsers/de/DETimeExpressionParser.js","src/parsers/de/DEWeekdayParser.js","src/parsers/en/ENCasualDateParser.js","src/parsers/en/ENCasualTimeParser.js","src/parsers/en/ENDeadlineFormatParser.js","src/parsers/en/ENISOFormatParser.js","src/parsers/en/ENMonthNameLittleEndianParser.js","src/parsers/en/ENMonthNameMiddleEndianParser.js","src/parsers/en/ENMonthNameParser.js","src/parsers/en/ENRelativeDateFormatParser.js","src/parsers/en/ENSlashDateFormatParser.js","src/parsers/en/ENSlashDateFormatStartWithYearParser.js","src/parsers/en/ENSlashMonthFormatParser.js","src/parsers/en/ENTimeAgoFormatParser.js","src/parsers/en/ENTimeExpressionParser.js","src/parsers/en/ENTimeLaterFormatParser.js","src/parsers/en/ENWeekdayParser.js","src/parsers/es/ESCasualDateParser.js","src/parsers/es/ESDeadlineFormatParser.js","src/parsers/es/ESMonthNameLittleEndianParser.js","src/parsers/es/ESSlashDateFormatParser.js","src/parsers/es/ESTimeAgoFormatParser.js","src/parsers/es/ESTimeExpressionParser.js","src/parsers/es/ESWeekdayParser.js","src/parsers/fr/FRCasualDateParser.js","src/parsers/fr/FRDeadlineFormatParser.js","src/parsers/fr/FRMonthNameLittleEndianParser.js","src/parsers/fr/FRRelativeDateFormatParser.js","src/parsers/fr/FRSlashDateFormatParser.js","src/parsers/fr/FRTimeAgoFormatParser.js","src/parsers/fr/FRTimeExpressionParser.js","src/parsers/fr/FRWeekdayParser.js","src/parsers/ja/JPCasualDateParser.js","src/parsers/ja/JPStandardParser.js","src/parsers/parser.js","src/parsers/zh-Hant/ZHHantCasualDateParser.js","src/parsers/zh-Hant/ZHHantDateParser.js","src/parsers/zh-Hant/ZHHantDeadlineFormatParser.js","src/parsers/zh-Hant/ZHHantTimeExpressionParser.js","src/parsers/zh-Hant/ZHHantWeekdayParser.js","src/refiners/ExtractTimezoneAbbrRefiner.js","src/refiners/ExtractTimezoneOffsetRefiner.js","src/refiners/ForwardDateRefiner.js","src/refiners/OverlapRemovalRefiner.js","src/refiners/UnlikelyFormatFilter.js","src/refiners/de/DEMergeDateRangeRefiner.js","src/refiners/de/DEMergeDateTimeRefiner.js","src/refiners/en/ENMergeDateRangeRefiner.js","src/refiners/en/ENMergeDateTimeRefiner.js","src/refiners/en/ENPrioritizeSpecificDateRefiner.js","src/refiners/fr/FRMergeDateRangeRefiner.js","src/refiners/fr/FRMergeDateTimeRefiner.js","src/refiners/ja/JPMergeDateRangeRefiner.js","src/refiners/refiner.js","src/result.js","src/utils/DE.js","src/utils/EN.js","src/utils/ES.js","src/utils/FR.js","src/utils/JP.js","src/utils/ZH-Hant.js"],"names":["global","factory","exports","module","require","define","amd","moment","this","defineLocale","months","split","monthsShort","monthsParseExact","weekdays","weekdaysShort","weekdaysMin","weekdaysParseExact","longDateFormat","LT","LTS","L","LL","LLL","LLLL","calendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","relativeTime","future","past","s","ss","m","mm","h","hh","d","dd","M","MM","y","yy","dayOfMonthOrdinalParse","ordinal","number","period","week","dow","doy","hooks","hookCallback","apply","arguments","isArray","input","Array","Object","prototype","toString","call","isObject","isObjectEmpty","obj","getOwnPropertyNames","length","k","hasOwnProperty","isUndefined","isNumber","isDate","Date","map","arr","fn","i","res","push","hasOwnProp","a","b","extend","valueOf","createUTC","format","locale","strict","createLocalOrUTC","utc","defaultParsingFlags","empty","unusedTokens","unusedInput","overflow","charsLeftOver","nullInput","invalidMonth","invalidFormat","userInvalidated","iso","parsedDateParts","meridiem","rfc2822","weekdayMismatch","getParsingFlags","_pf","isValid","_isValid","flags","parsedParts","some","isNowValid","isNaN","_d","getTime","invalidWeekday","_strict","undefined","bigHour","isFrozen","createInvalid","NaN","copyConfig","to","from","prop","val","_isAMomentObject","_i","_f","_l","_tzm","_isUTC","_offset","_locale","momentProperties","Moment","config","updateInProgress","updateOffset","isMoment","absFloor","Math","ceil","floor","toInt","argumentForCoercion","coercedNumber","value","isFinite","compareArrays","array1","array2","dontConvert","len","min","lengthDiff","abs","diffs","warn","msg","suppressDeprecationWarnings","console","deprecate","firstTime","deprecationHandler","arg","args","key","slice","join","Error","stack","deprecateSimple","name","deprecations","isFunction","Function","set","_config","_dayOfMonthOrdinalParseLenient","RegExp","_dayOfMonthOrdinalParse","source","_ordinalParse","mergeConfigs","parentConfig","childConfig","Locale","mom","now","output","_calendar","_longDateFormat","formatUpper","toUpperCase","replace","invalidDate","_invalidDate","_ordinal","withoutSuffix","string","isFuture","_relativeTime","pastFuture","diff","addUnitAlias","unit","shorthand","lowerCase","toLowerCase","aliases","normalizeUnits","units","normalizeObjectUnits","inputObject","normalizedProp","normalizedInput","addUnitPriority","priority","priorities","getPrioritizedUnits","unitsObj","u","sort","zeroFill","targetLength","forceSign","absNumber","zerosToFill","pow","max","substr","addFormatToken","token","padded","callback","func","formatTokenFunctions","localeData","removeFormattingTokens","match","makeFormatFunction","array","formattingTokens","formatMoment","expandFormat","formatFunctions","replaceLongDateFormatTokens","localFormattingTokens","lastIndex","test","addRegexToken","regex","strictRegex","regexes","isStrict","getParseRegexForToken","unescapeFormat","regexEscape","matched","p1","p2","p3","p4","addParseToken","tokens","addWeekParseToken","_w","addTimeToArrayFromToken","_a","daysInYear","year","isLeapYear","getIsLeapYear","makeGetSet","keepTime","set$1","get","month","date","daysInMonth","stringGet","stringSet","prioritized","mod","n","x","modMonth","localeMonths","_months","isFormat","MONTHS_IN_FORMAT","localeMonthsShort","_monthsShort","handleStrictParse","monthName","ii","llc","toLocaleLowerCase","_monthsParse","_longMonthsParse","_shortMonthsParse","indexOf","localeMonthsParse","_monthsParseExact","setMonth","dayOfMonth","monthsParse","getSetMonth","getDaysInMonth","monthsShortRegex","computeMonthsParse","_monthsShortStrictRegex","_monthsShortRegex","defaultMonthsShortRegex","monthsRegex","_monthsStrictRegex","_monthsRegex","defaultMonthsRegex","cmpLenRev","shortPieces","longPieces","mixedPieces","createDate","ms","getFullYear","setFullYear","createUTCDate","UTC","getUTCFullYear","setUTCFullYear","firstWeekOffset","fwd","getUTCDay","dayOfYearFromWeeks","weekday","resYear","resDayOfYear","localWeekday","weekOffset","dayOfYear","weekOfYear","resWeek","weeksInYear","weekOffsetNext","localeWeek","_week","localeFirstDayOfWeek","localeFirstDayOfYear","getSetWeek","add","getSetISOWeek","parseWeekday","weekdaysParse","parseInt","parseIsoWeekday","localeWeekdays","_weekdays","day","localeWeekdaysShort","_weekdaysShort","localeWeekdaysMin","_weekdaysMin","handleStrictParse$1","weekdayName","_weekdaysParse","_shortWeekdaysParse","_minWeekdaysParse","localeWeekdaysParse","_weekdaysParseExact","_fullWeekdaysParse","getSetDayOfWeek","getDay","getSetLocaleDayOfWeek","getSetISODayOfWeek","weekdaysRegex","computeWeekdaysParse","_weekdaysStrictRegex","_weekdaysRegex","defaultWeekdaysRegex","weekdaysShortRegex","_weekdaysShortStrictRegex","_weekdaysShortRegex","defaultWeekdaysShortRegex","weekdaysMinRegex","_weekdaysMinStrictRegex","_weekdaysMinRegex","defaultWeekdaysMinRegex","minp","shortp","longp","minPieces","hFormat","hours","kFormat","lowercase","minutes","matchMeridiem","_meridiemParse","localeIsPM","charAt","localeMeridiem","isLower","normalizeLocale","chooseLocale","names","j","next","loadLocale","globalLocale","oldLocale","locales","_abbr","getSetGlobalLocale","e","values","data","getLocale","baseConfig","abbr","parentLocale","localeFamilies","forEach","updateLocale","tmpLocale","listLocales","keys","checkOverflow","MONTH","DATE","YEAR","HOUR","MINUTE","SECOND","MILLISECOND","_overflowDayOfYear","_overflowWeeks","WEEK","_overflowWeekday","WEEKDAY","defaults","c","currentDateArray","nowValue","_useUTC","getUTCMonth","getUTCDate","getMonth","getDate","configFromArray","currentDate","expectedWeekday","yearToUse","dayOfYearFromWeekInfo","_dayOfYear","_nextDay","setUTCMinutes","getUTCMinutes","w","weekYear","temp","weekdayOverflow","GG","W","E","createLocal","curWeek","gg","configFromISO","l","allowTime","dateFormat","timeFormat","tzFormat","extendedIsoRegex","exec","basicIsoRegex","isoDates","isoTimes","tzRegex","configFromStringAndFormat","extractFromRFC2822Strings","yearStr","monthStr","dayStr","hourStr","minuteStr","secondStr","result","untruncateYear","defaultLocaleMonthsShort","preprocessRFC2822","trim","checkWeekday","weekdayStr","parsedInput","defaultLocaleWeekdaysShort","calculateOffset","obsOffset","militaryOffset","numOffset","obsOffsets","hm","configFromRFC2822","parsedArray","configFromString","aspNetJsonRegex","createFromInputFallback","ISO_8601","RFC_2822","skipped","stringLength","totalParsedInputLength","_meridiem","meridiemFixWrap","hour","isPm","meridiemHour","isPM","configFromStringAndArray","tempConfig","bestMoment","scoreToBeat","currentScore","score","configFromObject","minute","second","millisecond","createFromConfig","prepareConfig","preparse","configFromInput","isUTC","pickBy","moments","isDurationValid","ordering","unitHasDecimal","parseFloat","isValid$1","createInvalid$1","createDuration","Duration","duration","years","quarters","quarter","weeks","days","seconds","milliseconds","_milliseconds","_days","_data","_bubble","isDuration","absRound","round","offset","separator","utcOffset","sign","offsetFromString","matcher","matches","chunk","parts","chunkOffset","cloneWithOffset","model","clone","setTime","local","getDateOffset","getTimezoneOffset","getSetOffset","keepLocalTime","keepMinutes","localAdjust","matchShortOffset","_changeInProgress","addSubtract","getSetZone","setOffsetToUTC","setOffsetToLocal","subtract","setOffsetToParsedOffset","tZone","matchOffset","hasAlignedHourOffset","isDaylightSavingTime","isDaylightSavingTimeShifted","_isDSTShifted","other","toArray","isLocal","isUtcOffset","isUtc","ret","diffRes","aspNetRegex","isoRegex","parseIso","momentsDifference","inp","positiveMomentsDifference","base","isAfter","isBefore","createAdder","direction","dur","tmp","isAdding","getCalendarFormat","myMoment","calendar$1","time","formats","sod","startOf","calendarFormat","localInput","endOf","isBetween","inclusivity","isSame","inputMs","isSameOrAfter","isSameOrBefore","asFloat","that","zoneDelta","monthDiff","anchor2","adjust","wholeMonthDiff","anchor","toISOString","keepOffset","toDate","inspect","zone","prefix","suffix","inputString","defaultFormatUtc","defaultFormat","postformat","humanize","fromNow","toNow","newLocaleData","isoWeekday","unix","toObject","toJSON","isValid$2","parsingFlags","invalidAt","creationData","addWeekYearFormatToken","getter","getSetWeekYear","getSetWeekYearHelper","getSetISOWeekYear","isoWeek","getISOWeeksInYear","getWeeksInYear","weekInfo","weeksTarget","setWeekAll","dayOfYearData","getSetQuarter","getSetDayOfYear","parseMs","getZoneAbbr","getZoneName","createUnix","createInZone","parseZone","preParsePostFormat","get$1","index","field","setter","listMonthsImpl","out","listWeekdaysImpl","localeSorted","shift","listMonths","listMonthsShort","listWeekdays","listWeekdaysShort","listWeekdaysMin","mathAbs","addSubtract$1","add$1","subtract$1","absCeil","bubble","monthsFromDays","monthsToDays","daysToMonths","as","valueOf$1","makeAs","alias","clone$1","get$2","makeGetter","substituteTimeAgo","relativeTime$1","posNegDuration","thresholds","getSetRelativeTimeRounding","roundingFunction","getSetRelativeTimeThreshold","threshold","limit","withSuffix","toISOString$1","abs$1","Y","D","toFixed","total","asSeconds","totalSign","ymSign","daysSign","hmsSign","fun","t","defaultCalendar","defaultLongDateFormat","defaultDayOfMonthOrdinalParse","defaultRelativeTime","match1","match2","match3","match4","match6","match1to2","match3to4","match5to6","match1to3","match1to4","match1to6","matchUnsigned","matchSigned","matchTimestamp","matchWord","parseTwoDigitYear","getSetYear","o","defaultLocaleMonths","defaultLocaleWeek","defaultLocaleWeekdays","defaultLocaleWeekdaysMin","kInput","_isPm","pos","pos1","pos2","defaultLocaleMeridiemParse","getSetHour","meridiemParse","UT","GMT","EDT","EST","CDT","CST","MDT","MST","PDT","PST","prototypeMin","prototypeMax","invalid","lang","isoWeekYear","getSetDayOfMonth","getSetMinute","getSetSecond","getSetMillisecond","proto","isoWeeks","isoWeeksInYear","isDST","zoneAbbr","zoneName","dates","isDSTShifted","proto$1","firstDayOfYear","firstDayOfWeek","langData","asMilliseconds","asMinutes","asHours","asDays","asWeeks","asMonths","asYears","proto$2","toIsoString","version","relativeTimeRounding","relativeTimeThreshold","HTML5_FMT","DATETIME_LOCAL","DATETIME_LOCAL_SECONDS","DATETIME_LOCAL_MS","TIME","TIME_SECONDS","TIME_MS","options","parser","refiner","Parser","Refiner","Filter","ParsedResult","ParsedComponents","Chrono","option","casualOption","parsers","refiners","parse","text","refDate","opt","forwardDate","allResults","results","execute","concat","refine","parseDate","start","strictOption","casual","en","mergeOptions","commonPostProcessing","en_GB","de","es","fr","ja","addedTypes","mergedOption","p","constructor","r","ExtractTimezoneOffsetRefiner","ExtractTimezoneAbbrRefiner","UnlikelyFormatFilter","strictConfig","zh","DEDeadlineFormatParser","DEMonthNameLittleEndianParser","DEMonthNameParser","DESlashDateFormatParser","DETimeAgoFormatParser","DETimeExpressionParser","OverlapRemovalRefiner","ForwardDateRefiner","DEMergeDateTimeRefiner","DEMergeDateRangeRefiner","unshift","DECasualDateParser","DEWeekdayParser","ENISOFormatParser","ENDeadlineFormatParser","ENMonthNameLittleEndianParser","ENMonthNameMiddleEndianParser","ENMonthNameParser","ENSlashDateFormatParser","ENSlashDateFormatStartWithYearParser","ENSlashMonthFormatParser","ENTimeAgoFormatParser","ENTimeLaterFormatParser","ENTimeExpressionParser","ENMergeDateTimeRefiner","ENMergeDateRangeRefiner","ENPrioritizeSpecificDateRefiner","ENCasualDateParser","ENCasualTimeParser","ENWeekdayParser","ENRelativeDateFormatParser","littleEndian","JPStandardParser","JPMergeDateRangeRefiner","JPCasualDateParser","ESTimeAgoFormatParser","ESDeadlineFormatParser","ESTimeExpressionParser","ESMonthNameLittleEndianParser","ESSlashDateFormatParser","ESCasualDateParser","ESWeekdayParser","FRDeadlineFormatParser","FRMonthNameLittleEndianParser","FRSlashDateFormatParser","FRTimeAgoFormatParser","FRTimeExpressionParser","FRMergeDateRangeRefiner","FRMergeDateTimeRefiner","FRCasualDateParser","FRWeekdayParser","FRRelativeDateFormatParser","ZHHantDateParser","ZHHantWeekdayParser","ZHHantTimeExpressionParser","ZHHantCasualDateParser","ZHHantDeadlineFormatParser","PATTERN","pattern","extract","ref","refMoment","startMoment","lowerText","imply","secondMatch","assign","tags","util","INTEGER_WORDS_PATTERN","STRICT_PATTERN","isStrictMode","num","INTEGER_WORDS","WEEKDAY_GROUP","DATE_GROUP","DATE_TO_GROUP","MONTH_NAME_GROUP","YEAR_GROUP","YEAR_BE_GROUP","MONTH_OFFSET","nextYear","lastYear","WEEKDAY_OFFSET","end","YEAR_GROUP2","YEAR_BE_GROUP2","DAYS_OFFSET","sonntag","so","montag","mo","dienstag","di","mittwoch","mi","donnerstag","do","freitag","samstag","sa","OPENNING_GROUP","ENDING_GROUP","DAY_GROUP","MONTH_GROUP","argument","FIRST_REG_PATTERN","SECOND_REG_PATTERN","HOUR_GROUP","MINUTE_GROUP","SECOND_GROUP","AM_PM_HOUR_GROUP","substring","ampm","isCertain","PREFIX_GROUP","POSTFIX_GROUP","dayOfWeek","postfix","refOffset","norm","TIME_MATCH","YEAR_NUMBER_GROUP","MONTH_NUMBER_GROUP","DATE_NUMBER_GROUP","HOUR_NUMBER_GROUP","MINUTE_NUMBER_GROUP","SECOND_NUMBER_GROUP","MILLISECOND_NUMBER_GROUP","TZD_HOUR_OFFSET_GROUP","TZD_MINUTE_OFFSET_GROUP","minuteOffset","hourOffset","ORDINAL_WORDS_PATTERN","MONTH_PATTERN","DATE_NUM_GROUP","DATE_TO_NUM_GROUP","ORDINAL_WORDS","endDate","yearBE","MODIFIER_WORD_GROUP","MULTIPLIER_WORD_GROUP","RELATIVE_WORD_GROUP","modifier","sunday","sun","monday","mon","tuesday","wednesday","wed","thursday","thur","friday","fri","saturday","sat","FIRST_NUMBERS_GROUP","SECOND_NUMBERS_GROUP","tday","TIME_UNIT_PATTERN","TIME_UNIT_STRICT_PATTERN","fragments","extractDateTimeUnitFragments","MILLI_SECOND_GROUP","preamble","tues","tue","thurs","thu","updateParsedComponent","startMomentFixed","firstMatch","domingo","dom","lunes","lun","martes","mar","miercoles","miércoles","mie","jueves","jue","viernes","vier","sábado","sabado","sab","originalLocale","MULTIPLIER_GROUP","MODIFIER_1_GROUP","MODIFIER_2_GROUP","multiplier","modifierFactor","dateFrom","dateTo","relative","dateTmp","dimanche","dim","lundi","mardi","mercredi","mer","jeudi","jeu","vendredi","ven","samedi","sam","ERA_GROUP","toHankaku","strictMode","remainingText","hasPossibleDates","NOW_GROUP","DAY_GROUP_1","TIME_GROUP_1","TIME_GROUP_2","DAY_GROUP_3","TIME_GROUP_3","day1","time1","timeString2","time2","day3","timeString3","time3","NUMBER","zhStringToNumber","zhStringToYear","NUMBER_GROUP","UNIT_GROUP","unitAbbr","patternString1","patternString2","ZH_AM_PM_HOUR_GROUP_1","ZH_AM_PM_HOUR_GROUP_2","ZH_AM_PM_HOUR_GROUP_3","ZHTimeExpressionParser","zhAMPMString1","zhAMPM1","zhAMPMString2","zhAMPM2","zhAMPMString3","zhAMPM3","endMoment","TIMEZONE_NAME_PATTERN","DEFAULT_TIMEZONE_ABBR_MAP","ACDT","ACST","ADT","AEDT","AEST","AFT","AKDT","AKST","ALMT","AMST","AMT","ANAST","ANAT","AQTT","ART","AST","AWDT","AWST","AZOST","AZOT","AZST","AZT","BNT","BOT","BRST","BRT","BST","BTT","CAST","CAT","CCT","CEST","CET","CHADT","CHAST","CKT","CLST","CLT","COT","CVT","CXT","ChST","DAVT","EASST","EAST","EAT","ECT","EEST","EET","EGST","EGT","ET","FJST","FJT","FKST","FKT","FNT","GALT","GAMT","GET","GFT","GILT","GST","GYT","HAA","HAC","HADT","HAE","HAP","HAR","HAST","HAT","HAY","HKT","HLV","HNA","HNC","HNE","HNP","HNR","HNT","HNY","HOVT","ICT","IDT","IOT","IRDT","IRKST","IRKT","IRST","IST","JST","KGT","KRAST","KRAT","KST","KUYT","LHDT","LHST","LINT","MAGST","MAGT","MART","MAWT","MESZ","MEZ","MHT","MMT","MSD","MSK","MUT","MVT","MYT","NCT","NDT","NFT","NOVST","NOVT","NPT","NST","NUT","NZDT","NZST","OMSST","OMST","PET","PETST","PETT","PGT","PHOT","PHT","PKT","PMDT","PMST","PONT","PT","PWT","PYST","PYT","RET","SAMT","SAST","SBT","SCT","SGT","SRT","SST","TAHT","TFT","TJT","TKT","TLT","TMT","TVT","ULAT","UYST","UYT","UZT","VET","VLAST","VLAT","VUT","WAST","WAT","WEST","WESZ","WET","WEZ","WFT","WGST","WGT","WIB","WIT","WITA","WST","WT","YAKST","YAKT","YAPT","YEKST","YEKT","timezones","timezoneAbbr","timezoneOffset","TIMEZONE_OFFSET_PATTERN","TIMEZONE_OFFSET_SIGN_GROUP","TIMEZONE_OFFSET_HOUR_OFFSET_GROUP","TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP","filteredResults","prevResult","isAbleToMerge","curResult","mergeResult","dateResult","timeResult","beginDate","beginTime","beginDateTime","mergeDateTimeComponent","endTime","endDateTime","startIndex","endIndex","tag","isDateOnly","isTimeOnly","mergedResult","currResult","result1","result2","begin","isWeekdayResult","fromResult","toResult","knownValues","fromMoment","toMoment","dateComponent","timeComponent","dateTimeComponent","isMoreSpecific","moreSpecific","textBetween","includesRelativeResult","referToSameDate","specificResult","nonSpecificResult","filteredResult","components","impliedValues","JSON","stringify","isPossibleDate","component","dateMoment","currentTimezoneOffset","targetTimezoneOffset","adjustTimezoneOffset","januar","jan","jan.","februar","feb","feb.","märz","maerz","mär","mär.","mrz","mrz.","april","apr","apr.","mai","juni","jun","jun.","juli","jul","jul.","august","aug","aug.","september","sep","sep.","sept","sept.","oktober","okt","okt.","november","nov","nov.","dezember","dez","dez.","eins","zwei","drei","fünf","fuenf","sechs","sieben","acht","neun","zehn","elf","zwölf","zwoelf","collectDateTimeFragment","january","february","march","mar.","may","june","july","october","oct","oct.","december","dec","dec.","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","first","third","fourth","fifth","sixth","seventh","eighth","ninth","tenth","eleventh","twelfth","thirteenth","fourteenth","fifteenth","sixteenth","seventeenth","eighteenth","nineteenth","twentieth","twenty first","twenty second","twenty third","twenty fourth","twenty fifth","twenty sixth","twenty seventh","twenty eighth","twenty ninth","thirtieth","thirty first","TIME_UNIT","TIME_UNIT_STRICT","PATTERN_TIME_UNIT","timeunitText","vie","enero","ene","ene.","febrero","marzo","abril","abr","abr.","mayo","may.","junio","julio","agosto","ago","ago.","septiembre","octubre","noviembre","diciembre","dic","dic.","janvier","février","fév","fév.","fevrier","fev","fev.","mars","avril","avr","avr.","juin","juillet","août","aout","septembre","octobre","novembre","décembre","decembre","un","deux","trois","quatre","cinq","huit","neuf","dix","onze","douze","treize","String","fromCharCode","alphaNum","charCodeAt","toZenkaku","零","一","二","兩","三","四","五","六","七","八","九","十","廿","卅","天","日","char"],"mappings":"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","file":"bundle.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()","//! moment.js locale configuration\n\n;(function (global, factory) {\n   typeof exports === 'object' && typeof module !== 'undefined'\n       && typeof require === 'function' ? factory(require('../moment')) :\n   typeof define === 'function' && define.amd ? define(['../moment'], factory) :\n   factory(global.moment)\n}(this, (function (moment) { 'use strict';\n\n\nvar fr = moment.defineLocale('fr', {\n    months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),\n    monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),\n    monthsParseExact : true,\n    weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),\n    weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),\n    weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'),\n    weekdaysParseExact : true,\n    longDateFormat : {\n        LT : 'HH:mm',\n        LTS : 'HH:mm:ss',\n        L : 'DD/MM/YYYY',\n        LL : 'D MMMM YYYY',\n        LLL : 'D MMMM YYYY HH:mm',\n        LLLL : 'dddd D MMMM YYYY HH:mm'\n    },\n    calendar : {\n        sameDay : '[Aujourd’hui à] LT',\n        nextDay : '[Demain à] LT',\n        nextWeek : 'dddd [à] LT',\n        lastDay : '[Hier à] LT',\n        lastWeek : 'dddd [dernier à] LT',\n        sameElse : 'L'\n    },\n    relativeTime : {\n        future : 'dans %s',\n        past : 'il y a %s',\n        s : 'quelques secondes',\n        ss : '%d secondes',\n        m : 'une minute',\n        mm : '%d minutes',\n        h : 'une heure',\n        hh : '%d heures',\n        d : 'un jour',\n        dd : '%d jours',\n        M : 'un mois',\n        MM : '%d mois',\n        y : 'un an',\n        yy : '%d ans'\n    },\n    dayOfMonthOrdinalParse: /\\d{1,2}(er|)/,\n    ordinal : function (number, period) {\n        switch (period) {\n            // TODO: Return 'e' when day of month > 1. Move this case inside\n            // block for masculine words below.\n            // See https://github.com/moment/moment/issues/3375\n            case 'D':\n                return number + (number === 1 ? 'er' : '');\n\n            // Words with masculine grammatical gender: mois, trimestre, jour\n            default:\n            case 'M':\n            case 'Q':\n            case 'DDD':\n            case 'd':\n                return number + (number === 1 ? 'er' : 'e');\n\n            // Words with feminine grammatical gender: semaine\n            case 'w':\n            case 'W':\n                return number + (number === 1 ? 're' : 'e');\n        }\n    },\n    week : {\n        dow : 1, // Monday is the first day of the week.\n        doy : 4  // The week that contains Jan 4th is the first week of the year.\n    }\n});\n\nreturn fr;\n\n})));\n","//! moment.js\n\n;(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    global.moment = factory()\n}(this, (function () { 'use strict';\n\nvar hookCallback;\n\nfunction hooks () {\n    return hookCallback.apply(null, arguments);\n}\n\n// This is done to register the method called with moment()\n// without creating circular dependencies.\nfunction setHookCallback (callback) {\n    hookCallback = callback;\n}\n\nfunction isArray(input) {\n    return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';\n}\n\nfunction isObject(input) {\n    // IE8 will treat undefined and null as object if it wasn't for\n    // input != null\n    return input != null && Object.prototype.toString.call(input) === '[object Object]';\n}\n\nfunction isObjectEmpty(obj) {\n    if (Object.getOwnPropertyNames) {\n        return (Object.getOwnPropertyNames(obj).length === 0);\n    } else {\n        var k;\n        for (k in obj) {\n            if (obj.hasOwnProperty(k)) {\n                return false;\n            }\n        }\n        return true;\n    }\n}\n\nfunction isUndefined(input) {\n    return input === void 0;\n}\n\nfunction isNumber(input) {\n    return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';\n}\n\nfunction isDate(input) {\n    return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\n}\n\nfunction map(arr, fn) {\n    var res = [], i;\n    for (i = 0; i < arr.length; ++i) {\n        res.push(fn(arr[i], i));\n    }\n    return res;\n}\n\nfunction hasOwnProp(a, b) {\n    return Object.prototype.hasOwnProperty.call(a, b);\n}\n\nfunction extend(a, b) {\n    for (var i in b) {\n        if (hasOwnProp(b, i)) {\n            a[i] = b[i];\n        }\n    }\n\n    if (hasOwnProp(b, 'toString')) {\n        a.toString = b.toString;\n    }\n\n    if (hasOwnProp(b, 'valueOf')) {\n        a.valueOf = b.valueOf;\n    }\n\n    return a;\n}\n\nfunction createUTC (input, format, locale, strict) {\n    return createLocalOrUTC(input, format, locale, strict, true).utc();\n}\n\nfunction defaultParsingFlags() {\n    // We need to deep clone this object.\n    return {\n        empty           : false,\n        unusedTokens    : [],\n        unusedInput     : [],\n        overflow        : -2,\n        charsLeftOver   : 0,\n        nullInput       : false,\n        invalidMonth    : null,\n        invalidFormat   : false,\n        userInvalidated : false,\n        iso             : false,\n        parsedDateParts : [],\n        meridiem        : null,\n        rfc2822         : false,\n        weekdayMismatch : false\n    };\n}\n\nfunction getParsingFlags(m) {\n    if (m._pf == null) {\n        m._pf = defaultParsingFlags();\n    }\n    return m._pf;\n}\n\nvar some;\nif (Array.prototype.some) {\n    some = Array.prototype.some;\n} else {\n    some = function (fun) {\n        var t = Object(this);\n        var len = t.length >>> 0;\n\n        for (var i = 0; i < len; i++) {\n            if (i in t && fun.call(this, t[i], i, t)) {\n                return true;\n            }\n        }\n\n        return false;\n    };\n}\n\nfunction isValid(m) {\n    if (m._isValid == null) {\n        var flags = getParsingFlags(m);\n        var parsedParts = some.call(flags.parsedDateParts, function (i) {\n            return i != null;\n        });\n        var isNowValid = !isNaN(m._d.getTime()) &&\n            flags.overflow < 0 &&\n            !flags.empty &&\n            !flags.invalidMonth &&\n            !flags.invalidWeekday &&\n            !flags.weekdayMismatch &&\n            !flags.nullInput &&\n            !flags.invalidFormat &&\n            !flags.userInvalidated &&\n            (!flags.meridiem || (flags.meridiem && parsedParts));\n\n        if (m._strict) {\n            isNowValid = isNowValid &&\n                flags.charsLeftOver === 0 &&\n                flags.unusedTokens.length === 0 &&\n                flags.bigHour === undefined;\n        }\n\n        if (Object.isFrozen == null || !Object.isFrozen(m)) {\n            m._isValid = isNowValid;\n        }\n        else {\n            return isNowValid;\n        }\n    }\n    return m._isValid;\n}\n\nfunction createInvalid (flags) {\n    var m = createUTC(NaN);\n    if (flags != null) {\n        extend(getParsingFlags(m), flags);\n    }\n    else {\n        getParsingFlags(m).userInvalidated = true;\n    }\n\n    return m;\n}\n\n// Plugins that add properties should also add the key here (null value),\n// so we can properly clone ourselves.\nvar momentProperties = hooks.momentProperties = [];\n\nfunction copyConfig(to, from) {\n    var i, prop, val;\n\n    if (!isUndefined(from._isAMomentObject)) {\n        to._isAMomentObject = from._isAMomentObject;\n    }\n    if (!isUndefined(from._i)) {\n        to._i = from._i;\n    }\n    if (!isUndefined(from._f)) {\n        to._f = from._f;\n    }\n    if (!isUndefined(from._l)) {\n        to._l = from._l;\n    }\n    if (!isUndefined(from._strict)) {\n        to._strict = from._strict;\n    }\n    if (!isUndefined(from._tzm)) {\n        to._tzm = from._tzm;\n    }\n    if (!isUndefined(from._isUTC)) {\n        to._isUTC = from._isUTC;\n    }\n    if (!isUndefined(from._offset)) {\n        to._offset = from._offset;\n    }\n    if (!isUndefined(from._pf)) {\n        to._pf = getParsingFlags(from);\n    }\n    if (!isUndefined(from._locale)) {\n        to._locale = from._locale;\n    }\n\n    if (momentProperties.length > 0) {\n        for (i = 0; i < momentProperties.length; i++) {\n            prop = momentProperties[i];\n            val = from[prop];\n            if (!isUndefined(val)) {\n                to[prop] = val;\n            }\n        }\n    }\n\n    return to;\n}\n\nvar updateInProgress = false;\n\n// Moment prototype object\nfunction Moment(config) {\n    copyConfig(this, config);\n    this._d = new Date(config._d != null ? config._d.getTime() : NaN);\n    if (!this.isValid()) {\n        this._d = new Date(NaN);\n    }\n    // Prevent infinite loop in case updateOffset creates new moment\n    // objects.\n    if (updateInProgress === false) {\n        updateInProgress = true;\n        hooks.updateOffset(this);\n        updateInProgress = false;\n    }\n}\n\nfunction isMoment (obj) {\n    return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);\n}\n\nfunction absFloor (number) {\n    if (number < 0) {\n        // -0 -> 0\n        return Math.ceil(number) || 0;\n    } else {\n        return Math.floor(number);\n    }\n}\n\nfunction toInt(argumentForCoercion) {\n    var coercedNumber = +argumentForCoercion,\n        value = 0;\n\n    if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n        value = absFloor(coercedNumber);\n    }\n\n    return value;\n}\n\n// compare two arrays, return the number of differences\nfunction compareArrays(array1, array2, dontConvert) {\n    var len = Math.min(array1.length, array2.length),\n        lengthDiff = Math.abs(array1.length - array2.length),\n        diffs = 0,\n        i;\n    for (i = 0; i < len; i++) {\n        if ((dontConvert && array1[i] !== array2[i]) ||\n            (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {\n            diffs++;\n        }\n    }\n    return diffs + lengthDiff;\n}\n\nfunction warn(msg) {\n    if (hooks.suppressDeprecationWarnings === false &&\n            (typeof console !==  'undefined') && console.warn) {\n        console.warn('Deprecation warning: ' + msg);\n    }\n}\n\nfunction deprecate(msg, fn) {\n    var firstTime = true;\n\n    return extend(function () {\n        if (hooks.deprecationHandler != null) {\n            hooks.deprecationHandler(null, msg);\n        }\n        if (firstTime) {\n            var args = [];\n            var arg;\n            for (var i = 0; i < arguments.length; i++) {\n                arg = '';\n                if (typeof arguments[i] === 'object') {\n                    arg += '\\n[' + i + '] ';\n                    for (var key in arguments[0]) {\n                        arg += key + ': ' + arguments[0][key] + ', ';\n                    }\n                    arg = arg.slice(0, -2); // Remove trailing comma and space\n                } else {\n                    arg = arguments[i];\n                }\n                args.push(arg);\n            }\n            warn(msg + '\\nArguments: ' + Array.prototype.slice.call(args).join('') + '\\n' + (new Error()).stack);\n            firstTime = false;\n        }\n        return fn.apply(this, arguments);\n    }, fn);\n}\n\nvar deprecations = {};\n\nfunction deprecateSimple(name, msg) {\n    if (hooks.deprecationHandler != null) {\n        hooks.deprecationHandler(name, msg);\n    }\n    if (!deprecations[name]) {\n        warn(msg);\n        deprecations[name] = true;\n    }\n}\n\nhooks.suppressDeprecationWarnings = false;\nhooks.deprecationHandler = null;\n\nfunction isFunction(input) {\n    return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n}\n\nfunction set (config) {\n    var prop, i;\n    for (i in config) {\n        prop = config[i];\n        if (isFunction(prop)) {\n            this[i] = prop;\n        } else {\n            this['_' + i] = prop;\n        }\n    }\n    this._config = config;\n    // Lenient ordinal parsing accepts just a number in addition to\n    // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.\n    // TODO: Remove \"ordinalParse\" fallback in next major release.\n    this._dayOfMonthOrdinalParseLenient = new RegExp(\n        (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +\n            '|' + (/\\d{1,2}/).source);\n}\n\nfunction mergeConfigs(parentConfig, childConfig) {\n    var res = extend({}, parentConfig), prop;\n    for (prop in childConfig) {\n        if (hasOwnProp(childConfig, prop)) {\n            if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {\n                res[prop] = {};\n                extend(res[prop], parentConfig[prop]);\n                extend(res[prop], childConfig[prop]);\n            } else if (childConfig[prop] != null) {\n                res[prop] = childConfig[prop];\n            } else {\n                delete res[prop];\n            }\n        }\n    }\n    for (prop in parentConfig) {\n        if (hasOwnProp(parentConfig, prop) &&\n                !hasOwnProp(childConfig, prop) &&\n                isObject(parentConfig[prop])) {\n            // make sure changes to properties don't modify parent config\n            res[prop] = extend({}, res[prop]);\n        }\n    }\n    return res;\n}\n\nfunction Locale(config) {\n    if (config != null) {\n        this.set(config);\n    }\n}\n\nvar keys;\n\nif (Object.keys) {\n    keys = Object.keys;\n} else {\n    keys = function (obj) {\n        var i, res = [];\n        for (i in obj) {\n            if (hasOwnProp(obj, i)) {\n                res.push(i);\n            }\n        }\n        return res;\n    };\n}\n\nvar defaultCalendar = {\n    sameDay : '[Today at] LT',\n    nextDay : '[Tomorrow at] LT',\n    nextWeek : 'dddd [at] LT',\n    lastDay : '[Yesterday at] LT',\n    lastWeek : '[Last] dddd [at] LT',\n    sameElse : 'L'\n};\n\nfunction calendar (key, mom, now) {\n    var output = this._calendar[key] || this._calendar['sameElse'];\n    return isFunction(output) ? output.call(mom, now) : output;\n}\n\nvar defaultLongDateFormat = {\n    LTS  : 'h:mm:ss A',\n    LT   : 'h:mm A',\n    L    : 'MM/DD/YYYY',\n    LL   : 'MMMM D, YYYY',\n    LLL  : 'MMMM D, YYYY h:mm A',\n    LLLL : 'dddd, MMMM D, YYYY h:mm A'\n};\n\nfunction longDateFormat (key) {\n    var format = this._longDateFormat[key],\n        formatUpper = this._longDateFormat[key.toUpperCase()];\n\n    if (format || !formatUpper) {\n        return format;\n    }\n\n    this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {\n        return val.slice(1);\n    });\n\n    return this._longDateFormat[key];\n}\n\nvar defaultInvalidDate = 'Invalid date';\n\nfunction invalidDate () {\n    return this._invalidDate;\n}\n\nvar defaultOrdinal = '%d';\nvar defaultDayOfMonthOrdinalParse = /\\d{1,2}/;\n\nfunction ordinal (number) {\n    return this._ordinal.replace('%d', number);\n}\n\nvar defaultRelativeTime = {\n    future : 'in %s',\n    past   : '%s ago',\n    s  : 'a few seconds',\n    ss : '%d seconds',\n    m  : 'a minute',\n    mm : '%d minutes',\n    h  : 'an hour',\n    hh : '%d hours',\n    d  : 'a day',\n    dd : '%d days',\n    M  : 'a month',\n    MM : '%d months',\n    y  : 'a year',\n    yy : '%d years'\n};\n\nfunction relativeTime (number, withoutSuffix, string, isFuture) {\n    var output = this._relativeTime[string];\n    return (isFunction(output)) ?\n        output(number, withoutSuffix, string, isFuture) :\n        output.replace(/%d/i, number);\n}\n\nfunction pastFuture (diff, output) {\n    var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n    return isFunction(format) ? format(output) : format.replace(/%s/i, output);\n}\n\nvar aliases = {};\n\nfunction addUnitAlias (unit, shorthand) {\n    var lowerCase = unit.toLowerCase();\n    aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;\n}\n\nfunction normalizeUnits(units) {\n    return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;\n}\n\nfunction normalizeObjectUnits(inputObject) {\n    var normalizedInput = {},\n        normalizedProp,\n        prop;\n\n    for (prop in inputObject) {\n        if (hasOwnProp(inputObject, prop)) {\n            normalizedProp = normalizeUnits(prop);\n            if (normalizedProp) {\n                normalizedInput[normalizedProp] = inputObject[prop];\n            }\n        }\n    }\n\n    return normalizedInput;\n}\n\nvar priorities = {};\n\nfunction addUnitPriority(unit, priority) {\n    priorities[unit] = priority;\n}\n\nfunction getPrioritizedUnits(unitsObj) {\n    var units = [];\n    for (var u in unitsObj) {\n        units.push({unit: u, priority: priorities[u]});\n    }\n    units.sort(function (a, b) {\n        return a.priority - b.priority;\n    });\n    return units;\n}\n\nfunction zeroFill(number, targetLength, forceSign) {\n    var absNumber = '' + Math.abs(number),\n        zerosToFill = targetLength - absNumber.length,\n        sign = number >= 0;\n    return (sign ? (forceSign ? '+' : '') : '-') +\n        Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;\n}\n\nvar formattingTokens = /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;\n\nvar localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g;\n\nvar formatFunctions = {};\n\nvar formatTokenFunctions = {};\n\n// token:    'M'\n// padded:   ['MM', 2]\n// ordinal:  'Mo'\n// callback: function () { this.month() + 1 }\nfunction addFormatToken (token, padded, ordinal, callback) {\n    var func = callback;\n    if (typeof callback === 'string') {\n        func = function () {\n            return this[callback]();\n        };\n    }\n    if (token) {\n        formatTokenFunctions[token] = func;\n    }\n    if (padded) {\n        formatTokenFunctions[padded[0]] = function () {\n            return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n        };\n    }\n    if (ordinal) {\n        formatTokenFunctions[ordinal] = function () {\n            return this.localeData().ordinal(func.apply(this, arguments), token);\n        };\n    }\n}\n\nfunction removeFormattingTokens(input) {\n    if (input.match(/\\[[\\s\\S]/)) {\n        return input.replace(/^\\[|\\]$/g, '');\n    }\n    return input.replace(/\\\\/g, '');\n}\n\nfunction makeFormatFunction(format) {\n    var array = format.match(formattingTokens), i, length;\n\n    for (i = 0, length = array.length; i < length; i++) {\n        if (formatTokenFunctions[array[i]]) {\n            array[i] = formatTokenFunctions[array[i]];\n        } else {\n            array[i] = removeFormattingTokens(array[i]);\n        }\n    }\n\n    return function (mom) {\n        var output = '', i;\n        for (i = 0; i < length; i++) {\n            output += isFunction(array[i]) ? array[i].call(mom, format) : array[i];\n        }\n        return output;\n    };\n}\n\n// format date using native date object\nfunction formatMoment(m, format) {\n    if (!m.isValid()) {\n        return m.localeData().invalidDate();\n    }\n\n    format = expandFormat(format, m.localeData());\n    formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);\n\n    return formatFunctions[format](m);\n}\n\nfunction expandFormat(format, locale) {\n    var i = 5;\n\n    function replaceLongDateFormatTokens(input) {\n        return locale.longDateFormat(input) || input;\n    }\n\n    localFormattingTokens.lastIndex = 0;\n    while (i >= 0 && localFormattingTokens.test(format)) {\n        format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);\n        localFormattingTokens.lastIndex = 0;\n        i -= 1;\n    }\n\n    return format;\n}\n\nvar match1         = /\\d/;            //       0 - 9\nvar match2         = /\\d\\d/;          //      00 - 99\nvar match3         = /\\d{3}/;         //     000 - 999\nvar match4         = /\\d{4}/;         //    0000 - 9999\nvar match6         = /[+-]?\\d{6}/;    // -999999 - 999999\nvar match1to2      = /\\d\\d?/;         //       0 - 99\nvar match3to4      = /\\d\\d\\d\\d?/;     //     999 - 9999\nvar match5to6      = /\\d\\d\\d\\d\\d\\d?/; //   99999 - 999999\nvar match1to3      = /\\d{1,3}/;       //       0 - 999\nvar match1to4      = /\\d{1,4}/;       //       0 - 9999\nvar match1to6      = /[+-]?\\d{1,6}/;  // -999999 - 999999\n\nvar matchUnsigned  = /\\d+/;           //       0 - inf\nvar matchSigned    = /[+-]?\\d+/;      //    -inf - inf\n\nvar matchOffset    = /Z|[+-]\\d\\d:?\\d\\d/gi; // +00:00 -00:00 +0000 -0000 or Z\nvar matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n\nvar matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/; // 123456789 123456789.123\n\n// any word (or two) characters or numbers including two/three word month in arabic.\n// includes scottish gaelic two word and hyphenated months\nvar 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;\n\nvar regexes = {};\n\nfunction addRegexToken (token, regex, strictRegex) {\n    regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {\n        return (isStrict && strictRegex) ? strictRegex : regex;\n    };\n}\n\nfunction getParseRegexForToken (token, config) {\n    if (!hasOwnProp(regexes, token)) {\n        return new RegExp(unescapeFormat(token));\n    }\n\n    return regexes[token](config._strict, config._locale);\n}\n\n// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\nfunction unescapeFormat(s) {\n    return regexEscape(s.replace('\\\\', '').replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (matched, p1, p2, p3, p4) {\n        return p1 || p2 || p3 || p4;\n    }));\n}\n\nfunction regexEscape(s) {\n    return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n}\n\nvar tokens = {};\n\nfunction addParseToken (token, callback) {\n    var i, func = callback;\n    if (typeof token === 'string') {\n        token = [token];\n    }\n    if (isNumber(callback)) {\n        func = function (input, array) {\n            array[callback] = toInt(input);\n        };\n    }\n    for (i = 0; i < token.length; i++) {\n        tokens[token[i]] = func;\n    }\n}\n\nfunction addWeekParseToken (token, callback) {\n    addParseToken(token, function (input, array, config, token) {\n        config._w = config._w || {};\n        callback(input, config._w, config, token);\n    });\n}\n\nfunction addTimeToArrayFromToken(token, input, config) {\n    if (input != null && hasOwnProp(tokens, token)) {\n        tokens[token](input, config._a, config, token);\n    }\n}\n\nvar YEAR = 0;\nvar MONTH = 1;\nvar DATE = 2;\nvar HOUR = 3;\nvar MINUTE = 4;\nvar SECOND = 5;\nvar MILLISECOND = 6;\nvar WEEK = 7;\nvar WEEKDAY = 8;\n\n// FORMATTING\n\naddFormatToken('Y', 0, 0, function () {\n    var y = this.year();\n    return y <= 9999 ? '' + y : '+' + y;\n});\n\naddFormatToken(0, ['YY', 2], 0, function () {\n    return this.year() % 100;\n});\n\naddFormatToken(0, ['YYYY',   4],       0, 'year');\naddFormatToken(0, ['YYYYY',  5],       0, 'year');\naddFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n// ALIASES\n\naddUnitAlias('year', 'y');\n\n// PRIORITIES\n\naddUnitPriority('year', 1);\n\n// PARSING\n\naddRegexToken('Y',      matchSigned);\naddRegexToken('YY',     match1to2, match2);\naddRegexToken('YYYY',   match1to4, match4);\naddRegexToken('YYYYY',  match1to6, match6);\naddRegexToken('YYYYYY', match1to6, match6);\n\naddParseToken(['YYYYY', 'YYYYYY'], YEAR);\naddParseToken('YYYY', function (input, array) {\n    array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n});\naddParseToken('YY', function (input, array) {\n    array[YEAR] = hooks.parseTwoDigitYear(input);\n});\naddParseToken('Y', function (input, array) {\n    array[YEAR] = parseInt(input, 10);\n});\n\n// HELPERS\n\nfunction daysInYear(year) {\n    return isLeapYear(year) ? 366 : 365;\n}\n\nfunction isLeapYear(year) {\n    return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n}\n\n// HOOKS\n\nhooks.parseTwoDigitYear = function (input) {\n    return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n};\n\n// MOMENTS\n\nvar getSetYear = makeGetSet('FullYear', true);\n\nfunction getIsLeapYear () {\n    return isLeapYear(this.year());\n}\n\nfunction makeGetSet (unit, keepTime) {\n    return function (value) {\n        if (value != null) {\n            set$1(this, unit, value);\n            hooks.updateOffset(this, keepTime);\n            return this;\n        } else {\n            return get(this, unit);\n        }\n    };\n}\n\nfunction get (mom, unit) {\n    return mom.isValid() ?\n        mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;\n}\n\nfunction set$1 (mom, unit, value) {\n    if (mom.isValid() && !isNaN(value)) {\n        if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) {\n            mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month()));\n        }\n        else {\n            mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);\n        }\n    }\n}\n\n// MOMENTS\n\nfunction stringGet (units) {\n    units = normalizeUnits(units);\n    if (isFunction(this[units])) {\n        return this[units]();\n    }\n    return this;\n}\n\n\nfunction stringSet (units, value) {\n    if (typeof units === 'object') {\n        units = normalizeObjectUnits(units);\n        var prioritized = getPrioritizedUnits(units);\n        for (var i = 0; i < prioritized.length; i++) {\n            this[prioritized[i].unit](units[prioritized[i].unit]);\n        }\n    } else {\n        units = normalizeUnits(units);\n        if (isFunction(this[units])) {\n            return this[units](value);\n        }\n    }\n    return this;\n}\n\nfunction mod(n, x) {\n    return ((n % x) + x) % x;\n}\n\nvar indexOf;\n\nif (Array.prototype.indexOf) {\n    indexOf = Array.prototype.indexOf;\n} else {\n    indexOf = function (o) {\n        // I know\n        var i;\n        for (i = 0; i < this.length; ++i) {\n            if (this[i] === o) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\n\nfunction daysInMonth(year, month) {\n    if (isNaN(year) || isNaN(month)) {\n        return NaN;\n    }\n    var modMonth = mod(month, 12);\n    year += (month - modMonth) / 12;\n    return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2);\n}\n\n// FORMATTING\n\naddFormatToken('M', ['MM', 2], 'Mo', function () {\n    return this.month() + 1;\n});\n\naddFormatToken('MMM', 0, 0, function (format) {\n    return this.localeData().monthsShort(this, format);\n});\n\naddFormatToken('MMMM', 0, 0, function (format) {\n    return this.localeData().months(this, format);\n});\n\n// ALIASES\n\naddUnitAlias('month', 'M');\n\n// PRIORITY\n\naddUnitPriority('month', 8);\n\n// PARSING\n\naddRegexToken('M',    match1to2);\naddRegexToken('MM',   match1to2, match2);\naddRegexToken('MMM',  function (isStrict, locale) {\n    return locale.monthsShortRegex(isStrict);\n});\naddRegexToken('MMMM', function (isStrict, locale) {\n    return locale.monthsRegex(isStrict);\n});\n\naddParseToken(['M', 'MM'], function (input, array) {\n    array[MONTH] = toInt(input) - 1;\n});\n\naddParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n    var month = config._locale.monthsParse(input, token, config._strict);\n    // if we didn't find a month name, mark the date as invalid.\n    if (month != null) {\n        array[MONTH] = month;\n    } else {\n        getParsingFlags(config).invalidMonth = input;\n    }\n});\n\n// LOCALES\n\nvar MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/;\nvar defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');\nfunction localeMonths (m, format) {\n    if (!m) {\n        return isArray(this._months) ? this._months :\n            this._months['standalone'];\n    }\n    return isArray(this._months) ? this._months[m.month()] :\n        this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];\n}\n\nvar defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');\nfunction localeMonthsShort (m, format) {\n    if (!m) {\n        return isArray(this._monthsShort) ? this._monthsShort :\n            this._monthsShort['standalone'];\n    }\n    return isArray(this._monthsShort) ? this._monthsShort[m.month()] :\n        this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];\n}\n\nfunction handleStrictParse(monthName, format, strict) {\n    var i, ii, mom, llc = monthName.toLocaleLowerCase();\n    if (!this._monthsParse) {\n        // this is not used\n        this._monthsParse = [];\n        this._longMonthsParse = [];\n        this._shortMonthsParse = [];\n        for (i = 0; i < 12; ++i) {\n            mom = createUTC([2000, i]);\n            this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();\n            this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();\n        }\n    }\n\n    if (strict) {\n        if (format === 'MMM') {\n            ii = indexOf.call(this._shortMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf.call(this._longMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    } else {\n        if (format === 'MMM') {\n            ii = indexOf.call(this._shortMonthsParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._longMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf.call(this._longMonthsParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._shortMonthsParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    }\n}\n\nfunction localeMonthsParse (monthName, format, strict) {\n    var i, mom, regex;\n\n    if (this._monthsParseExact) {\n        return handleStrictParse.call(this, monthName, format, strict);\n    }\n\n    if (!this._monthsParse) {\n        this._monthsParse = [];\n        this._longMonthsParse = [];\n        this._shortMonthsParse = [];\n    }\n\n    // TODO: add sorting\n    // Sorting makes sure if one month (or abbr) is a prefix of another\n    // see sorting in computeMonthsParse\n    for (i = 0; i < 12; i++) {\n        // make the regex if we don't have it already\n        mom = createUTC([2000, i]);\n        if (strict && !this._longMonthsParse[i]) {\n            this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');\n            this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');\n        }\n        if (!strict && !this._monthsParse[i]) {\n            regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n            this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n        }\n        // test the regex\n        if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {\n            return i;\n        } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {\n            return i;\n        } else if (!strict && this._monthsParse[i].test(monthName)) {\n            return i;\n        }\n    }\n}\n\n// MOMENTS\n\nfunction setMonth (mom, value) {\n    var dayOfMonth;\n\n    if (!mom.isValid()) {\n        // No op\n        return mom;\n    }\n\n    if (typeof value === 'string') {\n        if (/^\\d+$/.test(value)) {\n            value = toInt(value);\n        } else {\n            value = mom.localeData().monthsParse(value);\n            // TODO: Another silent failure?\n            if (!isNumber(value)) {\n                return mom;\n            }\n        }\n    }\n\n    dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));\n    mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);\n    return mom;\n}\n\nfunction getSetMonth (value) {\n    if (value != null) {\n        setMonth(this, value);\n        hooks.updateOffset(this, true);\n        return this;\n    } else {\n        return get(this, 'Month');\n    }\n}\n\nfunction getDaysInMonth () {\n    return daysInMonth(this.year(), this.month());\n}\n\nvar defaultMonthsShortRegex = matchWord;\nfunction monthsShortRegex (isStrict) {\n    if (this._monthsParseExact) {\n        if (!hasOwnProp(this, '_monthsRegex')) {\n            computeMonthsParse.call(this);\n        }\n        if (isStrict) {\n            return this._monthsShortStrictRegex;\n        } else {\n            return this._monthsShortRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_monthsShortRegex')) {\n            this._monthsShortRegex = defaultMonthsShortRegex;\n        }\n        return this._monthsShortStrictRegex && isStrict ?\n            this._monthsShortStrictRegex : this._monthsShortRegex;\n    }\n}\n\nvar defaultMonthsRegex = matchWord;\nfunction monthsRegex (isStrict) {\n    if (this._monthsParseExact) {\n        if (!hasOwnProp(this, '_monthsRegex')) {\n            computeMonthsParse.call(this);\n        }\n        if (isStrict) {\n            return this._monthsStrictRegex;\n        } else {\n            return this._monthsRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_monthsRegex')) {\n            this._monthsRegex = defaultMonthsRegex;\n        }\n        return this._monthsStrictRegex && isStrict ?\n            this._monthsStrictRegex : this._monthsRegex;\n    }\n}\n\nfunction computeMonthsParse () {\n    function cmpLenRev(a, b) {\n        return b.length - a.length;\n    }\n\n    var shortPieces = [], longPieces = [], mixedPieces = [],\n        i, mom;\n    for (i = 0; i < 12; i++) {\n        // make the regex if we don't have it already\n        mom = createUTC([2000, i]);\n        shortPieces.push(this.monthsShort(mom, ''));\n        longPieces.push(this.months(mom, ''));\n        mixedPieces.push(this.months(mom, ''));\n        mixedPieces.push(this.monthsShort(mom, ''));\n    }\n    // Sorting makes sure if one month (or abbr) is a prefix of another it\n    // will match the longer piece.\n    shortPieces.sort(cmpLenRev);\n    longPieces.sort(cmpLenRev);\n    mixedPieces.sort(cmpLenRev);\n    for (i = 0; i < 12; i++) {\n        shortPieces[i] = regexEscape(shortPieces[i]);\n        longPieces[i] = regexEscape(longPieces[i]);\n    }\n    for (i = 0; i < 24; i++) {\n        mixedPieces[i] = regexEscape(mixedPieces[i]);\n    }\n\n    this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n    this._monthsShortRegex = this._monthsRegex;\n    this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n    this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n}\n\nfunction createDate (y, m, d, h, M, s, ms) {\n    // can't just apply() to create a date:\n    // https://stackoverflow.com/q/181348\n    var date = new Date(y, m, d, h, M, s, ms);\n\n    // the date constructor remaps years 0-99 to 1900-1999\n    if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {\n        date.setFullYear(y);\n    }\n    return date;\n}\n\nfunction createUTCDate (y) {\n    var date = new Date(Date.UTC.apply(null, arguments));\n\n    // the Date.UTC function remaps years 0-99 to 1900-1999\n    if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {\n        date.setUTCFullYear(y);\n    }\n    return date;\n}\n\n// start-of-first-week - start-of-year\nfunction firstWeekOffset(year, dow, doy) {\n    var // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n        fwd = 7 + dow - doy,\n        // first-week day local weekday -- which local weekday is fwd\n        fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;\n\n    return -fwdlw + fwd - 1;\n}\n\n// https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\nfunction dayOfYearFromWeeks(year, week, weekday, dow, doy) {\n    var localWeekday = (7 + weekday - dow) % 7,\n        weekOffset = firstWeekOffset(year, dow, doy),\n        dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,\n        resYear, resDayOfYear;\n\n    if (dayOfYear <= 0) {\n        resYear = year - 1;\n        resDayOfYear = daysInYear(resYear) + dayOfYear;\n    } else if (dayOfYear > daysInYear(year)) {\n        resYear = year + 1;\n        resDayOfYear = dayOfYear - daysInYear(year);\n    } else {\n        resYear = year;\n        resDayOfYear = dayOfYear;\n    }\n\n    return {\n        year: resYear,\n        dayOfYear: resDayOfYear\n    };\n}\n\nfunction weekOfYear(mom, dow, doy) {\n    var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n        week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n        resWeek, resYear;\n\n    if (week < 1) {\n        resYear = mom.year() - 1;\n        resWeek = week + weeksInYear(resYear, dow, doy);\n    } else if (week > weeksInYear(mom.year(), dow, doy)) {\n        resWeek = week - weeksInYear(mom.year(), dow, doy);\n        resYear = mom.year() + 1;\n    } else {\n        resYear = mom.year();\n        resWeek = week;\n    }\n\n    return {\n        week: resWeek,\n        year: resYear\n    };\n}\n\nfunction weeksInYear(year, dow, doy) {\n    var weekOffset = firstWeekOffset(year, dow, doy),\n        weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n    return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n}\n\n// FORMATTING\n\naddFormatToken('w', ['ww', 2], 'wo', 'week');\naddFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n// ALIASES\n\naddUnitAlias('week', 'w');\naddUnitAlias('isoWeek', 'W');\n\n// PRIORITIES\n\naddUnitPriority('week', 5);\naddUnitPriority('isoWeek', 5);\n\n// PARSING\n\naddRegexToken('w',  match1to2);\naddRegexToken('ww', match1to2, match2);\naddRegexToken('W',  match1to2);\naddRegexToken('WW', match1to2, match2);\n\naddWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {\n    week[token.substr(0, 1)] = toInt(input);\n});\n\n// HELPERS\n\n// LOCALES\n\nfunction localeWeek (mom) {\n    return weekOfYear(mom, this._week.dow, this._week.doy).week;\n}\n\nvar defaultLocaleWeek = {\n    dow : 0, // Sunday is the first day of the week.\n    doy : 6  // The week that contains Jan 1st is the first week of the year.\n};\n\nfunction localeFirstDayOfWeek () {\n    return this._week.dow;\n}\n\nfunction localeFirstDayOfYear () {\n    return this._week.doy;\n}\n\n// MOMENTS\n\nfunction getSetWeek (input) {\n    var week = this.localeData().week(this);\n    return input == null ? week : this.add((input - week) * 7, 'd');\n}\n\nfunction getSetISOWeek (input) {\n    var week = weekOfYear(this, 1, 4).week;\n    return input == null ? week : this.add((input - week) * 7, 'd');\n}\n\n// FORMATTING\n\naddFormatToken('d', 0, 'do', 'day');\n\naddFormatToken('dd', 0, 0, function (format) {\n    return this.localeData().weekdaysMin(this, format);\n});\n\naddFormatToken('ddd', 0, 0, function (format) {\n    return this.localeData().weekdaysShort(this, format);\n});\n\naddFormatToken('dddd', 0, 0, function (format) {\n    return this.localeData().weekdays(this, format);\n});\n\naddFormatToken('e', 0, 0, 'weekday');\naddFormatToken('E', 0, 0, 'isoWeekday');\n\n// ALIASES\n\naddUnitAlias('day', 'd');\naddUnitAlias('weekday', 'e');\naddUnitAlias('isoWeekday', 'E');\n\n// PRIORITY\naddUnitPriority('day', 11);\naddUnitPriority('weekday', 11);\naddUnitPriority('isoWeekday', 11);\n\n// PARSING\n\naddRegexToken('d',    match1to2);\naddRegexToken('e',    match1to2);\naddRegexToken('E',    match1to2);\naddRegexToken('dd',   function (isStrict, locale) {\n    return locale.weekdaysMinRegex(isStrict);\n});\naddRegexToken('ddd',   function (isStrict, locale) {\n    return locale.weekdaysShortRegex(isStrict);\n});\naddRegexToken('dddd',   function (isStrict, locale) {\n    return locale.weekdaysRegex(isStrict);\n});\n\naddWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\n    var weekday = config._locale.weekdaysParse(input, token, config._strict);\n    // if we didn't get a weekday name, mark the date as invalid\n    if (weekday != null) {\n        week.d = weekday;\n    } else {\n        getParsingFlags(config).invalidWeekday = input;\n    }\n});\n\naddWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n    week[token] = toInt(input);\n});\n\n// HELPERS\n\nfunction parseWeekday(input, locale) {\n    if (typeof input !== 'string') {\n        return input;\n    }\n\n    if (!isNaN(input)) {\n        return parseInt(input, 10);\n    }\n\n    input = locale.weekdaysParse(input);\n    if (typeof input === 'number') {\n        return input;\n    }\n\n    return null;\n}\n\nfunction parseIsoWeekday(input, locale) {\n    if (typeof input === 'string') {\n        return locale.weekdaysParse(input) % 7 || 7;\n    }\n    return isNaN(input) ? null : input;\n}\n\n// LOCALES\n\nvar defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');\nfunction localeWeekdays (m, format) {\n    if (!m) {\n        return isArray(this._weekdays) ? this._weekdays :\n            this._weekdays['standalone'];\n    }\n    return isArray(this._weekdays) ? this._weekdays[m.day()] :\n        this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];\n}\n\nvar defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');\nfunction localeWeekdaysShort (m) {\n    return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;\n}\n\nvar defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');\nfunction localeWeekdaysMin (m) {\n    return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;\n}\n\nfunction handleStrictParse$1(weekdayName, format, strict) {\n    var i, ii, mom, llc = weekdayName.toLocaleLowerCase();\n    if (!this._weekdaysParse) {\n        this._weekdaysParse = [];\n        this._shortWeekdaysParse = [];\n        this._minWeekdaysParse = [];\n\n        for (i = 0; i < 7; ++i) {\n            mom = createUTC([2000, 1]).day(i);\n            this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();\n            this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();\n            this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();\n        }\n    }\n\n    if (strict) {\n        if (format === 'dddd') {\n            ii = indexOf.call(this._weekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else if (format === 'ddd') {\n            ii = indexOf.call(this._shortWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf.call(this._minWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    } else {\n        if (format === 'dddd') {\n            ii = indexOf.call(this._weekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._shortWeekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._minWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else if (format === 'ddd') {\n            ii = indexOf.call(this._shortWeekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._weekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._minWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        } else {\n            ii = indexOf.call(this._minWeekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._weekdaysParse, llc);\n            if (ii !== -1) {\n                return ii;\n            }\n            ii = indexOf.call(this._shortWeekdaysParse, llc);\n            return ii !== -1 ? ii : null;\n        }\n    }\n}\n\nfunction localeWeekdaysParse (weekdayName, format, strict) {\n    var i, mom, regex;\n\n    if (this._weekdaysParseExact) {\n        return handleStrictParse$1.call(this, weekdayName, format, strict);\n    }\n\n    if (!this._weekdaysParse) {\n        this._weekdaysParse = [];\n        this._minWeekdaysParse = [];\n        this._shortWeekdaysParse = [];\n        this._fullWeekdaysParse = [];\n    }\n\n    for (i = 0; i < 7; i++) {\n        // make the regex if we don't have it already\n\n        mom = createUTC([2000, 1]).day(i);\n        if (strict && !this._fullWeekdaysParse[i]) {\n            this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i');\n            this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i');\n            this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i');\n        }\n        if (!this._weekdaysParse[i]) {\n            regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');\n            this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n        }\n        // test the regex\n        if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {\n            return i;\n        } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {\n            return i;\n        } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {\n            return i;\n        } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\n            return i;\n        }\n    }\n}\n\n// MOMENTS\n\nfunction getSetDayOfWeek (input) {\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n    var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();\n    if (input != null) {\n        input = parseWeekday(input, this.localeData());\n        return this.add(input - day, 'd');\n    } else {\n        return day;\n    }\n}\n\nfunction getSetLocaleDayOfWeek (input) {\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n    var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n    return input == null ? weekday : this.add(input - weekday, 'd');\n}\n\nfunction getSetISODayOfWeek (input) {\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n\n    // behaves the same as moment#day except\n    // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n    // as a setter, sunday should belong to the previous week.\n\n    if (input != null) {\n        var weekday = parseIsoWeekday(input, this.localeData());\n        return this.day(this.day() % 7 ? weekday : weekday - 7);\n    } else {\n        return this.day() || 7;\n    }\n}\n\nvar defaultWeekdaysRegex = matchWord;\nfunction weekdaysRegex (isStrict) {\n    if (this._weekdaysParseExact) {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            computeWeekdaysParse.call(this);\n        }\n        if (isStrict) {\n            return this._weekdaysStrictRegex;\n        } else {\n            return this._weekdaysRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            this._weekdaysRegex = defaultWeekdaysRegex;\n        }\n        return this._weekdaysStrictRegex && isStrict ?\n            this._weekdaysStrictRegex : this._weekdaysRegex;\n    }\n}\n\nvar defaultWeekdaysShortRegex = matchWord;\nfunction weekdaysShortRegex (isStrict) {\n    if (this._weekdaysParseExact) {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            computeWeekdaysParse.call(this);\n        }\n        if (isStrict) {\n            return this._weekdaysShortStrictRegex;\n        } else {\n            return this._weekdaysShortRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_weekdaysShortRegex')) {\n            this._weekdaysShortRegex = defaultWeekdaysShortRegex;\n        }\n        return this._weekdaysShortStrictRegex && isStrict ?\n            this._weekdaysShortStrictRegex : this._weekdaysShortRegex;\n    }\n}\n\nvar defaultWeekdaysMinRegex = matchWord;\nfunction weekdaysMinRegex (isStrict) {\n    if (this._weekdaysParseExact) {\n        if (!hasOwnProp(this, '_weekdaysRegex')) {\n            computeWeekdaysParse.call(this);\n        }\n        if (isStrict) {\n            return this._weekdaysMinStrictRegex;\n        } else {\n            return this._weekdaysMinRegex;\n        }\n    } else {\n        if (!hasOwnProp(this, '_weekdaysMinRegex')) {\n            this._weekdaysMinRegex = defaultWeekdaysMinRegex;\n        }\n        return this._weekdaysMinStrictRegex && isStrict ?\n            this._weekdaysMinStrictRegex : this._weekdaysMinRegex;\n    }\n}\n\n\nfunction computeWeekdaysParse () {\n    function cmpLenRev(a, b) {\n        return b.length - a.length;\n    }\n\n    var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],\n        i, mom, minp, shortp, longp;\n    for (i = 0; i < 7; i++) {\n        // make the regex if we don't have it already\n        mom = createUTC([2000, 1]).day(i);\n        minp = this.weekdaysMin(mom, '');\n        shortp = this.weekdaysShort(mom, '');\n        longp = this.weekdays(mom, '');\n        minPieces.push(minp);\n        shortPieces.push(shortp);\n        longPieces.push(longp);\n        mixedPieces.push(minp);\n        mixedPieces.push(shortp);\n        mixedPieces.push(longp);\n    }\n    // Sorting makes sure if one weekday (or abbr) is a prefix of another it\n    // will match the longer piece.\n    minPieces.sort(cmpLenRev);\n    shortPieces.sort(cmpLenRev);\n    longPieces.sort(cmpLenRev);\n    mixedPieces.sort(cmpLenRev);\n    for (i = 0; i < 7; i++) {\n        shortPieces[i] = regexEscape(shortPieces[i]);\n        longPieces[i] = regexEscape(longPieces[i]);\n        mixedPieces[i] = regexEscape(mixedPieces[i]);\n    }\n\n    this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n    this._weekdaysShortRegex = this._weekdaysRegex;\n    this._weekdaysMinRegex = this._weekdaysRegex;\n\n    this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n    this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n    this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');\n}\n\n// FORMATTING\n\nfunction hFormat() {\n    return this.hours() % 12 || 12;\n}\n\nfunction kFormat() {\n    return this.hours() || 24;\n}\n\naddFormatToken('H', ['HH', 2], 0, 'hour');\naddFormatToken('h', ['hh', 2], 0, hFormat);\naddFormatToken('k', ['kk', 2], 0, kFormat);\n\naddFormatToken('hmm', 0, 0, function () {\n    return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n});\n\naddFormatToken('hmmss', 0, 0, function () {\n    return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +\n        zeroFill(this.seconds(), 2);\n});\n\naddFormatToken('Hmm', 0, 0, function () {\n    return '' + this.hours() + zeroFill(this.minutes(), 2);\n});\n\naddFormatToken('Hmmss', 0, 0, function () {\n    return '' + this.hours() + zeroFill(this.minutes(), 2) +\n        zeroFill(this.seconds(), 2);\n});\n\nfunction meridiem (token, lowercase) {\n    addFormatToken(token, 0, 0, function () {\n        return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);\n    });\n}\n\nmeridiem('a', true);\nmeridiem('A', false);\n\n// ALIASES\n\naddUnitAlias('hour', 'h');\n\n// PRIORITY\naddUnitPriority('hour', 13);\n\n// PARSING\n\nfunction matchMeridiem (isStrict, locale) {\n    return locale._meridiemParse;\n}\n\naddRegexToken('a',  matchMeridiem);\naddRegexToken('A',  matchMeridiem);\naddRegexToken('H',  match1to2);\naddRegexToken('h',  match1to2);\naddRegexToken('k',  match1to2);\naddRegexToken('HH', match1to2, match2);\naddRegexToken('hh', match1to2, match2);\naddRegexToken('kk', match1to2, match2);\n\naddRegexToken('hmm', match3to4);\naddRegexToken('hmmss', match5to6);\naddRegexToken('Hmm', match3to4);\naddRegexToken('Hmmss', match5to6);\n\naddParseToken(['H', 'HH'], HOUR);\naddParseToken(['k', 'kk'], function (input, array, config) {\n    var kInput = toInt(input);\n    array[HOUR] = kInput === 24 ? 0 : kInput;\n});\naddParseToken(['a', 'A'], function (input, array, config) {\n    config._isPm = config._locale.isPM(input);\n    config._meridiem = input;\n});\naddParseToken(['h', 'hh'], function (input, array, config) {\n    array[HOUR] = toInt(input);\n    getParsingFlags(config).bigHour = true;\n});\naddParseToken('hmm', function (input, array, config) {\n    var pos = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos));\n    array[MINUTE] = toInt(input.substr(pos));\n    getParsingFlags(config).bigHour = true;\n});\naddParseToken('hmmss', function (input, array, config) {\n    var pos1 = input.length - 4;\n    var pos2 = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos1));\n    array[MINUTE] = toInt(input.substr(pos1, 2));\n    array[SECOND] = toInt(input.substr(pos2));\n    getParsingFlags(config).bigHour = true;\n});\naddParseToken('Hmm', function (input, array, config) {\n    var pos = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos));\n    array[MINUTE] = toInt(input.substr(pos));\n});\naddParseToken('Hmmss', function (input, array, config) {\n    var pos1 = input.length - 4;\n    var pos2 = input.length - 2;\n    array[HOUR] = toInt(input.substr(0, pos1));\n    array[MINUTE] = toInt(input.substr(pos1, 2));\n    array[SECOND] = toInt(input.substr(pos2));\n});\n\n// LOCALES\n\nfunction localeIsPM (input) {\n    // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n    // Using charAt should be more compatible.\n    return ((input + '').toLowerCase().charAt(0) === 'p');\n}\n\nvar defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i;\nfunction localeMeridiem (hours, minutes, isLower) {\n    if (hours > 11) {\n        return isLower ? 'pm' : 'PM';\n    } else {\n        return isLower ? 'am' : 'AM';\n    }\n}\n\n\n// MOMENTS\n\n// Setting the hour should keep the time, because the user explicitly\n// specified which hour he wants. So trying to maintain the same hour (in\n// a new timezone) makes sense. Adding/subtracting hours does not follow\n// this rule.\nvar getSetHour = makeGetSet('Hours', true);\n\nvar baseConfig = {\n    calendar: defaultCalendar,\n    longDateFormat: defaultLongDateFormat,\n    invalidDate: defaultInvalidDate,\n    ordinal: defaultOrdinal,\n    dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,\n    relativeTime: defaultRelativeTime,\n\n    months: defaultLocaleMonths,\n    monthsShort: defaultLocaleMonthsShort,\n\n    week: defaultLocaleWeek,\n\n    weekdays: defaultLocaleWeekdays,\n    weekdaysMin: defaultLocaleWeekdaysMin,\n    weekdaysShort: defaultLocaleWeekdaysShort,\n\n    meridiemParse: defaultLocaleMeridiemParse\n};\n\n// internal storage for locale config files\nvar locales = {};\nvar localeFamilies = {};\nvar globalLocale;\n\nfunction normalizeLocale(key) {\n    return key ? key.toLowerCase().replace('_', '-') : key;\n}\n\n// pick the locale from the array\n// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\nfunction chooseLocale(names) {\n    var i = 0, j, next, locale, split;\n\n    while (i < names.length) {\n        split = normalizeLocale(names[i]).split('-');\n        j = split.length;\n        next = normalizeLocale(names[i + 1]);\n        next = next ? next.split('-') : null;\n        while (j > 0) {\n            locale = loadLocale(split.slice(0, j).join('-'));\n            if (locale) {\n                return locale;\n            }\n            if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {\n                //the next array item is better than a shallower substring of this one\n                break;\n            }\n            j--;\n        }\n        i++;\n    }\n    return globalLocale;\n}\n\nfunction loadLocale(name) {\n    var oldLocale = null;\n    // TODO: Find a better way to register and load all the locales in Node\n    if (!locales[name] && (typeof module !== 'undefined') &&\n            module && module.exports) {\n        try {\n            oldLocale = globalLocale._abbr;\n            var aliasedRequire = require;\n            aliasedRequire('./locale/' + name);\n            getSetGlobalLocale(oldLocale);\n        } catch (e) {}\n    }\n    return locales[name];\n}\n\n// This function will load locale and then set the global locale.  If\n// no arguments are passed in, it will simply return the current global\n// locale key.\nfunction getSetGlobalLocale (key, values) {\n    var data;\n    if (key) {\n        if (isUndefined(values)) {\n            data = getLocale(key);\n        }\n        else {\n            data = defineLocale(key, values);\n        }\n\n        if (data) {\n            // moment.duration._locale = moment._locale = data;\n            globalLocale = data;\n        }\n        else {\n            if ((typeof console !==  'undefined') && console.warn) {\n                //warn user if arguments are passed but the locale could not be set\n                console.warn('Locale ' + key +  ' not found. Did you forget to load it?');\n            }\n        }\n    }\n\n    return globalLocale._abbr;\n}\n\nfunction defineLocale (name, config) {\n    if (config !== null) {\n        var locale, parentConfig = baseConfig;\n        config.abbr = name;\n        if (locales[name] != null) {\n            deprecateSimple('defineLocaleOverride',\n                    'use moment.updateLocale(localeName, config) to change ' +\n                    'an existing locale. moment.defineLocale(localeName, ' +\n                    'config) should only be used for creating a new locale ' +\n                    'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');\n            parentConfig = locales[name]._config;\n        } else if (config.parentLocale != null) {\n            if (locales[config.parentLocale] != null) {\n                parentConfig = locales[config.parentLocale]._config;\n            } else {\n                locale = loadLocale(config.parentLocale);\n                if (locale != null) {\n                    parentConfig = locale._config;\n                } else {\n                    if (!localeFamilies[config.parentLocale]) {\n                        localeFamilies[config.parentLocale] = [];\n                    }\n                    localeFamilies[config.parentLocale].push({\n                        name: name,\n                        config: config\n                    });\n                    return null;\n                }\n            }\n        }\n        locales[name] = new Locale(mergeConfigs(parentConfig, config));\n\n        if (localeFamilies[name]) {\n            localeFamilies[name].forEach(function (x) {\n                defineLocale(x.name, x.config);\n            });\n        }\n\n        // backwards compat for now: also set the locale\n        // make sure we set the locale AFTER all child locales have been\n        // created, so we won't end up with the child locale set.\n        getSetGlobalLocale(name);\n\n\n        return locales[name];\n    } else {\n        // useful for testing\n        delete locales[name];\n        return null;\n    }\n}\n\nfunction updateLocale(name, config) {\n    if (config != null) {\n        var locale, tmpLocale, parentConfig = baseConfig;\n        // MERGE\n        tmpLocale = loadLocale(name);\n        if (tmpLocale != null) {\n            parentConfig = tmpLocale._config;\n        }\n        config = mergeConfigs(parentConfig, config);\n        locale = new Locale(config);\n        locale.parentLocale = locales[name];\n        locales[name] = locale;\n\n        // backwards compat for now: also set the locale\n        getSetGlobalLocale(name);\n    } else {\n        // pass null for config to unupdate, useful for tests\n        if (locales[name] != null) {\n            if (locales[name].parentLocale != null) {\n                locales[name] = locales[name].parentLocale;\n            } else if (locales[name] != null) {\n                delete locales[name];\n            }\n        }\n    }\n    return locales[name];\n}\n\n// returns locale data\nfunction getLocale (key) {\n    var locale;\n\n    if (key && key._locale && key._locale._abbr) {\n        key = key._locale._abbr;\n    }\n\n    if (!key) {\n        return globalLocale;\n    }\n\n    if (!isArray(key)) {\n        //short-circuit everything else\n        locale = loadLocale(key);\n        if (locale) {\n            return locale;\n        }\n        key = [key];\n    }\n\n    return chooseLocale(key);\n}\n\nfunction listLocales() {\n    return keys(locales);\n}\n\nfunction checkOverflow (m) {\n    var overflow;\n    var a = m._a;\n\n    if (a && getParsingFlags(m).overflow === -2) {\n        overflow =\n            a[MONTH]       < 0 || a[MONTH]       > 11  ? MONTH :\n            a[DATE]        < 1 || a[DATE]        > daysInMonth(a[YEAR], a[MONTH]) ? DATE :\n            a[HOUR]        < 0 || a[HOUR]        > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :\n            a[MINUTE]      < 0 || a[MINUTE]      > 59  ? MINUTE :\n            a[SECOND]      < 0 || a[SECOND]      > 59  ? SECOND :\n            a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :\n            -1;\n\n        if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {\n            overflow = DATE;\n        }\n        if (getParsingFlags(m)._overflowWeeks && overflow === -1) {\n            overflow = WEEK;\n        }\n        if (getParsingFlags(m)._overflowWeekday && overflow === -1) {\n            overflow = WEEKDAY;\n        }\n\n        getParsingFlags(m).overflow = overflow;\n    }\n\n    return m;\n}\n\n// Pick the first defined of two or three arguments.\nfunction defaults(a, b, c) {\n    if (a != null) {\n        return a;\n    }\n    if (b != null) {\n        return b;\n    }\n    return c;\n}\n\nfunction currentDateArray(config) {\n    // hooks is actually the exported moment object\n    var nowValue = new Date(hooks.now());\n    if (config._useUTC) {\n        return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];\n    }\n    return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];\n}\n\n// convert an array to a date.\n// the array should mirror the parameters below\n// note: all values past the year are optional and will default to the lowest possible value.\n// [year, month, day , hour, minute, second, millisecond]\nfunction configFromArray (config) {\n    var i, date, input = [], currentDate, expectedWeekday, yearToUse;\n\n    if (config._d) {\n        return;\n    }\n\n    currentDate = currentDateArray(config);\n\n    //compute day of the year from weeks and weekdays\n    if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n        dayOfYearFromWeekInfo(config);\n    }\n\n    //if the day of the year is set, figure out what it is\n    if (config._dayOfYear != null) {\n        yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n\n        if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) {\n            getParsingFlags(config)._overflowDayOfYear = true;\n        }\n\n        date = createUTCDate(yearToUse, 0, config._dayOfYear);\n        config._a[MONTH] = date.getUTCMonth();\n        config._a[DATE] = date.getUTCDate();\n    }\n\n    // Default to current date.\n    // * if no year, month, day of month are given, default to today\n    // * if day of month is given, default month and year\n    // * if month is given, default only year\n    // * if year is given, don't default anything\n    for (i = 0; i < 3 && config._a[i] == null; ++i) {\n        config._a[i] = input[i] = currentDate[i];\n    }\n\n    // Zero out whatever was not defaulted, including time\n    for (; i < 7; i++) {\n        config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];\n    }\n\n    // Check for 24:00:00.000\n    if (config._a[HOUR] === 24 &&\n            config._a[MINUTE] === 0 &&\n            config._a[SECOND] === 0 &&\n            config._a[MILLISECOND] === 0) {\n        config._nextDay = true;\n        config._a[HOUR] = 0;\n    }\n\n    config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);\n    expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay();\n\n    // Apply timezone offset from input. The actual utcOffset can be changed\n    // with parseZone.\n    if (config._tzm != null) {\n        config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n    }\n\n    if (config._nextDay) {\n        config._a[HOUR] = 24;\n    }\n\n    // check for mismatching day of week\n    if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) {\n        getParsingFlags(config).weekdayMismatch = true;\n    }\n}\n\nfunction dayOfYearFromWeekInfo(config) {\n    var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;\n\n    w = config._w;\n    if (w.GG != null || w.W != null || w.E != null) {\n        dow = 1;\n        doy = 4;\n\n        // TODO: We need to take the current isoWeekYear, but that depends on\n        // how we interpret now (local, utc, fixed offset). So create\n        // a now version of current config (take local/utc/offset flags, and\n        // create now).\n        weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);\n        week = defaults(w.W, 1);\n        weekday = defaults(w.E, 1);\n        if (weekday < 1 || weekday > 7) {\n            weekdayOverflow = true;\n        }\n    } else {\n        dow = config._locale._week.dow;\n        doy = config._locale._week.doy;\n\n        var curWeek = weekOfYear(createLocal(), dow, doy);\n\n        weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);\n\n        // Default to current week.\n        week = defaults(w.w, curWeek.week);\n\n        if (w.d != null) {\n            // weekday -- low day numbers are considered next week\n            weekday = w.d;\n            if (weekday < 0 || weekday > 6) {\n                weekdayOverflow = true;\n            }\n        } else if (w.e != null) {\n            // local weekday -- counting starts from begining of week\n            weekday = w.e + dow;\n            if (w.e < 0 || w.e > 6) {\n                weekdayOverflow = true;\n            }\n        } else {\n            // default to begining of week\n            weekday = dow;\n        }\n    }\n    if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {\n        getParsingFlags(config)._overflowWeeks = true;\n    } else if (weekdayOverflow != null) {\n        getParsingFlags(config)._overflowWeekday = true;\n    } else {\n        temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);\n        config._a[YEAR] = temp.year;\n        config._dayOfYear = temp.dayOfYear;\n    }\n}\n\n// iso 8601 regex\n// 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)\nvar 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)?)?$/;\nvar basicIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\n\nvar tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/;\n\nvar isoDates = [\n    ['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/],\n    ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/],\n    ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/],\n    ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false],\n    ['YYYY-DDD', /\\d{4}-\\d{3}/],\n    ['YYYY-MM', /\\d{4}-\\d\\d/, false],\n    ['YYYYYYMMDD', /[+-]\\d{10}/],\n    ['YYYYMMDD', /\\d{8}/],\n    // YYYYMM is NOT allowed by the standard\n    ['GGGG[W]WWE', /\\d{4}W\\d{3}/],\n    ['GGGG[W]WW', /\\d{4}W\\d{2}/, false],\n    ['YYYYDDD', /\\d{7}/]\n];\n\n// iso time formats and regexes\nvar isoTimes = [\n    ['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/],\n    ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/],\n    ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/],\n    ['HH:mm', /\\d\\d:\\d\\d/],\n    ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/],\n    ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/],\n    ['HHmmss', /\\d\\d\\d\\d\\d\\d/],\n    ['HHmm', /\\d\\d\\d\\d/],\n    ['HH', /\\d\\d/]\n];\n\nvar aspNetJsonRegex = /^\\/?Date\\((\\-?\\d+)/i;\n\n// date from iso format\nfunction configFromISO(config) {\n    var i, l,\n        string = config._i,\n        match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n        allowTime, dateFormat, timeFormat, tzFormat;\n\n    if (match) {\n        getParsingFlags(config).iso = true;\n\n        for (i = 0, l = isoDates.length; i < l; i++) {\n            if (isoDates[i][1].exec(match[1])) {\n                dateFormat = isoDates[i][0];\n                allowTime = isoDates[i][2] !== false;\n                break;\n            }\n        }\n        if (dateFormat == null) {\n            config._isValid = false;\n            return;\n        }\n        if (match[3]) {\n            for (i = 0, l = isoTimes.length; i < l; i++) {\n                if (isoTimes[i][1].exec(match[3])) {\n                    // match[2] should be 'T' or space\n                    timeFormat = (match[2] || ' ') + isoTimes[i][0];\n                    break;\n                }\n            }\n            if (timeFormat == null) {\n                config._isValid = false;\n                return;\n            }\n        }\n        if (!allowTime && timeFormat != null) {\n            config._isValid = false;\n            return;\n        }\n        if (match[4]) {\n            if (tzRegex.exec(match[4])) {\n                tzFormat = 'Z';\n            } else {\n                config._isValid = false;\n                return;\n            }\n        }\n        config._f = dateFormat + (timeFormat || '') + (tzFormat || '');\n        configFromStringAndFormat(config);\n    } else {\n        config._isValid = false;\n    }\n}\n\n// RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3\nvar 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}))$/;\n\nfunction extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\n    var result = [\n        untruncateYear(yearStr),\n        defaultLocaleMonthsShort.indexOf(monthStr),\n        parseInt(dayStr, 10),\n        parseInt(hourStr, 10),\n        parseInt(minuteStr, 10)\n    ];\n\n    if (secondStr) {\n        result.push(parseInt(secondStr, 10));\n    }\n\n    return result;\n}\n\nfunction untruncateYear(yearStr) {\n    var year = parseInt(yearStr, 10);\n    if (year <= 49) {\n        return 2000 + year;\n    } else if (year <= 999) {\n        return 1900 + year;\n    }\n    return year;\n}\n\nfunction preprocessRFC2822(s) {\n    // Remove comments and folding whitespace and replace multiple-spaces with a single space\n    return s.replace(/\\([^)]*\\)|[\\n\\t]/g, ' ').replace(/(\\s\\s+)/g, ' ').trim();\n}\n\nfunction checkWeekday(weekdayStr, parsedInput, config) {\n    if (weekdayStr) {\n        // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check.\n        var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),\n            weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay();\n        if (weekdayProvided !== weekdayActual) {\n            getParsingFlags(config).weekdayMismatch = true;\n            config._isValid = false;\n            return false;\n        }\n    }\n    return true;\n}\n\nvar obsOffsets = {\n    UT: 0,\n    GMT: 0,\n    EDT: -4 * 60,\n    EST: -5 * 60,\n    CDT: -5 * 60,\n    CST: -6 * 60,\n    MDT: -6 * 60,\n    MST: -7 * 60,\n    PDT: -7 * 60,\n    PST: -8 * 60\n};\n\nfunction calculateOffset(obsOffset, militaryOffset, numOffset) {\n    if (obsOffset) {\n        return obsOffsets[obsOffset];\n    } else if (militaryOffset) {\n        // the only allowed military tz is Z\n        return 0;\n    } else {\n        var hm = parseInt(numOffset, 10);\n        var m = hm % 100, h = (hm - m) / 100;\n        return h * 60 + m;\n    }\n}\n\n// date and time from ref 2822 format\nfunction configFromRFC2822(config) {\n    var match = rfc2822.exec(preprocessRFC2822(config._i));\n    if (match) {\n        var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]);\n        if (!checkWeekday(match[1], parsedArray, config)) {\n            return;\n        }\n\n        config._a = parsedArray;\n        config._tzm = calculateOffset(match[8], match[9], match[10]);\n\n        config._d = createUTCDate.apply(null, config._a);\n        config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n\n        getParsingFlags(config).rfc2822 = true;\n    } else {\n        config._isValid = false;\n    }\n}\n\n// date from iso format or fallback\nfunction configFromString(config) {\n    var matched = aspNetJsonRegex.exec(config._i);\n\n    if (matched !== null) {\n        config._d = new Date(+matched[1]);\n        return;\n    }\n\n    configFromISO(config);\n    if (config._isValid === false) {\n        delete config._isValid;\n    } else {\n        return;\n    }\n\n    configFromRFC2822(config);\n    if (config._isValid === false) {\n        delete config._isValid;\n    } else {\n        return;\n    }\n\n    // Final attempt, use Input Fallback\n    hooks.createFromInputFallback(config);\n}\n\nhooks.createFromInputFallback = deprecate(\n    'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +\n    'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +\n    'discouraged and will be removed in an upcoming major release. Please refer to ' +\n    'http://momentjs.com/guides/#/warnings/js-date/ for more info.',\n    function (config) {\n        config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n    }\n);\n\n// constant that refers to the ISO standard\nhooks.ISO_8601 = function () {};\n\n// constant that refers to the RFC 2822 form\nhooks.RFC_2822 = function () {};\n\n// date from string and format string\nfunction configFromStringAndFormat(config) {\n    // TODO: Move this to another part of the creation flow to prevent circular deps\n    if (config._f === hooks.ISO_8601) {\n        configFromISO(config);\n        return;\n    }\n    if (config._f === hooks.RFC_2822) {\n        configFromRFC2822(config);\n        return;\n    }\n    config._a = [];\n    getParsingFlags(config).empty = true;\n\n    // This array is used to make a Date, either with `new Date` or `Date.UTC`\n    var string = '' + config._i,\n        i, parsedInput, tokens, token, skipped,\n        stringLength = string.length,\n        totalParsedInputLength = 0;\n\n    tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];\n\n    for (i = 0; i < tokens.length; i++) {\n        token = tokens[i];\n        parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];\n        // console.log('token', token, 'parsedInput', parsedInput,\n        //         'regex', getParseRegexForToken(token, config));\n        if (parsedInput) {\n            skipped = string.substr(0, string.indexOf(parsedInput));\n            if (skipped.length > 0) {\n                getParsingFlags(config).unusedInput.push(skipped);\n            }\n            string = string.slice(string.indexOf(parsedInput) + parsedInput.length);\n            totalParsedInputLength += parsedInput.length;\n        }\n        // don't parse if it's not a known token\n        if (formatTokenFunctions[token]) {\n            if (parsedInput) {\n                getParsingFlags(config).empty = false;\n            }\n            else {\n                getParsingFlags(config).unusedTokens.push(token);\n            }\n            addTimeToArrayFromToken(token, parsedInput, config);\n        }\n        else if (config._strict && !parsedInput) {\n            getParsingFlags(config).unusedTokens.push(token);\n        }\n    }\n\n    // add remaining unparsed input length to the string\n    getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;\n    if (string.length > 0) {\n        getParsingFlags(config).unusedInput.push(string);\n    }\n\n    // clear _12h flag if hour is <= 12\n    if (config._a[HOUR] <= 12 &&\n        getParsingFlags(config).bigHour === true &&\n        config._a[HOUR] > 0) {\n        getParsingFlags(config).bigHour = undefined;\n    }\n\n    getParsingFlags(config).parsedDateParts = config._a.slice(0);\n    getParsingFlags(config).meridiem = config._meridiem;\n    // handle meridiem\n    config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);\n\n    configFromArray(config);\n    checkOverflow(config);\n}\n\n\nfunction meridiemFixWrap (locale, hour, meridiem) {\n    var isPm;\n\n    if (meridiem == null) {\n        // nothing to do\n        return hour;\n    }\n    if (locale.meridiemHour != null) {\n        return locale.meridiemHour(hour, meridiem);\n    } else if (locale.isPM != null) {\n        // Fallback\n        isPm = locale.isPM(meridiem);\n        if (isPm && hour < 12) {\n            hour += 12;\n        }\n        if (!isPm && hour === 12) {\n            hour = 0;\n        }\n        return hour;\n    } else {\n        // this is not supposed to happen\n        return hour;\n    }\n}\n\n// date from string and array of format strings\nfunction configFromStringAndArray(config) {\n    var tempConfig,\n        bestMoment,\n\n        scoreToBeat,\n        i,\n        currentScore;\n\n    if (config._f.length === 0) {\n        getParsingFlags(config).invalidFormat = true;\n        config._d = new Date(NaN);\n        return;\n    }\n\n    for (i = 0; i < config._f.length; i++) {\n        currentScore = 0;\n        tempConfig = copyConfig({}, config);\n        if (config._useUTC != null) {\n            tempConfig._useUTC = config._useUTC;\n        }\n        tempConfig._f = config._f[i];\n        configFromStringAndFormat(tempConfig);\n\n        if (!isValid(tempConfig)) {\n            continue;\n        }\n\n        // if there is any input that was not parsed add a penalty for that format\n        currentScore += getParsingFlags(tempConfig).charsLeftOver;\n\n        //or tokens\n        currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n\n        getParsingFlags(tempConfig).score = currentScore;\n\n        if (scoreToBeat == null || currentScore < scoreToBeat) {\n            scoreToBeat = currentScore;\n            bestMoment = tempConfig;\n        }\n    }\n\n    extend(config, bestMoment || tempConfig);\n}\n\nfunction configFromObject(config) {\n    if (config._d) {\n        return;\n    }\n\n    var i = normalizeObjectUnits(config._i);\n    config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {\n        return obj && parseInt(obj, 10);\n    });\n\n    configFromArray(config);\n}\n\nfunction createFromConfig (config) {\n    var res = new Moment(checkOverflow(prepareConfig(config)));\n    if (res._nextDay) {\n        // Adding is smart enough around DST\n        res.add(1, 'd');\n        res._nextDay = undefined;\n    }\n\n    return res;\n}\n\nfunction prepareConfig (config) {\n    var input = config._i,\n        format = config._f;\n\n    config._locale = config._locale || getLocale(config._l);\n\n    if (input === null || (format === undefined && input === '')) {\n        return createInvalid({nullInput: true});\n    }\n\n    if (typeof input === 'string') {\n        config._i = input = config._locale.preparse(input);\n    }\n\n    if (isMoment(input)) {\n        return new Moment(checkOverflow(input));\n    } else if (isDate(input)) {\n        config._d = input;\n    } else if (isArray(format)) {\n        configFromStringAndArray(config);\n    } else if (format) {\n        configFromStringAndFormat(config);\n    }  else {\n        configFromInput(config);\n    }\n\n    if (!isValid(config)) {\n        config._d = null;\n    }\n\n    return config;\n}\n\nfunction configFromInput(config) {\n    var input = config._i;\n    if (isUndefined(input)) {\n        config._d = new Date(hooks.now());\n    } else if (isDate(input)) {\n        config._d = new Date(input.valueOf());\n    } else if (typeof input === 'string') {\n        configFromString(config);\n    } else if (isArray(input)) {\n        config._a = map(input.slice(0), function (obj) {\n            return parseInt(obj, 10);\n        });\n        configFromArray(config);\n    } else if (isObject(input)) {\n        configFromObject(config);\n    } else if (isNumber(input)) {\n        // from milliseconds\n        config._d = new Date(input);\n    } else {\n        hooks.createFromInputFallback(config);\n    }\n}\n\nfunction createLocalOrUTC (input, format, locale, strict, isUTC) {\n    var c = {};\n\n    if (locale === true || locale === false) {\n        strict = locale;\n        locale = undefined;\n    }\n\n    if ((isObject(input) && isObjectEmpty(input)) ||\n            (isArray(input) && input.length === 0)) {\n        input = undefined;\n    }\n    // object construction must be done this way.\n    // https://github.com/moment/moment/issues/1423\n    c._isAMomentObject = true;\n    c._useUTC = c._isUTC = isUTC;\n    c._l = locale;\n    c._i = input;\n    c._f = format;\n    c._strict = strict;\n\n    return createFromConfig(c);\n}\n\nfunction createLocal (input, format, locale, strict) {\n    return createLocalOrUTC(input, format, locale, strict, false);\n}\n\nvar prototypeMin = deprecate(\n    'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',\n    function () {\n        var other = createLocal.apply(null, arguments);\n        if (this.isValid() && other.isValid()) {\n            return other < this ? this : other;\n        } else {\n            return createInvalid();\n        }\n    }\n);\n\nvar prototypeMax = deprecate(\n    'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',\n    function () {\n        var other = createLocal.apply(null, arguments);\n        if (this.isValid() && other.isValid()) {\n            return other > this ? this : other;\n        } else {\n            return createInvalid();\n        }\n    }\n);\n\n// Pick a moment m from moments so that m[fn](other) is true for all\n// other. This relies on the function fn to be transitive.\n//\n// moments should either be an array of moment objects or an array, whose\n// first element is an array of moment objects.\nfunction pickBy(fn, moments) {\n    var res, i;\n    if (moments.length === 1 && isArray(moments[0])) {\n        moments = moments[0];\n    }\n    if (!moments.length) {\n        return createLocal();\n    }\n    res = moments[0];\n    for (i = 1; i < moments.length; ++i) {\n        if (!moments[i].isValid() || moments[i][fn](res)) {\n            res = moments[i];\n        }\n    }\n    return res;\n}\n\n// TODO: Use [].sort instead?\nfunction min () {\n    var args = [].slice.call(arguments, 0);\n\n    return pickBy('isBefore', args);\n}\n\nfunction max () {\n    var args = [].slice.call(arguments, 0);\n\n    return pickBy('isAfter', args);\n}\n\nvar now = function () {\n    return Date.now ? Date.now() : +(new Date());\n};\n\nvar ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];\n\nfunction isDurationValid(m) {\n    for (var key in m) {\n        if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) {\n            return false;\n        }\n    }\n\n    var unitHasDecimal = false;\n    for (var i = 0; i < ordering.length; ++i) {\n        if (m[ordering[i]]) {\n            if (unitHasDecimal) {\n                return false; // only allow non-integers for smallest unit\n            }\n            if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {\n                unitHasDecimal = true;\n            }\n        }\n    }\n\n    return true;\n}\n\nfunction isValid$1() {\n    return this._isValid;\n}\n\nfunction createInvalid$1() {\n    return createDuration(NaN);\n}\n\nfunction Duration (duration) {\n    var normalizedInput = normalizeObjectUnits(duration),\n        years = normalizedInput.year || 0,\n        quarters = normalizedInput.quarter || 0,\n        months = normalizedInput.month || 0,\n        weeks = normalizedInput.week || 0,\n        days = normalizedInput.day || 0,\n        hours = normalizedInput.hour || 0,\n        minutes = normalizedInput.minute || 0,\n        seconds = normalizedInput.second || 0,\n        milliseconds = normalizedInput.millisecond || 0;\n\n    this._isValid = isDurationValid(normalizedInput);\n\n    // representation for dateAddRemove\n    this._milliseconds = +milliseconds +\n        seconds * 1e3 + // 1000\n        minutes * 6e4 + // 1000 * 60\n        hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978\n    // Because of dateAddRemove treats 24 hours as different from a\n    // day when working around DST, we need to store them separately\n    this._days = +days +\n        weeks * 7;\n    // It is impossible to translate months into days without knowing\n    // which months you are are talking about, so we have to store\n    // it separately.\n    this._months = +months +\n        quarters * 3 +\n        years * 12;\n\n    this._data = {};\n\n    this._locale = getLocale();\n\n    this._bubble();\n}\n\nfunction isDuration (obj) {\n    return obj instanceof Duration;\n}\n\nfunction absRound (number) {\n    if (number < 0) {\n        return Math.round(-1 * number) * -1;\n    } else {\n        return Math.round(number);\n    }\n}\n\n// FORMATTING\n\nfunction offset (token, separator) {\n    addFormatToken(token, 0, 0, function () {\n        var offset = this.utcOffset();\n        var sign = '+';\n        if (offset < 0) {\n            offset = -offset;\n            sign = '-';\n        }\n        return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);\n    });\n}\n\noffset('Z', ':');\noffset('ZZ', '');\n\n// PARSING\n\naddRegexToken('Z',  matchShortOffset);\naddRegexToken('ZZ', matchShortOffset);\naddParseToken(['Z', 'ZZ'], function (input, array, config) {\n    config._useUTC = true;\n    config._tzm = offsetFromString(matchShortOffset, input);\n});\n\n// HELPERS\n\n// timezone chunker\n// '+10:00' > ['10',  '00']\n// '-1530'  > ['-15', '30']\nvar chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\nfunction offsetFromString(matcher, string) {\n    var matches = (string || '').match(matcher);\n\n    if (matches === null) {\n        return null;\n    }\n\n    var chunk   = matches[matches.length - 1] || [];\n    var parts   = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n    var minutes = +(parts[1] * 60) + toInt(parts[2]);\n\n    return minutes === 0 ?\n      0 :\n      parts[0] === '+' ? minutes : -minutes;\n}\n\n// Return a moment from input, that is local/utc/zone equivalent to model.\nfunction cloneWithOffset(input, model) {\n    var res, diff;\n    if (model._isUTC) {\n        res = model.clone();\n        diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();\n        // Use low-level api, because this fn is low-level api.\n        res._d.setTime(res._d.valueOf() + diff);\n        hooks.updateOffset(res, false);\n        return res;\n    } else {\n        return createLocal(input).local();\n    }\n}\n\nfunction getDateOffset (m) {\n    // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n    // https://github.com/moment/moment/pull/1871\n    return -Math.round(m._d.getTimezoneOffset() / 15) * 15;\n}\n\n// HOOKS\n\n// This function will be called whenever a moment is mutated.\n// It is intended to keep the offset in sync with the timezone.\nhooks.updateOffset = function () {};\n\n// MOMENTS\n\n// keepLocalTime = true means only change the timezone, without\n// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n// +0200, so we adjust the time as needed, to be valid.\n//\n// Keeping the time actually adds/subtracts (one hour)\n// from the actual represented time. That is why we call updateOffset\n// a second time. In case it wants us to change the offset again\n// _changeInProgress == true case, then we have to adjust, because\n// there is no such time in the given timezone.\nfunction getSetOffset (input, keepLocalTime, keepMinutes) {\n    var offset = this._offset || 0,\n        localAdjust;\n    if (!this.isValid()) {\n        return input != null ? this : NaN;\n    }\n    if (input != null) {\n        if (typeof input === 'string') {\n            input = offsetFromString(matchShortOffset, input);\n            if (input === null) {\n                return this;\n            }\n        } else if (Math.abs(input) < 16 && !keepMinutes) {\n            input = input * 60;\n        }\n        if (!this._isUTC && keepLocalTime) {\n            localAdjust = getDateOffset(this);\n        }\n        this._offset = input;\n        this._isUTC = true;\n        if (localAdjust != null) {\n            this.add(localAdjust, 'm');\n        }\n        if (offset !== input) {\n            if (!keepLocalTime || this._changeInProgress) {\n                addSubtract(this, createDuration(input - offset, 'm'), 1, false);\n            } else if (!this._changeInProgress) {\n                this._changeInProgress = true;\n                hooks.updateOffset(this, true);\n                this._changeInProgress = null;\n            }\n        }\n        return this;\n    } else {\n        return this._isUTC ? offset : getDateOffset(this);\n    }\n}\n\nfunction getSetZone (input, keepLocalTime) {\n    if (input != null) {\n        if (typeof input !== 'string') {\n            input = -input;\n        }\n\n        this.utcOffset(input, keepLocalTime);\n\n        return this;\n    } else {\n        return -this.utcOffset();\n    }\n}\n\nfunction setOffsetToUTC (keepLocalTime) {\n    return this.utcOffset(0, keepLocalTime);\n}\n\nfunction setOffsetToLocal (keepLocalTime) {\n    if (this._isUTC) {\n        this.utcOffset(0, keepLocalTime);\n        this._isUTC = false;\n\n        if (keepLocalTime) {\n            this.subtract(getDateOffset(this), 'm');\n        }\n    }\n    return this;\n}\n\nfunction setOffsetToParsedOffset () {\n    if (this._tzm != null) {\n        this.utcOffset(this._tzm, false, true);\n    } else if (typeof this._i === 'string') {\n        var tZone = offsetFromString(matchOffset, this._i);\n        if (tZone != null) {\n            this.utcOffset(tZone);\n        }\n        else {\n            this.utcOffset(0, true);\n        }\n    }\n    return this;\n}\n\nfunction hasAlignedHourOffset (input) {\n    if (!this.isValid()) {\n        return false;\n    }\n    input = input ? createLocal(input).utcOffset() : 0;\n\n    return (this.utcOffset() - input) % 60 === 0;\n}\n\nfunction isDaylightSavingTime () {\n    return (\n        this.utcOffset() > this.clone().month(0).utcOffset() ||\n        this.utcOffset() > this.clone().month(5).utcOffset()\n    );\n}\n\nfunction isDaylightSavingTimeShifted () {\n    if (!isUndefined(this._isDSTShifted)) {\n        return this._isDSTShifted;\n    }\n\n    var c = {};\n\n    copyConfig(c, this);\n    c = prepareConfig(c);\n\n    if (c._a) {\n        var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);\n        this._isDSTShifted = this.isValid() &&\n            compareArrays(c._a, other.toArray()) > 0;\n    } else {\n        this._isDSTShifted = false;\n    }\n\n    return this._isDSTShifted;\n}\n\nfunction isLocal () {\n    return this.isValid() ? !this._isUTC : false;\n}\n\nfunction isUtcOffset () {\n    return this.isValid() ? this._isUTC : false;\n}\n\nfunction isUtc () {\n    return this.isValid() ? this._isUTC && this._offset === 0 : false;\n}\n\n// ASP.NET json date format regex\nvar aspNetRegex = /^(\\-|\\+)?(?:(\\d*)[. ])?(\\d+)\\:(\\d+)(?:\\:(\\d+)(\\.\\d*)?)?$/;\n\n// from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n// somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n// and further modified to allow for strings containing both week and day\nvar isoRegex = /^(-|\\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;\n\nfunction createDuration (input, key) {\n    var duration = input,\n        // matching against regexp is expensive, do it on demand\n        match = null,\n        sign,\n        ret,\n        diffRes;\n\n    if (isDuration(input)) {\n        duration = {\n            ms : input._milliseconds,\n            d  : input._days,\n            M  : input._months\n        };\n    } else if (isNumber(input)) {\n        duration = {};\n        if (key) {\n            duration[key] = input;\n        } else {\n            duration.milliseconds = input;\n        }\n    } else if (!!(match = aspNetRegex.exec(input))) {\n        sign = (match[1] === '-') ? -1 : 1;\n        duration = {\n            y  : 0,\n            d  : toInt(match[DATE])                         * sign,\n            h  : toInt(match[HOUR])                         * sign,\n            m  : toInt(match[MINUTE])                       * sign,\n            s  : toInt(match[SECOND])                       * sign,\n            ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match\n        };\n    } else if (!!(match = isoRegex.exec(input))) {\n        sign = (match[1] === '-') ? -1 : (match[1] === '+') ? 1 : 1;\n        duration = {\n            y : parseIso(match[2], sign),\n            M : parseIso(match[3], sign),\n            w : parseIso(match[4], sign),\n            d : parseIso(match[5], sign),\n            h : parseIso(match[6], sign),\n            m : parseIso(match[7], sign),\n            s : parseIso(match[8], sign)\n        };\n    } else if (duration == null) {// checks for null or undefined\n        duration = {};\n    } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {\n        diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));\n\n        duration = {};\n        duration.ms = diffRes.milliseconds;\n        duration.M = diffRes.months;\n    }\n\n    ret = new Duration(duration);\n\n    if (isDuration(input) && hasOwnProp(input, '_locale')) {\n        ret._locale = input._locale;\n    }\n\n    return ret;\n}\n\ncreateDuration.fn = Duration.prototype;\ncreateDuration.invalid = createInvalid$1;\n\nfunction parseIso (inp, sign) {\n    // We'd normally use ~~inp for this, but unfortunately it also\n    // converts floats to ints.\n    // inp may be undefined, so careful calling replace on it.\n    var res = inp && parseFloat(inp.replace(',', '.'));\n    // apply sign while we're at it\n    return (isNaN(res) ? 0 : res) * sign;\n}\n\nfunction positiveMomentsDifference(base, other) {\n    var res = {milliseconds: 0, months: 0};\n\n    res.months = other.month() - base.month() +\n        (other.year() - base.year()) * 12;\n    if (base.clone().add(res.months, 'M').isAfter(other)) {\n        --res.months;\n    }\n\n    res.milliseconds = +other - +(base.clone().add(res.months, 'M'));\n\n    return res;\n}\n\nfunction momentsDifference(base, other) {\n    var res;\n    if (!(base.isValid() && other.isValid())) {\n        return {milliseconds: 0, months: 0};\n    }\n\n    other = cloneWithOffset(other, base);\n    if (base.isBefore(other)) {\n        res = positiveMomentsDifference(base, other);\n    } else {\n        res = positiveMomentsDifference(other, base);\n        res.milliseconds = -res.milliseconds;\n        res.months = -res.months;\n    }\n\n    return res;\n}\n\n// TODO: remove 'name' arg after deprecation is removed\nfunction createAdder(direction, name) {\n    return function (val, period) {\n        var dur, tmp;\n        //invert the arguments, but complain about it\n        if (period !== null && !isNaN(+period)) {\n            deprecateSimple(name, 'moment().' + name  + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +\n            'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');\n            tmp = val; val = period; period = tmp;\n        }\n\n        val = typeof val === 'string' ? +val : val;\n        dur = createDuration(val, period);\n        addSubtract(this, dur, direction);\n        return this;\n    };\n}\n\nfunction addSubtract (mom, duration, isAdding, updateOffset) {\n    var milliseconds = duration._milliseconds,\n        days = absRound(duration._days),\n        months = absRound(duration._months);\n\n    if (!mom.isValid()) {\n        // No op\n        return;\n    }\n\n    updateOffset = updateOffset == null ? true : updateOffset;\n\n    if (months) {\n        setMonth(mom, get(mom, 'Month') + months * isAdding);\n    }\n    if (days) {\n        set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);\n    }\n    if (milliseconds) {\n        mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\n    }\n    if (updateOffset) {\n        hooks.updateOffset(mom, days || months);\n    }\n}\n\nvar add      = createAdder(1, 'add');\nvar subtract = createAdder(-1, 'subtract');\n\nfunction getCalendarFormat(myMoment, now) {\n    var diff = myMoment.diff(now, 'days', true);\n    return diff < -6 ? 'sameElse' :\n            diff < -1 ? 'lastWeek' :\n            diff < 0 ? 'lastDay' :\n            diff < 1 ? 'sameDay' :\n            diff < 2 ? 'nextDay' :\n            diff < 7 ? 'nextWeek' : 'sameElse';\n}\n\nfunction calendar$1 (time, formats) {\n    // We want to compare the start of today, vs this.\n    // Getting start-of-today depends on whether we're local/utc/offset or not.\n    var now = time || createLocal(),\n        sod = cloneWithOffset(now, this).startOf('day'),\n        format = hooks.calendarFormat(this, sod) || 'sameElse';\n\n    var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);\n\n    return this.format(output || this.localeData().calendar(format, this, createLocal(now)));\n}\n\nfunction clone () {\n    return new Moment(this);\n}\n\nfunction isAfter (input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input);\n    if (!(this.isValid() && localInput.isValid())) {\n        return false;\n    }\n    units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n    if (units === 'millisecond') {\n        return this.valueOf() > localInput.valueOf();\n    } else {\n        return localInput.valueOf() < this.clone().startOf(units).valueOf();\n    }\n}\n\nfunction isBefore (input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input);\n    if (!(this.isValid() && localInput.isValid())) {\n        return false;\n    }\n    units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n    if (units === 'millisecond') {\n        return this.valueOf() < localInput.valueOf();\n    } else {\n        return this.clone().endOf(units).valueOf() < localInput.valueOf();\n    }\n}\n\nfunction isBetween (from, to, units, inclusivity) {\n    inclusivity = inclusivity || '()';\n    return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&\n        (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));\n}\n\nfunction isSame (input, units) {\n    var localInput = isMoment(input) ? input : createLocal(input),\n        inputMs;\n    if (!(this.isValid() && localInput.isValid())) {\n        return false;\n    }\n    units = normalizeUnits(units || 'millisecond');\n    if (units === 'millisecond') {\n        return this.valueOf() === localInput.valueOf();\n    } else {\n        inputMs = localInput.valueOf();\n        return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();\n    }\n}\n\nfunction isSameOrAfter (input, units) {\n    return this.isSame(input, units) || this.isAfter(input,units);\n}\n\nfunction isSameOrBefore (input, units) {\n    return this.isSame(input, units) || this.isBefore(input,units);\n}\n\nfunction diff (input, units, asFloat) {\n    var that,\n        zoneDelta,\n        output;\n\n    if (!this.isValid()) {\n        return NaN;\n    }\n\n    that = cloneWithOffset(input, this);\n\n    if (!that.isValid()) {\n        return NaN;\n    }\n\n    zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\n\n    units = normalizeUnits(units);\n\n    switch (units) {\n        case 'year': output = monthDiff(this, that) / 12; break;\n        case 'month': output = monthDiff(this, that); break;\n        case 'quarter': output = monthDiff(this, that) / 3; break;\n        case 'second': output = (this - that) / 1e3; break; // 1000\n        case 'minute': output = (this - that) / 6e4; break; // 1000 * 60\n        case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60\n        case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst\n        case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst\n        default: output = this - that;\n    }\n\n    return asFloat ? output : absFloor(output);\n}\n\nfunction monthDiff (a, b) {\n    // difference in months\n    var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),\n        // b is in (anchor - 1 month, anchor + 1 month)\n        anchor = a.clone().add(wholeMonthDiff, 'months'),\n        anchor2, adjust;\n\n    if (b - anchor < 0) {\n        anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');\n        // linear across the month\n        adjust = (b - anchor) / (anchor - anchor2);\n    } else {\n        anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');\n        // linear across the month\n        adjust = (b - anchor) / (anchor2 - anchor);\n    }\n\n    //check for negative zero, return zero if negative zero\n    return -(wholeMonthDiff + adjust) || 0;\n}\n\nhooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\nhooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\nfunction toString () {\n    return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n}\n\nfunction toISOString(keepOffset) {\n    if (!this.isValid()) {\n        return null;\n    }\n    var utc = keepOffset !== true;\n    var m = utc ? this.clone().utc() : this;\n    if (m.year() < 0 || m.year() > 9999) {\n        return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ');\n    }\n    if (isFunction(Date.prototype.toISOString)) {\n        // native implementation is ~50x faster, use it when we can\n        if (utc) {\n            return this.toDate().toISOString();\n        } else {\n            return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z'));\n        }\n    }\n    return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ');\n}\n\n/**\n * Return a human readable representation of a moment that can\n * also be evaluated to get a new moment which is the same\n *\n * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects\n */\nfunction inspect () {\n    if (!this.isValid()) {\n        return 'moment.invalid(/* ' + this._i + ' */)';\n    }\n    var func = 'moment';\n    var zone = '';\n    if (!this.isLocal()) {\n        func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';\n        zone = 'Z';\n    }\n    var prefix = '[' + func + '(\"]';\n    var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';\n    var datetime = '-MM-DD[T]HH:mm:ss.SSS';\n    var suffix = zone + '[\")]';\n\n    return this.format(prefix + year + datetime + suffix);\n}\n\nfunction format (inputString) {\n    if (!inputString) {\n        inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;\n    }\n    var output = formatMoment(this, inputString);\n    return this.localeData().postformat(output);\n}\n\nfunction from (time, withoutSuffix) {\n    if (this.isValid() &&\n            ((isMoment(time) && time.isValid()) ||\n             createLocal(time).isValid())) {\n        return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);\n    } else {\n        return this.localeData().invalidDate();\n    }\n}\n\nfunction fromNow (withoutSuffix) {\n    return this.from(createLocal(), withoutSuffix);\n}\n\nfunction to (time, withoutSuffix) {\n    if (this.isValid() &&\n            ((isMoment(time) && time.isValid()) ||\n             createLocal(time).isValid())) {\n        return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);\n    } else {\n        return this.localeData().invalidDate();\n    }\n}\n\nfunction toNow (withoutSuffix) {\n    return this.to(createLocal(), withoutSuffix);\n}\n\n// If passed a locale key, it will set the locale for this\n// instance.  Otherwise, it will return the locale configuration\n// variables for this instance.\nfunction locale (key) {\n    var newLocaleData;\n\n    if (key === undefined) {\n        return this._locale._abbr;\n    } else {\n        newLocaleData = getLocale(key);\n        if (newLocaleData != null) {\n            this._locale = newLocaleData;\n        }\n        return this;\n    }\n}\n\nvar lang = deprecate(\n    'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',\n    function (key) {\n        if (key === undefined) {\n            return this.localeData();\n        } else {\n            return this.locale(key);\n        }\n    }\n);\n\nfunction localeData () {\n    return this._locale;\n}\n\nfunction startOf (units) {\n    units = normalizeUnits(units);\n    // the following switch intentionally omits break keywords\n    // to utilize falling through the cases.\n    switch (units) {\n        case 'year':\n            this.month(0);\n            /* falls through */\n        case 'quarter':\n        case 'month':\n            this.date(1);\n            /* falls through */\n        case 'week':\n        case 'isoWeek':\n        case 'day':\n        case 'date':\n            this.hours(0);\n            /* falls through */\n        case 'hour':\n            this.minutes(0);\n            /* falls through */\n        case 'minute':\n            this.seconds(0);\n            /* falls through */\n        case 'second':\n            this.milliseconds(0);\n    }\n\n    // weeks are a special case\n    if (units === 'week') {\n        this.weekday(0);\n    }\n    if (units === 'isoWeek') {\n        this.isoWeekday(1);\n    }\n\n    // quarters are also special\n    if (units === 'quarter') {\n        this.month(Math.floor(this.month() / 3) * 3);\n    }\n\n    return this;\n}\n\nfunction endOf (units) {\n    units = normalizeUnits(units);\n    if (units === undefined || units === 'millisecond') {\n        return this;\n    }\n\n    // 'date' is an alias for 'day', so it should be considered as such.\n    if (units === 'date') {\n        units = 'day';\n    }\n\n    return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');\n}\n\nfunction valueOf () {\n    return this._d.valueOf() - ((this._offset || 0) * 60000);\n}\n\nfunction unix () {\n    return Math.floor(this.valueOf() / 1000);\n}\n\nfunction toDate () {\n    return new Date(this.valueOf());\n}\n\nfunction toArray () {\n    var m = this;\n    return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];\n}\n\nfunction toObject () {\n    var m = this;\n    return {\n        years: m.year(),\n        months: m.month(),\n        date: m.date(),\n        hours: m.hours(),\n        minutes: m.minutes(),\n        seconds: m.seconds(),\n        milliseconds: m.milliseconds()\n    };\n}\n\nfunction toJSON () {\n    // new Date(NaN).toJSON() === null\n    return this.isValid() ? this.toISOString() : null;\n}\n\nfunction isValid$2 () {\n    return isValid(this);\n}\n\nfunction parsingFlags () {\n    return extend({}, getParsingFlags(this));\n}\n\nfunction invalidAt () {\n    return getParsingFlags(this).overflow;\n}\n\nfunction creationData() {\n    return {\n        input: this._i,\n        format: this._f,\n        locale: this._locale,\n        isUTC: this._isUTC,\n        strict: this._strict\n    };\n}\n\n// FORMATTING\n\naddFormatToken(0, ['gg', 2], 0, function () {\n    return this.weekYear() % 100;\n});\n\naddFormatToken(0, ['GG', 2], 0, function () {\n    return this.isoWeekYear() % 100;\n});\n\nfunction addWeekYearFormatToken (token, getter) {\n    addFormatToken(0, [token, token.length], 0, getter);\n}\n\naddWeekYearFormatToken('gggg',     'weekYear');\naddWeekYearFormatToken('ggggg',    'weekYear');\naddWeekYearFormatToken('GGGG',  'isoWeekYear');\naddWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n// ALIASES\n\naddUnitAlias('weekYear', 'gg');\naddUnitAlias('isoWeekYear', 'GG');\n\n// PRIORITY\n\naddUnitPriority('weekYear', 1);\naddUnitPriority('isoWeekYear', 1);\n\n\n// PARSING\n\naddRegexToken('G',      matchSigned);\naddRegexToken('g',      matchSigned);\naddRegexToken('GG',     match1to2, match2);\naddRegexToken('gg',     match1to2, match2);\naddRegexToken('GGGG',   match1to4, match4);\naddRegexToken('gggg',   match1to4, match4);\naddRegexToken('GGGGG',  match1to6, match6);\naddRegexToken('ggggg',  match1to6, match6);\n\naddWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {\n    week[token.substr(0, 2)] = toInt(input);\n});\n\naddWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n    week[token] = hooks.parseTwoDigitYear(input);\n});\n\n// MOMENTS\n\nfunction getSetWeekYear (input) {\n    return getSetWeekYearHelper.call(this,\n            input,\n            this.week(),\n            this.weekday(),\n            this.localeData()._week.dow,\n            this.localeData()._week.doy);\n}\n\nfunction getSetISOWeekYear (input) {\n    return getSetWeekYearHelper.call(this,\n            input, this.isoWeek(), this.isoWeekday(), 1, 4);\n}\n\nfunction getISOWeeksInYear () {\n    return weeksInYear(this.year(), 1, 4);\n}\n\nfunction getWeeksInYear () {\n    var weekInfo = this.localeData()._week;\n    return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n}\n\nfunction getSetWeekYearHelper(input, week, weekday, dow, doy) {\n    var weeksTarget;\n    if (input == null) {\n        return weekOfYear(this, dow, doy).year;\n    } else {\n        weeksTarget = weeksInYear(input, dow, doy);\n        if (week > weeksTarget) {\n            week = weeksTarget;\n        }\n        return setWeekAll.call(this, input, week, weekday, dow, doy);\n    }\n}\n\nfunction setWeekAll(weekYear, week, weekday, dow, doy) {\n    var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\n        date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\n\n    this.year(date.getUTCFullYear());\n    this.month(date.getUTCMonth());\n    this.date(date.getUTCDate());\n    return this;\n}\n\n// FORMATTING\n\naddFormatToken('Q', 0, 'Qo', 'quarter');\n\n// ALIASES\n\naddUnitAlias('quarter', 'Q');\n\n// PRIORITY\n\naddUnitPriority('quarter', 7);\n\n// PARSING\n\naddRegexToken('Q', match1);\naddParseToken('Q', function (input, array) {\n    array[MONTH] = (toInt(input) - 1) * 3;\n});\n\n// MOMENTS\n\nfunction getSetQuarter (input) {\n    return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);\n}\n\n// FORMATTING\n\naddFormatToken('D', ['DD', 2], 'Do', 'date');\n\n// ALIASES\n\naddUnitAlias('date', 'D');\n\n// PRIOROITY\naddUnitPriority('date', 9);\n\n// PARSING\n\naddRegexToken('D',  match1to2);\naddRegexToken('DD', match1to2, match2);\naddRegexToken('Do', function (isStrict, locale) {\n    // TODO: Remove \"ordinalParse\" fallback in next major release.\n    return isStrict ?\n      (locale._dayOfMonthOrdinalParse || locale._ordinalParse) :\n      locale._dayOfMonthOrdinalParseLenient;\n});\n\naddParseToken(['D', 'DD'], DATE);\naddParseToken('Do', function (input, array) {\n    array[DATE] = toInt(input.match(match1to2)[0]);\n});\n\n// MOMENTS\n\nvar getSetDayOfMonth = makeGetSet('Date', true);\n\n// FORMATTING\n\naddFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n// ALIASES\n\naddUnitAlias('dayOfYear', 'DDD');\n\n// PRIORITY\naddUnitPriority('dayOfYear', 4);\n\n// PARSING\n\naddRegexToken('DDD',  match1to3);\naddRegexToken('DDDD', match3);\naddParseToken(['DDD', 'DDDD'], function (input, array, config) {\n    config._dayOfYear = toInt(input);\n});\n\n// HELPERS\n\n// MOMENTS\n\nfunction getSetDayOfYear (input) {\n    var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;\n    return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');\n}\n\n// FORMATTING\n\naddFormatToken('m', ['mm', 2], 0, 'minute');\n\n// ALIASES\n\naddUnitAlias('minute', 'm');\n\n// PRIORITY\n\naddUnitPriority('minute', 14);\n\n// PARSING\n\naddRegexToken('m',  match1to2);\naddRegexToken('mm', match1to2, match2);\naddParseToken(['m', 'mm'], MINUTE);\n\n// MOMENTS\n\nvar getSetMinute = makeGetSet('Minutes', false);\n\n// FORMATTING\n\naddFormatToken('s', ['ss', 2], 0, 'second');\n\n// ALIASES\n\naddUnitAlias('second', 's');\n\n// PRIORITY\n\naddUnitPriority('second', 15);\n\n// PARSING\n\naddRegexToken('s',  match1to2);\naddRegexToken('ss', match1to2, match2);\naddParseToken(['s', 'ss'], SECOND);\n\n// MOMENTS\n\nvar getSetSecond = makeGetSet('Seconds', false);\n\n// FORMATTING\n\naddFormatToken('S', 0, 0, function () {\n    return ~~(this.millisecond() / 100);\n});\n\naddFormatToken(0, ['SS', 2], 0, function () {\n    return ~~(this.millisecond() / 10);\n});\n\naddFormatToken(0, ['SSS', 3], 0, 'millisecond');\naddFormatToken(0, ['SSSS', 4], 0, function () {\n    return this.millisecond() * 10;\n});\naddFormatToken(0, ['SSSSS', 5], 0, function () {\n    return this.millisecond() * 100;\n});\naddFormatToken(0, ['SSSSSS', 6], 0, function () {\n    return this.millisecond() * 1000;\n});\naddFormatToken(0, ['SSSSSSS', 7], 0, function () {\n    return this.millisecond() * 10000;\n});\naddFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n    return this.millisecond() * 100000;\n});\naddFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n    return this.millisecond() * 1000000;\n});\n\n\n// ALIASES\n\naddUnitAlias('millisecond', 'ms');\n\n// PRIORITY\n\naddUnitPriority('millisecond', 16);\n\n// PARSING\n\naddRegexToken('S',    match1to3, match1);\naddRegexToken('SS',   match1to3, match2);\naddRegexToken('SSS',  match1to3, match3);\n\nvar token;\nfor (token = 'SSSS'; token.length <= 9; token += 'S') {\n    addRegexToken(token, matchUnsigned);\n}\n\nfunction parseMs(input, array) {\n    array[MILLISECOND] = toInt(('0.' + input) * 1000);\n}\n\nfor (token = 'S'; token.length <= 9; token += 'S') {\n    addParseToken(token, parseMs);\n}\n// MOMENTS\n\nvar getSetMillisecond = makeGetSet('Milliseconds', false);\n\n// FORMATTING\n\naddFormatToken('z',  0, 0, 'zoneAbbr');\naddFormatToken('zz', 0, 0, 'zoneName');\n\n// MOMENTS\n\nfunction getZoneAbbr () {\n    return this._isUTC ? 'UTC' : '';\n}\n\nfunction getZoneName () {\n    return this._isUTC ? 'Coordinated Universal Time' : '';\n}\n\nvar proto = Moment.prototype;\n\nproto.add               = add;\nproto.calendar          = calendar$1;\nproto.clone             = clone;\nproto.diff              = diff;\nproto.endOf             = endOf;\nproto.format            = format;\nproto.from              = from;\nproto.fromNow           = fromNow;\nproto.to                = to;\nproto.toNow             = toNow;\nproto.get               = stringGet;\nproto.invalidAt         = invalidAt;\nproto.isAfter           = isAfter;\nproto.isBefore          = isBefore;\nproto.isBetween         = isBetween;\nproto.isSame            = isSame;\nproto.isSameOrAfter     = isSameOrAfter;\nproto.isSameOrBefore    = isSameOrBefore;\nproto.isValid           = isValid$2;\nproto.lang              = lang;\nproto.locale            = locale;\nproto.localeData        = localeData;\nproto.max               = prototypeMax;\nproto.min               = prototypeMin;\nproto.parsingFlags      = parsingFlags;\nproto.set               = stringSet;\nproto.startOf           = startOf;\nproto.subtract          = subtract;\nproto.toArray           = toArray;\nproto.toObject          = toObject;\nproto.toDate            = toDate;\nproto.toISOString       = toISOString;\nproto.inspect           = inspect;\nproto.toJSON            = toJSON;\nproto.toString          = toString;\nproto.unix              = unix;\nproto.valueOf           = valueOf;\nproto.creationData      = creationData;\nproto.year       = getSetYear;\nproto.isLeapYear = getIsLeapYear;\nproto.weekYear    = getSetWeekYear;\nproto.isoWeekYear = getSetISOWeekYear;\nproto.quarter = proto.quarters = getSetQuarter;\nproto.month       = getSetMonth;\nproto.daysInMonth = getDaysInMonth;\nproto.week           = proto.weeks        = getSetWeek;\nproto.isoWeek        = proto.isoWeeks     = getSetISOWeek;\nproto.weeksInYear    = getWeeksInYear;\nproto.isoWeeksInYear = getISOWeeksInYear;\nproto.date       = getSetDayOfMonth;\nproto.day        = proto.days             = getSetDayOfWeek;\nproto.weekday    = getSetLocaleDayOfWeek;\nproto.isoWeekday = getSetISODayOfWeek;\nproto.dayOfYear  = getSetDayOfYear;\nproto.hour = proto.hours = getSetHour;\nproto.minute = proto.minutes = getSetMinute;\nproto.second = proto.seconds = getSetSecond;\nproto.millisecond = proto.milliseconds = getSetMillisecond;\nproto.utcOffset            = getSetOffset;\nproto.utc                  = setOffsetToUTC;\nproto.local                = setOffsetToLocal;\nproto.parseZone            = setOffsetToParsedOffset;\nproto.hasAlignedHourOffset = hasAlignedHourOffset;\nproto.isDST                = isDaylightSavingTime;\nproto.isLocal              = isLocal;\nproto.isUtcOffset          = isUtcOffset;\nproto.isUtc                = isUtc;\nproto.isUTC                = isUtc;\nproto.zoneAbbr = getZoneAbbr;\nproto.zoneName = getZoneName;\nproto.dates  = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);\nproto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);\nproto.years  = deprecate('years accessor is deprecated. Use year instead', getSetYear);\nproto.zone   = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);\nproto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);\n\nfunction createUnix (input) {\n    return createLocal(input * 1000);\n}\n\nfunction createInZone () {\n    return createLocal.apply(null, arguments).parseZone();\n}\n\nfunction preParsePostFormat (string) {\n    return string;\n}\n\nvar proto$1 = Locale.prototype;\n\nproto$1.calendar        = calendar;\nproto$1.longDateFormat  = longDateFormat;\nproto$1.invalidDate     = invalidDate;\nproto$1.ordinal         = ordinal;\nproto$1.preparse        = preParsePostFormat;\nproto$1.postformat      = preParsePostFormat;\nproto$1.relativeTime    = relativeTime;\nproto$1.pastFuture      = pastFuture;\nproto$1.set             = set;\n\nproto$1.months            =        localeMonths;\nproto$1.monthsShort       =        localeMonthsShort;\nproto$1.monthsParse       =        localeMonthsParse;\nproto$1.monthsRegex       = monthsRegex;\nproto$1.monthsShortRegex  = monthsShortRegex;\nproto$1.week = localeWeek;\nproto$1.firstDayOfYear = localeFirstDayOfYear;\nproto$1.firstDayOfWeek = localeFirstDayOfWeek;\n\nproto$1.weekdays       =        localeWeekdays;\nproto$1.weekdaysMin    =        localeWeekdaysMin;\nproto$1.weekdaysShort  =        localeWeekdaysShort;\nproto$1.weekdaysParse  =        localeWeekdaysParse;\n\nproto$1.weekdaysRegex       =        weekdaysRegex;\nproto$1.weekdaysShortRegex  =        weekdaysShortRegex;\nproto$1.weekdaysMinRegex    =        weekdaysMinRegex;\n\nproto$1.isPM = localeIsPM;\nproto$1.meridiem = localeMeridiem;\n\nfunction get$1 (format, index, field, setter) {\n    var locale = getLocale();\n    var utc = createUTC().set(setter, index);\n    return locale[field](utc, format);\n}\n\nfunction listMonthsImpl (format, index, field) {\n    if (isNumber(format)) {\n        index = format;\n        format = undefined;\n    }\n\n    format = format || '';\n\n    if (index != null) {\n        return get$1(format, index, field, 'month');\n    }\n\n    var i;\n    var out = [];\n    for (i = 0; i < 12; i++) {\n        out[i] = get$1(format, i, field, 'month');\n    }\n    return out;\n}\n\n// ()\n// (5)\n// (fmt, 5)\n// (fmt)\n// (true)\n// (true, 5)\n// (true, fmt, 5)\n// (true, fmt)\nfunction listWeekdaysImpl (localeSorted, format, index, field) {\n    if (typeof localeSorted === 'boolean') {\n        if (isNumber(format)) {\n            index = format;\n            format = undefined;\n        }\n\n        format = format || '';\n    } else {\n        format = localeSorted;\n        index = format;\n        localeSorted = false;\n\n        if (isNumber(format)) {\n            index = format;\n            format = undefined;\n        }\n\n        format = format || '';\n    }\n\n    var locale = getLocale(),\n        shift = localeSorted ? locale._week.dow : 0;\n\n    if (index != null) {\n        return get$1(format, (index + shift) % 7, field, 'day');\n    }\n\n    var i;\n    var out = [];\n    for (i = 0; i < 7; i++) {\n        out[i] = get$1(format, (i + shift) % 7, field, 'day');\n    }\n    return out;\n}\n\nfunction listMonths (format, index) {\n    return listMonthsImpl(format, index, 'months');\n}\n\nfunction listMonthsShort (format, index) {\n    return listMonthsImpl(format, index, 'monthsShort');\n}\n\nfunction listWeekdays (localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n}\n\nfunction listWeekdaysShort (localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n}\n\nfunction listWeekdaysMin (localeSorted, format, index) {\n    return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n}\n\ngetSetGlobalLocale('en', {\n    dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n    ordinal : function (number) {\n        var b = number % 10,\n            output = (toInt(number % 100 / 10) === 1) ? 'th' :\n            (b === 1) ? 'st' :\n            (b === 2) ? 'nd' :\n            (b === 3) ? 'rd' : 'th';\n        return number + output;\n    }\n});\n\n// Side effect imports\n\nhooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);\nhooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);\n\nvar mathAbs = Math.abs;\n\nfunction abs () {\n    var data           = this._data;\n\n    this._milliseconds = mathAbs(this._milliseconds);\n    this._days         = mathAbs(this._days);\n    this._months       = mathAbs(this._months);\n\n    data.milliseconds  = mathAbs(data.milliseconds);\n    data.seconds       = mathAbs(data.seconds);\n    data.minutes       = mathAbs(data.minutes);\n    data.hours         = mathAbs(data.hours);\n    data.months        = mathAbs(data.months);\n    data.years         = mathAbs(data.years);\n\n    return this;\n}\n\nfunction addSubtract$1 (duration, input, value, direction) {\n    var other = createDuration(input, value);\n\n    duration._milliseconds += direction * other._milliseconds;\n    duration._days         += direction * other._days;\n    duration._months       += direction * other._months;\n\n    return duration._bubble();\n}\n\n// supports only 2.0-style add(1, 's') or add(duration)\nfunction add$1 (input, value) {\n    return addSubtract$1(this, input, value, 1);\n}\n\n// supports only 2.0-style subtract(1, 's') or subtract(duration)\nfunction subtract$1 (input, value) {\n    return addSubtract$1(this, input, value, -1);\n}\n\nfunction absCeil (number) {\n    if (number < 0) {\n        return Math.floor(number);\n    } else {\n        return Math.ceil(number);\n    }\n}\n\nfunction bubble () {\n    var milliseconds = this._milliseconds;\n    var days         = this._days;\n    var months       = this._months;\n    var data         = this._data;\n    var seconds, minutes, hours, years, monthsFromDays;\n\n    // if we have a mix of positive and negative values, bubble down first\n    // check: https://github.com/moment/moment/issues/2166\n    if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||\n            (milliseconds <= 0 && days <= 0 && months <= 0))) {\n        milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n        days = 0;\n        months = 0;\n    }\n\n    // The following code bubbles up values, see the tests for\n    // examples of what that means.\n    data.milliseconds = milliseconds % 1000;\n\n    seconds           = absFloor(milliseconds / 1000);\n    data.seconds      = seconds % 60;\n\n    minutes           = absFloor(seconds / 60);\n    data.minutes      = minutes % 60;\n\n    hours             = absFloor(minutes / 60);\n    data.hours        = hours % 24;\n\n    days += absFloor(hours / 24);\n\n    // convert days to months\n    monthsFromDays = absFloor(daysToMonths(days));\n    months += monthsFromDays;\n    days -= absCeil(monthsToDays(monthsFromDays));\n\n    // 12 months -> 1 year\n    years = absFloor(months / 12);\n    months %= 12;\n\n    data.days   = days;\n    data.months = months;\n    data.years  = years;\n\n    return this;\n}\n\nfunction daysToMonths (days) {\n    // 400 years have 146097 days (taking into account leap year rules)\n    // 400 years have 12 months === 4800\n    return days * 4800 / 146097;\n}\n\nfunction monthsToDays (months) {\n    // the reverse of daysToMonths\n    return months * 146097 / 4800;\n}\n\nfunction as (units) {\n    if (!this.isValid()) {\n        return NaN;\n    }\n    var days;\n    var months;\n    var milliseconds = this._milliseconds;\n\n    units = normalizeUnits(units);\n\n    if (units === 'month' || units === 'year') {\n        days   = this._days   + milliseconds / 864e5;\n        months = this._months + daysToMonths(days);\n        return units === 'month' ? months : months / 12;\n    } else {\n        // handle milliseconds separately because of floating point math errors (issue #1867)\n        days = this._days + Math.round(monthsToDays(this._months));\n        switch (units) {\n            case 'week'   : return days / 7     + milliseconds / 6048e5;\n            case 'day'    : return days         + milliseconds / 864e5;\n            case 'hour'   : return days * 24    + milliseconds / 36e5;\n            case 'minute' : return days * 1440  + milliseconds / 6e4;\n            case 'second' : return days * 86400 + milliseconds / 1000;\n            // Math.floor prevents floating point math errors here\n            case 'millisecond': return Math.floor(days * 864e5) + milliseconds;\n            default: throw new Error('Unknown unit ' + units);\n        }\n    }\n}\n\n// TODO: Use this.as('ms')?\nfunction valueOf$1 () {\n    if (!this.isValid()) {\n        return NaN;\n    }\n    return (\n        this._milliseconds +\n        this._days * 864e5 +\n        (this._months % 12) * 2592e6 +\n        toInt(this._months / 12) * 31536e6\n    );\n}\n\nfunction makeAs (alias) {\n    return function () {\n        return this.as(alias);\n    };\n}\n\nvar asMilliseconds = makeAs('ms');\nvar asSeconds      = makeAs('s');\nvar asMinutes      = makeAs('m');\nvar asHours        = makeAs('h');\nvar asDays         = makeAs('d');\nvar asWeeks        = makeAs('w');\nvar asMonths       = makeAs('M');\nvar asYears        = makeAs('y');\n\nfunction clone$1 () {\n    return createDuration(this);\n}\n\nfunction get$2 (units) {\n    units = normalizeUnits(units);\n    return this.isValid() ? this[units + 's']() : NaN;\n}\n\nfunction makeGetter(name) {\n    return function () {\n        return this.isValid() ? this._data[name] : NaN;\n    };\n}\n\nvar milliseconds = makeGetter('milliseconds');\nvar seconds      = makeGetter('seconds');\nvar minutes      = makeGetter('minutes');\nvar hours        = makeGetter('hours');\nvar days         = makeGetter('days');\nvar months       = makeGetter('months');\nvar years        = makeGetter('years');\n\nfunction weeks () {\n    return absFloor(this.days() / 7);\n}\n\nvar round = Math.round;\nvar thresholds = {\n    ss: 44,         // a few seconds to seconds\n    s : 45,         // seconds to minute\n    m : 45,         // minutes to hour\n    h : 22,         // hours to day\n    d : 26,         // days to month\n    M : 11          // months to year\n};\n\n// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\nfunction substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n    return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n}\n\nfunction relativeTime$1 (posNegDuration, withoutSuffix, locale) {\n    var duration = createDuration(posNegDuration).abs();\n    var seconds  = round(duration.as('s'));\n    var minutes  = round(duration.as('m'));\n    var hours    = round(duration.as('h'));\n    var days     = round(duration.as('d'));\n    var months   = round(duration.as('M'));\n    var years    = round(duration.as('y'));\n\n    var a = seconds <= thresholds.ss && ['s', seconds]  ||\n            seconds < thresholds.s   && ['ss', seconds] ||\n            minutes <= 1             && ['m']           ||\n            minutes < thresholds.m   && ['mm', minutes] ||\n            hours   <= 1             && ['h']           ||\n            hours   < thresholds.h   && ['hh', hours]   ||\n            days    <= 1             && ['d']           ||\n            days    < thresholds.d   && ['dd', days]    ||\n            months  <= 1             && ['M']           ||\n            months  < thresholds.M   && ['MM', months]  ||\n            years   <= 1             && ['y']           || ['yy', years];\n\n    a[2] = withoutSuffix;\n    a[3] = +posNegDuration > 0;\n    a[4] = locale;\n    return substituteTimeAgo.apply(null, a);\n}\n\n// This function allows you to set the rounding function for relative time strings\nfunction getSetRelativeTimeRounding (roundingFunction) {\n    if (roundingFunction === undefined) {\n        return round;\n    }\n    if (typeof(roundingFunction) === 'function') {\n        round = roundingFunction;\n        return true;\n    }\n    return false;\n}\n\n// This function allows you to set a threshold for relative time strings\nfunction getSetRelativeTimeThreshold (threshold, limit) {\n    if (thresholds[threshold] === undefined) {\n        return false;\n    }\n    if (limit === undefined) {\n        return thresholds[threshold];\n    }\n    thresholds[threshold] = limit;\n    if (threshold === 's') {\n        thresholds.ss = limit - 1;\n    }\n    return true;\n}\n\nfunction humanize (withSuffix) {\n    if (!this.isValid()) {\n        return this.localeData().invalidDate();\n    }\n\n    var locale = this.localeData();\n    var output = relativeTime$1(this, !withSuffix, locale);\n\n    if (withSuffix) {\n        output = locale.pastFuture(+this, output);\n    }\n\n    return locale.postformat(output);\n}\n\nvar abs$1 = Math.abs;\n\nfunction sign(x) {\n    return ((x > 0) - (x < 0)) || +x;\n}\n\nfunction toISOString$1() {\n    // for ISO strings we do not use the normal bubbling rules:\n    //  * milliseconds bubble up until they become hours\n    //  * days do not bubble at all\n    //  * months bubble up until they become years\n    // This is because there is no context-free conversion between hours and days\n    // (think of clock changes)\n    // and also not between days and months (28-31 days per month)\n    if (!this.isValid()) {\n        return this.localeData().invalidDate();\n    }\n\n    var seconds = abs$1(this._milliseconds) / 1000;\n    var days         = abs$1(this._days);\n    var months       = abs$1(this._months);\n    var minutes, hours, years;\n\n    // 3600 seconds -> 60 minutes -> 1 hour\n    minutes           = absFloor(seconds / 60);\n    hours             = absFloor(minutes / 60);\n    seconds %= 60;\n    minutes %= 60;\n\n    // 12 months -> 1 year\n    years  = absFloor(months / 12);\n    months %= 12;\n\n\n    // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n    var Y = years;\n    var M = months;\n    var D = days;\n    var h = hours;\n    var m = minutes;\n    var s = seconds ? seconds.toFixed(3).replace(/\\.?0+$/, '') : '';\n    var total = this.asSeconds();\n\n    if (!total) {\n        // this is the same as C#'s (Noda) and python (isodate)...\n        // but not other JS (goog.date)\n        return 'P0D';\n    }\n\n    var totalSign = total < 0 ? '-' : '';\n    var ymSign = sign(this._months) !== sign(total) ? '-' : '';\n    var daysSign = sign(this._days) !== sign(total) ? '-' : '';\n    var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';\n\n    return totalSign + 'P' +\n        (Y ? ymSign + Y + 'Y' : '') +\n        (M ? ymSign + M + 'M' : '') +\n        (D ? daysSign + D + 'D' : '') +\n        ((h || m || s) ? 'T' : '') +\n        (h ? hmsSign + h + 'H' : '') +\n        (m ? hmsSign + m + 'M' : '') +\n        (s ? hmsSign + s + 'S' : '');\n}\n\nvar proto$2 = Duration.prototype;\n\nproto$2.isValid        = isValid$1;\nproto$2.abs            = abs;\nproto$2.add            = add$1;\nproto$2.subtract       = subtract$1;\nproto$2.as             = as;\nproto$2.asMilliseconds = asMilliseconds;\nproto$2.asSeconds      = asSeconds;\nproto$2.asMinutes      = asMinutes;\nproto$2.asHours        = asHours;\nproto$2.asDays         = asDays;\nproto$2.asWeeks        = asWeeks;\nproto$2.asMonths       = asMonths;\nproto$2.asYears        = asYears;\nproto$2.valueOf        = valueOf$1;\nproto$2._bubble        = bubble;\nproto$2.clone          = clone$1;\nproto$2.get            = get$2;\nproto$2.milliseconds   = milliseconds;\nproto$2.seconds        = seconds;\nproto$2.minutes        = minutes;\nproto$2.hours          = hours;\nproto$2.days           = days;\nproto$2.weeks          = weeks;\nproto$2.months         = months;\nproto$2.years          = years;\nproto$2.humanize       = humanize;\nproto$2.toISOString    = toISOString$1;\nproto$2.toString       = toISOString$1;\nproto$2.toJSON         = toISOString$1;\nproto$2.locale         = locale;\nproto$2.localeData     = localeData;\n\nproto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);\nproto$2.lang = lang;\n\n// Side effect imports\n\n// FORMATTING\n\naddFormatToken('X', 0, 0, 'unix');\naddFormatToken('x', 0, 0, 'valueOf');\n\n// PARSING\n\naddRegexToken('x', matchSigned);\naddRegexToken('X', matchTimestamp);\naddParseToken('X', function (input, array, config) {\n    config._d = new Date(parseFloat(input, 10) * 1000);\n});\naddParseToken('x', function (input, array, config) {\n    config._d = new Date(toInt(input));\n});\n\n// Side effect imports\n\n\nhooks.version = '2.21.0';\n\nsetHookCallback(createLocal);\n\nhooks.fn                    = proto;\nhooks.min                   = min;\nhooks.max                   = max;\nhooks.now                   = now;\nhooks.utc                   = createUTC;\nhooks.unix                  = createUnix;\nhooks.months                = listMonths;\nhooks.isDate                = isDate;\nhooks.locale                = getSetGlobalLocale;\nhooks.invalid               = createInvalid;\nhooks.duration              = createDuration;\nhooks.isMoment              = isMoment;\nhooks.weekdays              = listWeekdays;\nhooks.parseZone             = createInZone;\nhooks.localeData            = getLocale;\nhooks.isDuration            = isDuration;\nhooks.monthsShort           = listMonthsShort;\nhooks.weekdaysMin           = listWeekdaysMin;\nhooks.defineLocale          = defineLocale;\nhooks.updateLocale          = updateLocale;\nhooks.locales               = listLocales;\nhooks.weekdaysShort         = listWeekdaysShort;\nhooks.normalizeUnits        = normalizeUnits;\nhooks.relativeTimeRounding  = getSetRelativeTimeRounding;\nhooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\nhooks.calendarFormat        = getCalendarFormat;\nhooks.prototype             = proto;\n\n// currently HTML5 input type only supports 24-hour formats\nhooks.HTML5_FMT = {\n    DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm',             // <input type=\"datetime-local\" />\n    DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss',  // <input type=\"datetime-local\" step=\"1\" />\n    DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS',   // <input type=\"datetime-local\" step=\"0.001\" />\n    DATE: 'YYYY-MM-DD',                             // <input type=\"date\" />\n    TIME: 'HH:mm',                                  // <input type=\"time\" />\n    TIME_SECONDS: 'HH:mm:ss',                       // <input type=\"time\" step=\"1\" />\n    TIME_MS: 'HH:mm:ss.SSS',                        // <input type=\"time\" step=\"0.001\" />\n    WEEK: 'YYYY-[W]WW',                             // <input type=\"week\" />\n    MONTH: 'YYYY-MM'                                // <input type=\"month\" />\n};\n\nreturn hooks;\n\n})));\n","\nvar options = exports.options = require('./options');\n\nexports.parser = require('./parsers/parser');\nexports.refiner = require('./refiners/refiner');\n\nexports.Parser = exports.parser.Parser;\nexports.Refiner = exports.refiner.Refiner;\nexports.Filter = exports.refiner.Filter;\n\nexports.ParsedResult = require('./result').ParsedResult;\nexports.ParsedComponents = require('./result').ParsedComponents;\n\nvar Chrono = function(option) {\n\n    option = option || exports.options.casualOption();\n    this.parsers = new Object(option.parsers);\n    this.refiners = new Object(option.refiners);\n};\n\n\nChrono.prototype.parse = function(text, refDate, opt) {\n\n    refDate = refDate || new Date();\n    opt = opt || {};\n    opt.forwardDate = opt.forwardDate || opt.forwardDate;\n    \n    var allResults = [];\n\n    this.parsers.forEach(function (parser) {\n        var results = parser.execute(text, refDate, opt);\n        allResults = allResults.concat(results);\n    });\n\n    allResults.sort(function(a, b) {\n        return a.index - b.index;\n    });\n\n    this.refiners.forEach(function (refiner) {\n        allResults = refiner.refine(text, allResults, opt);\n    });\n    \n    return allResults;\n};\n\n\nChrono.prototype.parseDate = function(text, refDate, opt) {\n    var results = this.parse(text, refDate, opt);\n    if (results.length > 0) {\n        return results[0].start.date();\n    }\n    return null;\n};\n\nexports.Chrono = Chrono;\nexports.strict = new Chrono( options.strictOption() );\nexports.casual = new Chrono( options.casualOption() );\n\nexports.en = new Chrono( options.mergeOptions([\n    options.en.casual, options.commonPostProcessing]));\n\nexports.en_GB = new Chrono( options.mergeOptions([\n    options.en_GB.casual, options.commonPostProcessing]));\n\nexports.de = new Chrono( options.mergeOptions([\n    options.de.casual, options.en, options.commonPostProcessing]));\n\nexports.es = new Chrono( options.mergeOptions([\n    options.es.casual, options.en, options.commonPostProcessing]));\n\nexports.fr = new Chrono( options.mergeOptions([\n    options.fr.casual, options.en, options.commonPostProcessing]));\n\nexports.ja = new Chrono( options.mergeOptions([ \n    options.ja.casual, options.en, options.commonPostProcessing]));\n\n\nexports.parse = function () {\n    return exports.casual.parse.apply(exports.casual, arguments);\n};\n\nexports.parseDate = function () {\n    return exports.casual.parseDate.apply(exports.casual, arguments);\n};\n\n\n\n\n","var parser = require('./parsers/parser');\nvar refiner = require('./refiners/refiner');\n\n\nexports.mergeOptions = function(options) {\n\n    var addedTypes = {};\n    var mergedOption = {\n        parsers: [],\n        refiners: []\n    };\n\n    options.forEach(function (option) {\n\n        if (option.call) {\n            option = option.call();\n        }\n\n        if (option.parsers) {\n            option.parsers.forEach(function (p) {\n                if (!addedTypes[p.constructor]) {\n                    mergedOption.parsers.push(p);\n                    addedTypes[p.constructor] = true;\n                }\n            });\n        }\n\n        if (option.refiners) {\n            option.refiners.forEach(function (r) {\n                if (!addedTypes[r.constructor]) {\n                    mergedOption.refiners.push(r);\n                    addedTypes[r.constructor] = true;\n                }\n            });\n        }\n    });\n\n    return mergedOption;\n};\n\n\nexports.commonPostProcessing = function() {\n    return {\n        refiners: [\n            // These should be after all other refiners\n            new refiner.ExtractTimezoneOffsetRefiner(),\n            new refiner.ExtractTimezoneAbbrRefiner(),\n            new refiner.UnlikelyFormatFilter()\n        ]\n    }\n};\n\n\n// -------------------------------------------------------------\n\nexports.strictOption = function () {\n    var strictConfig = {\n        strict: true\n    };\n\n    return exports.mergeOptions([\n        exports.en(strictConfig),\n        exports.de(strictConfig),\n        exports.es(strictConfig),\n        exports.fr(strictConfig),\n        exports.ja(strictConfig),\n        exports.zh,\n        exports.commonPostProcessing\n    ]);\n};\n\nexports.casualOption = function () {\n    return exports.mergeOptions([\n        exports.en.casual,\n        // Some German abbriviate overlap with common English\n        exports.de({ strict: true }), \n        exports.es.casual,\n        exports.fr.casual,\n        exports.ja.casual,\n        exports.zh,\n        exports.commonPostProcessing\n    ]);\n};\n\n// -------------------------------------------------------------\n\nexports.de = function(config) {\n    return {\n        parsers: [\n            new parser.DEDeadlineFormatParser(config),\n            new parser.DEMonthNameLittleEndianParser(config),\n            new parser.DEMonthNameParser(config),\n            new parser.DESlashDateFormatParser(config),\n            new parser.DETimeAgoFormatParser(config),\n            new parser.DETimeExpressionParser(config)\n        ],\n        refiners: [\n            new refiner.OverlapRemovalRefiner(),\n            new refiner.ForwardDateRefiner(),\n            new refiner.DEMergeDateTimeRefiner(),\n            new refiner.DEMergeDateRangeRefiner()\n        ]\n    }\n};\n\nexports.de.casual = function() {\n    var option = exports.de({\n        strict: false\n    });\n    option.parsers.unshift(new parser.DECasualDateParser());\n    option.parsers.unshift(new parser.DEWeekdayParser());\n    return option;\n};\n\n\n\n// -------------------------------------------------------------\n\n\nexports.en = function(config) {\n    return {\n        parsers: [\n            new parser.ENISOFormatParser(config),\n            new parser.ENDeadlineFormatParser(config),\n            new parser.ENMonthNameLittleEndianParser(config),\n            new parser.ENMonthNameMiddleEndianParser(config),\n            new parser.ENMonthNameParser(config),\n            new parser.ENSlashDateFormatParser(config),\n            new parser.ENSlashDateFormatStartWithYearParser(config),\n            new parser.ENSlashMonthFormatParser(config),\n            new parser.ENTimeAgoFormatParser(config),\n            new parser.ENTimeLaterFormatParser(config),\n            new parser.ENTimeExpressionParser(config)\n        ],\n        refiners: [\n            new refiner.OverlapRemovalRefiner(),\n            new refiner.ForwardDateRefiner(),\n\n            // English\n            new refiner.ENMergeDateTimeRefiner(),\n            new refiner.ENMergeDateRangeRefiner(),\n            new refiner.ENPrioritizeSpecificDateRefiner()\n        ]\n    }\n};\n\nexports.en.casual = function(config) {\n    config = config || {};\n    config.strict = false;\n    var option = exports.en(config);\n\n    // en\n    option.parsers.unshift(new parser.ENCasualDateParser());\n    option.parsers.unshift(new parser.ENCasualTimeParser());\n    option.parsers.unshift(new parser.ENWeekdayParser());\n    option.parsers.unshift(new parser.ENRelativeDateFormatParser());\n    return option;\n};\n\n\nexports.en_GB = function(config) {\n    config = config || {};\n    config.littleEndian = true;\n    return exports.en(config);\n}\n\nexports.en_GB.casual = function(config) {\n    config = config || {};\n    config.littleEndian = true;\n    return exports.en.casual(config);\n}\n\n// -------------------------------------------------------------\n\nexports.ja = function() {\n    return {\n        parsers: [\n            new parser.JPStandardParser()\n        ],\n        refiners: [\n            new refiner.OverlapRemovalRefiner(),\n            new refiner.ForwardDateRefiner(),\n            new refiner.JPMergeDateRangeRefiner()\n        ]\n    }\n};\n\nexports.ja.casual = function() {\n    var option = exports.ja();\n    option.parsers.unshift(new parser.JPCasualDateParser());\n    return option;\n};\n\n\n// -------------------------------------------------------------\n\n\nexports.es = function(config) {\n    return {\n        parsers: [\n            new parser.ESTimeAgoFormatParser(config),\n            new parser.ESDeadlineFormatParser(config),\n            new parser.ESTimeExpressionParser(config),\n            new parser.ESMonthNameLittleEndianParser(config),\n            new parser.ESSlashDateFormatParser(config)\n        ],\n        refiners: [\n            new refiner.OverlapRemovalRefiner(),\n            new refiner.ForwardDateRefiner()\n        ]\n    }\n};\n\nexports.es.casual = function() {\n    var option = exports.es({ \n        strict: false \n    });\n\n    option.parsers.unshift(new parser.ESCasualDateParser());\n    option.parsers.unshift(new parser.ESWeekdayParser());\n    return option;\n};\n\n\n// -------------------------------------------------------------\n\nexports.fr = function(config) {\n    return {\n        parsers: [\n            new parser.FRDeadlineFormatParser(config),\n            new parser.FRMonthNameLittleEndianParser(config),\n            new parser.FRSlashDateFormatParser(config),\n            new parser.FRTimeAgoFormatParser(config),\n            new parser.FRTimeExpressionParser(config)\n        ],\n        refiners: [\n            new refiner.OverlapRemovalRefiner(),\n            new refiner.ForwardDateRefiner(),\n            new refiner.FRMergeDateRangeRefiner(),\n            new refiner.FRMergeDateTimeRefiner()\n        ]\n    }\n};\n\nexports.fr.casual = function() {\n    var option = exports.fr({\n        strict: false\n    });\n\n    option.parsers.unshift(new parser.FRCasualDateParser());\n    option.parsers.unshift(new parser.FRWeekdayParser());\n    option.parsers.unshift(new parser.FRRelativeDateFormatParser());\n    return option;\n};\n\n\n// -------------------------------------------------------------\n\nexports.zh = function() {\n    return {\n        parsers: [\n            new parser.ZHHantDateParser(),\n            new parser.ZHHantWeekdayParser(),\n            new parser.ZHHantTimeExpressionParser(),\n            new parser.ZHHantCasualDateParser(),\n            new parser.ZHHantDeadlineFormatParser()\n        ],\n        refiners: [\n            new refiner.OverlapRemovalRefiner(),\n            new refiner.ForwardDateRefiner()\n        ]\n    }\n};","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp(\n    '(\\\\W|^)(' +\n        'jetzt|' +\n        '(?:heute|diesen)\\\\s*(morgen|vormittag|mittag|nachmittag|abend)|' +\n        '(?:heute|diese)\\\\s*nacht|' +\n        'heute|' +\n        '(?:(?:ü|ue)ber)?morgen(?:\\\\s*(morgen|vormittag|mittag|nachmittag|abend|nacht))?|' +\n        '(?:vor)?gestern(?:\\\\s*(morgen|vormittag|mittag|nachmittag|abend|nacht))?|' +\n        'letzte\\\\s*nacht' +\n    ')(?=\\\\W|$)', 'i');\n\nexports.Parser = function DECasualDateParser() {\n\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt) {\n        var text = match[0].substr(match[1].length);\n        var index = match.index + match[1].length;\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref,\n        });\n\n        var refMoment = moment(ref);\n        var startMoment = refMoment.clone();\n        var lowerText = text.toLowerCase();\n\n        if (/(?:heute|diese)\\s*nacht/.test(lowerText)) {\n            // Normally means this coming midnight\n            result.start.imply('hour', 22);\n            result.start.imply('meridiem', 1);\n        } else if (/^(?:ü|ue)bermorgen/.test(lowerText)) {\n            startMoment.add(refMoment.hour() > 1 ? 2 : 1, 'day');\n        } else if (/^morgen/.test(lowerText)) {\n            // Check not \"Tomorrow\" on late night\n            if (refMoment.hour() > 1) {\n                startMoment.add(1, 'day');\n            }\n        } else if (/^gestern/.test(lowerText)) {\n            startMoment.add(-1, 'day');\n        } else if (/^vorgestern/.test(lowerText)) {\n            startMoment.add(-2, 'day');\n        } else if (/letzte\\s*nacht/.test(lowerText)) {\n            result.start.imply('hour', 0);\n            if (refMoment.hour() > 6) {\n                startMoment.add(-1, 'day');\n            }\n        } else if (lowerText === 'jetzt') {\n          result.start.imply('hour', refMoment.hour());\n          result.start.imply('minute', refMoment.minute());\n          result.start.imply('second', refMoment.second());\n          result.start.imply('millisecond', refMoment.millisecond());\n        }\n\n        var secondMatch = match[3] || match[4] || match[5];\n        if (secondMatch) {\n            switch (secondMatch.toLowerCase()) {\n                case 'morgen':\n                    result.start.imply('hour', 6);\n                    break;\n                case 'vormittag':\n                    result.start.imply('hour', 9);\n                    break;\n                case 'mittag':\n                    result.start.imply('hour', 12);\n                    break;\n                case 'nachmittag':\n                    result.start.imply('hour', 15);\n                    result.start.imply('meridiem', 1);\n                    break;\n                case 'abend':\n                    result.start.imply('hour', 18);\n                    result.start.imply('meridiem', 1);\n                    break;\n                case 'nacht':\n                    result.start.imply('hour', 0);\n                    break;\n            }\n        }\n\n        result.start.assign('day', startMoment.date())\n        result.start.assign('month', startMoment.month() + 1)\n        result.start.assign('year', startMoment.year())\n        result.tags['DECasualDateParser'] = true;\n        return result;\n    }\n}\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/DE');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(in|nach)\\\\s*' +\n    '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|einigen|eine[rm]\\\\s*halben|eine[rm])\\\\s*' +\n    '(sekunden?|min(?:ute)?n?|stunden?|tag(?:en)?|wochen?|monat(?:en)?|jahr(?:en)?)\\\\s*' +\n    '(?=\\\\W|$)', 'i'\n);\n\nvar STRICT_PATTERN = new RegExp('(\\\\W|^)' +\n    '(in|nach)\\\\s*' +\n    '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|eine(?:r|m)?)\\\\s*' +\n    '(sekunden?|minuten?|stunden?|tag(?:en)?)\\\\s*' +\n    '(?=\\\\W|$)', 'i'\n);\n\nexports.Parser = function DEDeadlineFormatParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return this.isStrictMode()? STRICT_PATTERN : PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt){\n\n        var index = match.index + match[1].length;\n        var text  = match[0];\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\n\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n\n        var num = match[3].toLowerCase();\n        if (util.INTEGER_WORDS[num] !== undefined) {\n            num = util.INTEGER_WORDS[num];\n        } else if (num === 'einer' || num === 'einem') {\n            num = 1;\n        } else if (num === 'einigen') {\n            num = 3;\n        } else if (/halben/.test(num)) {\n            num = 0.5;\n        } else {\n            num = parseInt(num);\n        }\n\n        var date = moment(ref);\n        if (/tag|woche|monat|jahr/i.test(match[4])) {\n\n            if (/tag/i.test(match[4])) {\n                date.add(num, 'd');\n            } else if (/woche/i.test(match[4])) {\n                date.add(num * 7, 'd');\n            } else if (/monat/i.test(match[4])) {\n                date.add(num, 'month');\n            } else if (/jahr/i.test(match[4])) {\n                date.add(num, 'year');\n            }\n\n            result.start.assign('year', date.year());\n            result.start.assign('month', date.month() + 1);\n            result.start.assign('day', date.date());\n            return result;\n        }\n\n        if (/stunde/i.test(match[4])) {\n\n            date.add(num, 'hour');\n\n        } else if (/min/i.test(match[4])) {\n\n            date.add(num, 'minute');\n\n        } else if (/sekunde/i.test(match[4])) {\n\n            date.add(num, 'second');\n        }\n\n        result.start.imply('year', date.year());\n        result.start.imply('month', date.month() + 1);\n        result.start.imply('day', date.date());\n        result.start.assign('hour', date.hour());\n        result.start.assign('minute', date.minute());\n        result.start.assign('second', date.second());\n        result.tags['DEDeadlineFormatParser'] = true;\n        return result;\n    };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/DE');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n        '(?:am\\\\s*?)?' +\n        '(?:(Sonntag|Montag|Dienstag|Mittwoch|Donnerstag|Freitag|Samstag|So|Mo|Di|Mi|Do|Fr|Sa)\\\\s*,?\\\\s*)?' +\n        '(?:den\\\\s*)?' +\n        '([0-9]{1,2})\\\\.' +\n        '(?:\\\\s*(?:bis(?:\\\\s*(?:am|zum))?|\\\\-|\\\\–|\\\\s)\\\\s*([0-9]{1,2})\\\\.)?\\\\s*' +\n        '(Jan(?:uar|\\\\.)?|Feb(?:ruar|\\\\.)?|Mär(?:z|\\\\.)?|Maerz|Mrz\\\\.?|Apr(?:il|\\\\.)?|Mai|Jun(?:i|\\\\.)?|Jul(?:i|\\\\.)?|Aug(?:ust|\\\\.)?|Sep(?:t|t\\\\.|tember|\\\\.)?|Okt(?:ober|\\\\.)?|Nov(?:ember|\\\\.)?|Dez(?:ember|\\\\.)?)' +\n        '(?:' +\n            ',?\\\\s*([0-9]{1,4}(?![^\\\\s]\\\\d))' +\n            '(\\\\s*[vn]\\\\.?\\\\s*C(?:hr)?\\\\.?)?' +\n        ')?' +\n        '(?=\\\\W|$)', 'i'\n    );\n\nvar WEEKDAY_GROUP = 2;\nvar DATE_GROUP = 3;\nvar DATE_TO_GROUP = 4;\nvar MONTH_NAME_GROUP = 5;\nvar YEAR_GROUP = 6;\nvar YEAR_BE_GROUP = 7;\n\nexports.Parser = function DEMonthNameLittleEndianParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n\n        var result = new ParsedResult({\n            text: match[0].substr(match[1].length, match[0].length - match[1].length),\n            index: match.index + match[1].length,\n            ref: ref,\n        });\n\n        var month = match[MONTH_NAME_GROUP];\n        month = util.MONTH_OFFSET[month.toLowerCase()];\n\n        var day = match[DATE_GROUP];\n        day = parseInt(day);\n\n        var year = null;\n        if (match[YEAR_GROUP]) {\n            year = match[YEAR_GROUP];\n            year = parseInt(year);\n\n            if(match[YEAR_BE_GROUP]){\n                if (/v/i.test(match[YEAR_BE_GROUP])) {\n                    // v.Chr.\n                    year = -year;\n                }\n            } else if (year < 100){\n\n                year = year + 2000;\n            }\n        }\n\n        if(year){\n            result.start.assign('day', day);\n            result.start.assign('month', month);\n            result.start.assign('year', year);\n        } else {\n\n            //Find the most appropriated year\n            var refMoment = moment(ref);\n            refMoment.month(month - 1);\n            refMoment.date(day);\n            refMoment.year(moment(ref).year());\n\n            var nextYear = refMoment.clone().add(1, 'y');\n            var lastYear = refMoment.clone().add(-1, 'y');\n            if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n                refMoment = nextYear;\n            }\n            else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n                refMoment = lastYear;\n            }\n\n            result.start.assign('day', day);\n            result.start.assign('month', month);\n            result.start.imply('year', refMoment.year());\n        }\n\n        // Weekday component\n        if (match[WEEKDAY_GROUP]) {\n            var weekday = match[WEEKDAY_GROUP];\n            weekday = util.WEEKDAY_OFFSET[weekday.toLowerCase()]\n            result.start.assign('weekday', weekday);\n        }\n\n        // Text can be 'range' value. Such as '12 - 13 January 2012'\n        if (match[DATE_TO_GROUP]) {\n            result.end = result.start.clone();\n            result.end.assign('day', parseInt(match[DATE_TO_GROUP]));\n        }\n\n        result.tags['DEMonthNameLittleEndianParser'] = true;\n        return result;\n    };\n}\n","/*\n    \n    The parser for parsing month name and year.\n    \n    EX. \n        - Januar\n        - Januar 2012\n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/DE');\n\nvar PATTERN = new RegExp('(^|\\\\D\\\\s+|[^\\\\w\\\\s])' +\n    '(Jan\\\\.?|Januar|Feb\\\\.?|Februar|Mär\\\\.?|M(?:ä|ae)rz|Mrz\\\\.?|Apr\\\\.?|April|Mai\\\\.?|Jun\\\\.?|Juni|Jul\\\\.?|Juli|Aug\\\\.?|August|Sep\\\\.?|Sept\\\\.?|September|Okt\\\\.?|Oktober|Nov\\\\.?|November|Dez\\\\.?|Dezember)' + \n    '\\\\s*' +\n    '(?:' +\n        ',?\\\\s*(?:([0-9]{4})(\\\\s*[vn]\\\\.?\\\\s*C(?:hr)?\\\\.?)?|([0-9]{1,4})\\\\s*([vn]\\\\.?\\\\s*C(?:hr)?\\\\.?))' +\n    ')?' +\n    '(?=[^\\\\s\\\\w]|$)', 'i');\n\nvar MONTH_NAME_GROUP = 2;\nvar YEAR_GROUP = 3;\nvar YEAR_BE_GROUP = 4;\nvar YEAR_GROUP2 = 5;\nvar YEAR_BE_GROUP2 = 6;\n\nexports.Parser = function ENMonthNameParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n    \n    this.extract = function(text, ref, match, opt){\n        var result = new ParsedResult({\n            text: match[0].substr(match[1].length, match[0].length - match[1].length),\n            index: match.index + match[1].length,\n            ref: ref,\n        });\n\n        \n        var month = match[MONTH_NAME_GROUP];\n        month = util.MONTH_OFFSET[month.toLowerCase()];\n\n        var day = 1;\n\n        var year = null;\n        if (match[YEAR_GROUP] || match[YEAR_GROUP2]) {\n            year = match[YEAR_GROUP] || match[YEAR_GROUP2];\n            year = parseInt(year);\n\n            if (match[YEAR_BE_GROUP] || match[YEAR_BE_GROUP2]) {\n                if (/v/i.test(match[YEAR_BE_GROUP] || match[YEAR_BE_GROUP2])) {\n                    // v.Chr.\n                    year = -year;\n                }\n\n            } else if (year < 100){ \n\n                year = year + 2000;\n            }\n        }\n\n        if(year){\n            result.start.imply('day', day);\n            result.start.assign('month', month);\n            result.start.assign('year', year);\n        } else {\n            \n            //Find the most appropriated year\n            var refMoment = moment(ref);\n            refMoment.month(month - 1);\n            refMoment.date(day);\n\n            var nextYear = refMoment.clone().add(1, 'y');\n            var lastYear = refMoment.clone().add(-1, 'y');\n            if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){  \n                refMoment = nextYear;\n            }\n            else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){ \n                refMoment = lastYear;\n            }\n\n            result.start.imply('day', day);\n            result.start.assign('month', month);\n            result.start.imply('year', refMoment.year());\n        }\n\n        result.tags['DEMonthNameParser'] = true;\n        return result;\n    }\n}\n\n","/*\n    Date format with slash \"/\" (also \"-\" and \".\") between numbers\n    - Tuesday 11/3/2015\n    - 11/3/2015\n    - 11/3\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(?:' +\n        '(?:am\\\\s*?)?' +\n        '((?:sonntag|so|montag|mo|dienstag|di|mittwoch|mi|donnerstag|do|freitag|fr|samstag|sa))' +\n        '\\\\s*\\\\,?\\\\s*' +\n        '(?:den\\\\s*)?' +\n    ')?' +\n    '([0-3]{0,1}[0-9]{1})[\\\\/\\\\.\\\\-]([0-3]{0,1}[0-9]{1})' +\n    '(?:' +\n        '[\\\\/\\\\.\\\\-]' +\n        '([0-9]{4}\\s*\\,?\\s*|[0-9]{2}\\s*\\,?\\s*)' +\n    ')?' +\n    '(\\\\W|$)', 'i');\n\nvar DAYS_OFFSET = {\n    'sonntag': 0, 'so': 0,\n    'montag': 1, 'mo': 1,\n    'dienstag': 2, 'di': 2,\n    'mittwoch': 3, 'mi': 3,\n    'donnerstag': 4, 'do': 4,\n    'freitag': 5, 'fr': 5,\n    'samstag': 6, 'sa': 6\n};\n\n\nvar OPENNING_GROUP = 1;\nvar ENDING_GROUP = 6;\n\nvar WEEKDAY_GROUP = 2;\nvar DAY_GROUP = 3;\nvar MONTH_GROUP = 4;\nvar YEAR_GROUP = 5;\n\nexports.Parser = function DESlashDateFormatParser(argument) {\n    Parser.apply(this, arguments);\n\n    this.pattern = function () { return PATTERN; };\n    this.extract = function(text, ref, match, opt){\n\n        if(match[OPENNING_GROUP] == '/' || match[ENDING_GROUP] == '/') {\n            // Long skip, if there is some overlapping like:\n            // XX[/YY/ZZ]\n            // [XX/YY/]ZZ\n            match.index += match[0].length\n            return;\n        }\n\n        var index = match.index + match[OPENNING_GROUP].length;\n        var text = match[0].substr(match[OPENNING_GROUP].length, match[0].length - match[ENDING_GROUP].length);\n\n\n        var result = new ParsedResult({\n            text: text,\n            index: index,\n            ref: ref,\n        });\n\n        if(text.match(/^\\d\\.\\d$/)) return;\n        if(text.match(/^\\d\\.\\d{1,2}\\.\\d{1,2}$/)) return;\n\n        // MM/dd -> OK\n        // MM.dd -> NG\n        if(!match[YEAR_GROUP] && match[0].indexOf('/') < 0) return;\n\n        var date = null;\n        var year = match[YEAR_GROUP] || moment(ref).year() + '';\n        var month = match[MONTH_GROUP];\n        var day   = match[DAY_GROUP];\n\n        month = parseInt(month);\n        day  = parseInt(day);\n        year = parseInt(year);\n\n        if (month < 1 || month > 12) return null;\n        if(day < 1 || day > 31) return null;\n\n        if(year < 100){\n            if (year > 50) {\n                year = year + 1900;\n            } else {\n                year = year + 2000;\n            }\n        }\n\n        result.start.assign('day', day);\n        result.start.assign('month', month);\n        result.start.assign('year', year);\n\n        //Day of week\n        if(match[WEEKDAY_GROUP]) {\n            result.start.assign('weekday', DAYS_OFFSET[match[WEEKDAY_GROUP].toLowerCase()]);\n        }\n\n        result.tags['DESlashDateFormatParser'] = true;\n        return result;\n    };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/DE');\n\nvar PATTERN = new RegExp('' +\n    '(\\\\W|^)vor\\\\s*' +\n    '(' + util.INTEGER_WORDS_PATTERN + '|[0-9]+|einigen|eine[rm]\\\\s*halben|eine[rm])\\\\s*' +\n    '(sekunden?|min(?:ute)?n?|stunden?|wochen?|tag(?:en)?|monat(?:en)?|jahr(?:en)?)\\\\s*' +\n    '(?=(?:\\\\W|$))', 'i');\n\nvar STRICT_PATTERN = new RegExp('' +\n    '(\\\\W|^)vor\\\\s*' +\n    '([0-9]+|eine(?:r|m))\\\\s*' +\n    '(sekunden?|minuten?|stunden?|tag(?:en)?)' +\n    '(?=(?:\\\\W|$))', 'i');\n\nexports.Parser = function DETimeAgoFormatParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return this.isStrictMode()? STRICT_PATTERN : PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt){\n\n        if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n\n        var text = match[0];\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\n        index = match.index + match[1].length;\n\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n\n        var num = match[2].toLowerCase() ;\n        if (util.INTEGER_WORDS[num] !== undefined) {\n            num = util.INTEGER_WORDS[num];\n        } else if (num === 'einer' || num === 'einem') {\n            num = 1;\n        } else if (num === 'einigen') {\n            num = 3;\n        } else if (/halben/.test(num)) {\n            num = 0.5;\n        } else {\n            num = parseInt(num);\n        }\n\n        var date = moment(ref);\n\n        if (/stunde|min|sekunde/i.test(match[3])) {\n            if (/stunde/i.test(match[3])) {\n\n                date.add(-num, 'hour');\n\n            } else if (/min/i.test(match[3])) {\n\n                date.add(-num, 'minute');\n\n            } else if (/sekunde/i.test(match[3])) {\n\n                date.add(-num, 'second');\n            }\n\n            result.start.imply('day', date.date());\n            result.start.imply('month', date.month() + 1);\n            result.start.imply('year', date.year());\n            result.start.assign('hour', date.hour());\n            result.start.assign('minute', date.minute());\n            result.start.assign('second', date.second());\n            result.tags['DETimeAgoFormatParser'] = true;\n            return result;\n        }\n\n        if (/woche/i.test(match[3])) {\n            date.add(-num, 'week');\n\n            result.start.imply('day', date.date());\n            result.start.imply('month', date.month() + 1);\n            result.start.imply('year', date.year());\n            result.start.imply('weekday', date.day());\n            return result;\n        }\n\n        if (/tag/i.test(match[3])) {\n            date.add(-num, 'd');\n        }\n\n        if (/monat/i.test(match[3])) {\n            date.add(-num, 'month');\n        }\n\n        if (/jahr/i.test(match[3])) {\n\n            date.add(-num, 'year');\n        }\n\n        result.start.assign('day', date.date());\n        result.start.assign('month', date.month() + 1);\n        result.start.assign('year', date.year());\n        return result;\n\n    };\n}\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar ParsedComponents = require('../../result').ParsedComponents;\n\nvar FIRST_REG_PATTERN  = new RegExp(\"(^|\\\\s|T)\" +\n    \"(?:(?:um|von)\\\\s*)?\" + \n    \"(\\\\d{1,4}|mittags?|mitternachts?)\" + \n    \"(?:\" + \n        \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" + \n        \"(?:\" + \n            \"(?:\\\\:|\\\\:)(\\\\d{2})\" + \n        \")?\" + \n    \")?\" +\n    \"(?:\\\\s*uhr)?\" +\n    \"(?:\\\\s*(morgens|vormittags|mittags|nachmittags|abends|nachts))?\" + \n    \"(?=\\\\W|$)\", 'i');\n\n\nvar SECOND_REG_PATTERN = new RegExp(\"^\\\\s*\" + \n    \"(\\\\-|\\\\–|\\\\~|\\\\〜|bis|\\\\?)\\\\s*\" + \n    \"(\\\\d{1,4})\" +\n    \"(?:\" + \n        \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" + \n        \"(?:\" + \n            \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" + \n        \")?\" + \n    \")?\" + \n    \"(?:\\\\s*(morgens|vormittags|mittags|nachmittags|abends|nachts))?\" + \n    \"(?=\\\\W|$)\", 'i');\n\nvar HOUR_GROUP    = 2;\nvar MINUTE_GROUP  = 3;\nvar SECOND_GROUP  = 4;\nvar AM_PM_HOUR_GROUP = 5;\n\n\nexports.Parser = function DETimeExpressionParser() {\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return FIRST_REG_PATTERN; }\n    \n    this.extract = function(text, ref, match, opt){ \n        \n        // This pattern can be overlaped Ex. [12] AM, 1[2] AM\n        if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n        var refMoment = moment(ref);\n        var result = new ParsedResult();\n        result.ref = ref;\n        result.index = match.index + match[1].length;\n        result.text  = match[0].substring(match[1].length);\n        result.tags['DETimeExpressionParser'] = true;\n\n        result.start.imply('day',   refMoment.date());\n        result.start.imply('month', refMoment.month()+1);\n        result.start.imply('year',  refMoment.year());\n        \n        var hour = 0;\n        var minute = 0;\n        var meridiem = -1;\n\n        // ----- Second\n        if(match[SECOND_GROUP] != null){ \n            var second = parseInt(match[SECOND_GROUP]);\n            if(second >= 60) return null;\n\n            result.start.assign('second', second);\n        }\n        \n        // ----- Hours\n        if (/mittags?/i.test(match[HOUR_GROUP])) {\n            meridiem = 1; \n            hour = 12;\n        } else if (/mitternachts?/i.test(match[HOUR_GROUP])) {\n            meridiem = 0; \n            hour = 0;\n        } else {\n            hour = parseInt(match[HOUR_GROUP]);\n        }\n        \n        // ----- Minutes\n        if(match[MINUTE_GROUP] != null){ \n            minute = parseInt(match[MINUTE_GROUP]);\n        } else if(hour > 100) { \n            minute = hour%100;\n            hour   = parseInt(hour/100);\n        } \n        \n        if(minute >= 60) {\n            return null;\n        }\n\n        if(hour > 24) {\n            return null;\n        }\n        if (hour >= 12) { \n            meridiem = 1;\n        }\n\n        // ----- AM & PM  \n        if (match[AM_PM_HOUR_GROUP] != null) {\n            if (hour > 12) return null;\n            var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n            if (ampm === 'morgens' || ampm === 'vormittags') {\n                meridiem = 0; \n                if(hour == 12) hour = 0;\n            } else {\n                meridiem = 1; \n                if(hour != 12) hour += 12;\n            }\n        } \n\n        result.start.assign('hour', hour);\n        result.start.assign('minute', minute);\n\n        if (meridiem >= 0) {\n            result.start.assign('meridiem', meridiem);\n        } else {\n            if (hour < 12) {\n                result.start.imply('meridiem', 0);\n            } else {\n                result.start.imply('meridiem', 1);\n            }\n        }\n        \n        // ==============================================================\n        //                  Extracting the 'to' chunk\n        // ==============================================================\n        match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));\n        if (!match) {\n            // Not accept number only result\n            if (result.text.match(/^\\d+$/)) { \n                return null;\n            }\n            return result;\n        }\n\n\n\n        // Pattern \"YY.YY -XXXX\" is more like timezone offset\n        if (match[0].match(/^\\s*(\\+|\\-)\\s*\\d{3,4}$/)) {\n            return result;\n        }\n\n        if(result.end == null){\n            result.end = new ParsedComponents(null, result.start.date());\n        }\n\n        var hour = 0;\n        var minute = 0;\n        var meridiem = -1;\n\n        // ----- Second\n        if(match[SECOND_GROUP] != null){ \n            var second = parseInt(match[SECOND_GROUP]);\n            if(second >= 60) return null;\n\n            result.end.assign('second', second);\n        }\n\n        hour = parseInt(match[2]);\n        \n        // ----- Minute\n        if (match[MINUTE_GROUP]!= null) {\n            \n            minute = parseInt(match[MINUTE_GROUP]);\n            if(minute >= 60) return result;\n            \n        } else if (hour > 100) {\n\n            minute = hour%100;\n            hour   = parseInt(hour/100);\n        }\n\n        if(minute >= 60) {\n            return null;\n        }\n\n        if(hour > 24) {\n            return null;\n        }\n        if (hour >= 12) { \n            meridiem = 1;\n        }\n        \n        // ----- AM & PM \n        if (match[AM_PM_HOUR_GROUP] != null) {\n\n            if (hour > 12) return null;\n\n            var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n            if (ampm === 'morgens' || ampm === 'vormittags') {\n                meridiem = 0; \n                if(hour == 12) {\n                    hour = 0;\n                    if (!result.end.isCertain('day')) {\n                        result.end.imply('day', result.end.get('day') + 1);\n                    }\n                }\n            } else {\n                meridiem = 1; \n                if(hour != 12) hour += 12;\n            }\n            \n            if (!result.start.isCertain('meridiem')) {\n                if (meridiem == 0) {\n                    \n                    result.start.imply('meridiem', 0);\n                    \n                    if (result.start.get('hour') == 12) {\n                        result.start.assign('hour', 0);\n                    }\n\n                } else {\n\n                    result.start.imply('meridiem', 1);\n                    \n                    if (result.start.get('hour') != 12) {\n                        result.start.assign('hour', result.start.get('hour') + 12); \n                    }\n                }\n            }\n        }\n\n        result.text = result.text + match[0];\n        result.end.assign('hour', hour);\n        result.end.assign('minute', minute);\n        if (meridiem >= 0) {\n            result.end.assign('meridiem', meridiem);\n        } else {\n            var startAtPM = result.start.isCertain('meridiem') && result.start.get('meridiem') == 1;\n            if (startAtPM && result.start.get('hour') > hour) {\n                // 10pm - 1 (am)\n                result.end.imply('meridiem', 0);\n\n            } else if (hour > 12) {\n                result.end.imply('meridiem', 1);\n            }\n        }\n\n        if (result.end.date().getTime() < result.start.date().getTime()) {\n            result.end.imply('day', result.end.get('day') + 1)\n        }\n        \n        return result;\n    }\n}\n","/*\n\n\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar DAYS_OFFSET = {\n    'sonntag': 0, 'so': 0,\n    'montag': 1, 'mo': 1,\n    'dienstag': 2, 'di': 2,\n    'mittwoch': 3, 'mi': 3,\n    'donnerstag': 4, 'do': 4,\n    'freitag': 5, 'fr': 5,\n    'samstag': 6, 'sa': 6\n};\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(?:(?:\\\\,|\\\\(|\\\\()\\\\s*)?' +\n    '(?:a[mn]\\\\s*?)?' +\n    '(?:(diese[mn]|letzte[mn]|n(?:ä|ae)chste[mn])\\\\s*)?' +\n    '(' + Object.keys(DAYS_OFFSET).join('|') + ')' +\n    '(?:\\\\s*(?:\\\\,|\\\\)|\\\\)))?' +\n    '(?:\\\\s*(diese|letzte|n(?:ä|ae)chste)\\\\s*woche)?' +\n    '(?=\\\\W|$)', 'i');\n\nvar PREFIX_GROUP = 2;\nvar WEEKDAY_GROUP = 3;\nvar POSTFIX_GROUP = 4;\n\nexports.Parser = function DEWeekdayParser() {\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; };\n\n    this.extract = function(text, ref, match, opt){\n        var index = match.index + match[1].length;\n        var text = match[0].substr(match[1].length, match[0].length - match[1].length);\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref,\n        });\n\n        var dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();\n        var offset = DAYS_OFFSET[dayOfWeek];\n        if(offset === undefined) return null;\n\n        var startMoment = moment(ref);\n        var prefix = match[PREFIX_GROUP];\n        var postfix = match[POSTFIX_GROUP];\n\n        var refOffset = startMoment.day();\n        var norm = prefix || postfix;\n        norm = norm || '';\n        norm = norm.toLowerCase();\n        if (/letzte/.test(norm)) {\n            startMoment.day(offset - 7);\n        } else if (/n(?:ä|ae)chste/.test(norm)) {\n            startMoment.day(offset + 7);\n        } else if (/diese/.test(norm)) {\n            if ( opt.forwardDate && refOffset > offset ) {\n                startMoment.day(offset + 7);\n            } else {\n                startMoment.day(offset);\n            }\n        } else {\n            if ( opt.forwardDate && refOffset > offset ) {\n                startMoment.day(offset + 7);\n            } else if (!opt.forwardDate && Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) {\n                startMoment.day(offset - 7);\n            } else if (!opt.forwardDate && Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) {\n                startMoment.day(offset + 7);\n            } else {\n                startMoment.day(offset);\n            }\n        }\n\n        result.start.assign('weekday', offset);\n        result.start.imply('day', startMoment.date());\n        result.start.imply('month', startMoment.month() + 1);\n        result.start.imply('year', startMoment.year());\n        return result;\n    }\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = /(\\W|^)(now|today|tonight|last\\s*night|(?:tomorrow|tmr|yesterday)\\s*|tomorrow|tmr|yesterday)(?=\\W|$)/i;\n\nexports.Parser = function ENCasualDateParser(){\n\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n\n        var text = match[0].substr(match[1].length);\n        var index = match.index + match[1].length;\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref,\n        });\n\n        var refMoment = moment(ref);\n        var startMoment = refMoment.clone();\n        var lowerText = text.toLowerCase();\n\n        if(lowerText == 'tonight'){\n            // Normally means this coming midnight\n            result.start.imply('hour', 22);\n            result.start.imply('meridiem', 1);\n\n        } else if (/^tomorrow|^tmr/.test(lowerText)) {\n\n            // Check not \"Tomorrow\" on late night\n            if(refMoment.hour() > 1) {\n                startMoment.add(1, 'day');\n            }\n\n        } else if (/^yesterday/.test(lowerText)) {\n\n            startMoment.add(-1, 'day');\n\n        } else if(lowerText.match(/last\\s*night/)) {\n\n            result.start.imply('hour', 0);\n            if (refMoment.hour() > 6) {\n                startMoment.add(-1, 'day');\n            }\n\n        } else if (lowerText.match(\"now\")) {\n\n          result.start.assign('hour', refMoment.hour());\n          result.start.assign('minute', refMoment.minute());\n          result.start.assign('second', refMoment.second());\n          result.start.assign('millisecond', refMoment.millisecond());\n\n        }\n\n        result.start.assign('day', startMoment.date())\n        result.start.assign('month', startMoment.month() + 1)\n        result.start.assign('year', startMoment.year())\n        result.tags['ENCasualDateParser'] = true;\n        return result;\n    }\n}\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = /(\\W|^)((this)?\\s*(morning|afternoon|evening|noon|night))/i;\n\nvar TIME_MATCH = 4;\n\nexports.Parser = function ENCasualTimeParser(){\n\n    Parser.apply(this, arguments);\n\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n\n        var text = match[0].substr(match[1].length);\n        var index = match.index + match[1].length;\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref,\n        });\n\n        if(!match[TIME_MATCH]) TIME_MATCH = 3;\n        \n        switch (match[TIME_MATCH].toLowerCase()) {\n\n            case 'afternoon':\n                result.start.imply('meridiem', 1);\n                result.start.imply('hour', 15);\n                break;\n\n            case 'evening':\n            case 'night':\n                result.start.imply('meridiem', 1);\n                result.start.imply('hour', 20);\n                break;\n\n            case 'morning':\n                result.start.imply('meridiem', 0);\n                result.start.imply('hour', 6);\n                break;\n\n            case 'noon':\n                result.start.imply('meridiem', 0);\n                result.start.imply('hour', 12);\n                break;\n        }\n        \n        result.tags['ENCasualTimeParser'] = true;\n        return result;\n    };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(within|in)\\\\s*' +\n    '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|an?(?:\\\\s*few)?|half(?:\\\\s*an?)?)\\\\s*' +\n    '(seconds?|min(?:ute)?s?|hours?|days?|weeks?|months?|years?)\\\\s*' +\n    '(?=\\\\W|$)', 'i'\n);\n\nvar STRICT_PATTERN = new RegExp('(\\\\W|^)' +\n    '(within|in)\\\\s*' +\n    '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|an?)\\\\s*' +\n    '(seconds?|minutes?|hours?|days?)\\\\s*' +\n    '(?=\\\\W|$)', 'i'\n);\n\nexports.Parser = function ENDeadlineFormatParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return this.isStrictMode()? STRICT_PATTERN : PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt){\n\n        var index = match.index + match[1].length;\n        var text  = match[0];\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\n\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n\n        var num = match[3].toLowerCase();\n        if (util.INTEGER_WORDS[num] !== undefined) {\n            num = util.INTEGER_WORDS[num];\n        } else if (num === 'a' || num === 'an'){\n            num = 1;\n        } else if (num.match(/few/i)){\n            num = 3;\n        } else if (num.match(/half/i)) {\n            num = 0.5;\n        } else {\n            num = parseInt(num);\n        }\n\n        var date = moment(ref);\n        if (match[4].match(/day|week|month|year/i)) {\n\n            if (match[4].match(/day/i)) {\n                date.add(num, 'd');\n            } else if (match[4].match(/week/i)) {\n                date.add(num * 7, 'd');\n            } else if (match[4].match(/month/i)) {\n                date.add(num, 'month');\n            } else if (match[4].match(/year/i)) {\n                date.add(num, 'year');\n            }\n\n            result.start.imply('year', date.year());\n            result.start.imply('month', date.month() + 1);\n            result.start.imply('day', date.date());\n            return result;\n        }\n\n        if (match[4].match(/hour/i)) {\n\n            date.add(num, 'hour');\n\n        } else if (match[4].match(/min/i)) {\n\n            date.add(num, 'minute');\n\n        } else if (match[4].match(/second/i)) {\n\n            date.add(num, 'second');\n        }\n\n        result.start.imply('year', date.year());\n        result.start.imply('month', date.month() + 1);\n        result.start.imply('day', date.date());\n        result.start.imply('hour', date.hour());\n        result.start.imply('minute', date.minute());\n        result.start.imply('second', date.second());\n        result.tags['ENDeadlineFormatParser'] = true;\n        return result;\n    };\n};\n","/*\n    ISO 8601\n    http://www.w3.org/TR/NOTE-datetime\n    - YYYY-MM-DD\n    - YYYY-MM-DDThh:mmTZD\n    - YYYY-MM-DDThh:mm:ssTZD\n    - YYYY-MM-DDThh:mm:ss.sTZD \n    - TZD = (Z or +hh:mm or -hh:mm)\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp('(\\\\W|^)' \n            + '([0-9]{4})\\\\-([0-9]{1,2})\\\\-([0-9]{1,2})'\n            + '(?:T' //..\n                + '([0-9]{1,2}):([0-9]{1,2})' // hh:mm\n                + '(?::([0-9]{1,2})(?:\\\\.(\\\\d{1,4}))?)?' // :ss.s\n                + '(?:Z|([+-]\\\\d{2}):?(\\\\d{2})?)?' // TZD (Z or ±hh:mm or ±hhmm or ±hh)\n            + ')?'  //..\n            + '(?=\\\\W|$)', 'i');\n\nvar YEAR_NUMBER_GROUP = 2;\nvar MONTH_NUMBER_GROUP = 3;\nvar DATE_NUMBER_GROUP  = 4;\nvar HOUR_NUMBER_GROUP  = 5;\nvar MINUTE_NUMBER_GROUP = 6;\nvar SECOND_NUMBER_GROUP = 7;\nvar MILLISECOND_NUMBER_GROUP = 8;\nvar TZD_HOUR_OFFSET_GROUP = 9;\nvar TZD_MINUTE_OFFSET_GROUP = 10;\n\nexports.Parser = function ENISOFormatParser(){\n    Parser.apply(this, arguments);\n    \n    this.pattern = function() { return PATTERN; }\n    \n    this.extract = function(text, ref, match, opt){ \n        \n        var text = match[0].substr(match[1].length);\n        var index = match.index + match[1].length;\n\n        var result = new ParsedResult({\n            text: text,\n            index: index,\n            ref: ref,\n        })\n        \n        result.start.assign('year', parseInt(match[YEAR_NUMBER_GROUP]));\n        result.start.assign('month', parseInt(match[MONTH_NUMBER_GROUP]));\n        result.start.assign('day', parseInt(match[DATE_NUMBER_GROUP]));\n\n        if (moment(result.start.get('month')) > 12 || moment(result.start.get('month')) < 1 ||\n            moment(result.start.get('day')) > 31 || moment(result.start.get('day')) < 1) {\n            return null;\n        }\n\n        if (match[HOUR_NUMBER_GROUP] != null) {\n            \n            result.start.assign('hour',\n                    parseInt(match[HOUR_NUMBER_GROUP]));\n            result.start.assign('minute',\n                    parseInt(match[MINUTE_NUMBER_GROUP]));\n\n            if (match[SECOND_NUMBER_GROUP] != null) {\n\n                result.start.assign('second',\n                        parseInt(match[SECOND_NUMBER_GROUP]));\n            }\n\n            if (match[MILLISECOND_NUMBER_GROUP] != null) {\n\n                result.start.assign('millisecond',\n                        parseInt(match[MILLISECOND_NUMBER_GROUP]));\n            }\n\n            if (match[TZD_HOUR_OFFSET_GROUP] == null) {\n\n                result.start.assign('timezoneOffset', 0);\n            } else {\n\n                var minuteOffset = 0;\n                var hourOffset = parseInt(match[TZD_HOUR_OFFSET_GROUP]);\n                if (match[TZD_MINUTE_OFFSET_GROUP] != null)\n                    minuteOffset = parseInt(match[TZD_MINUTE_OFFSET_GROUP]);\n\n                var offset = hourOffset * 60;\n                if (offset < 0) {\n                    offset -= minuteOffset;\n                } else {\n                    offset += minuteOffset;\n                }\n\n                result.start.assign('timezoneOffset', offset);\n            }\n        }\n        \n        result.tags['ENISOFormatParser'] = true;\n        return result;\n    };\n\n}\n\n","/*\n\n\n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n        '(?:on\\\\s*?)?' +\n        '(?:(Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sun|Mon|Tue|Wed|Thu|Fri|Sat)\\\\s*,?\\\\s*)?' +\n        '(([0-9]{1,2})(?:st|nd|rd|th)?|' + util.ORDINAL_WORDS_PATTERN + ')' +\n        '(?:\\\\s*' +\n            '(?:to|\\\\-|\\\\–|until|through|till|\\\\s)\\\\s*' +\n            '(([0-9]{1,2})(?:st|nd|rd|th)?|' + util.ORDINAL_WORDS_PATTERN + ')' +\n        ')?' + \n        '(?:-|\\/|\\\\s*(?:of)?\\\\s*)' +\n        '(' + util.MONTH_PATTERN + ')' +\n        '(?:' +\n            '(?:-|\\/|,?\\\\s*)' +\n            '((?:' + \n                '[1-9][0-9]{0,3}\\\\s*(?:BE|AD|BC)|' +\n                '[1-2][0-9]{3}' + \n            ')(?![^\\\\s]\\\\d))' +\n        ')?' +\n        '(?=\\\\W|$)', 'i'\n    );\n\nvar WEEKDAY_GROUP = 2;\nvar DATE_GROUP = 3;\nvar DATE_NUM_GROUP = 4;\nvar DATE_TO_GROUP = 5;\nvar DATE_TO_NUM_GROUP = 6;\nvar MONTH_NAME_GROUP = 7;\nvar YEAR_GROUP = 8;\n\nexports.Parser = function ENMonthNameLittleEndianParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n\n        var result = new ParsedResult({\n            text: match[0].substr(match[1].length, match[0].length - match[1].length),\n            index: match.index + match[1].length,\n            ref: ref\n        });\n\n        var month = match[MONTH_NAME_GROUP];\n        month = util.MONTH_OFFSET[month.toLowerCase()];\n\n        var day = match[DATE_NUM_GROUP] ?\n            parseInt(match[DATE_NUM_GROUP]):\n            util.ORDINAL_WORDS[match[DATE_GROUP].trim().replace('-', ' ').toLowerCase()];\n\n        var year = null;\n        if (match[YEAR_GROUP]) {\n            year = match[YEAR_GROUP];\n            \n            if (/BE/i.test(year)) {\n                // Buddhist Era\n                year = year.replace(/BE/i, '');\n                year = parseInt(year) - 543;\n            } else if (/BC/i.test(year)){\n                // Before Christ\n                year = year.replace(/BC/i, '');\n                year = -parseInt(year);\n            } else if (/AD/i.test(year)){\n                year = year.replace(/AD/i, '');\n                year = parseInt(year);\n            } else {\n                year = parseInt(year);\n                if (year < 100){\n                    year = year + 2000;\n                }\n            }\n        }\n\n        if(year){\n            result.start.assign('day', day);\n            result.start.assign('month', month);\n            result.start.assign('year', year);\n        } else {\n\n            //Find the most appropriated year\n            var refMoment = moment(ref);\n            refMoment.month(month - 1);\n            refMoment.date(day);\n            refMoment.year(moment(ref).year());\n\n            var nextYear = refMoment.clone().add(1, 'y');\n            var lastYear = refMoment.clone().add(-1, 'y');\n            if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n                refMoment = nextYear;\n            }\n            else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n                refMoment = lastYear;\n            }\n\n            result.start.assign('day', day);\n            result.start.assign('month', month);\n            result.start.imply('year', refMoment.year());\n        }\n\n        // Weekday component\n        if (match[WEEKDAY_GROUP]) {\n            var weekday = match[WEEKDAY_GROUP];\n            weekday = util.WEEKDAY_OFFSET[weekday.toLowerCase()]\n            result.start.assign('weekday', weekday);\n        }\n\n        // Text can be 'range' value. Such as '12 - 13 January 2012'\n        if (match[DATE_TO_GROUP]) {\n            var endDate = match[DATE_TO_NUM_GROUP] ?\n                parseInt(match[DATE_TO_NUM_GROUP]):\n                util.ORDINAL_WORDS[match[DATE_TO_GROUP].trim().replace('-', ' ').toLowerCase()];\n\n            result.end = result.start.clone();\n            result.end.assign('day', endDate);\n        }\n\n        result.tags['ENMonthNameLittleEndianParser'] = true;\n        return result;\n    };\n};\n","/*\n\n    The parser for parsing US's date format that begin with month's name.\n\n    EX.\n        - January 13\n        - January 13, 2012\n        - January 13 - 15, 2012\n        - Tuesday, January 13, 2012\n\n    Watch out for:\n        - January 12:00\n        - January 12.44\n        - January 1222344\n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(?:' +\n        '(?:on\\\\s*?)?' +\n        '(Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sun\\\\.?|Mon\\\\.?|Tue\\\\.?|Wed\\\\.?|Thu\\\\.?|Fri\\\\.?|Sat\\\\.?)' +\n    '\\\\s*,?\\\\s*)?' +\n    '(' + util.MONTH_PATTERN + ')' +\n    '(?:-|\\/|\\\\s*,?\\\\s*)' +\n    '(([0-9]{1,2})(?:st|nd|rd|th)?|' + util.ORDINAL_WORDS_PATTERN +')(?!\\\\s*(?:am|pm))\\\\s*' + '' + \n    '(?:' +\n        '(?:to|\\\\-)\\\\s*' +\n        '(([0-9]{1,2})(?:st|nd|rd|th)?| ' + util.ORDINAL_WORDS_PATTERN + ')\\\\s*' +\n    ')?' +\n    '(?:' +\n        '(?:-|\\/|\\\\s*,?\\\\s*)' +\n        '(?:([0-9]{4})\\\\s*(BE|AD|BC)?|([0-9]{1,4})\\\\s*(AD|BC))\\\\s*' +\n    ')?' +\n    '(?=\\\\W|$)(?!\\\\:\\\\d)', 'i');\n\nvar WEEKDAY_GROUP = 2;\nvar MONTH_NAME_GROUP = 3;\nvar DATE_GROUP = 4;\nvar DATE_NUM_GROUP = 5;\nvar DATE_TO_GROUP = 6;\nvar DATE_TO_NUM_GROUP = 7;\nvar YEAR_GROUP = 8;\nvar YEAR_BE_GROUP = 9;\nvar YEAR_GROUP2 = 10;\nvar YEAR_BE_GROUP2 = 11;\n\nexports.Parser = function ENMonthNameMiddleEndianParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n\n        var result = new ParsedResult({\n            text: match[0].substr(match[1].length, match[0].length - match[1].length),\n            index: match.index + match[1].length,\n            ref: ref,\n        });\n\n\n        var month = match[MONTH_NAME_GROUP];\n        month = util.MONTH_OFFSET[month.toLowerCase()];\n        var day = match[DATE_NUM_GROUP] ?\n            parseInt(match[DATE_NUM_GROUP]) :\n            util.ORDINAL_WORDS[match[DATE_GROUP].trim().replace('-', ' ').toLowerCase()];\n\n        var year = null;\n        if (match[YEAR_GROUP] || match[YEAR_GROUP2]) {\n            year = match[YEAR_GROUP] || match[YEAR_GROUP2];\n            year = parseInt(year);\n\n            var yearBE = match[YEAR_BE_GROUP] || match[YEAR_BE_GROUP2];\n            if (yearBE) {\n                if (/BE/i.test(yearBE)) {\n                    // Buddhist Era\n                    year = year - 543;\n                } else if (/BC/i.test(yearBE)) {\n                    // Before Christ\n                    year = -year;\n                }\n            } else if (year < 100){\n\n                year = year + 2000;\n            }\n        }\n\n        if(year){\n            result.start.assign('day', day);\n            result.start.assign('month', month);\n            result.start.assign('year', year);\n        } else {\n\n            //Find the most appropriated year\n            var refMoment = moment(ref);\n            refMoment.month(month - 1);\n            refMoment.date(day);\n\n            var nextYear = refMoment.clone().add(1, 'y');\n            var lastYear = refMoment.clone().add(-1, 'y');\n            if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n                refMoment = nextYear;\n            }\n            else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n                refMoment = lastYear;\n            }\n\n            result.start.assign('day', day);\n            result.start.assign('month', month);\n            result.start.imply('year', refMoment.year());\n        }\n\n        // Weekday component\n        if (match[WEEKDAY_GROUP]) {\n            var weekday = match[WEEKDAY_GROUP];\n            weekday = util.WEEKDAY_OFFSET[weekday.toLowerCase()]\n            result.start.assign('weekday', weekday);\n        }\n\n        // Text can be 'range' value. Such as 'January 12 - 13, 2012'\n        if (match[DATE_TO_GROUP]) {\n            var endDate = match[DATE_TO_NUM_GROUP] ?\n                endDate = parseInt(match[DATE_TO_NUM_GROUP]) :\n                util.ORDINAL_WORDS[match[DATE_TO_GROUP].replace('-', ' ').trim().toLowerCase()];\n\n            result.end = result.start.clone();\n            result.end.assign('day', endDate);\n        }\n\n        result.tags['ENMonthNameMiddleEndianParser'] = true;\n        return result;\n    }\n};","/*\n    \n    The parser for parsing month name and year.\n    \n    EX. \n        - January\n        - January 2012\n        - January, 2012\n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(^|\\\\D\\\\s+|[^\\\\w\\\\s])' +\n    '('+ util.MONTH_PATTERN +')' + \n    '\\\\s*' +\n    '(?:' +\n        '[,-]?\\\\s*([0-9]{4})(\\\\s*BE|AD|BC)?' +\n    ')?' +\n    '(?=[^\\\\s\\\\w]|\\\\s+[^0-9]|\\\\s+$|$)', 'i');\n\nvar MONTH_NAME_GROUP = 2;\nvar YEAR_GROUP = 3;\nvar YEAR_BE_GROUP = 4;\n\nexports.Parser = function ENMonthNameParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n    \n    this.extract = function(text, ref, match, opt){\n        var result = new ParsedResult({\n            text: match[0].substr(match[1].length, match[0].length - match[1].length),\n            index: match.index + match[1].length,\n            ref: ref,\n        });\n\n        \n        var month = match[MONTH_NAME_GROUP];\n        month = util.MONTH_OFFSET[month.toLowerCase()];\n\n        var day = 1;\n\n        var year = null;\n        if (match[YEAR_GROUP]) {\n            year = match[YEAR_GROUP];\n            year = parseInt(year);\n\n            if(match[YEAR_BE_GROUP]){\n                if (match[YEAR_BE_GROUP].match(/BE/)) {\n                    // Buddhist Era\n                    year = year - 543;\n                } else if (match[YEAR_BE_GROUP].match(/BC/)) {\n                    // Before Christ\n                    year = -year;\n                }\n\n            } else if (year < 100){ \n\n                year = year + 2000;\n            }\n        }\n\n        if(year){\n            result.start.imply('day', day);\n            result.start.assign('month', month);\n            result.start.assign('year', year);\n        } else {\n            \n            //Find the most appropriated year\n            var refMoment = moment(ref);\n            refMoment.month(month - 1);\n            refMoment.date(day);\n\n            var nextYear = refMoment.clone().add(1, 'y');\n            var lastYear = refMoment.clone().add(-1, 'y');\n            if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){  \n                refMoment = nextYear;\n            }\n            else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){ \n                refMoment = lastYear;\n            }\n\n            result.start.imply('day', day);\n            result.start.assign('month', month);\n            result.start.imply('year', refMoment.year());\n        }\n\n        result.tags['ENMonthNameParser'] = true;\n        return result;\n    }\n}\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(this|next|last|past)\\\\s*' +\n    '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|few|half(?:\\\\s*an?)?)?\\\\s*' +\n    '(seconds?|min(?:ute)?s?|hours?|days?|weeks?|months?|years?)(?=\\\\s*)' +\n    '(?=\\\\W|$)', 'i'\n);\n\nvar MODIFIER_WORD_GROUP = 2;\nvar MULTIPLIER_WORD_GROUP = 3;\nvar RELATIVE_WORD_GROUP = 4;\n\nexports.Parser = function ENRelativeDateFormatParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; };\n\n    this.extract = function(text, ref, match, opt){\n\n        var index = match.index + match[1].length;\n        var modifier = match[MODIFIER_WORD_GROUP].toLowerCase().match(/^next/) ? 1 : -1;\n        var text  = match[0];\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\n\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n        result.tags['ENRelativeDateFormatParser'] = true;\n\n        var num = match[MULTIPLIER_WORD_GROUP] === undefined ? '' : match[3].toLowerCase();\n        if (util.INTEGER_WORDS[num] !== undefined) {\n            num = util.INTEGER_WORDS[num];\n        } else if (num === ''){\n            num = 1;\n        } else if (num.match(/few/i)){\n            num = 3;\n        } else if (num.match(/half/i)) {\n            num = 0.5;\n        } else {\n            num = parseInt(num);\n        }\n\n        num *= modifier;\n        var date = moment(ref);\n\n        if (match[MODIFIER_WORD_GROUP].toLowerCase().match(/^this/)) {\n\n            if (match[MULTIPLIER_WORD_GROUP]) {\n                return null;\n            }\n\n            if (match[RELATIVE_WORD_GROUP].match(/day|week|month|year/i)) {\n                \n                // This week\n                if (match[RELATIVE_WORD_GROUP].match(/week/i)) {\n                    date.add(-date.get('d'), 'd');\n                    result.start.imply('day', date.date());\n                    result.start.imply('month', date.month() + 1);\n                    result.start.imply('year', date.year());\n                } \n                \n                // This month\n                else if (match[RELATIVE_WORD_GROUP].match(/month/i)) {\n                    date.add(-date.date() + 1, 'd');\n                    result.start.imply('day', date.date());\n                    result.start.assign('year', date.year());\n                    result.start.assign('month', date.month() + 1);\n                } \n\n                // This year\n                else if (match[RELATIVE_WORD_GROUP].match(/year/i)) {\n                    date.add(-date.date() + 1, 'd');\n                    date.add(-date.month(), 'month');\n\n                    result.start.imply('day', date.date());\n                    result.start.imply('month', date.month() + 1);\n                    result.start.assign('year', date.year());\n                } \n\n                return result;\n            }\n        }\n        \n        if (match[RELATIVE_WORD_GROUP].match(/day|week|month|year/i)) {\n\n            if (match[RELATIVE_WORD_GROUP].match(/day/i)) {\n                date.add(num, 'd');\n                result.start.assign('year', date.year());\n                result.start.assign('month', date.month() + 1);\n                result.start.assign('day', date.date());\n            } else if (match[RELATIVE_WORD_GROUP].match(/week/i)) {\n                date.add(num * 7, 'd');\n                // We don't know the exact date for next/last week so we imply\n                // them\n                result.start.imply('day', date.date());\n                result.start.imply('month', date.month() + 1);\n                result.start.imply('year', date.year());\n            } else if (match[RELATIVE_WORD_GROUP].match(/month/i)) {\n                date.add(num, 'month');\n                // We don't know the exact day for next/last month\n                result.start.imply('day', date.date());\n                result.start.assign('year', date.year());\n                result.start.assign('month', date.month() + 1);\n            } else if (match[RELATIVE_WORD_GROUP].match(/year/i)) {\n                date.add(num, 'year');\n                // We don't know the exact day for month on next/last year\n                result.start.imply('day', date.date());\n                result.start.imply('month', date.month() + 1);\n                result.start.assign('year', date.year());\n            }\n\n            return result;\n        }\n\n        if (match[RELATIVE_WORD_GROUP].match(/hour/i)) {\n\n            date.add(num, 'hour');\n            result.start.imply('minute', date.minute());\n            result.start.imply('second', date.second());\n\n        } else if (match[RELATIVE_WORD_GROUP].match(/min/i)) {\n\n            date.add(num, 'minute');\n            result.start.assign('minute', date.minute());\n            result.start.imply('second', date.second());\n\n        } else if (match[RELATIVE_WORD_GROUP].match(/second/i)) {\n\n            date.add(num, 'second');\n            result.start.assign('second', date.second());\n            result.start.assign('minute', date.minute());\n        }\n\n        result.start.assign('hour', date.hour());\n        result.start.assign('year', date.year());\n        result.start.assign('month', date.month() + 1);\n        result.start.assign('day', date.date());\n        return result;\n    };\n};\n","/*\n    Date format with slash \"/\" (also \"-\" and \".\") between numbers\n    - Tuesday 11/3/2015 \n    - 11/3/2015\n    - 11/3\n\n    By default the paser us \"middle-endien\" format (US English),\n    then fallback to little-endian if failed.\n    - 11/3/2015 = November 3rd, 2015\n    - 23/4/2015 = April 23th, 2015\n\n    If \"littleEndian\" config is set, the parser will try the little-endian first. \n    - 11/3/2015 = March 11th, 2015\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(?:' +\n        '(?:on\\\\s*?)?' +\n        '((?:sun|mon|tues?|wed(?:nes)?|thu(?:rs?)?|fri|sat(?:ur)?)(?:day)?)' +\n        '\\\\s*\\\\,?\\\\s*' +\n    ')?' +\n    '([0-3]{0,1}[0-9]{1})[\\\\/\\\\.\\\\-]([0-3]{0,1}[0-9]{1})' +\n    '(?:' +\n        '[\\\\/\\\\.\\\\-]' +\n        '([0-9]{4}\\s*\\,?\\s*|[0-9]{2}\\s*\\,?\\s*)' +\n    ')?' +\n    '(\\\\W|$)', 'i');\n\nvar DAYS_OFFSET = { 'sunday': 0, 'sun': 0, 'monday': 1, 'mon': 1,'tuesday': 2, 'wednesday': 3, 'wed': 3,\n    'thursday': 4, 'thur': 4,'friday': 5, 'fri': 5,'saturday': 6, 'sat': 6,}\n\n\nvar OPENNING_GROUP = 1;\nvar ENDING_GROUP = 6;\n\nvar WEEKDAY_GROUP = 2;\n\n\nvar FIRST_NUMBERS_GROUP = 3;\nvar SECOND_NUMBERS_GROUP = 4;\n\nvar YEAR_GROUP = 5;\n\nexports.Parser = function ENSlashDateFormatParser(config) {\n    Parser.apply(this, arguments);\n    config = config || {};\n    var littleEndian  = config.littleEndian;\n    var MONTH_GROUP = littleEndian ? SECOND_NUMBERS_GROUP : FIRST_NUMBERS_GROUP;\n    var DAY_GROUP = littleEndian ? FIRST_NUMBERS_GROUP : SECOND_NUMBERS_GROUP;\n\n    this.pattern = function () { return PATTERN; };\n    this.extract = function(text, ref, match, opt){\n\n        if(match[OPENNING_GROUP] == '/' || match[ENDING_GROUP] == '/') {\n            // Long skip, if there is some overlapping like:\n            // XX[/YY/ZZ]\n            // [XX/YY/]ZZ\n            match.index += match[0].length\n            return;\n        }\n\n        var index = match.index + match[OPENNING_GROUP].length;\n        var text = match[0].substr(match[OPENNING_GROUP].length, match[0].length - match[ENDING_GROUP].length);\n\n\n        var result = new ParsedResult({\n            text: text,\n            index: index,\n            ref: ref,\n        });\n\n        if(text.match(/^\\d\\.\\d$/)) return;\n        if(text.match(/^\\d\\.\\d{1,2}\\.\\d{1,2}$/)) return;\n\n        // MM/dd -> OK\n        // MM.dd -> NG\n        if(!match[YEAR_GROUP] && match[0].indexOf('/') < 0) return;\n\n        var date = null;\n        var year = match[YEAR_GROUP] || moment(ref).year() + '';\n        var month = match[MONTH_GROUP];\n        var day   = match[DAY_GROUP];\n\n        month = parseInt(month);\n        day  = parseInt(day);\n        year = parseInt(year);\n\n        if(month < 1 || month > 12) {\n            if(month > 12) {\n                // dd/mm/yyyy date format if day looks like a month, and month\n                // looks like a day.\n                if (day >= 1 && day <= 12 && month >= 13 && month <= 31) {\n                    // unambiguous\n                    var tday = month;\n                    month = day;\n                    day = tday;\n                }\n                else {\n                    // both month and day are <= 12\n                    return null;\n                }\n            }\n        }\n        if(day < 1 || day > 31) return null;\n\n        if(year < 100){\n            if (year > 50) {\n                year = year + 1900;\n            } else {\n                year = year + 2000;\n            }\n        }\n\n        result.start.assign('day', day);\n        result.start.assign('month', month);\n        if (match[YEAR_GROUP]) {\n            result.start.assign('year', year);\n        } else {\n            result.start.imply('year', year);\n        }\n\n        //Day of week\n        if(match[WEEKDAY_GROUP]) {\n            result.start.assign('weekday', DAYS_OFFSET[match[WEEKDAY_GROUP].toLowerCase()]);\n        }\n\n        result.tags['ENSlashDateFormatParser'] = true;\n        return result;\n    };\n};\n","/*\n    Date format with slash \"/\" between numbers like ENSlashDateFormatParser,\n    but this parser expect year before month and date. \n    - YYYY/MM/DD\n    - YYYY-MM-DD\n    - YYYY.MM.DD\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/EN');\n\nvar PATTERN = new RegExp('(\\\\W|^)' \n            + '([0-9]{4})[\\\\-\\\\.\\\\/]'\n            + '((?:' + util.MONTH_PATTERN + '|[0-9]{1,2}))[\\\\-\\\\.\\\\/]'\n            + '([0-9]{1,2})'\n            + '(?=\\\\W|$)', 'i');\n\nvar YEAR_NUMBER_GROUP = 2;\nvar MONTH_NUMBER_GROUP = 3;\nvar DATE_NUMBER_GROUP  = 4;\n\nexports.Parser = function ENSlashDateFormatStartWithYearParser(){\n    Parser.apply(this, arguments);\n    \n    this.pattern = function() { return PATTERN; }\n    \n    this.extract = function(text, ref, match, opt){\n\n        var text = match[0].substr(match[1].length);\n        var index = match.index + match[1].length;\n\n        var result = new ParsedResult({\n            text: text,\n            index: index,\n            ref: ref,\n        })\n        \n        var month = match[MONTH_NUMBER_GROUP].toLowerCase();\n        month = util.MONTH_OFFSET[month] | month;\n\n        result.start.assign('year', parseInt(match[YEAR_NUMBER_GROUP]));\n        result.start.assign('month', parseInt(month));\n        result.start.assign('day', parseInt(match[DATE_NUMBER_GROUP]));\n\n        if (moment(result.start.get('month')) > 12 || moment(result.start.get('month')) < 1 ||\n            moment(result.start.get('day')) > 31 || moment(result.start.get('day')) < 1) {\n            return null;\n        }\n        \n        result.tags['ENDateFormatParser'] = true;\n        return result;\n    };\n}\n","/*\n    Month/Year date format with slash \"/\" (also \"-\" and \".\") between numbers \n    - 11/05\n    - 06/2005\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp('(^|[^\\\\d/]\\\\s+|[^\\\\w\\\\s])' +\n    '([0-9]|0[1-9]|1[012])/([0-9]{4})' + \n    '([^\\\\d/]|$)', 'i');\n\nvar OPENNING_GROUP = 1;\nvar ENDING_GROUP = 4;\n\nvar MONTH_GROUP = 2;\nvar YEAR_GROUP = 3;\n\nexports.Parser = function ENSlashMonthFormatParser(argument) {\n    Parser.apply(this, arguments);\n\n    this.pattern = function () { return PATTERN; };\n    this.extract = function(text, ref, match, opt){\n        \n        var index = match.index + match[OPENNING_GROUP].length;\n        var text = match[0].substr(match[OPENNING_GROUP].length, match[0].length - (1 + match[ENDING_GROUP].length)).trim();\n\n        var result = new ParsedResult({\n            text: text,\n            index: index,\n            ref: ref,\n        });\n\n        var date = null;\n        var year = match[YEAR_GROUP] ;\n        var month = match[MONTH_GROUP];\n        var day   = 1;\n        \n        month = parseInt(month);\n        year = parseInt(year);\n\n        result.start.imply('day', day);\n        result.start.assign('month', month);\n        result.start.assign('year', year);\n\n        result.tags['ENSlashMonthFormatParser'] = true;\n        return result;\n    };\n};\n","var moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/EN');\n\nvar PATTERN = new RegExp('' +\n    '(\\\\W|^)' +\n    '(?:within\\\\s*)?' +\n    '(' + util.TIME_UNIT_PATTERN + ')' +\n    '(?:ago|before|earlier)(?=(?:\\\\W|$))', 'i');\n\nvar STRICT_PATTERN = new RegExp('' +\n    '(\\\\W|^)' +\n    '(?:within\\\\s*)?' +\n    '(' + util.TIME_UNIT_STRICT_PATTERN + ')' +\n    'ago(?=(?:\\\\W|$))', 'i');\n\nexports.Parser = function ENTimeAgoFormatParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return this.isStrictMode()? STRICT_PATTERN : PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt){\n\n        if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n\n        var text = match[0];\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\n        var index = match.index + match[1].length;\n\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n\n        var fragments = util.extractDateTimeUnitFragments(match[2]);\n        var date = moment(ref);\n\n        for (var key in fragments) {\n            date.add(-fragments[key], key);\n        }\n\n        if (fragments['hour'] > 0 || fragments['minute'] > 0 || fragments['second'] > 0) {\n            result.start.assign('hour', date.hour());\n            result.start.assign('minute', date.minute());\n            result.start.assign('second', date.second());\n            result.tags['ENTimeAgoFormatParser'] = true;\n        } \n        \n        if (fragments['d'] > 0 || fragments['month'] > 0 || fragments['year'] > 0) {\n            result.start.assign('day', date.date());\n            result.start.assign('month', date.month() + 1);\n            result.start.assign('year', date.year());\n        } else {\n            if (fragments['week'] > 0) {\n                result.start.imply('weekday', date.day());\n            }\n\n            result.start.imply('day', date.date());\n            result.start.imply('month', date.month() + 1);\n            result.start.imply('year', date.year());\n        }\n\n        return result;\n    };\n}\n","/*\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar ParsedComponents = require('../../result').ParsedComponents;\n\nvar FIRST_REG_PATTERN  = new RegExp(\"(^|\\\\s|T)\" +\n    \"(?:(?:at|from)\\\\s*)??\" + \n    \"(\\\\d{1,4}|noon|midnight)\" + \n    \"(?:\" + \n        \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" + \n        \"(?:\" + \n            \"(?:\\\\:|\\\\:)(\\\\d{2})(?:\\\\.(\\\\d{1,6}))?\" + \n        \")?\" + \n    \")?\" + \n    \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?|O\\\\W*CLOCK))?\" + \n    \"(?=\\\\W|$)\", 'i');\n\n\nvar SECOND_REG_PATTERN = new RegExp(\"^\\\\s*\" + \n    \"(\\\\-|\\\\–|\\\\~|\\\\〜|to|\\\\?)\\\\s*\" + \n    \"(\\\\d{1,4})\" +\n    \"(?:\" + \n        \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" + \n        \"(?:\" + \n            \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})(?:\\\\.(\\\\d{1,6}))?\" + \n        \")?\" + \n    \")?\" + \n    \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?|O\\\\W*CLOCK))?\" + \n    \"(?=\\\\W|$)\", 'i');\n\nvar HOUR_GROUP    = 2;\nvar MINUTE_GROUP  = 3;\nvar SECOND_GROUP  = 4;\nvar MILLI_SECOND_GROUP  = 5;\nvar AM_PM_HOUR_GROUP = 6;\n\n\nexports.Parser = function ENTimeExpressionParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return FIRST_REG_PATTERN; }\n    \n    this.extract = function(text, ref, match, opt){ \n        \n        // This pattern can be overlapped Ex. [12] AM, 1[2] AM\n        if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n        var refMoment = moment(ref);\n        var result = new ParsedResult();\n        result.ref = ref;\n        result.index = match.index + match[1].length;\n        result.text  = match[0].substring(match[1].length);\n        result.tags['ENTimeExpressionParser'] = true;\n\n        result.start.imply('day',   refMoment.date());\n        result.start.imply('month', refMoment.month()+1);\n        result.start.imply('year',  refMoment.year());\n        \n        var hour = 0;\n        var minute = 0;\n        var meridiem = -1;\n\n        // ----- Millisecond\n        if(match[MILLI_SECOND_GROUP] != null){ \n            var millisecond = parseInt(match[MILLI_SECOND_GROUP].substring(0, 3));\n            if(millisecond >= 1000) return null;\n            \n            result.start.assign('millisecond', millisecond);\n        }\n\n        // ----- Second\n        if(match[SECOND_GROUP] != null){ \n            var second = parseInt(match[SECOND_GROUP]);\n            if(second >= 60) return null;\n\n            result.start.assign('second', second);\n        }\n        \n        // ----- Hours\n        if (match[HOUR_GROUP].toLowerCase() == \"noon\"){\n            meridiem = 1; \n            hour = 12;\n        } else if (match[HOUR_GROUP].toLowerCase() == \"midnight\") {\n            meridiem = 0; \n            hour = 0;\n        } else {\n            hour = parseInt(match[HOUR_GROUP]);\n        }\n        \n        // ----- Minutes\n        if(match[MINUTE_GROUP] != null){ \n            minute = parseInt(match[MINUTE_GROUP]);\n        } else if(hour > 100) { \n            minute = hour%100;\n            hour   = parseInt(hour/100);\n        } \n        \n        if(minute >= 60) {\n            return null;\n        }\n\n        if(hour > 24) {\n            return null;\n        }\n        if (hour >= 12) { \n            meridiem = 1;\n        }\n\n        // ----- AM & PM  \n        if(match[AM_PM_HOUR_GROUP] != null) {\n            if(hour > 12) return null;\n            var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n            if(ampm == \"a\"){\n                meridiem = 0; \n                if(hour == 12) hour = 0;\n            }\n            \n            if(ampm == \"p\"){\n                meridiem = 1; \n                if(hour != 12) hour += 12;\n            }\n        } \n\n        result.start.assign('hour', hour);\n        result.start.assign('minute', minute);\n\n        if (meridiem >= 0) {\n            result.start.assign('meridiem', meridiem);\n        } else {\n            if (hour < 12) {\n                result.start.imply('meridiem', 0);\n            } else {\n                result.start.imply('meridiem', 1);\n            }\n        }\n\n        // ==============================================================\n        //                  Extracting the 'to' chunk\n        // ==============================================================\n        match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));\n        if (!match) {\n            return result;\n        }\n\n\n\n        // Pattern \"YY.YY -XXXX\" is more like timezone offset\n        if (match[0].match(/^\\s*(\\+|\\-)\\s*\\d{3,4}$/)) {\n            return result;\n        }\n\n        if(result.end == null){\n            result.end = new ParsedComponents(null, result.start.date());\n        }\n\n        var hour = 0;\n        var minute = 0;\n        var meridiem = -1;\n\n        // ----- Millisecond\n        if(match[MILLI_SECOND_GROUP] != null){ \n            var millisecond = parseInt(match[MILLI_SECOND_GROUP].substring(0, 3));\n            if(millisecond >= 1000) return null;\n            \n            result.end.assign('millisecond', millisecond);\n        }\n        \n        // ----- Second\n        if(match[SECOND_GROUP] != null){ \n            var second = parseInt(match[SECOND_GROUP]);\n            if(second >= 60) return null;\n\n            result.end.assign('second', second);\n        }\n\n        hour = parseInt(match[2]);\n        \n        // ----- Minute\n        if (match[MINUTE_GROUP]!= null) {\n            \n            minute = parseInt(match[MINUTE_GROUP]);\n            if(minute >= 60) return result;\n            \n        } else if (hour > 100) {\n\n            minute = hour%100;\n            hour   = parseInt(hour/100);\n        }\n\n        if(minute >= 60) {\n            return null;\n        }\n\n        if(hour > 24) {\n            return null;\n        }\n        if (hour >= 12) { \n            meridiem = 1;\n        }\n        \n        // ----- AM & PM \n        if (match[AM_PM_HOUR_GROUP] != null){\n\n            if (hour > 12) return null;\n\n            var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n            if(ampm == \"a\"){\n                meridiem = 0; \n                if(hour == 12) {\n                    hour = 0;\n                    if (!result.end.isCertain('day')) {\n                        result.end.imply('day', result.end.get('day') + 1);\n                    }\n                }\n            }\n            \n            if(ampm == \"p\"){\n                meridiem = 1; \n                if(hour != 12) hour += 12;\n            }\n            \n            if (!result.start.isCertain('meridiem')) {\n                if (meridiem == 0) {\n                    \n                    result.start.imply('meridiem', 0);\n                    \n                    if (result.start.get('hour') == 12) {\n                        result.start.assign('hour', 0);\n                    }\n\n                } else {\n\n                    result.start.imply('meridiem', 1);\n                    \n                    if (result.start.get('hour') != 12) {\n                        result.start.assign('hour', result.start.get('hour') + 12); \n                    }\n                }\n            }\n        }\n\n        result.text = result.text + match[0];\n        result.end.assign('hour', hour);\n        result.end.assign('minute', minute);\n        if (meridiem >= 0) {\n            result.end.assign('meridiem', meridiem);\n        } else {\n            var startAtPM = result.start.isCertain('meridiem') && result.start.get('meridiem') == 1;\n            if (startAtPM && result.start.get('hour') > hour) {\n                // 10pm - 1 (am)\n                result.end.imply('meridiem', 0);\n\n            } else if (hour > 12) {\n                result.end.imply('meridiem', 1);\n            }\n        }\n\n        if (result.end.date().getTime() < result.start.date().getTime()) {\n            result.end.imply('day', result.end.get('day') + 1)\n        }\n        \n        return result;\n    }\n}\n","var moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/EN');\n\nvar PATTERN = new RegExp('' +\n    /*match[1]*/ '(\\\\W|^)' +\n    /*match[2]*/ '(in )?' +\n    /*match[3]*/ '(' + util.TIME_UNIT_PATTERN + ')' +\n    /*match[4]*/ '(later|after|from now|henceforth|forward|out)?' +\n    /*match[5]*/ '(?=(?:\\\\W|$))',\n'i');\n\nvar STRICT_PATTERN = new RegExp('' +\n    /*match[1]*/ '(\\\\W|^)' +\n    /*match[2]*/ '(in )?' +\n    /*match[3]*/ '(' + util.TIME_UNIT_STRICT_PATTERN + ')' +\n    /*match[4]*/ '(later|from now)?' +\n    /*match[5]*/ '(?=(?:\\\\W|$))',\n'i');\n\nexports.Parser = function ENTimeLaterFormatParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return this.isStrictMode()? STRICT_PATTERN : PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt){\n        if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n\n        var prefix = match[2];\n        var suffix = match[4];\n        if (!prefix && !suffix) return null;\n\n        var preamble = match[1];\n        \n        var text = match[0];\n        text  = match[0].substr(preamble.length, match[0].length - preamble.length);\n        index = match.index + preamble.length;\n\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n\n        var fragments = util.extractDateTimeUnitFragments(match[3]);\n        var date = moment(ref);\n        for (var key in fragments) {\n            date.add(fragments[key], key);\n        }\n\n        if (fragments['hour'] > 0 || fragments['minute'] > 0 || fragments['second'] > 0) {\n            result.start.assign('hour', date.hour());\n            result.start.assign('minute', date.minute());\n            result.start.assign('second', date.second());\n            result.tags['ENTimeAgoFormatParser'] = true;\n        } \n        \n        if (fragments['d'] > 0 || fragments['month'] > 0 || fragments['year'] > 0) {\n            result.start.assign('day', date.date());\n            result.start.assign('month', date.month() + 1);\n            result.start.assign('year', date.year());\n        } else {\n            if (fragments['week'] > 0) {\n                result.start.imply('weekday', date.day());\n            }\n\n            result.start.imply('day', date.date());\n            result.start.imply('month', date.month() + 1);\n            result.start.imply('year', date.year());\n        }\n\n        return result;\n    };\n}\n","/*\n\n\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar DAYS_OFFSET = { 'sunday': 0, 'sun': 0, 'monday': 1, 'mon': 1,'tuesday': 2, 'tues':2, 'tue':2, 'wednesday': 3, 'wed': 3,\n    'thursday': 4, 'thurs':4, 'thur': 4, 'thu': 4,'friday': 5, 'fri': 5,'saturday': 6, 'sat': 6};\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(?:(?:\\\\,|\\\\(|\\\\()\\\\s*)?' +\n    '(?:on\\\\s*?)?' +\n    '(?:(this|last|past|next)\\\\s*)?' +\n    '(' + Object.keys(DAYS_OFFSET).join('|') + ')' +\n    '(?:\\\\s*(?:\\\\,|\\\\)|\\\\)))?' +\n    '(?:\\\\s*(this|last|past|next)\\\\s*week)?' +\n    '(?=\\\\W|$)', 'i');\n\nvar PREFIX_GROUP = 2;\nvar WEEKDAY_GROUP = 3;\nvar POSTFIX_GROUP = 4;\n\n\nexports.updateParsedComponent = function updateParsedComponent(result, ref, offset, modifier) {\n\n    var startMoment = moment(ref);\n    var startMomentFixed = false;\n    var refOffset = startMoment.day();\n\n    if(modifier == 'last' || modifier == 'past') {\n        startMoment.day(offset - 7);\n        startMomentFixed = true;\n    } else if(modifier == 'next') {\n        startMoment.day(offset + 7);\n        startMomentFixed = true;\n    } else if(modifier == 'this') {\n        startMoment.day(offset);\n    } else {\n        if (Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) {\n            startMoment.day(offset - 7);\n        } else if (Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) {\n            startMoment.day(offset + 7);\n        } else {\n            startMoment.day(offset);\n        }\n    }\n\n    result.start.assign('weekday', offset);\n    if (startMomentFixed) {\n        result.start.assign('day', startMoment.date());\n        result.start.assign('month', startMoment.month() + 1);\n        result.start.assign('year', startMoment.year());\n    } else {\n        result.start.imply('day', startMoment.date());\n        result.start.imply('month', startMoment.month() + 1);\n        result.start.imply('year', startMoment.year());\n    }\n\n    return result;\n};\n\n\nexports.Parser = function ENWeekdayParser() {\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; };\n\n    this.extract = function(text, ref, match, opt){\n        var index = match.index + match[1].length;\n        var text = match[0].substr(match[1].length, match[0].length - match[1].length);\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n\n        var dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();\n        var offset = DAYS_OFFSET[dayOfWeek];\n        if(offset === undefined) {\n            return null;\n        }\n\n        var prefix = match[PREFIX_GROUP];\n        var postfix = match[POSTFIX_GROUP];\n        var norm = prefix || postfix;\n        norm = norm || '';\n        norm = norm.toLowerCase();\n\n        exports.updateParsedComponent(result, ref, offset, norm);\n        result.tags['ENWeekdayParser'] = true;\n\n        return result;\n    }\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\n/*\n  Valid patterns:\n  - esta mañana -> today in the morning\n  - esta tarde -> today in the afternoon/evening\n  - esta noche -> tonight\n  - ayer por la mañana -> yesterday in the morning\n  - ayer por la tarde -> yesterday in the afternoon/evening\n  - ayer por la noche -> yesterday at night\n  - mañana por la mañana -> tomorrow in the morning\n  - mañana por la tarde -> tomorrow in the afternoon/evening\n  - mañana por la noche -> tomorrow at night\n  - anoche -> tomorrow at night\n  - hoy -> today\n  - ayer -> yesterday\n  - mañana -> tomorrow\n */\nvar PATTERN = /(\\W|^)(ahora|esta\\s*(mañana|tarde|noche)|(ayer|mañana)\\s*por\\s*la\\s*(mañana|tarde|noche)|hoy|mañana|ayer|anoche)(?=\\W|$)/i;\n\nexports.Parser = function ESCasualDateParser(){\n\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n\n        var text = match[0].substr(match[1].length);\n        var index = match.index + match[1].length;\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref,\n        });\n\n        var refMoment = moment(ref);\n        var startMoment = refMoment.clone();\n        var lowerText = text.toLowerCase().replace(/\\s+/g, ' ');\n\n        if(lowerText == 'mañana'){\n\n            // Check not \"Tomorrow\" on late night\n            if(refMoment.hour() > 1) {\n                startMoment.add(1, 'day');\n            }\n\n        } else if(lowerText == 'ayer') {\n\n            startMoment.add(-1, 'day');\n        }\n        else if(lowerText == 'anoche') {\n\n            result.start.imply('hour', 0);\n            if (refMoment.hour() > 6) {\n                startMoment.add(-1, 'day');\n            }\n\n        } else if (lowerText.match(\"esta\")) {\n\n            var secondMatch = match[3].toLowerCase();\n            if (secondMatch == \"tarde\") {\n\n                result.start.imply('hour', 18);\n\n            } else if (secondMatch == \"mañana\") {\n\n                result.start.imply('hour', 6);\n\n            } else if (secondMatch == \"noche\") {\n\n              // Normally means this coming midnight\n              result.start.imply('hour', 22);\n              result.start.imply('meridiem', 1);\n\n            }\n        } else if (lowerText.match(/por\\s*la/)) {\n\n            var firstMatch = match[4].toLowerCase();\n            if (firstMatch === 'ayer') {\n\n              startMoment.add(-1, 'day');\n\n            } else if (firstMatch === 'mañana') {\n\n              startMoment.add(1, 'day');\n\n            }\n\n            var secondMatch = match[5].toLowerCase();\n            if (secondMatch == \"tarde\") {\n\n                result.start.imply('hour', 18);\n\n            } else if (secondMatch == \"mañana\") {\n\n                result.start.imply('hour', 9);\n\n            } else if (secondMatch == \"noche\") {\n\n              // Normally means this coming midnight\n              result.start.imply('hour', 22);\n              result.start.imply('meridiem', 1);\n\n            }\n\n        } else if (lowerText.match(\"ahora\")) {\n\n          result.start.imply('hour', refMoment.hour());\n          result.start.imply('minute', refMoment.minute());\n          result.start.imply('second', refMoment.second());\n          result.start.imply('millisecond', refMoment.millisecond());\n\n        }\n\n        result.start.assign('day', startMoment.date())\n        result.start.assign('month', startMoment.month() + 1)\n        result.start.assign('year', startMoment.year())\n        result.tags['ESCasualDateParser'] = true;\n        return result;\n    }\n}\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = /(\\W|^)(dentro\\s*de|en)\\s*([0-9]+|medi[oa]|una?)\\s*(minutos?|horas?|d[ií]as?)\\s*(?=(?:\\W|$))/i;\n\nexports.Parser = function ESDeadlineFormatParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n\n        var index = match.index + match[1].length;\n        var text  = match[0];\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\n\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref,\n        });\n\n        var num = parseInt(match[3]);\n        if (isNaN(num)) {\n          if (match[3].match(/medi/)) {\n            num = 0.5;\n          } else {\n            num = 1;\n          }\n        }\n\n        var date = moment(ref);\n        if (match[4].match(/d[ií]a/)) {\n            date.add(num, 'd');\n\n            result.start.assign('year', date.year());\n            result.start.assign('month', date.month() + 1);\n            result.start.assign('day', date.date());\n            return result;\n        }\n\n\n        if (match[4].match(/hora/)) {\n\n            date.add(num, 'hour');\n\n        } else if (match[4].match(/minuto/)) {\n\n            date.add(num, 'minute');\n        }\n\n        result.start.imply('year', date.year());\n        result.start.imply('month', date.month() + 1);\n        result.start.imply('day', date.date());\n        result.start.assign('hour', date.hour());\n        result.start.assign('minute', date.minute());\n        result.tags['ESDeadlineFormatParser'] = true;\n        return result;\n    };\n}\n","/*\n\n\n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar util  = require('../../utils/ES');\n\nvar DAYS_OFFSET = util.WEEKDAY_OFFSET;\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n        '(?:(Domingo|Lunes|Martes|Miércoles|Miercoles|Jueves|Viernes|Sábado|Sabado|Dom|Lun|Mar|Mie|Jue|Vie|Sab)\\\\s*,?\\\\s*)?' +\n        '([0-9]{1,2})(?:º|ª|°)?' +\n        '(?:\\\\s*(?:desde|de|\\\\-|\\\\–|al?|hasta|\\\\s)\\\\s*([0-9]{1,2})(?:º|ª|°)?)?\\\\s*(?:de)?\\\\s*' +\n        '(Ene(?:ro|\\\\.)?|Feb(?:rero|\\\\.)?|Mar(?:zo|\\\\.)?|Abr(?:il|\\\\.)?|May(?:o|\\\\.)?|Jun(?:io|\\\\.)?|Jul(?:io|\\\\.)?|Ago(?:sto|\\\\.)?|Sep(?:tiembre|\\\\.)?|Set(?:iembre|\\\\.)?|Oct(?:ubre|\\\\.)?|Nov(?:iembre|\\\\.)?|Dic(?:iembre|\\\\.)?)' +\n        '(?:\\\\s*(?:del?)?(\\\\s*[0-9]{1,4}(?![^\\\\s]\\\\d))(\\\\s*[ad]\\\\.?\\\\s*c\\\\.?|a\\\\.?\\\\s*d\\\\.?)?)?' +\n        '(?=\\\\W|$)', 'i'\n    );\n\nvar WEEKDAY_GROUP = 2;\nvar DATE_GROUP = 3;\nvar DATE_TO_GROUP = 4;\nvar MONTH_NAME_GROUP = 5;\nvar YEAR_GROUP = 6;\nvar YEAR_BE_GROUP = 7;\n\nexports.Parser = function ESMonthNameLittleEndianParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n\n        var result = new ParsedResult({\n            text: match[0].substr(match[1].length, match[0].length - match[1].length),\n            index: match.index + match[1].length,\n            ref: ref,\n        });\n\n        var month = match[MONTH_NAME_GROUP];\n        month = util.MONTH_OFFSET[month.toLowerCase()];\n\n        var day = match[DATE_GROUP];\n        day = parseInt(day);\n\n        var year = null;\n        if (match[YEAR_GROUP]) {\n            year = match[YEAR_GROUP];\n            year = parseInt(year);\n\n            if(match[YEAR_BE_GROUP]){\n                if (/a\\.?\\s*c\\.?/i.test(match[YEAR_BE_GROUP])) {\n                    // antes de Cristo\n                    year = -year;\n                }\n            } else if (year < 100){\n\n                year = year + 2000;\n            }\n        }\n\n        if(year){\n            result.start.assign('day', day);\n            result.start.assign('month', month);\n            result.start.assign('year', year);\n        } else {\n\n            //Find the most appropriated year\n            var refMoment = moment(ref);\n            refMoment.month(month - 1);\n            refMoment.date(day);\n            refMoment.year(moment(ref).year());\n\n            var nextYear = refMoment.clone().add(1, 'y');\n            var lastYear = refMoment.clone().add(-1, 'y');\n            if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n                refMoment = nextYear;\n            }\n            else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\n                refMoment = lastYear;\n            }\n\n            result.start.assign('day', day);\n            result.start.assign('month', month);\n            result.start.imply('year', refMoment.year());\n        }\n\n        // Weekday component\n        if (match[WEEKDAY_GROUP]) {\n            var weekday = match[WEEKDAY_GROUP];\n            weekday = util.WEEKDAY_OFFSET[weekday.toLowerCase()]\n            result.start.assign('weekday', weekday);\n        }\n\n        // Text can be 'range' value. Such as '12 - 13 January 2012'\n        if (match[DATE_TO_GROUP]) {\n            result.end = result.start.clone();\n            result.end.assign('day', parseInt(match[DATE_TO_GROUP]));\n        }\n\n        result.tags['ESMonthNameLittleEndianParser'] = true;\n        return result;\n    };\n}\n","/*\n    Date format with slash \"/\" (also \"-\" and \".\") between numbers\n    - Martes 3/11/2015\n    - 3/11/2015\n    - 3/11\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(?:' +\n        '((?:domingo|dom|lunes|lun|martes|mar|mi[ée]rcoles|mie|jueves|jue|viernes|vie|s[áa]bado|sab))' +\n        '\\\\s*\\\\,?\\\\s*' +\n    ')?' +\n    '([0-1]{0,1}[0-9]{1})[\\\\/\\\\.\\\\-]([0-3]{0,1}[0-9]{1})' +\n    '(?:' +\n        '[\\\\/\\\\.\\\\-]' +\n        '([0-9]{4}\\s*\\,?\\s*|[0-9]{2}\\s*\\,?\\s*)' +\n    ')?' +\n    '(\\\\W|$)', 'i');\n\nvar DAYS_OFFSET = { 'domingo': 0, 'dom': 0, 'lunes': 1, 'lun': 1, 'martes': 2, 'mar': 2, 'miercoles': 3, 'miércoles': 3, 'mie': 3,\n    'jueves': 4, 'jue': 4, 'viernes': 5, 'vier': 5, 'sábado': 6, 'sabado': 6, 'sab': 6,}\n\n\nvar OPENNING_GROUP = 1;\nvar ENDING_GROUP = 6;\n\n// in Spanish we use day/month/year\nvar WEEKDAY_GROUP = 2;\nvar MONTH_GROUP = 4;\nvar DAY_GROUP = 3;\nvar YEAR_GROUP = 5;\n\nexports.Parser = function ESSlashDateFormatParser(argument) {\n    Parser.apply(this, arguments);\n\n    this.pattern = function () { return PATTERN; };\n    this.extract = function(text, ref, match, opt){\n\n        if(match[OPENNING_GROUP] == '/' || match[ENDING_GROUP] == '/') {\n            // Long skip, if there is some overlapping like:\n            // XX[/YY/ZZ]\n            // [XX/YY/]ZZ\n            match.index += match[0].length\n            return;\n        }\n\n        var index = match.index + match[OPENNING_GROUP].length;\n        var text = match[0].substr(match[OPENNING_GROUP].length, match[0].length - match[ENDING_GROUP].length);\n\n\n        var result = new ParsedResult({\n            text: text,\n            index: index,\n            ref: ref,\n        });\n\n        if(text.match(/^\\d\\.\\d$/)) return;\n        if(text.match(/^\\d\\.\\d{1,2}\\.\\d{1,2}$/)) return;\n\n        // MM/dd -> OK\n        // MM.dd -> NG\n        if(!match[YEAR_GROUP] && match[0].indexOf('/') < 0) return;\n\n        var date = null;\n        var year = match[YEAR_GROUP] || moment(ref).year() + '';\n        var month = match[MONTH_GROUP];\n        var day   = match[DAY_GROUP];\n\n        month = parseInt(month);\n        day  = parseInt(day);\n        year = parseInt(year);\n\n        if(month < 1 || month > 12) {\n            if(month > 12) {\n                // dd/mm/yyyy date format if day looks like a month, and month\n                // looks like a day.\n                if (day >= 1 && day <= 12 && month >= 13 && month <= 31) {\n                    // unambiguous\n                    var tday = month;\n                    month = day;\n                    day = tday;\n                }\n                else {\n                    // both month and day are <= 12\n                    return null;\n                }\n            }\n        }\n        if(day < 1 || day > 31) return null;\n\n        if(year < 100){\n            if(year > 50){\n                year = year + 1900;\n            }else{\n                year = year + 2000;\n            }\n        }\n\n        result.start.assign('day', day);\n        result.start.assign('month', month);\n        result.start.assign('year', year);\n\n        //Day of week\n        if(match[WEEKDAY_GROUP]) {\n            result.start.assign('weekday', DAYS_OFFSET[match[WEEKDAY_GROUP].toLowerCase()]);\n        }\n\n        result.tags['ESSlashDateFormatParser'] = true;\n        return result;\n    };\n};","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = /(\\W|^)hace\\s*([0-9]+|medi[oa]|una?)\\s*(minutos?|horas?|semanas?|d[ií]as?|mes(es)?|años?)(?=(?:\\W|$))/i;\n\nexports.Parser = function ESTimeAgoFormatParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return PATTERN;\n    }\n\n    this.extract = function(text, ref, match, opt){\n\n        if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n\n        var text = match[0];\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\n        index = match.index + match[1].length;\n\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref,\n        });\n\n        var num = parseInt(match[2]);\n        if (isNaN(num)) {\n          if (match[2].match(/medi/)) {\n            num = 0.5;\n          } else {\n            num = 1;\n          }\n        }\n\n        var date = moment(ref);\n\n        if (match[3].match(/hora/) || match[3].match(/minuto/)) {\n            if (match[3].match(/hora/)) {\n\n                date.add(-num, 'hour');\n\n            } else if (match[3].match(/minuto/)) {\n\n                date.add(-num, 'minute');\n            }\n\n            result.start.imply('day', date.date());\n            result.start.imply('month', date.month() + 1);\n            result.start.imply('year', date.year());\n            result.start.assign('hour', date.hour());\n            result.start.assign('minute', date.minute());\n            result.tags['ESTimeAgoFormatParser'] = true;\n            return result;\n        }\n\n        if (match[3].match(/semana/)) {\n            date.add(-num, 'week');\n\n            result.start.imply('day', date.date());\n            result.start.imply('month', date.month() + 1);\n            result.start.imply('year', date.year());\n            result.start.imply('weekday', date.day());\n            return result;\n        }\n\n        if (match[3].match(/d[ií]a/)) {\n            date.add(-num, 'd');\n        }\n\n        if (match[3].match(/mes/)) {\n            date.add(-num, 'month');\n        }\n\n        if (match[3].match(/año/)) {\n\n            date.add(-num, 'year');\n        }\n\n        result.start.assign('day', date.date());\n        result.start.assign('month', date.month() + 1);\n        result.start.assign('year', date.year());\n        return result;\n\n    };\n}\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar ParsedComponents = require('../../result').ParsedComponents;\n\nvar FIRST_REG_PATTERN  = new RegExp(\"(^|\\\\s|T)\" +\n    \"(?:(?:a las?|al?|desde|de)\\\\s*)?\" +\n    \"(\\\\d{1,4}|mediod[ií]a|medianoche)\" +\n    \"(?:\" +\n        \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" +\n        \"(?:\" +\n            \"(?:\\\\:|\\\\:)(\\\\d{2})\" +\n        \")?\" +\n    \")?\" +\n    \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?))?\" +\n    \"(?=\\\\W|$)\", 'i');\n\n\nvar SECOND_REG_PATTERN = new RegExp(\"^\\\\s*\" +\n    \"(\\\\-|\\\\–|\\\\~|\\\\〜|a(?:\\s*las)?|\\\\?)\\\\s*\" +\n    \"(\\\\d{1,4})\" +\n    \"(?:\" +\n        \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" +\n        \"(?:\" +\n            \"(?:\\\\.|\\\\:|\\\\:)(\\\\d{1,2})\" +\n        \")?\" +\n    \")?\" +\n    \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?))?\" +\n    \"(?=\\\\W|$)\", 'i');\n\nvar HOUR_GROUP    = 2;\nvar MINUTE_GROUP  = 3;\nvar SECOND_GROUP  = 4;\nvar AM_PM_HOUR_GROUP = 5;\n\nexports.Parser = function ESTimeExpressionParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return FIRST_REG_PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n\n        // This pattern can be overlaped Ex. [12] AM, 1[2] AM\n        if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\n        var refMoment = moment(ref);\n        var result = new ParsedResult();\n        result.ref = ref;\n        result.index = match.index + match[1].length;\n        result.text  = match[0].substring(match[1].length);\n        result.tags['ESTimeExpressionParser'] = true;\n\n        result.start.imply('day',   refMoment.date());\n        result.start.imply('month', refMoment.month()+1);\n        result.start.imply('year',  refMoment.year());\n\n        var hour = 0;\n        var minute = 0;\n        var meridiem = -1;\n\n        // ----- Second\n        if(match[SECOND_GROUP] != null){\n            var second = parseInt(match[SECOND_GROUP]);\n            if(second >= 60) return null;\n\n            result.start.assign('second', second);\n        }\n\n        // ----- Hours\n        if (match[HOUR_GROUP].toLowerCase().match(/mediod/)){\n            meridiem = 1;\n            hour = 12;\n        } else if (match[HOUR_GROUP].toLowerCase() == \"medianoche\") {\n            meridiem = 0;\n            hour = 0;\n        } else {\n            hour = parseInt(match[HOUR_GROUP]);\n        }\n\n        // ----- Minutes\n        if(match[MINUTE_GROUP] != null){\n            minute = parseInt(match[MINUTE_GROUP]);\n        } else if(hour > 100) {\n            minute = hour%100;\n            hour   = parseInt(hour/100);\n        }\n\n        if(minute >= 60) {\n            return null;\n        }\n\n        if(hour > 24) {\n            return null;\n        }\n        if (hour >= 12) {\n            meridiem = 1;\n        }\n\n        // ----- AM & PM\n        if(match[AM_PM_HOUR_GROUP] != null) {\n            if(hour > 12) return null;\n            var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n            if(ampm == \"a\"){\n                meridiem = 0;\n                if(hour == 12) hour = 0;\n            }\n\n            if(ampm == \"p\"){\n                meridiem = 1;\n                if(hour != 12) hour += 12;\n            }\n        }\n        result.start.assign('hour', hour);\n        result.start.assign('minute', minute);\n        if (meridiem >= 0) {\n            result.start.assign('meridiem', meridiem);\n        }\n\n        // ==============================================================\n        //                  Extracting the 'to' chunk\n        // ==============================================================\n        match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));\n        if (!match) {\n            // Not accept number only result\n            if (result.text.match(/^\\d+$/)) {\n                return null;\n            }\n            return result;\n        }\n\n\n\n        // Pattern \"YY.YY -XXXX\" is more like timezone offset\n        if (match[0].match(/^\\s*(\\+|\\-)\\s*\\d{3,4}$/)) {\n            return result;\n        }\n\n        if(result.end == null){\n            result.end = new ParsedComponents(null, result.start.date());\n        }\n\n        var hour = 0;\n        var minute = 0;\n        var meridiem = -1;\n\n        // ----- Second\n        if(match[SECOND_GROUP] != null){\n            var second = parseInt(match[SECOND_GROUP]);\n            if(second >= 60) return null;\n\n            result.end.assign('second', second);\n        }\n\n        hour = parseInt(match[2]);\n\n        // ----- Minute\n        if (match[MINUTE_GROUP]!= null) {\n\n            minute = parseInt(match[MINUTE_GROUP]);\n            if(minute >= 60) return result;\n\n        } else if (hour > 100) {\n\n            minute = hour%100;\n            hour   = parseInt(hour/100);\n        }\n\n        if(minute >= 60) {\n            return null;\n        }\n\n        if(hour > 24) {\n            return null;\n        }\n        if (hour >= 12) {\n            meridiem = 1;\n        }\n\n        // ----- AM & PM\n        if (match[AM_PM_HOUR_GROUP] != null){\n\n            if (hour > 12) return null;\n\n            if(match[AM_PM_HOUR_GROUP][0].toLowerCase() == \"a\"){\n                meridiem = 0;\n                if(hour == 12) {\n                    hour = 0;\n                    if (!result.end.isCertain('day')) {\n                        result.end.imply('day', result.end.get('day') + 1);\n                    }\n                }\n            }\n\n            if(match[AM_PM_HOUR_GROUP][0].toLowerCase() == \"p\"){\n                meridiem = 1;\n                if(hour != 12) hour += 12;\n            }\n\n            if (!result.start.isCertain('meridiem')) {\n                if (meridiem == 0) {\n\n                    result.start.imply('meridiem', 0);\n\n                    if (result.start.get('hour') == 12) {\n                        result.start.assign('hour', 0);\n                    }\n\n                } else {\n\n                    result.start.imply('meridiem', 1);\n\n                    if (result.start.get('hour') != 12) {\n                        result.start.assign('hour', result.start.get('hour') + 12);\n                    }\n                }\n            }\n\n        } else if(hour >= 12) {\n            meridiem = 1;\n        }\n\n        result.text = result.text + match[0];\n        result.end.assign('hour', hour);\n        result.end.assign('minute', minute);\n        if (meridiem >= 0) {\n            result.end.assign('meridiem', meridiem);\n        }\n\n        if (result.end.date().getTime() < result.start.date().getTime()) {\n            result.end.imply('day', result.end.get('day') + 1)\n        }\n\n        return result;\n    }\n}\n","/*\n\n\n*/\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar updateParsedComponent = require('../en/ENWeekdayParser').updateParsedComponent;\n\nvar DAYS_OFFSET = { 'domingo': 0, 'dom': 0, 'lunes': 1, 'lun': 1, 'martes': 2, 'mar':2, 'miercoles': 3, 'miércoles': 3, 'mie': 3,\n    'jueves': 4, 'jue': 4, 'viernes': 5, 'vier': 5, 'sabado': 6, 'sábado': 6, 'sab': 6,}\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(?:(?:\\\\,|\\\\(|\\\\()\\\\s*)?' +\n    '(?:(este|pasado|pr[oó]ximo)\\\\s*)?' +\n    '(' + Object.keys(DAYS_OFFSET).join('|') + ')' +\n    '(?:\\\\s*(?:\\\\,|\\\\)|\\\\)))?' +\n    '(?:\\\\s*(este|pasado|pr[óo]ximo)\\\\s*week)?' +\n    '(?=\\\\W|$)', 'i');\n\nvar PREFIX_GROUP = 2;\nvar WEEKDAY_GROUP = 3;\nvar POSTFIX_GROUP = 4;\n\nexports.Parser = function ESWeekdayParser() {\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; }\n\n    this.extract = function(text, ref, match, opt){\n        var index = match.index + match[1].length;\n        var text = match[0].substr(match[1].length, match[0].length - match[1].length);\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n\n        var dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();\n        var offset = DAYS_OFFSET[dayOfWeek];\n        if(offset === undefined) return null;\n\n        var modifier = null;\n        var prefix = match[PREFIX_GROUP];\n        var postfix = match[POSTFIX_GROUP];\n        if (prefix || postfix) {\n            var norm = prefix || postfix;\n            norm = norm.toLowerCase();\n\n            if(norm == 'pasado') {\n                modifier = 'this';\n            }\n            else if(norm == 'próximo' || norm == 'proximo') {\n                modifier = 'next';\n            }\n            else if(norm== 'este') {\n                modifier =  'this';\n            }\n        }\n\n        updateParsedComponent(result, ref, offset, modifier);\n        result.tags['ESWeekdayParser'] = true;\n        return result;\n    }\n}\n","/*\r\n\r\n\r\n*/\r\n\r\nvar moment = require('moment');\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\n\r\nvar PATTERN = /(\\W|^)(maintenant|aujourd'hui|ajd|cette\\s*nuit|la\\s*veille|(demain|hier)(\\s*(matin|soir|aprem|après-midi))?|ce\\s*(matin|soir)|cet\\s*(après-midi|aprem))(?=\\W|$)/i;\r\n\r\nexports.Parser = function FRCasualDateParser(){\r\n\r\n    Parser.apply(this, arguments);\r\n\r\n    this.pattern = function() { return PATTERN; }\r\n\r\n    this.extract = function(text, ref, match, opt){\r\n\r\n        var text = match[0].substr(match[1].length);\r\n        var index = match.index + match[1].length;\r\n        var result = new ParsedResult({\r\n            index: index,\r\n            text: text,\r\n            ref: ref,\r\n        });\r\n\r\n        var refMoment = moment(ref);\r\n        var startMoment = refMoment.clone();\r\n        var lowerText = text.toLowerCase();\r\n\r\n        if(lowerText.match(/demain/)){\r\n            // Check not \"Tomorrow\" on late night\r\n            if(refMoment.hour() > 1) {\r\n                startMoment.add(1, 'day');\r\n            }\r\n        } \r\n\r\n        if(lowerText.match(/hier/)) {\r\n            startMoment.add(-1, 'day');\r\n        }\r\n\r\n        if(lowerText.match(/cette\\s*nuit/)){\r\n            // Normally means this coming midnight\r\n            result.start.imply('hour', 22);\r\n            result.start.imply('meridiem', 1);\r\n\r\n        } else if(lowerText.match(/la\\s*veille/)) {\r\n\r\n            result.start.imply('hour', 0);\r\n            if (refMoment.hour() > 6) {\r\n                startMoment.add(-1, 'day');\r\n            }\r\n\r\n        } else if (lowerText.match(/(après-midi|aprem)/)) {\r\n\r\n            result.start.imply('hour', 14);\r\n\r\n        } else if (lowerText.match(/(soir)/)) {\r\n\r\n            result.start.imply('hour', 18);\r\n\r\n        } else if (lowerText.match(/matin/)) {\r\n\r\n            result.start.imply('hour', 8);\r\n\r\n        }  else if (lowerText.match(\"maintenant\")) {\r\n\r\n          result.start.imply('hour', refMoment.hour());\r\n          result.start.imply('minute', refMoment.minute());\r\n          result.start.imply('second', refMoment.second());\r\n          result.start.imply('millisecond', refMoment.millisecond());\r\n\r\n        }\r\n\r\n        result.start.assign('day', startMoment.date())\r\n        result.start.assign('month', startMoment.month() + 1)\r\n        result.start.assign('year', startMoment.year())\r\n        result.tags['FRCasualDateParser'] = true;\r\n        return result;\r\n    }\r\n}\r\n","/*\r\n\r\n\r\n*/\r\n\r\nvar moment = require('moment');\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\nvar util  = require('../../utils/FR');\r\n\r\nvar PATTERN = new RegExp('(\\\\W|^)' +\r\n    '(dans|en)\\\\s*' +\r\n    '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|une?|(?:\\\\s*quelques)?|demi(?:\\\\s*|-?)?)\\\\s*' +\r\n    '(secondes?|min(?:ute)?s?|heures?|jours?|semaines?|mois|années?)\\\\s*' +\r\n    '(?=\\\\W|$)', 'i'\r\n);\r\n\r\nvar STRICT_PATTERN = new RegExp('(\\\\W|^)' +\r\n    '(dans|en)\\\\s*' +\r\n    '('+ util.INTEGER_WORDS_PATTERN + '|[0-9]+|un?)\\\\s*' +\r\n    '(secondes?|minutes?|heures?|jours?)\\\\s*' +\r\n    '(?=\\\\W|$)', 'i'\r\n);\r\n\r\nexports.Parser = function FRDeadlineFormatParser(){\r\n    Parser.apply(this, arguments);\r\n\r\n    this.pattern = function() {\r\n        return this.isStrictMode()? STRICT_PATTERN : PATTERN;\r\n    };\r\n\r\n    this.extract = function(text, ref, match, opt){\r\n\r\n        var index = match.index + match[1].length;\r\n        var text  = match[0];\r\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\r\n\r\n        var result = new ParsedResult({\r\n            index: index,\r\n            text: text,\r\n            ref: ref\r\n        });\r\n\r\n        var num = match[3];\r\n        if (util.INTEGER_WORDS[num] !== undefined) {\r\n            num = util.INTEGER_WORDS[num];\r\n        } else if (num === 'un' || num === 'une'){\r\n            num = 1;\r\n        } else if (num.match(/quelques?/i)){\r\n            num = 3;\r\n        } else if (num.match(/demi-?/i)) {\r\n            num = 0.5;\r\n        } else {\r\n            num = parseInt(num);\r\n        }\r\n\r\n        var date = moment(ref);\r\n        if (match[4].match(/jour|semaine|mois|année/i)) {\r\n\r\n            if (match[4].match(/jour/)) {\r\n                date.add(num, 'd');\r\n            } else if (match[4].match(/semaine/i)) {\r\n                date.add(num * 7, 'd');\r\n            } else if (match[4].match(/mois/i)) {\r\n                date.add(num, 'month');\r\n            } else if (match[4].match(/année/i)) {\r\n                date.add(num, 'year');\r\n            }\r\n\r\n            result.start.assign('year', date.year());\r\n            result.start.assign('month', date.month() + 1);\r\n            result.start.assign('day', date.date());\r\n            return result;\r\n        }\r\n\r\n        if (match[4].match(/heure/i)) {\r\n\r\n            date.add(num, 'hour');\r\n\r\n        } else if (match[4].match(/min/i)) {\r\n\r\n            date.add(num, 'minutes');\r\n\r\n        } else if (match[4].match(/secondes/i)) {\r\n\r\n            date.add(num, 'second');\r\n        }\r\n\r\n        result.start.imply('year', date.year());\r\n        result.start.imply('month', date.month() + 1);\r\n        result.start.imply('day', date.date());\r\n        result.start.assign('hour', date.hour());\r\n        result.start.assign('minute', date.minute());\r\n        result.start.assign('second', date.second());\r\n        result.tags['FRDeadlineFormatParser'] = true;\r\n        return result;\r\n    };\r\n};\r\n","/*\r\n\r\n\r\n*/\r\n\r\nvar moment = require('moment');\r\n\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\n\r\nvar util  = require('../../utils/FR');\r\n\r\nvar DAYS_OFFSET = util.WEEKDAY_OFFSET;\r\n\r\nvar PATTERN = new RegExp('(\\\\W|^)' +\r\n        '(?:(Dimanche|Lundi|Mardi|mercredi|Jeudi|Vendredi|Samedi|Dim|Lun|Mar|Mer|Jeu|Ven|Sam)\\\\s*,?\\\\s*)?' +\r\n        '([0-9]{1,2}|1er)' +\r\n        '(?:\\\\s*(?:au|\\\\-|\\\\–|jusqu\\'au?|\\\\s)\\\\s*([0-9]{1,2})(?:er)?)?\\\\s*(?:de)?\\\\s*' +\r\n        '(Jan(?:vier|\\\\.)?|F[ée]v(?:rier|\\\\.)?|Mars|Avr(?:il|\\\\.)?|Mai|Juin|Juil(?:let|\\\\.)?|Ao[uû]t|Sept(?:embre|\\\\.)?|Oct(?:obre|\\\\.)?|Nov(?:embre|\\\\.)?|d[ée]c(?:embre|\\\\.)?)' +\r\n        '(?:\\\\s*(\\\\s*[0-9]{1,4}(?![^\\\\s]\\\\d))(?:\\\\s*(AC|[ap]\\\\.?\\\\s*c(?:h(?:r)?)?\\\\.?\\\\s*n\\\\.?))?)?' +\r\n        '(?=\\\\W|$)', 'i'\r\n    );\r\n\r\nvar WEEKDAY_GROUP = 2;\r\nvar DATE_GROUP = 3;\r\nvar DATE_TO_GROUP = 4;\r\nvar MONTH_NAME_GROUP = 5;\r\nvar YEAR_GROUP = 6;\r\nvar YEAR_BE_GROUP = 7;\r\n\r\nexports.Parser = function FRMonthNameLittleEndianParser(){\r\n    Parser.apply(this, arguments);\r\n\r\n    this.pattern = function() { return PATTERN; }\r\n\r\n    this.extract = function(text, ref, match, opt){\r\n\r\n        var result = new ParsedResult({\r\n            text: match[0].substr(match[1].length, match[0].length - match[1].length),\r\n            index: match.index + match[1].length,\r\n            ref: ref,\r\n        });\r\n\r\n        var month = match[MONTH_NAME_GROUP];\r\n        month = util.MONTH_OFFSET[month.toLowerCase()];\r\n\r\n        var day = match[DATE_GROUP];\r\n        day = parseInt(day);\r\n\r\n        var year = null;\r\n        if (match[YEAR_GROUP]) {\r\n            year = match[YEAR_GROUP];\r\n            year = parseInt(year);\r\n\r\n            if(match[YEAR_BE_GROUP]){\r\n                if (/a/i.test(match[YEAR_BE_GROUP])) {\r\n                    // Ante Christe natum\r\n                    year = -year;\r\n                }\r\n            } else if (year < 100){\r\n\r\n                year = year + 2000;\r\n            }\r\n        }\r\n\r\n        if(year){\r\n            result.start.assign('day', day);\r\n            result.start.assign('month', month);\r\n            result.start.assign('year', year);\r\n        } else {\r\n\r\n            // Find the most appropriated year\r\n            var refMoment = moment(ref);\r\n            refMoment.month(month - 1);\r\n            refMoment.date(day);\r\n            refMoment.year(moment(ref).year());\r\n\r\n            var nextYear = refMoment.clone().add(1, 'y');\r\n            var lastYear = refMoment.clone().add(-1, 'y');\r\n            if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\r\n                refMoment = nextYear;\r\n            }\r\n            else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\r\n                refMoment = lastYear;\r\n            }\r\n\r\n            result.start.assign('day', day);\r\n            result.start.assign('month', month);\r\n            result.start.imply('year', refMoment.year());\r\n        }\r\n\r\n        // Weekday component\r\n        if (match[WEEKDAY_GROUP]) {\r\n            var weekday = match[WEEKDAY_GROUP];\r\n            weekday = util.WEEKDAY_OFFSET[weekday.toLowerCase()]\r\n            result.start.assign('weekday', weekday);\r\n        }\r\n\r\n        // Text can be 'range' value. Such as '12 - 13 janvier 2012'\r\n        if (match[DATE_TO_GROUP]) {\r\n            result.end = result.start.clone();\r\n            result.end.assign('day', parseInt(match[DATE_TO_GROUP]));\r\n        }\r\n\r\n        result.tags['FRMonthNameLittleEndianParser'] = true;\r\n        return result;\r\n    };\r\n}\r\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar util  = require('../../utils/FR');\n\n// Force load fr localization data from moment for the locale files to be linkded durning browserify.\n// NOTE: The function moment.defineLocale() also has a side effect that it change global locale\n//  We also need to save and restore the previous locale (see. moment.js, loadLocale)\nvar originalLocale = moment.locale();\nrequire('moment/locale/fr');\nmoment.locale(originalLocale);\n\nvar PATTERN = new RegExp('(\\\\W|^)' +\n    '(?:les?|la|l\\'|du|des?)\\\\s*' +\n    '('+ util.INTEGER_WORDS_PATTERN + '|\\\\d+)?\\\\s*' +\n    '(prochaine?s?|derni[eè]re?s?|pass[ée]e?s?|pr[ée]c[ée]dents?|suivante?s?)?\\\\s*' +\n    '(secondes?|min(?:ute)?s?|heures?|jours?|semaines?|mois|trimestres?|années?)\\\\s*' +\n    '(prochaine?s?|derni[eè]re?s?|pass[ée]e?s?|pr[ée]c[ée]dents?|suivante?s?)?' +\n    '(?=\\\\W|$)', 'i'\n);\n\nvar MULTIPLIER_GROUP = 2;\nvar MODIFIER_1_GROUP = 3;\nvar RELATIVE_WORD_GROUP = 4;\nvar MODIFIER_2_GROUP = 5;\n\nexports.Parser = function FRRelativeDateFormatParser(){\n    Parser.apply(this, arguments);\n\n    this.pattern = function() { return PATTERN; };\n\n    this.extract = function(text, ref, match, opt){\n        var index = match.index + match[1].length;\n        var text  = match[0];\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\n\n        // Multiplier\n        var multiplier = match[MULTIPLIER_GROUP] === undefined ? '1' : match[MULTIPLIER_GROUP];\n        if (util.INTEGER_WORDS[multiplier] !== undefined) {\n            multiplier = util.INTEGER_WORDS[multiplier];\n        } else {\n            multiplier = parseInt(multiplier);\n        }\n\n        // Modifier\n        var modifier = match[MODIFIER_1_GROUP] === undefined ?\n                    (match[MODIFIER_2_GROUP] === undefined ? '' : match[MODIFIER_2_GROUP].toLowerCase())\n                     : match[MODIFIER_1_GROUP].toLowerCase();\n        if(!modifier) {\n            // At least one modifier is mandatory to match this parser\n            return;\n        }\n\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n        result.tags['FRRelativeDateFormatParser'] = true;\n\n        var modifierFactor;\n        switch(true) {\n            case /prochaine?s?/.test(modifier):\n            case /suivants?/.test(modifier):\n                modifierFactor = 1;\n                break;\n            case /derni[eè]re?s?/.test(modifier):\n            case /pass[ée]e?s?/.test(modifier):\n            case /pr[ée]c[ée]dents?/.test(modifier):\n                modifierFactor = -1;\n                break;\n        }\n\n        var total = multiplier * modifierFactor;\n\n        var dateFrom = moment(ref),\n            dateTo = moment(ref);\n        dateFrom.locale('fr');\n        dateTo.locale('fr');\n        var relative = match[RELATIVE_WORD_GROUP];\n        var startOf;\n        switch(true) {\n            case /secondes?/.test(relative):\n                dateFrom.add(total, 's');\n                dateTo.add(modifierFactor, 's');\n                startOf = 'second';\n                break;\n            case /min(?:ute)?s?/.test(relative):\n                dateFrom.add(total, 'm');\n                dateTo.add(modifierFactor, 'm');\n                startOf = 'minute';\n                break;\n            case /heures?/.test(relative):\n                dateFrom.add(total, 'h');\n                dateTo.add(modifierFactor, 'h');\n                startOf = 'hour';\n                break;\n            case /jours?/.test(relative):\n                dateFrom.add(total, 'd');\n                dateTo.add(modifierFactor, 'd');\n                startOf = 'day';\n                break;\n            case /semaines?/.test(relative):\n                dateFrom.add(total, 'w');\n                dateTo.add(modifierFactor, 'w');\n                startOf = 'week';\n                break;\n            case /mois?/.test(relative):\n                dateFrom.add(total, 'M');\n                dateTo.add(modifierFactor, 'M');\n                startOf = 'month';\n                break;\n            case /trimestres?/.test(relative):\n                dateFrom.add(total, 'Q');\n                dateTo.add(modifierFactor, 'Q');\n                startOf = 'quarter';\n                break;\n            case /années?/.test(relative):\n                dateFrom.add(total, 'y');\n                dateTo.add(modifierFactor, 'y');\n                startOf = 'year';\n                break;\n        }\n\n        // if we go forward, switch the start and end dates\n        if(modifierFactor > 0) {\n            var dateTmp = dateFrom;\n            dateFrom = dateTo;\n            dateTo = dateTmp;\n        }\n\n        // Get start and end of dates\n        dateFrom.startOf(startOf);\n        dateTo.endOf(startOf);\n\n        // Assign results\n        result.start.assign('year', dateFrom.year());\n        result.start.assign('month', dateFrom.month() + 1);\n        result.start.assign('day', dateFrom.date());\n        result.start.assign('minute', dateFrom.minute());\n        result.start.assign('second', dateFrom.second());\n        result.start.assign('hour', dateFrom.hour());\n        result.start.assign('millisecond', dateFrom.millisecond());\n\n        result.end = result.start.clone();\n        result.end.assign('year', dateTo.year());\n        result.end.assign('month', dateTo.month() + 1);\n        result.end.assign('day', dateTo.date());\n        result.end.assign('minute', dateTo.minute());\n        result.end.assign('second', dateTo.second());\n        result.end.assign('hour', dateTo.hour());\n        result.end.assign('millisecond', dateTo.millisecond());\n        return result;\n    };\n};\n","/*\r\n    Date format with slash \"/\" (also \"-\" and \".\") between numbers\r\n    - Martes 3/11/2015\r\n    - 3/11/2015\r\n    - 3/11\r\n*/\r\nvar moment = require('moment');\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\n\r\nvar PATTERN = new RegExp('(\\\\W|^)' +\r\n    '(?:' +\r\n        '((?:dimanche|dim|lundi|lun|mardi|mar|mercredi|mer|jeudi|jeu|vendredi|ven|samedi|sam|le))' +\r\n        '\\\\s*\\\\,?\\\\s*' +\r\n    ')?' +\r\n    '([0-3]{0,1}[0-9]{1})[\\\\/\\\\.\\\\-]([0-3]{0,1}[0-9]{1})' +\r\n    '(?:' +\r\n        '[\\\\/\\\\.\\\\-]' +\r\n        '([0-9]{4}\\s*\\,?\\s*|[0-9]{2}\\s*\\,?\\s*)' +\r\n    ')?' +\r\n    '(\\\\W|$)', 'i');\r\n\r\nvar DAYS_OFFSET = { 'dimanche': 0, 'dim': 0, 'lundi': 1, 'lun': 1,'mardi': 2, 'mar':2, 'mercredi': 3, 'mer': 3,\r\n    'jeudi': 4, 'jeu':4, 'vendredi': 5, 'ven': 5,'samedi': 6, 'sam': 6};\r\n\r\n\r\nvar OPENNING_GROUP = 1;\r\nvar ENDING_GROUP = 6;\r\n\r\n// In French we use day/month/year\r\nvar WEEKDAY_GROUP = 2;\r\nvar DAY_GROUP = 3;\r\nvar MONTH_GROUP = 4;\r\nvar YEAR_GROUP = 5;\r\nvar YEAR_BE_GROUP = 6;\r\n\r\nexports.Parser = function FRSlashDateFormatParser(argument) {\r\n    Parser.apply(this, arguments);\r\n\r\n    this.pattern = function () { return PATTERN; };\r\n    this.extract = function(text, ref, match, opt){\r\n\r\n        if(match[OPENNING_GROUP] == '/' || match[ENDING_GROUP] == '/') {\r\n            // Long skip, if there is some overlapping like:\r\n            // XX[/YY/ZZ]\r\n            // [XX/YY/]ZZ\r\n            match.index += match[0].length\r\n            return;\r\n        }\r\n\r\n        var index = match.index + match[OPENNING_GROUP].length;\r\n        var text = match[0].substr(match[OPENNING_GROUP].length, match[0].length - match[ENDING_GROUP].length);\r\n\r\n\r\n        var result = new ParsedResult({\r\n            text: text,\r\n            index: index,\r\n            ref: ref,\r\n        });\r\n\r\n        if(text.match(/^\\d\\.\\d$/)) return;\r\n        if(text.match(/^\\d\\.\\d{1,2}\\.\\d{1,2}$/)) return;\r\n\r\n        // MM/dd -> OK\r\n        // MM.dd -> NG\r\n        if(!match[YEAR_GROUP] && match[0].indexOf('/') < 0) return;\r\n\r\n        var date = null;\r\n        var month = match[MONTH_GROUP];\r\n        var day   = match[DAY_GROUP];\r\n\r\n        day  = parseInt(day);\r\n        month = parseInt(month);\r\n\r\n        var year = null;\r\n        if (match[YEAR_GROUP]) {\r\n            year = match[YEAR_GROUP];\r\n            year = parseInt(year);\r\n\r\n            if(match[YEAR_BE_GROUP]){\r\n                if (/a/i.test(match[YEAR_BE_GROUP])) {\r\n                    // Ante Christe natum\r\n                    year = -year;\r\n                }\r\n            } else if (year < 100){\r\n\r\n                year = year + 2000;\r\n            }\r\n        }\r\n\r\n        if(month < 1 || month > 12) {\r\n            if(month > 12) {\r\n                // dd/mm/yyyy date format if day looks like a month, and month looks like a day.\r\n                if (day >= 1 && day <= 12 && month >= 13 && month <= 31) {\r\n                    // unambiguous\r\n                    var tday = month;\r\n                    month = day;\r\n                    day = tday;\r\n                }\r\n                else {\r\n                    // both month and day are <= 12\r\n                    return null;\r\n                }\r\n            }\r\n        }\r\n\r\n        if(day < 1 || day > 31) return null;\r\n\r\n        if(year){\r\n            result.start.assign('day', day);\r\n            result.start.assign('month', month);\r\n            result.start.assign('year', year);\r\n        } else {\r\n\r\n            // Find the most appropriated year\r\n            var refMoment = moment(ref);\r\n            refMoment.month(month - 1);\r\n            refMoment.date(day);\r\n            refMoment.year(moment(ref).year());\r\n\r\n            var nextYear = refMoment.clone().add(1, 'y');\r\n            var lastYear = refMoment.clone().add(-1, 'y');\r\n            if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\r\n                refMoment = nextYear;\r\n            }\r\n            else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(refMoment.diff(moment(ref))) ){\r\n                refMoment = lastYear;\r\n            }\r\n\r\n            result.start.assign('day', day);\r\n            result.start.assign('month', month);\r\n            result.start.imply('year', refMoment.year());\r\n        }\r\n\r\n        // Day of week\r\n        if(match[WEEKDAY_GROUP]) {\r\n            result.start.assign('weekday', DAYS_OFFSET[match[WEEKDAY_GROUP].toLowerCase()]);\r\n        }\r\n\r\n        result.tags['FRSlashDateFormatParser'] = true;\r\n        return result;\r\n    };\r\n};","/*\r\n\r\n\r\n*/\r\n\r\nvar moment = require('moment');\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\n\r\nvar PATTERN = /(\\W|^)il y a\\s*([0-9]+|une?)\\s*(minutes?|heures?|semaines?|jours?|mois|années?|ans?)(?=(?:\\W|$))/i;\r\n\r\nexports.Parser = function FRTimeAgoFormatParser(){\r\n    Parser.apply(this, arguments);\r\n\r\n    this.pattern = function() {\r\n        return PATTERN;\r\n    }\r\n\r\n    this.extract = function(text, ref, match, opt){\r\n\r\n        if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\r\n\r\n        var text = match[0];\r\n        text  = match[0].substr(match[1].length, match[0].length - match[1].length);\r\n        index = match.index + match[1].length;\r\n\r\n        var result = new ParsedResult({\r\n            index: index,\r\n            text: text,\r\n            ref: ref,\r\n        });\r\n        result.tags['FRTimeAgoFormatParser'] = true;\r\n        \r\n        var num = parseInt(match[2]);\r\n        if (isNaN(num)) {\r\n          if (match[2].match(/demi/)) {\r\n            num = 0.5;\r\n          } else {\r\n            num = 1;\r\n          }\r\n        }\r\n\r\n        var date = moment(ref);\r\n\r\n        if (match[3].match(/heure/) || match[3].match(/minute/)) {\r\n            if (match[3].match(/heure/)) {\r\n\r\n                date.add(-num, 'hour');\r\n\r\n            } else if (match[3].match(/minute/)) {\r\n\r\n                date.add(-num, 'minute');\r\n            }\r\n\r\n            result.start.imply('day', date.date());\r\n            result.start.imply('month', date.month() + 1);\r\n            result.start.imply('year', date.year());\r\n            result.start.assign('hour', date.hour());\r\n            result.start.assign('minute', date.minute());\r\n\r\n            return result;\r\n        }\r\n\r\n        if (match[3].match(/semaine/)) {\r\n            date.add(-num, 'week');\r\n\r\n            result.start.imply('day', date.date());\r\n            result.start.imply('month', date.month() + 1);\r\n            result.start.imply('year', date.year());\r\n            result.start.imply('weekday', date.day());\r\n            return result;\r\n        }\r\n\r\n        if (match[3].match(/jour/)) {\r\n            date.add(-num, 'd');\r\n        }\r\n\r\n        if (match[3].match(/mois/)) {\r\n            date.add(-num, 'month');\r\n        }\r\n\r\n        if (match[3].match(/années?|ans?/)) {\r\n\r\n            date.add(-num, 'year');\r\n        }\r\n\r\n        result.start.assign('day', date.date());\r\n        result.start.assign('month', date.month() + 1);\r\n        result.start.assign('year', date.year());\r\n        return result;\r\n\r\n    };\r\n}\r\n","/*\r\n\r\n\r\n*/\r\n\r\nvar moment = require('moment');\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\nvar ParsedComponents = require('../../result').ParsedComponents;\r\n\r\nvar FIRST_REG_PATTERN  = new RegExp(\"(^|\\\\s|T)\" +\r\n    \"(?:(?:[àa])\\\\s*)?\" +\r\n    \"(\\\\d{1,2}(?:h)?|midi|minuit)\" +\r\n    \"(?:\" +\r\n        \"(?:\\\\.|\\\\:|\\\\:|h)(\\\\d{1,2})(?:m)?\" +\r\n        \"(?:\" +\r\n            \"(?:\\\\:|\\\\:|m)(\\\\d{0,2})(?:s)?\" +\r\n        \")?\" +\r\n    \")?\" +\r\n    \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?))?\" +\r\n    \"(?=\\\\W|$)\", 'i');\r\n\r\n\r\nvar SECOND_REG_PATTERN = new RegExp(\"^\\\\s*\" +\r\n    \"(\\\\-|\\\\–|\\\\~|\\\\〜|[àa]|\\\\?)\\\\s*\" +\r\n    \"(\\\\d{1,2}(?:h)?)\" +\r\n    \"(?:\" +\r\n        \"(?:\\\\.|\\\\:|\\\\:|h)(\\\\d{1,2})(?:m)?\" +\r\n        \"(?:\" +\r\n            \"(?:\\\\.|\\\\:|\\\\:|m)(\\\\d{1,2})(?:s)?\" +\r\n        \")?\" +\r\n    \")?\" +\r\n    \"(?:\\\\s*(A\\\\.M\\\\.|P\\\\.M\\\\.|AM?|PM?))?\" +\r\n    \"(?=\\\\W|$)\", 'i');\r\n\r\nvar HOUR_GROUP    = 2;\r\nvar MINUTE_GROUP  = 3;\r\nvar SECOND_GROUP  = 4;\r\nvar AM_PM_HOUR_GROUP = 5;\r\n\r\nexports.Parser = function FRTimeExpressionParser(){\r\n    Parser.apply(this, arguments);\r\n\r\n    this.pattern = function() { return FIRST_REG_PATTERN; }\r\n\r\n    this.extract = function(text, ref, match, opt){\r\n\r\n        // This pattern can be overlaped Ex. [12] AM, 1[2] AM\r\n        if (match.index > 0 && text[match.index-1].match(/\\w/)) return null;\r\n        var refMoment = moment(ref);\r\n        var result = new ParsedResult();\r\n        result.ref = ref;\r\n        result.index = match.index + match[1].length;\r\n        result.text  = match[0].substring(match[1].length);\r\n        result.tags['FRTimeExpressionParser'] = true;\r\n\r\n        result.start.imply('day',   refMoment.date());\r\n        result.start.imply('month', refMoment.month()+1);\r\n        result.start.imply('year',  refMoment.year());\r\n\r\n        var hour = 0;\r\n        var minute = 0;\r\n        var meridiem = -1;\r\n\r\n        // ----- Second\r\n        if(match[SECOND_GROUP] != null){\r\n            var second = parseInt(match[SECOND_GROUP]);\r\n            if(second >= 60) return null;\r\n\r\n            result.start.assign('second', second);\r\n        }\r\n\r\n        // ----- Hours\r\n        if (match[HOUR_GROUP].toLowerCase() == \"midi\"){\r\n            meridiem = 1;\r\n            hour = 12;\r\n        } else if (match[HOUR_GROUP].toLowerCase() == \"minuit\") {\r\n            meridiem = 0;\r\n            hour = 0;\r\n        } else {\r\n            hour = parseInt(match[HOUR_GROUP]);\r\n        }\r\n\r\n        // ----- Minutes\r\n        if(match[MINUTE_GROUP] != null){\r\n            minute = parseInt(match[MINUTE_GROUP]);\r\n        } else if(hour > 100) {\r\n            minute = hour%100;\r\n            hour   = parseInt(hour/100);\r\n        }\r\n\r\n        if(minute >= 60) {\r\n            return null;\r\n        }\r\n\r\n        if(hour > 24) {\r\n            return null;\r\n        }\r\n        if (hour >= 12) {\r\n            meridiem = 1;\r\n        }\r\n\r\n        // ----- AM & PM\r\n        if(match[AM_PM_HOUR_GROUP] != null) {\r\n            if(hour > 12) return null;\r\n            var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\r\n            if(ampm == \"a\"){\r\n                meridiem = 0;\r\n                if(hour == 12) hour = 0;\r\n            }\r\n\r\n            if(ampm == \"p\"){\r\n                meridiem = 1;\r\n                if(hour != 12) hour += 12;\r\n            }\r\n        }\r\n        result.start.assign('hour', hour);\r\n        result.start.assign('minute', minute);\r\n        if (meridiem >= 0) {\r\n            result.start.assign('meridiem', meridiem);\r\n        }\r\n\r\n        // ==============================================================\r\n        //                  Extracting the 'to' chunk\r\n        // ==============================================================\r\n        match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));\r\n        if (!match) {\r\n            // Not accept number only result\r\n            if (result.text.match(/^\\d+$/)) {\r\n                return null;\r\n            }\r\n            return result;\r\n        }\r\n\r\n\r\n\r\n        // Pattern \"YY.YY -XXXX\" is more like timezone offset\r\n        if (match[0].match(/^\\s*(\\+|\\-)\\s*\\d{3,4}$/)) {\r\n            return result;\r\n        }\r\n\r\n        if(result.end == null){\r\n            result.end = new ParsedComponents(null, result.start.date());\r\n        }\r\n\r\n        var hour = 0;\r\n        var minute = 0;\r\n        var meridiem = -1;\r\n\r\n        // ----- Second\r\n        if(match[SECOND_GROUP] != null){\r\n            var second = parseInt(match[SECOND_GROUP]);\r\n            if(second >= 60) return null;\r\n\r\n            result.end.assign('second', second);\r\n        }\r\n\r\n        hour = parseInt(match[2]);\r\n\r\n        // ----- Minute\r\n        if (match[MINUTE_GROUP]!= null) {\r\n\r\n            minute = parseInt(match[MINUTE_GROUP]);\r\n            if(minute >= 60) return result;\r\n\r\n        } else if (hour > 100) {\r\n\r\n            minute = hour%100;\r\n            hour   = parseInt(hour/100);\r\n        }\r\n\r\n        if(minute >= 60) {\r\n            return null;\r\n        }\r\n\r\n        if(hour > 24) {\r\n            return null;\r\n        }\r\n        if (hour >= 12) {\r\n            meridiem = 1;\r\n        }\r\n\r\n        // ----- AM & PM\r\n        if (match[AM_PM_HOUR_GROUP] != null){\r\n\r\n            if (hour > 12) return null;\r\n\r\n            if(match[AM_PM_HOUR_GROUP][0].toLowerCase() == \"a\"){\r\n                meridiem = 0;\r\n                if(hour == 12) {\r\n                    hour = 0;\r\n                    if (!result.end.isCertain('day')) {\r\n                        result.end.imply('day', result.end.get('day') + 1);\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(match[AM_PM_HOUR_GROUP][0].toLowerCase() == \"p\"){\r\n                meridiem = 1;\r\n                if(hour != 12) hour += 12;\r\n            }\r\n\r\n            if (!result.start.isCertain('meridiem')) {\r\n                if (meridiem == 0) {\r\n\r\n                    result.start.imply('meridiem', 0);\r\n\r\n                    if (result.start.get('hour') == 12) {\r\n                        result.start.assign('hour', 0);\r\n                    }\r\n\r\n                } else {\r\n\r\n                    result.start.imply('meridiem', 1);\r\n\r\n                    if (result.start.get('hour') != 12) {\r\n                        result.start.assign('hour', result.start.get('hour') + 12);\r\n                    }\r\n                }\r\n            }\r\n\r\n        } else if(hour >= 12) {\r\n            meridiem = 1;\r\n        }\r\n\r\n        result.text = result.text + match[0];\r\n        result.end.assign('hour', hour);\r\n        result.end.assign('minute', minute);\r\n        if (meridiem >= 0) {\r\n            result.end.assign('meridiem', meridiem);\r\n        }\r\n\r\n        if (result.end.date().getTime() < result.start.date().getTime()) {\r\n            result.end.imply('day', result.end.get('day') + 1)\r\n        }\r\n\r\n        return result;\r\n    }\r\n}\r\n","/*\r\n\r\n\r\n*/\r\nvar moment = require('moment');\r\nvar Parser = require('../parser').Parser;\r\nvar ParsedResult = require('../../result').ParsedResult;\r\nvar updateParsedComponent = require('../en/ENWeekdayParser').updateParsedComponent;\r\n\r\nvar DAYS_OFFSET = { 'dimanche': 0, 'dim': 0, 'lundi': 1, 'lun': 1,'mardi': 2, 'mar':2, 'mercredi': 3, 'mer': 3,\r\n    'jeudi': 4, 'jeu':4, 'vendredi': 5, 'ven': 5,'samedi': 6, 'sam': 6};\r\n\r\nvar PATTERN = new RegExp('(\\\\s|^)' +\r\n    '(?:(?:\\\\,|\\\\(|\\\\()\\\\s*)?' +\r\n    '(?:(ce)\\\\s*)?' +\r\n    '(' + Object.keys(DAYS_OFFSET).join('|') + ')' +\r\n    '(?:\\\\s*(?:\\\\,|\\\\)|\\\\)))?' +\r\n    '(?:\\\\s*(dernier|prochain)\\\\s*)?' +\r\n    '(?=\\\\W|$)', 'i');\r\n\r\nvar PREFIX_GROUP = 2;\r\nvar WEEKDAY_GROUP = 3;\r\nvar POSTFIX_GROUP = 4;\r\n\r\nexports.Parser = function FRWeekdayParser() {\r\n    Parser.apply(this, arguments);\r\n\r\n    this.pattern = function() { return PATTERN; };\r\n\r\n    this.extract = function(text, ref, match, opt){\r\n        var index = match.index + match[1].length;\r\n        var text = match[0].substr(match[1].length, match[0].length - match[1].length);\r\n        var result = new ParsedResult({\r\n            index: index,\r\n            text: text,\r\n            ref: ref\r\n        });\r\n\r\n        var dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();\r\n        var offset = DAYS_OFFSET[dayOfWeek];\r\n        if(offset === undefined) return null;\r\n\r\n        var modifier = null;\r\n        var prefix = match[PREFIX_GROUP];\r\n        var postfix = match[POSTFIX_GROUP];\r\n        if (prefix || postfix) {\r\n            var norm = prefix || postfix;\r\n            norm = norm.toLowerCase();\r\n\r\n            if(norm == 'dernier') {\r\n                modifier = 'last';\r\n            } else if(norm == 'prochain') {\r\n                modifier = 'next';\r\n            } else if(norm== 'ce') {\r\n                modifier = 'this';\r\n            }\r\n        }\r\n\r\n        updateParsedComponent(result, ref, offset, modifier);\r\n        result.tags['FRWeekdayParser'] = true;\r\n        return result;\r\n    }\r\n};\r\n\r\n","/*\n    \n    \n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = /今日|当日|昨日|明日|今夜|今夕|今晩|今朝/i;\n\nexports.Parser = function JPCasualDateParser(){\n    \n    Parser.apply(this, arguments);\n        \n    this.pattern = function() { return PATTERN; }\n    \n    this.extract = function(text, ref, match, opt){ \n        \n        var index = match.index;\n        var text = match[0];\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref,\n        });\n\n        var refMoment = moment(ref);\n        var startMoment = refMoment.clone();\n\n        if(text == '今夜' || text == '今夕' || text == '今晩'){\n            // Normally means this coming midnight \n            result.start.imply('hour', 22);\n            result.start.imply('meridiem', 1);\n\n        } else if(text == '明日'){\n\n            // Check not \"Tomorrow\" on late night\n            if(refMoment.hour() > 4) {\n                startMoment.add(1, 'day');\n            }\n\n        } else if(text == '昨日') {\n\n            startMoment.add(-1, 'day');\n\n        } else if (text.match(\"今朝\")) {\n\n            result.start.imply('hour', 6);\n            result.start.imply('meridiem', 0);\n        }\n\n        result.start.assign('day', startMoment.date())\n        result.start.assign('month', startMoment.month() + 1)\n        result.start.assign('year', startMoment.year())\n        result.tags['JPCasualDateParser'] = true;\n        return result;\n    }\n}\n\n","/*\n    \n    \n*/\n\nvar moment = require('moment');\n\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar util  = require('../../utils/JP'); \nvar PATTERN = /(?:(同|((昭和|平成)?([0-90-9]{2,4})))年\\s*)?([0-90-9]{1,2})月\\s*([0-90-9]{1,2})日/i;\n  \nvar YEAR_GROUP        = 2;\nvar ERA_GROUP         = 3;\nvar YEAR_NUMBER_GROUP = 4;\nvar MONTH_GROUP       = 5;\nvar DAY_GROUP         = 6;\n\nexports.Parser = function JPStandardParser(){\n    Parser.apply(this, arguments);\n    \n    this.pattern = function() { return PATTERN; }\n    \n    this.extract = function(text, ref, match, opt){ \n\n        var startMoment = moment(ref);\n        var result = new ParsedResult({\n            text: match[0],\n            index: match.index,\n            ref: ref,\n        });\n        \n        var month = match[MONTH_GROUP];\n        month = util.toHankaku(month);\n        month = parseInt(month);\n\n        var day = match[DAY_GROUP];\n        day = util.toHankaku(day);\n        day = parseInt(day);\n\n        startMoment.set('date', day);\n        startMoment.set('month', month - 1);\n        result.start.assign('day', startMoment.date());\n        result.start.assign('month', startMoment.month() + 1);\n            \n        if (!match[YEAR_GROUP]) {\n            \n            //Find the most appropriated year\n            startMoment.year(moment(ref).year());\n            var nextYear = startMoment.clone().add(1, 'y');\n            var lastYear = startMoment.clone().add(-1, 'y');\n            if( Math.abs(nextYear.diff(moment(ref))) < Math.abs(startMoment.diff(moment(ref))) ){  \n                startMoment = nextYear;\n            }\n            else if( Math.abs(lastYear.diff(moment(ref))) < Math.abs(startMoment.diff(moment(ref))) ){ \n                startMoment = lastYear;\n            }\n\n            result.start.assign('day', startMoment.date());\n            result.start.assign('month', startMoment.month() + 1);\n            result.start.imply('year', startMoment.year());\n\n        } else if (match[YEAR_GROUP].match('同年')) {\n\n            result.start.assign('year', startMoment.year());\n\n        } else {\n            var year = match[YEAR_NUMBER_GROUP];\n            year = util.toHankaku(year);\n            year = parseInt(year);\n\n            if (match[ERA_GROUP] == '平成') {\n                year += 1988;\n            } else if (match[ERA_GROUP] == '昭和') {\n                year += 1925;\n            }\n\n            result.start.assign('year', year);\n        }\n        \n\n        result.tags['JPStandardParser'] = true;\n        return result;\n    };\n\n}\n\n","\nfunction Parser(config) {\n\n    config = config || {};\n    var strictMode = config.strict;\n\n    this.isStrictMode = function() { return (strictMode == true) };\n\n    this.pattern = function() { return /./i; }\n\n    this.extract = function(text, ref, match, opt){ return null; }\n\n    this.execute = function(text, ref, opt) {\n\n        var results = [];\n        var regex = this.pattern();\n\n        var remainingText = text;\n        var match = regex.exec(remainingText);\n\n        while (match) {\n\n            // Calculate match index on the full text;\n            match.index += text.length - remainingText.length;\n\n            var result = this.extract(text, ref, match, opt);\n            if (result) {\n\n                // If success, start from the end of the result\n                remainingText = text.substring(result.index + result.text.length);\n\n                if (!this.isStrictMode() || result.hasPossibleDates()) {\n                    results.push(result);\n                }\n\n            } else {\n                // If fail, move on by 1\n                remainingText = text.substring(match.index + 1);\n            }\n\n            match = regex.exec(remainingText);\n        }\n\n        if (this.refiners) {\n            this.refiners.forEach(function () {\n                results = refiner.refine(results, text, options);\n            });\n        }\n\n        return results;\n    }\n}\n\nexports.Parser = Parser;\n\nexports.ENISOFormatParser = require('./en/ENISOFormatParser').Parser;\nexports.ENDeadlineFormatParser = require('./en/ENDeadlineFormatParser').Parser;\nexports.ENRelativeDateFormatParser = require('./en/ENRelativeDateFormatParser').Parser;\nexports.ENMonthNameLittleEndianParser = require('./en/ENMonthNameLittleEndianParser').Parser;\nexports.ENMonthNameMiddleEndianParser = require('./en/ENMonthNameMiddleEndianParser').Parser;\nexports.ENMonthNameParser = require('./en/ENMonthNameParser').Parser;\nexports.ENSlashDateFormatParser = require('./en/ENSlashDateFormatParser').Parser;\nexports.ENSlashDateFormatStartWithYearParser = require('./en/ENSlashDateFormatStartWithYearParser').Parser;\nexports.ENSlashMonthFormatParser = require('./en/ENSlashMonthFormatParser').Parser;\nexports.ENTimeAgoFormatParser = require('./en/ENTimeAgoFormatParser').Parser;\nexports.ENTimeExpressionParser = require('./en/ENTimeExpressionParser').Parser;\nexports.ENTimeLaterFormatParser = require('./en/ENTimeLaterFormatParser').Parser;\nexports.ENWeekdayParser = require('./en/ENWeekdayParser').Parser;\nexports.ENCasualDateParser = require('./en/ENCasualDateParser').Parser;\nexports.ENCasualTimeParser = require('./en/ENCasualTimeParser').Parser;\n\nexports.JPStandardParser = require('./ja/JPStandardParser').Parser;\nexports.JPCasualDateParser = require('./ja/JPCasualDateParser').Parser;\n\nexports.ESCasualDateParser = require('./es/ESCasualDateParser').Parser;\nexports.ESDeadlineFormatParser = require('./es/ESDeadlineFormatParser').Parser;\nexports.ESTimeAgoFormatParser = require('./es/ESTimeAgoFormatParser').Parser;\nexports.ESTimeExpressionParser = require('./es/ESTimeExpressionParser').Parser;\nexports.ESWeekdayParser = require('./es/ESWeekdayParser').Parser;\nexports.ESMonthNameLittleEndianParser = require('./es/ESMonthNameLittleEndianParser').Parser;\nexports.ESSlashDateFormatParser = require('./es/ESSlashDateFormatParser').Parser;\n\nexports.FRCasualDateParser = require('./fr/FRCasualDateParser').Parser;\nexports.FRDeadlineFormatParser = require('./fr/FRDeadlineFormatParser').Parser;\nexports.FRMonthNameLittleEndianParser = require('./fr/FRMonthNameLittleEndianParser').Parser;\nexports.FRSlashDateFormatParser = require('./fr/FRSlashDateFormatParser').Parser;\nexports.FRTimeAgoFormatParser = require('./fr/FRTimeAgoFormatParser').Parser;\nexports.FRTimeExpressionParser = require('./fr/FRTimeExpressionParser').Parser;\nexports.FRWeekdayParser = require('./fr/FRWeekdayParser').Parser;\nexports.FRRelativeDateFormatParser = require('./fr/FRRelativeDateFormatParser').Parser;\n\nexports.ZHHantDateParser = require('./zh-Hant/ZHHantDateParser').Parser;\nexports.ZHHantWeekdayParser = require('./zh-Hant/ZHHantWeekdayParser').Parser;\nexports.ZHHantTimeExpressionParser = require('./zh-Hant/ZHHantTimeExpressionParser').Parser;\nexports.ZHHantCasualDateParser = require('./zh-Hant/ZHHantCasualDateParser').Parser;\nexports.ZHHantDeadlineFormatParser = require('./zh-Hant/ZHHantDeadlineFormatParser').Parser;\n\nexports.DEDeadlineFormatParser = require('./de/DEDeadlineFormatParser').Parser;\nexports.DEMonthNameLittleEndianParser = require('./de/DEMonthNameLittleEndianParser').Parser;\nexports.DEMonthNameParser = require('./de/DEMonthNameParser').Parser;\nexports.DESlashDateFormatParser = require('./de/DESlashDateFormatParser').Parser;\nexports.DETimeAgoFormatParser = require('./de/DETimeAgoFormatParser').Parser;\nexports.DETimeExpressionParser = require('./de/DETimeExpressionParser').Parser;\nexports.DEWeekdayParser = require('./de/DEWeekdayParser').Parser;\nexports.DECasualDateParser = require('./de/DECasualDateParser').Parser;\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar PATTERN = new RegExp(\n    '(而家|立(?:刻|即)|即刻)|' +\n    '(今|明|前|大前|後|大後|聽|昨|尋|琴)(早|朝|晚)|' +\n    '(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨))|' +\n    '(今|明|前|大前|後|大後|聽|昨|尋|琴)(?:日|天)' +\n    '(?:[\\\\s|,|,]*)' +\n    '(?:(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨)))?', 'i');\n\nvar NOW_GROUP = 1;\nvar DAY_GROUP_1 = 2;\nvar TIME_GROUP_1 = 3;\nvar TIME_GROUP_2 = 4;\nvar DAY_GROUP_3 = 5;\nvar TIME_GROUP_3 = 6;\n\nexports.Parser = function ZHHantCasualDateParser() {\n\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt) {\n        text = match[0];\n        var index = match.index;\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref,\n        });\n\n        var refMoment = moment(ref);\n        var startMoment = refMoment.clone();\n\n        if (match[NOW_GROUP]) {\n            result.start.imply('hour', refMoment.hour());\n            result.start.imply('minute', refMoment.minute());\n            result.start.imply('second', refMoment.second());\n            result.start.imply('millisecond', refMoment.millisecond());\n        } else if (match[DAY_GROUP_1]) {\n            var day1 = match[DAY_GROUP_1];\n            var time1 = match[TIME_GROUP_1];\n\n            if (day1 == '明' || day1 == '聽') {\n              // Check not \"Tomorrow\" on late night\n              if(refMoment.hour() > 1) {\n                  startMoment.add(1, 'day');\n              }\n            } else if (day1 == '昨' || day1 == '尋' || day1 == '琴') {\n                startMoment.add(-1, 'day');\n            } else if (day1 == \"前\"){\n                startMoment.add(-2, 'day');\n            } else if (day1 == \"大前\"){\n                startMoment.add(-3, 'day');\n            } else if ( day1 == \"後\"){\n                startMoment.add(2, 'day');\n            } else if (day1 == \"大後\"){\n                startMoment.add(3, 'day');\n            }\n\n            if (time1 == '早' || time1 == '朝') {\n                result.start.imply('hour', 6);\n            } else if (time1 == '晚') {\n                result.start.imply('hour', 22);\n                result.start.imply('meridiem', 1);\n            }\n\n        } else if (match[TIME_GROUP_2]) {\n            var timeString2 = match[TIME_GROUP_2];\n            var time2 = timeString2[0];\n            if (time2 == '早' || time2 == '朝' || time2 == '上') {\n                result.start.imply('hour', 6);\n            } else if (time2 == '下' || time2 == '晏') {\n                result.start.imply('hour', 15);\n                result.start.imply('meridiem', 1);\n            } else if (time2 == '中') {\n                result.start.imply('hour', 12);\n                result.start.imply('meridiem', 1);\n            } else if (time2 == '夜' || time2 == '晚') {\n                result.start.imply('hour', 22);\n                result.start.imply('meridiem', 1);\n            } else if (time2 == '凌') {\n                result.start.imply('hour', 0);\n            }\n\n        } else if (match[DAY_GROUP_3]) {\n            var day3 = match[DAY_GROUP_3];\n\n            if (day3 == '明' || day3 == '聽') {\n              // Check not \"Tomorrow\" on late night\n              if(refMoment.hour() > 1) {\n                  startMoment.add(1, 'day');\n              }\n            } else if (day3 == '昨' || day3 == '尋' || day3 == '琴') {\n                startMoment.add(-1, 'day');\n            } else if (day3 == \"前\"){\n                startMoment.add(-2, 'day');\n            } else if (day3 == \"大前\"){\n                startMoment.add(-3, 'day');\n            } else if (day3 == \"後\"){\n                startMoment.add(2, 'day');\n            } else if (day3 == \"大後\"){\n                startMoment.add(3, 'day');\n            }\n\n\n            var timeString3 = match[TIME_GROUP_3];\n            if (timeString3) {\n                var time3 = timeString3[0];\n                if (time3 == '早' || time3 == '朝' || time3 == '上') {\n                    result.start.imply('hour', 6);\n                } else if (time3 == '下' || time3 == '晏') {\n                    result.start.imply('hour', 15);\n                    result.start.imply('meridiem', 1);\n                } else if (time3 == '中') {\n                    result.start.imply('hour', 12);\n                    result.start.imply('meridiem', 1);\n                } else if (time3 == '夜' || time3 == '晚') {\n                    result.start.imply('hour', 22);\n                    result.start.imply('meridiem', 1);\n                } else if (time3 == '凌') {\n                    result.start.imply('hour', 0);\n                }\n            }\n        }\n\n        result.start.assign('day', startMoment.date())\n        result.start.assign('month', startMoment.month() + 1)\n        result.start.assign('year', startMoment.year())\n        result.tags.ZHHantCasualDateParser = true;\n        return result;\n    };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar util = require('../../utils/ZH-Hant.js');\n\nvar PATTERN = new RegExp(\n    '(\\\\d{2,4}|[' + Object.keys(util.NUMBER).join('') + ']{2,4})?' +\n    '(?:\\\\s*)' +\n    '(?:年)?' +\n    '(?:[\\\\s|,|,]*)' +\n    '(\\\\d{1,2}|[' + Object.keys(util.NUMBER).join('') + ']{1,2})' +\n    '(?:\\\\s*)' +\n    '(?:月)' +\n    '(?:\\\\s*)' +\n    '(\\\\d{1,2}|[' + Object.keys(util.NUMBER).join('') + ']{1,2})?' +\n    '(?:\\\\s*)' +\n    '(?:日|號)?'\n);\n\nvar YEAR_GROUP = 1;\nvar MONTH_GROUP = 2;\nvar DAY_GROUP = 3;\n\nexports.Parser = function ZHHantDateParser() {\n\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt) {\n        var startMoment = moment(ref);\n        var result = new ParsedResult({\n            text: match[0],\n            index: match.index,\n            ref: ref,\n        });\n\n        //Month\n        var month = parseInt(match[MONTH_GROUP]);\n        if (isNaN(month)) month = util.zhStringToNumber(match[MONTH_GROUP]);\n        result.start.assign('month', month);\n\n        //Day\n        if (match[DAY_GROUP]) {\n            var day = parseInt(match[DAY_GROUP]);\n            if (isNaN(day)) day = util.zhStringToNumber(match[DAY_GROUP]);\n            result.start.assign('day', day);\n        } else {\n            result.start.imply('day', startMoment.date());\n        }\n\n        //Year\n        if (match[YEAR_GROUP]) {\n            var year = parseInt(match[YEAR_GROUP]);\n            if (isNaN(year)) year = util.zhStringToYear(match[YEAR_GROUP]);\n            result.start.assign('year', year);\n        } else {\n            result.start.imply('year', startMoment.year());\n        }\n\n        result.tags.ZHHantDateParser = true;\n        return result;\n    };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\n\nvar util = require('../../utils/ZH-Hant.js');\n\nvar PATTERN = new RegExp(\n    '(\\\\d+|[' + Object.keys(util.NUMBER).join('') + ']+|半|幾)(?:\\\\s*)' +\n    '(?:個)?' +\n    '(秒(?:鐘)?|分鐘|小時|鐘|日|天|星期|禮拜|月|年)' +\n    '(?:(?:之|過)?後|(?:之)?內)', 'i'\n);\n\nvar NUMBER_GROUP = 1;\nvar UNIT_GROUP = 2;\n\nexports.Parser = function ZHHantCasualDateParser() {\n\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt) {\n      var index = match.index;\n      text  = match[0];\n\n      var result = new ParsedResult({\n          index: index,\n          text: text,\n          ref: ref\n      });\n\n      var number = parseInt(match[NUMBER_GROUP]);\n      if (isNaN(number)){\n        number = util.zhStringToNumber(match[NUMBER_GROUP]);\n      }\n\n      if (isNaN(number)){\n        var string = match[NUMBER_GROUP];\n        if (string === '幾'){\n          number = 3;\n        }else if(string === '半'){\n          number = 0.5;\n        }else{\n\n          //just in case\n          return null;\n        }\n      }\n\n      var date = moment(ref);\n      var unit = match[UNIT_GROUP];\n      var unitAbbr = unit[0];\n\n      if (unitAbbr.match(/[日天星禮月年]/)){\n        if(unitAbbr == '日' || unitAbbr == '天'){\n          date.add(number, 'd');\n        }else if(unitAbbr == '星' || unitAbbr == '禮'){\n          date.add(number * 7, 'd');\n        }else if(unitAbbr == '月'){\n          date.add(number, 'month');\n        }else if(unitAbbr == '年'){\n          date.add(number, 'year');\n        }\n\n        result.start.assign('year', date.year());\n        result.start.assign('month', date.month() + 1);\n        result.start.assign('day', date.date());\n        return result;\n      }\n\n      if(unitAbbr == '秒'){\n        date.add(number, 'second');\n      }else if(unitAbbr == '分'){\n        date.add(number, 'minute');\n      }else if(unitAbbr == '小' || unitAbbr == '鐘'){\n        date.add(number, 'hour');\n      }\n\n      result.start.imply('year', date.year());\n      result.start.imply('month', date.month() + 1);\n      result.start.imply('day', date.date());\n      result.start.assign('hour', date.hour());\n      result.start.assign('minute', date.minute());\n      result.start.assign('second', date.second());\n      result.tags.ZHHantDeadlineFormatParser = true;\n      return result;\n    };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar ParsedComponents = require('../../result').ParsedComponents;\n\nvar util = require('../../utils/ZH-Hant.js');\n\nvar patternString1 = '(?:由|從|自)?' +\n    '(?:' +\n    '(今|明|前|大前|後|大後|聽|昨|尋|琴)(早|朝|晚)|' +\n    '(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨))|' +\n    '(今|明|前|大前|後|大後|聽|昨|尋|琴)(?:日|天)' +\n    '(?:[\\\\s,,]*)' +\n    '(?:(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨)))?' +\n    ')?' +\n    '(?:[\\\\s,,]*)' +\n    '(?:(\\\\d+|[' + Object.keys(util.NUMBER).join('') + ']+)(?:\\\\s*)(?:點|時|:|:)' +\n    '(?:\\\\s*)' +\n    '(\\\\d+|半|正|整|[' + Object.keys(util.NUMBER).join('') + ']+)?(?:\\\\s*)(?:分|:|:)?' +\n    '(?:\\\\s*)' +\n    '(\\\\d+|[' + Object.keys(util.NUMBER).join('') + ']+)?(?:\\\\s*)(?:秒)?)' +\n    '(?:\\\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?';\n\nvar patternString2 = '(?:\\\\s*(?:到|至|\\\\-|\\\\–|\\\\~|\\\\〜)\\\\s*)' +\n    '(?:' +\n    '(今|明|前|大前|後|大後|聽|昨|尋|琴)(早|朝|晚)|' +\n    '(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨))|' +\n    '(今|明|前|大前|後|大後|聽|昨|尋|琴)(?:日|天)' +\n    '(?:[\\\\s,,]*)' +\n    '(?:(上(?:午|晝)|朝(?:早)|早(?:上)|下(?:午|晝)|晏(?:晝)|晚(?:上)|夜(?:晚)?|中(?:午)|凌(?:晨)))?' +\n    ')?' +\n    '(?:[\\\\s,,]*)' +\n    '(?:(\\\\d+|[' + Object.keys(util.NUMBER).join('') + ']+)(?:\\\\s*)(?:點|時|:|:)' +\n    '(?:\\\\s*)' +\n    '(\\\\d+|半|正|整|[' + Object.keys(util.NUMBER).join('') + ']+)?(?:\\\\s*)(?:分|:|:)?' +\n    '(?:\\\\s*)' +\n    '(\\\\d+|[' + Object.keys(util.NUMBER).join('') + ']+)?(?:\\\\s*)(?:秒)?)' +\n    '(?:\\\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?';\n\nvar FIRST_REG_PATTERN = new RegExp(patternString1, 'i');\nvar SECOND_REG_PATTERN = new RegExp(patternString2, 'i');\n\nvar DAY_GROUP_1 = 1;\nvar ZH_AM_PM_HOUR_GROUP_1 = 2;\nvar ZH_AM_PM_HOUR_GROUP_2 = 3;\nvar DAY_GROUP_3 = 4;\nvar ZH_AM_PM_HOUR_GROUP_3 = 5;\nvar HOUR_GROUP = 6;\nvar MINUTE_GROUP = 7;\nvar SECOND_GROUP = 8;\nvar AM_PM_HOUR_GROUP = 9;\n\nexports.Parser = function ZHHantTimeExpressionParser() {\n\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return FIRST_REG_PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt) {\n\n        // This pattern can be overlaped Ex. [12] AM, 1[2] AM\n        if (match.index > 0 && text[match.index - 1].match(/\\w/)) return null;\n        var refMoment = moment(ref);\n        var result = new ParsedResult();\n        result.ref = ref;\n        result.index = match.index;\n        result.text = match[0];\n        result.tags.ZHTimeExpressionParser = true;\n\n        var startMoment = refMoment.clone();\n\n        // ----- Day\n        if (match[DAY_GROUP_1]) {\n            var day1 = match[DAY_GROUP_1];\n            if (day1 == '明' || day1 == '聽') {\n              // Check not \"Tomorrow\" on late night\n              if(refMoment.hour() > 1) {\n                  startMoment.add(1, 'day');\n              }\n            } else if (day1 == '昨' || day1 == '尋' || day1 == '琴') {\n                startMoment.add(-1, 'day');\n            } else if (day1 == \"前\"){\n                startMoment.add(-2, 'day');\n            } else if (day1 == \"大前\"){\n                startMoment.add(-3, 'day');\n            } else if (day1 == \"後\"){\n                startMoment.add(2, 'day');\n            } else if (day1 == \"大後\"){\n                startMoment.add(3, 'day');\n            }\n            result.start.assign('day', startMoment.date());\n            result.start.assign('month', startMoment.month() + 1);\n            result.start.assign('year', startMoment.year());\n        } else if (match[DAY_GROUP_3]) {\n            var day3 = match[DAY_GROUP_3];\n            if (day3 == '明' || day3 == '聽') {\n                startMoment.add(1, 'day');\n            } else if (day3 == '昨' || day3 == '尋' || day3 == '琴') {\n                startMoment.add(-1, 'day');\n            } else if (day3 == \"前\"){\n                startMoment.add(-2, 'day');\n            } else if (day3 == \"大前\"){\n                startMoment.add(-3, 'day');\n            } else if (day3 == \"後\"){\n                startMoment.add(2, 'day');\n            } else if (day3 == \"大後\"){\n                startMoment.add(3, 'day');\n            }\n            result.start.assign('day', startMoment.date());\n            result.start.assign('month', startMoment.month() + 1);\n            result.start.assign('year', startMoment.year());\n        } else {\n            result.start.imply('day', startMoment.date());\n            result.start.imply('month', startMoment.month() + 1);\n            result.start.imply('year', startMoment.year());\n        }\n\n        var hour = 0;\n        var minute = 0;\n        var meridiem = -1;\n\n        // ----- Second\n        if (match[SECOND_GROUP]) {\n            var second = parseInt(match[SECOND_GROUP]);\n            if (isNaN(second)) {\n                second = util.zhStringToNumber(match[SECOND_GROUP]);\n            }\n            if (second >= 60) return null;\n            result.start.assign('second', second);\n        }\n\n        hour = parseInt(match[HOUR_GROUP]);\n        if (isNaN(hour)) {\n            hour = util.zhStringToNumber(match[HOUR_GROUP]);\n        }\n\n        // ----- Minutes\n        if (match[MINUTE_GROUP]) {\n            if (match[MINUTE_GROUP] == '半') {\n                minute = 30;\n            } else if (match[MINUTE_GROUP] == '正' || match[MINUTE_GROUP] == '整') {\n                minute = 0;\n            } else {\n                minute = parseInt(match[MINUTE_GROUP]);\n                if (isNaN(minute)) {\n                    minute = util.zhStringToNumber(match[MINUTE_GROUP]);\n                }\n            }\n        } else if (hour > 100) {\n            minute = hour % 100;\n            hour = parseInt(hour / 100);\n        }\n\n        if (minute >= 60) {\n            return null;\n        }\n\n        if (hour > 24) {\n            return null;\n        }\n        if (hour >= 12) {\n            meridiem = 1;\n        }\n\n        // ----- AM & PM\n        if (match[AM_PM_HOUR_GROUP]) {\n            if (hour > 12) return null;\n            var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n            if (ampm == \"a\") {\n                meridiem = 0;\n                if (hour == 12) hour = 0;\n            }\n\n            if (ampm == \"p\") {\n                meridiem = 1;\n                if (hour != 12) hour += 12;\n            }\n        } else if (match[ZH_AM_PM_HOUR_GROUP_1]) {\n            var zhAMPMString1 = match[ZH_AM_PM_HOUR_GROUP_1];\n            var zhAMPM1 = zhAMPMString1[0];\n            if (zhAMPM1 == '朝' || zhAMPM1 == '早') {\n                meridiem = 0;\n                if (hour == 12) hour = 0;\n            } else if (zhAMPM1 == '晚') {\n                meridiem = 1;\n                if (hour != 12) hour += 12;\n            }\n        } else if (match[ZH_AM_PM_HOUR_GROUP_2]) {\n            var zhAMPMString2 = match[ZH_AM_PM_HOUR_GROUP_2];\n            var zhAMPM2 = zhAMPMString2[0];\n            if (zhAMPM2 == '上' || zhAMPM2 == '朝' || zhAMPM2 == '早' || zhAMPM2 == '凌') {\n                meridiem = 0;\n                if (hour == 12) hour = 0;\n            } else if (zhAMPM2 == '下' || zhAMPM2 == '晏' || zhAMPM2 == '晚') {\n                meridiem = 1;\n                if (hour != 12) hour += 12;\n            }\n        } else if (match[ZH_AM_PM_HOUR_GROUP_3]) {\n            var zhAMPMString3 = match[ZH_AM_PM_HOUR_GROUP_3];\n            var zhAMPM3 = zhAMPMString3[0];\n            if (zhAMPM3 == '上' || zhAMPM3 == '朝' || zhAMPM3 == '早' || zhAMPM3 == '凌') {\n                meridiem = 0;\n                if (hour == 12) hour = 0;\n            } else if (zhAMPM3 == '下' || zhAMPM3 == '晏' || zhAMPM3 == '晚') {\n                meridiem = 1;\n                if (hour != 12) hour += 12;\n            }\n        }\n\n        result.start.assign('hour', hour);\n        result.start.assign('minute', minute);\n\n        if (meridiem >= 0) {\n            result.start.assign('meridiem', meridiem);\n        } else {\n            if (hour < 12) {\n                result.start.imply('meridiem', 0);\n            } else {\n                result.start.imply('meridiem', 1);\n            }\n        }\n\n        // ==============================================================\n        //                  Extracting the 'to' chunk\n        // ==============================================================\n\n        match = SECOND_REG_PATTERN.exec(text.substring(result.index + result.text.length));\n        if (!match) {\n            // Not accept number only result\n            if (result.text.match(/^\\d+$/)) {\n                return null;\n            }\n            return result;\n        }\n\n        var endMoment = startMoment.clone();\n        result.end = new ParsedComponents(null, null);\n\n        // ----- Day\n        if (match[DAY_GROUP_1]) {\n            var day1 = match[DAY_GROUP_1];\n            if (day1 == '明' || day1 == '聽') {\n              // Check not \"Tomorrow\" on late night\n              if(refMoment.hour() > 1) {\n                  endMoment.add(1, 'day');\n              }\n            } else if (day1 == '昨' || day1 == '尋' || day1 == '琴') {\n                endMoment.add(-1, 'day');\n            } else if (day1 == \"前\"){\n                endMoment.add(-2, 'day');\n            } else if (day1 == \"大前\"){\n                endMoment.add(-3, 'day');\n            } else if (day1 == \"後\"){\n                endMoment.add(2, 'day');\n            } else if (day1 == \"大後\"){\n                endMoment.add(3, 'day');\n            }\n            result.end.assign('day', endMoment.date());\n            result.end.assign('month', endMoment.month() + 1);\n            result.end.assign('year', endMoment.year());\n        } else if (match[DAY_GROUP_3]) {\n            var day3 = match[DAY_GROUP_3];\n            if (day3 == '明' || day3 == '聽') {\n                endMoment.add(1, 'day');\n            } else if (day3 == '昨' || day3 == '尋' || day3 == '琴') {\n                endMoment.add(-1, 'day');\n            } else if (day3 == \"前\"){\n                endMoment.add(-2, 'day');\n            } else if (day3 == \"大前\"){\n                endMoment.add(-3, 'day');\n            } else if (day3 == \"後\"){\n                endMoment.add(2, 'day');\n            } else if (day3 == \"大後\"){\n                endMoment.add(3, 'day');\n            }\n            result.end.assign('day', endMoment.date());\n            result.end.assign('month', endMoment.month() + 1);\n            result.end.assign('year', endMoment.year());\n        } else {\n            result.end.imply('day', endMoment.date());\n            result.end.imply('month', endMoment.month() + 1);\n            result.end.imply('year', endMoment.year());\n        }\n\n        hour = 0;\n        minute = 0;\n        meridiem = -1;\n\n        // ----- Second\n        if (match[SECOND_GROUP]) {\n            var second = parseInt(match[SECOND_GROUP]);\n            if (isNaN(second)) {\n                second = util.zhStringToNumber(match[SECOND_GROUP]);\n            }\n\n            if (second >= 60) return null;\n            result.end.assign('second', second);\n        }\n\n        hour = parseInt(match[HOUR_GROUP]);\n        if (isNaN(hour)) {\n            hour = util.zhStringToNumber(match[HOUR_GROUP]);\n        }\n\n        // ----- Minutes\n        if (match[MINUTE_GROUP]) {\n            if (match[MINUTE_GROUP] == '半') {\n                minute = 30;\n            } else if (match[MINUTE_GROUP] == '正' || match[MINUTE_GROUP] == '整') {\n                minute = 0;\n            } else {\n                minute = parseInt(match[MINUTE_GROUP]);\n                if (isNaN(minute)) {\n                    minute = util.zhStringToNumber(match[MINUTE_GROUP]);\n                }\n            }\n        } else if (hour > 100) {\n            minute = hour % 100;\n            hour = parseInt(hour / 100);\n        }\n\n        if (minute >= 60) {\n            return null;\n        }\n\n        if (hour > 24) {\n            return null;\n        }\n        if (hour >= 12) {\n            meridiem = 1;\n        }\n\n        // ----- AM & PM\n        if (match[AM_PM_HOUR_GROUP]) {\n            if (hour > 12) return null;\n            var ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();\n            if (ampm == \"a\") {\n                meridiem = 0;\n                if (hour == 12) hour = 0;\n            }\n\n            if (ampm == \"p\") {\n                meridiem = 1;\n                if (hour != 12) hour += 12;\n            }\n\n            if (!result.start.isCertain('meridiem')) {\n                if (meridiem == 0) {\n\n                    result.start.imply('meridiem', 0);\n\n                    if (result.start.get('hour') == 12) {\n                        result.start.assign('hour', 0);\n                    }\n\n                } else {\n\n                    result.start.imply('meridiem', 1);\n\n                    if (result.start.get('hour') != 12) {\n                        result.start.assign('hour', result.start.get('hour') + 12);\n                    }\n                }\n            }\n\n        } else if (match[ZH_AM_PM_HOUR_GROUP_1]) {\n            var zhAMPMString1 = match[ZH_AM_PM_HOUR_GROUP_1];\n            var zhAMPM1 = zhAMPMString1[0];\n            if (zhAMPM1 == '朝' || zhAMPM1 == '早') {\n                meridiem = 0;\n                if (hour == 12) hour = 0;\n            } else if (zhAMPM1 == '晚') {\n                meridiem = 1;\n                if (hour != 12) hour += 12;\n            }\n        } else if (match[ZH_AM_PM_HOUR_GROUP_2]) {\n            var zhAMPMString2 = match[ZH_AM_PM_HOUR_GROUP_2];\n            var zhAMPM2 = zhAMPMString2[0];\n            if (zhAMPM2 == '上' || zhAMPM2 == '朝' || zhAMPM2 == '早' || zhAMPM2 == '凌') {\n                meridiem = 0;\n                if (hour == 12) hour = 0;\n            } else if (zhAMPM2 == '下' || zhAMPM2 == '晏' || zhAMPM2 == '晚') {\n                meridiem = 1;\n                if (hour != 12) hour += 12;\n            }\n        } else if (match[ZH_AM_PM_HOUR_GROUP_3]) {\n            var zhAMPMString3 = match[ZH_AM_PM_HOUR_GROUP_3];\n            var zhAMPM3 = zhAMPMString3[0];\n            if (zhAMPM3 == '上' || zhAMPM3 == '朝' || zhAMPM3 == '早' || zhAMPM3 == '凌') {\n                meridiem = 0;\n                if (hour == 12) hour = 0;\n            } else if (zhAMPM3 == '下' || zhAMPM3 == '晏' || zhAMPM3 == '晚') {\n                meridiem = 1;\n                if (hour != 12) hour += 12;\n            }\n        }\n\n        result.text = result.text + match[0];\n        result.end.assign('hour', hour);\n        result.end.assign('minute', minute);\n        if (meridiem >= 0) {\n            result.end.assign('meridiem', meridiem);\n        } else {\n            var startAtPM = result.start.isCertain('meridiem') && result.start.get('meridiem') == 1;\n            if (startAtPM && result.start.get('hour') > hour) {\n                // 10pm - 1 (am)\n                result.end.imply('meridiem', 0);\n\n            } else if (hour > 12) {\n                result.end.imply('meridiem', 1);\n            }\n        }\n\n        if (result.end.date().getTime() < result.start.date().getTime()) {\n            result.end.imply('day', result.end.get('day') + 1)\n        }\n\n        return result;\n    };\n};\n","/*\n\n\n*/\n\nvar moment = require('moment');\nvar Parser = require('../parser').Parser;\nvar ParsedResult = require('../../result').ParsedResult;\nvar updateParsedComponent = require('../en/ENWeekdayParser').updateParsedComponent;\n\nvar util = require('../../utils/ZH-Hant.js');\n\nvar PATTERN = new RegExp(\n    '(上|今|下|這|呢)?' +\n    '(?:個)?' +\n    '(?:星期|禮拜)' +\n    '(' + Object.keys(util.WEEKDAY_OFFSET).join('|') + ')'\n);\n\nvar PREFIX_GROUP = 1;\nvar WEEKDAY_GROUP = 2;\n\nexports.Parser = function ZHHantWeekdayParser() {\n\n    Parser.apply(this, arguments);\n\n    this.pattern = function() {\n        return PATTERN;\n    };\n\n    this.extract = function(text, ref, match, opt) {\n        var index = match.index;\n        text = match[0];\n        var result = new ParsedResult({\n            index: index,\n            text: text,\n            ref: ref\n        });\n\n        var dayOfWeek = match[WEEKDAY_GROUP];\n        var offset = util.WEEKDAY_OFFSET[dayOfWeek];\n        if(offset === undefined) return null;\n\n        var modifier = null;\n        var prefix = match[PREFIX_GROUP];\n\n        if(prefix == '上') {\n            modifier = 'last';\n        } else if(prefix == '下') {\n            modifier = 'next';\n        } else if(prefix == '今' || prefix == '這' || prefix == '呢') {\n            modifier = 'this';\n        }\n\n        updateParsedComponent(result, ref, offset, modifier);\n        result.tags['ZHHantWeekdayParser'] = true;\n        return result;\n    };\n};\n","/*\n\n*/\nvar Refiner = require('./refiner').Refiner;\n\n// Map ABBR -> Offset in minute\nvar TIMEZONE_NAME_PATTERN = new RegExp(\"^\\\\s*\\\\(?([A-Z]{2,4})\\\\)?(?=\\\\W|$)\", 'i');\nvar DEFAULT_TIMEZONE_ABBR_MAP = {\n    \"ACDT\":630,\"ACST\":570,\"ADT\":-180,\"AEDT\":660,\"AEST\":600,\"AFT\":270,\"AKDT\":-480,\"AKST\":-540,\"ALMT\":360,\"AMST\":-180,\"AMT\":-240,\"ANAST\":720,\"ANAT\":720,\"AQTT\":300,\"ART\":-180,\"AST\":-240,\"AWDT\":540,\"AWST\":480,\"AZOST\":0,\"AZOT\":-60,\"AZST\":300,\"AZT\":240,\"BNT\":480,\"BOT\":-240,\"BRST\":-120,\"BRT\":-180,\"BST\":60,\"BTT\":360,\"CAST\":480,\"CAT\":120,\"CCT\":390,\"CDT\":-300,\"CEST\":120,\"CET\":60,\"CHADT\":825,\"CHAST\":765,\"CKT\":-600,\"CLST\":-180,\"CLT\":-240,\"COT\":-300,\"CST\":-360,\"CVT\":-60,\"CXT\":420,\"ChST\":600,\"DAVT\":420,\"EASST\":-300,\"EAST\":-360,\"EAT\":180,\"ECT\":-300,\"EDT\":-240,\"EEST\":180,\"EET\":120,\"EGST\":0,\"EGT\":-60,\"EST\":-300,\"ET\":-300,\"FJST\":780,\"FJT\":720,\"FKST\":-180,\"FKT\":-240,\"FNT\":-120,\"GALT\":-360,\"GAMT\":-540,\"GET\":240,\"GFT\":-180,\"GILT\":720,\"GMT\":0,\"GST\":240,\"GYT\":-240,\"HAA\":-180,\"HAC\":-300,\"HADT\":-540,\"HAE\":-240,\"HAP\":-420,\"HAR\":-360,\"HAST\":-600,\"HAT\":-90,\"HAY\":-480,\"HKT\":480,\"HLV\":-210,\"HNA\":-240,\"HNC\":-360,\"HNE\":-300,\"HNP\":-480,\"HNR\":-420,\"HNT\":-150,\"HNY\":-540,\"HOVT\":420,\"ICT\":420,\"IDT\":180,\"IOT\":360,\"IRDT\":270,\"IRKST\":540,\"IRKT\":540,\"IRST\":210,\"IST\":330,\"JST\":540,\"KGT\":360,\"KRAST\":480,\"KRAT\":480,\"KST\":540,\"KUYT\":240,\"LHDT\":660,\"LHST\":630,\"LINT\":840,\"MAGST\":720,\"MAGT\":720,\"MART\":-510,\"MAWT\":300,\"MDT\":-360,\"MESZ\":120,\"MEZ\":60,\"MHT\":720,\"MMT\":390,\"MSD\":240,\"MSK\":240,\"MST\":-420,\"MUT\":240,\"MVT\":300,\"MYT\":480,\"NCT\":660,\"NDT\":-90,\"NFT\":690,\"NOVST\":420,\"NOVT\":360,\"NPT\":345,\"NST\":-150,\"NUT\":-660,\"NZDT\":780,\"NZST\":720,\"OMSST\":420,\"OMST\":420,\"PDT\":-420,\"PET\":-300,\"PETST\":720,\"PETT\":720,\"PGT\":600,\"PHOT\":780,\"PHT\":480,\"PKT\":300,\"PMDT\":-120,\"PMST\":-180,\"PONT\":660,\"PST\":-480,\"PT\":-480,\"PWT\":540,\"PYST\":-180,\"PYT\":-240,\"RET\":240,\"SAMT\":240,\"SAST\":120,\"SBT\":660,\"SCT\":240,\"SGT\":480,\"SRT\":-180,\"SST\":-660,\"TAHT\":-600,\"TFT\":300,\"TJT\":300,\"TKT\":780,\"TLT\":540,\"TMT\":300,\"TVT\":720,\"ULAT\":480,\"UTC\":0,\"UYST\":-120,\"UYT\":-180,\"UZT\":300,\"VET\":-210,\"VLAST\":660,\"VLAT\":660,\"VUT\":660,\"WAST\":120,\"WAT\":60,\"WEST\":60,\"WESZ\":60,\"WET\":0,\"WEZ\":0,\"WFT\":720,\"WGST\":-120,\"WGT\":-180,\"WIB\":420,\"WIT\":540,\"WITA\":480,\"WST\":780,\"WT\":0,\"YAKST\":600,\"YAKT\":600,\"YAPT\":600,\"YEKST\":360,\"YEKT\":360\n};\n\nexports.Refiner = function ExtractTimezoneAbbrRefiner(config) {\n\tRefiner.call(this, arguments);\n\n\tthis.refine = function(text, results, opt) {\n\n\t    var timezones = new Object(DEFAULT_TIMEZONE_ABBR_MAP);\n\t    if (opt.timezones) {\n\t        for (var name in opt.timezones) {\n                timezones[name] = opt.timezones[name];\n            }\n        }\n\n\t\tresults.forEach(function(result) {\n\n            if (!result.tags['ENTimeExpressionParser'] &&\n                !result.tags['ZHTimeExpressionParser'] &&\n                !result.tags['FRTimeExpressionParser'] &&\n                !result.tags['DETimeExpressionParser']) {\n                return;\n            }\n\n            var match = TIMEZONE_NAME_PATTERN.exec(text.substring(result.index + result.text.length));\n            if (match) {\n                var timezoneAbbr = match[1].toUpperCase();\n                if (timezones[timezoneAbbr] === undefined) {\n                    return;\n                }\n\n                var timezoneOffset = timezones[timezoneAbbr];\n                if (!result.start.isCertain('timezoneOffset')) {\n                    result.start.assign('timezoneOffset', timezoneOffset);\n                }\n\n                if (result.end != null && !result.end.isCertain('timezoneOffset')) {\n                    result.end.assign('timezoneOffset', timezoneOffset);\n                }\n\n                result.text += match[0];\n                result.tags['ExtractTimezoneAbbrRefiner'] = true;\n            }\n\t\t});\n\n        return results;\n\t}\n};","/*\n  \n*/\nvar Refiner = require('./refiner').Refiner;\n\n\nvar TIMEZONE_OFFSET_PATTERN = new RegExp(\"^\\\\s*(GMT|UTC)?(\\\\+|\\\\-)(\\\\d{1,2}):?(\\\\d{2})\", 'i');\nvar TIMEZONE_OFFSET_SIGN_GROUP = 2;\nvar TIMEZONE_OFFSET_HOUR_OFFSET_GROUP = 3;\nvar TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP = 4;\n\nexports.Refiner = function ExtractTimezoneOffsetRefiner() {\n    Refiner.call(this);\n\n    this.refine = function(text, results, opt) {\n\n        results.forEach(function(result) {\n\n            if (result.start.isCertain('timezoneOffset')) {\n                return;\n            }\n\n            var match = TIMEZONE_OFFSET_PATTERN.exec(text.substring(result.index + result.text.length));\n            if (!match) {\n                return;\n            }\n\n            var hourOffset = parseInt(match[TIMEZONE_OFFSET_HOUR_OFFSET_GROUP]);\n            var minuteOffset = parseInt(match[TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP]);\n            var timezoneOffset = hourOffset * 60 + minuteOffset;\n            if (match[TIMEZONE_OFFSET_SIGN_GROUP] === '-') {\n                timezoneOffset = -timezoneOffset;\n            }\n\n            if (result.end != null) {\n                result.end.assign('timezoneOffset', timezoneOffset);\n            }\n\n            result.start.assign('timezoneOffset', timezoneOffset);\n            result.text += match[0];\n            result.tags['ExtractTimezoneOffsetRefiner'] = true;\n        });\n\n        return results;\n    }\n}\n","/*\n    Enforce 'forwardDate' option to on the results. When there are missing component,\n    e.g. \"March 12-13 (without year)\" or \"Thursday\", the refiner will try to adjust the result\n    into the future instead of the past.\n*/\nvar moment = require('moment');\nvar Refiner = require('./refiner').Refiner;\n\nexports.Refiner = function ForwardDateRefiner() {\n    Refiner.call(this);\n\n    this.refine = function(text, results, opt) {\n\n        if (!opt['forwardDate']) {\n            return results;\n        }\n\n        results.forEach(function(result) {\n\n            var refMoment = moment(result.ref);\n\n            if (result.start.isCertain('day') && result.start.isCertain('month') &&\n                !result.start.isCertain('year') &&\n                refMoment.isAfter(result.start.moment())\n            ) {\n                // Adjust year into the future\n                for (var i=0; i < 3 && refMoment.isAfter(result.start.moment()); i++) {\n                    result.start.imply('year', result.start.get('year') + 1);\n\n                    if (result.end && !result.end.isCertain('year')) {\n                        result.end.imply('year', result.end.get('year') + 1);\n                    }\n                }\n\n                result.tags['ExtractTimezoneOffsetRefiner'] = true;\n            }\n\n            if (!result.start.isCertain('day') && !result.start.isCertain('month') && !result.start.isCertain('year') &&\n                result.start.isCertain('weekday') &&\n                refMoment.isAfter(result.start.moment())\n            ) {\n                // Adjust date to the coming week\n                if (refMoment.day() > result.start.get('weekday')) {\n                    refMoment.day(result.start.get('weekday') + 7);\n                } else {\n                    refMoment.day(result.start.get('weekday'));\n                }\n\n                result.start.imply('day', refMoment.date());\n                result.start.imply('month', refMoment.month() + 1);\n                result.start.imply('year', refMoment.year());\n                result.tags['ExtractTimezoneOffsetRefiner'] = true;\n            }\n        });\n\n        return results;\n    }\n};\n","/*\n  \n*/\nvar Refiner = require('./refiner').Refiner;\n\nexports.Refiner = function OverlapRemovalRefiner() {\n\tRefiner.call(this);\n\t\n\n\tthis.refine = function(text, results, opt) { \n\n        if (results.length < 2) return results;\n        \n        var filteredResults = [];\n        var prevResult = results[0];\n        \n        for (var i=1; i<results.length; i++){\n            \n            var result = results[i];\n            \n            // If overlap, compare the length and discard the shorter one\n            if (result.index < prevResult.index + prevResult.text.length) {\n\n                if (result.text.length > prevResult.text.length){\n                    prevResult = result;\n                }\n                \n            } else {\n                filteredResults.push(prevResult);\n                prevResult = result;\n            }\n        }\n        \n        // The last one\n        if (prevResult != null) {\n            filteredResults.push(prevResult);\n        }\n\n        return filteredResults;\n    }\n}","/*\n  \n*/\nvar Filter = require('./refiner').Filter;\n\nexports.Refiner = function UnlikelyFormatFilter() {\n    Filter.call(this);\n    \n\n    this.isValid = function(text, result, opt) { \n\n        if (result.text.replace(' ','').match(/^\\d*(\\.\\d*)?$/)) {\n            return false;\n        }\n\n        return true; \n    }\n}","/*\n  \n*/\nvar ENMergeDateRangeRefiner = require('../en/ENMergeDateRangeRefiner').Refiner;\n\nexports.Refiner = function DEMergeDateRangeRefiner() {\n    ENMergeDateRangeRefiner.call(this);\n\n    this.pattern = function () {\n        return /^\\s*(bis(?:\\s*(?:am|zum))?|\\-)\\s*$/i\n    };\n};\n","/*\n    \n*/\nvar ParsedComponents = require('../../result').ParsedComponents;\nvar Refiner = require('../refiner').Refiner;\n\nvar mergeDateTimeComponent = require('../en/ENMergeDateTimeRefiner').mergeDateTimeComponent;\nvar isDateOnly = require('../en/ENMergeDateTimeRefiner').isDateOnly;\nvar isTimeOnly = require('../en/ENMergeDateTimeRefiner').isTimeOnly;\n\nvar PATTERN = new RegExp(\"^\\\\s*(T|um|am|,|-)?\\\\s*$\");\n\nfunction isAbleToMerge(text, prevResult, curResult) {\n    var textBetween = text.substring(prevResult.index + prevResult.text.length, curResult.index);\n    return textBetween.match(PATTERN);\n}\n\nfunction mergeResult(text, dateResult, timeResult){\n\n    var beginDate = dateResult.start;\n    var beginTime = timeResult.start;    \n    var beginDateTime = mergeDateTimeComponent(beginDate, beginTime);\n\n    if (dateResult.end != null || timeResult.end != null) {\n        \n        var endDate   = dateResult.end == null ? dateResult.start : dateResult.end;            \n        var endTime   = timeResult.end == null ? timeResult.start : timeResult.end;\n        var endDateTime = mergeDateTimeComponent(endDate, endTime);\n        \n        if (dateResult.end == null && endDateTime.date().getTime() < beginDateTime.date().getTime()) {\n            // Ex. 9pm - 1am\n            if (endDateTime.isCertain('day')) {\n                endDateTime.assign('day', endDateTime.get('day') + 1);\n            } else {\n                endDateTime.imply('day', endDateTime.get('day') + 1);\n            }\n        }\n\n        dateResult.end = endDateTime;\n    }\n\n    dateResult.start = beginDateTime;    \n\n    var startIndex = Math.min(dateResult.index, timeResult.index);\n    var endIndex = Math.max(\n            dateResult.index + dateResult.text.length, \n            timeResult.index + timeResult.text.length);\n    \n    dateResult.index = startIndex;\n    dateResult.text  = text.substring(startIndex, endIndex);\n\n    for (var tag in timeResult.tags) {\n        dateResult.tags[tag] = true;\n    }\n    dateResult.tags['DEMergeDateAndTimeRefiner'] = true;\n    return dateResult;\n}\n\nexports.Refiner = function DEMergeDateTimeRefiner() {\n    Refiner.call(this);\n\n\n    this.refine = function(text, results, opt) { \n\n        if (results.length < 2) return results;\n\n        var mergedResult = [];\n        var currResult = null;\n        var prevResult = null;\n\n        for (var i = 1; i < results.length; i++) {\n\n            currResult = results[i];\n            prevResult = results[i-1];\n            \n            if (isDateOnly(prevResult) && isTimeOnly(currResult) \n                    && isAbleToMerge(text, prevResult, currResult)) {\n                \n                prevResult = mergeResult(text, prevResult, currResult);\n                currResult = null;\n                i += 1;\n                \n            } else if (isDateOnly(currResult) && isTimeOnly(prevResult)\n                    && isAbleToMerge(text, prevResult, currResult)) {\n                \n                prevResult = mergeResult(text, currResult, prevResult);\n                currResult = null;\n                i += 1;\n            }\n            \n            mergedResult.push(prevResult);\n        }\n\n        if (currResult != null) {\n            mergedResult.push(currResult);\n        }\n\n        return mergedResult;\n    }\n}","/*\n  \n*/\nvar Refiner = require('../refiner').Refiner;\n\nexports.Refiner = function ENMergeDateRangeRefiner() {\n    Refiner.call(this);\n\n    this.pattern = function () { return /^\\s*(to|\\-)\\s*$/i };\n\n    this.refine = function(text, results, opt) {\n\n        if (results.length < 2) return results;\n        \n        var mergedResult = [];\n        var currResult = null;\n        var prevResult = null;\n        \n        for (var i=1; i<results.length; i++){\n            \n            currResult = results[i];\n            prevResult = results[i-1];\n            \n            if (!prevResult.end && !currResult.end \n                && this.isAbleToMerge(text, prevResult, currResult)) {\n              \n                prevResult = this.mergeResult(text, prevResult, currResult);\n                currResult = null;\n                i += 1;\n            }\n            \n            mergedResult.push(prevResult);\n        }\n        \n        if (currResult != null) {\n            mergedResult.push(currResult);\n        }\n\n\n        return mergedResult;\n    };\n\n    this.isAbleToMerge = function(text, result1, result2) {\n        var begin = result1.index + result1.text.length;\n        var end   = result2.index;\n        var textBetween = text.substring(begin,end);\n\n        return textBetween.match(this.pattern());\n    };\n\n    this.isWeekdayResult = function (result) {\n        return result.start.isCertain('weekday') && !result.start.isCertain('day');\n    };\n\n    this.mergeResult = function(text, fromResult, toResult) {\n\n        if (!this.isWeekdayResult(fromResult) && !this.isWeekdayResult(toResult)) {\n            \n            var timeKeys = {'hour': true, 'minute': true, 'second': true};\n\n            for (var key in toResult.start.knownValues) {\n                if (!fromResult.start.isCertain(key)) {\n                    fromResult.start.assign(key, toResult.start.get(key));\n                }\n            }\n\n            for (var key in fromResult.start.knownValues) {\n                if (!toResult.start.isCertain(key)) {\n                    toResult.start.assign(key, fromResult.start.get(key));\n                }\n            }\n        }\n\n        if (fromResult.start.date().getTime() > toResult.start.date().getTime()) {\n            \n            var fromMoment = fromResult.start.moment();\n            var toMoment = toResult.start.moment();\n\n            if (this.isWeekdayResult(fromResult) && fromMoment.clone().add(-7, 'days').isBefore(toMoment)) {\n                fromMoment = fromMoment.add(-7, 'days');\n                fromResult.start.imply('day', fromMoment.date());\n                fromResult.start.imply('month', fromMoment.month() + 1);\n                fromResult.start.imply('year', fromMoment.year());\n            } else if (this.isWeekdayResult(toResult) && toMoment.clone().add(7, 'days').isAfter(fromMoment)) {\n                toMoment = toMoment.add(7, 'days');\n                toResult.start.imply('day', toMoment.date());\n                toResult.start.imply('month', toMoment.month() + 1);\n                toResult.start.imply('year', toMoment.year());\n            } else {\n                var tmp = toResult;\n                toResult = fromResult;\n                fromResult = tmp;\n            }\n        }\n        \n        fromResult.end = toResult.start;\n\n        \n\n        for (var tag in toResult.tags) {\n            fromResult.tags[tag] = true;\n        }\n\n            \n        var startIndex = Math.min(fromResult.index, toResult.index);\n        var endIndex = Math.max(\n            fromResult.index + fromResult.text.length, \n            toResult.index + toResult.text.length);\n            \n        fromResult.index = startIndex;\n        fromResult.text  = text.substring(startIndex, endIndex);\n        fromResult.tags[this.constructor.name] = true;\n        return fromResult;\n    }\n};\n\n","/*\n    \n*/\nvar ParsedComponents = require('../../result').ParsedComponents;\nvar Refiner = require('../refiner').Refiner;\n\nvar PATTERN = new RegExp(\"^\\\\s*(T|at|after|before|on|of|,|-)?\\\\s*$\");\n\nvar isDateOnly = exports.isDateOnly = function(result) {\n    return !result.start.isCertain('hour');\n}\n    \nvar isTimeOnly = exports.isTimeOnly = function(result) {\n    return !result.start.isCertain('month') && !result.start.isCertain('weekday');\n}\n\nvar isAbleToMerge = exports.isAbleToMerge = function(text, prevResult, curResult) {\n    var textBetween = text.substring(prevResult.index + prevResult.text.length, curResult.index);\n    return textBetween.match(PATTERN);\n}\n\nvar mergeDateTimeComponent = exports.mergeDateTimeComponent = function(dateComponent, timeComponent) {\n    var dateTimeComponent = dateComponent.clone();\n\n    if (timeComponent.isCertain('hour')) {\n        dateTimeComponent.assign('hour', timeComponent.get('hour'));\n        dateTimeComponent.assign('minute', timeComponent.get('minute'));\n\n        if (timeComponent.isCertain('second')) {\n            dateTimeComponent.assign('second', timeComponent.get('second'));\n\n            if (timeComponent.isCertain('millisecond')) {\n                dateTimeComponent.assign('millisecond', timeComponent.get('millisecond'));\n            } else {\n                dateTimeComponent.imply('millisecond', timeComponent.get('millisecond'));\n            }\n        } else {\n            dateTimeComponent.imply('second', timeComponent.get('second'));\n            dateTimeComponent.imply('millisecond', timeComponent.get('millisecond'));\n        }\n        \n    } else {\n        dateTimeComponent.imply('hour', timeComponent.get('hour'));\n        dateTimeComponent.imply('minute', timeComponent.get('minute'));\n        dateTimeComponent.imply('second', timeComponent.get('second'));\n        dateTimeComponent.imply('millisecond', timeComponent.get('millisecond'));\n    }\n\n    if (timeComponent.isCertain('meridiem')) {\n        dateTimeComponent.assign('meridiem', timeComponent.get('meridiem'));\n    } else if (\n        timeComponent.get('meridiem') !== undefined &&\n        dateTimeComponent.get('meridiem') === undefined\n    ) {\n        dateTimeComponent.imply('meridiem', timeComponent.get('meridiem'));\n    }\n\n    if (dateTimeComponent.get('meridiem') == 1 && dateTimeComponent.get('hour') < 12) {\n        if (timeComponent.isCertain('hour')) {\n            dateTimeComponent.assign('hour', dateTimeComponent.get('hour') + 12);\n        } else {\n            dateTimeComponent.imply('hour', dateTimeComponent.get('hour') + 12);\n        }\n    }\n\n    return dateTimeComponent;\n}\n\n\nfunction mergeResult(text, dateResult, timeResult){\n\n    var beginDate = dateResult.start;\n    var beginTime = timeResult.start;\n    var beginDateTime = mergeDateTimeComponent(beginDate, beginTime);\n    \n    if (dateResult.end != null || timeResult.end != null) {\n        \n        var endDate   = dateResult.end == null ? dateResult.start : dateResult.end;            \n        var endTime   = timeResult.end == null ? timeResult.start : timeResult.end;\n        var endDateTime = mergeDateTimeComponent(endDate, endTime);\n        \n        if (dateResult.end == null && endDateTime.date().getTime() < beginDateTime.date().getTime()) {\n            // Ex. 9pm - 1am\n            if (endDateTime.isCertain('day')) {\n                endDateTime.assign('day', endDateTime.get('day') + 1);\n            } else {\n                endDateTime.imply('day', endDateTime.get('day') + 1);\n            }\n        }\n\n        dateResult.end = endDateTime;\n    }\n\n    dateResult.start = beginDateTime;    \n\n    var startIndex = Math.min(dateResult.index, timeResult.index);\n    var endIndex = Math.max(\n            dateResult.index + dateResult.text.length, \n            timeResult.index + timeResult.text.length);\n    \n    dateResult.index = startIndex;\n    dateResult.text  = text.substring(startIndex, endIndex);\n\n    for (var tag in timeResult.tags) {\n        dateResult.tags[tag] = true;\n    }\n    dateResult.tags['ENMergeDateAndTimeRefiner'] = true;\n    return dateResult;\n}\n\nexports.Refiner = function ENMergeDateTimeRefiner() {\n    Refiner.call(this);\n\n\n    this.refine = function(text, results, opt) { \n\n        if (results.length < 2) return results;\n\n        var mergedResult = [];\n        var currResult = null;\n        var prevResult = null;\n\n        for (var i = 1; i < results.length; i++) {\n\n            currResult = results[i];\n            prevResult = results[i-1];\n            \n            if (isDateOnly(prevResult) && isTimeOnly(currResult) \n                    && isAbleToMerge(text, prevResult, currResult)) {\n                \n                prevResult = mergeResult(text, prevResult, currResult);\n                currResult = results[i + 1];\n                i += 1;\n                \n            } else if (isDateOnly(currResult) && isTimeOnly(prevResult)\n                    && isAbleToMerge(text, prevResult, currResult)) {\n                \n                prevResult = mergeResult(text, currResult, prevResult);\n                currResult = results[i + 1];\n                i += 1;\n            }\n            \n            mergedResult.push(prevResult);\n        }\n\n        if (currResult != null) {\n            mergedResult.push(currResult);\n        }\n\n        return mergedResult;\n    }\n}","/*\n\n*/\nvar ParsedComponents = require('../../result').ParsedComponents;\nvar Refiner = require('../refiner').Refiner;\n\n\nvar PATTERN = new RegExp(\"^\\\\s*(at|after|before|on|,|-|\\\\(|\\\\))?\\\\s*$\");\n\nfunction isMoreSpecific(prevResult, currResult) {\n    var moreSpecific = false;\n\n    if (prevResult.start.isCertain('year')) {\n        if (!currResult.start.isCertain('year')) {\n            moreSpecific = true;\n        } else {\n            if (prevResult.start.isCertain('month')) {\n                if (!currResult.start.isCertain('month')) {\n                    moreSpecific = true;\n                } else {\n                    if (prevResult.start.isCertain('day') && !currResult.start.isCertain('day')) {\n                        moreSpecific = true;\n                    }\n                }\n            }\n        }\n    }\n\n    return moreSpecific;\n}\n\n\nfunction isAbleToMerge(text, prevResult, currResult) {\n    var textBetween = text.substring(prevResult.index + prevResult.text.length, currResult.index);\n\n    // Only accepts merge if one of them comes from casual relative date\n    var includesRelativeResult = (prevResult.tags['ENRelativeDateFormatParser'] || currResult.tags['ENRelativeDateFormatParser']);\n\n    // We assume they refer to the same date if all date fields are implied\n    var referToSameDate = !prevResult.start.isCertain('day') && !prevResult.start.isCertain('month') && !prevResult.start.isCertain('year');\n\n    // If both years are certain, that determines if they refer to the same date\n    // but with one more specific than the other\n    if (prevResult.start.isCertain('year') && currResult.start.isCertain('year'))\n        referToSameDate = (prevResult.start.get('year') === currResult.start.get('year'));\n\n    // We now test with the next level (month) if they refer to the same date\n    if (prevResult.start.isCertain('month') && currResult.start.isCertain('month'))\n        referToSameDate = (prevResult.start.get('month') === currResult.start.get('month')) && referToSameDate;\n\n    return includesRelativeResult && textBetween.match(PATTERN) && referToSameDate;\n}\n\nfunction mergeResult(text, specificResult, nonSpecificResult){\n\n    var specificDate = specificResult.start;\n    var nonSpecificDate = nonSpecificResult.start;\n\n    var startIndex = Math.min(specificResult.index, nonSpecificResult.index);\n    var endIndex = Math.max(\n            specificResult.index + specificResult.text.length,\n            nonSpecificResult.index + nonSpecificResult.text.length);\n\n    specificResult.index = startIndex;\n    specificResult.text  = text.substring(startIndex, endIndex);\n\n    for (var tag in nonSpecificResult.tags) {\n        specificResult.tags[tag] = true;\n    }\n    specificResult.tags['ENPrioritizeSpecificDateRefiner'] = true;\n    return specificResult;\n}\n\nexports.Refiner = function ENPrioritizeSpecificDateRefiner() {\n    Refiner.call(this);\n\n    this.refine = function(text, results, opt) {\n\n        if (results.length < 2) return results;\n\n        var mergedResult = [];\n        var currResult = null;\n        var prevResult = null;\n\n        for (var i = 1; i < results.length; i++) {\n\n            currResult = results[i];\n            prevResult = results[i-1];\n\n            if (isMoreSpecific(prevResult, currResult)\n                    && isAbleToMerge(text, prevResult, currResult)) {\n\n                prevResult = mergeResult(text, prevResult, currResult);\n                currResult = null;\n                i += 1;\n\n            } else if (isMoreSpecific(currResult, prevResult)\n                    && isAbleToMerge(text, prevResult, currResult)) {\n\n                prevResult = mergeResult(text, currResult, prevResult);\n                currResult = null;\n                i += 1;\n            }\n\n            mergedResult.push(prevResult);\n        }\n\n        if (currResult != null) {\n            mergedResult.push(currResult);\n        }\n\n        return mergedResult;\n    }\n}\n","/*\r\n  \r\n*/\r\nvar Refiner = require('../refiner').Refiner;\r\n\r\nexports.Refiner = function FRMergeDateRangeRefiner() {\r\n    Refiner.call(this);\r\n\r\n    this.pattern = function () { return /^\\s*(à|a|\\-)\\s*$/i };\r\n\r\n    this.refine = function(text, results, opt) {\r\n\r\n        if (results.length < 2) return results;\r\n        \r\n        var mergedResult = [];\r\n        var currResult = null;\r\n        var prevResult = null;\r\n        \r\n        for (var i=1; i<results.length; i++){\r\n            \r\n            currResult = results[i];\r\n            prevResult = results[i-1];\r\n            \r\n            if (!prevResult.end && !currResult.end \r\n                && this.isAbleToMerge(text, prevResult, currResult)) {\r\n              \r\n                prevResult = this.mergeResult(text, prevResult, currResult);\r\n                currResult = null;\r\n                i += 1;\r\n            }\r\n            \r\n            mergedResult.push(prevResult);\r\n        }\r\n        \r\n        if (currResult != null) {\r\n            mergedResult.push(currResult);\r\n        }\r\n\r\n\r\n        return mergedResult;\r\n    };\r\n\r\n    this.isAbleToMerge = function(text, result1, result2) {\r\n        var begin = result1.index + result1.text.length;\r\n        var end   = result2.index;\r\n        var textBetween = text.substring(begin,end);\r\n\r\n        return textBetween.match(this.pattern());\r\n    };\r\n\r\n    this.isWeekdayResult = function (result) {\r\n        return result.start.isCertain('weekday') && !result.start.isCertain('day');\r\n    };\r\n\r\n    this.mergeResult = function(text, fromResult, toResult) {\r\n\r\n        if (!this.isWeekdayResult(fromResult) && !this.isWeekdayResult(toResult)) {\r\n\r\n            for (var key in toResult.start.knownValues) {\r\n                if (!fromResult.start.isCertain(key)) {\r\n                    fromResult.start.assign(key, toResult.start.get(key));\r\n                }\r\n            }\r\n\r\n            for (var key in fromResult.start.knownValues) {\r\n                if (!toResult.start.isCertain(key)) {\r\n                    toResult.start.assign(key, fromResult.start.get(key));\r\n                }\r\n            }\r\n        }\r\n\r\n        if (fromResult.start.date().getTime() > toResult.start.date()) {\r\n            var tmp = toResult;\r\n            toResult = fromResult;\r\n            fromResult = tmp;\r\n        }\r\n        \r\n        fromResult.end = toResult.start;\r\n\r\n        \r\n\r\n        for (var tag in toResult.tags) {\r\n            fromResult.tags[tag] = true;\r\n        }\r\n\r\n            \r\n        var startIndex = Math.min(fromResult.index, toResult.index);\r\n        var endIndex = Math.max(\r\n            fromResult.index + fromResult.text.length, \r\n            toResult.index + toResult.text.length);\r\n            \r\n        fromResult.index = startIndex;\r\n        fromResult.text  = text.substring(startIndex, endIndex);\r\n        fromResult.tags[this.constructor.name] = true;\r\n        return fromResult;\r\n    }\r\n};\r\n\r\n","/*\r\n    \r\n*/\r\nvar ParsedComponents = require('../../result').ParsedComponents;\r\nvar Refiner = require('../refiner').Refiner;\r\nvar mergeDateTimeComponent = require('../en/ENMergeDateTimeRefiner').mergeDateTimeComponent;\r\n\r\nvar PATTERN = new RegExp(\"^\\\\s*(T|à|a|vers|de|,|-)?\\\\s*$\");\r\n\r\nfunction isDateOnly(result) {\r\n    return !result.start.isCertain('hour') || result.tags['FRCasualDateParser'];\r\n}\r\n    \r\nfunction isTimeOnly(result) {\r\n    return !result.start.isCertain('month') && !result.start.isCertain('weekday');\r\n}\r\n\r\n\r\nfunction isAbleToMerge(text, prevResult, curResult) {\r\n    var textBetween = text.substring(prevResult.index + prevResult.text.length, curResult.index);\r\n    return textBetween.match(PATTERN);\r\n}\r\n\r\nfunction mergeResult(text, dateResult, timeResult){\r\n\r\n    var beginDate = dateResult.start;\r\n    var beginTime = timeResult.start;\r\n    var beginDateTime = mergeDateTimeComponent(beginDate, beginTime);\r\n\r\n    if (dateResult.end != null || timeResult.end != null) {\r\n        \r\n        var endDate   = dateResult.end == null ? dateResult.start : dateResult.end;            \r\n        var endTime   = timeResult.end == null ? timeResult.start : timeResult.end;\r\n        var endDateTime = mergeDateTimeComponent(endDate, endTime);\r\n        \r\n        if (dateResult.end == null && endDateTime.date().getTime() < beginDateTime.date().getTime()) {\r\n            // Ex. 9pm - 1am\r\n            if (endDateTime.isCertain('day')) {\r\n                endDateTime.assign('day', endDateTime.get('day') + 1);\r\n            } else {\r\n                endDateTime.imply('day', endDateTime.get('day') + 1);\r\n            }\r\n        }\r\n\r\n        dateResult.end = endDateTime;\r\n    }\r\n\r\n    dateResult.start = beginDateTime;    \r\n\r\n    var startIndex = Math.min(dateResult.index, timeResult.index);\r\n    var endIndex = Math.max(\r\n            dateResult.index + dateResult.text.length, \r\n            timeResult.index + timeResult.text.length);\r\n    \r\n    dateResult.index = startIndex;\r\n    dateResult.text  = text.substring(startIndex, endIndex);\r\n\r\n    for (var tag in timeResult.tags) {\r\n        dateResult.tags[tag] = true;\r\n    }\r\n    dateResult.tags['FRMergeDateAndTimeRefiner'] = true;\r\n    return dateResult;\r\n}\r\n\r\nexports.Refiner = function FRMergeDateTimeRefiner() {\r\n    Refiner.call(this);\r\n\r\n\r\n    this.refine = function(text, results, opt) { \r\n\r\n        if (results.length < 2) return results;\r\n\r\n        var mergedResult = [];\r\n        var currResult = null;\r\n        var prevResult = null;\r\n\r\n        for (var i = 1; i < results.length; i++) {\r\n\r\n            currResult = results[i];\r\n            prevResult = results[i-1];\r\n            \r\n            if (isDateOnly(prevResult) && isTimeOnly(currResult) \r\n                    && isAbleToMerge(text, prevResult, currResult)) {\r\n                \r\n                prevResult = mergeResult(text, prevResult, currResult);\r\n                currResult = null;\r\n                i += 1;\r\n                \r\n            } else if (isDateOnly(currResult) && isTimeOnly(prevResult)\r\n                    && isAbleToMerge(text, prevResult, currResult)) {\r\n                \r\n                prevResult = mergeResult(text, currResult, prevResult);\r\n                currResult = null;\r\n                i += 1;\r\n            }\r\n            \r\n            mergedResult.push(prevResult);\r\n        }\r\n\r\n        if (currResult != null) {\r\n            mergedResult.push(currResult);\r\n        }\r\n\r\n        return mergedResult;\r\n    }\r\n}","/*\n  \n*/\nvar ENMergeDateRangeRefiner = require('../en/ENMergeDateRangeRefiner').Refiner;\n\nexports.Refiner = function JPMergeDateRangeRefiner() {\n    ENMergeDateRangeRefiner.call(this);\n\n    this.pattern = function () { return /^\\s*(から|ー)\\s*$/i };\n}\n\n","\nexports.Refiner = function Refiner() { \n\n    this.refine = function(text, results, opt) { return results; };\n}\n\nexports.Filter = function Filter() { \n    \n    exports.Refiner.call(this);\n\n    this.isValid = function(text, result, opt) { return true; }\n    this.refine = function(text, results, opt) { \n\n        var filteredResult = [];\n        for (var i=0; i < results.length; i++) {\n\n            var result = results[i];\n            if (this.isValid(text, result, opt)) {\n                filteredResult.push(result);\n            }\n        }\n\n        return filteredResult;\n    }\n}\n\n\n// Common refiners\nexports.OverlapRemovalRefiner = require('./OverlapRemovalRefiner').Refiner;\nexports.ExtractTimezoneOffsetRefiner = require('./ExtractTimezoneOffsetRefiner').Refiner;\nexports.ExtractTimezoneAbbrRefiner = require('./ExtractTimezoneAbbrRefiner').Refiner;\nexports.ForwardDateRefiner = require('./ForwardDateRefiner').Refiner;\nexports.UnlikelyFormatFilter = require('./UnlikelyFormatFilter').Refiner;\n\n// en refiners\nexports.ENMergeDateTimeRefiner = require('./en/ENMergeDateTimeRefiner').Refiner;\nexports.ENMergeDateRangeRefiner = require('./en/ENMergeDateRangeRefiner').Refiner;\nexports.ENPrioritizeSpecificDateRefiner = require('./en/ENPrioritizeSpecificDateRefiner').Refiner;\n\n// ja refiners\nexports.JPMergeDateRangeRefiner = require('./ja/JPMergeDateRangeRefiner').Refiner;\n\n// fr refiners\nexports.FRMergeDateRangeRefiner = require('./fr/FRMergeDateRangeRefiner').Refiner;\nexports.FRMergeDateTimeRefiner = require('./fr/FRMergeDateTimeRefiner').Refiner;\n\n// de refiners\nexports.DEMergeDateRangeRefiner = require('./de/DEMergeDateRangeRefiner').Refiner;\nexports.DEMergeDateTimeRefiner = require('./de/DEMergeDateTimeRefiner').Refiner;\n","var moment = require('moment');\n\nfunction ParsedResult(result){\n    result = result || {};\n\n    this.ref   = result.ref;\n    this.index = result.index;\n    this.text  = result.text;\n    this.tags  = result.tags || {};\n\n    this.start = new ParsedComponents(result.start, result.ref)\n    if(result.end){\n        this.end = new ParsedComponents(result.end, result.ref)\n    }\n}\n\nParsedResult.prototype.clone = function() {\n    var result = new ParsedResult(this);\n    result.tags = JSON.parse(JSON.stringify(this.tags));\n    result.start = this.start.clone();\n    if (this.end) {\n        result.end = this.end.clone();\n    }\n\n    return result\n}\n\nParsedResult.prototype.hasPossibleDates = function() {\n    return this.start.isPossibleDate() && (!this.end || this.end.isPossibleDate());\n}\n\n\nfunction ParsedComponents (components, ref){\n\n    this.knownValues = {};\n    this.impliedValues = {};\n\n    if (components) {\n        for (key in components) {\n            this.knownValues[key] = components[key];\n        }\n    }\n\n    if (ref) {\n        ref = moment(ref);\n        this.imply('day', ref.date())\n        this.imply('month', ref.month() + 1)\n        this.imply('year', ref.year())\n    }\n    \n\n    this.imply('hour', 12);\n    this.imply('minute', 0);\n    this.imply('second', 0);\n    this.imply('millisecond', 0);\n}\n\nParsedComponents.prototype.clone = function () {\n    var component = new ParsedComponents();\n    component.knownValues = JSON.parse(JSON.stringify(this.knownValues));\n    component.impliedValues = JSON.parse(JSON.stringify(this.impliedValues));\n    return component;\n};\n\nParsedComponents.prototype.get = function(component, value) {\n    if (component in this.knownValues) return this.knownValues[component];\n    if (component in this.impliedValues) return this.impliedValues[component];\n};\n\nParsedComponents.prototype.assign = function(component, value) {\n    this.knownValues[component] = value;\n    delete this.impliedValues[component];\n};\n\nParsedComponents.prototype.imply = function(component, value) {\n    if (component in this.knownValues) return;\n    this.impliedValues[component] = value;\n};\n\nParsedComponents.prototype.isCertain = function(component) {\n    return component in this.knownValues;\n};\n\nParsedComponents.prototype.isPossibleDate = function() {\n    var dateMoment = this.moment();\n    if (this.isCertain('timezoneOffset')) {\n        dateMoment.utcOffset(this.get('timezoneOffset'))\n    }\n\n    if (dateMoment.get('year') != this.get('year')) return false;\n    if (dateMoment.get('month') != this.get('month')-1) return false;\n    if (dateMoment.get('date') != this.get('day')) return false;\n    if (dateMoment.get('hour') != this.get('hour')) return false;\n    if (dateMoment.get('minute') != this.get('minute')) return false;\n\n    return true;\n};\n\nParsedComponents.prototype.date = function() {\n    var dateMoment = this.moment();\n    return dateMoment.toDate();\n};\n\nParsedComponents.prototype.moment = function() {\n    var dateMoment = moment();\n\n    dateMoment.set('year', this.get('year'));\n    dateMoment.set('month', this.get('month')-1);\n    dateMoment.set('date', this.get('day'));\n    dateMoment.set('hour', this.get('hour'));\n    dateMoment.set('minute', this.get('minute'));\n    dateMoment.set('second', this.get('second'));\n    dateMoment.set('millisecond', this.get('millisecond'));\n\n    // Javascript Date Object return minus timezone offset\n    var currentTimezoneOffset = dateMoment.utcOffset();\n    var targetTimezoneOffset = this.get('timezoneOffset') !== undefined ? \n        this.get('timezoneOffset') : currentTimezoneOffset;\n\n    var adjustTimezoneOffset = targetTimezoneOffset - currentTimezoneOffset;\n    dateMoment.add(-adjustTimezoneOffset, 'minutes');\n\n    return dateMoment;\n};\n\n\n\nexports.ParsedComponents = ParsedComponents;\nexports.ParsedResult = ParsedResult;\n","exports.WEEKDAY_OFFSET = { \n    'sonntag': 0, \n    'so': 0, \n    'montag': 1, \n    'mo': 1,\n    'dienstag': 2, \n    'di':2, \n    'mittwoch': 3, \n    'mi': 3, \n    'donnerstag': 4, \n    'do': 4, \n    'freitag': 5, \n    'fr': 5,\n    'samstag': 6, \n    'sa': 6\n};\n    \nexports.MONTH_OFFSET = { \n    'januar': 1,\n    'jan': 1,\n    'jan.': 1,\n    'februar': 2,\n    'feb': 2,\n    'feb.': 2,\n    'märz': 3,\n    'maerz': 3,\n    'mär': 3,\n    'mär.': 3,\n    'mrz': 3,\n    'mrz.': 3,\n    'april': 4,\n    'apr': 4,\n    'apr.': 4,\n    'mai': 5,\n    'juni': 6,\n    'jun': 6,\n    'jun.': 6,\n    'juli': 7,\n    'jul': 7,\n    'jul.': 7,\n    'august': 8,\n    'aug': 8,\n    'aug.': 8,\n    'september': 9,\n    'sep': 9,\n    'sep.': 9,\n    'sept': 9,\n    'sept.': 9,\n    'oktober': 10,\n    'okt': 10,\n    'okt.': 10,\n    'november': 11,\n    'nov': 11,\n    'nov.': 11,\n    'dezember': 12,\n    'dez': 12,\n    'dez.': 12\n};\n\nexports.INTEGER_WORDS_PATTERN = '(?:eins|zwei|drei|vier|fünf|fuenf|sechs|sieben|acht|neun|zehn|elf|zwölf|zwoelf)';\nexports.INTEGER_WORDS = {\n    'eins' : 1,\n    'zwei' : 2,\n    'drei' : 3,\n    'vier' : 4,\n    'fünf' : 5,\n    'fuenf': 5,\n    'sechs' : 6,\n    'sieben' : 7,\n    'acht' : 8,\n    'neun' : 9,\n    'zehn' : 10,\n    'elf' : 11,\n    'zwölf' : 12,\n    'zwoelf' : 12\n};\n","exports.WEEKDAY_OFFSET = { \n    'sunday': 0, \n    'sun': 0, \n    'monday': 1, \n    'mon': 1,\n    'tuesday': 2, \n    'tue':2, \n    'wednesday': 3, \n    'wed': 3, \n    'thursday': 4, \n    'thur': 4, \n    'thu': 4,\n    'friday': 5, \n    'fri': 5,\n    'saturday': 6, \n    'sat': 6\n};\n    \nexports.MONTH_OFFSET = { \n    'january': 1,\n    'jan': 1,\n    'jan.': 1,\n    'february': 2,\n    'feb': 2,\n    'feb.': 2,\n    'march': 3,\n    'mar': 3,\n    'mar.': 3,\n    'april': 4,\n    'apr': 4,\n    'apr.': 4,\n    'may': 5,\n    'june': 6,\n    'jun': 6,\n    'jun.': 6,\n    'july': 7,\n    'jul': 7,\n    'jul.': 7,\n    'august': 8,\n    'aug': 8,\n    'aug.': 8,\n    'september': 9,\n    'sep': 9,\n    'sep.': 9,\n    'sept': 9,\n    'sept.': 9,\n    'october': 10,\n    'oct': 10,\n    'oct.': 10,\n    'november': 11,\n    'nov': 11,\n    'nov.': 11,\n    'december': 12,\n    'dec': 12,\n    'dec.': 12\n};\n\nexports.MONTH_PATTERN = '(?:' \n    + Object.keys(exports.MONTH_OFFSET).join('|').replace(/\\./g, '\\\\.')\n    + ')';\n\nexports.INTEGER_WORDS = {\n    'one' : 1,\n    'two' : 2,\n    'three' : 3,\n    'four' : 4,\n    'five' : 5,\n    'six' : 6,\n    'seven' : 7,\n    'eight' : 8,\n    'nine' : 9,\n    'ten' : 10,\n    'eleven' : 11,\n    'twelve' : 12\n};\nexports.INTEGER_WORDS_PATTERN = '(?:' \n    + Object.keys(exports.INTEGER_WORDS).join('|') \n    +')';\n\nexports.ORDINAL_WORDS = {\n    'first' : 1,\n    'second': 2,\n    'third': 3,\n    'fourth': 4,\n    'fifth': 5,\n    'sixth': 6,\n    'seventh': 7,\n    'eighth': 8,\n    'ninth': 9,\n    'tenth': 10,\n    'eleventh': 11,\n    'twelfth': 12,\n    'thirteenth': 13,\n    'fourteenth': 14,\n    'fifteenth': 15,\n    'sixteenth': 16,\n    'seventeenth': 17,\n    'eighteenth': 18,\n    'nineteenth': 19,\n    'twentieth': 20,\n    'twenty first': 21,\n    'twenty second': 22,\n    'twenty third': 23,\n    'twenty fourth': 24,\n    'twenty fifth': 25,\n    'twenty sixth': 26,\n    'twenty seventh': 27,\n    'twenty eighth': 28,\n    'twenty ninth': 29,\n    'thirtieth': 30,\n    'thirty first': 31\n};\nexports.ORDINAL_WORDS_PATTERN = '(?:' \n    + Object.keys(exports.ORDINAL_WORDS).join('|').replace(/ /g, '[ -]') \n    + ')';\n\nvar TIME_UNIT = \n    '(' + exports.INTEGER_WORDS_PATTERN + '|[0-9]+|[0-9]+\\.[0-9]+|an?(?:\\\\s*few)?|half(?:\\\\s*an?)?)\\\\s*' +\n    '(sec(?:onds?)?|min(?:ute)?s?|hours?|weeks?|days?|months?|years?)\\\\s*';\n\nvar TIME_UNIT_STRICT = \n    '(?:[0-9]+|an?)\\\\s*' +\n    '(?:seconds?|minutes?|hours?|days?)\\\\s*';\n\nvar PATTERN_TIME_UNIT = new RegExp(TIME_UNIT, 'i');\n\nexports.TIME_UNIT_PATTERN = '(?:' + TIME_UNIT + ')+';\nexports.TIME_UNIT_STRICT_PATTERN = '(?:' + TIME_UNIT_STRICT + ')+';\n\nexports.extractDateTimeUnitFragments = function (timeunitText) {\n    var fragments = {};\n    var remainingText = timeunitText;\n    var match = PATTERN_TIME_UNIT.exec(remainingText);\n    while (match) {\n        collectDateTimeFragment(match, fragments);\n        remainingText = remainingText.substring(match[0].length);\n        match = PATTERN_TIME_UNIT.exec(remainingText);\n    }\n    return fragments;\n};\n\nfunction collectDateTimeFragment(match, fragments) {\n    var num = match[1].toLowerCase() ;\n    if (exports.INTEGER_WORDS[num] !== undefined) {\n        num = exports.INTEGER_WORDS[num];\n    } else if(num === 'a' || num === 'an'){\n        num = 1;\n    } else if (num.match(/few/)) {\n        num = 3;\n    } else if (num.match(/half/)) {\n        num = 0.5;\n    } else {\n        num = parseFloat(num);\n    }\n\n    if (match[2].match(/hour/i)) {\n        fragments['hour'] = num;\n    } else if (match[2].match(/min/i)) {\n        fragments['minute'] = num;\n    } else if (match[2].match(/sec/i)) {\n        fragments['second'] = num;\n    } else if (match[2].match(/week/i)) {\n        fragments['week'] = num;\n    } else if (match[2].match(/day/i)) {\n        fragments['d'] = num;\n    } else if (match[2].match(/month/i)) {\n        fragments['month'] = num;\n    } else if (match[2].match(/year/i)) {\n        fragments['year'] = num;\n    }\n\n    return fragments;\n}","exports.WEEKDAY_OFFSET = {\n    'domingo': 0,\n    'dom': 0,\n    'lunes': 1,\n    'lun': 1,\n    'martes': 2,\n    'mar':2,\n    'miércoles': 3,\n    'miercoles': 3,\n    'mie': 3,\n    'jueves': 4,\n    'jue': 4,\n    'viernes': 5,\n    'vie': 5,\n    'sábado': 6,\n    'sabado': 6,\n    'sab': 6,}\n\nexports.MONTH_OFFSET = {\n    'enero': 1,\n    'ene': 1,\n    'ene.': 1,\n    'febrero': 2,\n    'feb': 2,\n    'feb.': 2,\n    'marzo': 3,\n    'mar': 3,\n    'mar.': 3,\n    'abril': 4,\n    'abr': 4,\n    'abr.': 4,\n    'mayo': 5,\n    'may': 5,\n    'may.': 5,\n    'junio': 6,\n    'jun': 6,\n    'jun.': 6,\n    'julio': 7,\n    'jul': 7,\n    'jul.': 7,\n    'agosto': 8,\n    'ago': 8,\n    'ago.': 8,\n    'septiembre': 9,\n    'sep': 9,\n    'sept': 9,\n    'sep.': 9,\n    'sept.': 9,\n    'octubre': 10,\n    'oct': 10,\n    'oct.': 10,\n    'noviembre': 11,\n    'nov': 11,\n    'nov.': 11,\n    'diciembre': 12,\n    'dic': 12,\n    'dic.': 12,\n}\n","exports.WEEKDAY_OFFSET = { \r\n    'dimanche': 0, \r\n    'dim': 0, \r\n    'lundi': 1, \r\n    'lun': 1,\r\n    'mardi': 2, \r\n    'mar':2, \r\n    'mercredi': 3, \r\n    'mer': 3, \r\n    'jeudi': 4, \r\n    'jeu': 4, \r\n    'vendredi': 5, \r\n    'ven': 5,\r\n    'samedi': 6, \r\n    'sam': 6\r\n};\r\n    \r\nexports.MONTH_OFFSET = { \r\n    'janvier': 1,\r\n    'jan': 1,\r\n    'jan.': 1,\r\n    'février': 2,\r\n    'fév': 2,\r\n    'fév.': 2,\r\n    'fevrier': 2,\r\n    'fev': 2,\r\n    'fev.': 2,\r\n    'mars': 3,\r\n    'mar': 3,\r\n    'mar.': 3,\r\n    'avril': 4,\r\n    'avr': 4,\r\n    'avr.': 4,\r\n    'mai': 5,\r\n    'juin': 6,\r\n    'jun': 6,\r\n    'juillet': 7,\r\n    'jul': 7,\r\n    'jul.': 7,\r\n    'août': 8,\r\n    'aout': 8,\r\n    'septembre': 9,\r\n    'sep': 9,\r\n    'sep.': 9,\r\n    'sept': 9,\r\n    'sept.': 9,\r\n    'octobre': 10,\r\n    'oct': 10,\r\n    'oct.': 10,\r\n    'novembre': 11,\r\n    'nov': 11,\r\n    'nov.': 11,\r\n    'décembre': 12,\r\n    'decembre': 12,\r\n    'dec': 12,\r\n    'dec.': 12\r\n};\r\n\r\nexports.INTEGER_WORDS_PATTERN = '(?:un|deux|trois|quatre|cinq|six|sept|huit|neuf|dix|onze|douze|treize)';\r\nexports.INTEGER_WORDS = {\r\n    'un' : 1,\r\n    'deux' : 2,\r\n    'trois' : 3,\r\n    'quatre' : 4,\r\n    'cinq' : 5,\r\n    'six' : 6,\r\n    'sept' : 7,\r\n    'huit' : 8,\r\n    'neuf' : 9,\r\n    'dix' : 10,\r\n    'onze' : 11,\r\n    'douze' : 12,\r\n    'treize' : 13,\r\n};\r\n","\n\n/**\n * to-hankaku.js\n * convert to ascii code strings.\n *\n * @version 1.0.1\n * @author think49\n * @url https://gist.github.com/964592\n * @license http://www.opensource.org/licenses/mit-license.php (The MIT License)\n */\n \nexports.toHankaku = (function (String, fromCharCode) {\n \n    function toHankaku (string) {\n        return String(string).replace(/\\u2019/g, '\\u0027').replace(/\\u201D/g, '\\u0022').replace(/\\u3000/g, '\\u0020').replace(/\\uFFE5/g, '\\u00A5').replace(/[\\uFF01\\uFF03-\\uFF06\\uFF08\\uFF09\\uFF0C-\\uFF19\\uFF1C-\\uFF1F\\uFF21-\\uFF3B\\uFF3D\\uFF3F\\uFF41-\\uFF5B\\uFF5D\\uFF5E]/g, alphaNum);\n    }\n \n    function alphaNum (token) {\n        return fromCharCode(token.charCodeAt(0) - 65248);\n    }\n \n    return toHankaku;\n})(String, String.fromCharCode);\n\n/**\n * to-zenkaku.js\n * convert to multi byte strings.\n *\n * @version 1.0.2\n * @author think49\n * @url https://gist.github.com/964592\n * @license http://www.opensource.org/licenses/mit-license.php (The MIT License)\n */\nexports.toZenkaku = (function (String, fromCharCode) {\n \n    function toZenkaku (string) {\n        return String(string).replace(/\\u0020/g, '\\u3000').replace(/\\u0022/g, '\\u201D').replace(/\\u0027/g, '\\u2019').replace(/\\u00A5/g, '\\uFFE5').replace(/[!#-&(),-9\\u003C-?A-[\\u005D_a-{}~]/g, alphaNum);\n    }\n \n    function alphaNum (token) {\n        return fromCharCode(token.charCodeAt(0) + 65248);\n    }\n \n    return toZenkaku;\n})(String, String.fromCharCode);","var NUMBER ={\n  '零':0,\n  '一':1,\n  '二':2,\n  '兩':2,\n  '三':3,\n  '四':4,\n  '五':5,\n  '六':6,\n  '七':7,\n  '八':8,\n  '九':9,\n  '十':10,\n  '廿':20,\n  '卅':30,\n};\n\nvar WEEKDAY_OFFSET ={\n  '天':0,\n  '日':0,\n  '一':1,\n  '二':2,\n  '三':3,\n  '四':4,\n  '五':5,\n  '六':6,\n};\n\nexports.NUMBER = NUMBER;\nexports.WEEKDAY_OFFSET = WEEKDAY_OFFSET;\n\nexports.zhStringToNumber=function(text){\n  var number = 0;\n  for(var i=0; i<text.length ;i++){\n    var char = text[i];\n    if(char === '十'){\n      number = number=== 0 ? NUMBER[char] : (number * NUMBER[char]);\n    }else{\n      number += NUMBER[char];\n    }\n  }\n  return number;\n};\n\nexports.zhStringToYear=function(text){\n  var string = '';\n  for(var i=0; i<text.length ;i++){\n    var char = text[i];\n    string = string + NUMBER[char];\n  }\n  return parseInt(string);\n};\n"]}