ÿØÿà JFIF    ÿÛ „ ( %!1!%*+...983,7(-.- usr/bin/date000075500000323720152342675230007010 0ustar00ELF> 9@@8 @@@@hh{{ !!H XX!X! DDStd Ptd```QtdRtd!!pp/lib64/ld-linux-x86-64.so.2GNUGNUGNUCsbh0sH7__)Mm 7WUdt?3\JD>0 Pt ^z:5(enG" lA"slibc.so.6__stpcpy_chkfflushgmtime_r__printf_chksetlocalembrtowcfopenstrncmpoptindstrrchrdcgettexterror__stack_chk_failiswprintreallocabortstdin_exitprogram_invocation_namestrftimelocaltime_r__ctype_get_mb_cur_maxcallocstrlenmemset__errno_locationmemcmpunsetenv__fprintf_chkputenvstdoutfputcfputslseekmemcpyfclosemalloctimegmmbsinittzsetnl_langinfo__ctype_b_locgetenvoptarg__freadingstderr__snprintf_chkclock_settimegetopt_longsettimeofdayfileno__getdelimfwritegettimeofdayclock_gettime__fpendinglocaltimestrchrmktimeprogram_invocation_short_name__ctype_toupper_loc__ctype_tolower_loc__cxa_finalize__sprintf_chk__xstatbindtextdomainstrcmp__libc_start_mainfseekosnprintf__overflowfputs_unlockedfree__progname__progname_full__cxa_atexitGLIBC_2.14GLIBC_2.4GLIBC_2.17GLIBC_2.3.4GLIBC_2.2.5GLIBC_2.3_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTable+ii 6@ti Kui Wii c!:!9!!!%!%!& !%@! &`!&!&!&&!x%!/&!3& !7&@!;&`!E&!J&!R&ȁ!X&Ё!%؁!a?!`&!+B!-B !C0!C@!jCP!/B`!1Bp!C!\!C!C!,<!CЂ!dC!3B!5B!2?!> !B0!7B@!9BP!C`!\p!%!B!A>!;B!@BЃ!DB!HB!LB!QB!UB !B0!B@!YBP!]B`!Bp!bB!fB!jB!nB!rB!vBЄ!zB!~B!B!B!B !B0!B@!BP!B`!Bp!B!B!B!B!B!BЅ!B!B!B!B!B !B0!B@!BP!B`!Bp!B!B!=>!B!?!4?!B!B!C !C0! C@!CP!C`!Cp!#C!*C!0C!6C!>C!ECЇ!KC!QC!ZC!bC!fC@!/?P!lC`!rCp!|C!2D!C!C!C!CЈ!C!'?!C !C0!C@!CP!C`!Cp!C!C!C!C!C!CЉ!C!C!C!D! D !D0!D@!$DP!)D`!/Dp!6D!$?!?D!DDЊ!GD!R!R!R!R !R(!9&0!R8!R@!o%H!R!;!A`!p!x!!! ! !!!&!-!.ȏ!0Џ!K؏!M!O!R`!h!p!x!!!!! ! ! !!!ȍ!Ѝ!؍!!!!!!!!! !(!0! 8!!@!"H!#P!$X!%`!'h!(p!)x!*!+!,!/!1!2!3!4!5!6Ȏ!7Ў!8؎!9!:!;!<!=!>!?!@!A !B(!D0!E8!F@!GH!HP!IX!J`!Lh!Np!Ox!P!Q!SHHh!HtH5e!%e!hhhhhhhhqhah Qh Ah 1h !h hhhhhhhhhhqhahQhAh1h!hhhh h!h"h#h$h%h&h'qh(ah)Qh*Ah+1h,!h-h.h/h0h1h2h3h4h5h6h7qh8ah9Qh:Ah;1h<!h=h>h?h@hAhBhChDhE%%a!D%a!D%a!D% a!D%a!D%`!D%`!D%`!D%`!D%`!D%`!D%`!D%`!D%`!D%`!D%`!D%`!D%`!D%`!D%`!D%`!D%}`!D%u`!D%m`!D%e`!D%]`!D%U`!D%M`!D%E`!D%=`!D%5`!D%-`!D%%`!D%`!D%`!D% `!D%`!D%_!D%_!D%_!D%_!D%_!D%_!D%_!D%_!D%_!D%_!D%_!D%_!D%_!D%_!D%_!D%_!D%}_!D%u_!D%m_!D%e_!D%]_!D%U_!D%M_!D%E_!D%=_!D%5_!D%-_!D%%_!D%_!D%_!D% _!D%_!D%^!DAWAAVIAUL-) ATL% UH- S1HH>dH%(H$1H5RH5?H=*H=H=\7D$HD$ HD$HD$(HD$fDE1H >N!LDH fr~(uuruHH]!HHD$ IwRHHH|@sH]!D$HHD$(VfD=H]!AH Q HO!H=!LHY]!H09ADHLsdTH(]!HHD$=}uXHZ]!E1LHH54HH\!H81覨1= ]!y=~1_H\!HHD$L@H=U$4Ha\!H01Ht*H\!ALHHN!H=LAHH HM1H|$1H|$1H|$ ,T$H[!HcD9}/pD9IH8?+ |$HH=HI6H|$IHH5L )H|$H5$ `IH%HD$8HD$0HD$HD$0HD$HD$@HD$8HD$ Ht$H|$L IH [!Ht$01MH|$ Mx^H|$0JD?8 uH|$0H51HH11H11knD$ ȉHt$ HHT$PrH$HD$@H$HD$H|$Hl$@Ht$@HT$HLHF!ŃH$dH3%(@H[]A\A]A^A_úH51!HD$HY!L0YH~Y!HcD9IHl$@HHHD$~HD$HHß;H5n1HH1101Ht$@HT$HLHV!L觨jH|$0l58H,H51&HHHX!3HHH|$@*vHD$(Hl$@MM /Y!HHHDD$1HHD$\(H|$螞H5Q1HH1H1I|jH5H1dH11H1H5%161H1HT$ 1HlHٿH01tHT$1H;HٿH01CH5111H1"JH5HT$1~HHٿH701IH5HpH51-1H1f.f1I^HHPTL6H H=xbV!H=)W!H"W!H9tH&V!Ht H=V!H5V!H)HHH?HHtH%V!HtfD=V!u+UH= V!Ht H=E!idV!]wAUATIHUHSHxH4$H\$HHT$HdH%(HD$h1蔪HtoHI9L-0U!HHLDD$I}'I}HG(H;G0HPHW( HL$hdH3 %(Hx[]A\A]H<$Ht$Pr'HJH51HDH11H11H5WDD$LHL-mT!HI}I&H5(2 V=ATUSHĀdH%(HD$x1HT!Ht1H51HپHH'T!H81U.1H5PHHڿH1HS!1H5L#HL#L#1H5 LHL#1H59LHL#1H5hLHL#1H5LHL#1H5yLH~L#1H5=XLH]L#1H57LHMuJf.LIIHNHHHL!H81.OD<_uAA|$AI1AD$MD$PЁ $A4$t0H%!H51HHHH[]s1HHspHHsxfATHIE1UE1dSHHHH0dH%(HD$(1eMtHŃc I$uHT$(dH3%(HuFH0[]A\ÐA|$H#dHcL`)IHHHc1ff.@UHSHHLOIAH wYHdHH PHHH81HcSwScwNHcd)HHcZfdH1L H.HcSvHH[]HcWwHdH (L HHL1ֿHH[]ff.AVAUATUH1SHH5HpdH%(HD$h1kHH1Ht 8H-"!Lc(H51H}HL1Ht HtbuYHHDsLkH51I蓿H}EMHL1gƃHu|HHKLH}LDHH1Hƃt  tiH[XHu ο,@Ht at1H[XuĺH51蝾H}HپH1wHu iHD$hdH3%(Hp[]A\A]A^1H- !TfHKHLKXHLCPH}H1HK`H{HƃxiHu 趾HK(LK@1H-b !LC8H.H}ƃ8Hu Y7@DHIԋ{HtH}LH1ƃ%DH}H1@L%qHMH=覿ff.AWE11AAVMcIAUA&ATEUDSHL$H$0dH%(H$1Mf$D$$A,@AApMcHB9H?FED$$LH8D$$HD$(H$HD$0fo$H$H$fo$;fo$HC0C{ LqID$&fDAI9TA THIcD,EADHAB ʅ|$$uHH H5HfDM9wIMH8BtpwH<uDEtHD$(H8LD$$H$HD$0fo$H$H$fo$HC0Cfo$C HYHcɃ<)HHH<H)HHx0ooPoX L8LPH$Hx Lh)$LX)$H|$Hx(@0)$H|$D$WH=HcH>HHCIA8HCHHII@H9tHCHHII(H9cH$dH34%(NHĸ[]A\A]A^A_HPI(@O11fDI0ʀ w0HHHH>HHI0@ vЍJՍ~Ѓ vf3N9(WI11f)H)HIHHFIP=(uHf.-H<IEAHxAI97H@ wIHI>IMuԍ~Ѓ H1A0Dҍn)ADHcHEwHoDnЉA %,9U0 )HoоAW w}HAWЃuA wHU0 vE;3HH9ʚ;HI))H$HcHD$(HDŽ$HcHAf.NЃ N9fHHHHHIL$ILI}H DHH9sHIʃA9w IIMuր.t$Lt$Ѝr BHAuH-d!H\$H5HDD$LHH3HLuIHLcD$H\$HcU mH$dHk HH-.HDI)H)AHL$($Ht$0AՁ`v,HCho{8LHoCHL{8)$o{XLS@LkHH$HCXL[P)$)$HD$HC`HD$ChD$fH|$Ht$L$HZ8L$fo$H$|$H$fo$L$L$fo$$H$b8HrhjHrXAЉApwMcHfBf9HH5LIE1C0E1AAAIHC(H1IIHS @I1IHS@I1IQxHSIQxIQpHL$81HSIQpHL$@IQh1HD IQh t$@ D$8@HAƁHSINA^HCHSINDŽ$AHD$CЉD$E1E1E1E1HD$ A0uHUփ0 @0tU08@?HKLIyL\$HHSsLT$@ILL$8LL$8LT$@L\$HHSINA kL{HSINA+ODŽ$HCHD$HSINAD$DŽ$HCHSINE1AE1E1E1DŽ$D$HD$HD$DŽ$HCHD$HSINAE1E1E1E1D$HD$xDŽ$HCHSINE1AE1E1DŽ$D$AHD$HD$DŽ$L[HSINAD$E1E1E1HD$HD$DŽ$L[L+HSINDŽ$AD$E1E1E1HD$HD$wHDŽ$fHC)$)$)$HAIEvHSINE1E1HD$AHD$D$fHCHDŽ$)$)$)$HSINE1AE1E1DŽ$D$AHD$HD$DŽ$LSHSINAD$E1E1E1HD$HD$:IH5IL\$HLT$@LL$81踮HSINAHǸLL$8LT$@L\$HALDD$hHT$`D$XHL$PLL$8LT$@L\$HHL$PD$XHT$`DD$ho1L\$HAƁH5KAAXLT$@LL$8INHSAHǸSL\$HHLLT$Hss3LL$XH HSINALL$8LT$@L\$HL{HSINE1AL{HSINE1AL+HSINDŽ$AHCHSINDŽ$A<HD$?HCHSINDŽ$A<HD$L[HSINDŽ$A<HCHfHDŽ$)$)$A)$IEHSINE1E1HD$A<HD$D$LSHSINDŽ$A<L{HSINDŽ$A<D$E1E1E1HD$HD$*HCIAHHSINAƁAAA HCHCIAHSINAAA HIAHSINAAA CHSINAAA AAHSINA _L\$HH5@LT$@ILL$8(L\$HH5LT$@ILL$8DŽ$LSHSINE1AE1DŽ$E1D$AHD$HD$DŽ$L{HSINA6DŽ$L{HCo;IA@HCAy IA8HCINHXAIA0;HCHSINAIA@HIA8HXoINH AIA8HCAA IA@HCIA0HCHSINAIA8HCIA@HCIA@HCIA8HCHHIQ(HH9H0AH6 ) H0o INHAIA0HCAA IA8HCIA@ HCINHXAIA8HCIA@L\$HHLLT$HsssLL$XH C0E1LL$8AAAIHC(H1IIHS @I1IHS@IE1IQxHSAIQxE1IQpHSAIQp1IQhHD IQh DD @EHHXH=Lu^Et$It$EtNHD$f<"HHP@Ht<\uHBR\t߀"tH$LLePH HD$MA<$H HDŽ$L$DŽ$LDD$E1HDŽ$($Hc$L$Lcd$ Hl$H$$L$ E1HDŽ$0HDŽ$8HH$Hc$ HDŽ$@H$Hc$HDŽ$HH$Hc$HDŽ$PH$Hc$DŽ$XH$$ fD$`$HDŽ$hH$0$H$@HDŽ$pHDŽ$HDŽ$xHDŽ$HDŽ$Ƅ$DŽ$Ƅ$H$DŽ$ HDŽ$HD$fD$AvIcHpNHt$LLH$@QNHt!H$Ht$;$l AvAuH$HtH$Ht 蜗L$Ll$$`H$H$H $hH$xH $pH $H HH$H} H$ 1HHl H HcЉ$H9кEʉȃD$|$ H$1HHc‰Ɖ$H9ȹE$ H$HcЉ$H9ЉD$0 H$HC$ahH$hYH$pHDŽ$DŽ$HDŽ$ hE1E11DŽ$H$xV$$$H$$H$$LHʼn$HƉ$D$D$HD$ |LHHLHI H$HD$XH $D$D$D$D$8$$D$D$@$D$$D$$D$($D$H$D$T$E9A9D9|$t$@9t$8t$(9t$t$T9t$HH51 H$H1HHL|H5`1H֒HH1yH|$ HLIH5K1H裒HH1FD$0H$H5HH D\$(H=D9\$LˤD\$TLDL D9\$HLDHHP1RVdQdAPL;H034$# tH| uHcЅuHH=1ƄH51‘H1ht$0D9|$t'L$(9L$t1H5舑H1.1H5kH1H|$XH51BHH=011M9tLGH|$GH$XdH3 %(Hh[]A\A]A^A_@IA $ HHH$tH$Hl$0H9 H51苐HH11,IHdH$HD$HD$HT$A"t*D1A\HHDpHpJA"uH|$Ht$8IDIHHt$8FLf< w4H>Hs$IA $ wHHHufDH$LLUGH1gDDŽ$HDŽ$0@o$HD$(,f.H5С1=H1$`H5H$H5L|$MM9H51ԎH LH;H¾1訑vHt$8|Ht$8HHD$HD$D@HD$1_L|$pLH5af1YH H1H;0H$xH$H$H$Dكu-dfDtkdF-l1WxAWAVAUATIHUSHHdH%(H$1xI@+.H.xIHtIH)I)It:f.1H$dH34%(fH[]A\A]A^A_DIIEHwLuHIt0 wHH9uIL$SDSDHAHI9uIU@q$IwH|$$D$ $D$$D$$D$MAF0 AVJЃ DBЉD$D$PD$Ll$PLD$pD$THD$HD$XHD$ HD$`oxH$HT$$D$ A3UA3E ‹D$A3E ‹D$A3E ‹D$A3E ‹L$AE1 tK<ZL$HLw59H|$LfP!H$I$fDE1+H|$$LKD8WT$ PT$P@ T$D$HtIHD$1\uf.fSH/HuHtXL@LH)H~HHpH=@€u,H=0LL€uHXHS HH HH/ H[HC 7H=HRwsf.UHSH/߀UuMP߀Tu^P߀FuRx-uLx8uFxu@}`HHuHEH[]fDGuP߀Bu x1ux8t# HDH=HEH[]x0u׀x3uрx0uˀxuŀ}`H HHEH[]AWAVIAUATIUHSDHH$HT$DD$ HD$ H$D$HD$hH$HD$`dH%(H$1"sD\$ HD$XD$CA VvH DHcH>D$AE1Ƅ$HD$PD$CD$BH+E1AHD$HD$HE1DEILAI9AIu HD$<(AEAH|$"D$BL /D$ HD$H1H\Iu-Hv'DT$8DD$0LL$(4rDT$8DD$0LL$(IL9HT$Ht$HLDT$DL\$8DD$0LL$(rLL$(DD$0L\$8DT$D|$CA~H HcH>fD$ IIu HD$xAH|$Ct T$BFHt$ Htډҋu |$ 5A€|$CkD t/M9vC>'IWI9vCD>$IWI9vCD>'IAM9sC>\IHM9sC>|$AIED@|$AfD$ AAA?E1 D$ A1D$1'DD$ \$C\$Bt H|$q\\f|$BE11|$C|$ HD!CD$ 1E1qfrE1A€|$C@ D$BLEӀ|$BDEHEHt$hLLt$xjD$HT$0AH IH$dH3%(L:H[]A\A]A^A_DfA|$CiE1/n;fDD$ t@b붐af|$C! D$ ADƒ M9vC>'IOI9vCD>$IOI9vCD>'IOI9@A\ALyAq HE0L9sHD$D(D$(0<  D$BDAD$ H|$XwDT$8L\$0DD$(qDD$(L\$0HDT$8Pf%@A"T$B*AIA~wH hHcH> rA"T$CT$ QLA v1 f! n@ t@ba|$B%D$ 1$HA|$C~ HDE1\@M9vC>'IGI9vCD>'IE1AE1fA A@A~H HcH>1Dl$ D$ 1D1HDl$ D$ 1t@1 AELMu T$Ch D$C w $g |$A MH|$P  Ld$PA'HAAH\$HHD$D$C$`|$CMP1H|$PBLd$PI1E1D$IԻ'$tHEL9sH\$|+?D1E1?I|$ChE11?\fDH$HDŽ$HD$pIu,H|$DT$8DD$0LL$(HjDT$8DD$0LL$(I1H$$Lt$xHLt$pHD$8D$Hl$0L$L$L$L\$(DT$D+$lLDDHlhHD$0HT$(LH|$8L<HD$L)N$8LHH2HHV|$Du|$CzHpH|$H4/JD?LDHH9K[!wH+HHtLt$xL$AHl$(V@D$ E11f.LM9fDVM9vC>'IGI9vCD>\IGI9LCD>'Ld$PT$BE1HDl$(1Dl$CH|$ LL$fAEDƃ@ t/M9vC>'IwI9vCD>$IwI9vCD>'IAM9vC>\IGI9v 0CD>IGI9v0CD>HI0H9VM9vC>A)IJD!@tM9vC>\IHH9s,M9vC>'IGI9vCD>'I1E1Dl$(L݈D$BEvkIAE10D$BMHHD$AE1AHD$PAƄ$D$CHD$HD$HCMA"E1D$AƄ$HD$PHxD$CAD$BHD$HD$HA tjH51D\$ "fD\$ HHD$hHH9uH5q1D\$ eD\$ HHD$`HLH9$E1JH\$`D\$ E1HeH\$HD\$ HD$D$AƄ$HD$PD$BHwD$AE1E1Ƅ$AHD$PD$CD$BHD$HD$HD$AE1E1Ƅ$HD$PD$CD$BHD$HD$H]D$AE1E1Ƅ$HD$PD$CD$BHD$HD$H D$AE1Ƅ$HD$PD$CD$BD$ D$ D$ M9vC>0HAI9vAD0Ly0KtD$B]fDl$(1HDHl$0Lt$x$L\$(D$L$L$DT$D"T$BHHHD$PE1D$AƄ$UD0E1>HpH|$CM9vC>?IWI9vCD>"IWI9vCD>"IWI9vCD>?I1E1H2HHl$0Lt$xE1D$$L$L$L\$(DT$DT$B L\$(LLHHHl$0D$$L$L$Lt$xL$DT$DL9s >u A<tHHTI9wHT$BE1HT$hM9vC>IB:uHtD$AE1E1Ƅ$HD$PD$CD$BHD$HD$HlLELEH\$HHt,t( H؄tLL)I9vA H uIM9C>{H|$`D?D\$ HD$`H|$hD#D\$ HD$hoALED$B$^HAHLt$ht$xt$8D$HT$0Ht$pH IAE1D$A1HD$PLLd$PBaHDD$AE1E1Ƅ$HD$PD$CD$BHD$HD$HAWLcAVIAUATUHSH(Ht$_H IŋD$EcD9=w bAQEgHu IcHH9H HF HHc=4 D1)HHcHH`D% EIHDELL}LLLcD$$Au0LLu(AWHT$(L\$0$H L\$I9wgHpH H3I9tLHt$^Ht$HHt$HLHCDEHIu0u(AWDL$DIȾH1HЁXrfLK8HC1LCH5Lk0Lc(L{ LL$LsHH$LD$`UHLL$HHH1AQAUATAWAVLL$0LD$8XH0H([]A\A]A^A_LS@LK8H5\HCLCLk0Lc(LT$L{ LsLL$H$HLD$1TLT$ARgHH51TH(HHH[1]A\A]A^A_wWLcH1H5fTH(MHH[H]1A\A]A^A_0WLkLc1HH5}"TH(MMHH[H]1A\A]A^A_Vf1LsLkH5bLcHSHAVHMMHH1VXZH([]A\A]A^A_@L{ 1LsH5*LkLcHrSAWfDLCLc(1L{ LsH5L$LkH:SHMATAWAVLD$ HHH1VH H([]A\A]A^A_LKLk01Lc(L{ H5ڀLsLCLL$HL$RAUATAWAVLL$(f.LS@LK8H5,HCLCLk0Lc(LT$L{ LsLL$H$HLD$fE1I8tIK<uHhE1dH%(HD$X1I#AƒMPAIKHt/II t%A/vMPIBI@IKHuDM`HD$XdH3%(uHhQfDHLD$@LL$Ht7)D$P)L$`)T$p)$)$)$)$)$dH%(HD$1H$I$ HD$HD$ HD$D$0HD$dH3%(uH5QDSH5a}1PHh}H1"SH5c}1PH [HHH1RH 1H5bHPHH[QfSH3RHuHu[RfHHHHx HuP(SHHuHuH&RHuHu[f. O1[fHHHHx HuPIHHt1HTUUUUUUU1IH9v8HHHLHIHSHt#HIHxHtP?1ҸE1IIAI f.HHt,HSUUUUUUUH9w7HHHDHHHuHHyPSH3H1HvO[@HHHHxHuOHtH^ff.UHHSHHHHHOH[]SH3NH[HpfDPXH5m}1HMHİ 1H1:H\GPMfATUSH@OH߅xXOu0Hht@LHD HaMEu<[]A\HN1 NHuH[]A\(MDeDSHHt>OtuH[NfHߺ1H[NHGH9Gt ]ODHG H9G(uHHuATAUHSH5NDHHMHt #H1[]A\ÐAUIATIUSHHdH%(HD$1HHD$HDHLHHvMu'HT$dH3%(Hu-H[]A\A]f1uAE"LfHtHH=yDKH=fDtN@ATUSHtcIKvHhHvHCHH]MHHt$HH{ HfCLLD+ H[]A\fMHHt1HHfS[]A\fAWAVAUATUSHLf0MHIL9wHV8I9r}A<$H] }DLHLtQ;uLu I9}HJH\;uHEHtHX LHHKu@I]0H[]A\A]A^A_H]H[]A\A]A^A_@LPJLxHL)HHL9s!vI 1@L JLx1LHvw!LLHCKB;afLHEHt @HX :1tbHH1D HuDeH[]A\fH} Hƻ?JuH[]A\}uH[]A\D3JH[]A\ff.AUATUHSHG}H} HD u1t#D#E1HD#HD[]A\A]@IAAUATIUSHHtzHHIHtEHLGHt'HHtIu2HH[]A\A]@ItL2H1[]A\A]DLufHLH[]A\A]KHff.ATUSHHPdH%(HD$H1HHIHHlIHD$HtQHH&u HD$ItL{HD$HL$HdH3 %(HP[]A\ÐHt$H|$qFHtC T$0@ƅ@8txyCS3D$ 3T$$ ЋS 3T$ ЋS3T$ ЋS3T$ Ћ3T$ CVHH]HNFAUHIATUSHdH %(H$1Ld$HHt$HD$HLH\$HLHھHHHH9w@<_uA|@AKIDE1ACIsPA ,A;t GIF|GЃ vAy@7~ڃ wACAIPAIA9AOE1 %f$EPHD$L݈HT$@H $H$HDT$XDD$PDL$HHD$0]CHHHELAIHH9ILCL)L9HDD$PDL$HEuMH9sHIcDT$XHL$PH)L\$XL<A0bH߾ DL$HLCAL\$XHL$PDL$HHt$0L\$HHHHL$0HEE#HL$0L\$HHM"E@ %HD$DELE1E1f$AEGH$QD$Hx)Ɖkd)y؃dND$P1AO @ %E1f$HD$D$LDD$HH@DEAEICPI)H@x%uLHcLL)EAIHH9ILCI9#HtlH9vCIcHL$PH)LD$HL<DL$0A0>H߾ L?HL$PLD$HDL$0HHL$0LHENHL$0HME1H$p Hp(xu HD$(8-@ʼnųD$H )lj|$02+D$HD$HD$H<)ljk<)k<)IMIsIA MLL)EAIH%HLHEI̹AEHH$D$Hp AE*H$p D$HA0A-A_AEH$D$PD$Hp@Ń1{EAEIMcMLDLL)L9 HtHL\$HttI9s3IcDT$`L)L<A0/H߾ L\$HL6L\$H$L\$HHLPt$ LL$0DD$`HL$HT$@Ht$hXZL\$HILAECH$D$H0AE&H$$Ix+x4:D$H)AEAOH$D$PD$Hp@Łl1fD@OH@H|$(L\$HDEDT$XDL$P4ELIĸAIHI9HICL)Ht$0H9HL\$HtxI9DL$Ps>IcDT$XL\$PL)DL$HL<A06 H߾ L5L\$PDL$HL\$HLHt$(H@E L\$HLLt$0L AEH,$$IExD$0:)Ѝ)‰ЋU)|jEqHBHD$0EWHoBHD$0AEfHHHH%H)HHH9HH$H)LHI~I9sKM`H r A H;8HLHj'HHB+%MFIXIHL9MnDI&IL(G$L(H0MfDL;8t MHHtH#HHHH H9t#HHXHH9t#H0E1 H}dH3<%(L He[A\A]A^A_]D'H=UH@HcH>Dk#H0UE1MI9HH;8IHfDLL (H0l%H0(HIL {MHLHL(H0$H0L(HAlIAlIIL8l"L8H0ML "-IFPK<*HHXLH L+ HLL1H!L^_D8HcL9sLB<)%9}DBL9>HQB1LMK$HH9HCI9ML9@L;8M}LLL#LHKIIFPHHXDH K<*LrHLHL1s ZDYLHH0M׋uAFHTMI9H2IL(MD f.IL(INH0fdHDžHD$HH=@D(M|DfD(Mk@D(M\DIVfDMLL! LHHtMLLHIHtIDHAQLPDHL1LHH L?AQDH<@HAQf.AQfDGWIHDž gL爕00HI/MLHHpIIIMDIM"L爕00HHM6.HLHHJLHHHH H9ttHHXHH9tXE1DMMI9HIfALIHLHDHLLH|$P1H0LHH<$uf.LPDHLLHLAXLAY@H@H0LcMLL;8t MtLHHtHHHHH H9tHHXHH9tH0E1KH)HLfH*ILHI9s[MIH QA L;8AMELLL0+L0HIC)L;8t%I9v LHL8L8HLEHHtL8L8HHHH H9tL8L8HHXHH9tL8yL8HL(LL0L0HHMt?Et:LLHYI MI9HIIIIMIfDH>HFt]1LiJLJL OJ8IcL>/AӃL_IHPHH H9w1f/wqAӃL_APD/wyAӃL_AfP@/wIAӃL_APDL_ISHWvL_ISHWf.L_ISHWfL_ISHWfWAӃL_WA@DHWHHLZL_*xf/AӃL_IHIDHPfD/w9AӃL_IHIDHPf.f.L_ISHWfL_ISHW;L_ISHWnAWHF IAAVAIAUIATUSHXHFHD$(HBHHD$HHBHNHD$L6HD$HD$ fHo<%t9HuKIFH1Ƀ IgM|$PMuM9IEL9w)HPHIUAIEMuL9vIK>wA\$HIl$ILpM0M9v IHQMH袋.KH9KM`LD$8I4CLL$0HL9d$(LLL$0LD$8IHHVM`M0L9d$(IHIHfDHJЀ vM׀$k1 @ JHLփ0HcH9wH4HH1]H@HHsHt@  LH0HcE0< r@H0< vHH)HHt$IL$8H9HCHD$,MHCI9LFHI9kLLD$HHL9t$LL$@L\$8HL$0/LIUHL$0IHIL\$8LL$@LD$HIEH9T$MuFHt$ HFIt$(H H\$ HD$ HLL$0LD$8HHKHLLD$8IFLL$0HCLD$8LL$0IHM0 Ƀ1Ƀc 1ɨ yqcVɃCs4HH2~@ v@$1 WH0LHH9wHHH1H@HH֍XHt w^0LHHӹ1ɨrMuL9t$tLLD$@ LD$IxH9|$(t+ V (9@MIGM9LFHI9hLLD$HHL9t$LL$@L\$8L$0LL$0L\$8IHILL$@LD$HHD$I;EMuHt$ HFIt$PH L|$ HD$ wIl$E0< w5HHAHQ0< vHt$HHH)HH9HCHD$Il$ ]HHHL$0L\$8HLL$@LD$HtdIULHLD$HLL$@IHL\$8L$0 LD$HL$0ILL$@L\$8IL9t$tLLD$k LD$IxH9|$(tV HX[]A\A]A^A_MHCI9LFHI9wLLD$HHL9t$LL$@L\$8HL$0L IuHL$0IHIL\$8LL$@LD$H?IUH9t$Mu,LHH- HL$0L\$8HHLL$@LD$HIEHLHLD$HHLL$@IL\$8HL$0p IELD$HILL$@L\$8HL$0MuL9t$Ht$ HFIt$@HH\$ HD$ SHH2~@ v@$'1 H0LHH9wHHH1H@HH֍XHt 0LHHIIIHiYH HL$0L\$8HLL$@LD$HIUHt$IHLLD$HLL$@L\$8HL$0& IULD$HILL$@L\$8HL$0 H͸HZH_I\$@HOMu!HZH:I\$(HO@LLt$ILLt$fAWIAVIAUAATL%t[ UH-t[ SL)HoHt1LLDAHH9uH[]A\A]A^A_ff.f.H[ 1^ HHtime %s is out of range[test invocationMulti-call invocationsha224sumsha2 utilitiessha256sumsha384sumsha512sum %s online help: <%s> GNU coreutilsen_/usr/share/locale--rfc-3339--iso-8601TZ=UTC0David MacKenzieextra operand %s%a %b %e %H:%M:%S %Z %YTZstandard inputinvalid date %scannot set datedebugfilereferencerfc-emailrfc-822rfc-2822setuctutcuniversalhelpversionhoursminutesnsTry '%s --help' for more information. Usage: %s [OPTION]... [+FORMAT] or: %s [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] Display the current time in the given FORMAT, or set the system date. Mandatory arguments to long options are mandatory for short options too. -d, --date=STRING display time described by STRING, not 'now' --debug annotate the parsed date, and warn about questionable usage to stderr -f, --file=DATEFILE like --date; once for each line of DATEFILE -I[FMT], --iso-8601[=FMT] output date/time in ISO 8601 format. FMT='date' for date only (the default), 'hours', 'minutes', 'seconds', or 'ns' for date and time to the indicated precision. Example: 2006-08-14T02:34:56-06:00 -R, --rfc-email output date and time in RFC 5322 format. Example: Mon, 14 Aug 2006 02:34:56 -0600 --rfc-3339=FMT output date/time in RFC 3339 format. FMT='date', 'seconds', or 'ns' for date and time to the indicated precision. Example: 2006-08-14 02:34:56-06:00 -r, --reference=FILE display the last modification time of FILE -s, --set=STRING set time described by STRING -u, --utc, --universal print or set Coordinated Universal Time (UTC) --help display this help and exit --version output version information and exit FORMAT controls the output. Interpreted sequences are: %% a literal % %a locale's abbreviated weekday name (e.g., Sun) %A locale's full weekday name (e.g., Sunday) %b locale's abbreviated month name (e.g., Jan) %B locale's full month name (e.g., January) %c locale's date and time (e.g., Thu Mar 3 23:05:25 2005) %C century; like %Y, except omit last two digits (e.g., 20) %d day of month (e.g., 01) %D date; same as %m/%d/%y %e day of month, space padded; same as %_d %F full date; same as %Y-%m-%d %g last two digits of year of ISO week number (see %G) %G year of ISO week number (see %V); normally useful only with %V %h same as %b %H hour (00..23) %I hour (01..12) %j day of year (001..366) %k hour, space padded ( 0..23); same as %_H %l hour, space padded ( 1..12); same as %_I %m month (01..12) %M minute (00..59) %n a newline %N nanoseconds (000000000..999999999) %p locale's equivalent of either AM or PM; blank if not known %P like %p, but lower case %q quarter of year (1..4) %r locale's 12-hour clock time (e.g., 11:11:04 PM) %R 24-hour hour and minute; same as %H:%M %s seconds since 1970-01-01 00:00:00 UTC %S second (00..60) %t a tab %T time; same as %H:%M:%S %u day of week (1..7); 1 is Monday %U week number of year, with Sunday as first day of week (00..53) %V ISO week number, with Monday as first day of week (01..53) %w day of week (0..6); 0 is Sunday %W week number of year, with Monday as first day of week (00..53) %x locale's date representation (e.g., 12/31/99) %X locale's time representation (e.g., 23:13:48) %y last two digits of year (00..99) %Y year %z +hhmm numeric time zone (e.g., -0400) %:z +hh:mm numeric time zone (e.g., -04:00) %::z +hh:mm:ss numeric time zone (e.g., -04:00:00) %:::z numeric time zone with : to necessary precision (e.g., -04, +05:30) %Z alphabetic time zone abbreviation (e.g., EDT) By default, date pads numeric fields with zeroes. The following optional flags may follow '%': - (hyphen) do not pad the field _ (underscore) pad with spaces 0 (zero) pad with zeros ^ use upper case if possible # use opposite case if possible After any flags comes an optional field width, as a decimal number; then an optional modifier, which is either E to use the locale's alternate representations if available, or O to use the locale's alternate numeric symbols if available. Examples: Convert seconds since the epoch (1970-01-01 UTC) to a date $ date --date='@2147483647' Show the time on the west coast of the US (use tzselect(1) to find TZ) $ TZ='America/Los_Angeles' date Show the local time for 9AM next Friday on the west coast of the US $ date --date='TZ="America/Los_Angeles" 09:00 next Fri' https://www.gnu.org/software/coreutils/Report %s translation bugs to Full documentation at: <%s%s> or available locally via: info '(coreutils) %s%s' multiple output formats specifiedthe options to specify dates for printing are mutually exclusivethe options to print and set the time may not be used togetherthe argument %s lacks a leading '+'; when using an option to specify date(s), any non-option argument must be a format string beginning with '+'%Y-%m-%d%Y-%m-%dT%H:%M:%S%:z%Y-%m-%dT%H:%M:%S,%N%:z%Y-%m-%dT%H%:z%Y-%m-%dT%H:%M%:z%Y-%m-%d%Y-%m-%d %H:%M:%S%:z%Y-%m-%d %H:%M:%S.%N%:zd:f:I::r:Rs:u%a, %d %b %Y %H:%M:%S %z8.30invalid argument %s for %sambiguous argument %s for %sValid arguments are: - %s, %swrite error%s: %s%m/%d/%y%Y-%m-%d%H:%M W%? 2<5?( We( ?eh32 ( %c%02d-%02d%02ddate: %+ld %sGMTWETparsed %s part: today/this/now year(s)month(s)day(s)hour(s)nanoseconds(Y-M-D) %Y-%m-%d %H:%M:%S TZ=%s DST UTC%s(Y-M-D) %04ld-%02ld-%02ldyear: %04ld %02ld:%02ld:%02ld.%09dpm isdst=%d%snumber of seconds: %ldAMJANUARYYEARTOMORROWerror: unknown word '%s' number of secondsdatetimelocal_zonedayrelativenumberhybridam----TZ="error: parsing failed input timezone: '@timespec' - always UTCparsed date/time stringTZ="%s" in date stringTZ="%s" environment valuesystem default, dst (%s)error: out-of-range year %ld error: invalid hour %ld%s %02d:%02d:%02derror: tzalloc ("%s") failed user provided time: '%s' normalized time: '%s' possible reasons: incorrect timezonemissing timezone %s new start date: '%s' is '%s' (Y-M-D) %s-%02d-%02dstarting date/time: '%s' error: %s:%d parse-datetime.y new date/time = '%s' '%s' = %ld epoch-seconds timezone: system default timezone: Universal Time final: %s (UTC) final: %s (UTC%s) ABFGPQUVWESTBSTARTBRTBRSTNSTNDTCLTCLSTEDTCSTCDTMSTMDTPSTPDTAKSTAKDTHSTHASTHADTSSTWATCETCESTMETMEZMESTMESZEETEESTCATSASTEATMSKMSDISTSGTJSTGSTNZSTNZDTUTYESTERDAYTODAYNOWLASTTHISNEXTFIRSTTHIRDFOURTHFIFTHSIXTHSEVENTHEIGHTHNINTHTENTHELEVENTHTWELFTHAGOHENCEMONTHFORTNIGHTWEEKHOURMINUTEMINSECONDSECFEBRUARYMARCHAPRILMAYJUNEJULYAUGUSTSEPTEMBERSEPTOCTOBERNOVEMBERDECEMBERSUNDAYMONDAYTUESDAYTUESWEDNESDAYWEDNESTHURSDAYTHURTHURSFRIDAYSATURDAYA.M.PMP.M.%s (day ordinal=%ld number=%d)warning: value %ld has %ld digits. Assuming YYYY/MM/DD warning: value %ld has less than 4 digits. Assuming MM/DD/YY[YY] error: parsing failed, stopped at '%s' TZ="UTC0" environment value or -uerror: seen multiple time parts error: seen multiple date parts error: seen multiple days parts error: seen multiple daylight-saving parts error: seen multiple time-zone parts warning: adjusting year value %ld to %ld error: year, month, or day overflow using specified time as starting value: '%s' using current time as starting value: '%s' warning: using midnight as starting time: 00:00:00 error: invalid date/time value: %4s %2s %2s %2s %2s %2s non-existing due to daylight-saving time; invalid day/month combination; numeric values overflow; error: day '%s' (day ordinal=%ld number=%d) resulted in an invalid date: '%s' using current date as starting value: '%s' warning: day (%s) ignored when explicit dates are given warning: when adding relative months/years, it is recommended to specify the 15th of the months warning: when adding relative days, it is recommended to specify noon error: adding relative date resulted in an invalid date: '%s' after date adjustment (%+ld years, %+ld months, %+ld days), warning: daylight saving time changed after date adjustment warning: month/year adjustment resulted in shifted dates: adjusted Y M D: %s %02d %02d normalized Y M D: %s %02d %02d error: timezone %d caused time_t overflow error: adding relative time caused an overflow after time adjustment (%+ld hours, %+ld minutes, %+ld seconds, %+d ns), new time = %ld epoch-seconds warning: daylight saving time changed after time adjustment timezone: TZ="%s" environment value final: %ld.%09d (epoch-seconds) 2GG&2)66;;n;N;:F:GG:9=G=c>>GG.@@@@@^?>555k5e565T877c'7L7%76G-=;!-!-66e6Q611b1000E0///V/E//..9G44L4%4333GGG3Gi338>.SunMonTueWedThuFriSatlastthisnext/first(SECOND)thirdfourthfifthsixthseventheightninthtentheleventhtwelfth !"####$$$%%&''((((((())))*********+,,,---------------------....../0011223455  fp  kq `   ;TOCDEFGH:IdkJKenL12efqM;N=>?@AB=>?@ABee\oZ[jpXoX O345678 9=>?@AB<0P/SQRTUVW^_`YiabclmeX !"#gh$%&'()*+, -.]壣<+UWTVRS8;ADI>Q%#X 1 4J5&-69?BE<'$Z KLNOPM7:@CF=(/ZYGH!3,"+02).[Z*&M.>RBJSTKG]NHOPQUVLWEXYE[ A NULL argv[0] was passed through an exec system call. /.libs/lt-’'e‘`literalshellshell-alwaysshell-escapeshell-escape-alwaysc-maybeclocale2uNguou>ssttssstk!l!l!l!l!l!lTkLk9k$krkdj!l!l!l!l!l!l!l!l!l!l!l!l!l!l!l!l!l!luQjQjuuQjkuQjiQjQjQjkukukukukukukukukukukukukukukukuQjQjQjQji!lkukukukukukukukukukukukukukukukukukukukukukukukukukuQjikuQjkuQjkukukukukukukukukukukukukukukukukukukukukukukukukukuhQjhuu8k%j%j%j%j%j%j(kkkjjjj%j%j%j%j%j%j%j%j%j%j%j%j%j%j%j%j%j%jkkkkk{jkgkkk{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{jkkkkg%j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{jkhk{jk{jk{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{j{jfkfklg$h$h$h$h$h$h\gTg License GPLv3+: GNU GPL version 3 or later . This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Written by %s, %s, %s, and %s. Written by %s, %s, %s, %s, and %s. Written by %s, %s, %s, %s, %s, and %s. Written by %s, %s, %s, %s, %s, %s, and %s. Written by %s, %s, %s, %s, %s, %s, %s, and %s. Written by %s, %s, %s, %s, %s, %s, %s, %s, and %s. Written by %s, %s, %s, %s, %s, %s, %s, %s, %s, and others. General help using GNU software: a(|h|||P}}}H{{Copyright %s %d Free Software Foundation, Inc.memory exhaustedPOSIXASCII444444444444444444444444444444444444ʕ44444444444444444444444444VMf4Ԝ`~44444o<444444V#4#48Й4gޓ4–خȬȬHȬȬ(NULL)P00ж (NULL)9lllllllllllllllllllllllllll3l$l333lllllllllllllllPllllllll3l̺ͽ333lͽllll%PlllPllP;}$DL (4 $d(tt4Lt 4\T4tHtxtt 4T @ 2 SL tS $T $W W, Xl k dm m mm$n,Dn@nToop(pTphp|pqq4rDr0drDsx$s4sDsttXtlttu$u4uDuuy<zPzlD{{{$|4|t| | 4}8}P}l}$~D~~$dDtT$dԂ hT ,LDxtġ<ԡTԵDzRx  /D$4pFJ w?:*3$"\`8tYBBG D(D (A ABBA ?FFC DLTFEE I(H0H8I 8A0A(B BBBA $H8FEB E(A0D8D` 8A0A(B BBBA (x{JID { DFL \8FBG E(A0I8N@ 8A0A(B BBBC D8F0A(B BBBHxFEE E(D0J8M@N 8A0A(B BBBH <\UFBB A(A0~(D BBB  ,EAD @ AAA 8QGBD D(J0l(A ABBC80QGBD D(J0l(A ABBCll\BBE E(A0A8J  8A0A(B BBBA F P _ D e N Y A $JH(\0K(A T A $cEL0K AA ,0D~,X$IEF  ABG qKe(XADG AAA AG`^ AI ;Dv @ \BDK k ABA l ABA FAB4dAKN  AAK h GAH 0@BJI QPD  AABB 4ADG  DAD FDADBGB A(F0N 0A(A BBBI xPL"FMH H(E0D8G 0 8A0A(B BBBA V  K C B N F K C C N 'x FEB E(A0D8G a D C F F G P   8A0A(B BBBE  N V B R F Y D D\GmFEE L(A0C8D@|8C0A(B BBB(GAAG0R AAC H\HFBB B(G0C8Jp 8A0A(B BBBF KE A <<KADF T AAG v AAH rAAt|PLBBE B(D0D8JJJBZd 8A0A(B BBBF  PDD[$zRx ,h0 ^BEE B(A0D8D`hbpIxBS`@hTpCxBX`L 8D0A(B BBBF zRx `(( _:FAA nAB _ _( _9< _P _1lPd (`xFLE E(A0A8GPUXW`FhApU8A0A(B BBBh T`FLE B(D0A8GphxQCBZp_xFCGUp[8A0A(B BBB$ `(8 `LHA zABd Hax Ta Pa La XaHP A zRx Pο aHP A L, b@ b0T bFLD D`q  AABA  b b b0 bFAA D`  AABA zRx `$8, bFED C(Dpq (A ABBA h Dc| @c Lc Xc Tc `c \c, XcEID@s AAA $cFBB B(D0D8G`hWpBxBBBS`D 8A0A(B BBBD P hH Z 8O0C(B BBBL ^ 8J0I(D BBBE b 8M0I(D BBBN fhBp\hA`D 8A0A(B BBBE h hH rhEpBxB^`D 8A0A(B BBBA y hBpBxBQ Lf `fHp| A | gK A gE}(hES A ,h(cHh Dh>E` K H A `h(c0|h\LHhXS`EAR4iFAA } ABH ` ABM 4iHE] N S,Tj_kDD hAB<HjFED A(G@I (A ABBJ j,4jFAA [ ABJ cAB`kuBBB B(A0A8D@ 8A0A(B BBBA T 8F0A(B BBBE t8l)PQGLLlBAK U ABJ Y ABD O ABF IAB8l]BBA D(D0u (D ABBE XlFBD A(D0A (D ABBE R (C ABBF T(G ABB0x4m9FAA Gp  AABB <@nFHA A(G (A ABBD ,oeFAD t ABF @o`Hu C _<o<Ha G K(\oABAD vAB(oABAD vABloBOB E(A0A8G  8A0A(B BBBJ :  K X A  D _ A $$XJH W(B0N(A T A L,dxEC DKD F $zRx  , d> FOO E(A0A8D 8A0A(B BBBA  8F0A(B BBBA DTȨeFEE E(H0H8G@n8A0A(B BBB:9!%d%&f%I &r&R&R&&Rx%/&s3&u7&u;&uE&~J&}R&X&%a?`&+B-BCCjC/B1BC\pC`sCPe,<@WCdC 3B0*5B@82?PF>`TBT7Bp9B~C\%BA>;B @B DBHBLB QBUB BB YB]B BbB fBjB nBrB vBzB ~BpB pB`sB`sB `sB@WBBB BBB B B B  B B B0*B0*B 0*BXMBpB~B~BBB =>B?4? B B C C CCCC#C*C0C6C>CEC KC QC ZC bCfC/?lCrC |C 2D CCCCC'?CCCCCCCC C C C C C C C D  D D D $D )D /D 6D $??DDDGDRRRRR9&RRo%R ' $!!o00 P  H!! oooooX!'''(( (0(@(P(`(p((((((((()) )0)@)P)`)p)))))))))** *0*@*P*`*p*********++ +0+@+P+`+p+++++++++,, ,;Ap!!GA$3a1'O9 GA$3p11130$GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA! GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA*0# GA*GOW*GA$3a1P9$ GA$3p1113Au$GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobinGA$running gcc 8.5.0 20210514GA*GA! GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA*A GA*GOW*GA*$u$ GA*GOW*GA*$$ GA*GOW* GA*FORTIFY:e$ GA*FORTIFYA$GA+GLIBCXX_ASSERTIONSGA+GLIBCXX_ASSERTIONS:e$date-8.30-20.el8_10.x86_64.debug7zXZִF!t/"]?Eh=ڊ2N/G1:_gvn$}H ӕΊ:O>@@|r$#E?{yS..gQ<Spb %e9On|i5 s_|P{ju➯K+񡦉MHqm+\Њ I2ALAorլ3f&kN Ҹm]7( tq'j  Ʌ" ET1{$W]M1^2?8N(C9j?RV-xֳ42z*gtx*: ~zZ. 4Tk6RX HL팪s:"S"iEBI>[}9}RN2Q<1N {!qgt.n0X0pB,Fdp=,%umZ( @U9x=wZߴ^]-6֥7b]k>_sMB=0xo6աWCG㝜o]QtGפzk$}ta~~8OgtN񸱮;LcPvf/?T%6[-\Lx9Sw+ j8W]ͣ/Yg%Xcn];|YIEB@.مrFk;芀c7sjLZR\`l(бvk @?$/' { {av&o{7tR.zX?z&I}$format.rb000064400000071007152347516300006374 0ustar00# format.rb: Written by Tadayoshi Funaba 1999-2008 # $Id: format.rb,v 2.43 2008-01-17 20:16:31+09 tadf Exp $ require 'rational' class Date module Format # :nodoc: MONTHS = { 'january' => 1, 'february' => 2, 'march' => 3, 'april' => 4, 'may' => 5, 'june' => 6, 'july' => 7, 'august' => 8, 'september'=> 9, 'october' =>10, 'november' =>11, 'december' =>12 } DAYS = { 'sunday' => 0, 'monday' => 1, 'tuesday' => 2, 'wednesday'=> 3, 'thursday' => 4, 'friday' => 5, 'saturday' => 6 } ABBR_MONTHS = { 'jan' => 1, 'feb' => 2, 'mar' => 3, 'apr' => 4, 'may' => 5, 'jun' => 6, 'jul' => 7, 'aug' => 8, 'sep' => 9, 'oct' =>10, 'nov' =>11, 'dec' =>12 } ABBR_DAYS = { 'sun' => 0, 'mon' => 1, 'tue' => 2, 'wed' => 3, 'thu' => 4, 'fri' => 5, 'sat' => 6 } ZONES = { 'ut' => 0*3600, 'gmt' => 0*3600, 'est' => -5*3600, 'edt' => -4*3600, 'cst' => -6*3600, 'cdt' => -5*3600, 'mst' => -7*3600, 'mdt' => -6*3600, 'pst' => -8*3600, 'pdt' => -7*3600, 'a' => 1*3600, 'b' => 2*3600, 'c' => 3*3600, 'd' => 4*3600, 'e' => 5*3600, 'f' => 6*3600, 'g' => 7*3600, 'h' => 8*3600, 'i' => 9*3600, 'k' => 10*3600, 'l' => 11*3600, 'm' => 12*3600, 'n' => -1*3600, 'o' => -2*3600, 'p' => -3*3600, 'q' => -4*3600, 'r' => -5*3600, 's' => -6*3600, 't' => -7*3600, 'u' => -8*3600, 'v' => -9*3600, 'w' =>-10*3600, 'x' =>-11*3600, 'y' =>-12*3600, 'z' => 0*3600, 'utc' => 0*3600, 'wet' => 0*3600, 'at' => -2*3600, 'brst'=> -2*3600, 'ndt' => -(2*3600+1800), 'art' => -3*3600, 'adt' => -3*3600, 'brt' => -3*3600, 'clst'=> -3*3600, 'nst' => -(3*3600+1800), 'ast' => -4*3600, 'clt' => -4*3600, 'akdt'=> -8*3600, 'ydt' => -8*3600, 'akst'=> -9*3600, 'hadt'=> -9*3600, 'hdt' => -9*3600, 'yst' => -9*3600, 'ahst'=>-10*3600, 'cat' =>-10*3600, 'hast'=>-10*3600, 'hst' =>-10*3600, 'nt' =>-11*3600, 'idlw'=>-12*3600, 'bst' => 1*3600, 'cet' => 1*3600, 'fwt' => 1*3600, 'met' => 1*3600, 'mewt'=> 1*3600, 'mez' => 1*3600, 'swt' => 1*3600, 'wat' => 1*3600, 'west'=> 1*3600, 'cest'=> 2*3600, 'eet' => 2*3600, 'fst' => 2*3600, 'mest'=> 2*3600, 'mesz'=> 2*3600, 'sast'=> 2*3600, 'sst' => 2*3600, 'bt' => 3*3600, 'eat' => 3*3600, 'eest'=> 3*3600, 'msk' => 3*3600, 'msd' => 4*3600, 'zp4' => 4*3600, 'zp5' => 5*3600, 'ist' => (5*3600+1800), 'zp6' => 6*3600, 'wast'=> 7*3600, 'cct' => 8*3600, 'sgt' => 8*3600, 'wadt'=> 8*3600, 'jst' => 9*3600, 'kst' => 9*3600, 'east'=> 10*3600, 'gst' => 10*3600, 'eadt'=> 11*3600, 'idle'=> 12*3600, 'nzst'=> 12*3600, 'nzt' => 12*3600, 'nzdt'=> 13*3600, 'afghanistan' => 16200, 'alaskan' => -32400, 'arab' => 10800, 'arabian' => 14400, 'arabic' => 10800, 'atlantic' => -14400, 'aus central' => 34200, 'aus eastern' => 36000, 'azores' => -3600, 'canada central' => -21600, 'cape verde' => -3600, 'caucasus' => 14400, 'cen. australia' => 34200, 'central america' => -21600, 'central asia' => 21600, 'central europe' => 3600, 'central european' => 3600, 'central pacific' => 39600, 'central' => -21600, 'china' => 28800, 'dateline' => -43200, 'e. africa' => 10800, 'e. australia' => 36000, 'e. europe' => 7200, 'e. south america' => -10800, 'eastern' => -18000, 'egypt' => 7200, 'ekaterinburg' => 18000, 'fiji' => 43200, 'fle' => 7200, 'greenland' => -10800, 'greenwich' => 0, 'gtb' => 7200, 'hawaiian' => -36000, 'india' => 19800, 'iran' => 12600, 'jerusalem' => 7200, 'korea' => 32400, 'mexico' => -21600, 'mid-atlantic' => -7200, 'mountain' => -25200, 'myanmar' => 23400, 'n. central asia' => 21600, 'nepal' => 20700, 'new zealand' => 43200, 'newfoundland' => -12600, 'north asia east' => 28800, 'north asia' => 25200, 'pacific sa' => -14400, 'pacific' => -28800, 'romance' => 3600, 'russian' => 10800, 'sa eastern' => -10800, 'sa pacific' => -18000, 'sa western' => -14400, 'samoa' => -39600, 'se asia' => 25200, 'malay peninsula' => 28800, 'south africa' => 7200, 'sri lanka' => 21600, 'taipei' => 28800, 'tasmania' => 36000, 'tokyo' => 32400, 'tonga' => 46800, 'us eastern' => -18000, 'us mountain' => -25200, 'vladivostok' => 36000, 'w. australia' => 28800, 'w. central africa' => 3600, 'w. europe' => 3600, 'west asia' => 18000, 'west pacific' => 36000, 'yakutsk' => 32400 } [MONTHS, DAYS, ABBR_MONTHS, ABBR_DAYS, ZONES].each do |x| x.freeze end class Bag # :nodoc: def initialize @elem = {} end def method_missing(t, *args, &block) t = t.to_s set = t.chomp!('=') t = t.intern if set @elem[t] = args[0] else @elem[t] end end def to_hash @elem.reject{|k, v| /\A_/ =~ k.to_s || v.nil?} end end end def emit(e, f) # :nodoc: case e when Numeric sign = %w(+ + -)[e <=> 0] e = e.abs end s = e.to_s if f[:s] && f[:p] == '0' f[:w] -= 1 end if f[:s] && f[:p] == "\s" s[0,0] = sign end if f[:p] != '-' s = s.rjust(f[:w], f[:p]) end if f[:s] && f[:p] != "\s" s[0,0] = sign end s = s.upcase if f[:u] s = s.downcase if f[:d] s end def emit_w(e, w, f) # :nodoc: f[:w] = [f[:w], w].compact.max emit(e, f) end def emit_n(e, w, f) # :nodoc: f[:p] ||= '0' emit_w(e, w, f) end def emit_sn(e, w, f) # :nodoc: if e < 0 w += 1 f[:s] = true end emit_n(e, w, f) end def emit_z(e, w, f) # :nodoc: w += 1 f[:s] = true emit_n(e, w, f) end def emit_a(e, w, f) # :nodoc: f[:p] ||= "\s" emit_w(e, w, f) end def emit_ad(e, w, f) # :nodoc: if f[:x] f[:u] = true f[:d] = false end emit_a(e, w, f) end def emit_au(e, w, f) # :nodoc: if f[:x] f[:u] = false f[:d] = true end emit_a(e, w, f) end private :emit, :emit_w, :emit_n, :emit_sn, :emit_z, :emit_a, :emit_ad, :emit_au def strftime(fmt='%F') fmt.gsub(/%([-_0^#]+)?(\d+)?([EO]?(?::{1,3}z|.))/m) do |m| f = {} a = $& s, w, c = $1, $2, $3 if s s.scan(/./) do |k| case k when '-'; f[:p] = '-' when '_'; f[:p] = "\s" when '0'; f[:p] = '0' when '^'; f[:u] = true when '#'; f[:x] = true end end end if w f[:w] = w.to_i end case c when 'A'; emit_ad(DAYNAMES[wday], 0, f) when 'a'; emit_ad(ABBR_DAYNAMES[wday], 0, f) when 'B'; emit_ad(MONTHNAMES[mon], 0, f) when 'b'; emit_ad(ABBR_MONTHNAMES[mon], 0, f) when 'C', 'EC'; emit_sn((year / 100).floor, 2, f) when 'c', 'Ec'; emit_a(strftime('%a %b %e %H:%M:%S %Y'), 0, f) when 'D'; emit_a(strftime('%m/%d/%y'), 0, f) when 'd', 'Od'; emit_n(mday, 2, f) when 'e', 'Oe'; emit_a(mday, 2, f) when 'F' if m == '%F' format('%.4d-%02d-%02d', year, mon, mday) # 4p else emit_a(strftime('%Y-%m-%d'), 0, f) end when 'G'; emit_sn(cwyear, 4, f) when 'g'; emit_n(cwyear % 100, 2, f) when 'H', 'OH'; emit_n(hour, 2, f) when 'h'; emit_ad(strftime('%b'), 0, f) when 'I', 'OI'; emit_n((hour % 12).nonzero? || 12, 2, f) when 'j'; emit_n(yday, 3, f) when 'k'; emit_a(hour, 2, f) when 'L' emit_n((sec_fraction / MILLISECONDS_IN_DAY).floor, 3, f) when 'l'; emit_a((hour % 12).nonzero? || 12, 2, f) when 'M', 'OM'; emit_n(min, 2, f) when 'm', 'Om'; emit_n(mon, 2, f) when 'N' emit_n((sec_fraction / NANOSECONDS_IN_DAY).floor, 9, f) when 'n'; "\n" when 'P'; emit_ad(strftime('%p').downcase, 0, f) when 'p'; emit_au(if hour < 12 then 'AM' else 'PM' end, 0, f) when 'Q' s = ((ajd - UNIX_EPOCH_IN_AJD) / MILLISECONDS_IN_DAY).round emit_sn(s, 1, f) when 'R'; emit_a(strftime('%H:%M'), 0, f) when 'r'; emit_a(strftime('%I:%M:%S %p'), 0, f) when 'S', 'OS'; emit_n(sec, 2, f) when 's' s = ((ajd - UNIX_EPOCH_IN_AJD) / SECONDS_IN_DAY).round emit_sn(s, 1, f) when 'T' if m == '%T' format('%02d:%02d:%02d', hour, min, sec) # 4p else emit_a(strftime('%H:%M:%S'), 0, f) end when 't'; "\t" when 'U', 'W', 'OU', 'OW' emit_n(if c[-1,1] == 'U' then wnum0 else wnum1 end, 2, f) when 'u', 'Ou'; emit_n(cwday, 1, f) when 'V', 'OV'; emit_n(cweek, 2, f) when 'v'; emit_a(strftime('%e-%b-%Y'), 0, f) when 'w', 'Ow'; emit_n(wday, 1, f) when 'X', 'EX'; emit_a(strftime('%H:%M:%S'), 0, f) when 'x', 'Ex'; emit_a(strftime('%m/%d/%y'), 0, f) when 'Y', 'EY'; emit_sn(year, 4, f) when 'y', 'Ey', 'Oy'; emit_n(year % 100, 2, f) when 'Z'; emit_au(strftime('%:z'), 0, f) when /\A(:{0,3})z/ t = $1.size sign = if offset < 0 then -1 else +1 end fr = offset.abs ss = fr.div(SECONDS_IN_DAY) # 4p hh, ss = ss.divmod(3600) mm, ss = ss.divmod(60) if t == 3 if ss.nonzero? then t = 2 elsif mm.nonzero? then t = 1 else t = -1 end end case t when -1 tail = [] sep = '' when 0 f[:w] -= 2 if f[:w] tail = ['%02d' % mm] sep = '' when 1 f[:w] -= 3 if f[:w] tail = ['%02d' % mm] sep = ':' when 2 f[:w] -= 6 if f[:w] tail = ['%02d' % mm, '%02d' % ss] sep = ':' end ([emit_z(sign * hh, 2, f)] + tail).join(sep) when '%'; emit_a('%', 0, f) when '+'; emit_a(strftime('%a %b %e %H:%M:%S %Z %Y'), 0, f) when '1' if $VERBOSE warn("warning: strftime: %1 is deprecated; forget this") end emit_n(jd, 1, f) when '2' if $VERBOSE warn("warning: strftime: %2 is deprecated; use '%Y-%j'") end emit_a(strftime('%Y-%j'), 0, f) when '3' if $VERBOSE warn("warning: strftime: %3 is deprecated; use '%F'") end emit_a(strftime('%F'), 0, f) else a end end end # alias_method :format, :strftime def asctime() strftime('%c') end alias_method :ctime, :asctime =begin def iso8601() strftime('%F') end def rfc3339() iso8601 end def rfc2822() strftime('%a, %-d %b %Y %T %z') end alias_method :rfc822, :rfc2822 def jisx0301 if jd < 2405160 iso8601 else case jd when 2405160...2419614 g = 'M%02d' % (year - 1867) when 2419614...2424875 g = 'T%02d' % (year - 1911) when 2424875...2447535 g = 'S%02d' % (year - 1925) else g = 'H%02d' % (year - 1988) end g + strftime('.%m.%d') end end def beat(n=0) i, f = (new_offset(HOURS_IN_DAY).day_fraction * 1000).divmod(1) ('@%03d' % i) + if n < 1 '' else '.%0*d' % [n, (f / Rational(1, 10**n)).round] end end =end def self.num_pattern? (s) # :nodoc: /\A%[EO]?[CDdeFGgHIjkLlMmNQRrSsTUuVvWwXxYy\d]/ =~ s || /\A\d/ =~ s end private_class_method :num_pattern? def self._strptime_i(str, fmt, e) # :nodoc: fmt.scan(/%([EO]?(?::{1,3}z|.))|(.)/m) do |s, c| a = $& if s case s when 'A', 'a' return unless str.sub!(/\A(#{Format::DAYS.keys.join('|')})/io, '') || str.sub!(/\A(#{Format::ABBR_DAYS.keys.join('|')})/io, '') val = Format::DAYS[$1.downcase] || Format::ABBR_DAYS[$1.downcase] return unless val e.wday = val when 'B', 'b', 'h' return unless str.sub!(/\A(#{Format::MONTHS.keys.join('|')})/io, '') || str.sub!(/\A(#{Format::ABBR_MONTHS.keys.join('|')})/io, '') val = Format::MONTHS[$1.downcase] || Format::ABBR_MONTHS[$1.downcase] return unless val e.mon = val when 'C', 'EC' return unless str.sub!(if num_pattern?($') then /\A([-+]?\d{1,2})/ else /\A([-+]?\d{1,})/ end, '') val = $1.to_i e._cent = val when 'c', 'Ec' return unless _strptime_i(str, '%a %b %e %H:%M:%S %Y', e) when 'D' return unless _strptime_i(str, '%m/%d/%y', e) when 'd', 'e', 'Od', 'Oe' return unless str.sub!(/\A( \d|\d{1,2})/, '') val = $1.to_i return unless (1..31) === val e.mday = val when 'F' return unless _strptime_i(str, '%Y-%m-%d', e) when 'G' return unless str.sub!(if num_pattern?($') then /\A([-+]?\d{1,4})/ else /\A([-+]?\d{1,})/ end, '') val = $1.to_i e.cwyear = val when 'g' return unless str.sub!(/\A(\d{1,2})/, '') val = $1.to_i return unless (0..99) === val e.cwyear = val e._cent ||= if val >= 69 then 19 else 20 end when 'H', 'k', 'OH' return unless str.sub!(/\A( \d|\d{1,2})/, '') val = $1.to_i return unless (0..24) === val e.hour = val when 'I', 'l', 'OI' return unless str.sub!(/\A( \d|\d{1,2})/, '') val = $1.to_i return unless (1..12) === val e.hour = val when 'j' return unless str.sub!(/\A(\d{1,3})/, '') val = $1.to_i return unless (1..366) === val e.yday = val when 'L' return unless str.sub!(if num_pattern?($') then /\A([-+]?\d{1,3})/ else /\A([-+]?\d{1,})/ end, '') # val = Rational($1.to_i, 10**3) val = Rational($1.to_i, 10**$1.size) e.sec_fraction = val when 'M', 'OM' return unless str.sub!(/\A(\d{1,2})/, '') val = $1.to_i return unless (0..59) === val e.min = val when 'm', 'Om' return unless str.sub!(/\A(\d{1,2})/, '') val = $1.to_i return unless (1..12) === val e.mon = val when 'N' return unless str.sub!(if num_pattern?($') then /\A([-+]?\d{1,9})/ else /\A([-+]?\d{1,})/ end, '') # val = Rational($1.to_i, 10**9) val = Rational($1.to_i, 10**$1.size) e.sec_fraction = val when 'n', 't' return unless _strptime_i(str, "\s", e) when 'P', 'p' return unless str.sub!(/\A([ap])(?:m\b|\.m\.)/i, '') e._merid = if $1.downcase == 'a' then 0 else 12 end when 'Q' return unless str.sub!(/\A(-?\d{1,})/, '') val = Rational($1.to_i, 10**3) e.seconds = val when 'R' return unless _strptime_i(str, '%H:%M', e) when 'r' return unless _strptime_i(str, '%I:%M:%S %p', e) when 'S', 'OS' return unless str.sub!(/\A(\d{1,2})/, '') val = $1.to_i return unless (0..60) === val e.sec = val when 's' return unless str.sub!(/\A(-?\d{1,})/, '') val = $1.to_i e.seconds = val when 'T' return unless _strptime_i(str, '%H:%M:%S', e) when 'U', 'W', 'OU', 'OW' return unless str.sub!(/\A(\d{1,2})/, '') val = $1.to_i return unless (0..53) === val e.__send__(if s[-1,1] == 'U' then :wnum0= else :wnum1= end, val) when 'u', 'Ou' return unless str.sub!(/\A(\d{1})/, '') val = $1.to_i return unless (1..7) === val e.cwday = val when 'V', 'OV' return unless str.sub!(/\A(\d{1,2})/, '') val = $1.to_i return unless (1..53) === val e.cweek = val when 'v' return unless _strptime_i(str, '%e-%b-%Y', e) when 'w' return unless str.sub!(/\A(\d{1})/, '') val = $1.to_i return unless (0..6) === val e.wday = val when 'X', 'EX' return unless _strptime_i(str, '%H:%M:%S', e) when 'x', 'Ex' return unless _strptime_i(str, '%m/%d/%y', e) when 'Y', 'EY' return unless str.sub!(if num_pattern?($') then /\A([-+]?\d{1,4})/ else /\A([-+]?\d{1,})/ end, '') val = $1.to_i e.year = val when 'y', 'Ey', 'Oy' return unless str.sub!(/\A(\d{1,2})/, '') val = $1.to_i return unless (0..99) === val e.year = val e._cent ||= if val >= 69 then 19 else 20 end when 'Z', /\A:{0,3}z/ return unless str.sub!(/\A((?:gmt|utc?)?[-+]\d+(?:[,.:]\d+(?::\d+)?)? |[[:alpha:].\s]+(?:standard|daylight)\s+time\b |[[:alpha:]]+(?:\s+dst)?\b )/ix, '') val = $1 e.zone = val offset = zone_to_diff(val) e.offset = offset when '%' return unless str.sub!(/\A%/, '') when '+' return unless _strptime_i(str, '%a %b %e %H:%M:%S %Z %Y', e) when '1' if $VERBOSE warn("warning: strptime: %1 is deprecated; forget this") end return unless str.sub!(/\A(\d+)/, '') val = $1.to_i e.jd = val when '2' if $VERBOSE warn("warning: strptime: %2 is deprecated; use '%Y-%j'") end return unless _strptime_i(str, '%Y-%j', e) when '3' if $VERBOSE warn("warning: strptime: %3 is deprecated; use '%F'") end return unless _strptime_i(str, '%F', e) else return unless str.sub!(Regexp.new('\\A' + Regexp.quote(a)), '') end else case c when /\A[\s\v]/ str.sub!(/\A[\s\v]+/, '') else return unless str.sub!(Regexp.new('\\A' + Regexp.quote(a)), '') end end end end private_class_method :_strptime_i def self._strptime(str, fmt='%F') str = str.dup e = Format::Bag.new return unless _strptime_i(str, fmt, e) if e._cent if e.cwyear e.cwyear += e._cent * 100 end if e.year e. year += e._cent * 100 end end if e._merid if e.hour e.hour %= 12 e.hour += e._merid end end unless str.empty? e.leftover = str end e.to_hash end def self.s3e(e, y, m, d, bc=false) unless String === m m = m.to_s end if y && m && !d y, m, d = d, y, m end if y == nil if d && d.size > 2 y = d d = nil end if d && d[0,1] == "'" y = d d = nil end end if y y.scan(/(\d+)(.+)?/) if $2 y, d = d, $1 end end if m if m[0,1] == "'" || m.size > 2 y, m, d = m, d, y # us -> be end end if d if d[0,1] == "'" || d.size > 2 y, d = d, y end end if y y =~ /([-+])?(\d+)/ if $1 || $2.size > 2 c = false end iy = $&.to_i if bc iy = -iy + 1 end e.year = iy end if m m =~ /\d+/ e.mon = $&.to_i end if d d =~ /\d+/ e.mday = $&.to_i end if c != nil e._comp = c end end private_class_method :s3e def self._parse_day(str, e) # :nodoc: if str.sub!(/\b(#{Format::ABBR_DAYS.keys.join('|')})[^-\d\s]*/ino, ' ') e.wday = Format::ABBR_DAYS[$1.downcase] true =begin elsif str.sub!(/\b(?!\dth)(su|mo|tu|we|th|fr|sa)\b/in, ' ') e.wday = %w(su mo tu we th fr sa).index($1.downcase) true =end end end def self._parse_time(str, e) # :nodoc: if str.sub!( /( (?: \d+\s*:\s*\d+ (?: \s*:\s*\d+(?:[,.]\d*)? )? | \d+\s*h(?:\s*\d+m?(?:\s*\d+s?)?)? ) (?: \s* [ap](?:m\b|\.m\.) )? | \d+\s*[ap](?:m\b|\.m\.) ) (?: \s* ( (?:gmt|utc?)?[-+]\d+(?:[,.:]\d+(?::\d+)?)? | [[:alpha:].\s]+(?:standard|daylight)\stime\b | [[:alpha:]]+(?:\sdst)?\b ) )? /inx, ' ') t = $1 e.zone = $2 if $2 t =~ /\A(\d+)h? (?:\s*:?\s*(\d+)m? (?: \s*:?\s*(\d+)(?:[,.](\d+))?s? )? )? (?:\s*([ap])(?:m\b|\.m\.))?/inx e.hour = $1.to_i e.min = $2.to_i if $2 e.sec = $3.to_i if $3 e.sec_fraction = Rational($4.to_i, 10**$4.size) if $4 if $5 e.hour %= 12 if $5.downcase == 'p' e.hour += 12 end end true end end =begin def self._parse_beat(str, e) # :nodoc: if str.sub!(/@\s*(\d+)(?:[,.](\d*))?/, ' ') beat = Rational($1.to_i) beat += Rational($2.to_i, 10**$2.size) if $2 secs = Rational(beat, 1000) h, min, s, fr = self.day_fraction_to_time(secs) e.hour = h e.min = min e.sec = s e.sec_fraction = fr * 86400 e.zone = '+01:00' true end end =end def self._parse_eu(str, e) # :nodoc: if str.sub!( /'?(\d+)[^-\d\s]* \s* (#{Format::ABBR_MONTHS.keys.join('|')})[^-\d\s']* (?: \s* (c(?:e|\.e\.)|b(?:ce|\.c\.e\.)|a(?:d|\.d\.)|b(?:c|\.c\.))? \s* ('?-?\d+(?:(?:st|nd|rd|th)\b)?) )? /inox, ' ') # ' s3e(e, $4, Format::ABBR_MONTHS[$2.downcase], $1, $3 && $3[0,1].downcase == 'b') true end end def self._parse_us(str, e) # :nodoc: if str.sub!( /\b(#{Format::ABBR_MONTHS.keys.join('|')})[^-\d\s']* \s* ('?\d+)[^-\d\s']* (?: \s* (c(?:e|\.e\.)|b(?:ce|\.c\.e\.)|a(?:d|\.d\.)|b(?:c|\.c\.))? \s* ('?-?\d+) )? /inox, ' ') # ' s3e(e, $4, Format::ABBR_MONTHS[$1.downcase], $2, $3 && $3[0,1].downcase == 'b') true end end def self._parse_iso(str, e) # :nodoc: if str.sub!(/('?[-+]?\d+)-(\d+)-('?-?\d+)/n, ' ') s3e(e, $1, $2, $3) true end end def self._parse_iso2(str, e) # :nodoc: if str.sub!(/\b(\d{2}|\d{4})?-?w(\d{2})(?:-?(\d))?\b/in, ' ') e.cwyear = $1.to_i if $1 e.cweek = $2.to_i e.cwday = $3.to_i if $3 true elsif str.sub!(/-w-(\d)\b/in, ' ') e.cwday = $1.to_i true elsif str.sub!(/--(\d{2})?-(\d{2})\b/n, ' ') e.mon = $1.to_i if $1 e.mday = $2.to_i true elsif str.sub!(/--(\d{2})(\d{2})?\b/n, ' ') e.mon = $1.to_i e.mday = $2.to_i if $2 true elsif /[,.](\d{2}|\d{4})-\d{3}\b/n !~ str && str.sub!(/\b(\d{2}|\d{4})-(\d{3})\b/n, ' ') e.year = $1.to_i e.yday = $2.to_i true elsif /\d-\d{3}\b/n !~ str && str.sub!(/\b-(\d{3})\b/n, ' ') e.yday = $1.to_i true end end def self._parse_jis(str, e) # :nodoc: if str.sub!(/\b([mtsh])(\d+)\.(\d+)\.(\d+)/in, ' ') era = { 'm'=>1867, 't'=>1911, 's'=>1925, 'h'=>1988 }[$1.downcase] e.year = $2.to_i + era e.mon = $3.to_i e.mday = $4.to_i true end end def self._parse_vms(str, e) # :nodoc: if str.sub!(/('?-?\d+)-(#{Format::ABBR_MONTHS.keys.join('|')})[^-]* -('?-?\d+)/inox, ' ') s3e(e, $3, Format::ABBR_MONTHS[$2.downcase], $1) true elsif str.sub!(/\b(#{Format::ABBR_MONTHS.keys.join('|')})[^-]* -('?-?\d+)(?:-('?-?\d+))?/inox, ' ') s3e(e, $3, Format::ABBR_MONTHS[$1.downcase], $2) true end end def self._parse_sla(str, e) # :nodoc: if str.sub!(%r|('?-?\d+)/\s*('?\d+)(?:\D\s*('?-?\d+))?|n, ' ') # ' s3e(e, $3, $1, $2) true end end def self._parse_dot(str, e) # :nodoc: if str.sub!(%r|('?-?\d+)\.\s*('?\d+)\.\s*('?-?\d+)|n, ' ') # ' s3e(e, $1, $2, $3) true end end def self._parse_year(str, e) # :nodoc: if str.sub!(/'(\d+)\b/n, ' ') e.year = $1.to_i true end end def self._parse_mon(str, e) # :nodoc: if str.sub!(/\b(#{Format::ABBR_MONTHS.keys.join('|')})\S*/ino, ' ') e.mon = Format::ABBR_MONTHS[$1.downcase] true end end def self._parse_mday(str, e) # :nodoc: if str.sub!(/(\d+)(st|nd|rd|th)\b/in, ' ') e.mday = $1.to_i true end end def self._parse_ddd(str, e) # :nodoc: if str.sub!( /([-+]?)(\d{2,14}) (?: \s* t? \s* (\d{2,6})?(?:[,.](\d*))? )? (?: \s* ( z\b | [-+]\d{1,4}\b | \[[-+]?\d[^\]]*\] ) )? /inx, ' ') case $2.size when 2 if $3.nil? && $4 e.sec = $2[-2, 2].to_i else e.mday = $2[ 0, 2].to_i end when 4 if $3.nil? && $4 e.sec = $2[-2, 2].to_i e.min = $2[-4, 2].to_i else e.mon = $2[ 0, 2].to_i e.mday = $2[ 2, 2].to_i end when 6 if $3.nil? && $4 e.sec = $2[-2, 2].to_i e.min = $2[-4, 2].to_i e.hour = $2[-6, 2].to_i else e.year = ($1 + $2[ 0, 2]).to_i e.mon = $2[ 2, 2].to_i e.mday = $2[ 4, 2].to_i end when 8, 10, 12, 14 if $3.nil? && $4 e.sec = $2[-2, 2].to_i e.min = $2[-4, 2].to_i e.hour = $2[-6, 2].to_i e.mday = $2[-8, 2].to_i if $2.size >= 10 e.mon = $2[-10, 2].to_i end if $2.size == 12 e.year = ($1 + $2[-12, 2]).to_i end if $2.size == 14 e.year = ($1 + $2[-14, 4]).to_i e._comp = false end else e.year = ($1 + $2[ 0, 4]).to_i e.mon = $2[ 4, 2].to_i e.mday = $2[ 6, 2].to_i e.hour = $2[ 8, 2].to_i if $2.size >= 10 e.min = $2[10, 2].to_i if $2.size >= 12 e.sec = $2[12, 2].to_i if $2.size >= 14 e._comp = false end when 3 if $3.nil? && $4 e.sec = $2[-2, 2].to_i e.min = $2[-3, 1].to_i else e.yday = $2[ 0, 3].to_i end when 5 if $3.nil? && $4 e.sec = $2[-2, 2].to_i e.min = $2[-4, 2].to_i e.hour = $2[-5, 1].to_i else e.year = ($1 + $2[ 0, 2]).to_i e.yday = $2[ 2, 3].to_i end when 7 if $3.nil? && $4 e.sec = $2[-2, 2].to_i e.min = $2[-4, 2].to_i e.hour = $2[-6, 2].to_i e.mday = $2[-7, 1].to_i else e.year = ($1 + $2[ 0, 4]).to_i e.yday = $2[ 4, 3].to_i end end if $3 if $4 case $3.size when 2, 4, 6 e.sec = $3[-2, 2].to_i e.min = $3[-4, 2].to_i if $3.size >= 4 e.hour = $3[-6, 2].to_i if $3.size >= 6 end else case $3.size when 2, 4, 6 e.hour = $3[ 0, 2].to_i e.min = $3[ 2, 2].to_i if $3.size >= 4 e.sec = $3[ 4, 2].to_i if $3.size >= 6 end end end if $4 e.sec_fraction = Rational($4.to_i, 10**$4.size) end if $5 e.zone = $5 if e.zone[0,1] == '[' o, n, = e.zone[1..-2].split(':') e.zone = n || o if /\A\d/ =~ o o = format('+%s', o) end e.offset = zone_to_diff(o) end end true end end private_class_method :_parse_day, :_parse_time, # :_parse_beat, :_parse_eu, :_parse_us, :_parse_iso, :_parse_iso2, :_parse_jis, :_parse_vms, :_parse_sla, :_parse_dot, :_parse_year, :_parse_mon, :_parse_mday, :_parse_ddd def self._parse(str, comp=false) str = str.dup e = Format::Bag.new e._comp = comp str.gsub!(/[^-+',.\/:@[:alnum:]\[\]\x80-\xff]+/n, ' ') _parse_time(str, e) # || _parse_beat(str, e) _parse_day(str, e) _parse_eu(str, e) || _parse_us(str, e) || _parse_iso(str, e) || _parse_jis(str, e) || _parse_vms(str, e) || _parse_sla(str, e) || _parse_dot(str, e) || _parse_iso2(str, e) || _parse_year(str, e) || _parse_mon(str, e) || _parse_mday(str, e) || _parse_ddd(str, e) if str.sub!(/\b(bc\b|bce\b|b\.c\.|b\.c\.e\.)/in, ' ') if e.year e.year = -e.year + 1 end end if str.sub!(/\A\s*(\d{1,2})\s*\z/n, ' ') if e.hour && !e.mday v = $1.to_i if (1..31) === v e.mday = v end end if e.mday && !e.hour v = $1.to_i if (0..24) === v e.hour = v end end end if e._comp if e.cwyear if e.cwyear >= 0 && e.cwyear <= 99 e.cwyear += if e.cwyear >= 69 then 1900 else 2000 end end end if e.year if e.year >= 0 && e.year <= 99 e.year += if e.year >= 69 then 1900 else 2000 end end end end e.offset ||= zone_to_diff(e.zone) if e.zone e.to_hash end def self.zone_to_diff(zone) # :nodoc: zone = zone.downcase if zone.sub!(/\s+(standard|daylight)\s+time\z/, '') dst = $1 == 'daylight' else dst = zone.sub!(/\s+dst\z/, '') end if Format::ZONES.include?(zone) offset = Format::ZONES[zone] offset += 3600 if dst elsif zone.sub!(/\A(?:gmt|utc?)?([-+])/, '') sign = $1 if zone.include?(':') hour, min, sec, = zone.split(':') elsif zone.include?(',') || zone.include?('.') hour, fr, = zone.split(/[,.]/) min = Rational(fr.to_i, 10**fr.size) * 60 else case zone.size when 3 hour = zone[0,1] min = zone[1,2] else hour = zone[0,2] min = zone[2,2] sec = zone[4,2] end end offset = hour.to_i * 3600 + min.to_i * 60 + sec.to_i offset *= -1 if sign == '-' end offset end end class DateTime < Date def strftime(fmt='%FT%T%:z') super(fmt) end def self._strptime(str, fmt='%FT%T%z') super(str, fmt) end =begin def iso8601_timediv(n) # :nodoc: strftime('T%T' + if n < 1 '' else '.%0*d' % [n, (sec_fraction / SECONDS_IN_DAY / (10**n)).round] end + '%:z') end private :iso8601_timediv def iso8601(n=0) super() + iso8601_timediv(n) end def rfc3339(n=0) iso8601(n) end def jisx0301(n=0) super() + iso8601_timediv(n) end =end end