diff --git a/.cover b/.cover new file mode 100644 index 0000000..94e62b9 --- /dev/null +++ b/.cover @@ -0,0 +1,4 @@ +-ignore +DM5.pm +-ignore +TZdata.pm diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..657610e --- /dev/null +++ b/.travis.yml @@ -0,0 +1,12 @@ +language: perl +sudo: false +os: + - linux +perl: + - "5.20" + - "5.18" + - "5.16" + - "5.14" + - "5.12" + - "5.10" + - "5.8" diff --git a/Changes b/Changes new file mode 100644 index 0000000..8ff7ad6 --- /dev/null +++ b/Changes @@ -0,0 +1,11 @@ +Written by: + Sullivan Beck (sbeck@cpan.org) +Any suggestions, bug reports, or donations :-) should be sent to me. + +6.00 2009-11-23 + - The history has been moved into the following documents: + Date::Manip::Changes5 + Date::Manip::Changes5to6 + Date::Manip::Changes6 + Please refer to them. + diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..343aa38 --- /dev/null +++ b/INSTALL @@ -0,0 +1,16 @@ +For instructions on installing this, or any other perl module in +a UNIX environment, please refer to: + + http://www.cpan.org/modules/INSTALL.html + http://learn.perl.org/faq/perlfaq8.html#How-do-I-install-a-module-from-CPAN- + +For instructions in a Windows environment running ActivePerl, +refer to one of the following (depending on your version of perl): + + http://docs.activestate.com/activeperl/5.6/faq/ActivePerl-faq2.html + http://docs.activestate.com/activeperl/5.8/faq/ActivePerl-faq2.html + http://docs.activestate.com/activeperl/5.10/faq/ActivePerl-faq2.html + http://docs.activestate.com/activeperl/5.12/faq/ActivePerl-faq2.html + http://docs.activestate.com/activeperl/5.14/faq/ActivePerl-faq2.html + http://docs.activestate.com/activeperl/5.16/faq/ActivePerl-faq2.html + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ae8dd20 --- /dev/null +++ b/LICENSE @@ -0,0 +1,3 @@ +This module is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + diff --git a/MANIFEST b/MANIFEST new file mode 100644 index 0000000..28c300b --- /dev/null +++ b/MANIFEST @@ -0,0 +1,1176 @@ +.cover +.travis.yml +Changes +examples/dm_date +examples/dm_zdump +examples/README.examples +INSTALL +internal/benchmarks/dateset3.txt +internal/benchmarks/dateset3_notz.txt +internal/benchmarks/dm5dm6_ex3 +internal/benchmarks/NOTES +internal/benchmarks/parse-1.date_parse.pl +internal/benchmarks/parse-1.date_time.pl +internal/benchmarks/parse-1.dm5.pl +internal/benchmarks/parse-1.dm6.pl +internal/benchmarks/parse-1.dm6_format.pl +internal/benchmarks/parse-1.dm6_opts.pl +internal/benchmarks/parse-1.in.pl +internal/benchmarks/parse-1.sh +internal/build.yaml +internal/data.abbrev.pl +internal/data.alias.pl +internal/data.misc.pl +internal/data.offset.pl +internal/dm_translate +internal/dumps +internal/gen_dm5abbrevs +internal/langpod +internal/leak.pl +internal/module.isp +internal/NOTES +internal/TODO +internal/TODO.7 +internal/translate +internal/tzdata +internal/tztab +internal/unicode +internal/windows.compare +lib/Date/Manip.pm +lib/Date/Manip.pod +lib/Date/Manip/Base.pm +lib/Date/Manip/Base.pod +lib/Date/Manip/Calc.pod +lib/Date/Manip/Changes5.pod +lib/Date/Manip/Changes5to6.pod +lib/Date/Manip/Changes6.pod +lib/Date/Manip/Config.pod +lib/Date/Manip/ConfigFile.pod +lib/Date/Manip/Date.pm +lib/Date/Manip/Date.pod +lib/Date/Manip/Delta.pm +lib/Date/Manip/Delta.pod +lib/Date/Manip/DM5.pm +lib/Date/Manip/DM5.pod +lib/Date/Manip/DM5abbrevs.pm +lib/Date/Manip/DM6.pm +lib/Date/Manip/DM6.pod +lib/Date/Manip/Examples.pod +lib/Date/Manip/History.pod +lib/Date/Manip/Holidays.pod +lib/Date/Manip/Interfaces.pod +lib/Date/Manip/Lang.pod +lib/Date/Manip/Lang/catalan.pm +lib/Date/Manip/Lang/catalan.pod +lib/Date/Manip/Lang/danish.pm +lib/Date/Manip/Lang/danish.pod +lib/Date/Manip/Lang/dutch.pm +lib/Date/Manip/Lang/dutch.pod +lib/Date/Manip/Lang/english.pm +lib/Date/Manip/Lang/english.pod +lib/Date/Manip/Lang/finnish.pm +lib/Date/Manip/Lang/finnish.pod +lib/Date/Manip/Lang/french.pm +lib/Date/Manip/Lang/french.pod +lib/Date/Manip/Lang/german.pm +lib/Date/Manip/Lang/german.pod +lib/Date/Manip/Lang/index.pm +lib/Date/Manip/Lang/italian.pm +lib/Date/Manip/Lang/italian.pod +lib/Date/Manip/Lang/norwegian.pm +lib/Date/Manip/Lang/norwegian.pod +lib/Date/Manip/Lang/polish.pm +lib/Date/Manip/Lang/polish.pod +lib/Date/Manip/Lang/portugue.pm +lib/Date/Manip/Lang/portugue.pod +lib/Date/Manip/Lang/romanian.pm +lib/Date/Manip/Lang/romanian.pod +lib/Date/Manip/Lang/russian.pm +lib/Date/Manip/Lang/russian.pod +lib/Date/Manip/Lang/spanish.pm +lib/Date/Manip/Lang/spanish.pod +lib/Date/Manip/Lang/swedish.pm +lib/Date/Manip/Lang/swedish.pod +lib/Date/Manip/Lang/turkish.pm +lib/Date/Manip/Lang/turkish.pod +lib/Date/Manip/Migration5to6.pod +lib/Date/Manip/Misc.pod +lib/Date/Manip/Obj.pm +lib/Date/Manip/Obj.pod +lib/Date/Manip/Objects.pod +lib/Date/Manip/Offset/off000.pm +lib/Date/Manip/Offset/off001.pm +lib/Date/Manip/Offset/off002.pm +lib/Date/Manip/Offset/off003.pm +lib/Date/Manip/Offset/off004.pm +lib/Date/Manip/Offset/off005.pm +lib/Date/Manip/Offset/off006.pm +lib/Date/Manip/Offset/off007.pm +lib/Date/Manip/Offset/off008.pm +lib/Date/Manip/Offset/off009.pm +lib/Date/Manip/Offset/off010.pm +lib/Date/Manip/Offset/off011.pm +lib/Date/Manip/Offset/off012.pm +lib/Date/Manip/Offset/off013.pm +lib/Date/Manip/Offset/off014.pm +lib/Date/Manip/Offset/off015.pm +lib/Date/Manip/Offset/off016.pm +lib/Date/Manip/Offset/off017.pm +lib/Date/Manip/Offset/off018.pm +lib/Date/Manip/Offset/off019.pm +lib/Date/Manip/Offset/off020.pm +lib/Date/Manip/Offset/off021.pm +lib/Date/Manip/Offset/off022.pm +lib/Date/Manip/Offset/off023.pm +lib/Date/Manip/Offset/off024.pm +lib/Date/Manip/Offset/off025.pm +lib/Date/Manip/Offset/off026.pm +lib/Date/Manip/Offset/off027.pm +lib/Date/Manip/Offset/off028.pm +lib/Date/Manip/Offset/off029.pm +lib/Date/Manip/Offset/off030.pm +lib/Date/Manip/Offset/off031.pm +lib/Date/Manip/Offset/off032.pm +lib/Date/Manip/Offset/off033.pm +lib/Date/Manip/Offset/off034.pm +lib/Date/Manip/Offset/off035.pm +lib/Date/Manip/Offset/off036.pm +lib/Date/Manip/Offset/off037.pm +lib/Date/Manip/Offset/off038.pm +lib/Date/Manip/Offset/off039.pm +lib/Date/Manip/Offset/off040.pm +lib/Date/Manip/Offset/off041.pm +lib/Date/Manip/Offset/off042.pm +lib/Date/Manip/Offset/off043.pm +lib/Date/Manip/Offset/off044.pm +lib/Date/Manip/Offset/off045.pm +lib/Date/Manip/Offset/off046.pm +lib/Date/Manip/Offset/off047.pm +lib/Date/Manip/Offset/off048.pm +lib/Date/Manip/Offset/off049.pm +lib/Date/Manip/Offset/off050.pm +lib/Date/Manip/Offset/off051.pm +lib/Date/Manip/Offset/off052.pm +lib/Date/Manip/Offset/off053.pm +lib/Date/Manip/Offset/off054.pm +lib/Date/Manip/Offset/off055.pm +lib/Date/Manip/Offset/off056.pm +lib/Date/Manip/Offset/off057.pm +lib/Date/Manip/Offset/off058.pm +lib/Date/Manip/Offset/off059.pm +lib/Date/Manip/Offset/off060.pm +lib/Date/Manip/Offset/off061.pm +lib/Date/Manip/Offset/off062.pm +lib/Date/Manip/Offset/off063.pm +lib/Date/Manip/Offset/off064.pm +lib/Date/Manip/Offset/off065.pm +lib/Date/Manip/Offset/off066.pm +lib/Date/Manip/Offset/off067.pm +lib/Date/Manip/Offset/off068.pm +lib/Date/Manip/Offset/off069.pm +lib/Date/Manip/Offset/off070.pm +lib/Date/Manip/Offset/off071.pm +lib/Date/Manip/Offset/off072.pm +lib/Date/Manip/Offset/off073.pm +lib/Date/Manip/Offset/off074.pm +lib/Date/Manip/Offset/off075.pm +lib/Date/Manip/Offset/off076.pm +lib/Date/Manip/Offset/off077.pm +lib/Date/Manip/Offset/off078.pm +lib/Date/Manip/Offset/off079.pm +lib/Date/Manip/Offset/off080.pm +lib/Date/Manip/Offset/off081.pm +lib/Date/Manip/Offset/off082.pm +lib/Date/Manip/Offset/off083.pm +lib/Date/Manip/Offset/off084.pm +lib/Date/Manip/Offset/off085.pm +lib/Date/Manip/Offset/off086.pm +lib/Date/Manip/Offset/off087.pm +lib/Date/Manip/Offset/off088.pm +lib/Date/Manip/Offset/off089.pm +lib/Date/Manip/Offset/off090.pm +lib/Date/Manip/Offset/off091.pm +lib/Date/Manip/Offset/off092.pm +lib/Date/Manip/Offset/off093.pm +lib/Date/Manip/Offset/off094.pm +lib/Date/Manip/Offset/off095.pm +lib/Date/Manip/Offset/off096.pm +lib/Date/Manip/Offset/off097.pm +lib/Date/Manip/Offset/off098.pm +lib/Date/Manip/Offset/off099.pm +lib/Date/Manip/Offset/off100.pm +lib/Date/Manip/Offset/off101.pm +lib/Date/Manip/Offset/off102.pm +lib/Date/Manip/Offset/off103.pm +lib/Date/Manip/Offset/off104.pm +lib/Date/Manip/Offset/off105.pm +lib/Date/Manip/Offset/off106.pm +lib/Date/Manip/Offset/off107.pm +lib/Date/Manip/Offset/off108.pm +lib/Date/Manip/Offset/off109.pm +lib/Date/Manip/Offset/off110.pm +lib/Date/Manip/Offset/off111.pm +lib/Date/Manip/Offset/off112.pm +lib/Date/Manip/Offset/off113.pm +lib/Date/Manip/Offset/off114.pm +lib/Date/Manip/Offset/off115.pm +lib/Date/Manip/Offset/off116.pm +lib/Date/Manip/Offset/off117.pm +lib/Date/Manip/Offset/off118.pm +lib/Date/Manip/Offset/off119.pm +lib/Date/Manip/Offset/off120.pm +lib/Date/Manip/Offset/off121.pm +lib/Date/Manip/Offset/off122.pm +lib/Date/Manip/Offset/off123.pm +lib/Date/Manip/Offset/off124.pm +lib/Date/Manip/Offset/off125.pm +lib/Date/Manip/Offset/off126.pm +lib/Date/Manip/Offset/off127.pm +lib/Date/Manip/Offset/off128.pm +lib/Date/Manip/Offset/off129.pm +lib/Date/Manip/Offset/off130.pm +lib/Date/Manip/Offset/off131.pm +lib/Date/Manip/Offset/off132.pm +lib/Date/Manip/Offset/off133.pm +lib/Date/Manip/Offset/off134.pm +lib/Date/Manip/Offset/off135.pm +lib/Date/Manip/Offset/off136.pm +lib/Date/Manip/Offset/off137.pm +lib/Date/Manip/Offset/off138.pm +lib/Date/Manip/Offset/off139.pm +lib/Date/Manip/Offset/off140.pm +lib/Date/Manip/Offset/off141.pm +lib/Date/Manip/Offset/off142.pm +lib/Date/Manip/Offset/off143.pm +lib/Date/Manip/Offset/off144.pm +lib/Date/Manip/Offset/off145.pm +lib/Date/Manip/Offset/off146.pm +lib/Date/Manip/Offset/off147.pm +lib/Date/Manip/Offset/off148.pm +lib/Date/Manip/Offset/off149.pm +lib/Date/Manip/Offset/off150.pm +lib/Date/Manip/Offset/off151.pm +lib/Date/Manip/Offset/off152.pm +lib/Date/Manip/Offset/off153.pm +lib/Date/Manip/Offset/off154.pm +lib/Date/Manip/Offset/off155.pm +lib/Date/Manip/Offset/off156.pm +lib/Date/Manip/Offset/off157.pm +lib/Date/Manip/Offset/off158.pm +lib/Date/Manip/Offset/off159.pm +lib/Date/Manip/Offset/off160.pm +lib/Date/Manip/Offset/off161.pm +lib/Date/Manip/Offset/off162.pm +lib/Date/Manip/Offset/off163.pm +lib/Date/Manip/Offset/off164.pm +lib/Date/Manip/Offset/off165.pm +lib/Date/Manip/Offset/off166.pm +lib/Date/Manip/Offset/off167.pm +lib/Date/Manip/Offset/off168.pm +lib/Date/Manip/Offset/off169.pm +lib/Date/Manip/Offset/off170.pm +lib/Date/Manip/Offset/off171.pm +lib/Date/Manip/Offset/off172.pm +lib/Date/Manip/Offset/off173.pm +lib/Date/Manip/Offset/off174.pm +lib/Date/Manip/Offset/off175.pm +lib/Date/Manip/Offset/off176.pm +lib/Date/Manip/Offset/off177.pm +lib/Date/Manip/Offset/off178.pm +lib/Date/Manip/Offset/off179.pm +lib/Date/Manip/Offset/off180.pm +lib/Date/Manip/Offset/off181.pm +lib/Date/Manip/Offset/off182.pm +lib/Date/Manip/Offset/off183.pm +lib/Date/Manip/Offset/off184.pm +lib/Date/Manip/Offset/off185.pm +lib/Date/Manip/Offset/off186.pm +lib/Date/Manip/Offset/off187.pm +lib/Date/Manip/Offset/off188.pm +lib/Date/Manip/Offset/off189.pm +lib/Date/Manip/Offset/off190.pm +lib/Date/Manip/Offset/off191.pm +lib/Date/Manip/Offset/off192.pm +lib/Date/Manip/Offset/off193.pm +lib/Date/Manip/Offset/off194.pm +lib/Date/Manip/Offset/off195.pm +lib/Date/Manip/Offset/off196.pm +lib/Date/Manip/Offset/off197.pm +lib/Date/Manip/Offset/off198.pm +lib/Date/Manip/Offset/off199.pm +lib/Date/Manip/Offset/off200.pm +lib/Date/Manip/Offset/off201.pm +lib/Date/Manip/Offset/off202.pm +lib/Date/Manip/Offset/off203.pm +lib/Date/Manip/Offset/off204.pm +lib/Date/Manip/Offset/off205.pm +lib/Date/Manip/Offset/off206.pm +lib/Date/Manip/Offset/off207.pm +lib/Date/Manip/Offset/off208.pm +lib/Date/Manip/Offset/off209.pm +lib/Date/Manip/Offset/off210.pm +lib/Date/Manip/Offset/off211.pm +lib/Date/Manip/Offset/off212.pm +lib/Date/Manip/Offset/off213.pm +lib/Date/Manip/Offset/off214.pm +lib/Date/Manip/Offset/off215.pm +lib/Date/Manip/Offset/off216.pm +lib/Date/Manip/Offset/off217.pm +lib/Date/Manip/Offset/off218.pm +lib/Date/Manip/Offset/off219.pm +lib/Date/Manip/Offset/off220.pm +lib/Date/Manip/Offset/off221.pm +lib/Date/Manip/Offset/off222.pm +lib/Date/Manip/Offset/off223.pm +lib/Date/Manip/Offset/off224.pm +lib/Date/Manip/Offset/off225.pm +lib/Date/Manip/Offset/off226.pm +lib/Date/Manip/Offset/off227.pm +lib/Date/Manip/Offset/off228.pm +lib/Date/Manip/Offset/off229.pm +lib/Date/Manip/Offset/off230.pm +lib/Date/Manip/Offset/off231.pm +lib/Date/Manip/Offset/off232.pm +lib/Date/Manip/Offset/off233.pm +lib/Date/Manip/Offset/off234.pm +lib/Date/Manip/Offset/off235.pm +lib/Date/Manip/Offset/off236.pm +lib/Date/Manip/Offset/off237.pm +lib/Date/Manip/Offset/off238.pm +lib/Date/Manip/Offset/off239.pm +lib/Date/Manip/Offset/off240.pm +lib/Date/Manip/Offset/off241.pm +lib/Date/Manip/Offset/off242.pm +lib/Date/Manip/Offset/off243.pm +lib/Date/Manip/Offset/off244.pm +lib/Date/Manip/Offset/off245.pm +lib/Date/Manip/Offset/off246.pm +lib/Date/Manip/Offset/off247.pm +lib/Date/Manip/Offset/off248.pm +lib/Date/Manip/Offset/off249.pm +lib/Date/Manip/Offset/off250.pm +lib/Date/Manip/Offset/off251.pm +lib/Date/Manip/Offset/off252.pm +lib/Date/Manip/Offset/off253.pm +lib/Date/Manip/Offset/off254.pm +lib/Date/Manip/Offset/off255.pm +lib/Date/Manip/Offset/off256.pm +lib/Date/Manip/Offset/off257.pm +lib/Date/Manip/Offset/off258.pm +lib/Date/Manip/Offset/off259.pm +lib/Date/Manip/Offset/off260.pm +lib/Date/Manip/Offset/off261.pm +lib/Date/Manip/Offset/off262.pm +lib/Date/Manip/Offset/off263.pm +lib/Date/Manip/Offset/off264.pm +lib/Date/Manip/Offset/off265.pm +lib/Date/Manip/Offset/off266.pm +lib/Date/Manip/Offset/off267.pm +lib/Date/Manip/Offset/off268.pm +lib/Date/Manip/Offset/off269.pm +lib/Date/Manip/Offset/off270.pm +lib/Date/Manip/Offset/off271.pm +lib/Date/Manip/Offset/off272.pm +lib/Date/Manip/Offset/off273.pm +lib/Date/Manip/Offset/off274.pm +lib/Date/Manip/Offset/off275.pm +lib/Date/Manip/Offset/off276.pm +lib/Date/Manip/Offset/off277.pm +lib/Date/Manip/Offset/off278.pm +lib/Date/Manip/Offset/off279.pm +lib/Date/Manip/Offset/off280.pm +lib/Date/Manip/Offset/off281.pm +lib/Date/Manip/Offset/off282.pm +lib/Date/Manip/Offset/off283.pm +lib/Date/Manip/Offset/off284.pm +lib/Date/Manip/Offset/off285.pm +lib/Date/Manip/Offset/off286.pm +lib/Date/Manip/Offset/off287.pm +lib/Date/Manip/Offset/off288.pm +lib/Date/Manip/Offset/off289.pm +lib/Date/Manip/Offset/off290.pm +lib/Date/Manip/Offset/off291.pm +lib/Date/Manip/Offset/off292.pm +lib/Date/Manip/Offset/off293.pm +lib/Date/Manip/Offset/off294.pm +lib/Date/Manip/Offset/off295.pm +lib/Date/Manip/Offset/off296.pm +lib/Date/Manip/Offset/off297.pm +lib/Date/Manip/Offset/off298.pm +lib/Date/Manip/Offset/off299.pm +lib/Date/Manip/Offset/off300.pm +lib/Date/Manip/Offset/off301.pm +lib/Date/Manip/Offset/off302.pm +lib/Date/Manip/Offset/off303.pm +lib/Date/Manip/Offset/off304.pm +lib/Date/Manip/Offset/off305.pm +lib/Date/Manip/Offset/off306.pm +lib/Date/Manip/Offset/off307.pm +lib/Date/Manip/Offset/off308.pm +lib/Date/Manip/Offset/off309.pm +lib/Date/Manip/Offset/off310.pm +lib/Date/Manip/Offset/off311.pm +lib/Date/Manip/Offset/off312.pm +lib/Date/Manip/Offset/off313.pm +lib/Date/Manip/Offset/off314.pm +lib/Date/Manip/Offset/off315.pm +lib/Date/Manip/Offset/off316.pm +lib/Date/Manip/Offset/off317.pm +lib/Date/Manip/Offset/off318.pm +lib/Date/Manip/Offset/off319.pm +lib/Date/Manip/Offset/off320.pm +lib/Date/Manip/Offset/off321.pm +lib/Date/Manip/Offset/off322.pm +lib/Date/Manip/Offset/off323.pm +lib/Date/Manip/Offset/off324.pm +lib/Date/Manip/Offset/off325.pm +lib/Date/Manip/Offset/off326.pm +lib/Date/Manip/Offset/off327.pm +lib/Date/Manip/Offset/off328.pm +lib/Date/Manip/Offset/off329.pm +lib/Date/Manip/Offset/off330.pm +lib/Date/Manip/Offset/off331.pm +lib/Date/Manip/Offset/off332.pm +lib/Date/Manip/Offset/off333.pm +lib/Date/Manip/Offset/off334.pm +lib/Date/Manip/Offset/off335.pm +lib/Date/Manip/Offset/off336.pm +lib/Date/Manip/Offset/off337.pm +lib/Date/Manip/Offset/off338.pm +lib/Date/Manip/Offset/off339.pm +lib/Date/Manip/Offset/off340.pm +lib/Date/Manip/Offset/off341.pm +lib/Date/Manip/Offset/off342.pm +lib/Date/Manip/Offset/off343.pm +lib/Date/Manip/Offset/off344.pm +lib/Date/Manip/Offset/off345.pm +lib/Date/Manip/Offset/off346.pm +lib/Date/Manip/Offset/off347.pm +lib/Date/Manip/Offset/off348.pm +lib/Date/Manip/Offset/off349.pm +lib/Date/Manip/Offset/off350.pm +lib/Date/Manip/Offset/off351.pm +lib/Date/Manip/Offset/off352.pm +lib/Date/Manip/Offset/off353.pm +lib/Date/Manip/Offset/off354.pm +lib/Date/Manip/Offset/off355.pm +lib/Date/Manip/Offset/off356.pm +lib/Date/Manip/Offset/off357.pm +lib/Date/Manip/Offset/off358.pm +lib/Date/Manip/Offset/off359.pm +lib/Date/Manip/Offset/off360.pm +lib/Date/Manip/Offset/off361.pm +lib/Date/Manip/Offset/off362.pm +lib/Date/Manip/Offset/off363.pm +lib/Date/Manip/Offset/off364.pm +lib/Date/Manip/Offset/off365.pm +lib/Date/Manip/Offset/off366.pm +lib/Date/Manip/Offset/off367.pm +lib/Date/Manip/Offset/off368.pm +lib/Date/Manip/Offset/off369.pm +lib/Date/Manip/Offset/off370.pm +lib/Date/Manip/Offset/off371.pm +lib/Date/Manip/Offset/off372.pm +lib/Date/Manip/Offset/off373.pm +lib/Date/Manip/Offset/off374.pm +lib/Date/Manip/Offset/off375.pm +lib/Date/Manip/Offset/off376.pm +lib/Date/Manip/Offset/off377.pm +lib/Date/Manip/Offset/off378.pm +lib/Date/Manip/Offset/off379.pm +lib/Date/Manip/Offset/off380.pm +lib/Date/Manip/Offset/off381.pm +lib/Date/Manip/Offset/off382.pm +lib/Date/Manip/Offset/off383.pm +lib/Date/Manip/Offset/off384.pm +lib/Date/Manip/Offset/off385.pm +lib/Date/Manip/Offset/off386.pm +lib/Date/Manip/Offset/off387.pm +lib/Date/Manip/Offset/off388.pm +lib/Date/Manip/Offset/off389.pm +lib/Date/Manip/Offset/off390.pm +lib/Date/Manip/Offset/off391.pm +lib/Date/Manip/Offset/off392.pm +lib/Date/Manip/Offset/off393.pm +lib/Date/Manip/Offset/off394.pm +lib/Date/Manip/Offset/off395.pm +lib/Date/Manip/Offset/off396.pm +lib/Date/Manip/Offset/off397.pm +lib/Date/Manip/Offset/off398.pm +lib/Date/Manip/Offset/off399.pm +lib/Date/Manip/Offset/off400.pm +lib/Date/Manip/Offset/off401.pm +lib/Date/Manip/Offset/off402.pm +lib/Date/Manip/Offset/off403.pm +lib/Date/Manip/Offset/off404.pm +lib/Date/Manip/Offset/off405.pm +lib/Date/Manip/Offset/off406.pm +lib/Date/Manip/Offset/off407.pm +lib/Date/Manip/Offset/off408.pm +lib/Date/Manip/Offset/off409.pm +lib/Date/Manip/Offset/off410.pm +lib/Date/Manip/Offset/off411.pm +lib/Date/Manip/Offset/off412.pm +lib/Date/Manip/Offset/off413.pm +lib/Date/Manip/Offset/off414.pm +lib/Date/Manip/Offset/off415.pm +lib/Date/Manip/Offset/off416.pm +lib/Date/Manip/Offset/off417.pm +lib/Date/Manip/Offset/off418.pm +lib/Date/Manip/Offset/off419.pm +lib/Date/Manip/Offset/off420.pm +lib/Date/Manip/Offset/off421.pm +lib/Date/Manip/Offset/off422.pm +lib/Date/Manip/Offset/off423.pm +lib/Date/Manip/Offset/off424.pm +lib/Date/Manip/Offset/off425.pm +lib/Date/Manip/Offset/off426.pm +lib/Date/Manip/Offset/off427.pm +lib/Date/Manip/Offset/off428.pm +lib/Date/Manip/Offset/off429.pm +lib/Date/Manip/Offset/off430.pm +lib/Date/Manip/Offset/off431.pm +lib/Date/Manip/Offset/off432.pm +lib/Date/Manip/Offset/off433.pm +lib/Date/Manip/Offset/off434.pm +lib/Date/Manip/Offset/off435.pm +lib/Date/Manip/Offset/off436.pm +lib/Date/Manip/Problems.pod +lib/Date/Manip/Recur.pm +lib/Date/Manip/Recur.pod +lib/Date/Manip/TZ.pm +lib/Date/Manip/TZ.pod +lib/Date/Manip/TZ/a00.pm +lib/Date/Manip/TZ/afabid00.pm +lib/Date/Manip/TZ/afaccr00.pm +lib/Date/Manip/TZ/afalgi00.pm +lib/Date/Manip/TZ/afbiss00.pm +lib/Date/Manip/TZ/afcair00.pm +lib/Date/Manip/TZ/afcasa00.pm +lib/Date/Manip/TZ/afceut00.pm +lib/Date/Manip/TZ/afel_a00.pm +lib/Date/Manip/TZ/afjoha00.pm +lib/Date/Manip/TZ/afkhar00.pm +lib/Date/Manip/TZ/aflago00.pm +lib/Date/Manip/TZ/afmapu00.pm +lib/Date/Manip/TZ/afmonr00.pm +lib/Date/Manip/TZ/afnair00.pm +lib/Date/Manip/TZ/afndja00.pm +lib/Date/Manip/TZ/aftrip00.pm +lib/Date/Manip/TZ/aftuni00.pm +lib/Date/Manip/TZ/afwind00.pm +lib/Date/Manip/TZ/amadak00.pm +lib/Date/Manip/TZ/amanch00.pm +lib/Date/Manip/TZ/amarag00.pm +lib/Date/Manip/TZ/amasun00.pm +lib/Date/Manip/TZ/amatik00.pm +lib/Date/Manip/TZ/ambahi00.pm +lib/Date/Manip/TZ/ambahi01.pm +lib/Date/Manip/TZ/ambarb00.pm +lib/Date/Manip/TZ/ambele00.pm +lib/Date/Manip/TZ/ambeli00.pm +lib/Date/Manip/TZ/ambeul00.pm +lib/Date/Manip/TZ/amblan00.pm +lib/Date/Manip/TZ/amboa_00.pm +lib/Date/Manip/TZ/ambogo00.pm +lib/Date/Manip/TZ/ambois00.pm +lib/Date/Manip/TZ/ambuen00.pm +lib/Date/Manip/TZ/amcamb00.pm +lib/Date/Manip/TZ/amcamp00.pm +lib/Date/Manip/TZ/amcanc00.pm +lib/Date/Manip/TZ/amcara00.pm +lib/Date/Manip/TZ/amcata00.pm +lib/Date/Manip/TZ/amcaye00.pm +lib/Date/Manip/TZ/amcent00.pm +lib/Date/Manip/TZ/amchic00.pm +lib/Date/Manip/TZ/amchih00.pm +lib/Date/Manip/TZ/amcord00.pm +lib/Date/Manip/TZ/amcost00.pm +lib/Date/Manip/TZ/amcres00.pm +lib/Date/Manip/TZ/amcuia00.pm +lib/Date/Manip/TZ/amcura00.pm +lib/Date/Manip/TZ/amdanm00.pm +lib/Date/Manip/TZ/amdaws00.pm +lib/Date/Manip/TZ/amdaws01.pm +lib/Date/Manip/TZ/amdenv00.pm +lib/Date/Manip/TZ/amdetr00.pm +lib/Date/Manip/TZ/amedmo00.pm +lib/Date/Manip/TZ/ameiru00.pm +lib/Date/Manip/TZ/amel_s00.pm +lib/Date/Manip/TZ/amfort00.pm +lib/Date/Manip/TZ/amfort01.pm +lib/Date/Manip/TZ/amglac00.pm +lib/Date/Manip/TZ/amgodt00.pm +lib/Date/Manip/TZ/amgoos00.pm +lib/Date/Manip/TZ/amgran00.pm +lib/Date/Manip/TZ/amguat00.pm +lib/Date/Manip/TZ/amguay00.pm +lib/Date/Manip/TZ/amguya00.pm +lib/Date/Manip/TZ/amhali00.pm +lib/Date/Manip/TZ/amhava00.pm +lib/Date/Manip/TZ/amherm00.pm +lib/Date/Manip/TZ/amindi00.pm +lib/Date/Manip/TZ/aminuv00.pm +lib/Date/Manip/TZ/amiqal00.pm +lib/Date/Manip/TZ/amjama00.pm +lib/Date/Manip/TZ/amjuju00.pm +lib/Date/Manip/TZ/amjune00.pm +lib/Date/Manip/TZ/amknox00.pm +lib/Date/Manip/TZ/amla_p00.pm +lib/Date/Manip/TZ/amla_r00.pm +lib/Date/Manip/TZ/amlima00.pm +lib/Date/Manip/TZ/amlos_00.pm +lib/Date/Manip/TZ/amloui00.pm +lib/Date/Manip/TZ/ammace00.pm +lib/Date/Manip/TZ/ammana00.pm +lib/Date/Manip/TZ/ammana01.pm +lib/Date/Manip/TZ/ammare00.pm +lib/Date/Manip/TZ/ammart00.pm +lib/Date/Manip/TZ/ammata00.pm +lib/Date/Manip/TZ/ammaza00.pm +lib/Date/Manip/TZ/ammend00.pm +lib/Date/Manip/TZ/ammeno00.pm +lib/Date/Manip/TZ/ammeri00.pm +lib/Date/Manip/TZ/ammetl00.pm +lib/Date/Manip/TZ/ammexi00.pm +lib/Date/Manip/TZ/ammiqu00.pm +lib/Date/Manip/TZ/ammonc00.pm +lib/Date/Manip/TZ/ammont00.pm +lib/Date/Manip/TZ/ammont01.pm +lib/Date/Manip/TZ/ammont02.pm +lib/Date/Manip/TZ/amnass00.pm +lib/Date/Manip/TZ/amnew_00.pm +lib/Date/Manip/TZ/amnew_01.pm +lib/Date/Manip/TZ/amnipi00.pm +lib/Date/Manip/TZ/amnome00.pm +lib/Date/Manip/TZ/amnoro00.pm +lib/Date/Manip/TZ/amojin00.pm +lib/Date/Manip/TZ/ampana00.pm +lib/Date/Manip/TZ/ampang00.pm +lib/Date/Manip/TZ/ampara00.pm +lib/Date/Manip/TZ/ampete00.pm +lib/Date/Manip/TZ/amphoe00.pm +lib/Date/Manip/TZ/amport00.pm +lib/Date/Manip/TZ/amport01.pm +lib/Date/Manip/TZ/amport02.pm +lib/Date/Manip/TZ/ampuer00.pm +lib/Date/Manip/TZ/ampunt00.pm +lib/Date/Manip/TZ/amrain00.pm +lib/Date/Manip/TZ/amrank00.pm +lib/Date/Manip/TZ/amreci00.pm +lib/Date/Manip/TZ/amregi00.pm +lib/Date/Manip/TZ/amreso00.pm +lib/Date/Manip/TZ/amrio_00.pm +lib/Date/Manip/TZ/amrio_01.pm +lib/Date/Manip/TZ/amsalt00.pm +lib/Date/Manip/TZ/amsan_00.pm +lib/Date/Manip/TZ/amsan_01.pm +lib/Date/Manip/TZ/amsant00.pm +lib/Date/Manip/TZ/amsant01.pm +lib/Date/Manip/TZ/amsant02.pm +lib/Date/Manip/TZ/amsao_00.pm +lib/Date/Manip/TZ/amscor00.pm +lib/Date/Manip/TZ/amsitk00.pm +lib/Date/Manip/TZ/amst_j00.pm +lib/Date/Manip/TZ/amswif00.pm +lib/Date/Manip/TZ/amtegu00.pm +lib/Date/Manip/TZ/amtell00.pm +lib/Date/Manip/TZ/amthul00.pm +lib/Date/Manip/TZ/amthun00.pm +lib/Date/Manip/TZ/amtiju00.pm +lib/Date/Manip/TZ/amtoro00.pm +lib/Date/Manip/TZ/amtucu00.pm +lib/Date/Manip/TZ/amushu00.pm +lib/Date/Manip/TZ/amvanc00.pm +lib/Date/Manip/TZ/amveva00.pm +lib/Date/Manip/TZ/amvinc00.pm +lib/Date/Manip/TZ/amwhit00.pm +lib/Date/Manip/TZ/amwina00.pm +lib/Date/Manip/TZ/amwinn00.pm +lib/Date/Manip/TZ/amyaku00.pm +lib/Date/Manip/TZ/amyell00.pm +lib/Date/Manip/TZ/ancase00.pm +lib/Date/Manip/TZ/andavi00.pm +lib/Date/Manip/TZ/andumo00.pm +lib/Date/Manip/TZ/anmacq00.pm +lib/Date/Manip/TZ/anmaws00.pm +lib/Date/Manip/TZ/anpalm00.pm +lib/Date/Manip/TZ/anroth00.pm +lib/Date/Manip/TZ/ansyow00.pm +lib/Date/Manip/TZ/antrol00.pm +lib/Date/Manip/TZ/anvost00.pm +lib/Date/Manip/TZ/asalma00.pm +lib/Date/Manip/TZ/asamma00.pm +lib/Date/Manip/TZ/asanad00.pm +lib/Date/Manip/TZ/asaqta00.pm +lib/Date/Manip/TZ/asaqto00.pm +lib/Date/Manip/TZ/asashg00.pm +lib/Date/Manip/TZ/asatyr00.pm +lib/Date/Manip/TZ/asbagh00.pm +lib/Date/Manip/TZ/asbaku00.pm +lib/Date/Manip/TZ/asbang00.pm +lib/Date/Manip/TZ/asbarn00.pm +lib/Date/Manip/TZ/asbeir00.pm +lib/Date/Manip/TZ/asbish00.pm +lib/Date/Manip/TZ/asbrun00.pm +lib/Date/Manip/TZ/aschit00.pm +lib/Date/Manip/TZ/aschoi00.pm +lib/Date/Manip/TZ/ascolo00.pm +lib/Date/Manip/TZ/asdama00.pm +lib/Date/Manip/TZ/asdhak00.pm +lib/Date/Manip/TZ/asdili00.pm +lib/Date/Manip/TZ/asduba00.pm +lib/Date/Manip/TZ/asdush00.pm +lib/Date/Manip/TZ/asfama00.pm +lib/Date/Manip/TZ/asgaza00.pm +lib/Date/Manip/TZ/ashebr00.pm +lib/Date/Manip/TZ/asho_c00.pm +lib/Date/Manip/TZ/ashong00.pm +lib/Date/Manip/TZ/ashovd00.pm +lib/Date/Manip/TZ/asirku00.pm +lib/Date/Manip/TZ/asjaka00.pm +lib/Date/Manip/TZ/asjaya00.pm +lib/Date/Manip/TZ/asjeru00.pm +lib/Date/Manip/TZ/askabu00.pm +lib/Date/Manip/TZ/askamc00.pm +lib/Date/Manip/TZ/askara00.pm +lib/Date/Manip/TZ/askath00.pm +lib/Date/Manip/TZ/askhan00.pm +lib/Date/Manip/TZ/askolk00.pm +lib/Date/Manip/TZ/askras00.pm +lib/Date/Manip/TZ/askual00.pm +lib/Date/Manip/TZ/askuch00.pm +lib/Date/Manip/TZ/asmaca00.pm +lib/Date/Manip/TZ/asmaga00.pm +lib/Date/Manip/TZ/asmaka00.pm +lib/Date/Manip/TZ/asmani00.pm +lib/Date/Manip/TZ/asnico00.pm +lib/Date/Manip/TZ/asnovo00.pm +lib/Date/Manip/TZ/asnovo01.pm +lib/Date/Manip/TZ/asomsk00.pm +lib/Date/Manip/TZ/asoral00.pm +lib/Date/Manip/TZ/aspont00.pm +lib/Date/Manip/TZ/aspyon00.pm +lib/Date/Manip/TZ/asqata00.pm +lib/Date/Manip/TZ/asqyzy00.pm +lib/Date/Manip/TZ/asriya00.pm +lib/Date/Manip/TZ/assakh00.pm +lib/Date/Manip/TZ/assama00.pm +lib/Date/Manip/TZ/asseou00.pm +lib/Date/Manip/TZ/asshan00.pm +lib/Date/Manip/TZ/assing00.pm +lib/Date/Manip/TZ/assred00.pm +lib/Date/Manip/TZ/astaip00.pm +lib/Date/Manip/TZ/astash00.pm +lib/Date/Manip/TZ/astbil00.pm +lib/Date/Manip/TZ/astehr00.pm +lib/Date/Manip/TZ/asthim00.pm +lib/Date/Manip/TZ/astoky00.pm +lib/Date/Manip/TZ/astoms00.pm +lib/Date/Manip/TZ/asulaa00.pm +lib/Date/Manip/TZ/asurum00.pm +lib/Date/Manip/TZ/asustm00.pm +lib/Date/Manip/TZ/asvlad00.pm +lib/Date/Manip/TZ/asyaku00.pm +lib/Date/Manip/TZ/asyang00.pm +lib/Date/Manip/TZ/asyeka00.pm +lib/Date/Manip/TZ/asyere00.pm +lib/Date/Manip/TZ/atazor00.pm +lib/Date/Manip/TZ/atberm00.pm +lib/Date/Manip/TZ/atcana00.pm +lib/Date/Manip/TZ/atcape00.pm +lib/Date/Manip/TZ/atfaro00.pm +lib/Date/Manip/TZ/atmade00.pm +lib/Date/Manip/TZ/atreyk00.pm +lib/Date/Manip/TZ/atsout00.pm +lib/Date/Manip/TZ/atstan00.pm +lib/Date/Manip/TZ/auadel00.pm +lib/Date/Manip/TZ/aubris00.pm +lib/Date/Manip/TZ/aubrok00.pm +lib/Date/Manip/TZ/aucurr00.pm +lib/Date/Manip/TZ/audarw00.pm +lib/Date/Manip/TZ/aueucl00.pm +lib/Date/Manip/TZ/auhoba00.pm +lib/Date/Manip/TZ/aulind00.pm +lib/Date/Manip/TZ/aulord00.pm +lib/Date/Manip/TZ/aumelb00.pm +lib/Date/Manip/TZ/aupert00.pm +lib/Date/Manip/TZ/ausydn00.pm +lib/Date/Manip/TZ/b00.pm +lib/Date/Manip/TZ/c00.pm +lib/Date/Manip/TZ/cet00.pm +lib/Date/Manip/TZ/d00.pm +lib/Date/Manip/TZ/e00.pm +lib/Date/Manip/TZ/eet00.pm +lib/Date/Manip/TZ/etgmt00.pm +lib/Date/Manip/TZ/etgmtm00.pm +lib/Date/Manip/TZ/etgmtm01.pm +lib/Date/Manip/TZ/etgmtm02.pm +lib/Date/Manip/TZ/etgmtm03.pm +lib/Date/Manip/TZ/etgmtm04.pm +lib/Date/Manip/TZ/etgmtm05.pm +lib/Date/Manip/TZ/etgmtm06.pm +lib/Date/Manip/TZ/etgmtm07.pm +lib/Date/Manip/TZ/etgmtm08.pm +lib/Date/Manip/TZ/etgmtm09.pm +lib/Date/Manip/TZ/etgmtm10.pm +lib/Date/Manip/TZ/etgmtm11.pm +lib/Date/Manip/TZ/etgmtm12.pm +lib/Date/Manip/TZ/etgmtm13.pm +lib/Date/Manip/TZ/etgmtp00.pm +lib/Date/Manip/TZ/etgmtp01.pm +lib/Date/Manip/TZ/etgmtp02.pm +lib/Date/Manip/TZ/etgmtp03.pm +lib/Date/Manip/TZ/etgmtp04.pm +lib/Date/Manip/TZ/etgmtp05.pm +lib/Date/Manip/TZ/etgmtp06.pm +lib/Date/Manip/TZ/etgmtp07.pm +lib/Date/Manip/TZ/etgmtp08.pm +lib/Date/Manip/TZ/etgmtp09.pm +lib/Date/Manip/TZ/etgmtp10.pm +lib/Date/Manip/TZ/etgmtp11.pm +lib/Date/Manip/TZ/euamst00.pm +lib/Date/Manip/TZ/euando00.pm +lib/Date/Manip/TZ/euastr00.pm +lib/Date/Manip/TZ/euathe00.pm +lib/Date/Manip/TZ/eubelg00.pm +lib/Date/Manip/TZ/euberl00.pm +lib/Date/Manip/TZ/eubrus00.pm +lib/Date/Manip/TZ/eubuch00.pm +lib/Date/Manip/TZ/eubuda00.pm +lib/Date/Manip/TZ/euchis00.pm +lib/Date/Manip/TZ/eucope00.pm +lib/Date/Manip/TZ/eudubl00.pm +lib/Date/Manip/TZ/eugibr00.pm +lib/Date/Manip/TZ/euhels00.pm +lib/Date/Manip/TZ/euista00.pm +lib/Date/Manip/TZ/eukali00.pm +lib/Date/Manip/TZ/eukiev00.pm +lib/Date/Manip/TZ/eukiro00.pm +lib/Date/Manip/TZ/eulisb00.pm +lib/Date/Manip/TZ/eulond00.pm +lib/Date/Manip/TZ/euluxe00.pm +lib/Date/Manip/TZ/eumadr00.pm +lib/Date/Manip/TZ/eumalt00.pm +lib/Date/Manip/TZ/eumins00.pm +lib/Date/Manip/TZ/eumona00.pm +lib/Date/Manip/TZ/eumosc00.pm +lib/Date/Manip/TZ/euoslo00.pm +lib/Date/Manip/TZ/eupari00.pm +lib/Date/Manip/TZ/euprag00.pm +lib/Date/Manip/TZ/euriga00.pm +lib/Date/Manip/TZ/eurome00.pm +lib/Date/Manip/TZ/eusama00.pm +lib/Date/Manip/TZ/eusara00.pm +lib/Date/Manip/TZ/eusimf00.pm +lib/Date/Manip/TZ/eusofi00.pm +lib/Date/Manip/TZ/eustoc00.pm +lib/Date/Manip/TZ/eutall00.pm +lib/Date/Manip/TZ/eutira00.pm +lib/Date/Manip/TZ/euulya00.pm +lib/Date/Manip/TZ/euuzhg00.pm +lib/Date/Manip/TZ/euvien00.pm +lib/Date/Manip/TZ/euviln00.pm +lib/Date/Manip/TZ/euvolg00.pm +lib/Date/Manip/TZ/euwars00.pm +lib/Date/Manip/TZ/euzapo00.pm +lib/Date/Manip/TZ/euzuri00.pm +lib/Date/Manip/TZ/f00.pm +lib/Date/Manip/TZ/g00.pm +lib/Date/Manip/TZ/h00.pm +lib/Date/Manip/TZ/i00.pm +lib/Date/Manip/TZ/inchag00.pm +lib/Date/Manip/TZ/inchri00.pm +lib/Date/Manip/TZ/incoco00.pm +lib/Date/Manip/TZ/inkerg00.pm +lib/Date/Manip/TZ/inmahe00.pm +lib/Date/Manip/TZ/inmald00.pm +lib/Date/Manip/TZ/inmaur00.pm +lib/Date/Manip/TZ/inreun00.pm +lib/Date/Manip/TZ/k00.pm +lib/Date/Manip/TZ/l00.pm +lib/Date/Manip/TZ/m00.pm +lib/Date/Manip/TZ/met00.pm +lib/Date/Manip/TZ/n00.pm +lib/Date/Manip/TZ/o00.pm +lib/Date/Manip/TZ/p00.pm +lib/Date/Manip/TZ/paapia00.pm +lib/Date/Manip/TZ/paauck00.pm +lib/Date/Manip/TZ/paboug00.pm +lib/Date/Manip/TZ/pachat00.pm +lib/Date/Manip/TZ/pachuu00.pm +lib/Date/Manip/TZ/paeast00.pm +lib/Date/Manip/TZ/paefat00.pm +lib/Date/Manip/TZ/paende00.pm +lib/Date/Manip/TZ/pafaka00.pm +lib/Date/Manip/TZ/pafiji00.pm +lib/Date/Manip/TZ/pafuna00.pm +lib/Date/Manip/TZ/pagala00.pm +lib/Date/Manip/TZ/pagamb00.pm +lib/Date/Manip/TZ/paguad00.pm +lib/Date/Manip/TZ/paguam00.pm +lib/Date/Manip/TZ/pahono00.pm +lib/Date/Manip/TZ/pakiri00.pm +lib/Date/Manip/TZ/pakosr00.pm +lib/Date/Manip/TZ/pakwaj00.pm +lib/Date/Manip/TZ/pamaju00.pm +lib/Date/Manip/TZ/pamarq00.pm +lib/Date/Manip/TZ/panaur00.pm +lib/Date/Manip/TZ/paniue00.pm +lib/Date/Manip/TZ/panorf00.pm +lib/Date/Manip/TZ/panoum00.pm +lib/Date/Manip/TZ/papago00.pm +lib/Date/Manip/TZ/papala00.pm +lib/Date/Manip/TZ/papitc00.pm +lib/Date/Manip/TZ/papohn00.pm +lib/Date/Manip/TZ/paport00.pm +lib/Date/Manip/TZ/pararo00.pm +lib/Date/Manip/TZ/patahi00.pm +lib/Date/Manip/TZ/patara00.pm +lib/Date/Manip/TZ/patong00.pm +lib/Date/Manip/TZ/pawake00.pm +lib/Date/Manip/TZ/pawall00.pm +lib/Date/Manip/TZ/q00.pm +lib/Date/Manip/TZ/r00.pm +lib/Date/Manip/TZ/s00.pm +lib/Date/Manip/TZ/t00.pm +lib/Date/Manip/TZ/u00.pm +lib/Date/Manip/TZ/ut00.pm +lib/Date/Manip/TZ/utc00.pm +lib/Date/Manip/TZ/v00.pm +lib/Date/Manip/TZ/w00.pm +lib/Date/Manip/TZ/wet00.pm +lib/Date/Manip/TZ/x00.pm +lib/Date/Manip/TZ/y00.pm +lib/Date/Manip/TZ/z00.pm +lib/Date/Manip/TZ_Base.pm +lib/Date/Manip/TZ_Base.pod +lib/Date/Manip/TZdata.pm +lib/Date/Manip/TZdata.pod +lib/Date/Manip/Zones.pm +lib/Date/Manip/Zones.pod +LICENSE +Makefile.PL +MANIFEST This list of files +README +README.first +t/.ppo.yaml +t/base._calc_date_ymwd.t +t/base._config.t +t/base._critical_date.t +t/base._fix_year.50.t +t/base._fix_year.c.t +t/base._fix_year.c18.t +t/base._fix_year.c1890.t +t/base.calc_date_date.t +t/base.calc_date_days.t +t/base.calc_date_delta.t +t/base.calc_date_time.t +t/base.calc_time_time.t +t/base.check.t +t/base.cmp.t +t/base.day_of_week.t +t/base.day_of_year.0.t +t/base.day_of_year.1.t +t/base.days_in_month.t +t/base.days_in_year.t +t/base.days_since_1bc.t +t/base.join.t +t/base.leapyear.t +t/base.nth_day_of_week.t +t/base.secs_since_1970.t +t/base.split.t +t/base.week1_day1.t +t/base.week_of_year.0.t +t/base.week_of_year.1.t +t/base.weeks_in_year.t +t/date.calc.data_date_bsemi.t +t/date.calc.date_date_approx.t +t/date.calc.date_date_bapprox.t +t/date.calc.date_date_business.t +t/date.calc.date_date_exact.t +t/date.calc.date_date_semi.t +t/date.calc.date_delta.romanian.t +t/date.calc.date_delta_approx.t +t/date.calc.date_delta_business.0.t +t/date.calc.date_delta_business.1.t +t/date.calc.date_delta_business.2.t +t/date.calc.date_delta_business.3.t +t/date.calc.date_delta_business.4.t +t/date.calc.date_delta_business.french.t +t/date.calc.date_delta_exact.t +t/date.cmp.t +t/date.complete.t +t/date.convert.t +t/date.holiday.0.t +t/date.holiday.1.t +t/date.init_args.t +t/date.is.t +t/date.is_business_day.t +t/date.list_events.0.t +t/date.list_events.1.t +t/date.list_holidays.0.t +t/date.list_holidays.1.t +t/date.list_holidays.2.t +t/date.list_holidays.3.t +t/date.list_holidays.4.t +t/date.nearest_business_day.t +t/date.next.t +t/date.next_business_day.t +t/date.parse.catalan.t +t/date.parse.common.t +t/date.parse.danish.t +t/date.parse.delta.t +t/date.parse.dst.t +t/date.parse.dutch.t +t/date.parse.english.t +t/date.parse.french.t +t/date.parse.holidays.t +t/date.parse.invalid.t +t/date.parse.iso.t +t/date.parse.italian.t +t/date.parse.misc.0.t +t/date.parse.misc.1.t +t/date.parse.mmmyyyy.first.t +t/date.parse.mmmyyyy.last.t +t/date.parse.mmmyyyy.t +t/date.parse.period.t +t/date.parse.polish.t +t/date.parse.portuguese.t +t/date.parse.romanian.t +t/date.parse.russian.cp1251.t +t/date.parse.russian.koi8-r.t +t/date.parse.russian.t +t/date.parse.spanish.t +t/date.parse.swedish.t +t/date.parse.timezone.t +t/date.parse.turkish.t +t/date.parse_date.common.t +t/date.parse_date.iso.t +t/date.parse_date.misc.0.t +t/date.parse_date.misc.1.t +t/date.parse_date.mmmyyyy.first.t +t/date.parse_date.mmmyyyy.last.t +t/date.parse_date.mmmyyyy.t +t/date.parse_format.0.t +t/date.parse_format.1.t +t/date.parse_time.t +t/date.prev.t +t/date.prev_business_day.t +t/date.printf.0.t +t/date.printf.1.t +t/date.secs_since_1970_GMT.0.t +t/date.secs_since_1970_GMT.1.t +t/date.set.0.t +t/date.set.1.t +t/date.set.2.t +t/date.set.3.t +t/date.week_of_year.0.t +t/date.week_of_year.1.t +t/delta.calc.delta_delta_approx.t +t/delta.calc.delta_delta_business.0.t +t/delta.calc.delta_delta_business.1.t +t/delta.calc.delta_delta_exact.t +t/delta.cmp.t +t/delta.convert.t +t/delta.init_args.t +t/delta.is.t +t/delta.parse.fract.t +t/delta.parse.t +t/delta.printf.t +t/delta.set.t +t/delta.type.t +t/delta.value.t +t/dm5.convtz.t +t/dm5.date.t +t/dm5.date_date_0.t +t/dm5.date_date_1.t +t/dm5.date_date_2a.t +t/dm5.date_date_2b.t +t/dm5.date_delta_0.t +t/dm5.date_delta_1.t +t/dm5.date_delta_2a.t +t/dm5.date_delta_2b.t +t/dm5.date_delta_french.t +t/dm5.date_delta_sign.t +t/dm5.date_french.t +t/dm5.date_german.t +t/dm5.date_misc_a.t +t/dm5.date_misc_b.t +t/dm5.date_romanian.t +t/dm5.date_today_0.t +t/dm5.date_today_1.t +t/dm5.delta_a.t +t/dm5.delta_b.t +t/dm5.delta_delta_0.t +t/dm5.delta_delta_1.t +t/dm5.delta_delta_2a.t +t/dm5.delta_delta_2b.t +t/dm5.delta_format.t +t/dm5.delta_romanian.t +t/dm5.events.t +t/dm5.getnext.t +t/dm5.getprev.t +t/dm5.normalize_business.t +t/dm5.nthday.t +t/dm5.recur_0.t +t/dm5.recur_1.t +t/dm5.settime.t +t/dm5.unixdate.t +t/Events.cnf +t/Holidays.1.cnf +t/Holidays.2.cnf +t/Holidays.3.cnf +t/Manip.cnf +t/Manip.cnf.part1 +t/Manip.cnf.part2 +t/Manip5.cnf +t/New_Years.1.cnf +t/New_Years.2.cnf +t/New_Years.3.cnf +t/New_Years.4.cnf +t/obj.t +t/OldEvents.cnf +t/orig.convtz.t +t/orig.date_isholiday.t +t/orig.datecalc.date_date.t +t/orig.datecalc.date_delta.0.t +t/orig.datecalc.date_delta.1.t +t/orig.delta_format.t +t/orig.eventslist.t +t/orig.getnext.t +t/orig.getprev.t +t/orig.nthdayofyear.t +t/orig.parsedatedelta.t +t/orig.parsedateformat.t +t/orig.parsedatestring.t +t/orig.parserecur.t +t/orig.settime.t +t/orig.unixdate.t +t/pod.t +t/pod_coverage.ign +t/pod_coverage.t +t/recur.dates.0.t +t/recur.dates.1.t +t/recur.dates.2.t +t/recur.dates.3.t +t/recur.frequency.t +t/recur.init_args.t +t/recur.is.t +t/recur.nth.t +t/runtests +t/runtests.bat +t/tz.all_periods.t +t/tz.convert.t +t/tz.convert_from_gmt.t +t/tz.convert_to_gmt.t +t/tz.date_period.t +t/tz.define_abbrev.t +t/tz.define_alias.t +t/tz.define_offset.t +t/tz.periods.t +t/tz.zone.t +t/tzdata._ruleinfo.t +t/tzdata._zoneinfo.t +META.yml Module YAML meta-data (added by MakeMaker) +META.json Module JSON meta-data (added by MakeMaker) diff --git a/META.json b/META.json new file mode 100644 index 0000000..e5761a5 --- /dev/null +++ b/META.json @@ -0,0 +1,3546 @@ +{ + "abstract" : "Date manipulation routines", + "author" : [ + "Sullivan Beck (sbeck@cpan.org)" + ], + "dynamic_config" : 1, + "generated_by" : "ExtUtils::MakeMaker version 7.3, CPAN::Meta::Converter version 2.150010", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : 2 + }, + "name" : "Date-Manip", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "0" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.67_01" + } + }, + "runtime" : { + "requires" : { + "Carp" : "0", + "Cwd" : "0", + "Data::Dumper" : "0", + "Encode" : "0", + "File::Find" : "0", + "File::Spec" : "0", + "IO::File" : "0", + "Storable" : "0", + "perl" : "5.006", + "utf8" : "0" + } + }, + "test" : { + "requires" : { + "Test::Inter" : "0", + "Test::More" : "0" + } + } + }, + "provides" : { + "Date::Manip" : { + "file" : "Manip.pm", + "version" : "6.60" + }, + "Date::Manip::Base" : { + "file" : "Base.pm", + "version" : "6.60" + }, + "Date::Manip::DM5" : { + "file" : "DM5.pm", + "version" : "6.60" + }, + "Date::Manip::DM5abbrevs" : { + "file" : "DM5abbrevs.pm", + "version" : "6.60" + }, + "Date::Manip::DM6" : { + "file" : "DM6.pm", + "version" : "6.60" + }, + "Date::Manip::Date" : { + "file" : "Date.pm", + "version" : "6.60" + }, + "Date::Manip::Delta" : { + "file" : "Delta.pm", + "version" : "6.60" + }, + "Date::Manip::Lang::catalan" : { + "file" : "catalan.pm", + "version" : "6.60" + }, + "Date::Manip::Lang::danish" : { + "file" : "danish.pm", + "version" : "6.60" + }, + "Date::Manip::Lang::dutch" : { + "file" : "dutch.pm", + "version" : "6.60" + }, + "Date::Manip::Lang::english" : { + "file" : "english.pm", + "version" : "6.60" + }, + "Date::Manip::Lang::finnish" : { + "file" : "finnish.pm", + "version" : "6.60" + }, + "Date::Manip::Lang::french" : { + "file" : "french.pm", + "version" : "6.60" + }, + "Date::Manip::Lang::german" : { + "file" : "german.pm", + "version" : "6.60" + }, + "Date::Manip::Lang::index" : { + "file" : "index.pm", + "version" : "6.60" + }, + "Date::Manip::Lang::italian" : { + "file" : "italian.pm", + "version" : "6.60" + }, + "Date::Manip::Lang::norwegian" : { + "file" : "norwegian.pm", + "version" : "6.60" + }, + "Date::Manip::Lang::polish" : { + "file" : "polish.pm", + "version" : "6.60" + }, + "Date::Manip::Lang::portugue" : { + "file" : "portugue.pm", + "version" : "6.60" + }, + "Date::Manip::Lang::romanian" : { + "file" : "romanian.pm", + "version" : "6.60" + }, + "Date::Manip::Lang::russian" : { + "file" : "russian.pm", + "version" : "6.60" + }, + "Date::Manip::Lang::spanish" : { + "file" : "spanish.pm", + "version" : "6.60" + }, + "Date::Manip::Lang::swedish" : { + "file" : "swedish.pm", + "version" : "6.60" + }, + "Date::Manip::Lang::turkish" : { + "file" : "turkish.pm", + "version" : "6.60" + }, + "Date::Manip::Obj" : { + "file" : "Obj.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off000" : { + "file" : "off000.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off001" : { + "file" : "off001.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off002" : { + "file" : "off002.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off003" : { + "file" : "off003.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off004" : { + "file" : "off004.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off005" : { + "file" : "off005.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off006" : { + "file" : "off006.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off007" : { + "file" : "off007.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off008" : { + "file" : "off008.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off009" : { + "file" : "off009.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off010" : { + "file" : "off010.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off011" : { + "file" : "off011.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off012" : { + "file" : "off012.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off013" : { + "file" : "off013.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off014" : { + "file" : "off014.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off015" : { + "file" : "off015.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off016" : { + "file" : "off016.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off017" : { + "file" : "off017.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off018" : { + "file" : "off018.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off019" : { + "file" : "off019.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off020" : { + "file" : "off020.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off021" : { + "file" : "off021.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off022" : { + "file" : "off022.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off023" : { + "file" : "off023.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off024" : { + "file" : "off024.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off025" : { + "file" : "off025.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off026" : { + "file" : "off026.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off027" : { + "file" : "off027.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off028" : { + "file" : "off028.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off029" : { + "file" : "off029.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off030" : { + "file" : "off030.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off031" : { + "file" : "off031.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off032" : { + "file" : "off032.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off033" : { + "file" : "off033.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off034" : { + "file" : "off034.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off035" : { + "file" : "off035.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off036" : { + "file" : "off036.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off037" : { + "file" : "off037.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off038" : { + "file" : "off038.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off039" : { + "file" : "off039.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off040" : { + "file" : "off040.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off041" : { + "file" : "off041.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off042" : { + "file" : "off042.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off043" : { + "file" : "off043.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off044" : { + "file" : "off044.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off045" : { + "file" : "off045.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off046" : { + "file" : "off046.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off047" : { + "file" : "off047.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off048" : { + "file" : "off048.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off049" : { + "file" : "off049.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off050" : { + "file" : "off050.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off051" : { + "file" : "off051.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off052" : { + "file" : "off052.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off053" : { + "file" : "off053.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off054" : { + "file" : "off054.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off055" : { + "file" : "off055.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off056" : { + "file" : "off056.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off057" : { + "file" : "off057.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off058" : { + "file" : "off058.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off059" : { + "file" : "off059.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off060" : { + "file" : "off060.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off061" : { + "file" : "off061.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off062" : { + "file" : "off062.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off063" : { + "file" : "off063.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off064" : { + "file" : "off064.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off065" : { + "file" : "off065.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off066" : { + "file" : "off066.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off067" : { + "file" : "off067.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off068" : { + "file" : "off068.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off069" : { + "file" : "off069.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off070" : { + "file" : "off070.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off071" : { + "file" : "off071.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off072" : { + "file" : "off072.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off073" : { + "file" : "off073.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off074" : { + "file" : "off074.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off075" : { + "file" : "off075.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off076" : { + "file" : "off076.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off077" : { + "file" : "off077.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off078" : { + "file" : "off078.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off079" : { + "file" : "off079.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off080" : { + "file" : "off080.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off081" : { + "file" : "off081.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off082" : { + "file" : "off082.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off083" : { + "file" : "off083.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off084" : { + "file" : "off084.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off085" : { + "file" : "off085.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off086" : { + "file" : "off086.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off087" : { + "file" : "off087.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off088" : { + "file" : "off088.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off089" : { + "file" : "off089.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off090" : { + "file" : "off090.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off091" : { + "file" : "off091.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off092" : { + "file" : "off092.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off093" : { + "file" : "off093.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off094" : { + "file" : "off094.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off095" : { + "file" : "off095.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off096" : { + "file" : "off096.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off097" : { + "file" : "off097.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off098" : { + "file" : "off098.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off099" : { + "file" : "off099.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off100" : { + "file" : "off100.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off101" : { + "file" : "off101.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off102" : { + "file" : "off102.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off103" : { + "file" : "off103.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off104" : { + "file" : "off104.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off105" : { + "file" : "off105.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off106" : { + "file" : "off106.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off107" : { + "file" : "off107.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off108" : { + "file" : "off108.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off109" : { + "file" : "off109.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off110" : { + "file" : "off110.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off111" : { + "file" : "off111.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off112" : { + "file" : "off112.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off113" : { + "file" : "off113.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off114" : { + "file" : "off114.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off115" : { + "file" : "off115.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off116" : { + "file" : "off116.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off117" : { + "file" : "off117.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off118" : { + "file" : "off118.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off119" : { + "file" : "off119.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off120" : { + "file" : "off120.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off121" : { + "file" : "off121.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off122" : { + "file" : "off122.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off123" : { + "file" : "off123.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off124" : { + "file" : "off124.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off125" : { + "file" : "off125.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off126" : { + "file" : "off126.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off127" : { + "file" : "off127.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off128" : { + "file" : "off128.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off129" : { + "file" : "off129.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off130" : { + "file" : "off130.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off131" : { + "file" : "off131.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off132" : { + "file" : "off132.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off133" : { + "file" : "off133.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off134" : { + "file" : "off134.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off135" : { + "file" : "off135.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off136" : { + "file" : "off136.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off137" : { + "file" : "off137.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off138" : { + "file" : "off138.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off139" : { + "file" : "off139.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off140" : { + "file" : "off140.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off141" : { + "file" : "off141.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off142" : { + "file" : "off142.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off143" : { + "file" : "off143.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off144" : { + "file" : "off144.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off145" : { + "file" : "off145.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off146" : { + "file" : "off146.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off147" : { + "file" : "off147.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off148" : { + "file" : "off148.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off149" : { + "file" : "off149.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off150" : { + "file" : "off150.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off151" : { + "file" : "off151.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off152" : { + "file" : "off152.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off153" : { + "file" : "off153.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off154" : { + "file" : "off154.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off155" : { + "file" : "off155.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off156" : { + "file" : "off156.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off157" : { + "file" : "off157.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off158" : { + "file" : "off158.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off159" : { + "file" : "off159.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off160" : { + "file" : "off160.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off161" : { + "file" : "off161.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off162" : { + "file" : "off162.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off163" : { + "file" : "off163.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off164" : { + "file" : "off164.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off165" : { + "file" : "off165.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off166" : { + "file" : "off166.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off167" : { + "file" : "off167.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off168" : { + "file" : "off168.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off169" : { + "file" : "off169.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off170" : { + "file" : "off170.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off171" : { + "file" : "off171.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off172" : { + "file" : "off172.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off173" : { + "file" : "off173.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off174" : { + "file" : "off174.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off175" : { + "file" : "off175.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off176" : { + "file" : "off176.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off177" : { + "file" : "off177.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off178" : { + "file" : "off178.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off179" : { + "file" : "off179.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off180" : { + "file" : "off180.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off181" : { + "file" : "off181.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off182" : { + "file" : "off182.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off183" : { + "file" : "off183.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off184" : { + "file" : "off184.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off185" : { + "file" : "off185.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off186" : { + "file" : "off186.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off187" : { + "file" : "off187.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off188" : { + "file" : "off188.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off189" : { + "file" : "off189.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off190" : { + "file" : "off190.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off191" : { + "file" : "off191.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off192" : { + "file" : "off192.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off193" : { + "file" : "off193.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off194" : { + "file" : "off194.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off195" : { + "file" : "off195.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off196" : { + "file" : "off196.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off197" : { + "file" : "off197.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off198" : { + "file" : "off198.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off199" : { + "file" : "off199.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off200" : { + "file" : "off200.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off201" : { + "file" : "off201.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off202" : { + "file" : "off202.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off203" : { + "file" : "off203.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off204" : { + "file" : "off204.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off205" : { + "file" : "off205.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off206" : { + "file" : "off206.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off207" : { + "file" : "off207.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off208" : { + "file" : "off208.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off209" : { + "file" : "off209.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off210" : { + "file" : "off210.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off211" : { + "file" : "off211.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off212" : { + "file" : "off212.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off213" : { + "file" : "off213.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off214" : { + "file" : "off214.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off215" : { + "file" : "off215.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off216" : { + "file" : "off216.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off217" : { + "file" : "off217.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off218" : { + "file" : "off218.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off219" : { + "file" : "off219.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off220" : { + "file" : "off220.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off221" : { + "file" : "off221.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off222" : { + "file" : "off222.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off223" : { + "file" : "off223.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off224" : { + "file" : "off224.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off225" : { + "file" : "off225.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off226" : { + "file" : "off226.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off227" : { + "file" : "off227.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off228" : { + "file" : "off228.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off229" : { + "file" : "off229.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off230" : { + "file" : "off230.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off231" : { + "file" : "off231.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off232" : { + "file" : "off232.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off233" : { + "file" : "off233.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off234" : { + "file" : "off234.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off235" : { + "file" : "off235.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off236" : { + "file" : "off236.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off237" : { + "file" : "off237.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off238" : { + "file" : "off238.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off239" : { + "file" : "off239.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off240" : { + "file" : "off240.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off241" : { + "file" : "off241.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off242" : { + "file" : "off242.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off243" : { + "file" : "off243.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off244" : { + "file" : "off244.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off245" : { + "file" : "off245.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off246" : { + "file" : "off246.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off247" : { + "file" : "off247.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off248" : { + "file" : "off248.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off249" : { + "file" : "off249.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off250" : { + "file" : "off250.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off251" : { + "file" : "off251.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off252" : { + "file" : "off252.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off253" : { + "file" : "off253.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off254" : { + "file" : "off254.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off255" : { + "file" : "off255.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off256" : { + "file" : "off256.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off257" : { + "file" : "off257.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off258" : { + "file" : "off258.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off259" : { + "file" : "off259.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off260" : { + "file" : "off260.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off261" : { + "file" : "off261.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off262" : { + "file" : "off262.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off263" : { + "file" : "off263.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off264" : { + "file" : "off264.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off265" : { + "file" : "off265.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off266" : { + "file" : "off266.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off267" : { + "file" : "off267.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off268" : { + "file" : "off268.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off269" : { + "file" : "off269.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off270" : { + "file" : "off270.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off271" : { + "file" : "off271.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off272" : { + "file" : "off272.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off273" : { + "file" : "off273.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off274" : { + "file" : "off274.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off275" : { + "file" : "off275.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off276" : { + "file" : "off276.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off277" : { + "file" : "off277.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off278" : { + "file" : "off278.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off279" : { + "file" : "off279.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off280" : { + "file" : "off280.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off281" : { + "file" : "off281.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off282" : { + "file" : "off282.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off283" : { + "file" : "off283.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off284" : { + "file" : "off284.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off285" : { + "file" : "off285.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off286" : { + "file" : "off286.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off287" : { + "file" : "off287.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off288" : { + "file" : "off288.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off289" : { + "file" : "off289.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off290" : { + "file" : "off290.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off291" : { + "file" : "off291.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off292" : { + "file" : "off292.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off293" : { + "file" : "off293.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off294" : { + "file" : "off294.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off295" : { + "file" : "off295.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off296" : { + "file" : "off296.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off297" : { + "file" : "off297.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off298" : { + "file" : "off298.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off299" : { + "file" : "off299.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off300" : { + "file" : "off300.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off301" : { + "file" : "off301.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off302" : { + "file" : "off302.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off303" : { + "file" : "off303.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off304" : { + "file" : "off304.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off305" : { + "file" : "off305.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off306" : { + "file" : "off306.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off307" : { + "file" : "off307.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off308" : { + "file" : "off308.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off309" : { + "file" : "off309.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off310" : { + "file" : "off310.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off311" : { + "file" : "off311.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off312" : { + "file" : "off312.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off313" : { + "file" : "off313.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off314" : { + "file" : "off314.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off315" : { + "file" : "off315.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off316" : { + "file" : "off316.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off317" : { + "file" : "off317.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off318" : { + "file" : "off318.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off319" : { + "file" : "off319.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off320" : { + "file" : "off320.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off321" : { + "file" : "off321.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off322" : { + "file" : "off322.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off323" : { + "file" : "off323.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off324" : { + "file" : "off324.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off325" : { + "file" : "off325.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off326" : { + "file" : "off326.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off327" : { + "file" : "off327.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off328" : { + "file" : "off328.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off329" : { + "file" : "off329.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off330" : { + "file" : "off330.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off331" : { + "file" : "off331.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off332" : { + "file" : "off332.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off333" : { + "file" : "off333.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off334" : { + "file" : "off334.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off335" : { + "file" : "off335.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off336" : { + "file" : "off336.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off337" : { + "file" : "off337.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off338" : { + "file" : "off338.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off339" : { + "file" : "off339.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off340" : { + "file" : "off340.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off341" : { + "file" : "off341.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off342" : { + "file" : "off342.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off343" : { + "file" : "off343.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off344" : { + "file" : "off344.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off345" : { + "file" : "off345.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off346" : { + "file" : "off346.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off347" : { + "file" : "off347.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off348" : { + "file" : "off348.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off349" : { + "file" : "off349.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off350" : { + "file" : "off350.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off351" : { + "file" : "off351.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off352" : { + "file" : "off352.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off353" : { + "file" : "off353.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off354" : { + "file" : "off354.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off355" : { + "file" : "off355.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off356" : { + "file" : "off356.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off357" : { + "file" : "off357.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off358" : { + "file" : "off358.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off359" : { + "file" : "off359.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off360" : { + "file" : "off360.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off361" : { + "file" : "off361.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off362" : { + "file" : "off362.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off363" : { + "file" : "off363.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off364" : { + "file" : "off364.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off365" : { + "file" : "off365.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off366" : { + "file" : "off366.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off367" : { + "file" : "off367.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off368" : { + "file" : "off368.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off369" : { + "file" : "off369.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off370" : { + "file" : "off370.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off371" : { + "file" : "off371.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off372" : { + "file" : "off372.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off373" : { + "file" : "off373.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off374" : { + "file" : "off374.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off375" : { + "file" : "off375.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off376" : { + "file" : "off376.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off377" : { + "file" : "off377.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off378" : { + "file" : "off378.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off379" : { + "file" : "off379.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off380" : { + "file" : "off380.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off381" : { + "file" : "off381.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off382" : { + "file" : "off382.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off383" : { + "file" : "off383.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off384" : { + "file" : "off384.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off385" : { + "file" : "off385.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off386" : { + "file" : "off386.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off387" : { + "file" : "off387.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off388" : { + "file" : "off388.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off389" : { + "file" : "off389.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off390" : { + "file" : "off390.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off391" : { + "file" : "off391.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off392" : { + "file" : "off392.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off393" : { + "file" : "off393.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off394" : { + "file" : "off394.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off395" : { + "file" : "off395.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off396" : { + "file" : "off396.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off397" : { + "file" : "off397.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off398" : { + "file" : "off398.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off399" : { + "file" : "off399.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off400" : { + "file" : "off400.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off401" : { + "file" : "off401.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off402" : { + "file" : "off402.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off403" : { + "file" : "off403.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off404" : { + "file" : "off404.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off405" : { + "file" : "off405.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off406" : { + "file" : "off406.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off407" : { + "file" : "off407.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off408" : { + "file" : "off408.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off409" : { + "file" : "off409.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off410" : { + "file" : "off410.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off411" : { + "file" : "off411.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off412" : { + "file" : "off412.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off413" : { + "file" : "off413.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off414" : { + "file" : "off414.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off415" : { + "file" : "off415.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off416" : { + "file" : "off416.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off417" : { + "file" : "off417.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off418" : { + "file" : "off418.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off419" : { + "file" : "off419.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off420" : { + "file" : "off420.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off421" : { + "file" : "off421.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off422" : { + "file" : "off422.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off423" : { + "file" : "off423.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off424" : { + "file" : "off424.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off425" : { + "file" : "off425.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off426" : { + "file" : "off426.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off427" : { + "file" : "off427.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off428" : { + "file" : "off428.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off429" : { + "file" : "off429.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off430" : { + "file" : "off430.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off431" : { + "file" : "off431.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off432" : { + "file" : "off432.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off433" : { + "file" : "off433.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off434" : { + "file" : "off434.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off435" : { + "file" : "off435.pm", + "version" : "6.60" + }, + "Date::Manip::Offset::off436" : { + "file" : "off436.pm", + "version" : "6.60" + }, + "Date::Manip::Recur" : { + "file" : "Recur.pm", + "version" : "6.60" + }, + "Date::Manip::TZ" : { + "file" : "TZ.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::a00" : { + "file" : "a00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::afabid00" : { + "file" : "afabid00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::afaccr00" : { + "file" : "afaccr00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::afalgi00" : { + "file" : "afalgi00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::afbiss00" : { + "file" : "afbiss00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::afcair00" : { + "file" : "afcair00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::afcasa00" : { + "file" : "afcasa00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::afceut00" : { + "file" : "afceut00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::afel_a00" : { + "file" : "afel_a00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::afjoha00" : { + "file" : "afjoha00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::afkhar00" : { + "file" : "afkhar00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::aflago00" : { + "file" : "aflago00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::afmapu00" : { + "file" : "afmapu00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::afmonr00" : { + "file" : "afmonr00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::afnair00" : { + "file" : "afnair00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::afndja00" : { + "file" : "afndja00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::aftrip00" : { + "file" : "aftrip00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::aftuni00" : { + "file" : "aftuni00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::afwind00" : { + "file" : "afwind00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amadak00" : { + "file" : "amadak00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amanch00" : { + "file" : "amanch00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amarag00" : { + "file" : "amarag00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amasun00" : { + "file" : "amasun00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amatik00" : { + "file" : "amatik00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ambahi00" : { + "file" : "ambahi00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ambahi01" : { + "file" : "ambahi01.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ambarb00" : { + "file" : "ambarb00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ambele00" : { + "file" : "ambele00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ambeli00" : { + "file" : "ambeli00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ambeul00" : { + "file" : "ambeul00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amblan00" : { + "file" : "amblan00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amboa_00" : { + "file" : "amboa_00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ambogo00" : { + "file" : "ambogo00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ambois00" : { + "file" : "ambois00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ambuen00" : { + "file" : "ambuen00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amcamb00" : { + "file" : "amcamb00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amcamp00" : { + "file" : "amcamp00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amcanc00" : { + "file" : "amcanc00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amcara00" : { + "file" : "amcara00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amcata00" : { + "file" : "amcata00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amcaye00" : { + "file" : "amcaye00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amcent00" : { + "file" : "amcent00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amchic00" : { + "file" : "amchic00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amchih00" : { + "file" : "amchih00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amcord00" : { + "file" : "amcord00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amcost00" : { + "file" : "amcost00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amcres00" : { + "file" : "amcres00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amcuia00" : { + "file" : "amcuia00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amcura00" : { + "file" : "amcura00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amdanm00" : { + "file" : "amdanm00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amdaws00" : { + "file" : "amdaws00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amdaws01" : { + "file" : "amdaws01.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amdenv00" : { + "file" : "amdenv00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amdetr00" : { + "file" : "amdetr00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amedmo00" : { + "file" : "amedmo00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ameiru00" : { + "file" : "ameiru00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amel_s00" : { + "file" : "amel_s00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amfort00" : { + "file" : "amfort00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amfort01" : { + "file" : "amfort01.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amglac00" : { + "file" : "amglac00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amgodt00" : { + "file" : "amgodt00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amgoos00" : { + "file" : "amgoos00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amgran00" : { + "file" : "amgran00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amguat00" : { + "file" : "amguat00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amguay00" : { + "file" : "amguay00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amguya00" : { + "file" : "amguya00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amhali00" : { + "file" : "amhali00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amhava00" : { + "file" : "amhava00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amherm00" : { + "file" : "amherm00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amindi00" : { + "file" : "amindi00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::aminuv00" : { + "file" : "aminuv00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amiqal00" : { + "file" : "amiqal00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amjama00" : { + "file" : "amjama00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amjuju00" : { + "file" : "amjuju00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amjune00" : { + "file" : "amjune00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amknox00" : { + "file" : "amknox00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amla_p00" : { + "file" : "amla_p00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amla_r00" : { + "file" : "amla_r00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amlima00" : { + "file" : "amlima00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amlos_00" : { + "file" : "amlos_00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amloui00" : { + "file" : "amloui00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ammace00" : { + "file" : "ammace00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ammana00" : { + "file" : "ammana00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ammana01" : { + "file" : "ammana01.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ammare00" : { + "file" : "ammare00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ammart00" : { + "file" : "ammart00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ammata00" : { + "file" : "ammata00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ammaza00" : { + "file" : "ammaza00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ammend00" : { + "file" : "ammend00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ammeno00" : { + "file" : "ammeno00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ammeri00" : { + "file" : "ammeri00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ammetl00" : { + "file" : "ammetl00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ammexi00" : { + "file" : "ammexi00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ammiqu00" : { + "file" : "ammiqu00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ammonc00" : { + "file" : "ammonc00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ammont00" : { + "file" : "ammont00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ammont01" : { + "file" : "ammont01.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ammont02" : { + "file" : "ammont02.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amnass00" : { + "file" : "amnass00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amnew_00" : { + "file" : "amnew_00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amnew_01" : { + "file" : "amnew_01.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amnipi00" : { + "file" : "amnipi00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amnome00" : { + "file" : "amnome00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amnoro00" : { + "file" : "amnoro00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amojin00" : { + "file" : "amojin00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ampana00" : { + "file" : "ampana00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ampang00" : { + "file" : "ampang00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ampara00" : { + "file" : "ampara00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ampete00" : { + "file" : "ampete00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amphoe00" : { + "file" : "amphoe00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amport00" : { + "file" : "amport00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amport01" : { + "file" : "amport01.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amport02" : { + "file" : "amport02.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ampuer00" : { + "file" : "ampuer00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ampunt00" : { + "file" : "ampunt00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amrain00" : { + "file" : "amrain00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amrank00" : { + "file" : "amrank00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amreci00" : { + "file" : "amreci00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amregi00" : { + "file" : "amregi00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amreso00" : { + "file" : "amreso00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amrio_00" : { + "file" : "amrio_00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amrio_01" : { + "file" : "amrio_01.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amsalt00" : { + "file" : "amsalt00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amsan_00" : { + "file" : "amsan_00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amsan_01" : { + "file" : "amsan_01.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amsant00" : { + "file" : "amsant00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amsant01" : { + "file" : "amsant01.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amsant02" : { + "file" : "amsant02.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amsao_00" : { + "file" : "amsao_00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amscor00" : { + "file" : "amscor00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amsitk00" : { + "file" : "amsitk00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amst_j00" : { + "file" : "amst_j00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amswif00" : { + "file" : "amswif00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amtegu00" : { + "file" : "amtegu00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amtell00" : { + "file" : "amtell00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amthul00" : { + "file" : "amthul00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amthun00" : { + "file" : "amthun00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amtiju00" : { + "file" : "amtiju00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amtoro00" : { + "file" : "amtoro00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amtucu00" : { + "file" : "amtucu00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amushu00" : { + "file" : "amushu00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amvanc00" : { + "file" : "amvanc00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amveva00" : { + "file" : "amveva00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amvinc00" : { + "file" : "amvinc00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amwhit00" : { + "file" : "amwhit00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amwina00" : { + "file" : "amwina00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amwinn00" : { + "file" : "amwinn00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amyaku00" : { + "file" : "amyaku00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::amyell00" : { + "file" : "amyell00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ancase00" : { + "file" : "ancase00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::andavi00" : { + "file" : "andavi00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::andumo00" : { + "file" : "andumo00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::anmacq00" : { + "file" : "anmacq00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::anmaws00" : { + "file" : "anmaws00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::anpalm00" : { + "file" : "anpalm00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::anroth00" : { + "file" : "anroth00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ansyow00" : { + "file" : "ansyow00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::antrol00" : { + "file" : "antrol00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::anvost00" : { + "file" : "anvost00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asalma00" : { + "file" : "asalma00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asamma00" : { + "file" : "asamma00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asanad00" : { + "file" : "asanad00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asaqta00" : { + "file" : "asaqta00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asaqto00" : { + "file" : "asaqto00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asashg00" : { + "file" : "asashg00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asatyr00" : { + "file" : "asatyr00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asbagh00" : { + "file" : "asbagh00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asbaku00" : { + "file" : "asbaku00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asbang00" : { + "file" : "asbang00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asbarn00" : { + "file" : "asbarn00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asbeir00" : { + "file" : "asbeir00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asbish00" : { + "file" : "asbish00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asbrun00" : { + "file" : "asbrun00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::aschit00" : { + "file" : "aschit00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::aschoi00" : { + "file" : "aschoi00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ascolo00" : { + "file" : "ascolo00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asdama00" : { + "file" : "asdama00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asdhak00" : { + "file" : "asdhak00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asdili00" : { + "file" : "asdili00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asduba00" : { + "file" : "asduba00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asdush00" : { + "file" : "asdush00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asfama00" : { + "file" : "asfama00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asgaza00" : { + "file" : "asgaza00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ashebr00" : { + "file" : "ashebr00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asho_c00" : { + "file" : "asho_c00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ashong00" : { + "file" : "ashong00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ashovd00" : { + "file" : "ashovd00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asirku00" : { + "file" : "asirku00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asjaka00" : { + "file" : "asjaka00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asjaya00" : { + "file" : "asjaya00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asjeru00" : { + "file" : "asjeru00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::askabu00" : { + "file" : "askabu00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::askamc00" : { + "file" : "askamc00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::askara00" : { + "file" : "askara00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::askath00" : { + "file" : "askath00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::askhan00" : { + "file" : "askhan00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::askolk00" : { + "file" : "askolk00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::askras00" : { + "file" : "askras00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::askual00" : { + "file" : "askual00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::askuch00" : { + "file" : "askuch00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asmaca00" : { + "file" : "asmaca00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asmaga00" : { + "file" : "asmaga00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asmaka00" : { + "file" : "asmaka00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asmani00" : { + "file" : "asmani00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asnico00" : { + "file" : "asnico00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asnovo00" : { + "file" : "asnovo00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asnovo01" : { + "file" : "asnovo01.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asomsk00" : { + "file" : "asomsk00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asoral00" : { + "file" : "asoral00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::aspont00" : { + "file" : "aspont00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::aspyon00" : { + "file" : "aspyon00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asqata00" : { + "file" : "asqata00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asqyzy00" : { + "file" : "asqyzy00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asriya00" : { + "file" : "asriya00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::assakh00" : { + "file" : "assakh00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::assama00" : { + "file" : "assama00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asseou00" : { + "file" : "asseou00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asshan00" : { + "file" : "asshan00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::assing00" : { + "file" : "assing00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::assred00" : { + "file" : "assred00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::astaip00" : { + "file" : "astaip00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::astash00" : { + "file" : "astash00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::astbil00" : { + "file" : "astbil00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::astehr00" : { + "file" : "astehr00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asthim00" : { + "file" : "asthim00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::astoky00" : { + "file" : "astoky00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::astoms00" : { + "file" : "astoms00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asulaa00" : { + "file" : "asulaa00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asurum00" : { + "file" : "asurum00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asustm00" : { + "file" : "asustm00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asvlad00" : { + "file" : "asvlad00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asyaku00" : { + "file" : "asyaku00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asyang00" : { + "file" : "asyang00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asyeka00" : { + "file" : "asyeka00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::asyere00" : { + "file" : "asyere00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::atazor00" : { + "file" : "atazor00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::atberm00" : { + "file" : "atberm00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::atcana00" : { + "file" : "atcana00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::atcape00" : { + "file" : "atcape00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::atfaro00" : { + "file" : "atfaro00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::atmade00" : { + "file" : "atmade00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::atreyk00" : { + "file" : "atreyk00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::atsout00" : { + "file" : "atsout00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::atstan00" : { + "file" : "atstan00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::auadel00" : { + "file" : "auadel00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::aubris00" : { + "file" : "aubris00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::aubrok00" : { + "file" : "aubrok00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::aucurr00" : { + "file" : "aucurr00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::audarw00" : { + "file" : "audarw00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::aueucl00" : { + "file" : "aueucl00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::auhoba00" : { + "file" : "auhoba00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::aulind00" : { + "file" : "aulind00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::aulord00" : { + "file" : "aulord00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::aumelb00" : { + "file" : "aumelb00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::aupert00" : { + "file" : "aupert00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ausydn00" : { + "file" : "ausydn00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::b00" : { + "file" : "b00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::c00" : { + "file" : "c00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::cet00" : { + "file" : "cet00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::d00" : { + "file" : "d00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::e00" : { + "file" : "e00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::eet00" : { + "file" : "eet00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::etgmt00" : { + "file" : "etgmt00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::etgmtm00" : { + "file" : "etgmtm00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::etgmtm01" : { + "file" : "etgmtm01.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::etgmtm02" : { + "file" : "etgmtm02.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::etgmtm03" : { + "file" : "etgmtm03.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::etgmtm04" : { + "file" : "etgmtm04.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::etgmtm05" : { + "file" : "etgmtm05.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::etgmtm06" : { + "file" : "etgmtm06.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::etgmtm07" : { + "file" : "etgmtm07.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::etgmtm08" : { + "file" : "etgmtm08.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::etgmtm09" : { + "file" : "etgmtm09.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::etgmtm10" : { + "file" : "etgmtm10.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::etgmtm11" : { + "file" : "etgmtm11.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::etgmtm12" : { + "file" : "etgmtm12.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::etgmtm13" : { + "file" : "etgmtm13.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::etgmtp00" : { + "file" : "etgmtp00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::etgmtp01" : { + "file" : "etgmtp01.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::etgmtp02" : { + "file" : "etgmtp02.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::etgmtp03" : { + "file" : "etgmtp03.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::etgmtp04" : { + "file" : "etgmtp04.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::etgmtp05" : { + "file" : "etgmtp05.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::etgmtp06" : { + "file" : "etgmtp06.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::etgmtp07" : { + "file" : "etgmtp07.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::etgmtp08" : { + "file" : "etgmtp08.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::etgmtp09" : { + "file" : "etgmtp09.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::etgmtp10" : { + "file" : "etgmtp10.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::etgmtp11" : { + "file" : "etgmtp11.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::euamst00" : { + "file" : "euamst00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::euando00" : { + "file" : "euando00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::euastr00" : { + "file" : "euastr00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::euathe00" : { + "file" : "euathe00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::eubelg00" : { + "file" : "eubelg00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::euberl00" : { + "file" : "euberl00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::eubrus00" : { + "file" : "eubrus00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::eubuch00" : { + "file" : "eubuch00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::eubuda00" : { + "file" : "eubuda00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::euchis00" : { + "file" : "euchis00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::eucope00" : { + "file" : "eucope00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::eudubl00" : { + "file" : "eudubl00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::eugibr00" : { + "file" : "eugibr00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::euhels00" : { + "file" : "euhels00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::euista00" : { + "file" : "euista00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::eukali00" : { + "file" : "eukali00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::eukiev00" : { + "file" : "eukiev00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::eukiro00" : { + "file" : "eukiro00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::eulisb00" : { + "file" : "eulisb00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::eulond00" : { + "file" : "eulond00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::euluxe00" : { + "file" : "euluxe00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::eumadr00" : { + "file" : "eumadr00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::eumalt00" : { + "file" : "eumalt00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::eumins00" : { + "file" : "eumins00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::eumona00" : { + "file" : "eumona00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::eumosc00" : { + "file" : "eumosc00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::euoslo00" : { + "file" : "euoslo00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::eupari00" : { + "file" : "eupari00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::euprag00" : { + "file" : "euprag00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::euriga00" : { + "file" : "euriga00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::eurome00" : { + "file" : "eurome00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::eusama00" : { + "file" : "eusama00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::eusara00" : { + "file" : "eusara00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::eusimf00" : { + "file" : "eusimf00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::eusofi00" : { + "file" : "eusofi00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::eustoc00" : { + "file" : "eustoc00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::eutall00" : { + "file" : "eutall00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::eutira00" : { + "file" : "eutira00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::euulya00" : { + "file" : "euulya00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::euuzhg00" : { + "file" : "euuzhg00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::euvien00" : { + "file" : "euvien00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::euviln00" : { + "file" : "euviln00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::euvolg00" : { + "file" : "euvolg00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::euwars00" : { + "file" : "euwars00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::euzapo00" : { + "file" : "euzapo00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::euzuri00" : { + "file" : "euzuri00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::f00" : { + "file" : "f00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::g00" : { + "file" : "g00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::h00" : { + "file" : "h00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::i00" : { + "file" : "i00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::inchag00" : { + "file" : "inchag00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::inchri00" : { + "file" : "inchri00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::incoco00" : { + "file" : "incoco00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::inkerg00" : { + "file" : "inkerg00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::inmahe00" : { + "file" : "inmahe00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::inmald00" : { + "file" : "inmald00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::inmaur00" : { + "file" : "inmaur00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::inreun00" : { + "file" : "inreun00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::k00" : { + "file" : "k00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::l00" : { + "file" : "l00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::m00" : { + "file" : "m00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::met00" : { + "file" : "met00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::n00" : { + "file" : "n00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::o00" : { + "file" : "o00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::p00" : { + "file" : "p00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::paapia00" : { + "file" : "paapia00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::paauck00" : { + "file" : "paauck00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::paboug00" : { + "file" : "paboug00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::pachat00" : { + "file" : "pachat00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::pachuu00" : { + "file" : "pachuu00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::paeast00" : { + "file" : "paeast00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::paefat00" : { + "file" : "paefat00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::paende00" : { + "file" : "paende00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::pafaka00" : { + "file" : "pafaka00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::pafiji00" : { + "file" : "pafiji00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::pafuna00" : { + "file" : "pafuna00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::pagala00" : { + "file" : "pagala00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::pagamb00" : { + "file" : "pagamb00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::paguad00" : { + "file" : "paguad00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::paguam00" : { + "file" : "paguam00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::pahono00" : { + "file" : "pahono00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::pakiri00" : { + "file" : "pakiri00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::pakosr00" : { + "file" : "pakosr00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::pakwaj00" : { + "file" : "pakwaj00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::pamaju00" : { + "file" : "pamaju00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::pamarq00" : { + "file" : "pamarq00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::panaur00" : { + "file" : "panaur00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::paniue00" : { + "file" : "paniue00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::panorf00" : { + "file" : "panorf00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::panoum00" : { + "file" : "panoum00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::papago00" : { + "file" : "papago00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::papala00" : { + "file" : "papala00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::papitc00" : { + "file" : "papitc00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::papohn00" : { + "file" : "papohn00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::paport00" : { + "file" : "paport00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::pararo00" : { + "file" : "pararo00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::patahi00" : { + "file" : "patahi00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::patara00" : { + "file" : "patara00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::patong00" : { + "file" : "patong00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::pawake00" : { + "file" : "pawake00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::pawall00" : { + "file" : "pawall00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::q00" : { + "file" : "q00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::r00" : { + "file" : "r00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::s00" : { + "file" : "s00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::t00" : { + "file" : "t00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::u00" : { + "file" : "u00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::ut00" : { + "file" : "ut00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::utc00" : { + "file" : "utc00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::v00" : { + "file" : "v00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::w00" : { + "file" : "w00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::wet00" : { + "file" : "wet00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::x00" : { + "file" : "x00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::y00" : { + "file" : "y00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ::z00" : { + "file" : "z00.pm", + "version" : "6.60" + }, + "Date::Manip::TZ_Base" : { + "file" : "TZ_Base.pm", + "version" : "6.60" + }, + "Date::Manip::TZdata" : { + "file" : "TZdata.pm", + "version" : "6.60" + }, + "Date::Manip::Zones" : { + "file" : "Zones.pm", + "version" : "6.60" + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "type" : "git", + "url" : "git://github.com/SBECK-github/Date-Manip.git", + "web" : "https://github.com/SBECK-github/Date-Manip" + } + }, + "version" : "6.60", + "x_serialization_backend" : "JSON::PP version 2.94" +} diff --git a/META.yml b/META.yml new file mode 100644 index 0000000..929634c --- /dev/null +++ b/META.yml @@ -0,0 +1,2647 @@ +--- +abstract: 'Date manipulation routines' +author: + - 'Sullivan Beck (sbeck@cpan.org)' +build_requires: + ExtUtils::MakeMaker: '0' + Test::Inter: '0' + Test::More: '0' +configure_requires: + ExtUtils::MakeMaker: 6.67_01 +dynamic_config: 1 +generated_by: 'ExtUtils::MakeMaker version 7.3, CPAN::Meta::Converter version 2.150010' +license: perl +meta-spec: + url: http://module-build.sourceforge.net/META-spec-v1.4.html + version: '1.4' +name: Date-Manip +no_index: + directory: + - t + - inc +provides: + Date::Manip: + file: Manip.pm + version: '6.60' + Date::Manip::Base: + file: Base.pm + version: '6.60' + Date::Manip::DM5: + file: DM5.pm + version: '6.60' + Date::Manip::DM5abbrevs: + file: DM5abbrevs.pm + version: '6.60' + Date::Manip::DM6: + file: DM6.pm + version: '6.60' + Date::Manip::Date: + file: Date.pm + version: '6.60' + Date::Manip::Delta: + file: Delta.pm + version: '6.60' + Date::Manip::Lang::catalan: + file: catalan.pm + version: '6.60' + Date::Manip::Lang::danish: + file: danish.pm + version: '6.60' + Date::Manip::Lang::dutch: + file: dutch.pm + version: '6.60' + Date::Manip::Lang::english: + file: english.pm + version: '6.60' + Date::Manip::Lang::finnish: + file: finnish.pm + version: '6.60' + Date::Manip::Lang::french: + file: french.pm + version: '6.60' + Date::Manip::Lang::german: + file: german.pm + version: '6.60' + Date::Manip::Lang::index: + file: index.pm + version: '6.60' + Date::Manip::Lang::italian: + file: italian.pm + version: '6.60' + Date::Manip::Lang::norwegian: + file: norwegian.pm + version: '6.60' + Date::Manip::Lang::polish: + file: polish.pm + version: '6.60' + Date::Manip::Lang::portugue: + file: portugue.pm + version: '6.60' + Date::Manip::Lang::romanian: + file: romanian.pm + version: '6.60' + Date::Manip::Lang::russian: + file: russian.pm + version: '6.60' + Date::Manip::Lang::spanish: + file: spanish.pm + version: '6.60' + Date::Manip::Lang::swedish: + file: swedish.pm + version: '6.60' + Date::Manip::Lang::turkish: + file: turkish.pm + version: '6.60' + Date::Manip::Obj: + file: Obj.pm + version: '6.60' + Date::Manip::Offset::off000: + file: off000.pm + version: '6.60' + Date::Manip::Offset::off001: + file: off001.pm + version: '6.60' + Date::Manip::Offset::off002: + file: off002.pm + version: '6.60' + Date::Manip::Offset::off003: + file: off003.pm + version: '6.60' + Date::Manip::Offset::off004: + file: off004.pm + version: '6.60' + Date::Manip::Offset::off005: + file: off005.pm + version: '6.60' + Date::Manip::Offset::off006: + file: off006.pm + version: '6.60' + Date::Manip::Offset::off007: + file: off007.pm + version: '6.60' + Date::Manip::Offset::off008: + file: off008.pm + version: '6.60' + Date::Manip::Offset::off009: + file: off009.pm + version: '6.60' + Date::Manip::Offset::off010: + file: off010.pm + version: '6.60' + Date::Manip::Offset::off011: + file: off011.pm + version: '6.60' + Date::Manip::Offset::off012: + file: off012.pm + version: '6.60' + Date::Manip::Offset::off013: + file: off013.pm + version: '6.60' + Date::Manip::Offset::off014: + file: off014.pm + version: '6.60' + Date::Manip::Offset::off015: + file: off015.pm + version: '6.60' + Date::Manip::Offset::off016: + file: off016.pm + version: '6.60' + Date::Manip::Offset::off017: + file: off017.pm + version: '6.60' + Date::Manip::Offset::off018: + file: off018.pm + version: '6.60' + Date::Manip::Offset::off019: + file: off019.pm + version: '6.60' + Date::Manip::Offset::off020: + file: off020.pm + version: '6.60' + Date::Manip::Offset::off021: + file: off021.pm + version: '6.60' + Date::Manip::Offset::off022: + file: off022.pm + version: '6.60' + Date::Manip::Offset::off023: + file: off023.pm + version: '6.60' + Date::Manip::Offset::off024: + file: off024.pm + version: '6.60' + Date::Manip::Offset::off025: + file: off025.pm + version: '6.60' + Date::Manip::Offset::off026: + file: off026.pm + version: '6.60' + Date::Manip::Offset::off027: + file: off027.pm + version: '6.60' + Date::Manip::Offset::off028: + file: off028.pm + version: '6.60' + Date::Manip::Offset::off029: + file: off029.pm + version: '6.60' + Date::Manip::Offset::off030: + file: off030.pm + version: '6.60' + Date::Manip::Offset::off031: + file: off031.pm + version: '6.60' + Date::Manip::Offset::off032: + file: off032.pm + version: '6.60' + Date::Manip::Offset::off033: + file: off033.pm + version: '6.60' + Date::Manip::Offset::off034: + file: off034.pm + version: '6.60' + Date::Manip::Offset::off035: + file: off035.pm + version: '6.60' + Date::Manip::Offset::off036: + file: off036.pm + version: '6.60' + Date::Manip::Offset::off037: + file: off037.pm + version: '6.60' + Date::Manip::Offset::off038: + file: off038.pm + version: '6.60' + Date::Manip::Offset::off039: + file: off039.pm + version: '6.60' + Date::Manip::Offset::off040: + file: off040.pm + version: '6.60' + Date::Manip::Offset::off041: + file: off041.pm + version: '6.60' + Date::Manip::Offset::off042: + file: off042.pm + version: '6.60' + Date::Manip::Offset::off043: + file: off043.pm + version: '6.60' + Date::Manip::Offset::off044: + file: off044.pm + version: '6.60' + Date::Manip::Offset::off045: + file: off045.pm + version: '6.60' + Date::Manip::Offset::off046: + file: off046.pm + version: '6.60' + Date::Manip::Offset::off047: + file: off047.pm + version: '6.60' + Date::Manip::Offset::off048: + file: off048.pm + version: '6.60' + Date::Manip::Offset::off049: + file: off049.pm + version: '6.60' + Date::Manip::Offset::off050: + file: off050.pm + version: '6.60' + Date::Manip::Offset::off051: + file: off051.pm + version: '6.60' + Date::Manip::Offset::off052: + file: off052.pm + version: '6.60' + Date::Manip::Offset::off053: + file: off053.pm + version: '6.60' + Date::Manip::Offset::off054: + file: off054.pm + version: '6.60' + Date::Manip::Offset::off055: + file: off055.pm + version: '6.60' + Date::Manip::Offset::off056: + file: off056.pm + version: '6.60' + Date::Manip::Offset::off057: + file: off057.pm + version: '6.60' + Date::Manip::Offset::off058: + file: off058.pm + version: '6.60' + Date::Manip::Offset::off059: + file: off059.pm + version: '6.60' + Date::Manip::Offset::off060: + file: off060.pm + version: '6.60' + Date::Manip::Offset::off061: + file: off061.pm + version: '6.60' + Date::Manip::Offset::off062: + file: off062.pm + version: '6.60' + Date::Manip::Offset::off063: + file: off063.pm + version: '6.60' + Date::Manip::Offset::off064: + file: off064.pm + version: '6.60' + Date::Manip::Offset::off065: + file: off065.pm + version: '6.60' + Date::Manip::Offset::off066: + file: off066.pm + version: '6.60' + Date::Manip::Offset::off067: + file: off067.pm + version: '6.60' + Date::Manip::Offset::off068: + file: off068.pm + version: '6.60' + Date::Manip::Offset::off069: + file: off069.pm + version: '6.60' + Date::Manip::Offset::off070: + file: off070.pm + version: '6.60' + Date::Manip::Offset::off071: + file: off071.pm + version: '6.60' + Date::Manip::Offset::off072: + file: off072.pm + version: '6.60' + Date::Manip::Offset::off073: + file: off073.pm + version: '6.60' + Date::Manip::Offset::off074: + file: off074.pm + version: '6.60' + Date::Manip::Offset::off075: + file: off075.pm + version: '6.60' + Date::Manip::Offset::off076: + file: off076.pm + version: '6.60' + Date::Manip::Offset::off077: + file: off077.pm + version: '6.60' + Date::Manip::Offset::off078: + file: off078.pm + version: '6.60' + Date::Manip::Offset::off079: + file: off079.pm + version: '6.60' + Date::Manip::Offset::off080: + file: off080.pm + version: '6.60' + Date::Manip::Offset::off081: + file: off081.pm + version: '6.60' + Date::Manip::Offset::off082: + file: off082.pm + version: '6.60' + Date::Manip::Offset::off083: + file: off083.pm + version: '6.60' + Date::Manip::Offset::off084: + file: off084.pm + version: '6.60' + Date::Manip::Offset::off085: + file: off085.pm + version: '6.60' + Date::Manip::Offset::off086: + file: off086.pm + version: '6.60' + Date::Manip::Offset::off087: + file: off087.pm + version: '6.60' + Date::Manip::Offset::off088: + file: off088.pm + version: '6.60' + Date::Manip::Offset::off089: + file: off089.pm + version: '6.60' + Date::Manip::Offset::off090: + file: off090.pm + version: '6.60' + Date::Manip::Offset::off091: + file: off091.pm + version: '6.60' + Date::Manip::Offset::off092: + file: off092.pm + version: '6.60' + Date::Manip::Offset::off093: + file: off093.pm + version: '6.60' + Date::Manip::Offset::off094: + file: off094.pm + version: '6.60' + Date::Manip::Offset::off095: + file: off095.pm + version: '6.60' + Date::Manip::Offset::off096: + file: off096.pm + version: '6.60' + Date::Manip::Offset::off097: + file: off097.pm + version: '6.60' + Date::Manip::Offset::off098: + file: off098.pm + version: '6.60' + Date::Manip::Offset::off099: + file: off099.pm + version: '6.60' + Date::Manip::Offset::off100: + file: off100.pm + version: '6.60' + Date::Manip::Offset::off101: + file: off101.pm + version: '6.60' + Date::Manip::Offset::off102: + file: off102.pm + version: '6.60' + Date::Manip::Offset::off103: + file: off103.pm + version: '6.60' + Date::Manip::Offset::off104: + file: off104.pm + version: '6.60' + Date::Manip::Offset::off105: + file: off105.pm + version: '6.60' + Date::Manip::Offset::off106: + file: off106.pm + version: '6.60' + Date::Manip::Offset::off107: + file: off107.pm + version: '6.60' + Date::Manip::Offset::off108: + file: off108.pm + version: '6.60' + Date::Manip::Offset::off109: + file: off109.pm + version: '6.60' + Date::Manip::Offset::off110: + file: off110.pm + version: '6.60' + Date::Manip::Offset::off111: + file: off111.pm + version: '6.60' + Date::Manip::Offset::off112: + file: off112.pm + version: '6.60' + Date::Manip::Offset::off113: + file: off113.pm + version: '6.60' + Date::Manip::Offset::off114: + file: off114.pm + version: '6.60' + Date::Manip::Offset::off115: + file: off115.pm + version: '6.60' + Date::Manip::Offset::off116: + file: off116.pm + version: '6.60' + Date::Manip::Offset::off117: + file: off117.pm + version: '6.60' + Date::Manip::Offset::off118: + file: off118.pm + version: '6.60' + Date::Manip::Offset::off119: + file: off119.pm + version: '6.60' + Date::Manip::Offset::off120: + file: off120.pm + version: '6.60' + Date::Manip::Offset::off121: + file: off121.pm + version: '6.60' + Date::Manip::Offset::off122: + file: off122.pm + version: '6.60' + Date::Manip::Offset::off123: + file: off123.pm + version: '6.60' + Date::Manip::Offset::off124: + file: off124.pm + version: '6.60' + Date::Manip::Offset::off125: + file: off125.pm + version: '6.60' + Date::Manip::Offset::off126: + file: off126.pm + version: '6.60' + Date::Manip::Offset::off127: + file: off127.pm + version: '6.60' + Date::Manip::Offset::off128: + file: off128.pm + version: '6.60' + Date::Manip::Offset::off129: + file: off129.pm + version: '6.60' + Date::Manip::Offset::off130: + file: off130.pm + version: '6.60' + Date::Manip::Offset::off131: + file: off131.pm + version: '6.60' + Date::Manip::Offset::off132: + file: off132.pm + version: '6.60' + Date::Manip::Offset::off133: + file: off133.pm + version: '6.60' + Date::Manip::Offset::off134: + file: off134.pm + version: '6.60' + Date::Manip::Offset::off135: + file: off135.pm + version: '6.60' + Date::Manip::Offset::off136: + file: off136.pm + version: '6.60' + Date::Manip::Offset::off137: + file: off137.pm + version: '6.60' + Date::Manip::Offset::off138: + file: off138.pm + version: '6.60' + Date::Manip::Offset::off139: + file: off139.pm + version: '6.60' + Date::Manip::Offset::off140: + file: off140.pm + version: '6.60' + Date::Manip::Offset::off141: + file: off141.pm + version: '6.60' + Date::Manip::Offset::off142: + file: off142.pm + version: '6.60' + Date::Manip::Offset::off143: + file: off143.pm + version: '6.60' + Date::Manip::Offset::off144: + file: off144.pm + version: '6.60' + Date::Manip::Offset::off145: + file: off145.pm + version: '6.60' + Date::Manip::Offset::off146: + file: off146.pm + version: '6.60' + Date::Manip::Offset::off147: + file: off147.pm + version: '6.60' + Date::Manip::Offset::off148: + file: off148.pm + version: '6.60' + Date::Manip::Offset::off149: + file: off149.pm + version: '6.60' + Date::Manip::Offset::off150: + file: off150.pm + version: '6.60' + Date::Manip::Offset::off151: + file: off151.pm + version: '6.60' + Date::Manip::Offset::off152: + file: off152.pm + version: '6.60' + Date::Manip::Offset::off153: + file: off153.pm + version: '6.60' + Date::Manip::Offset::off154: + file: off154.pm + version: '6.60' + Date::Manip::Offset::off155: + file: off155.pm + version: '6.60' + Date::Manip::Offset::off156: + file: off156.pm + version: '6.60' + Date::Manip::Offset::off157: + file: off157.pm + version: '6.60' + Date::Manip::Offset::off158: + file: off158.pm + version: '6.60' + Date::Manip::Offset::off159: + file: off159.pm + version: '6.60' + Date::Manip::Offset::off160: + file: off160.pm + version: '6.60' + Date::Manip::Offset::off161: + file: off161.pm + version: '6.60' + Date::Manip::Offset::off162: + file: off162.pm + version: '6.60' + Date::Manip::Offset::off163: + file: off163.pm + version: '6.60' + Date::Manip::Offset::off164: + file: off164.pm + version: '6.60' + Date::Manip::Offset::off165: + file: off165.pm + version: '6.60' + Date::Manip::Offset::off166: + file: off166.pm + version: '6.60' + Date::Manip::Offset::off167: + file: off167.pm + version: '6.60' + Date::Manip::Offset::off168: + file: off168.pm + version: '6.60' + Date::Manip::Offset::off169: + file: off169.pm + version: '6.60' + Date::Manip::Offset::off170: + file: off170.pm + version: '6.60' + Date::Manip::Offset::off171: + file: off171.pm + version: '6.60' + Date::Manip::Offset::off172: + file: off172.pm + version: '6.60' + Date::Manip::Offset::off173: + file: off173.pm + version: '6.60' + Date::Manip::Offset::off174: + file: off174.pm + version: '6.60' + Date::Manip::Offset::off175: + file: off175.pm + version: '6.60' + Date::Manip::Offset::off176: + file: off176.pm + version: '6.60' + Date::Manip::Offset::off177: + file: off177.pm + version: '6.60' + Date::Manip::Offset::off178: + file: off178.pm + version: '6.60' + Date::Manip::Offset::off179: + file: off179.pm + version: '6.60' + Date::Manip::Offset::off180: + file: off180.pm + version: '6.60' + Date::Manip::Offset::off181: + file: off181.pm + version: '6.60' + Date::Manip::Offset::off182: + file: off182.pm + version: '6.60' + Date::Manip::Offset::off183: + file: off183.pm + version: '6.60' + Date::Manip::Offset::off184: + file: off184.pm + version: '6.60' + Date::Manip::Offset::off185: + file: off185.pm + version: '6.60' + Date::Manip::Offset::off186: + file: off186.pm + version: '6.60' + Date::Manip::Offset::off187: + file: off187.pm + version: '6.60' + Date::Manip::Offset::off188: + file: off188.pm + version: '6.60' + Date::Manip::Offset::off189: + file: off189.pm + version: '6.60' + Date::Manip::Offset::off190: + file: off190.pm + version: '6.60' + Date::Manip::Offset::off191: + file: off191.pm + version: '6.60' + Date::Manip::Offset::off192: + file: off192.pm + version: '6.60' + Date::Manip::Offset::off193: + file: off193.pm + version: '6.60' + Date::Manip::Offset::off194: + file: off194.pm + version: '6.60' + Date::Manip::Offset::off195: + file: off195.pm + version: '6.60' + Date::Manip::Offset::off196: + file: off196.pm + version: '6.60' + Date::Manip::Offset::off197: + file: off197.pm + version: '6.60' + Date::Manip::Offset::off198: + file: off198.pm + version: '6.60' + Date::Manip::Offset::off199: + file: off199.pm + version: '6.60' + Date::Manip::Offset::off200: + file: off200.pm + version: '6.60' + Date::Manip::Offset::off201: + file: off201.pm + version: '6.60' + Date::Manip::Offset::off202: + file: off202.pm + version: '6.60' + Date::Manip::Offset::off203: + file: off203.pm + version: '6.60' + Date::Manip::Offset::off204: + file: off204.pm + version: '6.60' + Date::Manip::Offset::off205: + file: off205.pm + version: '6.60' + Date::Manip::Offset::off206: + file: off206.pm + version: '6.60' + Date::Manip::Offset::off207: + file: off207.pm + version: '6.60' + Date::Manip::Offset::off208: + file: off208.pm + version: '6.60' + Date::Manip::Offset::off209: + file: off209.pm + version: '6.60' + Date::Manip::Offset::off210: + file: off210.pm + version: '6.60' + Date::Manip::Offset::off211: + file: off211.pm + version: '6.60' + Date::Manip::Offset::off212: + file: off212.pm + version: '6.60' + Date::Manip::Offset::off213: + file: off213.pm + version: '6.60' + Date::Manip::Offset::off214: + file: off214.pm + version: '6.60' + Date::Manip::Offset::off215: + file: off215.pm + version: '6.60' + Date::Manip::Offset::off216: + file: off216.pm + version: '6.60' + Date::Manip::Offset::off217: + file: off217.pm + version: '6.60' + Date::Manip::Offset::off218: + file: off218.pm + version: '6.60' + Date::Manip::Offset::off219: + file: off219.pm + version: '6.60' + Date::Manip::Offset::off220: + file: off220.pm + version: '6.60' + Date::Manip::Offset::off221: + file: off221.pm + version: '6.60' + Date::Manip::Offset::off222: + file: off222.pm + version: '6.60' + Date::Manip::Offset::off223: + file: off223.pm + version: '6.60' + Date::Manip::Offset::off224: + file: off224.pm + version: '6.60' + Date::Manip::Offset::off225: + file: off225.pm + version: '6.60' + Date::Manip::Offset::off226: + file: off226.pm + version: '6.60' + Date::Manip::Offset::off227: + file: off227.pm + version: '6.60' + Date::Manip::Offset::off228: + file: off228.pm + version: '6.60' + Date::Manip::Offset::off229: + file: off229.pm + version: '6.60' + Date::Manip::Offset::off230: + file: off230.pm + version: '6.60' + Date::Manip::Offset::off231: + file: off231.pm + version: '6.60' + Date::Manip::Offset::off232: + file: off232.pm + version: '6.60' + Date::Manip::Offset::off233: + file: off233.pm + version: '6.60' + Date::Manip::Offset::off234: + file: off234.pm + version: '6.60' + Date::Manip::Offset::off235: + file: off235.pm + version: '6.60' + Date::Manip::Offset::off236: + file: off236.pm + version: '6.60' + Date::Manip::Offset::off237: + file: off237.pm + version: '6.60' + Date::Manip::Offset::off238: + file: off238.pm + version: '6.60' + Date::Manip::Offset::off239: + file: off239.pm + version: '6.60' + Date::Manip::Offset::off240: + file: off240.pm + version: '6.60' + Date::Manip::Offset::off241: + file: off241.pm + version: '6.60' + Date::Manip::Offset::off242: + file: off242.pm + version: '6.60' + Date::Manip::Offset::off243: + file: off243.pm + version: '6.60' + Date::Manip::Offset::off244: + file: off244.pm + version: '6.60' + Date::Manip::Offset::off245: + file: off245.pm + version: '6.60' + Date::Manip::Offset::off246: + file: off246.pm + version: '6.60' + Date::Manip::Offset::off247: + file: off247.pm + version: '6.60' + Date::Manip::Offset::off248: + file: off248.pm + version: '6.60' + Date::Manip::Offset::off249: + file: off249.pm + version: '6.60' + Date::Manip::Offset::off250: + file: off250.pm + version: '6.60' + Date::Manip::Offset::off251: + file: off251.pm + version: '6.60' + Date::Manip::Offset::off252: + file: off252.pm + version: '6.60' + Date::Manip::Offset::off253: + file: off253.pm + version: '6.60' + Date::Manip::Offset::off254: + file: off254.pm + version: '6.60' + Date::Manip::Offset::off255: + file: off255.pm + version: '6.60' + Date::Manip::Offset::off256: + file: off256.pm + version: '6.60' + Date::Manip::Offset::off257: + file: off257.pm + version: '6.60' + Date::Manip::Offset::off258: + file: off258.pm + version: '6.60' + Date::Manip::Offset::off259: + file: off259.pm + version: '6.60' + Date::Manip::Offset::off260: + file: off260.pm + version: '6.60' + Date::Manip::Offset::off261: + file: off261.pm + version: '6.60' + Date::Manip::Offset::off262: + file: off262.pm + version: '6.60' + Date::Manip::Offset::off263: + file: off263.pm + version: '6.60' + Date::Manip::Offset::off264: + file: off264.pm + version: '6.60' + Date::Manip::Offset::off265: + file: off265.pm + version: '6.60' + Date::Manip::Offset::off266: + file: off266.pm + version: '6.60' + Date::Manip::Offset::off267: + file: off267.pm + version: '6.60' + Date::Manip::Offset::off268: + file: off268.pm + version: '6.60' + Date::Manip::Offset::off269: + file: off269.pm + version: '6.60' + Date::Manip::Offset::off270: + file: off270.pm + version: '6.60' + Date::Manip::Offset::off271: + file: off271.pm + version: '6.60' + Date::Manip::Offset::off272: + file: off272.pm + version: '6.60' + Date::Manip::Offset::off273: + file: off273.pm + version: '6.60' + Date::Manip::Offset::off274: + file: off274.pm + version: '6.60' + Date::Manip::Offset::off275: + file: off275.pm + version: '6.60' + Date::Manip::Offset::off276: + file: off276.pm + version: '6.60' + Date::Manip::Offset::off277: + file: off277.pm + version: '6.60' + Date::Manip::Offset::off278: + file: off278.pm + version: '6.60' + Date::Manip::Offset::off279: + file: off279.pm + version: '6.60' + Date::Manip::Offset::off280: + file: off280.pm + version: '6.60' + Date::Manip::Offset::off281: + file: off281.pm + version: '6.60' + Date::Manip::Offset::off282: + file: off282.pm + version: '6.60' + Date::Manip::Offset::off283: + file: off283.pm + version: '6.60' + Date::Manip::Offset::off284: + file: off284.pm + version: '6.60' + Date::Manip::Offset::off285: + file: off285.pm + version: '6.60' + Date::Manip::Offset::off286: + file: off286.pm + version: '6.60' + Date::Manip::Offset::off287: + file: off287.pm + version: '6.60' + Date::Manip::Offset::off288: + file: off288.pm + version: '6.60' + Date::Manip::Offset::off289: + file: off289.pm + version: '6.60' + Date::Manip::Offset::off290: + file: off290.pm + version: '6.60' + Date::Manip::Offset::off291: + file: off291.pm + version: '6.60' + Date::Manip::Offset::off292: + file: off292.pm + version: '6.60' + Date::Manip::Offset::off293: + file: off293.pm + version: '6.60' + Date::Manip::Offset::off294: + file: off294.pm + version: '6.60' + Date::Manip::Offset::off295: + file: off295.pm + version: '6.60' + Date::Manip::Offset::off296: + file: off296.pm + version: '6.60' + Date::Manip::Offset::off297: + file: off297.pm + version: '6.60' + Date::Manip::Offset::off298: + file: off298.pm + version: '6.60' + Date::Manip::Offset::off299: + file: off299.pm + version: '6.60' + Date::Manip::Offset::off300: + file: off300.pm + version: '6.60' + Date::Manip::Offset::off301: + file: off301.pm + version: '6.60' + Date::Manip::Offset::off302: + file: off302.pm + version: '6.60' + Date::Manip::Offset::off303: + file: off303.pm + version: '6.60' + Date::Manip::Offset::off304: + file: off304.pm + version: '6.60' + Date::Manip::Offset::off305: + file: off305.pm + version: '6.60' + Date::Manip::Offset::off306: + file: off306.pm + version: '6.60' + Date::Manip::Offset::off307: + file: off307.pm + version: '6.60' + Date::Manip::Offset::off308: + file: off308.pm + version: '6.60' + Date::Manip::Offset::off309: + file: off309.pm + version: '6.60' + Date::Manip::Offset::off310: + file: off310.pm + version: '6.60' + Date::Manip::Offset::off311: + file: off311.pm + version: '6.60' + Date::Manip::Offset::off312: + file: off312.pm + version: '6.60' + Date::Manip::Offset::off313: + file: off313.pm + version: '6.60' + Date::Manip::Offset::off314: + file: off314.pm + version: '6.60' + Date::Manip::Offset::off315: + file: off315.pm + version: '6.60' + Date::Manip::Offset::off316: + file: off316.pm + version: '6.60' + Date::Manip::Offset::off317: + file: off317.pm + version: '6.60' + Date::Manip::Offset::off318: + file: off318.pm + version: '6.60' + Date::Manip::Offset::off319: + file: off319.pm + version: '6.60' + Date::Manip::Offset::off320: + file: off320.pm + version: '6.60' + Date::Manip::Offset::off321: + file: off321.pm + version: '6.60' + Date::Manip::Offset::off322: + file: off322.pm + version: '6.60' + Date::Manip::Offset::off323: + file: off323.pm + version: '6.60' + Date::Manip::Offset::off324: + file: off324.pm + version: '6.60' + Date::Manip::Offset::off325: + file: off325.pm + version: '6.60' + Date::Manip::Offset::off326: + file: off326.pm + version: '6.60' + Date::Manip::Offset::off327: + file: off327.pm + version: '6.60' + Date::Manip::Offset::off328: + file: off328.pm + version: '6.60' + Date::Manip::Offset::off329: + file: off329.pm + version: '6.60' + Date::Manip::Offset::off330: + file: off330.pm + version: '6.60' + Date::Manip::Offset::off331: + file: off331.pm + version: '6.60' + Date::Manip::Offset::off332: + file: off332.pm + version: '6.60' + Date::Manip::Offset::off333: + file: off333.pm + version: '6.60' + Date::Manip::Offset::off334: + file: off334.pm + version: '6.60' + Date::Manip::Offset::off335: + file: off335.pm + version: '6.60' + Date::Manip::Offset::off336: + file: off336.pm + version: '6.60' + Date::Manip::Offset::off337: + file: off337.pm + version: '6.60' + Date::Manip::Offset::off338: + file: off338.pm + version: '6.60' + Date::Manip::Offset::off339: + file: off339.pm + version: '6.60' + Date::Manip::Offset::off340: + file: off340.pm + version: '6.60' + Date::Manip::Offset::off341: + file: off341.pm + version: '6.60' + Date::Manip::Offset::off342: + file: off342.pm + version: '6.60' + Date::Manip::Offset::off343: + file: off343.pm + version: '6.60' + Date::Manip::Offset::off344: + file: off344.pm + version: '6.60' + Date::Manip::Offset::off345: + file: off345.pm + version: '6.60' + Date::Manip::Offset::off346: + file: off346.pm + version: '6.60' + Date::Manip::Offset::off347: + file: off347.pm + version: '6.60' + Date::Manip::Offset::off348: + file: off348.pm + version: '6.60' + Date::Manip::Offset::off349: + file: off349.pm + version: '6.60' + Date::Manip::Offset::off350: + file: off350.pm + version: '6.60' + Date::Manip::Offset::off351: + file: off351.pm + version: '6.60' + Date::Manip::Offset::off352: + file: off352.pm + version: '6.60' + Date::Manip::Offset::off353: + file: off353.pm + version: '6.60' + Date::Manip::Offset::off354: + file: off354.pm + version: '6.60' + Date::Manip::Offset::off355: + file: off355.pm + version: '6.60' + Date::Manip::Offset::off356: + file: off356.pm + version: '6.60' + Date::Manip::Offset::off357: + file: off357.pm + version: '6.60' + Date::Manip::Offset::off358: + file: off358.pm + version: '6.60' + Date::Manip::Offset::off359: + file: off359.pm + version: '6.60' + Date::Manip::Offset::off360: + file: off360.pm + version: '6.60' + Date::Manip::Offset::off361: + file: off361.pm + version: '6.60' + Date::Manip::Offset::off362: + file: off362.pm + version: '6.60' + Date::Manip::Offset::off363: + file: off363.pm + version: '6.60' + Date::Manip::Offset::off364: + file: off364.pm + version: '6.60' + Date::Manip::Offset::off365: + file: off365.pm + version: '6.60' + Date::Manip::Offset::off366: + file: off366.pm + version: '6.60' + Date::Manip::Offset::off367: + file: off367.pm + version: '6.60' + Date::Manip::Offset::off368: + file: off368.pm + version: '6.60' + Date::Manip::Offset::off369: + file: off369.pm + version: '6.60' + Date::Manip::Offset::off370: + file: off370.pm + version: '6.60' + Date::Manip::Offset::off371: + file: off371.pm + version: '6.60' + Date::Manip::Offset::off372: + file: off372.pm + version: '6.60' + Date::Manip::Offset::off373: + file: off373.pm + version: '6.60' + Date::Manip::Offset::off374: + file: off374.pm + version: '6.60' + Date::Manip::Offset::off375: + file: off375.pm + version: '6.60' + Date::Manip::Offset::off376: + file: off376.pm + version: '6.60' + Date::Manip::Offset::off377: + file: off377.pm + version: '6.60' + Date::Manip::Offset::off378: + file: off378.pm + version: '6.60' + Date::Manip::Offset::off379: + file: off379.pm + version: '6.60' + Date::Manip::Offset::off380: + file: off380.pm + version: '6.60' + Date::Manip::Offset::off381: + file: off381.pm + version: '6.60' + Date::Manip::Offset::off382: + file: off382.pm + version: '6.60' + Date::Manip::Offset::off383: + file: off383.pm + version: '6.60' + Date::Manip::Offset::off384: + file: off384.pm + version: '6.60' + Date::Manip::Offset::off385: + file: off385.pm + version: '6.60' + Date::Manip::Offset::off386: + file: off386.pm + version: '6.60' + Date::Manip::Offset::off387: + file: off387.pm + version: '6.60' + Date::Manip::Offset::off388: + file: off388.pm + version: '6.60' + Date::Manip::Offset::off389: + file: off389.pm + version: '6.60' + Date::Manip::Offset::off390: + file: off390.pm + version: '6.60' + Date::Manip::Offset::off391: + file: off391.pm + version: '6.60' + Date::Manip::Offset::off392: + file: off392.pm + version: '6.60' + Date::Manip::Offset::off393: + file: off393.pm + version: '6.60' + Date::Manip::Offset::off394: + file: off394.pm + version: '6.60' + Date::Manip::Offset::off395: + file: off395.pm + version: '6.60' + Date::Manip::Offset::off396: + file: off396.pm + version: '6.60' + Date::Manip::Offset::off397: + file: off397.pm + version: '6.60' + Date::Manip::Offset::off398: + file: off398.pm + version: '6.60' + Date::Manip::Offset::off399: + file: off399.pm + version: '6.60' + Date::Manip::Offset::off400: + file: off400.pm + version: '6.60' + Date::Manip::Offset::off401: + file: off401.pm + version: '6.60' + Date::Manip::Offset::off402: + file: off402.pm + version: '6.60' + Date::Manip::Offset::off403: + file: off403.pm + version: '6.60' + Date::Manip::Offset::off404: + file: off404.pm + version: '6.60' + Date::Manip::Offset::off405: + file: off405.pm + version: '6.60' + Date::Manip::Offset::off406: + file: off406.pm + version: '6.60' + Date::Manip::Offset::off407: + file: off407.pm + version: '6.60' + Date::Manip::Offset::off408: + file: off408.pm + version: '6.60' + Date::Manip::Offset::off409: + file: off409.pm + version: '6.60' + Date::Manip::Offset::off410: + file: off410.pm + version: '6.60' + Date::Manip::Offset::off411: + file: off411.pm + version: '6.60' + Date::Manip::Offset::off412: + file: off412.pm + version: '6.60' + Date::Manip::Offset::off413: + file: off413.pm + version: '6.60' + Date::Manip::Offset::off414: + file: off414.pm + version: '6.60' + Date::Manip::Offset::off415: + file: off415.pm + version: '6.60' + Date::Manip::Offset::off416: + file: off416.pm + version: '6.60' + Date::Manip::Offset::off417: + file: off417.pm + version: '6.60' + Date::Manip::Offset::off418: + file: off418.pm + version: '6.60' + Date::Manip::Offset::off419: + file: off419.pm + version: '6.60' + Date::Manip::Offset::off420: + file: off420.pm + version: '6.60' + Date::Manip::Offset::off421: + file: off421.pm + version: '6.60' + Date::Manip::Offset::off422: + file: off422.pm + version: '6.60' + Date::Manip::Offset::off423: + file: off423.pm + version: '6.60' + Date::Manip::Offset::off424: + file: off424.pm + version: '6.60' + Date::Manip::Offset::off425: + file: off425.pm + version: '6.60' + Date::Manip::Offset::off426: + file: off426.pm + version: '6.60' + Date::Manip::Offset::off427: + file: off427.pm + version: '6.60' + Date::Manip::Offset::off428: + file: off428.pm + version: '6.60' + Date::Manip::Offset::off429: + file: off429.pm + version: '6.60' + Date::Manip::Offset::off430: + file: off430.pm + version: '6.60' + Date::Manip::Offset::off431: + file: off431.pm + version: '6.60' + Date::Manip::Offset::off432: + file: off432.pm + version: '6.60' + Date::Manip::Offset::off433: + file: off433.pm + version: '6.60' + Date::Manip::Offset::off434: + file: off434.pm + version: '6.60' + Date::Manip::Offset::off435: + file: off435.pm + version: '6.60' + Date::Manip::Offset::off436: + file: off436.pm + version: '6.60' + Date::Manip::Recur: + file: Recur.pm + version: '6.60' + Date::Manip::TZ: + file: TZ.pm + version: '6.60' + Date::Manip::TZ::a00: + file: a00.pm + version: '6.60' + Date::Manip::TZ::afabid00: + file: afabid00.pm + version: '6.60' + Date::Manip::TZ::afaccr00: + file: afaccr00.pm + version: '6.60' + Date::Manip::TZ::afalgi00: + file: afalgi00.pm + version: '6.60' + Date::Manip::TZ::afbiss00: + file: afbiss00.pm + version: '6.60' + Date::Manip::TZ::afcair00: + file: afcair00.pm + version: '6.60' + Date::Manip::TZ::afcasa00: + file: afcasa00.pm + version: '6.60' + Date::Manip::TZ::afceut00: + file: afceut00.pm + version: '6.60' + Date::Manip::TZ::afel_a00: + file: afel_a00.pm + version: '6.60' + Date::Manip::TZ::afjoha00: + file: afjoha00.pm + version: '6.60' + Date::Manip::TZ::afkhar00: + file: afkhar00.pm + version: '6.60' + Date::Manip::TZ::aflago00: + file: aflago00.pm + version: '6.60' + Date::Manip::TZ::afmapu00: + file: afmapu00.pm + version: '6.60' + Date::Manip::TZ::afmonr00: + file: afmonr00.pm + version: '6.60' + Date::Manip::TZ::afnair00: + file: afnair00.pm + version: '6.60' + Date::Manip::TZ::afndja00: + file: afndja00.pm + version: '6.60' + Date::Manip::TZ::aftrip00: + file: aftrip00.pm + version: '6.60' + Date::Manip::TZ::aftuni00: + file: aftuni00.pm + version: '6.60' + Date::Manip::TZ::afwind00: + file: afwind00.pm + version: '6.60' + Date::Manip::TZ::amadak00: + file: amadak00.pm + version: '6.60' + Date::Manip::TZ::amanch00: + file: amanch00.pm + version: '6.60' + Date::Manip::TZ::amarag00: + file: amarag00.pm + version: '6.60' + Date::Manip::TZ::amasun00: + file: amasun00.pm + version: '6.60' + Date::Manip::TZ::amatik00: + file: amatik00.pm + version: '6.60' + Date::Manip::TZ::ambahi00: + file: ambahi00.pm + version: '6.60' + Date::Manip::TZ::ambahi01: + file: ambahi01.pm + version: '6.60' + Date::Manip::TZ::ambarb00: + file: ambarb00.pm + version: '6.60' + Date::Manip::TZ::ambele00: + file: ambele00.pm + version: '6.60' + Date::Manip::TZ::ambeli00: + file: ambeli00.pm + version: '6.60' + Date::Manip::TZ::ambeul00: + file: ambeul00.pm + version: '6.60' + Date::Manip::TZ::amblan00: + file: amblan00.pm + version: '6.60' + Date::Manip::TZ::amboa_00: + file: amboa_00.pm + version: '6.60' + Date::Manip::TZ::ambogo00: + file: ambogo00.pm + version: '6.60' + Date::Manip::TZ::ambois00: + file: ambois00.pm + version: '6.60' + Date::Manip::TZ::ambuen00: + file: ambuen00.pm + version: '6.60' + Date::Manip::TZ::amcamb00: + file: amcamb00.pm + version: '6.60' + Date::Manip::TZ::amcamp00: + file: amcamp00.pm + version: '6.60' + Date::Manip::TZ::amcanc00: + file: amcanc00.pm + version: '6.60' + Date::Manip::TZ::amcara00: + file: amcara00.pm + version: '6.60' + Date::Manip::TZ::amcata00: + file: amcata00.pm + version: '6.60' + Date::Manip::TZ::amcaye00: + file: amcaye00.pm + version: '6.60' + Date::Manip::TZ::amcent00: + file: amcent00.pm + version: '6.60' + Date::Manip::TZ::amchic00: + file: amchic00.pm + version: '6.60' + Date::Manip::TZ::amchih00: + file: amchih00.pm + version: '6.60' + Date::Manip::TZ::amcord00: + file: amcord00.pm + version: '6.60' + Date::Manip::TZ::amcost00: + file: amcost00.pm + version: '6.60' + Date::Manip::TZ::amcres00: + file: amcres00.pm + version: '6.60' + Date::Manip::TZ::amcuia00: + file: amcuia00.pm + version: '6.60' + Date::Manip::TZ::amcura00: + file: amcura00.pm + version: '6.60' + Date::Manip::TZ::amdanm00: + file: amdanm00.pm + version: '6.60' + Date::Manip::TZ::amdaws00: + file: amdaws00.pm + version: '6.60' + Date::Manip::TZ::amdaws01: + file: amdaws01.pm + version: '6.60' + Date::Manip::TZ::amdenv00: + file: amdenv00.pm + version: '6.60' + Date::Manip::TZ::amdetr00: + file: amdetr00.pm + version: '6.60' + Date::Manip::TZ::amedmo00: + file: amedmo00.pm + version: '6.60' + Date::Manip::TZ::ameiru00: + file: ameiru00.pm + version: '6.60' + Date::Manip::TZ::amel_s00: + file: amel_s00.pm + version: '6.60' + Date::Manip::TZ::amfort00: + file: amfort00.pm + version: '6.60' + Date::Manip::TZ::amfort01: + file: amfort01.pm + version: '6.60' + Date::Manip::TZ::amglac00: + file: amglac00.pm + version: '6.60' + Date::Manip::TZ::amgodt00: + file: amgodt00.pm + version: '6.60' + Date::Manip::TZ::amgoos00: + file: amgoos00.pm + version: '6.60' + Date::Manip::TZ::amgran00: + file: amgran00.pm + version: '6.60' + Date::Manip::TZ::amguat00: + file: amguat00.pm + version: '6.60' + Date::Manip::TZ::amguay00: + file: amguay00.pm + version: '6.60' + Date::Manip::TZ::amguya00: + file: amguya00.pm + version: '6.60' + Date::Manip::TZ::amhali00: + file: amhali00.pm + version: '6.60' + Date::Manip::TZ::amhava00: + file: amhava00.pm + version: '6.60' + Date::Manip::TZ::amherm00: + file: amherm00.pm + version: '6.60' + Date::Manip::TZ::amindi00: + file: amindi00.pm + version: '6.60' + Date::Manip::TZ::aminuv00: + file: aminuv00.pm + version: '6.60' + Date::Manip::TZ::amiqal00: + file: amiqal00.pm + version: '6.60' + Date::Manip::TZ::amjama00: + file: amjama00.pm + version: '6.60' + Date::Manip::TZ::amjuju00: + file: amjuju00.pm + version: '6.60' + Date::Manip::TZ::amjune00: + file: amjune00.pm + version: '6.60' + Date::Manip::TZ::amknox00: + file: amknox00.pm + version: '6.60' + Date::Manip::TZ::amla_p00: + file: amla_p00.pm + version: '6.60' + Date::Manip::TZ::amla_r00: + file: amla_r00.pm + version: '6.60' + Date::Manip::TZ::amlima00: + file: amlima00.pm + version: '6.60' + Date::Manip::TZ::amlos_00: + file: amlos_00.pm + version: '6.60' + Date::Manip::TZ::amloui00: + file: amloui00.pm + version: '6.60' + Date::Manip::TZ::ammace00: + file: ammace00.pm + version: '6.60' + Date::Manip::TZ::ammana00: + file: ammana00.pm + version: '6.60' + Date::Manip::TZ::ammana01: + file: ammana01.pm + version: '6.60' + Date::Manip::TZ::ammare00: + file: ammare00.pm + version: '6.60' + Date::Manip::TZ::ammart00: + file: ammart00.pm + version: '6.60' + Date::Manip::TZ::ammata00: + file: ammata00.pm + version: '6.60' + Date::Manip::TZ::ammaza00: + file: ammaza00.pm + version: '6.60' + Date::Manip::TZ::ammend00: + file: ammend00.pm + version: '6.60' + Date::Manip::TZ::ammeno00: + file: ammeno00.pm + version: '6.60' + Date::Manip::TZ::ammeri00: + file: ammeri00.pm + version: '6.60' + Date::Manip::TZ::ammetl00: + file: ammetl00.pm + version: '6.60' + Date::Manip::TZ::ammexi00: + file: ammexi00.pm + version: '6.60' + Date::Manip::TZ::ammiqu00: + file: ammiqu00.pm + version: '6.60' + Date::Manip::TZ::ammonc00: + file: ammonc00.pm + version: '6.60' + Date::Manip::TZ::ammont00: + file: ammont00.pm + version: '6.60' + Date::Manip::TZ::ammont01: + file: ammont01.pm + version: '6.60' + Date::Manip::TZ::ammont02: + file: ammont02.pm + version: '6.60' + Date::Manip::TZ::amnass00: + file: amnass00.pm + version: '6.60' + Date::Manip::TZ::amnew_00: + file: amnew_00.pm + version: '6.60' + Date::Manip::TZ::amnew_01: + file: amnew_01.pm + version: '6.60' + Date::Manip::TZ::amnipi00: + file: amnipi00.pm + version: '6.60' + Date::Manip::TZ::amnome00: + file: amnome00.pm + version: '6.60' + Date::Manip::TZ::amnoro00: + file: amnoro00.pm + version: '6.60' + Date::Manip::TZ::amojin00: + file: amojin00.pm + version: '6.60' + Date::Manip::TZ::ampana00: + file: ampana00.pm + version: '6.60' + Date::Manip::TZ::ampang00: + file: ampang00.pm + version: '6.60' + Date::Manip::TZ::ampara00: + file: ampara00.pm + version: '6.60' + Date::Manip::TZ::ampete00: + file: ampete00.pm + version: '6.60' + Date::Manip::TZ::amphoe00: + file: amphoe00.pm + version: '6.60' + Date::Manip::TZ::amport00: + file: amport00.pm + version: '6.60' + Date::Manip::TZ::amport01: + file: amport01.pm + version: '6.60' + Date::Manip::TZ::amport02: + file: amport02.pm + version: '6.60' + Date::Manip::TZ::ampuer00: + file: ampuer00.pm + version: '6.60' + Date::Manip::TZ::ampunt00: + file: ampunt00.pm + version: '6.60' + Date::Manip::TZ::amrain00: + file: amrain00.pm + version: '6.60' + Date::Manip::TZ::amrank00: + file: amrank00.pm + version: '6.60' + Date::Manip::TZ::amreci00: + file: amreci00.pm + version: '6.60' + Date::Manip::TZ::amregi00: + file: amregi00.pm + version: '6.60' + Date::Manip::TZ::amreso00: + file: amreso00.pm + version: '6.60' + Date::Manip::TZ::amrio_00: + file: amrio_00.pm + version: '6.60' + Date::Manip::TZ::amrio_01: + file: amrio_01.pm + version: '6.60' + Date::Manip::TZ::amsalt00: + file: amsalt00.pm + version: '6.60' + Date::Manip::TZ::amsan_00: + file: amsan_00.pm + version: '6.60' + Date::Manip::TZ::amsan_01: + file: amsan_01.pm + version: '6.60' + Date::Manip::TZ::amsant00: + file: amsant00.pm + version: '6.60' + Date::Manip::TZ::amsant01: + file: amsant01.pm + version: '6.60' + Date::Manip::TZ::amsant02: + file: amsant02.pm + version: '6.60' + Date::Manip::TZ::amsao_00: + file: amsao_00.pm + version: '6.60' + Date::Manip::TZ::amscor00: + file: amscor00.pm + version: '6.60' + Date::Manip::TZ::amsitk00: + file: amsitk00.pm + version: '6.60' + Date::Manip::TZ::amst_j00: + file: amst_j00.pm + version: '6.60' + Date::Manip::TZ::amswif00: + file: amswif00.pm + version: '6.60' + Date::Manip::TZ::amtegu00: + file: amtegu00.pm + version: '6.60' + Date::Manip::TZ::amtell00: + file: amtell00.pm + version: '6.60' + Date::Manip::TZ::amthul00: + file: amthul00.pm + version: '6.60' + Date::Manip::TZ::amthun00: + file: amthun00.pm + version: '6.60' + Date::Manip::TZ::amtiju00: + file: amtiju00.pm + version: '6.60' + Date::Manip::TZ::amtoro00: + file: amtoro00.pm + version: '6.60' + Date::Manip::TZ::amtucu00: + file: amtucu00.pm + version: '6.60' + Date::Manip::TZ::amushu00: + file: amushu00.pm + version: '6.60' + Date::Manip::TZ::amvanc00: + file: amvanc00.pm + version: '6.60' + Date::Manip::TZ::amveva00: + file: amveva00.pm + version: '6.60' + Date::Manip::TZ::amvinc00: + file: amvinc00.pm + version: '6.60' + Date::Manip::TZ::amwhit00: + file: amwhit00.pm + version: '6.60' + Date::Manip::TZ::amwina00: + file: amwina00.pm + version: '6.60' + Date::Manip::TZ::amwinn00: + file: amwinn00.pm + version: '6.60' + Date::Manip::TZ::amyaku00: + file: amyaku00.pm + version: '6.60' + Date::Manip::TZ::amyell00: + file: amyell00.pm + version: '6.60' + Date::Manip::TZ::ancase00: + file: ancase00.pm + version: '6.60' + Date::Manip::TZ::andavi00: + file: andavi00.pm + version: '6.60' + Date::Manip::TZ::andumo00: + file: andumo00.pm + version: '6.60' + Date::Manip::TZ::anmacq00: + file: anmacq00.pm + version: '6.60' + Date::Manip::TZ::anmaws00: + file: anmaws00.pm + version: '6.60' + Date::Manip::TZ::anpalm00: + file: anpalm00.pm + version: '6.60' + Date::Manip::TZ::anroth00: + file: anroth00.pm + version: '6.60' + Date::Manip::TZ::ansyow00: + file: ansyow00.pm + version: '6.60' + Date::Manip::TZ::antrol00: + file: antrol00.pm + version: '6.60' + Date::Manip::TZ::anvost00: + file: anvost00.pm + version: '6.60' + Date::Manip::TZ::asalma00: + file: asalma00.pm + version: '6.60' + Date::Manip::TZ::asamma00: + file: asamma00.pm + version: '6.60' + Date::Manip::TZ::asanad00: + file: asanad00.pm + version: '6.60' + Date::Manip::TZ::asaqta00: + file: asaqta00.pm + version: '6.60' + Date::Manip::TZ::asaqto00: + file: asaqto00.pm + version: '6.60' + Date::Manip::TZ::asashg00: + file: asashg00.pm + version: '6.60' + Date::Manip::TZ::asatyr00: + file: asatyr00.pm + version: '6.60' + Date::Manip::TZ::asbagh00: + file: asbagh00.pm + version: '6.60' + Date::Manip::TZ::asbaku00: + file: asbaku00.pm + version: '6.60' + Date::Manip::TZ::asbang00: + file: asbang00.pm + version: '6.60' + Date::Manip::TZ::asbarn00: + file: asbarn00.pm + version: '6.60' + Date::Manip::TZ::asbeir00: + file: asbeir00.pm + version: '6.60' + Date::Manip::TZ::asbish00: + file: asbish00.pm + version: '6.60' + Date::Manip::TZ::asbrun00: + file: asbrun00.pm + version: '6.60' + Date::Manip::TZ::aschit00: + file: aschit00.pm + version: '6.60' + Date::Manip::TZ::aschoi00: + file: aschoi00.pm + version: '6.60' + Date::Manip::TZ::ascolo00: + file: ascolo00.pm + version: '6.60' + Date::Manip::TZ::asdama00: + file: asdama00.pm + version: '6.60' + Date::Manip::TZ::asdhak00: + file: asdhak00.pm + version: '6.60' + Date::Manip::TZ::asdili00: + file: asdili00.pm + version: '6.60' + Date::Manip::TZ::asduba00: + file: asduba00.pm + version: '6.60' + Date::Manip::TZ::asdush00: + file: asdush00.pm + version: '6.60' + Date::Manip::TZ::asfama00: + file: asfama00.pm + version: '6.60' + Date::Manip::TZ::asgaza00: + file: asgaza00.pm + version: '6.60' + Date::Manip::TZ::ashebr00: + file: ashebr00.pm + version: '6.60' + Date::Manip::TZ::asho_c00: + file: asho_c00.pm + version: '6.60' + Date::Manip::TZ::ashong00: + file: ashong00.pm + version: '6.60' + Date::Manip::TZ::ashovd00: + file: ashovd00.pm + version: '6.60' + Date::Manip::TZ::asirku00: + file: asirku00.pm + version: '6.60' + Date::Manip::TZ::asjaka00: + file: asjaka00.pm + version: '6.60' + Date::Manip::TZ::asjaya00: + file: asjaya00.pm + version: '6.60' + Date::Manip::TZ::asjeru00: + file: asjeru00.pm + version: '6.60' + Date::Manip::TZ::askabu00: + file: askabu00.pm + version: '6.60' + Date::Manip::TZ::askamc00: + file: askamc00.pm + version: '6.60' + Date::Manip::TZ::askara00: + file: askara00.pm + version: '6.60' + Date::Manip::TZ::askath00: + file: askath00.pm + version: '6.60' + Date::Manip::TZ::askhan00: + file: askhan00.pm + version: '6.60' + Date::Manip::TZ::askolk00: + file: askolk00.pm + version: '6.60' + Date::Manip::TZ::askras00: + file: askras00.pm + version: '6.60' + Date::Manip::TZ::askual00: + file: askual00.pm + version: '6.60' + Date::Manip::TZ::askuch00: + file: askuch00.pm + version: '6.60' + Date::Manip::TZ::asmaca00: + file: asmaca00.pm + version: '6.60' + Date::Manip::TZ::asmaga00: + file: asmaga00.pm + version: '6.60' + Date::Manip::TZ::asmaka00: + file: asmaka00.pm + version: '6.60' + Date::Manip::TZ::asmani00: + file: asmani00.pm + version: '6.60' + Date::Manip::TZ::asnico00: + file: asnico00.pm + version: '6.60' + Date::Manip::TZ::asnovo00: + file: asnovo00.pm + version: '6.60' + Date::Manip::TZ::asnovo01: + file: asnovo01.pm + version: '6.60' + Date::Manip::TZ::asomsk00: + file: asomsk00.pm + version: '6.60' + Date::Manip::TZ::asoral00: + file: asoral00.pm + version: '6.60' + Date::Manip::TZ::aspont00: + file: aspont00.pm + version: '6.60' + Date::Manip::TZ::aspyon00: + file: aspyon00.pm + version: '6.60' + Date::Manip::TZ::asqata00: + file: asqata00.pm + version: '6.60' + Date::Manip::TZ::asqyzy00: + file: asqyzy00.pm + version: '6.60' + Date::Manip::TZ::asriya00: + file: asriya00.pm + version: '6.60' + Date::Manip::TZ::assakh00: + file: assakh00.pm + version: '6.60' + Date::Manip::TZ::assama00: + file: assama00.pm + version: '6.60' + Date::Manip::TZ::asseou00: + file: asseou00.pm + version: '6.60' + Date::Manip::TZ::asshan00: + file: asshan00.pm + version: '6.60' + Date::Manip::TZ::assing00: + file: assing00.pm + version: '6.60' + Date::Manip::TZ::assred00: + file: assred00.pm + version: '6.60' + Date::Manip::TZ::astaip00: + file: astaip00.pm + version: '6.60' + Date::Manip::TZ::astash00: + file: astash00.pm + version: '6.60' + Date::Manip::TZ::astbil00: + file: astbil00.pm + version: '6.60' + Date::Manip::TZ::astehr00: + file: astehr00.pm + version: '6.60' + Date::Manip::TZ::asthim00: + file: asthim00.pm + version: '6.60' + Date::Manip::TZ::astoky00: + file: astoky00.pm + version: '6.60' + Date::Manip::TZ::astoms00: + file: astoms00.pm + version: '6.60' + Date::Manip::TZ::asulaa00: + file: asulaa00.pm + version: '6.60' + Date::Manip::TZ::asurum00: + file: asurum00.pm + version: '6.60' + Date::Manip::TZ::asustm00: + file: asustm00.pm + version: '6.60' + Date::Manip::TZ::asvlad00: + file: asvlad00.pm + version: '6.60' + Date::Manip::TZ::asyaku00: + file: asyaku00.pm + version: '6.60' + Date::Manip::TZ::asyang00: + file: asyang00.pm + version: '6.60' + Date::Manip::TZ::asyeka00: + file: asyeka00.pm + version: '6.60' + Date::Manip::TZ::asyere00: + file: asyere00.pm + version: '6.60' + Date::Manip::TZ::atazor00: + file: atazor00.pm + version: '6.60' + Date::Manip::TZ::atberm00: + file: atberm00.pm + version: '6.60' + Date::Manip::TZ::atcana00: + file: atcana00.pm + version: '6.60' + Date::Manip::TZ::atcape00: + file: atcape00.pm + version: '6.60' + Date::Manip::TZ::atfaro00: + file: atfaro00.pm + version: '6.60' + Date::Manip::TZ::atmade00: + file: atmade00.pm + version: '6.60' + Date::Manip::TZ::atreyk00: + file: atreyk00.pm + version: '6.60' + Date::Manip::TZ::atsout00: + file: atsout00.pm + version: '6.60' + Date::Manip::TZ::atstan00: + file: atstan00.pm + version: '6.60' + Date::Manip::TZ::auadel00: + file: auadel00.pm + version: '6.60' + Date::Manip::TZ::aubris00: + file: aubris00.pm + version: '6.60' + Date::Manip::TZ::aubrok00: + file: aubrok00.pm + version: '6.60' + Date::Manip::TZ::aucurr00: + file: aucurr00.pm + version: '6.60' + Date::Manip::TZ::audarw00: + file: audarw00.pm + version: '6.60' + Date::Manip::TZ::aueucl00: + file: aueucl00.pm + version: '6.60' + Date::Manip::TZ::auhoba00: + file: auhoba00.pm + version: '6.60' + Date::Manip::TZ::aulind00: + file: aulind00.pm + version: '6.60' + Date::Manip::TZ::aulord00: + file: aulord00.pm + version: '6.60' + Date::Manip::TZ::aumelb00: + file: aumelb00.pm + version: '6.60' + Date::Manip::TZ::aupert00: + file: aupert00.pm + version: '6.60' + Date::Manip::TZ::ausydn00: + file: ausydn00.pm + version: '6.60' + Date::Manip::TZ::b00: + file: b00.pm + version: '6.60' + Date::Manip::TZ::c00: + file: c00.pm + version: '6.60' + Date::Manip::TZ::cet00: + file: cet00.pm + version: '6.60' + Date::Manip::TZ::d00: + file: d00.pm + version: '6.60' + Date::Manip::TZ::e00: + file: e00.pm + version: '6.60' + Date::Manip::TZ::eet00: + file: eet00.pm + version: '6.60' + Date::Manip::TZ::etgmt00: + file: etgmt00.pm + version: '6.60' + Date::Manip::TZ::etgmtm00: + file: etgmtm00.pm + version: '6.60' + Date::Manip::TZ::etgmtm01: + file: etgmtm01.pm + version: '6.60' + Date::Manip::TZ::etgmtm02: + file: etgmtm02.pm + version: '6.60' + Date::Manip::TZ::etgmtm03: + file: etgmtm03.pm + version: '6.60' + Date::Manip::TZ::etgmtm04: + file: etgmtm04.pm + version: '6.60' + Date::Manip::TZ::etgmtm05: + file: etgmtm05.pm + version: '6.60' + Date::Manip::TZ::etgmtm06: + file: etgmtm06.pm + version: '6.60' + Date::Manip::TZ::etgmtm07: + file: etgmtm07.pm + version: '6.60' + Date::Manip::TZ::etgmtm08: + file: etgmtm08.pm + version: '6.60' + Date::Manip::TZ::etgmtm09: + file: etgmtm09.pm + version: '6.60' + Date::Manip::TZ::etgmtm10: + file: etgmtm10.pm + version: '6.60' + Date::Manip::TZ::etgmtm11: + file: etgmtm11.pm + version: '6.60' + Date::Manip::TZ::etgmtm12: + file: etgmtm12.pm + version: '6.60' + Date::Manip::TZ::etgmtm13: + file: etgmtm13.pm + version: '6.60' + Date::Manip::TZ::etgmtp00: + file: etgmtp00.pm + version: '6.60' + Date::Manip::TZ::etgmtp01: + file: etgmtp01.pm + version: '6.60' + Date::Manip::TZ::etgmtp02: + file: etgmtp02.pm + version: '6.60' + Date::Manip::TZ::etgmtp03: + file: etgmtp03.pm + version: '6.60' + Date::Manip::TZ::etgmtp04: + file: etgmtp04.pm + version: '6.60' + Date::Manip::TZ::etgmtp05: + file: etgmtp05.pm + version: '6.60' + Date::Manip::TZ::etgmtp06: + file: etgmtp06.pm + version: '6.60' + Date::Manip::TZ::etgmtp07: + file: etgmtp07.pm + version: '6.60' + Date::Manip::TZ::etgmtp08: + file: etgmtp08.pm + version: '6.60' + Date::Manip::TZ::etgmtp09: + file: etgmtp09.pm + version: '6.60' + Date::Manip::TZ::etgmtp10: + file: etgmtp10.pm + version: '6.60' + Date::Manip::TZ::etgmtp11: + file: etgmtp11.pm + version: '6.60' + Date::Manip::TZ::euamst00: + file: euamst00.pm + version: '6.60' + Date::Manip::TZ::euando00: + file: euando00.pm + version: '6.60' + Date::Manip::TZ::euastr00: + file: euastr00.pm + version: '6.60' + Date::Manip::TZ::euathe00: + file: euathe00.pm + version: '6.60' + Date::Manip::TZ::eubelg00: + file: eubelg00.pm + version: '6.60' + Date::Manip::TZ::euberl00: + file: euberl00.pm + version: '6.60' + Date::Manip::TZ::eubrus00: + file: eubrus00.pm + version: '6.60' + Date::Manip::TZ::eubuch00: + file: eubuch00.pm + version: '6.60' + Date::Manip::TZ::eubuda00: + file: eubuda00.pm + version: '6.60' + Date::Manip::TZ::euchis00: + file: euchis00.pm + version: '6.60' + Date::Manip::TZ::eucope00: + file: eucope00.pm + version: '6.60' + Date::Manip::TZ::eudubl00: + file: eudubl00.pm + version: '6.60' + Date::Manip::TZ::eugibr00: + file: eugibr00.pm + version: '6.60' + Date::Manip::TZ::euhels00: + file: euhels00.pm + version: '6.60' + Date::Manip::TZ::euista00: + file: euista00.pm + version: '6.60' + Date::Manip::TZ::eukali00: + file: eukali00.pm + version: '6.60' + Date::Manip::TZ::eukiev00: + file: eukiev00.pm + version: '6.60' + Date::Manip::TZ::eukiro00: + file: eukiro00.pm + version: '6.60' + Date::Manip::TZ::eulisb00: + file: eulisb00.pm + version: '6.60' + Date::Manip::TZ::eulond00: + file: eulond00.pm + version: '6.60' + Date::Manip::TZ::euluxe00: + file: euluxe00.pm + version: '6.60' + Date::Manip::TZ::eumadr00: + file: eumadr00.pm + version: '6.60' + Date::Manip::TZ::eumalt00: + file: eumalt00.pm + version: '6.60' + Date::Manip::TZ::eumins00: + file: eumins00.pm + version: '6.60' + Date::Manip::TZ::eumona00: + file: eumona00.pm + version: '6.60' + Date::Manip::TZ::eumosc00: + file: eumosc00.pm + version: '6.60' + Date::Manip::TZ::euoslo00: + file: euoslo00.pm + version: '6.60' + Date::Manip::TZ::eupari00: + file: eupari00.pm + version: '6.60' + Date::Manip::TZ::euprag00: + file: euprag00.pm + version: '6.60' + Date::Manip::TZ::euriga00: + file: euriga00.pm + version: '6.60' + Date::Manip::TZ::eurome00: + file: eurome00.pm + version: '6.60' + Date::Manip::TZ::eusama00: + file: eusama00.pm + version: '6.60' + Date::Manip::TZ::eusara00: + file: eusara00.pm + version: '6.60' + Date::Manip::TZ::eusimf00: + file: eusimf00.pm + version: '6.60' + Date::Manip::TZ::eusofi00: + file: eusofi00.pm + version: '6.60' + Date::Manip::TZ::eustoc00: + file: eustoc00.pm + version: '6.60' + Date::Manip::TZ::eutall00: + file: eutall00.pm + version: '6.60' + Date::Manip::TZ::eutira00: + file: eutira00.pm + version: '6.60' + Date::Manip::TZ::euulya00: + file: euulya00.pm + version: '6.60' + Date::Manip::TZ::euuzhg00: + file: euuzhg00.pm + version: '6.60' + Date::Manip::TZ::euvien00: + file: euvien00.pm + version: '6.60' + Date::Manip::TZ::euviln00: + file: euviln00.pm + version: '6.60' + Date::Manip::TZ::euvolg00: + file: euvolg00.pm + version: '6.60' + Date::Manip::TZ::euwars00: + file: euwars00.pm + version: '6.60' + Date::Manip::TZ::euzapo00: + file: euzapo00.pm + version: '6.60' + Date::Manip::TZ::euzuri00: + file: euzuri00.pm + version: '6.60' + Date::Manip::TZ::f00: + file: f00.pm + version: '6.60' + Date::Manip::TZ::g00: + file: g00.pm + version: '6.60' + Date::Manip::TZ::h00: + file: h00.pm + version: '6.60' + Date::Manip::TZ::i00: + file: i00.pm + version: '6.60' + Date::Manip::TZ::inchag00: + file: inchag00.pm + version: '6.60' + Date::Manip::TZ::inchri00: + file: inchri00.pm + version: '6.60' + Date::Manip::TZ::incoco00: + file: incoco00.pm + version: '6.60' + Date::Manip::TZ::inkerg00: + file: inkerg00.pm + version: '6.60' + Date::Manip::TZ::inmahe00: + file: inmahe00.pm + version: '6.60' + Date::Manip::TZ::inmald00: + file: inmald00.pm + version: '6.60' + Date::Manip::TZ::inmaur00: + file: inmaur00.pm + version: '6.60' + Date::Manip::TZ::inreun00: + file: inreun00.pm + version: '6.60' + Date::Manip::TZ::k00: + file: k00.pm + version: '6.60' + Date::Manip::TZ::l00: + file: l00.pm + version: '6.60' + Date::Manip::TZ::m00: + file: m00.pm + version: '6.60' + Date::Manip::TZ::met00: + file: met00.pm + version: '6.60' + Date::Manip::TZ::n00: + file: n00.pm + version: '6.60' + Date::Manip::TZ::o00: + file: o00.pm + version: '6.60' + Date::Manip::TZ::p00: + file: p00.pm + version: '6.60' + Date::Manip::TZ::paapia00: + file: paapia00.pm + version: '6.60' + Date::Manip::TZ::paauck00: + file: paauck00.pm + version: '6.60' + Date::Manip::TZ::paboug00: + file: paboug00.pm + version: '6.60' + Date::Manip::TZ::pachat00: + file: pachat00.pm + version: '6.60' + Date::Manip::TZ::pachuu00: + file: pachuu00.pm + version: '6.60' + Date::Manip::TZ::paeast00: + file: paeast00.pm + version: '6.60' + Date::Manip::TZ::paefat00: + file: paefat00.pm + version: '6.60' + Date::Manip::TZ::paende00: + file: paende00.pm + version: '6.60' + Date::Manip::TZ::pafaka00: + file: pafaka00.pm + version: '6.60' + Date::Manip::TZ::pafiji00: + file: pafiji00.pm + version: '6.60' + Date::Manip::TZ::pafuna00: + file: pafuna00.pm + version: '6.60' + Date::Manip::TZ::pagala00: + file: pagala00.pm + version: '6.60' + Date::Manip::TZ::pagamb00: + file: pagamb00.pm + version: '6.60' + Date::Manip::TZ::paguad00: + file: paguad00.pm + version: '6.60' + Date::Manip::TZ::paguam00: + file: paguam00.pm + version: '6.60' + Date::Manip::TZ::pahono00: + file: pahono00.pm + version: '6.60' + Date::Manip::TZ::pakiri00: + file: pakiri00.pm + version: '6.60' + Date::Manip::TZ::pakosr00: + file: pakosr00.pm + version: '6.60' + Date::Manip::TZ::pakwaj00: + file: pakwaj00.pm + version: '6.60' + Date::Manip::TZ::pamaju00: + file: pamaju00.pm + version: '6.60' + Date::Manip::TZ::pamarq00: + file: pamarq00.pm + version: '6.60' + Date::Manip::TZ::panaur00: + file: panaur00.pm + version: '6.60' + Date::Manip::TZ::paniue00: + file: paniue00.pm + version: '6.60' + Date::Manip::TZ::panorf00: + file: panorf00.pm + version: '6.60' + Date::Manip::TZ::panoum00: + file: panoum00.pm + version: '6.60' + Date::Manip::TZ::papago00: + file: papago00.pm + version: '6.60' + Date::Manip::TZ::papala00: + file: papala00.pm + version: '6.60' + Date::Manip::TZ::papitc00: + file: papitc00.pm + version: '6.60' + Date::Manip::TZ::papohn00: + file: papohn00.pm + version: '6.60' + Date::Manip::TZ::paport00: + file: paport00.pm + version: '6.60' + Date::Manip::TZ::pararo00: + file: pararo00.pm + version: '6.60' + Date::Manip::TZ::patahi00: + file: patahi00.pm + version: '6.60' + Date::Manip::TZ::patara00: + file: patara00.pm + version: '6.60' + Date::Manip::TZ::patong00: + file: patong00.pm + version: '6.60' + Date::Manip::TZ::pawake00: + file: pawake00.pm + version: '6.60' + Date::Manip::TZ::pawall00: + file: pawall00.pm + version: '6.60' + Date::Manip::TZ::q00: + file: q00.pm + version: '6.60' + Date::Manip::TZ::r00: + file: r00.pm + version: '6.60' + Date::Manip::TZ::s00: + file: s00.pm + version: '6.60' + Date::Manip::TZ::t00: + file: t00.pm + version: '6.60' + Date::Manip::TZ::u00: + file: u00.pm + version: '6.60' + Date::Manip::TZ::ut00: + file: ut00.pm + version: '6.60' + Date::Manip::TZ::utc00: + file: utc00.pm + version: '6.60' + Date::Manip::TZ::v00: + file: v00.pm + version: '6.60' + Date::Manip::TZ::w00: + file: w00.pm + version: '6.60' + Date::Manip::TZ::wet00: + file: wet00.pm + version: '6.60' + Date::Manip::TZ::x00: + file: x00.pm + version: '6.60' + Date::Manip::TZ::y00: + file: y00.pm + version: '6.60' + Date::Manip::TZ::z00: + file: z00.pm + version: '6.60' + Date::Manip::TZ_Base: + file: TZ_Base.pm + version: '6.60' + Date::Manip::TZdata: + file: TZdata.pm + version: '6.60' + Date::Manip::Zones: + file: Zones.pm + version: '6.60' +requires: + Carp: '0' + Cwd: '0' + Data::Dumper: '0' + Encode: '0' + File::Find: '0' + File::Spec: '0' + IO::File: '0' + Storable: '0' + perl: '5.006' + utf8: '0' +resources: + repository: git://github.com/SBECK-github/Date-Manip.git +version: '6.60' +x_serialization_backend: 'CPAN::Meta::YAML version 0.018' diff --git a/Makefile.PL b/Makefile.PL new file mode 100644 index 0000000..4db6454 --- /dev/null +++ b/Makefile.PL @@ -0,0 +1,3587 @@ +###################################################################### +# Makefile.PL for Date::Manip +###################################################################### + +use strict; +use warnings; +use 5.006; +use ExtUtils::MakeMaker 6.67_01; + +my %IsWin32 = map { $_ => 1 } qw( MSWin32 NetWare symbian ); +my $IsWin32 = 1 if ($IsWin32{ $^O }); +my $Pvers = $]; +my $ConvVers= $ExtUtils::MakeMaker::VERSION; + +my %module_prereq = ( + 'Carp' => '0', + 'Cwd' => '0', + 'Data::Dumper' => '0', + 'Encode' => '0', + 'File::Find' => '0', + 'File::Spec' => '0', + 'IO::File' => '0', + 'Storable' => '0', + 'utf8' => '0', +); + +if ($IsWin32 && $Pvers >= 5.020) { + $module_prereq{'Win32::TieRegistry'} = 0.28; +} elsif ($IsWin32) { + $module_prereq{'Win32::TieRegistry'} = 0; +} + +my %script_prereq = ( +); + +my %test_prereq = ( + 'Test::Inter' => '0', + 'Test::More' => '0', +); + +my %config_prereq = ( + 'ExtUtils::MakeMaker' => '6.67_01', +); + +%module_prereq = (%module_prereq,%script_prereq); +my $EU_MM_V = $ExtUtils::MakeMaker::VERSION; +$EU_MM_V =~ s/_//g; +if ($EU_MM_V < 6.64) { + %config_prereq = (%config_prereq,%test_prereq); +} + +WriteMakefile( + NAME => "Date::Manip", + VERSION => "6.60", + ABSTRACT => "Date manipulation routines", + LICENSE => "perl", + ($EU_MM_V >= 6.48 + ? (MIN_PERL_VERSION => "5.006") + : ()), + AUTHOR => "Sullivan Beck (sbeck\@cpan.org)", + "dist" => {COMPRESS=>"gzip",SUFFIX=>"gz"}, + PL_FILES => {}, + PREREQ_PM => \%module_prereq, + ($EU_MM_V >= 6.52 + ? (CONFIGURE_REQUIRES => \%config_prereq) + : ()), + ($EU_MM_V >= 6.64 + ? (TEST_REQUIRES => \%test_prereq) + : ()), + ($EU_MM_V > 6.45 + ? (META_ADD => { + provides => { + 'Date::Manip' => { + file => 'Manip.pm', + version => '6.60', + }, + 'Date::Manip::Base' => { + file => 'Base.pm', + version => '6.60', + }, + 'Date::Manip::DM5' => { + file => 'DM5.pm', + version => '6.60', + }, + 'Date::Manip::DM5abbrevs' => { + file => 'DM5abbrevs.pm', + version => '6.60', + }, + 'Date::Manip::DM6' => { + file => 'DM6.pm', + version => '6.60', + }, + 'Date::Manip::Date' => { + file => 'Date.pm', + version => '6.60', + }, + 'Date::Manip::Delta' => { + file => 'Delta.pm', + version => '6.60', + }, + 'Date::Manip::Lang::catalan' => { + file => 'catalan.pm', + version => '6.60', + }, + 'Date::Manip::Lang::danish' => { + file => 'danish.pm', + version => '6.60', + }, + 'Date::Manip::Lang::dutch' => { + file => 'dutch.pm', + version => '6.60', + }, + 'Date::Manip::Lang::english' => { + file => 'english.pm', + version => '6.60', + }, + 'Date::Manip::Lang::finnish' => { + file => 'finnish.pm', + version => '6.60', + }, + 'Date::Manip::Lang::french' => { + file => 'french.pm', + version => '6.60', + }, + 'Date::Manip::Lang::german' => { + file => 'german.pm', + version => '6.60', + }, + 'Date::Manip::Lang::index' => { + file => 'index.pm', + version => '6.60', + }, + 'Date::Manip::Lang::italian' => { + file => 'italian.pm', + version => '6.60', + }, + 'Date::Manip::Lang::norwegian' => { + file => 'norwegian.pm', + version => '6.60', + }, + 'Date::Manip::Lang::polish' => { + file => 'polish.pm', + version => '6.60', + }, + 'Date::Manip::Lang::portugue' => { + file => 'portugue.pm', + version => '6.60', + }, + 'Date::Manip::Lang::romanian' => { + file => 'romanian.pm', + version => '6.60', + }, + 'Date::Manip::Lang::russian' => { + file => 'russian.pm', + version => '6.60', + }, + 'Date::Manip::Lang::spanish' => { + file => 'spanish.pm', + version => '6.60', + }, + 'Date::Manip::Lang::swedish' => { + file => 'swedish.pm', + version => '6.60', + }, + 'Date::Manip::Lang::turkish' => { + file => 'turkish.pm', + version => '6.60', + }, + 'Date::Manip::Obj' => { + file => 'Obj.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off000' => { + file => 'off000.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off001' => { + file => 'off001.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off002' => { + file => 'off002.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off003' => { + file => 'off003.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off004' => { + file => 'off004.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off005' => { + file => 'off005.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off006' => { + file => 'off006.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off007' => { + file => 'off007.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off008' => { + file => 'off008.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off009' => { + file => 'off009.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off010' => { + file => 'off010.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off011' => { + file => 'off011.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off012' => { + file => 'off012.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off013' => { + file => 'off013.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off014' => { + file => 'off014.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off015' => { + file => 'off015.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off016' => { + file => 'off016.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off017' => { + file => 'off017.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off018' => { + file => 'off018.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off019' => { + file => 'off019.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off020' => { + file => 'off020.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off021' => { + file => 'off021.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off022' => { + file => 'off022.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off023' => { + file => 'off023.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off024' => { + file => 'off024.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off025' => { + file => 'off025.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off026' => { + file => 'off026.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off027' => { + file => 'off027.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off028' => { + file => 'off028.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off029' => { + file => 'off029.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off030' => { + file => 'off030.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off031' => { + file => 'off031.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off032' => { + file => 'off032.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off033' => { + file => 'off033.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off034' => { + file => 'off034.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off035' => { + file => 'off035.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off036' => { + file => 'off036.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off037' => { + file => 'off037.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off038' => { + file => 'off038.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off039' => { + file => 'off039.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off040' => { + file => 'off040.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off041' => { + file => 'off041.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off042' => { + file => 'off042.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off043' => { + file => 'off043.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off044' => { + file => 'off044.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off045' => { + file => 'off045.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off046' => { + file => 'off046.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off047' => { + file => 'off047.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off048' => { + file => 'off048.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off049' => { + file => 'off049.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off050' => { + file => 'off050.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off051' => { + file => 'off051.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off052' => { + file => 'off052.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off053' => { + file => 'off053.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off054' => { + file => 'off054.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off055' => { + file => 'off055.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off056' => { + file => 'off056.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off057' => { + file => 'off057.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off058' => { + file => 'off058.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off059' => { + file => 'off059.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off060' => { + file => 'off060.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off061' => { + file => 'off061.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off062' => { + file => 'off062.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off063' => { + file => 'off063.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off064' => { + file => 'off064.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off065' => { + file => 'off065.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off066' => { + file => 'off066.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off067' => { + file => 'off067.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off068' => { + file => 'off068.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off069' => { + file => 'off069.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off070' => { + file => 'off070.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off071' => { + file => 'off071.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off072' => { + file => 'off072.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off073' => { + file => 'off073.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off074' => { + file => 'off074.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off075' => { + file => 'off075.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off076' => { + file => 'off076.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off077' => { + file => 'off077.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off078' => { + file => 'off078.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off079' => { + file => 'off079.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off080' => { + file => 'off080.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off081' => { + file => 'off081.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off082' => { + file => 'off082.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off083' => { + file => 'off083.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off084' => { + file => 'off084.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off085' => { + file => 'off085.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off086' => { + file => 'off086.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off087' => { + file => 'off087.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off088' => { + file => 'off088.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off089' => { + file => 'off089.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off090' => { + file => 'off090.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off091' => { + file => 'off091.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off092' => { + file => 'off092.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off093' => { + file => 'off093.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off094' => { + file => 'off094.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off095' => { + file => 'off095.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off096' => { + file => 'off096.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off097' => { + file => 'off097.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off098' => { + file => 'off098.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off099' => { + file => 'off099.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off100' => { + file => 'off100.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off101' => { + file => 'off101.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off102' => { + file => 'off102.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off103' => { + file => 'off103.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off104' => { + file => 'off104.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off105' => { + file => 'off105.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off106' => { + file => 'off106.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off107' => { + file => 'off107.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off108' => { + file => 'off108.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off109' => { + file => 'off109.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off110' => { + file => 'off110.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off111' => { + file => 'off111.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off112' => { + file => 'off112.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off113' => { + file => 'off113.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off114' => { + file => 'off114.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off115' => { + file => 'off115.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off116' => { + file => 'off116.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off117' => { + file => 'off117.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off118' => { + file => 'off118.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off119' => { + file => 'off119.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off120' => { + file => 'off120.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off121' => { + file => 'off121.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off122' => { + file => 'off122.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off123' => { + file => 'off123.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off124' => { + file => 'off124.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off125' => { + file => 'off125.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off126' => { + file => 'off126.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off127' => { + file => 'off127.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off128' => { + file => 'off128.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off129' => { + file => 'off129.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off130' => { + file => 'off130.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off131' => { + file => 'off131.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off132' => { + file => 'off132.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off133' => { + file => 'off133.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off134' => { + file => 'off134.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off135' => { + file => 'off135.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off136' => { + file => 'off136.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off137' => { + file => 'off137.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off138' => { + file => 'off138.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off139' => { + file => 'off139.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off140' => { + file => 'off140.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off141' => { + file => 'off141.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off142' => { + file => 'off142.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off143' => { + file => 'off143.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off144' => { + file => 'off144.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off145' => { + file => 'off145.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off146' => { + file => 'off146.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off147' => { + file => 'off147.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off148' => { + file => 'off148.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off149' => { + file => 'off149.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off150' => { + file => 'off150.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off151' => { + file => 'off151.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off152' => { + file => 'off152.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off153' => { + file => 'off153.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off154' => { + file => 'off154.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off155' => { + file => 'off155.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off156' => { + file => 'off156.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off157' => { + file => 'off157.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off158' => { + file => 'off158.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off159' => { + file => 'off159.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off160' => { + file => 'off160.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off161' => { + file => 'off161.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off162' => { + file => 'off162.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off163' => { + file => 'off163.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off164' => { + file => 'off164.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off165' => { + file => 'off165.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off166' => { + file => 'off166.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off167' => { + file => 'off167.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off168' => { + file => 'off168.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off169' => { + file => 'off169.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off170' => { + file => 'off170.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off171' => { + file => 'off171.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off172' => { + file => 'off172.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off173' => { + file => 'off173.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off174' => { + file => 'off174.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off175' => { + file => 'off175.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off176' => { + file => 'off176.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off177' => { + file => 'off177.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off178' => { + file => 'off178.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off179' => { + file => 'off179.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off180' => { + file => 'off180.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off181' => { + file => 'off181.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off182' => { + file => 'off182.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off183' => { + file => 'off183.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off184' => { + file => 'off184.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off185' => { + file => 'off185.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off186' => { + file => 'off186.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off187' => { + file => 'off187.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off188' => { + file => 'off188.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off189' => { + file => 'off189.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off190' => { + file => 'off190.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off191' => { + file => 'off191.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off192' => { + file => 'off192.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off193' => { + file => 'off193.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off194' => { + file => 'off194.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off195' => { + file => 'off195.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off196' => { + file => 'off196.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off197' => { + file => 'off197.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off198' => { + file => 'off198.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off199' => { + file => 'off199.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off200' => { + file => 'off200.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off201' => { + file => 'off201.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off202' => { + file => 'off202.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off203' => { + file => 'off203.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off204' => { + file => 'off204.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off205' => { + file => 'off205.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off206' => { + file => 'off206.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off207' => { + file => 'off207.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off208' => { + file => 'off208.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off209' => { + file => 'off209.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off210' => { + file => 'off210.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off211' => { + file => 'off211.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off212' => { + file => 'off212.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off213' => { + file => 'off213.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off214' => { + file => 'off214.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off215' => { + file => 'off215.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off216' => { + file => 'off216.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off217' => { + file => 'off217.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off218' => { + file => 'off218.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off219' => { + file => 'off219.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off220' => { + file => 'off220.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off221' => { + file => 'off221.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off222' => { + file => 'off222.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off223' => { + file => 'off223.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off224' => { + file => 'off224.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off225' => { + file => 'off225.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off226' => { + file => 'off226.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off227' => { + file => 'off227.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off228' => { + file => 'off228.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off229' => { + file => 'off229.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off230' => { + file => 'off230.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off231' => { + file => 'off231.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off232' => { + file => 'off232.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off233' => { + file => 'off233.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off234' => { + file => 'off234.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off235' => { + file => 'off235.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off236' => { + file => 'off236.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off237' => { + file => 'off237.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off238' => { + file => 'off238.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off239' => { + file => 'off239.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off240' => { + file => 'off240.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off241' => { + file => 'off241.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off242' => { + file => 'off242.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off243' => { + file => 'off243.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off244' => { + file => 'off244.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off245' => { + file => 'off245.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off246' => { + file => 'off246.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off247' => { + file => 'off247.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off248' => { + file => 'off248.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off249' => { + file => 'off249.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off250' => { + file => 'off250.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off251' => { + file => 'off251.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off252' => { + file => 'off252.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off253' => { + file => 'off253.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off254' => { + file => 'off254.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off255' => { + file => 'off255.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off256' => { + file => 'off256.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off257' => { + file => 'off257.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off258' => { + file => 'off258.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off259' => { + file => 'off259.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off260' => { + file => 'off260.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off261' => { + file => 'off261.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off262' => { + file => 'off262.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off263' => { + file => 'off263.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off264' => { + file => 'off264.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off265' => { + file => 'off265.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off266' => { + file => 'off266.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off267' => { + file => 'off267.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off268' => { + file => 'off268.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off269' => { + file => 'off269.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off270' => { + file => 'off270.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off271' => { + file => 'off271.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off272' => { + file => 'off272.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off273' => { + file => 'off273.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off274' => { + file => 'off274.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off275' => { + file => 'off275.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off276' => { + file => 'off276.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off277' => { + file => 'off277.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off278' => { + file => 'off278.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off279' => { + file => 'off279.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off280' => { + file => 'off280.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off281' => { + file => 'off281.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off282' => { + file => 'off282.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off283' => { + file => 'off283.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off284' => { + file => 'off284.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off285' => { + file => 'off285.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off286' => { + file => 'off286.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off287' => { + file => 'off287.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off288' => { + file => 'off288.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off289' => { + file => 'off289.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off290' => { + file => 'off290.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off291' => { + file => 'off291.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off292' => { + file => 'off292.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off293' => { + file => 'off293.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off294' => { + file => 'off294.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off295' => { + file => 'off295.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off296' => { + file => 'off296.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off297' => { + file => 'off297.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off298' => { + file => 'off298.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off299' => { + file => 'off299.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off300' => { + file => 'off300.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off301' => { + file => 'off301.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off302' => { + file => 'off302.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off303' => { + file => 'off303.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off304' => { + file => 'off304.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off305' => { + file => 'off305.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off306' => { + file => 'off306.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off307' => { + file => 'off307.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off308' => { + file => 'off308.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off309' => { + file => 'off309.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off310' => { + file => 'off310.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off311' => { + file => 'off311.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off312' => { + file => 'off312.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off313' => { + file => 'off313.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off314' => { + file => 'off314.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off315' => { + file => 'off315.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off316' => { + file => 'off316.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off317' => { + file => 'off317.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off318' => { + file => 'off318.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off319' => { + file => 'off319.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off320' => { + file => 'off320.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off321' => { + file => 'off321.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off322' => { + file => 'off322.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off323' => { + file => 'off323.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off324' => { + file => 'off324.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off325' => { + file => 'off325.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off326' => { + file => 'off326.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off327' => { + file => 'off327.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off328' => { + file => 'off328.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off329' => { + file => 'off329.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off330' => { + file => 'off330.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off331' => { + file => 'off331.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off332' => { + file => 'off332.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off333' => { + file => 'off333.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off334' => { + file => 'off334.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off335' => { + file => 'off335.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off336' => { + file => 'off336.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off337' => { + file => 'off337.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off338' => { + file => 'off338.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off339' => { + file => 'off339.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off340' => { + file => 'off340.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off341' => { + file => 'off341.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off342' => { + file => 'off342.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off343' => { + file => 'off343.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off344' => { + file => 'off344.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off345' => { + file => 'off345.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off346' => { + file => 'off346.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off347' => { + file => 'off347.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off348' => { + file => 'off348.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off349' => { + file => 'off349.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off350' => { + file => 'off350.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off351' => { + file => 'off351.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off352' => { + file => 'off352.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off353' => { + file => 'off353.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off354' => { + file => 'off354.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off355' => { + file => 'off355.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off356' => { + file => 'off356.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off357' => { + file => 'off357.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off358' => { + file => 'off358.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off359' => { + file => 'off359.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off360' => { + file => 'off360.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off361' => { + file => 'off361.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off362' => { + file => 'off362.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off363' => { + file => 'off363.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off364' => { + file => 'off364.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off365' => { + file => 'off365.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off366' => { + file => 'off366.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off367' => { + file => 'off367.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off368' => { + file => 'off368.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off369' => { + file => 'off369.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off370' => { + file => 'off370.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off371' => { + file => 'off371.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off372' => { + file => 'off372.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off373' => { + file => 'off373.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off374' => { + file => 'off374.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off375' => { + file => 'off375.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off376' => { + file => 'off376.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off377' => { + file => 'off377.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off378' => { + file => 'off378.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off379' => { + file => 'off379.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off380' => { + file => 'off380.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off381' => { + file => 'off381.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off382' => { + file => 'off382.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off383' => { + file => 'off383.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off384' => { + file => 'off384.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off385' => { + file => 'off385.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off386' => { + file => 'off386.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off387' => { + file => 'off387.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off388' => { + file => 'off388.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off389' => { + file => 'off389.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off390' => { + file => 'off390.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off391' => { + file => 'off391.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off392' => { + file => 'off392.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off393' => { + file => 'off393.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off394' => { + file => 'off394.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off395' => { + file => 'off395.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off396' => { + file => 'off396.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off397' => { + file => 'off397.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off398' => { + file => 'off398.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off399' => { + file => 'off399.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off400' => { + file => 'off400.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off401' => { + file => 'off401.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off402' => { + file => 'off402.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off403' => { + file => 'off403.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off404' => { + file => 'off404.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off405' => { + file => 'off405.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off406' => { + file => 'off406.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off407' => { + file => 'off407.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off408' => { + file => 'off408.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off409' => { + file => 'off409.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off410' => { + file => 'off410.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off411' => { + file => 'off411.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off412' => { + file => 'off412.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off413' => { + file => 'off413.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off414' => { + file => 'off414.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off415' => { + file => 'off415.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off416' => { + file => 'off416.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off417' => { + file => 'off417.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off418' => { + file => 'off418.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off419' => { + file => 'off419.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off420' => { + file => 'off420.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off421' => { + file => 'off421.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off422' => { + file => 'off422.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off423' => { + file => 'off423.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off424' => { + file => 'off424.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off425' => { + file => 'off425.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off426' => { + file => 'off426.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off427' => { + file => 'off427.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off428' => { + file => 'off428.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off429' => { + file => 'off429.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off430' => { + file => 'off430.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off431' => { + file => 'off431.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off432' => { + file => 'off432.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off433' => { + file => 'off433.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off434' => { + file => 'off434.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off435' => { + file => 'off435.pm', + version => '6.60', + }, + 'Date::Manip::Offset::off436' => { + file => 'off436.pm', + version => '6.60', + }, + 'Date::Manip::Recur' => { + file => 'Recur.pm', + version => '6.60', + }, + 'Date::Manip::TZ' => { + file => 'TZ.pm', + version => '6.60', + }, + 'Date::Manip::TZ::a00' => { + file => 'a00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::afabid00' => { + file => 'afabid00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::afaccr00' => { + file => 'afaccr00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::afalgi00' => { + file => 'afalgi00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::afbiss00' => { + file => 'afbiss00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::afcair00' => { + file => 'afcair00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::afcasa00' => { + file => 'afcasa00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::afceut00' => { + file => 'afceut00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::afel_a00' => { + file => 'afel_a00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::afjoha00' => { + file => 'afjoha00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::afkhar00' => { + file => 'afkhar00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::aflago00' => { + file => 'aflago00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::afmapu00' => { + file => 'afmapu00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::afmonr00' => { + file => 'afmonr00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::afnair00' => { + file => 'afnair00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::afndja00' => { + file => 'afndja00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::aftrip00' => { + file => 'aftrip00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::aftuni00' => { + file => 'aftuni00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::afwind00' => { + file => 'afwind00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amadak00' => { + file => 'amadak00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amanch00' => { + file => 'amanch00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amarag00' => { + file => 'amarag00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amasun00' => { + file => 'amasun00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amatik00' => { + file => 'amatik00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ambahi00' => { + file => 'ambahi00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ambahi01' => { + file => 'ambahi01.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ambarb00' => { + file => 'ambarb00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ambele00' => { + file => 'ambele00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ambeli00' => { + file => 'ambeli00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ambeul00' => { + file => 'ambeul00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amblan00' => { + file => 'amblan00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amboa_00' => { + file => 'amboa_00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ambogo00' => { + file => 'ambogo00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ambois00' => { + file => 'ambois00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ambuen00' => { + file => 'ambuen00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amcamb00' => { + file => 'amcamb00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amcamp00' => { + file => 'amcamp00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amcanc00' => { + file => 'amcanc00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amcara00' => { + file => 'amcara00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amcata00' => { + file => 'amcata00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amcaye00' => { + file => 'amcaye00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amcent00' => { + file => 'amcent00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amchic00' => { + file => 'amchic00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amchih00' => { + file => 'amchih00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amcord00' => { + file => 'amcord00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amcost00' => { + file => 'amcost00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amcres00' => { + file => 'amcres00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amcuia00' => { + file => 'amcuia00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amcura00' => { + file => 'amcura00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amdanm00' => { + file => 'amdanm00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amdaws00' => { + file => 'amdaws00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amdaws01' => { + file => 'amdaws01.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amdenv00' => { + file => 'amdenv00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amdetr00' => { + file => 'amdetr00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amedmo00' => { + file => 'amedmo00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ameiru00' => { + file => 'ameiru00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amel_s00' => { + file => 'amel_s00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amfort00' => { + file => 'amfort00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amfort01' => { + file => 'amfort01.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amglac00' => { + file => 'amglac00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amgodt00' => { + file => 'amgodt00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amgoos00' => { + file => 'amgoos00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amgran00' => { + file => 'amgran00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amguat00' => { + file => 'amguat00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amguay00' => { + file => 'amguay00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amguya00' => { + file => 'amguya00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amhali00' => { + file => 'amhali00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amhava00' => { + file => 'amhava00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amherm00' => { + file => 'amherm00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amindi00' => { + file => 'amindi00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::aminuv00' => { + file => 'aminuv00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amiqal00' => { + file => 'amiqal00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amjama00' => { + file => 'amjama00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amjuju00' => { + file => 'amjuju00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amjune00' => { + file => 'amjune00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amknox00' => { + file => 'amknox00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amla_p00' => { + file => 'amla_p00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amla_r00' => { + file => 'amla_r00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amlima00' => { + file => 'amlima00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amlos_00' => { + file => 'amlos_00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amloui00' => { + file => 'amloui00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ammace00' => { + file => 'ammace00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ammana00' => { + file => 'ammana00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ammana01' => { + file => 'ammana01.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ammare00' => { + file => 'ammare00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ammart00' => { + file => 'ammart00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ammata00' => { + file => 'ammata00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ammaza00' => { + file => 'ammaza00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ammend00' => { + file => 'ammend00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ammeno00' => { + file => 'ammeno00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ammeri00' => { + file => 'ammeri00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ammetl00' => { + file => 'ammetl00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ammexi00' => { + file => 'ammexi00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ammiqu00' => { + file => 'ammiqu00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ammonc00' => { + file => 'ammonc00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ammont00' => { + file => 'ammont00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ammont01' => { + file => 'ammont01.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ammont02' => { + file => 'ammont02.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amnass00' => { + file => 'amnass00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amnew_00' => { + file => 'amnew_00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amnew_01' => { + file => 'amnew_01.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amnipi00' => { + file => 'amnipi00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amnome00' => { + file => 'amnome00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amnoro00' => { + file => 'amnoro00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amojin00' => { + file => 'amojin00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ampana00' => { + file => 'ampana00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ampang00' => { + file => 'ampang00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ampara00' => { + file => 'ampara00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ampete00' => { + file => 'ampete00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amphoe00' => { + file => 'amphoe00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amport00' => { + file => 'amport00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amport01' => { + file => 'amport01.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amport02' => { + file => 'amport02.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ampuer00' => { + file => 'ampuer00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ampunt00' => { + file => 'ampunt00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amrain00' => { + file => 'amrain00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amrank00' => { + file => 'amrank00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amreci00' => { + file => 'amreci00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amregi00' => { + file => 'amregi00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amreso00' => { + file => 'amreso00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amrio_00' => { + file => 'amrio_00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amrio_01' => { + file => 'amrio_01.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amsalt00' => { + file => 'amsalt00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amsan_00' => { + file => 'amsan_00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amsan_01' => { + file => 'amsan_01.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amsant00' => { + file => 'amsant00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amsant01' => { + file => 'amsant01.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amsant02' => { + file => 'amsant02.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amsao_00' => { + file => 'amsao_00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amscor00' => { + file => 'amscor00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amsitk00' => { + file => 'amsitk00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amst_j00' => { + file => 'amst_j00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amswif00' => { + file => 'amswif00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amtegu00' => { + file => 'amtegu00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amtell00' => { + file => 'amtell00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amthul00' => { + file => 'amthul00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amthun00' => { + file => 'amthun00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amtiju00' => { + file => 'amtiju00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amtoro00' => { + file => 'amtoro00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amtucu00' => { + file => 'amtucu00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amushu00' => { + file => 'amushu00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amvanc00' => { + file => 'amvanc00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amveva00' => { + file => 'amveva00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amvinc00' => { + file => 'amvinc00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amwhit00' => { + file => 'amwhit00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amwina00' => { + file => 'amwina00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amwinn00' => { + file => 'amwinn00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amyaku00' => { + file => 'amyaku00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::amyell00' => { + file => 'amyell00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ancase00' => { + file => 'ancase00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::andavi00' => { + file => 'andavi00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::andumo00' => { + file => 'andumo00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::anmacq00' => { + file => 'anmacq00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::anmaws00' => { + file => 'anmaws00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::anpalm00' => { + file => 'anpalm00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::anroth00' => { + file => 'anroth00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ansyow00' => { + file => 'ansyow00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::antrol00' => { + file => 'antrol00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::anvost00' => { + file => 'anvost00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asalma00' => { + file => 'asalma00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asamma00' => { + file => 'asamma00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asanad00' => { + file => 'asanad00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asaqta00' => { + file => 'asaqta00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asaqto00' => { + file => 'asaqto00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asashg00' => { + file => 'asashg00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asatyr00' => { + file => 'asatyr00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asbagh00' => { + file => 'asbagh00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asbaku00' => { + file => 'asbaku00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asbang00' => { + file => 'asbang00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asbarn00' => { + file => 'asbarn00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asbeir00' => { + file => 'asbeir00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asbish00' => { + file => 'asbish00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asbrun00' => { + file => 'asbrun00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::aschit00' => { + file => 'aschit00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::aschoi00' => { + file => 'aschoi00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ascolo00' => { + file => 'ascolo00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asdama00' => { + file => 'asdama00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asdhak00' => { + file => 'asdhak00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asdili00' => { + file => 'asdili00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asduba00' => { + file => 'asduba00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asdush00' => { + file => 'asdush00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asfama00' => { + file => 'asfama00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asgaza00' => { + file => 'asgaza00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ashebr00' => { + file => 'ashebr00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asho_c00' => { + file => 'asho_c00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ashong00' => { + file => 'ashong00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ashovd00' => { + file => 'ashovd00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asirku00' => { + file => 'asirku00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asjaka00' => { + file => 'asjaka00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asjaya00' => { + file => 'asjaya00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asjeru00' => { + file => 'asjeru00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::askabu00' => { + file => 'askabu00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::askamc00' => { + file => 'askamc00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::askara00' => { + file => 'askara00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::askath00' => { + file => 'askath00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::askhan00' => { + file => 'askhan00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::askolk00' => { + file => 'askolk00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::askras00' => { + file => 'askras00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::askual00' => { + file => 'askual00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::askuch00' => { + file => 'askuch00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asmaca00' => { + file => 'asmaca00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asmaga00' => { + file => 'asmaga00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asmaka00' => { + file => 'asmaka00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asmani00' => { + file => 'asmani00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asnico00' => { + file => 'asnico00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asnovo00' => { + file => 'asnovo00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asnovo01' => { + file => 'asnovo01.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asomsk00' => { + file => 'asomsk00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asoral00' => { + file => 'asoral00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::aspont00' => { + file => 'aspont00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::aspyon00' => { + file => 'aspyon00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asqata00' => { + file => 'asqata00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asqyzy00' => { + file => 'asqyzy00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asriya00' => { + file => 'asriya00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::assakh00' => { + file => 'assakh00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::assama00' => { + file => 'assama00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asseou00' => { + file => 'asseou00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asshan00' => { + file => 'asshan00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::assing00' => { + file => 'assing00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::assred00' => { + file => 'assred00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::astaip00' => { + file => 'astaip00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::astash00' => { + file => 'astash00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::astbil00' => { + file => 'astbil00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::astehr00' => { + file => 'astehr00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asthim00' => { + file => 'asthim00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::astoky00' => { + file => 'astoky00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::astoms00' => { + file => 'astoms00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asulaa00' => { + file => 'asulaa00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asurum00' => { + file => 'asurum00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asustm00' => { + file => 'asustm00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asvlad00' => { + file => 'asvlad00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asyaku00' => { + file => 'asyaku00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asyang00' => { + file => 'asyang00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asyeka00' => { + file => 'asyeka00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::asyere00' => { + file => 'asyere00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::atazor00' => { + file => 'atazor00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::atberm00' => { + file => 'atberm00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::atcana00' => { + file => 'atcana00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::atcape00' => { + file => 'atcape00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::atfaro00' => { + file => 'atfaro00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::atmade00' => { + file => 'atmade00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::atreyk00' => { + file => 'atreyk00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::atsout00' => { + file => 'atsout00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::atstan00' => { + file => 'atstan00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::auadel00' => { + file => 'auadel00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::aubris00' => { + file => 'aubris00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::aubrok00' => { + file => 'aubrok00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::aucurr00' => { + file => 'aucurr00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::audarw00' => { + file => 'audarw00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::aueucl00' => { + file => 'aueucl00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::auhoba00' => { + file => 'auhoba00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::aulind00' => { + file => 'aulind00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::aulord00' => { + file => 'aulord00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::aumelb00' => { + file => 'aumelb00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::aupert00' => { + file => 'aupert00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ausydn00' => { + file => 'ausydn00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::b00' => { + file => 'b00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::c00' => { + file => 'c00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::cet00' => { + file => 'cet00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::d00' => { + file => 'd00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::e00' => { + file => 'e00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::eet00' => { + file => 'eet00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::etgmt00' => { + file => 'etgmt00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::etgmtm00' => { + file => 'etgmtm00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::etgmtm01' => { + file => 'etgmtm01.pm', + version => '6.60', + }, + 'Date::Manip::TZ::etgmtm02' => { + file => 'etgmtm02.pm', + version => '6.60', + }, + 'Date::Manip::TZ::etgmtm03' => { + file => 'etgmtm03.pm', + version => '6.60', + }, + 'Date::Manip::TZ::etgmtm04' => { + file => 'etgmtm04.pm', + version => '6.60', + }, + 'Date::Manip::TZ::etgmtm05' => { + file => 'etgmtm05.pm', + version => '6.60', + }, + 'Date::Manip::TZ::etgmtm06' => { + file => 'etgmtm06.pm', + version => '6.60', + }, + 'Date::Manip::TZ::etgmtm07' => { + file => 'etgmtm07.pm', + version => '6.60', + }, + 'Date::Manip::TZ::etgmtm08' => { + file => 'etgmtm08.pm', + version => '6.60', + }, + 'Date::Manip::TZ::etgmtm09' => { + file => 'etgmtm09.pm', + version => '6.60', + }, + 'Date::Manip::TZ::etgmtm10' => { + file => 'etgmtm10.pm', + version => '6.60', + }, + 'Date::Manip::TZ::etgmtm11' => { + file => 'etgmtm11.pm', + version => '6.60', + }, + 'Date::Manip::TZ::etgmtm12' => { + file => 'etgmtm12.pm', + version => '6.60', + }, + 'Date::Manip::TZ::etgmtm13' => { + file => 'etgmtm13.pm', + version => '6.60', + }, + 'Date::Manip::TZ::etgmtp00' => { + file => 'etgmtp00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::etgmtp01' => { + file => 'etgmtp01.pm', + version => '6.60', + }, + 'Date::Manip::TZ::etgmtp02' => { + file => 'etgmtp02.pm', + version => '6.60', + }, + 'Date::Manip::TZ::etgmtp03' => { + file => 'etgmtp03.pm', + version => '6.60', + }, + 'Date::Manip::TZ::etgmtp04' => { + file => 'etgmtp04.pm', + version => '6.60', + }, + 'Date::Manip::TZ::etgmtp05' => { + file => 'etgmtp05.pm', + version => '6.60', + }, + 'Date::Manip::TZ::etgmtp06' => { + file => 'etgmtp06.pm', + version => '6.60', + }, + 'Date::Manip::TZ::etgmtp07' => { + file => 'etgmtp07.pm', + version => '6.60', + }, + 'Date::Manip::TZ::etgmtp08' => { + file => 'etgmtp08.pm', + version => '6.60', + }, + 'Date::Manip::TZ::etgmtp09' => { + file => 'etgmtp09.pm', + version => '6.60', + }, + 'Date::Manip::TZ::etgmtp10' => { + file => 'etgmtp10.pm', + version => '6.60', + }, + 'Date::Manip::TZ::etgmtp11' => { + file => 'etgmtp11.pm', + version => '6.60', + }, + 'Date::Manip::TZ::euamst00' => { + file => 'euamst00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::euando00' => { + file => 'euando00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::euastr00' => { + file => 'euastr00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::euathe00' => { + file => 'euathe00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::eubelg00' => { + file => 'eubelg00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::euberl00' => { + file => 'euberl00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::eubrus00' => { + file => 'eubrus00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::eubuch00' => { + file => 'eubuch00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::eubuda00' => { + file => 'eubuda00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::euchis00' => { + file => 'euchis00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::eucope00' => { + file => 'eucope00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::eudubl00' => { + file => 'eudubl00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::eugibr00' => { + file => 'eugibr00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::euhels00' => { + file => 'euhels00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::euista00' => { + file => 'euista00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::eukali00' => { + file => 'eukali00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::eukiev00' => { + file => 'eukiev00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::eukiro00' => { + file => 'eukiro00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::eulisb00' => { + file => 'eulisb00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::eulond00' => { + file => 'eulond00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::euluxe00' => { + file => 'euluxe00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::eumadr00' => { + file => 'eumadr00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::eumalt00' => { + file => 'eumalt00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::eumins00' => { + file => 'eumins00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::eumona00' => { + file => 'eumona00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::eumosc00' => { + file => 'eumosc00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::euoslo00' => { + file => 'euoslo00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::eupari00' => { + file => 'eupari00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::euprag00' => { + file => 'euprag00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::euriga00' => { + file => 'euriga00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::eurome00' => { + file => 'eurome00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::eusama00' => { + file => 'eusama00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::eusara00' => { + file => 'eusara00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::eusimf00' => { + file => 'eusimf00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::eusofi00' => { + file => 'eusofi00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::eustoc00' => { + file => 'eustoc00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::eutall00' => { + file => 'eutall00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::eutira00' => { + file => 'eutira00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::euulya00' => { + file => 'euulya00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::euuzhg00' => { + file => 'euuzhg00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::euvien00' => { + file => 'euvien00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::euviln00' => { + file => 'euviln00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::euvolg00' => { + file => 'euvolg00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::euwars00' => { + file => 'euwars00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::euzapo00' => { + file => 'euzapo00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::euzuri00' => { + file => 'euzuri00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::f00' => { + file => 'f00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::g00' => { + file => 'g00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::h00' => { + file => 'h00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::i00' => { + file => 'i00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::inchag00' => { + file => 'inchag00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::inchri00' => { + file => 'inchri00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::incoco00' => { + file => 'incoco00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::inkerg00' => { + file => 'inkerg00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::inmahe00' => { + file => 'inmahe00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::inmald00' => { + file => 'inmald00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::inmaur00' => { + file => 'inmaur00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::inreun00' => { + file => 'inreun00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::k00' => { + file => 'k00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::l00' => { + file => 'l00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::m00' => { + file => 'm00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::met00' => { + file => 'met00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::n00' => { + file => 'n00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::o00' => { + file => 'o00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::p00' => { + file => 'p00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::paapia00' => { + file => 'paapia00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::paauck00' => { + file => 'paauck00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::paboug00' => { + file => 'paboug00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::pachat00' => { + file => 'pachat00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::pachuu00' => { + file => 'pachuu00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::paeast00' => { + file => 'paeast00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::paefat00' => { + file => 'paefat00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::paende00' => { + file => 'paende00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::pafaka00' => { + file => 'pafaka00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::pafiji00' => { + file => 'pafiji00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::pafuna00' => { + file => 'pafuna00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::pagala00' => { + file => 'pagala00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::pagamb00' => { + file => 'pagamb00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::paguad00' => { + file => 'paguad00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::paguam00' => { + file => 'paguam00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::pahono00' => { + file => 'pahono00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::pakiri00' => { + file => 'pakiri00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::pakosr00' => { + file => 'pakosr00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::pakwaj00' => { + file => 'pakwaj00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::pamaju00' => { + file => 'pamaju00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::pamarq00' => { + file => 'pamarq00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::panaur00' => { + file => 'panaur00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::paniue00' => { + file => 'paniue00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::panorf00' => { + file => 'panorf00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::panoum00' => { + file => 'panoum00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::papago00' => { + file => 'papago00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::papala00' => { + file => 'papala00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::papitc00' => { + file => 'papitc00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::papohn00' => { + file => 'papohn00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::paport00' => { + file => 'paport00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::pararo00' => { + file => 'pararo00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::patahi00' => { + file => 'patahi00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::patara00' => { + file => 'patara00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::patong00' => { + file => 'patong00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::pawake00' => { + file => 'pawake00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::pawall00' => { + file => 'pawall00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::q00' => { + file => 'q00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::r00' => { + file => 'r00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::s00' => { + file => 's00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::t00' => { + file => 't00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::u00' => { + file => 'u00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::ut00' => { + file => 'ut00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::utc00' => { + file => 'utc00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::v00' => { + file => 'v00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::w00' => { + file => 'w00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::wet00' => { + file => 'wet00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::x00' => { + file => 'x00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::y00' => { + file => 'y00.pm', + version => '6.60', + }, + 'Date::Manip::TZ::z00' => { + file => 'z00.pm', + version => '6.60', + }, + 'Date::Manip::TZ_Base' => { + file => 'TZ_Base.pm', + version => '6.60', + }, + 'Date::Manip::TZdata' => { + file => 'TZdata.pm', + version => '6.60', + }, + 'Date::Manip::Zones' => { + file => 'Zones.pm', + version => '6.60', + }, + + }, + } + ) + : ()), + + ($EU_MM_V > 6.46 + ? (META_MERGE => { + 'meta-spec' => { + version => 2, + }, + resources => { + repository => { + type => 'git', + web => 'https://github.com/SBECK-github/Date-Manip', + url => 'git://github.com/SBECK-github/Date-Manip.git', + }, + }, + } + ) + : ()), + + EXE_FILES => [ + 'examples/dm_date', + 'examples/dm_zdump', + + ], + + MAN1PODS => { + 'examples/dm_date' => 'blib/man1/dm_date.1', + 'examples/dm_zdump' => 'blib/man1/dm_zdump.1', + }, + + +); diff --git a/README b/README new file mode 100644 index 0000000..c2ebbf4 --- /dev/null +++ b/README @@ -0,0 +1,210 @@ +NAME + Date::Manip - Date manipulation routines + +DESCRIPTION + Date::Manip is a series of modules designed to make any common date/time + operation easy to do. Operations such as comparing two times, + determining a date a given amount of time from another, or parsing + international times are all easily done. It deals with time as it is + used in the Gregorian calendar (the one currently in use) with full + support for time changes due to daylight saving time. + + From the very beginning, the main focus of Date::Manip has been to be + able to do ANY desired date/time operation easily. Many other modules + exist which may do a subset of these operations quicker or more + efficiently, but no other module can do all of the operations available + in Date::Manip. + + Since many other date/time modules exist, some of which may do the + specific operation(s) you need faster, be sure to read "SHOULD I USE + DATE::MANIP" in Date::Manip::Misc before deciding which of the Date and + Time modules from CPAN is for you. However, if you want one module to do + it all, Date::Manip is the one to use. + + Date::Manip has functionality to work with several fundamental types of + data. + + dates + The word date is used extensively here and is somewhat misleading. + In Date::Manip, a date consists of three pieces of information: a + calendar date, a time of day, and time zone information. Calendar + dates and times are fully handled. Time zones are handled as well, + but depending on how you use Date::Manip, there may be some + limitations as discussed below. + + delta + A delta is an amount of time (i.e. the amount of time between two + different dates). A delta refers only to an amount of time. It + includes no information about a starting or ending date/time. Most + people will think of a delta as an amount of time, but the term + 'time' is already used so much in this module that I didn't want to + use it here in order to avoid confusion. + + recurrence + A recurring event is something which occurs on a regular recurring + basis. + + holidays and events + Holidays and events are basically named dates or recurrences. + + Among other things, Date::Manip allow you to: + + * Enter a date in practically any format you choose. + + * Compare two dates, entered in widely different formats to determine + which is earlier. + + * Extract any information you want from a date using a format string + similar to the Unix date command. + + * Determine the amount of time between two dates, or add an amount of + time to a date to get a second date. + + * Work with dates with dates using international formats (foreign + month names, 12/10/95 referring to October rather than December, + etc.). + + * To find a list of dates where a recurring event happens. + + Each of these tasks is trivial (one or two lines at most) with this + package. + +HOW TO USE DATE::MANIP + There are three different ways to use Date::Manip . There are three + interfaces (version 5 functional interface, version 6 functional, and + version 6 object-oriented). A complete description of each is included + in the Date::Manip::Interfaces document. The recommended (and the only + one with access to the full functionality of the module) is using the + Object-Oriented interface. + +SEE ALSO + Because Date::Manip performs so many operations, the documentation is + extensive. It includes the following documents: + + Information about the different interfaces + Read this for a detailed description of each of the interfaces, + including information on how to choose and use the interface best suited + to your situation. + + Date::Manip::Interfaces + A complete description of the functional interfaces available. NOTE: + it is recommended that you use the OO interface wherever possible as + the functional interfaces have some imitations. + + A description of the functional interfaces: + Date::Manip::DM5 + The version 5 functional interface + + Date::Manip::DM6 + The version 6 functional interface + + Objects and configuration + An introduction to the Date::Manip classes used by the object-oriented + interface and how to configure them: + + Date::Manip::Objects + An overview of the various Date::Manip modules, and how to use them. + + Date::Manip::Config + Information for configuring Date::Manip + + Date::Manip object-oriented modules + These are the modules for using the object-oriented interface. + + Date::Manip::Obj + This is the base class. All other classes listed here inherit the + methods defined in this class. + + Date::Manip::Base + A module for doing low-level date operations. + + Date::Manip::TZ + A module for working with time zones. + + Date::Manip::Date + The module for working with dates. + + Date::Manip::Delta + The module for working with deltas (amount of time). + + Date::Manip::Recur + The module for working with recurrences (recurring dates). + + Timezone information + Date::Manip::DM5abbrevs + Time zone abbreviations used in the version 5 interface. + + Date::Manip::Zones + Time zone data included in Date::Manip used in the version 6 + interfaces. + + Miscellaneous information: + Date::Manip::Calc + Detailed information on how date calculations are done. + + Date::Manip::Holidays + Information on defining and using holidays and events. + + Date::Manip::ConfigFile + A sample config file. + + Date::Manip::Lang + Information about the languages supported by Date::Manip and how to + add a new language. + + Date::Manip::Lang::english + Date::Manip::Lang::catalan + Date::Manip::Lang::danish + Date::Manip::Lang::dutch + Date::Manip::Lang::finnish + Date::Manip::Lang::french + Date::Manip::Lang::german + Date::Manip::Lang::italian + Date::Manip::Lang::norwegian + Date::Manip::Lang::polish + Date::Manip::Lang::portugue + Date::Manip::Lang::romanian + Date::Manip::Lang::russian + Date::Manip::Lang::spanish + Date::Manip::Lang::swedish + Date::Manip::Lang::turkish + A description of the parseable words in each language currently + supported by Date::Manip. + + Information about the module and administrative things: + Date::Manip::Migration5to6 + Information on changes necessary to scripts when upgrading from 5.xx + to 6.xx. + + Date::Manip::Changes5 + Change log for Date::Manip 5.xx + + Date::Manip::Changes5to6 + Differences between version 5.xx and 6.00 (including information on + upgrading); this contains more details than the Migration5to6 + document. + + Date::Manip::Changes6 + Change log for Date::Manip 6.xx + + Date::Manip::Misc + Miscellaneous information about Date::Manip (who should use it; + acknowledgments). + + Date::Manip::History + Musings on the history of Date::Manip written around it's 20th + birthday. + + Date::Manip::Problems + Common problems and instructions for reporting bugs. + + Date::Manip::Examples + Examples of how to use Date::Manip. + +LICENSE + This script is free software; you can redistribute it and/or modify it + under the same terms as Perl itself. + +AUTHOR + Sullivan Beck (sbeck@cpan.org) + diff --git a/README.first b/README.first new file mode 100644 index 0000000..9c144c8 --- /dev/null +++ b/README.first @@ -0,0 +1,47 @@ +Copyright (c) 1995-2017 Sullivan Beck. All rights reserved. +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + + +Please send questions or bug reports to me rather than posting them to +a newsgroup since I may miss them there, BUT read the next paragraph +before you automatically start firing off email to me! + +If you have questions about Date::Manip, refer to the Date::Manip manual. +Don't know what I'm talking about, or don't know how to access that? Read +the perlpod man page. Alternately, an online version of the Date::Manip +manual page is included on any CPAN site. + +PLEASE read the man page thoroughly before emailing me. If you've done +this, I'll be glad to answer any questions not covered or that are unclear +in the manual. + +=== + +Date::Manip 6.xx represents a complete reorganization (and almost complete +rewrite) of the module. It includes the original functional Date::Manip +module, and a number of OO modules which now do the real work. The OO +modules may also be used directly, bypassing the functional interface. + +As of 6.xx, Date::Manip has full support for all timezones in the standard +Olsen database (and also supports all Windows timezone names, and timezones +suggested by several other standards). Full support for daylight saving +time is included. + +Please refer to the Date::Manip::Changes5to6 and Date::Manip::Migration5to6 +man pages for a more detailed breakdown of changes made in 6.00, and +suggestions for a few changes which may be required to get existing code +to run using the new modules. + +It should be noted that version 6.xx required perl 5.10 or higher. + +Date::Manip 5.xx is integrated into the package (i.e. both 5.xx and 6.xx +are available in the 6.xx release), so Date::Manip will continue to run +(the old version only) on older versions of perl. Please refer to the +main Date::Manip document for more details. + +=== + +AUTHOR + +Sullivan Beck (sbeck@cpan.org) diff --git a/examples/README.examples b/examples/README.examples new file mode 100644 index 0000000..83ad51a --- /dev/null +++ b/examples/README.examples @@ -0,0 +1,28 @@ +If you have Date::Manip 5.xx installed (which is the case if you +have a perl version less than 5.010), the examples are included +in the Date::Manip man page. + +If you have Date::Manip 6.xx installed, examples are included +in the Date::Manip::Examples man page, and in this directory. + +This directory contains two scripts which use Date::Manip to +duplicate the functionality of two common unix scripts. + +The dm_date script duplicates the functionality of the unix 'date' +command with a few differences. + + o It does not include the functionality to set the + system date. + + o The date strings that can be read (using the -d + or -f options) are anything that Date::Manip can + parse. + + o The format string is any string suitable for passing + to the Date::Manip::Date::printf function. + +The dm_zdump duplicates the functionality of the unix 'zdump' +command. This should be a drop-in replacement for the zdump +command except that the first two lines and the last two lines +of zdump output do not contain any useful output. The dm_zdump +command does not reproduce these lines. diff --git a/examples/dm_date b/examples/dm_date new file mode 100755 index 0000000..337a825 --- /dev/null +++ b/examples/dm_date @@ -0,0 +1,222 @@ +#!/usr/bin/perl -w +# Copyright (c) 2009-2017 Sullivan Beck. All rights reserved. +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +############################################################################### +############################################################################### + +require 5.010000; +use Date::Manip::Date; +use IO::File; +use strict; +use warnings; + +############################################################################### +# HELP +############################################################################### + +our($usage); +my $COM = $0; +$COM =~ s/^.*\///; + +$usage= + "usage: $COM OPTIONS + -h/--help : Print help. + + Options to tell which date to print (only one of + the following should be entered... if none are, + 'now' is printed). + + -d/--date=STRING : Print information about that date. + -f/--file=FILE : Print out each date (1/line) in FILE + -r/--reference=FILE + : Print out the last modification + time of FILE + + Other options + + -R/--rfc-2822 : Print the date in RFC 2822 format + (any +FORMAT string is ignored) + Mon, 07 Aug 2006 12:34:56 -0600 + -u/--utc/--universal: + Converts date(s) to UT time. +"; + +=pod + +=head1 NAME + +dm_date - print out the system date and time + +=head1 SYNOPSIS + +This performs the same operation as the unix 'date' command, but using +the Date::Manip module. + + dm_date [OPTION]... [+FORMAT] + +=head1 DESCRIPTION + +This displays information about the current system time, or some +other time. Options are: + +=over 4 + +=item -h, --help + +Print online help. + +=item -d STRING, --date=STRING + +Display time described by STRING. STRING can be any string which can +be parsed by Date::Manip. Please refer to the Date::Manip::Date +documentation for details. + +=item -f DATEFILE, --file=DATEFILE + +This reads each line in DATEFILE, and extracts a date from it and +prints out the information. + +Blank lines and lines starting with a pound (#) are ignored. Lines +not containing a valid date are also ignored. + +=item -r FILE, --reference=FILE + +Displays the last modification time of FILE. + +=item -R, --rfc-2822 + +Displayc the date and time in RFC 2822 format. + +Example: Mon, 07 Aug 2006 12:34:56 -0600 + +=item -u, --utc, --universal + +Converts the date to UT (GMT) and prints out the information. + +=back + +Only one of -d, -f, or -r should be included. If more than +one is included, the first one from the list (-d, -f, -r) +is used and any other is ignored. + +The format string starts with a plus (+) and contains any +of the format directives described in Date::Manip::Date. + +=head1 KNOWN BUGS + +None known. + +=head1 BUGS AND QUESTIONS + +Please refer to the Date::Manip::Problems documentation for +information on submitting bug reports or questions to the author. + +=head1 SEE ALSO + +Date::Manip::Date + +=head1 LICENSE + +This script is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=head1 AUTHOR + +Sullivan Beck (sbeck@cpan.org) + +=cut + +############################################################################### +# PARSE ARGUMENTS +############################################################################### + +our($date,$file,$ref,$rfc,$ut,$format); + +while ($_ = shift) { + + (print $usage), exit if ($_ eq "-h" || $_ eq "--help"); + + $date = shift, next if ($_ eq "-d" || $_ eq "--date"); + $date = $1, next if ($_ =~ /^\-\-date=(.*)/); + + $file = shift, next if ($_ eq "-f" || $_ eq "--file"); + $file = $1, next if ($_ =~ /^\-\-file=(.*)/); + + $ref = shift, next if ($_ eq "-r" || $_ eq "--reference"); + $ref = $1, next if ($_ =~ /^\-\-reference=(.*)/); + + $rfc = 1, next if ($_ eq "-R" || $_ eq "--rfc-2822"); + $ut = 1, next if ($_ eq "-u" || $_ eq "--utc" || $_ eq "--universal"); + + $format = $_, last if ($_ =~ s/^\+//); + die $usage; +} + +if ($rfc) { + $format ='%a, %d %b %Y %H:%M:%S %z'; +} + +if (@ARGV || ! $format) { + die $usage; +} + +############################################################################ +# MAIN PROGRAM +############################################################################ + + +my $d = new Date::Manip::Date; + +if ($date) { + my $err = $d->parse($date); + exit 1 if ($err); + $d->convert("GMT") if ($ut); + print $d->printf($format),"\n"; + +} elsif ($file) { + my $in = new IO::File; + $in->open($file) || die "ERROR: unable to open date file: $file\n\n$usage"; + my @in = <$in>; + $in->close(); + chomp(@in); + + foreach my $date (@in) { + $date =~ s/\#.*//; + $date =~ s/\s*$//; + next if (! $date); + + my $err = $d->parse($date); + next if ($err); + $d->convert("GMT") if ($ut); + print $d->printf($format),"\n"; + } + +} elsif ($ref) { + if (-e $ref) { + my $date = ( stat($ref) )[9]; + my $err = $d->parse("epoch $date"); + exit if ($err); + $d->convert("GMT") if ($ut); + print $d->printf($format),"\n"; + } + +} else { + my $err = $d->parse("now"); + exit 1 if ($err); + $d->convert("GMT") if ($ut); + print $d->printf($format),"\n"; +} + + +# Local Variables: +# mode: cperl +# indent-tabs-mode: nil +# cperl-indent-level: 3 +# cperl-continued-statement-offset: 2 +# cperl-continued-brace-offset: 0 +# cperl-brace-offset: 0 +# cperl-brace-imaginary-offset: 0 +# cperl-label-offset: 0 +# End: diff --git a/examples/dm_zdump b/examples/dm_zdump new file mode 100755 index 0000000..6b385b8 --- /dev/null +++ b/examples/dm_zdump @@ -0,0 +1,203 @@ +#!/usr/bin/perl -w +# Copyright (c) 2009-2017 Sullivan Beck. All rights reserved. +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +############################################################################### +############################################################################### + +require 5.010000; +use Date::Manip::Date; +use IO::File; +use strict; +use warnings; + +############################################################################### +# HELP +############################################################################### + +our($usage); +my $COM = $0; +$COM =~ s/^.*\///; + +$usage= + "usage: $COM OPTIONS [ZONE ZONE ...] + -h/--help : Print help. + + -v/--vebose : Prints a full description of each + timezone. + + -c/--cutoff YEAR : Cut off verbose output near the + start of YEAR. + +"; + +=pod + +=head1 NAME + +dm_zdump - timezone dumper + +=head1 SYNOPSIS + +This performs the same operation as the unix 'zdump' command, but using +the Date::Manip module. + + dm_zdump [-v] [-c YEAR] [ZONE ZONE ...] + +=head1 DESCRIPTION + +This displays the current time in each ZONE named on the command line +unless the -v option is given. + +=over 4 + +=item -h, --help + +Print online help. + +=item -v, --verbose + +This displays all critical dates (i.e. the times when a time change +occurs due to the timezone description) for each of the timezones +listed (or the local timezone if none are listed). + +Each critical date is printed as two lines of output: the last second +before the change occurs, and the first second of the new time. + +By default, all critical dates from Jan 1, 0001 until the year 20 years +in the future are printed, but this can be changed with the -c option. + +=item -c, --cutoff YEAR + +This specifies the cutoff year. All critical dates up to the start of +YEAR are given. The GMT time Jan 01, YEAR at 00:00:00 is the cutoff +time. + +=back + +=head1 KNOWN BUGS + +None known. + +=head1 BUGS AND QUESTIONS + +Please refer to the Date::Manip::Problems documentation for +information on submitting bug reports or questions to the author. + +=head1 SEE ALSO + +Date::Manip::Date + +=head1 LICENSE + +This script is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=head1 AUTHOR + +Sullivan Beck (sbeck@cpan.org) + +=cut + +############################################################################### +# PARSE ARGUMENTS +############################################################################### + +our($date,$dmt,$dmb,$verbose,$cutoff,@zone); + +$date = new Date::Manip::Date "now"; +$dmt = $date->tz(); +$dmb = $date->base(); +$cutoff = $date->printf('%Y') + 21; +$verbose = 0; + +while ($_ = shift) { + + (print $usage), exit if ($_ eq "-h" || $_ eq "--help"); + + $verbose = 1, next if ($_ eq "-v" || $_ eq "--verbose"); + $cutoff = shift, next if ($_ eq "-c" || $_ eq "--cutoff"); + + @zone = ($_,@ARGV); + last; +} + +if (@zone) { + foreach my $z (@zone) { + my $tmp = $dmt->zone($z); + if (! $tmp) { + die "ERROR: invalid timezone: $z\n"; + } + $z = $tmp; + } + +} else { + @zone = $dmt->curr_zone(); +} + +############################################################################ +# MAIN PROGRAM +############################################################################ + +if ($verbose) { + foreach my $z (@zone) { + my @per = $dmt->periods($z,undef,$cutoff); + foreach my $per (@per) { + my($startUT,$startLT,$offsetstr,$offset,$abbrev,$isdst,$endUT,$endLT) + = @$per; + + $startUT = datestr($startUT); + $startLT = datestr($startLT); + $endUT = datestr($endUT); + $endLT = datestr($endLT); + my $gmtoff = $$offset[0]*3600 + $$offset[1]*60 + $$offset[2]; + + print "$z $startUT UT = $startLT $abbrev isdst=$isdst gmtoff=$gmtoff\n"; + print "$z $endUT UT = $endLT $abbrev isdst=$isdst gmtoff=$gmtoff\n"; + } + print "\n" if ($#zone != 0); + } + +} else { + my $wid = 0; + foreach my $z (@zone) { + $wid = length($z) if (length($z) > $wid); + } + + foreach my $z (@zone) { + $date->convert($z); + print $z," "x($wid-length($z))," ",$date->printf('%a %b %e %H:%M:%S %Y %Z'),"\n"; + } +} + +sub datestr { + my($date) = @_; + + my %mon = qw(1 Jan 2 Feb 3 Mar 4 Apr 5 May 6 Jun + 7 Jul 8 Aug 9 Sep 10 Oct 11 Nov 12 Dec); + my %dow = qw(1 Mon 2 Tue 3 Wed 4 Thu 5 Fri 6 Sat 7 Sun); + + my($y,$m,$d,$h,$mn,$s) = @$date; + my $dow = $dmb->day_of_week($date); + $dow = $dow{$dow}; + my $mon = $mon{$m+0}; + $y="0$y" while (length($y) < 4); + $d=" $d" if (length($d) < 2); + $h="0$h" if (length($h) < 2); + $mn="0$mn" if (length($mn) < 2); + $s="0$s" if (length($s) < 2); + + return "$dow $mon $d $h:$mn:$s $y"; +} + +# Local Variables: +# mode: cperl +# indent-tabs-mode: nil +# cperl-indent-level: 3 +# cperl-continued-statement-offset: 2 +# cperl-continued-brace-offset: 0 +# cperl-brace-offset: 0 +# cperl-brace-imaginary-offset: 0 +# cperl-label-offset: 0 +# End: diff --git a/internal/NOTES b/internal/NOTES new file mode 100644 index 0000000..7bc62ed --- /dev/null +++ b/internal/NOTES @@ -0,0 +1,208 @@ +The files in this directory are for primary use by me, the author +of Date::Manip to prepare a new release. + +There is no reason for an end user to need to do this. However, it +is documented for the sake of completeness, and to remind me of the +steps I need to do. + +It's also available in case someone ever chooses to fork the +module (though I hope that won't be necessary). + +######################################################################### +Update the windows zones. Useful information in determining timezone +mapping may be obtained at: + + http://support.microsoft.com/kb/914387 + +Go to: + + http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/zone_tzid.html + +and copy the contents of the 'Mapping for: windows' table into a file 'windows.new' +and run the script: + + windows.compare + +Currently, ignore the addition: + "UTC" => "Etc/GMT", + +and the suggestions: + "Argentina Standard Time" => "America/Buenos_Aires", + "GTB Standard Time" => "Europe/Bucharest", + "India Standard Time" => "Asia/Calcutta", + "Nepal Standard Time" => "Asia/Katmandu", + "US Eastern Standard Time" => "America/Indianapolis", + +Make sure that new and changed zones refer to valid Olsen time zones. Make +the changes in data.alias.pl . + +Then remove windows.new . + +######################################################################### +Get the newest tzdata package. + +The tzdata/tzcode archives are obtained from + + ftp://ftp.iana.org/tz/ + +In order to create the appropriate Date::Manip modules, run the +following commands: + + ./internal/tzdata -f : to download the packages + ./internal/tzdata -b : to build the package + +Some timezones store information about time changes quite a ways in advance. We +need to make sure that we're storing enough information to get to a 'lastrule'. + +Run the following: + + cd tzdata + grep Rule africa antarctica asia australasia europe northamerica pacificnew \ + southamerica | \ + awk '{print $3}' | sort -u | egrep '^[1-9]' | sort -n | tail -1 + cd .. + +Make sure that the value for $keep_years (in internal/data.misc.pl) is greater +than (MAX_YEAR - CURR_YEAR) where MAX_YEAR is the output from the line above and +CURR_YEAR is the current year. + + ./internal/tzdata -l : to get a list of all the zones that need modules + ./internal/tzdata -d : to dump all zones + ./internal/tzdata -m : to create the individual zone modules + *** see NOTE 2 below *** + ./internal/tzdata -o : to create the individual offset modules + *** see NOTE 3 below *** + ./internal/tzdata -z : to create the main Zone module + *** see NOTE 3 below *** + +Run the following to double check every timezone in zoneinfo against the +Date::Manip version: + + ./internal/dumps + +Run the two tzdata tests: + + (cd t; ./runtests tzdata) + +Then clean up: + + ./internal/tzdata -c + + +NOTE 1: although the tzdata script runs on my computer, it is quite possible +that it will not run on other systems due to differences in what tools are +available. + +Since the tzdata script is designed only to create the modules which are +then distributed as part of Date::Manip, there is no reason for anyone other +than me to run the above commands. If you DO choose to run them, please do +not report problems due to differences in operating systems, or packages that +are installed on your system. If you discover a bug in tzdata, I am interested +in knowing about it however. + +NOTE 2: If you get a LAST RULE in Jan/Dec line, check it out. A zone +is doing time changes in Jan or Dec. Make sure it won't cause any +problems. Provided it's not early in the day of Jan 1 or late in the day +of Dec 31, it'll be fine. + +Currently, the following warn (but have been cleared as safe): + Pacific/Fiji + Pacific/Tongatapu + +NOTE 3: These steps often require manual intervention described +below. After the intervention, rerun the command to make sure no +output is produced. + +The old values of data are stored in the internal/data.* files. This is +so that I am explicitly notified of every change to the zoneinfo data +which could impact Date::Manip. Any output reflects potential changes +so every entry should be checked to ensure that it acceptable. Then, +the output needs to be added to the appropriate data.* file, replacing +any previous value for the entry. It is especially important that the first +line in each entry should remain unchanged unless there is good reason +to change it. The order of remaining lines may change to some extent. + +If the '-o' option produces any output, the entries need to be added +to the data.offset.pl file. + +If the '-z' option produces any output, the entries need to be added +to the data.alias.pl or data.abbrev.pl file. + +After adding a new value, rerun the command to make sure there are no more +problems. + +######################################################################### +Clean up stuff that shouldn't be in the manifest + +In internal/benchmarks directory + rm -f nytprof.out parse-1.in + rm -rf nytprof + +######################################################################### +Before every release, spellcheck the documents: + + for i in `find lib -type f -name \*.pod | egrep -v 'Lang\/' | + egrep -v Zones.pod` ;do + pod2text $i > $i.txt + ispell -p internal/module.isp $i.txt + rm -f $i.txt $i.txt.bak + done + + internal/langpod + + pod2text ./lib/Date/Manip/Lang/english.pod > english.txt + ispell -p internal/module.isp english.txt + rm -f english.txt english.txt.bak + +######################################################################### +Update the copyright + + y=`date '+%Y'` + for i in `find . -type f | egrep -v '.git' | xargs egrep -l 'Copyright \(c\) ....\-.... Sullivan Beck'` ;do + sed -e "s,\(Copyright (c) ....\)\-.... \(Sullivan Beck\),\1-$y \2," $i > z + mv z $i + done + chmod +x internal/tzdata internal/gen_dm5abbrevs examples/dm_* + +######################################################################### +Switch the system timezone to America/Central and run the tests. + +######################################################################### +Update the Changes5/Changes6 docs with the date. + +######################################################################### +Install the module. Then run the following: + + ./internal/gen_dm5abbrevs > lib/Date/Manip/DM5abbrevs.pm + +######################################################################### +Make sure that the test suite covers everything + + . ../0 + cover -delete + cover -test + # make sure everything is 100% + cover -delete + make distclean + +######################################################################### +Regenerate the MANIFEST and run the kwalitee tests + +find . -name \*.swp + +######################################################################### +Run the internal/leak.pl whenever a new version of perl is available to +see if the leak persists. When it's fixed, note this in the known problems +section. + +A patch for this went in on Dec 13, 2011 when the following versions of +perl are active: + 5.16.0 FIXED + 5.15.6 FIXED + 5.14.2 maint + 5.12.4 maint + 5.10.1 unmaint + +so look for it to be corrected in newer versions than this (not sure if +it'll be applied to the maintenance versions). + diff --git a/internal/TODO b/internal/TODO new file mode 100644 index 0000000..a2c4954 --- /dev/null +++ b/internal/TODO @@ -0,0 +1,257 @@ +Add option to Recur: ignore holidays + then flags like NBD ignore holidays (but count weekends) +When calculating holidays, use this option by default to simplify + holidays. Then, order of definitions is not important. + +Add options: + onlyiso8601, etc. to parse + no-delta-secs (not delta as a plain number) + no-timezone + +Can I reduce the number of timezone modules loaded when parsing a date +with an abbreviation or offset by loading one and testing it before +loading a second? + +Make sure the following work: + 1*12:0:24:0:0:0*FW1 = Christmas Day (observed) + December 25 2015 = Christmas Day + +Add a new type of recurrence (???): + *Christmas Day*NWD + +Add ability to supply holidays via. a list rather than a config file. + ksublondie on perlmonks + +######################################################################## +# Deprecated variables: + +03/01/2017 TZ + +Delete Obj.pm line 89 block + +######################################################################## +# +1 significant release +######################################################################## + +Check performance if changing + sub ... { + return &sub(...) + } +to + goto &sub(...) + +In Recur.pm, handle encodings in parse + +Add delta.parse_LANG tests + +Add UseTZ + = %all use all timezones + = %local use local timezone + = Z1 Z2 ... use zones Z1, Z2, etc. (one can be %local) +Only affects parsing. + +Add ways to get timezone in cygwin + +Cache Date::Manip::TZ::zone for ($abbrev,isdst), ($abbrev,$isdst,$offset), +other??? + +Profile it and look for optimizations. + +Date::Manip::Base : get rid of + _calc_date_time_strings + _delta_convert + +Benchmarks + Modules + 5.x + 6.00 + 6.00 parse_format + DateCalc + TimeDate + ??? + Tests + 10,000 dates (parse) time + size + 10,000 dates (parse + 2 adds + 1 unix date) time + size + 10,000 scripts (parse 1 date + 2 adds + 1 unix date each) time + +Rewrite Problems.pod (Date Manip is slow) + +Clear out all problems from CPAN + +Methods which require a valid object (secs_since_1970_GMT) should exit +instead of trying to perform the operation if the object is invalid. +RT #60662 (Matt Blythe) + +######################################################################## +# +2 significant release +######################################################################## + +Everywhere a timezone can be entered, allow: + zone + abbrev + offset +followed by an option: + std either STD or DST time, test STD first (default always) + dst either STD or DST time, test DST first + stdonly only test STD + dstonly only test DST + +Change Date::Manip::Base so that $date input can be reference or +string. + +Clear as much of the backlog of suggestions as possible. + +######################################################################## +# TO DO +######################################################################## + +Make sure there is a correspondance between: + time,localtime,gmtime + Date_SecsSince1970,Date_SecsSince1970GMT + UnixDate(...,"%s"),UnixDate(...,"%u") +and document it all. + +Support timezones of the format +500. David Coppit + +Make sure that &DateCalc($date1,"") returns an error. Jim Anderson + +Change the Jan1Week1 variable to accept the values "m1-m7" (1st week contains +Jan X) or "d1-d7" (1st week contains the 1st dX day of week ... so d1 +means that the 1st week of the year contains the 1st Monday). + +Free up the '%u', '%h', and '%X' printf formats. Reserve '%X' for + extended formats (%Xa, %Xb, ...). + +######################################################################## +# TO CONSIDER +######################################################################## + +Special date formats in language file: + extra{LABEL} = [ ... ] extra words of type LABEL + offset_date => + FORMAT => 'OFFSET' + where FORMAT is similar to parse_format + %LABEL is a regexp with any of the words + OFFSET can include %y, %d, %w, %m, %h, %mn, $s in them + same for offset_time, times, and others + ex. + offset_time => { "%h o'clock" => "%h:00:00" } + Support some of the special Russian dates supplied by Yuri Nikulin + +Add a method: + ($date0,$date1) = $date->week_range(); +where $date0 and $date1 are the start and end of the week containing +$date. Ha Quach + +Add Date_LocaleInit which calls Date_Init and then sets DateFormat +config varialbe. Benjamin Low + Essentially, I use POSIX::strftime to print a known date in the locale + 'native' format ('%x'), and parse the result to determine d/m/y, m/d/y, + or y/m/d. + + Here's what I do for Date::Parse, perhaps for your module you could just + substitute a default value for DateFormat: + + sub _dmorder + # determine the "natural" day/month order for the current locale + # - returns a sub which will expect two arguments (month, day) and + # return the arguments swapped as appropriate + { + # %x - preferred (year, month, day) representation + # - some examples: 1999-12-31, 31/12/99, 30.12.1999, 12/31/99 + my @d = (POSIX::strftime('%x', 0, 0, 0, 31, 12-1, 99) =~ + /(\d+)\D+(\d+)\D+(\d+)/); + + # check we got one each of "31", "12", and "[19]99" back + $@ = "couldn't determine day,month order (got [@d])"; + warn("$@\n"), return sub { @_ } unless @d == 3; + my %d; $d{$1} = $d{$2} = $d{$3} = 1; + warn("$@\n"), return sub { @_ } + unless ($d{31} and $d{12} and ($d{99} or $d{1999})); + + if ($1 == 31) { $@ = undef; return sub { ($_[1], $_[0]) } }; # d/m/y + if ($2 == 31) { $@ = undef; return sub { ($_[0], $_[1]) } }; # m/d/y + if ($3 == 31) { $@ = undef; return sub { ($_[0], $_[1]) } }; # y/m/d + + return sub { @_ }; # undetermined, use default + } + + *dmorder = _dmorder(); + + # and then later in Parse::Date, after month/day regexps (\d+/\d+)... + - ($month, $day) = ($1, $2); becomes... + + ($month, $day) = dmorder($1, $2); + + +Make DateFormat variable handle y/m/d y/d/m m/d/y and d/m/y formats +in addition to m/d vs. d/m . Also, make "%D" and "%x" UnixDate formats +use this variable. Benjamin Low + +Make the following work for ParseDate Adrian Conte: + 1 epoch + epoch 1 + -1 epoch + epoch -1 + +Make work weeks able to start and stop on arbitrary days (even across +weekends). Mohammed Saggaf + +Switch to Math::BigInt instead of using "no integer". Vishal Bhatia + +Use autoloader. Ted Ashton + +Better support for fractional seconds. RT 61535 + +######################################################################## +# GRANULARITY +######################################################################## + +$flag=&Date_GranularityTest($date,$base,$granularity [,$flags] [$width]) + $date and $base are dates + $granularity and $width are deltas + $flags is a list of flags + + To test if a day is one of every other Friday (starting at Friday + Feb 7, 1997), go: + $base=&ParseDate("Friday Feb 7 1997"); + $date=&ParseDate("..."); + $granularity=&ParseDateDelta("+ 2 weeks"); + $flag=&Date_Granularity($date,$base,$granularity,"exact"); + If $flag is 1, the $date is a 2nd Friday from Feb 7. + + The most important field in $granularity is the last non-zero element. + In the above example, 2 weeks returns the delta 0:0:14:0:0:0 so the + last non-zero element is days with a value of 14. + + If $flags is empty, $date is checked to see if it occurs some multiple + of 14 days before or after $base. In this case, hourse, minutes, and + seconds are completely ignored. + + If $flags contains the words "before" or "after", $date must come + before or after $base. + + If $flags contains any other options, or if $width is passed in, the + test is treated in an approximate way. A flag of "approx" forces this + behavior. + + If $width is not passed in in an approximate comparison, it defaults + to 1 in the last non-zero element. Here, the default width is 1 day. + If the flag "half" is used, the width (default or passed in) is + halved. + + For example if $width is 1 day, add a multiple of $granularity to + $base to get as close to $date as possible. If $date is within plus + or minus 1 day of this new base, the test is successful. A flag of + "plus" or "minus" means that $date must be with plus 1 day or within + minus one day of this new base. Flags of "before" or "after" work + as well. + +@list=&Date_GranularityList($date,$N,$granularity) + Returns a list of $N dates AFTER $date which are created by adding + $granularity to $date $N times. If $N<0, it returns $N dates BEFORE + $date (the list is in chronological order). + + Make it work in business mode as well which will return only working + days. Example, every other friday and it can be told that if friday + falls on a holiday to return either thursday or the following monday + or leave it out. diff --git a/internal/TODO.7 b/internal/TODO.7 new file mode 100644 index 0000000..e561a0e --- /dev/null +++ b/internal/TODO.7 @@ -0,0 +1,27 @@ +For Date::Manip 7.0 + + Date::Manip::internal::Cache : class for caching data + Date::Manip::internal::Config : class for config data + Date::Manip::internal::TZdata : all of the TZdata + Date::Manip::internal::Lang : language data + + Date::Manip::SimpleDate : y/m/d operations only + is_business_date + Date::Manip::SimpleTime : h/mn/s (time of day) operations only + is_business_time + Date::Manip::TZ : local timezone info + + Date::Manip::Base : deprecated + + Date::Manip::Date + Date::Manip::internal::Cache + Date::Manip::internal::Config + Date::Manip::SimpleDate : in local timezone + Date::Manip::SimpleTime : in local timezone + Date::Manip::SimpleDate : in GMT + Date::Manip::SimpleTime : in GMT + +??? + + Date::Manip::GMTDate : ignore all timezone issues + diff --git a/internal/benchmarks/NOTES b/internal/benchmarks/NOTES new file mode 100644 index 0000000..fb4cde6 --- /dev/null +++ b/internal/benchmarks/NOTES @@ -0,0 +1,115 @@ +Common date formats: + + +Date::Calc +Date::Parse +Date::Parser +DateTime +Time::ParseDate +TimeDate (only a few hardcoded timezones) (does support languages) + (does not do parsing of arbitrary dates) + + +Parsing +Calculations +Business days +Foreign parsing +Recurrences +Timezones + + + + +Parse 10,000 dates + +Date::Manip 5 8.6 sec +Date::Manip 6 4.1 sec + format 3.0 sec + 'no' opts 3.8 sec + +Date::Parse 0.6 sec handles multilingual dates + limited number of formats + active development +Date::Time 0.7 sec (wrapper around Date::Parse) + +------------------- + + +These files are used for running benchmarks and performance testing of Date::Manip. +They are not generally useful, and are not installed anywhere. + +Date::Calc no parsing + no timezones + almost no time handling (primarily Y/M/D) + +Date::Pcalc same as Date::Calc + +TimeDate no calculations + Date::Parse + Time::Zone + + + + +DateTime +DateTime-TimeZone +DateTime-Format + +Date::Components + +Date::Handler + +Time::Format + + +perl -d:NYTProf parse-1.dm.pl +nytprofhtml + +============ + +time parse-1.dt.pl +parse-1.dt.pl 0.51s user 0.01s system 83% cpu 0.626 total + +time ./parse-1.dm_no.pl +./parse-1.dm_no.pl 3.36s user 0.01s system 100% cpu 3.366 total + +time ./parse-1.dm5.pl +./parse-1.dm5.pl 6.21s user 0.03s system 100% cpu 6.233 total + +time ./parse-1.dm_fo.pl +./parse-1.dm_fo.pl 5.09s user 0.03s system 99% cpu 5.123 total + +time ./parse-1.dm.pl +./parse-1.dm.pl 3.64s user 0.04s system 99% cpu 3.706 total + +perl -d:NYTProf parse-1.dm6.pl +nytprofhtml + +11323 613ms Date::::_parse_time Date::Manip::Date::_parse_time +11323 442ms Date::::parse Date::Manip::Date::parse +11324 419ms TZ::::date_period Date::Manip::TZ::date_period +11323 399ms Date::::_parse_date_common Date::Manip::Date::_parse_date_common +11323 378ms Date::::set Date::Manip::Date::set +11324 298ms TZ::::_all_periods Date::Manip::TZ::_all_periods +11323 248ms Date::::_parse_date Date::Manip::Date::_parse_date +22646 233ms Base::::check Date::Manip::Base::check +11323 207ms Date::::_parse_check Date::Manip::Date::_parse_check +11323 174ms Date::::_parse_datetime_iso8601 Date::Manip::Date::_parse_datetime_iso8601 +11324 163ms Base::::_now Date::Manip::Base::_now +11323 162ms Date::::_parse_dow Date::Manip::Date::_parse_dow +22646 159ms Base::::check_time Date::Manip::Base::check_time +22662 158ms Base::::_is_int Date::Manip::Base::_is_int + +============== + +mkdir tz +cd tz +perl -d:NYTProf ../dm5dm6_ex3 6o ../dateset3.txt +nytprofhtml + +cd .. +mkdir notz +cd notz +perl -d:NYTProf ../dm5dm6_ex3 6o ../dateset3_notz.txt +nytprofhtml + diff --git a/internal/benchmarks/dateset3.txt b/internal/benchmarks/dateset3.txt new file mode 100644 index 0000000..fed9521 --- /dev/null +++ b/internal/benchmarks/dateset3.txt @@ -0,0 +1,2433 @@ +Wed, 4 Feb 2015 09:24:28 +0000 +Wed, 4 Feb 2015 13:30:30 -0800 +Wed, 4 Feb 2015 13:50:52 -0500 +Wed, 4 Feb 2015 16:05:37 -0500 +Wed, 4 Feb 2015 16:36:26 -0500 +Thu, 5 Feb 2015 01:56:07 -0800 +Thu, 5 Feb 2015 10:10:11 -0600 +Thu, 5 Feb 2015 12:08:36 -0500 +Fri, 6 Feb 2015 07:47:00 -0500 +Fri, 6 Feb 2015 10:42:45 -0500 +Fri, 6 Feb 2015 11:31:29 -0500 +Fri, 6 Feb 2015 12:07:28 -0600 +Sat, 07 Feb 2015 13:21:04 +0200 +Sat, 7 Feb 2015 23:42:59 -0800 +Sun, 8 Feb 2015 05:53:50 -0600 +Sun, 8 Feb 2015 06:14:26 -0600 +Sun, 8 Feb 2015 12:02:03 -0500 +Sun, 08 Feb 2015 22:45:56 -0700 +Mon, 9 Feb 2015 08:11:11 -0500 +Mon, 09 Feb 2015 11:09:15 -0700 +Mon, 9 Feb 2015 10:43:27 -0800 +Mon, 9 Feb 2015 14:09:11 -0500 +Mon, 9 Feb 2015 13:29:35 -0500 +Mon, 9 Feb 2015 11:27:27 -0700 +Mon, 9 Feb 2015 14:02:27 -0500 +Mon, 09 Feb 2015 11:55:36 -0700 +Mon, 09 Feb 2015 12:15:51 -0700 +Mon, 09 Feb 2015 12:27:07 -0700 +Mon, 9 Feb 2015 12:48:51 -0700 +Mon, 09 Feb 2015 13:06:57 -0700 +Mon, 9 Feb 2015 15:05:29 -0500 +Mon, 9 Feb 2015 12:24:15 -0800 +Mon, 09 Feb 2015 21:26:44 +0100 +Mon, 09 Feb 2015 13:25:22 -0700 +Mon, 9 Feb 2015 13:48:12 -0700 +Mon, 09 Feb 2015 14:07:10 -0700 +Mon, 09 Feb 2015 21:31:08 +0000 +Mon, 09 Feb 2015 15:00:19 -0700 +Mon, 9 Feb 2015 14:09:02 -0800 +Mon, 09 Feb 2015 15:14:08 -0700 +Mon, 09 Feb 2015 17:02:41 -0700 +Mon, 9 Feb 2015 17:11:28 -0700 +Mon, 09 Feb 2015 17:16:56 -0700 +Tue, 10 Feb 2015 01:09:38 +0100 +Mon, 09 Feb 2015 17:44:13 -0700 +Mon, 9 Feb 2015 20:24:28 -0500 +Mon, 9 Feb 2015 21:42:55 -0500 +Mon, 9 Feb 2015 20:28:38 -0800 +Mon, 09 Feb 2015 21:57:39 -0700 +Mon, 9 Feb 2015 21:23:23 -0800 +Mon, 09 Feb 2015 22:38:52 -0700 +Mon, 9 Feb 2015 23:36:06 -0700 +Tue, 10 Feb 2015 07:29:49 +0100 +Mon, 9 Feb 2015 23:07:52 -0800 +Mon, 9 Feb 2015 23:55:01 -0800 +Tue, 10 Feb 2015 01:19:10 -0700 +Tue, 10 Feb 2015 01:30:14 -0700 +Tue, 10 Feb 2015 02:04:08 -0700 +Tue, 10 Feb 2015 04:07:38 -0500 +Tue, 10 Feb 2015 02:33:36 -0700 +Tue, 10 Feb 2015 02:35:42 -0700 +Tue, 10 Feb 2015 15:41:37 +0400 +Tue, 10 Feb 2015 14:42:53 +0300 +Tue, 10 Feb 2015 06:26:04 -0500 +Tue, 10 Feb 2015 09:27:24 -0500 +Tue, 10 Feb 2015 08:11:55 -0700 +Tue, 10 Feb 2015 07:14:14 -0800 +Tue, 10 Feb 2015 08:19:54 -0700 +Tue, 10 Feb 2015 19:32:07 +0400 +Tue, 10 Feb 2015 19:32:07 +0400 +Tue, 10 Feb 2015 10:41:11 -0500 +Tue, 10 Feb 2015 10:50:57 -0500 +Tue, 10 Feb 2015 07:51:31 -0800 +Tue, 10 Feb 2015 19:53:08 +0400 +Tue, 10 Feb 2015 19:53:09 +0400 +Tue, 10 Feb 2015 08:53:55 -0700 +Tue, 10 Feb 2015 20:07:49 +0400 +Tue, 10 Feb 2015 20:07:49 +0400 +Tue, 10 Feb 2015 09:08:34 -0700 +Tue, 10 Feb 2015 09:23:28 -0700 +Tue, 10 Feb 2015 09:31:10 -0700 +Tue, 10 Feb 2015 08:34:28 -0800 +Tue, 10 Feb 2015 08:29:00 -0800 +Tue, 10 Feb 2015 11:21:40 -0500 +Tue, 10 Feb 2015 09:57:40 -0700 +Tue, 10 Feb 2015 10:01:13 -0700 +Tue, 10 Feb 2015 12:12:28 -0500 +Tue, 10 Feb 2015 09:14:07 -0800 +Tue, 10 Feb 2015 09:33:23 -0800 +Tue, 10 Feb 2015 10:41:27 -0700 +Tue, 10 Feb 2015 10:53:36 -0700 +Tue, 10 Feb 2015 10:04:13 -0800 +Tue, 10 Feb 2015 11:03:31 -0700 +Tue, 10 Feb 2015 11:26:29 -0700 +Tue, 10 Feb 2015 10:28:36 -0800 +Tue, 10 Feb 2015 11:06:34 -0800 +Tue, 10 Feb 2015 11:16:26 -0800 +Tue, 10 Feb 2015 11:30:02 -0800 +Tue, 10 Feb 2015 14:40:23 -0500 +Tue, 10 Feb 2015 20:01:40 +0100 +Tue, 10 Feb 2015 11:56:07 -0800 +Tue, 10 Feb 2015 12:01:20 -0800 +Tue, 10 Feb 2015 12:12:08 -0800 +Tue, 10 Feb 2015 12:20:30 -0800 +Tue, 10 Feb 2015 12:36:12 -0800 +Tue, 10 Feb 2015 14:35:46 -0700 +Tue, 10 Feb 2015 15:07:16 -0700 +Tue, 10 Feb 2015 15:25:53 -0700 +Tue, 10 Feb 2015 15:28:32 -0800 +Tue, 10 Feb 2015 16:31:03 -0700 +Tue, 10 Feb 2015 17:12:31 -0700 +Tue, 10 Feb 2015 16:42:19 -0800 +Tue, 10 Feb 2015 19:46:09 -0700 +Tue, 10 Feb 2015 21:25:59 -0700 +Tue, 10 Feb 2015 23:29:02 -0500 +Tue, 10 Feb 2015 20:43:09 -0800 +Tue, 10 Feb 2015 22:55:47 -0700 +Tue, 10 Feb 2015 22:29:07 -0800 +Tue, 10 Feb 2015 23:50:11 -0700 +Tue, 10 Feb 2015 23:12:45 -0800 +Wed, 11 Feb 2015 00:41:10 -0700 +Wed, 11 Feb 2015 04:30:02 -0700 +Wed, 11 Feb 2015 06:47:25 -0500 +Wed, 11 Feb 2015 03:53:45 -0800 +Wed, 11 Feb 2015 07:21:04 -0500 +Wed, 11 Feb 2015 06:17:09 -0700 +Wed, 11 Feb 2015 08:55:07 -0500 +Wed, 11 Feb 2015 14:06:53 +0100 +Wed, 11 Feb 2015 09:19:25 -0500 +Wed, 11 Feb 2015 09:40:49 -0500 +Wed, 11 Feb 2015 09:30:58 -0500 +Wed, 11 Feb 2015 19:48:42 +0400 +Wed, 11 Feb 2015 19:48:43 +0400 +Wed, 11 Feb 2015 08:00:09 -0800 +Wed, 11 Feb 2015 08:16:12 -0800 +Wed, 11 Feb 2015 08:09:24 -0800 +Wed, 11 Feb 2015 10:56:41 -0500 +Wed, 11 Feb 2015 10:01:36 -0700 +Wed, 11 Feb 2015 10:07:14 -0700 +Wed, 11 Feb 2015 09:10:44 -0800 +Wed, 11 Feb 2015 09:11:34 -0800 +Wed, 11 Feb 2015 09:17:24 -0800 +Wed, 11 Feb 2015 10:32:13 -0700 +Wed, 11 Feb 2015 10:57:43 -0700 +Wed, 11 Feb 2015 10:56:55 -0700 +Wed, 11 Feb 2015 10:03:34 -0800 +Wed, 11 Feb 2015 10:43:32 -0700 +Wed, 11 Feb 2015 10:14:22 -0800 +Wed, 11 Feb 2015 11:21:46 -0700 +Mi, 11 Feb 2015 13:33:44 -0500 +Wed, 11 Feb 2015 13:39:49 -0500 +Wed, 11 Feb 2015 11:45:12 -0700 +Wed, 11 Feb 2015 11:52:54 -0700 +Wed, 11 Feb 2015 10:50:33 -0800 +Wed, 11 Feb 2015 11:03:57 -0800 +Wed, 11 Feb 2015 12:19:03 -0700 +Wed, 11 Feb 2015 11:54:42 -0800 +Wed, 11 Feb 2015 12:38:11 -0700 +Wed, 11 Feb 2015 13:31:21 -0700 +Wed, 11 Feb 2015 12:33:45 -0800 +Wed, 11 Feb 2015 15:40:02 -0500 +Wed, 11 Feb 2015 15:48:04 -0500 +Wed, 11 Feb 2015 15:50:01 -0500 +Wed, 11 Feb 2015 15:55:37 -0500 +Wed, 04 Feb 2015 19:46:02 +0400 +Wed, 04 Feb 2015 19:52:46 +0400 +Wed, 4 Feb 2015 11:52:32 -0500 +Thu, 05 Feb 2015 00:53:41 +0400 +Thu, 05 Feb 2015 01:07:55 +0400 +Thu, 5 Feb 2015 05:59:34 -0500 +Thu, 05 Feb 2015 20:39:46 +0400 +Thu, 5 Feb 2015 16:25:08 -0500 +Fri, 6 Feb 2015 11:20:02 -0500 +Fri, 6 Feb 2015 14:44:09 -0500 +Sat, 07 Feb 2015 01:49:51 +0400 +Sat, 7 Feb 2015 09:48:15 +0100 +Sat, 7 Feb 2015 08:40:04 -0500 +Sat, 7 Feb 2015 18:31:45 -0500 +Sun, 8 Feb 2015 09:23:27 -0500 +Sun, 8 Feb 2015 10:19:11 -0500 +Mon, 09 Feb 2015 12:46:54 -0700 +Mon, 9 Feb 2015 14:42:41 -0500 +Tue, 10 Feb 2015 00:44:15 +0400 +Tue, 10 Feb 2015 00:44:16 +0400 +Tue, 10 Feb 2015 01:24:22 +0400 +Tue, 10 Feb 2015 01:24:22 +0400 +Mon, 9 Feb 2015 17:32:29 -0500 +Mon, 09 Feb 2015 20:57:25 -0700 +Mon, 09 Feb 2015 21:18:54 -0700 +Tue, 10 Feb 2015 05:33:55 +0100 +Tue, 10 Feb 2015 01:04:37 -0700 +Tue, 10 Feb 2015 01:41:09 -0700 +Tue, 10 Feb 2015 03:40:02 -0500 +Tue, 10 Feb 2015 08:20:50 -0500 +Tue, 10 Feb 2015 15:06:10 +0000 +Tue, 10 Feb 2015 15:06:10 +0000 +Tue, 10 Feb 2015 08:45:07 -0700 +Tue, 10 Feb 2015 10:49:03 -0500 +Tue, 10 Feb 2015 11:05:52 -0700 +Tue, 10 Feb 2015 10:13:58 -0800 +Tue, 10 Feb 2015 12:01:33 -0700 +Tue, 10 Feb 2015 11:27:03 -0800 +Tue, 10 Feb 2015 22:55:40 +0300 +Tue, 10 Feb 2015 15:28:25 -0500 +10 Feb 2015 15:52:59 -0500 +Wed, 11 Feb 2015 01:00:57 +0400 +Wed, 11 Feb 2015 01:00:57 +0400 +Tue, 10 Feb 2015 16:44:13 EST +Tue, 10 Feb 2015 17:24:35 -0500 +Tue, 10 Feb 2015 15:55:06 -0800 +Tue, 10 Feb 2015 19:29:15 -0500 +Tue, 10 Feb 2015 19:04:23 -0700 +Tue, 10 Feb 2015 21:18:20 -0500 +Wed, 11 Feb 2015 01:06:51 -0500 +Wed, 11 Feb 2015 04:23:23 EST +Wed, 11 Feb 2015 06:31:06 -0500 +Wed, 11 Feb 2015 05:25:22 -0700 +Wed, 11 Feb 2015 10:21:43 -0500 +Wed, 11 Feb 2015 15:34:49 -0500 +Wed, 11 Feb 2015 22:14:10 +0100 +Wed, 11 Feb 2015 15:17:33 -0700 +Wed, 11 Feb 2015 17:48:41 -0500 +Wed, 11 Feb 2015 18:27:49 -0500 +Wed, 11 Feb 2015 17:55:37 -0700 +Wed, 11 Feb 2015 18:53:11 -0700 +Wed, 11 Feb 2015 18:01:00 -0800 +Thu, 12 Feb 2015 03:05:11 +0100 +Wed, 11 Feb 2015 19:09:23 -0700 +Wed, 11 Feb 2015 22:25:13 -0800 +Thu, 12 Feb 2015 02:48:02 EST +Wed, 11 Feb 2015 23:57:01 -0800 +Thu, 12 Feb 2015 03:23:40 -0500 +Thu, 12 Feb 2015 04:10:21 -0500 +Thu, 12 Feb 2015 18:35:23 +0900 +Thu, 12 Feb 2015 01:36:43 -0800 +Thu, 12 Feb 2015 02:39:49 -0700 +Thu, 12 Feb 2015 03:52:34 -0700 +Thu, 12 Feb 2015 04:01:36 -0700 +Thu, 12 Feb 2015 13:41:35 +0200 +Thu, 12 Feb 2015 06:47:45 -0700 +Thu, 12 Feb 2015 07:01:31 -0700 +Thu, 12 Feb 2015 07:15:32 -0700 +Thu, 12 Feb 2015 07:29:38 -0700 +Thu, 12 Feb 2015 10:01:56 -0500 +Thu, 12 Feb 2015 10:23:15 -0500 +Thu, 12 Feb 2015 08:33:35 -0700 +Thu, 12 Feb 2015 08:34:28 -0700 +Thu, 12 Feb 2015 08:55:18 -0700 +Thu, 12 Feb 2015 09:29:56 -0700 +Thu, 12 Feb 2015 09:30:56 -0700 +Thu, 12 Feb 2015 09:47:02 -0700 +Thu, 12 Feb 2015 09:47:54 -0700 +Thu, 12 Feb 2015 10:06:08 -0700 +Thu, 12 Feb 2015 10:05:09 -0700 +Thu, 12 Feb 2015 10:26:44 -0700 +Thu, 12 Feb 2015 09:26:44 -0800 +Thu, 12 Feb 2015 10:43:49 -0700 +Thu, 12 Feb 2015 10:42:55 -0700 +Thu, 12 Feb 2015 11:01:53 -0700 +Thu, 12 Feb 2015 11:00:59 -0700 +Thu, 12 Feb 2015 11:04:10 -0700 +Thu, 12 Feb 2015 11:21:50 -0700 +Thu, 12 Feb 2015 10:22:18 -0800 +Thu, 12 Feb 2015 10:31:42 -0800 +Thu, 12 Feb 2015 11:41:30 -0700 +Thu, 12 Feb 2015 11:42:26 -0700 +Thu, 12 Feb 2015 14:04:08 -0500 +Thu, 12 Feb 2015 11:20:48 -0800 +Thu, 12 Feb 2015 12:51:39 -0700 +Thu, 12 Feb 2015 15:25:47 -0500 +Thu, 12 Feb 2015 14:12:31 -0700 +Thu, 12 Feb 2015 16:32:34 -0500 +Thu, 12 Feb 2015 17:29:45 -0500 +Thu, 12 Feb 2015 15:45:20 -0700 +Thu, 12 Feb 2015 15:37:39 -0800 +Thu, 12 Feb 2015 16:37:50 -0700 +Thu, 12 Feb 2015 16:58:41 -0700 +Thu, 12 Feb 2015 17:13:12 -0700 +Thu, 12 Feb 2015 17:28:11 -0700 +Fri, 13 Feb 2015 01:19:14 +0100 +Thu, 12 Feb 2015 18:58:25 -0700 +Thu, 12 Feb 2015 19:13:39 -0700 +Thu, 12 Feb 2015 19:23:54 -0800 +Thu, 12 Feb 2015 13:45:30 -0700 +Fri, 13 Feb 2015 05:32:12 +0100 +Fri, 13 Feb 2015 00:40:04 -0500 +Fri, 13 Feb 2015 09:09:15 -0700 +Fri, 13 Feb 2015 02:16:13 -0700 +Fri, 13 Feb 2015 04:20:58 -0500 +Fri, 13 Feb 2015 02:31:47 -0700 +Fri, 13 Feb 2015 02:47:15 -0700 +Fri, 13 Feb 2015 04:55:58 -0500 +Fri, 13 Feb 2015 05:48:11 -0500 +Fri, 13 Feb 2015 03:48:25 -0700 +Fri, 13 Feb 2015 04:03:41 -0700 +Fri, 13 Feb 2015 15:20:25 +0300 +Fri, 13 Feb 2015 04:32:54 -0800 +Fri, 13 Feb 2015 15:34:25 +0300 +Fri, 13 Feb 2015 05:36:43 -0700 +Fri, 13 Feb 2015 07:34:53 -0500 +Fri, 13 Feb 2015 04:37:23 -0800 +Fri, 13 Feb 2015 04:40:00 -0800 +Fri, 13 Feb 2015 09:07:44 -0500 +Fri, 13 Feb 2015 09:55:39 -0500 +Fri, 13 Feb 2015 08:44:56 -0700 +Fri, 13 Feb 2015 07:55:46 -0800 +Fri, 13 Feb 2015 08:28:01 -0800 +Fri, 13 Feb 2015 09:36:31 -0700 +Fri, 13 Feb 2015 09:01:05 -0800 +Fr, 13 Feb 2015 08:58:48 -0500 +Fri, 13 Feb 2015 10:22:01 -0700 +Fri, 13 Feb 2015 09:35:25 -0800 +Fri, 13 Feb 2015 09:45:51 -0800 +Fri, 13 Feb 2015 12:55:54 -0500 +Fri, 13 Feb 2015 10:58:29 -0700 +Fri, 13 Feb 2015 04:42:37 -0700 +Fri, 13 Feb 2015 12:05:41 -0700 +Fri, 13 Feb 2015 05:09:41 -0700 +Fri, 13 Feb 2015 12:35:14 -0700 +Fri, 13 Feb 2015 12:52:21 -0700 +Fri, 13 Feb 2015 20:52:52 +0100 +Fri, 13 Feb 2015 13:04:35 -0500 +Fri, 13 Feb 2015 13:48:58 -0700 +Fri, 13 Feb 2015 13:02:04 -0800 +Fri, 13 Feb 2015 07:08:13 -0700 +Fri, 13 Feb 2015 14:23:40 -0700 +Fri, 13 Feb 2015 16:45:56 -0500 +Fri, 13 Feb 2015 14:47:38 -0700 +Fri, 13 Feb 2015 13:54:31 -0800 +Fr, 13 Feb 2015 17:13:55 -0500 +Fri, 13 Feb 2015 22:57:46 +0100 +Fri, 13 Feb 2015 15:52:08 -0700 +Fri, 13 Feb 2015 18:13:39 -0500 +Fri, 13 Feb 2015 23:25:57 +0000 +Fri, 13 Feb 2015 18:32:49 -0500 +Fri, 13 Feb 2015 16:52:35 -0800 +Fri, 13 Feb 2015 18:22:43 -0700 +Fri, 13 Feb 2015 18:39:11 -0700 +Fri, 13 Feb 2015 18:48:29 -0800 +Sat, 14 Feb 2015 04:06:54 +0100 +Fri, 13 Feb 2015 21:52:16 -0700 +Fri, 13 Feb 2015 21:52:30 -0800 +Fri, 13 Feb 2015 22:54:38 -0700 +Sat, 14 Feb 2015 00:30:41 -0700 +Sat, 14 Feb 2015 00:47:06 -0700 +Sat, 14 Feb 2015 01:02:50 -0700 +Sat, 14 Feb 2015 01:52:07 -0700 +Sat, 14 Feb 2015 02:40:52 -0700 +Sat, 14 Feb 2015 03:32:12 -0700 +Sat, 14 Feb 2015 05:07:56 -0500 +Sat, 14 Feb 2015 03:56:52 -0700 +Sat, 14 Feb 2015 06:22:26 -0700 +Sat, 14 Feb 2015 08:44:14 -0500 +Sat, 14 Feb 2015 09:53:00 -0500 +Sat, 14 Feb 2015 16:48:53 +0200 +Sat, 14 Feb 2015 07:54:39 -0800 +Sat, 14 Feb 2015 09:06:32 -0700 +Sat, 14 Feb 2015 17:12:36 +0100 +Sat, 14 Feb 2015 08:31:33 -0800 +Sat, 14 Feb 2015 09:49:01 -0700 +Sat, 14 Feb 2015 09:52:03 -0700 +Sat, 14 Feb 2015 09:00:47 -0800 +Sat, 14 Feb 2015 10:03:53 -0700 +Sat, 14 Feb 2015 10:24:59 -0700 +Sat, 14 Feb 2015 09:31:34 -0800 +Sat, 14 Feb 2015 10:33:48 -0700 +Sat, 14 Feb 2015 09:46:34 -0800 +Sat, 14 Feb 2015 10:46:16 -0700 +Sat, 14 Feb 2015 09:48:11 -0800 +Sat, 14 Feb 2015 11:03:08 -0700 +Sat, 14 Feb 2015 11:19:16 -0700 +Sat, 14 Feb 2015 11:21:23 -0700 +Sat, 14 Feb 2015 13:31:04 -0500 +Sat, 14 Feb 2015 10:32:26 -0800 +Sat, 14 Feb 2015 11:35:33 -0700 +Sat, 14 Feb 2015 10:40:05 -0800 +Sat, 14 Feb 2015 11:58:22 -0700 +Sat, 14 Feb 2015 12:15:58 -0700 +Sat, 14 Feb 2015 12:24:48 -0700 +Sat, 14 Feb 2015 12:50:05 -0700 +Sat, 14 Feb 2015 17:50:52 -0500 +Sat, 14 Feb 2015 19:10:04 -0500 +Sat, 14 Feb 2015 17:29:08 -0700 +Sat, 14 Feb 2015 18:25:56 -0700 +Sat, 14 Feb 2015 18:54:02 -0700 +Sat, 14 Feb 2015 19:10:16 -0700 +Sat, 14 Feb 2015 19:09:29 -0700 +Sat, 14 Feb 2015 19:26:18 -0700 +Sun, 15 Feb 2015 02:37:04 +0000 +Sat, 14 Feb 2015 19:48:50 -0700 +Sat, 14 Feb 2015 19:47:54 -0700 +Sat, 14 Feb 2015 20:05:04 -0700 +Sat, 14 Feb 2015 19:54:21 -0700 +Sat, 14 Feb 2015 20:21:28 -0700 +Sat, 14 Feb 2015 20:37:41 -0700 +Sat, 14 Feb 2015 20:54:09 -0700 +Sat, 14 Feb 2015 21:10:50 -0700 +Sat, 14 Feb 2015 21:29:12 -0700 +Sat, 14 Feb 2015 22:03:35 -0700 +Sun, 15 Feb 2015 00:52:58 -0700 +Sun, 15 Feb 2015 01:09:40 -0700 +Sun, 15 Feb 2015 01:25:44 -0700 +Sun, 15 Feb 2015 01:40:40 -0700 +Sun, 15 Feb 2015 01:55:18 -0700 +Sun, 15 Feb 2015 02:11:20 -0700 +Sun, 15 Feb 2015 02:25:06 -0700 +Sun, 15 Feb 2015 04:51:01 -0500 +Sun, 15 Feb 2015 02:56:40 -0700 +Sun, 15 Feb 2015 05:07:03 -0500 +Sun, 15 Feb 2015 05:32:22 -0500 +Sun, 15 Feb 2015 05:01:42 -0700 +Sun, 15 Feb 2015 05:17:03 -0700 +Sun, 15 Feb 2015 05:46:21 -0700 +Sun, 15 Feb 2015 06:04:49 -0700 +Sun, 15 Feb 2015 06:20:47 -0700 +Sun, 15 Feb 2015 06:39:33 -0700 +Sun, 15 Feb 2015 09:13:20 -0500 +Sun, 15 Feb 2015 07:17:44 -0700 +Sun, 15 Feb 2015 07:37:30 -0700 +Thu, 12 Feb 2015 01:24:30 +0400 +Thu, 12 Feb 2015 01:24:30 +0400 +Thu, 12 Feb 2015 01:26:33 +0400 +Thu, 12 Feb 2015 01:26:34 +0400 +Wed, 11 Feb 2015 14:14:13 -0800 +Thu, 12 Feb 2015 04:27:10 +0400 +Thu, 12 Feb 2015 04:27:09 +0400 +Wed, 11 Feb 2015 18:56:32 -0700 +Thu, 12 Feb 2015 07:56:16 +0000 +Thu, 12 Feb 2015 06:31:19 -0500 +Thu, 12 Feb 2015 19:46:57 +0400 +Thu, 12 Feb 2015 19:46:56 +0400 +Thu, 12 Feb 2015 08:54:14 -0700 +Thu, 12 Feb 2015 11:07:31 -0500 +Thu, 12 Feb 2015 09:11:58 -0700 +Thu, 12 Feb 2015 09:11:05 -0700 +12 Feb 2015 11:21:26 -0500 +Thu, 12 Feb 2015 10:27:14 -0700 +Thu, 12 Feb 2015 11:21:51 -0700 +Thu, 12 Feb 2015 11:20:56 -0700 +Fri, 13 Feb 2015 01:37:30 +0400 +Fri, 13 Feb 2015 01:37:31 +0400 +Fri, 13 Feb 2015 01:37:40 +0400 +Fri, 13 Feb 2015 01:37:39 +0400 +Thu, 12 Feb 2015 16:50:23 -0500 +Thu, 12 Feb 2015 23:39:14 +0000 +Thu, 12 Feb 2015 19:43:33 -0500 +Thu, 12 Feb 2015 20:30:28 -0700 +Thu, 12 Feb 2015 21:28:31 -0800 +Fri, 13 Feb 2015 08:08:21 -0500 +Fri, 13 Feb 2015 07:29:19 -0500 +Fri, 13 Feb 2015 14:24:37 GMT +Fri, 13 Feb 2015 20:07:01 +0400 +Fri, 13 Feb 2015 20:07:01 +0400 +Fri, 13 Feb 2015 12:03:42 -0600 +Fri, 13 Feb 2015 10:44:50 -0800 +Fri, 13 Feb 2015 20:29:43 +0100 +Fri, 13 Feb 2015 14:45:52 -0500 +Fri, 13 Feb 2015 15:25:13 -0700 +Fri, 13 Feb 2015 15:38:04 -0700 +Fri, 13 Feb 2015 18:00:10 -0500 +Fri, 13 Feb 2015 17:37:08 -0700 +Sat, 14 Feb 2015 01:18:18 -0700 +Sat, 14 Feb 2015 02:08:23 -0700 +Sat, 14 Feb 2015 02:24:37 -0700 +Sat, 14 Feb 2015 02:57:22 -0700 +Sat, 14 Feb 2015 03:13:41 -0700 +Sat, 14 Feb 2015 20:16:03 +0400 +Sat, 14 Feb 2015 09:27:51 -0700 +Sat, 14 Feb 2015 08:26:34 -0800 +Sat, 14 Feb 2015 11:25:46 -0500 +Sat, 14 Feb 2015 11:45:23 -0500 +Sat, 14 Feb 2015 15:35:37 -0500 +Sat, 14 Feb 2015 16:12:27 -0600 +Sun, 15 Feb 2015 10:41:44 +0400 +Sun, 15 Feb 2015 11:26:44 +0000 +Sun, 15 Feb 2015 04:43:35 -0700 +Sun, 15 Feb 2015 06:58:53 -0700 +Sun, 15 Feb 2015 08:51:06 -0500 +Sun, 15 Feb 2015 09:10:26 -0500 +Sun, 15 Feb 2015 07:57:44 -0700 +Sun, 15 Feb 2015 08:14:00 -0700 +Sun, 15 Feb 2015 08:29:02 -0700 +Sun, 15 Feb 2015 08:45:35 -0700 +Sun, 15 Feb 2015 09:02:59 -0700 +Sun, 15 Feb 2015 09:08:55 -0700 +Sun, 15 Feb 2015 09:22:24 -0700 +Sun, 15 Feb 2015 08:24:17 -0800 +Sun, 15 Feb 2015 10:01:28 -0700 +Sun, 15 Feb 2015 09:12:28 -0800 +Sun, 15 Feb 2015 12:50:01 -0500 +Sun, 15 Feb 2015 10:51:51 -0700 +Sun, 15 Feb 2015 11:37:01 -0700 +Sun, 15 Feb 2015 10:07:50 -0800 +Sun, 15 Feb 2015 10:00:29 -0800 +Sun, 15 Feb 2015 10:51:38 -0800 +Sun, 15 Feb 2015 11:06:14 -0800 +Sun, 15 Feb 2015 19:43:48 +0100 +Sun, 15 Feb 2015 11:41:50 -0700 +Sun, 15 Feb 2015 11:29:25 -0800 +Sun, 15 Feb 2015 14:59:45 -0500 +Sun, 15 Feb 2015 13:27:25 -0800 +Sun, 15 Feb 2015 15:47:07 -0800 +Sun, 15 Feb 2015 18:50:09 -0500 +Sun, 15 Feb 2015 17:48:23 -0700 +Sun, 15 Feb 2015 18:22:42 -0700 +Sun, 15 Feb 2015 18:36:13 -0700 +Sun, 15 Feb 2015 19:05:35 -0700 +Sun, 15 Feb 2015 19:34:39 -0700 +Sun, 15 Feb 2015 19:48:35 -0700 +Sun, 15 Feb 2015 20:16:29 -0700 +Mon, 16 Feb 2015 05:17:51 +0000 +Mon, 16 Feb 2015 05:25:48 +0000 +Mon, 16 Feb 2015 00:29:51 -0700 +Mon, 16 Feb 2015 00:50:38 -0700 +Mon, 16 Feb 2015 01:46:08 -0700 +Mon, 16 Feb 2015 02:01:28 -0700 +Mon, 16 Feb 2015 02:32:12 -0700 +Mon, 16 Feb 2015 04:29:23 -0500 +Mon, 16 Feb 2015 04:14:14 -0500 +Mon, 16 Feb 2015 02:46:44 -0700 +Mon, 16 Feb 2015 04:46:34 -0500 +Mon, 16 Feb 2015 03:02:38 -0700 +Mon, 16 Feb 2015 03:32:25 -0700 +Mon, 16 Feb 2015 03:46:41 -0700 +Mon, 16 Feb 2015 04:00:48 -0700 +Mon, 16 Feb 2015 04:15:16 -0700 +Mon, 16 Feb 2015 04:30:18 -0700 +Mon, 16 Feb 2015 04:44:57 -0700 +Mon, 16 Feb 2015 12:09:36 +0000 +Mon, 16 Feb 2015 07:35:10 -0500 +Mon, 16 Feb 2015 07:37:37 -0500 +Mon, 16 Feb 2015 06:48:11 -0700 +Mon, 16 Feb 2015 10:09:46 -0500 +Mon, 16 Feb 2015 07:28:20 -0800 +Mon, 16 Feb 2015 11:22:43 -0500 +Mon, 16 Feb 2015 17:00:56 +0000 +Mon, 16 Feb 2015 13:25:50 -0500 +Mon, 16 Feb 2015 13:52:21 -0500 +Mon, 16 Feb 2015 12:39:19 -0700 +Mon, 16 Feb 2015 07:13:11 -0700 +Mon, 16 Feb 2015 14:15:17 -0700 +Mon, 16 Feb 2015 14:31:39 -0700 +Mon, 16 Feb 2015 15:03:57 -0700 +Mon, 16 Feb 2015 15:34:21 -0700 +Mon, 16 Feb 2015 16:07:10 -0700 +Mon, 16 Feb 2015 20:16:31 -0500 +Mon, 16 Feb 2015 19:20:42 -0700 +Mon, 16 Feb 2015 20:46:28 -0700 +Tue, 17 Feb 2015 01:05:29 -0500 +Mon, 16 Feb 2015 23:11:56 -0700 +Mon, 16 Feb 2015 23:33:34 -0700 +Mon, 16 Feb 2015 23:55:51 -0700 +Tue, 17 Feb 2015 03:06:22 -0500 +Tue, 17 Feb 2015 03:55:10 -0500 +Tue, 17 Feb 2015 03:03:47 -0700 +Tue, 17 Feb 2015 05:14:48 -0500 +Tue, 17 Feb 2015 07:00:14 -0500 +Tue, 17 Feb 2015 08:10:03 -0500 +Tue, 17 Feb 2015 09:16:20 -0500 +Tue, 17 Feb 2015 07:45:12 -0500 +Tue, 17 Feb 2015 09:41:13 -0500 +Tue, 17 Feb 2015 09:03:13 -0700 +Tue, 17 Feb 2015 09:39:38 -0700 +Tue, 17 Feb 2015 08:43:10 -0800 +Tue, 17 Feb 2015 08:45:00 -0800 +Tue, 17 Feb 2015 09:02:30 -0800 +Tue, 17 Feb 2015 10:15:34 -0700 +Tue, 17 Feb 2015 09:30:41 -0800 +Tue, 17 Feb 2015 09:33:21 -0800 +Tue, 17 Feb 2015 12:58:34 -0500 +Tue, 17 Feb 2015 11:16:20 -0700 +Tue, 17 Feb 2015 11:22:37 -0700 +Tue, 17 Feb 2015 11:36:41 -0700 +Tue, 17 Feb 2015 12:08:59 -0700 +Tue, 17 Feb 2015 12:15:01 -0700 +Tue, 17 Feb 2015 12:26:08 -0700 +Tue, 17 Feb 2015 11:32:04 -0800 +Tue, 17 Feb 2015 12:43:56 -0700 +Tue, 17 Feb 2015 06:00:47 -0700 +Tue, 17 Feb 2015 13:21:16 -0700 +Tue, 17 Feb 2015 12:42:10 -0800 +Tue, 17 Feb 2015 13:48:26 -0700 +Tue, 17 Feb 2015 13:00:55 -0800 +Tue, 17 Feb 2015 14:10:45 -0700 +Tue, 17 Feb 2015 16:50:26 -0500 +Tue, 17 Feb 2015 15:59:08 -0700 +Tue, 17 Feb 2015 16:18:40 -0700 +Tue, 17 Feb 2015 16:52:07 -0700 +Tue, 17 Feb 2015 17:07:53 -0700 +Tue, 17 Feb 2015 16:08:27 -0700 +Tue, 17 Feb 2015 17:25:24 -0700 +Tue, 17 Feb 2015 17:42:17 -0700 +Sun, 15 Feb 2015 17:19:40 +0200 +Sun, 15 Feb 2015 10:52:47 -0500 +Sun, 15 Feb 2015 12:34:31 -0500 +Sun, 15 Feb 2015 14:51:01 -0500 +Sun, 15 Feb 2015 15:26:45 -0500 +Sun, 15 Feb 2015 13:03:25 -0800 +Sun, 15 Feb 2015 21:34:37 +0000 +Sun, 15 Feb 2015 17:19:21 -0500 +Mon, 16 Feb 2015 09:18:21 +0900 +Mon, 16 Feb 2015 00:08:04 -0700 +Mon, 16 Feb 2015 05:54:13 +0200 +Mon, 16 Feb 2015 02:13:41 +0200 +Mon, 16 Feb 2015 03:17:50 -0700 +Mon, 16 Feb 2015 06:36:06 -0500 +Mon, 16 Feb 2015 07:18:58 -0500 +Mon, 16 Feb 2015 05:48:26 -0700 +Mon, 16 Feb 2015 08:44:45 -0500 +Mon, 16 Feb 2015 09:57:38 -0500 +Mon, 16 Feb 2015 15:01:15 +0000 +Mon, 16 Feb 2015 15:04:59 +0000 +Mon, 16 Feb 2015 15:08:33 +0000 +Mon, 16 Feb 2015 08:26:22 -0700 +Mon, 16 Feb 2015 10:43:13 -0500 +Mon, 16 Feb 2015 08:48:06 -0700 +Mon, 16 Feb 2015 10:16:38 -0700 +Mon, 16 Feb 2015 10:36:35 -0700 +Mon, 16 Feb 2015 11:02:03 -0700 +Mon, 16 Feb 2015 13:08:18 -0500 +Mon, 16 Feb 2015 18:18:24 +0000 +Mon, 16 Feb 2015 11:28:41 -0700 +Mon, 16 Feb 2015 11:46:12 -0700 +Mon, 16 Feb 2015 12:03:48 -0700 +Mon, 16 Feb 2015 12:22:27 -0700 +Mon, 16 Feb 2015 15:49:58 -0500 +Mon, 16 Feb 2015 16:21:15 -0500 +Tue, 17 Feb 2015 04:00:04 +0400 +Tue, 17 Feb 2015 04:00:04 +0400 +Mon, 16 Feb 2015 16:10:41 -0800 +Tue, 17 Feb 2015 04:15:07 +0400 +Tue, 17 Feb 2015 04:15:07 +0400 +Mon, 16 Feb 2015 17:40:58 -0700 +Mon, 16 Feb 2015 18:02:18 -0700 +Tue, 17 Feb 2015 05:11:17 +0400 +Tue, 17 Feb 2015 05:11:18 +0400 +Mon, 16 Feb 2015 18:46:29 -0700 +Mon, 16 Feb 2015 19:02:32 -0700 +Mon, 16 Feb 2015 19:37:00 -0700 +Mon, 16 Feb 2015 19:54:38 -0700 +Tue, 17 Feb 2015 04:42:03 GMT +Tue, 17 Feb 2015 07:00:48 +0000 +Tue, 17 Feb 2015 11:07:04 +0400 +Tue, 17 Feb 2015 01:16:47 -0700 +Tue, 17 Feb 2015 01:37:36 -0700 +Tue, 17 Feb 2015 12:19:35 +0000 +Tue, 17 Feb 2015 08:26:02 -0500 +Tue, 17 Feb 2015 10:09:09 -0500 +Tue, 17 Feb 2015 08:53:10 -0700 +Tue, 17 Feb 2015 09:42:08 -0700 +Tue, 17 Feb 2015 09:57:48 -0700 +17 Feb 2015 12:03:59 -0500 +Tue, 17 Feb 2015 21:14:21 +0400 +Tue, 17 Feb 2015 21:14:21 +0400 +Tue, 17 Feb 2015 21:19:17 +0400 +Tue, 17 Feb 2015 21:19:17 +0400 +Tue, 17 Feb 2015 18:23:55 +0100 +Tue, 17 Feb 2015 10:55:28 -0700 +Tue, 17 Feb 2015 13:32:01 -0500 +Tue, 17 Feb 2015 14:40:27 -0500 +Tue, 17 Feb 2015 13:25:22 -0700 +Tue, 17 Feb 2015 22:50:04 +0200 +Tue, 17 Feb 2015 15:54:39 -0500 +Tue, 17 Feb 2015 16:04:59 -0500 +Wed, 18 Feb 2015 01:22:03 +0400 +Wed, 18 Feb 2015 01:22:03 +0400 +Tue, 17 Feb 2015 14:54:22 -0700 +Tue, 17 Feb 2015 15:28:02 -0700 +Tue, 17 Feb 2015 17:58:20 -0700 +Thu, 01 Jan 2009 11:18:47 -0700 +Thu, 01 Jan 2009 13:29:03 -0700 +Thu, 01 Jan 2009 13:38:55 -0700 +Fri, 2 Jan 2009 08:39:25 -0800 +Fri, 2 Jan 2009 11:31:09 -0700 +Mon, 05 Jan 2009 15:28:44 -0700 +Wed, 07 Jan 2009 10:18:53 +0200 +Wed, 07 Jan 2009 11:47:13 -0700 +Thu, 08 Jan 2009 13:02:12 -0300 +Thu, 08 Jan 2009 11:54:13 -0700 +Thu, 8 Jan 2009 23:12:37 -0300 +Thu, 08 Jan 2009 21:15:22 -0700 +Thu, 15 Jan 2009 18:43:37 -0700 +Wed, 21 Jan 2009 11:42:10 -0700 +Thu, 22 Jan 2009 12:45:48 -0300 +Thu, 22 Jan 2009 09:02:21 -0700 +Thu, 22 Jan 2009 09:12:07 -0700 +Thu, 22 Jan 2009 09:41:30 -0700 +Sat, 24 Jan 2009 12:14:26 -0700 +Tue, 27 Jan 2009 13:09:12 -0700 +Fri, 30 Jan 2009 14:01:28 +0000 +Fri, 30 Jan 2009 08:22:01 -0700 +Fri, 30 Jan 2009 16:02:47 +0000 +Mon, 02 Feb 2009 12:44:40 -0700 +Mon, 02 Feb 2009 13:06:28 -0700 +Mon, 02 Feb 2009 13:11:54 -0700 +Mon, 02 Feb 2009 13:15:14 -0700 +Mon, 02 Feb 2009 13:21:12 -0700 +Wed, 04 Feb 2009 16:35:19 -0700 +Wed, 04 Feb 2009 17:07:32 -0700 +Wed, 04 Feb 2009 17:26:22 -0700 +Wed, 04 Feb 2009 19:17:25 -0700 +Sun, 08 Feb 2009 18:33:04 -0700 +Sun, 08 Feb 2009 20:44:04 -0700 +10 Feb 2009 13:51:28 -0500 +Wed, 11 Feb 2009 16:21:24 +0000 +Wed, 11 Feb 2009 18:59:35 -0700 +Thu, 19 Feb 2009 12:00:06 -0700 +Thu, 19 Feb 2009 14:24:27 -0600 +Thu, 19 Feb 2009 13:39:46 -0700 +19 Feb 2009 15:52:41 -0500 +Thu, 19 Feb 2009 14:33:04 -0700 +Fri, 20 Feb 2009 12:19:28 -0700 +Fri, 20 Feb 2009 12:31:13 -0700 +Fri, 20 Feb 2009 13:11:18 -0700 +Fri, 20 Feb 2009 14:50:14 -0700 +Fri, 20 Feb 2009 15:02:19 -0700 +Fri, 20 Feb 2009 16:38:55 -0700 +Sun, 22 Feb 2009 14:39:57 -0700 +Sun, 22 Feb 2009 15:15:36 -0700 +Mon, 23 Feb 2009 20:46:56 -0800 +Tue, 24 Feb 2009 09:29:19 -0600 +Tue, 24 Feb 2009 09:56:34 -0700 +Tue, 24 Feb 2009 14:05:20 -0700 +Tue, 24 Feb 2009 16:17:03 -0700 +Thu, 26 Feb 2009 14:22:03 -0700 +Fri, 27 Feb 2009 07:27:05 -0700 +Fri, 27 Feb 2009 11:53:56 -0700 +Fri, 27 Feb 2009 12:01:43 -0700 +Mon, 2 Mar 2009 11:28:41 -0600 +Mon, 02 Mar 2009 10:56:16 -0700 +Mon, 2 Mar 2009 12:25:31 -0600 +Mon, 02 Mar 2009 12:09:15 -0700 +02 Mar 2009 14:22:43 -0500 +Mon, 02 Mar 2009 14:23:16 -0700 +Mon, 2 Mar 2009 16:01:01 -0600 +Tue, 3 Mar 2009 10:00:44 -0500 +Tue, 03 Mar 2009 17:18:18 -0700 +Thu, 05 Mar 2009 23:46:56 +0000 +Tue, 17 Mar 2009 14:06:21 -0600 +Tue, 24 Mar 2009 10:51:54 -0600 +Tue, 24 Mar 2009 11:55:26 -0500 +Tue, 24 Mar 2009 12:50:00 -0600 +Tue, 24 Mar 2009 17:55:12 -0600 +Fri, 03 Apr 2009 14:06:55 -0600 +Sun, 05 Apr 2009 09:50:38 -0600 +Sun, 05 Apr 2009 10:08:56 -0600 +Sun, 05 Apr 2009 22:47:21 -0600 +Mon, 13 Apr 2009 19:36:59 -0600 +Tue, 14 Apr 2009 05:27:13 -0700 +Wed, 15 Apr 2009 12:35:02 -0600 +Wed, 15 Apr 2009 13:57:36 -0600 +Wed, 15 Apr 2009 15:13:47 -0600 +Wed, 15 Apr 2009 15:26:26 -0600 +Wed, 15 Apr 2009 15:44:13 -0600 +Sun, 19 Apr 2009 10:49:05 -0600 +Sun, 19 Apr 2009 12:19:16 -0600 +Sun, 19 Apr 2009 19:35:16 -0700 +Mon, 20 Apr 2009 18:05:02 -0600 +Mon, 20 Apr 2009 18:26:42 -0600 +Mon, 20 Apr 2009 18:49:05 -0600 +Fri, 1 May 2009 15:19:13 -0700 +Fri, 01 May 2009 17:25:09 -0600 +Mon, 4 May 2009 18:00:18 -0700 +Mon, 04 May 2009 19:15:33 -0600 +Tue, 05 May 2009 14:03:21 -0600 +Tue, 05 May 2009 22:34:27 -0600 +Wed, 06 May 2009 17:50:01 +0000 +Wed, 06 May 2009 12:28:30 -0600 +Wed, 06 May 2009 12:41:02 -0600 +Thu, 07 May 2009 15:50:04 +0000 +Sat, 09 May 2009 12:15:13 -0600 +Wed, 13 May 2009 22:20:49 -0600 +Thu, 14 May 2009 09:49:27 -0600 +Thu, 14 May 2009 11:02:53 -0600 +Mon, 18 May 2009 21:33:07 -0600 +Tue, 26 May 2009 16:07:10 -0400 +Tue, 26 May 2009 14:17:18 -0600 +Tue, 26 May 2009 17:22:33 -0400 +Tue, 26 May 2009 16:19:15 -0600 +Tue, 26 May 2009 20:07:21 -0400 +Tue, 26 May 2009 19:41:30 -0600 +Sun, 07 Jun 2009 14:41:09 -0600 +Tue, 09 Jun 2009 09:37:11 -0600 +Tue, 9 Jun 2009 23:03:08 -0400 +Wed, 10 Jun 2009 12:33:03 -0600 +Wed, 10 Jun 2009 16:28:17 -0400 +Thu, 11 Jun 2009 14:09:21 +0000 +Sun, 14 Jun 2009 13:52:35 -0700 +Mon, 15 Jun 2009 11:29:25 -0600 +Tue, 16 Jun 2009 13:57:44 -0600 +Thu, 25 Jun 2009 11:00:53 -0700 +Fri, 26 Jun 2009 09:19:54 -0600 +Sun, 28 Jun 2009 21:15:46 -0600 +Sun, 28 Jun 2009 21:21:46 -0600 +Sun, 28 Jun 2009 21:27:01 -0600 +Mon, 29 Jun 2009 10:08:11 -0600 +Wed, 01 Jul 2009 16:43:31 +0000 +Sun, 12 Jul 2009 18:04:51 -0600 +12 Jul 2009 20:11:00 -0400 +Sun, 12 Jul 2009 18:24:35 -0600 +12 Jul 2009 20:45:12 -0400 +Sun, 12 Jul 2009 19:24:13 -0600 +12 Jul 2009 21:52:19 -0400 +Sat, 18 Jul 2009 03:16:05 +0530 +Fri, 17 Jul 2009 16:12:28 -0600 +Wed, 22 Jul 2009 19:37:43 -0600 +Wed, 22 Jul 2009 19:42:59 -0600 +Thu, 23 Jul 2009 03:36:38 -0500 +Fri, 24 Jul 2009 15:53:51 -0600 +Sat, 25 Jul 2009 00:30:21 -0600 +Sat, 25 Jul 2009 03:19:36 -0600 +Sat, 25 Jul 2009 08:13:57 -0600 +Sat, 25 Jul 2009 11:22:28 -0600 +Sat, 25 Jul 2009 15:59:49 -0600 +Sat, 25 Jul 2009 16:45:34 -0600 +Sat, 25 Jul 2009 17:30:21 -0600 +Sun, 26 Jul 2009 08:28:34 -0600 +Sat, 01 Aug 2009 15:40:25 -0600 +Sun, 02 Aug 2009 10:57:33 -0600 +Sun, 02 Aug 2009 12:08:39 -0600 +Sun, 02 Aug 2009 12:14:45 -0600 +Sun, 02 Aug 2009 17:56:39 -0600 +Mon, 03 Aug 2009 08:57:17 -0600 +Mon, 03 Aug 2009 11:12:03 -0600 +Mon, 03 Aug 2009 14:38:36 -0600 +Mon, 03 Aug 2009 17:04:11 -0600 +Mon, 3 Aug 2009 21:41:24 -0400 +3 Aug 2009 23:40:03 -0400 +Tue, 04 Aug 2009 08:16:35 -0600 +Tue, 04 Aug 2009 16:32:54 -0600 +Tue, 04 Aug 2009 16:53:17 -0600 +Tue, 04 Aug 2009 17:40:36 -0600 +Tue, 04 Aug 2009 17:47:28 -0600 +Tue, 04 Aug 2009 17:54:38 -0600 +Tue, 04 Aug 2009 18:02:26 -0600 +Tue, 04 Aug 2009 18:17:48 -0600 +Wed, 5 Aug 2009 10:24:52 +0100 +Wed, 5 Aug 2009 10:26:49 +0100 +Wed, 05 Aug 2009 05:47:09 -0600 +Wed, 05 Aug 2009 05:52:12 -0600 +Thu, 06 Aug 2009 12:46:28 -0600 +Fri, 07 Aug 2009 16:15:06 -0600 +Sat, 8 Aug 2009 08:22:42 -0600 +Sun, 09 Aug 2009 16:06:06 -0600 +Sun, 09 Aug 2009 16:48:40 -0600 +Thu, 13 Aug 2009 10:07:51 -0600 +Sat, 15 Aug 2009 14:13:03 -0600 +Tue, 18 Aug 2009 13:57:52 -0600 +Tue, 18 Aug 2009 18:02:33 -0600 +Wed, 19 Aug 2009 09:21:46 -0600 +Wed, 19 Aug 2009 10:29:24 -0600 +Wed, 19 Aug 2009 21:08:58 -0600 +Wed, 19 Aug 2009 21:10:57 -0600 +Wed, 19 Aug 2009 21:17:39 -0600 +Wed, 19 Aug 2009 21:21:23 -0600 +Mon, 07 Sep 2009 20:54:14 -0600 +Mon, 07 Sep 2009 22:18:58 -0600 +Thu, 17 Sep 2009 17:07:01 -0600 +Fri, 18 Sep 2009 17:43:17 +0000 +Fri, 18 Sep 2009 11:48:45 -0600 +Mon, 21 Sep 2009 10:00:57 -0600 +Mon, 21 Sep 2009 12:26:22 -0600 +Mon, 21 Sep 2009 23:02:59 -0600 +Wed, 23 Sep 2009 10:05:17 -0600 +Wed, 23 Sep 2009 12:46:13 -0600 +Sun, 27 Sep 2009 10:45:38 -0600 +Sun, 27 Sep 2009 10:55:45 -0600 +Sun, 27 Sep 2009 11:00:39 -0600 +Sun, 27 Sep 2009 11:08:58 -0600 +Thu, 1 Oct 2009 09:16:44 +0300 +2 Oct 2009 19:00:09 -0400 +3 Oct 2009 13:45:07 -0400 +Wed, 07 Oct 2009 11:48:00 -0600 +Wed, 7 Oct 2009 13:58:17 -0600 +Wed, 14 Oct 2009 10:12:45 -0600 +Wed, 14 Oct 2009 18:13:48 -0600 +Wed, 14 Oct 2009 18:30:13 -0600 +Fri, 16 Oct 2009 18:46:33 -0700 +Sat, 17 Oct 2009 16:16:08 -0600 +Mon, 19 Oct 2009 11:12:51 -0600 +Mon, 19 Oct 2009 17:15:07 -0700 +Tue, 20 Oct 2009 11:02:57 -0600 +Sat, 24 Oct 2009 10:46:04 -0600 +Sat, 24 Oct 2009 10:55:06 -0600 +Sun, 25 Oct 2009 08:30:45 -0300 +Sun, 25 Oct 2009 11:44:22 -0600 +Thu, 29 Oct 2009 09:33:56 -0600 +Thu, 29 Oct 2009 10:30:23 -0600 +Thu, 29 Oct 2009 11:03:34 -0600 +Sat, 31 Oct 2009 17:14:24 -0600 +Sun, 01 Nov 2009 10:12:13 -0700 +Sun, 01 Nov 2009 21:13:30 -0700 +Sun, 01 Nov 2009 21:16:47 -0700 +Tue, 03 Nov 2009 21:27:30 -0700 +Wed, 04 Nov 2009 08:03:08 -0700 +Wed, 04 Nov 2009 14:14:25 -0700 +Wed, 04 Nov 2009 21:17:28 -0700 +Thu, 05 Nov 2009 10:27:53 -0700 +Thu, 05 Nov 2009 11:09:54 -0700 +Thu, 05 Nov 2009 11:15:29 -0700 +Thu, 05 Nov 2009 11:32:40 -0700 +Fri, 06 Nov 2009 09:04:26 -0300 +Fri, 06 Nov 2009 11:02:00 -0700 +Fri, 06 Nov 2009 13:30:53 -0700 +Fri, 06 Nov 2009 14:54:13 -0700 +Fri, 06 Nov 2009 22:50:16 -0700 +Sun, 08 Nov 2009 17:57:38 -0700 +Sun, 08 Nov 2009 18:50:13 -0700 +Sun, 08 Nov 2009 22:19:55 -0700 +Mon, 09 Nov 2009 08:18:51 -0700 +Mon, 09 Nov 2009 08:28:57 -0700 +Mon, 9 Nov 2009 22:14:36 -0300 +Thu, 19 Nov 2009 21:07:05 -0700 +Fri, 20 Nov 2009 18:57:33 -0700 +Fri, 20 Nov 2009 21:57:33 -0700 +Wed, 25 Nov 2009 12:43:20 -0700 +Wed, 25 Nov 2009 14:11:07 -0700 +Sat, 05 Dec 2009 12:47:19 -0700 +Sat, 05 Dec 2009 14:11:31 -0700 +Sat, 05 Dec 2009 16:10:31 -0700 +Sun, 06 Dec 2009 00:15:15 -0700 +Sun, 06 Dec 2009 13:00:31 -0700 +Sun, 06 Dec 2009 14:15:07 -0700 +Sun, 06 Dec 2009 14:43:04 -0700 +Sun, 06 Dec 2009 14:52:57 -0700 +Sun, 06 Dec 2009 15:53:39 -0700 +Sun, 06 Dec 2009 16:16:02 -0700 +Sun, 06 Dec 2009 16:29:05 -0700 +Sun, 06 Dec 2009 16:46:40 -0700 +Sun, 06 Dec 2009 17:04:25 -0700 +Sun, 06 Dec 2009 19:06:56 -0700 +Sat, 12 Dec 2009 12:29:21 -0700 +Sat, 12 Dec 2009 12:45:06 -0700 +Sun, 13 Dec 2009 11:05:55 -0700 +Sun, 13 Dec 2009 14:46:10 -0700 +Mon, 14 Dec 2009 10:53:07 -0700 +Mon, 14 Dec 2009 21:21:17 +0300 +Mon, 14 Dec 2009 11:38:10 -0700 +Mon, 14 Dec 2009 12:49:52 -0700 +Mon, 14 Dec 2009 23:04:15 +0300 +Wed, 16 Dec 2009 14:22:11 -0600 +Tue, 22 Dec 2009 08:25:00 -0700 +Thu, 24 Dec 2009 15:45:35 -0700 +Fri, 25 Dec 2009 12:41:21 -0700 +Thu, 31 Dec 2009 10:40:13 -0700 +Thu, 31 Dec 2009 12:49:18 -0700 +Thu, 31 Dec 2009 13:30:33 -0700 +Thu, 31 Dec 2009 13:44:24 -0700 +Thu, 31 Dec 2009 13:49:25 -0700 +Thu, 31 Dec 2009 15:10:52 -0800 +Thu, 31 Dec 2009 19:39:30 -0700 +Thu, 31 Dec 2009 19:43:34 -0700 +Thu, 31 Dec 2009 19:58:27 -0700 +Fri, 01 Jan 2010 12:14:40 -0300 +Fri, 01 Jan 2010 10:59:07 -0700 +Fri, 01 Jan 2010 12:45:16 -0700 +Sat, 02 Jan 2010 16:26:04 -0700 +Mon, 04 Jan 2010 09:35:30 -0700 +Mon, 04 Jan 2010 10:30:10 -0700 +Mon, 04 Jan 2010 11:41:14 -0700 +Tue, 12 Jan 2010 11:50:35 -0700 +Tue, 12 Jan 2010 12:11:55 -0700 +Tue, 12 Jan 2010 14:36:40 -0700 +Tue, 12 Jan 2010 21:38:34 -0700 +Wed, 13 Jan 2010 09:53:08 -0700 +Fri, 15 Jan 2010 20:42:47 -0700 +Sat, 16 Jan 2010 23:26:44 -0700 +Sun, 17 Jan 2010 09:01:09 -0700 +Mon, 01 Feb 2010 16:05:15 -0700 +Wed, 03 Feb 2010 19:06:05 -0700 +Wed, 03 Feb 2010 21:00:56 -0700 +Wed, 03 Feb 2010 21:13:30 -0700 +Thu, 4 Feb 2010 18:07:25 -0600 +Fri, 05 Feb 2010 18:06:09 -0700 +Fri, 05 Feb 2010 18:15:46 -0700 +Fri, 05 Feb 2010 22:49:35 -0300 +Sat, 6 Feb 2010 06:57:04 -0800 +Sat, 06 Feb 2010 13:49:23 -0700 +Sun, 07 Feb 2010 11:42:21 -0700 +Tue, 09 Feb 2010 22:05:24 -0700 +Wed, 10 Feb 2010 00:27:51 -0700 +Wed, 10 Feb 2010 16:24:46 -0700 +Wed, 10 Feb 2010 21:32:28 -0700 +Thu, 11 Feb 2010 18:32:04 -0700 +Sat, 13 Feb 2010 13:29:05 -0700 +Mon, 15 Feb 2010 15:15:14 -0700 +Wed, 17 Feb 2010 10:52:35 -0700 +Wed, 17 Feb 2010 13:24:45 -0700 +Wed, 17 Feb 2010 17:55:15 -0700 +Wed, 17 Feb 2010 18:07:01 -0700 +Thu, 18 Feb 2010 11:23:22 -0700 +Thu, 18 Feb 2010 11:38:48 -0700 +Thu, 18 Feb 2010 19:53:03 -0800 +Fri, 19 Feb 2010 10:13:23 -0800 +Mon, 22 Feb 2010 17:06:07 -0800 +Fri, 26 Feb 2010 14:03:39 -0800 +Fri, 26 Feb 2010 15:26:29 -0700 +Sat, 27 Feb 2010 08:48:19 -0700 +Sat, 27 Feb 2010 08:51:14 -0700 +Sat, 27 Feb 2010 07:54:49 -0800 +Sat, 27 Feb 2010 08:02:42 -0800 +Sat, 27 Feb 2010 09:21:30 -0700 +Sat, 27 Feb 2010 09:23:51 -0700 +Sat, 27 Feb 2010 11:58:40 -0800 +Sat, 27 Feb 2010 13:05:51 -0700 +Sat, 27 Feb 2010 13:30:10 -0800 +Sat, 27 Feb 2010 13:51:46 -0800 +Sat, 27 Feb 2010 17:40:52 -0700 +Sun, 28 Feb 2010 07:52:36 -0800 +Sun, 28 Feb 2010 09:22:43 -0700 +Sun, 28 Feb 2010 14:18:39 -0800 +Sun, 28 Feb 2010 15:28:11 -0700 +Mon, 1 Mar 2010 11:21:30 -0800 +Mon, 01 Mar 2010 14:22:12 -0700 +Wed, 03 Mar 2010 19:12:34 -0700 +Wed, 03 Mar 2010 19:17:48 -0700 +3 Mar 2010 23:45:06 -0500 +Wed, 03 Mar 2010 22:44:36 -0700 +Thu, 04 Mar 2010 11:25:27 -0700 +Fri, 05 Mar 2010 13:08:16 -0700 +Fri, 05 Mar 2010 13:18:24 -0700 +Wed, 10 Mar 2010 10:56:45 -0300 +Wed, 10 Mar 2010 17:25:03 -0700 +Wed, 10 Mar 2010 20:45:29 -0700 +Thu, 11 Mar 2010 09:10:01 -0700 +Tue, 16 Mar 2010 09:33:34 -0700 +Fri, 19 Mar 2010 16:30:42 -0400 +Sun, 21 Mar 2010 16:56:12 -0600 +Sun, 21 Mar 2010 22:12:46 -0600 +Mon, 22 Mar 2010 20:34:38 -0600 +Tue, 23 Mar 2010 17:13:26 -0600 +Sun, 28 Mar 2010 14:06:30 -0700 +Thu, 15 Apr 2010 17:38:01 +0300 +Thu, 15 Apr 2010 09:43:17 -0500 +Thu, 15 Apr 2010 12:09:55 -0500 +Fri, 16 Apr 2010 13:11:21 +0300 +Fri, 16 Apr 2010 19:38:45 -0500 +Sat, 17 Apr 2010 17:16:06 -0700 +Fri, 23 Apr 2010 12:31:07 -0700 +Fri, 23 Apr 2010 12:37:38 -0700 +Fri, 23 Apr 2010 12:40:00 -0700 +Tue, 27 Apr 2010 19:09:45 -0600 +Tue, 27 Apr 2010 23:34:13 -0600 +Fri, 30 Apr 2010 04:28:38 -0400 +Fri, 30 Apr 2010 23:45:19 -0600 +Sun, 02 May 2010 11:59:23 -0600 +Mon, 03 May 2010 00:04:46 -0600 +Wed, 05 May 2010 18:36:32 -0600 +Wed, 05 May 2010 22:26:50 -0600 +Thu, 06 May 2010 15:12:22 -0600 +Thu, 06 May 2010 16:12:58 -0600 +Thu, 06 May 2010 16:37:33 -0600 +Thu, 06 May 2010 17:10:08 -0600 +Thu, 06 May 2010 18:06:29 -0600 +Thu, 06 May 2010 18:35:03 -0600 +Thu, 06 May 2010 18:48:15 -0600 +Thu, 06 May 2010 20:57:54 -0600 +Thu, 06 May 2010 22:18:40 -0600 +Thu, 06 May 2010 22:20:01 -0600 +Fri, 07 May 2010 13:04:05 -0600 +Fri, 07 May 2010 13:19:45 -0600 +Fri, 07 May 2010 14:23:11 -0600 +Fri, 07 May 2010 14:41:29 -0600 +Fri, 07 May 2010 17:52:04 -0600 +Wed, 12 May 2010 09:02:57 -0600 +Wed, 12 May 2010 09:06:08 -0600 +Wed, 12 May 2010 10:34:04 -0600 +Wed, 12 May 2010 11:42:16 -0600 +Wed, 12 May 2010 13:11:36 -0600 +Wed, 12 May 2010 13:57:44 -0600 +Thu, 13 May 2010 12:08:21 -0600 +Thu, 13 May 2010 22:38:22 -0600 +Thu, 13 May 2010 22:58:37 -0600 +Thu, 13 May 2010 23:57:42 -0600 +Fri, 14 May 2010 08:06:08 -0600 +Sat, 15 May 2010 09:33:55 -0600 +Sat, 15 May 2010 10:09:11 -0600 +Sun, 16 May 2010 08:06:12 -0600 +Sun, 16 May 2010 11:34:45 -0600 +Sun, 16 May 2010 12:39:37 -0600 +Sun, 16 May 2010 23:44:31 -0600 +Sat, 22 May 2010 23:07:47 -0600 +Fri, 28 May 2010 14:11:32 -0600 +Fri, 28 May 2010 15:17:29 -0600 +Fri, 28 May 2010 20:49:03 -0600 +Fri, 28 May 2010 23:41:23 -0600 +Sat, 29 May 2010 12:55:47 -0600 +Sat, 29 May 2010 13:08:02 -0600 +Sat, 29 May 2010 17:46:07 -0600 +Mon, 31 May 2010 12:45:24 -0600 +Mon, 31 May 2010 16:06:36 -0600 +Mon, 31 May 2010 16:18:42 -0600 +Mon, 31 May 2010 16:42:38 -0600 +Mon, 31 May 2010 20:53:07 -0600 +Tue, 01 Jun 2010 08:57:28 -0400 +Tue, 01 Jun 2010 09:58:31 -0600 +Tue, 1 Jun 2010 20:14:46 -0600 +Tue, 01 Jun 2010 21:07:43 -0600 +Thu, 03 Jun 2010 12:51:22 -0600 +Thu, 3 Jun 2010 21:26:29 -0600 +Fri, 04 Jun 2010 15:28:11 -0600 +Sat, 5 Jun 2010 00:50:18 +0000 +Fri, 04 Jun 2010 19:47:06 -0600 +Tue, 8 Jun 2010 05:57:02 -0700 +Tue, 08 Jun 2010 08:02:34 -0600 +Tue, 8 Jun 2010 21:30:25 -0600 +Tue, 8 Jun 2010 22:25:02 -0600 +Thu, 10 Jun 2010 16:00:40 +1100 +Thu, 10 Jun 2010 10:03:40 -0600 +Thu, 10 Jun 2010 10:25:33 -0700 +Thu, 10 Jun 2010 12:06:46 -0600 +Fri, 11 Jun 2010 22:29:16 EDT +Sun, 13 Jun 2010 20:56:32 -0600 +Wed, 16 Jun 2010 21:43:19 +0200 +Thu, 17 Jun 2010 09:56:43 -0700 +Thu, 17 Jun 2010 11:40:05 -0600 +Fri, 18 Jun 2010 16:00:11 -0600 +Fri, 18 Jun 2010 22:25:45 -0600 +Sat, 19 Jun 2010 09:09:24 -0600 +Sun, 20 Jun 2010 19:14:29 -0600 +Sun, 20 Jun 2010 20:15:23 -0600 +Sun, 20 Jun 2010 21:24:47 -0600 +Sun, 20 Jun 2010 21:37:42 -0600 +Mon, 21 Jun 2010 14:29:40 -0600 +Mon, 21 Jun 2010 16:17:17 -0600 +Mon, 21 Jun 2010 21:48:12 -0600 +Mon, 21 Jun 2010 22:23:31 -0600 +Mon, 21 Jun 2010 23:10:58 -0600 +Mon, 21 Jun 2010 23:19:31 -0600 +Tue, 22 Jun 2010 11:23:26 -0600 +Wed, 23 Jun 2010 11:42:36 -0600 +Thu, 24 Jun 2010 00:04:37 -0600 +Thu, 24 Jun 2010 09:19:53 -0600 +Thu, 24 Jun 2010 12:02:03 -0600 +Thu, 24 Jun 2010 12:11:01 -0600 +Fri, 25 Jun 2010 13:20:27 -0700 +Fri, 25 Jun 2010 14:36:19 -0600 +Fri, 25 Jun 2010 17:13:50 -0600 +Sat, 26 Jun 2010 20:54:41 -0600 +Sun, 27 Jun 2010 15:58:50 -0600 +Sun, 27 Jun 2010 16:08:06 -0600 +Tue, 29 Jun 2010 11:56:13 -0600 +Tue, 29 Jun 2010 13:53:15 -0700 +Tue, 29 Jun 2010 18:47:44 -0700 +Tue, 29 Jun 2010 20:45:33 -0600 +Wed, 30 Jun 2010 21:59:08 -0600 +Thu, 1 Jul 2010 14:52:13 -0700 +Thu, 1 Jul 2010 16:23:01 -0700 +Fri, 2 Jul 2010 08:35:14 -0700 +Mon, 5 Jul 2010 12:27:20 -0600 +Tue, 06 Jul 2010 15:02:25 +0000 +Fri, 09 Jul 2010 00:08:12 -0600 +Sun, 11 Jul 2010 20:53:47 -0600 +Mon, 12 Jul 2010 05:54:08 -0700 +Tue, 13 Jul 2010 11:07:31 -0600 +Tue, 13 Jul 2010 14:57:32 -0600 +Tue, 13 Jul 2010 18:03:38 -0600 +Tue, 13 Jul 2010 17:14:54 -0700 +Tue, 13 Jul 2010 18:23:08 -0600 +Wed, 14 Jul 2010 17:06:58 -0600 +Thu, 15 Jul 2010 10:34:31 -0600 +Sat, 17 Jul 2010 12:21:05 -0600 +Sat, 17 Jul 2010 12:45:56 -0600 +Sat, 17 Jul 2010 13:02:12 -0600 +Sun, 18 Jul 2010 17:26:50 -0600 +Mon, 19 Jul 2010 05:06:38 -0600 +Mon, 19 Jul 2010 11:31:14 -0400 +Tue, 20 Jul 2010 11:46:17 -0600 +Wed, 21 Jul 2010 04:05:48 -0400 +Wed, 21 Jul 2010 11:54:58 -0600 +Sat, 24 Jul 2010 11:01:44 -0600 +Sat, 24 Jul 2010 13:33:44 -0600 +Sat, 24 Jul 2010 16:42:11 -0600 +Mon, 26 Jul 2010 17:37:40 -0700 +Tue, 27 Jul 2010 22:06:40 -0600 +Wed, 28 Jul 2010 10:47:36 -0600 +Wed, 28 Jul 2010 11:29:25 -0600 +Wed, 28 Jul 2010 11:52:58 -0600 +Wed, 28 Jul 2010 12:41:59 -0600 +Wed, 28 Jul 2010 14:43:55 -0700 +Wed, 28 Jul 2010 21:28:33 -0600 +Thu, 29 Jul 2010 17:18:26 -0600 +Fri, 30 Jul 2010 08:56:36 -0600 +Fri, 30 Jul 2010 08:23:25 -0700 +Mon, 2 Aug 2010 11:00:07 -0700 +Mon, 02 Aug 2010 13:16:04 -0600 +Tue, 3 Aug 2010 14:26:44 -0600 +Wed, 04 Aug 2010 08:38:23 -0600 +Wed, 4 Aug 2010 08:24:56 -0700 +Wed, 04 Aug 2010 09:37:32 -0600 +Wed, 4 Aug 2010 14:12:28 -0700 +Fri, 06 Aug 2010 14:36:13 -0600 +Fri, 06 Aug 2010 16:33:17 -0600 +Fri, 6 Aug 2010 16:38:47 -0600 +Fri, 06 Aug 2010 17:45:30 -0600 +Mon, 09 Aug 2010 10:32:58 -0600 +Mon, 09 Aug 2010 20:17:38 -0600 +Mon, 09 Aug 2010 20:52:25 -0600 +Thu, 12 Aug 2010 07:17:22 -0400 +Thu, 12 Aug 2010 08:16:44 -0600 +Thu, 12 Aug 2010 09:02:06 -0600 +Thu, 12 Aug 2010 09:52:27 -0600 +Thu, 12 Aug 2010 10:17:11 -0600 +Thu, 12 Aug 2010 14:39:11 -0600 +Fri, 13 Aug 2010 13:51:09 -0600 +Fri, 13 Aug 2010 13:55:36 -0600 +Sun, 22 Aug 2010 09:41:09 -0600 +Mon, 23 Aug 2010 12:35:52 -0600 +Mon, 23 Aug 2010 12:53:47 -0600 +Mon, 23 Aug 2010 18:48:48 -0600 +Mon, 23 Aug 2010 19:14:12 -0600 +Mon, 23 Aug 2010 19:42:44 -0600 +Sat, 28 Aug 2010 19:56:33 -0700 +Sun, 29 Aug 2010 18:01:01 -0600 +Sun, 29 Aug 2010 19:09:17 -0600 +Mon, 30 Aug 2010 11:46:11 -0400 +Mon, 30 Aug 2010 10:53:28 -0600 +Mon, 30 Aug 2010 20:05:06 -0400 +Mon, 30 Aug 2010 18:31:17 -0600 +Mon, 30 Aug 2010 18:33:14 -0600 +Mon, 30 Aug 2010 20:58:18 -0400 +Tue, 31 Aug 2010 06:56:34 -0600 +Tue, 31 Aug 2010 06:46:46 -0700 +Tue, 31 Aug 2010 10:25:58 -0400 +Tue, 31 Aug 2010 10:27:53 -0400 +Tue, 31 Aug 2010 10:04:18 -0600 +Tue, 31 Aug 2010 20:22:59 -0600 +Thu, 2 Sep 2010 12:13:46 -0600 +Thu, 02 Sep 2010 14:26:11 -0600 +Sat, 04 Sep 2010 12:53:14 -0600 +Sun, 05 Sep 2010 16:42:51 -0600 +Tue, 07 Sep 2010 09:37:04 -0600 +Tue, 7 Sep 2010 14:32:30 -0600 +Tue, 07 Sep 2010 14:59:38 -0600 +Wed, 8 Sep 2010 08:07:02 -0600 +Wed, 8 Sep 2010 09:30:27 -0600 +Wed, 08 Sep 2010 09:41:49 -0600 +Thu, 9 Sep 2010 20:16:10 -0700 +Thu, 09 Sep 2010 21:43:28 -0600 +Thu, 9 Sep 2010 23:32:30 -0500 +Fri, 10 Sep 2010 07:52:50 -0600 +Fri, 10 Sep 2010 10:10:58 -0500 +Fri, 10 Sep 2010 08:54:19 -0700 +Fri, 10 Sep 2010 10:08:57 -0600 +Fri, 10 Sep 2010 09:25:17 -0700 +Sat, 11 Sep 2010 00:18:25 -0600 +Sat, 11 Sep 2010 08:26:04 -0600 +Sun, 12 Sep 2010 11:30:59 -0600 +Sun, 12 Sep 2010 11:32:33 -0600 +Sun, 12 Sep 2010 16:05:58 -0600 +Sun, 12 Sep 2010 18:53:13 -0600 +Sun, 12 Sep 2010 18:33:31 -0700 +Mon, 13 Sep 2010 14:13:23 +0200 +Mon, 13 Sep 2010 10:33:27 -0600 +Mon, 13 Sep 2010 11:18:14 -0600 +Mon, 13 Sep 2010 12:37:56 -0500 +Tue, 14 Sep 2010 14:12:10 -0600 +Wed, 15 Sep 2010 22:23:55 -0500 +Thu, 16 Sep 2010 11:38:02 -0600 +Thu, 16 Sep 2010 12:43:58 -0500 +Thu, 16 Sep 2010 12:12:42 -0600 +Thu, 16 Sep 2010 13:36:59 -0500 +Fri, 17 Sep 2010 18:49:57 -0600 +Sat, 18 Sep 2010 08:46:15 -0600 +Wed, 22 Sep 2010 13:26:43 -0700 +Wed, 22 Sep 2010 14:32:56 -0600 +Wed, 22 Sep 2010 20:40:16 -0600 +Sat, 25 Sep 2010 05:46:02 -0600 +Wed, 29 Sep 2010 15:40:08 -0700 +Wed, 29 Sep 2010 15:46:09 -0700 +Wed, 29 Sep 2010 17:06:33 -0600 +Wed, 29 Sep 2010 17:29:22 -0700 +Wed, 29 Sep 2010 22:18:44 -0600 +Tue, 5 Oct 2010 20:22:22 -0600 +Mon, 11 Oct 2010 09:56:04 -0600 +Mon, 11 Oct 2010 10:12:08 -0600 +Mon, 11 Oct 2010 23:55:19 -0600 +Tue, 12 Oct 2010 17:34:55 -0600 +Tue, 12 Oct 2010 18:16:45 -0600 +Tue, 12 Oct 2010 20:55:16 -0400 +Wed, 13 Oct 2010 11:29:44 -0600 +Wed, 13 Oct 2010 13:19:39 -0600 +Wed, 13 Oct 2010 15:24:32 -0400 +Fri, 15 Oct 2010 10:46:29 -0600 +Wed, 20 Oct 2010 13:05:24 -0600 +Wed, 20 Oct 2010 19:00:49 -0600 +Wed, 20 Oct 2010 19:36:24 -0600 +Thu, 21 Oct 2010 15:24:06 -0600 +Thu, 28 Oct 2010 12:37:16 -0500 +Fri, 29 Oct 2010 18:44:52 -0700 +Sat, 30 Oct 2010 08:18:55 -0600 +Sun, 31 Oct 2010 17:13:06 -0600 +Tue, 02 Nov 2010 14:43:47 -0600 +Tue, 02 Nov 2010 16:28:43 -0600 +Tue, 02 Nov 2010 18:03:07 -0600 +Wed, 03 Nov 2010 10:15:35 -0600 +Wed, 03 Nov 2010 10:46:07 -0600 +Wed, 03 Nov 2010 12:22:49 -0600 +Wed, 03 Nov 2010 12:34:38 -0600 +Thu, 04 Nov 2010 08:53:38 -0600 +Thu, 4 Nov 2010 10:58:41 -0500 +Fri, 05 Nov 2010 10:21:25 -0600 +Fri, 05 Nov 2010 11:08:34 -0600 +Sun, 7 Nov 2010 18:44:51 -0600 +Tue, 9 Nov 2010 15:09:19 -0800 +Tue, 09 Nov 2010 18:01:59 -0700 +Wed, 10 Nov 2010 10:44:17 -0700 +Wed, 10 Nov 2010 20:32:43 -0800 +Thu, 11 Nov 2010 12:37:51 -0700 +Fri, 12 Nov 2010 12:47:26 -0700 +Fri, 12 Nov 2010 12:51:05 -0700 +Fri, 12 Nov 2010 12:54:52 -0700 +Fri, 12 Nov 2010 13:08:44 -0700 +Thu, 18 Nov 2010 13:16:43 -0700 +Fri, 19 Nov 2010 11:09:02 -0700 +Sat, 20 Nov 2010 12:14:24 -0700 +Sat, 20 Nov 2010 21:30:21 -0700 +Sat, 20 Nov 2010 21:55:14 -0700 +Sun, 21 Nov 2010 10:59:14 -0700 +Sun, 21 Nov 2010 11:22:42 -0700 +Sun, 21 Nov 2010 11:40:59 -0700 +Mon, 29 Nov 2010 12:45:38 -0700 +29 Nov 2010 15:03:03 -0500 +Mon, 29 Nov 2010 18:11:45 -0700 +29 Nov 2010 20:43:34 -0500 +Wed, 01 Dec 2010 15:29:17 -0700 +Wed, 01 Dec 2010 16:26:20 -0700 +Wed, 01 Dec 2010 16:38:11 -0700 +Wed, 01 Dec 2010 17:53:31 -0700 +Thu, 02 Dec 2010 16:01:15 -0700 +Thu, 02 Dec 2010 21:03:56 -0700 +Thu, 02 Dec 2010 21:09:26 -0700 +Fri, 03 Dec 2010 19:27:22 -0700 +Sat, 11 Dec 2010 11:11:58 -0600 +Sun, 12 Dec 2010 15:25:30 -0800 +Sun, 12 Dec 2010 21:24:15 -0700 +Mon, 13 Dec 2010 14:30:41 -0800 +Tue, 14 Dec 2010 14:11:57 -0700 +Thu, 16 Dec 2010 16:07:58 -0800 +Fri, 17 Dec 2010 18:30:37 -0700 +Mon, 20 Dec 2010 15:57:06 -0800 +Mon, 20 Dec 2010 17:44:45 -0700 +Tue, 21 Dec 2010 15:47:58 -0800 +Sat, 01 Jan 2011 12:56:29 -0700 +Sat, 01 Jan 2011 15:41:41 -0700 +Sat, 1 Jan 2011 15:52:35 -0700 +Sun, 02 Jan 2011 15:02:30 -0700 +Tue, 4 Jan 2011 15:50:33 -0800 +Fri, 7 Jan 2011 18:18:33 -0800 +Fri, 07 Jan 2011 20:08:44 -0700 +Fri, 7 Jan 2011 19:29:59 -0800 +Fri, 07 Jan 2011 20:41:34 -0700 +Sun, 09 Jan 2011 13:53:56 -0700 +Sun, 9 Jan 2011 14:19:33 -0700 +Sun, 09 Jan 2011 15:54:20 -0700 +Sun, 09 Jan 2011 16:09:12 -0700 +Sun, 09 Jan 2011 16:14:33 -0700 +Mon, 10 Jan 2011 05:13:12 -0800 +Mon, 17 Jan 2011 10:53:01 -0800 +Mon, 17 Jan 2011 18:05:20 -0700 +Tue, 18 Jan 2011 12:21:57 -0700 +Fri, 21 Jan 2011 15:01:42 -0700 +Fri, 21 Jan 2011 15:29:21 -0700 +Tue, 25 Jan 2011 17:37:09 -0700 +25 Jan 2011 19:45:22 -0500 +Thu, 27 Jan 2011 18:11:12 -0700 +Sat, 29 Jan 2011 11:39:36 -0700 +Sat, 29 Jan 2011 17:33:35 -0700 +Sat, 29 Jan 2011 18:43:22 -0800 +Sun, 30 Jan 2011 12:59:53 -0700 +Sun, 30 Jan 2011 13:36:07 -0700 +Mon, 31 Jan 2011 10:24:29 -0800 +Mon, 31 Jan 2011 11:42:30 -0700 +Mon, 31 Jan 2011 16:54:42 -0800 +Mon, 31 Jan 2011 20:07:15 -0700 +Mon, 31 Jan 2011 21:29:27 -0600 +Tue, 01 Feb 2011 20:32:25 -0700 +Thu, 3 Feb 2011 10:40:11 -0800 +Sun, 6 Feb 2011 12:37:33 -0800 +Sun, 06 Feb 2011 14:06:04 -0700 +Sun, 6 Feb 2011 13:10:13 -0800 +Sun, 6 Feb 2011 13:32:08 -0800 +Sun, 06 Feb 2011 20:58:03 -0700 +Mon, 7 Feb 2011 15:45:38 -0800 +Sat, 12 Feb 2011 17:54:51 -0700 +Sun, 13 Feb 2011 11:31:12 -0700 +Sun, 13 Feb 2011 13:42:41 -0800 +Sun, 13 Feb 2011 15:09:40 -0700 +Mon, 14 Feb 2011 14:36:13 -0700 +Mon, 14 Feb 2011 19:44:47 -0700 +Mon, 14 Feb 2011 19:46:20 -0700 +Wed, 16 Feb 2011 13:49:24 -0700 +Wed, 16 Feb 2011 14:41:17 -0700 +Wed, 16 Feb 2011 14:43:06 -0700 +Wed, 16 Feb 2011 14:47:12 -0700 +Wed, 16 Feb 2011 15:05:48 -0700 +Wed, 16 Feb 2011 15:21:26 -0700 +Wed, 16 Feb 2011 16:03:42 -0700 +Wed, 16 Feb 2011 21:48:53 -0700 +Thu, 17 Feb 2011 07:56:50 -0700 +Thu, 17 Feb 2011 08:27:40 -0700 +Thu, 17 Feb 2011 09:04:58 -0700 +Thu, 17 Feb 2011 09:23:31 -0700 +Thu, 17 Feb 2011 10:44:46 -0700 +Thu, 17 Feb 2011 19:21:09 -0800 +Thu, 17 Feb 2011 22:40:54 -0700 +Thu, 17 Feb 2011 23:11:12 -0700 +Fri, 18 Feb 2011 09:11:23 -0700 +Sat, 19 Feb 2011 20:44:09 -0700 +Sat, 19 Feb 2011 19:59:57 -0800 +Sat, 19 Feb 2011 21:16:42 -0700 +Sun, 20 Feb 2011 03:15:46 -0700 +Sun, 20 Feb 2011 08:38:43 -0800 +Sun, 20 Feb 2011 09:55:18 -0700 +Sun, 20 Feb 2011 10:04:59 -0700 +Sun, 20 Feb 2011 09:30:23 -0800 +Mon, 21 Feb 2011 12:55:17 -0700 +Mon, 21 Feb 2011 12:58:37 -0700 +Tue, 22 Feb 2011 14:50:28 -0700 +Wed, 23 Feb 2011 23:50:07 -0700 +Thu, 24 Feb 2011 09:01:47 -0800 +Thu, 24 Feb 2011 10:33:15 -0700 +Thu, 24 Feb 2011 10:59:29 -0700 +Thu, 24 Feb 2011 18:29:30 -0700 +Thu, 24 Feb 2011 20:18:57 -0800 +Fri, 25 Feb 2011 09:59:06 -0800 +Fri, 25 Feb 2011 12:18:27 -0700 +Mon, 28 Feb 2011 15:58:57 -0700 +Tue, 01 Mar 2011 19:42:01 -0800 +Wed, 02 Mar 2011 13:11:02 -0700 +Sat, 05 Mar 2011 17:50:58 -0700 +Sat, 5 Mar 2011 20:51:47 -0700 +Mon, 07 Mar 2011 20:15:24 -0700 +Mon, 07 Mar 2011 20:24:12 -0700 +Mon, 07 Mar 2011 20:38:38 -0700 +Mon, 07 Mar 2011 20:49:17 -0700 +Fri, 11 Mar 2011 07:30:38 -0700 +11 Mar 2011 09:36:54 -0500 +Fri, 11 Mar 2011 09:25:57 -0700 +11 Mar 2011 11:29:20 -0500 +Mon, 21 Mar 2011 23:09:46 -0600 +Tue, 22 Mar 2011 16:12:31 -0500 +Wed, 23 Mar 2011 06:50:03 -0700 +Wed, 23 Mar 2011 09:50:26 -0600 +Wed, 23 Mar 2011 21:30:25 -0600 +Thu, 24 Mar 2011 07:50:34 -0600 +Sat, 26 Mar 2011 09:09:37 -0600 +Sat, 26 Mar 2011 11:19:23 -0600 +Sat, 26 Mar 2011 22:35:03 -0600 +Mon, 28 Mar 2011 17:16:02 -0600 +Mon, 28 Mar 2011 17:44:55 -0600 +Mon, 28 Mar 2011 22:15:05 -0600 +Tue, 29 Mar 2011 15:16:17 -0600 +Wed, 30 Mar 2011 19:44:35 -0700 +Thu, 31 Mar 2011 08:17:09 -0700 +Thu, 31 Mar 2011 09:27:12 -0600 +Thu, 31 Mar 2011 09:04:43 -0700 +Thu, 31 Mar 2011 14:01:08 -0600 +Thu, 31 Mar 2011 13:21:02 -0700 +Thu, 31 Mar 2011 14:55:06 -0600 +Thu, 31 Mar 2011 18:24:28 -0600 +Sat, 2 Apr 2011 18:17:49 -0600 +Sat, 02 Apr 2011 23:58:52 -0400 +Wed, 06 Apr 2011 11:04:31 -0600 +Wed, 06 Apr 2011 18:42:00 -0600 +06 Apr 2011 20:47:29 -0400 +Wed, 06 Apr 2011 18:53:34 -0600 +06 Apr 2011 20:59:05 -0400 +07 Apr 2011 07:35:46 -0400 +Thu, 7 Apr 2011 09:34:32 -0600 +Mon, 11 Apr 2011 19:33:57 -0600 +Wed, 13 Apr 2011 14:29:29 -0600 +Wed, 13 Apr 2011 15:09:32 -0600 +Thu, 14 Apr 2011 19:14:25 -0600 +Sun, 17 Apr 2011 11:47:01 -0600 +Sun, 17 Apr 2011 12:11:00 -0600 +Sun, 17 Apr 2011 12:30:27 -0600 +Sun, 17 Apr 2011 13:35:59 -0600 +Sun, 17 Apr 2011 15:55:11 -0600 +Sun, 17 Apr 2011 20:24:22 -0600 +Thu, 21 Apr 2011 12:00:50 -0600 +Fri, 22 Apr 2011 12:30:46 -0600 +Fri, 22 Apr 2011 16:04:50 -0600 +Sat, 23 Apr 2011 10:43:15 -0600 +Sun, 24 Apr 2011 13:12:08 -0700 +Mon, 25 Apr 2011 06:26:39 -0700 +Mon, 25 Apr 2011 10:26:41 -0600 +Mon, 25 Apr 2011 10:41:52 -0600 +Mon, 25 Apr 2011 11:51:49 -0600 +Mon, 25 Apr 2011 11:57:35 -0600 +Mon, 25 Apr 2011 12:47:46 -0700 +Mon, 25 Apr 2011 15:52:08 -0600 +Mon, 25 Apr 2011 17:31:56 -0700 +Mon, 25 Apr 2011 19:23:22 -0600 +Mon, 25 Apr 2011 19:01:59 -0700 +Mon, 25 Apr 2011 21:11:46 -0600 +Mon, 25 Apr 2011 21:39:50 -0600 +Tue, 26 Apr 2011 10:09:38 -0700 +Tue, 26 Apr 2011 18:53:26 -0600 +Tue, 26 Apr 2011 19:21:53 -0600 +Thu, 28 Apr 2011 22:21:41 -0600 +Sat, 30 Apr 2011 20:06:12 -0600 +Sun, 01 May 2011 18:25:06 -0600 +Sun, 1 May 2011 19:22:15 -0600 +Sun, 01 May 2011 19:25:32 -0600 +Sun, 1 May 2011 19:33:27 -0600 +Sun, 01 May 2011 23:01:43 -0600 +Sun, 1 May 2011 23:41:45 -0600 +Sun, 01 May 2011 23:55:11 -0600 +Mon, 2 May 2011 07:44:35 -0600 +Mon, 02 May 2011 14:38:35 -0600 +Mon, 2 May 2011 18:14:01 -0600 +Mon, 2 May 2011 18:25:10 -0600 +Mon, 02 May 2011 18:27:31 -0600 +Mon, 2 May 2011 18:33:46 -0600 +Sun, 15 May 2011 11:47:25 -0600 +Mon, 16 May 2011 06:54:48 -0600 +Mon, 16 May 2011 07:03:48 -0600 +Mon, 16 May 2011 20:49:39 -0600 +Tue, 17 May 2011 23:33:07 -0600 +Sun, 29 May 2011 01:21:26 -0600 +Sun, 29 May 2011 19:32:32 -0600 +Mon, 30 May 2011 04:13:19 +0000 +Tue, 31 May 2011 22:43:25 -0600 +Sun, 5 Jun 2011 16:25:47 -0600 +Sun, 05 Jun 2011 22:43:19 -0600 +Mon, 06 Jun 2011 18:30:26 -0400 +Wed, 8 Jun 2011 16:29:39 -0600 +Wed, 8 Jun 2011 16:47:01 -0600 +Wed, 08 Jun 2011 19:10:46 -0600 +Thu, 9 Jun 2011 16:32:05 -0600 +Fri, 10 Jun 2011 09:05:05 -0600 +11 Jun 2011 12:00:49 -0400 +Sun, 12 Jun 2011 12:40:36 -0600 +Sun, 12 Jun 2011 12:52:43 -0600 +Sun, 12 Jun 2011 13:05:43 -0600 +Mon, 20 Jun 2011 16:55:51 -0600 +Mon, 20 Jun 2011 18:03:14 -0600 +Tue, 21 Jun 2011 17:43:20 -0600 +Sun, 26 Jun 2011 17:31:24 -0600 +Sun, 26 Jun 2011 23:17:57 -0600 +Tue, 28 Jun 2011 14:12:26 -0600 +28 Jun 2011 16:16:07 -0400 +Tue, 28 Jun 2011 21:50:42 -0600 +Tue, 28 Jun 2011 21:55:19 -0600 +Tue, 28 Jun 2011 22:21:28 -0600 +Tue, 28 Jun 2011 22:33:05 -0600 +Wed, 29 Jun 2011 07:26:29 -0600 +Wed, 29 Jun 2011 21:00:00 -0400 +Wed, 29 Jun 2011 22:45:22 -0600 +Sat, 02 Jul 2011 23:09:22 -0600 +Sun, 3 Jul 2011 09:09:10 -0600 +Tue, 5 Jul 2011 19:02:39 -0600 +Wed, 06 Jul 2011 12:13:26 -0600 +Wed, 6 Jul 2011 13:26:09 -0600 +Wed, 6 Jul 2011 13:41:23 -0600 +Thu, 7 Jul 2011 20:05:22 -0600 +Thu, 7 Jul 2011 20:33:46 -0600 +Fri, 8 Jul 2011 08:23:18 -0600 +Sat, 9 Jul 2011 17:42:02 -0600 +Sun, 10 Jul 2011 16:29:20 -0600 +Sun, 10 Jul 2011 16:36:49 -0600 +Sun, 10 Jul 2011 16:41:17 -0600 +Sun, 10 Jul 2011 17:21:21 -0600 +Sun, 10 Jul 2011 19:40:32 -0700 +Sun, 10 Jul 2011 19:49:37 -0700 +Mon, 11 Jul 2011 22:46:35 -0600 +Wed, 13 Jul 2011 18:22:35 -0600 +Fri, 15 Jul 2011 14:36:20 -0600 +Fri, 15 Jul 2011 14:41:50 -0600 +Fri, 15 Jul 2011 23:56:32 -0600 +Sat, 16 Jul 2011 00:06:37 -0600 +Sat, 16 Jul 2011 01:18:55 -0600 +Sat, 16 Jul 2011 13:11:56 -0600 +Sun, 17 Jul 2011 09:43:34 -0700 +Tue, 19 Jul 2011 18:40:05 -0600 +Tue, 19 Jul 2011 18:03:38 -0700 +Wed, 20 Jul 2011 20:23:01 -0600 +Wed, 20 Jul 2011 20:39:44 -0600 +Sun, 24 Jul 2011 11:44:20 -0600 +Sun, 24 Jul 2011 12:02:10 -0600 +Sun, 24 Jul 2011 12:32:52 -0600 +Sun, 24 Jul 2011 21:48:04 -0600 +Tue, 26 Jul 2011 17:29:02 -0500 +Tue, 26 Jul 2011 16:21:01 -0700 +Tue, 26 Jul 2011 19:07:02 -0600 +Tue, 26 Jul 2011 21:10:29 -0600 +Sat, 30 Jul 2011 07:52:45 -0600 +Sat, 30 Jul 2011 14:21:53 -0500 +Sun, 7 Aug 2011 10:03:17 -0600 +Tue, 9 Aug 2011 15:53:37 -0600 +Tue, 9 Aug 2011 18:35:44 -0600 +Tue, 9 Aug 2011 18:54:43 -0600 +Wed, 10 Aug 2011 17:10:45 -0600 +Tue, 16 Aug 2011 14:29:28 -0600 +16 Aug 2011 16:52:04 -0400 +Fri, 26 Aug 2011 17:06:31 -0600 +Sat, 27 Aug 2011 09:53:33 -0600 +Tue, 30 Aug 2011 01:58:11 -0600 +Tue, 30 Aug 2011 23:39:21 -0600 +Thu, 1 Sep 2011 19:24:01 -0600 +Thu, 1 Sep 2011 19:28:57 -0600 +Sat, 3 Sep 2011 16:58:20 -0600 +Sat, 03 Sep 2011 21:07:53 -0600 +Wed, 07 Sep 2011 16:10:31 -0600 +Wed, 07 Sep 2011 16:53:05 -0600 +Wed, 7 Sep 2011 18:23:55 -0600 +Wed, 07 Sep 2011 21:46:39 -0600 +Fri, 9 Sep 2011 18:09:49 -0600 +Fri, 9 Sep 2011 18:55:24 -0600 +Sat, 10 Sep 2011 10:00:48 -0600 +Sat, 10 Sep 2011 19:15:14 -0600 +Sat, 10 Sep 2011 21:56:52 -0600 +Tue, 20 Sep 2011 17:39:37 -0700 +Wed, 21 Sep 2011 17:45:00 -0600 +Wed, 21 Sep 2011 19:10:13 -0700 +Sat, 24 Sep 2011 16:45:41 -0600 +Sat, 24 Sep 2011 18:12:34 -0600 +Mon, 26 Sep 2011 13:17:26 -0600 +Mon, 26 Sep 2011 14:39:13 -0600 +Tue, 27 Sep 2011 15:04:42 -0600 +Fri, 30 Sep 2011 18:26:49 -0600 +Sat, 01 Oct 2011 00:38:11 -0500 +Sat, 1 Oct 2011 07:10:27 -0600 +Sat, 01 Oct 2011 12:30:16 -0500 +Sat, 1 Oct 2011 12:02:25 -0600 +Tue, 4 Oct 2011 18:40:43 -0600 +Tue, 4 Oct 2011 17:40:59 -0700 +Wed, 5 Oct 2011 08:04:24 +0100 +Thu, 06 Oct 2011 10:01:32 -0500 +Thu, 6 Oct 2011 09:57:37 -0600 +Thu, 06 Oct 2011 11:09:24 -0500 +Fri, 7 Oct 2011 06:32:32 -0600 +Mon, 10 Oct 2011 09:58:01 -0500 +Mon, 10 Oct 2011 15:37:39 -0600 +Wed, 19 Oct 2011 14:59:38 -0600 +Wed, 19 Oct 2011 15:26:09 -0600 +Wed, 19 Oct 2011 20:48:52 -0600 +Sat, 12 Nov 2011 09:30:33 -0800 +Sat, 12 Nov 2011 11:28:03 -0800 +Sat, 12 Nov 2011 12:48:00 -0700 +Sat, 12 Nov 2011 14:21:21 -0700 +Sat, 12 Nov 2011 14:58:07 -0700 +Sat, 12 Nov 2011 22:06:21 +0000 +Sat, 12 Nov 2011 15:06:45 -0700 +Sat, 12 Nov 2011 15:15:04 -0700 +Sat, 12 Nov 2011 23:00:56 +0000 +Sun, 13 Nov 2011 11:57:49 -0700 +Mon, 21 Nov 2011 11:32:31 -0700 +Mon, 21 Nov 2011 17:24:22 -0700 +Mon, 21 Nov 2011 17:35:14 -0700 +Tue, 22 Nov 2011 06:35:23 -0700 +Tue, 22 Nov 2011 09:53:48 -0700 +Tue, 22 Nov 2011 17:52:01 -0600 +Wed, 23 Nov 2011 14:02:33 -0700 +Wed, 23 Nov 2011 15:27:59 -0700 +Wed, 23 Nov 2011 18:56:51 -0600 +Wed, 23 Nov 2011 18:56:51 -0600 +Thu, 24 Nov 2011 09:40:03 -0700 +Sat, 26 Nov 2011 11:28:36 -0700 +Sat, 26 Nov 2011 16:27:46 -0700 +Sun, 27 Nov 2011 10:32:32 -0800 +Sun, 4 Dec 2011 16:42:51 -0800 +Tue, 13 Dec 2011 21:10:04 -0800 +Sat, 17 Dec 2011 15:41:30 -0700 +Sat, 17 Dec 2011 20:33:00 -0800 +Sun, 25 Dec 2011 11:59:34 -0700 +Fri, 30 Dec 2011 18:19:16 -0700 +Sat, 31 Dec 2011 09:50:11 -0700 +Sat, 31 Dec 2011 15:45:35 -0700 +Sun, 01 Jan 2012 16:05:08 +0400 +Sun, 1 Jan 2012 13:00:52 -0700 +Mon, 02 Jan 2012 00:58:28 +0400 +Mon, 2 Jan 2012 09:49:04 -0700 +Fri, 6 Jan 2012 06:15:10 -0700 +Sat, 14 Jan 2012 19:06:27 -0700 +Sun, 15 Jan 2012 02:13:55 -0700 +Sun, 15 Jan 2012 07:46:44 -0700 +Sun, 15 Jan 2012 09:19:22 -0700 +Sun, 15 Jan 2012 09:21:17 -0700 +Sun, 15 Jan 2012 09:25:30 -0700 +Mon, 16 Jan 2012 09:59:40 -0700 +Mon, 16 Jan 2012 10:10:19 -0700 +Mon, 16 Jan 2012 10:25:13 -0700 +Tue, 17 Jan 2012 09:02:09 -0700 +Tue, 17 Jan 2012 14:05:05 -0800 +Tue, 17 Jan 2012 19:03:22 -0700 +Wed, 18 Jan 2012 14:27:54 -0700 +Wed, 18 Jan 2012 14:33:13 -0700 +Wed, 18 Jan 2012 15:04:11 -0700 +Wed, 18 Jan 2012 15:10:46 -0700 +Wed, 18 Jan 2012 15:41:22 -0700 +Wed, 18 Jan 2012 22:20:49 -0700 +Fri, 20 Jan 2012 16:01:53 -0700 +Fri, 20 Jan 2012 17:44:22 -0700 +Sun, 22 Jan 2012 18:32:36 -0700 +Wed, 8 Feb 2012 14:26:38 -0700 +Wed, 08 Feb 2012 14:46:47 -0700 +Sun, 12 Feb 2012 13:14:52 -0700 +Sun, 12 Feb 2012 15:39:21 -0700 +Sun, 12 Feb 2012 15:48:25 -0700 +Sun, 12 Feb 2012 13:23:22 -0700 +Tue, 14 Feb 2012 14:33:56 -0700 +14 Feb 2012 16:45:16 -0500 +Tue, 14 Feb 2012 14:54:42 -0700 +Mon, 20 Feb 2012 17:53:48 -0700 +Sun, 19 Feb 2012 11:23:39 -0700 +Thu, 23 Feb 2012 09:17:41 -0700 +Thu, 23 Feb 2012 22:54:18 -0700 +Sat, 25 Feb 2012 15:11:54 -0700 +Sun, 26 Feb 2012 09:20:50 -0700 +Sat, 25 Feb 2012 11:31:22 -0700 +Sat, 25 Feb 2012 11:43:21 -0700 +Sat, 25 Feb 2012 15:02:24 -0700 +Mon, 27 Feb 2012 15:12:13 -0700 +Fri, 02 Mar 2012 12:45:16 -0700 +Thu, 15 Mar 2012 13:52:16 -0600 +Tue, 3 Apr 2012 16:06:35 -0700 +Wed, 4 Apr 2012 16:08:51 -0600 +Fri, 6 Apr 2012 05:31:03 -0600 +Thu, 05 Apr 2012 22:09:29 -0600 +Tue, 3 Apr 2012 18:14:10 -0700 +Wed, 4 Apr 2012 10:31:55 -0700 +Mon, 2 Apr 2012 15:20:42 -0500 +Sun, 15 Apr 2012 08:48:24 -0600 +Sun, 15 Apr 2012 20:29:40 +0400 +Mon, 16 Apr 2012 12:41:59 -0600 +Mon, 16 Apr 2012 12:34:11 -0600 +Mon, 16 Apr 2012 16:18:55 -0600 +Mon, 16 Apr 2012 12:51:44 -0600 +Thu, 19 Apr 2012 22:21:02 -0600 +Thu, 19 Apr 2012 10:00:55 -0600 +Sat, 21 Apr 2012 20:45:14 -0400 +Thu, 26 Apr 2012 12:17:12 -0600 +Wed, 25 Apr 2012 10:55:16 -0400 +Sun, 29 Apr 2012 13:03:30 -0600 +Sun, 29 Apr 2012 15:49:34 -0600 +Sun, 29 Apr 2012 16:21:28 -0600 +Sun, 29 Apr 2012 15:34:50 -0600 +Sun, 29 Apr 2012 16:00:49 -0600 +Mon, 30 Apr 2012 19:43:18 -0600 +Sun, 29 Apr 2012 22:27:11 -0600 +Wed, 2 May 2012 14:41:58 -0600 +Thu, 03 May 2012 00:29:29 +0400 +Thu, 03 May 2012 00:32:43 +0400 +Thu, 3 May 2012 20:44:51 -0600 +Fri, 4 May 2012 10:54:58 -0600 +Fri, 4 May 2012 22:15:20 -0600 +Fri, 04 May 2012 11:11:05 -0600 +Mon, 14 May 2012 11:18:21 -0600 +Mon, 21 May 2012 14:53:06 -0600 +Sat, 26 May 2012 15:26:53 -0600 +26 May 2012 13:28:02 -0500 +Thu, 31 May 2012 11:36:25 -0600 +Sat, 2 Jun 2012 12:19:12 -0600 +Sat, 2 Jun 2012 14:21:33 -0600 +Fri, 18 May 2012 21:59:59 -0600 +Sat, 02 Jun 2012 13:06:51 -0600 +Mon, 11 Jun 2012 21:22:31 -0600 +Mon, 11 Jun 2012 20:47:57 -0600 +Thu, 14 Jun 2012 21:29:26 -0600 +Fri, 15 Jun 2012 11:46:04 -0600 +Sat, 16 Jun 2012 00:20:47 -0600 +Sat, 02 Jun 2012 15:31:46 -0600 +Sun, 03 Jun 2012 20:29:14 -0600 +Thu, 14 Jun 2012 22:15:29 -0600 +Mon, 11 Jun 2012 21:48:03 -0600 +Sun, 3 Jun 2012 15:53:10 -0600 +Tue, 26 Jun 2012 19:57:08 -0600 +Tue, 26 Jun 2012 20:21:28 -0600 +Tue, 26 Jun 2012 19:37:01 -0600 +Tue, 26 Jun 2012 18:46:50 -0700 +Tue, 26 Jun 2012 20:05:24 -0600 +Wed, 27 Jun 2012 15:08:05 -0600 +Tue, 26 Jun 2012 23:05:39 -0600 +Wed, 27 Jun 2012 15:55:00 -0600 +Tue, 3 Jul 2012 20:21:20 -0600 +Wed, 4 Jul 2012 10:15:13 -0600 +Wed, 04 Jul 2012 09:41:45 -0600 +Wed, 4 Jul 2012 23:12:06 -0600 +Thu, 5 Jul 2012 10:20:35 +0000 +Sun, 8 Jul 2012 14:36:19 -0600 +Sun, 8 Jul 2012 18:01:38 -0600 +Sun, 8 Jul 2012 23:23:35 +0000 +Sun, 8 Jul 2012 19:16:59 -0600 +Wed, 11 Jul 2012 09:38:15 -0600 +Wed, 11 Jul 2012 18:41:03 -0600 +Mon, 9 Jul 2012 15:06:43 +0000 +Fri, 13 Jul 2012 14:58:36 -0600 +Thu, 12 Jul 2012 11:11:06 +0000 +Thu, 19 Jul 2012 00:10:22 +0000 +Thu, 19 Jul 2012 17:13:39 -0600 +Thu, 19 Jul 2012 20:35:08 +0000 +Fri, 20 Jul 2012 05:56:01 -0600 +Fri, 20 Jul 2012 12:00:38 -0600 +Tue, 19 Jun 2012 16:12:06 +0000 +Fri, 20 Jul 2012 21:39:56 +0400 +Fri, 20 Jul 2012 22:26:37 +0400 +Sat, 28 Jul 2012 09:47:06 -0600 +Sat, 28 Jul 2012 09:32:27 -0600 +Sat, 28 Jul 2012 17:16:39 -0600 +Sun, 29 Jul 2012 10:23:36 -0600 +Sun, 29 Jul 2012 01:06:24 -0600 +Sat, 28 Jul 2012 09:57:09 -0600 +Sat, 18 Aug 2012 11:57:55 -0600 +Sun, 19 Aug 2012 17:49:17 -0600 +Tue, 21 Aug 2012 14:53:43 -0600 +Tue, 21 Aug 2012 13:31:14 -0700 +Tue, 21 Aug 2012 14:40:02 -0700 +Tue, 21 Aug 2012 17:47:33 -0600 +Wed, 22 Aug 2012 11:50:35 -0600 +Wed, 22 Aug 2012 10:46:55 -0700 +Wed, 22 Aug 2012 15:23:40 -0700 +Mon, 20 Aug 2012 20:29:16 -0600 +Fri, 24 Aug 2012 14:55:27 -0600 +Fri, 24 Aug 2012 19:43:11 -0600 +Sat, 25 Aug 2012 03:04:21 +0000 +Thu, 23 Aug 2012 22:01:03 -0600 +Sat, 25 Aug 2012 18:17:01 -0600 +Sat, 25 Aug 2012 11:16:18 -0600 +Sat, 28 Jul 2012 20:43:59 -0600 +Mon, 13 Aug 2012 17:45:55 -0600 +Mon, 27 Aug 2012 18:38:57 -0600 +Mon, 27 Aug 2012 18:53:33 -0600 +Sun, 26 Aug 2012 10:13:37 -0600 +Tue, 28 Aug 2012 07:04:55 -0600 +Tue, 28 Aug 2012 00:49:21 -0600 +Tue, 28 Aug 2012 00:53:23 -0600 +Tue, 28 Aug 2012 10:43:59 -0600 +Sun, 26 Aug 2012 22:27:10 -0700 +Fri, 31 Aug 2012 20:09:40 -0600 +Wed, 5 Sep 2012 11:16:37 -0600 +Mon, 03 Sep 2012 19:28:30 -0600 +Wed, 05 Sep 2012 11:59:35 -0600 +Wed, 5 Sep 2012 20:54:41 -0700 +Thu, 13 Sep 2012 19:46:14 -0600 +Thu, 13 Sep 2012 20:14:48 -0600 +Sat, 15 Sep 2012 13:36:51 -0600 +Mon, 20 Aug 2012 18:13:02 +0400 +Wed, 19 Sep 2012 15:10:47 -0600 +Wed, 19 Sep 2012 15:13:00 -0600 +Wed, 19 Sep 2012 15:23:00 -0600 +Wed, 19 Sep 2012 15:24:26 -0600 +Thu, 27 Sep 2012 09:50:27 -0600 +Wed, 26 Sep 2012 19:30:19 -0700 +Sat, 29 Sep 2012 20:05:10 -0600 +Sat, 29 Sep 2012 19:54:12 -0600 +Tue, 2 Oct 2012 13:29:33 -0600 +Tue, 2 Oct 2012 16:56:54 -0600 +Tue, 02 Oct 2012 13:36:47 -0600 +Tue, 02 Oct 2012 12:44:00 -0600 +Sun, 30 Sep 2012 10:54:27 -0600 +Sat, 6 Oct 2012 17:47:09 -0600 +Sat, 6 Oct 2012 19:35:12 -0600 +Sun, 7 Oct 2012 11:18:59 -0600 +Sat, 06 Oct 2012 21:16:07 -0600 +Tue, 9 Oct 2012 19:16:49 -0600 +Wed, 10 Oct 2012 10:13:44 -0600 +Wed, 10 Oct 2012 10:57:44 -0600 +Tue, 09 Oct 2012 21:50:54 -0600 +Wed, 10 Oct 2012 20:42:09 -0600 +Sat, 13 Oct 2012 09:37:07 -0600 +Sat, 13 Oct 2012 04:59:44 -0700 +Sat, 13 Oct 2012 09:53:43 -0600 +Sat, 13 Oct 2012 13:53:03 -0600 +Sat, 13 Oct 2012 17:37:13 -0600 +Sun, 14 Oct 2012 09:39:57 -0600 +Sun, 14 Oct 2012 00:32:08 -0600 +Sun, 14 Oct 2012 14:06:56 -0600 +Sun, 14 Oct 2012 14:17:18 -0600 +Sun, 14 Oct 2012 13:30:26 -0600 +Tue, 23 Oct 2012 16:55:52 -0600 +Wed, 24 Oct 2012 11:38:31 -0600 +Thu, 25 Oct 2012 10:46:39 -0600 +Thu, 25 Oct 2012 10:36:24 -0600 +Thu, 25 Oct 2012 10:57:51 -0600 +Thu, 25 Oct 2012 11:02:32 -0600 +Thu, 25 Oct 2012 21:14:35 -0600 +Wed, 24 Oct 2012 10:45:53 -0600 +Tue, 30 Oct 2012 14:50:49 -0600 +Tue, 30 Oct 2012 14:53:52 -0600 +Tue, 30 Oct 2012 15:01:50 -0600 +Wed, 31 Oct 2012 16:38:33 -0600 +Wed, 31 Oct 2012 16:52:42 -0600 +Wed, 31 Oct 2012 17:13:02 -0600 +Wed, 31 Oct 2012 16:42:19 -0600 +Wed, 31 Oct 2012 17:03:28 -0600 +Wed, 31 Oct 2012 17:38:36 -0600 +Wed, 31 Oct 2012 17:17:37 -0600 +Thu, 1 Nov 2012 17:17:16 -0700 +Sun, 11 Nov 2012 16:07:09 -0700 +Sun, 21 Oct 2012 10:54:17 -0600 +Fri, 23 Nov 2012 15:48:25 -0700 +Sat, 24 Nov 2012 06:16:16 -0700 +Sun, 25 Nov 2012 18:19:28 -0500 +Sat, 24 Nov 2012 20:41:15 -0700 +Fri, 23 Nov 2012 11:41:21 -0700 +Mon, 05 Nov 2012 12:54:37 -0700 +Tue, 4 Dec 2012 17:41:08 -0700 +Wed, 5 Dec 2012 07:33:20 -0700 +Tue, 04 Dec 2012 22:42:18 -0700 +Wed, 5 Dec 2012 09:34:06 -0700 +Tue, 04 Dec 2012 19:58:46 -0700 +Wed, 5 Dec 2012 09:40:50 -0700 +Wed, 5 Dec 2012 10:52:58 -0700 +Wed, 05 Dec 2012 11:55:43 -0500 +Wed, 5 Dec 2012 11:27:37 -0700 +Wed, 5 Dec 2012 11:49:37 -0700 +Wed, 05 Dec 2012 13:05:46 -0500 +Wed, 05 Dec 2012 13:32:21 -0500 +Wed, 05 Dec 2012 13:54:52 -0500 +Sat, 15 Dec 2012 19:36:11 -0700 +Mon, 17 Dec 2012 11:44:15 -0700 +Sat, 15 Dec 2012 16:36:37 -0700 +Sun, 16 Dec 2012 23:18:38 -0700 +Tue, 18 Dec 2012 11:41:11 -0700 +Sat, 22 Dec 2012 08:08:01 -0700 +Fri, 21 Dec 2012 22:44:08 -0700 +Fri, 28 Dec 2012 14:38:42 -0700 +Mon, 31 Dec 2012 17:28:04 -0700 +Sun, 23 Dec 2012 09:36:36 -0700 +Mon, 31 Dec 2012 10:00:39 -0700 +Tue, 1 Jan 2013 18:48:22 -0700 +Tue, 01 Jan 2013 12:57:16 -0700 +Fri, 4 Jan 2013 19:05:30 -0700 +Sat, 5 Jan 2013 11:12:10 -0700 +Fri, 04 Jan 2013 21:24:44 -0700 +Sun, 6 Jan 2013 16:47:03 -0700 +Mon, 7 Jan 2013 12:38:56 -0700 +Mon, 07 Jan 2013 08:30:24 -0700 +Sun, 06 Jan 2013 19:16:27 -0700 +Tue, 8 Jan 2013 17:18:20 -0700 +Tue, 8 Jan 2013 18:09:50 -0600 +Wed, 9 Jan 2013 08:41:19 -0700 +Tue, 8 Jan 2013 19:19:06 -0600 +Wed, 9 Jan 2013 11:21:46 -0600 +Sat, 12 Jan 2013 10:09:46 -0700 +Fri, 11 Jan 2013 23:25:30 -0700 +Tue, 01 Jan 2013 19:53:04 -0700 +Sun, 13 Jan 2013 11:45:20 -0700 +Sat, 12 Jan 2013 11:33:41 -0700 +Sun, 13 Jan 2013 21:30:58 -0700 +Sun, 13 Jan 2013 19:57:48 -0700 +Sun, 06 Jan 2013 18:48:10 -0700 +Sun, 06 Jan 2013 19:06:48 -0700 +Mon, 14 Jan 2013 17:41:34 -0700 +Tue, 08 Jan 2013 11:22:41 -0500 +Wed, 16 Jan 2013 14:33:22 -0000 +Sun, 6 Jan 2013 16:06:02 -0700 +Thu, 24 Jan 2013 18:55:42 -0700 +Sun, 27 Jan 2013 20:12:24 -0700 +Thu, 17 Jan 2013 21:53:23 -0700 +Sat, 2 Feb 2013 15:24:35 -0700 +Sat, 2 Feb 2013 16:29:18 -0700 +Sun, 3 Feb 2013 11:09:28 -0700 +Sun, 3 Feb 2013 17:49:33 -0700 +Tue, 5 Feb 2013 12:56:15 -0700 +Tue, 5 Feb 2013 11:11:46 -0800 +Mon, 04 Feb 2013 06:11:06 -0700 +Sat, 9 Feb 2013 16:34:21 -0700 +Mon, 04 Feb 2013 22:38:38 -0700 +Thu, 21 Feb 2013 06:12:24 -0700 +Wed, 20 Feb 2013 20:04:06 -0700 +Sat, 23 Feb 2013 16:49:54 -0700 +Sun, 24 Feb 2013 09:02:02 -0700 +Sat, 23 Feb 2013 20:06:55 -0500 +Thu, 21 Feb 2013 11:39:45 -0700 +Mon, 4 Mar 2013 16:58:59 -0700 +Tue, 5 Mar 2013 06:53:32 -0700 +Mon, 04 Mar 2013 23:10:20 -0700 +Wed, 6 Mar 2013 07:22:27 -0700 +Tue, 05 Mar 2013 22:16:55 -0700 +Sat, 16 Mar 2013 13:32:56 -0600 +Sat, 16 Mar 2013 15:52:27 -0600 +Mon, 18 Mar 2013 18:49:16 -0600 +Sun, 17 Mar 2013 11:00:49 -0600 +Sat, 23 Mar 2013 11:50:29 -0600 +Mon, 18 Mar 2013 22:25:37 -0600 +Sat, 23 Mar 2013 13:20:37 -0600 +Sat, 23 Mar 2013 12:37:44 -0600 +Sun, 7 Apr 2013 12:45:30 -0600 +Sun, 7 Apr 2013 18:40:04 -0600 +Sun, 07 Apr 2013 19:02:23 -0400 +Mon, 8 Apr 2013 00:05:38 +0000 +Tue, 9 Apr 2013 12:51:45 -0600 +Sat, 13 Apr 2013 08:13:15 -0600 +Sat, 13 Apr 2013 13:15:46 -0600 +Fri, 10 May 2013 20:29:31 -0600 +Fri, 10 May 2013 12:47:11 -0600 +Fri, 17 May 2013 14:26:50 -0600 +Thu, 16 May 2013 23:18:18 -0600 +Fri, 17 May 2013 14:40:25 -0600 +Tue, 14 May 2013 17:16:31 -0400 +Mon, 20 May 2013 14:35:11 -0500 +Sat, 18 May 2013 07:45:23 -0600 +Tue, 28 May 2013 18:15:22 -0600 +Mon, 3 Jun 2013 20:32:06 -0600 +Mon, 3 Jun 2013 22:22:13 -0400 +Tue, 4 Jun 2013 18:03:27 -0600 +Sun, 9 Jun 2013 09:04:43 -0600 +Mon, 10 Jun 2013 17:31:16 -0600 +Fri, 14 Jun 2013 15:15:17 -0600 +Tue, 11 Jun 2013 12:35:56 -0400 +Wed, 12 Jun 2013 15:27:57 -0400 +Fri, 21 Jun 2013 15:47:03 -0600 +Wed, 19 Jun 2013 23:30:34 -0600 +Fri, 21 Jun 2013 16:03:37 -0600 +Sun, 23 Jun 2013 09:46:10 -0600 +Sun, 23 Jun 2013 13:19:02 -0600 +Sun, 23 Jun 2013 14:39:15 -0600 +Sun, 23 Jun 2013 11:06:11 -0600 +Sun, 23 Jun 2013 14:05:53 -0600 +Sun, 23 Jun 2013 15:00:35 -0600 +Sun, 23 Jun 2013 18:44:02 -0600 +Sun, 23 Jun 2013 18:25:22 -0700 +Tue, 2 Jul 2013 08:19:50 -0600 +Mon, 01 Jul 2013 21:23:57 -0600 +Sun, 23 Jun 2013 15:00:56 -0600 +Sun, 14 Jul 2013 12:09:45 -0600 +Mon, 22 Jul 2013 15:17:34 -0600 +Sun, 28 Jul 2013 16:00:11 -0600 +Fri, 16 Aug 2013 18:55:16 -0600 +Tue, 27 Aug 2013 15:58:03 -0600 +Mon, 26 Aug 2013 18:46:56 -0700 +Fri, 30 Aug 2013 12:23:57 -0600 +Thu, 25 Jul 2013 17:50:13 -0400 +Tue, 30 Jul 2013 03:04:19 -0400 +Fri, 30 Aug 2013 15:44:46 -0600 +Fri, 30 Aug 2013 16:12:03 -0600 +Fri, 30 Aug 2013 16:44:16 -0600 +Fri, 30 Aug 2013 15:47:51 -0600 +Fri, 30 Aug 2013 16:16:52 -0600 +Fri, 30 Aug 2013 18:13:01 -0600 +Sat, 17 Aug 2013 13:01:15 -0600 +Tue, 27 Aug 2013 16:44:36 -0700 +Thu, 5 Sep 2013 18:35:27 -0600 +Thu, 5 Sep 2013 18:40:18 -0600 +Tue, 10 Sep 2013 16:59:05 -0600 +Wed, 11 Sep 2013 00:51:17 -0400 +Wed, 11 Sep 2013 11:08:39 -0600 +Thu, 12 Sep 2013 15:23:42 -0600 +Thu, 12 Sep 2013 12:49:57 -0600 +Fri, 13 Sep 2013 15:34:56 -0600 +Fri, 13 Sep 2013 15:51:44 -0600 +Sat, 14 Sep 2013 08:24:20 -0600 +Fri, 13 Sep 2013 08:00:04 +0200 +Sat, 14 Sep 2013 09:11:53 -0600 +Thu, 12 Sep 2013 16:04:14 -0600 +Sat, 14 Sep 2013 09:37:35 -0600 +Sat, 14 Sep 2013 09:40:11 +0200 +Sat, 14 Sep 2013 10:19:17 -0600 +Sat, 14 Sep 2013 15:55:32 -0600 +Sat, 14 Sep 2013 22:31:42 +0200 +Sat, 14 Sep 2013 20:19:23 +0200 +Sun, 15 Sep 2013 08:40:06 -0600 +Sat, 14 Sep 2013 17:53:47 -0700 +Sun, 15 Sep 2013 14:13:10 +0000 +Sun, 15 Sep 2013 10:07:09 -0600 +Sat, 14 Sep 2013 11:25:55 -0600 +Sun, 15 Sep 2013 10:43:02 -0600 +Sun, 15 Sep 2013 13:10:29 -0600 +Sun, 15 Sep 2013 13:27:09 -0600 +Sun, 15 Sep 2013 18:58:34 -0600 +Mon, 16 Sep 2013 10:00:55 -0600 +Mon, 16 Sep 2013 09:33:04 -0700 +Mon, 16 Sep 2013 11:06:59 -0600 +Mon, 16 Sep 2013 10:36:50 -0600 +Sun, 15 Sep 2013 19:29:58 -0600 +Mon, 16 Sep 2013 11:34:49 -0600 +Mon, 16 Sep 2013 11:38:14 -0600 +Mon, 16 Sep 2013 11:56:55 -0600 +Mon, 16 Sep 2013 11:57:56 -0600 +Mon, 16 Sep 2013 17:23:53 -0600 +Mon, 16 Sep 2013 18:03:25 -0500 +Mon, 16 Sep 2013 18:16:15 -0600 +Mon, 16 Sep 2013 14:20:46 -0400 +Tue, 17 Sep 2013 10:08:25 -0600 +Tue, 17 Sep 2013 11:59:27 -0600 +17 Sep 2013 18:03:53 -0400 +Mon, 16 Sep 2013 21:36:58 -0400 +Thu, 19 Sep 2013 12:30:38 -0600 +Wed, 18 Sep 2013 21:03:04 -0600 +Thu, 19 Sep 2013 17:28:25 -0600 +Fri, 20 Sep 2013 14:45:51 -0600 +Sat, 21 Sep 2013 10:45:03 +0000 +Sat, 21 Sep 2013 12:16:13 -0600 +Fri, 20 Sep 2013 19:33:29 -0600 +Sun, 22 Sep 2013 07:51:52 -0600 +Sun, 22 Sep 2013 02:13:49 +0000 +Mon, 23 Sep 2013 10:21:17 -0600 +Mon, 23 Sep 2013 17:57:34 +0200 +Mon, 23 Sep 2013 10:33:01 -0600 +Mon, 23 Sep 2013 11:23:42 -0600 +Mon, 23 Sep 2013 18:37:09 +0200 +Tue, 24 Sep 2013 14:33:10 -0600 +Sun, 22 Sep 2013 16:39:48 +0200 +Tue, 24 Sep 2013 18:20:14 -0600 +Mon, 23 Sep 2013 18:34:29 +0200 +Wed, 25 Sep 2013 11:32:15 -0600 +Tue, 24 Sep 2013 23:49:32 -0400 +Tue, 24 Sep 2013 14:17:33 -0600 +Sun, 29 Sep 2013 12:27:11 -0600 +Fri, 27 Sep 2013 23:07:58 -0600 +Sun, 29 Sep 2013 12:35:10 -0600 +Tue, 01 Oct 2013 14:07:30 -0600 +Mon, 30 Sep 2013 14:13:55 -0600 +Tue, 01 Oct 2013 17:45:48 -0400 +Wed, 2 Oct 2013 14:15:50 -0600 +Thu, 3 Oct 2013 11:28:19 -0600 +Fri, 4 Oct 2013 12:07:26 -0600 +Thu, 3 Oct 2013 08:30:01 -0600 +Wed, 9 Oct 2013 20:32:55 -0600 +Thu, 10 Oct 2013 09:35:49 -0600 +Fri, 11 Oct 2013 12:55:41 -0600 +Fri, 04 Oct 2013 23:01:49 -0600 +Tue, 15 Oct 2013 16:14:56 -0600 +Mon, 21 Oct 2013 18:42:20 -0600 +Tue, 22 Oct 2013 08:38:48 -0600 +Tue, 22 Oct 2013 02:52:57 +0000 +Wed, 23 Oct 2013 17:59:56 -0600 +Fri, 25 Oct 2013 14:25:52 -0600 +Fri, 25 Oct 2013 17:51:01 +0100 +Tue, 15 Oct 2013 17:35:54 -0600 +Fri, 25 Oct 2013 19:14:08 -0600 +Fri, 25 Oct 2013 21:22:58 -0600 +Fri, 25 Oct 2013 18:25:58 -0600 +Mon, 28 Oct 2013 19:16:59 -0600 +Mon, 28 Oct 2013 19:06:10 -0600 +Tue, 29 Oct 2013 06:38:50 -0600 +Mon, 28 Oct 2013 21:41:51 -0600 +Thu, 31 Oct 2013 18:08:26 -0600 +Thu, 31 Oct 2013 19:04:00 -0600 +Mon, 7 Oct 2013 17:48:04 -0500 +Wed, 02 Oct 2013 14:59:47 -0600 +Tue, 5 Nov 2013 15:11:25 -0700 +Fri, 01 Nov 2013 21:58:24 -0600 +Fri, 01 Nov 2013 22:46:01 -0600 +Mon, 18 Nov 2013 15:07:57 -0500 +Thu, 21 Nov 2013 16:43:57 -0700 +Sun, 24 Nov 2013 17:59:25 -0700 +Sun, 24 Nov 2013 12:59:51 -0800 +Fri, 14 Jun 2013 23:16:02 -0400 +Wed, 11 Sep 2013 16:09:15 -0400 +Tue, 3 Dec 2013 16:53:05 -0700 +Sun, 17 Nov 2013 19:48:56 -0700 +Tue, 3 Dec 2013 17:11:59 -0700 +Tue, 3 Dec 2013 20:19:51 -0700 +Tue, 03 Dec 2013 17:02:26 -0700 +Tue, 03 Dec 2013 19:18:06 -0700 +Wed, 4 Dec 2013 09:27:44 -0700 +Wed, 4 Dec 2013 16:34:39 -0700 +Tue, 03 Dec 2013 22:14:39 -0700 +Wed, 4 Dec 2013 18:14:20 -0700 +Mon, 18 Nov 2013 14:38:55 -0700 +Wed, 11 Dec 2013 17:17:07 -0500 +Mon, 16 Dec 2013 14:28:49 -0700 +Mon, 16 Dec 2013 11:33:01 -0800 +Mon, 16 Dec 2013 13:37:14 -0800 +Wed, 04 Dec 2013 22:19:28 -0700 +Fri, 20 Dec 2013 13:16:27 -0700 +9 Jan 2014 13:40:22 -0500 +Tue, 07 Jan 2014 16:48:54 -0600 +9 Jan 2014 21:05:45 -0500 +Mon, 9 Dec 2013 10:26:33 -0700 +Mon, 13 Jan 2014 19:09:19 -0700 +Mon, 13 Jan 2014 12:35:49 -0700 +Mon, 20 Jan 2014 20:27:51 -0700 +Tue, 21 Jan 2014 18:20:40 -0700 +Tue, 21 Jan 2014 18:29:28 -0700 +Tue, 21 Jan 2014 20:21:28 -0500 +Wed, 22 Jan 2014 15:29:44 -0700 +Thu, 23 Jan 2014 21:44:18 +0000 +Mon, 27 Jan 2014 16:26:06 -0700 +Mon, 3 Feb 2014 08:51:55 -0800 +Tue, 4 Feb 2014 16:33:52 -0700 +Tue, 04 Feb 2014 17:35:39 -0500 +Tue, 4 Feb 2014 16:38:30 -0700 +Sun, 9 Feb 2014 15:58:59 -0700 +Thu, 13 Feb 2014 18:46:26 -0700 +Tue, 18 Feb 2014 18:28:19 -0700 +Thu, 20 Feb 2014 18:31:10 -0700 +Wed, 19 Feb 2014 10:23:50 -0500 +Tue, 25 Feb 2014 11:22:47 -0700 +Tue, 25 Feb 2014 20:09:37 -0700 +Sat, 1 Mar 2014 08:59:19 -0700 +Sat, 1 Mar 2014 09:00:29 -0700 +Sat, 22 Feb 2014 10:47:16 +0100 +Sat, 1 Mar 2014 13:20:25 -0700 +Wed, 5 Mar 2014 17:41:55 -0700 +Tue, 04 Mar 2014 10:35:29 -0700 +Sun, 02 Mar 2014 20:13:57 -0500 +Mon, 13 Jan 2014 23:54:34 -0700 +Fri, 7 Mar 2014 22:28:31 -0500 +Sat, 15 Mar 2014 14:39:47 -0600 +Fri, 14 Mar 2014 21:25:46 -0400 +Sun, 16 Mar 2014 17:07:10 -0600 +Sat, 15 Mar 2014 18:13:21 -0400 +Tue, 18 Mar 2014 19:28:26 -0600 +Thu, 20 Mar 2014 17:19:12 -0600 +Sun, 23 Mar 2014 20:50:33 -0600 +Mon, 24 Mar 2014 12:38:20 -0600 +Mon, 24 Mar 2014 12:44:39 -0600 +Mon, 24 Mar 2014 11:35:31 -0700 +Mon, 24 Mar 2014 11:37:19 -0700 +Tue, 25 Mar 2014 02:52:35 +0400 +Mon, 24 Mar 2014 17:20:04 -0600 +Mon, 24 Mar 2014 11:13:34 -0600 +Wed, 26 Mar 2014 12:56:43 -0600 +Wed, 26 Mar 2014 17:20:48 -0600 +Tue, 25 Mar 2014 11:39:14 -0600 +Tue, 25 Mar 2014 11:47:41 -0600 +Thu, 27 Mar 2014 16:53:44 -0600 +Thu, 27 Mar 2014 17:16:42 -0600 +Thu, 27 Mar 2014 19:18:34 -0600 +Thu, 27 Mar 2014 19:50:36 -0400 +Thu, 27 Mar 2014 22:05:30 -0600 +Fri, 28 Mar 2014 09:41:53 -0600 +Fri, 4 Apr 2014 16:46:34 -0600 +Sat, 5 Apr 2014 15:47:36 -0600 +Sun, 6 Apr 2014 11:20:27 -0600 +Fri, 04 Apr 2014 23:13:53 -0600 +Sun, 6 Apr 2014 15:54:53 -0600 +Tue, 8 Apr 2014 10:34:12 -0600 +Mon, 7 Apr 2014 12:41:00 +0000 +Sun, 13 Apr 2014 11:32:27 -0600 +Fri, 18 Apr 2014 11:52:36 -0500 +Mon, 5 May 2014 20:29:38 -0600 +Mon, 5 May 2014 18:00:18 -0400 +Wed, 7 May 2014 10:27:29 -0600 +Mon, 5 May 2014 20:29:51 -0600 +Sat, 10 May 2014 10:24:52 -0600 +Sat, 10 May 2014 22:07:57 -0600 +Sun, 11 May 2014 10:06:58 -0600 +Fri, 18 Apr 2014 23:53:05 -0600 +Sat, 10 May 2014 21:15:03 -0600 +Sat, 10 May 2014 22:26:19 -0600 +Sun, 11 May 2014 20:35:21 -0600 +Tue, 13 May 2014 18:07:46 -0600 +Tue, 13 May 2014 09:29:40 -0700 +Tue, 13 May 2014 18:44:16 -0600 +Wed, 14 May 2014 21:22:29 -0600 +Thu, 15 May 2014 17:00:10 -0600 +Wed, 14 May 2014 23:35:53 -0600 +Fri, 16 May 2014 10:23:47 -0600 +Thu, 15 May 2014 22:46:00 -0600 +Fri, 16 May 2014 10:28:44 -0600 +Fri, 11 Apr 2014 11:29:38 -0700 +Sat, 17 May 2014 05:46:22 -0600 +Fri, 16 May 2014 22:57:53 -0600 +Sun, 18 May 2014 17:59:35 -0600 +Mon, 19 May 2014 12:19:59 -0600 +Tue, 20 May 2014 12:36:20 -0600 +Fri, 29 Nov 2013 10:40:47 -0700 +Sun, 1 Jun 2014 06:56:22 -0600 +Thu, 5 Jun 2014 06:27:04 -0600 +Wed, 04 Jun 2014 22:42:32 -0600 +Fri, 6 Jun 2014 03:14:12 -0600 +Thu, 05 Jun 2014 21:25:22 -0600 +Fri, 6 Jun 2014 03:29:13 -0600 +Thu, 22 May 2014 22:58:51 -0600 +Sat, 31 May 2014 22:25:46 -0600 +Sun, 01 Jun 2014 21:29:47 -0600 +Mon, 02 Jun 2014 22:20:56 -0600 +Mon, 9 Jun 2014 18:05:42 -0600 +Wed, 11 Jun 2014 11:44:39 -0600 +Sat, 14 Jun 2014 10:15:16 -0600 +Fri, 13 Jun 2014 23:22:16 -0600 +Thu, 12 Jun 2014 12:11:22 +0000 +Fri, 06 Jun 2014 22:15:37 -0600 +Thu, 19 Jun 2014 09:12:49 -0600 +Thu, 19 Jun 2014 07:47:40 -0700 +Tue, 17 Jun 2014 20:24:57 -0400 +Tue, 24 Jun 2014 16:59:36 -0600 +Tue, 24 Jun 2014 17:58:35 -0600 +Tue, 24 Jun 2014 19:48:59 -0400 +Tue, 24 Jun 2014 20:46:26 -0600 +Tue, 24 Jun 2014 21:56:54 -0400 +Tue, 24 Jun 2014 21:00:19 -0600 +Wed, 25 Jun 2014 16:34:38 -0600 +Wed, 25 Jun 2014 00:26:07 -0400 +Sat, 28 Jun 2014 07:40:24 -0600 +Fri, 27 Jun 2014 13:40:30 -0400 +Sat, 28 Jun 2014 08:05:48 -0600 +Thu, 26 Jun 2014 22:52:02 -0600 +Sat, 28 Jun 2014 16:43:14 -0600 +Thu, 26 Jun 2014 21:31:36 -0700 +Thu, 3 Jul 2014 13:31:18 -0600 +Tue, 22 Jul 2014 13:38:12 -0600 +Tue, 22 Jul 2014 13:26:20 -0600 +Tue, 22 Jul 2014 13:45:22 -0600 +Mon, 28 Jul 2014 10:05:44 -0600 +Mon, 28 Jul 2014 10:09:08 -0600 +Mon, 28 Jul 2014 10:24:28 -0600 +Thu, 31 Jul 2014 17:58:09 -0600 +Fri, 25 Jul 2014 12:49:22 -0600 +Mon, 28 Jul 2014 10:13:48 -0600 +Wed, 6 Aug 2014 12:45:43 -0600 +Wed, 6 Aug 2014 19:55:06 -0700 +Sun, 10 Aug 2014 15:11:56 -0600 +Sun, 10 Aug 2014 15:14:05 -0600 +Thu, 14 Aug 2014 17:11:01 -0600 +Mon, 25 Aug 2014 14:45:02 -0600 +Mon, 25 Aug 2014 00:22:32 -0500 +Wed, 27 Aug 2014 16:17:58 -0600 +Mon, 25 Aug 2014 15:22:11 -0600 +Wed, 27 Aug 2014 17:39:18 -0600 +Sat, 30 Aug 2014 10:53:00 -0600 +Wed, 27 Aug 2014 20:17:13 -0400 +Tue, 15 Jul 2014 10:56:43 -0400 +Sat, 30 Aug 2014 10:54:46 -0600 +Tue, 2 Sep 2014 11:56:49 -0600 +Fri, 5 Sep 2014 05:05:04 -0600 +Sat, 6 Sep 2014 07:02:44 -0600 +Sat, 06 Sep 2014 00:28:49 -0600 +Sat, 6 Sep 2014 13:22:45 -0600 +Sat, 6 Sep 2014 13:28:30 -0600 +Thu, 04 Sep 2014 14:47:13 +0400 +Fri, 05 Sep 2014 14:58:01 +0200 +Sat, 6 Sep 2014 14:36:50 -0600 +Sat, 06 Sep 2014 11:20:05 -0600 +Sat, 6 Sep 2014 15:17:45 -0600 +Sat, 06 Sep 2014 22:14:17 +0200 +Sat, 6 Sep 2014 18:00:55 -0600 +Sun, 7 Sep 2014 11:37:47 -0600 +Sat, 06 Sep 2014 22:50:33 -0600 +Sun, 07 Sep 2014 22:48:13 +0400 +Sun, 7 Sep 2014 13:08:28 -0600 +Sun, 7 Sep 2014 14:20:59 -0600 +Fri, 5 Sep 2014 22:34:33 +0200 +Sun, 7 Sep 2014 21:59:46 -0600 +Mon, 8 Sep 2014 10:14:46 -0600 +Mon, 8 Sep 2014 10:24:01 -0600 +Mon, 8 Sep 2014 10:27:19 -0600 +Mon, 8 Sep 2014 10:27:55 -0600 +Mon, 8 Sep 2014 10:42:45 -0600 +Mon, 08 Sep 2014 10:11:11 -0600 +Mon, 08 Sep 2014 10:18:03 -0600 +Mon, 08 Sep 2014 10:31:44 -0600 +Tue, 2 Sep 2014 12:44:33 -0700 +Tue, 9 Sep 2014 15:30:30 -0600 +Wed, 10 Sep 2014 01:21:52 +0400 +Wed, 10 Sep 2014 01:38:32 +0400 +Tue, 9 Sep 2014 18:52:51 -0600 +Wed, 10 Sep 2014 05:02:51 -0600 +Tue, 09 Sep 2014 22:33:33 -0600 +Mon, 8 Sep 2014 19:06:33 +0200 +Wed, 10 Sep 2014 18:26:40 -0600 +Wed, 10 Sep 2014 18:57:46 -0600 +Thu, 11 Sep 2014 04:51:54 +0400 +Wed, 10 Sep 2014 20:08:32 +0200 +Thu, 11 Sep 2014 05:02:27 +0400 +Thu, 11 Sep 2014 12:39:59 -0600 +Thu, 11 Sep 2014 15:10:52 -0600 +Thu, 11 Sep 2014 14:19:19 -0400 +Thu, 11 Sep 2014 14:53:43 -0400 +Sat, 13 Sep 2014 09:20:09 -0600 +Sat, 13 Sep 2014 07:32:21 -0700 +Sat, 13 Sep 2014 09:47:31 -0600 +Sat, 13 Sep 2014 08:39:38 -0700 +Sat, 13 Sep 2014 10:52:41 -0700 +Sat, 13 Sep 2014 12:30:07 -0600 +Mon, 15 Sep 2014 14:42:37 -0600 +Mon, 15 Sep 2014 14:10:30 -0600 +Tue, 16 Sep 2014 11:08:22 -0600 +Mon, 15 Sep 2014 21:51:03 -0600 +Wed, 17 Sep 2014 15:48:02 -0600 +Tue, 16 Sep 2014 11:12:08 -0600 +Sun, 21 Sep 2014 18:59:42 +0200 +Sun, 21 Sep 2014 11:09:49 -0600 +Sun, 21 Sep 2014 14:17:03 -0600 +Sun, 21 Sep 2014 13:21:52 -0600 +Sun, 21 Sep 2014 22:15:38 -0600 +Mon, 6 Oct 2014 15:31:46 -0600 +Sun, 28 Sep 2014 09:11:41 -0600 +Mon, 06 Oct 2014 19:16:03 -0600 +Sun, 19 Oct 2014 16:45:34 -0600 +Wed, 22 Oct 2014 18:25:10 -0600 +Fri, 24 Oct 2014 06:42:54 +0400 +Sat, 25 Oct 2014 13:43:58 -0600 +Sun, 19 Oct 2014 19:04:14 -0600 +Sat, 8 Nov 2014 11:49:36 -0700 +Sat, 8 Nov 2014 12:03:37 -0700 +Sat, 8 Nov 2014 12:59:20 -0700 +Sun, 9 Nov 2014 11:17:10 -0700 +Sat, 08 Nov 2014 13:53:16 -0500 +Sat, 08 Nov 2014 14:34:29 -0500 +Sat, 08 Nov 2014 15:07:37 -0500 +Sat, 08 Nov 2014 22:19:35 -0700 +Sat, 8 Nov 2014 12:05:10 -0700 +Wed, 12 Nov 2014 16:02:43 -0700 +Tue, 11 Nov 2014 23:27:30 +0000 +Sun, 23 Nov 2014 12:41:05 -0700 +Thu, 27 Nov 2014 15:53:17 -0700 +Thu, 27 Nov 2014 19:10:53 +0300 +Fri, 28 Nov 2014 17:18:12 -1000 +Sun, 23 Nov 2014 21:07:28 +0000 +Fri, 28 Nov 2014 13:03:26 -0700 +Wed, 24 Dec 2014 12:20:54 -0700 +Wed, 31 Dec 2014 12:14:24 -0700 +Wed, 31 Dec 2014 13:21:23 -0700 +Thu, 01 Jan 2015 10:54:32 -0700 +Sat, 03 Jan 2015 18:20:19 -0700 +Wed, 24 Dec 2014 22:26:37 -0700 +Tue, 13 Jan 2015 18:38:57 -0700 +Tue, 13 Jan 2015 22:27:55 -0700 +Tue, 13 Jan 2015 21:52:25 -0700 +Tue, 13 Jan 2015 22:30:57 -0700 +Tue, 20 Jan 2015 15:03:29 -0700 +Fri, 23 Jan 2015 03:37:40 +0000 +Thu, 29 Jan 2015 17:24:25 -0700 +Fri, 30 Jan 2015 09:09:42 -0500 +Sat, 31 Jan 2015 18:57:59 +0000 +Sun, 1 Feb 2015 10:34:49 -0700 +Sun, 8 Feb 2015 09:40:25 -0700 +Sun, 08 Feb 2015 08:48:39 -0700 +Sun, 08 Feb 2015 09:42:52 -0700 +Tue, 10 Feb 2015 15:30:00 -0700 +Tue, 10 Feb 2015 16:47:57 -0700 +Tue, 10 Feb 2015 16:20:31 -0700 +Tue, 10 Feb 2015 15:43:23 -0700 +Wed, 11 Feb 2015 08:35:45 -0700 +Tue, 10 Feb 2015 20:01:44 -0700 +Tue, 10 Feb 2015 16:56:53 -0700 +Tue, 10 Feb 2015 16:01:40 -0700 +Tue, 10 Feb 2015 15:53:55 -0700 +Fri, 13 Feb 2015 08:57:37 -0700 +Fri, 13 Feb 2015 14:48:42 -0700 +Fri, 13 Feb 2015 09:50:46 -0700 +Sat, 14 Feb 2015 08:23:53 -0700 +Sat, 14 Feb 2015 13:58:41 -0700 +Sat, 14 Feb 2015 14:18:11 -0700 +Mon, 16 Feb 2015 07:59:22 -0700 +Sun, 15 Feb 2015 22:09:39 -0700 diff --git a/internal/benchmarks/dateset3_notz.txt b/internal/benchmarks/dateset3_notz.txt new file mode 100644 index 0000000..a9e4fa8 --- /dev/null +++ b/internal/benchmarks/dateset3_notz.txt @@ -0,0 +1,2433 @@ +Wed, 4 Feb 2015 09:24:28 +Wed, 4 Feb 2015 13:30:30 +Wed, 4 Feb 2015 13:50:52 +Wed, 4 Feb 2015 16:05:37 +Wed, 4 Feb 2015 16:36:26 +Thu, 5 Feb 2015 01:56:07 +Thu, 5 Feb 2015 10:10:11 +Thu, 5 Feb 2015 12:08:36 +Fri, 6 Feb 2015 07:47:00 +Fri, 6 Feb 2015 10:42:45 +Fri, 6 Feb 2015 11:31:29 +Fri, 6 Feb 2015 12:07:28 +Sat, 07 Feb 2015 13:21:04 +Sat, 7 Feb 2015 23:42:59 +Sun, 8 Feb 2015 05:53:50 +Sun, 8 Feb 2015 06:14:26 +Sun, 8 Feb 2015 12:02:03 +Sun, 08 Feb 2015 22:45:56 +Mon, 9 Feb 2015 08:11:11 +Mon, 09 Feb 2015 11:09:15 +Mon, 9 Feb 2015 10:43:27 +Mon, 9 Feb 2015 14:09:11 +Mon, 9 Feb 2015 13:29:35 +Mon, 9 Feb 2015 11:27:27 +Mon, 9 Feb 2015 14:02:27 +Mon, 09 Feb 2015 11:55:36 +Mon, 09 Feb 2015 12:15:51 +Mon, 09 Feb 2015 12:27:07 +Mon, 9 Feb 2015 12:48:51 +Mon, 09 Feb 2015 13:06:57 +Mon, 9 Feb 2015 15:05:29 +Mon, 9 Feb 2015 12:24:15 +Mon, 09 Feb 2015 21:26:44 +Mon, 09 Feb 2015 13:25:22 +Mon, 9 Feb 2015 13:48:12 +Mon, 09 Feb 2015 14:07:10 +Mon, 09 Feb 2015 21:31:08 +Mon, 09 Feb 2015 15:00:19 +Mon, 9 Feb 2015 14:09:02 +Mon, 09 Feb 2015 15:14:08 +Mon, 09 Feb 2015 17:02:41 +Mon, 9 Feb 2015 17:11:28 +Mon, 09 Feb 2015 17:16:56 +Tue, 10 Feb 2015 01:09:38 +Mon, 09 Feb 2015 17:44:13 +Mon, 9 Feb 2015 20:24:28 +Mon, 9 Feb 2015 21:42:55 +Mon, 9 Feb 2015 20:28:38 +Mon, 09 Feb 2015 21:57:39 +Mon, 9 Feb 2015 21:23:23 +Mon, 09 Feb 2015 22:38:52 +Mon, 9 Feb 2015 23:36:06 +Tue, 10 Feb 2015 07:29:49 +Mon, 9 Feb 2015 23:07:52 +Mon, 9 Feb 2015 23:55:01 +Tue, 10 Feb 2015 01:19:10 +Tue, 10 Feb 2015 01:30:14 +Tue, 10 Feb 2015 02:04:08 +Tue, 10 Feb 2015 04:07:38 +Tue, 10 Feb 2015 02:33:36 +Tue, 10 Feb 2015 02:35:42 +Tue, 10 Feb 2015 15:41:37 +Tue, 10 Feb 2015 14:42:53 +Tue, 10 Feb 2015 06:26:04 +Tue, 10 Feb 2015 09:27:24 +Tue, 10 Feb 2015 08:11:55 +Tue, 10 Feb 2015 07:14:14 +Tue, 10 Feb 2015 08:19:54 +Tue, 10 Feb 2015 19:32:07 +Tue, 10 Feb 2015 19:32:07 +Tue, 10 Feb 2015 10:41:11 +Tue, 10 Feb 2015 10:50:57 +Tue, 10 Feb 2015 07:51:31 +Tue, 10 Feb 2015 19:53:08 +Tue, 10 Feb 2015 19:53:09 +Tue, 10 Feb 2015 08:53:55 +Tue, 10 Feb 2015 20:07:49 +Tue, 10 Feb 2015 20:07:49 +Tue, 10 Feb 2015 09:08:34 +Tue, 10 Feb 2015 09:23:28 +Tue, 10 Feb 2015 09:31:10 +Tue, 10 Feb 2015 08:34:28 +Tue, 10 Feb 2015 08:29:00 +Tue, 10 Feb 2015 11:21:40 +Tue, 10 Feb 2015 09:57:40 +Tue, 10 Feb 2015 10:01:13 +Tue, 10 Feb 2015 12:12:28 +Tue, 10 Feb 2015 09:14:07 +Tue, 10 Feb 2015 09:33:23 +Tue, 10 Feb 2015 10:41:27 +Tue, 10 Feb 2015 10:53:36 +Tue, 10 Feb 2015 10:04:13 +Tue, 10 Feb 2015 11:03:31 +Tue, 10 Feb 2015 11:26:29 +Tue, 10 Feb 2015 10:28:36 +Tue, 10 Feb 2015 11:06:34 +Tue, 10 Feb 2015 11:16:26 +Tue, 10 Feb 2015 11:30:02 +Tue, 10 Feb 2015 14:40:23 +Tue, 10 Feb 2015 20:01:40 +Tue, 10 Feb 2015 11:56:07 +Tue, 10 Feb 2015 12:01:20 +Tue, 10 Feb 2015 12:12:08 +Tue, 10 Feb 2015 12:20:30 +Tue, 10 Feb 2015 12:36:12 +Tue, 10 Feb 2015 14:35:46 +Tue, 10 Feb 2015 15:07:16 +Tue, 10 Feb 2015 15:25:53 +Tue, 10 Feb 2015 15:28:32 +Tue, 10 Feb 2015 16:31:03 +Tue, 10 Feb 2015 17:12:31 +Tue, 10 Feb 2015 16:42:19 +Tue, 10 Feb 2015 19:46:09 +Tue, 10 Feb 2015 21:25:59 +Tue, 10 Feb 2015 23:29:02 +Tue, 10 Feb 2015 20:43:09 +Tue, 10 Feb 2015 22:55:47 +Tue, 10 Feb 2015 22:29:07 +Tue, 10 Feb 2015 23:50:11 +Tue, 10 Feb 2015 23:12:45 +Wed, 11 Feb 2015 00:41:10 +Wed, 11 Feb 2015 04:30:02 +Wed, 11 Feb 2015 06:47:25 +Wed, 11 Feb 2015 03:53:45 +Wed, 11 Feb 2015 07:21:04 +Wed, 11 Feb 2015 06:17:09 +Wed, 11 Feb 2015 08:55:07 +Wed, 11 Feb 2015 14:06:53 +Wed, 11 Feb 2015 09:19:25 +Wed, 11 Feb 2015 09:40:49 +Wed, 11 Feb 2015 09:30:58 +Wed, 11 Feb 2015 19:48:42 +Wed, 11 Feb 2015 19:48:43 +Wed, 11 Feb 2015 08:00:09 +Wed, 11 Feb 2015 08:16:12 +Wed, 11 Feb 2015 08:09:24 +Wed, 11 Feb 2015 10:56:41 +Wed, 11 Feb 2015 10:01:36 +Wed, 11 Feb 2015 10:07:14 +Wed, 11 Feb 2015 09:10:44 +Wed, 11 Feb 2015 09:11:34 +Wed, 11 Feb 2015 09:17:24 +Wed, 11 Feb 2015 10:32:13 +Wed, 11 Feb 2015 10:57:43 +Wed, 11 Feb 2015 10:56:55 +Wed, 11 Feb 2015 10:03:34 +Wed, 11 Feb 2015 10:43:32 +Wed, 11 Feb 2015 10:14:22 +Wed, 11 Feb 2015 11:21:46 +Mi, 11 Feb 2015 13:33:44 +Wed, 11 Feb 2015 13:39:49 +Wed, 11 Feb 2015 11:45:12 +Wed, 11 Feb 2015 11:52:54 +Wed, 11 Feb 2015 10:50:33 +Wed, 11 Feb 2015 11:03:57 +Wed, 11 Feb 2015 12:19:03 +Wed, 11 Feb 2015 11:54:42 +Wed, 11 Feb 2015 12:38:11 +Wed, 11 Feb 2015 13:31:21 +Wed, 11 Feb 2015 12:33:45 +Wed, 11 Feb 2015 15:40:02 +Wed, 11 Feb 2015 15:48:04 +Wed, 11 Feb 2015 15:50:01 +Wed, 11 Feb 2015 15:55:37 +Wed, 04 Feb 2015 19:46:02 +Wed, 04 Feb 2015 19:52:46 +Wed, 4 Feb 2015 11:52:32 +Thu, 05 Feb 2015 00:53:41 +Thu, 05 Feb 2015 01:07:55 +Thu, 5 Feb 2015 05:59:34 +Thu, 05 Feb 2015 20:39:46 +Thu, 5 Feb 2015 16:25:08 +Fri, 6 Feb 2015 11:20:02 +Fri, 6 Feb 2015 14:44:09 +Sat, 07 Feb 2015 01:49:51 +Sat, 7 Feb 2015 09:48:15 +Sat, 7 Feb 2015 08:40:04 +Sat, 7 Feb 2015 18:31:45 +Sun, 8 Feb 2015 09:23:27 +Sun, 8 Feb 2015 10:19:11 +Mon, 09 Feb 2015 12:46:54 +Mon, 9 Feb 2015 14:42:41 +Tue, 10 Feb 2015 00:44:15 +Tue, 10 Feb 2015 00:44:16 +Tue, 10 Feb 2015 01:24:22 +Tue, 10 Feb 2015 01:24:22 +Mon, 9 Feb 2015 17:32:29 +Mon, 09 Feb 2015 20:57:25 +Mon, 09 Feb 2015 21:18:54 +Tue, 10 Feb 2015 05:33:55 +Tue, 10 Feb 2015 01:04:37 +Tue, 10 Feb 2015 01:41:09 +Tue, 10 Feb 2015 03:40:02 +Tue, 10 Feb 2015 08:20:50 +Tue, 10 Feb 2015 15:06:10 +Tue, 10 Feb 2015 15:06:10 +Tue, 10 Feb 2015 08:45:07 +Tue, 10 Feb 2015 10:49:03 +Tue, 10 Feb 2015 11:05:52 +Tue, 10 Feb 2015 10:13:58 +Tue, 10 Feb 2015 12:01:33 +Tue, 10 Feb 2015 11:27:03 +Tue, 10 Feb 2015 22:55:40 +Tue, 10 Feb 2015 15:28:25 +10 Feb 2015 15:52:59 +Wed, 11 Feb 2015 01:00:57 +Wed, 11 Feb 2015 01:00:57 +Tue, 10 Feb 2015 16:44:13 +Tue, 10 Feb 2015 17:24:35 +Tue, 10 Feb 2015 15:55:06 +Tue, 10 Feb 2015 19:29:15 +Tue, 10 Feb 2015 19:04:23 +Tue, 10 Feb 2015 21:18:20 +Wed, 11 Feb 2015 01:06:51 +Wed, 11 Feb 2015 04:23:23 +Wed, 11 Feb 2015 06:31:06 +Wed, 11 Feb 2015 05:25:22 +Wed, 11 Feb 2015 10:21:43 +Wed, 11 Feb 2015 15:34:49 +Wed, 11 Feb 2015 22:14:10 +Wed, 11 Feb 2015 15:17:33 +Wed, 11 Feb 2015 17:48:41 +Wed, 11 Feb 2015 18:27:49 +Wed, 11 Feb 2015 17:55:37 +Wed, 11 Feb 2015 18:53:11 +Wed, 11 Feb 2015 18:01:00 +Thu, 12 Feb 2015 03:05:11 +Wed, 11 Feb 2015 19:09:23 +Wed, 11 Feb 2015 22:25:13 +Thu, 12 Feb 2015 02:48:02 +Wed, 11 Feb 2015 23:57:01 +Thu, 12 Feb 2015 03:23:40 +Thu, 12 Feb 2015 04:10:21 +Thu, 12 Feb 2015 18:35:23 +Thu, 12 Feb 2015 01:36:43 +Thu, 12 Feb 2015 02:39:49 +Thu, 12 Feb 2015 03:52:34 +Thu, 12 Feb 2015 04:01:36 +Thu, 12 Feb 2015 13:41:35 +Thu, 12 Feb 2015 06:47:45 +Thu, 12 Feb 2015 07:01:31 +Thu, 12 Feb 2015 07:15:32 +Thu, 12 Feb 2015 07:29:38 +Thu, 12 Feb 2015 10:01:56 +Thu, 12 Feb 2015 10:23:15 +Thu, 12 Feb 2015 08:33:35 +Thu, 12 Feb 2015 08:34:28 +Thu, 12 Feb 2015 08:55:18 +Thu, 12 Feb 2015 09:29:56 +Thu, 12 Feb 2015 09:30:56 +Thu, 12 Feb 2015 09:47:02 +Thu, 12 Feb 2015 09:47:54 +Thu, 12 Feb 2015 10:06:08 +Thu, 12 Feb 2015 10:05:09 +Thu, 12 Feb 2015 10:26:44 +Thu, 12 Feb 2015 09:26:44 +Thu, 12 Feb 2015 10:43:49 +Thu, 12 Feb 2015 10:42:55 +Thu, 12 Feb 2015 11:01:53 +Thu, 12 Feb 2015 11:00:59 +Thu, 12 Feb 2015 11:04:10 +Thu, 12 Feb 2015 11:21:50 +Thu, 12 Feb 2015 10:22:18 +Thu, 12 Feb 2015 10:31:42 +Thu, 12 Feb 2015 11:41:30 +Thu, 12 Feb 2015 11:42:26 +Thu, 12 Feb 2015 14:04:08 +Thu, 12 Feb 2015 11:20:48 +Thu, 12 Feb 2015 12:51:39 +Thu, 12 Feb 2015 15:25:47 +Thu, 12 Feb 2015 14:12:31 +Thu, 12 Feb 2015 16:32:34 +Thu, 12 Feb 2015 17:29:45 +Thu, 12 Feb 2015 15:45:20 +Thu, 12 Feb 2015 15:37:39 +Thu, 12 Feb 2015 16:37:50 +Thu, 12 Feb 2015 16:58:41 +Thu, 12 Feb 2015 17:13:12 +Thu, 12 Feb 2015 17:28:11 +Fri, 13 Feb 2015 01:19:14 +Thu, 12 Feb 2015 18:58:25 +Thu, 12 Feb 2015 19:13:39 +Thu, 12 Feb 2015 19:23:54 +Thu, 12 Feb 2015 13:45:30 +Fri, 13 Feb 2015 05:32:12 +Fri, 13 Feb 2015 00:40:04 +Fri, 13 Feb 2015 09:09:15 +Fri, 13 Feb 2015 02:16:13 +Fri, 13 Feb 2015 04:20:58 +Fri, 13 Feb 2015 02:31:47 +Fri, 13 Feb 2015 02:47:15 +Fri, 13 Feb 2015 04:55:58 +Fri, 13 Feb 2015 05:48:11 +Fri, 13 Feb 2015 03:48:25 +Fri, 13 Feb 2015 04:03:41 +Fri, 13 Feb 2015 15:20:25 +Fri, 13 Feb 2015 04:32:54 +Fri, 13 Feb 2015 15:34:25 +Fri, 13 Feb 2015 05:36:43 +Fri, 13 Feb 2015 07:34:53 +Fri, 13 Feb 2015 04:37:23 +Fri, 13 Feb 2015 04:40:00 +Fri, 13 Feb 2015 09:07:44 +Fri, 13 Feb 2015 09:55:39 +Fri, 13 Feb 2015 08:44:56 +Fri, 13 Feb 2015 07:55:46 +Fri, 13 Feb 2015 08:28:01 +Fri, 13 Feb 2015 09:36:31 +Fri, 13 Feb 2015 09:01:05 +Fr, 13 Feb 2015 08:58:48 +Fri, 13 Feb 2015 10:22:01 +Fri, 13 Feb 2015 09:35:25 +Fri, 13 Feb 2015 09:45:51 +Fri, 13 Feb 2015 12:55:54 +Fri, 13 Feb 2015 10:58:29 +Fri, 13 Feb 2015 04:42:37 +Fri, 13 Feb 2015 12:05:41 +Fri, 13 Feb 2015 05:09:41 +Fri, 13 Feb 2015 12:35:14 +Fri, 13 Feb 2015 12:52:21 +Fri, 13 Feb 2015 20:52:52 +Fri, 13 Feb 2015 13:04:35 +Fri, 13 Feb 2015 13:48:58 +Fri, 13 Feb 2015 13:02:04 +Fri, 13 Feb 2015 07:08:13 +Fri, 13 Feb 2015 14:23:40 +Fri, 13 Feb 2015 16:45:56 +Fri, 13 Feb 2015 14:47:38 +Fri, 13 Feb 2015 13:54:31 +Fr, 13 Feb 2015 17:13:55 +Fri, 13 Feb 2015 22:57:46 +Fri, 13 Feb 2015 15:52:08 +Fri, 13 Feb 2015 18:13:39 +Fri, 13 Feb 2015 23:25:57 +Fri, 13 Feb 2015 18:32:49 +Fri, 13 Feb 2015 16:52:35 +Fri, 13 Feb 2015 18:22:43 +Fri, 13 Feb 2015 18:39:11 +Fri, 13 Feb 2015 18:48:29 +Sat, 14 Feb 2015 04:06:54 +Fri, 13 Feb 2015 21:52:16 +Fri, 13 Feb 2015 21:52:30 +Fri, 13 Feb 2015 22:54:38 +Sat, 14 Feb 2015 00:30:41 +Sat, 14 Feb 2015 00:47:06 +Sat, 14 Feb 2015 01:02:50 +Sat, 14 Feb 2015 01:52:07 +Sat, 14 Feb 2015 02:40:52 +Sat, 14 Feb 2015 03:32:12 +Sat, 14 Feb 2015 05:07:56 +Sat, 14 Feb 2015 03:56:52 +Sat, 14 Feb 2015 06:22:26 +Sat, 14 Feb 2015 08:44:14 +Sat, 14 Feb 2015 09:53:00 +Sat, 14 Feb 2015 16:48:53 +Sat, 14 Feb 2015 07:54:39 +Sat, 14 Feb 2015 09:06:32 +Sat, 14 Feb 2015 17:12:36 +Sat, 14 Feb 2015 08:31:33 +Sat, 14 Feb 2015 09:49:01 +Sat, 14 Feb 2015 09:52:03 +Sat, 14 Feb 2015 09:00:47 +Sat, 14 Feb 2015 10:03:53 +Sat, 14 Feb 2015 10:24:59 +Sat, 14 Feb 2015 09:31:34 +Sat, 14 Feb 2015 10:33:48 +Sat, 14 Feb 2015 09:46:34 +Sat, 14 Feb 2015 10:46:16 +Sat, 14 Feb 2015 09:48:11 +Sat, 14 Feb 2015 11:03:08 +Sat, 14 Feb 2015 11:19:16 +Sat, 14 Feb 2015 11:21:23 +Sat, 14 Feb 2015 13:31:04 +Sat, 14 Feb 2015 10:32:26 +Sat, 14 Feb 2015 11:35:33 +Sat, 14 Feb 2015 10:40:05 +Sat, 14 Feb 2015 11:58:22 +Sat, 14 Feb 2015 12:15:58 +Sat, 14 Feb 2015 12:24:48 +Sat, 14 Feb 2015 12:50:05 +Sat, 14 Feb 2015 17:50:52 +Sat, 14 Feb 2015 19:10:04 +Sat, 14 Feb 2015 17:29:08 +Sat, 14 Feb 2015 18:25:56 +Sat, 14 Feb 2015 18:54:02 +Sat, 14 Feb 2015 19:10:16 +Sat, 14 Feb 2015 19:09:29 +Sat, 14 Feb 2015 19:26:18 +Sun, 15 Feb 2015 02:37:04 +Sat, 14 Feb 2015 19:48:50 +Sat, 14 Feb 2015 19:47:54 +Sat, 14 Feb 2015 20:05:04 +Sat, 14 Feb 2015 19:54:21 +Sat, 14 Feb 2015 20:21:28 +Sat, 14 Feb 2015 20:37:41 +Sat, 14 Feb 2015 20:54:09 +Sat, 14 Feb 2015 21:10:50 +Sat, 14 Feb 2015 21:29:12 +Sat, 14 Feb 2015 22:03:35 +Sun, 15 Feb 2015 00:52:58 +Sun, 15 Feb 2015 01:09:40 +Sun, 15 Feb 2015 01:25:44 +Sun, 15 Feb 2015 01:40:40 +Sun, 15 Feb 2015 01:55:18 +Sun, 15 Feb 2015 02:11:20 +Sun, 15 Feb 2015 02:25:06 +Sun, 15 Feb 2015 04:51:01 +Sun, 15 Feb 2015 02:56:40 +Sun, 15 Feb 2015 05:07:03 +Sun, 15 Feb 2015 05:32:22 +Sun, 15 Feb 2015 05:01:42 +Sun, 15 Feb 2015 05:17:03 +Sun, 15 Feb 2015 05:46:21 +Sun, 15 Feb 2015 06:04:49 +Sun, 15 Feb 2015 06:20:47 +Sun, 15 Feb 2015 06:39:33 +Sun, 15 Feb 2015 09:13:20 +Sun, 15 Feb 2015 07:17:44 +Sun, 15 Feb 2015 07:37:30 +Thu, 12 Feb 2015 01:24:30 +Thu, 12 Feb 2015 01:24:30 +Thu, 12 Feb 2015 01:26:33 +Thu, 12 Feb 2015 01:26:34 +Wed, 11 Feb 2015 14:14:13 +Thu, 12 Feb 2015 04:27:10 +Thu, 12 Feb 2015 04:27:09 +Wed, 11 Feb 2015 18:56:32 +Thu, 12 Feb 2015 07:56:16 +Thu, 12 Feb 2015 06:31:19 +Thu, 12 Feb 2015 19:46:57 +Thu, 12 Feb 2015 19:46:56 +Thu, 12 Feb 2015 08:54:14 +Thu, 12 Feb 2015 11:07:31 +Thu, 12 Feb 2015 09:11:58 +Thu, 12 Feb 2015 09:11:05 +12 Feb 2015 11:21:26 +Thu, 12 Feb 2015 10:27:14 +Thu, 12 Feb 2015 11:21:51 +Thu, 12 Feb 2015 11:20:56 +Fri, 13 Feb 2015 01:37:30 +Fri, 13 Feb 2015 01:37:31 +Fri, 13 Feb 2015 01:37:40 +Fri, 13 Feb 2015 01:37:39 +Thu, 12 Feb 2015 16:50:23 +Thu, 12 Feb 2015 23:39:14 +Thu, 12 Feb 2015 19:43:33 +Thu, 12 Feb 2015 20:30:28 +Thu, 12 Feb 2015 21:28:31 +Fri, 13 Feb 2015 08:08:21 +Fri, 13 Feb 2015 07:29:19 +Fri, 13 Feb 2015 14:24:37 +Fri, 13 Feb 2015 20:07:01 +Fri, 13 Feb 2015 20:07:01 +Fri, 13 Feb 2015 12:03:42 +Fri, 13 Feb 2015 10:44:50 +Fri, 13 Feb 2015 20:29:43 +Fri, 13 Feb 2015 14:45:52 +Fri, 13 Feb 2015 15:25:13 +Fri, 13 Feb 2015 15:38:04 +Fri, 13 Feb 2015 18:00:10 +Fri, 13 Feb 2015 17:37:08 +Sat, 14 Feb 2015 01:18:18 +Sat, 14 Feb 2015 02:08:23 +Sat, 14 Feb 2015 02:24:37 +Sat, 14 Feb 2015 02:57:22 +Sat, 14 Feb 2015 03:13:41 +Sat, 14 Feb 2015 20:16:03 +Sat, 14 Feb 2015 09:27:51 +Sat, 14 Feb 2015 08:26:34 +Sat, 14 Feb 2015 11:25:46 +Sat, 14 Feb 2015 11:45:23 +Sat, 14 Feb 2015 15:35:37 +Sat, 14 Feb 2015 16:12:27 +Sun, 15 Feb 2015 10:41:44 +Sun, 15 Feb 2015 11:26:44 +Sun, 15 Feb 2015 04:43:35 +Sun, 15 Feb 2015 06:58:53 +Sun, 15 Feb 2015 08:51:06 +Sun, 15 Feb 2015 09:10:26 +Sun, 15 Feb 2015 07:57:44 +Sun, 15 Feb 2015 08:14:00 +Sun, 15 Feb 2015 08:29:02 +Sun, 15 Feb 2015 08:45:35 +Sun, 15 Feb 2015 09:02:59 +Sun, 15 Feb 2015 09:08:55 +Sun, 15 Feb 2015 09:22:24 +Sun, 15 Feb 2015 08:24:17 +Sun, 15 Feb 2015 10:01:28 +Sun, 15 Feb 2015 09:12:28 +Sun, 15 Feb 2015 12:50:01 +Sun, 15 Feb 2015 10:51:51 +Sun, 15 Feb 2015 11:37:01 +Sun, 15 Feb 2015 10:07:50 +Sun, 15 Feb 2015 10:00:29 +Sun, 15 Feb 2015 10:51:38 +Sun, 15 Feb 2015 11:06:14 +Sun, 15 Feb 2015 19:43:48 +Sun, 15 Feb 2015 11:41:50 +Sun, 15 Feb 2015 11:29:25 +Sun, 15 Feb 2015 14:59:45 +Sun, 15 Feb 2015 13:27:25 +Sun, 15 Feb 2015 15:47:07 +Sun, 15 Feb 2015 18:50:09 +Sun, 15 Feb 2015 17:48:23 +Sun, 15 Feb 2015 18:22:42 +Sun, 15 Feb 2015 18:36:13 +Sun, 15 Feb 2015 19:05:35 +Sun, 15 Feb 2015 19:34:39 +Sun, 15 Feb 2015 19:48:35 +Sun, 15 Feb 2015 20:16:29 +Mon, 16 Feb 2015 05:17:51 +Mon, 16 Feb 2015 05:25:48 +Mon, 16 Feb 2015 00:29:51 +Mon, 16 Feb 2015 00:50:38 +Mon, 16 Feb 2015 01:46:08 +Mon, 16 Feb 2015 02:01:28 +Mon, 16 Feb 2015 02:32:12 +Mon, 16 Feb 2015 04:29:23 +Mon, 16 Feb 2015 04:14:14 +Mon, 16 Feb 2015 02:46:44 +Mon, 16 Feb 2015 04:46:34 +Mon, 16 Feb 2015 03:02:38 +Mon, 16 Feb 2015 03:32:25 +Mon, 16 Feb 2015 03:46:41 +Mon, 16 Feb 2015 04:00:48 +Mon, 16 Feb 2015 04:15:16 +Mon, 16 Feb 2015 04:30:18 +Mon, 16 Feb 2015 04:44:57 +Mon, 16 Feb 2015 12:09:36 +Mon, 16 Feb 2015 07:35:10 +Mon, 16 Feb 2015 07:37:37 +Mon, 16 Feb 2015 06:48:11 +Mon, 16 Feb 2015 10:09:46 +Mon, 16 Feb 2015 07:28:20 +Mon, 16 Feb 2015 11:22:43 +Mon, 16 Feb 2015 17:00:56 +Mon, 16 Feb 2015 13:25:50 +Mon, 16 Feb 2015 13:52:21 +Mon, 16 Feb 2015 12:39:19 +Mon, 16 Feb 2015 07:13:11 +Mon, 16 Feb 2015 14:15:17 +Mon, 16 Feb 2015 14:31:39 +Mon, 16 Feb 2015 15:03:57 +Mon, 16 Feb 2015 15:34:21 +Mon, 16 Feb 2015 16:07:10 +Mon, 16 Feb 2015 20:16:31 +Mon, 16 Feb 2015 19:20:42 +Mon, 16 Feb 2015 20:46:28 +Tue, 17 Feb 2015 01:05:29 +Mon, 16 Feb 2015 23:11:56 +Mon, 16 Feb 2015 23:33:34 +Mon, 16 Feb 2015 23:55:51 +Tue, 17 Feb 2015 03:06:22 +Tue, 17 Feb 2015 03:55:10 +Tue, 17 Feb 2015 03:03:47 +Tue, 17 Feb 2015 05:14:48 +Tue, 17 Feb 2015 07:00:14 +Tue, 17 Feb 2015 08:10:03 +Tue, 17 Feb 2015 09:16:20 +Tue, 17 Feb 2015 07:45:12 +Tue, 17 Feb 2015 09:41:13 +Tue, 17 Feb 2015 09:03:13 +Tue, 17 Feb 2015 09:39:38 +Tue, 17 Feb 2015 08:43:10 +Tue, 17 Feb 2015 08:45:00 +Tue, 17 Feb 2015 09:02:30 +Tue, 17 Feb 2015 10:15:34 +Tue, 17 Feb 2015 09:30:41 +Tue, 17 Feb 2015 09:33:21 +Tue, 17 Feb 2015 12:58:34 +Tue, 17 Feb 2015 11:16:20 +Tue, 17 Feb 2015 11:22:37 +Tue, 17 Feb 2015 11:36:41 +Tue, 17 Feb 2015 12:08:59 +Tue, 17 Feb 2015 12:15:01 +Tue, 17 Feb 2015 12:26:08 +Tue, 17 Feb 2015 11:32:04 +Tue, 17 Feb 2015 12:43:56 +Tue, 17 Feb 2015 06:00:47 +Tue, 17 Feb 2015 13:21:16 +Tue, 17 Feb 2015 12:42:10 +Tue, 17 Feb 2015 13:48:26 +Tue, 17 Feb 2015 13:00:55 +Tue, 17 Feb 2015 14:10:45 +Tue, 17 Feb 2015 16:50:26 +Tue, 17 Feb 2015 15:59:08 +Tue, 17 Feb 2015 16:18:40 +Tue, 17 Feb 2015 16:52:07 +Tue, 17 Feb 2015 17:07:53 +Tue, 17 Feb 2015 16:08:27 +Tue, 17 Feb 2015 17:25:24 +Tue, 17 Feb 2015 17:42:17 +Sun, 15 Feb 2015 17:19:40 +Sun, 15 Feb 2015 10:52:47 +Sun, 15 Feb 2015 12:34:31 +Sun, 15 Feb 2015 14:51:01 +Sun, 15 Feb 2015 15:26:45 +Sun, 15 Feb 2015 13:03:25 +Sun, 15 Feb 2015 21:34:37 +Sun, 15 Feb 2015 17:19:21 +Mon, 16 Feb 2015 09:18:21 +Mon, 16 Feb 2015 00:08:04 +Mon, 16 Feb 2015 05:54:13 +Mon, 16 Feb 2015 02:13:41 +Mon, 16 Feb 2015 03:17:50 +Mon, 16 Feb 2015 06:36:06 +Mon, 16 Feb 2015 07:18:58 +Mon, 16 Feb 2015 05:48:26 +Mon, 16 Feb 2015 08:44:45 +Mon, 16 Feb 2015 09:57:38 +Mon, 16 Feb 2015 15:01:15 +Mon, 16 Feb 2015 15:04:59 +Mon, 16 Feb 2015 15:08:33 +Mon, 16 Feb 2015 08:26:22 +Mon, 16 Feb 2015 10:43:13 +Mon, 16 Feb 2015 08:48:06 +Mon, 16 Feb 2015 10:16:38 +Mon, 16 Feb 2015 10:36:35 +Mon, 16 Feb 2015 11:02:03 +Mon, 16 Feb 2015 13:08:18 +Mon, 16 Feb 2015 18:18:24 +Mon, 16 Feb 2015 11:28:41 +Mon, 16 Feb 2015 11:46:12 +Mon, 16 Feb 2015 12:03:48 +Mon, 16 Feb 2015 12:22:27 +Mon, 16 Feb 2015 15:49:58 +Mon, 16 Feb 2015 16:21:15 +Tue, 17 Feb 2015 04:00:04 +Tue, 17 Feb 2015 04:00:04 +Mon, 16 Feb 2015 16:10:41 +Tue, 17 Feb 2015 04:15:07 +Tue, 17 Feb 2015 04:15:07 +Mon, 16 Feb 2015 17:40:58 +Mon, 16 Feb 2015 18:02:18 +Tue, 17 Feb 2015 05:11:17 +Tue, 17 Feb 2015 05:11:18 +Mon, 16 Feb 2015 18:46:29 +Mon, 16 Feb 2015 19:02:32 +Mon, 16 Feb 2015 19:37:00 +Mon, 16 Feb 2015 19:54:38 +Tue, 17 Feb 2015 04:42:03 +Tue, 17 Feb 2015 07:00:48 +Tue, 17 Feb 2015 11:07:04 +Tue, 17 Feb 2015 01:16:47 +Tue, 17 Feb 2015 01:37:36 +Tue, 17 Feb 2015 12:19:35 +Tue, 17 Feb 2015 08:26:02 +Tue, 17 Feb 2015 10:09:09 +Tue, 17 Feb 2015 08:53:10 +Tue, 17 Feb 2015 09:42:08 +Tue, 17 Feb 2015 09:57:48 +17 Feb 2015 12:03:59 +Tue, 17 Feb 2015 21:14:21 +Tue, 17 Feb 2015 21:14:21 +Tue, 17 Feb 2015 21:19:17 +Tue, 17 Feb 2015 21:19:17 +Tue, 17 Feb 2015 18:23:55 +Tue, 17 Feb 2015 10:55:28 +Tue, 17 Feb 2015 13:32:01 +Tue, 17 Feb 2015 14:40:27 +Tue, 17 Feb 2015 13:25:22 +Tue, 17 Feb 2015 22:50:04 +Tue, 17 Feb 2015 15:54:39 +Tue, 17 Feb 2015 16:04:59 +Wed, 18 Feb 2015 01:22:03 +Wed, 18 Feb 2015 01:22:03 +Tue, 17 Feb 2015 14:54:22 +Tue, 17 Feb 2015 15:28:02 +Tue, 17 Feb 2015 17:58:20 +Thu, 01 Jan 2009 11:18:47 +Thu, 01 Jan 2009 13:29:03 +Thu, 01 Jan 2009 13:38:55 +Fri, 2 Jan 2009 08:39:25 +Fri, 2 Jan 2009 11:31:09 +Mon, 05 Jan 2009 15:28:44 +Wed, 07 Jan 2009 10:18:53 +Wed, 07 Jan 2009 11:47:13 +Thu, 08 Jan 2009 13:02:12 +Thu, 08 Jan 2009 11:54:13 +Thu, 8 Jan 2009 23:12:37 +Thu, 08 Jan 2009 21:15:22 +Thu, 15 Jan 2009 18:43:37 +Wed, 21 Jan 2009 11:42:10 +Thu, 22 Jan 2009 12:45:48 +Thu, 22 Jan 2009 09:02:21 +Thu, 22 Jan 2009 09:12:07 +Thu, 22 Jan 2009 09:41:30 +Sat, 24 Jan 2009 12:14:26 +Tue, 27 Jan 2009 13:09:12 +Fri, 30 Jan 2009 14:01:28 +Fri, 30 Jan 2009 08:22:01 +Fri, 30 Jan 2009 16:02:47 +Mon, 02 Feb 2009 12:44:40 +Mon, 02 Feb 2009 13:06:28 +Mon, 02 Feb 2009 13:11:54 +Mon, 02 Feb 2009 13:15:14 +Mon, 02 Feb 2009 13:21:12 +Wed, 04 Feb 2009 16:35:19 +Wed, 04 Feb 2009 17:07:32 +Wed, 04 Feb 2009 17:26:22 +Wed, 04 Feb 2009 19:17:25 +Sun, 08 Feb 2009 18:33:04 +Sun, 08 Feb 2009 20:44:04 +10 Feb 2009 13:51:28 +Wed, 11 Feb 2009 16:21:24 +Wed, 11 Feb 2009 18:59:35 +Thu, 19 Feb 2009 12:00:06 +Thu, 19 Feb 2009 14:24:27 +Thu, 19 Feb 2009 13:39:46 +19 Feb 2009 15:52:41 +Thu, 19 Feb 2009 14:33:04 +Fri, 20 Feb 2009 12:19:28 +Fri, 20 Feb 2009 12:31:13 +Fri, 20 Feb 2009 13:11:18 +Fri, 20 Feb 2009 14:50:14 +Fri, 20 Feb 2009 15:02:19 +Fri, 20 Feb 2009 16:38:55 +Sun, 22 Feb 2009 14:39:57 +Sun, 22 Feb 2009 15:15:36 +Mon, 23 Feb 2009 20:46:56 +Tue, 24 Feb 2009 09:29:19 +Tue, 24 Feb 2009 09:56:34 +Tue, 24 Feb 2009 14:05:20 +Tue, 24 Feb 2009 16:17:03 +Thu, 26 Feb 2009 14:22:03 +Fri, 27 Feb 2009 07:27:05 +Fri, 27 Feb 2009 11:53:56 +Fri, 27 Feb 2009 12:01:43 +Mon, 2 Mar 2009 11:28:41 +Mon, 02 Mar 2009 10:56:16 +Mon, 2 Mar 2009 12:25:31 +Mon, 02 Mar 2009 12:09:15 +02 Mar 2009 14:22:43 +Mon, 02 Mar 2009 14:23:16 +Mon, 2 Mar 2009 16:01:01 +Tue, 3 Mar 2009 10:00:44 +Tue, 03 Mar 2009 17:18:18 +Thu, 05 Mar 2009 23:46:56 +Tue, 17 Mar 2009 14:06:21 +Tue, 24 Mar 2009 10:51:54 +Tue, 24 Mar 2009 11:55:26 +Tue, 24 Mar 2009 12:50:00 +Tue, 24 Mar 2009 17:55:12 +Fri, 03 Apr 2009 14:06:55 +Sun, 05 Apr 2009 09:50:38 +Sun, 05 Apr 2009 10:08:56 +Sun, 05 Apr 2009 22:47:21 +Mon, 13 Apr 2009 19:36:59 +Tue, 14 Apr 2009 05:27:13 +Wed, 15 Apr 2009 12:35:02 +Wed, 15 Apr 2009 13:57:36 +Wed, 15 Apr 2009 15:13:47 +Wed, 15 Apr 2009 15:26:26 +Wed, 15 Apr 2009 15:44:13 +Sun, 19 Apr 2009 10:49:05 +Sun, 19 Apr 2009 12:19:16 +Sun, 19 Apr 2009 19:35:16 +Mon, 20 Apr 2009 18:05:02 +Mon, 20 Apr 2009 18:26:42 +Mon, 20 Apr 2009 18:49:05 +Fri, 1 May 2009 15:19:13 +Fri, 01 May 2009 17:25:09 +Mon, 4 May 2009 18:00:18 +Mon, 04 May 2009 19:15:33 +Tue, 05 May 2009 14:03:21 +Tue, 05 May 2009 22:34:27 +Wed, 06 May 2009 17:50:01 +Wed, 06 May 2009 12:28:30 +Wed, 06 May 2009 12:41:02 +Thu, 07 May 2009 15:50:04 +Sat, 09 May 2009 12:15:13 +Wed, 13 May 2009 22:20:49 +Thu, 14 May 2009 09:49:27 +Thu, 14 May 2009 11:02:53 +Mon, 18 May 2009 21:33:07 +Tue, 26 May 2009 16:07:10 +Tue, 26 May 2009 14:17:18 +Tue, 26 May 2009 17:22:33 +Tue, 26 May 2009 16:19:15 +Tue, 26 May 2009 20:07:21 +Tue, 26 May 2009 19:41:30 +Sun, 07 Jun 2009 14:41:09 +Tue, 09 Jun 2009 09:37:11 +Tue, 9 Jun 2009 23:03:08 +Wed, 10 Jun 2009 12:33:03 +Wed, 10 Jun 2009 16:28:17 +Thu, 11 Jun 2009 14:09:21 +Sun, 14 Jun 2009 13:52:35 +Mon, 15 Jun 2009 11:29:25 +Tue, 16 Jun 2009 13:57:44 +Thu, 25 Jun 2009 11:00:53 +Fri, 26 Jun 2009 09:19:54 +Sun, 28 Jun 2009 21:15:46 +Sun, 28 Jun 2009 21:21:46 +Sun, 28 Jun 2009 21:27:01 +Mon, 29 Jun 2009 10:08:11 +Wed, 01 Jul 2009 16:43:31 +Sun, 12 Jul 2009 18:04:51 +12 Jul 2009 20:11:00 +Sun, 12 Jul 2009 18:24:35 +12 Jul 2009 20:45:12 +Sun, 12 Jul 2009 19:24:13 +12 Jul 2009 21:52:19 +Sat, 18 Jul 2009 03:16:05 +Fri, 17 Jul 2009 16:12:28 +Wed, 22 Jul 2009 19:37:43 +Wed, 22 Jul 2009 19:42:59 +Thu, 23 Jul 2009 03:36:38 +Fri, 24 Jul 2009 15:53:51 +Sat, 25 Jul 2009 00:30:21 +Sat, 25 Jul 2009 03:19:36 +Sat, 25 Jul 2009 08:13:57 +Sat, 25 Jul 2009 11:22:28 +Sat, 25 Jul 2009 15:59:49 +Sat, 25 Jul 2009 16:45:34 +Sat, 25 Jul 2009 17:30:21 +Sun, 26 Jul 2009 08:28:34 +Sat, 01 Aug 2009 15:40:25 +Sun, 02 Aug 2009 10:57:33 +Sun, 02 Aug 2009 12:08:39 +Sun, 02 Aug 2009 12:14:45 +Sun, 02 Aug 2009 17:56:39 +Mon, 03 Aug 2009 08:57:17 +Mon, 03 Aug 2009 11:12:03 +Mon, 03 Aug 2009 14:38:36 +Mon, 03 Aug 2009 17:04:11 +Mon, 3 Aug 2009 21:41:24 +3 Aug 2009 23:40:03 +Tue, 04 Aug 2009 08:16:35 +Tue, 04 Aug 2009 16:32:54 +Tue, 04 Aug 2009 16:53:17 +Tue, 04 Aug 2009 17:40:36 +Tue, 04 Aug 2009 17:47:28 +Tue, 04 Aug 2009 17:54:38 +Tue, 04 Aug 2009 18:02:26 +Tue, 04 Aug 2009 18:17:48 +Wed, 5 Aug 2009 10:24:52 +Wed, 5 Aug 2009 10:26:49 +Wed, 05 Aug 2009 05:47:09 +Wed, 05 Aug 2009 05:52:12 +Thu, 06 Aug 2009 12:46:28 +Fri, 07 Aug 2009 16:15:06 +Sat, 8 Aug 2009 08:22:42 +Sun, 09 Aug 2009 16:06:06 +Sun, 09 Aug 2009 16:48:40 +Thu, 13 Aug 2009 10:07:51 +Sat, 15 Aug 2009 14:13:03 +Tue, 18 Aug 2009 13:57:52 +Tue, 18 Aug 2009 18:02:33 +Wed, 19 Aug 2009 09:21:46 +Wed, 19 Aug 2009 10:29:24 +Wed, 19 Aug 2009 21:08:58 +Wed, 19 Aug 2009 21:10:57 +Wed, 19 Aug 2009 21:17:39 +Wed, 19 Aug 2009 21:21:23 +Mon, 07 Sep 2009 20:54:14 +Mon, 07 Sep 2009 22:18:58 +Thu, 17 Sep 2009 17:07:01 +Fri, 18 Sep 2009 17:43:17 +Fri, 18 Sep 2009 11:48:45 +Mon, 21 Sep 2009 10:00:57 +Mon, 21 Sep 2009 12:26:22 +Mon, 21 Sep 2009 23:02:59 +Wed, 23 Sep 2009 10:05:17 +Wed, 23 Sep 2009 12:46:13 +Sun, 27 Sep 2009 10:45:38 +Sun, 27 Sep 2009 10:55:45 +Sun, 27 Sep 2009 11:00:39 +Sun, 27 Sep 2009 11:08:58 +Thu, 1 Oct 2009 09:16:44 +2 Oct 2009 19:00:09 +3 Oct 2009 13:45:07 +Wed, 07 Oct 2009 11:48:00 +Wed, 7 Oct 2009 13:58:17 +Wed, 14 Oct 2009 10:12:45 +Wed, 14 Oct 2009 18:13:48 +Wed, 14 Oct 2009 18:30:13 +Fri, 16 Oct 2009 18:46:33 +Sat, 17 Oct 2009 16:16:08 +Mon, 19 Oct 2009 11:12:51 +Mon, 19 Oct 2009 17:15:07 +Tue, 20 Oct 2009 11:02:57 +Sat, 24 Oct 2009 10:46:04 +Sat, 24 Oct 2009 10:55:06 +Sun, 25 Oct 2009 08:30:45 +Sun, 25 Oct 2009 11:44:22 +Thu, 29 Oct 2009 09:33:56 +Thu, 29 Oct 2009 10:30:23 +Thu, 29 Oct 2009 11:03:34 +Sat, 31 Oct 2009 17:14:24 +Sun, 01 Nov 2009 10:12:13 +Sun, 01 Nov 2009 21:13:30 +Sun, 01 Nov 2009 21:16:47 +Tue, 03 Nov 2009 21:27:30 +Wed, 04 Nov 2009 08:03:08 +Wed, 04 Nov 2009 14:14:25 +Wed, 04 Nov 2009 21:17:28 +Thu, 05 Nov 2009 10:27:53 +Thu, 05 Nov 2009 11:09:54 +Thu, 05 Nov 2009 11:15:29 +Thu, 05 Nov 2009 11:32:40 +Fri, 06 Nov 2009 09:04:26 +Fri, 06 Nov 2009 11:02:00 +Fri, 06 Nov 2009 13:30:53 +Fri, 06 Nov 2009 14:54:13 +Fri, 06 Nov 2009 22:50:16 +Sun, 08 Nov 2009 17:57:38 +Sun, 08 Nov 2009 18:50:13 +Sun, 08 Nov 2009 22:19:55 +Mon, 09 Nov 2009 08:18:51 +Mon, 09 Nov 2009 08:28:57 +Mon, 9 Nov 2009 22:14:36 +Thu, 19 Nov 2009 21:07:05 +Fri, 20 Nov 2009 18:57:33 +Fri, 20 Nov 2009 21:57:33 +Wed, 25 Nov 2009 12:43:20 +Wed, 25 Nov 2009 14:11:07 +Sat, 05 Dec 2009 12:47:19 +Sat, 05 Dec 2009 14:11:31 +Sat, 05 Dec 2009 16:10:31 +Sun, 06 Dec 2009 00:15:15 +Sun, 06 Dec 2009 13:00:31 +Sun, 06 Dec 2009 14:15:07 +Sun, 06 Dec 2009 14:43:04 +Sun, 06 Dec 2009 14:52:57 +Sun, 06 Dec 2009 15:53:39 +Sun, 06 Dec 2009 16:16:02 +Sun, 06 Dec 2009 16:29:05 +Sun, 06 Dec 2009 16:46:40 +Sun, 06 Dec 2009 17:04:25 +Sun, 06 Dec 2009 19:06:56 +Sat, 12 Dec 2009 12:29:21 +Sat, 12 Dec 2009 12:45:06 +Sun, 13 Dec 2009 11:05:55 +Sun, 13 Dec 2009 14:46:10 +Mon, 14 Dec 2009 10:53:07 +Mon, 14 Dec 2009 21:21:17 +Mon, 14 Dec 2009 11:38:10 +Mon, 14 Dec 2009 12:49:52 +Mon, 14 Dec 2009 23:04:15 +Wed, 16 Dec 2009 14:22:11 +Tue, 22 Dec 2009 08:25:00 +Thu, 24 Dec 2009 15:45:35 +Fri, 25 Dec 2009 12:41:21 +Thu, 31 Dec 2009 10:40:13 +Thu, 31 Dec 2009 12:49:18 +Thu, 31 Dec 2009 13:30:33 +Thu, 31 Dec 2009 13:44:24 +Thu, 31 Dec 2009 13:49:25 +Thu, 31 Dec 2009 15:10:52 +Thu, 31 Dec 2009 19:39:30 +Thu, 31 Dec 2009 19:43:34 +Thu, 31 Dec 2009 19:58:27 +Fri, 01 Jan 2010 12:14:40 +Fri, 01 Jan 2010 10:59:07 +Fri, 01 Jan 2010 12:45:16 +Sat, 02 Jan 2010 16:26:04 +Mon, 04 Jan 2010 09:35:30 +Mon, 04 Jan 2010 10:30:10 +Mon, 04 Jan 2010 11:41:14 +Tue, 12 Jan 2010 11:50:35 +Tue, 12 Jan 2010 12:11:55 +Tue, 12 Jan 2010 14:36:40 +Tue, 12 Jan 2010 21:38:34 +Wed, 13 Jan 2010 09:53:08 +Fri, 15 Jan 2010 20:42:47 +Sat, 16 Jan 2010 23:26:44 +Sun, 17 Jan 2010 09:01:09 +Mon, 01 Feb 2010 16:05:15 +Wed, 03 Feb 2010 19:06:05 +Wed, 03 Feb 2010 21:00:56 +Wed, 03 Feb 2010 21:13:30 +Thu, 4 Feb 2010 18:07:25 +Fri, 05 Feb 2010 18:06:09 +Fri, 05 Feb 2010 18:15:46 +Fri, 05 Feb 2010 22:49:35 +Sat, 6 Feb 2010 06:57:04 +Sat, 06 Feb 2010 13:49:23 +Sun, 07 Feb 2010 11:42:21 +Tue, 09 Feb 2010 22:05:24 +Wed, 10 Feb 2010 00:27:51 +Wed, 10 Feb 2010 16:24:46 +Wed, 10 Feb 2010 21:32:28 +Thu, 11 Feb 2010 18:32:04 +Sat, 13 Feb 2010 13:29:05 +Mon, 15 Feb 2010 15:15:14 +Wed, 17 Feb 2010 10:52:35 +Wed, 17 Feb 2010 13:24:45 +Wed, 17 Feb 2010 17:55:15 +Wed, 17 Feb 2010 18:07:01 +Thu, 18 Feb 2010 11:23:22 +Thu, 18 Feb 2010 11:38:48 +Thu, 18 Feb 2010 19:53:03 +Fri, 19 Feb 2010 10:13:23 +Mon, 22 Feb 2010 17:06:07 +Fri, 26 Feb 2010 14:03:39 +Fri, 26 Feb 2010 15:26:29 +Sat, 27 Feb 2010 08:48:19 +Sat, 27 Feb 2010 08:51:14 +Sat, 27 Feb 2010 07:54:49 +Sat, 27 Feb 2010 08:02:42 +Sat, 27 Feb 2010 09:21:30 +Sat, 27 Feb 2010 09:23:51 +Sat, 27 Feb 2010 11:58:40 +Sat, 27 Feb 2010 13:05:51 +Sat, 27 Feb 2010 13:30:10 +Sat, 27 Feb 2010 13:51:46 +Sat, 27 Feb 2010 17:40:52 +Sun, 28 Feb 2010 07:52:36 +Sun, 28 Feb 2010 09:22:43 +Sun, 28 Feb 2010 14:18:39 +Sun, 28 Feb 2010 15:28:11 +Mon, 1 Mar 2010 11:21:30 +Mon, 01 Mar 2010 14:22:12 +Wed, 03 Mar 2010 19:12:34 +Wed, 03 Mar 2010 19:17:48 +3 Mar 2010 23:45:06 +Wed, 03 Mar 2010 22:44:36 +Thu, 04 Mar 2010 11:25:27 +Fri, 05 Mar 2010 13:08:16 +Fri, 05 Mar 2010 13:18:24 +Wed, 10 Mar 2010 10:56:45 +Wed, 10 Mar 2010 17:25:03 +Wed, 10 Mar 2010 20:45:29 +Thu, 11 Mar 2010 09:10:01 +Tue, 16 Mar 2010 09:33:34 +Fri, 19 Mar 2010 16:30:42 +Sun, 21 Mar 2010 16:56:12 +Sun, 21 Mar 2010 22:12:46 +Mon, 22 Mar 2010 20:34:38 +Tue, 23 Mar 2010 17:13:26 +Sun, 28 Mar 2010 14:06:30 +Thu, 15 Apr 2010 17:38:01 +Thu, 15 Apr 2010 09:43:17 +Thu, 15 Apr 2010 12:09:55 +Fri, 16 Apr 2010 13:11:21 +Fri, 16 Apr 2010 19:38:45 +Sat, 17 Apr 2010 17:16:06 +Fri, 23 Apr 2010 12:31:07 +Fri, 23 Apr 2010 12:37:38 +Fri, 23 Apr 2010 12:40:00 +Tue, 27 Apr 2010 19:09:45 +Tue, 27 Apr 2010 23:34:13 +Fri, 30 Apr 2010 04:28:38 +Fri, 30 Apr 2010 23:45:19 +Sun, 02 May 2010 11:59:23 +Mon, 03 May 2010 00:04:46 +Wed, 05 May 2010 18:36:32 +Wed, 05 May 2010 22:26:50 +Thu, 06 May 2010 15:12:22 +Thu, 06 May 2010 16:12:58 +Thu, 06 May 2010 16:37:33 +Thu, 06 May 2010 17:10:08 +Thu, 06 May 2010 18:06:29 +Thu, 06 May 2010 18:35:03 +Thu, 06 May 2010 18:48:15 +Thu, 06 May 2010 20:57:54 +Thu, 06 May 2010 22:18:40 +Thu, 06 May 2010 22:20:01 +Fri, 07 May 2010 13:04:05 +Fri, 07 May 2010 13:19:45 +Fri, 07 May 2010 14:23:11 +Fri, 07 May 2010 14:41:29 +Fri, 07 May 2010 17:52:04 +Wed, 12 May 2010 09:02:57 +Wed, 12 May 2010 09:06:08 +Wed, 12 May 2010 10:34:04 +Wed, 12 May 2010 11:42:16 +Wed, 12 May 2010 13:11:36 +Wed, 12 May 2010 13:57:44 +Thu, 13 May 2010 12:08:21 +Thu, 13 May 2010 22:38:22 +Thu, 13 May 2010 22:58:37 +Thu, 13 May 2010 23:57:42 +Fri, 14 May 2010 08:06:08 +Sat, 15 May 2010 09:33:55 +Sat, 15 May 2010 10:09:11 +Sun, 16 May 2010 08:06:12 +Sun, 16 May 2010 11:34:45 +Sun, 16 May 2010 12:39:37 +Sun, 16 May 2010 23:44:31 +Sat, 22 May 2010 23:07:47 +Fri, 28 May 2010 14:11:32 +Fri, 28 May 2010 15:17:29 +Fri, 28 May 2010 20:49:03 +Fri, 28 May 2010 23:41:23 +Sat, 29 May 2010 12:55:47 +Sat, 29 May 2010 13:08:02 +Sat, 29 May 2010 17:46:07 +Mon, 31 May 2010 12:45:24 +Mon, 31 May 2010 16:06:36 +Mon, 31 May 2010 16:18:42 +Mon, 31 May 2010 16:42:38 +Mon, 31 May 2010 20:53:07 +Tue, 01 Jun 2010 08:57:28 +Tue, 01 Jun 2010 09:58:31 +Tue, 1 Jun 2010 20:14:46 +Tue, 01 Jun 2010 21:07:43 +Thu, 03 Jun 2010 12:51:22 +Thu, 3 Jun 2010 21:26:29 +Fri, 04 Jun 2010 15:28:11 +Sat, 5 Jun 2010 00:50:18 +Fri, 04 Jun 2010 19:47:06 +Tue, 8 Jun 2010 05:57:02 +Tue, 08 Jun 2010 08:02:34 +Tue, 8 Jun 2010 21:30:25 +Tue, 8 Jun 2010 22:25:02 +Thu, 10 Jun 2010 16:00:40 +Thu, 10 Jun 2010 10:03:40 +Thu, 10 Jun 2010 10:25:33 +Thu, 10 Jun 2010 12:06:46 +Fri, 11 Jun 2010 22:29:16 +Sun, 13 Jun 2010 20:56:32 +Wed, 16 Jun 2010 21:43:19 +Thu, 17 Jun 2010 09:56:43 +Thu, 17 Jun 2010 11:40:05 +Fri, 18 Jun 2010 16:00:11 +Fri, 18 Jun 2010 22:25:45 +Sat, 19 Jun 2010 09:09:24 +Sun, 20 Jun 2010 19:14:29 +Sun, 20 Jun 2010 20:15:23 +Sun, 20 Jun 2010 21:24:47 +Sun, 20 Jun 2010 21:37:42 +Mon, 21 Jun 2010 14:29:40 +Mon, 21 Jun 2010 16:17:17 +Mon, 21 Jun 2010 21:48:12 +Mon, 21 Jun 2010 22:23:31 +Mon, 21 Jun 2010 23:10:58 +Mon, 21 Jun 2010 23:19:31 +Tue, 22 Jun 2010 11:23:26 +Wed, 23 Jun 2010 11:42:36 +Thu, 24 Jun 2010 00:04:37 +Thu, 24 Jun 2010 09:19:53 +Thu, 24 Jun 2010 12:02:03 +Thu, 24 Jun 2010 12:11:01 +Fri, 25 Jun 2010 13:20:27 +Fri, 25 Jun 2010 14:36:19 +Fri, 25 Jun 2010 17:13:50 +Sat, 26 Jun 2010 20:54:41 +Sun, 27 Jun 2010 15:58:50 +Sun, 27 Jun 2010 16:08:06 +Tue, 29 Jun 2010 11:56:13 +Tue, 29 Jun 2010 13:53:15 +Tue, 29 Jun 2010 18:47:44 +Tue, 29 Jun 2010 20:45:33 +Wed, 30 Jun 2010 21:59:08 +Thu, 1 Jul 2010 14:52:13 +Thu, 1 Jul 2010 16:23:01 +Fri, 2 Jul 2010 08:35:14 +Mon, 5 Jul 2010 12:27:20 +Tue, 06 Jul 2010 15:02:25 +Fri, 09 Jul 2010 00:08:12 +Sun, 11 Jul 2010 20:53:47 +Mon, 12 Jul 2010 05:54:08 +Tue, 13 Jul 2010 11:07:31 +Tue, 13 Jul 2010 14:57:32 +Tue, 13 Jul 2010 18:03:38 +Tue, 13 Jul 2010 17:14:54 +Tue, 13 Jul 2010 18:23:08 +Wed, 14 Jul 2010 17:06:58 +Thu, 15 Jul 2010 10:34:31 +Sat, 17 Jul 2010 12:21:05 +Sat, 17 Jul 2010 12:45:56 +Sat, 17 Jul 2010 13:02:12 +Sun, 18 Jul 2010 17:26:50 +Mon, 19 Jul 2010 05:06:38 +Mon, 19 Jul 2010 11:31:14 +Tue, 20 Jul 2010 11:46:17 +Wed, 21 Jul 2010 04:05:48 +Wed, 21 Jul 2010 11:54:58 +Sat, 24 Jul 2010 11:01:44 +Sat, 24 Jul 2010 13:33:44 +Sat, 24 Jul 2010 16:42:11 +Mon, 26 Jul 2010 17:37:40 +Tue, 27 Jul 2010 22:06:40 +Wed, 28 Jul 2010 10:47:36 +Wed, 28 Jul 2010 11:29:25 +Wed, 28 Jul 2010 11:52:58 +Wed, 28 Jul 2010 12:41:59 +Wed, 28 Jul 2010 14:43:55 +Wed, 28 Jul 2010 21:28:33 +Thu, 29 Jul 2010 17:18:26 +Fri, 30 Jul 2010 08:56:36 +Fri, 30 Jul 2010 08:23:25 +Mon, 2 Aug 2010 11:00:07 +Mon, 02 Aug 2010 13:16:04 +Tue, 3 Aug 2010 14:26:44 +Wed, 04 Aug 2010 08:38:23 +Wed, 4 Aug 2010 08:24:56 +Wed, 04 Aug 2010 09:37:32 +Wed, 4 Aug 2010 14:12:28 +Fri, 06 Aug 2010 14:36:13 +Fri, 06 Aug 2010 16:33:17 +Fri, 6 Aug 2010 16:38:47 +Fri, 06 Aug 2010 17:45:30 +Mon, 09 Aug 2010 10:32:58 +Mon, 09 Aug 2010 20:17:38 +Mon, 09 Aug 2010 20:52:25 +Thu, 12 Aug 2010 07:17:22 +Thu, 12 Aug 2010 08:16:44 +Thu, 12 Aug 2010 09:02:06 +Thu, 12 Aug 2010 09:52:27 +Thu, 12 Aug 2010 10:17:11 +Thu, 12 Aug 2010 14:39:11 +Fri, 13 Aug 2010 13:51:09 +Fri, 13 Aug 2010 13:55:36 +Sun, 22 Aug 2010 09:41:09 +Mon, 23 Aug 2010 12:35:52 +Mon, 23 Aug 2010 12:53:47 +Mon, 23 Aug 2010 18:48:48 +Mon, 23 Aug 2010 19:14:12 +Mon, 23 Aug 2010 19:42:44 +Sat, 28 Aug 2010 19:56:33 +Sun, 29 Aug 2010 18:01:01 +Sun, 29 Aug 2010 19:09:17 +Mon, 30 Aug 2010 11:46:11 +Mon, 30 Aug 2010 10:53:28 +Mon, 30 Aug 2010 20:05:06 +Mon, 30 Aug 2010 18:31:17 +Mon, 30 Aug 2010 18:33:14 +Mon, 30 Aug 2010 20:58:18 +Tue, 31 Aug 2010 06:56:34 +Tue, 31 Aug 2010 06:46:46 +Tue, 31 Aug 2010 10:25:58 +Tue, 31 Aug 2010 10:27:53 +Tue, 31 Aug 2010 10:04:18 +Tue, 31 Aug 2010 20:22:59 +Thu, 2 Sep 2010 12:13:46 +Thu, 02 Sep 2010 14:26:11 +Sat, 04 Sep 2010 12:53:14 +Sun, 05 Sep 2010 16:42:51 +Tue, 07 Sep 2010 09:37:04 +Tue, 7 Sep 2010 14:32:30 +Tue, 07 Sep 2010 14:59:38 +Wed, 8 Sep 2010 08:07:02 +Wed, 8 Sep 2010 09:30:27 +Wed, 08 Sep 2010 09:41:49 +Thu, 9 Sep 2010 20:16:10 +Thu, 09 Sep 2010 21:43:28 +Thu, 9 Sep 2010 23:32:30 +Fri, 10 Sep 2010 07:52:50 +Fri, 10 Sep 2010 10:10:58 +Fri, 10 Sep 2010 08:54:19 +Fri, 10 Sep 2010 10:08:57 +Fri, 10 Sep 2010 09:25:17 +Sat, 11 Sep 2010 00:18:25 +Sat, 11 Sep 2010 08:26:04 +Sun, 12 Sep 2010 11:30:59 +Sun, 12 Sep 2010 11:32:33 +Sun, 12 Sep 2010 16:05:58 +Sun, 12 Sep 2010 18:53:13 +Sun, 12 Sep 2010 18:33:31 +Mon, 13 Sep 2010 14:13:23 +Mon, 13 Sep 2010 10:33:27 +Mon, 13 Sep 2010 11:18:14 +Mon, 13 Sep 2010 12:37:56 +Tue, 14 Sep 2010 14:12:10 +Wed, 15 Sep 2010 22:23:55 +Thu, 16 Sep 2010 11:38:02 +Thu, 16 Sep 2010 12:43:58 +Thu, 16 Sep 2010 12:12:42 +Thu, 16 Sep 2010 13:36:59 +Fri, 17 Sep 2010 18:49:57 +Sat, 18 Sep 2010 08:46:15 +Wed, 22 Sep 2010 13:26:43 +Wed, 22 Sep 2010 14:32:56 +Wed, 22 Sep 2010 20:40:16 +Sat, 25 Sep 2010 05:46:02 +Wed, 29 Sep 2010 15:40:08 +Wed, 29 Sep 2010 15:46:09 +Wed, 29 Sep 2010 17:06:33 +Wed, 29 Sep 2010 17:29:22 +Wed, 29 Sep 2010 22:18:44 +Tue, 5 Oct 2010 20:22:22 +Mon, 11 Oct 2010 09:56:04 +Mon, 11 Oct 2010 10:12:08 +Mon, 11 Oct 2010 23:55:19 +Tue, 12 Oct 2010 17:34:55 +Tue, 12 Oct 2010 18:16:45 +Tue, 12 Oct 2010 20:55:16 +Wed, 13 Oct 2010 11:29:44 +Wed, 13 Oct 2010 13:19:39 +Wed, 13 Oct 2010 15:24:32 +Fri, 15 Oct 2010 10:46:29 +Wed, 20 Oct 2010 13:05:24 +Wed, 20 Oct 2010 19:00:49 +Wed, 20 Oct 2010 19:36:24 +Thu, 21 Oct 2010 15:24:06 +Thu, 28 Oct 2010 12:37:16 +Fri, 29 Oct 2010 18:44:52 +Sat, 30 Oct 2010 08:18:55 +Sun, 31 Oct 2010 17:13:06 +Tue, 02 Nov 2010 14:43:47 +Tue, 02 Nov 2010 16:28:43 +Tue, 02 Nov 2010 18:03:07 +Wed, 03 Nov 2010 10:15:35 +Wed, 03 Nov 2010 10:46:07 +Wed, 03 Nov 2010 12:22:49 +Wed, 03 Nov 2010 12:34:38 +Thu, 04 Nov 2010 08:53:38 +Thu, 4 Nov 2010 10:58:41 +Fri, 05 Nov 2010 10:21:25 +Fri, 05 Nov 2010 11:08:34 +Sun, 7 Nov 2010 18:44:51 +Tue, 9 Nov 2010 15:09:19 +Tue, 09 Nov 2010 18:01:59 +Wed, 10 Nov 2010 10:44:17 +Wed, 10 Nov 2010 20:32:43 +Thu, 11 Nov 2010 12:37:51 +Fri, 12 Nov 2010 12:47:26 +Fri, 12 Nov 2010 12:51:05 +Fri, 12 Nov 2010 12:54:52 +Fri, 12 Nov 2010 13:08:44 +Thu, 18 Nov 2010 13:16:43 +Fri, 19 Nov 2010 11:09:02 +Sat, 20 Nov 2010 12:14:24 +Sat, 20 Nov 2010 21:30:21 +Sat, 20 Nov 2010 21:55:14 +Sun, 21 Nov 2010 10:59:14 +Sun, 21 Nov 2010 11:22:42 +Sun, 21 Nov 2010 11:40:59 +Mon, 29 Nov 2010 12:45:38 +29 Nov 2010 15:03:03 +Mon, 29 Nov 2010 18:11:45 +29 Nov 2010 20:43:34 +Wed, 01 Dec 2010 15:29:17 +Wed, 01 Dec 2010 16:26:20 +Wed, 01 Dec 2010 16:38:11 +Wed, 01 Dec 2010 17:53:31 +Thu, 02 Dec 2010 16:01:15 +Thu, 02 Dec 2010 21:03:56 +Thu, 02 Dec 2010 21:09:26 +Fri, 03 Dec 2010 19:27:22 +Sat, 11 Dec 2010 11:11:58 +Sun, 12 Dec 2010 15:25:30 +Sun, 12 Dec 2010 21:24:15 +Mon, 13 Dec 2010 14:30:41 +Tue, 14 Dec 2010 14:11:57 +Thu, 16 Dec 2010 16:07:58 +Fri, 17 Dec 2010 18:30:37 +Mon, 20 Dec 2010 15:57:06 +Mon, 20 Dec 2010 17:44:45 +Tue, 21 Dec 2010 15:47:58 +Sat, 01 Jan 2011 12:56:29 +Sat, 01 Jan 2011 15:41:41 +Sat, 1 Jan 2011 15:52:35 +Sun, 02 Jan 2011 15:02:30 +Tue, 4 Jan 2011 15:50:33 +Fri, 7 Jan 2011 18:18:33 +Fri, 07 Jan 2011 20:08:44 +Fri, 7 Jan 2011 19:29:59 +Fri, 07 Jan 2011 20:41:34 +Sun, 09 Jan 2011 13:53:56 +Sun, 9 Jan 2011 14:19:33 +Sun, 09 Jan 2011 15:54:20 +Sun, 09 Jan 2011 16:09:12 +Sun, 09 Jan 2011 16:14:33 +Mon, 10 Jan 2011 05:13:12 +Mon, 17 Jan 2011 10:53:01 +Mon, 17 Jan 2011 18:05:20 +Tue, 18 Jan 2011 12:21:57 +Fri, 21 Jan 2011 15:01:42 +Fri, 21 Jan 2011 15:29:21 +Tue, 25 Jan 2011 17:37:09 +25 Jan 2011 19:45:22 +Thu, 27 Jan 2011 18:11:12 +Sat, 29 Jan 2011 11:39:36 +Sat, 29 Jan 2011 17:33:35 +Sat, 29 Jan 2011 18:43:22 +Sun, 30 Jan 2011 12:59:53 +Sun, 30 Jan 2011 13:36:07 +Mon, 31 Jan 2011 10:24:29 +Mon, 31 Jan 2011 11:42:30 +Mon, 31 Jan 2011 16:54:42 +Mon, 31 Jan 2011 20:07:15 +Mon, 31 Jan 2011 21:29:27 +Tue, 01 Feb 2011 20:32:25 +Thu, 3 Feb 2011 10:40:11 +Sun, 6 Feb 2011 12:37:33 +Sun, 06 Feb 2011 14:06:04 +Sun, 6 Feb 2011 13:10:13 +Sun, 6 Feb 2011 13:32:08 +Sun, 06 Feb 2011 20:58:03 +Mon, 7 Feb 2011 15:45:38 +Sat, 12 Feb 2011 17:54:51 +Sun, 13 Feb 2011 11:31:12 +Sun, 13 Feb 2011 13:42:41 +Sun, 13 Feb 2011 15:09:40 +Mon, 14 Feb 2011 14:36:13 +Mon, 14 Feb 2011 19:44:47 +Mon, 14 Feb 2011 19:46:20 +Wed, 16 Feb 2011 13:49:24 +Wed, 16 Feb 2011 14:41:17 +Wed, 16 Feb 2011 14:43:06 +Wed, 16 Feb 2011 14:47:12 +Wed, 16 Feb 2011 15:05:48 +Wed, 16 Feb 2011 15:21:26 +Wed, 16 Feb 2011 16:03:42 +Wed, 16 Feb 2011 21:48:53 +Thu, 17 Feb 2011 07:56:50 +Thu, 17 Feb 2011 08:27:40 +Thu, 17 Feb 2011 09:04:58 +Thu, 17 Feb 2011 09:23:31 +Thu, 17 Feb 2011 10:44:46 +Thu, 17 Feb 2011 19:21:09 +Thu, 17 Feb 2011 22:40:54 +Thu, 17 Feb 2011 23:11:12 +Fri, 18 Feb 2011 09:11:23 +Sat, 19 Feb 2011 20:44:09 +Sat, 19 Feb 2011 19:59:57 +Sat, 19 Feb 2011 21:16:42 +Sun, 20 Feb 2011 03:15:46 +Sun, 20 Feb 2011 08:38:43 +Sun, 20 Feb 2011 09:55:18 +Sun, 20 Feb 2011 10:04:59 +Sun, 20 Feb 2011 09:30:23 +Mon, 21 Feb 2011 12:55:17 +Mon, 21 Feb 2011 12:58:37 +Tue, 22 Feb 2011 14:50:28 +Wed, 23 Feb 2011 23:50:07 +Thu, 24 Feb 2011 09:01:47 +Thu, 24 Feb 2011 10:33:15 +Thu, 24 Feb 2011 10:59:29 +Thu, 24 Feb 2011 18:29:30 +Thu, 24 Feb 2011 20:18:57 +Fri, 25 Feb 2011 09:59:06 +Fri, 25 Feb 2011 12:18:27 +Mon, 28 Feb 2011 15:58:57 +Tue, 01 Mar 2011 19:42:01 +Wed, 02 Mar 2011 13:11:02 +Sat, 05 Mar 2011 17:50:58 +Sat, 5 Mar 2011 20:51:47 +Mon, 07 Mar 2011 20:15:24 +Mon, 07 Mar 2011 20:24:12 +Mon, 07 Mar 2011 20:38:38 +Mon, 07 Mar 2011 20:49:17 +Fri, 11 Mar 2011 07:30:38 +11 Mar 2011 09:36:54 +Fri, 11 Mar 2011 09:25:57 +11 Mar 2011 11:29:20 +Mon, 21 Mar 2011 23:09:46 +Tue, 22 Mar 2011 16:12:31 +Wed, 23 Mar 2011 06:50:03 +Wed, 23 Mar 2011 09:50:26 +Wed, 23 Mar 2011 21:30:25 +Thu, 24 Mar 2011 07:50:34 +Sat, 26 Mar 2011 09:09:37 +Sat, 26 Mar 2011 11:19:23 +Sat, 26 Mar 2011 22:35:03 +Mon, 28 Mar 2011 17:16:02 +Mon, 28 Mar 2011 17:44:55 +Mon, 28 Mar 2011 22:15:05 +Tue, 29 Mar 2011 15:16:17 +Wed, 30 Mar 2011 19:44:35 +Thu, 31 Mar 2011 08:17:09 +Thu, 31 Mar 2011 09:27:12 +Thu, 31 Mar 2011 09:04:43 +Thu, 31 Mar 2011 14:01:08 +Thu, 31 Mar 2011 13:21:02 +Thu, 31 Mar 2011 14:55:06 +Thu, 31 Mar 2011 18:24:28 +Sat, 2 Apr 2011 18:17:49 +Sat, 02 Apr 2011 23:58:52 +Wed, 06 Apr 2011 11:04:31 +Wed, 06 Apr 2011 18:42:00 +06 Apr 2011 20:47:29 +Wed, 06 Apr 2011 18:53:34 +06 Apr 2011 20:59:05 +07 Apr 2011 07:35:46 +Thu, 7 Apr 2011 09:34:32 +Mon, 11 Apr 2011 19:33:57 +Wed, 13 Apr 2011 14:29:29 +Wed, 13 Apr 2011 15:09:32 +Thu, 14 Apr 2011 19:14:25 +Sun, 17 Apr 2011 11:47:01 +Sun, 17 Apr 2011 12:11:00 +Sun, 17 Apr 2011 12:30:27 +Sun, 17 Apr 2011 13:35:59 +Sun, 17 Apr 2011 15:55:11 +Sun, 17 Apr 2011 20:24:22 +Thu, 21 Apr 2011 12:00:50 +Fri, 22 Apr 2011 12:30:46 +Fri, 22 Apr 2011 16:04:50 +Sat, 23 Apr 2011 10:43:15 +Sun, 24 Apr 2011 13:12:08 +Mon, 25 Apr 2011 06:26:39 +Mon, 25 Apr 2011 10:26:41 +Mon, 25 Apr 2011 10:41:52 +Mon, 25 Apr 2011 11:51:49 +Mon, 25 Apr 2011 11:57:35 +Mon, 25 Apr 2011 12:47:46 +Mon, 25 Apr 2011 15:52:08 +Mon, 25 Apr 2011 17:31:56 +Mon, 25 Apr 2011 19:23:22 +Mon, 25 Apr 2011 19:01:59 +Mon, 25 Apr 2011 21:11:46 +Mon, 25 Apr 2011 21:39:50 +Tue, 26 Apr 2011 10:09:38 +Tue, 26 Apr 2011 18:53:26 +Tue, 26 Apr 2011 19:21:53 +Thu, 28 Apr 2011 22:21:41 +Sat, 30 Apr 2011 20:06:12 +Sun, 01 May 2011 18:25:06 +Sun, 1 May 2011 19:22:15 +Sun, 01 May 2011 19:25:32 +Sun, 1 May 2011 19:33:27 +Sun, 01 May 2011 23:01:43 +Sun, 1 May 2011 23:41:45 +Sun, 01 May 2011 23:55:11 +Mon, 2 May 2011 07:44:35 +Mon, 02 May 2011 14:38:35 +Mon, 2 May 2011 18:14:01 +Mon, 2 May 2011 18:25:10 +Mon, 02 May 2011 18:27:31 +Mon, 2 May 2011 18:33:46 +Sun, 15 May 2011 11:47:25 +Mon, 16 May 2011 06:54:48 +Mon, 16 May 2011 07:03:48 +Mon, 16 May 2011 20:49:39 +Tue, 17 May 2011 23:33:07 +Sun, 29 May 2011 01:21:26 +Sun, 29 May 2011 19:32:32 +Mon, 30 May 2011 04:13:19 +Tue, 31 May 2011 22:43:25 +Sun, 5 Jun 2011 16:25:47 +Sun, 05 Jun 2011 22:43:19 +Mon, 06 Jun 2011 18:30:26 +Wed, 8 Jun 2011 16:29:39 +Wed, 8 Jun 2011 16:47:01 +Wed, 08 Jun 2011 19:10:46 +Thu, 9 Jun 2011 16:32:05 +Fri, 10 Jun 2011 09:05:05 +11 Jun 2011 12:00:49 +Sun, 12 Jun 2011 12:40:36 +Sun, 12 Jun 2011 12:52:43 +Sun, 12 Jun 2011 13:05:43 +Mon, 20 Jun 2011 16:55:51 +Mon, 20 Jun 2011 18:03:14 +Tue, 21 Jun 2011 17:43:20 +Sun, 26 Jun 2011 17:31:24 +Sun, 26 Jun 2011 23:17:57 +Tue, 28 Jun 2011 14:12:26 +28 Jun 2011 16:16:07 +Tue, 28 Jun 2011 21:50:42 +Tue, 28 Jun 2011 21:55:19 +Tue, 28 Jun 2011 22:21:28 +Tue, 28 Jun 2011 22:33:05 +Wed, 29 Jun 2011 07:26:29 +Wed, 29 Jun 2011 21:00:00 +Wed, 29 Jun 2011 22:45:22 +Sat, 02 Jul 2011 23:09:22 +Sun, 3 Jul 2011 09:09:10 +Tue, 5 Jul 2011 19:02:39 +Wed, 06 Jul 2011 12:13:26 +Wed, 6 Jul 2011 13:26:09 +Wed, 6 Jul 2011 13:41:23 +Thu, 7 Jul 2011 20:05:22 +Thu, 7 Jul 2011 20:33:46 +Fri, 8 Jul 2011 08:23:18 +Sat, 9 Jul 2011 17:42:02 +Sun, 10 Jul 2011 16:29:20 +Sun, 10 Jul 2011 16:36:49 +Sun, 10 Jul 2011 16:41:17 +Sun, 10 Jul 2011 17:21:21 +Sun, 10 Jul 2011 19:40:32 +Sun, 10 Jul 2011 19:49:37 +Mon, 11 Jul 2011 22:46:35 +Wed, 13 Jul 2011 18:22:35 +Fri, 15 Jul 2011 14:36:20 +Fri, 15 Jul 2011 14:41:50 +Fri, 15 Jul 2011 23:56:32 +Sat, 16 Jul 2011 00:06:37 +Sat, 16 Jul 2011 01:18:55 +Sat, 16 Jul 2011 13:11:56 +Sun, 17 Jul 2011 09:43:34 +Tue, 19 Jul 2011 18:40:05 +Tue, 19 Jul 2011 18:03:38 +Wed, 20 Jul 2011 20:23:01 +Wed, 20 Jul 2011 20:39:44 +Sun, 24 Jul 2011 11:44:20 +Sun, 24 Jul 2011 12:02:10 +Sun, 24 Jul 2011 12:32:52 +Sun, 24 Jul 2011 21:48:04 +Tue, 26 Jul 2011 17:29:02 +Tue, 26 Jul 2011 16:21:01 +Tue, 26 Jul 2011 19:07:02 +Tue, 26 Jul 2011 21:10:29 +Sat, 30 Jul 2011 07:52:45 +Sat, 30 Jul 2011 14:21:53 +Sun, 7 Aug 2011 10:03:17 +Tue, 9 Aug 2011 15:53:37 +Tue, 9 Aug 2011 18:35:44 +Tue, 9 Aug 2011 18:54:43 +Wed, 10 Aug 2011 17:10:45 +Tue, 16 Aug 2011 14:29:28 +16 Aug 2011 16:52:04 +Fri, 26 Aug 2011 17:06:31 +Sat, 27 Aug 2011 09:53:33 +Tue, 30 Aug 2011 01:58:11 +Tue, 30 Aug 2011 23:39:21 +Thu, 1 Sep 2011 19:24:01 +Thu, 1 Sep 2011 19:28:57 +Sat, 3 Sep 2011 16:58:20 +Sat, 03 Sep 2011 21:07:53 +Wed, 07 Sep 2011 16:10:31 +Wed, 07 Sep 2011 16:53:05 +Wed, 7 Sep 2011 18:23:55 +Wed, 07 Sep 2011 21:46:39 +Fri, 9 Sep 2011 18:09:49 +Fri, 9 Sep 2011 18:55:24 +Sat, 10 Sep 2011 10:00:48 +Sat, 10 Sep 2011 19:15:14 +Sat, 10 Sep 2011 21:56:52 +Tue, 20 Sep 2011 17:39:37 +Wed, 21 Sep 2011 17:45:00 +Wed, 21 Sep 2011 19:10:13 +Sat, 24 Sep 2011 16:45:41 +Sat, 24 Sep 2011 18:12:34 +Mon, 26 Sep 2011 13:17:26 +Mon, 26 Sep 2011 14:39:13 +Tue, 27 Sep 2011 15:04:42 +Fri, 30 Sep 2011 18:26:49 +Sat, 01 Oct 2011 00:38:11 +Sat, 1 Oct 2011 07:10:27 +Sat, 01 Oct 2011 12:30:16 +Sat, 1 Oct 2011 12:02:25 +Tue, 4 Oct 2011 18:40:43 +Tue, 4 Oct 2011 17:40:59 +Wed, 5 Oct 2011 08:04:24 +Thu, 06 Oct 2011 10:01:32 +Thu, 6 Oct 2011 09:57:37 +Thu, 06 Oct 2011 11:09:24 +Fri, 7 Oct 2011 06:32:32 +Mon, 10 Oct 2011 09:58:01 +Mon, 10 Oct 2011 15:37:39 +Wed, 19 Oct 2011 14:59:38 +Wed, 19 Oct 2011 15:26:09 +Wed, 19 Oct 2011 20:48:52 +Sat, 12 Nov 2011 09:30:33 +Sat, 12 Nov 2011 11:28:03 +Sat, 12 Nov 2011 12:48:00 +Sat, 12 Nov 2011 14:21:21 +Sat, 12 Nov 2011 14:58:07 +Sat, 12 Nov 2011 22:06:21 +Sat, 12 Nov 2011 15:06:45 +Sat, 12 Nov 2011 15:15:04 +Sat, 12 Nov 2011 23:00:56 +Sun, 13 Nov 2011 11:57:49 +Mon, 21 Nov 2011 11:32:31 +Mon, 21 Nov 2011 17:24:22 +Mon, 21 Nov 2011 17:35:14 +Tue, 22 Nov 2011 06:35:23 +Tue, 22 Nov 2011 09:53:48 +Tue, 22 Nov 2011 17:52:01 +Wed, 23 Nov 2011 14:02:33 +Wed, 23 Nov 2011 15:27:59 +Wed, 23 Nov 2011 18:56:51 +Wed, 23 Nov 2011 18:56:51 +Thu, 24 Nov 2011 09:40:03 +Sat, 26 Nov 2011 11:28:36 +Sat, 26 Nov 2011 16:27:46 +Sun, 27 Nov 2011 10:32:32 +Sun, 4 Dec 2011 16:42:51 +Tue, 13 Dec 2011 21:10:04 +Sat, 17 Dec 2011 15:41:30 +Sat, 17 Dec 2011 20:33:00 +Sun, 25 Dec 2011 11:59:34 +Fri, 30 Dec 2011 18:19:16 +Sat, 31 Dec 2011 09:50:11 +Sat, 31 Dec 2011 15:45:35 +Sun, 01 Jan 2012 16:05:08 +Sun, 1 Jan 2012 13:00:52 +Mon, 02 Jan 2012 00:58:28 +Mon, 2 Jan 2012 09:49:04 +Fri, 6 Jan 2012 06:15:10 +Sat, 14 Jan 2012 19:06:27 +Sun, 15 Jan 2012 02:13:55 +Sun, 15 Jan 2012 07:46:44 +Sun, 15 Jan 2012 09:19:22 +Sun, 15 Jan 2012 09:21:17 +Sun, 15 Jan 2012 09:25:30 +Mon, 16 Jan 2012 09:59:40 +Mon, 16 Jan 2012 10:10:19 +Mon, 16 Jan 2012 10:25:13 +Tue, 17 Jan 2012 09:02:09 +Tue, 17 Jan 2012 14:05:05 +Tue, 17 Jan 2012 19:03:22 +Wed, 18 Jan 2012 14:27:54 +Wed, 18 Jan 2012 14:33:13 +Wed, 18 Jan 2012 15:04:11 +Wed, 18 Jan 2012 15:10:46 +Wed, 18 Jan 2012 15:41:22 +Wed, 18 Jan 2012 22:20:49 +Fri, 20 Jan 2012 16:01:53 +Fri, 20 Jan 2012 17:44:22 +Sun, 22 Jan 2012 18:32:36 +Wed, 8 Feb 2012 14:26:38 +Wed, 08 Feb 2012 14:46:47 +Sun, 12 Feb 2012 13:14:52 +Sun, 12 Feb 2012 15:39:21 +Sun, 12 Feb 2012 15:48:25 +Sun, 12 Feb 2012 13:23:22 +Tue, 14 Feb 2012 14:33:56 +14 Feb 2012 16:45:16 +Tue, 14 Feb 2012 14:54:42 +Mon, 20 Feb 2012 17:53:48 +Sun, 19 Feb 2012 11:23:39 +Thu, 23 Feb 2012 09:17:41 +Thu, 23 Feb 2012 22:54:18 +Sat, 25 Feb 2012 15:11:54 +Sun, 26 Feb 2012 09:20:50 +Sat, 25 Feb 2012 11:31:22 +Sat, 25 Feb 2012 11:43:21 +Sat, 25 Feb 2012 15:02:24 +Mon, 27 Feb 2012 15:12:13 +Fri, 02 Mar 2012 12:45:16 +Thu, 15 Mar 2012 13:52:16 +Tue, 3 Apr 2012 16:06:35 +Wed, 4 Apr 2012 16:08:51 +Fri, 6 Apr 2012 05:31:03 +Thu, 05 Apr 2012 22:09:29 +Tue, 3 Apr 2012 18:14:10 +Wed, 4 Apr 2012 10:31:55 +Mon, 2 Apr 2012 15:20:42 +Sun, 15 Apr 2012 08:48:24 +Sun, 15 Apr 2012 20:29:40 +Mon, 16 Apr 2012 12:41:59 +Mon, 16 Apr 2012 12:34:11 +Mon, 16 Apr 2012 16:18:55 +Mon, 16 Apr 2012 12:51:44 +Thu, 19 Apr 2012 22:21:02 +Thu, 19 Apr 2012 10:00:55 +Sat, 21 Apr 2012 20:45:14 +Thu, 26 Apr 2012 12:17:12 +Wed, 25 Apr 2012 10:55:16 +Sun, 29 Apr 2012 13:03:30 +Sun, 29 Apr 2012 15:49:34 +Sun, 29 Apr 2012 16:21:28 +Sun, 29 Apr 2012 15:34:50 +Sun, 29 Apr 2012 16:00:49 +Mon, 30 Apr 2012 19:43:18 +Sun, 29 Apr 2012 22:27:11 +Wed, 2 May 2012 14:41:58 +Thu, 03 May 2012 00:29:29 +Thu, 03 May 2012 00:32:43 +Thu, 3 May 2012 20:44:51 +Fri, 4 May 2012 10:54:58 +Fri, 4 May 2012 22:15:20 +Fri, 04 May 2012 11:11:05 +Mon, 14 May 2012 11:18:21 +Mon, 21 May 2012 14:53:06 +Sat, 26 May 2012 15:26:53 +26 May 2012 13:28:02 +Thu, 31 May 2012 11:36:25 +Sat, 2 Jun 2012 12:19:12 +Sat, 2 Jun 2012 14:21:33 +Fri, 18 May 2012 21:59:59 +Sat, 02 Jun 2012 13:06:51 +Mon, 11 Jun 2012 21:22:31 +Mon, 11 Jun 2012 20:47:57 +Thu, 14 Jun 2012 21:29:26 +Fri, 15 Jun 2012 11:46:04 +Sat, 16 Jun 2012 00:20:47 +Sat, 02 Jun 2012 15:31:46 +Sun, 03 Jun 2012 20:29:14 +Thu, 14 Jun 2012 22:15:29 +Mon, 11 Jun 2012 21:48:03 +Sun, 3 Jun 2012 15:53:10 +Tue, 26 Jun 2012 19:57:08 +Tue, 26 Jun 2012 20:21:28 +Tue, 26 Jun 2012 19:37:01 +Tue, 26 Jun 2012 18:46:50 +Tue, 26 Jun 2012 20:05:24 +Wed, 27 Jun 2012 15:08:05 +Tue, 26 Jun 2012 23:05:39 +Wed, 27 Jun 2012 15:55:00 +Tue, 3 Jul 2012 20:21:20 +Wed, 4 Jul 2012 10:15:13 +Wed, 04 Jul 2012 09:41:45 +Wed, 4 Jul 2012 23:12:06 +Thu, 5 Jul 2012 10:20:35 +Sun, 8 Jul 2012 14:36:19 +Sun, 8 Jul 2012 18:01:38 +Sun, 8 Jul 2012 23:23:35 +Sun, 8 Jul 2012 19:16:59 +Wed, 11 Jul 2012 09:38:15 +Wed, 11 Jul 2012 18:41:03 +Mon, 9 Jul 2012 15:06:43 +Fri, 13 Jul 2012 14:58:36 +Thu, 12 Jul 2012 11:11:06 +Thu, 19 Jul 2012 00:10:22 +Thu, 19 Jul 2012 17:13:39 +Thu, 19 Jul 2012 20:35:08 +Fri, 20 Jul 2012 05:56:01 +Fri, 20 Jul 2012 12:00:38 +Tue, 19 Jun 2012 16:12:06 +Fri, 20 Jul 2012 21:39:56 +Fri, 20 Jul 2012 22:26:37 +Sat, 28 Jul 2012 09:47:06 +Sat, 28 Jul 2012 09:32:27 +Sat, 28 Jul 2012 17:16:39 +Sun, 29 Jul 2012 10:23:36 +Sun, 29 Jul 2012 01:06:24 +Sat, 28 Jul 2012 09:57:09 +Sat, 18 Aug 2012 11:57:55 +Sun, 19 Aug 2012 17:49:17 +Tue, 21 Aug 2012 14:53:43 +Tue, 21 Aug 2012 13:31:14 +Tue, 21 Aug 2012 14:40:02 +Tue, 21 Aug 2012 17:47:33 +Wed, 22 Aug 2012 11:50:35 +Wed, 22 Aug 2012 10:46:55 +Wed, 22 Aug 2012 15:23:40 +Mon, 20 Aug 2012 20:29:16 +Fri, 24 Aug 2012 14:55:27 +Fri, 24 Aug 2012 19:43:11 +Sat, 25 Aug 2012 03:04:21 +Thu, 23 Aug 2012 22:01:03 +Sat, 25 Aug 2012 18:17:01 +Sat, 25 Aug 2012 11:16:18 +Sat, 28 Jul 2012 20:43:59 +Mon, 13 Aug 2012 17:45:55 +Mon, 27 Aug 2012 18:38:57 +Mon, 27 Aug 2012 18:53:33 +Sun, 26 Aug 2012 10:13:37 +Tue, 28 Aug 2012 07:04:55 +Tue, 28 Aug 2012 00:49:21 +Tue, 28 Aug 2012 00:53:23 +Tue, 28 Aug 2012 10:43:59 +Sun, 26 Aug 2012 22:27:10 +Fri, 31 Aug 2012 20:09:40 +Wed, 5 Sep 2012 11:16:37 +Mon, 03 Sep 2012 19:28:30 +Wed, 05 Sep 2012 11:59:35 +Wed, 5 Sep 2012 20:54:41 +Thu, 13 Sep 2012 19:46:14 +Thu, 13 Sep 2012 20:14:48 +Sat, 15 Sep 2012 13:36:51 +Mon, 20 Aug 2012 18:13:02 +Wed, 19 Sep 2012 15:10:47 +Wed, 19 Sep 2012 15:13:00 +Wed, 19 Sep 2012 15:23:00 +Wed, 19 Sep 2012 15:24:26 +Thu, 27 Sep 2012 09:50:27 +Wed, 26 Sep 2012 19:30:19 +Sat, 29 Sep 2012 20:05:10 +Sat, 29 Sep 2012 19:54:12 +Tue, 2 Oct 2012 13:29:33 +Tue, 2 Oct 2012 16:56:54 +Tue, 02 Oct 2012 13:36:47 +Tue, 02 Oct 2012 12:44:00 +Sun, 30 Sep 2012 10:54:27 +Sat, 6 Oct 2012 17:47:09 +Sat, 6 Oct 2012 19:35:12 +Sun, 7 Oct 2012 11:18:59 +Sat, 06 Oct 2012 21:16:07 +Tue, 9 Oct 2012 19:16:49 +Wed, 10 Oct 2012 10:13:44 +Wed, 10 Oct 2012 10:57:44 +Tue, 09 Oct 2012 21:50:54 +Wed, 10 Oct 2012 20:42:09 +Sat, 13 Oct 2012 09:37:07 +Sat, 13 Oct 2012 04:59:44 +Sat, 13 Oct 2012 09:53:43 +Sat, 13 Oct 2012 13:53:03 +Sat, 13 Oct 2012 17:37:13 +Sun, 14 Oct 2012 09:39:57 +Sun, 14 Oct 2012 00:32:08 +Sun, 14 Oct 2012 14:06:56 +Sun, 14 Oct 2012 14:17:18 +Sun, 14 Oct 2012 13:30:26 +Tue, 23 Oct 2012 16:55:52 +Wed, 24 Oct 2012 11:38:31 +Thu, 25 Oct 2012 10:46:39 +Thu, 25 Oct 2012 10:36:24 +Thu, 25 Oct 2012 10:57:51 +Thu, 25 Oct 2012 11:02:32 +Thu, 25 Oct 2012 21:14:35 +Wed, 24 Oct 2012 10:45:53 +Tue, 30 Oct 2012 14:50:49 +Tue, 30 Oct 2012 14:53:52 +Tue, 30 Oct 2012 15:01:50 +Wed, 31 Oct 2012 16:38:33 +Wed, 31 Oct 2012 16:52:42 +Wed, 31 Oct 2012 17:13:02 +Wed, 31 Oct 2012 16:42:19 +Wed, 31 Oct 2012 17:03:28 +Wed, 31 Oct 2012 17:38:36 +Wed, 31 Oct 2012 17:17:37 +Thu, 1 Nov 2012 17:17:16 +Sun, 11 Nov 2012 16:07:09 +Sun, 21 Oct 2012 10:54:17 +Fri, 23 Nov 2012 15:48:25 +Sat, 24 Nov 2012 06:16:16 +Sun, 25 Nov 2012 18:19:28 +Sat, 24 Nov 2012 20:41:15 +Fri, 23 Nov 2012 11:41:21 +Mon, 05 Nov 2012 12:54:37 +Tue, 4 Dec 2012 17:41:08 +Wed, 5 Dec 2012 07:33:20 +Tue, 04 Dec 2012 22:42:18 +Wed, 5 Dec 2012 09:34:06 +Tue, 04 Dec 2012 19:58:46 +Wed, 5 Dec 2012 09:40:50 +Wed, 5 Dec 2012 10:52:58 +Wed, 05 Dec 2012 11:55:43 +Wed, 5 Dec 2012 11:27:37 +Wed, 5 Dec 2012 11:49:37 +Wed, 05 Dec 2012 13:05:46 +Wed, 05 Dec 2012 13:32:21 +Wed, 05 Dec 2012 13:54:52 +Sat, 15 Dec 2012 19:36:11 +Mon, 17 Dec 2012 11:44:15 +Sat, 15 Dec 2012 16:36:37 +Sun, 16 Dec 2012 23:18:38 +Tue, 18 Dec 2012 11:41:11 +Sat, 22 Dec 2012 08:08:01 +Fri, 21 Dec 2012 22:44:08 +Fri, 28 Dec 2012 14:38:42 +Mon, 31 Dec 2012 17:28:04 +Sun, 23 Dec 2012 09:36:36 +Mon, 31 Dec 2012 10:00:39 +Tue, 1 Jan 2013 18:48:22 +Tue, 01 Jan 2013 12:57:16 +Fri, 4 Jan 2013 19:05:30 +Sat, 5 Jan 2013 11:12:10 +Fri, 04 Jan 2013 21:24:44 +Sun, 6 Jan 2013 16:47:03 +Mon, 7 Jan 2013 12:38:56 +Mon, 07 Jan 2013 08:30:24 +Sun, 06 Jan 2013 19:16:27 +Tue, 8 Jan 2013 17:18:20 +Tue, 8 Jan 2013 18:09:50 +Wed, 9 Jan 2013 08:41:19 +Tue, 8 Jan 2013 19:19:06 +Wed, 9 Jan 2013 11:21:46 +Sat, 12 Jan 2013 10:09:46 +Fri, 11 Jan 2013 23:25:30 +Tue, 01 Jan 2013 19:53:04 +Sun, 13 Jan 2013 11:45:20 +Sat, 12 Jan 2013 11:33:41 +Sun, 13 Jan 2013 21:30:58 +Sun, 13 Jan 2013 19:57:48 +Sun, 06 Jan 2013 18:48:10 +Sun, 06 Jan 2013 19:06:48 +Mon, 14 Jan 2013 17:41:34 +Tue, 08 Jan 2013 11:22:41 +Wed, 16 Jan 2013 14:33:22 +Sun, 6 Jan 2013 16:06:02 +Thu, 24 Jan 2013 18:55:42 +Sun, 27 Jan 2013 20:12:24 +Thu, 17 Jan 2013 21:53:23 +Sat, 2 Feb 2013 15:24:35 +Sat, 2 Feb 2013 16:29:18 +Sun, 3 Feb 2013 11:09:28 +Sun, 3 Feb 2013 17:49:33 +Tue, 5 Feb 2013 12:56:15 +Tue, 5 Feb 2013 11:11:46 +Mon, 04 Feb 2013 06:11:06 +Sat, 9 Feb 2013 16:34:21 +Mon, 04 Feb 2013 22:38:38 +Thu, 21 Feb 2013 06:12:24 +Wed, 20 Feb 2013 20:04:06 +Sat, 23 Feb 2013 16:49:54 +Sun, 24 Feb 2013 09:02:02 +Sat, 23 Feb 2013 20:06:55 +Thu, 21 Feb 2013 11:39:45 +Mon, 4 Mar 2013 16:58:59 +Tue, 5 Mar 2013 06:53:32 +Mon, 04 Mar 2013 23:10:20 +Wed, 6 Mar 2013 07:22:27 +Tue, 05 Mar 2013 22:16:55 +Sat, 16 Mar 2013 13:32:56 +Sat, 16 Mar 2013 15:52:27 +Mon, 18 Mar 2013 18:49:16 +Sun, 17 Mar 2013 11:00:49 +Sat, 23 Mar 2013 11:50:29 +Mon, 18 Mar 2013 22:25:37 +Sat, 23 Mar 2013 13:20:37 +Sat, 23 Mar 2013 12:37:44 +Sun, 7 Apr 2013 12:45:30 +Sun, 7 Apr 2013 18:40:04 +Sun, 07 Apr 2013 19:02:23 +Mon, 8 Apr 2013 00:05:38 +Tue, 9 Apr 2013 12:51:45 +Sat, 13 Apr 2013 08:13:15 +Sat, 13 Apr 2013 13:15:46 +Fri, 10 May 2013 20:29:31 +Fri, 10 May 2013 12:47:11 +Fri, 17 May 2013 14:26:50 +Thu, 16 May 2013 23:18:18 +Fri, 17 May 2013 14:40:25 +Tue, 14 May 2013 17:16:31 +Mon, 20 May 2013 14:35:11 +Sat, 18 May 2013 07:45:23 +Tue, 28 May 2013 18:15:22 +Mon, 3 Jun 2013 20:32:06 +Mon, 3 Jun 2013 22:22:13 +Tue, 4 Jun 2013 18:03:27 +Sun, 9 Jun 2013 09:04:43 +Mon, 10 Jun 2013 17:31:16 +Fri, 14 Jun 2013 15:15:17 +Tue, 11 Jun 2013 12:35:56 +Wed, 12 Jun 2013 15:27:57 +Fri, 21 Jun 2013 15:47:03 +Wed, 19 Jun 2013 23:30:34 +Fri, 21 Jun 2013 16:03:37 +Sun, 23 Jun 2013 09:46:10 +Sun, 23 Jun 2013 13:19:02 +Sun, 23 Jun 2013 14:39:15 +Sun, 23 Jun 2013 11:06:11 +Sun, 23 Jun 2013 14:05:53 +Sun, 23 Jun 2013 15:00:35 +Sun, 23 Jun 2013 18:44:02 +Sun, 23 Jun 2013 18:25:22 +Tue, 2 Jul 2013 08:19:50 +Mon, 01 Jul 2013 21:23:57 +Sun, 23 Jun 2013 15:00:56 +Sun, 14 Jul 2013 12:09:45 +Mon, 22 Jul 2013 15:17:34 +Sun, 28 Jul 2013 16:00:11 +Fri, 16 Aug 2013 18:55:16 +Tue, 27 Aug 2013 15:58:03 +Mon, 26 Aug 2013 18:46:56 +Fri, 30 Aug 2013 12:23:57 +Thu, 25 Jul 2013 17:50:13 +Tue, 30 Jul 2013 03:04:19 +Fri, 30 Aug 2013 15:44:46 +Fri, 30 Aug 2013 16:12:03 +Fri, 30 Aug 2013 16:44:16 +Fri, 30 Aug 2013 15:47:51 +Fri, 30 Aug 2013 16:16:52 +Fri, 30 Aug 2013 18:13:01 +Sat, 17 Aug 2013 13:01:15 +Tue, 27 Aug 2013 16:44:36 +Thu, 5 Sep 2013 18:35:27 +Thu, 5 Sep 2013 18:40:18 +Tue, 10 Sep 2013 16:59:05 +Wed, 11 Sep 2013 00:51:17 +Wed, 11 Sep 2013 11:08:39 +Thu, 12 Sep 2013 15:23:42 +Thu, 12 Sep 2013 12:49:57 +Fri, 13 Sep 2013 15:34:56 +Fri, 13 Sep 2013 15:51:44 +Sat, 14 Sep 2013 08:24:20 +Fri, 13 Sep 2013 08:00:04 +Sat, 14 Sep 2013 09:11:53 +Thu, 12 Sep 2013 16:04:14 +Sat, 14 Sep 2013 09:37:35 +Sat, 14 Sep 2013 09:40:11 +Sat, 14 Sep 2013 10:19:17 +Sat, 14 Sep 2013 15:55:32 +Sat, 14 Sep 2013 22:31:42 +Sat, 14 Sep 2013 20:19:23 +Sun, 15 Sep 2013 08:40:06 +Sat, 14 Sep 2013 17:53:47 +Sun, 15 Sep 2013 14:13:10 +Sun, 15 Sep 2013 10:07:09 +Sat, 14 Sep 2013 11:25:55 +Sun, 15 Sep 2013 10:43:02 +Sun, 15 Sep 2013 13:10:29 +Sun, 15 Sep 2013 13:27:09 +Sun, 15 Sep 2013 18:58:34 +Mon, 16 Sep 2013 10:00:55 +Mon, 16 Sep 2013 09:33:04 +Mon, 16 Sep 2013 11:06:59 +Mon, 16 Sep 2013 10:36:50 +Sun, 15 Sep 2013 19:29:58 +Mon, 16 Sep 2013 11:34:49 +Mon, 16 Sep 2013 11:38:14 +Mon, 16 Sep 2013 11:56:55 +Mon, 16 Sep 2013 11:57:56 +Mon, 16 Sep 2013 17:23:53 +Mon, 16 Sep 2013 18:03:25 +Mon, 16 Sep 2013 18:16:15 +Mon, 16 Sep 2013 14:20:46 +Tue, 17 Sep 2013 10:08:25 +Tue, 17 Sep 2013 11:59:27 +17 Sep 2013 18:03:53 +Mon, 16 Sep 2013 21:36:58 +Thu, 19 Sep 2013 12:30:38 +Wed, 18 Sep 2013 21:03:04 +Thu, 19 Sep 2013 17:28:25 +Fri, 20 Sep 2013 14:45:51 +Sat, 21 Sep 2013 10:45:03 +Sat, 21 Sep 2013 12:16:13 +Fri, 20 Sep 2013 19:33:29 +Sun, 22 Sep 2013 07:51:52 +Sun, 22 Sep 2013 02:13:49 +Mon, 23 Sep 2013 10:21:17 +Mon, 23 Sep 2013 17:57:34 +Mon, 23 Sep 2013 10:33:01 +Mon, 23 Sep 2013 11:23:42 +Mon, 23 Sep 2013 18:37:09 +Tue, 24 Sep 2013 14:33:10 +Sun, 22 Sep 2013 16:39:48 +Tue, 24 Sep 2013 18:20:14 +Mon, 23 Sep 2013 18:34:29 +Wed, 25 Sep 2013 11:32:15 +Tue, 24 Sep 2013 23:49:32 +Tue, 24 Sep 2013 14:17:33 +Sun, 29 Sep 2013 12:27:11 +Fri, 27 Sep 2013 23:07:58 +Sun, 29 Sep 2013 12:35:10 +Tue, 01 Oct 2013 14:07:30 +Mon, 30 Sep 2013 14:13:55 +Tue, 01 Oct 2013 17:45:48 +Wed, 2 Oct 2013 14:15:50 +Thu, 3 Oct 2013 11:28:19 +Fri, 4 Oct 2013 12:07:26 +Thu, 3 Oct 2013 08:30:01 +Wed, 9 Oct 2013 20:32:55 +Thu, 10 Oct 2013 09:35:49 +Fri, 11 Oct 2013 12:55:41 +Fri, 04 Oct 2013 23:01:49 +Tue, 15 Oct 2013 16:14:56 +Mon, 21 Oct 2013 18:42:20 +Tue, 22 Oct 2013 08:38:48 +Tue, 22 Oct 2013 02:52:57 +Wed, 23 Oct 2013 17:59:56 +Fri, 25 Oct 2013 14:25:52 +Fri, 25 Oct 2013 17:51:01 +Tue, 15 Oct 2013 17:35:54 +Fri, 25 Oct 2013 19:14:08 +Fri, 25 Oct 2013 21:22:58 +Fri, 25 Oct 2013 18:25:58 +Mon, 28 Oct 2013 19:16:59 +Mon, 28 Oct 2013 19:06:10 +Tue, 29 Oct 2013 06:38:50 +Mon, 28 Oct 2013 21:41:51 +Thu, 31 Oct 2013 18:08:26 +Thu, 31 Oct 2013 19:04:00 +Mon, 7 Oct 2013 17:48:04 +Wed, 02 Oct 2013 14:59:47 +Tue, 5 Nov 2013 15:11:25 +Fri, 01 Nov 2013 21:58:24 +Fri, 01 Nov 2013 22:46:01 +Mon, 18 Nov 2013 15:07:57 +Thu, 21 Nov 2013 16:43:57 +Sun, 24 Nov 2013 17:59:25 +Sun, 24 Nov 2013 12:59:51 +Fri, 14 Jun 2013 23:16:02 +Wed, 11 Sep 2013 16:09:15 +Tue, 3 Dec 2013 16:53:05 +Sun, 17 Nov 2013 19:48:56 +Tue, 3 Dec 2013 17:11:59 +Tue, 3 Dec 2013 20:19:51 +Tue, 03 Dec 2013 17:02:26 +Tue, 03 Dec 2013 19:18:06 +Wed, 4 Dec 2013 09:27:44 +Wed, 4 Dec 2013 16:34:39 +Tue, 03 Dec 2013 22:14:39 +Wed, 4 Dec 2013 18:14:20 +Mon, 18 Nov 2013 14:38:55 +Wed, 11 Dec 2013 17:17:07 +Mon, 16 Dec 2013 14:28:49 +Mon, 16 Dec 2013 11:33:01 +Mon, 16 Dec 2013 13:37:14 +Wed, 04 Dec 2013 22:19:28 +Fri, 20 Dec 2013 13:16:27 +9 Jan 2014 13:40:22 +Tue, 07 Jan 2014 16:48:54 +9 Jan 2014 21:05:45 +Mon, 9 Dec 2013 10:26:33 +Mon, 13 Jan 2014 19:09:19 +Mon, 13 Jan 2014 12:35:49 +Mon, 20 Jan 2014 20:27:51 +Tue, 21 Jan 2014 18:20:40 +Tue, 21 Jan 2014 18:29:28 +Tue, 21 Jan 2014 20:21:28 +Wed, 22 Jan 2014 15:29:44 +Thu, 23 Jan 2014 21:44:18 +Mon, 27 Jan 2014 16:26:06 +Mon, 3 Feb 2014 08:51:55 +Tue, 4 Feb 2014 16:33:52 +Tue, 04 Feb 2014 17:35:39 +Tue, 4 Feb 2014 16:38:30 +Sun, 9 Feb 2014 15:58:59 +Thu, 13 Feb 2014 18:46:26 +Tue, 18 Feb 2014 18:28:19 +Thu, 20 Feb 2014 18:31:10 +Wed, 19 Feb 2014 10:23:50 +Tue, 25 Feb 2014 11:22:47 +Tue, 25 Feb 2014 20:09:37 +Sat, 1 Mar 2014 08:59:19 +Sat, 1 Mar 2014 09:00:29 +Sat, 22 Feb 2014 10:47:16 +Sat, 1 Mar 2014 13:20:25 +Wed, 5 Mar 2014 17:41:55 +Tue, 04 Mar 2014 10:35:29 +Sun, 02 Mar 2014 20:13:57 +Mon, 13 Jan 2014 23:54:34 +Fri, 7 Mar 2014 22:28:31 +Sat, 15 Mar 2014 14:39:47 +Fri, 14 Mar 2014 21:25:46 +Sun, 16 Mar 2014 17:07:10 +Sat, 15 Mar 2014 18:13:21 +Tue, 18 Mar 2014 19:28:26 +Thu, 20 Mar 2014 17:19:12 +Sun, 23 Mar 2014 20:50:33 +Mon, 24 Mar 2014 12:38:20 +Mon, 24 Mar 2014 12:44:39 +Mon, 24 Mar 2014 11:35:31 +Mon, 24 Mar 2014 11:37:19 +Tue, 25 Mar 2014 02:52:35 +Mon, 24 Mar 2014 17:20:04 +Mon, 24 Mar 2014 11:13:34 +Wed, 26 Mar 2014 12:56:43 +Wed, 26 Mar 2014 17:20:48 +Tue, 25 Mar 2014 11:39:14 +Tue, 25 Mar 2014 11:47:41 +Thu, 27 Mar 2014 16:53:44 +Thu, 27 Mar 2014 17:16:42 +Thu, 27 Mar 2014 19:18:34 +Thu, 27 Mar 2014 19:50:36 +Thu, 27 Mar 2014 22:05:30 +Fri, 28 Mar 2014 09:41:53 +Fri, 4 Apr 2014 16:46:34 +Sat, 5 Apr 2014 15:47:36 +Sun, 6 Apr 2014 11:20:27 +Fri, 04 Apr 2014 23:13:53 +Sun, 6 Apr 2014 15:54:53 +Tue, 8 Apr 2014 10:34:12 +Mon, 7 Apr 2014 12:41:00 +Sun, 13 Apr 2014 11:32:27 +Fri, 18 Apr 2014 11:52:36 +Mon, 5 May 2014 20:29:38 +Mon, 5 May 2014 18:00:18 +Wed, 7 May 2014 10:27:29 +Mon, 5 May 2014 20:29:51 +Sat, 10 May 2014 10:24:52 +Sat, 10 May 2014 22:07:57 +Sun, 11 May 2014 10:06:58 +Fri, 18 Apr 2014 23:53:05 +Sat, 10 May 2014 21:15:03 +Sat, 10 May 2014 22:26:19 +Sun, 11 May 2014 20:35:21 +Tue, 13 May 2014 18:07:46 +Tue, 13 May 2014 09:29:40 +Tue, 13 May 2014 18:44:16 +Wed, 14 May 2014 21:22:29 +Thu, 15 May 2014 17:00:10 +Wed, 14 May 2014 23:35:53 +Fri, 16 May 2014 10:23:47 +Thu, 15 May 2014 22:46:00 +Fri, 16 May 2014 10:28:44 +Fri, 11 Apr 2014 11:29:38 +Sat, 17 May 2014 05:46:22 +Fri, 16 May 2014 22:57:53 +Sun, 18 May 2014 17:59:35 +Mon, 19 May 2014 12:19:59 +Tue, 20 May 2014 12:36:20 +Fri, 29 Nov 2013 10:40:47 +Sun, 1 Jun 2014 06:56:22 +Thu, 5 Jun 2014 06:27:04 +Wed, 04 Jun 2014 22:42:32 +Fri, 6 Jun 2014 03:14:12 +Thu, 05 Jun 2014 21:25:22 +Fri, 6 Jun 2014 03:29:13 +Thu, 22 May 2014 22:58:51 +Sat, 31 May 2014 22:25:46 +Sun, 01 Jun 2014 21:29:47 +Mon, 02 Jun 2014 22:20:56 +Mon, 9 Jun 2014 18:05:42 +Wed, 11 Jun 2014 11:44:39 +Sat, 14 Jun 2014 10:15:16 +Fri, 13 Jun 2014 23:22:16 +Thu, 12 Jun 2014 12:11:22 +Fri, 06 Jun 2014 22:15:37 +Thu, 19 Jun 2014 09:12:49 +Thu, 19 Jun 2014 07:47:40 +Tue, 17 Jun 2014 20:24:57 +Tue, 24 Jun 2014 16:59:36 +Tue, 24 Jun 2014 17:58:35 +Tue, 24 Jun 2014 19:48:59 +Tue, 24 Jun 2014 20:46:26 +Tue, 24 Jun 2014 21:56:54 +Tue, 24 Jun 2014 21:00:19 +Wed, 25 Jun 2014 16:34:38 +Wed, 25 Jun 2014 00:26:07 +Sat, 28 Jun 2014 07:40:24 +Fri, 27 Jun 2014 13:40:30 +Sat, 28 Jun 2014 08:05:48 +Thu, 26 Jun 2014 22:52:02 +Sat, 28 Jun 2014 16:43:14 +Thu, 26 Jun 2014 21:31:36 +Thu, 3 Jul 2014 13:31:18 +Tue, 22 Jul 2014 13:38:12 +Tue, 22 Jul 2014 13:26:20 +Tue, 22 Jul 2014 13:45:22 +Mon, 28 Jul 2014 10:05:44 +Mon, 28 Jul 2014 10:09:08 +Mon, 28 Jul 2014 10:24:28 +Thu, 31 Jul 2014 17:58:09 +Fri, 25 Jul 2014 12:49:22 +Mon, 28 Jul 2014 10:13:48 +Wed, 6 Aug 2014 12:45:43 +Wed, 6 Aug 2014 19:55:06 +Sun, 10 Aug 2014 15:11:56 +Sun, 10 Aug 2014 15:14:05 +Thu, 14 Aug 2014 17:11:01 +Mon, 25 Aug 2014 14:45:02 +Mon, 25 Aug 2014 00:22:32 +Wed, 27 Aug 2014 16:17:58 +Mon, 25 Aug 2014 15:22:11 +Wed, 27 Aug 2014 17:39:18 +Sat, 30 Aug 2014 10:53:00 +Wed, 27 Aug 2014 20:17:13 +Tue, 15 Jul 2014 10:56:43 +Sat, 30 Aug 2014 10:54:46 +Tue, 2 Sep 2014 11:56:49 +Fri, 5 Sep 2014 05:05:04 +Sat, 6 Sep 2014 07:02:44 +Sat, 06 Sep 2014 00:28:49 +Sat, 6 Sep 2014 13:22:45 +Sat, 6 Sep 2014 13:28:30 +Thu, 04 Sep 2014 14:47:13 +Fri, 05 Sep 2014 14:58:01 +Sat, 6 Sep 2014 14:36:50 +Sat, 06 Sep 2014 11:20:05 +Sat, 6 Sep 2014 15:17:45 +Sat, 06 Sep 2014 22:14:17 +Sat, 6 Sep 2014 18:00:55 +Sun, 7 Sep 2014 11:37:47 +Sat, 06 Sep 2014 22:50:33 +Sun, 07 Sep 2014 22:48:13 +Sun, 7 Sep 2014 13:08:28 +Sun, 7 Sep 2014 14:20:59 +Fri, 5 Sep 2014 22:34:33 +Sun, 7 Sep 2014 21:59:46 +Mon, 8 Sep 2014 10:14:46 +Mon, 8 Sep 2014 10:24:01 +Mon, 8 Sep 2014 10:27:19 +Mon, 8 Sep 2014 10:27:55 +Mon, 8 Sep 2014 10:42:45 +Mon, 08 Sep 2014 10:11:11 +Mon, 08 Sep 2014 10:18:03 +Mon, 08 Sep 2014 10:31:44 +Tue, 2 Sep 2014 12:44:33 +Tue, 9 Sep 2014 15:30:30 +Wed, 10 Sep 2014 01:21:52 +Wed, 10 Sep 2014 01:38:32 +Tue, 9 Sep 2014 18:52:51 +Wed, 10 Sep 2014 05:02:51 +Tue, 09 Sep 2014 22:33:33 +Mon, 8 Sep 2014 19:06:33 +Wed, 10 Sep 2014 18:26:40 +Wed, 10 Sep 2014 18:57:46 +Thu, 11 Sep 2014 04:51:54 +Wed, 10 Sep 2014 20:08:32 +Thu, 11 Sep 2014 05:02:27 +Thu, 11 Sep 2014 12:39:59 +Thu, 11 Sep 2014 15:10:52 +Thu, 11 Sep 2014 14:19:19 +Thu, 11 Sep 2014 14:53:43 +Sat, 13 Sep 2014 09:20:09 +Sat, 13 Sep 2014 07:32:21 +Sat, 13 Sep 2014 09:47:31 +Sat, 13 Sep 2014 08:39:38 +Sat, 13 Sep 2014 10:52:41 +Sat, 13 Sep 2014 12:30:07 +Mon, 15 Sep 2014 14:42:37 +Mon, 15 Sep 2014 14:10:30 +Tue, 16 Sep 2014 11:08:22 +Mon, 15 Sep 2014 21:51:03 +Wed, 17 Sep 2014 15:48:02 +Tue, 16 Sep 2014 11:12:08 +Sun, 21 Sep 2014 18:59:42 +Sun, 21 Sep 2014 11:09:49 +Sun, 21 Sep 2014 14:17:03 +Sun, 21 Sep 2014 13:21:52 +Sun, 21 Sep 2014 22:15:38 +Mon, 6 Oct 2014 15:31:46 +Sun, 28 Sep 2014 09:11:41 +Mon, 06 Oct 2014 19:16:03 +Sun, 19 Oct 2014 16:45:34 +Wed, 22 Oct 2014 18:25:10 +Fri, 24 Oct 2014 06:42:54 +Sat, 25 Oct 2014 13:43:58 +Sun, 19 Oct 2014 19:04:14 +Sat, 8 Nov 2014 11:49:36 +Sat, 8 Nov 2014 12:03:37 +Sat, 8 Nov 2014 12:59:20 +Sun, 9 Nov 2014 11:17:10 +Sat, 08 Nov 2014 13:53:16 +Sat, 08 Nov 2014 14:34:29 +Sat, 08 Nov 2014 15:07:37 +Sat, 08 Nov 2014 22:19:35 +Sat, 8 Nov 2014 12:05:10 +Wed, 12 Nov 2014 16:02:43 +Tue, 11 Nov 2014 23:27:30 +Sun, 23 Nov 2014 12:41:05 +Thu, 27 Nov 2014 15:53:17 +Thu, 27 Nov 2014 19:10:53 +Fri, 28 Nov 2014 17:18:12 +Sun, 23 Nov 2014 21:07:28 +Fri, 28 Nov 2014 13:03:26 +Wed, 24 Dec 2014 12:20:54 +Wed, 31 Dec 2014 12:14:24 +Wed, 31 Dec 2014 13:21:23 +Thu, 01 Jan 2015 10:54:32 +Sat, 03 Jan 2015 18:20:19 +Wed, 24 Dec 2014 22:26:37 +Tue, 13 Jan 2015 18:38:57 +Tue, 13 Jan 2015 22:27:55 +Tue, 13 Jan 2015 21:52:25 +Tue, 13 Jan 2015 22:30:57 +Tue, 20 Jan 2015 15:03:29 +Fri, 23 Jan 2015 03:37:40 +Thu, 29 Jan 2015 17:24:25 +Fri, 30 Jan 2015 09:09:42 +Sat, 31 Jan 2015 18:57:59 +Sun, 1 Feb 2015 10:34:49 +Sun, 8 Feb 2015 09:40:25 +Sun, 08 Feb 2015 08:48:39 +Sun, 08 Feb 2015 09:42:52 +Tue, 10 Feb 2015 15:30:00 +Tue, 10 Feb 2015 16:47:57 +Tue, 10 Feb 2015 16:20:31 +Tue, 10 Feb 2015 15:43:23 +Wed, 11 Feb 2015 08:35:45 +Tue, 10 Feb 2015 20:01:44 +Tue, 10 Feb 2015 16:56:53 +Tue, 10 Feb 2015 16:01:40 +Tue, 10 Feb 2015 15:53:55 +Fri, 13 Feb 2015 08:57:37 +Fri, 13 Feb 2015 14:48:42 +Fri, 13 Feb 2015 09:50:46 +Sat, 14 Feb 2015 08:23:53 +Sat, 14 Feb 2015 13:58:41 +Sat, 14 Feb 2015 14:18:11 +Mon, 16 Feb 2015 07:59:22 +Sun, 15 Feb 2015 22:09:39 diff --git a/internal/benchmarks/dm5dm6_ex3 b/internal/benchmarks/dm5dm6_ex3 new file mode 100755 index 0000000..307d5bd --- /dev/null +++ b/internal/benchmarks/dm5dm6_ex3 @@ -0,0 +1,50 @@ +#!/usr/bin/perl + +# Usage: dm5dm6 VERS FILE +# VERS = 5, 6, 6o +# FILE = file containing a list of dates + +use warnings; +use strict; + +use Time::HiRes qw / gettimeofday tv_interval /; + +my ($vers,$file) = @ARGV; + +my @dates = `cat $file`; +chomp(@dates); + +my $obj; +if ($vers eq '5') { + require Date::Manip::DM5; + Date::Manip::DM5->import(qw(ParseDate)); +} elsif ($vers eq '6') { + require Date::Manip::DM6; + Date::Manip::DM6->import(qw(ParseDate)); +} elsif ($vers eq '6o') { + require Date::Manip::Date; + $obj = new Date::Manip::Date; +} else { + die "ERROR: invalid version\n"; +} + +my $t0 = [gettimeofday()]; + +if ($vers eq '5' || $vers eq '6') { + foreach my $date (@dates) { + ParseDate($date); + } +} elsif ($vers eq '6o') { + foreach my $date (@dates) { + $obj->parse($date); + } +} + +my $t1 = [gettimeofday()]; +my $et = tv_interval($t0, $t1)*1000; + +printf(STDOUT "Elapsed: %6.3f\n",$et); + +# 5 6 6o +# dateset3.txt 857.250 2246.340 2090.676 +# _notz 683.084 462.898 431.781 diff --git a/internal/benchmarks/parse-1.date_parse.pl b/internal/benchmarks/parse-1.date_parse.pl new file mode 100755 index 0000000..18d6a6a --- /dev/null +++ b/internal/benchmarks/parse-1.date_parse.pl @@ -0,0 +1,22 @@ +#!/usr/bin/perl + +use Date::Parse; + +@in = `cat parse-1.in`; +chomp(@in); + +foreach $in (@in) { + @date = strptime($in); + $date[5] += 1900; +} + +# Local Variables: +# mode: cperl +# indent-tabs-mode: nil +# cperl-indent-level: 3 +# cperl-continued-statement-offset: 2 +# cperl-continued-brace-offset: 0 +# cperl-brace-offset: 0 +# cperl-brace-imaginary-offset: 0 +# cperl-label-offset: 0 +# End: diff --git a/internal/benchmarks/parse-1.date_time.pl b/internal/benchmarks/parse-1.date_time.pl new file mode 100755 index 0000000..fb978f6 --- /dev/null +++ b/internal/benchmarks/parse-1.date_time.pl @@ -0,0 +1,21 @@ +#!/usr/bin/perl + +use DateTime::Format::DateParse; + +@in = `cat parse-1.in`; +chomp(@in); + +foreach $in (@in) { + $dt = DateTime::Format::DateParse->parse_datetime( $date ); +} + +# Local Variables: +# mode: cperl +# indent-tabs-mode: nil +# cperl-indent-level: 3 +# cperl-continued-statement-offset: 2 +# cperl-continued-brace-offset: 0 +# cperl-brace-offset: 0 +# cperl-brace-imaginary-offset: 0 +# cperl-label-offset: 0 +# End: diff --git a/internal/benchmarks/parse-1.dm5.pl b/internal/benchmarks/parse-1.dm5.pl new file mode 100755 index 0000000..a454a7c --- /dev/null +++ b/internal/benchmarks/parse-1.dm5.pl @@ -0,0 +1,24 @@ +#!/usr/bin/perl + +BEGIN { + $Date::Manip::Backend = 'DM5'; +} +use Date::Manip; + +@in = `cat parse-1.in`; +chomp(@in); + +foreach $in (@in) { + ParseDateString($in); +} + +# Local Variables: +# mode: cperl +# indent-tabs-mode: nil +# cperl-indent-level: 3 +# cperl-continued-statement-offset: 2 +# cperl-continued-brace-offset: 0 +# cperl-brace-offset: 0 +# cperl-brace-imaginary-offset: 0 +# cperl-label-offset: 0 +# End: diff --git a/internal/benchmarks/parse-1.dm6.pl b/internal/benchmarks/parse-1.dm6.pl new file mode 100755 index 0000000..b709b3a --- /dev/null +++ b/internal/benchmarks/parse-1.dm6.pl @@ -0,0 +1,22 @@ +#!/usr/bin/perl + +use Date::Manip::Date; +$date = new Date::Manip::Date; + +@in = `cat parse-1.in`; +chomp(@in); + +foreach $in (@in) { + $date->parse($in); +} + +# Local Variables: +# mode: cperl +# indent-tabs-mode: nil +# cperl-indent-level: 3 +# cperl-continued-statement-offset: 2 +# cperl-continued-brace-offset: 0 +# cperl-brace-offset: 0 +# cperl-brace-imaginary-offset: 0 +# cperl-label-offset: 0 +# End: diff --git a/internal/benchmarks/parse-1.dm6_format.pl b/internal/benchmarks/parse-1.dm6_format.pl new file mode 100755 index 0000000..87cedab --- /dev/null +++ b/internal/benchmarks/parse-1.dm6_format.pl @@ -0,0 +1,22 @@ +#!/usr/bin/perl + +use Date::Manip::Date; +$date = new Date::Manip::Date; + +@in = `cat parse-1.in`; +chomp(@in); + +foreach $in (@in) { + $date->parse_format('%b %e, %Y %T',$in); +} + +# Local Variables: +# mode: cperl +# indent-tabs-mode: nil +# cperl-indent-level: 3 +# cperl-continued-statement-offset: 2 +# cperl-continued-brace-offset: 0 +# cperl-brace-offset: 0 +# cperl-brace-imaginary-offset: 0 +# cperl-label-offset: 0 +# End: diff --git a/internal/benchmarks/parse-1.dm6_opts.pl b/internal/benchmarks/parse-1.dm6_opts.pl new file mode 100755 index 0000000..b62cec9 --- /dev/null +++ b/internal/benchmarks/parse-1.dm6_opts.pl @@ -0,0 +1,22 @@ +#!/usr/bin/perl + +use Date::Manip::Date; +$date = new Date::Manip::Date; + +@in = `cat parse-1.in`; +chomp(@in); + +foreach $in (@in) { + $date->parse($in,"noiso8601","nospecial","nodelta","nodow","noother"); +} + +# Local Variables: +# mode: cperl +# indent-tabs-mode: nil +# cperl-indent-level: 3 +# cperl-continued-statement-offset: 2 +# cperl-continued-brace-offset: 0 +# cperl-brace-offset: 0 +# cperl-brace-imaginary-offset: 0 +# cperl-label-offset: 0 +# End: diff --git a/internal/benchmarks/parse-1.in.pl b/internal/benchmarks/parse-1.in.pl new file mode 100755 index 0000000..a56b5e7 --- /dev/null +++ b/internal/benchmarks/parse-1.in.pl @@ -0,0 +1,54 @@ +#!/usr/bin/perl + +use Date::Manip::Base; +$dmb = new Date::Manip::Base; + +%m = qw(1 January + 2 February + 3 March + 4 APRIL + 5 MAY + 6 JUNE + 7 Jul + 8 Aug + 9 Sep + 10 oct + 11 nov + 12 dec); + +$h = 0; +$mn = 0; +$s = "00"; + +foreach $y (1970..2000) { + foreach $m (1..12) { + $mmm = $m{$m}; + $m = "0$m" if ($m<10); + foreach $d (15..$dmb->days_in_month($y,$m)) { + $h = "0$h" if (length($h)<2); + $mn = "0$mn" if (length($mn)<2); + + print "$y$m$d$h$mn$s\n"; + print "$y-$m-$d-$h:$mn:$s\n"; + print "$y-$m-${d}T$h:$mn:$s\n"; + print "$mmm $d, $y $h:$mn:$s\n"; + print "$m/$d/$y $h:$mn:$s\n"; + + $h += 1; + $h = 0 if ($h > 23); + $mn += 5; + $mn = 0 if ($mn > 59); + } + } +} + +# Local Variables: +# mode: cperl +# indent-tabs-mode: nil +# cperl-indent-level: 3 +# cperl-continued-statement-offset: 2 +# cperl-continued-brace-offset: 0 +# cperl-brace-offset: 0 +# cperl-brace-imaginary-offset: 0 +# cperl-label-offset: 0 +# End: diff --git a/internal/benchmarks/parse-1.sh b/internal/benchmarks/parse-1.sh new file mode 100755 index 0000000..be6adcd --- /dev/null +++ b/internal/benchmarks/parse-1.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +./parse-1.in.pl > parse-1.in + +time ./parse-1.dm.pl +time ./parse-1.dt.pl + +rm -f parse-1.in diff --git a/internal/build.yaml b/internal/build.yaml new file mode 100644 index 0000000..794790c --- /dev/null +++ b/internal/build.yaml @@ -0,0 +1,8 @@ +--- +condrequires: + 'Win32::TieRegistry': + - [ '$IsWin32 && $Pvers >= 5.020', '0.28' ] + - [ '$IsWin32', '0' ] +make: 6.67_01 +pvers: 5.006 +git: 1 diff --git a/internal/data.abbrev.pl b/internal/data.abbrev.pl new file mode 100644 index 0000000..e79e70a --- /dev/null +++ b/internal/data.abbrev.pl @@ -0,0 +1,191 @@ +#!/usr/bin/perl -w +# Copyright (c) 2008-2017 Sullivan Beck. All rights reserved. +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +%def_abbrev = + ( + 'A' => 'A', + 'ACDT' => 'Australia/Adelaide', + 'ACST' => 'Australia/Adelaide', + 'ADDT' => 'America/Goose_Bay', + 'ADT' => 'America/Halifax', + 'AEDT' => [ 'Australia/Melbourne' => 'Australia/Currie' ], + 'AEST' => [ 'Australia/Melbourne' => 'Australia/Brisbane' ], + 'AHDT' => 'America/Anchorage', + 'AHST' => 'America/Anchorage', + 'AKDT' => 'America/Anchorage', + 'AKST' => 'America/Anchorage', + 'AMT' => 'Europe/Amsterdam', + 'APT' => [ 'America/Halifax' => 'America/Anchorage' ], + 'AST' => 'America/Blanc-Sablon', + 'AWDT' => 'Australia/Perth', + 'AWST' => 'Australia/Perth', + 'AWT' => [ 'America/Halifax' => 'America/Anchorage' ], + 'B' => 'B', + 'BDST' => 'Europe/Gibraltar', + 'BDT' => 'America/Adak', + 'BMT' => 'America/Barbados', + 'BOST' => 'America/La_Paz', + 'BST' => 'Europe/London', + 'C' => 'C', + 'CAST' => 'Africa/Khartoum', + 'CAT' => 'Africa/Maputo', + 'CDDT' => 'America/Rankin_Inlet', + 'CDT' => [ 'America/Chicago' => 'America/Winnipeg' ], + 'CEMT' => 'Europe/Berlin', + 'CEST' => 'CET', + 'CET' => 'CET', + 'CMT' => 'America/La_Paz', + 'CPT' => [ 'America/Chicago' => 'America/Atikokan' ], + 'CST' => 'America/Chicago', + 'CWT' => [ 'America/Chicago' => 'America/Atikokan' ], + 'ChST' => 'Pacific/Guam', + 'D' => 'D', + 'DMT' => 'Europe/Dublin', + 'E' => 'E', + 'EAT' => 'Africa/Nairobi', + 'EDDT' => 'America/Iqaluit', + 'EDT' => 'America/New_York', + 'EEST' => 'EET', + 'EET' => 'EET', + 'EMT' => 'Pacific/Easter', + 'EPT' => [ 'America/New_York' => 'America/Detroit' ], + 'EST' => 'America/New_York', + 'EWT' => [ 'America/New_York' => 'America/Detroit' ], + 'F' => 'F', + 'FFMT' => 'America/Martinique', + 'FMT' => 'Atlantic/Madeira', + 'G' => 'G', + 'GMT' => [ 'Etc/GMT' => 'Europe/London' ], + 'GMT+1' => 'Etc/GMT+1', + 'GMT+10' => 'Etc/GMT+10', + 'GMT+11' => 'Etc/GMT+11', + 'GMT+12' => 'Etc/GMT+12', + 'GMT+2' => 'Etc/GMT+2', + 'GMT+3' => 'Etc/GMT+3', + 'GMT+4' => 'Etc/GMT+4', + 'GMT+5' => 'Etc/GMT+5', + 'GMT+6' => 'Etc/GMT+6', + 'GMT+7' => 'Etc/GMT+7', + 'GMT+8' => 'Etc/GMT+8', + 'GMT+9' => 'Etc/GMT+9', + 'GMT-1' => 'Etc/GMT-1', + 'GMT-10' => 'Etc/GMT-10', + 'GMT-11' => 'Etc/GMT-11', + 'GMT-12' => 'Etc/GMT-12', + 'GMT-13' => 'Etc/GMT-13', + 'GMT-14' => 'Etc/GMT-14', + 'GMT-2' => 'Etc/GMT-2', + 'GMT-3' => 'Etc/GMT-3', + 'GMT-4' => 'Etc/GMT-4', + 'GMT-5' => 'Etc/GMT-5', + 'GMT-6' => 'Etc/GMT-6', + 'GMT-7' => 'Etc/GMT-7', + 'GMT-8' => 'Etc/GMT-8', + 'GMT-9' => 'Etc/GMT-9', + 'GST' => 'Pacific/Guam', + 'H' => 'H', + 'HDT' => 'America/Adak', + 'HKST' => 'Asia/Hong_Kong', + 'HKT' => 'Asia/Hong_Kong', + 'HMT' => 'Asia/Kolkata', + 'HST' => 'Pacific/Honolulu', + 'I' => 'I', + 'IDDT' => 'Asia/Jerusalem', + 'IDT' => 'Asia/Jerusalem', + 'IMT' => 'Asia/Irkutsk', + 'IST' => 'Europe/Dublin', + 'JDT' => 'Asia/Tokyo', + 'JMT' => 'Asia/Jerusalem', + 'JST' => 'Asia/Tokyo', + 'K' => 'K', + 'KDT' => 'Asia/Seoul', + 'KMT' => 'Europe/Kiev', + 'KST' => [ 'Asia/Seoul' => 'Asia/Pyongyang' ], + 'L' => 'L', + 'LST' => 'Europe/Riga', + 'M' => 'M', + 'MDDT' => 'America/Cambridge_Bay', + 'MDST' => 'Europe/Moscow', + 'MDT' => 'America/Denver', + 'MEST' => 'MET', + 'MET' => 'MET', + 'MMT' => 'Africa/Monrovia', + 'MPT' => [ 'America/Denver' => 'America/Boise' ], + 'MSD' => 'Europe/Moscow', + 'MSK' => 'Europe/Moscow', + 'MST' => 'America/Denver', + 'MWT' => [ 'America/Denver' => 'America/Boise' ], + 'N' => 'N', + 'NDDT' => 'America/St_Johns', + 'NDT' => 'America/St_Johns', + 'NPT' => 'America/Adak', + 'NST' => 'America/St_Johns', + 'NWT' => [ 'America/St_Johns' => 'America/Adak' ], + 'NZDT' => 'Pacific/Auckland', + 'NZMT' => 'Pacific/Auckland', + 'NZST' => 'Pacific/Auckland', + 'O' => 'O', + 'P' => 'P', + 'PDDT' => 'America/Inuvik', + 'PDT' => 'America/Los_Angeles', + 'PKST' => 'Asia/Karachi', + 'PKT' => 'Asia/Karachi', + 'PLMT' => 'Asia/Ho_Chi_Minh', + 'PMMT' => [ 'Pacific/Port_Moresby' => 'Pacific/Bougainville' ], + 'PMT' => 'America/Paramaribo', + 'PPMT' => 'America/Port-au-Prince', + 'PPT' => [ 'America/Los_Angeles' => 'America/Dawson_Creek' ], + 'PST' => 'America/Los_Angeles', + 'PWT' => 'America/Dawson_Creek', + 'Q' => 'Q', + 'QMT' => 'America/Guayaquil', + 'R' => 'R', + 'RMT' => 'Europe/Riga', + 'S' => 'S', + 'SAST' => 'Africa/Johannesburg', + 'SDMT' => 'America/Santo_Domingo', + 'SET' => 'Europe/Stockholm', + 'SJMT' => 'America/Costa_Rica', + 'SMT' => 'America/Punta_Arenas', + 'SST' => 'Pacific/Pago_Pago', + 'T' => 'T', + 'TBMT' => 'Asia/Tbilisi', + 'TMT' => 'Asia/Tehran', + 'U' => 'U', + 'UT' => 'UT', + 'UTC' => 'UTC', + 'V' => 'V', + 'W' => 'W', + 'WAST' => 'Africa/Windhoek', + 'WAT' => 'Africa/Ndjamena', + 'WEMT' => 'Europe/Monaco', + 'WEST' => 'WET', + 'WET' => 'WET', + 'WIB' => 'Asia/Jakarta', + 'WIT' => 'Asia/Jayapura', + 'WITA' => 'Asia/Makassar', + 'WMT' => 'Europe/Vilnius', + 'X' => 'X', + 'Y' => 'Y', + 'YDDT' => [ 'America/Whitehorse' => 'America/Dawson' ], + 'YDT' => 'America/Yakutat', + 'YPT' => [ 'America/Whitehorse' => 'America/Dawson' ], + 'YST' => 'America/Yakutat', + 'YWT' => [ 'America/Whitehorse' => 'America/Dawson' ], + 'Z' => 'Z', + ); + +1; + +# Local Variables: +# mode: cperl +# indent-tabs-mode: nil +# cperl-indent-level: 3 +# cperl-continued-statement-offset: 2 +# cperl-continued-brace-offset: 0 +# cperl-brace-offset: 0 +# cperl-brace-imaginary-offset: 0 +# cperl-label-offset: 0 +# End: diff --git a/internal/data.alias.pl b/internal/data.alias.pl new file mode 100644 index 0000000..947ad4e --- /dev/null +++ b/internal/data.alias.pl @@ -0,0 +1,320 @@ +#!/usr/bin/perl -w +# Copyright (c) 2008-2017 Sullivan Beck. All rights reserved. +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +# The following zones are treated specially. If they are in the tzdata +# files, they are ignored and created separately. Either there are +# problems with them, or they are defined in other standards ways. + +%windows_zones = + ( + # http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/zone_tzid.html + # CLDR 21 (2012-03-01) + + "AUS Central Standard Time" => "Australia/Darwin", + "AUS Eastern Standard Time" => "Australia/Sydney", + "Afghanistan Standard Time" => "Asia/Kabul", + "Alaskan Standard Time" => "America/Anchorage", + "Arab Standard Time" => "Asia/Riyadh", + "Arabian Standard Time" => "Asia/Dubai", + "Arabic Standard Time" => "Asia/Baghdad", + "Argentina Standard Time" => "America/Argentina/Buenos_Aires", + "Atlantic Standard Time" => "America/Halifax", + "Azerbaijan Standard Time" => "Asia/Baku", + "Azores Standard Time" => "Atlantic/Azores", + "Bahia Standard Time" => "America/Bahia", + "Bangladesh Standard Time" => "Asia/Dhaka", + "Canada Central Standard Time" => "America/Regina", + "Cape Verde Standard Time" => "Atlantic/Cape_Verde", + "Caucasus Standard Time" => "Asia/Yerevan", + "Cen. Australia Standard Time" => "Australia/Adelaide", + "Central America Standard Time" => "America/Guatemala", + "Central Asia Standard Time" => "Asia/Almaty", + "Central Brazilian Standard Time" => "America/Cuiaba", + "Central Europe Standard Time" => "Europe/Budapest", + "Central European Standard Time" => "Europe/Warsaw", + "Central Pacific Standard Time" => "Pacific/Guadalcanal", + "Central Standard Time (Mexico)" => "America/Mexico_City", + "Central Standard Time" => "America/Chicago", + "China Standard Time" => "Asia/Shanghai", + "Dateline Standard Time" => "Etc/GMT+12", + "E. Africa Standard Time" => "Africa/Nairobi", + "E. Australia Standard Time" => "Australia/Brisbane", + "E. Europe Standard Time" => "Asia/Nicosia", + "E. South America Standard Time" => "America/Sao_Paulo", + "Eastern Standard Time" => "America/New_York", + "Egypt Standard Time" => "Africa/Cairo", + "Ekaterinburg Standard Time" => "Asia/Yekaterinburg", + "FLE Standard Time" => "Europe/Kiev", + "Fiji Standard Time" => "Pacific/Fiji", + "GMT Standard Time" => "Europe/London", + "GTB Standard Time" => "Europe/Istanbul", + "Georgian Standard Time" => "Asia/Tbilisi", + "Greenland Standard Time" => "America/Godthab", + "Greenwich Standard Time" => "Atlantic/Reykjavik", + "Hawaiian Standard Time" => "Pacific/Honolulu", + "India Standard Time" => "Asia/Kolkata", + "Iran Standard Time" => "Asia/Tehran", + "Israel Standard Time" => "Asia/Jerusalem", + "Jordan Standard Time" => "Asia/Amman", + "Kaliningrad Standard Time" => "Europe/Kaliningrad", + "Korea Standard Time" => "Asia/Seoul", + "Magadan Standard Time" => "Asia/Magadan", + "Mauritius Standard Time" => "Indian/Mauritius", + "Middle East Standard Time" => "Asia/Beirut", + "Montevideo Standard Time" => "America/Montevideo", + "Morocco Standard Time" => "Africa/Casablanca", + "Mountain Standard Time (Mexico)" => "America/Chihuahua", + "Mountain Standard Time" => "America/Denver", + "Myanmar Standard Time" => "Asia/Yangon", + "N. Central Asia Standard Time" => "Asia/Novosibirsk", + "Namibia Standard Time" => "Africa/Windhoek", + "Nepal Standard Time" => "Asia/Kathmandu", + "New Zealand Standard Time" => "Pacific/Auckland", + "Newfoundland Standard Time" => "America/St_Johns", + "North Asia East Standard Time" => "Asia/Irkutsk", + "North Asia Standard Time" => "Asia/Krasnoyarsk", + "Pacific SA Standard Time" => "America/Santiago", + "Pacific Standard Time" => "America/Los_Angeles", + "Pakistan Standard Time" => "Asia/Karachi", + "Paraguay Standard Time" => "America/Asuncion", + "Romance Standard Time" => "Europe/Paris", + "Russian Standard Time" => "Europe/Moscow", + "SA Eastern Standard Time" => "America/Cayenne", + "SA Pacific Standard Time" => "America/Bogota", + "SA Western Standard Time" => "America/La_Paz", + "SE Asia Standard Time" => "Asia/Bangkok", + "Samoa Standard Time" => "Pacific/Apia", + "Singapore Standard Time" => "Asia/Singapore", + "South Africa Standard Time" => "Africa/Johannesburg", + "Sri Lanka Standard Time" => "Asia/Colombo", + "Syria Standard Time" => "Asia/Damascus", + "Taipei Standard Time" => "Asia/Taipei", + "Tasmania Standard Time" => "Australia/Hobart", + "Tokyo Standard Time" => "Asia/Tokyo", + "Tonga Standard Time" => "Pacific/Tongatapu", + "Turkey Standard Time" => "Europe/Istanbul", + "US Eastern Standard Time" => "America/Indiana/Indianapolis", + "US Mountain Standard Time" => "America/Phoenix", + "UTC+12" => "Etc/GMT-12", + "UTC-02" => "Etc/GMT+2", + "UTC-11" => "Etc/GMT+11", + "Ulaanbaatar Standard Time" => "Asia/Ulaanbaatar", + "Venezuela Standard Time" => "America/Caracas", + "Vladivostok Standard Time" => "Asia/Vladivostok", + "W. Australia Standard Time" => "Australia/Perth", + "W. Central Africa Standard Time" => "Africa/Lagos", + "W. Europe Standard Time" => "Europe/Berlin", + "West Asia Standard Time" => "Asia/Tashkent", + "West Pacific Standard Time" => "Pacific/Port_Moresby", + "Yakutsk Standard Time" => "Asia/Yakutsk", + ); + +%hpux_zones = ( + # tztab $Date: 2008/12/08 17:21:29 $Revision: r11.11/12 PATCH_11.11 (PHCO_39172) + + 'ARST3ARDT' => 'America/Argentina/Buenos_Aires', + 'AST10ADT' => 'America/Adak', + 'AST4ADT#Canada' => 'America/Halifax', + 'BRST3BRDT' => 'America/Sao_Paulo', + 'BRWST4BRWDT' => 'America/Campo_Grande', + 'CSM6CDM' => 'America/Mexico_City', + 'CST-9:30CDT' => 'Australia/Adelaide', + 'CST6CDT#Canada' => 'America/Winnipeg', + 'CST6CDT#Indiana' => 'America/Indiana/Indianapolis', + 'CST6CDT#Mexico' => 'America/Mexico_City', + 'EET-2EETDST' => 'Europe/Helsinki', + 'EST-10EDT' => 'Australia/Melbourne', + 'EST-10EDT#NSW' => 'Australia/Sydney', + 'EST-10EDT#Tasmania' => 'Australia/Hobart', + 'EST-10EDT#VIC' => 'Australia/Melbourne', + 'EST5CDT' => 'America/Indiana/Indianapolis', + 'EST5EDT#Canada' => 'America/Toronto', + 'EST5EDT#Indiana' => 'America/Indiana/Indianapolis', + 'EST5EST' => 'America/Indiana/Indianapolis', + 'EST6CDT' => 'America/Indiana/Indianapolis', + 'MET-1METDST' => 'MET', + 'MEZ-1MESZ' => 'CET', + 'MSM7MDM' => 'America/Chihuahua', + 'MST7MDT#Canada' => 'America/Edmonton', + 'MST7MDT#Mexico' => 'America/Chihuahua', + 'MXST6MXDT' => 'America/Mexico_City', + 'MXST6MXDT#Mexico' => 'America/Mexico_City', + 'NST3:30NDT' => 'America/St_Johns', + 'NST3:30NDT#Canada' => 'America/St_Johns', + 'PST-8PDT' => 'Asia/Singapore', + 'PST8PDT#Canada' => 'America/Vancouver', + 'PWT0PST' => 'Europe/Lisbon', + 'SAST-2' => 'Africa/Johannesburg', + 'WET0WETDST' => 'WET', + 'WST-10WSTDST' => 'Asia/Vladivostok', + 'WST-11WSTDST' => 'Asia/Srednekolymsk', + 'WST-12WSTDST' => 'Asia/Kamchatka', + 'WST-2WSTDST' => 'Europe/Minsk', + 'WST-3WSTDST' => 'Europe/Moscow', + 'WST-4WSTDST' => 'Europe/Samara', + 'WST-5WSTDST' => 'Asia/Yekaterinburg', + 'WST-6WSTDST' => 'Asia/Omsk', + 'WST-7WSTDST' => 'Asia/Krasnoyarsk', + 'WST-8WDT' => 'Australia/Perth', + 'WST-8WSTDST' => 'Asia/Irkutsk', + 'WST-9WSTDST' => 'Asia/Yakutsk', + ); + +%nontzdata_zones = + ( + # The standard GMT+OFF zones don't dump well, so + # we'll create them manually. + + "Etc/GMT-1" => [ qw(offset -1:00:00) ], + "Etc/GMT-2" => [ qw(offset -2:00:00) ], + "Etc/GMT-3" => [ qw(offset -3:00:00) ], + "Etc/GMT-4" => [ qw(offset -4:00:00) ], + "Etc/GMT-5" => [ qw(offset -5:00:00) ], + "Etc/GMT-6" => [ qw(offset -6:00:00) ], + "Etc/GMT-7" => [ qw(offset -7:00:00) ], + "Etc/GMT-8" => [ qw(offset -8:00:00) ], + "Etc/GMT-9" => [ qw(offset -9:00:00) ], + "Etc/GMT-10" => [ qw(offset -10:00:00) ], + "Etc/GMT-11" => [ qw(offset -11:00:00) ], + "Etc/GMT-12" => [ qw(offset -12:00:00) ], + "Etc/GMT-13" => [ qw(offset -13:00:00) ], + "Etc/GMT-14" => [ qw(offset -14:00:00) ], + "Etc/GMT+1" => [ qw(offset 1:00:00) ], + "Etc/GMT+2" => [ qw(offset 2:00:00) ], + "Etc/GMT+3" => [ qw(offset 3:00:00) ], + "Etc/GMT+4" => [ qw(offset 4:00:00) ], + "Etc/GMT+5" => [ qw(offset 5:00:00) ], + "Etc/GMT+6" => [ qw(offset 6:00:00) ], + "Etc/GMT+7" => [ qw(offset 7:00:00) ], + "Etc/GMT+8" => [ qw(offset 8:00:00) ], + "Etc/GMT+9" => [ qw(offset 9:00:00) ], + "Etc/GMT+10" => [ qw(offset 10:00:00) ], + "Etc/GMT+11" => [ qw(offset 11:00:00) ], + "Etc/GMT+12" => [ qw(offset 12:00:00) ], + "Etc/GMT" => [ qw(offset 0:00:00) ], + + # There are some other problems in dumping zones + # that we'll solve by aliasing some zones. They + # could probably be handled by a more intelligent + # handling of the tzdata files, but this is simpler. + + "GMT" => [ qw(alias Etc/GMT) ], + "UTC" => [ qw(offset 0:00:00) ], + "UCT" => [ qw(alias UTC) ], + "Etc/UCT" => [ qw(alias UTC) ], + "Etc/UTC" => [ qw(alias UTC) ], + "Pacific/Johnston" => [ qw(alias Pacific/Honolulu) ], + "HST" => [ qw(ignore) ], + "EST" => [ qw(ignore) ], + "MST" => [ qw(ignore) ], + + # The following are set by RFC-822. + + "A" => [ qw(offset -1:00:00) ], + "B" => [ qw(offset -2:00:00) ], + "C" => [ qw(offset -3:00:00) ], + "D" => [ qw(offset -4:00:00) ], + "E" => [ qw(offset -5:00:00) ], + "F" => [ qw(offset -6:00:00) ], + "G" => [ qw(offset -7:00:00) ], + "H" => [ qw(offset -8:00:00) ], + "I" => [ qw(offset -9:00:00) ], + "K" => [ qw(offset -10:00:00) ], + "L" => [ qw(offset -11:00:00) ], + "M" => [ qw(offset -12:00:00) ], + "N" => [ qw(offset 1:00:00) ], + "O" => [ qw(offset 2:00:00) ], + "P" => [ qw(offset 3:00:00) ], + "Q" => [ qw(offset 4:00:00) ], + "R" => [ qw(offset 5:00:00) ], + "S" => [ qw(offset 6:00:00) ], + "T" => [ qw(offset 7:00:00) ], + "U" => [ qw(offset 8:00:00) ], + "V" => [ qw(offset 9:00:00) ], + "W" => [ qw(offset 10:00:00) ], + "X" => [ qw(offset 11:00:00) ], + "Y" => [ qw(offset 12:00:00) ], + "Z" => [ qw(offset 0:00:00) ], + "UT" => [ qw(offset 0:00:00) ], + ); + +foreach my $winz (keys %windows_zones) { + my $zone = $windows_zones{$winz}; + $nontzdata_zones{$winz} = [ 'alias', $zone ]; +} +foreach my $hpuxz (keys %hpux_zones) { + my $zone = $hpux_zones{$hpuxz}; + $nontzdata_zones{$hpuxz} = [ 'alias', $zone ]; +} + +# Zone aliases of the form "EST5EDT" are handled here. In most cases, +# there are more than one possibile zone that they could apply to. +# Every possibility should be included here (so that they can be +# included in the docs) but the first one will be used. + +%def_alias2 = + ( + # These are set in RFC 822 and the default (first) value will NOT + # be modified ever. + 'CST6CDT' => [ 'America/Chicago' => 'America/Winnipeg' ], + 'EST5EDT' => 'America/New_York', + 'MST7MDT' => 'America/Denver', + 'PST8PDT' => 'America/Los_Angeles', + + # Open to discussion + + 'AEST-10AEDT' => [ 'Australia/Melbourne' => 'Australia/Currie' ], + 'AHST10AHDT' => 'America/Anchorage', + 'AKST9AKDT' => 'America/Anchorage', + 'AST10APT' => 'America/Anchorage', + 'AST4ADT' => 'America/Halifax', + 'AST4APT' => 'America/Blanc-Sablon', + 'AWST-8AWDT' => 'Australia/Perth', + 'BST11BDT' => 'America/Adak', + 'CAT-2CAST' => 'Africa/Khartoum', + 'CET-1CEST' => 'CET', + 'CET-1WEMT' => 'Europe/Monaco', + 'CET-1WEST' => 'Europe/Luxembourg', + 'CST-8CDT' => 'Asia/Shanghai', + 'CST5CDT' => 'America/Havana', + 'CST6CPT' => 'America/Chicago', + 'EET-2EEST' => 'EET', + 'EST5EPT' => [ 'America/New_York' => 'America/Detroit' ], + 'GMT0BST' => 'Europe/London', + 'GMT0IST' => 'Europe/Dublin', + 'HKT-8HKST' => 'Asia/Hong_Kong', + 'HST10HDT' => 'America/Adak', + 'IST-2EEST' => 'Asia/Gaza', + 'IST-2IDT' => 'Asia/Jerusalem', + 'JST-9JDT' => 'Asia/Tokyo', + 'KST-9KDT' => 'Asia/Seoul', + 'MET-1MEST' => 'MET', + 'MSK-3CEST' => [ 'Europe/Minsk' => 'Europe/Chisinau' ], + 'MSK-3MSD' => 'Europe/Moscow', + 'MST7MPT' => [ 'America/Denver' => 'America/Boise' ], + 'NST11NPT' => 'America/Adak', + 'NZST-12NZDT' => 'Pacific/Auckland', + 'PKT-5PKST' => 'Asia/Karachi', + 'PST8PPT' => [ 'America/Los_Angeles' => 'America/Dawson_Creek' ], + 'SAST-2SAST' => 'Africa/Johannesburg', + 'WAT-1WAST' => 'Africa/Windhoek', + 'WET-1WEST' => 'Europe/Luxembourg', + 'WET0WEST' => 'WET', + 'YST9YDT' => 'America/Yakutat', + 'YST9YPT' => [ 'America/Whitehorse' => 'America/Dawson' ], + ); + +1; + +# Local Variables: +# mode: cperl +# indent-tabs-mode: nil +# cperl-indent-level: 3 +# cperl-continued-statement-offset: 2 +# cperl-continued-brace-offset: 0 +# cperl-brace-offset: 0 +# cperl-brace-imaginary-offset: 0 +# cperl-label-offset: 0 +# End: diff --git a/internal/data.misc.pl b/internal/data.misc.pl new file mode 100644 index 0000000..3d02eae --- /dev/null +++ b/internal/data.misc.pl @@ -0,0 +1,66 @@ +#!/usr/bin/perl -w +# Copyright (c) 2008-2017 Sullivan Beck. All rights reserved. +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +# We will store all critical dates for all past years, and years +# up to some point in the future. Critical dates past that year +# will be calculated on the fly. $keep_years is the number of +# years in the future which will be kept explicitly. +# +# This ensures that years in the near future can be accessed quickly, +# and that all years past a threshold are assumed to be static +# (with respect to how critical dates are calculated). +# +# This is the number of years in the future to keep. For testing +# purposes, we'll compare years beyond that to make sure that the +# critical dates are constant. This value ($test_years) must be +# greater than $keep_years. + +my($keep_years,$test_years); +$keep_years = 50; +$test_years = 60; + +$curr_year = (localtime)[5] + 1900; +$keep_year = $curr_year + $keep_years; +$test_year = $curr_year + $test_years; + +# Autogenerated module information + +$zones_pm = "lib/Date/Manip/Zones.pm"; +$zones_pod = $zones_pm; +$zones_pod =~ s/\.pm/.pod/; +$mod_dir = "lib/Date/Manip/TZ"; +$off_dir = "lib/Date/Manip/Offset"; + +# Most zones have a LAST RULE that includes exactly 1 ST (i.e. an offset +# of 00:00) and 1 DST (some other offset). +# +# The following zones are exceptions: + +%last_zone_offsets = + ( +# "America/Resolute" => { "dst" => 0, +# "st" => 2, }, + ); + +# The following zone(s) will not use a LAST RULE to calculate time zone +# changes past $keep_year. Instead, they will use all dates from a dump, +# and nothing beyond that. +# +# Asia/Jerusalem uses a non-standard way based on the Hebrew calendar. + +%no_last = map { $_,1 } qw(Asia/Jerusalem Asia/Tehran); + +1; + +# Local Variables: +# mode: cperl +# indent-tabs-mode: nil +# cperl-indent-level: 3 +# cperl-continued-statement-offset: 2 +# cperl-continued-brace-offset: 0 +# cperl-brace-offset: 0 +# cperl-brace-imaginary-offset: 0 +# cperl-label-offset: 0 +# End: diff --git a/internal/data.offset.pl b/internal/data.offset.pl new file mode 100644 index 0000000..9fb8ccb --- /dev/null +++ b/internal/data.offset.pl @@ -0,0 +1,524 @@ +#!/usr/bin/perl -w +# Copyright (c) 2008-2017 Sullivan Beck. All rights reserved. +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +# We will assign a default time zone based on the date, $isdst, and the +# offset if we have that information, but not the time zone. Here are the +# order we will check the zones. +# +# Offset ISDST=0 ISDST=1 +# 12 +# 11 +# 10 +# 9 +# 8 +# 7 +# 6 +# 5 +# 4 +# 3 EET +# 2 EET CET +# 1 CET WET +# 0 WET Atlantic/Azores +# -1 Atlantic/Azores +# -2 America/Sao_Paulo +# -3 America/Sao_Paulo America/Halifax +# -4 America/Halifax America/New_York +# -5 America/New_York America/Chicago +# -6 America/Chicago America/Denver +# -7 America/Denver America/Los_Angeles +# -8 America/Los_Angeles America/Juneau +# -9 America/Juneau +# -10 Pacific/Honolulu +# -11 +# -12 + +$def_off{0} = { + '+00:00:00' => 'WET', + '+00:06:04' => 'Europe/Andorra', + '+00:09:21' => 'Europe/Paris', + '+00:12:12' => 'Africa/Algiers', + '+00:13:36' => 'Africa/Lagos', + '+00:17:30' => 'Europe/Brussels', + '+00:19:32' => 'Europe/Amsterdam', + '+00:20:00' => 'Europe/Amsterdam', + '+00:24:36' => 'Europe/Luxembourg', + '+00:29:32' => 'Europe/Monaco', + '+00:29:46' => 'Europe/Zurich', + '+00:34:08' => 'Europe/Zurich', + '+00:40:44' => 'Africa/Tunis', + '+00:43:00' => 'Europe/Oslo', + '+00:49:56' => 'Europe/Rome', + '+00:50:20' => 'Europe/Copenhagen', + '+00:52:44' => 'Africa/Tripoli', + '+00:53:28' => 'Europe/Berlin', + '+00:57:44' => 'Europe/Prague', + '+00:58:04' => 'Europe/Malta', + '+01:00:00' => 'CET', + '+01:00:12' => 'Africa/Ndjamena', + '+01:00:14' => 'Europe/Stockholm', + '+01:05:21' => 'Europe/Vienna', + '+01:08:24' => 'Africa/Windhoek', + '+01:12:12' => 'Europe/Stockholm', + '+01:16:20' => 'Europe/Budapest', + '+01:19:20' => 'Europe/Tirane', + '+01:22:00' => 'Europe/Kaliningrad', + '+01:24:00' => 'Europe/Vilnius', + '+01:29:12' => 'Europe/Uzhgorod', + '+01:30:00' => 'Africa/Johannesburg', + '+01:33:16' => 'Europe/Sofia', + '+01:34:52' => 'Europe/Athens', + '+01:35:36' => 'Europe/Vilnius', + '+01:36:34' => 'Europe/Riga', + '+01:39:00' => 'Europe/Tallinn', + '+01:39:49' => 'Europe/Helsinki', + '+01:41:16' => 'Europe/Vilnius', + '+01:44:24' => 'Europe/Bucharest', + '+01:50:00' => 'Europe/Minsk', + '+01:50:16' => 'Europe/Minsk', + '+01:52:00' => 'Africa/Johannesburg', + '+01:55:00' => 'Europe/Chisinau', + '+01:55:20' => 'Europe/Chisinau', + '+01:55:52' => 'Europe/Istanbul', + '+01:56:56' => 'Europe/Istanbul', + '+02:00:00' => 'EET', + '+02:02:04' => 'Europe/Kiev', + '+02:05:09' => 'Africa/Cairo', + '+02:10:08' => 'Africa/Khartoum', + '+02:10:20' => 'Africa/Maputo', + '+02:13:28' => 'Asia/Nicosia', + '+02:15:48' => 'Asia/Famagusta', + '+02:16:00' => 'Europe/Simferopol', + '+02:16:24' => 'Europe/Simferopol', + '+02:17:52' => 'Asia/Gaza', + '+02:20:00' => 'Europe/Zaporozhye', + '+02:20:23' => 'Asia/Hebron', + '+02:20:40' => 'Asia/Jerusalem', + '+02:20:54' => 'Asia/Jerusalem', + '+02:22:00' => 'Asia/Beirut', + '+02:23:44' => 'Asia/Amman', + '+02:25:12' => 'Asia/Damascus', + '+02:27:16' => 'Africa/Nairobi', + '+02:30:00' => 'Africa/Nairobi', + '+02:30:17' => 'Europe/Moscow', + '+02:31:19' => 'Europe/Moscow', + '+02:45:00' => 'Africa/Nairobi', + '+02:57:36' => 'Asia/Baghdad', + '+02:57:40' => 'Europe/Volgograd', + '+02:58:00' => 'Asia/Yerevan', + '+02:59:11' => 'Asia/Tbilisi', + '+03:00:00' => 'Asia/Baghdad', + '+03:04:18' => 'Europe/Saratov', + '+03:06:52' => 'Asia/Riyadh', + '+03:12:12' => 'Europe/Astrakhan', + '+03:13:36' => 'Europe/Ulyanovsk', + '+03:18:48' => 'Europe/Kirov', + '+03:19:24' => 'Asia/Baku', + '+03:20:20' => 'Europe/Samara', + '+03:21:04' => 'Asia/Aqtau', + '+03:25:24' => 'Asia/Oral', + '+03:25:44' => 'Asia/Tehran', + '+03:26:08' => 'Asia/Qatar', + '+03:27:44' => 'Asia/Atyrau', + '+03:30:00' => 'Asia/Tehran', + '+03:41:12' => 'Asia/Dubai', + '+03:41:48' => 'Indian/Mahe', + '+03:41:52' => 'Indian/Reunion', + '+03:45:05' => 'Asia/Yekaterinburg', + '+03:48:40' => 'Asia/Aqtobe', + '+03:50:00' => 'Indian/Mauritius', + '+03:53:32' => 'Asia/Ashgabat', + '+04:00:00' => [ 'Indian/Mauritius' => 'Indian/Mahe' ], + '+04:02:33' => 'Asia/Yekaterinburg', + '+04:21:52' => 'Asia/Qyzylorda', + '+04:27:53' => 'Asia/Samarkand', + '+04:28:12' => 'Asia/Karachi', + '+04:30:00' => 'Asia/Kabul', + '+04:35:12' => 'Asia/Dushanbe', + '+04:36:48' => 'Asia/Kabul', + '+04:37:11' => 'Asia/Tashkent', + '+04:49:40' => 'Indian/Chagos', + '+04:53:30' => 'Asia/Omsk', + '+04:54:00' => 'Indian/Maldives', + '+04:58:24' => 'Asia/Bishkek', + '+05:00:00' => 'Asia/Dushanbe', + '+05:07:48' => 'Asia/Almaty', + '+05:19:24' => 'Asia/Colombo', + '+05:19:32' => 'Asia/Colombo', + '+05:30:00' => 'Asia/Colombo', + '+05:31:40' => 'Asia/Novosibirsk', + '+05:35:00' => 'Asia/Barnaul', + '+05:39:51' => 'Asia/Tomsk', + '+05:41:16' => 'Asia/Kathmandu', + '+05:45:00' => 'Asia/Kathmandu', + '+05:48:48' => 'Asia/Novokuznetsk', + '+05:50:20' => 'Asia/Urumqi', + '+05:53:20' => 'Asia/Kolkata', + '+05:53:28' => 'Asia/Kolkata', + '+05:58:36' => 'Asia/Thimphu', + '+06:00:00' => 'Asia/Urumqi', + '+06:01:40' => 'Asia/Dhaka', + '+06:06:36' => 'Asia/Hovd', + '+06:11:26' => 'Asia/Krasnoyarsk', + '+06:24:40' => 'Asia/Yangon', + '+06:27:40' => 'Indian/Cocos', + '+06:30:00' => 'Indian/Cocos', + '+06:42:04' => 'Asia/Bangkok', + '+06:46:46' => 'Asia/Kuala_Lumpur', + '+06:55:25' => 'Asia/Singapore', + '+06:57:05' => 'Asia/Irkutsk', + '+07:00:00' => 'Indian/Christmas', + '+07:02:52' => 'Indian/Christmas', + '+07:06:30' => 'Asia/Ho_Chi_Minh', + '+07:06:40' => 'Asia/Ho_Chi_Minh', + '+07:07:12' => 'Asia/Jakarta', + '+07:07:32' => 'Asia/Ulaanbaatar', + '+07:17:20' => 'Asia/Pontianak', + '+07:20:00' => 'Asia/Kuala_Lumpur', + '+07:21:20' => 'Asia/Kuching', + '+07:30:00' => 'Asia/Kuala_Lumpur', + '+07:33:52' => 'Asia/Chita', + '+07:34:20' => 'Asia/Macau', + '+07:36:42' => 'Asia/Hong_Kong', + '+07:38:00' => 'Asia/Choibalsan', + '+07:39:40' => 'Asia/Brunei', + '+07:43:24' => 'Australia/Perth', + '+07:57:36' => 'Asia/Makassar', + '+08:00:00' => 'Asia/Taipei', + '+08:04:00' => 'Asia/Manila', + '+08:05:43' => 'Asia/Shanghai', + '+08:06:00' => 'Asia/Taipei', + '+08:22:20' => 'Asia/Dili', + '+08:23:00' => 'Asia/Pyongyang', + '+08:27:52' => 'Asia/Seoul', + '+08:30:00' => 'Asia/Pyongyang', + '+08:35:28' => 'Australia/Eucla', + '+08:38:58' => 'Asia/Yakutsk', + '+08:43:20' => 'Australia/Darwin', + '+08:45:00' => 'Australia/Eucla', + '+08:47:31' => 'Asia/Vladivostok', + '+08:57:56' => 'Pacific/Palau', + '+09:00:00' => 'Asia/Tokyo', + '+09:02:13' => 'Asia/Khandyga', + '+09:14:20' => 'Australia/Adelaide', + '+09:18:59' => 'Asia/Tokyo', + '+09:22:48' => 'Asia/Jayapura', + '+09:25:48' => 'Australia/Broken_Hill', + '+09:30:00' => 'Australia/Adelaide', + '+09:30:48' => 'Asia/Sakhalin', + '+09:32:54' => 'Asia/Ust-Nera', + '+09:35:28' => 'Australia/Currie', + '+09:39:00' => 'Pacific/Guam', + '+09:39:52' => 'Australia/Melbourne', + '+09:48:32' => [ 'Pacific/Port_Moresby' => 'Pacific/Bougainville' ], + '+09:48:40' => 'Pacific/Port_Moresby', + '+09:49:16' => 'Australia/Hobart', + '+09:55:56' => 'Australia/Lindeman', + '+10:00:00' => [ 'Australia/Melbourne' => 'Australia/Brisbane' ], + '+10:03:12' => 'Asia/Magadan', + '+10:04:52' => 'Australia/Sydney', + '+10:07:08' => 'Pacific/Chuuk', + '+10:12:08' => 'Australia/Brisbane', + '+10:14:52' => 'Asia/Srednekolymsk', + '+10:22:16' => 'Pacific/Bougainville', + '+10:30:00' => 'Australia/Lord_Howe', + '+10:32:52' => 'Pacific/Pohnpei', + '+10:34:36' => 'Asia/Kamchatka', + '+10:36:20' => 'Australia/Lord_Howe', + '+10:39:48' => 'Pacific/Guadalcanal', + '+10:51:56' => 'Pacific/Kosrae', + '+11:00:00' => [ 'Pacific/Pohnpei' => 'Pacific/Kosrae' ], + '+11:05:48' => 'Pacific/Noumea', + '+11:06:28' => 'Pacific/Wake', + '+11:07:40' => 'Pacific/Nauru', + '+11:09:20' => 'Pacific/Kwajalein', + '+11:11:52' => 'Pacific/Norfolk', + '+11:12:00' => 'Pacific/Norfolk', + '+11:13:16' => 'Pacific/Efate', + '+11:24:48' => 'Pacific/Majuro', + '+11:30:00' => 'Pacific/Norfolk', + '+11:32:04' => 'Pacific/Tarawa', + '+11:39:04' => 'Pacific/Auckland', + '+11:49:56' => 'Asia/Anadyr', + '+11:55:44' => 'Pacific/Fiji', + '+11:56:52' => 'Pacific/Funafuti', + '+12:00:00' => [ 'Pacific/Tarawa' => 'Pacific/Funafuti' ], + '+12:13:21' => 'America/Adak', + '+12:13:48' => 'Pacific/Chatham', + '+12:15:00' => 'Pacific/Chatham', + '+12:15:20' => 'Pacific/Wallis', + '+12:19:20' => 'Pacific/Tongatapu', + '+12:20:00' => 'Pacific/Tongatapu', + '+12:33:04' => 'Pacific/Apia', + '+12:37:12' => 'Pacific/Pago_Pago', + '+12:45:00' => 'Pacific/Chatham', + '+12:58:21' => 'America/Nome', + '+13:00:00' => 'Pacific/Tongatapu', + '+14:00:00' => 'Pacific/Kiritimati', + '+14:00:24' => 'America/Anchorage', + '+14:41:05' => 'America/Yakutat', + '+14:58:47' => 'America/Sitka', + '+15:02:19' => 'America/Juneau', + '+15:13:42' => 'America/Metlakatla', + '-00:00:52' => 'Africa/Accra', + '-00:01:15' => 'Europe/London', + '-00:14:44' => 'Europe/Madrid', + '-00:16:08' => 'Africa/Abidjan', + '-00:21:16' => 'Africa/Ceuta', + '-00:21:24' => 'Europe/Gibraltar', + '-00:25:00' => 'Europe/Dublin', + '-00:25:21' => 'Europe/Dublin', + '-00:27:04' => 'Atlantic/Faroe', + '-00:30:20' => 'Africa/Casablanca', + '-00:36:45' => 'Europe/Lisbon', + '-00:43:08' => 'Africa/Monrovia', + '-00:44:30' => 'Africa/Monrovia', + '-00:52:48' => 'Africa/El_Aaiun', + '-01:00:00' => 'Atlantic/Azores', + '-01:01:36' => 'Atlantic/Canary', + '-01:02:20' => 'Africa/Bissau', + '-01:07:36' => 'Atlantic/Madeira', + '-01:14:40' => 'America/Danmarkshavn', + '-01:27:52' => 'America/Scoresbysund', + '-01:28:00' => 'Atlantic/Reykjavik', + '-01:34:04' => 'Atlantic/Cape_Verde', + '-01:42:40' => 'Atlantic/Azores', + '-01:54:32' => 'Atlantic/Azores', + '-02:00:00' => 'Atlantic/South_Georgia', + '-02:09:40' => 'America/Noronha', + '-02:19:36' => 'America/Recife', + '-02:22:52' => 'America/Maceio', + '-02:26:08' => 'Atlantic/South_Georgia', + '-02:34:00' => 'America/Fortaleza', + '-02:34:04' => 'America/Bahia', + '-03:00:00' => [ 'America/Sao_Paulo' => 'America/Araguaina' ], + '-03:06:28' => 'America/Sao_Paulo', + '-03:12:48' => 'America/Araguaina', + '-03:13:56' => 'America/Belem', + '-03:26:56' => 'America/Godthab', + '-03:29:20' => 'America/Cayenne', + '-03:30:00' => 'America/St_Johns', + '-03:30:52' => 'America/St_Johns', + '-03:38:28' => 'America/Campo_Grande', + '-03:38:48' => 'America/Santarem', + '-03:40:36' => 'America/Paramaribo', + '-03:40:40' => 'America/Paramaribo', + '-03:40:52' => 'America/Paramaribo', + '-03:44:20' => 'America/Cuiaba', + '-03:44:40' => 'America/Miquelon', + '-03:44:44' => 'America/Montevideo', + '-03:45:00' => 'America/Guyana', + '-03:48:28' => 'America/Blanc-Sablon', + '-03:50:40' => 'America/Asuncion', + '-03:51:24' => 'Atlantic/Stanley', + '-03:52:40' => 'America/Guyana', + '-03:53:48' => 'America/Argentina/Buenos_Aires', + '-03:58:29' => 'America/Barbados', + '-03:59:48' => 'America/Glace_Bay', + '-04:00:00' => 'America/Blanc-Sablon', + '-04:00:04' => 'America/Manaus', + '-04:01:40' => 'America/Goose_Bay', + '-04:02:40' => 'America/Boa_Vista', + '-04:04:20' => 'America/Martinique', + '-04:06:04' => 'America/Port_of_Spain', + '-04:14:24' => 'America/Halifax', + '-04:15:36' => 'America/Porto_Velho', + '-04:16:48' => 'America/Argentina/Cordoba', + '-04:19:18' => 'Atlantic/Bermuda', + '-04:19:08' => 'America/Moncton', + '-04:20:52' => 'America/Argentina/Tucuman', + '-04:21:12' => 'America/Argentina/Jujuy', + '-04:21:40' => 'America/Argentina/Salta', + '-04:23:08' => 'America/Argentina/Catamarca', + '-04:24:25' => 'America/Puerto_Rico', + '-04:25:24' => 'America/Argentina/San_Luis', + '-04:27:24' => 'America/Argentina/La_Rioja', + '-04:27:40' => 'America/Caracas', + '-04:27:44' => 'America/Caracas', + '-04:30:00' => 'America/Caracas', + '-04:31:12' => 'America/Rio_Branco', + '-04:32:36' => 'America/La_Paz', + '-04:33:12' => 'America/Argentina/Ushuaia', + '-04:34:04' => 'America/Argentina/San_Juan', + '-04:35:08' => 'America/Thule', + '-04:35:16' => 'America/Argentina/Mendoza', + '-04:35:47' => 'America/Curacao', + '-04:36:52' => 'America/Argentina/Rio_Gallegos', + '-04:39:28' => 'America/Eirunepe', + '-04:39:36' => 'America/Santo_Domingo', + '-04:40:00' => 'America/Santo_Domingo', + '-04:42:46' => 'America/Santiago', + '-04:43:40' => 'America/Punta_Arenas', + '-04:44:32' => 'America/Grand_Turk', + '-04:49:00' => 'America/Port-au-Prince', + '-04:49:20' => 'America/Port-au-Prince', + '-04:56:02' => 'America/New_York', + '-04:56:16' => 'America/Bogota', + '-05:00:00' => 'America/New_York', + '-05:07:11' => 'America/Jamaica', + '-05:08:12' => 'America/Lima', + '-05:08:36' => 'America/Lima', + '-05:09:30' => 'America/Nassau', + '-05:14:00' => 'America/Guayaquil', + '-05:17:32' => 'America/Toronto', + '-05:18:08' => 'America/Panama', + '-05:19:20' => 'America/Guayaquil', + '-05:19:36' => 'America/Panama', + '-05:29:28' => 'America/Havana', + '-05:29:36' => 'America/Havana', + '-05:32:11' => 'America/Detroit', + '-05:36:13' => 'America/Costa_Rica', + '-05:39:24' => 'America/Kentucky/Monticello', + '-05:40:16' => 'America/Indiana/Vevay', + '-05:43:02' => 'America/Kentucky/Louisville', + '-05:44:38' => 'America/Indiana/Indianapolis', + '-05:45:08' => 'America/Managua', + '-05:45:12' => 'America/Managua', + '-05:45:23' => 'America/Indiana/Marengo', + '-05:46:25' => 'America/Indiana/Winamac', + '-05:46:30' => 'America/Indiana/Knox', + '-05:47:03' => 'America/Indiana/Tell_City', + '-05:47:04' => 'America/Cancun', + '-05:48:52' => 'America/Tegucigalpa', + '-05:49:07' => 'America/Indiana/Petersburg', + '-05:50:07' => 'America/Indiana/Vincennes', + '-05:50:27' => 'America/Menominee', + '-05:50:36' => 'America/Chicago', + '-05:52:48' => 'America/Belize', + '-05:53:04' => 'America/Nipigon', + '-05:56:48' => 'America/El_Salvador', + '-05:57:00' => 'America/Thunder_Bay', + '-05:58:24' => 'Pacific/Galapagos', + '-05:58:28' => 'America/Merida', + '-06:00:00' => 'America/Chicago', + '-06:02:04' => 'America/Guatemala', + '-06:06:28' => 'America/Atikokan', + '-06:18:16' => 'America/Rainy_River', + '-06:28:36' => 'America/Winnipeg', + '-06:36:36' => 'America/Mexico_City', + '-06:40:00' => 'America/Matamoros', + '-06:41:16' => 'America/Monterrey', + '-06:45:12' => 'America/North_Dakota/Center', + '-06:45:39' => 'America/North_Dakota/New_Salem', + '-06:47:07' => 'America/North_Dakota/Beulah', + '-06:57:40' => 'America/Ojinaga', + '-06:58:36' => 'America/Regina', + '-06:59:56' => 'America/Denver', + '-07:00:00' => 'America/Denver', + '-07:01:00' => 'America/Bahia_Banderas', + '-07:04:20' => 'America/Chihuahua', + '-07:05:40' => 'America/Mazatlan', + '-07:11:20' => 'America/Swift_Current', + '-07:17:28' => 'Pacific/Easter', + '-07:23:52' => 'America/Hermosillo', + '-07:28:18' => 'America/Phoenix', + '-07:33:52' => 'America/Edmonton', + '-07:44:49' => 'America/Boise', + '-07:46:04' => 'America/Creston', + '-07:48:04' => 'America/Tijuana', + '-07:52:58' => 'America/Los_Angeles', + '-08:00:00' => 'America/Los_Angeles', + '-08:00:56' => 'America/Dawson_Creek', + '-08:10:47' => 'America/Fort_Nelson', + '-08:12:28' => 'America/Vancouver', + '-08:30:00' => 'Pacific/Pitcairn', + '-08:40:20' => 'Pacific/Pitcairn', + '-08:46:18' => 'America/Metlakatla', + '-08:57:41' => 'America/Juneau', + '-08:59:48' => 'Pacific/Gambier', + '-09:00:00' => 'America/Yakutat', + '-09:00:12' => 'America/Whitehorse', + '-09:01:13' => 'America/Sitka', + '-09:17:40' => 'America/Dawson', + '-09:18:00' => 'Pacific/Marquesas', + '-09:18:55' => 'America/Yakutat', + '-09:30:00' => 'Pacific/Marquesas', + '-09:58:16' => 'Pacific/Tahiti', + '-09:59:36' => 'America/Anchorage', + '-10:00:00' => [ 'Pacific/Honolulu' => 'Pacific/Tahiti' ], + '-10:29:20' => 'Pacific/Kiritimati', + '-10:30:00' => 'Pacific/Rarotonga', + '-10:31:26' => 'Pacific/Honolulu', + '-10:39:04' => 'Pacific/Rarotonga', + '-10:40:00' => 'Pacific/Kiritimati', + '-11:00:00' => 'Pacific/Pago_Pago', + '-11:01:38' => 'America/Nome', + '-11:19:40' => 'Pacific/Niue', + '-11:20:00' => 'Pacific/Niue', + '-11:22:48' => 'Pacific/Pago_Pago', + '-11:24:20' => 'Pacific/Enderbury', + '-11:24:56' => 'Pacific/Fakaofo', + '-11:26:56' => 'Pacific/Apia', + '-11:30:00' => 'Pacific/Niue', + '-11:46:38' => 'America/Adak', + '-12:00:00' => 'Etc/GMT-12', + '-13:00:00' => 'Etc/GMT-13', + '-14:00:00' => 'Etc/GMT-14', + '-14:21:00' => 'Pacific/Guam', + '-15:56:00' => 'Asia/Manila', + }; + +$def_off{1} = { + '+00:00:00' => 'Atlantic/Azores', + '+00:20:00' => 'Africa/Accra', + '+00:34:39' => 'Europe/Dublin', + '+01:00:00' => 'WET', + '+01:19:32' => 'Europe/Amsterdam', + '+01:20:00' => 'Europe/Amsterdam', + '+02:00:00' => 'CET', + '+02:36:34' => 'Europe/Riga', + '+03:00:00' => 'EET', + '+03:31:19' => 'Europe/Moscow', + '+04:00:00' => 'Europe/Moscow', + '+04:30:00' => 'Asia/Tehran', + '+04:31:19' => 'Europe/Moscow', + '+05:00:00' => 'Asia/Baku', + '+06:00:00' => 'Asia/Yekaterinburg', + '+06:30:00' => 'Asia/Colombo', + '+07:00:00' => 'Asia/Omsk', + '+07:20:00' => 'Asia/Kuala_Lumpur', + '+08:00:00' => 'Asia/Hovd', + '+08:20:00' => 'Asia/Kuching', + '+09:00:00' => 'Asia/Ulaanbaatar', + '+09:30:00' => 'Asia/Seoul', + '+09:45:00' => 'Australia/Eucla', + '+10:00:00' => 'Asia/Chita', + '+10:30:00' => 'Australia/Adelaide', + '+11:00:00' => [ 'Australia/Melbourne' => 'Australia/Currie' ], + '+11:30:00' => 'Australia/Lord_Howe', + '+12:00:00' => 'Asia/Magadan', + '+12:30:00' => 'Pacific/Norfolk', + '+13:00:00' => 'Pacific/Auckland', + '+13:45:00' => 'Pacific/Chatham', + '+14:00:00' => 'Pacific/Tongatapu', + '-01:00:00' => 'America/Noronha', + '-01:30:00' => 'America/St_Johns', + '-02:00:00' => 'America/Sao_Paulo', + '-02:30:00' => 'America/St_Johns', + '-02:30:52' => 'America/St_Johns', + '-03:00:00' => 'America/Halifax', + '-03:32:36' => 'America/La_Paz', + '-04:00:00' => 'America/New_York', + '-04:30:00' => 'America/Santo_Domingo', + '-05:00:00' => [ 'America/Chicago' => 'America/Winnipeg' ], + '-05:30:00' => 'America/Belize', + '-06:00:00' => 'America/Denver', + '-07:00:00' => 'America/Los_Angeles', + '-08:00:00' => [ 'America/Juneau' => 'America/Yakutat' ], + '-09:00:00' => 'America/Adak', + '-09:30:00' => 'Pacific/Rarotonga', + '-10:00:00' => 'Pacific/Apia', + }; + +1; +# Local Variables: +# mode: cperl +# indent-tabs-mode: nil +# cperl-indent-level: 3 +# cperl-continued-statement-offset: 2 +# cperl-continued-brace-offset: 0 +# cperl-brace-offset: 0 +# cperl-brace-imaginary-offset: 0 +# cperl-label-offset: 0 +# End: diff --git a/internal/dm_translate b/internal/dm_translate new file mode 100644 index 0000000..e9a1db2 --- /dev/null +++ b/internal/dm_translate @@ -0,0 +1,249 @@ + + + + +
+today at noon +
+at 3:00 PM +
+ + + +
+each thursday at noon +
+at noon each day +
+each month +
+every thursday at noon +
+at noon every day +
+every month +
+ + + +
+year, years +
+month, months +
+week, weeks +
+day, days +
+hour, hours +
+minute, minutes +
+second, seconds +
+ + + +
+last day of the month +
+last thursday +
+final day of the month +
+ + + +
+exactly 5 minutes +
+approximately 5 minutes +
+5 business days +
+ + + +
+next week +
+following week +
+last week +
+previous week +
+ + + +
+1st, one, first +
+2nd, two, second +
+3rd, three, third +
+4th, four, fourth +
+5th, five, fifth +
+6th, six, sixth +
+7th, seven, seventh +
+8th, eight, eighth +
+9th, nine, ninth +
+10th, ten, tenth +
+11th, eleven, eleventh +
+12th, twelve, twelfth +
+13th, thirteen, thirteenth +
+14th, fourteen, fourteenth +
+15th, fifteen, fifteenth +
+16th, sixteen, sixteenth +
+17th, seventeen, seventeenth +
+18th, eighteen, eighteenth +
+19th, nineteen, nineteenth +
+20th, twenty, twentieth +
+21st, twenty-one, twenty-first +
+22nd, twenty-two, twenty-second +
+23rd, twenty-three, twenty-third +
+24th, twenty-four, twenty-fourth +
+25th, twenty-five, twenty-fifth +
+26th, twenty-six, twenty-sixth +
+27th, twenty-seven, twenty-seventh +
+28th, twenty-eight, twenty-eighth +
+29th, twenty-nine, twenty-ninth +
+30th, thirty, thirtieth +
+31st, thirty-one, thirty-first +
+32nd, thirty-two, thirty-second +
+33rd, thirty-three, thirty-third +
+34th, thirty-four, thirty-fourth +
+35th, thirty-five, thirty-fifth +
+36th, thirty-six, thirty-sixth +
+37th, thirty-seven, thirty-seventh +
+38th, thirty-eight, thirty-eighth +
+39th, thirty-nine, thirty-ninth +
+40th, forty, fortieth +
+41st, forty-one, forty-first +
+42nd, forty-two, forty-second +
+43rd, forty-three, forty-third +
+44th, forty-four, forty-fourth +
+45th, forty-five, forty-fifth +
+46th, forty-six, forty-sixth +
+47th, forty-seven, forty-seventh +
+48th, forty-eight, forty-eighth +
+49th, forty-nine, forty-ninth +
+50th, fifty, fiftieth +
+51st, fifty-one, fifty-first +
+52nd, fifty-two, fifty-second +
+53rd, fifty-three, fifty-third +
+ + + +
+second day in march +
+second day of march +
+ + + +
+yesterday +
+today +
+tomorrow +
+ + + +
+now +
+ + + +
+on may 1st +
+ + + +
+noon +
+midnight +
+ + + +
+5 years ago +
+5 years in the past +
+5 years past +
+5 years earlier +
+5 years before now +
+in 5 years +
+5 years later +
+5 years in the future +
+5 years future +
+5 years from now +
+ + diff --git a/internal/dumps b/internal/dumps new file mode 100755 index 0000000..de99fe1 --- /dev/null +++ b/internal/dumps @@ -0,0 +1,43 @@ +#!/bin/sh + +if [ ! -d "tzdata/dump" ]; then + echo "Dump files removed." + exit +fi + +for file in `cd tzdata/dump; echo *` ;do + tz=`head -1 tzdata/dump/$file | awk '{print $1}'` + echo "##########################################################" + echo "### $tz" + + # Create the new dump. Ignore lines with the year 0001 and 9999. + + perl -I./lib examples/dm_zdump -v $tz | egrep -v '0001|9999' > z.dump.new + ln=`wc -l z.dump.new | awk '{print $1}'` + + # Copy the old dump. Ignore the 2 first and 2 last lines. + + tail --lines=+3 tzdata/dump/$file | head --lines=-2 > z.dump.old + lo=`wc -l z.dump.old | awk '{print $1}'` + + if [ "$ln" = "0" ]; then + echo "***" + echo "*** ERROR ***" + echo "***" + + elif [ $lo -gt $ln ]; then + mv z.dump.old z.dump.old.1 + head --lines=$ln z.dump.old.1 > z.dump.old + rm -f z.dump.old.1 + + elif [ $ln -gt $lo ]; then + mv z.dump.new z.dump.new.1 + head --lines=$lo z.dump.new.1 > z.dump.new + rm -f z.dump.new.1 + fi + + diff -c z.dump.old z.dump.new + rm -f z.dump.old z.dump.new + +done + diff --git a/internal/gen_dm5abbrevs b/internal/gen_dm5abbrevs new file mode 100755 index 0000000..08ba6cc --- /dev/null +++ b/internal/gen_dm5abbrevs @@ -0,0 +1,255 @@ +#!/usr/bin/perl -w +# Copyright (c) 2010-2017 Sullivan Beck. All rights reserved. +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +############################################################################### +############################################################################### +# This script is used to automatically generate the Date::Manip::DM5abbrevs +# modeul used in Date::Manip 5.xx . + +use lib "./lib"; + +require 5.010000; +use strict; +use warnings; + +use Date::Manip::Zones; +use Date::Manip::TZ; + +our($VERSION); +$VERSION='6.60'; + +our($DEBUG); +$DEBUG = 0; + +our(@keep); +@keep = qw( + idlw -1200 + nt -1100 + sat -0400 + cldt -0300 + at -0200 + utc +0000 + mewt +0100 + mez +0100 + fwt +0100 + gb +0100 + swt +0100 + mesz +0200 + fst +0200 + metdst +0200 + eetdst +0300 + eetedt +0300 + bt +0300 + it +0330 + zp4 +0400 + zp5 +0500 + ist +0530 + zp6 +0600 + awst +0800 + rok +0900 + aest +1000 + acdt +1030 + cadt +1030 + aedt +1100 + eadt +1100 + nzt +1200 + idle +1200 + ); + +############################################################################ +# MAIN PROGRAM +############################################################################ + +my $year = ( localtime(time) )[5] + 1900; +my $tz = new Date::Manip::TZ; + +my $podstr = '=pod'; # so the CPAN indexer won't treat this as a POD file + +print "package Date::Manip::DM5abbrevs; +# Copyright (c) 2003-$year Sullivan Beck. All rights reserved. +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +######################################################################## +######################################################################## + +$podstr + +=head1 NAME + +Date::Manip::DM5abbrevs - A list of all timezone abbreviations + +=head1 SYNPOSIS + +This module is not intended to be used directly. Date::Manip 5.xx +will load it as needed. + +This module contains all of the time zone abbreviations from +Date::Manip 6.xx copied backwards to 5.xx to provide slightly +better support for time zones. + +Note that this is only a bandaid fix, and does not add proper +time zone handling to version 5.xx . + +=cut + +require 5.000; + +use strict; +use warnings; + +our(\$VERSION); +\$VERSION='6.60'; + +END { + my \$tmp; + \$tmp = \\\$Date::Manip::DM5::Abbrevs; +} + +\$Date::Manip::DM5::Abbrevs = join(' ',qw( +"; + +my @tmp = @keep; +my %off; +while (@tmp) { + my($abb) = shift(@tmp); + my($off) = shift(@tmp); + $off{$abb} = $off; + print " $abb" . " "x(6-length($abb)) . " $off\n"; +} +print "\n"; + +# We have to come up with the best offset for each abbreviation. +# +# We'll look first at values in the current year. +# Then we'll look back in time. + +ABBREV: foreach my $abbrev (sort keys %Date::Manip::Zones::Abbrev) { + my @zone = @{ $Date::Manip::Zones::Abbrev{$abbrev} }; + + foreach my $zone (@zone) { + my @period = $tz->all_periods($zone,$year); + foreach my $period (@period) { + my @per = @$period; + my $abb = lc($per[4]); + next if ($abb ne $abbrev); + my $off = $per[3]; + my ($h,$m,$s) = @$off; + $h += 0; + next if ($s != 0); + + my $sign; + if ($h < 0) { + $h *= -1; + $m *= -1; + $sign = "-"; + } else { + $sign = "+"; + } + $h = "0$h" if (length($h) == 1); + $m = "0$m" if (length($m) == 1); + $off = "$sign$h$m"; + + print " $abb" . " "x(6-length($abb)) . " $off\n"; + $off{$abb} = $off; + next ABBREV; + } + } + + # If we've arrived here, we didn't find the abbreviation in + # the current year, so we need to go back in time. + + my $best_off = ""; + my $best_date = "0001010100:00:00"; + + print ":: Abbrev = $abbrev...\n" if ($DEBUG); + + ZONE:foreach my $zone (@zone) { + my @period = $tz->periods($zone,undef,$year); + while (@period) { + my $period = pop(@period); + + my @per = @$period; + my $date = $per[10]; + my $abb = lc($per[4]); + next if ($abb ne $abbrev); + my $off = $per[3]; + my ($h,$m,$s) = @$off; + $h += 0; + next if ($s != 0); + + my $sign; + if ($h < 0 || + ($h == 0 && $m < 0)) { + $h *= -1; + $m *= -1; + $sign = "-"; + } else { + $sign = "+"; + } + $h = "0$h" if (length($h) == 1); + $m = "0$m" if (length($m) == 1); + + if ($date lt $best_date) { + print ":: $zone => $best_off [ $best_date ]\n" if ($DEBUG); + next ZONE; + } + + $best_off = "$sign$h$m"; + $best_date = $date; + + print ":: $zone => $best_off [ $best_date ] ***\n" if ($DEBUG); + next ZONE; + } + } + + if ($best_off) { + $off{$abbrev} = $best_off; + print " $abbrev" . " "x(6-length($abbrev)) . " $best_off\n"; + } + next ABBREV; +} + +print ")); + +$podstr + +=head1 TIMEZONES + +The following timezones are defined: + +"; + +foreach my $abb (sort keys %off) { + my $off = $off{$abb}; + print " " . uc($abb) . " "x(6-length($abb)) . " $off\n"; +} + +print " + +=head1 LICENSE + +This script is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 AUTHOR + +Sullivan Beck (sbeck\@cpan.org) + +=cut + +1; +"; + +# Local Variables: +# mode: cperl +# indent-tabs-mode: nil +# cperl-indent-level: 3 +# cperl-continued-statement-offset: 2 +# cperl-continued-brace-offset: 0 +# cperl-brace-offset: 0 +# cperl-brace-imaginary-offset: 0 +# cperl-label-offset: 0 +# End: diff --git a/internal/langpod b/internal/langpod new file mode 100644 index 0000000..5cec633 --- /dev/null +++ b/internal/langpod @@ -0,0 +1,568 @@ +#!/usr/bin/perl -w +# Copyright (c) 2012-2017 Sullivan Beck. All rights reserved. +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +############################################################################### +############################################################################### +# This script is used to automatically generate the language pod files. + +use lib "./lib"; + +require 5.010000; +use IO::File; +use strict; +use warnings; +require Date::Manip::Lang::index; +$| = 1; + +our $VERSION; +$VERSION='6.31'; + +############################################################################## +# GLOBAL VARIABLES +############################################################################### + +our $langdir = 'lib/Date/Manip/Lang'; +our $curry = ( localtime(time) )[5] + 1900; + +############################################################################### +# HELP +############################################################################### + +our ($usage); +my $COM = $0; +$COM =~ s/^.*\///; + +$usage= + "usage: $COM OPTIONS + -h/--help : Print help. + +This script will generate the pod files for each of the Date::Manip +language modules. +"; + +############################################################################### +# PARSE ARGUMENTS +############################################################################### + +while ($_ = shift) { + (print $usage), exit if ($_ eq "-h" || $_ eq "--help"); +} + +############################################################################ +# MAIN PROGRAM +############################################################################ + +no warnings; +my @mod = values %Date::Manip::Lang::index::Lang; +use warnings; + +my %mod = map { $_,1 } @mod; +@mod = sort keys %mod; + +foreach my $mod (@mod) { + write_pod($mod); +} + +############################################################################ +############################################################################ + +no strict 'refs'; +sub write_pod { + my($mod) = @_; + + my $undef = " Not defined in this language\n"; + eval "require Date::Manip::Lang::${mod}"; + my $lang = ${ "Date::Manip::Lang::${mod}::Language" }; + my $name = ${ "Date::Manip::Lang::${mod}::LangName" }; + my $year0 = ${ "Date::Manip::Lang::${mod}::YearAdded" }; + + my $out = new IO::File; + $out->open("> ${langdir}/${mod}.pod"); + binmode $out, ":encoding(UTF-8)"; + + my %words; + + my %lists = ('ampm' => 2, + 'day_name' => 7, + 'day_abb' => 7, + 'day_char' => 7, + 'month_name' => 12, + 'month_abb' => 12, + 'fields' => 7, + 'nextprev' => 2, + 'nth' => 53, + 'mode' => 2, + 'when' => 2, + ); + while (my($key,$num) = each %lists) { + if (exists $$lang{$key}) { + foreach (my $i=0; $i < $num; $i++) { + $words{$key}[$i] = ''; + if (defined ($$lang{$key}[$i])) { + my @tmp = @{ $$lang{$key}[$i] }; + foreach my $tmp (@tmp) { + $words{$key}[$i] .= " $tmp\n" if ($tmp); + } + } else { + print "Undefined: $mod,$key\n"; + } + $words{$key}[$i] = $undef if (! $words{$key}[$i]); + } + } else { + foreach (my $i=0; $i < $num; $i++) { + $words{$key}[$i] = $undef; + } + } + } + + my @words = qw(at each last of on); + + foreach my $set (@words) { + $words{$set} = ''; + if (exists $$lang{$set}) { + my @tmp = @{ $$lang{$set} }; + foreach my $tmp (@tmp) { + $words{$set} .= " $tmp\n" if ($tmp); + } + } + $words{$set} = $undef if (! $words{$set}); + } + + @words = qw(offset_date offset_time times); + + foreach my $set (@words) { + $words{$set} = ''; + if (exists $$lang{$set}) { + foreach my $key (sort keys %{ $$lang{$set} }) { + my $val = $$lang{$set}{$key}; + $words{$set} .= " $key" . " "x(20-length($key)) . " $val\n"; + } + } + $words{$set} = $undef if (! $words{$set}); + } + + if (exists $$lang{"sephm"}) { + $words{"seps"} = ''; + my @hm = @{ $$lang{"sephm"} }; + my @ms = @{ $$lang{"sepms"} }; + for (my $i=0; $i <= $#hm; $i++) { + $words{'seps'} .= " $hm[$i] $ms[$i]\n"; + } + } else { + $words{'seps'} = $undef; + } + + if (exists $$lang{"sepfr"}) { + $words{"sepfr"} = $$lang{"sepfr"}; + } else { + $words{'sepfr'} = $undef; + } + + # Try to hide pod so it doesn't get indexed + my $e = '='; + + print $out <<"EOF"; +# Copyright (c) $year0-$curry Sullivan Beck. All rights reserved. +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +######################################################################## +######################################################################## + +${e}pod + +${e}encoding utf-8 + +${e}head1 NAME + +Date::Manip::Lang::${mod} - ${name} language support. + +${e}head1 SYNOPSIS + +This module contains a list of words and expressions supporting +the language. It is not intended to be used directly (other +Date::Manip modules will load it as needed). + +${e}head1 LANGUAGE EXPRESSIONS + +The following is a list of all language words and expressions used +to write times and/or dates. + +All strings are case insensitive. + +${e}over 4 + +${e}item B + +When writing out the name of the month, several different variations may +exist including full names and abbreviations. + +The following month names may be used: + +$words{month_name}[0] +$words{month_name}[1] +$words{month_name}[2] +$words{month_name}[3] +$words{month_name}[4] +$words{month_name}[5] +$words{month_name}[6] +$words{month_name}[7] +$words{month_name}[8] +$words{month_name}[9] +$words{month_name}[10] +$words{month_name}[11] + +The following abbreviations may be used: + +$words{month_abb}[0] +$words{month_abb}[1] +$words{month_abb}[2] +$words{month_abb}[3] +$words{month_abb}[4] +$words{month_abb}[5] +$words{month_abb}[6] +$words{month_abb}[7] +$words{month_abb}[8] +$words{month_abb}[9] +$words{month_abb}[10] +$words{month_abb}[11] + +${e}item B + +When writing out the name of the day, several different variations may +exist including full names and abbreviations. + +The following day names may be used: + +$words{day_name}[0] +$words{day_name}[1] +$words{day_name}[2] +$words{day_name}[3] +$words{day_name}[4] +$words{day_name}[5] +$words{day_name}[6] + +The following abbreviations may be used: + +$words{day_abb}[0] +$words{day_abb}[1] +$words{day_abb}[2] +$words{day_abb}[3] +$words{day_abb}[4] +$words{day_abb}[5] +$words{day_abb}[6] + +The following short (1-2 characters) abbreviations may be used: + +$words{day_char}[0] +$words{day_char}[1] +$words{day_char}[2] +$words{day_char}[3] +$words{day_char}[4] +$words{day_char}[5] +$words{day_char}[6] + +${e}item B + +These are the names (and abbreviations) for the fields in a delta. There are +7 fields: years, months, weeks, days, hours, minutes, seconds. + +The names and abbreviations for these fields are: + +$words{fields}[0] +$words{fields}[1] +$words{fields}[2] +$words{fields}[3] +$words{fields}[4] +$words{fields}[5] +$words{fields}[6] + +${e}item B + +This is a list of expressions use to designate morning or afternoon time +when a time is entered as a 12-hour time rather than a 24-hour time. +For example, in English, the time "17:00" could be specified as "5:00 PM". + +Morning and afternoon time may be designated by the following sets of +words: + +$words{ampm}[0] +$words{ampm}[1] + +${e}item B + +There are a list of words that specify every occurrence of something. These +are used in the following phrases: + + EACH Monday + EVERY Monday + EVERY month + +The following words may be used: + +$words{each} + +${e}item B + +There are a list of words that may be used to specify the next, +previous, or last occurrence of something. These words could be used +in the following phrases: + + NEXT week + + LAST Tuesday + PREVIOUS Tuesday + + LAST day of the month + +The following words may be used: + +Next occurrence: + +$words{nextprev}[0] + +Previous occurrence: + +$words{nextprev}[1] + +Last occurrence: + +$words{last} + +${e}item B + +When parsing deltas, there are words that may be used to specify +the the delta will refer to a time in the future or to a time in +the past (relative to some date). In English, for example, you +might say: + + IN 5 days + 5 days AGO + +The following words may be used to specify deltas that refer to +dates in the past or future respectively: + +$words{when}[0] +$words{when}[1] + +${e}item B + +This contains two lists of words which can be used to specify a standard +(i.e. non-business) delta or a business delta. + +Previously, it was used to tell whether the delta was approximate or exact, +but now this list is not used except to force the delta to be standard. + +The following words may be used: + +$words{mode}[0] + +The following words may be used to specify a business delta: + +$words{mode}[1] + +${e}item B + +Numbers may be spelled out in a variety of ways. The following sets correspond +to the numbers from 1 to 53: + +$words{nth}[0] +$words{nth}[1] +$words{nth}[2] +$words{nth}[3] +$words{nth}[4] +$words{nth}[5] +$words{nth}[6] +$words{nth}[7] +$words{nth}[8] +$words{nth}[9] + +$words{nth}[10] +$words{nth}[11] +$words{nth}[12] +$words{nth}[13] +$words{nth}[14] +$words{nth}[15] +$words{nth}[16] +$words{nth}[17] +$words{nth}[18] +$words{nth}[19] + +$words{nth}[20] +$words{nth}[21] +$words{nth}[22] +$words{nth}[23] +$words{nth}[24] +$words{nth}[25] +$words{nth}[26] +$words{nth}[27] +$words{nth}[28] +$words{nth}[29] + +$words{nth}[30] +$words{nth}[31] +$words{nth}[32] +$words{nth}[33] +$words{nth}[34] +$words{nth}[35] +$words{nth}[36] +$words{nth}[37] +$words{nth}[38] +$words{nth}[39] + +$words{nth}[40] +$words{nth}[41] +$words{nth}[42] +$words{nth}[43] +$words{nth}[44] +$words{nth}[45] +$words{nth}[46] +$words{nth}[47] +$words{nth}[48] +$words{nth}[49] + +$words{nth}[50] +$words{nth}[51] +$words{nth}[52] + +${e}item B + +In writing out dates in common forms, there are a number of words +that are typically not important. + +There is frequently a word that appears in a phrase to designate +that a time is going to be specified next. In English, you would +use the word AT in the example: + + December 3 at 12:00 + +The following words may be used: + +$words{at} + +Another word is used to designate one member of a set. In English, +you would use the words IN or OF: + + 1st day OF December + 1st day IN December + +The following words may be used: + +$words{of} + +Another word is use to specify that something is on a certain date. In +English, you would use ON: + + ON July 5th + +The following words may be used: + +$words{on} + +${e}item B + +There are some words that can be used to specify a date, a +time, or both relative to now. + +Words that set the date are similar to the English words 'yesterday' +or 'tomorrow'. These are specified as a delta which is added to the +current time to get a date. The time is NOT set however, so the delta +is only partially used (it should only include year, month, week, and +day fields). + +The following words may be used: + +$words{offset_date} + +Words that set only the time of day are similar to the English words +'noon' or 'midnight'. + +The following words may be used: + +$words{times} + +Words that set the entire time and date (relative to the current +time and date) are also available. + +In English, the word 'now' is one of these. + +The following words may be used: + +$words{offset_time} + +${e}item B + +When specifying the time of day, the most common separator is a colon (:) +which can be used for both separators. + +Some languages use different pairs. For example, French allows you to +specify the time as 13h30:20, so it would use the following pairs: + + : : + h : + +The first column is the hour-minute separator and the second column is +the minute-second separator. Both are perl regular expressions. When +creating a new translation, be aware that regular expressions with utf-8 +characters may be tricky. For example, don't include the expression '[x]' +where 'x' is a utf-8 character. + +A pair of colons is ALWAY allowed for all languages. If a language allows +additional pairs, they are listed here: + +$words{seps} + +${e}item B + +When specifying fractional seconds, the most common way is to use a +decimal point (.). Some languages may specify a different separator +that might be used. If this is done, it is a regular expression. + +The decimal point is ALWAYS allowed for all languages. If a language allows +another separator, it is listed here: + +$words{sepfr} + +${e}back + +${e}head1 KNOWN BUGS + +None known. + +${e}head1 BUGS AND QUESTIONS + +Please refer to the L documentation for +information on submitting bug reports or questions to the author. + +${e}head1 SEE ALSO + +L - main module documentation + +${e}head1 LICENSE + +This script is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +${e}head1 AUTHOR + +Sullivan Beck (sbeck\@cpan.org) + +${e}cut +EOF + + $out->close(); +} +use strict 'refs'; + +# Local Variables: +# mode: cperl +# indent-tabs-mode: nil +# cperl-indent-level: 3 +# cperl-continued-statement-offset: 2 +# cperl-continued-brace-offset: 0 +# cperl-brace-offset: 0 +# cperl-brace-imaginary-offset: 0 +# cperl-label-offset: 0 +# End: diff --git a/internal/leak.pl b/internal/leak.pl new file mode 100644 index 0000000..2e4fa00 --- /dev/null +++ b/internal/leak.pl @@ -0,0 +1,18 @@ +#!/usr/bin/perl + +$a1 = '(?\d)'; + +$a2 = $a1; +#$a2 = '(?\d)'; + +$b = '\d'; + +$rx = qr/(?:${a}${b}|${a2}:${b})/; + +#$string = "12"; +$string = "1:2"; + +while (1) { + $string =~ $rx; + $tmp = $+{a}; +} diff --git a/internal/module.isp b/internal/module.isp new file mode 100644 index 0000000..6b4e1aa --- /dev/null +++ b/internal/module.isp @@ -0,0 +1,802 @@ +abb +abbrev +abbrevs +ACDT +ADT +AEDT +AEST +Aharon +Aitchison +Alexandr +Ambrus +Amick +ampm +ANDK +Andras +Andreas +Andres +Anwar +API +arg +args +ARGV +Arzul +Asaf +autogenerated +Avera +AWST +Babakov +backpan +Bamber +bapprox +Barta +Bartov +basedate +Bassman +Bataille +Bautista +BC +BD +BDn +begLTs +begUT +begUTs +Bence +Berlage +Beutner +Bhatia +Bion +Bjoernsvik +Bjornsvik +Boehm +Bohme +Bollinger +Bristow +BrowserUK +Bruni +Bryne +bsemi +BT +bugfix +Buikema +Bunce +Burgin +Burlison +BWn +ca +CADT +calc +Caminati +Cappella +catalan +CCYY +CCYYDoY +CCYYMMDD +CCYYWww +CCYYWwwD +CET +Cezar +CGI +Chadd +Chana +Chateauvieux +CheckFilePath +checktime +Ciornii +CLDT +cmdfield +cmp +cnf +co +config +ConfigFile +convtz +ConvTZ +Coppit +Cornelis +Corry +cp +cpan +cpanp +cpanratings +cpants +Cristina +cron +crontab +CSD +ctime +CUNHA +curr +currd +CurrTZ +CurrYear +Cusack +cwd +CWN +CWP +cygwin +cYYYY +cz +da +Dalberg +Damyan +danish +Danne +Dapi +DateCalc +DateFormat +DateInit +dateLT +DateManip +DateManipVersion +DatePath +datestr +DateTime +dateTtime +dateUT +Dateyyyy +DayOfWeek +DayOfYear +DaysInMonth +DaysInYear +DaysSince +DaySuffix +dd +ddascalescu +DDmmm +DDmmmYY +DDmmmYYYY +DDYY +DDYYmmm +DDYYYYmmm +dec +DEceMBer +decembre +Dedlow +def +DefaultTime +del +DeltaSigns +deltastr +Dembach +der +Derksen +Devel +dh +Diab +die's +dir +dist +distro +dm +dmake +dmb +Dmmm +DmmmYY +DmmmYYYY +dmn +dofw +Domgoergen +Doru +DoW +dow +doy +DoY +Drudis +ds +dst +dstflag +dstonly +dT +dt +Dubost +Duplisse +dutch +Duzenbury +dv +dw +DWD +DXY +dy +Dyd +EADT +Eddelbuettel +eest +EETDST +EETEDT +Egashira +Ehrenberg +Elson +Emiliano +endLT +endLTs +endUT +endUTs +eng +english +Enrique +env +epocho +er +EraseEvents +EraseHolidays +ereyesterday +Ernesto +errlev +errlevel +ErrorCheck +errref +es +eval +Evan +Eveland +EXIF +ExtUtils +favicon +FD +FDn +Ferrero +Fettich +fi +filehandle +FindWindowsTZName +finnish +FirstDay +foo +forcedate +ForceDate +fr +fre +french +freq +Fridat +FST +Fuhr +FW +FWn +FWT +GAAS +GD +Geraint +german +GetNext +GetPrev +getpw +getpwnam +getpwuid +Gilles +Gillingwater +Giray +GitHub +github +GlobalCnf +gmt +gmtime +gmtoff +Gosta +Gregor +gz +Haerri +Hahler +Hartland +hd +hdh +hds +Hedley +Hendler +Heng +Henrique +Herrmann +hh +HHMM +HHMMSS +hhmn +HHMNSS +hhs +Hilazo +Hiver +hms +Horsten +Horster +Hovi +Howansky +hr +Hranicky +ht +html +http +https +Hughes +hv +hys +iana +IBD +ico +IDLW +IgnoreGlobalCnf +Iikka +ILYAZ +IMO +Ingham +init +InitDone +IntCharSet +Iosif +Iosif's +Isard +isdst +IsHoliday +IsInt +IST +IsWorkDay +italian +Ivanov +IW +IWn +iX +Jacek +Jasso +Javier +JD +Jelinek +Jenda +Jerius +Jesper +Johansson +Jorgen +Jurgen +Jyrgen +Kalika +Kang +Kapranoff +Karacsony +Karkkainen +Kasal +Khairil +Khaled +Khera +Kimmo +Kipp +Kitover +Klep +ko +Kovalenko +Kreulich +Krynicky +Kurtis +kwalitee +Labovitz +LaLiberte +Lamiral +LangName +LDS +LeapYear +leapyear +Leite +Lenz +Lewin +libwww +linux +Lipson +listref +Litvinov +LMT +localtime +Lon +ls +Ludovic +Lugauer +Lyons +MacOS +mainvar +MakeMaker +Malakhov +Mandelbaum +manip +Manip's +Markwick +Martinec +MathPari +Mauro +MAXLINELENGTH +McGonigal +Melendez +Melo +memoize +Meng +MEST +MESZ +METDST +MEWP +MEWT +MEZ +Miao +Minkler +mins +Minsoul +MLK +MMDD +MMDDHH +MMDDHHMN +MMDDHHMNSS +MMDDHHMNSSF +mmm +mmmD +mmmDD +mmmDDYY +mmmDDYYYY +mmmYYYY +mn +MNmn +MNSS +ModuloAddition +Mohammad +Moller +mon +Montford +Morganwalp +Moritz +Morten +Mostaguir +MPE +msg +Mstrict +MSWin +muir +MULTINET +mv +MW +my'ed +mycommand +Myw +n'th +nb +NBD +NDn +NearestWorkDay +Nederlands +Nesbitt +NetWare +nextprev +NextWorkDay +Niel +Nigel +Nikulin +nl +nntp +nocheck +nocommon +nodelta +nodow +noholidays +noiso +Nomann +nonormalize +noother +Norgaard +NormalizeDelta +norwegian +Norwood +nospecial +Novich +Nowacki +NST +NT +NT's +NthDayOfYear +NTn +num +NUMth +NWD +NWn +Nyrgaard +NYTprof +NZT +obj +Oelstrom +offh +offm +offsetstr +OldConfigFiles +Ole +OO +opensuse +openSuSE +OpenSuSE +OpenUNIX +OpenVMS +org +Osbourne +oses +OSes +Ostermiller +osx +overmorrow +Oxhaj +Paco +Padwardhan +parseable +ParseDate +ParseDateDelta +ParseDateFormat +ParseDateString +ParseDelta +ParseRecur +PathSep +PD +PDn +Pedrozzi +Perelman +PeriodTimeSep +perl +perlcritic +perlmonks +perlsec +Pero +PersonalCnf +PersonalCnfPath +Petrescu +Piran +Pizolato +pl +pm +PMQS +PODs +podspell +Pohl +Poilbarbe +Polyakov +portugue +posix +Poszvek +Pradac +pragma +prereq +prev +PrevWorkDay +printf +Prymmer +pt +PTn +pwd +Qian +Rader +Ramin +Randal +Rapetti +Rectanus +RecurNumFudgeDays +RecurRange +RedHat +Reetz +regexp +regexps +Regodon +Reithmaier +Rejhon +ResetWorkDay +ResetWorkdDay +RHEL +Rhesa +Ric +Rinske +Rintala +ro +Roderwald +Rodrigues +ROK +romanian +Rowell +Rozendaal +rt +rtime +ru +Rui +runtests +russian +Sa +sabado +Samuli +Savignon +sbeck +Scheit +Schickbauer +Schiedler +Schinder +Schkolnik +Schulze +sdh +secs +SecsSince +Selinger +sephm +sepms +Serodio +setdate +SetDate +SetDateField +SetTime +Setzer +Shahaf +Sharnoff +Sheahan +Shtern +Sieborger +Slutz +Sogn +Soldierer +Solli +someothervalue +Sorrell +sortDate +spanish +Spiers +ss +SSSS +std +stdonly +Steinberger +Stepan +Stepp +stormking +str +substr +suid +SunOS +sv +Swartwout +swedish +swp +SWT +Sybase +sybperl +Syck +Symdump +sysconfig +Szabo +Taewook +Tarallo +TCPIP +tgz +Theodor +Thomsen +Thur +Tibbitts +TieRegistry +Tietsort +timecheck +TimeDate +timezone +TimeZone +timezones +tmp +TodayIsMidnight +TODO +Tommi +tomorrowfirst +TomorrowFirst +TOMZO +Torkington +tr +Trocki +Tsao +tuc +Tues +Tulan +turkish +Turmel +Twomey +tz +tzcode +tzd +tzdata +TZdata +tzstring +UCX +uncertaintly +undef +unix +UnixDate +unmod +unparsable +UpdateCurrTZ +uselongdouble +usr +UTC +utf +UX +val +valhalla +vals +var +Vasey +Verdes +vers +Virden +Virkkunen +Vishal +Vivek +wayback +WDn +WeekOfYear +Westhoff +WindowsNT +WinNT +Winzig +wk +wkno +wks +Wojtowicz +Worenklein +WorkDay +WorkDayBeg +WorkDayEnd +workdays +WorkDayStart +WorkWeekBeg +WorkWeekEnd +WOY +WOY'th +ws +Ww +www +wWW +WwwD +WXX +Wyant +Wyngaard +Xavi +Xd +Xh +Xiang +XP +Xt +XYZ +Yamamoto +YAML +yd +YearAdded +YM +ymd +yml +Yoak +yrs +yt +Yuming +Yusof +YWwwD +yy +YYDoY +yyM +YYMM +YYMMDD +YYmmm +yys +YYtoYYYY +YYWww +YYwWWD +YYWwwD +yyyy +YYYYDOY +YYYYMM +YYYYMMDD +YYYYMMDDHH +YYYYMMDDHHMMSS +YYYYMMDDHHMN +YYYYMMDDHHMNSS +YYYYMMDDHHMNSSF +YYYYmmm +YYYYmmmD +YYYYmmmDD +YYYYwWWD +Zajac +zdate +zdump +Zhenyi +Zhou +Zhu +Zinser +zoneinfo +ZP +Zsban +zzz diff --git a/internal/translate b/internal/translate new file mode 100755 index 0000000..b048bbf --- /dev/null +++ b/internal/translate @@ -0,0 +1,204 @@ +#!/usr/bin/perl -w + +# This will create the YAML portion of the translation file from +# two sources: +# the locale files +# a google translation +# +# To do this, first translate the file 'dm_translate.html' at +# http://translate.google.com/ +# and paste the results into the file: +# /tmp/translate +# +# Next set the locale in the following line, and then run the +# program. + +$locale = 'tr'; + +########################################################################## + +use DateTime::Locale; +use Encode; + +my $obj = DateTime::Locale->load($locale); +my $tim = $obj->time_format_medium(); + +my @trans = `cat /tmp/translate`; +chomp(@trans); + +while (! $trans[0]) { + shift(@trans); +} + +########################################################################## + +my($hm,$ms); +if ($tim =~ /hh(.)mm/i) { + $hm = '"[' . $1 . ']"'; +} +if ($tim =~ /mm(.)ss/i) { + $ms = '"[' . $1 . ']"'; +} +print_list(1,"ampm", $obj->am_pm_abbreviated()); + +### + +@list = translate(\@trans); +print_list(0,"at",\@list); + +### + +print_list(1,"day_abb", $obj->day_format_abbreviated(), $obj->day_stand_alone_abbreviated()); +print_list(1,"day_char", $obj->day_format_narrow(), $obj->day_stand_alone_narrow()); +print_list(1,"day_name", $obj->day_format_wide(), $obj->day_stand_alone_wide()); + +### + +@list = translate(\@trans); +print_list(0,"each",\@list); + +@list = translate(\@trans); +print_list(0,"fields",\@list); + +@list = translate(\@trans); +print_list(0,"last",\@list); + +@list = translate(\@trans); +print_list(0,"mode",\@list); + +### + +print_list(1,"month_abb", $obj->month_format_abbreviated(), $obj->month_stand_alone_abbreviated()); +print_list(1,"month_name",$obj->month_format_wide(), $obj->month_stand_alone_wide()); + +### + +@list = translate(\@trans); +print_list(0,"nextprev",\@list); + +### + +@list = translate(\@trans); +print "nth:\n"; +foreach my $line (@list) { + $line =~ s/^ \S+ ,\s* \S+ ,\s* \S+ \s+//x; + if ($line =~ / (.*?) ,\s* (.*?) ,\s* (.*) $/x) { + ($nth,$num,$numth) = ($1,$2,$3); + print " -\n"; + print " - $nth\n"; + print " - ''\n"; + print " - $num\n"; + print " - $numth\n" if ($num ne $numth); + } else { + print " -\n"; + print " - $line\n"; + } +} + +### + +@list = translate(\@trans); +print_list(0,"of",\@list); + +@list = translate(\@trans); +print_list(0,"offset_date",\@list); + +@list = translate(\@trans); +print_list(0,"offset_time",\@list); + +@list = translate(\@trans); +print_list(0,"on",\@list); + +### + +print_val ("sephm",$hm); +print_val ("sepms",$ms); + +### + +@list = translate(\@trans); +print_list(0,"times",\@list); + +@list = translate(\@trans); +print_list(0,"when",\@list); + +########################################################################## + +sub translate { + my($trans) = @_; + + while (! $$trans[0]) { + shift(@$trans); + } + + my @ret; + while ($$trans[0]) { + push(@ret,shift(@$trans)); + } + + return @ret; +} + +sub print_val { + my($label,$val) = @_; + return if (! $val); + + print "$label:\n"; + print " - $val\n"; +} + +sub print_list { + my($utf,$label,$vals,$vals2) = @_; + my @vals; + if (ref($vals)) { + @vals = @$vals + } elsif ($vals) { + @vals = ($vals); + } + + my @vals2; + if (ref($vals2)) { + @vals2 = @$vals2; + } elsif ($vals2) { + @vals2 = ($vals2); + } + + print "$label:\n"; + + if (@vals) { + foreach my $val (@vals) { + $val = encode_utf8(lc($val)) if ($utf); + print " -\n"; + + if ($utf) { + my $ascii = decode_utf8($val); + $ascii = encode("ascii",$ascii); + if ($ascii ne $val) { + print " - $ascii\n"; + } + } + + print " - $val\n"; + if (@vals2) { + $val2 = encode_utf8(lc(shift(@vals2))); + if ($val2 ne $val) { + print " - $val2\n"; + } + } + } + + } else { + print " TRANSLATE\n"; + } +} + +# Local Variables: +# mode: cperl +# indent-tabs-mode: nil +# cperl-indent-level: 3 +# cperl-continued-statement-offset: 2 +# cperl-continued-brace-offset: 0 +# cperl-brace-offset: 0 +# cperl-brace-imaginary-offset: 0 +# cperl-label-offset: 0 +# End: diff --git a/internal/tzdata b/internal/tzdata new file mode 100755 index 0000000..e8cf27e --- /dev/null +++ b/internal/tzdata @@ -0,0 +1,2187 @@ +#!/usr/bin/perl -w +# Copyright (c) 2008-2017 Sullivan Beck. All rights reserved. +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +############################################################################### +############################################################################### +# This script is used to automatically generate the Date::Manip::Zones +# and Date::Manip::TZ::_ZONE_ modules from the original time zone data. + +use lib "./lib"; +use lib "./internal"; + +require 5.010000; +use YAML; +use IO::File; +use Date::Manip::Base; +use Date::Manip::TZdata; +use strict; +use warnings; + +our $VERSION; +$VERSION='6.60'; + +our ($dmb); +$dmb = new Date::Manip::Base; + +our $curry = ( localtime(time) )[5] + 1900; + +############################################################################## +# GLOBAL VARIABLES +############################################################################### + +our ($first_date,$last_date,$tzdata_src,$tzdata_dir,$tzdata_data,$tzdata_code, + $mod_dir,$off_dir, + $curr_year,$keep_year,$test_year,$zones_pm,$zones_pod, + %def_off,%nontzdata_zones,%def_alias2,%def_abbrev,%no_last, + %last_zone_offsets + ); + +# The first and last dates (UT) known by this module (everything in the +# 0001 - 9999 range except for the first and last 24 hours of that range). + +$first_date = "0001010200:00:00"; +$last_date = "9999123100:00:00"; + +# The source for the tzdata/tzcode files: + +$tzdata_src = "ftp.iana.org"; +$tzdata_dir = "tz"; +$tzdata_data= "tzdata-latest.tar.gz"; +$tzdata_code= "tzcode-latest.tar.gz"; + + +require "data.offset.pl"; +require "data.abbrev.pl"; +require "data.alias.pl"; +require "data.misc.pl"; + +# so the CPAN indexer won't treat this as a POD file +our $podstr = '=pod'; +our $hdstr = '=head1'; + +############################################################################### +# HELP +############################################################################### + +our ($usage); +my $COM = $0; +$COM =~ s/^.*\///; + +$usage= + "usage: $COM OPTIONS + -h/--help : Print help. + -v/--verbose : Increasing levels of verbosity + + -a/--all : Do all steps + + -f/--ftp : Download the tzdata/tzcode files from + the source and build the tools + -l/--list : Get a list of all time zones to dump + -d/--dump : This dumps out zone info for all of + the zones + -m/--mods : This creates the modules from the dumps + -o/--offset : Creates the offset modules + -z/--zones : Create the zones module + -c/--clean : Removes tzdata files +"; + +############################################################################### +# PARSE ARGUMENTS +############################################################################### + +our ($verbose); +$verbose = 0; +my $do_all = 0; +my $do_ftp = 0; +my $do_build = 0; +my $do_list = 0; +my $do_dump = 0; +my $do_mods = 0; +my $do_off = 0; +my $do_zones = 0; +my $do_clean = 0; + +while ($_ = shift) { + + (print $usage), exit if ($_ eq "-h" || $_ eq "--help"); + $verbose = 1, next if ($_ eq "-v" || $_ eq "--verbose"); + + $do_all = 1, next if ($_ eq "-a" || $_ eq "--all"); + + $do_ftp = 1, next if ($_ eq "-f" || $_ eq "--ftp"); + $do_build = 1, next if ($_ eq "-b" || $_ eq "--build"); + $do_list = 1, next if ($_ eq "-l" || $_ eq "--list"); + $do_dump = 1, next if ($_ eq "-d" || $_ eq "--dump"); + $do_mods = 1, next if ($_ eq "-m" || $_ eq "--mods"); + $do_off = 1, next if ($_ eq "-o" || $_ eq "--offset"); + $do_zones = 1, next if ($_ eq "-z" || $_ eq "--zones"); + $do_clean = 1, next if ($_ eq "-c" || $_ eq "--clean"); +} + +############################################################################ +# MAIN PROGRAM +############################################################################ + +do_ftp() if ($do_all || $do_ftp); +do_build() if ($do_all || $do_build); +do_list() if ($do_all || $do_list); +do_dump() if ($do_all || $do_dump); +do_mods() if ($do_all || $do_mods); +do_off() if ($do_all || $do_off); +do_zones() if ($do_all || $do_zones); +do_clean() if ( $do_clean); + +############################################################################ +# DO_FTP +############################################################################ + +# FTP the tzdata/tzcode packages +# +sub do_ftp { + print "FTP...\n"; + + system("rm -rf tzdata; mkdir tzdata"); + chdir("tzdata"); + + # + # Get the tz*latest.tar.gz links to determine the versions + # + + system("wget -q 'ftp://$tzdata_src/$tzdata_dir/$tzdata_data' " . + "'ftp://$tzdata_src/$tzdata_dir/$tzdata_code'"); + if (! -f $tzdata_data) { + die "ERROR: unable to ftp data. Try again later."; + } + if (! -f $tzdata_code) { + die "ERROR: unable to ftp code. Try again later."; + } + + system("tar xzf $tzdata_data"); + my $tzdata_vers = _release('data'); + + system("tar xzf $tzdata_code"); + my $tzcode_vers = _release('code'); + + print " TZdata : $tzdata_vers\n"; + print " Tzcode : $tzcode_vers\n"; + + system("echo $tzdata_vers > _version; " . + "echo $tzcode_vers >> _version; "); +} + +sub _release { + my($type) = @_; + if (! -f 'NEWS') { + die "ERROR: unable to determine version (no NEWS): $type\n"; + } + my $vers = `grep Release NEWS | head -1 | awk '{print \$2}'`; + chomp($vers); + if ($vers !~ /^\d\d\d\d[a-z]$/) { + die "ERROR: uknown version format: $type: $vers\n"; + } + system("mv NEWS NEWS.$type"); + return $vers; +} + +# Build the package +# +sub do_build { + print "Build...\n"; + + system("cd tzdata; " . + "touch NEWS; " . + "make TOPDIR=./tmp INSTALL;"); +} + +############################################################################ +# DO_LIST +############################################################################ + +# Get a list of all zones in the tzdata files which we will create +# modules for. Store a list of them and the associated module name. +# +# Stored in: _zone +# +sub do_list { + print "List...\n"; + + # + # Get a list of zones from all Zone lines in the standard files in + # the tzdata package. + # + + my(@zone); + + foreach my $file (@Date::Manip::TZdata::StdFiles) { + my @tmp = `grep '^Zone' tzdata/$file | awk '{print \$2}'`; + chomp(@tmp); + push(@zone,@tmp); + } + + # + # Generate a module name for every zone (excepting some which + # we're ignoring, or creating in other ways). + # + + my %module = (); + my %modname = (); + my %alias = (); + foreach my $zone (sort @zone) { + next if (exists $nontzdata_zones{$zone} || + exists $def_alias2{$zone}); + my $module = _do_list_modname(\%modname,$zone); + $module{$zone} = [ $module, "tzdata" ]; + $alias{$zone} = [ $zone, "tzdata" ]; + } + + # + # Generate a module name for every zone which is created as + # an offset (e.g. GMT-3). + # + + foreach my $zone (sort keys %nontzdata_zones) { + my($type,$val) = @{ $nontzdata_zones{$zone} }; + if ($type eq "offset") { + my $module = _do_list_modname(\%modname,$zone); + $module{$zone} = [ $module, "offset", $val ]; + $alias{$zone} = [ $zone, "offset" ]; + } + } + + # + # Handle all other special cases such as special aliases and + # ignored zones. + # + + foreach my $zone (sort keys %nontzdata_zones) { + my($type,$val) = @{ $nontzdata_zones{$zone} }; + if ($type eq "offset") { + next; + } elsif ($type eq "alias") { + warn "[do_list] unknown alias [$zone: $val]\n" + if (! exists $module{$val}); + $alias{$zone} = [ $val, $type ]; + } elsif ($type eq "ignore") { + $alias{$zone} = [ $val, $type ]; + } else { + warn "[do_list] unknown type [$zone: $type]\n"; + } + } + + # Write out the official list of zones and aliases. + + _yaml_write(\%module,"tzdata/_zone_list",0); + _yaml_write(\%alias, "tzdata/_alias_list",0); +} + +# Takes a hashref $module{MODNAME} = ZONE and a zone and comes up +# with a unique module name for it. It returns the name of the module +# (as well as adds it to the hash). +# +sub _do_list_modname { + my($modnames,$zone) = @_; + + my $modname = ""; + if ($zone =~ /\//) { + my @tmp = split(/\//,$zone); + $modname = substr($tmp[0],0,2) . substr($tmp[$#tmp],0,4); + } else { + $modname = substr($zone,0,6); + } + $modname =~ s/\-/m/g; + $modname =~ s/\+/p/g; + + my $i = "00"; + while (exists $$modnames{"$modname$i"}) { + $i++; + } + $modname .= $i; + $$modnames{$modname} = 1; + return lc($modname); +} + +############################################################################ +# DO_DUMP +############################################################################ + +# Dump every zone. +# +# Stored in: dump/MODNAME +# +sub do_dump { + print "Dump...\n"; + + my $tmp = _yaml_read("tzdata/_zone_list"); + my %module = %$tmp; + my $num = keys %module; + my $len = length($num); + my $i = 0; + + system("rm -rf tzdata/dump; " . + "mkdir tzdata/dump"); + + print " dumping "," "x($len-length($i)),"$i / $num"; + + foreach my $zone (keys %module) { + $i++; + print "\010"x($len*2+3)," "x($len-length($i)),"$i / $num"; + my($module,$type) = @{ $module{$zone} }; + next if ($type ne "tzdata"); + system("cd tzdata; " . + "tmp/etc/zdump -c $test_year -v $zone > dump/$module"); + } + print "\n"; +} + +############################################################################ +# DO_MODS +############################################################################ + +# Creates the modules. +# +sub do_mods { + print "Modules...\n"; + my $tzd = Date::Manip::TZdata->new(); + system("rm -f $mod_dir/*"); + + my $zone_list = _yaml_read("tzdata/_zone_list"); + my %zone_list = %$zone_list; + my $num = keys %zone_list; + my $len = length($num); + my $i = 0; + + my $abbrev = {}; + my $data = {}; + + print " module "," "x($len-length($i)),"$i / $num"; + + foreach my $zone (keys %zone_list) { + $i++; + print "\010"x($len*2+3)," "x($len-length($i)),"$i / $num"; + my($module,$type,@args) = @{ $zone_list{$zone} }; + + if ($type eq "tzdata") { + _do_mods_tzdata($tzd,$abbrev,$data,$zone,$module,@args); + + } elsif ($type eq "offset") { + _do_mods_offset($tzd,$abbrev,$data,$zone,$module,@args); + } + } + print "\n"; + + # $data now contains a hash of: + # YEAR => [ TYPE, VAL1, VAL2, ... ] + # where TYPE is currently blank. + # + # VALi is a reference to a time change [ ABB, OFFSET, ISDST ] + # + # TYPE will be set to one of the following: + # + # std0, : a standard year is one with two time changes which must + # std1 be with ISDST = 1 and 0, and both must be integers + # that differ by exactly 1. If the ISDST = 0 comes first, + # it is set to std0. Otherwise it is set to std1. + # last0, + # last1 : if it's a standard year AND the year is after $keep_year + # end : a non-standard year after $keep_year + # non : a non-standard year before $keep_year + + foreach my $zone (keys %$data) { + my $lasttype = ''; + foreach my $year (keys %{ $$data{$zone} }) { + my $type; + my @tmp = @{ $$data{$zone}{$year} }; + shift(@tmp); + + # Standard times must have two changes + + $type = 'std'; + $type = 'non' if (@tmp != 2); + + # Standard times must have both offsets on the hour. + + my ($off1,$off2); + if ($type eq 'std') { + $off1 = $tmp[0][1]; + $off2 = $tmp[1][1]; + if ($off1 !~ /:00:00$/ || + $off2 !~ /:00:00$/) { + $type = 'non'; + } else { + $type = 'std'; + } + } + + # Standard times must have offsets that are 1 hour apart. + + if ($type eq 'std') { + $off1 =~ s/:00:00$//; + $off2 =~ s/:00:00$//; + $type = 'non' if (abs($off1 - $off2) != 1); + } + + # Standard times have offsets with two offsets with ISDST = 0 and 1 + + my $std; + if ($type eq 'std' && + $tmp[0][2] == 1 && + $tmp[1][2] == 0) { + $std = 1; + } elsif ($type eq 'std' && + $tmp[0][2] == 0 && + $tmp[1][2] == 1) { + $std = 0; + } else { + $type = 'non'; + } + + # Set the type + + if ($type eq 'std') { + if ($year > $keep_year) { + $type = "last$std"; + } else { + $type .= $std; + } + + } elsif ($year > $keep_year) { + $type = 'end'; + } + + # We'll discard the very last year of a standard timezone + # because they end on the first change of a year instead of + # the second. + next if ($lasttype =~ /last/ && $type eq 'end'); + $lasttype = $type; + + $$data{$zone}{$year}[0] = $type; + } + } + + # Create a list of all EST5EDT style time zone aliases. + # These only apply during standard years. + # + # Also, we will ignore aliases when the abbreviations are + # offsets. + + my $alias2 = {}; + ZONE: foreach my $zone (keys %$data) { + foreach my $year (sort keys %{ $$data{$zone} }) { + my ($type,@tmp) = @{ $$data{$zone}{$year} }; + next if ($type ne 'std0' && + $type ne 'std1' && + $type ne 'last0' && + $type ne 'last1'); + + # The format is + # STDABB STDOFFHR DSTABB + # where STDABB and DSTABB are the abbreviations, and STDOFFHR + # is the offset for standard time as an integer negated. + + my ($stdabb,$dstabb,$stdoff); + if ($type eq 'std0' || $type eq 'last0') { + $stdabb = $tmp[0][0]; + $dstabb = $tmp[1][0]; + $stdoff = $tmp[0][1]; + } else { + $stdabb = $tmp[1][0]; + $dstabb = $tmp[0][0]; + $stdoff = $tmp[1][1]; + } + $stdoff =~ s/:00:00$//; + $stdoff *= -1; + + next if ($stdabb =~ /^[+-]?\d+$/ || + $dstabb =~ /^[+-]?\d+$/); + + my $alias = "${stdabb}${stdoff}${dstabb}"; + + if ($type eq 'last0' || $type eq 'last1') { + _do_mods_years($alias2,$zone,$alias,$year,9999); + next ZONE; + } + _do_mods_years($alias2,$zone,$alias,$year,$year); + } + } + + _yaml_write($data, 'tzdata/_data',0); + _yaml_write($alias2,'tzdata/_alias2_un',0); + + $abbrev = _order_elements($abbrev); + $alias2 = _order_elements($alias2); + + _yaml_write($abbrev,'tzdata/_abbrev_or',0); + _yaml_write($alias2,'tzdata/_alias2_or',0); +} + +# This creates a module from a tzdata dump. +# +sub _do_mods_tzdata { + my($tzd,$abbrev,$data,$zone,$module) = @_; + + my @lines = `cat tzdata/dump/$module`; + chomp(@lines); + + while (@lines && $lines[0] =~ /NULL$/) { + shift(@lines); + } + while (@lines && $lines[$#lines] =~ /NULL$/) { + pop(@lines); + } + + if (! @lines) { + warn "[_do_mods_tzdata] empty zone [$zone]\n"; + return; + } + + # Check the format of every line + my $err = _do_mods_tzdata_check($zone,@lines); + return if ($err); + _do_mods_tzdata_mod($tzd,$abbrev,$data,$zone,$module,@lines); +} + +# This checks every line in a zdump file to make sure it is the +# correct format. +# +sub _do_mods_tzdata_check { + my($zone,@lines) = @_; + my($dow) = '(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)'; + my($mon) = '(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)'; + my($dom) = '(?:\d+)'; + my($time) = '(?:\d\d:\d\d:\d\d)'; + my($year) = '(?:\d\d\d\d)'; + my($drx) = qr/$dow\s+$mon\s+$dom\s+$time\s+$year/; + my($rx) = qr/\Q$zone\E\s+$drx\s+UT\s+=\s+$drx\s+\S+\s+isdst=[01]\s+gmtoff=\-?\d+$/; + + my($err) = 0; + foreach my $line (@lines) { + if ($line !~ /$rx/) { + warn "[_do_mods_tzdata] invalid line [$zone]\n $line\n"; + $err = 1; + } + } + return $err; +} + +sub _do_mods_tzdata_mod { + my($tzd,$abbrev,$data,$zone,$module,@lines) = @_; + + ### + ### Analyze the dump file and store information about all + ### time zone periods in a list. A time zone period is a + ### starting time and ending time during which the abbreviation, + ### offset, and ISDST values remain unchanged. + ### + ### The first line in the dump file defines when the pre-use + ### period (i.e. the period of time before the time zone was + ### actually defined) ended. + ### + ### After the first line, all lines (except the last one) appear as + ### pairs. The first one tells the time when a new time zone period + ### starts (which should be exactly 1 second after the previous + ### period ended) and the second line tells when the period ends. + ### + ### The last line defines the start of a new period that doesn't + ### have an end defined. If the year is after $keep_year, then + ### the period switches to LASTRULE handline. If it is before + ### $keep_year, then the time zone stopped doing DST changes and + ### stay in the same period for good. + ### + + # + # Parse the first dump line to determine the end of the + # pre-zone period. + # + + my @dates; + my $last = 1; # Whether or not to do LAST RULE + my ($year,$year2); + + my $line = shift(@lines); + my($dowU,$monU,$domU,$timeU,$yearU,$dowL,$monL,$domL,$timeL,$yearL, + $abb,$isdst) = _do_mods_splitdump($line); + + if ($isdst) { + warn "[_do_mods_tzdata] first line in DST [$zone]\n"; + return 1; + } + + # + # Calculate the offset of the pre-zone period. + # + + my @endUT = ($yearU,$monU,$domU,@{ $dmb->split("time",$timeU) }); + my @endLT = ($yearL,$monL,$domL,@{ $dmb->split("time",$timeL) }); + my @offset = @{ $dmb->calc_date_date(\@endUT,\@endLT) }; + my $offset = $dmb->join("offset",\@offset); + + if ($offset eq "" || + $abb eq "" || + $isdst eq "") { + warn "[_do_mods_tzdata] blank value in zone [$zone, @endUT]\n"; + return 1; + } + + # + # The pre-zone period starts on Jan 2 0001 at 00:00:00 and + # ends at the time from the first dump line. + # + + my @begUT = @{ $dmb->split("date",$first_date) }; + my @begLT = @{ $dmb->calc_date_time(\@begUT,\@offset) }; + @dates = ("0001",[@begUT],[@begLT],$offset,[@offset], + $abb,$isdst,[@endUT],[@endLT]); + + $year2 = $endUT[0]; + _do_mods_years($abbrev,$zone,$abb,"0001",$year2) if ($abb !~ /^[+-]?\d*$/); + $$data{$zone}{"0001"} = [ '', [$abb,$offset,$isdst] ]; + + # + # Parse every pair of dump lines. + # + + while (@lines) { + + # + # The first line is the start of the period + # + + $line = shift(@lines); + ($dowU,$monU,$domU,$timeU,$yearU,$dowL,$monL,$domL,$timeL,$yearL, + $abb,$isdst) = _do_mods_splitdump($line); + $year = $yearU; + + @begUT = ($yearU,$monU,$domU,@{ $dmb->split("time",$timeU) }); + @begLT = ($yearL,$monL,$domL,@{ $dmb->split("time",$timeL) }); + + my @tmp = @{ $dmb->calc_date_time(\@endUT,[0,0,1]) }; + if ($dmb->cmp(\@tmp,\@begUT) != 0) { + warn "[_do_mods_tzdata] invalid start in zone [$zone, @begUT]\n"; + return 1; + } + + @offset = @{ $dmb->calc_date_date(\@begUT,\@begLT) }; + $offset = $dmb->join("offset",\@offset); + + if ($offset eq "" || + $abb eq "" || + $isdst eq "") { + warn "[_do_mods_tzdata] blank value in zone [$zone, @begUT]\n"; + return 1; + } + + # + # If a second line exists, it is the end of the period. + # + # If no second line exists, then either we need to switch to + # LAST RULE behavior (if the year of the first line is after + # $keep_year), or the zone abandoned doing daylight savings + # time and this line reflects the time until 9999. + # + + if (@lines) { + + # A second line marks the end of the period + + my ($a,$i); + $line = shift(@lines); + ($dowU,$monU,$domU,$timeU,$yearU,$dowL,$monL,$domL,$timeL,$yearL, + $a,$i) = _do_mods_splitdump($line); + + @endUT = ($yearU,$monU,$domU,@{ $dmb->split("time",$timeU) }); + @endLT = ($yearL,$monL,$domL,@{ $dmb->split("time",$timeL) }); + + my @o = @{ $dmb->calc_date_date(\@endUT,\@endLT) }; + my $o = $dmb->join("offset",\@o); + + if ($o eq "" || + $a eq "" || + $i eq "") { + warn "[_do_mods_tzdata] blank value in zone [$zone, @endUT]\n"; + return 1; + } + + if ($o ne $offset || + $a ne $abb || + $i ne $isdst) { + warn "[_do_mods_tzdata] invalid value in zone [$zone, @endUT]\n"; + return 1; + } + + } elsif ($year > $keep_year && + ! exists $no_last{$zone}) { + + # If it's a single line after $keep_year, then it's the start + # of a regular LAST RULE style time change. Discard it... we'll + # use the LAST RULE to come up with those periods. + + last; + + } else { + + # A single line before $keep_year means that the time zone + # stopped doing DST stuff, and switched to a single offset. + # There is no LAST RULE in this case. + # + # This will also apply to zones which do not use the LAST + # RULE method. + + @endUT = @{ $dmb->split("date",$last_date) }; + @endLT = @{ $dmb->calc_date_time(\@endUT,\@offset) }; + $last = 0; + } + + # Now store the data for this time zone period + + push(@dates,$year,[@begUT],[@begLT],$offset,[@offset],$abb,$isdst,[@endUT],[@endLT]); + $year2 = $endUT[0]; + + if (exists $$data{$zone}{$year}) { + push(@{ $$data{$zone}{$year} },[$abb,$offset,$isdst]); + } else { + $$data{$zone}{$year} = [ '', [$abb,$offset,$isdst] ]; + } + + _do_mods_years($abbrev,$zone,$abb,$year,$year2) if ($abb !~ /^[+-]?\d*$/); + } + + ### + ### Now we'll analyze all the critical dates. Three different things + ### will occur: + ### + ### 1) For years < $keep_year, the data will simply get stored in + ### the module. + ### 2) For year = $keep_year, the data will be stored in the module + ### and used to determine how LAST RULE critical dates are + ### determined. + ### 3) For year > $keep_year, critical dates will not be stored, but + ### will be tested to make sure they are consistant with the methods + ### determined in 2). However, this step will be elsewhere. I will + ### use a dump script to create actual dumps and compare them to + ### the standard tzcode dump. + ### + + my @mod; # data to store in the module + my %last; # LAST RULE description + my @mon; + + if ($last) { + %last = _do_mods_lastrule($tzd,$zone); + @mon = sort keys %{ $last{"rules"} }; + } + + foreach my $mon (@mon) { + if ($mon == 1 || $mon == 12) { + # If a change ever happens in Jan/Dec in the LAST RULE, we + # may need to make sure that the year won't change (it would + # be horrible if it did). + warn "[_do_mods_tzdata] LAST RULE in Jan/Dec [$zone, $mon]\n"; + } + } + + my $didlast = 0; + my($begUT,$begLT,$endUT,$endLT,$offsetref); + while (@dates) { + ($year,$begUT,$begLT,$offset,$offsetref,$abb,$isdst,$endUT,$endLT,@dates) = @dates; + @offset = @$offsetref; + + if ($year <= $keep_year || ! $last) { + + # + # Store critical dates from dump files for years <= $keep_year + # + + push(@mod,$year,$begUT,$begLT,$offset,$offsetref,$abb,$isdst,$endUT,$endLT); + + if ($year == $keep_year && $last) { + + my $mon = shift(@mon); + return 1 if (! $mon); + + if ($isdst != $last{"rules"}{$mon}{"isdst"}) { + warn "[_do_mods_tzdata] isdst mismatch in LAST RULE " . + "[$zone, $mon]\n"; + return 1; + } + if ($offset ne + $last{"zone"}{ ($isdst ? "dstoff" : "stdoff") }) { + warn "[_do_mods_tzdata] offset mismatch in LAST RULE " . + "[$zone, $mon]\n"; + return 1; + } + + $last{"rules"}{$mon}{"abb"} = $abb; + _do_mods_years($abbrev,$zone,$abb,$keep_year+1,9999) + if ($abb !~ /^[+-]?\d*$/); + $didlast++; + } + } + } + + if ($last && $didlast != 2) { + warn "[_do_mods_tzdata] LAST RULE incomplete [$zone]\n"; + return 1; + } + + _do_mods_write($zone,$module,[@mod],%last); +} + +# This returns a hash of information concerning "last rules". This +# information will allow us to calculate critical dates in future +# years. +# +# Information consists of: +# flag,dow,num : See TZdata.pm (used to calculate a DoM) +# add : Some of the DoM calculations do not +# return the final DoM after offsets have +# been applied. If this is +1, it'll add +# a day. If it's -1, it'll subtract a day. +# time,abb,offset : Information that should be constant. +# dst : Whether it is a change to DST or not. +# +sub _do_mods_lastrule { + my($tzd,$zone) = @_; + + # Get the rule dates that apply to $keep_year + + my @rules = $tzd->_zoneInfo($zone,"rules",$keep_year); + my @r; + while (@rules) { + my $rule = shift(@rules); + my $type = shift(@rules); + + # All LAST RULES are currently of type TZ_RULE . If this + # ever changes, we'll have to add support. + if ($type != $Date::Manip::TZdata::TZ_RULE) { + warn "[_do_mods_lastrule] unsupported rule type [$zone]\n"; + return ""; + } + + push(@r,$tzd->_ruleInfo($rule,"rules",$keep_year)); + } + + # Make sure that there are exactly two rules. If there are + # not, we'll need to add support. + + if ($#r != 1) { + warn "[_do_mods_lastrule] two rules required [$zone]\n"; + return ""; + } + + # Also get the zone line that applies. There must be one or + # we'll need to add support. + + my @zone = $tzd->_zoneInfo($zone,"zonelines",$keep_year); + if ($#zone != 0) { + warn "[_do_mods_lastrule] one zone line required [$zone]\n"; + return ""; + } + + # Analyze the rules/zone to get the "last rule" (i.e. information + # that can be used to calculate critical dates in future years). + # + # Some additional information will be added once dump lines are + # analyzed. + + my %last = ( "year" => $keep_year + 1, + "zone" => { "stdoff" => $dmb->_delta_convert("offset",$zone[0][0]), + "dstoff" => '' }, + "rules" => {}, + ); + + my $totdst = 0; + my $totst = 0; + foreach my $rule (@r) { + my($y0,$y1,$ytype,$mon,$flag,$dow,$num,$timetype,$time,$offset, + $lett) = @$rule; + my $isdst = ($offset eq "00:00:00" ? 0 : 1); + $totdst += $isdst; + $totst += (1-$isdst); + + if ($isdst) { + my $dstoff = $dmb->calc_time_time( $dmb->split("time",$last{"zone"}{"stdoff"}), + $dmb->split("time",$offset)); + $dstoff = $dmb->join("offset",$dstoff); + $last{"zone"}{"dstoff"} = $dstoff; + } + + $mon="0$mon" if (length($mon) != 2); + + $last{"rules"}{$mon} = { "flag" => $flag, + "dow" => $dow, + "num" => $num, + "type" => $timetype, + "time" => $time, + "isdst" => $isdst, + "abb" => "", + }; + } + + # One rule must be standard time, one must be daylight savings time. + # If this is not the case, we'll have to add support. + + if (exists $last_zone_offsets{$zone}) { + if (! $last{"zone"}{"dstoff"}) { + $last{"zone"}{"dstoff"} = $last{"zone"}{"stdoff"}; + } + + my $expdst = $last_zone_offsets{$zone}{"dst"}; + my $expst = $last_zone_offsets{$zone}{"st"}; + if ($totdst != $expdst || + $totst != $expst) { + warn "\n" . + "[_do_mods_lastrule] wrong number of DST/STD offsets\n" . + " [exp $expdst/$expst got $totdst/$totst] [$zone]\n"; + return ""; + } + + } elsif ($totdst != 1 || $totst != 1) { + warn "[_do_mods_lastrule] 1 DST and 1 STD rule required [$zone]\n"; + return ""; + } + + return %last; +} + +# Split a dump line and return the values. +# +sub _do_mods_splitdump { + my($line) = @_; + my(%mon) = qw(Jan 01 Feb 02 Mar 03 Apr 04 May 05 Jun 06 + Jul 07 Aug 08 Sep 09 Oct 10 Nov 11 Dec 12); + my(%dow) = qw(Mon 1 Tue 2 Wed 3 Thu 4 Fri 5 Sat 6 Sun 7); + + my($z,$dowU,$monU,$domU,$timeU,$yearU,$utc,$equal, + $dowW,$monW,$domW,$timeW,$yearW,$abb,$isdst) = split(/\s+/,$line); + $isdst =~ s/isdst=//; + + $monU = $mon{$monU} if (exists $mon{$monU}); + $monW = $mon{$monW} if (exists $mon{$monW}); + $monU = "0$monU" if (length($monU) != 2); + $monW = "0$monW" if (length($monW) != 2); + + $dowU = $dow{$dowU} if (exists $dow{$dowU}); + $dowU = $dow{$dowW} if (exists $dow{$dowW}); + + $domU = "0$domU" if (length($domU) != 2); + $domW = "0$domW" if (length($domW) != 2); + + return ($dowU,$monU,$domU,$timeU,$yearU,$dowW,$monW,$domW,$timeW,$yearW, + $abb,$isdst); +} + +# This records an element as having been used in a given year. +# +sub _do_mods_years { + my($hash,$zone,$ele,$year,$year2) = @_; + + if (exists $$hash{$ele}{$zone}) { + $$hash{$ele}{$zone}[1] = $year2; + + } else { + $$hash{$ele}{$zone} = [$year,$year2]; + } +} + +# This creates a module from an offset. +# +sub _do_mods_offset { + my($tzd,$abbrev,$data,$zone,$module,$offset) = @_; + + my($abb) = $zone; + $abb =~ s/Etc\///; + _do_mods_years($abbrev,$zone,$abb,"0001","9999"); + + $offset = $dmb->_delta_convert("offset",$offset); + my @offset = @{ $dmb->split("offset",$offset) }; + + my @begUT = @{ $dmb->split("date",$first_date) }; + my @begLT = @{ $dmb->calc_date_time(\@begUT,\@offset) }; + + my @endUT = @{ $dmb->split("date",$last_date) }; + my @endLT = @{ $dmb->calc_date_time(\@endUT,\@offset) }; + + _do_mods_write($zone,$module, + ["0001",[@begUT],[@begLT],$offset,[@offset],$abb,0, + [@endUT],[@endLT]], + ()); + $$data{$zone}{"0001"} = [ '', [$abb,$offset,0] ]; +} + +sub _do_mods_write { + my($zone,$module,$dates,%last) = @_; + + # Store the critical dates in the module + + my @tmp = `cat tzdata/_version`; + chomp(@tmp); + my $tzdata_vers = "tzdata" . $tmp[0]; + my $tzcode_vers = "tzcode" . $tmp[1]; + my $timestamp = `date`; + chomp($timestamp); + + my $out = new IO::File; + $out->open(">$mod_dir/$module.pm"); + print $out "package # +Date::Manip::TZ::$module; +# Copyright (c) 2008-$curr_year Sullivan Beck. All rights reserved. +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'tzdata' is run. +# Generated on: $timestamp +# Data version: $tzdata_vers +# Code version: $tzcode_vers + +# This module contains data from the zoneinfo time zone database. The original +# data was obtained from the URL: +# ftp://$tzdata_src/$tzdata_dir + +use strict; +use warnings; +require 5.010000; + +our (\%Dates,\%LastRule); +END { + undef \%Dates; + undef \%LastRule; +} + +our (\$VERSION); +\$VERSION='6.60'; +END { undef \$VERSION; } + +\%Dates = ( +"; + + my @dates = @$dates; + my $lastyear = 0; + my ($year,$begUT,$begLT,$offset,$offsetref,$abb,$isdst,$endUT,$endLT); + + while (@dates) { + ($year,$begUT,$begLT,$offset,$offsetref,$abb,$isdst,$endUT,$endLT,@dates) = + @dates; + $year += 0; + my $yrprt = $year . " "x(4-length($year)); + if ($year != $lastyear) { + if ($lastyear) { + print $out " ],\n"; + } + print $out " $yrprt =>\n"; + print $out " [\n"; + $lastyear = $year; + } + my $begUTs = $dmb->join("date",$begUT); + my $begLTs = $dmb->join("date",$begLT); + my $endUTs = $dmb->join("date",$endUT); + my $endLTs = $dmb->join("date",$endLT); + $begUT = join(",",map { $_+0 } @$begUT); + $begLT = join(",",map { $_+0 } @$begLT); + $endUT = join(",",map { $_+0 } @$endUT); + $endLT = join(",",map { $_+0 } @$endLT); + $offsetref = join(",",map { $_+0 } @$offsetref); + + print $out " [ [$begUT],[$begLT],'$offset',[$offsetref],\n"; + print $out " '$abb',$isdst,[$endUT],[$endLT],\n"; + print $out " '$begUTs','$begLTs','$endUTs','$endLTs' ],\n"; + } + + print $out " ],\n"; + + print $out "); + +\%LastRule = ( +"; + + if (exists $last{"year"}) { + print $out " 'zone' => {\n"; + foreach my $key (sort keys %{ $last{"zone"} }) { + my $val = $last{"zone"}{$key}; + print $out " "x16,"'$key' => '$val',\n"; + } + + print $out " }, + 'rules' => {\n"; + + foreach my $mon (sort keys %{ $last{"rules"} }) { + print $out " "x16,"'$mon' => {\n"; + my $flag = $last{"rules"}{$mon}{"flag"}; + if ($flag == $Date::Manip::TZdata::TZ_DOM) { + $flag = "dom"; + + } elsif ($flag == $Date::Manip::TZdata::TZ_LAST) { + $flag = "last"; + + } elsif ($flag == $Date::Manip::TZdata::TZ_GE) { + $flag = "ge"; + + } elsif ($flag == $Date::Manip::TZdata::TZ_LE) { + $flag = "le"; + } + $last{"rules"}{$mon}{"flag"} = $flag; + + foreach my $key (qw(flag dow num type time isdst abb)) { + print $out " "x25,"'$key'", " "x(7-length($key))," => '", + $last{"rules"}{$mon}{$key},"',\n"; + } + print $out " "x24,"},\n"; + } + + print $out " },\n"; + } + + print $out "); + +1; +"; + + $out->close; +} + +############################################################################ +# DO_OFF +############################################################################ + +sub do_off { + print "Offset modules...\n"; + + my $data = _yaml_read("tzdata/_data"); + + # Get a list of all zones which an offset appears in, and the year + # range of the offset. + + my %offset_un = ( 0 => {}, 1 => {} ); + + ZONE:foreach my $zone (keys %$data) { + my $lastoffset = ''; + my $lastisdst = ''; + my @year = sort keys %{ $$data{$zone} }; + while (@year) { + my $year = shift(@year); + + # The offset at the end of the previous year is still in + # affect. + + if ($lastoffset) { + _do_mods_years($offset_un{$lastisdst},$zone,$lastoffset,$year,$year); + } + + my ($type,@tmp) = @{ $$data{$zone}{$year} }; + + foreach my $tmp (@tmp) { + my($abb,$offset,$isdst) = @$tmp; + $lastoffset = $offset; + $lastisdst = $isdst; + + if ($type =~ /last/) { + _do_mods_years($offset_un{$isdst},$zone,$offset,$year,9999); + } else { + _do_mods_years($offset_un{$isdst},$zone,$offset,$year,$year); + } + } + + next ZONE if ($type =~ /last/); + _do_mods_years($offset_un{$lastisdst},$zone,$lastoffset,$year,9999) + if (! @year); + } + } + + # Convert %offset to a couple other formats that will be useful. + + my %offset_or; + $offset_or{0} = _order_elements($offset_un{0}); + $offset_or{1} = _order_elements($offset_un{1}); + + my %offset2_or; + foreach my $isdst (keys %offset_un) { + foreach my $offset (keys %{ $offset_un{$isdst} }) { + $offset2_or{$offset}{$isdst} = $offset_or{$isdst}{$offset}; + } + } + + # Come up with a module name for each offset. + + my %offmod; + my $o = "000"; + foreach my $offset (sort keys %offset2_or) { + my $offmod = "off$o"; + $offmod{$offset} = $offmod; + $o++; + } + + # Write out each module + + my $num = keys %offmod; + my $len = length($num); + my $i = 0; + + print " module "," "x($len-length($i)),"$i / $num"; + + _warn_changes($offset_or{0},$def_off{0},15,12,33,"0"); + _warn_changes($offset_or{1},$def_off{1},15,12,33,"1"); + + system("rm -f $off_dir/*"); + foreach my $offset (sort keys %offset2_or) { + $i++; + print "\010"x($len*2+3)," "x($len-length($i)),"$i / $num"; + + my $offmod = $offmod{$offset}; + _do_off($offset,$offmod,\%offset_or); + } + print "\n"; + + _yaml_write(\%offmod,"tzdata/_offmod",0); + _yaml_write(\%offset_un,"tzdata/_offset_un",0); + _yaml_write(\%offset_or,"tzdata/_offset_or",0); + _yaml_write(\%offset2_or,"tzdata/_offset2_or",0); +} + +sub _do_off { + my($offset,$module,$offset_or) = @_; + + my @tmp = `cat tzdata/_version`; + chomp(@tmp); + my $tzdata_vers = "tzdata" . $tmp[0]; + my $tzcode_vers = "tzcode" . $tmp[1]; + my $timestamp = `date`; + chomp($timestamp); + + my $out = new IO::File; + my $mod = "Date::Manip::Offset::$module"; + $out->open(">$off_dir/$module.pm"); + print $out "package # +Date::Manip::Offset::$module; +# Copyright (c) 2008-$curr_year Sullivan Beck. All rights reserved. +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'tzdata' is run. +# Generated on: $timestamp +# Data version: $tzdata_vers +# Code version: $tzcode_vers + +# This module contains data from the zoneinfo time zone database. The original +# data was obtained from the URL: +# ftp://$tzdata_src/$tzdata_dir + +use strict; +use warnings; +require 5.010000; + +our (\$VERSION); +\$VERSION='6.60'; +END { undef \$VERSION; } + +our (\$Offset,\%Offset); +END { + undef \$Offset; + undef \%Offset; +} + +\$Offset = '$offset'; + +\%Offset = ( +"; + + foreach my $isdst (sort keys %$offset_or) { + next if (! exists $$offset_or{$isdst}{$offset}); + my @tmp = @{ $$offset_or{$isdst}{$offset} }; + + print $out " "x3,$isdst," => [\n"; + while (@tmp) { + my $zone = shift(@tmp); + my $year1 = shift(@tmp); + my $year2 = shift(@tmp); + $zone = lc($zone); + print $out " "x6,"'$zone',\n"; + } + print $out " "x6,"],\n"; + } + + print $out "); + +1; +"; + + $out->close; +} + +############################################################################ +# DO_ZONES +############################################################################ + +sub do_zones { + print "Zones module...\n"; + + my @tmp = `cat tzdata/_version`; + chomp(@tmp); + my $tzdata_vers = "tzdata" . $tmp[0]; + my $tzcode_vers = "tzcode" . $tmp[1]; + my $timestamp = `date`; + chomp($timestamp); + + my $zone_list = _yaml_read("tzdata/_zone_list"); + my $alias_list = _yaml_read("tzdata/_alias_list"); + my $offset2_or = _yaml_read("tzdata/_offset2_or"); + + my $out = new IO::File; + $out->open(">$zones_pm"); + my $pod = new IO::File; + $pod->open(">$zones_pod"); + + print $out "package Date::Manip::Zones; +# Copyright (c) 2008-$curr_year Sullivan Beck. All rights reserved. +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'tzdata' is run. +# Generated on: $timestamp +# Data version: $tzdata_vers +# Code version: $tzcode_vers + +# This module contains data from the zoneinfo time zone database. The original +# data was obtained from the URL: +# ftp://$tzdata_src/$tzdata_dir + +use strict; +use warnings; +require 5.010000; + +our (\$VERSION); +\$VERSION='6.60'; +END { undef \$VERSION; } + +our (\$TzdataVersion,\$TzcodeVersion, + \$FirstDate,\$LastDate,\$LastYear, + \%Module,\%ZoneNames,\%Alias,\%Abbrev,\%Offmod); +END { + undef \$TzdataVersion; + undef \$TzcodeVersion; + undef \$FirstDate; + undef \$LastDate; + undef \$LastYear; + undef \%Module; + undef \%ZoneNames; + undef \%Alias; + undef \%Abbrev; + undef \%Offmod; +} + +\$TzdataVersion = '$tzdata_vers'; +\$TzcodeVersion = '$tzcode_vers'; +\$FirstDate = '$first_date'; +\$LastDate = '$last_date'; +\$LastYear = '$keep_year'; + +"; + + print $pod " +# Copyright (c) 2008-$curr_year Sullivan Beck. All rights reserved. +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'tzdata' is run. +# Generated on: $timestamp +# Data version: $tzdata_vers +# Code version: $tzcode_vers + +# This module contains data from the zoneinfo time zone database. The original +# data was obtained from the URL: +# ftp://$tzdata_src/$tzdata_dir + +$podstr + +$hdstr NAME + +Date::Manip::Zones - Time zone information + +$hdstr DESCRIPTION + +This module is automatically generated. It contains a complete list of +time zones specified in the standard zoneinfo (or Olson) databases +obtained from: + +L + +All information is stored in variables, so this module provide no +routines for dealing with time zone information. For routines related +to time zones, see the documentation for the L module. + +"; + + _do_zones_zones($out,$pod,$zone_list); + _do_zones_names($out,$zone_list); + _do_zones_aliases($out,$pod,$zone_list,$alias_list); + _do_zones_defaults($out,$pod,$offset2_or); + _do_zones_abbrevs($out,$pod); + _do_zones_offsets($out,$pod); + + print $out " +1; +"; + + $out->close; + + print $pod " +$hdstr KNOWN BUGS + +None known. + +$hdstr BUGS AND QUESTIONS + +Please refer to the L documentation for +information on submitting bug reports or questions to the author. + +$hdstr SEE ALSO + +L - main module documentation + +$hdstr LICENSE + +This script is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +$hdstr AUTHOR + +Sullivan Beck (sbeck\@cpan.org) + +=cut +"; + +} + +sub _do_zones_zones { + my($out,$pod,$zone_list) = @_; + + print $out " +\%Module = ( +"; + + print $pod " +$hdstr TIME ZONES + +A description for each time zone from the zoneinfo database is stored +in a separate module. These modules will be loaded automatically as +needed, and are documented here for the sake of completeness. + +The modules are available as: + + Date::Manip::TZ::_MODULE_ + +where _MODULE_ is the name of the module for that specific time zone. + +The following time zones are derived from the standard zoneinfo +database: + +"; + + _print_pod_row($pod,1, 5,'TIME ZONE',35, 2,'MODULE NAME',20); + + foreach my $zone (sort keys %$zone_list) { + my($mod,$type) = @{ $$zone_list{$zone} }; + next if ($type ne "tzdata"); + + _print_pod_row($pod,0, 5,$zone,35, 2,$mod,0); + _print_mod_row($out, 2,$zone,35,'hashkey', 2,$mod,0,'hashval'); + } + + print $pod " +The following time zones are NOT derived from the standard zoneinfo +database. They are derived from other standard sources (including +RFC 822): + +"; + + _print_pod_row($pod,1, 5,'TIME ZONE',35, 2,'MODULE NAME',20); + + foreach my $zone (sort keys %$zone_list) { + my($mod,$type) = @{ $$zone_list{$zone} }; + next if ($type eq "tzdata"); + + _print_pod_row($pod,0, 5,$zone,35, 2,$mod,0); + _print_mod_row($out, 2,$zone,35,'hashkey', 2,$mod,0,'hashval'); + } + + print $out "); +"; +} + +sub _do_zones_names { + my($out,$zone_list) = @_; + + print $out " +\%ZoneNames = ( +"; + + foreach my $zone (sort keys %$zone_list) { + my($mod,$type) = @{ $$zone_list{$zone} }; + next if ($type ne "tzdata"); + + _print_mod_row($out, 2,$zone,35,'hashkey', 2,$zone,0,'hashval,nocase'); + } + + foreach my $zone (sort keys %$zone_list) { + my($mod,$type) = @{ $$zone_list{$zone} }; + next if ($type eq "tzdata"); + + _print_mod_row($out, 2,$zone,35,'hashkey', 2,$zone,0,'hashval,nocase'); + } + + print $out "); +"; +} + +sub _do_zones_aliases { + my($out,$pod,$zone_list,$alias_list) = @_; + + my $tzd = Date::Manip::TZdata->new(); + my %tzdalias = %{ $$tzd{"alias"} }; + my $alias2_un = _yaml_read("tzdata/_alias2_un"); + my $alias2_or = _yaml_read("tzdata/_alias2_or"); + + print $out " +\%Alias = ( +"; + + # Print out the standard 'zone => zone' aliases + + foreach my $zone (sort keys %$zone_list) { + _print_mod_row($out, 2,$zone,35,'hashkey', 2,$zone,0,'hashval'); + } + + # Print out alternate time zone names from tzdata files + + print $pod " +$hdstr TIME ZONE NAMES, ALIASES, AND ABBREVIATIONS + +Time zones may be referred to as their full name +(e.g. America/New_York), but there are also a number of standard +aliases and abbreviations that may be used. + +Standard aliases are listed below. Additional aliases can be created, +or existing aliases overridden using the C method of the +L module. + +The zoneinfo database provides several standard aliases, including: + +"; + + _print_pod_row($pod,1, 5,'ALTERNATE NAME',35, 2,'TIME ZONE',20); + + foreach my $alias (sort keys %tzdalias) { + my $zone = $tzdalias{$alias}; + + # Don't duplicate the 'zone => zone' or 'EST5EDT => zone' aliases + next if (exists $$zone_list{$zone} && $alias eq $zone); + next if (exists $$alias_list{$zone} && $$alias_list{$zone}[1] ne "tzdata"); + next if (exists $$alias2_un{$zone}); + + _print_pod_row($pod,0, 5,$alias,35, 2,$zone,0); + _print_mod_row($out, 2,$alias,35,'hashkey', 2,$zone,0,'hashval'); + } + + # Do the EST5EDT style aliases + + print $pod " +There are a large number of possible time zone aliases of the form +EST5EDT. The main 4 used in the United States are CST6CDT, EST5EDT, +MST7MDT, and PST8PDT and these are specifically called for in RFC 822, +so whenever possible, these will refer to the US time zones, but some +aliases may possibly refer to more than one time zone. In these +instances, I have selected one of them to be the default time zone to +use (based on how recently it was used, and for what period of +time). In the list below, all possible time zones are listed for each +alias. The first time zone listed is the one used by default. The +default alias can be overridden as described above. + +"; + + _print_pod_row($pod,1, 5,'ALTERNATE NAME',35, 2,'TIME ZONE',20); + + _warn_changes($alias2_or,\%def_alias2,3,16,42); + + foreach my $ele (sort keys %$alias2_or) { + my @tmp = @{ $$alias2_or{$ele} }; + my $first = $ele; + while (@tmp) { + my $alias = shift(@tmp); + my $year1 = shift(@tmp); + my $year2 = shift(@tmp); + _print_pod_row($pod,0, 5,$first,35, 2,$alias,0); + _print_mod_row($out, 2,$first,35,'hashkey', 2,$alias,0,'hashval') if ($first); + $first = ''; + } + } + + # Print out alternate time zone names other sources + + print $pod " +There are also a number of standard aliases. Some of these are +included to fix minor issues with the tzdata files. Others come from +standard sources including RFC 822 or the list of time zone names used +on Microsoft Windows operating systems. + +Aliases include: + +"; + + _print_pod_row($pod,1, 5,'ALTERNATE NAME',35, 2,'TIME ZONE',20); + + foreach my $alias (sort keys %$alias_list) { + my($zone,$type) = @{ $$alias_list{$alias} }; + next if ($type eq "tzdata" || $type eq "ignore"); + + # Don't duplicate the 'zone => zone' aliases + next if (exists $$zone_list{$zone} && $alias eq $zone); + + _print_pod_row($pod,0, 5,$alias,35, 2,$zone,0); + _print_mod_row($out, 2,$alias,35,'hashkey', 2,$zone,0,'hashval'); + } + + print $out "); +"; +} + +sub _do_zones_defaults { + my($out,$pod,$offset2_or) = @_; + + # Start the defaults (POD only) + + print $pod " +Periodically, we need to be able to determine a time zone based on an +offset. In addition, the ISDST may be known, and a date/time may be +available. The following table shows what time zones are examined based +on the offset, and in what order. The first match is used. If the +ISDST time is not known, the standard zones will be tested followed by +the DST zones. + +The default order can be overridden with the C method in the +L module. + +"; + + _print_pod_row($pod,1, 5,'ISDST',5, 2,'OFFSET',10, 2,'TIME ZONE',25); + + foreach my $isdst (0,1) { + + foreach my $off (sort { _cmp_zoneoffsets($a,$b) } keys %$offset2_or) { + next unless (exists $$offset2_or{$off}{$isdst}); + my @tmp = @{ $$offset2_or{$off}{$isdst} }; + my $zone = shift(@tmp); + my $year1= shift(@tmp); + my $year2= shift(@tmp); + + my $dst = $isdst; + + _print_pod_row($pod,0, 5,$dst,5, 2,$off,10, 2,$zone,0); + + $off = ""; + $dst = " "; + while (@tmp) { + $zone = shift(@tmp); + $year1 = shift(@tmp); + $year2 = shift(@tmp); + + _print_pod_row($pod,0, 5,$dst,5, 2,$off,10, 2,$zone,0); + } + } + print $pod "\n"; + } +} + +sub _cmp_zoneoffsets { + my($x,$y) = @_; + + # A negative offset comes before a positive one + + if ($x =~ /^-/ && $y =~ /^\+/) { + return -1; + } elsif ($y =~ /^-/ && $x =~ /^\+/) { + return +1; + } + + # Netgative offsets are sorted reverse. + + if ($x =~ /^-/) { + return ($y cmp $x); + } + + # Positive offsets are sorted normally. + + return ($x cmp $y); +} + +sub _do_zones_abbrevs { + my($out,$pod) = @_; + + my $abbrev_or = _yaml_read("tzdata/_abbrev_or"); + + # Start the aliases output (both POD and module) + + print $out " +\%Abbrev = ( +"; + + # Print out EST => ZONE aliases for abbreviations which only occur + # in a single zone. + + delete $$abbrev_or{'LMT'}; + delete $$abbrev_or{'zzz'}; + + # Print out EST => ZONE aliases + + print $pod " +In the time zone definitions, abbreviations are used to specify the +current time (e.g. EST in the America/New_York time zone). In some +cases, the abbreviation appears in only a single time zone, so for +these, there is no ambiguity. + +More often though, abbreviations are used in multiple time zones. When +a date is parsed that contains one of these abbreviations, it will try +to interpret the date using each of the time zones in the order listed +below until one is found which yields a valid date. + +The abbreviations LMT and zzz which occur in the zoneinfo databases +are ignored (and when parsing a date including them, the local time +zone will be used). + +The default order can be overridden using the C method of the +L module. + +The order given here is open to discussion (and possible change) based +on changes to the timezone database. I will always place emphasis on a +time zone that used the abbreviation more recently than another time zone. +Within those constraints, I've tried to put the more commonly used time zone +at a higher priority. Since I'm not always able to decide which is the +most commonly used, I'm willing to entertain arguments for altering the order. + +"; + + _print_pod_row($pod,1, 5,'ALIAS',15, 2,'TIME ZONE',20); + + _warn_changes($abbrev_or,\%def_abbrev,3,14,44); + + my (@abb) = sort keys %$abbrev_or; + foreach my $abb (@abb) { + my @tmp = @{ $$abbrev_or{$abb} }; + + my $first = $abb; + my $opts1 = 'hashkey'; + + while (@tmp) { + my $zone = shift(@tmp); + shift(@tmp); + shift(@tmp); + + _print_pod_row($pod,0, 5,$first,15, 2,$zone,0); + my $opts2 = 'list,hashval'; + $opts2 .= ',firstlist' if ($first); + $opts2 .= ',lastlist' if (! @tmp); + _print_mod_row($out, 2,$first,12,$opts1, 2,$zone,0,$opts2); + + $first = ''; + $opts1 = 'hashkey,noquote'; + } + } + + print $out " +); +"; +} + +sub _do_zones_offsets { + my($out,$pod) = @_; + + my $offmod = _yaml_read("tzdata/_offmod"); + + # Start the offset output (in this case, no POD output since it + # doesn't seem usefule. + + print $out " +\%Offmod = ( +"; + + foreach my $offset (sort keys %$offmod) { + my $mod = $$offmod{$offset}; + _print_mod_row($out, 2,$offset,10,'hashkey', 2,$mod,0,'hashval'); + } + + print $out " +); +"; +} + +############################################################################ +# PRINT OUT POD AND MODULE LINES + +sub _print_pod_row { + my($out,$header,@cols) = @_; + my $under = ''; + + while (@cols) { + my $indent = shift(@cols); + my $val = shift(@cols); + my $wid = shift(@cols); + $wid = length($val) if (! $wid); + + print $out ' 'x$indent,$val,' 'x($wid-length($val)); + $under .= ' 'x$indent . '-'x$wid; + } + print $out "\n"; + print $out "$under\n" if ($header); +} + +sub _print_mod_row { + my($out,@cols) = @_; + + while (@cols) { + my $indent = shift(@cols); + my $val = shift(@cols); + my $wid = shift(@cols); + my $opts = shift(@cols); + + $val = "'$val'" unless ($opts =~ /noquote/); + $val = lc($val) unless ($opts =~ /nocase/); + + if ($opts =~ /hashkey/) { + # nothing + + } elsif ($opts =~ /hashval/) { + + if ($opts =~ /firstlist/ && $opts =~ /lastlist/) { + $val = "=> [ $val ],"; + + } elsif ($opts =~ /firstlist/) { + $val = "=> [ $val,"; + + } elsif ($opts =~ /lastlist/) { + $val = " $val ],"; + + } elsif ($opts =~ /list/) { + $val = " $val,"; + + } else { + $val = "=> $val,"; + } + + } else { + $val .= ','; + } + + $wid = length($val) if (! $wid); + + print $out ' 'x$indent,$val,' 'x($wid-length($val)); + } + print $out "\n"; +} + +############################################################################ +# DEALING WITH THE ORDER OF ELEMENTS + +# This takes a hash: +# $in = { ELE => SUBELE => [YEAR1,YEAR2] } +# and returns a hash of the form: +# $out = { ELE => [ SUBELE, YEAR1, YEAR2, +# SUBELE, YEAR1, YEAR2, ... ] } +# +# The order of the elements sorted based on the range. +# +sub _order_elements { + my($in) = @_; + my $out; + + foreach my $ele (keys %$in) { + my @in = _sort_by_years($$in{$ele}); + + $$out{$ele} = []; + foreach my $subele (@in) { + my($year1,$year2) = @{ $$in{$ele}{$subele} }; + push(@{ $$out{$ele} },($subele,$year1,$year2)); + } + } + + return $out; +} + +# This sorts the keys of a hash of the form: +# $hash = { ELE => [YEAR1,YEAR2] } +# by years. +# +# o An element that is active now always comes before one that isn't +# active now. +# i.e. [2000-2020] < [1900-2000] (now = 2010) +# +# o A modern European timezone (WET, CET, EET) comes before others. +# +# o An Antarctica element comes after one that is not Antarctica +# +# o A military timezone (A-Z) comes after one that is not +# +# o A UT/UTC/*GMT* timezone comes after one that is not +# +# o An element that is active later comes before one that is active +# earlier. +# i.e. [X-1970] < [X-1960]; [X-2040] < [X-2020] +# +# o An element that is active further in the past comes before one +# that is active later. +# i.e. [1930-X] < [1940-X] +# +# o Alphabetize the rest. +# +sub _sort_by_years { + my($hash) = @_; + + return sort { __sort_by_years($$hash{$a},$$hash{$b},$a,$b) } keys %$hash; +} +sub __sort_by_years { + my($a,$b,$namea,$nameb) = @_; + + # Find out which elements are currently active + my $curra = ($$a[0] <= $curry && $$a[1] >= $curry ? 1 : 0); + my $currb = ($$b[0] <= $curry && $$b[1] >= $curry ? 1 : 0); + + # An element that is active now always comes before one that isn't + # active now. + if ($curra != $currb) { + return -1 if ($curra); + return 1; + } + + # A modern European timezone (WET, CET, EET) comes before others. + if ($namea =~ /^(WET|CET|EET)$/) { + return -1; + } elsif ($nameb =~ /^(WET|CET|EET)$/) { + return 1; + } + + # An Antarctica element comes after one that is not Antarctica + if ($namea =~ /Antarctica/) { + if ($nameb =~ /Antarctica/) { + return $namea cmp $nameb; + } else { + return 1; + } + } elsif ($nameb =~ /Antarctica/) { + return -1; + } + + # A military timezone (A-Z) comes after one that is not + + if ($namea =~ /^[A-Z]$/) { + if ($nameb =~ /^[A-Z]$/) { + return $namea cmp $nameb; + } else { + return 1; + } + } elsif ($nameb =~ /^[A-Z]$/) { + return -1; + } + + # A UT/UTC/*GMT* timezone comes after one that is not + + if ($namea =~ /UT/ || $namea =~ /GMT/) { + if ($nameb =~ /UT/ || $nameb =~ /GMT/) { + return $namea cmp $nameb; + } else { + return 1; + } + } elsif ($nameb =~ /UT/ || $nameb =~ /GMT/) { + return -1; + } + + # An element that is active later comes before one that is active + # earlier. + if ($$a[1] != $$b[1]) { + return -1 if ($$a[1] > $$b[1]); + return 1; + } + + # An element that is active further in the past comes before one + # that is active later. + if ($$a[0] != $$b[0]) { + return -1 if ($$a[0] < $$b[0]); + return 1; + } + + # We'll order anything else as America < Europe < Asia < other + my ($posa,$posb); + if ($namea =~ /^America/) { $posa = 1; } + elsif ($namea =~ /^Europe/) { $posa = 2; } + elsif ($namea =~ /^Asia/) { $posa = 3; } + else { $posa = 4; } + if ($nameb =~ /^America/) { $posb = 1; } + elsif ($nameb =~ /^Europe/) { $posb = 2; } + elsif ($nameb =~ /^Asia/) { $posb = 3; } + else { $posb = 4; } + return ($posa <=> $posb) if ($posa != $posb); + + # Alphabetize the rest + return $namea cmp $nameb; +} + +# This will warn if %curr is different than %prev. +# +sub _warn_changes { + my($curr,$prev,$indent,$col1_len,$col2_len,$header) = @_; + + my %tmp = map { $_,1 } (keys %$curr, keys %$prev); + + foreach my $ele (sort keys %tmp) { + + if (! exists $$curr{$ele}) { + + # If the element doesn't exist in the current set of + # elements, remove it from the previous set. + + _warn_changes_ele($header,$ele, + undef,$$prev{$ele},$indent,$col1_len,$col2_len); + + } elsif (! exists $$prev{$ele}) { + + # If the element doesn't exist in the old set, add it. + + _warn_changes_ele($header,$ele, + $$curr{$ele},undef,$indent,$col1_len,$col2_len); + + } elsif (! ref($$prev{$ele})) { + + # The previous element is defined as either a scalar: + # PREV_FIRST + # The current first element must be the same. + + if ($$curr{$ele}[0] ne $$prev{$ele}) { + _warn_changes_ele($header,$ele, + $$curr{$ele},$$prev{$ele}, + $indent,$col1_len,$col2_len); + } + + } else { + + # The previous element may be defined as a listref: + # [ OVERRIDE, PREV_FIRST ] + # + # This will warn if the current first element is not the + # same as PREV_FIRST. + # + # In the second case, it will also complain if OVERRIDE is not + # in the list. Finally, it will reorder the list to move OVERRIDE + # to the start of the list. + + if ($$prev{$ele}[1] ne $$curr{$ele}[0]) { + _warn_changes_ele($header,$ele, + $$curr{$ele},$$prev{$ele}, + $indent,$col1_len,$col2_len); + + } else { + my @old = @{ $$curr{$ele} }; + my @new; + my $found = 0; + while (@old) { + my $tz = shift(@old); + my $y1 = shift(@old); + my $y2 = shift(@old); + if ($tz eq $$prev{$ele}[0]) { + @new = ($tz,$y1,$y2,@new,@old); + $found = 1; + last; + } else { + push(@new,$tz,$y1,$y2); + } + } + if ($found) { + $$curr{$ele} = [@new]; + } else { + _warn_changes_ele($header,$ele, + $$curr{$ele},$$prev{$ele}[1], + $indent,$col1_len,$col2_len); + } + } + } + } +} + +sub _warn_changes_ele { + my($header,$ele,$curr,$prev,$indent,$col1_len,$col2_len) = @_; + + my $val; + if (! defined($curr)) { + warn "*** REMOVE ***\n"; + if (ref($prev)) { + $val = "[ $$prev[0], $$prev[1] ]"; + } else { + $val = $prev; + } + } elsif (! defined($prev)) { + warn "*** NEW ELEMENT ***\n"; + $val = $$curr[0]; + } else { + warn "*** CHANGE ELEMENT ***\n"; + if (ref($prev)) { + $val = "[ $$prev[0] => $$curr[0] ]"; + } else { + $val = $$curr[0]; + } + } + warn "$header\n" if (defined $header); + + $ele = "'$ele'"; + warn " "x$indent, $ele," "x($col1_len-length($ele)),"=> '$val'\n"; + + if (defined($curr)) { + my @tmp = @$curr; + while (@tmp) { + my $subele = shift(@tmp); + my $year1 = shift(@tmp); + my $year2 = shift(@tmp); + my($col2) = "'$subele'"; + my($col3) = ",$year1,$year2,"; + + warn "#"," "x($indent + $col1_len + 3), $col2, + " "x($col2_len-length($col2)),"$col3\n"; + } + } +} + +############################################################################ +# DO_CLEAN +############################################################################ + +sub do_clean { + print "Cleaning...\n"; + system("rm -rf tzdata* tzcode*"); +} + +############################################################################ + +sub _yaml_read { + my($file) = @_; + return {} if (! -e $file); + my($data) = YAML::LoadFile($file); + return {} if (! defined $data); + return $data; +} + +sub _yaml_write { + my($data,$file,$backup) = @_; + + rename($file,"$file.bak") if ($backup && -e $file); + YAML::DumpFile($file,$data); +} + +# Local Variables: +# mode: cperl +# indent-tabs-mode: nil +# cperl-indent-level: 3 +# cperl-continued-statement-offset: 2 +# cperl-continued-brace-offset: 0 +# cperl-brace-offset: 0 +# cperl-brace-imaginary-offset: 0 +# cperl-label-offset: 0 +# End: diff --git a/internal/tztab b/internal/tztab new file mode 100644 index 0000000..330fc57 --- /dev/null +++ b/internal/tztab @@ -0,0 +1,670 @@ +@(#) tztab $Date: 2008/12/08 17:21:29 $Revision: r11.11/12 PATCH_11.11 (PHCO_39172) + +# Mitteleuropaeische Zeit, Mitteleuropaeische Sommerzeit +MEZ-1MESZ +0 3 25-31 3 1983-2038 0 MESZ-2 +0 2 24-30 9 1983-1995 0 MEZ-1 +0 2 25-31 10 1996-2038 0 MEZ-1 + +# Middle European Time, Middle European Time Daylight Savings Time +MET-1METDST +0 3 25-31 3 1983-2038 0 METDST-2 +0 2 24-30 9 1983-1995 0 MET-1 +0 2 25-31 10 1996-2038 0 MET-1 + +# Greenwich Mean Time, British Summer Time +GMT0BST +0 3 25-31 3 1983-1984 0 BST-1 +0 3 23-29 3 1985-1990 0 BST-1 +0 3 25-31 3 1991-1995 0 BST-1 +0 2 25-31 3 1996-2038 0 BST-1 +0 1 25-31 10 1983-1985 0 GMT0 +0 1 23-29 10 1986-1994 0 GMT0 +0 1 18-24 10 1995 0 GMT0 +0 1 25-31 10 1996-2038 0 GMT0 + +# Pacific Standard Time, Pacific Daylight Time +PST8PDT +0 3 24-30 4 1970-1973 0 PDT7 +0 3 6 1 1974 0-6 PDT7 +0 3 22-28 2 1975 0 PDT7 +0 3 24-30 4 1976-1986 0 PDT7 +0 3 1-7 4 1987-2006 0 PDT7 +0 3 8-14 3 2007-2038 0 PDT7 +0 1 25-31 10 1970-1973 0 PST8 +0 1 24-30 11 1974 0 PST8 +0 1 25-31 10 1975-2006 0 PST8 +0 1 1-7 11 2007-2038 0 PST8 + +# Eastern Standard Time, Eastern Daylight Time +EST5EDT +0 3 24-30 4 1970-1973 0 EDT4 +0 3 6 1 1974 0-6 EDT4 +0 3 22-28 2 1975 0 EDT4 +0 3 24-30 4 1976-1986 0 EDT4 +0 3 1-7 4 1987-2006 0 EDT4 +0 3 8-14 3 2007-2038 0 EDT4 +0 1 25-31 10 1970-1973 0 EST5 +0 1 24-30 11 1974 0 EST5 +0 1 25-31 10 1975-2006 0 EST5 +0 1 1-7 11 2007-2038 0 EST5 + +# Central Standard Time, Central Daylight Time +CST6CDT +0 3 24-30 4 1970-1973 0 CDT5 +0 3 6 1 1974 0-6 CDT5 +0 3 22-28 2 1975 0 CDT5 +0 3 24-30 4 1976-1986 0 CDT5 +0 3 1-7 4 1987-2006 0 CDT5 +0 3 8-14 3 2007-2038 0 CDT5 +0 1 25-31 10 1970-1973 0 CST6 +0 1 24-30 11 1974 0 CST6 +0 1 25-31 10 1975-2006 0 CST6 +0 1 1-7 11 2007-2038 0 CST6 + +# Mountain Standard Time, Mountain Daylight Time +MST7MDT +0 3 24-30 4 1970-1973 0 MDT6 +0 3 6 1 1974 0-6 MDT6 +0 3 22-28 2 1975 0 MDT6 +0 3 24-30 4 1976-1986 0 MDT6 +0 3 1-7 4 1987-2006 0 MDT6 +0 3 8-14 3 2007-2038 0 MDT6 +0 1 25-31 10 1970-1973 0 MST7 +0 1 24-30 11 1974 0 MST7 +0 1 25-31 10 1975-2006 0 MST7 +0 1 1-7 11 2007-2038 0 MST7 + +# The following entry is added, as Indiana +# will support Daylight Saving Time (DST) +# from 2006 onwards. Indiana will have two +# Time zones EST5EDT#Indiana and CST6CDT#Indiana, +# for provinces within Indiana supporting +# Eastern or Central Time Zone respectively. + +# Eastern Standard Time, Eastern Daylight Time(US: Indiana) +EST5EDT#Indiana +0 3 24-30 4 1970-1973 0 EST5 +0 3 6 1 1974 0-6 EST5 +0 3 22-28 2 1975 0 EST5 +0 3 24-30 4 1976-1986 0 EST5 +0 3 1-7 4 1987-2005 0 EST5 +0 3 1-7 4 2006 0 EDT#Indiana4 +0 3 8-14 3 2007-2038 0 EDT#Indiana4 +0 1 25-31 10 1970-1973 0 EST5 +0 1 24-30 11 1974 0 EST5 +0 1 25-31 10 1975-2005 0 EST5 +0 1 25-31 10 2006 0 EST5 +0 1 1-7 11 2007-2038 0 EST5 + +# Central Standard Time, Central Daylight Time(US: Indiana) +CST6CDT#Indiana +0 3 24-30 4 1970-1973 0 CST6 +0 3 6 1 1974 0-6 CST6 +0 3 22-28 2 1975 0 CST6 +0 3 24-30 4 1976-1986 0 CST6 +0 3 1-7 4 1987-2005 0 CST6 +0 3 1-7 4 2006 0 CDT#Indiana5 +0 3 8-14 3 2007-2038 0 CDT#Indiana5 +0 1 25-31 10 1970-1973 0 CST6 +0 1 24-30 11 1974 0 CST6 +0 1 25-31 10 1975-2005 0 CST6 +0 1 25-31 10 2006 0 CST6 +0 1 1-7 11 2007-2038 0 CST6 + +# US and Canada use the same rules. It is recommended to use the +# simpler timezone strings (EST5EDT, CST6CDT, MST7MDT and PST8PDT) +# for Canada. The timezones with #Canada are kept for +# compatibility reasons. + +# Atlantic Standard Time, Atlantic Daylight Time (Canada) +AST4ADT +0 3 24-30 4 1970-1973 0 ADT3 +0 3 6 1 1974 0-6 ADT3 +0 3 22-28 2 1975 0 ADT3 +0 3 24-30 4 1976-1986 0 ADT3 +0 3 1-7 4 1987-2006 0 ADT3 +0 3 8-14 3 2007-2038 0 ADT3 +0 1 25-31 10 1970-1973 0 AST4 +0 1 24-30 11 1974 0 AST4 +0 1 25-31 10 1975-2006 0 AST4 +0 1 1-7 11 2007-2038 0 AST4 + +# Newfoundland Standard Time, Newfoundland Daylight Time (Canada) +NST3:30NDT +0 3 24-30 4 1970-1973 0 NDT2:30 +0 3 6 1 1974 0-6 NDT2:30 +0 3 22-28 2 1975 0 NDT2:30 +0 3 24-30 4 1976-1986 0 NDT2:30 +0 3 1-7 4 1987-2006 0 NDT2:30 +0 3 8-14 3 2007-2038 0 NDT2:30 +0 1 25-31 10 1970-1973 0 NST3:30 +0 1 24-30 11 1974 0 NST3:30 +0 1 25-31 10 1975-2006 0 NST3:30 +0 1 1-7 11 2007-2038 0 NST3:30 + +# Atlantic Standard Time, Atlantic Daylight Time (Canada) +AST4ADT#Canada +0 3 24-30 4 1970-1973 0 ADT#Canada3 +0 3 6 1 1974 0-6 ADT#Canada3 +0 3 22-28 2 1975 0 ADT#Canada3 +0 3 24-30 4 1976-1986 0 ADT#Canada3 +0 3 1-7 4 1987-2006 0 ADT#Canada3 +0 3 8-14 3 2007-2038 0 ADT#Canada3 +0 1 25-31 10 1970-1973 0 AST4 +0 1 24-30 11 1974 0 AST4 +0 1 25-31 10 1975-2006 0 AST4 +0 1 1-7 11 2007-2038 0 AST4 + +# Newfoundland Standard Time, Newfoundland Daylight Time (Canada) +NST3:30NDT#Canada +0 3 24-30 4 1970-1973 0 NDT#Canada2:30 +0 3 6 1 1974 0-6 NDT#Canada2:30 +0 3 22-28 2 1975 0 NDT#Canada2:30 +0 3 24-30 4 1976-1986 0 NDT#Canada2:30 +0 3 1-7 4 1987-2006 0 NDT#Canada2:30 +0 3 8-14 3 2007-2038 0 NDT#Canada2:30 +0 1 25-31 10 1970-1973 0 NST3:30 +0 1 24-30 11 1974 0 NST3:30 +0 1 25-31 10 1975-2006 0 NST3:30 +0 1 1-7 11 2007-2038 0 NST3:30 + +# Eastern Standard Time, Central Daylight Time (US: Indiana) +EST5CDT +0 3 24-30 4 1970-1973 0 CDT5 +0 3 6 1 1974 0-6 CDT5 +0 3 22-28 2 1975 0 CDT5 +0 3 24-30 4 1976-1986 0 CDT5 +0 3 1-7 4 1987-2038 0 CDT5 +0 1 25-31 10 1970-1973 0 EST5 +0 1 24-30 11 1974 0 EST5 +0 1 25-31 10 1975-2038 0 EST5 + +# Aleutian Standard Time, Aleutian Daylight Time (US) +AST10ADT +0 3 24-30 4 1970-1973 0 ADT9 +0 3 6 1 1974 0-6 ADT9 +0 3 22-28 2 1975 0 ADT9 +0 3 24-30 4 1976-1986 0 ADT9 +0 3 1-7 4 1987-2006 0 ADT9 +0 3 8-14 3 2007-2038 0 ADT9 +0 1 25-31 10 1970-1973 0 AST10 +0 1 24-30 11 1974 0 AST10 +0 1 25-31 10 1975-2006 0 AST10 +0 1 1-7 11 2007-2038 0 AST10 + +# Yukon Standard Time, Yukon Daylight Time (US) +YST9YDT +0 3 24-30 4 1970-1973 0 YDT8 +0 3 6 1 1974 0-6 YDT8 +0 3 22-28 2 1975 0 YDT8 +0 3 24-30 4 1976-1986 0 YDT8 +0 3 1-7 4 1987-2006 0 YDT8 +0 3 8-14 3 2007-2038 0 YDT8 +0 1 25-31 10 1970-1973 0 YST9 +0 1 24-30 11 1974 0 YST9 +0 1 25-31 10 1975-2006 0 YST9 +0 1 1-7 11 2007-2038 0 YST9 + +# Western European Time, Western European Time Daylight Savings Time +WET0WETDST +0 3 25-31 3 1983-1984 0 WETDST-1 +0 3 23-29 3 1985-1995 0 WETDST-1 +0 2 25-31 3 1996-2038 0 WETDST-1 +0 1 25-31 10 1983-1985 0 WET0 +0 1 23-29 10 1986-1995 0 WET0 +0 1 25-31 10 1996-2038 0 WET0 + +# Portuguese Winter Time, Portuguese Summer Time +PWT0PST +0 2 25-31 3 1983-2038 0 PST-1 +0 1 25-31 10 1983-2038 0 PWT0 + +# South Africa Standard Time +SAST-2 +0 1 1-7 3 1985-2038 0 SAST-2 + +# Australian Central Standard Time, Australian Central Daylight Time +# (South Australia) +# Australian DST changes for South Australia. + +# Current Regulation in South Australia extends the Daylight Saving time +# only for year 2008 (later ending in April 2008 and early beginning in +# October 2008). The current entry assumes that Daylight Saving changes +# will be permanent and will match the changes in other Australian provinces. +# The entry will cause the extension of Daylight Savings time also for 2009 +# and future years. If the changes are not permanent, the entry will change again. + +CST-9:30CDT +0 3 25-31 10 1971-2007 0 CDT-10:30 +0 3 1-7 10 2008-2038 0 CDT-10:30 +0 1 27 2 1972 0-6 CST-9:30 +0 1 1-7 3 1973-1994 0 CST-9:30 +0 2 25-31 3 1995-2005 0 CST-9:30 +0 2 1-7 4 2006 0 CST-9:30 +0 2 25-31 3 2007 0 CST-9:30 +0 2 1-7 4 2008-2038 0 CST-9:30 + +# Australian Eastern Standard Time, Australian Eastern Daylight Time +# Australian DST changes for Australian Capital Territory. + +EST-10EDT +0 3 25-31 10 1971-1999 0 EDT-11 +0 3 27 8 2000 0-6 EDT-11 +0 3 25-31 10 2001-2007 0 EDT-11 +0 3 1-7 10 2008-2038 0 EDT-11 +0 1 27 2 1972 0-6 EST-10 +0 1 1-7 3 1973-1985 0 EST-10 +0 1 15-21 3 1986 0 EST-10 +0 1 1-7 3 1987-1995 0 EST-10 +0 2 25-31 3 1996-2005 0 EST-10 +0 2 1-7 4 2006 0 EST-10 +0 2 25-31 3 2007 0 EST-10 +0 2 1-7 4 2008-2038 0 EST-10 + +# New Zealand Standard Time, New Zealand Daylight Time +NZST-12NZDT +0 3 25-31 10 1985-1988 0 NZDT-13 +0 3 8 10 1989 0-6 NZDT-13 +0 3 1-7 10 1990-2006 0 NZDT-13 +0 3 24-30 9 2007-2038 0 NZDT-13 +0 2 1-7 3 1985-1989 0 NZST-12 +0 2 15-21 3 1990-2007 0 NZST-12 +0 2 1-7 4 2008-2038 0 NZST-12 + +# Pacific Standard Time, Pacific Daylight Time (for Malaysia or Singapore) +# +PST-8PDT +0 1 1-7 4 1996-2038 0 PDT-9 +0 1 25-31 10 1996-2038 0 PST-8 + +# Finland Standard Time, Finland Daylight Time +# +# This entry has been changed to allow for a later ending of +# Daylight Savings Time from 1996 onwards. +# It now ends on the last Sunday of October. +# +EET-2EETDST +0 4 25-31 3 1981-2038 0 EETDST-3 +0 3 24-30 9 1981-1995 0 EET-2 +0 3 25-31 10 1996-2038 0 EET-2 + +# Australian Eastern Standard Time, Australian Eastern Daylight Time (Tasmania) +# Australian DST changes for Tasmania. + +EST-10EDT#Tasmania +0 3 25-31 10 1971-1994 0 EDT#Tasmania-11 +0 3 1-7 10 1995-1999 0 EDT#Tasmania-11 +0 3 25-31 8 2000 0 EDT#Tasmania-11 +0 3 1-7 10 2001-2038 0 EDT#Tasmania-11 +0 1 27 2 1972 0-6 EST-10 +0 1 1-7 3 1973-1994 0 EST-10 +0 2 25-31 3 1995-2005 0 EST-10 +0 2 1-7 4 2006 0 EST-10 +0 2 25-31 3 2007 0 EST-10 +0 2 1-7 4 2008-2038 0 EST-10 + +# Australian Eastern Standard Time, Australian Eastern Daylight Time +# Australian DST changes for New South Wales. + +EST-10EDT#NSW +0 3 25-31 10 1971-1999 0 EDT#NSW-11 +0 3 27 8 2000 0-6 EDT#NSW-11 +0 3 25-31 10 2001-2007 0 EDT#NSW-11 +0 3 1-7 10 2008-2038 0 EDT#NSW-11 +0 1 27 2 1972 0-6 EST-10 +0 1 1-7 3 1973-1985 0 EST-10 +0 1 15-21 3 1986 0 EST-10 +0 2 1-7 3 1987-1995 0 EST-10 +0 2 25-31 3 1996-2005 0 EST-10 +0 2 1-7 4 2006 0 EST-10 +0 2 25-31 3 2007 0 EST-10 +0 2 1-7 4 2008-2038 0 EST-10 + +# Australian Eastern Standard Time, Australian Eastern Daylight Time +# Australian DST changes for Victoria. + +EST-10EDT#VIC +0 3 25-31 10 1971-1999 0 EDT#VIC-11 +0 3 27 8 2000 0-6 EDT#VIC-11 +0 3 25-31 10 2001-2007 0 EDT#VIC-11 +0 3 1-7 10 2008-2038 0 EDT#VIC-11 +0 1 27 2 1972 0-6 EST-10 +0 1 1-7 3 1973-1985 0 EST-10 +0 1 15-21 3 1986 0 EST-10 +0 1 1-7 3 1987-1994 0 EST-10 +0 2 25-31 3 1995-2005 0 EST-10 +0 2 1-7 4 2006 0 EST-10 +0 2 25-31 3 2007 0 EST-10 +0 2 1-7 4 2008-2038 0 EST-10 + +# Australian Western Standard Time, Australian Western Daylight Time +# +# This entry has been created for the trial daylight savings period +# in the Australian state of Western Australia. This entry only +# covers the trial period and additional changes will be required +# to extend entry if the referendum on daylight savings accepts +# daylight savings permanently. + +WST-8WDT +0 3 3 12 2006 0-6 WDT-9 +0 3 25-31 10 2007-2008 0 WDT-9 +0 2 25-31 3 2007-2009 0 WST-8 + +# Pacific Standard Time, Pacific Daylight Time (Canada) +PST8PDT#Canada +0 3 24-30 4 1970-1973 0 PDT#Canada7 +0 3 6 1 1974 0-6 PDT#Canada7 +0 3 22-28 2 1975 0 PDT#Canada7 +0 3 24-30 4 1976-1986 0 PDT#Canada7 +0 3 1-7 4 1987-2006 0 PDT#Canada7 +0 3 8-14 3 2007-2038 0 PDT#Canada7 +0 1 25-31 10 1970-1973 0 PST8 +0 1 24-30 11 1974 0 PST8 +0 1 25-31 10 1975-2006 0 PST8 +0 1 1-7 11 2007-2038 0 PST8 + +# Mountain Standard Time, Mountain Daylight Time (Canada) +MST7MDT#Canada +0 3 24-30 4 1970-1973 0 MDT#Canada6 +0 3 6 1 1974 0-6 MDT#Canada6 +0 3 22-28 2 1975 0 MDT#Canada6 +0 3 24-30 4 1976-1986 0 MDT#Canada6 +0 3 1-7 4 1987-2006 0 MDT#Canada6 +0 3 8-14 3 2007-2038 0 MDT#Canada6 +0 1 25-31 10 1970-1973 0 MST7 +0 1 24-30 11 1974 0 MST7 +0 1 25-31 10 1975-2006 0 MST7 +0 1 1-7 11 2007-2038 0 MST7 + +# Central Standard Time, Central Daylight Time (Canada) +CST6CDT#Canada +0 3 24-30 4 1970-1973 0 CDT#Canada5 +0 3 6 1 1974 0-6 CDT#Canada5 +0 3 22-28 2 1975 0 CDT#Canada5 +0 3 24-30 4 1976-1986 0 CDT#Canada5 +0 3 1-7 4 1987-2006 0 CDT#Canada5 +0 3 8-14 3 2007-2038 0 CDT#Canada5 +0 1 25-31 10 1970-1973 0 CST6 +0 1 24-30 11 1974 0 CST6 +0 1 25-31 10 1975-2006 0 CST6 +0 1 1-7 11 2007-2038 0 CST6 + +# Eastern Standard Time, Eastern Daylight Time (Canada) +EST5EDT#Canada +0 3 24-30 4 1970-1973 0 EDT#Canada4 +0 3 6 1 1974 0-6 EDT#Canada4 +0 3 22-28 2 1975 0 EDT#Canada4 +0 3 24-30 4 1976-1986 0 EDT#Canada4 +0 3 1-7 4 1987-2006 0 EDT#Canada4 +0 3 8-14 3 2007-2038 0 EDT#Canada4 +0 1 25-31 10 1970-1973 0 EST5 +0 1 24-30 11 1974 0 EST5 +0 1 25-31 10 1975-2006 0 EST5 +0 1 1-7 11 2007-2038 0 EST5 + +# Eastern Standard Time (US: Most of Indiana) +# +# This entry is added to correct the Indiana timezone because +# Indiana does not observe Daylight Savings Time. The original +# entry EST5CDT is kept to ensure backward compatibility. +EST5EST +0 3 24-30 4 1970-1973 0 EST5 +0 3 6 1 1974 0-6 EST5 +0 3 22-28 2 1975 0 EST5 +0 3 24-30 4 1976-1986 0 EST5 +0 3 1-7 4 1987-2038 0 EST5 +0 1 25-31 10 1970-1973 0 EST5 +0 1 24-30 11 1974 0 EST5 +0 1 25-31 10 1975-2038 0 EST5 + +# Eastern Standard Time, Central Daylight Time (US: Indiana) +# +# This entry is for backward compatibility only, the correct entry +# is the EST5CDT entry above. This entry is incorrect because the +# "6" in EST6CDT below should be a "5". Other than the "6" being +# changed to "5", this entry and EST5CDT are the same and the +# end result of using either is identical. +# +EST6CDT +0 3 24-30 4 1970-1973 0 CDT5 +0 3 6 1 1974 0-6 CDT5 +0 3 22-28 2 1975 0 CDT5 +0 3 24-30 4 1976-1986 0 CDT5 +0 3 1-7 4 1987-2038 0 CDT5 +0 1 25-31 10 1970-1973 0 EST5 +0 1 24-30 11 1974 0 EST5 +0 1 25-31 10 1975-2038 0 EST5 + +# Western Russia (Moscow) Time, Western Russia (Moscow) Daylight Savings +# Time +WST-3WSTDST +0 3 25-31 3 1983-2038 0 WSTDST-4 +0 2 24-30 9 1983-1995 0 WST-3 +0 2 25-31 10 1996-2038 0 WST-3 + +# Belorussia (minsk) Time, Belorussia (minsk) Daylight Savings Time + +WST-2WSTDST +0 3 25-31 3 1983-2038 0 WSTDST-3 +0 2 24-30 9 1983-1995 0 WST-2 +0 2 25-31 10 1996-2038 0 WST-2 + +# European Russia (samara) Time, European Russia (samara) Daylight Savings +#Time + +WST-4WSTDST +0 3 25-31 3 1983-2038 0 WSTDST-5 +0 2 24-30 9 1983-1995 0 WST-4 +0 2 25-31 10 1996-2038 0 WST-4 + +# Urals (Ekaterinburg) Time, Urals (Ekaterinburg) Daylight Savings Time + +WST-5WSTDST +0 3 25-31 3 1983-2038 0 WSTDST-6 +0 2 24-30 9 1983-1995 0 WST-5 +0 2 25-31 10 1996-2038 0 WST-5 + +# Western Siberia (Omsk), Western Siberia (Omsk) Daylight Savings Time + +WST-6WSTDST +0 3 25-31 3 1983-2038 0 WSTDST-7 +0 2 24-30 9 1983-1995 0 WST-6 +0 2 25-31 10 1996-2038 0 WST-6 + +# Middle Siberia (Krasnoyarsk) Time, Middle Siberia (Krasnoyarsk) +# Daylight Savings Time + +WST-7WSTDST +0 3 25-31 3 1983-2038 0 WSTDST-8 +0 2 24-30 9 1983-1995 0 WST-7 +0 2 25-31 10 1996-2038 0 WST-7 + +# Baikal lake (Irkutsk) Time, Baikal lake (Irkutsk) Daylight Savings Time + +WST-8WSTDST +0 3 25-31 3 1983-2038 0 WSTDST-9 +0 2 24-30 9 1983-1995 0 WST-8 +0 2 25-31 10 1996-2038 0 WST-8 + +# Eastern Siberia (Yakutsk) Time, Eastern Siberia (Yakutsk) Daylight +# Savings Time + +WST-9WSTDST +0 3 25-31 3 1983-2038 0 WSTDST-10 +0 2 24-30 9 1983-1995 0 WST-9 +0 2 25-31 10 1996-2038 0 WST-9 + +# Far East (Khabarovsk) Time, Far East (Khabarovsk) Daylight Savings +# Time + +WST-10WSTDST +0 3 25-31 3 1983-2038 0 WSTDST-11 +0 2 24-30 9 1983-1995 0 WST-10 +0 2 25-31 10 1996-2038 0 WST-10 + +# Russia Pacific (magadan) Time, Russia Pacific (magadan) Daylight +# Savings Time + +WST-11WSTDST +0 3 25-31 3 1983-2038 0 WSTDST-12 +0 2 24-30 9 1983-1995 0 WST-11 +0 2 25-31 10 1996-2038 0 WST-11 + +# Kamchatka (Petropavlovsk-Kamchatskiy) Time, Kamchatka(Petropavlovsk +# -Kamchatskiy) Daylight Savings Time + +WST-12WSTDST +0 3 25-31 3 1983-2038 0 WSTDST-13 +0 2 24-30 9 1983-1995 0 WST-12 +0 2 25-31 10 1996-2038 0 WST-12 + +# It is recommended to use PSM8PDM, MSM7MDM, CSM6CDM and MXST6MXDT for Mexico. +# Timezones PST8PDT#Mexico, MST7MDT#Mexico, CST6CDT#Mexico and MXST6MXDT#Mexico +# are kept for the compatibility reasons. Content of either set is same. + +# Timezone MXST6MXDT (Mexico City Standard Time, Mexico City Daylight Time) + +MXST6MXDT +0 3 24-30 4 1970-1973 0 MXDT5 +0 3 6 1 1974 0-6 MXDT5 +0 3 22-28 2 1975 0 MXDT5 +0 3 24-30 4 1976-1986 0 MXDT5 +0 3 1-7 4 1987-2000 0 MXDT5 +0 3 1-7 5 2001 0 MXDT5 +0 3 1-7 4 2002-2038 0 MXDT5 +0 1 25-31 10 1970-1973 0 MXST6 +0 1 24-30 11 1974 0 MXST6 +0 1 25-31 10 1975-2000 0 MXST6 +0 1 24-30 9 2001 0 MXST6 +0 1 25-31 10 2002-2038 0 MXST6 + +# Timezone MXST6MXDT#Mexico (Mexico City Standard Time, Mexico City Daylight Time) + +MXST6MXDT#Mexico +0 3 24-30 4 1970-1973 0 MXDT#Mexico5 +0 3 6 1 1974 0-6 MXDT#Mexico5 +0 3 22-28 2 1975 0 MXDT#Mexico5 +0 3 24-30 4 1976-1986 0 MXDT#Mexico5 +0 3 1-7 4 1987-2000 0 MXDT#Mexico5 +0 3 1-7 5 2001 0 MXDT#Mexico5 +0 3 1-7 4 2002-2038 0 MXDT#Mexico5 +0 1 25-31 10 1970-1973 0 MXST6 +0 1 24-30 11 1974 0 MXST6 +0 1 25-31 10 1975-2000 0 MXST6 +0 1 24-30 9 2001 0 MXST6 +0 1 25-31 10 2002-2038 0 MXST6 + +# Timezone PST8PDT#Mexico (Pacific Standard Time, Pacific Daylight Time) + +PST8PDT#Mexico +0 3 24-30 4 1970-1973 0 PDT#Mexico7 +0 3 6 1 1974 0-6 PDT#Mexico7 +0 3 22-28 2 1975 0 PDT#Mexico7 +0 3 24-30 4 1976-1986 0 PDT#Mexico7 +0 3 1-7 4 1987-2038 0 PDT#Mexico7 +0 1 25-31 10 1970-1973 0 PST8 +0 1 24-30 11 1974 0 PST8 +0 1 25-31 10 1975-2038 0 PST8 + +# Timezone MST7MDT#Mexico (Mountain Standard Time, Mountain Daylight Time) + +MST7MDT#Mexico +0 3 24-30 4 1970-1973 0 MDT#Mexico6 +0 3 6 1 1974 0-6 MDT#Mexico6 +0 3 22-28 2 1975 0 MDT#Mexico6 +0 3 24-30 4 1976-1986 0 MDT#Mexico6 +0 3 1-7 4 1987-2038 0 MDT#Mexico6 +0 1 25-31 10 1970-1973 0 MST7 +0 1 24-30 11 1974 0 MST7 +0 1 25-31 10 1975-2038 0 MST7 + +# Timezone CST6CDT#Mexico (Central Standard Time, Central Daylight Time) + +CST6CDT#Mexico +0 3 24-30 4 1970-1973 0 CDT#Mexico5 +0 3 6 1 1974 0-6 CDT#Mexico5 +0 3 22-28 2 1975 0 CDT#Mexico5 +0 3 24-30 4 1976-1986 0 CDT#Mexico5 +0 3 1-7 4 1987-2038 0 CDT#Mexico5 +0 1 25-31 10 1970-1973 0 CST6 +0 1 24-30 11 1974 0 CST6 +0 1 25-31 10 1975-2038 0 CST6 + +# Timezone PSM8PDM for Mexico (Pacific Standard Time, Pacific Daylight Time) + +PSM8PDM +0 3 24-30 4 1970-1973 0 PDM7 +0 3 6 1 1974 0-6 PDM7 +0 3 22-28 2 1975 0 PDM7 +0 3 24-30 4 1976-1986 0 PDM7 +0 3 1-7 4 1987-2038 0 PDM7 +0 1 25-31 10 1970-1973 0 PSM8 +0 1 24-30 11 1974 0 PSM8 +0 1 25-31 10 1975-2038 0 PSM8 + +# Timezone MSM7MDM for Mexico (Mountain Standard Time, Mountain Daylight Time) + +MSM7MDM +0 3 24-30 4 1970-1973 0 MDM6 +0 3 6 1 1974 0-6 MDM6 +0 3 22-28 2 1975 0 MDM6 +0 3 24-30 4 1976-1986 0 MDM6 +0 3 1-7 4 1987-2038 0 MDM6 +0 1 25-31 10 1970-1973 0 MSM7 +0 1 24-30 11 1974 0 MSM7 +0 1 25-31 10 1975-2038 0 MSM7 + +# Timezone CSM6CDM for Mexico (Central Standard Time, Central Daylight Time) + +CSM6CDM +0 3 24-30 4 1970-1973 0 CDM5 +0 3 6 1 1974 0-6 CDM5 +0 3 22-28 2 1975 0 CDM5 +0 3 24-30 4 1976-1986 0 CDM5 +0 3 1-7 4 1987-2038 0 CDM5 +0 1 25-31 10 1970-1973 0 CSM6 +0 1 24-30 11 1974 0 CSM6 +0 1 25-31 10 1975-2038 0 CSM6 + +# Time zone for Brasilia, Brazil(Brazil Standard Time, Brazil Daylight Time) + +BRST3BRDT +0 1 15-21 10 2008-2037 0 BRDT2 +0 23 14-20 2 2009-2011 6 BRST3 +0 23 21-27 2 2012 6 BRST3 +0 23 14-20 2 2013-2014 6 BRST3 +0 23 21-27 2 2015 6 BRST3 +0 23 14-20 2 2016-2022 6 BRST3 +0 23 21-27 2 2023 6 BRST3 +0 23 14-20 2 2024-2025 6 BRST3 +0 23 21-27 2 2026 6 BRST3 +0 23 14-20 2 2027-2033 6 BRST3 +0 23 21-27 2 2034 6 BRST3 +0 23 14-20 2 2035-2036 6 BRST3 +0 23 21-27 2 2037 6 BRST3 +0 23 14-20 2 2038 6 BRST3 + +# Time zone for West Brazil(Brazil West Standard Time, Brazil West Daylight Time) + +BRWST4BRWDT +0 1 15-21 10 2008-2037 0 BRWDT3 +0 23 14-20 2 2009-2011 6 BRWST4 +0 23 21-27 2 2012 6 BRWST4 +0 23 14-20 2 2013-2014 6 BRWST4 +0 23 21-27 2 2015 6 BRWST4 +0 23 14-20 2 2016-2022 6 BRWST4 +0 23 21-27 2 2023 6 BRWST4 +0 23 14-20 2 2024-2025 6 BRWST4 +0 23 21-27 2 2026 6 BRWST4 +0 23 14-20 2 2027-2033 6 BRWST4 +0 23 21-27 2 2034 6 BRWST4 +0 23 14-20 2 2035-2036 6 BRWST4 +0 23 21-27 2 2037 6 BRWST4 +0 23 14-20 2 2038 6 BRWST4 + +# Time zone for Argentina (Argentina Standard Time, Argentina Daylight Time) + +ARST3ARDT +0 1 15-21 10 2008 0 ARDT2 +0 23 14-20 3 2009 6 ARST3 diff --git a/internal/unicode b/internal/unicode new file mode 100755 index 0000000..3650e88 --- /dev/null +++ b/internal/unicode @@ -0,0 +1,104 @@ +#!/usr/bin/perl + +# http://perlmonks.org/?node_id=1084067 +# Script by Jim +#use v5.10; +use strict; +use warnings; +use utf8; + +use Encode qw( encode_utf8 ); +use Unicode::UCD qw( charblock ); + +binmode STDOUT, ':encoding(UTF-8)'; + +while (my $word = ) { + chomp $word; + + my $length_in_bytes = length_in_bytes($word); + my $length_in_code_points = length_in_code_points($word); + my $length_in_graphemes = length_in_graphemes($word); + my $code_points_in_blocks = code_points_in_blocks($word); + + printf "%-12s | Bytes: %2d | Code Points: %2d | Graphemes: %2d | Blocks: %s\n", + $word, + $length_in_bytes, + $length_in_code_points, + $length_in_graphemes, + $code_points_in_blocks; +} + +exit 0; + +sub length_in_bytes { + my $word = shift; + + my $length = length encode_utf8($word); + + return $length; +} + +sub length_in_code_points { + my $word = shift; + + my $length = length $word; + + return $length; +} + +sub length_in_graphemes { + my $word = shift; + + my $length = () = $word =~ m/\X/g; + + return $length; +} + +sub code_points_in_blocks { + my $word = shift; + + my %total_code_points_by; + my $blocks = ''; + + for my $character (split m//, $word) { + my $block = charblock(ord $character); + + $total_code_points_by{$block}++; + } + + for my $block (sort keys %total_code_points_by) { + my $total = $total_code_points_by{$block}; + + $blocks .= sprintf "%s%s (%d)", + (length $blocks ? ', ' : ''), $block, $total; + } + + return $blocks; +} + +__DATA__ +æ +æð +æða +æðaber +æðahnútur +æðakölkun +æðardúnn +æðarfugl +æðarkolla +æðarkóngur +æðarvarp +æði +æðimargur +æðisgenginn +æðiskast +æðislegur +æðrast +æðri +æðrulaus +æðruleysi +æðruorð +æðrutónn +æðstur +æður +æfa diff --git a/internal/windows.compare b/internal/windows.compare new file mode 100644 index 0000000..6df0655 --- /dev/null +++ b/internal/windows.compare @@ -0,0 +1,146 @@ +#!/usr/bin/perl +# Copyright (c) 2008-2017 Sullivan Beck. All rights reserved. +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +############################################################################### +############################################################################### +# This script will check windows timezone information. + +my $new = 'windows.new'; +require "data.alias.pl"; + +############################################################################ +# MAIN PROGRAM +############################################################################ + +my %old = %windows_zones; +my %new = _parse($new); + +# Find deprecated zones + +my @old; +foreach my $key (keys %old) { + next if (exists $new{$key}); + push(@old,$key); +} + +if (@old) { + print "The following zones need to be removed:\n"; + foreach my $key (sort @old) { + print " $key\n"; + delete $old{$key}; + } + print "\n"; +} + +# Find new zones + +my @new; +foreach my $key (keys %new) { + next if (exists $old{$key}); + push(@new,$key); +} + +if (@new) { + print "The following zones need to be added (check that the zones are in tzdata):\n"; + foreach my $key (sort @new) { + my $val = $new{$key}; + print " \"$key\"" . " "x(32-length($key)) . "=> \"$val\",\n"; + delete $new{$key}; + } + print "\n"; +} + +# Find changed zones + +my @chg; +foreach my $key (keys %old) { + next if ($old{$key} eq $new{$key}); + push(@chg,$key); +} + +if (@chg) { + print "The following zones need to be changed (verify in tzdata first):\n"; + foreach my $key (sort @chg) { + my $val = $new{$key}; + print " \"$key\"" . " "x(32-length($key)) . "=> \"$val\",\n"; + } + print "\n"; +} + +############################################################################ +############################################################################ + +# It's a file of TAB separated lines: +# +# ALIAS \t TAG \t ZONE_LIST +# +# where ALIAS is the windows time zone name and ZONE_LIST is a space +# separated list of timezones. +# +# ALIAS may appear on multiple lines... use the first, and ZONE_LIST +# may have multiple zones... use the first. +# +sub _parse { + my($file) = @_; + my %ret; + + my @lines = `cat $file`; + chomp(@lines); + + my $n = 0; + foreach my $line (@lines) { + $n++; + + my @f = split(/\t/,$line); + if (@f != 3) { + warn "ERROR: invalid line: $file[$n]\n" . + " $line\n"; + } + + my($alias,$tmp,$zones) = @f; + next if (exists $ret{$alias}); + + my @tmp = split(/\s+/,$zones); + my $zone = $tmp[0]; + + $ret{$alias} = $zone; + } + + return %ret; +} + +# For CLDR 2.0 +# sub _parse { +# my($file) = @_; +# my %ret; + +# my @lines = `cat $file`; +# chomp(@lines); + +# my $n = 0; +# foreach my $line (@lines) { +# $n++; + +# if ($line =~ /^\s*(.*?)\s+any\s+(.*?)\s*$/) { +# $ret{$1} = $2; +# } else { +# warn "ERROR: invalid line: $file[$n]\n" . +# " $line\n"; +# } +# } + +# return %ret; +# } + +# Local Variables: +# mode: cperl +# indent-tabs-mode: nil +# cperl-indent-level: 3 +# cperl-continued-statement-offset: 2 +# cperl-continued-brace-offset: 0 +# cperl-brace-offset: 0 +# cperl-brace-imaginary-offset: 0 +# cperl-label-offset: 0 +# End: diff --git a/lib/Date/Manip.pm b/lib/Date/Manip.pm new file mode 100644 index 0000000..4923e5d --- /dev/null +++ b/lib/Date/Manip.pm @@ -0,0 +1,55 @@ +package Date::Manip; +# Copyright (c) 2010-2017 Sullivan Beck. All rights reserved. +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +########################################################################### +########################################################################### + +use warnings; +use strict; +use Exporter; + +our $VERSION; +$VERSION='6.60'; + +our (@ISA,@EXPORT); + +my $backend; + +if ((exists $ENV{'DATE_MANIP'} && $ENV{'DATE_MANIP'} eq 'DM5') || + (defined $Date::Manip::Backend && $Date::Manip::Backend eq 'DM5')) { + $backend = 'Date::Manip::DM5'; + +} elsif ($] >= 5.010) { + $backend = 'Date::Manip::DM6'; + +} else { + $backend = 'Date::Manip::DM5'; +} + +my $backend_exp = $backend . "::EXPORT"; + +my $flag = eval "require $backend; $backend->import(); return 'loaded';"; +if (! $flag) { + die "ERROR LOADING MODULE: $backend"; +} + +{ + no strict 'refs'; + @EXPORT = @{ $backend_exp }; +} + +unshift (@ISA, $backend); + +1; +# Local Variables: +# mode: cperl +# indent-tabs-mode: nil +# cperl-indent-level: 3 +# cperl-continued-statement-offset: 2 +# cperl-continued-brace-offset: 0 +# cperl-brace-offset: 0 +# cperl-brace-imaginary-offset: 0 +# cperl-label-offset: 0 +# End: diff --git a/lib/Date/Manip.pod b/lib/Date/Manip.pod new file mode 100644 index 0000000..e8ead2f --- /dev/null +++ b/lib/Date/Manip.pod @@ -0,0 +1,321 @@ +# Copyright (c) 1995-2017 Sullivan Beck. All rights reserved. +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +=pod + +=head1 NAME + +Date::Manip - Date manipulation routines + +=head1 DESCRIPTION + +Date::Manip is a series of modules designed to make any common +date/time operation easy to do. Operations such as comparing two +times, determining a date a given amount of time from another, or +parsing international times are all easily done. It deals with time +as it is used in the Gregorian calendar (the one currently in use) +with full support for time changes due to daylight saving time. + +From the very beginning, the main focus of Date::Manip has been to be +able to do ANY desired date/time operation easily. Many other modules +exist which may do a subset of these operations quicker or more +efficiently, but no other module can do all of the operations +available in Date::Manip. + +Since many other date/time modules exist, some of which may do the +specific operation(s) you need faster, be sure to read +L before +deciding which of the Date and Time modules from CPAN is for you. +However, if you want one module to do it all, Date::Manip is the +one to use. + +Date::Manip has functionality to work with several fundamental types +of data. + +=over 4 + +=item B + +The word date is used extensively here and is somewhat misleading. In +Date::Manip, a date consists of three pieces of information: a +calendar date, a time of day, and time zone information. Calendar +dates and times are fully handled. Time zones are handled as well, but +depending on how you use Date::Manip, there may be some limitations as +discussed below. + +=item B + +A delta is an amount of time (i.e. the amount of time between two different +dates). A delta refers only to an amount of time. It includes no information +about a starting or ending date/time. Most people will think of a delta +as an amount of time, but the term 'time' is already used so much in this +module that I didn't want to use it here in order to avoid confusion. + +=item B + +A recurring event is something which occurs on a regular recurring +basis. + +=item B and B + +Holidays and events are basically named dates or recurrences. + +=back + +Among other things, Date::Manip allow you to: + +=over 4 + +=item B<*> + +Enter a date in practically any format you choose. + +=item B<*> + +Compare two dates, entered in widely different formats to determine +which is earlier. + +=item B<*> + +Extract any information you want from a date using a format string +similar to the Unix date command. + +=item B<*> + +Determine the amount of time between two dates, or add an amount of +time to a date to get a second date. + +=item B<*> + +Work with dates with dates using international formats (foreign month +names, 12/10/95 referring to October rather than December, etc.). + +=item B<*> + +To find a list of dates where a recurring event happens. + +=back + +Each of these tasks is trivial (one or two lines at most) with this package. + +=head1 HOW TO USE DATE::MANIP + +There are three different ways to use Date::Manip . There are three +interfaces (version 5 functional interface, version 6 functional, and +version 6 object-oriented). A complete description of each is +included in the L document. The recommended +(and the only one with access to the full functionality of the module) +is using the Object-Oriented interface. + +=head1 SEE ALSO + +Because Date::Manip performs so many operations, the documentation is +extensive. It includes the following documents: + +=head2 Information about the different interfaces + +Read this for a detailed description of each of the interfaces, +including information on how to choose and use the interface +best suited to your situation. + +=over 4 + +=item L + +A complete description of the functional interfaces available. NOTE: +it is recommended that you use the OO interface wherever possible +as the functional interfaces have some imitations. + +=back + +=head2 A description of the functional interfaces: + +=over 4 + +=item L + +The version 5 functional interface + +=item L + +The version 6 functional interface + +=back + +=head2 Objects and configuration + +An introduction to the Date::Manip classes used by the object-oriented +interface and how to configure them: + +=over 4 + +=item L + +An overview of the various Date::Manip modules, and how to use them. + +=item L + +Information for configuring Date::Manip + +=back + +=head2 Date::Manip object-oriented modules + +These are the modules for using the object-oriented interface. + +=over 4 + +=item L + +This is the base class. All other classes listed here inherit the +methods defined in this class. + +=item L + +A module for doing low-level date operations. + +=item L + +A module for working with time zones. + +=item L + +The module for working with dates. + +=item L + +The module for working with deltas (amount of time). + +=item L + +The module for working with recurrences (recurring dates). + +=back + +=head2 Timezone information + +=over 4 + +=item L + +Time zone abbreviations used in the version 5 interface. + +=item L + +Time zone data included in Date::Manip used in the version 6 +interfaces. + +=back + +=head2 Miscellaneous information: + +=over 4 + +=item L + +Detailed information on how date calculations are done. + +=item L + +Information on defining and using holidays and events. + +=item L + +A sample config file. + +=item L + +Information about the languages supported by Date::Manip and how +to add a new language. + +=item L + +=item L + +=item L + +=item L + +=item L + +=item L + +=item L + +=item L + +=item L + +=item L + +=item L + +=item L + +=item L + +=item L + +=item L + +=item L + +A description of the parseable words in each language currently +supported by Date::Manip. + +=back + +=head2 Information about the module and administrative things: + +=over 4 + +=item L + +Information on changes necessary to scripts when upgrading from +5.xx to 6.xx. + +=item L + +Change log for Date::Manip 5.xx + +=item L + +Differences between version 5.xx and 6.00 (including information +on upgrading); this contains more details than the Migration5to6 +document. + +=item L + +Change log for Date::Manip 6.xx + +=item L + +Miscellaneous information about Date::Manip (who should use it; +acknowledgments). + +=item L + +Musings on the history of Date::Manip written around it's +20th birthday. + +=item L + +Common problems and instructions for reporting bugs. + +=item L + +Examples of how to use Date::Manip. + +=back + +=head1 LICENSE + +This script is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=head1 AUTHOR + +Sullivan Beck (sbeck@cpan.org) + +=cut diff --git a/lib/Date/Manip/Base.pm b/lib/Date/Manip/Base.pm new file mode 100644 index 0000000..a8aae90 --- /dev/null +++ b/lib/Date/Manip/Base.pm @@ -0,0 +1,2475 @@ +package Date::Manip::Base; +# Copyright (c) 1995-2017 Sullivan Beck. All rights reserved. +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +############################################################################### +# Any routine that starts with an underscore (_) is NOT intended for +# public use. They are for internal use in the the Date::Manip +# modules and are subject to change without warning or notice. +# +# ABSOLUTELY NO USER SUPPORT IS OFFERED FOR THESE ROUTINES! +############################################################################### + +require 5.010000; +use strict; +use warnings; +use integer; +use utf8; +#use re 'debug'; + +use Date::Manip::Obj; +use Date::Manip::TZ_Base; +our @ISA = qw(Date::Manip::Obj Date::Manip::TZ_Base); + +use Encode qw(encode_utf8 from_to find_encoding decode _utf8_off _utf8_on is_utf8); +require Date::Manip::Lang::index; + +our $VERSION; +$VERSION='6.60'; +END { undef $VERSION; } + +############################################################################### +# BASE METHODS +############################################################################### + +sub _init { + my($self) = @_; + + $self->_init_cache(); + $self->_init_language(); + $self->_init_config(); + $self->_init_events(); + $self->_init_holidays(); + $self->_init_now(); + + return; +} + +# The base object has some config-independant information which is +# always reused, and only needs to be initialized once. +sub _init_cache { + my($self) = @_; + return if (exists $$self{'cache'}{'init'}); + $$self{'cache'}{'init'} = 1; + + # ly => {Y} = 0/1 1 if it is a leap year + # ds1_mon => {Y}{M} = N days since 1BC for Y/M/1 + # dow_mon => {Y}{M} = DOW day of week of Y/M/1 + + $$self{'cache'}{'ly'} = {}; + $$self{'cache'}{'ds1_mon'} = {}; + $$self{'cache'}{'dow_mon'} = {}; + + return; +} + +# Config dependent data. Needs to be reset every time the config is reset. +sub _init_data { + my($self,$force) = @_; + return if (exists $$self{'data'}{'calc'} && ! $force); + + $$self{'data'}{'calc'} = {}; # Calculated values + + return; +} + +# Initializes config dependent data +sub _init_config { + my($self,$force) = @_; + return if (exists $$self{'data'}{'sections'}{'conf'} && ! $force); + $self->_init_data(); + + # + # Set config defaults + # + + $$self{'data'}{'sections'}{'conf'} = + { + # Reset config, holiday lists, or events lists + + 'defaults' => '', + 'eraseholidays' => '', + 'eraseevents' => '', + + # Which language to use when parsing dates. + + 'language' => '', + + # 12/10 = Dec 10 (US) or Oct 12 (anything else) + + 'dateformat' => '', + + # Define the work week (1=monday, 7=sunday) + # + # These have to be predefined to avoid a bootstrap issue, but + # the true defaults are defined below. + + 'workweekbeg' => 1, + 'workweekend' => 5, + + # If non-nil, a work day is treated as 24 hours long + # (WorkDayBeg/WorkDayEnd ignored) + + 'workday24hr' => '', + + # Start and end time of the work day (any time format allowed, + # seconds ignored). If the defaults change, be sure to change + # the starting value of bdlength above. + + 'workdaybeg' => '', + 'workdayend' => '', + + # 2 digit years fall into the 100 year period given by [ CURR-N, + # CURR+(99-N) ] where N is 0-99. Default behavior is 89, but + # other useful numbers might be 0 (forced to be this year or + # later) and 99 (forced to be this year or earlier). It can + # also be set to 'c' (current century) or 'cNN' (i.e. c18 + # forces the year to bet 1800-1899). Also accepts the form + # cNNNN to give the 100 year period NNNN to NNNN+99. + + 'yytoyyyy' => '', + + # First day of the week (1=monday, 7=sunday). ISO 8601 says + # monday. + + 'firstday' => '', + + # If this is 0, use the ISO 8601 standard that Jan 4 is in week + # 1. If 1, make week 1 contain Jan 1. + + 'jan1week1' => '', + + # Date::Manip printable format + # 0 = YYYYMMDDHH:MN:SS + # 1 = YYYYHHMMDDHHMNSS + # 2 = YYYY-MM-DD-HH:MN:SS + + 'printable' => '', + + # If 'today' is a holiday, we look either to 'tomorrow' or + # 'yesterday' for the nearest business day. By default, we'll + # always look 'tomorrow' first. + + 'tomorrowfirst' => 1, + + # Used to set the current date/time/timezone. + + 'forcedate' => 0, + 'setdate' => 0, + + # Use this to set the default range of the recurrence. + + 'recurrange' => '', + + # Use this to set the default time. + + 'defaulttime' => 'midnight', + + # Whether or not to use a period as a time separator. + + 'periodtimesep' => 0, + + # How to parse mmm#### strings + + 'format_mmmyyyy' => '', + + # *** DEPRECATED *** + + 'tz' => '', + }; + + # + # Calculate delta field lengths + # + + # non-business + $$self{'data'}{'len'}{'yrlen'} = 365.2425; + $$self{'data'}{'len'}{'0'} = + { 'yl' => 31556952, # 365.2425 * 24 * 3600 + 'ml' => 2629746, # yl / 12 + 'wl' => 604800, # 6 * 24 * 3600 + 'dl' => 86400, # 24 * 3600 + }; + $self->_calc_workweek(); + + # + # Initialize some config variables that do some additional work. + # + + $self->_config_var('workday24hr', 1); + $self->_config_var('workdaybeg', '08:00:00'); + $self->_config_var('workdayend', '17:00:00'); + $self->_config_var('workday24hr', 0); + + $self->_config_var('dateformat', 'US'); + $self->_config_var('yytoyyyy', 89); + $self->_config_var('jan1week1', 0); + $self->_config_var('printable', 0); + $self->_config_var('firstday', 1); + $self->_config_var('workweekbeg', 1); + $self->_config_var('workweekend', 5); + $self->_config_var('language', 'english'); + $self->_config_var('recurrange', 'none'); + $self->_config_var('defaulttime', 'midnight'); + + # Set OS specific defaults + + my $os = $self->_os(); + + return; +} + +sub _calc_workweek { + my($self,$beg,$end) = @_; + + $beg = $self->_config('workweekbeg') if (! $beg); + $end = $self->_config('workweekend') if (! $end); + + $$self{'data'}{'len'}{'workweek'} = $end - $beg + 1; + + return; +} + +sub _calc_bdlength { + my($self) = @_; + + my @beg = @{ $$self{'data'}{'calc'}{'workdaybeg'} }; + my @end = @{ $$self{'data'}{'calc'}{'workdayend'} }; + + $$self{'data'}{'len'}{'bdlength'} = + ($end[0]-$beg[0])*3600 + ($end[1]-$beg[1])*60 + ($end[2]-$beg[2]); + + return; +} + +sub _init_business_length { + my($self) = @_; + + no integer; + my $x = $$self{'data'}{'len'}{'workweek'}; + my $y_to_d = $x/7 * 365.2425; + my $d_to_s = $$self{'data'}{'len'}{'bdlength'}; + my $w_to_d = $x; + + $$self{'data'}{'len'}{'1'} = { 'yl' => $y_to_d * $d_to_s, + 'ml' => $y_to_d * $d_to_s / 12, + 'wl' => $w_to_d * $d_to_s, + 'dl' => $d_to_s, + }; + + return; +} + +# Events and holidays are reset only when they are read in. +sub _init_events { + my($self,$force) = @_; + return if (exists $$self{'data'}{'events'} && ! $force); + + # {data}{sections}{events} = [ STRING, EVENT_NAME, ... ] + # + # {data}{events}{I}{type} = TYPE + # {name} = NAME + # TYPE: specified An event with a start/end date (only parsed once) + # {beg} = DATE_OBJECT + # {end} = DATE_OBJECT + # TYPE: ym + # {beg} = YM_STRING + # {end} = YM_STRING (only for YM;YM) + # {YEAR} = [ DATE_OBJECT, DATE_OBJECT ] + # TYPE: date An event specified by a date string and delta + # {beg} = DATE_STRING + # {end} = DATE_STRING (only for Date;Date) + # {delta} = DELTA_OBJECT (only for Date;Delta) + # {YEAR} = [ DATE_OBJECT, DATE_OBJECT ] + # TYPE: recur + # {recur} = RECUR_OBJECT + # {delta} = DELTA_OBJECT + # + # {data}{eventyears}{YEAR} = 0/1 + # {data}{eventobjs} = 0/1 + + $$self{'data'}{'events'} = {}; + $$self{'data'}{'sections'}{'events'} = []; + $$self{'data'}{'eventyears'} = {}; + $$self{'data'}{'eventobjs'} = 0; + + return; +} + +sub _init_holidays { + my($self,$force) = @_; + return if (exists $$self{'data'}{'holidays'} && ! $force); + + # {data}{sections}{holidays} = [ STRING, HOLIDAY_NAME, ... ] + # + # {data}{holidays}{init} = 1 if holidays have been initialized + # {ydone} = { Y => 1 } + # {yhols} = { Y => NAME => [Y,M,D] } + # {hols} = { NAME => Y => [Y,M,D] } + # {dates} = { Y => M => D => NAME } + # {defs} = [ NAME DEF NAME DEF ... ] + # NAME is the name of a holiday (it will + # be 'DMunnamed I' for the Ith unnamed + # holiday) + # DEF is a string or a Recur + # {data}{init_holidays} = 1 if currently initializing holidays + + $$self{'data'}{'holidays'} = {}; + $$self{'data'}{'sections'}{'holidays'} = []; + $$self{'data'}{'init_holidays'} = 0; + + return; +} + +sub _init_now { + my($self) = @_; + + # {'data'}{'now'} = { + # date => [Y,M,D,H,MN,S] now + # isdst => ISDST + # offset => [H,MN,S] + # abb => ABBREV + # + # force => 0/1 SetDate/ForceDate information + # set => 0/1 + # setsecs => SECS time (in secs since epoch) when + # SetDate was called + # setdate => [Y,M,D,H,MN,S] the date (IN GMT) we're calling + # now when SetDate was called + # + # tz => ZONE timezone we're working in + # systz => ZONE timezone of the system + # } + # + + $$self{'data'}{'now'} = {}; + $$self{'data'}{'now'}{'force'} = 0; + $$self{'data'}{'now'}{'set'} = 0; + $$self{'data'}{'tmpnow'} = []; + + return; +} + +# Language information only needs to be initialized if the language changes. +sub _init_language { + my($self,$force) = @_; + return if (exists $$self{'data'}{'lang'} && ! $force); + + $$self{'data'}{'lang'} = {}; # Current language info + $$self{'data'}{'rx'} = {}; # Regexps generated from language + $$self{'data'}{'words'} = {}; # Types of words in the language + $$self{'data'}{'wordval'} = {}; # Value of words in the language + + return; +} + +############################################################################### +# MAIN METHODS +############################################################################### + +sub leapyear { + my($self,$y) = @_; + $y += 0; + return $$self{'cache'}{'ly'}{$y} + if (exists $$self{'cache'}{'ly'}{$y}); + + $$self{'cache'}{'ly'}{$y} = 0, return 0 unless ($y % 4 == 0); + $$self{'cache'}{'ly'}{$y} = 1, return 1 unless ($y % 100 == 0); + $$self{'cache'}{'ly'}{$y} = 0, return 0 unless ($y % 400 == 0); + $$self{'cache'}{'ly'}{$y} = 1; + return 1; +} + +sub days_in_year { + my($self,$y) = @_; + return ($self->leapyear($y) ? 366 : 365); +} + +{ + my(@leap)=(31,29,31,30, 31,30,31,31, 30,31,30,31); + my(@nonl)=(31,28,31,30, 31,30,31,31, 30,31,30,31); + + sub days_in_month { + my($self,$y,$m) = @_; + + if ($m) { + return ($self->leapyear($y) ? $leap[$m-1] : $nonl[$m-1]); + } else { + return ($self->leapyear($y) ? @leap : @nonl); + } + } +} + +{ + # DinM = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) + my(@doy_days) = ( 0, 31, 59, 90,120,151,181,212,243,273,304,334,365); + + # Note: I tested storing both leap year and non-leap year days in + # a hash, but it was slightly slower. + + my($lyd,$n,$remain,$day,$y,$m,$d,$h,$mn,$s,$arg); + + sub day_of_year { + my($self,@args) = @_; + + no integer; + if ($#args == 1) { + + # $date = day_of_year($y,$day); + ($y,$n) = @args; + + $lyd = $self->leapyear($y); + $remain = ($n - int($n)); + $n = int($n); + + # Calculate the month and the day + for ($m=1; $m<=12; $m++) { + last if ($n<=($doy_days[$m] + ($m==1 ? 0 : $lyd))); + } + $d = $n-($doy_days[$m-1] + (($m-1)<2 ? 0 : $lyd)); + return [$y,$m,$d] if (! $remain); + + # Calculate the hours, minutes, and seconds into the day. + $remain *= 24; + $h = int($remain); + $remain = ($remain - $h)*60; + $mn = int($remain); + $remain = ($remain - $mn)*60; + $s = $remain; + + return [$y,$m,$d,$h,$mn,$s]; + + } else { + $arg = $args[0]; + @args = @$arg; + + ($y,$m,$d,$h,$mn,$s) = @args; + $lyd = $self->leapyear($y); + $lyd = 0 if ($m <= 2); + $day = ($doy_days[$m-1]+$d+$lyd); + return $day if ($#args==2); + + $day += ($h*3600 + $mn*60 + $s)/(24*3600); + return $day; + } + } +} + +sub days_since_1BC { + my($self,$arg) = @_; + + if (ref($arg)) { + my($y,$m,$d) = @$arg; + $y += 0; + $m += 0; + + if (! exists $$self{'cache'}{'ds1_mon'}{$y}{$m}) { + + if (! exists $$self{'cache'}{'ds1_mon'}{$y}{1}) { + + my($Ny,$N4,$N100,$N400,$cc,$yy); + + my $yyyy = "0000$y"; + + $yyyy =~ /(\d\d)(\d\d)$/o; + ($cc,$yy) = ($1,$2); + + # Number of full years since Dec 31, 1BC (starting at 0001) + $Ny = $y - 1; + + # Number of full 4th years (0004, 0008, etc.) since Dec 31, 1BC + $N4 = int($Ny/4); + + # Number of full 100th years (0100, 0200, etc.) + + $N100 = $cc + 0; + $N100-- if ($yy==0); + + # Number of full 400th years (0400, 0800, etc.) + $N400 = int($N100/4); + + $$self{'cache'}{'ds1_mon'}{$y}{1} = + $Ny*365 + $N4 - $N100 + $N400 + 1; + } + + my($i,$j); + my @mon = $self->days_in_month($y,0); + for ($i=2; $i<=12; $i++) { + $j = shift(@mon); + $$self{'cache'}{'ds1_mon'}{$y}{$i} = + $$self{'cache'}{'ds1_mon'}{$y}{$i-1} + $j; + } + } + + return ($$self{'cache'}{'ds1_mon'}{$y}{$m} + $d - 1); + + } else { + my($days) = $arg; + my($y,$m,$d); + + $y = int($days/$$self{'data'}{'len'}{'yrlen'})+1; + while ($self->days_since_1BC([$y,1,1]) > $days) { + $y--; + } + $m = 12; + while ( ($d=$self->days_since_1BC([$y,$m,1])) > $days ) { + $m--; + } + $d = ($days-$d+1); + return [$y,$m,$d]; + } +} + +sub day_of_week { + my($self,$date) = @_; + my($y,$m,$d) = @$date; + $y += 0; + $m += 0; + + my($dayofweek,$dec31) = (); + if (! exists $$self{'cache'}{'dow_mon'}{$y}{$m}) { + $dec31 = 7; # Dec 31, 1BC was Sunday + $$self{'cache'}{'dow_mon'}{$y}{$m} = + ( $self->days_since_1BC([$y,$m,1])+$dec31 ) % 7; + } + $dayofweek = ($$self{'cache'}{'dow_mon'}{$y}{$m}+$d-1) % 7; + $dayofweek = 7 if ($dayofweek==0); + return $dayofweek; +} + +# Can be the nth DoW of year or month (if $m given). Returns undef if +# the date doesn't exists (i.e. 5th Sunday in a month with only 4). +# +sub nth_day_of_week { + my($self,$y,$n,$dow,$m) = @_; + $y += 0; + $m = ($m ? $m+0 : 0); + + # $d is the current DoM (if $m) or DoY + # $max is the max value allowed for $d + # $ddow is the DoW of $d + + my($d,$max,$ddow); + + if ($m) { + $max = $self->days_in_month($y,$m); + $d = ($n<0 ? $max : 1); + $ddow = $self->day_of_week([$y,$m,$d]); + } else { + $max = $self->days_in_year($y); + $d = ($n<0 ? $max : 1); + if ($n<0) { + $d = $max; + $ddow = $self->day_of_week([$y,12,31]); + } else { + $d = 1; + $ddow = $self->day_of_week([$y,1,1]); + } + } + + # Find the first occurrence of $dow on or after $d (if $n>0) + # or the last occurrence of $dow on or before $d (if ($n<0); + + if ($dow < $ddow) { + $d += 7 - ($ddow-$dow); + } else { + $d += ($dow-$ddow); + } + $d -= 7 if ($d > $max); + + # Find the nth occurrence of $dow + + if ($n > 1) { + $d += 7*($n-1); + return undef if ($d > $max); + } elsif ($n < -1) { + $d -= 7*(-1*$n-1); + return undef if ($d < 1); + } + + # Return the date + + if ($m) { + return [$y,$m,$d]; + } + return $self->day_of_year($y,$d); +} + +{ + # Integer arithmetic doesn't work due to the size of the numbers. + no integer; + # my $sec_70 =($self->days_since_1BC([1970,1,1])-1)*24*3600; + my $sec_70 = 62135596800; + + # Using 'global' variables saves 4% + my($y,$m,$d,$h,$mn,$s,$sec,$sec_0,$tmp); + sub secs_since_1970 { + my($self,$arg) = @_; + + if (ref($arg)) { + ($y,$m,$d,$h,$mn,$s) = @$arg; + $sec_0 = ($self->days_since_1BC([$y,$m,$d])-1)*24*3600 + $h*3600 + + $mn*60 + $s; + $sec = $sec_0 - $sec_70; + return $sec; + + } else { + ($sec) = $arg; + $sec_0 = $sec_70 + $sec; + $tmp = int($sec_0/24/3600)+1; + my $ymd = $self->days_since_1BC($tmp); + ($y,$m,$d) = @$ymd; + $sec_0 -= ($tmp-1)*24*3600; + $h = int($sec_0/3600); + $sec_0 -= $h*3600; + $mn = int($sec_0/60); + $s = $sec_0 - $mn*60; + return [$y,$m,$d,$h,$mn,$s]; + } + } +} + +sub check { + my($self,$date) = @_; + my($y,$m,$d,$h,$mn,$s) = @$date; + + return 0 if (! $self->check_time([$h,$mn,$s]) || + $y<1 || $y>9999 || + $m<1 || $m>12); + + my $days = $self->days_in_month($y,$m); + + return 0 if ($d<1 || $d>$days); + return 1; +} + +sub check_time { + my($self,$hms) = @_; + my($h,$mn,$s) = @$hms; + + return 0 if ("$h:$mn:$s" !~ /^\d\d?:\d\d?:\d\d?$/o || + $h > 24 || $mn > 59 || $s > 59 || + ($h == 24 && ($mn || $s))); + return 1; +} + +sub week1_day1 { + my($self,$year) = @_; + my $firstday = $self->_config('firstday'); + return $self->_week1_day1($firstday,$year); +} + +sub _week1_day1 { + my($self,$firstday,$year) = @_; + my $jan1week1 = $self->_config('jan1week1'); + return $$self{'cache'}{'week1day1'}{$firstday}{$jan1week1}{$year} + if (exists $$self{'cache'}{'week1day1'}{$firstday}{$jan1week1}{$year}); + + # First week contains either Jan 4 (default) or Jan 1 + + my($y,$m,$d) = ($year,1,4); + $d = 1 if ($jan1week1); + + # Go back to the previous (counting today) $firstday + + my $dow = $self->day_of_week([$y,$m,$d]); + if ($dow != $firstday) { + $firstday = 0 if ($firstday == 7); + $d -= ($dow-$firstday); + if ($d<1) { + $y--; + $m = 12; + $d += 31; + } + } + + $$self{'cache'}{'week1day1'}{$firstday}{$jan1week1}{$year} = [ $y,$m,$d ]; + return [$y,$m,$d]; +} + +sub weeks_in_year { + my($self,$y) = @_; + my $firstday = $self->_config('firstday'); + return $self->_weeks_in_year($firstday,$y); +} + +sub _weeks_in_year { + my($self,$firstday,$y) = @_; + my $jan1week1 = $self->_config('jan1week1'); + return $$self{'cache'}{'wiy'}{$firstday}{$jan1week1}{$y} + if (exists $$self{'cache'}{'wiy'}{$firstday}{$jan1week1}{$y}); + + # Get the week1 day1 dates for this year and the next one. + my ($y1,$m1,$d1) = @{ $self->_week1_day1($firstday,$y) }; + my ($y2,$m2,$d2) = @{ $self->_week1_day1($firstday,$y+1) }; + + # Calculate the number of days between them. + my $diy = $self->days_in_year($y); + if ($y1 < $y) { + $diy += (32-$d1); + } else { + $diy -= ($d1-1); + } + if ($y2 < $y+1) { + $diy -= (32-$d2); + } else { + $diy += ($d2-1); + } + + $diy = $diy/7; + $$self{'cache'}{'wiy'}{$firstday}{$jan1week1}{$y} = $diy; + return $diy; +} + +sub week_of_year { + my($self,@args) = @_; + my $firstday = $self->_config('firstday'); + return $self->_week_of_year($firstday,@args); +} + +sub _week_of_year { + my($self,$firstday,@args) = @_; + my $jan1week1 = $self->_config('jan1week1'); + + if ($#args == 1) { + # (y,m,d) = week_of_year(y,w) + my($year,$w) = @args; + + return $$self{'cache'}{'woy1'}{$firstday}{$jan1week1}{$year}{$w} + if (exists $$self{'cache'}{'woy1'}{$firstday}{$jan1week1}{$year}{$w}); + + my $ymd = $self->_week1_day1($firstday,$year); + $ymd = $self->calc_date_days($ymd,($w-1)*7) if ($w > 1); + + $$self{'cache'}{'woy1'}{$firstday}{$jan1week1}{$year}{$w} = $ymd; + return $ymd; + } + + # (y,w) = week_of_year([y,m,d]) + my($y,$m,$d) = @{ $args[0] }; + + # Get the first day of the first week. If the date is before that, + # it's the last week of last year. + + my($y0,$m0,$d0) = @{ $self->_week1_day1($firstday,$y) }; + if ($y0==$y && $m==1 && $d<$d0) { + return($y-1,$self->_weeks_in_year($firstday,$y-1)); + } + + # Otherwise, we'll figure out how many days are between the two and + # divide by 7 to figure out how many weeks in it is. + + my $n = $self->day_of_year([$y,$m,$d]); + if ($y0<$y) { + $n += (32-$d0); + } else { + $n -= ($d0-1); + } + my $w = 1+int(($n-1)/7); + + # Make sure we're not into the first week of next year. + + if ($w>$self->_weeks_in_year($firstday,$y)) { + return($y+1,1); + } + return($y,$w); +} + +############################################################################### +# CALC METHODS +############################################################################### + +sub calc_date_date { + my($self,$date0,$date1) = @_; + + # Order them so date0 < date1 + # If $minus = 1, then the delta is negative + + my $minus = 0; + my $cmp = $self->cmp($date0,$date1); + + if ($cmp == 0) { + return [0,0,0]; + + } elsif ($cmp == 1) { + $minus = 1; + my $tmp = $date1; + $date1 = $date0; + $date0 = $tmp; + } + + my($y0,$m0,$d0,$h0,$mn0,$s0) = @$date0; + my($y1,$m1,$d1,$h1,$mn1,$s1) = @$date1; + + my $sameday = ($y0 == $y1 && $m0 == $m1 && $d0 == $d1 ? 1 : 0); + + # Handle the various cases. + + my($dh,$dm,$ds); + if ($sameday) { + ($dh,$dm,$ds) = @{ $self->_calc_hms_hms([$h0,$mn0,$s0],[$h1,$mn1,$s1]) }; + + } else { + # y0-m0-d0 h0:mn0:s0 -> y0-m0-d0 24:00:00 + # y1-m1-d1 h1:mn1:s1 -> y1-m1-d1 00:00:00 + + my $t1 = $self->_calc_hms_hms([$h0,$mn0,$s0],[24,0,0]); + my $t2 = $self->_calc_hms_hms([0,0,0],[$h1,$mn1,$s1]); + ($dh,$dm,$ds) = @{ $self->calc_time_time($t1,$t2) }; + + my $dd0 = $self->days_since_1BC([$y0,$m0,$d0]); + $dd0++; + my $dd1 = $self->days_since_1BC([$y1,$m1,$d1]); + $dh += ($dd1-$dd0)*24; + } + + if ($minus) { + $dh *= -1; + $dm *= -1; + $ds *= -1; + } + return [$dh,$dm,$ds]; +} + +sub calc_date_days { + my($self,$date,$n,$subtract) = @_; + my($y,$m,$d,$h,$mn,$s) = @$date; + my($ymdonly) = (defined $h ? 0 : 1); + + $n *= -1 if ($subtract); + my $d1bc = $self->days_since_1BC([$y,$m,$d]); + $d1bc += $n; + my $ymd = $self->days_since_1BC($d1bc); + + if ($ymdonly) { + return $ymd; + } else { + return [@$ymd,$h*1,$mn*1,$s*1]; + } +} + +sub calc_date_delta { + my($self,$date,$delta,$subtract) = @_; + my($y,$m,$d,$h,$mn,$s,$dy,$dm,$dw,$dd,$dh,$dmn,$ds) = (@$date,@$delta); + + ($y,$m,$d) = @{ $self->_calc_date_ymwd([$y,$m,$d], [$dy,$dm,$dw,$dd], + $subtract) }; + return $self->calc_date_time([$y,$m,$d,$h,$mn,$s],[$dh,$dmn,$ds],$subtract); +} + +sub calc_date_time { + my($self,$date,$time,$subtract) = @_; + my($y,$m,$d,$h,$mn,$s,$dh,$dmn,$ds) = (@$date,@$time); + + if ($ds > 59 || $ds < -59) { + $dmn += int($ds/60); + $ds = $ds % 60; + } + if ($dmn > 59 || $dmn < -59) { + $dh += int($dmn/60); + $dmn = $dmn % 60; + } + my $dd = 0; + if ($dh > 23 || $dh < -23) { + $dd = int($dh/24); + $dh = $dh % 24; + } + + # Handle subtraction + if ($subtract) { + $dh *= -1; + $dmn *= -1; + $ds *= -1; + $dd *= -1; + } + + if ($dd == 0) { + $y *= 1; + $m *= 1; + $d *= 1; + } else { + ($y,$m,$d) = @{ $self->calc_date_days([$y,$m,$d],$dd) }; + } + + $self->_mod_add(60,$ds,\$s,\$mn); + $self->_mod_add(60,$dmn,\$mn,\$h); + $self->_mod_add(24,$dh,\$h,\$d); + + if ($d<1) { + $m--; + $y--, $m=12 if ($m<1); + my $day_in_mon = $self->days_in_month($y,$m); + $d += $day_in_mon; + } else { + my $day_in_mon = $self->days_in_month($y,$m); + if ($d>$day_in_mon) { + $d -= $day_in_mon; + $m++; + $y++, $m=1 if ($m>12); + } + } + + return [$y,$m,$d,$h,$mn,$s]; +} + +sub _calc_date_time_strings { + my($self,$date,$time,$subtract) = @_; + my @date = @{ $self->split('date',$date) }; + return '' if (! @date); + my @time = @{ $self->split('time',$time) }; + + my @date2 = @{ $self->calc_date_time(\@date,\@time,$subtract) }; + + return $self->join('date',\@date2); +} + +sub _calc_date_ymwd { + my($self,$date,$ymwd,$subtract) = @_; + my($y,$m,$d,$h,$mn,$s) = @$date; + my($dy,$dm,$dw,$dd) = @$ymwd; + my($ymdonly) = (defined $h ? 0 : 1); + + $dd += $dw*7; + + if ($subtract) { + $y -= $dy; + $self->_mod_add(-12,-1*$dm,\$m,\$y); + $dd *= -1; + + } else { + $y += $dy; + $self->_mod_add(-12,$dm,\$m,\$y); + } + + my $dim = $self->days_in_month($y,$m); + $d = $dim if ($d > $dim); + + my $ymd; + if ($dd == 0) { + $ymd = [$y,$m,$d]; + } else { + $ymd = $self->calc_date_days([$y,$m,$d],$dd); + } + + if ($ymdonly) { + return $ymd; + } else { + return [@$ymd,$h,$mn,$s]; + } +} + +sub _calc_hms_hms { + my($self,$hms0,$hms1) = @_; + my($h0,$m0,$s0,$h1,$m1,$s1) = (@$hms0,@$hms1); + + my($s) = ($h1-$h0)*3600 + ($m1-$m0)*60 + $s1-$s0; + my($m) = int($s/60); + $s -= $m*60; + my($h) = int($m/60); + $m -= $h*60; + return [$h,$m,$s]; +} + +sub calc_time_time { + my($self,$time0,$time1,$subtract) = @_; + my($h0,$m0,$s0,$h1,$m1,$s1) = (@$time0,@$time1); + + if ($subtract) { + $h1 *= -1; + $m1 *= -1; + $s1 *= -1; + } + my($s) = (($h0+$h1)*60 + ($m0+$m1))*60 + $s0+$s1; + my($m) = int($s/60); + $s -= $m*60; + my($h) = int($m/60); + $m -= $h*60; + + return [$h,$m,$s]; +} + +############################################################################### + +# Returns -1 if date0 is before date1, 0 if date0 is the same as date1, and +# 1 if date0 is after date1. +# +sub cmp { + my($self,$date0,$date1) = @_; + return ($$date0[0] <=> $$date1[0] || + $$date0[1] <=> $$date1[1] || + $$date0[2] <=> $$date1[2] || + $$date0[3] <=> $$date1[3] || + $$date0[4] <=> $$date1[4] || + $$date0[5] <=> $$date1[5]); +} + +############################################################################### +# This determines the OS. + +sub _os { + my($self) = @_; + + my $os = ''; + + if ($^O =~ /MSWin32/io || + $^O =~ /Windows_95/io || + $^O =~ /Windows_NT/io + ) { + $os = 'Windows'; + + } elsif ($^O =~ /MacOS/io || + $^O =~ /MPE/io || + $^O =~ /OS2/io || + $^O =~ /NetWare/io + ) { + $os = 'Other'; + + } elsif ($^O =~ /VMS/io) { + $os = 'VMS'; + + } else { + $os = 'Unix'; + } + + return $os; +} + +############################################################################### +# Config variable functions + +# $self->config(SECT); +# Creates a new section (if it doesn't already exist). +# +# $self->config(SECT,'_vars'); +# Returns a list of (VAR VAL VAR VAL ...) +# +# $self->config(SECT,VAR,VAL); +# Adds (VAR,VAL) to the list. +# +sub _section { + my($self,$sect,$var,$val) = @_; + $sect = lc($sect); + + # + # $self->_section(SECT) creates a new section + # + + if (! defined $var && + ! exists $$self{'data'}{'sections'}{$sect}) { + if ($sect eq 'conf') { + $$self{'data'}{'sections'}{$sect} = {}; + } else { + $$self{'data'}{'sections'}{$sect} = []; + } + return ''; + } + + if ($var eq '_vars') { + return @{ $$self{'data'}{'sections'}{$sect} }; + } + + push @{ $$self{'data'}{'sections'}{$sect} },($var,$val); + return; +} + +# This sets a config variable. It also performs all side effects from +# setting that variable. +# +sub _config_var_base { + my($self,$var,$val) = @_; + + if ($var eq 'defaults') { + # Reset the configuration if desired. + $self->_init_config(1); + return; + + } elsif ($var eq 'eraseholidays') { + $self->_init_holidays(1); + return; + + } elsif ($var eq 'eraseevents') { + $self->_init_events(1); + return; + + } elsif ($var eq 'configfile') { + $self->_config_file($val); + return; + + } elsif ($var eq 'encoding') { + my $err = $self->_config_var_encoding($val); + return if ($err); + + } elsif ($var eq 'language') { + my $err = $self->_language($val); + return if ($err); + $err = $self->_config_var_encoding(); + return if ($err); + + } elsif ($var eq 'yytoyyyy') { + $val = lc($val); + if ($val ne 'c' && + $val !~ /^c\d\d$/o && + $val !~ /^c\d\d\d\d$/o && + $val !~ /^\d+$/o) { + warn "ERROR: [config_var] invalid: YYtoYYYY: $val\n"; + return; + } + + } elsif ($var eq 'workweekbeg') { + my $err = $self->_config_var_workweekbeg($val); + return if ($err); + + } elsif ($var eq 'workweekend') { + my $err = $self->_config_var_workweekend($val); + return if ($err); + + } elsif ($var eq 'workday24hr') { + my $err = $self->_config_var_workday24hr($val); + return if ($err); + + } elsif ($var eq 'workdaybeg') { + my $err = $self->_config_var_workdaybegend(\$val,'WorkDayBeg'); + return if ($err); + + } elsif ($var eq 'workdayend') { + my $err = $self->_config_var_workdaybegend(\$val,'WorkDayEnd'); + return if ($err); + + } elsif ($var eq 'firstday') { + my $err = $self->_config_var_firstday($val); + return if ($err); + + } elsif ($var eq 'tz' || + $var eq 'forcedate' || + $var eq 'setdate') { + # These can only be used if the Date::Manip::TZ module has been loaded + warn "ERROR: [config_var] $var config variable requires TZ module\n"; + return; + + } elsif ($var eq 'recurrange') { + my $err = $self->_config_var_recurrange($val); + return if ($err); + + } elsif ($var eq 'defaulttime') { + my $err = $self->_config_var_defaulttime($val); + return if ($err); + + } elsif ($var eq 'periodtimesep') { + # We have to redo the time regexp + delete $$self{'data'}{'rx'}{'time'}; + + } elsif ($var eq 'format_mmmyyyy') { + my $err = $self->_config_var_format_mmmyyyy($val); + return if ($err); + + } elsif ($var eq 'dateformat' || + $var eq 'jan1week1' || + $var eq 'printable' || + $var eq 'tomorrowfirst') { + # do nothing + + } else { + warn "ERROR: [config_var] invalid config variable: $var\n"; + return ''; + } + + $$self{'data'}{'sections'}{'conf'}{$var} = $val; + return; +} + +############################################################################### +# Specific config variable functions + +sub _config_var_encoding { + my($self,$val) = @_; + + if (! $val) { + $$self{'data'}{'calc'}{'enc_in'} = [ @{ $$self{'data'}{'enc'} } ]; + $$self{'data'}{'calc'}{'enc_out'} = 'UTF-8'; + + } elsif ($val =~ /^(.*),(.*)$/o) { + my($in,$out) = ($1,$2); + if ($in) { + my $o = find_encoding($in); + if (! $o) { + warn "ERROR: [config_var] invalid: Encoding: $in\n"; + return 1; + } + } + if ($out) { + my $o = find_encoding($out); + if (! $o) { + warn "ERROR: [config_var] invalid: Encoding: $out\n"; + return 1; + } + } + + if ($in && $out) { + $$self{'data'}{'calc'}{'enc_in'} = [ $in ]; + $$self{'data'}{'calc'}{'enc_out'} = $out; + + } elsif ($in) { + $$self{'data'}{'calc'}{'enc_in'} = [ $in ]; + $$self{'data'}{'calc'}{'enc_out'} = 'UTF-8'; + + } elsif ($out) { + $$self{'data'}{'calc'}{'enc_in'} = [ @{ $$self{'data'}{'enc'} } ]; + $$self{'data'}{'calc'}{'enc_out'} = $out; + + } else { + $$self{'data'}{'calc'}{'enc_in'} = [ @{ $$self{'data'}{'enc'} } ]; + $$self{'data'}{'calc'}{'enc_out'} = 'UTF-8'; + } + + } else { + my $o = find_encoding($val); + if (! $o) { + warn "ERROR: [config_var] invalid: Encoding: $val\n"; + return 1; + } + $$self{'data'}{'calc'}{'enc_in'} = [ $val ]; + $$self{'data'}{'calc'}{'enc_out'} = $val; + } + + if (! @{ $$self{'data'}{'calc'}{'enc_in'} }) { + $$self{'data'}{'calc'}{'enc_in'} = [ qw(utf-8 perl) ]; + } + + return 0; +} + +sub _config_var_recurrange { + my($self,$val) = @_; + + $val = lc($val); + if ($val =~ /^(none|year|month|week|day|all)$/o) { + return 0; + } + + warn "ERROR: [config_var] invalid: RecurRange: $val\n"; + return 1; +} + +sub _config_var_workweekbeg { + my($self,$val) = @_; + + if (! $self->_is_int($val,1,7)) { + warn "ERROR: [config_var] invalid: WorkWeekBeg: $val\n"; + return 1; + } + if ($val >= $self->_config('workweekend')) { + warn "ERROR: [config_var] WorkWeekBeg must be before WorkWeekEnd\n"; + return 1; + } + + $self->_calc_workweek($val,''); + $self->_init_business_length(); + return 0; +} + +sub _config_var_workweekend { + my($self,$val) = @_; + + if (! $self->_is_int($val,1,7)) { + warn "ERROR: [config_var] invalid: WorkWeekBeg: $val\n"; + return 1; + } + if ($val <= $self->_config('workweekbeg')) { + warn "ERROR: [config_var] WorkWeekEnd must be after WorkWeekBeg\n"; + return 1; + } + + $self->_calc_workweek('',$val); + $self->_init_business_length(); + return 0; +} + +sub _config_var_workday24hr { + my($self,$val) = @_; + + if ($val) { + $$self{'data'}{'sections'}{'conf'}{'workdaybeg'} = '00:00:00'; + $$self{'data'}{'sections'}{'conf'}{'workdayend'} = '24:00:00'; + $$self{'data'}{'calc'}{'workdaybeg'} = [0,0,0]; + $$self{'data'}{'calc'}{'workdayend'} = [24,0,0]; + + $self->_calc_bdlength(); + $self->_init_business_length(); + } + + return 0; +} + +sub _config_var_workdaybegend { + my($self,$val,$conf) = @_; + + # Must be a valid time. Entered as H, H:M, or H:M:S + + my $tmp = $self->split('hms',$$val); + if (! defined $tmp) { + warn "ERROR: [config_var] invalid: $conf: $$val\n"; + return 1; + } + $$self{'data'}{'calc'}{lc($conf)} = $tmp; + $$val = $self->join('hms',$tmp); + + # workdaybeg < workdayend + + my @beg = @{ $$self{'data'}{'calc'}{'workdaybeg'} }; + my @end = @{ $$self{'data'}{'calc'}{'workdayend'} }; + my $beg = $beg[0]*3600 + $beg[1]*60 + $beg[2]; + my $end = $end[0]*3600 + $end[1]*60 + $end[2]; + + if ($beg > $end) { + warn "ERROR: [config_var] WorkDayBeg not before WorkDayEnd\n"; + return 1; + } + + # Calculate bdlength + + $$self{'data'}{'sections'}{'conf'}{'workday24hr'} = 0; + + $self->_calc_bdlength(); + $self->_init_business_length(); + + return 0; +} + +sub _config_var_firstday { + my($self,$val) = @_; + + if (! $self->_is_int($val,1,7)) { + warn "ERROR: [config_var] invalid: FirstDay: $val\n"; + return 1; + } + + return 0; +} + +sub _config_var_defaulttime { + my($self,$val) = @_; + + if (lc($val) eq 'midnight' || + lc($val) eq 'curr') { + return 0; + } + warn "ERROR: [config_var] invalid: DefaultTime: $val\n"; + return 1; +} + +sub _config_var_format_mmmyyyy { + my($self,$val) = @_; + + if (lc($val) eq 'first' || + lc($val) eq 'last' || + lc($val) eq '') { + return 0; + } + warn "ERROR: [config_var] invalid: Format_MMMYYYY: $val\n"; + return 1; +} + +############################################################################### +# Language functions + +# This reads in a langauge module and sets regular expressions +# and word lists based on it. +# +no strict 'refs'; +sub _language { + my($self,$lang) = @_; + $lang = lc($lang); + + if (! exists $Date::Manip::Lang::index::Lang{$lang}) { + warn "ERROR: [language] invalid: $lang\n"; + return 1; + } + + return 0 if (exists $$self{'data'}{'sections'}{'conf'} && + $$self{'data'}{'sections'}{'conf'} eq $lang); + $self->_init_language(1); + + my $mod = $Date::Manip::Lang::index::Lang{$lang}; + eval "require Date::Manip::Lang::${mod}"; + if ($@) { + die "ERROR: failed to load Date::Manip::Lang::${mod}: $@\n"; + } + + no warnings 'once'; + $$self{'data'}{'lang'} = ${ "Date::Manip::Lang::${mod}::Language" }; + $$self{'data'}{'enc'} = [ @{ "Date::Manip::Lang::${mod}::Encodings" } ]; + + # Common words + $self->_rx_wordlist('at'); + $self->_rx_wordlist('each'); + $self->_rx_wordlist('last'); + $self->_rx_wordlist('of'); + $self->_rx_wordlist('on'); + $self->_rx_wordlists('when'); + + # Next/prev + $self->_rx_wordlists('nextprev'); + + # Field names (years, year, yr, ...) + $self->_rx_wordlists('fields'); + + # Numbers (first, 1st) + $self->_rx_wordlists('nth'); + $self->_rx_wordlists('nth','nth_dom',31); # 1-31 + $self->_rx_wordlists('nth','nth_wom',5); # 1-5 + + # Calendar names (Mon, Tue and Jan, Feb) + $self->_rx_wordlists('day_abb'); + $self->_rx_wordlists('day_char'); + $self->_rx_wordlists('day_name'); + $self->_rx_wordlists('month_abb'); + $self->_rx_wordlists('month_name'); + + # H:M:S separators + $self->_rx_simple('sephm'); + $self->_rx_simple('sepms'); + $self->_rx_simple('sepfr'); + + # Time replacement strings + $self->_rx_replace('times'); + + # Some offset strings + $self->_rx_replace('offset_date'); + $self->_rx_replace('offset_time'); + + # AM/PM strings + $self->_rx_wordlists('ampm'); + + # Business/non-business mode + $self->_rx_wordlists('mode'); + + return 0; +} +use strict 'refs'; + +# This takes a string or strings from the language file which is a +# regular expression and copies it to the regular expression cache. +# +# If the language file contains a list of strings, a list of strings +# is stored in the regexp cache. +# +sub _rx_simple { + my($self,$ele) = @_; + + if (exists $$self{'data'}{'lang'}{$ele}) { + if (ref($$self{'data'}{'lang'}{$ele})) { + @{ $$self{'data'}{'rx'}{$ele} } = @{ $$self{'data'}{'lang'}{$ele} }; + } else { + $$self{'data'}{'rx'}{$ele} = $$self{'data'}{'lang'}{$ele}; + } + } else { + $$self{'data'}{'rx'}{$ele} = undef; + } + + return; +} + +# We need to quote strings that will be used in regexps, but we don't +# want to quote UTF-8 characters. +# +sub _qe_quote { + my($string) = @_; + $string =~ s/([-.+*?])/\\$1/g; + return $string; +} + +# This takes a list of words and creates a simple regexp which matches +# any of them. +# +# The first word in the list is the default way to express the word using +# a normal ASCII character set. +# +# The second word in the list is the default way to express the word using +# a locale character set. If it isn't defined, it defaults to the first word. +# +sub _rx_wordlist { + my($self,$ele) = @_; + + if (exists $$self{'data'}{'lang'}{$ele}) { + my @tmp = @{ $$self{'data'}{'lang'}{$ele} }; + + $$self{'data'}{'wordlist'}{$ele} = $tmp[0]; + + my @tmp2; + foreach my $tmp (@tmp) { + push(@tmp2,_qe_quote($tmp)) if ($tmp); + } + @tmp2 = sort _sortByLength(@tmp2); + + $$self{'data'}{'rx'}{$ele} = join('|',@tmp2); + + } else { + $$self{'data'}{'rx'}{$ele} = undef; + } + + return; +} + +no strict 'vars'; +sub _sortByLength { + return (length $b <=> length $a); +} +use strict 'vars'; + +# This takes a hash of the form: +# word => string +# and creates a regular expression to match word (which must be surrounded +# by word boundaries). +# +sub _rx_replace { + my($self,$ele) = @_; + + if (! exists $$self{'data'}{'lang'}{$ele}) { + $$self{'data'}{'rx'}{$ele} = []; + return; + } + + my(@key) = keys %{ $$self{'data'}{'lang'}{$ele} }; + my $i = 1; + foreach my $key (sort(@key)) { + my $val = $$self{'data'}{'lang'}{$ele}{$key}; + my $k = _qe_quote($key); + $$self{'data'}{'rx'}{$ele}[$i++] = qr/(?:^|\b)($k)(?:\b|$)/i; + $$self{'data'}{'wordmatch'}{$ele}{lc($key)} = $val; + } + + @key = sort _sortByLength(@key); + @key = map { _qe_quote($_) } @key; + my $rx = join('|',@key); + + $$self{'data'}{'rx'}{$ele}[0] = qr/(?:^|\b)(?:$rx)(?:\b|$)/i; + + return; +} + +# This takes a list of values, each of which can be expressed in multiple +# ways, and gets a regular expression which matches any of them, a default +# way to express each value, and a hash which matches a matched string to +# a value (the value is 1..N where N is the number of values). +# +sub _rx_wordlists { + my($self,$ele,$subset,$max) = @_; + $subset = $ele if (! $subset); + + if (exists $$self{'data'}{'lang'}{$ele}) { + my @vallist = @{ $$self{'data'}{'lang'}{$ele} }; + $max = $#vallist+1 if (! $max || $max > $#vallist+1); + my (@all); + + for (my $i=1; $i<=$max; $i++) { + my @tmp = @{ $$self{'data'}{'lang'}{$ele}[$i-1] }; + $$self{'data'}{'wordlist'}{$subset}[$i-1] = $tmp[0]; + + my @str; + foreach my $str (@tmp) { + next if (! $str); + $$self{'data'}{'wordmatch'}{$subset}{lc($str)} = $i; + push(@str,_qe_quote($str)); + } + push(@all,@str); + + @str = sort _sortByLength(@str); + $$self{'data'}{'rx'}{$subset}[$i] = join('|',@str); + } + + @all = sort _sortByLength(@all); + $$self{'data'}{'rx'}{$subset}[0] = join('|',@all); + + } else { + $$self{'data'}{'rx'}{$subset} = undef; + } + + return; +} + +############################################################################### +# Year functions +# +# $self->_method(METHOD) use METHOD as the method for YY->YYYY +# conversions +# +# YEAR = _fix_year(YR) converts a 2-digit to 4-digit year +# _fix_year is in TZ_Base + +sub _method { + my($self,$method) = @_; + $self->_config('yytoyyyy',$method); + + return; +} + +############################################################################### +# $self->_mod_add($N,$add,\$val,\$rem); +# This calculates $val=$val+$add and forces $val to be in a certain +# range. This is useful for adding numbers for which only a certain +# range is allowed (for example, minutes can be between 0 and 59 or +# months can be between 1 and 12). The absolute value of $N determines +# the range and the sign of $N determines whether the range is 0 to N-1 +# (if N>0) or 1 to N (N<0). $rem is adjusted to force $val into the +# appropriate range. +# Example: +# To add 2 hours together (with the excess returned in days) use: +# $self->_mod_add(-24,$h1,\$h,\$day); +# To add 2 minutes together (with the excess returned in hours): +# $self->_mod_add(60,$mn1,\$mn,\$hr); +sub _mod_add { + my($self,$N,$add,$val,$rem)=@_; + return if ($N==0); + $$val+=$add; + if ($N<0) { + # 1 to N + $N = -$N; + if ($$val>$N) { + $$rem+= int(($$val-1)/$N); + $$val = ($$val-1)%$N +1; + } elsif ($$val<1) { + $$rem-= int(-$$val/$N)+1; + $$val = $N-(-$$val % $N); + } + + } else { + # 0 to N-1 + if ($$val>($N-1)) { + $$rem+= int($$val/$N); + $$val = $$val%$N; + } elsif ($$val<0) { + $$rem-= int(-($$val+1)/$N)+1; + $$val = ($N-1)-(-($$val+1)%$N); + } + } + + return; +} + +# $flag = $self->_is_int($string [,$low, $high]); +# Returns 1 if $string is a valid integer, 0 otherwise. If $low is +# entered, $string must be >= $low. If $high is entered, $string must +# be <= $high. It is valid to check only one of the bounds. +sub _is_int { + my($self,$N,$low,$high)=@_; + return 0 if (! defined $N or + $N !~ /^\s*[-+]?\d+\s*$/o or + defined $low && $N<$low or + defined $high && $N>$high); + return 1; +} + +############################################################################### +# Split/Join functions + +sub split { + my($self,$op,$string,$no_normalize) = @_; + $no_normalize = 0 if (! $no_normalize); + + if ($op eq 'date') { + + if ($string =~ /^(\d\d\d\d)(\d\d)(\d\d)(\d\d):(\d\d):(\d\d)$/o || + $string =~ /^(\d\d\d\d)\-(\d\d)\-(\d\d)\-(\d\d):(\d\d):(\d\d)$/o || + $string =~ /^(\d\d\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/o) { + my($y,$m,$d,$h,$mn,$s) = ($1+0,$2+0,$3+0,$4+0,$5+0,$6+0); + return [$y,$m,$d,$h,$mn,$s]; + } else { + return undef; + } + + } elsif ($op eq 'offset') { + if ($string =~ /^([-+]?\d\d)(\d\d)(\d\d)$/o || + $string =~ /^([-+]?\d\d)(\d\d)()$/o || + $string =~ /^([-+]?\d\d?):(\d\d?):(\d\d?)$/o || + $string =~ /^([-+]?\d\d?):(\d\d?)()$/o || + $string =~ /^([-+]?\d\d?)()()$/o) { + my($err,$h,$mn,$s) = $self->_offset_fields( { 'source' => 'string', + 'out' => 'list'}, + [$1,$2,$3]); + return undef if ($err); + return [$h,$mn,$s]; + } else { + return undef; + } + + } elsif ($op eq 'hms') { + if ($string =~ /^(\d\d)(\d\d)(\d\d)$/o || + $string =~ /^(\d\d)(\d\d)()$/o || + $string =~ /^(\d\d?):(\d\d):(\d\d)$/o || + $string =~ /^(\d\d?):(\d\d)()$/o || + $string =~ /^(\d\d?)()()$/o) { + my($err,$h,$mn,$s) = $self->_hms_fields( { 'out' => 'list' },[$1,$2,$3]); + return undef if ($err); + return [$h,$mn,$s]; + } else { + return undef; + } + + } elsif ($op eq 'time') { + if ($string =~ /^[-+]?\d+(:[-+]?\d+){0,2}$/o) { + my($err,$dh,$dmn,$ds) = $self->_time_fields( { 'nonorm' => $no_normalize, + 'source' => 'string', + 'sign' => -1, + }, [split(/:/,$string)]); + return undef if ($err); + return [$dh,$dmn,$ds]; + } else { + return undef; + } + + } elsif ($op eq 'delta' || $op eq 'business') { + my($err,@delta) = $self->_split_delta($string); + return undef if ($err); + + ($err,@delta) = $self->_delta_fields( { 'business' => + ($op eq 'business' ? 1 : 0), + 'nonorm' => $no_normalize, + 'source' => 'string', + 'sign' => -1, + }, [@delta]); + + return undef if ($err); + return [@delta]; + } +} + +sub join{ + my($self,$op,$data,$no_normalize) = @_; + my @data = @$data; + + if ($op eq 'date') { + + my($err,$y,$m,$d,$h,$mn,$s) = $self->_date_fields(@data); + return undef if ($err); + my $form = $self->_config('printable'); + if ($form == 1) { + return "$y$m$d$h$mn$s"; + } elsif ($form == 2) { + return "$y-$m-$d-$h:$mn:$s"; + } else { + return "$y$m$d$h:$mn:$s"; + } + + } elsif ($op eq 'offset') { + my($err,$h,$mn,$s) = $self->_offset_fields( { 'source' => 'list', + 'out' => 'string'}, + [@data]); + return undef if ($err); + return "$h:$mn:$s"; + + } elsif ($op eq 'hms') { + my($err,$h,$mn,$s) = $self->_hms_fields( { 'out' => 'string' },[@data]); + return undef if ($err); + return "$h:$mn:$s"; + + } elsif ($op eq 'time') { + my($err,$dh,$dmn,$ds) = $self->_time_fields( { 'nonorm' => $no_normalize, + 'source' => 'list', + 'sign' => 0, + }, [@data]); + return undef if ($err); + return "$dh:$dmn:$ds"; + + } elsif ($op eq 'delta' || $op eq 'business') { + my ($err,@delta) = $self->_delta_fields( { 'business' => + ($op eq 'business' ? 1 : 0), + 'nonorm' => $no_normalize, + 'source' => 'list', + 'sign' => 0, + }, [@data]); + return undef if ($err); + return join(':',@delta); + } +} + +sub _split_delta { + my($self,$string) = @_; + + my $sign = '[-+]?'; + my $num = '(?:\d+(?:\.\d*)?|\.\d+)'; + my $f = "(?:$sign$num)?"; + + if ($string =~ /^$f(:$f){0,6}$/o) { + $string =~ s/::/:0:/go; + $string =~ s/^:/0:/o; + $string =~ s/:$/:0/o; + my(@delta) = split(/:/,$string); + return(0,@delta); + } else { + return(1); + } +} + +# $opts = { business => 0/1, +# nonorm => 0/1, +# source => string, list +# sign => 0/1/-1 +# } +# $fields = [Y,M,W,D,H,Mn,S] +# +# This function formats the fields in a delta. +# +# If the business option is 1, treat it as a business delta. +# +# If the nonorm option is 1, fields are NOT normalized. By +# default, they are normalized. +# +# If source is 'string', then the source of the fields is splitting +# a delta (so we need to handle carrying the signs). If it's 'list', +# then the source is a valid delta, so each field is correctly signed +# already. +# +# If the sign option is 1, a sign is added to every field. If the +# sign option is -1, all negative fields are signed. If the sign +# option is 0, the minimum number of signs (for fields who's sign is +# different from the next higher field) will be added. +# +# It returns ($err,@fields) +# +sub _delta_fields { + my($self,$opts,$fields) = @_; + my @fields = @$fields; + no integer; + + # + # Make sure that all fields are defined, numerical, and that there + # are 7 of them. + # + + foreach my $f (@fields) { + $f=0 if (! defined($f)); + return (1) if ($f !~ /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/o); + } + return (1) if (@fields > 7); + while (@fields < 7) { + unshift(@fields,0); + } + + # + # Make sure each field is the correct sign so that the math will + # work correctly. Get rid of all positive signs and leading 0's. + # + + if ($$opts{'source'} eq 'string') { + + # if the source is splitting a delta, not all fields are signed, + # so we need to carry the negative signs. + + my $sign = '+'; + foreach my $f (@fields) { + if ($f =~ /^([-+])/o) { + $sign = $1; + } else { + $f = "$sign$f"; + } + $f *= 1; + } + + } else { + foreach my $f (@fields) { + $f *= 1; + } + } + + # + # Normalize them. Values will be signed only if they are + # negative. Handle fractional values. + # + + my $nonorm = $$opts{'nonorm'}; + foreach my $f (@fields) { + if ($f != int($f)) { + $nonorm = 0; + last; + } + } + + my($y,$m,$w,$d,$h,$mn,$s) = @fields; + if (! $nonorm) { + ($y,$m) = $self->_normalize_ym($y,$m) if ($y || $m); + ($m,$w) = $self->_normalize_mw($m,$w) if (int($m) != $m); + if ($$opts{'business'}) { + ($w,$d) = $self->_normalize_wd($w,$d,1) if (int($w) != $w); + ($d,$h,$mn,$s) = $self->_normalize_bus_dhms($d,$h,$mn,$s); + } else { + ($w,$d) = $self->_normalize_wd($w,$d,0) if ($w || $d); + ($d,$h) = $self->_normalize_dh($d,$h) if (int($d) != $d); + ($h,$mn,$s) = $self->_normalize_hms($h,$mn,$s); + } + } + + # + # Now make sure that the signs are included as appropriate. + # + + if (! $$opts{'sign'}) { + # Minimum number of signs + my $sign; + if ($y >= 0) { + $sign = '+'; + } else { + $sign = '-'; + } + foreach my $f ($m,$w,$d,$h,$mn,$s) { + if ($f > 0) { + if ($sign eq '-') { + $f = "+$f"; + $sign = '+'; + } + + } elsif ($f < 0) { + if ($sign eq '-') { + $f *= -1; + } else { + $sign = '-'; + } + } + } + + } elsif ($$opts{'sign'} == 1) { + # All fields signed + foreach my $f ($y,$m,$w,$d,$h,$mn,$s) { + $f = "+$f" if ($f > 0); + } + } + + return (0,$y,$m,$w,$d,$h,$mn,$s); +} + +# $opts = { out => string, list +# } +# $fields = [H,M,S] +# +# This function formats the fields in an HMS. +# +# If the out options is string, it prepares the fields to be joined (i.e. +# they are all 2 digits long). Otherwise, they are just numerical values +# (not necessarily 2 digits long). +# +# HH:MN:SS is always between 00:00:00 and 24:00:00. +# +# It returns ($err,@fields) +# +sub _hms_fields { + my($self,$opts,$fields) = @_; + my @fields = @$fields; + + # + # Make sure that all fields are defined, numerical (with no sign), + # and that there are 3 of them. + # + + foreach my $f (@fields) { + $f=0 if (! $f); + return (1) if ($f !~ /^\d+$/o); + } + return (1) if (@fields > 3); + while (@fields < 3) { + push(@fields,0); + } + + # + # Check validity. + # + + my ($h,$m,$s) = @fields; + return (1) if ($h > 24 || $m > 59 || $s > 59 || + ($h==24 && ($m > 0 || $s > 0))); + + # + # Format + # + + if ($$opts{'out'} eq 'list') { + foreach my $f ($h,$m,$s) { + $f *= 1; + } + + } else { + foreach my $f ($h,$m,$s) { + $f = "0$f" if (length($f)<2); + } + } + + return (0,$h,$m,$s); +} + +# $opts = { nonorm => 0/1, +# source => string, list +# sign => 0/1/-1 +# } +# $fields = [H,M,S] +# +# This function formats the fields in an amount of time measured in +# hours, minutes, and seconds. +# +# It is similar to how _delta_fields (above) works. +# +sub _time_fields { + my($self,$opts,$fields) = @_; + my @fields = @$fields; + + # + # Make sure that all fields are defined, numerical, and that there + # are 3 of them. + # + + foreach my $f (@fields) { + $f=0 if (! defined($f)); + return (1) if ($f !~ /^[+-]?\d+$/o); + } + return (1) if (@fields > 3); + while (@fields < 3) { + unshift(@fields,0); + } + + # + # Make sure each field is the correct sign so that the math will + # work correctly. Get rid of all positive signs and leading 0's. + # + + if ($$opts{'source'} eq 'string') { + + # If the source is splitting a string, not all fields are signed, + # so we need to carry the negative signs. + + my $sign = '+'; + foreach my $f (@fields) { + if ($f =~ /^([-+])/o) { + $sign = $1; + } else { + $f = "$sign$f"; + } + $f *= 1; + } + + } else { + foreach my $f (@fields) { + $f *= 1; + } + } + + # + # Normalize them. Values will be signed only if they are + # negative. + # + + my($h,$mn,$s) = @fields; + unless ($$opts{'nonorm'}) { + ($h,$mn,$s) = $self->_normalize_hms($h,$mn,$s); + } + + # + # Now make sure that the signs are included as appropriate. + # + + if (! $$opts{'sign'}) { + # Minimum number of signs + my $sign; + if ($h >= 0) { + $sign = '+'; + } else { + $sign = '-'; + } + foreach my $f ($mn,$s) { + if ($f > 0) { + if ($sign eq '-') { + $f = "+$f"; + $sign = '+'; + } + + } elsif ($f < 0) { + if ($sign eq '-') { + $f *= -1; + } else { + $sign = '-'; + } + } + } + + } elsif ($$opts{'sign'} == 1) { + # All fields signed + foreach my $f ($h,$mn,$s) { + $f = "+$f" if ($f > 0); + } + } + + return (0,$h,$mn,$s); +} + +# $opts = { source => string, list +# out => string, list +# } +# $fields = [H,M,S] +# +# This function formats the fields in a timezone offset measured in +# hours, minutes, and seconds. +# +# All offsets must be -23:59:59 <= offset <= 23:59:59 . +# +# The data comes from an offset in string or list format, and is +# formatted so that it can be used to create a string or list format +# output. +# +sub _offset_fields { + my($self,$opts,$fields) = @_; + my @fields = @$fields; + + # + # Make sure that all fields are defined, numerical, and that there + # are 3 of them. + # + + foreach my $f (@fields) { + $f=0 if (! defined $f || $f eq ''); + return (1) if ($f !~ /^[+-]?\d+$/o); + } + return (1) if (@fields > 3); + while (@fields < 3) { + push(@fields,0); + } + + # + # Check validity. + # + + my ($h,$m,$s) = @fields; + if ($$opts{'source'} eq 'string') { + # Values = -23 59 59 to +23 59 59 + return (1) if ($h < -23 || $h > 23 || + $m < 0 || $m > 59 || + $s < 0 || $s > 59); + } else { + # Values (-23,-59,-59) to (23,59,59) + # Non-zero values must have the same sign + if ($h >0) { + return (1) if ( $h > 23 || + $m < 0 || $m > 59 || + $s < 0 || $s > 59); + } elsif ($h < 0) { + return (1) if ($h < -23 || + $m < -59 || $m > 0 || + $s < -59 || $s > 0); + } elsif ($m > 0) { + return (1) if ( $m > 59 || + $s < 0 || $s > 59); + } elsif ($m < 0) { + return (1) if ($m < -59 || + $s < -59 || $s > 0); + } else { + return (1) if ($s < -59 || $s > 59); + } + } + + # + # Make sure each field is the correct sign so that the math will + # work correctly. Get rid of all positive signs and leading 0's. + # + + if ($$opts{'source'} eq 'string') { + + # In a string offset, only the first field is signed, so we need + # to carry negative signs. + + if ($h =~ /^\-/) { + $h *= 1; + $m *= -1; + $s *= -1; + } elsif ($m =~ /^\-/) { + $h *= 1; + $m *= 1; + $s *= -1; + } else { + $h *= 1; + $m *= 1; + $s *= 1; + } + + } else { + foreach my $f (@fields) { + $f *= 1; + } + } + + # + # Format them. They're already done for 'list' output. + # + + if ($$opts{'out'} eq 'string') { + my $sign; + if ($h<0 || $m<0 || $s<0) { + $h = abs($h); + $m = abs($m); + $s = abs($s); + $sign = '-'; + } else { + $sign = '+'; + } + + $h = "0$h" if (length($h) < 2); + $m = "0$m" if (length($m) < 2); + $s = "0$s" if (length($s) < 2); + $h = "$sign$h"; + } + + return (0,$h,$m,$s); +} + +# ($err,$y,$m,$d,$h,$mn,$s) = $self->_date_fields($y,$m,$d,$h,$mn,$s); +# +# Makes sure the fields are the right length. +# +sub _date_fields { + my($self,@fields) = @_; + return (1) if (@fields != 6); + + my($y,$m,$d,$h,$mn,$s) = @fields; + + $y = "0$y" while (length($y) < 4); + $m = "0$m" if (length($m)==1); + $d = "0$d" if (length($d)==1); + $h = "0$h" if (length($h)==1); + $mn = "0$mn" if (length($mn)==1); + $s = "0$s" if (length($s)==1); + + if (wantarray) { + return (0,$y,$m,$d,$h,$mn,$s); + } else { + return "$y$m$d$h:$mn:$s"; + } +} + +sub _normalize_ym { + my($self,$y,$m) = @_; + no integer; + + $m += $y*12; + $y = int($m/12); + $m -= $y*12; + + return ($y,$m); +} + +# This is only used for deltas with fractional months. +# +sub _normalize_mw { + my($self,$m,$w) = @_; + no integer; + + my $d = ($m-int($m)) * $$self{'data'}{'len'}{'yrlen'}/12; + $w += $d/7; + $m = int($m); + + return ($m,$w); +} + +sub _normalize_bus_dhms { + my($self,$d,$h,$mn,$s) = @_; + no integer; + + my $dl = $$self{'data'}{'len'}{'1'}{'dl'}; + + $s += $d*$dl + $h*3600 + $mn*60; + $d = int($s/$dl); + $s -= $d*$dl; + + $mn = int($s/60); + $s -= $mn*60; + $s = int($s); + + $h = int($mn/60); + $mn -= $h*60; + + return ($d,$h,$mn,$s); +} + +sub _normalize_hms { + my($self,$h,$mn,$s) = @_; + no integer; + + $s += $h*3600 + $mn*60; + $mn = int($s/60); + $s -= $mn*60; + $s = int($s); + + $h = int($mn/60); + $mn -= $h*60; + + return ($h,$mn,$s); +} + +# Business deltas only mix week and day if the week has a fractional +# part. +# +sub _normalize_wd { + my($self,$w,$d,$business) = @_; + no integer; + + my $weeklen = ($business ? $$self{'data'}{'len'}{'workweek'} : 7); + + $d += $w*$weeklen; + $w = int($d/$weeklen); + $d -= $w*$weeklen; + + return ($w,$d); +} + +# This is only done for non-business days with a fractional part. +# part. +# +sub _normalize_dh { + my($self,$d,$h) = @_; + no integer; + + $h += $d*24; + $d = int($h/24); + $h -= $d*24; + + return ($d,$h); +} + +# $self->_delta_convert(FORMAT,DELTA) +# This converts delta into the given format. Returns '' if invalid. +# +sub _delta_convert { + my($self,$format,$delta)=@_; + my $fields = $self->split($format,$delta); + return undef if (! defined $fields); + return $self->join($format,$fields); +} + +############################################################################### +# Timezone critical dates + +# NOTE: Although I would prefer to stick this routine in the +# Date::Manip::TZ module where it would be more appropriate, it must +# appear here as it will be used to generate the data that will be +# used by the Date::Manip::TZ module. +# +# This calculates a critical date based on timezone information. The +# critical date is the date (usually in the current time) at which +# the current timezone period ENDS. +# +# Input is: +# $year,$mon,$flag,$num,$dow +# This is information from the appropriate Rule line from the +# zoneinfo files. These are used to determine the date (Y/M/D) +# when the timezone period will end. +# $isdst +# Whether or not the next timezone period is a Daylight Saving +# Time period. +# $time,$timetype +# The time of day when the change occurs. The timetype can be +# 'w' (wallclock time in the current period), 's' (standard +# time which will match wallclock time in a non-DST period, or +# be off an hour in a DST period), and 'u' (universal time). +# +# Output is: +# $endUT, $endLT, $begUT, $begLT +# endUT is the actual last second of the current timezone +# period. endLT is the same time expressed in local time. +# begUT is the start (in UT) of the next time period. Note that +# the begUT date is the one which actually corresponds to the +# date/time specified in the input. begLT is the time in the new +# local time. The endUT/endLT are the time one second earlier. +# +sub _critical_date { + my($self,$year,$mon,$flag,$num,$dow, + $isdst,$time,$timetype,$stdoff,$dstoff) = @_; + + # + # Get the predicted Y/M/D + # + + my($y,$m,$d) = ($year+0,$mon+0,1); + + if ($flag eq 'dom') { + $d = $num; + + } elsif ($flag eq 'last') { + my $ymd = $self->nth_day_of_week($year,-1,$dow,$mon); + $d = $$ymd[2]; + + } elsif ($flag eq 'ge') { + my $ymd = $self->nth_day_of_week($year,1,$dow,$mon); + $d = $$ymd[2]; + while ($d < $num) { + $d += 7; + } + + } elsif ($flag eq 'le') { + my $ymd = $self->nth_day_of_week($year,-1,$dow,$mon); + $d = $$ymd[2]; + while ($d > $num) { + $d -= 7; + } + } + + # + # Get the predicted time and the date (not yet taking into + # account time type). + # + + my($h,$mn,$s) = @{ $self->split('hms',$time) }; + my $date = [ $y,$m,$d,$h,$mn,$s ]; + + # + # Calculate all the relevant dates. + # + + my($endUT,$endLT,$begUT,$begLT,$offset); + $stdoff = $self->split('offset',$stdoff); + $dstoff = $self->split('offset',$dstoff); + + if ($timetype eq 'w') { + $begUT = $self->calc_date_time($date,($isdst ? $stdoff : $dstoff), 1); + } elsif ($timetype eq 'u') { + $begUT = $date; + } else { + $begUT = $self->calc_date_time($date,$stdoff, 1); + } + + $endUT = $self->calc_date_time($begUT,[0,0,-1]); + $endLT = $self->calc_date_time($endUT,($isdst ? $stdoff : $dstoff)); + $begLT = $self->calc_date_time($begUT,($isdst ? $dstoff : $stdoff)); + + return ($endUT,$endLT,$begUT,$begLT); +} + +############################################################################### +# Get a list of strings to try to parse. + +sub _encoding { + my($self,$string) = @_; + my @ret; + + foreach my $enc (@{ $$self{'data'}{'calc'}{'enc_in'} }) { + if (lc($enc) eq 'utf-8') { + _utf8_on($string); + push(@ret,$string) if is_utf8($string, 1); + } elsif (lc($enc) eq 'perl') { + push(@ret,encode_utf8($string)); + } else { + my $tmp = $string; + _utf8_off($tmp); + $tmp = encode_utf8(decode($enc, $tmp)); + _utf8_on($tmp); + push(@ret,$tmp) if is_utf8($tmp, 1);; + } + } + + return @ret; +} + +1; +# Local Variables: +# mode: cperl +# indent-tabs-mode: nil +# cperl-indent-level: 3 +# cperl-continued-statement-offset: 2 +# cperl-continued-brace-offset: 0 +# cperl-brace-offset: 0 +# cperl-brace-imaginary-offset: 0 +# cperl-label-offset: 0 +# End: diff --git a/lib/Date/Manip/Base.pod b/lib/Date/Manip/Base.pod new file mode 100644 index 0000000..4eb09f5 --- /dev/null +++ b/lib/Date/Manip/Base.pod @@ -0,0 +1,469 @@ +# Copyright (c) 1995-2017 Sullivan Beck. All rights reserved. +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +=pod + +=head1 NAME + +Date::Manip::Base - Base methods for date manipulation + +=head1 SYNOPSIS + + use Date::Manip::Base; + $dmb = new Date::Manip::Base; + +=head1 DESCRIPTION + +The Date::Manip package of modules consists of several modules +for doing high level date operations with full error checking +and a lot of flexibility. + +The high level operations, though intended to be used in most +situations, have a lot of overhead associated with them. As such, a +number of the most useful low level routines (which the high level +routines use to do much of the real work) are included in this module +and are available directly to users. + +These low level routines are powerful enough that they can be used +independent of the high level routines and perform useful (though much +simpler) operations. They are also significantly faster than the high +level routines. + +These routines do NO error checking on input. Invalid data will result +in meaningless results. If you need error checking, you must call the +higher level Date::Manip routines instead of these. + +These routines also ignore all effects of time zones and daylight +saving time. One way to think of these routines is working with times +and dates in the GMT time zone. + +=head1 BASE METHODS + +This class inherits several base methods from the L +class. Please refer to the documentation for that class for a +description of those methods. + +=over 4 + +=item B + +=item B + +=item B + +Please refer to the L documentation for these methods. + +=item B + + $dmb->config($var1,$val1,$var2,$val2,...); + +This will set the value of any configuration variable. Please refer to the +L manual for a list of all configuration variables and their +description. + +=back + +=head1 DATE METHODS + +In all of the following methods, the following variables are used: + +=over 4 + +=item B<$date> + +This is a list reference containing a full date and time: + + [$y, $m, $d, $h, $mn, $s] + +=item B<$ymd> + +A list reference containing only the date portion: + + [$y, $m, $d] + +=item B<$hms> + +A list reference containing only the time portion: + + [$h, $mn, $s] + +=item B<$time> + +A list reference containing an amount of time: + + [$dh, $dmn, $ds] + +=item B<$delta> + +A list containing a full delta: + + [$dy, $dm, $dw, $dd, $dh, $dmn, $ds] + +=item B<$offset> + +A list containing a time zone expressed as an offset: + + [ $offh, $offm, $offs ] + +=back + +In all of the above, the elements C<($y, $m, $d, $h, $mn, $s)> are all +numeric. In most of the routines described below, no error checking is +done on the input. C<$y> should be between 1 and 9999, C<$m> between 1 and +12, C<$d> between 1 and 31, C<$h> should be between 0 and 23, C<$mn> and C<$s> +between 0 and 59. + +C<$hms> can be between 00:00:00 and 24:00:00, but an C<$offset> must be +between -23:59:59 and +23:59:59. + +Years are not translated to 4 digit years, so passing in a year of +"04" will be equivalent to "0004", NOT "2004". + +The elements C<($dy, $dm, $dw, $dd, $dh, $dmn, $ds)> are all numeric, +but can be positive or negative. They represent an elapsed amount +of time measured in years, months, weeks, etc. + +Since no error checking is done, passing in C<($y,$m,$d) = (2004,2,31)> +will NOT trigger an error, even though February does not have 31 days. +Instead, some meaningless result will be returned. + +=over 4 + +=item B + +=item B + +=item B + +=item B + +=item B + +These are all routines for doing simple date and time calculations. +As mentioned above, they ignore all affects of time zones and daylight +saving time. + +The following methods are available: + + $time = $dmb->calc_date_date($date1,$date2); + +This take two dates and determine the amount of time between them. + + $date = $dmb->calc_date_days($date,$n [,$subtract]); + $ymd = $dmb->calc_date_days($ymd,$n [,$subtract]); + +This returns a date C<$n> days later (if C<$nE0>) or earlier (if C<$nE0>) +than the date passed in. If C<$subtract> is passed in, the sign of C<$n> is reversed. + + $date = $dmb->calc_date_delta($date,$delta [,$subtract]); + +This take a date and add the given delta to it (or subtract the delta +if C<$subtract> is non-zero). + + $date = $dmb->calc_date_time($date,$time [,$subtract]); + +This take a date and add the given time to it (or subtract the time +if C<$subtract> is non-zero). + + $time = $dmb->calc_time_time(@time1,@time2 [,$subtract]); + +This take two times and add them together (or subtract the second from +the first if C<$subtract> is non-zero). + +=item B + +=item B + + $valid = $dmb->check($date); + $valid = $dmb->check_time($hms); + +This tests a list of values to see if they form a valid date or time +ignoring all time zone affects. The date/time would be valid in GMT, +but perhaps not in all time zones. + +1 is returned if the the fields are valid, 0 otherwise. + +C<$hms> is in the range 00:00:00 to 24:00:00. + +=item B + + $flag = $dmb->cmp($date1,$date2); + +Returns -1, 0, or 1 if date1 is before, the same as, or after date2. + +=item B + + $day = $dmb->day_of_week($date); + $day = $dmb->day_of_week($ymd); + +Returns the day of the week (1 for Monday, 7 for Sunday). + +=item B + + $day = $dmb->day_of_year($ymd); + $day = $dmb->day_of_year($date); + +In the first case, returns the day of the year (1 to 366) for C<($y, $m, $d)>. +In the second case, it returns a fractional day (1.0 <= C<$day> < 366.0 or +1.0 <= C<$day> < 367.0 for a leap-year). For example, day 1.5 +falls on Jan 1, at noon. The somewhat non-intuitive answer (1.5 +instead of 0.5) is to make the two forms return numerically equivalent +answers for times of 00:00:00 . You can look at the integer part of +the number as being the day of the year, and the fractional part of +the number as the fraction of the day that has passed at the given +time. + +The inverse operations can also be done: + + $ymd = $dmb->day_of_year($y,$day); + $date = $dmb->day_of_year($y,$day); + +If C<$day> is an integer, the year, month, and day is returned. If C<$day> +is a floating point number, it returns the year, month, day, hour, +minutes, and decimal seconds. + +C<$day> must be greater than or equal to 1 and less than 366 on non-leap years +or 367 on leap years. + +=item B + + $days = $dmb->days_in_month($y,$m); + +Returns the number of days in the month. + + @days = $dmb->days_in_month($y,0); + +Returns a list of 12 elements with the days in each month of the year. + +=item B + + $days = $dmb->days_in_year($y); + +Returns the number of days in the year (365 or 366) + +=item B + + $days = $dmb->days_since_1BC($date); + $days = $dmb->days_since_1BC($ymd); + +Returns the number of days since Dec 31, 1BC. Since the calendar has +changed a number of times, the number returned is based on the current +calendar projected backwards in time, and in no way reflects a true +number of days since then. As such, the result is largely meaningless, +except when called twice as a means of determining the number of days +separating two dates. + +The inverse operation is also available: + + $ymd = $dmb->days_since_1BC($days); + +Returns the date C<$days> since Dec 31, 1BC. So day 1 is Jan 1, 0001. + +=item B + + $flag = $dmb->leapyear($y); + +Returns 1 if the argument is a leap year. Originally copied from code +written by David Muir Sharnoff. + +=item B + + $ymd = $dmb->nth_day_of_week($y,$n,$dow); + +Returns the C<$n>th occurrence of C<$dow> (1 for Monday, 7 for Sunday) in the +year. C<$n> must be between 1 and 53 or -1 through -53. + + $ymd = $dmb->nth_day_of_week($y,$n,$dow,$m); + +Returns the C<$n>th occurrence of C<$dow> in the given month. C<$n> must be between +1 and 5 or it can be -1 through -5. + +In all cases, nothing is returned if C<$n> is beyond the last actual +result (i.e. the 5th Sunday in a month with only four Sundays). + +=item B + + $secs = $dmb->secs_since_1970($date); + +Returns the number of seconds since Jan 1, 1970 00:00:00 (negative if date is +earlier). + + $date = $dmb->secs_since_1970($secs); + +Translates number of seconds into a date. + +=item B + +=item B + +The split and join functions are used to take a string containing a common +type of time data and split it into a list of fields. The join function takes +the list and forms it into a string. + +Rudimentary error checking is performed with both of these functions +and undef is returned in the case of any error. No error checking is done +on the specific values. + +The following are allowed: + + $date = $dmb->split("date",$string); + $string = $dmb->join("date",$date); + +This splits a string containing a date or creates one from a list reference. +The string split must be of one of the forms: + + YYYYMMDDHH:MN:SS + YYYYMMDDHHMNSS + YYYY-MM-DD-HH:MN:SS + +The string formed by join is one of the above, depending on the value of +the Printable config variable. The default format is YYYYMMDDHH:MN:SS, +but if Printable is set to 1, YYYYMMDDHHMNSS is produced, and if Printable +is set to 2, the YYYY-MM-DD-HH:MN:SS form is produced. + + $hms = $dmb->split("hms",$string); + $string = $dmb->join("hms",$hms); + +This works with the hours, minutes, and seconds portion of a date. + +When splitting a string, the string can be of any of the forms: + + H + H:MN + H:MN:SS + HH + HHMN + HHMNSS + +Here, H is a 1 or 2 digit representation of the hours. All other fields are +two digit representations. + +The string formed by the join function will always be of the form HH:MN:SS. + +The time must be between 00:00:00 and 24:00:00. + + $offset = $dmb->split("offset",$string); + $string = $dmb->join("offset",$offset); + +An offset string should have a sign (though it is optional if it is +positive) and is any of the forms: + + +H + +H:MN + +H:MN:SS + +HH + +HHMN + +HHMNSS + +Here, H is a 1 or 2 digit representation of the hours. All other fields are +two digit representations. + +The string formed by the join function will always be of the form ++HH:MN:SS. + +The offset must be between -23:59:59 and +23:59:59 . + + $time = $dmb->split("time",$string [,$no_normalize]); + $string = $dmb->join("time",$time [,$no_normalize]); + +This works with an amount of time in hours, minutes, and seconds. The +string is of the format: + + +H:MN:S + +where all signs are optional. The returned value (whether a list reference +from the split function, or a string from the join function) will have +all fields normalized unless C<$no_normalize> is passed in. + + $delta = $dmb->split("delta",$string [,$no_normalize]); + $delta = $dmb->split("business",$string [,$no_normalize]); + + $string = $dmb->join("delta",$delta [,$no_normalize]); + $string = $dmb->join("business",$delta [,$no_normalize]); + +Both of these split a string containing a delta, or create a string +containing one. The difference is whether the delta is treated as +a business or non-business delta (see L documentation +for a detailed description). + +The string that can be split is of the form: + + +Y:M:+W:+D:H:MN:S + +All signs are optional in the string being split. The string +produced is of the form +Y:M:+W:D:H:MN:S (for a non-business +delta) or +Y:M:+W:+D:H:MN:S (for a business delta). + +Fields may be omitted entirely. For example: + + D:H:MN:S + D:::S + +are both valid. + +The string or list output is normalized unless L<$no_normalize> is passed +in. + +=item B + + $ymd = $dmb->week1_day1($y); + +This returns the date of the 1st day of the 1st week in the given year. +Note that this uses the ISO 8601 definition of week, so the year returned +may be the year before the one passed in. + +This uses the FirstDay and Jan1Week1 config variables to evaluate the +results. + +=item B + + $w = $dmb->weeks_in_year($y); + +This returns the number of ISO 8601 weeks in the year. It will always be +52 or 53. + +=item B + + ($y,$w) = $dmb->week_of_year($date); + ($y,$w) = $dmb->week_of_year($ymd); + +This returns the week number (1-53) of the given date and the year +that it falls in. Since the ISO 8601 definition of a week is used, the +year returned is not necessarily the one passed in (it may differ for +the first or last week of the year). + +The inverse operation is also available: + + $ymd = $dmb->week_of_year($y,$w); + +which returns the first day of the given week. + +This uses the FirstDay and Jan1Week1 config variables to evaluate the +results. + +=back + +=head1 KNOWN BUGS + +None known. + +=head1 BUGS AND QUESTIONS + +Please refer to the L documentation for +information on submitting bug reports or questions to the author. + +=head1 SEE ALSO + +L - main module documentation + +=head1 LICENSE + +This script is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=head1 AUTHOR + +Sullivan Beck (sbeck@cpan.org) + +=cut diff --git a/lib/Date/Manip/Calc.pod b/lib/Date/Manip/Calc.pod new file mode 100644 index 0000000..c504087 --- /dev/null +++ b/lib/Date/Manip/Calc.pod @@ -0,0 +1,795 @@ +# Copyright (c) 1995-2017 Sullivan Beck. All rights reserved. +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +=pod + +=head1 NAME + +Date::Manip::Calc - describes date calculations + +=head1 SYNOPSIS + +Two objects (both of which are either L or +L objects) may be used to creates a third object +based on those two. + + $delta = $date->calc($date2 [,$subtract] [,$mode]); + + $date2 = $date->calc($delta [,$subtract]); + $date2 = $delta->calc($date1 [,$subtract]); + + $delta3 = $delta1->calc($delta2 [,$subtract] [,$no_normalize]); + +=head1 DESCRIPTION + +This document describes the different types of calculations that can be +done using dates and deltas. Date calculations are much more complicated +than they initially appear, so this document is fairly large. + +The complication in date calculations is due to the fact that it is +impossible to express some parts of a delta as an exact length. Some +examples will illustrate this: + +As an example, let's take two dates and determine how much time elapsed +between them: + + Nov 3 2016 11:00:00 + Dec 5 2016 12:00:00 + + Elapsed time: 770 hours + +There are several ways to describe the time that elapsed. The first way +is to give the difference exactly. This is the exact delta. + +An exact delta is always described in terms of hours, minutes, and seconds. + +The problem with this is that we don't think in terms of exact deltas. +We think in terms which cannot be expressed exactly. + +For example, most people would look at those two dates and think: + + Percieved: 1 month, 2 days, 1 hour + +But the two dates: + + Feb 3 2016 11:00:00 + Mar 5 2016 12:00:00 + + Elapsed time: 745 hours + Perceived: 1 month, 2 days, 1 hour + +Some fields in a delta do not have an exact length. A year is usually +365 days long, but sometimes it is 366. A month might be 28, 29, 30, +or 31 days long. + +Perhaps the most unexpected difficulty is that days are not of +constant length. Most people would define a day as 24 hours, but when +you take daylight saving time into account that definition produces +unexpected results. The following calculation illustrates this: + + Nov 5, 2011 02:30 EDT + + 24 hour + + Result: Nov 6, 2011 01:30 EST + +This immediately causes most people to redefine a day as the amount of time +between the same wallclock time. For example, the amount of time between noon +one day and noon the next (regardless of daylight saving time changes). + +This definition doesn't work either. For example: + + Mar 12, 2011 02:30 EST + + 1 day (same time next day) + + Result: Mar 13 02:30 EST + +But that date does not exist! Neither does: + + Result: Mar 13 02:30 EDT + +An alternate calculation could be: + + Nov 5, 2011 01:30 EDT + + 1 day (same time next day) + + Result: Nov 6, 01:30 EDT + Result: Nov 6, 01:30 EST + +Both of those results exist. Which result did you mean? The first +one is probably correct (since it is 24 hours later), but an hour +later, you will have the same clock time again. + +So, the same time next day definition doesn't work at all for some +dates (during a 'spring forward' type daylight saving time transition) +and is ambiguous for others (during a 'fall back' type daylight saving +time transition). + +Calculations involving exact deltas are unambiguous in all cases. + +A second class of delta is called a semi-exact delta, and these add +days (and weeks) to the delta, and treats days as a "same time next day" +at all times except the two cases where the resulting date falls in the +period where a daylight saving time transition is occuring. Then it +falls back to the 24 hour definition. + +A final class of delta is an approximate delta which includes all of +the fields (years and months). This allows Date::Manip to handle +deltas in a way that is consistent with how most people perceive the +elapsed time. It should be noted that there is some uncertaintly +there as not everyone's definition of how a delta is perceived is the +same, but in general, they should be closer to what most people think +of. + +=head1 TYPES OF CALCULATIONS + +This document describes the different types of calculations. +Calculations involve two types of Date::Manip objects: dates and +deltas. These are described in the L and +L manuals respectively. + +Two objects (two dates, two deltas, or one of each) are used. In all +cases, if a second object is not passed in, undef is returned. + +There are 3 types of calculations: + +=over 4 + +=item B + +A calculation involving 2 dates is used to determine the amount of time (the +delta) between them. + + $delta = $date1->calc($date2 [,$subtract] [,$mode]); + +Two dates can be worked with and a delta will be produced which is +the amount of time between the two dates. + +C<$date1> and C<$date2> are L objects with valid dates. +The L object returned is the amount of time between +them. If C<$subtract> is not passed in (or is 0), the delta produced +is: + + DELTA = DATE2 - DATE1 + +If C<$subtract> is non-zero, the delta produced is: + + DELTA = DATE1 - DATE2 + +The C<$subtract> argument has special importance when doing approximate +calculations, and this is described below. + +If either date is invalid, a delta object will be returned which +has an error associated with it. + +The C<$mode> argument describes the type of delta that is produced and +is described below in L. + +=item B + +Date/delta calculations can be performed using either a L +or L object as the primary object: + + $date2 = $date1->calc($delta [,$subtract]); + $date2 = $delta->calc($date1 [,$subtract]); + +A date and delta can be combined to yield a date that is the +given amount of time before or after it. + +C<$date1> and C<$delta> are L and L +objects respectively. A new L object is produced. +If either C<$date1> or C<$delta> are invalid, the new date object will have +an error associated with it. + +Both of the calls above perform the same function and produce exactly the +same results. + +If C<$subtract> is not passed in, or is 0, the resulting date is +formed as: + + DATE2 = DATE1 + DELTA + +If C<$subtract> is non-zero, the resulting date is: + + DATE2 = DATE1 - DELTA + +The C<$subtract> argument has special importance when doing approximate +calculations, and this is described below in L. + +=item B + +Delta/delta calculations can be performed to add two amounts of time +together, or subtract them. + + $delta3 = $delta1->calc($delta2 [,$subtract] [,$no_normalize]); + +If C<$subtract> is not passed in, or is 0, the resulting delta formed +is: + + DELTA3 = DELTA1 + DELTA2 + +If C<$subtract> is non-zero, then the resulting delta is: + + DELTA3 = DELTA1 - DELTA2 + +C<$delta1> and C<$delta2> are valid L objects, and a new +L object is produced. + +C<$no_normalize> can be the string 'nonormalize' or a non-zero value (in +which case $subtract MUST be entered, even if it is 0). + +=back + +=head1 MODE + +Date::Manip calculations can be divided into two different categories: +business and non-business; and within those are three sub-categories: +exact, semi-exact, and approximate. + +=over 4 + +=item B + +A business calculation is one where the length of the day is +determined by the length of the work day, and only business days +(i.e. days in which business is conducted) count. Holidays and +weekends are omitted (though there is some flexibility in defining +what exactly constitutes the work week as described in the +L manual). This is described in more detail below +in L. + +A non-business mode calculation is the normal type of calculation +where no days are ignored, and all days are full length. + +=item B + +An exact calculation is one in which the delta used (or produced) is +an exact delta. An exact delta is described in more detail in the +L manual, but the short explanation is that it is +a delta which only involves fields of an exactly known length (hours, +minutes, and seconds). Business deltas also include days in the exact +part. The value of all other fields in the delta will be zero. + +A semi-exact calculation is one in which the deltas used (or produced) +is a semi-exact delta. This is also described in the +L manual, but the short explanation is that it +includes days and weeks (for standard calculations) or weeks (for +business calculations) in addition to the exact fields. A semi-exact +day is defined as the same clock time on two successive days. So noon +to noon is 1 day (even though it may not be exactly 24 hours due to a +daylight saving time transition). A week is defined as 7 days. This +is described in more detail below. + +An approximate calculation is one in which the deltas used (or +produced) are approximate, and may include any of the fields. + +=back + +In date-delta and delta-delta calculations, the mode of the +calculation will be determined automatically by the delta. In the case +of date-date calculations, the mode is supplied as an argument. + +=over 4 + +=item B + +When doing a date-date calculation, the following call is used: + + $delta = $date1->calc($date2 [,$subtract] [,$mode]); + +C<$mode> defaults to "exact". The delta produced will be be either a +business or non-business delta; exact, semi-exact, or approximate, as +specified by C<$mode>. + +Currently, the possible values that $mode can have are: + + exact : an exact, non-business calculation + semi : a semi-exact, non-business calculation + approx : an approximate, non-business calculation + + business : an exact, business calculation + bsemi : a semi-exact, business calculation + bapprox : an approximate, business calculation + +=item B + +When doing calculations of a date and a delta: + + $date2 = $date1->calc($delta [,$subtract]); + $date2 = $delta->calc($date1 [,$subtract]); + +the mode is not passed in. It is determined exclusively by the +delta. If C<$delta> is a business delta, A business calculation is +done. If C<$delta> is a non-business delta, a non-business calculation +will be done. + +The C<$delta> will also be classified as exact, semi-exact, or approximate +based on which fields are non-zero. + +=item B + +When doing calculations with two deltas: + + $delta3 = $delta1->calc($delta2 [,$subtract]); + +the mode is not passed in. It is determined by the two deltas. + +If both deltas are business mode, or both are non-business mode, a +new delta will be produced of the same type. + +It one of the deltas is a business mode and the other is not, the +resulting delta will have an error condition since there is no +direct correlation between the two types of deltas. Even though +it would be easy to add the two together, it would be impossible +to come up with a result that is meaningful. + +If both deltas are exact, semi-exact, or approximate, the resulting +delta is the same. If one delta is approximate and one is not, then +the resulting delta is approximate. It is NOT treated as an error. +Likewise, if one is semi-exact and the other exact, a semi-exact delta +is produced. + +=back + +=head1 TIMEZONE CONSIDERATIONS + +=over 4 + +=item B + +When doing a business calculation, both dates must be in the same time +zone or an error is produced. + +For non-business calculations, when calculating the difference between +two dates in different time zones, C<$date2> will be converted to the +same timezone as C<$date1> and the returned date will be in this +timezone. + +=item B + +When adding a delta to a date, the resulting date will be in the same +time zone as the original date. + +=item B + +No timezone information applies. + +=back + +It should also be noted that daylight saving time considerations are +currently ignored when doing business calculations. In common usage, +daylight saving time changes occurs outside of the business day, so +the business day length is constant. As a result, daylight saving +time is ignored. + +=head1 BUSINESS MODE CONSIDERATIONS + +In order to correctly do business mode calculations, a config file +should exist which contains the section defining holidays (otherwise, +weekends will be ignored, but all other days will be counted as +business days). This is documented below, and in the +L section of the documentation. Some config +variables (namely WorkWeekBeg, WorkWeekEnd, WorkDayBeg, WorkDayEnd, +and WorkDay24Hr) defined the length of the work week and work day. + +If the workday is defined as 08:00 to 18:00, a work week consisting of +Mon-Sat, and the standard (American) holidays, then from Tuesday at +12:00 to the following Monday at 14:00 is 5 days and 2 hours. If the +"end" of the day is reached in a calculation, it automatically +switches to the next day. So, Tuesday at 12:00 plus 6 hours is +Wednesday at 08:00 (provided Wed is not a holiday). Also, a date that +is not during a workday automatically becomes the start of the next +workday. So, Sunday 12:00 and Monday at 03:00 both automatically +becomes Monday at 08:00 (provided Monday is not a holiday). + +Note that a business week is treated the same as an exact week +(i.e. from Tuesday to Tuesday, regardless of holidays). Because this +means that the relationship between days and weeks is NOT unambiguous, +when a semi-exact delta is produced from two dates, it will be in +terms of d/h/mn/s (i.e. no week field). + +Anyone using business mode is going to notice a few quirks about it +which should be explained. When I designed business mode, I had in +mind what a business which promises 1 business day turnaround really +means. + +If you do a business calculation (with the workday set to 9:00-17:00), +you will get the following: + + Saturday at noon + 1 business day = Tuesday at 9:00 + Saturday at noon - 1 business day = Friday at 9:00 + +What does this mean? + +As an example, say I use a business that works 9-5 and they have a +drop box so I can drop things off over the weekend and they promise 1 +business day turnaround. If I drop something off Friday night, +Saturday, or Sunday, it doesn't matter. They're going to get started +on it Monday morning. It'll be 1 business day to finish the job, so +the earliest I can expect it to be done is around 17:00 Monday or 9:00 +Tuesday morning. Unfortunately, there is some ambiguity as to what +day 17:00 really falls on, similar to the ambiguity that occurs when +you ask what day midnight falls on. Although it's not the only +answer, Date::Manip treats midnight as the beginning of a day rather +than the end of one. In the same way, 17:00 is equivalent to 9:00 the +next day and any time the date calculations encounter 17:00, it +automatically switch to 9:00 the next day. Although this introduces +some quirks, I think this is justified. I also think that it is the +way most people think of it. If I drop something off first thing +Monday morning, I would expect to pick it up first thing Tuesday if +there is 1 business day turnaround. + +Equivalently, if I want a job to be finished on Saturday (despite the fact +that I cannot pick it up since the business is closed), I have to drop it +off no later than Friday at 9:00. That gives them a full business day to +finish it off. Of course, I could just as easily drop it off at 17:00 +Thursday, or any time between then and 9:00 Friday. Again, it's a matter +of treating 17:00 as ambiguous. + +So Saturday + 1 business day = Tuesday at 9:00 (which means anything +from Monday 17:00 to Tuesday 9:00), but Monday at 9:01 + 1 business +day = Tuesday at 9:01 which is unambiguous. + +It should be noted that when adding years, months, and weeks, +the business day is ignored. Once they've been added, the resulting +date is forced to be a business time (i.e. it moves to the start of +the next business day if it wasn't one already) before proceeding with +the days, hours, minutes, and seconds part. + +=head1 EXACT, SEMI-EXACT, AND APPROXIMATE DATE/DELTA CALCULATIONS + +This section contains more details about exactly how exact, semi-exact, +and approximate calculations are performed for date/delta calculations. + +All calculations make use of some exact quantities, including: + + 1 year = 12 months + 1 week = 7 days + 1 hour = 60 minutes + 1 minute = 60 seconds + +This leaves two relationships which are not exact: + + 1 month = ? days + 1 day = ? hours + +For non-business calculations, a day is usually 24 hours long. Due to +daylight saving time transitions which might make a day be 23 or 25 hours +long (or in some cases, some other length), the relation is not exact. +Whenever possible, a day is actually measured as the same time on +two days (i.e. Tuesday at noon to Wednesday at noon) even if that +period is not precisely 24 hours. For business calculations, a days +length is determined by the length of the work day and is known +exactly. + +Exact calculations involve ONLY quantities of time with a known length, +so there is no ambiguity in them. + +Approximate and semi-exact calculations involve variable length fields, +and so they must be treated specially. + +In order to do an approximate or semi-exact calculation, the delta is +added to a date in pieces, where the fields in each piece have an +exact and known relationship. + +For a non-business calculation, a calculation occurs in the following +steps: + + year/month fields added + week/day fields added + hour/minute/second fields added + +For a business calculation, the steps are: + + year/month fields added + week field added + day field added + hour/minute/second fields added + +After each step, a valid date must be present, or it will be adjusted +before proceeding to the next step. Note however that for business +calculations, the first step must produce a valid date, but not +necessarily a business date. The second step will produce a valid +business date. + +A series of examples will illustrate this. + +=over 4 + +=item B + + date = Mar 31 2001 at 12:00:00 + delta = 1 year, 1 month, 1 day, 1 hour + +First, the year/month fields are added without modifying any other field. +This would produce: + + Apr 31, 2002 at 12:00 + +which is not valid. Any time the year/month fields produce a day past +the end of the month, the result is 'truncated' to the last day of the +month, so this produces: + + Apr 30, 2002 at 12:00 + +Next the week/day fields are added producing: + + May 1, 2002 at 12:00 + +and finally, the exact fields (hour/minute/second) are added to produce: + + May 1, 2002 at 13:00 + +=item B + +Assuming a normal Monday-Friday work week from 8:00 - 17:00: + + date = Wed, Nov 23, 2011 at 12:00 + delta = 1 week, 1 day, 1 hour + +First, the week field is added: + + Wed, Nov 30, 2011 at 12:00 + +Then the day field is added: + + Thu, Dec 1, 2011 at 12:00 + +Then the exact fields are added: + + Thu, Dec 1, 2011 at 13:00 + +=item B + +In America, Jul 4 is a holiday, so Mon, Jul 4, 2011 is not a work day. + + date = Mon, Jun 27, 2011 at 12:00 + delta = 1 week, 1 day, 1 hour + +First, the week field is added: + + Mon, Jul 4, 2011 at 12:00 + +Since that is not a work day, it immediately becomes: + + Tue, Jul 5, 2011 at 8:00 + +Then the day field is added: + + Wed, Jul 6, 2011 at 8:00 + +and finally the remaining fields: + + Wed, Jul 6, 2011 at 9:00 + +=item B + +In the America/New_York timezone (Eastern time), on November 6, 2011, +the following time change occurred: + + 2011-11-06 02:00 EDT => 2011-11-06 01:00 EST + +Three simple calculations illustrate how this is handled: + + date = 2011-11-05 02:30 EDT + delta = 1 day + +Adding the day produces: + + 2011-11-06 02:30 EDT + +which is valid, so that is the result. + +Similarly: + + date = 2011-11-07 02:30 EST + delta = -1 day + +produces: + + 2011-11-06 02:30 EST + +which is valid. + +Finally: + + date = 2011-11-05 02:30 EDT + delta = 2 days + +produces: + + 2011-11-07 02:30 EST + +The calculation will preserve the savings time where possible so the +resulting day will have the same offset from UTC. If that is not +possible, but the resulting day is valid in the other offset, that +will be used instead. + +=item B + +In the America/New_York timezone (Eastern time), on March 13, +the following time change occurred: + + 2011-03-13 02:00 EST => 2011-03-13 03:00 EDT + +In this case, a calculation may produce an invalid date. + + date = 2011-03-12 02:30 EST + delta = 1 day + +produces: + + 2011-03-13 02:30 EST + +This is not valid. Neither is: + + 2011-03-13 02:30 EDT + +In this case, the calculation will be redone converting days to 24-hour +periods, so the calculation becomes: + + date = 2011-03-12 02:30 EST + delta = 24 hours + +which will produce a valid date: + + 2011-03-13 03:30 EDT + +=back + +=head1 EXACT, SEMI-EXACT, AND APPROXIMATE DATE/DATE CALCULATIONS + +This section contains more details about exactly how exact, semi-exact, +and approximate calculations are performed for date/date calculations. + +When calculating the delta between two dates, the delta may take +different forms depending on the mode passed in. An exact calculation +will produce a delta which included only exact fields. A semi-exact calculation +may produce a semi-exact delta, and an approximate calculation may produce +an approximate delta. Note that if the two dates are close enough together, +an exact delta will be produced (even if the mode is semi-exact or approximate), +or it may produce a semi-exact delta in approximate mode. + +For example, the two dates "Mar 12 1995 12:00" and "Apr 13 1995 12:00" +would have an exact delta of "744 hours", and a semi-exact delta of +"31 days". It would have an approximate delta of "1 month 1 day". + +Two dates, "Mar 31 12:00" and "Apr 30 12:00" would have deltas "720 +hours" (exact), "30 days" (semi-exact) or "1 month" (approximate). + +Approximate mode is a more human way of looking at things (you'd say 1 +month and 2 days more often then 33 days), but it is less meaningful +in terms of absolute time. + +One thing to remember is that an exact delta is exactly the amount of +time that has passed, including all effects of daylight saving +time. Semi-exact and approximate deltas usually ignore the affects of +daylight saving time. + +=head1 SUBTRACTION + +In exact and semi-exact calculations, and in delta-delta calculations, +the the C<$subtract> argument is easy to understand. When working +with an approximate delta however (either when adding an approximate +delta to a date, or when taking two dates to get an approximate +delta), there is a degree of uncertainty in how the calculation is +done, and the $subtract argument is used to specify exactly how the +approximate delta is to be use. An example illustrates this quite +well. + +If you take the date Jan 4, 2000 and subtract a delta of "1 month 1 +week" from it, you end up with Nov 27, 1999 (Jan 4, 2000 minus 1 month +is Dec 4, 1999; minus 1 week is Nov 27, 1999). But Nov 27, 1999 plus a +delta of "1 month 1 week" is Jan 3, 2000 (Nov 27, 1999 plus 1 month is +Dec 27, 1999; plus 1 week is Jan 3, 2000). + +In other words the approximate delta (but NOT the exact or semi-exact +delta) is different depending on whether you move from earlier date to +the later date, or vice versa. And depending on what you are +calculating, both are useful. + +In order to resolve this, the C<$subtract> argument can take on the values +0, 1, or 2, and have different meanings. + +=over 4 + +=item B<$subtract in approximate date-date calculations> + +In the call: + + $delta = $date1->calc($date2,$subtract,"approx"); + +if C<$subtract> is 0, the resulting delta can be added to C<$date1> to get +C<$date2>. Obviously C<$delta> may still be negative (if C<$date2> comes before +C<$date1>). + +If C<$subtract> is 1, the resulting delta can be subtracted from C<$date1> +to get C<$date2> (the deltas from these two are identical except for having +an opposite sign). + +If C<$subtract> is 2, the resulting delta can be added to C<$date2> to get +C<$date1>. In other words, the following are identical: + + $delta = $date1->calc($date2,2,"approx"); + $delta = $date2->calc($date1,"approx"); + +=item B<$subtract in approximate date-delta calculations> + +In the call: + + $date2 = $date1->calc($delta,$subtract); + +If C<$subtract> is 0, the resulting date is determined by adding C<$delta> to +C<$date1>. + +If C<$subtract> is 1, the resulting date is determined by subtracting C<$delta> +from C<$date1>. + +If C<$subtract> is 2, the resulting date is the date which C<$delta> +can be added to to get C<$date1>. + +For business mode calculations, C<$date1> will first be adjusted to be a valid +work day (if it isn't already), so this may lead to non-intuitive results. + +In some cases, it is impossible to do a calculation with C<$subtract> = 2. +As an example, if the date is "Dec 31" and the delta is "1 month", there +is no date which you can add "1 month" to to get "Dec 31". When this occurs, +the date returned has an error flag. + +=back + +=head1 APPROXIMATE DATE/DATE CALCULATION + +There are two different ways to look at the approximate delta between +two dates. + +In Date::Manip 5.xx, the approximate delta between the two dates: + + Jan 10 1996 noon + Jan 7 1998 noon + +was 1:11:4:0:0:0:0 (or 1 year, 11 months, 4 weeks). In calculating +this, the first date was adjusted as far as it could go towards the +second date without going past it with each unit starting with the +years and ending with the seconds. + +This gave a strictly positive or negative delta, but it isn't +actually how most people would think of the delta. + +As of Date::Manip 6.0, the delta is 2:0:0:-3:0:0:0 (or 2 years minus +3 days). Although this leads to mixed-sign deltas, it is actually how +more people would think about the delta. It has the additional +advantage of being easier to calculate. + +For non-business mode calculations, the year/month part of the +approximate delta will move a date from the year/month of the first +date into the year/month of the second date. The remainder of the +delta will adjust the days/hours/minutes/seconds as appropriate. + +For approximate business mode calculations, the year, date, and week +parts will be done approximately, and the remainder will be done +exactly. + +=head1 KNOWN BUGS + +None known. + +=head1 BUGS AND QUESTIONS + +Please refer to the L documentation for +information on submitting bug reports or questions to the author. + +=head1 SEE ALSO + +L - main module documentation + +=head1 LICENSE + +This script is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=head1 AUTHOR + +Sullivan Beck (sbeck@cpan.org) + +=cut diff --git a/lib/Date/Manip/Changes5.pod b/lib/Date/Manip/Changes5.pod new file mode 100644 index 0000000..5d33252 --- /dev/null +++ b/lib/Date/Manip/Changes5.pod @@ -0,0 +1,1924 @@ +# Copyright (c) 1995-2017 Sullivan Beck. All rights reserved. +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +=pod + +=head1 NAME + +Date::Manip::Changes5 - changes in Date::Manip 5.xx + +=head1 SYNOPSIS + +This describes the changes made to the Date::Manip module up to the +time that 6.00 was released. Because 6.00 required a newer version +of perl (5.10 or higher), the old version was maintained. + +When Date::Manip 6.10 was released, both versions were bundled +together (though how it was bundled changed when 6.14 was released). + +This document describes all changes made to the old version of +Date::Manip. + +For the most part, Date::Manip has remained backward compatible at +every release, but occasionally, a change is made which is backward +incompatible. These are marked with an exclamation mark (!). + +=head1 VERSION 5.66 (Released with 6.51) + +=over 4 + +=item Fixed a bug in Date_ConvTZ + +Applied a patch supplied by Zhenyi Zhou which fixes a bug in Date_ConvTZ +where passing in an empty string did not work. + +=back + +=head1 VERSION 5.65 (Released with 6.37) + +As of December 2012, Version 5 of Date::Manip will no longer be modified. +The 5.xx version was updated to 5.65 (but no changes were made), and this +version is expected to be the final release in the 5.xx series. + +The one exception is that if someone submits a patch that applies cleanly +and causes zero failures in the test suite, I will consider adding it on +a case-by-cast bases. + +Please use Date::Manip 6.xx instead. + +=head1 VERSION 5.64 (Released with 6.32) + +=over 4 + +=item Better handling of '0000' timezone + +Applied a patch supplied by Ed Avis that improves handling of the '0000' timezone.. + +=back + +=head1 VERSION 5.63 (Released with 6.26) + +=over 4 + +=item Fixed business mode calculation + +Applied a patch that I received some time ago to fix a business +mode calculation. Steve Tempest + +=back + +=head1 VERSION 5.62 (Released with 6.21) + +No changes + +=head1 VERSION 5.61 (Released with 6.20) + +No changes + +=head1 VERSION 5.60 (Released with 6.14) + +=over 4 + +=item B + +As of Date::Manip 6.14, the 5.xx release is fully integrated into the +distribution. Both will be installed automatically and you can switch +between them (if you have a recent version of perl). This simplifies +the package management process considerably. The downside is that +Date::Manip 6.xx will be installed, even if you do not have a recent +version of perl and cannot use it. + +=back + +=head1 VERSION 5.59 (Released with 6.12) + +=over 4 + +=item Test fixes + +Fix tests to work better on windows. + +=back + +=head1 VERSION 5.58 (Released with 6.11) + +=over 4 + +=item Test fixes + +Fixed a bug in some of the tests that were causing two tests to +fail. JD + +Explicitly set TZ in all tests to avoid some failures (it got left out +of a few when it was bundled with 6.10). + +=back + +=head1 VERSION 5.57 (Released with 6.10) + +=over 4 + +=item B<(*) Combined 5.xx and 6.xx> + +As of 6.10, Date-Manip-6.xx will contain both the Date::Manip 5.xx and +6.xx modules. If perl 5.10 or higher is available, the 6.xx version +will be installed. For older versions of perl, the 5.xx version will +be installed. + +This will allow all of the automatic module tools to work correctly. + +=item Bug fixes + +Fixed a bug where years earlier than 1000 AD failed in +calculations. John + +=item Time zone fixes + +Improved time zone detection. Stepan Kasal + +=item Documentation fixes + +Minor improvements. Josef Kreulich + +=back + +=head1 VERSION 5.56 (2010-02-24) + +=over 4 + +=item Bug fixes + +Date_PrevWorkDay and documentation fix. RT #17005 + +I accidentally included a require 5.10 which made Date::Manip not work +with earlier versions of perl. Nicholas Riley + +=back + +=head1 VERSION 5.55 (2010-02-22) + +=over 4 + +=item B<(*) Added time zone abbreviations> + +Date::Manip 5.xx now includes all of the time zone abbreviations from +version 6.xx (i.e. all of the abbreviations from the Olsen database). + +=item Documentation fixes + +Typo fix. ddascalescu + +=back + +=head1 VERSION 5.54 (2008-05-09) + +=over 4 + +=item Released + +=back + +=head1 VERSION 5.53 (DEVELOPMENT) + +=over 4 + +=item Bug fixes + +Fix so it won't fail with "Too early to specify a build action" + +=item CPANTS changes + +Final changes to meet requirements on http://cpants.perl.org/ + +=back + +=head1 VERSION 5.52 (2008-05-08) + +=over 4 + +=item Released + +=back + +=head1 VERSION 5.51 (DEVELOPMENT) + +=over 4 + +=item Bug fixes + +Fixed bug where the wrong version was in Build.PL + +=item CPANTS changes + +Additional changes to meet requirements on http://cpants.perl.org/ + +=back + +=head1 VERSION 5.50 (2008-05-05) + +=over 4 + +=item Released + +=back + +=head1 VERSION 5.49 (DEVELOPMENT) + +=over 4 + +=item New features + +Added "ereyesterday". Ed Avis + +=item Time zone fixes + +Added time zones. Damyan Ivanov, Ernesto Hernandez-Novich, Gregor +Herrmann, Nicholas Riley, Enrique Verdes, Alexander Litvinov + +=item Documentation fixes + +Corrected typo in %G and %L format descriptions. Troy A. Bollinger + +=item CPANTS changes + +Added Build.PL and several other things to meet requirements on +http://cpants.perl.org/ + +=back + +=head1 VERSION 5.48 (2007-11-27) + +=over 4 + +=item Released + +=back + +=head1 VERSION 5.47 (DEVELOPMENT) + +=over 4 + +=item Bug fixes + +Fixed the version number. John R. Daily + +Fixed a warning when the date command not present. Daniel Hahler + +Fixed a bug where recurrences of the form 0:1*, 0:0:1*, etc., +incorrectly required a base date. Gerry Lawrence + +Fixed a bug where "substring" was used instead of "substr". + +=item Time zone fixes + +Fixed a problem in the WEST time zone. Cristina Nunes + +Added time zone. Kimmo R. M. Hovi + +=item Documentation fixes + +Revised some of the documentation about Y2K (given that it's in the +past) and the 2007 US daylight saving time rule changes. + +=back + +=head1 VERSION 5.46 (2007-02-21) + +=over 4 + +=item Released + +=back + +=head1 VERSION 5.45 (DEVELOPMENT) + +=over 4 + +=item New features + +Added "overmorrow". Ed Avis + +=item Bug fixes + +Fixed bug in parsing ISO 8601 dates. Paul Schinder + +Fixed a bug in UnixDate for years before 1000 AD. Joaquin Ferrero + +Fixed a bug where "today" wasn't case insensitive. Pedro Rodrigues + +Fixed a bug where business/approximate mode wasn't correctly used in +DateCalc. Mark T. Kennedy + +Bug in DateCalc where you couldn't pass undef as the errref. Alex Howansky + +Bug where cygwin wasn't using the date command. Rafael Kitover + +=item Time zone fixes + +New time zones. Khairil Yusof, Andy Spiegel, Ernesto Rapetti + +New time zones. Robin Norwood + +Fixed Russian time zones. Yuri Kovalenko + +=item Language fixes + +Language fix for Danish. Claus Rasmussen + +Language fix for German. Andreas Dembach + +=item Documentation fixes + +Minor documentation improvement. Caminati Carlo + +Lots of spelling fixes. Asaf Bartov + +=back + +=head1 VERSION 5.44 (2005-06-02) + +=over 4 + +=item Released + +=back + +=head1 VERSION 5.43 (DEVELOPMENT) + +=over 4 + +=item B<(!) (*) Recurrences revisited> + +The behavior of some elements of recurrences changed. These included +making the week element (N) refer to the Nth occurrence of a day of the +week in the week, month, or year. It is now possible to look at the +3rd Friday of every month for example. + +Y-0-WOY-DOW now refers to the WOY'th occurrence of DOW instead of the +ISO 8601 date Y-W(WOY)-DOY. Also, changed Y-0-WOY-0 to refer to the +WOY'th occurrence of FirstDay, and got rid of the MW and MD flags. Many +other similar changes. + +=item B<(!) Changed %x format in UnixDate> + +The %x format used to be equivalent to %D (%m/%d/%y), but it has +been modified to use the DateFormat config variable, so it may return +%d/%m/%y if a non-US DateFormat is specified. + +=item New features + +Added TodayIsMidnight. Reuben Thomas + +Added "approx" mode to Delta_Format and reversed change to default +Delta_Format behavior to the one from version 5.40. Based on +discussion with Adam Spiers. + +Added %O UnixDate format. Martin Thurn + +=item Bug fixes + +Fixed a bug is ParseRecur where values passed in were no overriding +old values in the recurrence. Scott Barker (reported to the Debian +bugs list). + +Fix for a potential problem in the "0000" time zone. Ed Avis + +Changed taint check to be the one in perlsec(1). Max Kalika + +Minor fix so DateInit("VAR=") will work. Thomas Bohme + +Fixed a bug where business mode was kept operative even after the +calculation was over. Emiliano Bruni + +Minor change to run under cygwin. Niel Markwick + +Minor VMS fix. Martin P.J. Zinser + +Small fix to taint checking. David Worenklein + +Fixed a problem where deltas were getting misinterpreted as dates. + Harry Zhu + +Fixed a bug in ParseRecur where "last day of every March" couldn't +be done. Andras Karacsony + +Fixed a bug in business mode calculations. Tracy L Sanders + +Sorted all events and dates returned by Events_List. This fixes +problems with tests on some versions of perl. Tulan + +Modified %x UnixDate format to use DateFormat config variable. +Matt Lyons + +=item Time zone fixes + +Fixed a problem with single character military time zones (T and W) +conflicting with ISO 8601 T and W dates. Hugo Cornelis + +Small correction to Brazil time zones. John McDonald + +Added time zones. Michael Wood-Vasey, Don Robertson, Michael D. Setzer +II, Andres Tarallo + +=item Language fixes + +Fixed German translations. Oliver Scheit + +Minor corrections to Italian. Nicola Pedrozzi + +Added the language Catalan. Xavi Drudis + +=item Documentation fixes + +Minor doc fixes Reuben Thomas, Ed Avis, Thomas Winzig + +Clarified documentation on %W/%G/%U/%L formats. Joel Savignon + +=back + +=head1 VERSION 5.42a 2003-07-03 + +=over 4 + +=item Test fixes + +A quick fix to replace a faulty test. + +=back + +=head1 VERSION 5.42 (2003-07-02) + +=over 4 + +=item Released + +Number changed to distinguish between the development release (5.41) +and the official release. + +=back + +=head1 VERSION 5.41 (DEVELOPMENT) + +As of 5.41, odd numbered releases are development (and appear only on +my page). Even number releases are official releases submitted to +CPAN. + +=over 4 + +=item B<(!) Changed path separator for VMS> + +Since ":" is used in some VMS paths, it should not have been used as +the path separator. It has been changed to a newline ("\n") character. + +=item B<(!) Delta_Format behavior changed> + +The entire delta is exact if no month component is present +(previously, no year or month component could be present). Due to +discussion with Tim Turner. + +=item Bug fixes + +Small patch for OpenVMS. Martin P.J. Zinser + +Minor enhancement to ParseRecur. Randy Harmon + +Fixed a bug involving business deltas with negative hours. Ludovic +Dubost + +Added some support for NetWare. Chris Shields + +Applied some robustness patches. Ed Avis + +Fixed a bug with years <1000. Jonathan Callahan + +Patch to make Manip.pm -Mstrict clean and better VMS support. +Peter Prymmer + +Fixed a bug in "1st Saturday of 2005" format. Maurice Aubrey + +Taint check insecure $ENV{PATH} fix. Ed Avis + +Patch to allow deltas of the form "+ -1 day" to work. Ed Avis + +Removed ampersands from function calls in documentation to fit new +perl coding standards. Bill Pollock + +Fixed a bug where spaces in a date caused problems in German (due +to the number 1st, 2nd, etc. being 1., 2., etc.). Erik Roderwald + +=item Time zone fixes + +Minor bug fix where /etc/time zone not correctly read. Jacek Nowacki + +Made the UnixDate %Z format work with numeric time zones. Michael Isard + +Fixed bug where -HH:MM and +HH:MM were not being accepted as valid +time zones. Hank Barta + +Fixed a bug where time zones -HH:MM weren't handled in ISO 8601 dates. +Ed Avis + +Added some help for VMS time zones. Don Slutz + +Added some checking to the time zone determination. Ed Avis + +Added time zones. David Coppit, Daniel Serodio, Fabian Mandelbaum, +Raul Dias, Pedro Melo CUNHA, Roman Y Malakhov, David Whiting, Khaled +Mostaguir, Jason King + +=item Language fixes + +B<(*) Replaced all non-ASCII characters with hex representations to avoid +the malformed UTF-8 character warnings. Ed Avis> + +Added Russian translation. Dapi + +Additions to Dutch translation. Willem + +Patch to French support. Patrick Turmel + +Added Tues/Thur abbreviations. Martin Thurn + +Added Turkish. Giray + +Added Danish. Jesper Dalberg + A patch for Danish was send by Jorgen Norgaard previously, and + I somehow overlooked it. I apologize for that. + +=item Test fixes + +Added runtests.bat contributed by Lon Amick + +=item Documentation fixes + +Minor doc fix. Jeremy Tietsort + +Fixed spelling of Veteran's day. Dirk Eddelbuettel + +Documentation improvements. James Olsen + +=back + +=head1 VERSION 5.40 (2001-06-07) + +=over 4 + +=item New features + +Added support for negative values is "epoch SECS" type dates. +Larry Warner + +Added NWD/PWD/DWD flags to ParseRecur. Peter Wyngaard + +=item Bug fixes + +Fixed a warning. Edward Avis + +Fixed a bug where the date wasn't rolling over when parsing dates +containing only times. James L. Gordon + +Fixed a bug where some times were defaulting to the current time +instead of 00:00:00. Edward Avis + +Fixed a bug in Date_NthDayOfYear with decimal days. Olga Polyakov + +Fixed a bug where ParseDateDelta returned a delta if nothing was +passed in. Jim Hranicky + +Fixed a bug where noon was case sensitive. Bion Pohl + +Fixed a bug where dateTtime wasn't parsed. Jeremy Brinkley + +Fixed a bug in holiday parsing involving recurrences. Jerry Wilcox + +Fixed a bug where an invalid date passed to Date_IsWorkDay produced +an error message. Mark Rejhon + +Fixed a bug where EraseHolidays wasn't taking affect correctly. +Chateauvieux Martial + +Fixed a bug where the list produced by Date_Init couldn't be passed +back in to Date_Init. James Elson + +=item Time zone fixes + +Added `date +%Z` support in Date_TimeZone. Mike Bristow + +Fixed a warning if the time zone is supplied as a +HHMM format. +Viola Mauro + +Fixed South African time zone. David Sieborger + +=item Documentation fixes + +Added an example. Philip Jones + +=back + +=head1 VERSION 5.39 (2000-06-27) + +=over 4 + +=item Bug fixes + +`date` uses the user's path unless taint checking is on. + +@::DatePath used instead of @Date::Manip::DatePath incorrectly. +Fixed by John Labovitz. + +Fixed a bug where times such as "5 seconds ago" were not changing +over time. Matthew R. Sheahan + +=item Time zone fixes + +Added /etc/time zone support to &Date_TimeZone. Dirk Eddelbuettel + +Added time zones. Dirk Eddelbuettel, Eli Selinger + +=back + +=head1 VERSION 5.38 (2000-05-23) + +=over 4 + +=item B<(*) Added Events> + +Added Events section to config file and Events_List routine. Prompted +by Greg Schiedler and paid for by Alan Cezar. + +=item B<(!) Removed Date_DaysSince999> + +The Date_DaysSince999 function (deprecated in 5.35) has been removed. + +=item New features + +Added support for ISO8601 dates of the format dateTtime. Jason Pierce + +Got rid of the "use Cwd" and ENV{PATH} lines which means no more taint +problems. + +=item Bug fixes + +Fixed "dofw" format to return the day of the current week as documented +instead of next week. Dennis Ingram + +Fixed a bug where dates in years 1900, 1800, etc. (but not 2000 or other +400th years) were off by one day in DayOfWeek. Noble Thomas + +Fixed a bug in ParseRecur (2-digit years not treated correctly). +Brian Rectanus + +=item Time zone fixes + +Added time zones. Nelson Ferreira, David Harper + +=item Documentation fixes + +Fixed some typos. Thanks to Alex Kapranoff + +Typo fixed. Jim Hranicky + +=back + +=head1 VERSION 5.37 (2000-02-14) + +=over 4 + +=item Bug fixes + +Set ENV{PATH} to help with taint checking. Joe Lipson + +Fixed a serious bug where HH:24:00 was broken due to support from 24:00:00. +Scott Egashira + +=item Time zone fixes + +Fixed the sign on the military time zones. John Scott + +=back + +=head1 VERSION 5.36 (2000-01-21) + +=over 4 + +=item New features + +Added support for 24:00:00 to ParseDate. William H Asquith + +=item Bug fixes + +Fixed a bug in ParseRecur. Lewis Tsao + +Fixed a bug is UnixDate (%l format). Jon Hedley + +Fixed a bug in Date_GetNext/Prev. Christoph Haas + +Fixed a bug in Date_IsHoliday. Report and patch by Rolf Beutner + +Fixed a bug in UnixDate. Patch by Kurtis D. Rader + +Rewrote IsInt routine based on discussion with Sean Hunter +(approximately 30% faster on a SPARC). + +=item Time zone fixes + +Added time zone. Paul Arzul + +=item Documentation fixes + +Fixed a documentation problem with Date_ConvTZ. Diab Jerius + +=back + +=head1 VERSION 5.35 (1999-07-06) + +=over 4 + +=item B<(!) Deprecated Date_DaysSince999> + +In fixing support for the years 0001-0999, I rewrote Date_DaysSince999 to +be Date_DaysSince1BC. The Date_DaysSince999 function will be removed. + +=item B<(*) (!) Added PathSep variable> + +In order to better support Win32 platforms, I added the PathSep config +variable. This will allow the use of paths such as "c:\date" on Win32 +platforms. Old config files on Win32 platforms (which were not working +correctly in many cases) may not work if they contain path information to +the personal config file. + +=item B<(*) Recurrences now support flags> + +Flags for modifying recurrence dates are now supported. + +=item B<(*) Improved holiday support considerably> + +Added support for recurrences and one-year-only holidays (the latter +requested first by Vishal Bhatia. + +=item B<(*) Date_Init improved> + +Date_Init can now return a list of config variables if called in array +context. Based on a suggestion by Matt Tuttle. + +=item New features + +Modified Date_GetPrev/Date_GetNext to take $curr=2. + +Now parses the Apache log file format "dd/mmm/yyyy:hh:mm:ss (time zone)". +Mark Ferguson + +Added OS/2 support. Michael B. Babakov + +Added Date_IsHoliday routine. Joe Pepin + +Added recurrence support for Easter (first suggested by Abigail). + +=item Bug fixes + +Made "epoch" not case sensitive and fixed a bug where it would fail in +some languages. Caught because of Iosif's thorough Romanian test file. + +Fixed a problem where "in 5 days/weeks/months" sometimes wouldn't get +correctly parsed in other languages. Caught because of Iosif's +thorough Romanian test file. + +Fixed a weakness in ParseDateDelta brought out by the Romanian delta +test file. + +Fixed a bug causing warnings in the beta version of perl. Patch by +Paul Johnson. + +Fixed support for years 0000-0999. Requested by Chris Vaughan + +Several recurrence bug fixes. + +Put all the my'ed global variables in a couple hashes to clean up the +namespace and to make a few future enhancements easier to do. + +Fixed a bug where business weeks weren't being used correctly. Qian +Miao + +Fixed a serious typo in the DaysSince1BC routine. Qian Miao + +Fixed Veteran's day, added Good Friday (off by default). Peter Chen + +Cleaned up holiday variables and re-did holiday routines. + +=item Time zone fixes + +Added time zones. Oded Cohen + +=item Language fixes + +Added Romanian support (including 2 test files). Iosif Fettich + +Corrected Swedish translations. Danne Solli + +Some fixes to German translations. Peter Ehrenberg + +Added Italian. Nicola Pedrozzi + +=item Test fixes + +Added recurrence test suite + +=item Documentation fixes + +Several documentation updates. + +New recurrence documentation. + +=back + +=head1 VERSION 5.34 (1999-04-13) + +=over 4 + +=item B<(!) (*) All Date::Manip variables are no longer accessible> + +Previously, Date::Manip variables were declared using a full package +name. Now, they are declared with the my() function. This means that +internal variables are no longer accessible outside of the module. +Based on suggestion by Tom Christiansen + +=item B<(!) Week interpretation in business mode deltas> + +A business mode delta containing a week value used to be treated as 7 days. +A much more likely interpretation of a week is Monday to Monday, regardless +of holidays, so this is now the behavior. + +=item B<(!) %z UnixDate format> + +The %z UnixDate format used to return the time zone abbreviation. It now +returns it as a GMT offset (i.e. -0500). %Z still returns the time zone +abbreviation. Suggested by Tuc. + +=item B<(!) Formats "22nd Sunday" returns the intuitive value> + +The date "22nd Sunday" used to return the Sunday of the 22nd week of the +year (which could be the 21st, 22nd, or 23rd Sunday of the year depending +on how weeks were defined). Now, it returns the 22nd Sunday of the year +regardless. + +=item B<(!) Separator in DD/YYmmm and mmmDD/YY formats no longer optional> + +Previously, the date "Dec1065" would return Dec 10, 1965. After +adding the YYYYmmm and mmmYYYY formats, this was no longer possible. +The separator between DD and YY is no longer optional, so + + Dec1065 returns December 1, 1065 + Dec10/65 returns December 10, 1965 + +=item B<(*) Date_Cmp added> + +In one of the next versions of Date::Manip, the internal format of the +date will change to include time zone information. All date +comparisons should be made using Date_Cmp (which currently does +nothing more than call the Perl "cmp" command, but which will +important when comparing dates that include the time zone). + +Added now in response to a question by Al Sorrell (I should have added +it earlier). + +=item New features + +Added exact business mode. Ian Duplisse + +Added "mmmYYYY" and "YYYYmmm" formats. As a result, "DDYYmmm" and +"mmmDDYY" formats changed to "DD/YYmmm" and "mmmDD/YY" as described +above. David Twomey + +=item Bug fixes + +Fixed a bug where a date passed in as an array wasn't getting the +date removed from the array. Rick Wise + +Added tests for MPE/iX OS. John Testa + +Fixed a bug where WorkDayBeg=8:00 went into an infinite loop. +Mark Martinec + +Changed a business week to be the same as an exact week. Abigail + +Fixed a bug where "Sunday week 0" didn't work (only affected week 0) +Gerald Rinske + +Minor bug (my variable declared twice). Paul J. Schinder + +Fixed a bug where "epoch SECONDS" was getting parsed wrong (for SECONDS +which could be interpreted as an ISO-8601 date). N. Thomas + +Fixed a problem where init files were not being read. Mike Reetz + +=item Time zone fixes + +At the request of the UN, I added the SAT time zone. :-) Howard +Hendler + +Fixed a bug where time zones were converted multiple times if ConvTZ +was set and DateCalc called. Steven Hartland + +=item Language fixes + +Added Portuguese. Rui Pedro da Silva Leite Pereira + +=item Documentation fixes + +A number of typos fixed. Ron Pero + +=back + +=head1 VERSION 5.33 (1998-08-20) + +=over 4 + +=item Bug fixes + +Fixed a bug where "1 month ago" was no longer working (and added it to +the test cases). This broke when I fixed the "-1second" bug in the +previous version. A result of this is that a number of "deltas" can +be parsed as dates (i.e. &ParseDate("1 hour 20 minutes ago") is +equivalent to &DateCalc("now","1 hour 20 minutes ago")). Only text +deltas can be used in this way (i.e. &ParseDate("-0:0:0:0:1:20:0") +will not work). + +=item Language fixes + +Added Spanish support. Bautista Jasso Javier + +=back + +=head1 VERSION 5.32 (1998-08-17) + +=over 4 + +=item B<(!) Date_Init arguments> + +The old style Date_Init arguments that were deprecated in version 5.07 +have been removed. + +=item B<(!) (*) DateManip.cnf change> + +Changed .DateManip.cnf to Manip.cnf (to get rid of problems on OS's +that insist on 8.3 filenames) for all non-Unix platforms (Windows, VMS, +Mac). For all Unix platforms, it's still .DateManip.cnf . It will only +look in the user's home directory on VMS and Unix. + +=item New features + +Added "in N days" and "N days ago" formats. Tony Bowden. + +Added cYYYY format to YYtoYYYY variable. Mark Rejhon. + +Added 2 days/weeks/months later in both ParseDate and ParseDelta (for +Dutch support). Abigail. + +Added "Y:M:0*-DOM:0:0:0" to ParseRecur. Jeff Yoak. + +=item Bug fixes + +Fixed a bug where the deltas could be off by up to a couple minutes in +some rare cases. Herman Horsten. + +Fixed an "uninitialized symbol" warning. Mark D. Anderson. + +Fixed a bug where holidays weren't erased. Jonathan Wright. + +Applied a bug fix from Joe Chapman where the %W/%U UnixDate formats +were frequently wrong. + +Several minor fixes and improvements. Abigail. + +Added some VMS support. Charles Lane. + +Fixed a bug which caused a test to fail on some systems. Charles Lane. + +Fixed a bug where "-1second" was treated as a date rather than a delta +in DateCalc. Kenneth Ingham + +Added a bit to the Makefile.PL (as it was distributed in the Win32 +Perl Resource Kit). Murray Nesbitt + +=item Time zone fixes + +Allowed time zones of the format STD-#DST-#. Peter Gordon. + +Added time zone support for "+0500 (EST)". Tom Christiansen. + +Restricted time zones parsing to 0000-2359 instead of 0000-9999. +Frank Cusack + +Added time zones. W. Phillip Moore, Michael Smith, Samuli Karkkainen + +=item Language fixes + +Added Polish support. Ian Wojtowicz. + +Added Dutch support. Abigail. + +Added A.M. and P.M. parsing (not just AM and PM). William W. Arnold. + +Fixed a German initialization problem. Thomas Horster-Moller +and Christian Reithmaier + +=item Documentation fixes + +Documentation fix. Peter Gordon. + +Minor documentation changes. Yamamoto Hiroshi. + +Added info about the RCS problem. Supplied by Kipp E. Howard. + +=back + +=head1 VERSION 5.31 (1998-04-08) + +=over 4 + +=item New features + +Added "epoch SECS" format to ParseDateString. Thanks to: Joshua M. Burgin. + +Added a patch by Blair Zajac to make Date_NthDayOfYear work with decimal +days. + +=item Bug fixes + +Fixed a bug in ParseDateDelta (seems to appear only in 5.005 pre-releases). +Found by Larry W. Virden. + +Missed one form in ParseDate. Noted by Tuc. + +Fixed a bug where "15:00:00" couldn't be parsed. Michael Pizolato. + +Split Manip.pm. New files are HISTORY, TODO, Manip.pod. + +Fixed a bug in ParseDateDelta. Antonio Rosella. + +Removed the only occurrence of $& (which may speed some things up). Fix +by Ken Williams. First suggested by Abigail. + +Fixed an overflow bug in doing date calculations with 2 dates more than +70 years apart. Fix by Vishal Bhatia. + +Fixed a bug where "5:00pm" wasn't always parsed correctly. Thanks to +Jim Trocki. + +Fixed a bug in UnixDate (it wouldn't return the correct string for a +format who's last character was '0') noted by Ramin V. + +=item Time zone fixes + +Relaxed some restrictions on time zones so ISO-8601 dates can use +non-ISO-8601 time zones. Noted by John Chambers. + +Fixed a bug in converting time zones with a minutes field (+1030). Found +by Paul O. + +=item Language fixes + +Some fixes to the French translations by Emmanuel Bataille. + +Added German support. Thanks to Andreas C. Poszvek. + +=item Documentation fixes + +Minor documentation fixes. Will Linden. + +Fixed a documentation problem with Date_GetPrev. It was still 0-6 +instead of 1-7. Thanks to Robert Klep. + +=back + +=head1 VERSION 5.30 (1998-01-21) + +=over 4 + +=item B<(!) (*) Delta format changed> + +A week field has been added to the internal format of the delta. It now +reads "Y:M:W:D:H:MN:S" instead of "Y:M:D:H:MN:S". + +=item B<(*) Now handles recurring events> + +Added ParseRecur. First suggested by Chris Jackson. + +=item New features + +All routines can now take either a 2- or 4-digit year. + +Added Delta_Format. First suggested by Alan Burlison. + +Added Date_SetDateField. Thanks to Martin Thurn. + +=item Bug fixes + +Made the $err argument to DateCalc optional. + +Changed the name of several of the library routines (not the callable +ones) to standardize naming. + +=back + +=head1 VERSION 5.21 (1998-01-15) + +=over 4 + +=item B<(!) Long running processes may give incorrect time zone> + +A process that runs during a time zone change (Daylight Saving Time +specifically) may report the wrong time zone. See the UpdateCurrTZ variable +for more information. + +=item B<(!) UnixDate "%J", "%W", and "%U" formats fixed> + +The %J, %W, and %U will no longer report a week 0 or a week 53 if it should +really be week 1 of the following year. They now report the correct week +number according to ISO 8601. + +=item New features + +Added YYtoYYYY variable. Suggested by Michel van der List. + +Added the UpdateCurrTZ variable to increase speed at the cost of being +wrong on the time zone. + +Added British date formats. Thanks to Piran Montford. + Monday week + today week + as well as some US formats + in 2 months + next month + +Time can now be written 5pm. Piran Montford. + +Added the TomorrowFirst variable and Date_NearestWorkDay function. + +Added UnixDate formats %G and %L to correctly handle the year. Thanks +to Samuli Karkkainen. + +Added ForceDate variable. Based on a suggestion by Christian Campbell. + +=item Bug fixes + +Now passes Taint checks. Thanks to Mike Fuhr, Ron E. Nelson, and +Jason L Tibbitts III. + +Put everything in a "use integer" pragma. + +Added a missing space in the %g UnixDate format. Thanks to Mike Booth. + +Removed all mandatory call to Date_Init (only called when current time +is required). Significantly faster. + +Fixed a bug in Date_ConvTZ. Thanks to Patrick K Malone. + +Fixed a bug in Date_IsWorkDay. + +=item Time zone fixes + +Fixed some Australian time zones. Kim Davies. + +=item Language fixes + +Cleaned up multi-lingual initialization and added the IntCharSet +variable. + +Improved French translations. Thanks to Emmanuel Bataille. + +Added "Sept" as a recognized abbreviation. Thanks to Martin Thurn. + +Typo in the French initialization. Thanks to Michel Minsoul. + +=item Test fixes + +Fixed the tests to not fail in 1998. + +=item Documentation fixes + +Documented how to get around Micro$oft problem. Based on a mail by +Patrick Stepp. + +=back + +=head1 VERSION 5.20 (1997-10-12) + +=over 4 + +=item B<(*) ISO 8601 support> + +ISO 8601 dates are now parsed. This resulted in several other +changes specified below. + +=item B<(!) (*) ParseDate formats removed> + +As a result of ISO 8601 support, some formats which previously worked +may no longer be parsed since they conflict with an ISO 8601 format. +These include MM-DD-YY (conflicts with YY-MM-DD) and YYMMDD (conflicts +with YYYYMM). MM/DD/YY still works, so the first form can be kept +easily by changing "-" to "/". YYMMDD can be changed to YY-MM-DD +before being parsed. Whenever parsing dates using dashes as +separators, they will be treated as ISO 8601 dates. You can get +around this by converting all dashes to slashes. + +=item B<(!) (*) Week day numbering> + +The day numbering was changed from 0-6 (Sun-Sat) to 1-7 (Mon-Sun) to be +ISO 8601 compatible. Weeks start on Monday (though this can be overridden +using the FirstDay config variable) and the 1st week of the year contains +Jan 4 (though it can be forced to contain Jan 1 with the Jan1Week1 config +variable). + +=item New features + +Several new parsing formats added, including: + "Friday" suggested by Rob Perelman + "12th" suggested by Rob Perelman + "last day of MONTH" suggested by Chadd Westhoff + +Added ParseDateString for speed (and simplicity for modifying ParseDate) + +Added %J and %K formats to UnixDate. + +Added Date_DaysInMonth. + +=item Bug fixes + +Reorganized ParseDate more efficiently. + +Fixed some incorrect uses of $in instead of $future in ParseDate. +Thanks to Erik Corry. + +Added some speedups (more to come). + +=item Test fixes + +Cleaned up testing mechanism a bit and added tests for ISO 8601 formats. + +=back + +=head1 VERSION 5.11 (1997-08-07) + +Version 5.11 was never released to CPAN. + +=over 4 + +=item Bug fixes + +Added one more check for NT perl. Thanks to Rodney Haywood. + +Added some comments to help me keep my personal libraries up-to-date +with respect to Date::Manip and vice-versa. + +Fixed a bug which showed up in French dates (though it could happen in +other languages as well). Thanks to Georges Martin. + +Fixed a bug in DateCalc. Thanks to Thomas Winzig. + +Removed the "eval" statement from CheckFilePath which causes a suid +c wrapper program to die when it calls a Date::Manip script. +Thanks to Hank Hughes. + +Fixed a bug in business mode calculations. Thanks to Sterling Swartwout. + +Fixed a bug in which "1997023100:00:00" was accepted as valid. Thanks +to Doug Emerald. + +Fixed a bug in which ConvTZ was not used correctly in ParseDate. Re-did +portions of Date_ConvTZ. Thanks to Vivek Khera. + +Fixed a bug in business mode calculations. Thanks to Ian Duplisse. + +Added $^X check for Win95 perl. Thanks to Walter Soldierer. + +Missed one call to NormalizeDelta so the output was wrong. Thanks to +Brad A. Buikema. + +=item Time zone fixes + +Added time zones. Paul Gillingwater, Rosella Antonio, Kang Taewook + +=back + +=head1 VERSION 5.10 (1997-03-19) + +=over 4 + +=item Bug fixes + +Cleaned up In, At, and On regexps. + +Added 2 checks for MSWin32 (date command and getpw* didn't work). Thanks +to Alan Humphrey. + +Fixed two bugs in the DateCalc routines. Pointed out by Kevin Baker. + +Added a check for Windows_95. Thanks to Charlie W. + +Cleaned up checks for MacOS and Microsoft OS's. Hopefully I'm catching +everything. Thanks to Charlie Wu for one more check. + +Fixed a typo which broke Time%Date (Date=dd%mmm%yy) format. Thanks to +Timothy Kimball. + +=item Time zone fixes + +Fixed some problems with how "US/Eastern" type time zones were used. +Thanks to Marvin Solomon. + +=item Test fixes + +Tests will now run regardless of the time zone you are in. + +Test will always read the DateManip.cnf file in t/ now. + +A failed test will now give slightly more information. + +DateManip.cnf file in t/ now sets ALL options to override any changes +made in the Manip.pm file. + +=item Documentation fixes + +Added documentation for backwards incompatibilities to POD. + +Fixed some problems in POD documentation. Thanks to Marvin Solomon. + +Fixed minor POD error pointed out by John Perkins. + +Changed documentation for Date_IsWorkDay (it was quite confusing using +a variable named $time). Thanks to Erik M. Schwartz. + +Fixed typo in documentation (midnight misspelled). Thanks to Timothy +Kimball. + +=back + +=head1 VERSION 5.09 (1997-01-28) + +=over 4 + +=item Bug fixes + +Upgraded to 5.003_23 and fixed one problem associated with it. + +Used carp and changed all die's to confess. + +Replaced some UNIX commands with perl equivalents (date with localtime +in the tests, pwd with cwd in the path routines). + +Cleaned up all routines working with the path. + +=item Test fixes + +Tests work again (broke in 5.08). Thanks to Alex Lewin and Michael Fuhr +for running debugging tests. + +=back + +=head1 VERSION 5.08 (1997-01-24) + +=over 4 + +=item Bug fixes + +B<(*) Fixed serious bug in ConvTZ pointed out by David Hall.> + +B<(*) Modified Date_ConvTZ (and documented it).> + +=back + +=head1 VERSION 5.07p2 1997-01-03 + +Released two patches for 5.07. + +=over 4 + +=item Bug fixes + +Fixed a bug where a delta component of "-0" would mess things up. +Reported by Nigel Chapman. + +=item Time zone fixes + +B<(*) Can now understand PST8PDT type zones (but only in Date_TimeZone).> + +Added lots of time zone abbreviations. + +=item Test fixes + +Fixed some tests (good for another year). + +=back + +=head1 VERSION 5.07 (1996-12-10) + +=over 4 + +=item B<(!) UnixDate "%s" format> + +Used to return the number of seconds since 1/1/1970 in the current +time zone. It now returns the number of seconds since 1/1/1970 GMT. +The "%o" format was added which returns what "%s" previously did. + +=item B<(!) (*) Internal format of delta> + +The format for the deltas returned by ParseDateDelta changed. Previously, +each element of a delta had a sign attached to it (+1:+2:+3:+4:+5:+6). The +new format removes all unnecessary signs by default (+1:2:3:4:5:6). Also, +because of the way deltas are normalized (see documentation on +ParseDateDelta), at most two signs are included. For backwards +compatibility, the config variable DeltaSigns was added. If set to 1, all +deltas include all 6 signs. + +=item B<(!) (*) Date_Init arguments> + +The format of the Date_Init calling arguments changed. The +old method + + Date_Init($language,$format,$tz,$convtz); + +is still supported , but this support will likely disappear in the future. +Use the new calling format instead: + + Date_Init("var=val","var=val",...); + +NOTE: The old format is no longer supported as of version 5.32 . + +=item B<(*) Added weeks to ParseDateDelta.> + +Suggested by Mike Bassman. Note that since this is a late addition, I +did not change the internal format of a delta. Instead, it is added +to the days field. + +=item B<(*) Now reads a config file.> + +Refer to the Date_Init documentation for details. + +=item B<(*) Added business mode.> + +See documentation. Suggested by Mike Bassman. + +=item New features + +B<(*) Modified how deltas are normalized and added the DeltaSigns config +variable.> + +Added %q format "YYYYMMDDHHMMSS" to UnixDate. Requested by Rob Perelman. +Also added %P format "YYYYMMDDHH:MM:SS". + +Added a new config variable to allow you to work with multiple internal +formats (with and without colons). Requested by Rob Perelman. +See Date_Init documentation. + +Added the following formats suggested by Andreas Johansson: + Sunday week 22 [in 1996] [at 12:00] + 22nd Sunday [in 1996] [at 12:00] + Sunday 22nd week [in 1996] [at 12:00] + +Added a new config variable to allow you to define the first day of +the week. See Date_Init documentation. + +Added the following formats to ParseDate for convenience (some were +suggested by Mike Bassman): + next/last Friday [at time] + next/last week [at time] + in 2 weeks [at time] + 2 weeks ago [at time] + Friday in 2 weeks + in 2 weeks on Friday + Friday 2 weeks ago + 2 weeks ago Friday + +Added Date_SecsSince1970GMT, moved the %s format to %o (secs since 1/1/70) +and added %s format (secs since 1/1/70 GMT). Based on suggestions by +Mark Osbourne. Note this introduces a minor backward incompatibility +described above. + +Date_SetTime now works with international time separators. + +Added the %g format (%a, %d %b %Y %H:%M:%S %z) for an RFC 1123 date. +Suggested by Are Bryne. + +Added options to delete existing holidays and ignore global config file. + +Date_GetNext and Date_GetPrev now return the next/prev occurrence of a +time as well as a day. Suggested by Are Bryne. + +In approximate mode, deltas now come out completely normalized (only 1 +sign). Suggested by Rob Perelman. + +Added Date::Manip::InitDone so initialization isn't duplicated. + +Added a 3rd internal format to store YYYY-MM-DD HH:MN:SS (iso 8601). + +Added a config variable to allow you to work with 24 hour business +days. Suggested by Mike Bassman. + +ParseDateDelta now returns "" rather than "+0:0:0:0:0:0" when there is +an error. + +=item Bug fixes + +B<(*) The d:h:mn:s of ALL deltas are normalized.> + +Huge number of code changes to clean things up. + +Subroutines now check to see if 4 digit years are entered. Suggested +by Are Bryne. + +Added local($_) to all routines which use $_. Suggested by Rob +Perelman. + +Complete rewrite of DateCalc. + +Fixed a bug where UnixDate %E format didn't work with single digit +dates. Patch supplied by Jyrgen Nyrgaard. + +Fixed a bug where "today" was not converted to the correct time zone. + +=item Time zone fixes + +Fixed bug in Date_TimeZone where it didn't recognize +HHMN type time +zones. Thanks to Are Bryne. + +Added WindowsNT check to Date_TimeZone to get around NT's weird date +command. Thanks to Are Bryne. + +Fixed typo (CSD instead of CST). + +Fixed sign in military time zones making Date::Manip RFC 1123 compliant +(except that time zone information is not stored in any format) + +=item Test fixes + +B<(*) Added test suite!> + +=back + +=head1 VERSION 5.06 (1996-10-25) + +=over 4 + +=item New features + +Added "today at time" formats. + +ParseDateDelta now normalizes the delta as well as DateCalc. + +Added %Q format "YYYYMMDD" to UnixDate. Requested by Rob Perelman. + +=item Bug fixes + +Fixed another two places where a variable was declared twice using my +(thanks to Ric Steinberger). + +Fixed a bug where fractional seconds weren't parsed correctly. + +Fixed a bug where "noon" and other special times were not parsed +in the "which day of month" formats. + +Fixed a minor bug where a few matches were case sensitive. + +The command "date +%Z" doesn't work on SunOS machines (and perhaps +others) so 5.05 is effectively broken. 5.06 released to fix this. +Reported by Rob Perelman. + +=back + +=head1 VERSION 5.05 (1996-10-11) + +=over 4 + +=item New features + +Changed deltas to be all positive or all negative when produced by +DateCalc. Suggested by Steve Braun + +Added DateManipVersion routine. + +B<(*) Parses RFC 822 dates (thanks to J.B. Nicholson-Owens for suggestion).> + +Parses ctime() date formats (suggested by Matthew R. Sheahan). + +Now supports times like "noon" and "midnight". + +=item Bug fixes + +Fixed bug introduced in 5.04 when default day set to 1. When no +date given, have day default to today rather than 1. It only +defaults to one if a partial date is given. + +Fixed bug where Date_DaysSince999 returned the wrong value (the +error did not affect any other functions in Date::Manip due to +the way it was called and the nature of the error). Pointed out +by Jason Baker + +Dates with commas in them are now read properly. + +Fixed two places where a variable was declared twice using my (thanks +to Ric Steinberger). + +Hopefully fixed installation problems. + +Got rid of the last (I think) couple of US specific strings. + +Fixed bug in Date_SetTime (didn't work with $hr,$min,$sec < 10). + +Added ModuloAddition routine and simplified DateCalc. + +=item Time zone fixes + +B<(*) Now supports time zones.> + +B<(*) Added Date_ConvTZ routine for time zone support.> + +Date_TimeZone will now also check `date '+%Z'` suggested by +Aharon Schkolnik. + +=item Language fixes + +Added Swedish translation (thanks to Andreas Johansson + +The time separators are now language specific so the French can +write "10h30" and the Swedes can write "10.30". Suggested by +Andreas Johansson. + +=item Documentation fixes + +Fixed bad mistake in documentation (use Date::Manip instead of +use DateManip) pointed out by tuc@valhalla.stormking.com + +Minor improvements to documentation. + +Documented the 'sort within a sort' bug. + +Fixed type in documentation/README pointed out by James K. Bence. + +=back + +=head1 VERSION 5.04 (1996-08-01) + +=over 4 + +=item New features + +Added support for fractional seconds (as generated by Sybase). They +are parsed and ignored. Added by Kurt Stephens + +=item Bug fixes + +Fixed bugs reported by J.B. Nicholson-Owens + "Tue Jun 25 1996" wasn't parsed correctly (regexp was case + sensitive) + full day names not parsed correctly + the default day in ErrorCheck should be 1, NOT currd since when + currd>28, it may not be a valid date for the month + +=back + +=head1 VERSION 5.03 (1996-07-17) + +=over 4 + +=item Bug fixes + +Fixed a couple of bugs in UnixDate. + +Declared package variables to avoid warning "Identifier XXX used +only once". Thanks to Peter Bray for the suggestion. + +=back + +=head1 VERSION 5.02 (1996-07-15) + +=over 4 + +=item New features + +B<(*) Added some internationalization (most of the routines had to be +modified at least slightly)> + +=item Bug fixes + +Fixed a bug where repeated calls to ParseDate("today") was not reset + +Replaced the %Date::Manip::Date variable with a large number of +other, more flexible variables + +Rewrote the Init routine + +=back + +=head1 VERSION 5.01 (1996-06-24) + +=over 4 + +=item New features + +Added %F format to UnixDate. Rob Perelman + +Added "Date at Time" types + +Weekdays can be entered and checked + +Two digit years fall in the range CurrYear-89 to CurrYear+10 + +=item Bug fixes + +Reworked a number of the ParseDate regular expressions to make +them more flexible + +=item Documentation fixes + +Fixed a typo (Friday misspelled Fridat). Rob Perelman + +Documentation problem for \$err in DateCalc. Rob Perelman + +=back + +=head1 VERSION 5.00 (1996-06-21) + +=over 4 + +=item B<(*) Switched to a package.> + +Patch supplied by Peter Bray: + renamed to Date::Manip + changed version number to 2 decimal places + added POD documentation + +Thanks to Peter Bray, Randal Schwartz, Andreas Koenig for suggestions + +=item Bug fixes + +Fixed a bug pointed out by Peter Bray where it was complaining of +an uninitialized variable. + +=back + +=head1 VERSION 4.3 (1995-10-26) + +=over 4 + +=item New features + +Added "which dofw in mmm" formats to ParseDate. Mark Dedlow + +=item Bug fixes + +Added a bugfix of Adam Nevins where "12:xx pm" used to be parsed +"24:xx:00". + +=back + +=head1 VERSION 4.2 (1995-10-23) + +=over 4 + +=item New features + +UnixDate will now return a scalar or list depending on context + +ParseDate/ParseDateDelta will now take a scalar, a reference to a +scalar, or a reference to an array + +B<(*) Simple time zone handling> + +B<(*) Added Date_SetTime, Date_GetPrev, Date_GetNext> + +=item Bug fixes + +Added copyright notice (requested by Tim Bunce) + +=back + +=head1 VERSION 4.1 (1995-10-18) + +=over 4 + +=item New features + +B<(*) Added DateCalc> + +=item Bug fixes + +Changed %DATE_ to %DateManip::Date + +B<(*) Rewrote ParseDateDelta> + +=back + +=head1 VERSION 4.0 (1995-08-13) + +B<(*) First public release> + +=over 4 + +=item New features + +Added time first formats to ParseDate + +=item Bug fixes + +B<(*) Switched to perl 5> + +Cleaned up ParseDate, ParseDateDelta + +=back + +=head1 VERSION 3.0 (1995-05-03) + +=over 4 + +=item New features + +Added today/tomorrows/etc. formats + +B<(*) Added UnixDate> + +B<(*) Added ParseDateDelta> + +=item Bug fixes + +Added %DATE_ global variable to clean some stuff up + +Simplified several routines + +=back + +=head1 VERSION 2.0 (1995-04-17) + +=over 4 + +=item New features + +Included ideas from Time::ParseDate (David Muir Sharnoff) + +Included ideas from date.pl 3.2 (Terry McGonigal) + +B<(*) Added seconds to ParseDate> + +=item Bug fixes + +Made error checking much nicer + +=back + +=head1 VERSION 1.2 (1995-03-31) + +=over 4 + +=item New features + +Added a few date formats + +=item Bug fixes + +Made months case insensitive + +=back + +=head1 VERSION 1.1 (1995-02-08) + +=over 4 + +=item New features + +Added leap year checking + +Both "Feb" and "February" formats available + +=back + +=head1 VERSION 1.0 (1995-01-20) + +=over 4 + +=item B<(*) Initial release> + +Though not released to the public, the initial released combined +routines from several scripts into one library. + +=back + +=head1 BUGS AND QUESTIONS + +Please refer to the L documentation for +information on submitting bug reports or questions to the author. + +=head1 SEE ALSO + +L - main module documentation + +=head1 LICENSE + +This script is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=head1 AUTHOR + +Sullivan Beck (sbeck@cpan.org) + +=cut diff --git a/lib/Date/Manip/Changes5to6.pod b/lib/Date/Manip/Changes5to6.pod new file mode 100644 index 0000000..bab7e94 --- /dev/null +++ b/lib/Date/Manip/Changes5to6.pod @@ -0,0 +1,711 @@ +# Copyright (c) 2008-2017 Sullivan Beck. All rights reserved. +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +=pod + +=head1 NAME + +Date::Manip::Changes5to6 - describes differences between 5.xx and 6.00 + +=head1 SYNOPSIS + +Date::Manip 6.00 represents a complete rethink and rewrite of +Date::Manip. A great deal of effort was made to make sure that 6.00 +is almost backwards compatible with 5.xx whenever feasible, but some +functionality has changed in backwards incompatible ways. Other parts +have been deprecated and will be removed at some point in the future. + +This document describes the differences between the 5.xx series and +version 6.00. This page primarily describes technical details, most of +which do not impact how Date::Manip is used in scripts. If you want to +make sure that a script which ran with 5.xx will run with 6.xx, refer +to the Date::Manip::Migration5to6 document. + +=head1 OVERVIEW + +The Date::Manip 5.xx series of suffered from several weaknesses. These +included: + +=over 4 + +=item B + +Time zone support in 5.xx was broken. Determining a time zone, and +understanding daylight saving time changes was incomplete (at best) +and totally inadequate to do true timezone operations. + +=item B + +The parsing routines had grown very complicated, and overly permissive +over time and were in need of a complete overhaul. + +=item B + +Date::Manip 5.xx was written as a functional module, not an OO module, +but date handling would lend itself very well to being OO with different +classes to handle dates, deltas, and recurrences. + +The OO model allows a lot of information to be stored with each date +(such as time zone information) which is discarded in the functional +interface. + +=item B + +The entire Date::Manip module was contained in one huge file. Breaking +up the module would make it much easier to deal with. + +=back + +Date::Manip 6.00 is a complete rewrite of Date::Manip to address these +and other issues. + +The following sections address how Date::Manip 6.00 differs from previous +releases, and describes changes that might need to be made to your script +in order to upgrade from 5.xx to 6.00. + +The most important changes are marked with asterisks. + +=head1 GENERAL CHANGES + +=over 4 + +=item B<(*) Requires perl 5.10.0> + +Please see the Date::Manip::Problems document for a discussion of +this problem. It's in the KNOWN COMPLAINTS section. + +=item B<(*) Breaking into smaller modules> + +Date::Manip module has been broken up from one huge module into a +large number of smaller more manageable modules. The main Date::Manip +module is still present, and contains all of the functions from +Date::Manip 5.xx (except that they now call functions from all the +other modules to do the actual work). In general, the Date::Manip +module from 6.00 is backwards compatible. + +A number of new modules have been created as well. These can be used +directly, bypassing the main Date::Manip module. These include the +following: + +Date::Manip::Base contains many basic date operations which may be +used to do simple date manipulation tasks without all the overhead of +the full Date::Manip module. + +Date::Manip::TZ contains time zone operations. + +Handling dates, deltas, and recurrences are now done in +Date::Manip::Date, Date::Manip::Delta, and Date::Manip::Recur. + +All of these modules are object oriented, and are designed to be used +directly, so if you prefer an OO interface over a functional +interface, use these modules. + +=item B<(*) Intermediate data cached> + +In order to improve the performance of Date::Manip, many intermediate +values are cached. This does impact the memory footprint of the module, +but it has a huge impact on the performance of the module. + +Some types of data depend on the config variables used, and these +are cached separately, and this cache is automatically cleared every +time a config variable is set. As a result, it is best if you set +all config variables at the start, and then leave them alone completely +to get optimal use of cached data. + +A side effect of all this is that the Memoize module should not be used +in conjunction with Date::Manip. + +In the version 5.xx documentation, it was mentioned that the Memoize +module might be used to improve performance in some cases. This is no +longer the case. It should not be used with Date::Manip, even if you +use the functional interface instead of the OO interface. + +=item B + +Date::Manip now contains no tainted data, and should run without problems +with taint checking on provided you do not set additional methods for +determining the system time zone using the curr_zone_methods function. + +Ideally, this should never be necessary. If it is necessary, I'd like to +hear about it so that I can add whatever standard methods are needed +to the built in list. + +=back + +=head1 TIME ZONE SUPPORT + +=over 4 + +=item B<(*) Complete handling of time zones> + +The biggest problem with Date::Manip 5.xx was it's inability to +correctly handle time zones and Daylight Saving Time. That is now +fixed. Version 6.00 includes support for every time zone included in +the zoneinfo (aka Olson) database which includes the definitions of +(hopefully) all of the time zones used in the world. + +=item B + +Prior to 5.55, time zones were added upon request. Since 6.00 now +supports a full set of standard time zones, I will no longer add in +individual time zones (Date::Manip::TZ includes functionality for +adding them yourself if they are needed). With Date::Manip now having +full time zone support, I'm not interested in supporting my own +time zone database. + +However, I am interested in adding sets of time zones from various +"standards". + +Date::Manip 6.00 includes time zones from the following standards: + + Olson zoneinfo database + all Microsoft Windows time zones + zones listed in RFC-822 + +If there are additional standards that include additional time zones +not included here, please point me to them so they can be added. +This could include published lists of time zone names supported on +some operating system which have different names than the zoneinfo +list. + +=item B + +Some of the individual standards that were added in the 5.xx series +are not included in any of the standards listed above. + +As of 6.00, only time zones from standards will be included in the +distribution (others can be added by users using the functions +described in Date::Manip::TZ to add aliases for existing time zones). + +The following time zones were in Date::Manip 5.xx but not in 6.00. + + IDLW -1200 International Date Line West + NT -1100 Nome + SAT -0400 Chile + CLDT -0300 Chile Daylight + AT -0200 Azores + MEWT +0100 Middle European Winter + MEZ +0100 Middle European + FWT +0100 French Winter + GB +0100 GMT with daylight saving + SWT +0100 Swedish Winter + MESZ +0200 Middle European Summer + FST +0200 French Summer + METDST +0200 An alias for MEST used by HP-UX + EETDST +0300 An alias for eest used by HP-UX + EETEDT +0300 Eastern Europe, USSR Zone 1 + BT +0300 Baghdad, USSR Zone 2 + IT +0330 Iran + ZP4 +0400 USSR Zone 3 + ZP5 +0500 USSR Zone 4 + IST +0530 Indian Standard + ZP6 +0600 USSR Zone 5 + AWST +0800 Australian Western Standard + ROK +0900 Republic of Korea + AEST +1000 Australian Eastern Standard + ACDT +1030 Australian Central Daylight + CADT +1030 Central Australian Daylight + AEDT +1100 Australian Eastern Daylight + EADT +1100 Eastern Australian Daylight + NZT +1200 New Zealand + IDLE +1200 International Date Line East + +=item B + +Date::Manip now includes a large number of files and modules that +are used to support time zones. + +A series of modules are included which are auto-generated from the +zoneinfo database. The Date::Manip::Zones, Date::Manip::TZ::*, and +Date::Manip::Offset::* modules are all automatically generated and are +not intended to be used directly. Instead, the Date::Manip::TZ module +is used to access the data stored there. + +A separate time zone module (Date::Manip::TZ::*) is included for every +single time zone. There is also a module (Date::Manip::Offset::*) for +every different offset. All told, there are almost 1000 modules. +These are included to make time zone handling more efficient. Rather +than calculating everything on the fly, information about each +time zone and offset are included here which greatly speeds up the +handling of time zones. These modules are only loaded as needed +(i.e. only the modules related to the specific time zones you refer to +are ever loaded), so there is no performance penalty to having them. + +Also included in the distribution are a script (tzdata) and additional +module (Date::Manip::TZdata). These are used to automatically +generate the time zone modules, and are of no use to anyone other +than the maintainer of Date::Manip. They are included solely for the +sake of completeness. If someone wanted to fork Date::Manip, all +the tools necessary to do so are included in the distribution. + +=item B<(*) Meaning of $::TZ and $ENV{TZ}> + +In Date::Manip 5.x, you could specify what time zone you wanted to work +in using either the $::TZ or $ENV{TZ} variables. + +Date::Manip 6.00 makes use of two different time zones: the actual +local time zone the computer is running in (and which is used by the +system clock), and a time zone that you want to work in. Typically, +these are the same, but they do not have to be. + +As of Date::Manip 6.00, the $::TZ and $ENV{TZ} variables are used only +to specify the actual local time zone. + +In order to specify an alternate time zone to work in, use the +SetDate or ForceDate config variables. + +=back + +=head1 CONFIG FILES AND VARIABLES + +=over 4 + +=item B<(*) Date_Init handling of config variables> + +The handling of config variables has changed slightly. + +Previously, variables passed in to Date_Init overrode values from +config files. This has changed slightly. Options to Date_Init are +now parsed in the order they are listed, so the following: + + Date_Init("DateFormat=Other","ConfigFile=DateManip.cnf") + +would first set the DateFormat variable, and then it would read +the config file "DateManip.cnf". If that config file included +a DateFormat definition, it would override the one passed in to +Date_Init. + +The proper way to override config files is to pass the config files +in first, followed by any script-specific overrides. In other +words: + + Date_Init("ConfigFile=DateManip.cnf","DateFormat=Other") + +=item B + +In Date::Manip::5.xx, Date_Init could return the list of all +config variables. This functionality is no longer supported. +Date_Init is used strictly to set config variables. + +=item B<(*) Config file options> + +Date::Manip 5.xx had the concept of a global and personal config +file. In addition, the personal config file could be looked for +in a path of directories. All this was specified using the +config variables: + + GlobalCnf + IgnoreGlobalCnf + PersonalCnf + PersonalCnfPath + PathSep + +All of these have been removed. Instead, the single config variable: + + ConfigFile + +will be used to specify config files (with no distinction between a +global and personal config file). Also, no path searching is +done. Each must be specified by a complete path. Finally, any number +of config files can be used. So the following is valid: + + Date_Init("ConfigFile=./Manip.cnf","ConfigFile=/tmp/Manip.cnf") + +=item B + +The following config variables have been removed. + + TodayIsMidnight Use DefaultTime instead. + + ConvTZ Use SetDate or ForceDate instead. + + Internal Use Printable instead. + + DeltaSigns Use the Date::Manip::Delta::printf + method to print deltas + + UpdateCurrTZ With real time zone handling in + place, this is no longer necessary + + IntCharSet This has been replaced with better support for + international character sets. The Encoding config + variable may be used instead. + +=item B + +The following config variables are deprecated and will be removed +in some future version: + + TZ Use SetDate or ForceDate instead. + +=item B + +Previously, holidays could be defined as a "Date + Delta" or "Date - +Delta" string. These predate recurrences, and introduce some complexity +into the handling of holidays. Since recurrences are a much better +way to define holidays, the "Date + Delta" and "Date - Delta" strings +are no longer supported. + +=item B + +The SetDate and ForceDate variables (which include the functionality +of the deprecated TZ variable) are much improved as described in the +Date::Manip::Config documentation. + +Since it is now handles time change correctly (allowing time changes +to occur in the alternate time zone), parsed results may be different +than in 5.x (but since 5.x didn't have proper time zone handling, this +is a good thing). + +=back + +=head1 DATE PARSING AND OPERATIONS + +=over 4 + +=item B<(*) today, tomorrow, yesterday> + +The words "today", "tomorrow", and "yesterday" in 5.xx referred to the +time now, 24 hours in the future, and 24 hours in the past respectively. + +As of 6.00, these are treated strictly as date strings, so they are +the current day, the day before, or the day after at the time 00:00:00. + +The string "now" still refers to the current date and time. + +=item B + +A couple of the date formats from Date::Manip 5.xx conflicted with ISO +8601 formats in the spec. These are documented in the +Date::Manip::Date documentation. + +Dates are now parsed according to the spec (though a couple extensions +have been made, which are also documented in the Date::Manip::Date +documentation). + +There is one change with respect to Date::Manip 5.xx that results from +a possible misinterpretation of the standard. In Date::Manip, there is +a small amount of ambiguity in how the Www-D date formats are +understood. + +The date: + + 1996-w02-3 + +might be interpreted in two different ways. It could be interpreted as +Wednesday (day 3) of the 2nd week of 1996, or as the 3rd day of the +2nd week of 1996 (which would be Tuesday if the week begins on +Sunday). Since the specification only works with weeks which begin on +day 1, the two are always equivalent in the specification, and the +language of the specification doesn't clearly indicate one +interpretation over the other. + +Since Date::Manip supports the concept of weeks starting on days other +than day 1 (Monday), the two interpretations are not equivalent. + +In Date::Manip 5.xx, the date was interpreted as Wednesday of the 2nd +week, but I now believe that the other interpretation (3rd day of the +week) is the interpretation intended by the specification. In addition, +if this interpretation is used, it is easy to get the other interpretation. + +If 1996-w02-3 means the 3rd day of the 2nd week, then to get Wednesday +(day 3) of the week, use the following two Date::Manip::Date methods: + + $err = $date->parse("1996-w02-1"); + $date2 = $date->next(3,1); + +The first call gets the 1st day of the 2nd week, and the second call +gets the next Wednesday. + +If 1996-w02-3 is interpreted as Wednesday of the 2nd week, then to +get the 3rd day of the week involves significantly more work. + +In Date::Manip 6.00, the date will now be parsed as the 3rd day of the +2nd week. + +=item B<(*) Parsing is now more rigid> + +The philosophy in Date::Manip 5.xx with respect to parsing dates was +"if there's any conceivable way to find a valid date in the string, do +so". As a result, strings which did not look like they could contain a +valid date often would. + +This manifested itself it two ways. First, a lot of punctuation was +ignored. For example, the string "01 // 03 -. 75" was the date +1975-01-03. + +Second, a lot of word breaks were optional and it was often acceptable +to run strings together. For example, the delta "in5seconds" would +have worked. + +With Date::Manip 6.00, parsing now tries to find a valid date in the +string, but uses a more rigidly defined set of allowed formats which +should more closely match how the dates would actually be expressed in +real life. The punctuation allowed is more rigidly defined, and word +breaks are required. So "01/03/75" will work, but "01//03/75" and +"01/03-75" won't. Also, "in5seconds" will no longer work, though "in 5 +seconds" will work. + +These changes serve to simplify some of the regular expressions used +in parsing dates, as well as simplifying the parsing routines. They +also help to recognize actually dates as opposed to typos... it was too +easy to pass in garbage and get a date out. + +=item B + +I've dropped support for a few very uncommon (probably never used) +formats. These include (with Jan 3, 2009 as an example): + + DD/YYmmm 03/09Jan + DD/YYYYmmm 03/2009Jan + mmmYYYY/DD Jan2009/03 + YYYY/DDmmm 2009/03Jan + + mmmYYYY Jan2009 + YYYYmmm 2009Jan + +The last two are no longer supported since they are incomplete. + +With the exception of the incomplete forms, these could be added back in +with very little effort. If there is ever a request to do so, I probably +will. + +=item B + +Date::Manip 5.xx supported the format: + + DD/mmm/YYYY:HH:MN:SS + +used in the apache logs. Due to the stricter parsing, this format +is no longer supported directly. However, the parse_format method +may be used to parse the date directly from an apache log line +with no need to extract the date string beforehand. + +=item B + +The behavior of Date_PrevWorkDay has changed slightly. + +The starting date is checked. If $timecheck was non-zero, the +check failed if the date was not a business date, or if the time was +not during business hours. If $timecheck was zero, the check failed +if the date was not a business date, but the time was ignored. + +In 5.xx, if the check failed, and $timecheck was non-zero, day 0 +was defined as the start of the next business day, but if $timecheck +was zero, day 0 was defined as the previous business day at the +same time. + +In 6.xx, if the check fails, and $timecheck is non-zero, the behavior +is the same as before. If $timecheck is zero, day 0 is defined as the +next business day at the same time. + +So day 0 is now always the same, where before, day 0 meant two +different things depending on whether $timecheck was zero or not. + +=item B<(*) Default time> + +In Date::Manip 5.xx, the default times for dates was handled in an +inconsistent manner. In the Date::Manip::Date documentation, if you +parse a date from the "Common date formats" section, in Date::Manip +5.xx, if no time was included, it defaulted to "00:00:00". If you +parsed a date from the "Less common formats" section, the default time +was the current time. + +So running a program on Jun 5, 2009 at noon that parsed the following +dates gave the following return values: + + Jun 12 => Jun 12, 2009 at 00:00:00 + next week => Jun 12, 2009 at 12:00:00 + +This behavior is changed and now relies on the config variable DefaultTime. +If DefaultTime is "curr", the default time for any date which includes no +information about the time is the current time. Otherwise, the default time +is midnight. + +=item B<%z format> + +In Date::Manip 5.xx, the %z format would give an offset in the form: -0500. +Now it gives it in the form: -05:00:00 + +=back + +=head1 DELTAS + +=over 4 + +=item B + +In Date::Manip 5.xx, a parsed delta could be written in the delta style + + 1:2:3 + +or in a language-specific expanded form: + + 1 hour 2 minutes 3 seconds + +or in a mixed form: + + 1 hour 2:3 + +The mixed form has been dropped since I doubt that it sees much use in +real life, and by dropping the mixed form, the parsing is much +simpler. + +=item B + +In Date::Manip 5.xx, the approximate delta between the two dates: + + Jan 10 1996 noon + Jan 7 1998 noon + +was +1:11:4:0:0:0:0 (or 1 year, 11 months, 4 weeks). As of +Date::Manip 6.00, the delta is +2:0:-0:3:0:0:0 (or 2 years minus 3 +days). Although this leads to mixed-sign deltas, it is actually +how more people would think about the delta. It has the additional +advantage of being MUCH easier and faster to calculate. + +=item B + +When printing parts of deltas in Date::Manip::5.xx, the approximate +relationship of 1 year = 365.25 days was used. This is the correct +value for the Julian calendar, but for the Gregorian calendar, a +better value is 365.2425, and this is used in version 6.00. + +=item B + +The formats used in the printf command are slightly different than in the +old Delta_Format command. + +The old formats are described in the Date::Manip::DM5 manual, and the +new ones are in the Date::Manip::Delta manual. + +The new formats are much more flexible and I encourage you to switch over, +however at this point, the old style formats are officially supported for +the Delta_Format command. + +At some point, the old style formats may be deprecated (and removed at +some point beyond that), but for now, they are not. + +The old formats are NOT available using the printf method. + +=back + +=head1 RECURRENCES + +=over 4 + +=item B + +The value of the day field can refer to several different things +including the day of week number (Monday=1 to Sunday=7), day of month (1-31), +day of year (1-366), etc. + +In Date::Manip 5.xx, it could also refer to the nth day of the week +(i.e. 1 being the 1st day of the week, -1 being the last day of the +week). This meaning is no longer used in 6.xx. + +For example, the recurrence: + + 1*2:3:4:0:0:0 + +referred to the 3rd occurrence of the 4th day of the week in February. + +The meaning has been changed to refer to the 3rd occurrence of day 4 +(Thursday) in February. This is a much more useful type of recurrence. + +As a result of this change, the related recurrence: + + 1*2:3:-1:0:0:0 + +is invalid. Negative numbers may be used to refer to the nth day +of the week, but NOT when referring to the day of week numbers. + +=item B + +Previously, the list of dates implied by the recurrence were on or +after the start date, but before the end date. + +This has been changed so that the dates may be on or before the end +date. + +=item B + +Date::Manip 5.xx claimed support for a recurrence: + + every 2nd day in June [1997] + +In actuality, this recurrence is not practical to calculate. It +requires a base date which might imply June 1,3,5,... in 1997 but June +2,4,6 in 1998. + +In addition, the recurrence does not fit the mold for other +recurrences that are an approximate distance apart. This type of +recurrence has a number of closely spaced events with 11-month gaps +between groups. + +I no longer consider this a valid recurrence and support is now +dropped for this string. + +I also dropped the following for a similar reason: + + every 6th Tuesday [in 1999] + +=item B + +Previously, ParseRecur would supply default dates if the start or +end were missing. This is no longer done. + +=back + +=head1 DATE::MANIP FUNCTIONS + +The Date::Manip module contains the same functions that Date::Manip 5.xx had +(though the OO modules do all the work now). In general, the routines behave +the same as before with the following exceptions: + +=over 4 + +=item B + +Previously, Date_ConvTZ took 1 to 4 arguments and used the local time zone and +the ConvTZ config variable to fill in missing arguments. + +Now, the Date_ConvTZ function only supports a 3 argument call: + + $date = Date_ConvTZ($date,$from,$to); + +If $from is not given, it defaults to the local time zone. If $to is not given, +it defaults to the local time zone. + +The optional 4th argument ($errlevel) is no longer supported. If there is +an error, an empty string is returned. + +=item B + +In Date::Manip 5.xx, it was recommended that you pass arguments to +ParseDate or ParseDateDelta. This is not recommended with 6.00 since it +is much more intelligent about handling the arguments, and you'll just +end up parsing the date/delta twice. + +=back + +=head1 BUGS AND QUESTIONS + +Please refer to the L documentation for +information on submitting bug reports or questions to the author. + +=head1 SEE ALSO + +L - main module documentation + +=head1 LICENSE + +This script is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=head1 AUTHOR + +Sullivan Beck (sbeck@cpan.org) + +=cut diff --git a/lib/Date/Manip/Changes6.pod b/lib/Date/Manip/Changes6.pod new file mode 100644 index 0000000..9f5c6fa --- /dev/null +++ b/lib/Date/Manip/Changes6.pod @@ -0,0 +1,1566 @@ +# Copyright (c) 2009-2017 Sullivan Beck. All rights reserved. +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +# Changes are listed in the order: +# +# =item SPECIFIC IMPORTANT CHANGE +# =item New features +# =item Bug fixes +# =item Time zone fixes +# =item Language fixes +# =item Test fixes +# =item Documentation fixes + +=pod + +=head1 NAME + +Date::Manip::Changes6 - changes in Date::Manip 6.xx + +=head1 SYNOPSIS + +This describes the changes made to the Date::Manip module in the 6.xx +series of releases. Major changes are marked with asterisks (*). + +For the most part, Date::Manip has remained backward compatible at +every release, but occasionally, a change is made which is backward +incompatible. These are marked with an exclamation mark (!). + +=head1 VERSION 6.61 (planned 2017-12-01) + +=head1 VERSION 6.60 (planned 2017-09-01) + +=over 4 + +=item Bug fixes + +Fixed a bug where if a recurrence had no interval, start and end dates passed +in to the dates method would not work. PJ-DSI-DevOps (GitHub #12). + +=item Documentation fixes + +Clarified Date::Manip::TZ::all_periods. Based on discussion with +Peter Pfannenschmid. + +=back + +=head1 VERSION 6.59 (2017-06-01) + +=over 4 + +=item Time zone fixes + +Newest zoneinfo data (tzdata 2017b) + +=item Documentation fixes + +Improved some of the documentation. + +=back + +=head1 VERSION 6.58 (2017-03-01) + +=over 4 + +=item Better support for $mode in DateCalc. + +DateCalc (in DM6) did not support all values for $mode. Now it does. + +=item Bug fixes + +Parsing a date like 01/02/2016 and calling printf with %e gave '02' instead +of ' 2'. RT 119787. + +Fixed a problem where the tzdata method of determining the timezone was +producing an error which wasn't correct. John (GitHub #8) + +=item Time zone fixes + +Newest zoneinfo data (tzdata 2017a) + +=back + +=head1 VERSION 6.57 (2016-12-01) + +=over 4 + +=item Time zone fixes + +Newest zoneinfo data (tzdata 2016j) + +=item Test fixes + +A faulty test was failing in a few places. RT 118705 + +Another test was failing due to a perl bug that popped up in 5.25.7. Tweaked +the test to bypass the bug. RT 118862 + +=back + +=head1 VERSION 6.56 (2016-09-09) + +=over 4 + +=item Test fixes + +A faulty test was failing most places. New release to correct that problem. +RT 117404 + +=back + +=head1 VERSION 6.55 (2016-09-01) + +=over 4 + +=item Fixed bug where C<$::TZ> wasn't used + +The C<$::TZ> variable was not getting interpreted correctly when searching +for a timezone. RT 114949. + +=item Fixed bug where recurrences were not parsed correctly + +Passing in incorrect values for a field was not trapped in all cases +and it led to problems. All values passed in to a recurrence are now +correctly checked. Albert Hilazo (GitHub #7). + +=item Fixed a bug in some methods of creating new objects + +Some methods of creating new objects based on existing objects did not +correctly use the existing object. Bug has never been reported, but was +discovered when adding tests to get 100% coverage. + +=item Time zone fixes + +Newest zoneinfo data (tzdata 2016f) + +=item Test fixes + +Added a number of new tests based on Devel::Cover. + +=back + +=head1 VERSION 6.54 (2016-05-31) + +=over 4 + +=item Deprecation of Date::Manip 5.xx tests + +By default, the Date::Manip 5.xx tests will no longer run. Changes to +the timezone data can cause failures. Since Date::Manip 5.xx is no longer +supported in any way, these tests will no longer run on a system where +6.xx can be run. Richard Jelinek. + +=item Deprecation of TZ postponed + +The deprecation of the TZ variable has been postponed to March 2017. I +decided that 1 year was not enough notice (especially since not everyone +will have updated Date::Manip since March 2015 when the warning was added. + +=item Bug fixes + +Changed requirement for ExtUtils::MakeMaker to 6.67_01. RT 112286 + +Fixed a bug where a timezone abbreviation was not parsed correctly when +passed in as a value to the SetDate, ForceDate, or TZ config variables. +Based on a report in perlmonks.org. + +=item Time zone fixes + +Newest zoneinfo data (tzdata 2016d) + +Made some improvements to how I handled the timezone data which resulted +in a few of the default timezones being changed. + +=item Documentation fixes + +Fixed one more typo. RT 114095 + +Clarified the Config document. Based on a report in perlmonks.org. + +=back + +=head1 VERSION 6.53 (2016-03-02) + +=over 4 + +=item Bug fixes + +Date::Manip::Delta::cmp had a bug in it's comparison. Ian Gibbs. + +The secs_since_1970_GMT method was missing a test to see if it was +a valid object. RT 111915 + +=item Time zone fixes + +Newest zoneinfo data (tzdata 2016a) + +=item Documentation fixes + +Lots of typos fixed. I was using podspell to do spell checking, but it was +discarding too much real text (which wasn't getting checked as a result). +Switched to pod2text which does a better job. RT 110025 + +=back + +=head1 VERSION 6.52 (2015-12-01) + +=over 4 + +=item B + +The date range can now be specified for either the fully modified dates, or +the unmodified dates. This will make it easier to work with holidays in some +instances. Based on L. + +=item B + +Based on L. + +=item B<(!) Reworked holidays slightly> + +Previously, every line in the Holidays section defined a unique holiday. +Now, the names determine the list of holidays. + +It is not allowed to have two separate holidays named exactly the same. +It IS allowed to have complex holidays that require two (or more) lines +in the Holidays section to define them completely. + +Based on L. + +=item Bug fixes + +Fixed a bug where the RecurRange config variable wasn't getting used. + +Fixed a bug where some deltas were not parsed correctly as dates. +RT 109600 + +=item Time zone fixes + +Newest zoneinfo data (tzdata 2015g) + +=item Test fixes + +Added a number of new tests based on Devel::Cover. + +=back + +=head1 VERSION 6.51 (2015-09-01) + +=over 4 + +=item Changes suggested by perlcritic + +Played with perlcritic and made a few minor changes based on it's suggestions. +I doubt I will use perlcritic significantly. + +=item B<(!) Date::Manip::Delta::value now returns an empty string> + +If a delta has an error, or no valid delta in it, the value method returns +an empty string instead of undef. This is to be consistent with the +Date::Manip::Date::value method which returns an empty string. + +=item Bug fixes + +Fixed a bug where date/delta calculations with deltas that are too +large was not working correctly. They now set an error condition +and fail. RT 105737 + +Fixed a bug introduced by the previous patch and luckily discovered +pre-release by Tom Wyant. + +Fixed code that produced a warning in 5.22.0. Tom Wyant + +=item Improved DM6 ParseDate and ParseDateString + +Added C<@opts> argument. Based on RT 105622. + +=item Time zone fixes + +Newest zoneinfo data (tzdata 2015f) + +Now uses /etc/localtime as a method to determine the local timezone. +Patch supplied in RT 105159 (modified by me). The patch uses some +code derived from DateTime::TimeZone . + +Clearer message when the date is not valid in the timezone. + +=item Test fixes + +Added a number of new tests based on Devel::Cover. Over the next several +releases, I intend to continue to add tests until coverage is 100%. + +=item Documentation fixes + +Fixed a typo. RT 105546 + +=back + +=head1 VERSION 6.50 (2015-06-01) + +=over 4 + +=item Bug fixes + +Not really a bug, but 6.49 got a bunch of NYTprof data bundled with it +by mistake. It's been removed. RT 103252 + +Fixed a bug where information about whether a date was complete or +truncated was discarded. Jim Avera + +Fixed a bug where SetDate with a zone alias failed. + +Added the Format_MMMYYYY config variable to allow the truncated format +mmmYYYY to be parsed instead of mmmDDYY. David W. Morganwalp and RT 103142 + +Fixed Makefile.PL/Build.PL to correct for a change on perl on windows +which changes a module prereq requirement. Alexandr Ciornii + +=item Time zone fixes + +Newest zoneinfo data (tzdata 2015d) + +Added aliases for older HP-UX time zones. RT 104141 + +=item Documentation fixes + +Fixed URL for tzdata. Mohammad S Anwar (GitHub #3). + +Better POD formats. + +Fixed a documentation error. RT 103966 + +=back + +=head1 VERSION 6.49 (2015-03-01) + +=over 4 + +=item Added a deprecation warning + +The TZ config variable is going away. Added a deprecation warning. + +=item Some speedups for timezone handling + +Based on RT 102284, I have done some optimization of the timezone handling +code. + +=item Bug fixes + +Added the missing is_date base method to Date::Manip::Base. Mario Domgoergen. + +=item Time zone fixes + +Newest zoneinfo data (tzdata 2015a) + +=item Language fixes + +A number of corrections by Nicholas Riley + +=back + +=head1 VERSION 6.48 (2014-12-01) + +=over 4 + +=item Put repository on GitHub + +Suggested by Gabor Szabo + +=item parse_time now parses ISO 8601 times + +The parse_time routine wouldn't correctly parse ISO 8601 times. This +is now fixed. + +=item Parsing special dates with timezones now works + +Parsing special date formats with timezones is now supported such as: + + Christmas at noon PST + in 3 days at noon PST + now PST + epoch 3000000 PST + +=item dm_zdump modified + +To match the newest version of zdump, the gmtoff is now added at the end +of each line. + +=item Bug fixes + +Fixed a bug in the printf method that would not handle embedded newlines +correctly (and resulted in an infinite loop if it were preceded by a '%'). +Henrique Martins + +Fixed a bug where '24:00' was not parsed correctly (though '24:00:00' was). + +Fixed a bug where fractional values separated by a comma weren't parsed +correctly. + +=item Time zone fixes + +Newest zoneinfo data (tzdata 2014j) + +=back + +=head1 VERSION 6.47 (2014-09-01) + +=over 4 + +=item Time zone fixes + +Newest zoneinfo data (tzdata 2014f) + +=item Language fixes + +Fixed some encoding errors in the language pod documentation. + +=back + +=head1 VERSION 6.46 (2014-07-08) + +=over 4 + +=item Broken distribution + +The distribution contained an temporary edit file that caused problems. +RT 96459 + +=item Time zone fixes + +Newest zoneinfo data (tzdata 2014e) + +=item Language fixes + +Added some plural abbreviations that were missing. RT 96944 + +=back + +=head1 VERSION 6.45 (2014-06-05) + +=over 4 + +=item Fixed a test + +One test was failing (reported in RT 96249 as well as several CPAN Tester +reports). + +=back + +=head1 VERSION 6.44 (2014-06-01) + +=over 4 + +=item B<(*) Improvements to UTF8 handling> + +A number of changes based on RT 93545 and other discussion with Yuri Nikulin +including: + +Case insensitive matching of UTF8 strings should work all the time. + +Fixed two significant bugs in regexps for parsing dates. + +Improvements to UTF8 handling. + +Corrected some problems with Russian and added the cp1251 encoding. + +One correction to Romanian. + +Added several new test scripts. + +Preliminary patches were supplied by Yuri. + +=item New features + +Modified the parse_format function to return %+ if desired. Mike Cappella + +=item Time zone fixes + +Newest zoneinfo data (tzdata 2014c) + +=item Documentation fixes + +Clarified some DM6 functions. David Close. + +Fixed a typo. RT 95619 + +=back + +=head1 VERSION 6.43 (2014-03-03) + +=over 4 + +=item Several changes to distribution files + +I made several changes to Build.PL, Makefile.PL, META.yml in order to +improve the quality (or kwalitee) of the module. None of these should +impact anyone using the module. + +=item Time zone fixes + +Newest zoneinfo data (tzdata 2013i) + +=item Documentation fixes + +Cleaned up some of the Recur documentation. Suggested by RT 92794 + +=back + +=head1 VERSION 6.42 (2013-12-02) + +=over 4 + +=item Added ParseDateFormat function + +Added the ParseDateFormat function to the DM6 functional interface +in response to RT 89286. + +=item Added Common Log format + +Added the date format used in apache logs: 11/Oct/2000:13:55:36 -0700 +RT 89286. + +=item Time zone fixes + +Newest zoneinfo data (tzdata 2013h) + +=item Bug fixes + +Fixed a bug where dates of the form of a delta with a timezone attached +(i.e. "1 day ago at midnight UTC") failed. RT 89256 + +Fixed a bug where events handling gave a warning if there were no events +that applied. RT 90344 + +=back + +=head1 VERSION 6.41 (2013-09-05) + +=over 4 + +=item Bug fixes + +Removed a .swp file accidentally left in the package. RT 85845 + +Fixed a bug in parse_format where times between 00:00:00 and 01:00:00 weren't +parsed correctly. Ole Nomann Thomsen + +Fixed generated META.* files to not require Module::Build 0.39. RT 86137 + +Fixed a bug where parse_format did not work with a '%s' format. RT 87498 + +Fixed a bug where find_encoding wasn't imported from the Encode module. RT 87665 + +Fixed a bug where recurrences with no interval did not work if a start and +end date were specified, and no dates fell in that range. Jan Pradac + +=item Time zone fixes + +Newest zoneinfo data (tzdata 2013d) + +=back + +=head1 VERSION 6.40 (2013-06-01) + +=over 4 + +=item Removed PODs + +POD documentation is no longer generated for Date::Manip::TZ::* and +Date::Manip::Offset::* modules. + +=item Time zone fixes + +Newest zoneinfo data (tzdata 2013c) + +=back + +=head1 VERSION 6.39 (2013-03-01) + +=over 4 + +=item Added the $mode argument to ParseDateDelta + +The ParseDateDelta function (in functional interface) did not allow you +to force a parsed delta to semi or approx where appropriate. This +was added. Based on RT 82991). + +=item Added get_config method + +The get_config method was added to all classes. Suggested by Philippe Poilbarbe. + +=item Language fixes + +Fixed a German language problem. Gosta Oelstrom + +=item Documentation fixes + +Documented workaround for dmake problem in strawberry perl. Discussed on +perlmonks and RT 79837. + +Clarified the Examples page. Winston Heng + +=back + +=head1 VERSION 6.38 (2013-01-08) + +=over 4 + +=item B<(*) Tar file format corrected> + +Problems were reported on several OSes by people unable to install Date::Manip +(and other modules). It turns out that the version of tar distributed by +my linux distro (OpenSuSE) uses the 'posix' format instead of the traditional +'gnu' format by default. This causes problems for some versions of tar. I +have had reports from OSX, Windows, and SunOS. Future versions of +Date::Manip will be explicitly distributed in the 'gnu' tar archive format. + +Reported by Jay Allen and RT 80594. + +=item B<(*) Date::Manip 5.xx end-of-life> + +Date::Manip 5.xx is now officially out of support. I will not be doing +any further work on it. The only exception is that I will consider +adding user supplied patches on a case-by-case basis. + +If at all possible, please use Date::Manip 6.xx instead. + +=item B<(!) Removed some deprecated config variables> + +The following config variables have been removed. + + IntCharSet + RecurNumFudgeDays + +=back + +=head1 VERSION 6.37 (2012-12-01) + +=over 4 + +=item Bug fixes + +Fixed a bug where ISO 8601 format YYYY-WXX-D didn't work if the week ended +up in December. Gordon Lugauer. + +=item Time zone fixes + +Newest zoneinfo data (tzdata 2012j) + +=item Documentation fixes + +Spelling error fixed. RT 80621 + +=back + +=head1 VERSION 6.36 (2012-10-31) + +This was an interim release to fix the version numbers (6.35 was +released with all of the version numbers 6.34). + +=head1 VERSION 6.35 (2012-10-31) + +This was an interim release to fix the problem with the PATH being +replaced. + +=over 4 + +=item Removed dependency on YAML + +I've reverted the language data files to perl literals instead of YAML. Though +not quite as easy to maintain, it solves a few problems. Patch provided by +Christopher Madsen. + +=item Bug fixes + +Last versions fix for RT 78566 overrode the PATH even when that wasn't +appropriate. This is fixed. Report and patch supplied by RT 80435. + +=back + +=head1 VERSION 6.34 (2012-09-04) + +This is a bug fix so that the PATH won't break non-unix installs. + +=over 4 + +=item Bug fixes + +Put the PATH inside the Unix section so it doesn't affect non-unix +environments. Geoff Rowell + +=back + +=head1 VERSION 6.33 (2012-09-01) + +=over 5 + +=item Improvements to Date::Manip::Delta + +Added convert method. This had been planned since 6.30, but based on +a discussion with Henrique Martins, I moved it up in priority. + +Cleaned up handling of delta field lengths (they are now only calculated +once. + +Added cmp method. Henrique Martins + +=item Bug fixes + +The language modules read from the DATA section, but I never closed the +filehandle. This is fixed now. Patch by Doru Theodor Petrescu + +Added better loading of DM5/DM6 modules. RT 78512 + +Added a secure PATH to TZ.pm for taint reasons. In response to RT 78566 + +=item Time zone fixes + +Now supports timezones in files with spaces where there should be +underscores. This occurs in RHEL desktop. RT 78566 + +Newest zoneinfo data (tzdata 2012e) + +=item Documentation fixes + +Minor fix. Henrique Martins + +=back + +=head1 VERSION 6.32 (2012-06-01) + +=over 4 + +=item Modified Build.PL + +Build.PL now has better support for building (or not building) HTML files. +Apparently this is slow on Windows. Patch provide in RT 75118. + +=item Bug fixes + +Fixed a bug in business day calculations. RT 76336 + +Fixed a bug where Delta/Recur objects weren't correctly created. Zsban Ambrus + +Fixed a bug where SetDate/ForceDate config variables could not be included +in a file. Jerry Wilcox + +=item Time zone fixes + +Newest zoneinfo data (tzdata 2012c). + +=item Documentation fixes + +Better support for UTF-8 in autogenerated language module pod files. + +=back + +=head1 VERSION 6.31 (2012-03-01) + +=over 4 + +=item Added extended formats to printf method. + +These include the %, %, %, %, %, +%, and % formats. Chris Jackson + +=item Can now parse formats where the time and zone are not adjacent + +A string like 'Jan 21 17:13:27 2010 -0400' can now be parsed. Requested +on perlmonks ('Can Date::Manip parse a unix timestamp' thread). + +=item Added PeriodTimeSep config variable. + +This allows you to use a period as a time separator. Ed Avis + +=item Holidays can be used as date strings + +You can now parse a holiday name in the Date::Manip::Date::parse method. +For example, parse('Christmas'). Requested by Abigail. + +=item Added new recur modifiers + +Added WDn, IBD, and NBD modifiers. + +=item Added a new date format + +You can now parse '2nd day in May' formats. Randy Harmon + +=item More flexibility in parsing timezones with both offset and abbrev + +If you include both the offset and abbreviation in the timezone portion +of a date, the parenthesis around the abbreviation are now optional, so +you can parse both: + + -04:00 (EDT) + -04:00 EDT + +Requested by Steven Melendez. + +=item Deltas now support fractional values. + +You can now use a delta of 1.5 days. RT 42699 + +=item Multiple holidays supported + +A date may now have multiple holidays. Keith Minkler + +=item Bug fixes + +Fixed a bug where abbreviations were not being examined case insensitively. +Jurgen Muck + +The Holidays section may be safely split across multiple config files. +A bug prevented this from working before. + +=item Language fixes + +The Norwegian translation was broken due to a typo in the language module. + +Included complete documentation for each language. + +Fixed a couple problems with Danish. Nicholas Oxhaj + +Added Finnish (from a VERY old mail that I overlooked somehow). Iikka +Virkkunen + +Cleaned up the values used by printf directives to give the expected +result. + +=item Documentation fixes + +Fixed a typo. Nicholas Bamber + +=back + +=head1 VERSION 6.30 (2012-01-11) + +=over 4 + +=item B<(*) (!) Reworked deltas> + +Much of the delta code was reworked. + +The constraint that a day is treated as 24 hours was removed (by +adding the concept of semi-exact deltas) to better handle daylight +saving time calculations. + +Made cosmetic changes to which signs will be included in a delta to +make the deltas more readable. Signs which are the same as the next +higher field will be omitted, even if they cross set boundaries. + +Added support for non-normalized deltas. See the $no_normalize +option for the parse and set methods. + +Removed limitations on subtract=2 not working with business +calculations. + +Thanks to discussion on perlmonks, and RT 65774 that prompted me to do +this. I'd been wanting to do it for some time, but the discussion on +perlmonks made me realize that this needed to be much higher priority. + +=item B<(!) Modified Delta_Format> + +In conjunction with the above work, added the 'semi' mode to +Delta_Format. + +=item B<(!) Removed some deprecated config variables> + +The following config variables have been removed. + + GlobalCnf + IgnoreGlobalCnf + PersonalCnf + PersonalCnfPath + PathSep + + Internal + DeltaSigns + UpdateCurrTZ + ConvTZ + OldConfigFiles + ResetWorkDay + +=item Time zone fixes + +Newest zoneinfo data (tzdata 2011n). RT 71595 + +Corrects a bug where +0000 and -0000 offsets were not parsed correctly. +Aaron Hall + +The zoneinfo data includes rules more than 20 years in the future, so we +now store 30 years of future dates instead of 20 to catch these rules. + +When parsing the timezone portion of the date, timezone abbreviations +now take higher precedence than zone names (since that is how timezone +information is typically specified). That only impacts dates where +the a timezone name is the same as an abbreviation, such as 'CET'. + +Previously, a date with CET in it was interpreted as in the CET timezone. +Now it is interpreted as in a timezone with the CET abbreviation. + +=item Better handling of undef in DM6 + +The date/delta parsing routines in DM6 will now handle an undef argument +without issuing a warning. Earl C. Ruby III + +=item Bug fixes + +Fixed a bug with the parse_format %f and %i formats. Tommi Rintala + +Fixed a bug where the Date::Manip::Delta::set function didn't work +to set the month value. + +Fixed a bug where parsing some dates near during a DST change failed. + +Minor bug fix when using Delta_Format. Prompted while investigating +RT 41095. + +=back + +=head1 VERSION 6.25 (2011-08-31) + +=over 4 + +=item Relaxed one constraint in ISO 8601 dates + +A time separated by whitespace from the date can use a single digit hour. +Yuming Philip Xiang + +=item B<(*) Set official removal dates for old config variables> + +Config variables will be removed 2 years after they are deprecated (except +for the TZ variable which, due to it's wide use, will be kept for 4 years). + +=item Time zone fixes + +Newest zoneinfo data (tzdata 2011i) + +=back + +=head1 VERSION 6.24 (2011-06-13) + +=over 4 + +=item New features + +Spaces are ignored in the SetDate/ForceDate config values. Zsban Ambrus + +=item Bug fixes + +Fixed a bug where 'in one week' wasn't correctly parsed. E. M. Shtern + +Fixed a bug where options passed in to the 'new' as a listref weren't handled +properly. Zsban Ambrus + +=item Time zone fixes + +Newest zoneinfo data (tzdata 2011g) + +=back + +=head1 VERSION 6.23 (2011-04-15) + +=over 4 + +=item B<(!) Renamed one Date::Manip::Recur method> + +The Date::Manip::Recur::base method has been renamed to basedate . The +Date::Manip::Recur::base method should return the Date::Manip::Base object +like all the other Date::Manip modules. + +=item B<(*) Reworked holidays defined as recurrences> + +Improved dealing with the bootstrap problem of defining holidays, especially +those that contain business day flags. Mike Tonks + +=item New features + +The printf function will now take multiple format strings and return a list +of values. Zsban Ambrus + +=item Bug fixes + +Fixed a bug where GlobalCnf wasn't working. Peter Edwards + +Improved error messages in a few cases. + +Fixed a bug where one invalid date/timezone check was ignored. Morten Bjornsvik + +Fixed a bug where '$base2 = new Date::Manip::Base $base1' wasn't working. RT 67143 + +Fixed a bug where passing dates in to the Recur->dates method failed. RT 67144 + +Fixed a bug where the mode wasn't being preserved correctly for a delta. RT 67150 + +Fixed a bug in recurrences where a base date outside of a date range with a very +uncommon recurrence format would not work correctly. + +Fixed a problem where the '%s' printf option didn't work in GMT. +Jean-Michel Hiver + +=item Time zone fixes + +Newest zoneinfo data (tzdata 2011f) + +=item Documentation fixes + +Fixed two bad recurrence examples in the documentation. Peter Edwards +and Mike Tonks + +=back + +=head1 VERSION 6.22 (2011-03-07) + +=over 4 + +=item Time zone fixes + +Newest zoneinfo data (tzdata 2011b) + +Fixed a bug where the gmtoff method of getting the local timezone was broken. +Martin Zinser. + +Fixed the 'env' method of determining the local time zone to allow the +value to be an offset of seconds since UTC. This allows the VMS +SYS$TIMEZONE_DIFFERENTIAL variable to work correctly. Martin Zinser. + +Removed the SYS$TIMEZONE_RULE method from VMS since the value stored there +is not the name of a timezone (it's a rule in a non-standard format). Based +on discussion with Martin Zinser. + +Improved the order in which aliases, abbreviations, etc., are tested +to test current usage before non-current usage (there were a few cases +where old usages were getting tested before current usage. + +=item Language fixes + +The module will now die if a language module cannot be loaded (most +likely due to a YAML::Syck issue). Based on discussion with Martin Zinser. + +=item Documentation fixes + +Added a sample config file document. Based on discussion with Rich Duzenbury. + +=back + +=head1 VERSION 6.21 (2011-01-10) + +=over 4 + +=item New features + +Deltas may now contain spelled out numbers, so 'in 2 weeks' and 'in two weeks' +will both work. Daniel Shahaf + +=item Bug fixes + +Fixed a bug where week_of_year didn't work in some cases. Chris Eveland. + +Fixed a minor potential bug. Geraint Edwards. + +=item Time zone fixes + +Updated windows time zone aliases. Daniel Harding + +=item Language fixes + +Added Norwegian. Glenn Sogn + +=back + +=head1 VERSION 6.20 (2010-12-01) + +=over 4 + +=item B<(*) (!) Reworked recurrences> + +Recurrences were reworked in a (slightly) backward incompatible way to +improve their usefulness (and to make them conform to the expected +results). Most recurrences will work the same as previously, but a few will +differ. Most of this was suggested by Jay Jacobs. + +A recurring event is now calculated relative to the base date, NOT relative +to a previous event. For example, if a recurrence occurs every month, and +the base date was Jan 31, then previously, recurring events would have +been (in a non-leap year): + + D(0) = Jan 31 + D(1) = D(0) + 1 month = Feb 28 + D(2) = D(1) + 1 month = Mar 28 + ... + +The new behavior is: + + D(0) = Jan 31 + D(1) = D(0) + 1*(1 month) = Feb 28 + D(2) = D(0) + 2*(1 month) = Mar 31 + ... + +Previously, if a base date were not specified, it was not determined +from the date range. Now, the start date of the date range acts as the +base date. + +The meaning of the base date has changed slightly. It is much more +meaningful and useful now. + +Added iterator functions. Daniel LaLiberte + +The RecurNumFudgeDays variable is no longer used and is deprecated. + +=item Time zone fixes + +Newest zoneinfo data (tzdata 2010o) + +=back + +=head1 VERSION 6.14 (2010-10-20) + +=over 4 + +=item B<(*) Date::Manip 5.xx fully integrated with 6.xx> + +Date::Manip 5.xx and 6.xx are both installed automatically, and the +correct one will be chosen. + +=item Bug fixes + +Fixed a bug where recurrence handling was broken. RT 62128 + +=item Documentation fixes + +A lot of documentation was cleaned up to be easier to read, and better +organized. + +=back + +=head1 VERSION 6.13 (2010-10-13) + +=over 4 + +=item New features + +Added the input methods to Date::Manip::Date and Date::Manip::Delta. Ed Avis. + +The 'date +%z' command will also be used to determine the timezone. Oliver Schulze + +=item Bug fixes + +Several changes to try to get rid of a memory leaks reported in RT +54937. Huge thanks to BrowserUK on perlmonks for help. Unfortunately, it +ended up being a bug in perl, and will only be resolved when that bug is +fixed. See the Date::Manip::Problems document for more information. + + Reorganized Base/TZ to get rid of circular references. + Added end blocks to clean some global variables. + Got rid of switch/given structures. + +Fixed a bug where an incomplete date with 'last' in it was causing an +error. RT 60138 + +Fixed a bug where 'Sunday, 9th Jan 1972' wasn't parsed correctly. RT 57832 + +=item Time zone fixes + +Fixed a bug where Zones.pm was generated with the abbreviations in the wrong +order. Amish Chana. + +=item Language fixes + +French month abbreviations now support periods. Bernard Haerri + +=item Test fixes + +Added tests from RT 29655 to make sure that the problem never recurs. + +=item Documentation fixes + +Fixed documentation problem with the new_* methods in Date::Manip::Obj. Options +must be passed in as \@opts rather than @opts. + +Cleaned up some of the documentation. + +=back + +=head1 VERSION 6.12 (2010-09-27) + +=over 4 + +=item B<(!) IntCharSet config variable deprecated> + +With better support for international character sets, the old IntCharSet +config variable (which was a bandaid at best) is deprecated. Currently, the +functionality still exists, but it will be removed at some point. + +=item New features + +Added the Encoding config variable. + +Now supports parsing the EXIF date format. Rhesa Rozendaal + +=item Bug fixes + +Fixed Build.PL to not require perl 5.010 since the distribution as a whole +does not require that (and I want that fact to be in META.yml). + +Fixed a bug where the Date::Manip::Date::set method was broken when setting +individual fields. Helmut A. Bender + +Fixed a bug where set didn't work in Date::Manip::Delta. Patch provided in +RT 59096. + +=item Time zone fixes + +Newest zoneinfo data (tzdata 2010m) + +=item Language fixes + +B<(*) Converted all language files to UTF-8 and added rudimentary support for +character encodings. Some assistance by Stephen Ostermiller.> + +Fixed problem in Polish, Dutch. Stephen Ostermiller + +Extended support for 'nth' up to 53rd. Paco Regodon + +Added some corrections to German. Dieter Lange + +=item Documentation fixes + +Clarified Date::Manip::Recur documentation based on RT 59132. + +=back + +=head1 VERSION 6.11 (2010-04-30) + +=over 4 + +=item Bug fixes + +Fixed a problem in Build.PL that had an incorrect module requirement. + +=back + +=head1 VERSION 6.10 (2010-04-29) + +=over 4 + +=item B<(*) Combined 5.xx and 6.xx releases into one distribution> + +Because the automatic module management tools cpan/cpanp would try +to upgrade Date::Manip to the most recent version, and the most +recent version will only work if perl 5.10.0 or higher is installed, +both the 5.xx and 6.xx releases are now combined into a single +distribution. + +This is described more fully in the Date::Manip::Problems document. + +=item B<(!) Zones specified by offset> + +In all operations involving time zones, the time zone must be determined. +By default, it would take all of the information available (date, ISDST, +etc.) and determine the most likely time zone. It would take every time zone +that matched each piece of information, starting with those that matched +in a standard time followed by those that matched in a daylight saving +time. + +When zones are specified by an offset, a standard time would always match +since there are standard time zones that match all year long (the military +time zones A-Z and the standard time zones of the form Etc/GMT+01). As a +result, a daylight saving time match would never occur. + +Since (if the date falls during a daylight saving time period) you usually +want to use a time zone that has that offset in daylight saving time, +the default is now to check daylight saving time zones first, followed +by standard times. + +See the Date::Manip::TZ manual (under the zone method) for more +information. + +=item Bug fixes + +Fixed a bug where Date_ConvTZ not working correctly with time zones +specified by offset. Chris Butler + +Fixed a bug where business mode calculations involving minutes was not +handled correctly. Damien Moore + +Fixed a bug where business mode calculations failed in some cases. RT +56638 + +=item Time zone fixes + +Newest zoneinfo data (tzdata 2010i) + +Changed Date::Manip::TZ::zone so "dst" is sometimes the default +$dstflag. Based on the bug report by Chris Butler. + +OpenUNIX puts a colon at the start of some time zones. It's removed. +Jean Hassler + +=item Test fixes + +Converted tests to Test::Inter + +=item Documentation fixes + +Fixed a documentation bug in Date::Manip::TZ where "stdonly" was +listed as the default value for $dstflag, but in actuality, "std" is +the default. + +=back + +=head1 VERSION 6.07 (2010-02-05) + +=over 4 + +=item Bug fixes + +Fixed bug in Date_TimeZone where it wasn't returning the time zone. +Robert Eden + +=back + +=head1 VERSION 6.06 (2010-02-05) + +=over 4 + +=item Bug fixes + +Minor bug where %Z printf format didn't always work. + +Added support for 5pm back in (it was omitted accidentally). Mark Kennedy + +Fixed a minor warning. Morten Bjoernsvik + +Some additional speedups. + +=item Time zone fixes + +Newest zoneinfo data (tzdata 2010b) + +Added dm_zdump example script. + +Improved TZ::periods functionality + +Fixed bug in Date_ConvTZ where empty values weren't defaulting to local time zone. +Robert Eden + +Fixed a couple of problems in the generated time zones for some odd +cases (America/Resolute and Asia/Tehran). + +=back + +=head1 VERSION 6.05 (2009-12-09) + +=over 4 + +=item B<(!) %z format> + +In Date::Manip 5.xx, the %z format in UnixDate printed the offset in +the form -0500. In 6.00, I changed that to -05:00:00, but this broke +RFC 822 compliance. + +I've changed %z back to -0500, and introduced a new format (%N) which +returns -05:00:00. + +Incidentally, this is the LAST unused letter, so I am now going to +have to either stop adding formats, or add some extended format +syntax. Not sure yet which, but this may involve a backwards +incompatible change in the future. + +=item B<(*) Significant speedups.> + +Thanks to Moritz Lenz and BrowserUK on perlmonks for suggestions (and +a number of other people on perlmonks for suggestions that I did not +end up using, but which provided a great discussion). + +=item Bug fixes + +Fixed a bug in parse_date where the current time was getting used +instead of the documented 00:00:00 + +Bug fix where DateCalc didn't work with $mode in some cases. + +Fixed Makefile.PL/Build.PL to handle Win32::TieRegistry requirement. + +Changed %z printf behavior back to 5.xx and added %N format. Gilles +Lamiral + +Added dm_date example script. + +=item Time zone fixes + +Fixed bug where non-English Windows versions didn't get the +time zone. Thanks to Rene Schickbauer for testing. + +=item Test fixes + +Reduced the precision of 1 test to avoid a rounding difference when +using a perl compiled with uselongdouble. Andreas Koenig + +=back + +=head1 VERSION 6.04 (2009-11-25) + +=over 4 + +=item Bug fixes + +Fixed a bug where events were not interpreted in the correct time zone +if SetDate/ForceDate used. + +=back + +=head1 VERSION 6.03 (2009-11-24) + +=over 4 + +=item Bug fixes + +Corrects a backward incompatibility with UnixDate. Rene Schickbauer + +=item Test fixes + +A couple more corrections to the tests. + +=back + +=head1 VERSION 6.02 (2009-11-24) + +=over 4 + +=item Bug fixes + +Disabled curr_zone_methods when taint checking on. I believe that Date::Manip +is completely taint friendly at this point. + +=item Test fixes + +A quick fix to make sure that the tests run correctly in other time zones. + +=back + +=head1 VERSION 6.01 (2009-11-23) + +=over 4 + +=item Bug fixes + +B<(*) Fixed a bug where dates were sometimes getting the wrong time zone when +SetDate/ForceDate in effect.> + +=back + +=head1 VERSION 6.00 (2009-11-23) + +Date::Manip 6.00 is a total rethink of the module, and a nearly complete +rewrite. Please refer to the Date::Manip::Changes5to6 document for a list +of incompatible changes. + +=over 4 + +=item Reorganization + +B<(*) Massive reorganization and near total rewrite.> + +B<(*) Broke into several smaller modules> + +=item New Features + +B<(*) Full time zone support (using tzdata 2009s)> + +Added some functionality (suggested by James Elson to improve setting +the "current time". Done with the ForceDate config variable. + +B<(*) Converted languages to YAML for much easier maintenance. Patch and +suggestion provided by Evan Carroll> + +Added much better formats for deltas. Suggested by Jim Hranicky. + +Borrowed the _FindWindowsTZName function from the DateTime-TimeZone +module. + +Added SetDate config variable (based on a suggestion by Christian Campbell). + +Added parse_format which was first suggested by Kim Ryan. + +=item Other changes + +Several config variables deprecated + +Thanks to Jonathan Hogue for helping test Windows additions. + +=item Bug fixes (correcting problems in the 5.xx releases) + +Fixed a bug where "YYtoYYYY=c" wouldn't work. + +VMS bugfix to not call `date` command. Lane + +New Year's Day defined using a recurrence which might push the observed +day to the previous year was broken. Reported by Jerry Wilcox. + +=item Language fixes + +Fixed typo in Turkish translation. + +Spelling fix in Dutch. Bart Van Loon + +=item Additional credits + +I have received many suggestions over time which were automatically +handled during the 6.00 rewrite. Although the changes weren't made +because of the suggestions specifically, I wanted to acknowledge +them since I appreciate the suggestions. + +I believe the first person to suggest writing Date::Manip as an OO +module was Eduard Derksen. + +Delta_Format initialization done outside of the function. Eric Boehm + +Added $subtract to calculation routines. First suggested by Steve Berlage. + +Added ability to set individual parts of the date (Date::Manip::Date::set). +First suggested by Martin Thurn. + +UnixDate (i.e. Date::Manip::Date::printf) only calculates formats when +they are needed. Eduard Derksen + +Parsing will skip some date/time formats if requested. This was first +suggested by Eduard Derksen. + +It has been suggested several times to support multiple languages, +multiple config files, or multiple sets of Date_Init +options. These suggestions (by Meng Fang, Ed Avis, Christian +Campbell, and perhaps others) were at the back of my mind as I +developed the Date::Manip::Base class. + +The regular expressions are all i18n friendly in anticipation of much +better support for localization. First suggested by Alex Kapranoff. + +Parsing a date ('today', 'Monday') gives a time of '00:00:00'. Suggested +by Mark Aitchison. + +Working with fractional days was suggested by Peter van Hardenberg. +This is implemented in Date::Manip::Base::day_of_year method. + +=back + +=head1 BUGS AND QUESTIONS + +Please refer to the L documentation for +information on submitting bug reports or questions to the author. + +=head1 SEE ALSO + +L - main module documentation + +=head1 LICENSE + +This script is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=head1 AUTHOR + +Sullivan Beck (sbeck@cpan.org) + +=cut diff --git a/lib/Date/Manip/Config.pod b/lib/Date/Manip/Config.pod new file mode 100644 index 0000000..8b27a25 --- /dev/null +++ b/lib/Date/Manip/Config.pod @@ -0,0 +1,706 @@ +# Copyright (c) 1996-2017 Sullivan Beck. All rights reserved. +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +=pod + +=head1 NAME + +Date::Manip::Config - Date::Manip configuration + +=head1 SYNOPSIS + +This documents the configuration information which is stored in +each L object, how to modify this information, +and how the information is used in the other Date::Manip modules. + +=head1 DESCRIPTION + +Date::Manip is a very configurable bundle of modules. Many of it's +behaviors can be modified to change how date operations are done. To +do this, a list of configuration variables may be set which define +many Date::Manip behaviors. + +There are three ways to set config variables. The first two are to +pass them in when creating an object, or to pass them to the config +method after the object is created. All of the main Date::Manip +modules (L, L, L, +L, and L) have the config method. + +As an example, you can create and configure a +L object using the commands: + + $date = new Date::Manip::Date; + $date->config($var1,$val1,$var2,$val2,...); + +This can be shortened to: + + $date = new Date::Manip::Date [$var1,$val1,...]; + +The values of the config variables are stored in the L +object. So, if you have a L object, it has a +L object associated with it, and the configuration +information is stored there. The same L object may be +used by any number of higher objects, and all will share the same +configuration. If multiple L objects share the same +L object, setting a configuration variable on any of +them affects all of the L objects. If you need to work +with different configurations simultaneously, it is necessary to work +with multiple L objects. This is covered in the +L document. + +An alternate method exists if you are using one of the functional +interfaces. To set a variable using the functional interface, use the +call: + + Date_Init("$var1=$val1"); + +The third way to set config variables is to store them in a config +file. The config file is read in by passing the appropriate values to +the config method as described below. A config file is a good way to +easily change a large number of settings. They are also necessary for +other purposes (such as events and holidays which are covered +in the L document). + +=head1 CONFIG FILES + +One of the variables that can be passed to the config method is +"ConfigFile". The value of this variable is the path to a config +file. + +When any Date::Manip::* object is configured, any number of config +files may be read (and the config files can specify additional files +to read). + +The starting section of a config file contains general configuration +variables. A list of all config variables is given below. + +Following this, any number of special sections may be included in +the config file. The special sections are used to specify other +types of information, such as a list of holidays or special events. +These special sections are described elsewhere in the documentation. + +The syntax of the config file is very simple. Every line is of +the form: + + VAR = VAL + +or + + *SECTION + +Blank lines and lines beginning with a pound sign (#) are ignored. +All whitespace is optional. Variables names in the main section and +section names are case insensitive (though values in the main section +are typically case sensitive). Strings in other sections (both variables +and values) are case sensitive. + +The following is a sample config file: + + DateFormat = US + Language = English + + *Holidays + + Dec 25 = Christmas + Jan 1 = New Year's + +All config variables that may appear in the main part of a config file +are described in the next section. Other sections are described elsewhere. +The *Holidays and *Events sections are both described in the +L documentation. + +A sample config file is included with the Date::Manip distribution. +Modify it as appropriate and copy it to some appropriate directory and +use the ConfigFile variable to access it. For example, if a config +file is stored in F, you can load it by: + + $date->config("ConfigFile","/home/foo/Manip.cnf"); + +or (if using a functional interface): + + Date_Init("ConfigFile=/home/foo/Manip.cnf"); + +NOTE: if you use business mode calculations, you must have a config +file since this is the only place where you can define holidays. + +In the top section, only variables described below may be used. In +other sections, checking (if any) is done in the module that uses +the data from that section. + +=head1 BASIC CONFIGURATION VARIABLES + +This section describes the basic Date::Manip configuration variables +which can be used in a config file, or which may be passed in using +the appropriate functions for each module. + +Variable names are case insensitive, both as arguments to the config +function and in the config file. The values are case sensitive except +where specified otherwise. + +=over 4 + +=item B + +The value for this config variable is ignored. Whenever the Defaults +config variable is encountered, the defaults for all config variables +are restored, overriding ALL changes that have been made. + +In other words, in the following call: + + $date->config("Language","Russian", + "Defaults","1"); + +the first option will end up being ignored since the Defaults config +variable will set the language back to it's default value which is +English. + +When using a functional interface, use: + + Date_Init("Defaults=1"); + +=item B + +The ConfigFile variable defines a config file which will be parsed for +configuration information. It may be included any number of times, each +one including the path to a single config file. The value of this +variable is a full path to a file. + +An example call to the config function might be: + + $date->config("ConfigFile","/tmp/file1", + 'Language',$val); + +Config files are parsed immediately when encountered. So in this example, +the file F will be parsed before the next variable ('Language'). +In addition, if a config file contains a ConfigFile variable, that file +will immediately be parsed before continuing with the original file. + +The path to the file may be specified in any way valid for the +operating system. If a file is not found, a warning will be issued, +but execution will continue. + +Multiple config files are safe, and a section may safely be split +across multiple files. + +When using a functional interface, use: + + Date_Init("ConfigFile=/tmp/file1"); + +=item B + +Date::Manip can be used to parse dates in many different languages. +A list of the languages is given in the L document. + +To parse dates in a different language, just use the Language config +variable with the name of the language as the value. Language names +are case insensitive. + +Additional languages may be added with the help of someone fluent in +English and the other language. If you are interested in providing a +translation for a new language, please refer to the L +document for instructions. + +=item B + +Date::Manip has some support for handling date strings encoded in +alternate character encodings. + +By default, input strings may be tested using multiple encodings that +are commonly used for the specific languages, as well as using +standard perl escape sequences, and output is done in UTF-8. + +The input, output, or both can be overridden using the Encoding +variable. + +Setting Encoding to the name of a single encoding (a name supported +by the Encoding perl module), will force all input and output to be +done in that encoding. + +So, setting: + + Encoding = iso-8859-1 + +means that all input and output will be in that encoding. The +encoding 'perl' has the special meaning of storing the string in +perl escape sequences. + +Encoding can also be set to the name of two encoding (separated +by a comma). + + Encoding = iso-8859-1,utf-16 + +which means that all input is in iso-8859-1 encoding, but all output +will be utf-16. + +Encoding may also be set as follows: + + Encoding = iso-8859-1, + +meaning that input is in iso-8859-1 and output is in the default (i.e. +UTF-8) encoding. + + Encoding = ,utf-16 + +means to check the input in all of the encodings, but all output will +be in utf-16 encoding. + +Note that any time you change languages, it will reset the encodings, +so you should set this config variable AFTER setting the language. + +=item B + +It is sometimes necessary to know what day of week is regarded as +first. By default, this is set to Monday as that conforms to ISO +8601, but many countries and people will prefer Sunday (and in a few +cases, a different day may be desired). Set the FirstDay variable to +be the first day of the week (1=Monday, 7=Sunday). + +=item B + +ISO 8601 states that the first week of the year is the one which contains +Jan 4 (i.e. it is the first week in which most of the days in that week +fall in that year). This means that the first 3 days of the year may +be treated as belonging to the last week of the previous year. If this +is set to non-nil, the ISO 8601 standard will be ignored and the first +week of the year contains Jan 1. + +=item B + +Some commands may produce a printable version of a date. By default, +the printable version of the date is of the format: + + YYYYMMDDHH:MN:SS + +Two other simple versions have been created. If the Printable variable is +set to 1, the format is: + + YYYYMMDDHHMNSS + +If Printable is set to 2, the format is: + + YYYY-MM-DD-HH:MN:SS + +This config variable is present in order to maintain backward +compatibility, and may actually be deprecated at some point. As such, +additional formats will not be added. Instead, use the printf method +in the L module to extract information with complete +flexibility. + +=back + +=head1 DATE PARSING CONFIGURATION VARIABLES + +=over 4 + +=item B + +Different countries look at the date 12/10 as Dec 10 or Oct 12. In +the United States, the first is most common, but this certainly +doesn't hold true for other countries. Setting DateFormat to "US" +(case insensitive) forces the first behavior (Dec 10). Setting +DateFormat to anything else forces the second behavior (Oct 12). The +"US" setting is the default (sorry about that... I live in the US). + +=item B + +When parsing a date containing a 2-digit year, the year must be converted +to 4 digits. This config variable determines how this is done. + +By default, a 2 digit year is treated as falling in the 100 year period of +CURR-89 to CURR+10. So in the year 2005, a two digit year will be somewhere +in the range 1916 to 2015. + +YYtoYYYY may be set to any integer N to force a 2 digit year into the +period CURR-N to CURR+(99-N). A value of 0 forces the year to be the +current year or later. A value of 99 forces the year to be the +current year or earlier. Although the most common choice of values +will be somewhere between 0 and 99, there is no restriction on N that +forces it to be so. It can actually be any positive or negative number +you want to force it into any 100 year period desired. + +YYtoYYYY can also be set to "C" to force it into the current century, or +to "C##" to force it into a specific century. So, in 1998, "C" forces +2 digit years to be 1900-1999. "C18" would always force a 2 digit year to +be in the range 1800-1899. Note: I'm aware that the actual definitions of +century are 1901-2000, NOT 1900-1999, so for purists, treat this as +the way to supply the first two digits rather than as supplying a +century. + +It can also be set to the form "C####" to force it into a specific 100 +year period. C1950 refers to 1950-2049. + +=item B + +When a date is parsed from one of the formats listed in the "Common date formats" +or "Less common formats" sections of the L document, and no time +is explicitly included, the default time can be determined by the value of this +variable. The two possible values are: + + midnight the default time is 00:00:00 + curr the default time is the current time + +"midnight" is the default value. + +NOTE: this only applies to dates parsed with the parse method. Dates parsed +using the parse_date method always default to 00:00:00. + +=item B + +By default, the time separator (i.e. the character that separates +hours from minutes and minutes from seconds) is specified in the +language translations and in most cases it does not include a period. +In English, the only defined time separator is a colon (:), so the time +can be written as 12:15:30 . + +If you want to use a period (.) as a time separator as well, set this +to 1. Then you can write the time as 12.15.30 . + +By default, a period is used as a date separator, so 12.15.30 would be +interpreted as Dec 15 1930 (or 2030), so if you use the period as a +date separator, it should not be used as a time separator too. + +=item B + +By default, when parsing a string like 'Jun 1925', it will be interpreted +as 'Jun 19, 2025' (i.e. MMM DDYY). Also, the string '1925 Jun' is not allowed. + +This variable can be set to either 'first' or 'last', and in that case, +both 'Jun 1925' and '1925 Jun' will be allowed, and will refer to either +the first or last day of June in 1925. + +=back + +=head1 BUSINESS CONFIGURATION VARIABLES + +These are configuration variables used to define work days and +holidays used in business mode calculations. Refer to the +L documentation for details on these calculations. + +=over 4 + +=item B + +=item B + +The first and last days of the work week. These default to Monday and +Friday. Days are numbered from 1 (Monday) to 7 (Sunday). WorkWeekBeg +must come before WorkWeekEnd numerically so there is no way to handle +a work week of Sunday to Thursday using these variables. + +There is also no way to handle an odd work schedule such as 10 days +on, 4 days off. + +However, both of these situations can be handled using a fairly simple +workaround. + +To handle a work week of Sunday to Thursday, just set WorkWeekBeg=1 +and WorkWeekEnd=7 and defined a holiday that occurs every Friday and +Saturday. + +To handle a 10 days on, 4 days off schedule, do something similar +but defined a holiday that occurs on all of the 4 days off. + +Both of these can be done using recurrences. Refer to the L +documentation for details. + +=item B + +=item B + +=item B + +If WorkDay24Hr is non-zero, a work day is treated as usually being 24 +hours long (daylight saving time changes ARE taken into account). The +WorkDayBeg and WorkDayEnd variables are ignored in this case. + +By default, WorkDay24Hr is zero, and the work day is defined by the +WorkDayBeg and WorkDayEnd variables. These are the times when the work +day starts and ends respectively. WorkDayBeg must come before +WorkDayEnd (i.e. there is no way to handle the night shift where the +work day starts one day and ends another). + +The time in both should be a valid time format (H, H:M, or H:M:S). + +Note that setting WorkDay24Hr to a non-zero value automatically sets +WorkDayBeg and WorkDayEnd to "00:00:00" and "24:00:00" respectively, +so to switch back to a non-24 hour day, you will need to reset both +of those config variables. + +Similarly, setting either the WorkDayBeg or WorkDayEnd variables +automatically turns off WorkDay24Hr. + +=item B + +Periodically, if a day is not a business day, we need to find the +nearest business day to it. By default, we'll look to "tomorrow" +first, but if this variable is set to 0, we'll look to "yesterday" +first. This is only used in the +C method (and the +C function) and is easily overridden (see +documentation for the nearest_business_day method). + +=item B + +=item B + +If these variables are used (a value must be passed in, but is +ignored), the current list of defined holidays or events is erased. A +new set will be set the next time a config file is read in. + +Although these variables are supported, the best way to have multiple +holiday or events lists will be to create multiple L +objects based on separate config files. + +=back + +=head1 RECURRENCE CONFIGURATION VARIABLES + +The following config variables help in the handling of recurrences. + +=over 4 + +=item B + +When a recurrence is created, it begins with a default range (start +and end date). The range selected depends on the value of this +variable, and can be set to any of the following: + + none no default range supplied + year the current year + month the current month + week the current week + day the current day + all Jan 2, 0001 to Dec 30, 9999 + +The default value is "none". + +=back + +=head1 TIME ZONE RELATED CONFIGURATION VARIABLES + +The following configuration variables may alter the current +time zone. As such, they are only available once the L +module is available. An easy way to handle this is to only pass them +to the config method of a L object or one of the high +level objects (L, L, or +L). + +Many of Date::Manip's operations rely on knowing what time it is +now. This consists of three things: knowing what date and time it is, +knowing what time zone it is, and knowing whether it is daylight +saving or not. All of this is necessary in order to correctly handle +every possible date. + +The daylight saving time information is only used for a couple hours +each year during daylight saving time changes (at all other times, the +date, time, and time zone are sufficient information), so it is +optional, and defaults to standard time if omitted. + +The default behavior of Date::Manip is to use the system localtime +function to determine the date, time, and daylight saving time +information, and to use various methods (see +L) to determine what +time zone the computer is in. + +=over 4 + +=item B + +This variable is deprecated, but will be supported for several +releases. The SetDate or ForceDate variables (described next) should be +used instead. + +The following are equivalent: + + $date->config("tz","Europe/Rome"); + $date->config("setdate","now,Europe/Rome"); + +or in the functional interface: + + Date_Init("tz=Europe/Rome"); + Date_Init("setdate=now,Europe/Rome"); + +=item B + +The SetDate config variable is used to set the current date, time, or +time zone, but then allow it to change over time using the rules of +that time zone. + +There are several cases where this may be useful. + +Often, you may want to use the system time to get the date and time, but +you want to work in another time zone. For this, use the call: + + $date->config("setdate","now,ZONE"); + +or in the function interface: + + Date_Init("setdate=now,ZONE"); + +If it is currently + + Jun 6, 2009 12:00:00 in the America/New_York time zone + +and you call: + + $date->config("setdate","now,Europe/Rome"); + +the Date::Manip will treat that exact instant as + + Jun 6, 2009 12:00:00 in the Europe/Rome time zone + +At that precise moment, looking at the system time and parsing the +date "now" in Date::Manip will give the same date and time. + +The time will continue to advance, but it will use time change rules +from the Europe/Rome time zone. What that means is that if a daylight +saving time occurs on the computer, but NOT in the Europe/Rome +time zone (or vice versa), the system date and time will no longer +match the results of parsing the date "now" in Date::Manip. + +In general (unless the program runs for an extended period of +time), the system date and time WILL match the value of "now", so +this is a good way to simulate placing the computer in another +time zone. + +If the current date/time is ambiguous (i.e. it exists in both +standard and daylight saving time in the alternate zone), you +can use the call: + + $date->config("setdate","now,DSTFLAG,ZONE"); + +to force it to be in one or the other. DSTFLAG can be "std", +"dst", "stdonly", or "dstonly". "std" and "dst" mean that +the date can be in either standard or saving time, but will +try standard first (for "dst") or saving time first (if "dst"), +and will only try the other if the date is not valid. If +"stdonly" or "dstonly" is used, the date will be forced to +be standard or saving time respectively (an error will be +triggered if there is no valid date in that time). + +If the current date/time doesn't exist in the alternate zone, +an error will occur. + +The other common operation is that you might want to see results +as they would appear on a computer running in a different time zone. + +This can be done using the call: + + $date->config("setdate","zone,ZONE"); + $date->config("setdate","zone,DSTFLAG,ZONE"); + +If it is currently + + Jun 6, 2009 12:00:00 in the America/New_York time zone + +and you call: + + $date->config("setdate","zone,America/Chicago"); + +then parsing "now" at precisely that moment will return "Jun 6, 2009 +11:00:00". This is equivalent to working in the current zone, but +then converting everything to the alternate zone. + +Note that DSTFLAG is only used if ZONE is entered as an offset. + +The final case where the SetDate config variable is used is to alter +the date and time to some other value (completely independent of +the current date and time) and allow it to advance normally from +that point. + + $date->config("setdate","DATE"); + $date->config("setdate","DATE,ZONE"); + $date->config("setdate","DATE,DSTFLAG,ZONE"); + +set both the date/time and zone. + +If DATE is not valid in the time zone (either the local time zone +or the specified one), and error occurs. + +The call: + + $date->config("setdate","now"); + +resets everything to use the current date/time and zone and lets it +advance normally. + +=item B + +The ForceDate config variable is similar to the SetDate variable, except +that once "now" is set, it is not allowed to change. Parsing the date "now" +will not change, regardless of how long the program runs (unless either +the SetDate or ForceDate variables are set to some other value). + + $date->config("forcedate","now,ZONE"); + $date->config("forcedate","now,DSTFLAG,ZONE"); + $date->config("forcedate","zone,ZONE"); + $date->config("forcedate","zone,DSTFLAG,ZONE"); + $date->config("forcedate","DATE"); + $date->config("forcedate","DATE,ZONE"); + $date->config("forcedate","DATE,DSTFLAG,ZONE"); + $date->config("forcedate","now"); + +all set "now" in the same way as the SetDate variable. Spaces after commas are +ignored. + +=back + +ZONE can be any time zone name, alias, abbreviation, or offset, and +the best time zone will be determined from all given information. + +It should be noted that setting the SetDate or ForceDate variable +twice will always refer to the system date/time as a starting point. +For example, if a program is running, and calls the method: + + $date->config("forcedate","now"); + +at Jun 6, 2009 at 12:00, that time will be treated as now from that +point on. If the same call is done an hour later, "now" will then +be Jun 6, 2009 at 13:00 from that moment on. + +Since the current date is used in the date parsing routines, no +parsing can be done on the DATE value in any of the calls. Instead, +DATE must be a date in one of the two formats: + + YYYY-MM-DD-HH:MN:SS + YYYYMMDDHH:MN:SS + +=head1 DEPRECATED CONFIGURATION VARIABLES + +The following config variables are currently supported, but are +deprecated. They will be removed in a future Date::Manip release: + +=over 4 + +=item B + +This is discussed above. Use SetDate or ForceDate instead. + +Scheduled for removal 2016-03-01 + +=back + +=head1 KNOWN BUGS + +None known. + +=head1 BUGS AND QUESTIONS + +Please refer to the L documentation for +information on submitting bug reports or questions to the author. + +=head1 SEE ALSO + +L - main module documentation + +=head1 LICENSE + +This script is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=head1 AUTHOR + +Sullivan Beck (sbeck@cpan.org) + +=cut diff --git a/lib/Date/Manip/ConfigFile.pod b/lib/Date/Manip/ConfigFile.pod new file mode 100644 index 0000000..1f04b91 --- /dev/null +++ b/lib/Date/Manip/ConfigFile.pod @@ -0,0 +1,164 @@ +# Copyright (c) 2011-2017 Sullivan Beck. All rights reserved. +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +=pod + +=head1 NAME + +Date::Manip::ConfigFile - sample config file + +=head1 DESCRIPTION + +Date::Manip is a highly configurable module. Many of the options +can be set in a config file. This document includes a sample config +file. + +The config file consists of three sections. The first section is +config variables. This is described more fully in the L +document. + +The second section is the holiday definition section. The third section +is the event definition section. These are both described more fully +in the L document. + +=head1 SAMPLE CONFIG FILE + +The sample config file below works for newer versions of Date::Manip. +Some of the config variables may change, or be deprecated, and some +may not work with earlier versions of Date::Manip, so it is strongly +suggested that you check out the documentation for the version of +Date::Manip you are using to confirm any of the config variables you +want to include. + + ################################ + # CONFIG VARIABLES + ################################ + # See Date::Manip::Config man page for a description of all + # config variables. + + # To include configuration information from additional + # config files: + + ConfigFile = /path/to/another/config/file + ConfigFile = /path/to/another/config/file2 + + # For handling other languages + + Language = English + DateFormat = US + Encoding = + + # Set the current timezone: + + SetDate = now,America/New_York + + # Set the work work + + WorkWeekBeg = 1 + WorkWeekEnd = 5 + WorkDay24Hr = 0 + WorkDayBeg = 08:00 + WorkDayEnd = 17:00 + TomorrowFirst = 1 + + # Misc. variables + + YYtoYYYY = 89 + FirstDay = 1 + Jan1Week1 = 0 + Printable = 0 + DefaultTime = midnight + RecurRange = none + + ################################ + # HOLIDAYS + ################################ + # See the Date::Manip::Holidays man page for a description of + # this section. + *HOLIDAYS + + # FEDERAL HOLIDAYS + ################## + + # You can express New Year's Day as the actual day (Jan 1) + # or the observed day (Jan 1 or the nearest week day). + # You can't include BOTH because once a day is marked as + # a holiday, a second definition will treat it the same + # as a weekend and choose another day to assign the holiday + # to (so there would be two days designated as New Years). + + # Jan 1 = New Year's Day + 1*1:0:1:0:0:0*DWD = New Year's Day (observed) + + # Two different ways to defined MLK day + + third Monday in Jan = Martin Luther King Jr.'s Birthday + # 1*1:3:1:0:0:0 = Martin Luther King Jr.'s Birthday + + # Observed by federal employees in Washington D.C. + + # Jan 20 = Inauguration day + third Monday in Feb = Washington's Birthday + last Monday in May = Memorial Day + 1st Monday in Sep = Labor Day + second Monday in Oct = Columbus Day + + # Jul 4 = Independence Day + 1*7:0:4:0:0:0*DWD = Independence Day + + # 11/11 = Veterans Day + 1*11:0:11:0:0:0*DWD = Veteran's Day + + # To define both Thanksgiving and the day after, use the + # following two lines: + + fourth Thu in Nov = Thanksgiving + 1*11:4:4:0:0:0*FD1 = Day after Thanksgiving + + # Dec 25 = Christmas + 1*12:0:25:0:0:0*DWD = Christmas + + # SAMPLE HOLIDAYS + ################## + + # You can define a one-time-only holiday by specifying + # the day and year. + + 6/2/1999 = A special test holiday for 1999 + + ################################ + # EVENTS + ################################ + # See the Date::Manip::Holidays man page for a description of + # this section. + *EVENTS + + 2000-02-01 = Event01 + 2000-02-01-12:00:00 = Event02 + 02-01 = Event03 + 02-01 12:00:00 = Event04 + 1*2:0:3:13:00:00 = Event05 + + 2000-02-05 10:00:00 ; 2000-02-05 10:59:59 = Event06 + 2000-02-05 ; 2000-02-06 = Event07 + 02-05 ; 02-06 = Event08 + + 2000-02-07 10:00:00 ; 0:0:0:0:3:0:0 = Event09 + 02-07 10:00:00 ; 0:0:0:0:4:0:0 = Event10 + 1*2:0:7:10:00:00 ; 0:0:0:0:5:0:0 = Event11 + +=head1 SEE ALSO + +L - main module documentation + +=head1 LICENSE + +This script is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=head1 AUTHOR + +Sullivan Beck (sbeck@cpan.org) + +=cut diff --git a/lib/Date/Manip/DM5.pm b/lib/Date/Manip/DM5.pm new file mode 100644 index 0000000..397e623 --- /dev/null +++ b/lib/Date/Manip/DM5.pm @@ -0,0 +1,7485 @@ +package Date::Manip::DM5; +# Copyright (c) 1995-2017 Sullivan Beck. All rights reserved. +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +########################################################################### +########################################################################### + +use warnings; + +our($OS,%Lang,%Holiday,%Events,%Curr,%Cnf,%Zone,$VERSION,@ISA,@EXPORT); + +# Determine the type of OS... +$OS="Unix"; +$OS="Windows" if ((defined $^O and + $^O =~ /MSWin32/i || + $^O =~ /Windows_95/i || + $^O =~ /Windows_NT/i) || + (defined $ENV{OS} and + $ENV{OS} =~ /MSWin32/i || + $ENV{OS} =~ /Windows_95/i || + $ENV{OS} =~ /Windows_NT/i)); +$OS="Unix" if (defined $^O and + $^O =~ /cygwin/i); +$OS="Netware" if (defined $^O and + $^O =~ /NetWare/i); +$OS="Mac" if ((defined $^O and + $^O =~ /MacOS/i) || + (defined $ENV{OS} and + $ENV{OS} =~ /MacOS/i)); +$OS="MPE" if (defined $^O and + $^O =~ /MPE/i); +$OS="OS2" if (defined $^O and + $^O =~ /os2/i); +$OS="VMS" if (defined $^O and + $^O =~ /VMS/i); +$OS="AIX" if (defined $^O and + $^O =~ /aix/i); + +# Determine if we're doing taint checking +#if ($] < 5.0080) { + $Date::Manip::DM5::NoTaint = eval { local $^W=0; eval("#" . substr($^X, 0, 0)); 1 }; +#} else { +# $Date::Manip::DM5::NoTaint = (${^TAINT} == 0 ? 1 : 0); +#} + +########################################################################### +# CUSTOMIZATION +########################################################################### +# +# See the section of the POD documentation section CUSTOMIZING DATE::MANIP +# below for a complete description of each of these variables. + + +# Location of a the global config file. Tilde (~) expansions are allowed. +# This should be set in Date_Init arguments. +$Cnf{"GlobalCnf"}=""; +$Cnf{"IgnoreGlobalCnf"}=""; + +# Name of a personal config file and the path to search for it. Tilde (~) +# expansions are allowed. This should be set in Date_Init arguments or in +# the global config file. + +@Date::Manip::DM5::DatePath=(); +if ($OS eq "Windows") { + $Cnf{"PathSep"} = ";"; + $Cnf{"PersonalCnf"} = "Manip.cnf"; + $Cnf{"PersonalCnfPath"} = "."; + +} elsif ($OS eq "Netware") { + $Cnf{"PathSep"} = ";"; + $Cnf{"PersonalCnf"} = "Manip.cnf"; + $Cnf{"PersonalCnfPath"} = "."; + +} elsif ($OS eq "MPE") { + $Cnf{"PathSep"} = ":"; + $Cnf{"PersonalCnf"} = "Manip.cnf"; + $Cnf{"PersonalCnfPath"} = "."; + +} elsif ($OS eq "OS2") { + $Cnf{"PathSep"} = ":"; + $Cnf{"PersonalCnf"} = "Manip.cnf"; + $Cnf{"PersonalCnfPath"} = "."; + +} elsif ($OS eq "Mac") { + $Cnf{"PathSep"} = ":"; + $Cnf{"PersonalCnf"} = "Manip.cnf"; + $Cnf{"PersonalCnfPath"} = "."; + +} elsif ($OS eq "VMS") { + # VMS doesn't like files starting with "." + $Cnf{"PathSep"} = ","; + $Cnf{"PersonalCnf"} = "Manip.cnf"; + $Cnf{"PersonalCnfPath"} = "/sys\$login"; + +} else { + # Unix + $Cnf{"PathSep"} = ":"; + $Cnf{"PersonalCnf"} = ".DateManip.cnf"; + $Cnf{"PersonalCnfPath"} = ".:~"; + @Date::Manip::DM5::DatePath=qw(/bin /usr/bin /usr/local/bin); +} + +### Date::Manip variables set in the global or personal config file + +# Which language to use when parsing dates. +$Cnf{"Language"}="English"; + +# 12/10 = Dec 10 (US) or Oct 12 (anything else) +$Cnf{"DateFormat"}="US"; + +# Local timezone +$Cnf{"TZ"}=""; + +# Timezone to work in (""=local, "IGNORE", or a timezone) +$Cnf{"ConvTZ"}=""; + +# Date::Manip internal format (0=YYYYMMDDHH:MN:SS, 1=YYYYHHMMDDHHMNSS) +$Cnf{"Internal"}=0; + +# First day of the week (1=monday, 7=sunday). ISO 8601 says monday. +$Cnf{"FirstDay"}=1; + +# First and last day of the work week (1=monday, 7=sunday) +$Cnf{"WorkWeekBeg"}=1; +$Cnf{"WorkWeekEnd"}=5; + +# If non-nil, a work day is treated as 24 hours long (WorkDayBeg/WorkDayEnd +# ignored) +$Cnf{"WorkDay24Hr"}=0; + +# Start and end time of the work day (any time format allowed, seconds +# ignored) +$Cnf{"WorkDayBeg"}="08:00"; +$Cnf{"WorkDayEnd"}="17:00"; + +# If "today" is a holiday, we look either to "tomorrow" or "yesterday" for +# the nearest business day. By default, we'll always look "tomorrow" +# first. +$Cnf{"TomorrowFirst"}=1; + +# Erase the old holidays +$Cnf{"EraseHolidays"}=""; + +# Set this to non-zero to be produce completely backwards compatible deltas +$Cnf{"DeltaSigns"}=0; + +# If this is 0, use the ISO 8601 standard that Jan 4 is in week 1. If 1, +# make week 1 contain Jan 1. +$Cnf{"Jan1Week1"}=0; + +# 2 digit years fall into the 100 year period given by [ CURR-N, +# CURR+(99-N) ] where N is 0-99. Default behavior is 89, but other useful +# numbers might be 0 (forced to be this year or later) and 99 (forced to be +# this year or earlier). It can also be set to "c" (current century) or +# "cNN" (i.e. c18 forces the year to bet 1800-1899). Also accepts the +# form cNNNN to give the 100 year period NNNN to NNNN+99. +$Cnf{"YYtoYYYY"}=89; + +# Set this to 1 if you want a long-running script to always update the +# timezone. This will slow Date::Manip down. Read the POD documentation. +$Cnf{"UpdateCurrTZ"}=0; + +# Use an international character set. +$Cnf{"IntCharSet"}=0; + +# Use this to force the current date to be set to this: +$Cnf{"ForceDate"}=""; + +# Use this to make "today" mean "today at midnight". +$Cnf{"TodayIsMidnight"}=0; + +########################################################################### + +require 5.000; +require Exporter; +@ISA = qw(Exporter); +@EXPORT = qw( + DateManipVersion + Date_Init + ParseDateString + ParseDate + ParseRecur + Date_Cmp + DateCalc + ParseDateDelta + UnixDate + Delta_Format + Date_GetPrev + Date_GetNext + Date_SetTime + Date_SetDateField + Date_IsHoliday + Events_List + + Date_DaysInMonth + Date_DayOfWeek + Date_SecsSince1970 + Date_SecsSince1970GMT + Date_DaysSince1BC + Date_DayOfYear + Date_DaysInYear + Date_WeekOfYear + Date_LeapYear + Date_DaySuffix + Date_ConvTZ + Date_TimeZone + Date_IsWorkDay + Date_NextWorkDay + Date_PrevWorkDay + Date_NearestWorkDay + Date_NthDayOfYear +); +use strict; +use integer; +use Carp; + +use IO::File; + +our($Abbrevs); +use Date::Manip::DM5abbrevs; + +$VERSION='6.60'; +our $DM5_VERSION = '5.66'; + +######################################################################## +######################################################################## + +$Curr{"InitLang"} = 1; # Whether a language is being init'ed +$Curr{"InitDone"} = 0; # Whether Init_Date has been called +$Curr{"InitFilesRead"} = 0; +$Curr{"ResetWorkDay"} = 1; +$Curr{"Debug"} = ""; +$Curr{"DebugVal"} = ""; + +$Holiday{"year"} = 0; +$Holiday{"dates"} = {}; +$Holiday{"desc"} = {}; + +$Events{"raw"} = []; +$Events{"parsed"} = 0; +$Events{"dates"} = []; +$Events{"recur"} = []; + +######################################################################## +######################################################################## +# THESE ARE THE MAIN ROUTINES +######################################################################## +######################################################################## + +# Get rid of a problem with old versions of perl +no strict "vars"; +# This sorts from longest to shortest element +sub _sortByLength { + return (length $b <=> length $a); +} +use strict "vars"; + +sub DateManipVersion { + print "DEBUG: DateManipVersion\n" if ($Curr{"Debug"} =~ /trace/); + return $DM5_VERSION; +} + +sub Date_Init { + print "DEBUG: Date_Init\n" if ($Curr{"Debug"} =~ /trace/); + $Curr{"Debug"}=""; + + my(@args)=@_; + $Curr{"InitDone"}=1; + local($_)=(); + my($internal,$firstday)=(); + my($var,$val,$file,@tmp)=(); + + # InitFilesRead = 0 : no conf files read yet + # 1 : global read, no personal read + # 2 : personal read + + $Cnf{"EraseHolidays"}=0; + foreach (@args) { + s/\s*$//; + s/^\s*//; + /^(\S+) \s* = \s* (.*)$/x; + ($var,$val)=($1,$2); + if ($var =~ /^GlobalCnf$/i) { + $Cnf{"GlobalCnf"}=$val; + if ($val) { + $Curr{"InitFilesRead"}=0; + EraseHolidays(); + } + } elsif ($var =~ /^PathSep$/i) { + $Cnf{"PathSep"}=$val; + } elsif ($var =~ /^PersonalCnf$/i) { + $Cnf{"PersonalCnf"}=$val; + $Curr{"InitFilesRead"}=1 if ($Curr{"InitFilesRead"}==2); + } elsif ($var =~ /^PersonalCnfPath$/i) { + $Cnf{"PersonalCnfPath"}=$val; + $Curr{"InitFilesRead"}=1 if ($Curr{"InitFilesRead"}==2); + } elsif ($var =~ /^IgnoreGlobalCnf$/i) { + $Curr{"InitFilesRead"}=1 if ($Curr{"InitFilesRead"}==0); + $Cnf{"IgnoreGlobalCnf"}=1; + } elsif ($var =~ /^EraseHolidays$/i) { + EraseHolidays(); + } else { + push(@tmp,$_); + } + } + @args=@tmp; + + # Read global config file + if ($Curr{"InitFilesRead"}<1 && ! $Cnf{"IgnoreGlobalCnf"}) { + $Curr{"InitFilesRead"}=1; + + if ($Cnf{"GlobalCnf"}) { + $file=_ExpandTilde($Cnf{"GlobalCnf"}); + _Date_InitFile($file) if ($file); + } + } + + # Read personal config file + if ($Curr{"InitFilesRead"}<2) { + $Curr{"InitFilesRead"}=2; + + if ($Cnf{"PersonalCnf"} and $Cnf{"PersonalCnfPath"}) { + $file=_SearchPath($Cnf{"PersonalCnf"},$Cnf{"PersonalCnfPath"},"r"); + _Date_InitFile($file) if ($file); + } + } + + foreach (@args) { + s/\s*$//; + s/^\s*//; + /^(\S+) \s* = \s* (.*)$/x; + ($var,$val)=($1,$2); + $val="" if (! defined $val); + _Date_SetConfigVariable($var,$val); + } + + confess "ERROR: Unknown FirstDay in Date::Manip.\n" + if (! _IsInt($Cnf{"FirstDay"},1,7)); + confess "ERROR: Unknown WorkWeekBeg in Date::Manip.\n" + if (! _IsInt($Cnf{"WorkWeekBeg"},1,7)); + confess "ERROR: Unknown WorkWeekEnd in Date::Manip.\n" + if (! _IsInt($Cnf{"WorkWeekEnd"},1,7)); + confess "ERROR: Invalid WorkWeek in Date::Manip.\n" + if ($Cnf{"WorkWeekEnd"} <= $Cnf{"WorkWeekBeg"}); + + my(%lang, + $tmp,%tmp,$tmp2,@tmp2, + $i,$j,@tmp3, + @zones)=(); + + my($L)=$Cnf{"Language"}; + + if ($Curr{"InitLang"}) { + $Curr{"InitLang"}=0; + + if ($L eq "English") { + _Date_Init_English(\%lang); + + } elsif ($L eq "French") { + _Date_Init_French(\%lang); + + } elsif ($L eq "Swedish") { + _Date_Init_Swedish(\%lang); + + } elsif ($L eq "German") { + _Date_Init_German(\%lang); + + } elsif ($L eq "Polish") { + _Date_Init_Polish(\%lang); + + } elsif ($L eq "Dutch" || + $L eq "Nederlands") { + _Date_Init_Dutch(\%lang); + + } elsif ($L eq "Spanish") { + _Date_Init_Spanish(\%lang); + + } elsif ($L eq "Portuguese") { + _Date_Init_Portuguese(\%lang); + + } elsif ($L eq "Romanian") { + _Date_Init_Romanian(\%lang); + + } elsif ($L eq "Italian") { + _Date_Init_Italian(\%lang); + + } elsif ($L eq "Russian") { + _Date_Init_Russian(\%lang); + + } elsif ($L eq "Turkish") { + _Date_Init_Turkish(\%lang); + + } elsif ($L eq "Danish") { + _Date_Init_Danish(\%lang); + + } elsif ($L eq "Catalan") { + _Date_Init_Catalan(\%lang); + + } else { + confess "ERROR: Unknown language in Date::Manip.\n"; + } + + # variables for months + # Month = "(jan|january|feb|february ... )" + # MonL = [ "Jan","Feb",... ] + # MonthL = [ "January","February", ... ] + # MonthH = { "january"=>1, "jan"=>1, ... } + + $Lang{$L}{"MonthH"}={}; + $Lang{$L}{"MonthL"}=[]; + $Lang{$L}{"MonL"}=[]; + _Date_InitLists([$lang{"month_name"}, + $lang{"month_abb"}], + \$Lang{$L}{"Month"},"lc,sort,back", + [$Lang{$L}{"MonthL"}, + $Lang{$L}{"MonL"}], + [$Lang{$L}{"MonthH"},1]); + + # variables for day of week + # Week = "(mon|monday|tue|tuesday ... )" + # WL = [ "M","T",... ] + # WkL = [ "Mon","Tue",... ] + # WeekL = [ "Monday","Tudesday",... ] + # WeekH = { "monday"=>1,"mon"=>1,"m"=>1,... } + + $Lang{$L}{"WeekH"}={}; + $Lang{$L}{"WeekL"}=[]; + $Lang{$L}{"WkL"}=[]; + $Lang{$L}{"WL"}=[]; + _Date_InitLists([$lang{"day_name"}, + $lang{"day_abb"}], + \$Lang{$L}{"Week"},"lc,sort,back", + [$Lang{$L}{"WeekL"}, + $Lang{$L}{"WkL"}], + [$Lang{$L}{"WeekH"},1]); + _Date_InitLists([$lang{"day_char"}], + "","lc", + [$Lang{$L}{"WL"}], + [\%tmp,1]); + %{ $Lang{$L}{"WeekH"} } = + (%{ $Lang{$L}{"WeekH"} },%tmp); + + # variables for last + # Last = "(last)" + # LastL = [ "last" ] + # Each = "(each)" + # EachL = [ "each" ] + # variables for day of month + # DoM = "(1st|first ... 31st)" + # DoML = [ "1st","2nd",... "31st" ] + # DoMH = { "1st"=>1,"first"=>1, ... "31st"=>31 } + # variables for week of month + # WoM = "(1st|first| ... 5th|last)" + # WoMH = { "1st"=>1, ... "5th"=>5,"last"=>-1 } + + $Lang{$L}{"LastL"}=$lang{"last"}; + _Date_InitStrings($lang{"last"}, + \$Lang{$L}{"Last"},"lc,sort"); + + $Lang{$L}{"EachL"}=$lang{"each"}; + _Date_InitStrings($lang{"each"}, + \$Lang{$L}{"Each"},"lc,sort"); + + $Lang{$L}{"DoMH"}={}; + $Lang{$L}{"DoML"}=[]; + _Date_InitLists([$lang{"num_suff"}, + $lang{"num_word"}], + \$Lang{$L}{"DoM"},"lc,sort,back,escape", + [$Lang{$L}{"DoML"}, + \@tmp], + [$Lang{$L}{"DoMH"},1]); + + @tmp=(); + foreach $tmp (keys %{ $Lang{$L}{"DoMH"} }) { + $tmp2=$Lang{$L}{"DoMH"}{$tmp}; + if ($tmp2<6) { + $Lang{$L}{"WoMH"}{$tmp} = $tmp2; + push(@tmp,$tmp); + } + } + foreach $tmp (@{ $Lang{$L}{"LastL"} }) { + $Lang{$L}{"WoMH"}{$tmp} = -1; + push(@tmp,$tmp); + } + _Date_InitStrings(\@tmp,\$Lang{$L}{"WoM"}, + "lc,sort,back,escape"); + + # variables for AM or PM + # AM = "(am)" + # PM = "(pm)" + # AmPm = "(am|pm)" + # AMstr = "AM" + # PMstr = "PM" + + _Date_InitStrings($lang{"am"},\$Lang{$L}{"AM"},"lc,sort,escape"); + _Date_InitStrings($lang{"pm"},\$Lang{$L}{"PM"},"lc,sort,escape"); + _Date_InitStrings([ @{$lang{"am"}},@{$lang{"pm"}} ],\$Lang{$L}{"AmPm"}, + "lc,back,sort,escape"); + $Lang{$L}{"AMstr"}=$lang{"am"}[0]; + $Lang{$L}{"PMstr"}=$lang{"pm"}[0]; + + # variables for expressions used in parsing deltas + # Yabb = "(?:y|yr|year|years)" + # Mabb = similar for months + # Wabb = similar for weeks + # Dabb = similar for days + # Habb = similar for hours + # MNabb = similar for minutes + # Sabb = similar for seconds + # Repl = { "abb"=>"replacement" } + # Whenever an abbreviation could potentially refer to two different + # strings (M standing for Minutes or Months), the abbreviation must + # be listed in Repl instead of in the appropriate Xabb values. This + # only applies to abbreviations which are substrings of other values + # (so there is no confusion between Mn and Month). + + _Date_InitStrings($lang{"years"} ,\$Lang{$L}{"Yabb"}, "lc,sort"); + _Date_InitStrings($lang{"months"} ,\$Lang{$L}{"Mabb"}, "lc,sort"); + _Date_InitStrings($lang{"weeks"} ,\$Lang{$L}{"Wabb"}, "lc,sort"); + _Date_InitStrings($lang{"days"} ,\$Lang{$L}{"Dabb"}, "lc,sort"); + _Date_InitStrings($lang{"hours"} ,\$Lang{$L}{"Habb"}, "lc,sort"); + _Date_InitStrings($lang{"minutes"},\$Lang{$L}{"MNabb"},"lc,sort"); + _Date_InitStrings($lang{"seconds"},\$Lang{$L}{"Sabb"}, "lc,sort"); + $Lang{$L}{"Repl"}={}; + _Date_InitHash($lang{"replace"},undef,"lc",$Lang{$L}{"Repl"}); + + # variables for special dates that are offsets from now + # Now = "now" + # Today = "today" + # Offset = "(yesterday|tomorrow)" + # OffsetH = { "yesterday"=>"-0:0:0:1:0:0:0",... ] + # Times = "(noon|midnight)" + # TimesH = { "noon"=>"12:00:00","midnight"=>"00:00:00" } + # SepHM = hour/minute separator + # SepMS = minute/second separator + # SepSS = second/fraction separator + + $Lang{$L}{"TimesH"}={}; + _Date_InitHash($lang{"times"}, + \$Lang{$L}{"Times"},"lc,sort,back", + $Lang{$L}{"TimesH"}); + _Date_InitStrings($lang{"now"},\$Lang{$L}{"Now"},"lc,sort"); + _Date_InitStrings($lang{"today"},\$Lang{$L}{"Today"},"lc,sort"); + $Lang{$L}{"OffsetH"}={}; + _Date_InitHash($lang{"offset"}, + \$Lang{$L}{"Offset"},"lc,sort,back", + $Lang{$L}{"OffsetH"}); + $Lang{$L}{"SepHM"}=$lang{"sephm"}; + $Lang{$L}{"SepMS"}=$lang{"sepms"}; + $Lang{$L}{"SepSS"}=$lang{"sepss"}; + + # variables for time zones + # zones = regular expression with all zone names (EST) + # n2o = a hash of all parsable zone names with their offsets + # tzones = reguar expression with all tzdata timezones (US/Eastern) + # tz2z = hash of all tzdata timezones to full timezone (EST#EDT) + + $Zone{"n2o"} = {}; + ($Zone{"zones"},%{ $Zone{"n2o"} })= + _Date_Regexp($Abbrevs,"sort,lc,under,back", + "keys"); + + $tmp= + "US/Pacific PST8PDT ". + "US/Mountain MST7MDT ". + "US/Central CST6CDT ". + "US/Eastern EST5EDT ". + "Canada/Pacific PST8PDT ". + "Canada/Mountain MST7MDT ". + "Canada/Central CST6CDT ". + "Canada/Eastern EST5EDT"; + + $Zone{"tz2z"} = {}; + ($Zone{"tzones"},%{ $Zone{"tz2z"} })= + _Date_Regexp($tmp,"lc,under,back","keys"); + $Cnf{"TZ"}=Date_TimeZone(); + + # misc. variables + # At = "(?:at)" + # Of = "(?:in|of)" + # On = "(?:on)" + # Future = "(?:in)" + # Later = "(?:later)" + # Past = "(?:ago)" + # Next = "(?:next)" + # Prev = "(?:last|previous)" + + _Date_InitStrings($lang{"at"}, \$Lang{$L}{"At"}, "lc,sort"); + _Date_InitStrings($lang{"on"}, \$Lang{$L}{"On"}, "lc,sort"); + _Date_InitStrings($lang{"future"},\$Lang{$L}{"Future"}, "lc,sort"); + _Date_InitStrings($lang{"later"}, \$Lang{$L}{"Later"}, "lc,sort"); + _Date_InitStrings($lang{"past"}, \$Lang{$L}{"Past"}, "lc,sort"); + _Date_InitStrings($lang{"next"}, \$Lang{$L}{"Next"}, "lc,sort"); + _Date_InitStrings($lang{"prev"}, \$Lang{$L}{"Prev"}, "lc,sort"); + _Date_InitStrings($lang{"of"}, \$Lang{$L}{"Of"}, "lc,sort"); + + # calc mode variables + # Approx = "(?:approximately)" + # Exact = "(?:exactly)" + # Business = "(?:business)" + + _Date_InitStrings($lang{"exact"}, \$Lang{$L}{"Exact"}, "lc,sort"); + _Date_InitStrings($lang{"approx"}, \$Lang{$L}{"Approx"}, "lc,sort"); + _Date_InitStrings($lang{"business"},\$Lang{$L}{"Business"},"lc,sort"); + + ############### END OF LANGUAGE INITIALIZATION + } + + if ($Curr{"ResetWorkDay"}) { + my($h1,$m1,$h2,$m2)=(); + if ($Cnf{"WorkDay24Hr"}) { + ($Curr{"WDBh"},$Curr{"WDBm"})=(0,0); + ($Curr{"WDEh"},$Curr{"WDEm"})=(24,0); + $Curr{"WDlen"}=24*60; + $Cnf{"WorkDayBeg"}="00:00"; + $Cnf{"WorkDayEnd"}="23:59"; + + } else { + confess "ERROR: Invalid WorkDayBeg in Date::Manip.\n" + if (! (($h1,$m1)=_CheckTime($Cnf{"WorkDayBeg"}))); + $Cnf{"WorkDayBeg"}="$h1:$m1"; + confess "ERROR: Invalid WorkDayEnd in Date::Manip.\n" + if (! (($h2,$m2)=_CheckTime($Cnf{"WorkDayEnd"}))); + $Cnf{"WorkDayEnd"}="$h2:$m2"; + + ($Curr{"WDBh"},$Curr{"WDBm"})=($h1,$m1); + ($Curr{"WDEh"},$Curr{"WDEm"})=($h2,$m2); + + # Work day length = h1:m1 or 0:len (len minutes) + $h1=$h2-$h1; + $m1=$m2-$m1; + if ($m1<0) { + $h1--; + $m1+=60; + } + $Curr{"WDlen"}=$h1*60+$m1; + } + $Curr{"ResetWorkDay"}=0; + } + + # current time + my($s,$mn,$h,$d,$m,$y,$wday,$yday,$isdst,$ampm,$wk)=(); + if ($Cnf{"ForceDate"}=~ + /^(\d{4})-(\d{2})-(\d{2})-(\d{2}):(\d{2}):(\d{2})$/) { + ($y,$m,$d,$h,$mn,$s)=($1,$2,$3,$4,$5,$6); + } else { + ($s,$mn,$h,$d,$m,$y,$wday,$yday,$isdst)=localtime(time); + $y+=1900; + $m++; + } + _Date_DateCheck(\$y,\$m,\$d,\$h,\$mn,\$s,\$ampm,\$wk); + $Curr{"Y"}=$y; + $Curr{"M"}=$m; + $Curr{"D"}=$d; + $Curr{"H"}=$h; + $Curr{"Mn"}=$mn; + $Curr{"S"}=$s; + $Curr{"AmPm"}=$ampm; + $Curr{"Now"}=_Date_Join($y,$m,$d,$h,$mn,$s); + if ($Cnf{"TodayIsMidnight"}) { + $Curr{"Today"}=_Date_Join($y,$m,$d,0,0,0); + } else { + $Curr{"Today"}=$Curr{"Now"}; + } + + $Curr{"Debug"}=$Curr{"DebugVal"}; + + # If we're in array context, let's return a list of config variables + # that could be passed to Date_Init to get the same state as we're + # currently in. + if (wantarray) { + # Some special variables that have to be in a specific order + my(@special)=qw(IgnoreGlobalCnf GlobalCnf PersonalCnf PersonalCnfPath); + my(%tmp)=map { $_,1 } @special; + my(@tmp,$key,$val); + foreach $key (@special) { + $val=$Cnf{$key}; + push(@tmp,"$key=$val"); + } + foreach $key (keys %Cnf) { + next if (exists $tmp{$key}); + $val=$Cnf{$key}; + push(@tmp,"$key=$val"); + } + return @tmp; + } + return (); +} + +sub ParseDateString { + print "DEBUG: ParseDateString\n" if ($Curr{"Debug"} =~ /trace/); + local($_)=@_; + return "" if (! $_); + + my($y,$m,$d,$h,$mn,$s,$i,$wofm,$dofw,$wk,$tmp,$z,$num,$err,$iso,$ampm)=(); + my($date,$z2,$delta,$from,$falsefrom,$to,$which,$midnight)=(); + + # We only need to reinitialize if we have to determine what NOW is. + Date_Init() if (! $Curr{"InitDone"} or $Cnf{"UpdateCurrTZ"}); + + my($L)=$Cnf{"Language"}; + my($type)=$Cnf{"DateFormat"}; + + # Mode is set in DateCalc. ParseDate only overrides it if the string + # contains a mode. + if ($Lang{$L}{"Exact"} && + s/$Lang{$L}{"Exact"}//) { + $Curr{"Mode"}=0; + } elsif ($Lang{$L}{"Approx"} && + s/$Lang{$L}{"Approx"}//) { + $Curr{"Mode"}=1; + } elsif ($Lang{$L}{"Business"} && + s/$Lang{$L}{"Business"}//) { + $Curr{"Mode"}=2; + } elsif (! exists $Curr{"Mode"}) { + $Curr{"Mode"}=0; + } + + # Unfortunately, some deltas can be parsed as dates. An example is + # 1 second == 1 2nd == 1 2 + # But, some dates can be parsed as deltas. The most important being: + # 1998010101:00:00 + # + # We'll check to see if a "date" can be parsed as a delta. If so, we'll + # assume that it is a delta (since they are much simpler, it is much + # less likely that we'll mistake a delta for a date than vice versa) + # unless it is an ISO-8601 date. + # + # This is important because we are using DateCalc to test whether a + # string is a date or a delta. Dates are tested first, so we need to + # be able to pass a delta into this routine and have it correctly NOT + # interpreted as a date. + # + # We will insist that the string contain something other than digits and + # colons so that the following will get correctly interpreted as a date + # rather than a delta: + # 12:30 + # 19980101 + + $delta=""; + $delta=ParseDateDelta($_) if (/[^:0-9]/); + + # Put parse in a simple loop for an easy exit. + PARSE: { + my(@tmp)=_Date_Split($_); + if (@tmp) { + ($y,$m,$d,$h,$mn,$s)=@tmp; + last PARSE; + } + + # Fundamental regular expressions + + my($month)=$Lang{$L}{"Month"}; # (jan|january|...) + my(%month)=%{ $Lang{$L}{"MonthH"} }; # { jan=>1, ... } + my($week)=$Lang{$L}{"Week"}; # (mon|monday|...) + my(%week)=%{ $Lang{$L}{"WeekH"} }; # { mon=>1, monday=>1, ... } + my($wom)=$Lang{$L}{"WoM"}; # (1st|...|fifth|last) + my(%wom)=%{ $Lang{$L}{"WoMH"} }; # { 1st=>1,... fifth=>5,last=>-1 } + my($dom)=$Lang{$L}{"DoM"}; # (1st|first|...31st) + my(%dom)=%{ $Lang{$L}{"DoMH"} }; # { 1st=>1, first=>1, ... } + my($ampmexp)=$Lang{$L}{"AmPm"}; # (am|pm) + my($timeexp)=$Lang{$L}{"Times"}; # (noon|midnight) + my($now)=$Lang{$L}{"Now"}; # now + my($today)=$Lang{$L}{"Today"}; # today + my($offset)=$Lang{$L}{"Offset"}; # (yesterday|tomorrow) + my($zone)=$Zone{"zones"}; # (edt|est|...) + my($day)='\s*'.$Lang{$L}{"Dabb"}; # \s*(?:d|day|days) + my($mabb)='\s*'.$Lang{$L}{"Mabb"}; # \s*(?:mon|month|months) + my($wkabb)='\s*'.$Lang{$L}{"Wabb"}; # \s*(?:w|wk|week|weeks) + my($next)='\s*'.$Lang{$L}{"Next"}; # \s*(?:next) + my($prev)='\s*'.$Lang{$L}{"Prev"}; # \s*(?:last|previous) + my($past)='\s*'.$Lang{$L}{"Past"}; # \s*(?:ago) + my($future)='\s*'.$Lang{$L}{"Future"}; # \s*(?:in) + my($later)='\s*'.$Lang{$L}{"Later"}; # \s*(?:later) + my($at)=$Lang{$L}{"At"}; # (?:at) + my($of)='\s*'.$Lang{$L}{"Of"}; # \s*(?:in|of) + my($on)='(?:\s*'.$Lang{$L}{"On"}.'\s*|\s+)'; + # \s*(?:on)\s* or \s+ + my($last)='\s*'.$Lang{$L}{"Last"}; # \s*(?:last) + my($hm)=$Lang{$L}{"SepHM"}; # : + my($ms)=$Lang{$L}{"SepMS"}; # : + my($ss)=$Lang{$L}{"SepSS"}; # . + + # Other regular expressions + + my($D4)='(\d{4})'; # 4 digits (yr) + my($YY)='(\d{4}|\d{2})'; # 2 or 4 digits (yr) + my($DD)='(\d{2})'; # 2 digits (mon/day/hr/min/sec) + my($D) ='(\d{1,2})'; # 1 or 2 digit (mon/day/hr) + my($FS)="(?:$ss\\d+)?"; # fractional secs + my($sep)='[\/.-]'; # non-ISO8601 m/d/yy separators + # absolute time zone +0700 (GMT) + my($hzone)='(?:[0-1][0-9]|2[0-3])'; # 00 - 23 + my($mzone)='(?:[0-5][0-9])'; # 00 - 59 + my($zone2)='(?:\s*([+-](?:'."$hzone$mzone|$hzone:$mzone|$hzone))". + # +0700 +07:00 -07 + '(?:\s*\([^)]+\))?)'; # (GMT) + + # A regular expression for the time EXCEPT for the hour part + my($mnsec)="$hm$DD(?:$ms$DD$FS)?(?:\\s*$ampmexp)?"; + + # A special regular expression for /YYYY:HH:MN:SS used by Apache + my($apachetime)='(/\d{4}):' . "$DD$hm$DD$ms$DD"; + + my($time)=""; + $ampm=""; + $date=""; + + # Substitute all special time expressions. + if (/(^|[^a-z])$timeexp($|[^a-z])/i) { + $tmp=$2; + $tmp=$Lang{$L}{"TimesH"}{lc($tmp)}; + s/(^|[^a-z])$timeexp($|[^a-z])/$1 $tmp $3/i; + } + + # Remove some punctuation + s/[,]/ /g; + + # When we have a digit followed immediately by a timezone (7EST), we + # will put a space between the digit, EXCEPT in the case of a single + # character military timezone. If the single character is followed + # by anything, no space is added. + $tmp = ""; + while ( s/^(.*?\d)$zone(\s|$|[0-9])/$3/i ) { + my($bef,$z,$aft) = ($1,$2,$3); + if (length($z) != 1 || length($aft) == 0) { + $tmp .= "$bef $z"; + } else { + $tmp .= "$bef$z"; + } + } + $_ = "$tmp$_"; + $zone = '\s+' . $zone . '(?:\s+|$)'; + + # Remove the time + $iso=1; + $midnight=0; + $from="24${hm}00(?:${ms}00)?"; + $falsefrom="${hm}24${ms}00"; # Don't trap XX:24:00 + $to="00${hm}00${ms}00"; + $midnight=1 if (!/$falsefrom/ && s/$from/$to/); + + $h=$mn=$s=0; + if (/$D$mnsec/i || /$ampmexp/i) { + $iso=0; + $tmp=0; + $tmp=1 if (/$mnsec$zone2?\s*$/i or /$mnsec$zone\s*$/i); + $tmp=0 if (/$ampmexp/i); + if (s/$apachetime$zone()/$1 /i || + s/$apachetime$zone2?/$1 /i || + s/(^|[^a-z])$at\s*$D$mnsec$zone()/$1 /i || + s/(^|[^a-z])$at\s*$D$mnsec$zone2?/$1 /i || + s/(^|[^0-9])(\d)$mnsec$zone()/$1 /i || + s/(^|[^0-9])(\d)$mnsec$zone2?/$1 /i || + (s/(t)$D$mnsec$zone()/$1 /i and (($iso=$tmp) || 1)) || + (s/(t)$D$mnsec$zone2?/$1 /i and (($iso=$tmp) || 1)) || + (s/()$DD$mnsec$zone()/ /i and (($iso=$tmp) || 1)) || + (s/()$DD$mnsec$zone2?/ /i and (($iso=$tmp) || 1)) || + s/(^|$at\s*|\s+)$D()()\s*$ampmexp$zone()/ /i || + s/(^|$at\s*|\s+)$D()()\s*$ampmexp$zone2?/ /i || + 0 + ) { + ($h,$mn,$s,$ampm,$z,$z2)=($2,$3,$4,$5,$6,$7); + if (defined ($z)) { + if ($z =~ /^[+-]\d{2}:\d{2}$/) { + $z=~ s/://; + } elsif ($z =~ /^[+-]\d{2}$/) { + $z .= "00"; + } + } + $time=1; + _Date_TimeCheck(\$h,\$mn,\$s,\$ampm); + $y=$m=$d=""; + # We're going to be calling TimeCheck again below (when we check the + # final date), so get rid of $ampm so that we don't have an error + # due to "15:30:00 PM". It'll get reset below. + $ampm=""; + if (/^\s*$/) { + Date_Init() if (! $Cnf{"UpdateCurrTZ"}); + last PARSE; + } + } + } + $time=0 if ($time ne "1"); + s/\s+$//; + s/^\s+//; + + # if a zone was found, get rid of the regexps + if ($z) { + $zone=""; + $zone2=""; + } + + # dateTtime ISO 8601 formats + my($orig)=$_; + + # Parse ISO 8601 dates now (which may still have a zone stuck to it). + if ( ($iso && /^([0-9-]+(?:W[0-9-]+)?)$zone?$/i) || + ($iso && /^([0-9-]+(?:W[0-9-]+)?)$zone2?$/i) || + ($iso && /^([0-9-]+(?:T[0-9-]+)?)$zone?$/i) || + ($iso && /^([0-9-]+(?:T[0-9-]+)?)$zone2?$/i) || + ($iso && /^([0-9-]+)T$zone?$/i) || + ($iso && /^([0-9-]+)T$zone2?$/i) || + 0) { + + # If we already got a timezone, don't get another one. + my(@z); + if ($z) { + @z=($z,$z2); + $z=""; + } + ($_,$z,$z2) = ($1,$2,$3); + ($z,$z2)=@z if (@z); + + s,([0-9])\s*-,$1 ,g; # Change all ISO8601 seps to spaces + s/^\s+//; + s/\s+$//; + + if (/^$D4\s*$DD\s*$DD\s*t?$DD(?:$DD(?:$DD(\d*))?)?$/i || + /^$DD\s+$DD\s*$DD\s*t?$DD(?:$DD(?:$DD(\d*))?)?$/i || + 0 + ) { + # ISO 8601 Dates with times + # YYYYMMDDtHHMNSSFFFF... + # YYYYMMDDtHHMNSS + # YYYYMMDDtHHMN + # YYYYMMDDtHH + # YY MMDDtHHMNSSFFFF... + # YY MMDDtHHMNSS + # YY MMDDtHHMN + # YY MMDDtHH + # The t is an optional letter "t". + ($y,$m,$d,$h,$mn,$s,$tmp)=($1,$2,$3,$4,$5,$6,$7); + if ($h==24 && (! defined $mn || $mn==0) && (! defined $s || $s==0)) { + $h=0; + $midnight=1; + } + $z = "" if (! defined $h); + return "" if ($time && defined $h); + last PARSE; + + } elsif (/^$D4(?:\s*$DD(?:\s*$DD)?)?$/ || + /^$DD(?:\s+$DD(?:\s*$DD)?)?$/) { + # ISO 8601 Dates + # YYYYMMDD + # YYYYMM + # YYYY + # YY MMDD + # YY MM + # YY + ($y,$m,$d)=($1,$2,$3); + last PARSE; + + } elsif (/^$YY\s+$D\s+$D/) { + # YY-M-D + ($y,$m,$d)=($1,$2,$3); + last PARSE; + + } elsif (/^$YY\s*W$DD\s*(\d)?$/i) { + # YY-W##-D + ($y,$wofm,$dofw)=($1,$2,$3); + ($y,$m,$d)=_Date_NthWeekOfYear($y,$wofm,$dofw); + last PARSE; + + } elsif (/^$D4\s*(\d{3})$/ || + /^$DD\s*(\d{3})$/) { + # YYDOY + ($y,$which)=($1,$2); + ($y,$m,$d)=Date_NthDayOfYear($y,$which); + last PARSE; + + } elsif ($iso<0) { + # We confused something like 1999/August12:00:00 + # with a dateTtime format + $_=$orig; + + } else { + return ""; + } + } + + # All deltas that are not ISO-8601 dates are NOT dates. + return "" if ($Curr{"InCalc"} && $delta); + if ($delta) { + Date_Init() if (! $Cnf{"UpdateCurrTZ"}); + return _DateCalc_DateDelta($Curr{"Now"},$delta); + } + + # Check for some special types of dates (next, prev) + foreach $from (keys %{ $Lang{$L}{"Repl"} }) { + $to=$Lang{$L}{"Repl"}{$from}; + s/(^|[^a-z])$from($|[^a-z])/$1$to$2/i; + } + if (/$wom/i || /$future/i || /$later/i || /$past/i || + /$next/i || /$prev/i || /^$week$/i || /$wkabb/i) { + $tmp=0; + + if (/^$wom\s*$week$of\s*$month\s*$YY?$/i) { + # last friday in October 95 + ($wofm,$dofw,$m,$y)=($1,$2,$3,$4); + # fix $m, $y + return "" if (_Date_DateCheck(\$y,\$m,\$d,\$h,\$mn,\$s,\$ampm,\$wk)); + $dofw=$week{lc($dofw)}; + $wofm=$wom{lc($wofm)}; + # Get the first day of the month + $date=_Date_Join($y,$m,1,$h,$mn,$s); + if ($wofm==-1) { + $date=_DateCalc_DateDelta($date,"+0:1:0:0:0:0:0",\$err,0); + $date=Date_GetPrev($date,$dofw,0); + } else { + for ($i=0; $i<$wofm; $i++) { + if ($i==0) { + $date=Date_GetNext($date,$dofw,1); + } else { + $date=Date_GetNext($date,$dofw,0); + } + } + } + last PARSE; + + } elsif (/^$last$day$of\s*$month(?:$of?\s*$YY)?/i) { + # last day in month + ($m,$y)=($1,$2); + Date_Init() if (! $Cnf{"UpdateCurrTZ"}); + $y=_Date_FixYear($y) if (! defined $y or length($y)<4); + $m=$month{lc($m)}; + $d=Date_DaysInMonth($m,$y); + last PARSE; + + } elsif (/^$week$/i) { + # friday + ($dofw)=($1); + Date_Init() if (! $Cnf{"UpdateCurrTZ"}); + $date=Date_GetPrev($Curr{"Now"},$Cnf{"FirstDay"},1); + $date=Date_GetNext($date,$dofw,1,$h,$mn,$s); + last PARSE; + + } elsif (/^$next\s*$week$/i) { + # next friday + ($dofw)=($1); + Date_Init() if (! $Cnf{"UpdateCurrTZ"}); + $date=Date_GetNext($Curr{"Now"},$dofw,0,$h,$mn,$s); + last PARSE; + + } elsif (/^$prev\s*$week$/i) { + # last friday + ($dofw)=($1); + Date_Init() if (! $Cnf{"UpdateCurrTZ"}); + $date=Date_GetPrev($Curr{"Now"},$dofw,0,$h,$mn,$s); + last PARSE; + + } elsif (/^$next$wkabb$/i) { + # next week + Date_Init() if (! $Cnf{"UpdateCurrTZ"}); + $date=_DateCalc_DateDelta($Curr{"Now"},"+0:0:1:0:0:0:0",\$err,0); + $date=Date_SetTime($date,$h,$mn,$s) if (defined $h); + last PARSE; + } elsif (/^$prev$wkabb$/i) { + # last week + Date_Init() if (! $Cnf{"UpdateCurrTZ"}); + $date=_DateCalc_DateDelta($Curr{"Now"},"-0:0:1:0:0:0:0",\$err,0); + $date=Date_SetTime($date,$h,$mn,$s) if (defined $h); + last PARSE; + + } elsif (/^$next$mabb$/i) { + # next month + Date_Init() if (! $Cnf{"UpdateCurrTZ"}); + $date=_DateCalc_DateDelta($Curr{"Now"},"+0:1:0:0:0:0:0",\$err,0); + $date=Date_SetTime($date,$h,$mn,$s) if (defined $h); + last PARSE; + } elsif (/^$prev$mabb$/i) { + # last month + Date_Init() if (! $Cnf{"UpdateCurrTZ"}); + $date=_DateCalc_DateDelta($Curr{"Now"},"-0:1:0:0:0:0:0",\$err,0); + $date=Date_SetTime($date,$h,$mn,$s) if (defined $h); + last PARSE; + + } elsif (/^$future\s*(\d+)$day$/i || + /^(\d+)$day$later$/i) { + # in 2 days + # 2 days later + ($num)=($1); + Date_Init() if (! $Cnf{"UpdateCurrTZ"}); + $date=_DateCalc_DateDelta($Curr{"Now"},"+0:0:0:$num:0:0:0", + \$err,0); + $date=Date_SetTime($date,$h,$mn,$s) if (defined $h); + last PARSE; + } elsif (/^(\d+)$day$past$/i) { + # 2 days ago + ($num)=($1); + Date_Init() if (! $Cnf{"UpdateCurrTZ"}); + $date=_DateCalc_DateDelta($Curr{"Now"},"-0:0:0:$num:0:0:0", + \$err,0); + $date=Date_SetTime($date,$h,$mn,$s) if (defined $h); + last PARSE; + + } elsif (/^$future\s*(\d+)$wkabb$/i || + /^(\d+)$wkabb$later$/i) { + # in 2 weeks + # 2 weeks later + ($num)=($1); + Date_Init() if (! $Cnf{"UpdateCurrTZ"}); + $date=_DateCalc_DateDelta($Curr{"Now"},"+0:0:$num:0:0:0:0", + \$err,0); + $date=Date_SetTime($date,$h,$mn,$s) if (defined $h); + last PARSE; + } elsif (/^(\d+)$wkabb$past$/i) { + # 2 weeks ago + ($num)=($1); + Date_Init() if (! $Cnf{"UpdateCurrTZ"}); + $date=_DateCalc_DateDelta($Curr{"Now"},"-0:0:$num:0:0:0:0", + \$err,0); + $date=Date_SetTime($date,$h,$mn,$s) if (defined $h); + last PARSE; + + } elsif (/^$future\s*(\d+)$mabb$/i || + /^(\d+)$mabb$later$/i) { + # in 2 months + # 2 months later + ($num)=($1); + Date_Init() if (! $Cnf{"UpdateCurrTZ"}); + $date=_DateCalc_DateDelta($Curr{"Now"},"+0:$num:0:0:0:0:0", + \$err,0); + $date=Date_SetTime($date,$h,$mn,$s) if (defined $h); + last PARSE; + } elsif (/^(\d+)$mabb$past$/i) { + # 2 months ago + ($num)=($1); + Date_Init() if (! $Cnf{"UpdateCurrTZ"}); + $date=_DateCalc_DateDelta($Curr{"Now"},"-0:$num:0:0:0:0:0", + \$err,0); + $date=Date_SetTime($date,$h,$mn,$s) if (defined $h); + last PARSE; + + } elsif (/^$week$future\s*(\d+)$wkabb$/i || + /^$week\s*(\d+)$wkabb$later$/i) { + # friday in 2 weeks + # friday 2 weeks later + ($dofw,$num)=($1,$2); + $tmp="+"; + } elsif (/^$week\s*(\d+)$wkabb$past$/i) { + # friday 2 weeks ago + ($dofw,$num)=($1,$2); + $tmp="-"; + } elsif (/^$future\s*(\d+)$wkabb$on$week$/i || + /^(\d+)$wkabb$later$on$week$/i) { + # in 2 weeks on friday + # 2 weeks later on friday + ($num,$dofw)=($1,$2); + $tmp="+" + } elsif (/^(\d+)$wkabb$past$on$week$/i) { + # 2 weeks ago on friday + ($num,$dofw)=($1,$2); + $tmp="-"; + } elsif (/^$week\s*$wkabb$/i) { + # monday week (British date: in 1 week on monday) + $dofw=$1; + $num=1; + $tmp="+"; + } elsif ( (/^$now\s*$wkabb$/i && ($tmp="Now")) || + (/^$today\s*$wkabb$/i && ($tmp="Today")) ) { + # now week (British date: 1 week from now) + # today week (British date: 1 week from today) + Date_Init() if (! $Cnf{"UpdateCurrTZ"}); + $date=_DateCalc_DateDelta($Curr{$tmp},"+0:0:1:0:0:0:0",\$err,0); + $date=Date_SetTime($date,$h,$mn,$s) if ($time); + last PARSE; + } elsif (/^$offset\s*$wkabb$/i) { + # tomorrow week (British date: 1 week from tomorrow) + ($offset)=($1); + Date_Init() if (! $Cnf{"UpdateCurrTZ"}); + $offset=$Lang{$L}{"OffsetH"}{lc($offset)}; + $date=_DateCalc_DateDelta($Curr{"Now"},$offset,\$err,0); + $date=_DateCalc_DateDelta($date,"+0:0:1:0:0:0:0",\$err,0); + if ($time) { + return "" + if (_Date_DateCheck(\$y,\$m,\$d,\$h,\$mn,\$s,\$ampm,\$wk)); + $date=Date_SetTime($date,$h,$mn,$s); + } + last PARSE; + } + + if ($tmp) { + Date_Init() if (! $Cnf{"UpdateCurrTZ"}); + $date=_DateCalc_DateDelta($Curr{"Now"}, + $tmp . "0:0:$num:0:0:0:0",\$err,0); + $date=Date_GetPrev($date,$Cnf{"FirstDay"},1); + $date=Date_GetNext($date,$dofw,1,$h,$mn,$s); + last PARSE; + } + } + + # Change (2nd, second) to 2 + $tmp=0; + if (/(^|[^a-z0-9])$dom($|[^a-z0-9])/i) { + if (/^\s*$dom\s*$/) { + ($d)=($1); + $d=$dom{lc($d)}; + $m=$Curr{"M"}; + last PARSE; + } + my $from = $2; + my $to = $dom{ lc($from) }; + s/(^|[^a-z])$from($|[^a-z])/$1 $to $2/i; + s/^\s+//; + s/\s+$//; + } + + # Another set of special dates (Nth week) + if (/^$D\s*$week(?:$of?\s*$YY)?$/i) { + # 22nd sunday in 1996 + ($which,$dofw,$y)=($1,$2,$3); + $y=$Curr{"Y"} if (! $y); + $y--; # previous year + $tmp=Date_GetNext("$y-12-31",$dofw,0); + if ($which>1) { + $tmp=_DateCalc_DateDelta($tmp,"+0:0:".($which-1).":0:0:0:0",\$err,0); + } + ($y,$m,$d)=(_Date_Split($tmp, 1))[0..2]; + last PARSE; + } elsif (/^$week$wkabb\s*$D(?:$of?\s*$YY)?$/i || + /^$week\s*$D$wkabb(?:$of?\s*$YY)?$/i) { + # sunday week 22 in 1996 + # sunday 22nd week in 1996 + ($dofw,$which,$y)=($1,$2,$3); + ($y,$m,$d)=_Date_NthWeekOfYear($y,$which,$dofw); + last PARSE; + } + + # Get rid of day of week + if (/(^|[^a-z])$week($|[^a-z])/i) { + $wk=$2; + (s/(^|[^a-z])$week,/$1 /i) || + s/(^|[^a-z])$week($|[^a-z])/$1 $3/i; + s/^\s+//; + s/\s+$//; + } + + { + # So that we can handle negative epoch times, let's convert + # things like "epoch -" to "epochNEGATIVE " before we strip out + # the $sep chars, which include '-'. + s,epoch\s*-,epochNEGATIVE ,g; + + # Non-ISO8601 dates + s,\s*$sep\s*, ,g; # change all non-ISO8601 seps to spaces + s,^\s*,,; # remove leading/trailing space + s,\s*$,,; + + if (/^$D\s+$D(?:\s+$YY)?$/) { + # MM DD YY (DD MM YY non-US) + ($m,$d,$y)=($1,$2,$3); + ($m,$d)=($d,$m) if ($type ne "US"); + last PARSE; + + } elsif (/^$D4\s*$D\s*$D$/) { + # YYYY MM DD + ($y,$m,$d)=($1,$2,$3); + last PARSE; + + } elsif (s/(^|[^a-z])$month($|[^a-z])/$1 $3/i) { + ($m)=($2); + + if (/^\s*$D(?:\s+$YY)?\s*$/) { + # mmm DD YY + # DD mmm YY + # DD YY mmm + ($d,$y)=($1,$2); + last PARSE; + + } elsif (/^\s*$D$D4\s*$/) { + # mmm DD YYYY + # DD mmm YYYY + # DD YYYY mmm + ($d,$y)=($1,$2); + last PARSE; + + } elsif (/^\s*$D4\s*$D\s*$/) { + # mmm YYYY DD + # YYYY mmm DD + # YYYY DD mmm + ($y,$d)=($1,$2); + last PARSE; + + } elsif (/^\s*$D4\s*$/) { + # mmm YYYY + # YYYY mmm + ($y,$d)=($1,1); + last PARSE; + + } else { + return ""; + } + + } elsif (/^epochNEGATIVE (\d+)$/) { + $s=$1; + $date=DateCalc("1970-01-01 00:00 GMT","-0:0:$s"); + } elsif (/^epoch\s*(\d+)$/i) { + $s=$1; + $date=DateCalc("1970-01-01 00:00 GMT","+0:0:$s"); + + } elsif ( (/^$now$/i && ($tmp="Now")) || + (/^$today$/i && ($tmp="Today")) ) { + # now, today + Date_Init() if (! $Cnf{"UpdateCurrTZ"}); + $date=$Curr{$tmp}; + if ($time) { + return "" + if (_Date_DateCheck(\$y,\$m,\$d,\$h,\$mn,\$s,\$ampm,\$wk)); + $date=Date_SetTime($date,$h,$mn,$s); + } + last PARSE; + + } elsif (/^$offset$/i) { + # yesterday, tomorrow + ($offset)=($1); + Date_Init() if (! $Cnf{"UpdateCurrTZ"}); + $offset=$Lang{$L}{"OffsetH"}{lc($offset)}; + $date=_DateCalc_DateDelta($Curr{"Now"},$offset,\$err,0); + if ($time) { + return "" + if (_Date_DateCheck(\$y,\$m,\$d,\$h,\$mn,\$s,\$ampm,\$wk)); + $date=Date_SetTime($date,$h,$mn,$s); + } + last PARSE; + + } else { + return ""; + } + } + } + + if (! $date) { + return "" if (_Date_DateCheck(\$y,\$m,\$d,\$h,\$mn,\$s,\$ampm,\$wk)); + $date=_Date_Join($y,$m,$d,$h,$mn,$s); + } + $date=Date_ConvTZ($date,$z); + if ($midnight) { + $date=_DateCalc_DateDelta($date,"+0:0:0:1:0:0:0"); + } + return $date; +} + +sub ParseDate { + print "DEBUG: ParseDate\n" if ($Curr{"Debug"} =~ /trace/); + Date_Init() if (! $Curr{"InitDone"}); + my($args,@args,@a,$ref,$date)=(); + @a=@_; + + # @a : is the list of args to ParseDate. Currently, only one argument + # is allowed and it must be a scalar (or a reference to a scalar) + # or a reference to an array. + + if ($#a!=0) { + print "ERROR: Invalid number of arguments to ParseDate.\n"; + return ""; + } + $args=$a[0]; + $ref=ref $args; + if (! $ref) { + return $args if (_Date_Split($args)); + @args=($args); + } elsif ($ref eq "ARRAY") { + @args=@$args; + } elsif ($ref eq "SCALAR") { + return $$args if (_Date_Split($$args)); + @args=($$args); + } else { + print "ERROR: Invalid arguments to ParseDate.\n"; + return ""; + } + @a=@args; + + # @args : a list containing all the arguments (dereferenced if appropriate) + # @a : a list containing all the arguments currently being examined + # $ref : nil, "SCALAR", or "ARRAY" depending on whether a scalar, a + # reference to a scalar, or a reference to an array was passed in + # $args : the scalar or refererence passed in + + PARSE: while($#a>=0) { + $date=join(" ",@a); + $date=ParseDateString($date); + last if ($date); + pop(@a); + } # PARSE + + splice(@args,0,$#a + 1); + @$args= @args if (defined $ref and $ref eq "ARRAY"); + $date; +} + +sub Date_Cmp { + my($D1,$D2)=@_; + my($date1)=ParseDateString($D1); + my($date2)=ParseDateString($D2); + return $date1 cmp $date2; +} + +# **NOTE** +# The calc routines all call parse routines, so it is never necessary to +# call Date_Init in the calc routines. +sub DateCalc { + print "DEBUG: DateCalc\n" if ($Curr{"Debug"} =~ /trace/); + my($D1,$D2,@arg)=@_; + my($ref,$err,$errref,$mode)=(); + + ($errref,$mode) = (@arg); + $ref=0; + + if (defined $errref) { + if (ref $errref) { + $ref=1; + } elsif (! defined $mode) { + $mode=$errref; + $errref=""; + } + } + + my(@date,@delta,$ret,$tmp,$oldincalc,$oldmode)=(); + + if (exists $Curr{"Mode"}) { + $oldmode = $Curr{"Mode"}; + } else { + $oldmode = 0; + } + + if (defined $mode and $mode>=0 and $mode<=3) { + $Curr{"Mode"}=$mode; + } else { + $Curr{"Mode"}=0; + } + + if (exists $Curr{"InCalc"}) { + $oldincalc = $Curr{"InCalc"}; + } else { + $oldincalc = 0; + } + $Curr{"InCalc"}=1; + + if ($tmp=ParseDateString($D1)) { + # If we've already parsed the date, we don't want to do it a second + # time (so we don't convert timezones twice). + if (_Date_Split($D1)) { + push(@date,$D1); + } else { + push(@date,$tmp); + } + } elsif ($tmp=ParseDateDelta($D1)) { + push(@delta,$tmp); + } else { + $$errref=1 if ($ref); + $Curr{"InCalc"} = $oldincalc; + $Curr{"Mode"} = $oldmode; + return; + } + + if ($tmp=ParseDateString($D2)) { + if (_Date_Split($D2)) { + push(@date,$D2); + } else { + push(@date,$tmp); + } + } elsif ($tmp=ParseDateDelta($D2)) { + push(@delta,$tmp); + $mode = $Curr{"Mode"}; + } else { + $$errref=2 if ($ref); + $Curr{"InCalc"} = $oldincalc; + $Curr{"Mode"} = $oldmode; + return; + } + + $Curr{"InCalc"} = $oldincalc; + $Curr{"Mode"} = $oldmode; + + if ($#date==1) { + $ret=_DateCalc_DateDate(@date,$mode); + } elsif ($#date==0) { + $ret=_DateCalc_DateDelta(@date,@delta,\$err,$mode); + $$errref=$err if ($ref); + } else { + $ret=_DateCalc_DeltaDelta(@delta,$mode); + } + $ret; +} + +sub ParseDateDelta { + print "DEBUG: ParseDateDelta\n" if ($Curr{"Debug"} =~ /trace/); + my($args,@args,@a,$ref)=(); + local($_)=(); + @a=@_; + + # @a : is the list of args to ParseDateDelta. Currently, only one argument + # is allowed and it must be a scalar (or a reference to a scalar) + # or a reference to an array. + + if ($#a!=0) { + print "ERROR: Invalid number of arguments to ParseDateDelta.\n"; + return ""; + } + $args=$a[0]; + $ref=ref $args; + if (! $ref) { + @args=($args); + } elsif ($ref eq "ARRAY") { + @args=@$args; + } elsif ($ref eq "SCALAR") { + @args=($$args); + } else { + print "ERROR: Invalid arguments to ParseDateDelta.\n"; + return ""; + } + @a=@args; + + # @args : a list containing all the arguments (dereferenced if appropriate) + # @a : a list containing all the arguments currently being examined + # $ref : nil, "SCALAR", or "ARRAY" depending on whether a scalar, a + # reference to a scalar, or a reference to an array was passed in + # $args : the scalar or refererence passed in + + my(@colon,@delta,$delta,$dir,$colon,$sign,$val)=(); + my($len,$tmp,$tmp2,$tmpl)=(); + my($from,$to)=(); + my($workweek)=$Cnf{"WorkWeekEnd"}-$Cnf{"WorkWeekBeg"}+1; + + Date_Init() if (! $Curr{"InitDone"}); + # A sign can be a sequence of zero or more + and - signs, this + # allows for deltas like '+ -2 days'. + my($signexp)='((?:[+-]\s*)*)'; + my($numexp)='(\d+)'; + my($exp1)="(?: \\s* $signexp \\s* $numexp \\s*)"; + my($yexp,$mexp,$wexp,$dexp,$hexp,$mnexp,$sexp,$i)=(); + $yexp=$mexp=$wexp=$dexp=$hexp=$mnexp=$sexp="()()"; + $yexp ="(?: $exp1 ". $Lang{$Cnf{"Language"}}{"Yabb"} .")?"; + $mexp ="(?: $exp1 ". $Lang{$Cnf{"Language"}}{"Mabb"} .")?"; + $wexp ="(?: $exp1 ". $Lang{$Cnf{"Language"}}{"Wabb"} .")?"; + $dexp ="(?: $exp1 ". $Lang{$Cnf{"Language"}}{"Dabb"} .")?"; + $hexp ="(?: $exp1 ". $Lang{$Cnf{"Language"}}{"Habb"} .")?"; + $mnexp="(?: $exp1 ". $Lang{$Cnf{"Language"}}{"MNabb"}.")?"; + $sexp ="(?: $exp1 ". $Lang{$Cnf{"Language"}}{"Sabb"} ."?)?"; + my($future)=$Lang{$Cnf{"Language"}}{"Future"}; + my($later)=$Lang{$Cnf{"Language"}}{"Later"}; + my($past)=$Lang{$Cnf{"Language"}}{"Past"}; + + $delta=""; + PARSE: while (@a) { + $_ = join(" ", grep {defined;} @a); + s/\s+$//; + last if ($_ eq ""); + + # Mode is set in DateCalc. ParseDateDelta only overrides it if the + # string contains a mode. + if ($Lang{$Cnf{"Language"}}{"Exact"} && + s/$Lang{$Cnf{"Language"}}{"Exact"}//) { + $Curr{"Mode"}=0; + } elsif ($Lang{$Cnf{"Language"}}{"Approx"} && + s/$Lang{$Cnf{"Language"}}{"Approx"}//) { + $Curr{"Mode"}=1; + } elsif ($Lang{$Cnf{"Language"}}{"Business"} && + s/$Lang{$Cnf{"Language"}}{"Business"}//) { + $Curr{"Mode"}=2; + } elsif (! exists $Curr{"Mode"}) { + $Curr{"Mode"}=0; + } + $workweek=7 if ($Curr{"Mode"} != 2); + + foreach $from (keys %{ $Lang{$Cnf{"Language"}}{"Repl"} }) { + $to=$Lang{$Cnf{"Language"}}{"Repl"}{$from}; + s/(^|[^a-z])$from($|[^a-z])/$1$to$2/i; + } + + # in or ago + # + # We need to make sure that $later, $future, and $past don't contain each + # other... Romanian pointed this out where $past is "in urma" and $future + # is "in". When they do, we have to take this into account. + # $len length of best match (greatest wins) + # $tmp string after best match + # $dir direction (prior, after) of best match + # + # $tmp2 string before/after current match + # $tmpl length of current match + + $len=0; + $tmp=$_; + $dir=1; + + $tmp2=$_; + if ($tmp2 =~ s/(^|[^a-z])($future)($|[^a-z])/$1 $3/i) { + $tmpl=length($2); + if ($tmpl>$len) { + $tmp=$tmp2; + $dir=1; + $len=$tmpl; + } + } + + $tmp2=$_; + if ($tmp2 =~ s/(^|[^a-z])($later)($|[^a-z])/$1 $3/i) { + $tmpl=length($2); + if ($tmpl>$len) { + $tmp=$tmp2; + $dir=1; + $len=$tmpl; + } + } + + $tmp2=$_; + if ($tmp2 =~ s/(^|[^a-z])($past)($|[^a-z])/$1 $3/i) { + $tmpl=length($2); + if ($tmpl>$len) { + $tmp=$tmp2; + $dir=-1; + $len=$tmpl; + } + } + + $_ = $tmp; + s/\s*$//; + + # the colon part of the delta + $colon=""; + if (s/($signexp?$numexp?(:($signexp?$numexp)?){1,6})$//) { + $colon=$1; + s/\s+$//; + } + @colon=split(/:/,$colon); + + # the non-colon part of the delta + $sign="+"; + @delta=(); + $i=6; + foreach $exp1 ($yexp,$mexp,$wexp,$dexp,$hexp,$mnexp,$sexp) { + last if ($#colon>=$i--); + $val=0; + if (s/^$exp1//ix) { + $val=$2 if ($2); + $sign=$1 if ($1); + } + + # Collapse a sign like '+ -' into a single character like '-', + # by counting the occurrences of '-'. + # + $sign =~ s/\s+//g; + $sign =~ tr/+//d; + my $count = ($sign =~ tr/-//d); + die "bad characters in sign: $sign" if length $sign; + $sign = $count % 2 ? '-' : '+'; + + push(@delta,"$sign$val"); + } + if (! /^\s*$/) { + pop(@a); + next PARSE; + } + + # make sure that the colon part has a sign + for ($i=0; $i<=$#colon; $i++) { + $val=0; + if ($colon[$i] =~ /^$signexp$numexp?/) { + $val=$2 if ($2); + $sign=$1 if ($1); + } + $colon[$i] = "$sign$val"; + } + + # combine the two + push(@delta,@colon); + if ($dir<0) { + for ($i=0; $i<=$#delta; $i++) { + $delta[$i] =~ tr/-+/+-/; + } + } + + # form the delta and shift off the valid part + $delta=join(":",@delta); + splice(@args,0,$#a+1); + @$args=@args if (defined $ref and $ref eq "ARRAY"); + last PARSE; + } + + $delta=_Delta_Normalize($delta,$Curr{"Mode"}); + return $delta; +} + +sub UnixDate { + print "DEBUG: UnixDate\n" if ($Curr{"Debug"} =~ /trace/); + my($date,@format)=@_; + local($_)=(); + my($format,%f,$out,@out,$c,$date1,$date2,$tmp)=(); + my($scalar)=(); + $date=ParseDateString($date); + return if (! $date); + + my($y,$m,$d,$h,$mn,$s)=($f{"Y"},$f{"m"},$f{"d"},$f{"H"},$f{"M"},$f{"S"})= + _Date_Split($date, 1); + $f{"y"}=substr $f{"Y"},2; + Date_Init() if (! $Curr{"InitDone"}); + + if (! wantarray) { + $format=join(" ",@format); + @format=($format); + $scalar=1; + } + + # month, week + $_=$m; + s/^0//; + $f{"b"}=$f{"h"}=$Lang{$Cnf{"Language"}}{"MonL"}[$_-1]; + $f{"B"}=$Lang{$Cnf{"Language"}}{"MonthL"}[$_-1]; + $_=$m; + s/^0/ /; + $f{"f"}=$_; + $f{"U"}=Date_WeekOfYear($m,$d,$y,7); + $f{"W"}=Date_WeekOfYear($m,$d,$y,1); + + # check week 52,53 and 0 + $f{"G"}=$f{"L"}=$y; + if ($f{"W"}>=52 || $f{"U"}>=52) { + my($dd,$mm,$yy)=($d,$m,$y); + $dd+=7; + if ($dd>31) { + $dd-=31; + $mm=1; + $yy++; + if (Date_WeekOfYear($mm,$dd,$yy,1)==2) { + $f{"G"}=$yy; + $f{"W"}=1; + } + if (Date_WeekOfYear($mm,$dd,$yy,7)==2) { + $f{"L"}=$yy; + $f{"U"}=1; + } + } + } + if ($f{"W"}==0) { + my($dd,$mm,$yy)=($d,$m,$y); + $dd-=7; + $dd+=31 if ($dd<1); + $yy = sprintf "%04d", $yy-1; + $mm=12; + $f{"G"}=$yy; + $f{"W"}=Date_WeekOfYear($mm,$dd,$yy,1)+1; + } + if ($f{"U"}==0) { + my($dd,$mm,$yy)=($d,$m,$y); + $dd-=7; + $dd+=31 if ($dd<1); + $yy = sprintf "%04d", $yy-1; + $mm=12; + $f{"L"}=$yy; + $f{"U"}=Date_WeekOfYear($mm,$dd,$yy,7)+1; + } + + $f{"U"}="0".$f{"U"} if (length $f{"U"} < 2); + $f{"W"}="0".$f{"W"} if (length $f{"W"} < 2); + + # day + $f{"j"}=Date_DayOfYear($m,$d,$y); + $f{"j"} = "0" . $f{"j"} while (length($f{"j"})<3); + $_=$d; + s/^0/ /; + $f{"e"}=$_; + $f{"w"}=Date_DayOfWeek($m,$d,$y); + $f{"v"}=$Lang{$Cnf{"Language"}}{"WL"}[$f{"w"}-1]; + $f{"v"}=" ".$f{"v"} if (length $f{"v"} < 2); + $f{"a"}=$Lang{$Cnf{"Language"}}{"WkL"}[$f{"w"}-1]; + $f{"A"}=$Lang{$Cnf{"Language"}}{"WeekL"}[$f{"w"}-1]; + $f{"E"}=Date_DaySuffix($f{"e"}); + + # hour + $_=$h; + s/^0/ /; + $f{"k"}=$_; + $f{"i"}=$f{"k"}+1; + $f{"i"}=$f{"k"}; + $f{"i"}=12 if ($f{"k"}==0); + $f{"i"}=$f{"k"}-12 if ($f{"k"}>12); + $f{"i"}=$f{"i"}-12 if ($f{"i"}>12); + $f{"i"}=" ".$f{"i"} if (length($f{"i"})<2); + $f{"I"}=$f{"i"}; + $f{"I"}=~ s/^ /0/; + $f{"p"}=$Lang{$Cnf{"Language"}}{"AMstr"}; + $f{"p"}=$Lang{$Cnf{"Language"}}{"PMstr"} if ($f{"k"}>11); + + # minute, second, timezone + $f{"o"}=Date_SecsSince1970($m,$d,$y,$h,$mn,$s); + $f{"s"}=Date_SecsSince1970GMT($m,$d,$y,$h,$mn,$s); + $f{"Z"}=($Cnf{"ConvTZ"} eq "IGNORE" or $Cnf{"ConvTZ"} eq "") ? + $Cnf{"TZ"} : $Cnf{"ConvTZ"}; + $f{"z"}=($f{"Z"}=~/^[+-]\d{4}/) ? $f{"Z"} : ($Zone{"n2o"}{lc $f{"Z"}} || ""); + + # date, time + $f{"c"}=qq|$f{"a"} $f{"b"} $f{"e"} $h:$mn:$s $y|; + $f{"C"}=$f{"u"}= + qq|$f{"a"} $f{"b"} $f{"e"} $h:$mn:$s $f{"z"} $y|; + $f{"g"}=qq|$f{"a"}, $d $f{"b"} $y $h:$mn:$s $f{"z"}|; + $f{"D"}=$f{"x"}=qq|$m/$d/$f{"y"}|; + $f{"x"}=qq|$d/$m/$f{"y"}| if ($Cnf{"DateFormat"} ne "US"); + $f{"r"}=qq|$f{"I"}:$mn:$s $f{"p"}|; + $f{"R"}=qq|$h:$mn|; + $f{"T"}=$f{"X"}=qq|$h:$mn:$s|; + $f{"V"}=qq|$m$d$h$mn$f{"y"}|; + $f{"Q"}="$y$m$d"; + $f{"q"}=qq|$y$m$d$h$mn$s|; + $f{"P"}=qq|$y$m$d$h:$mn:$s|; + $f{"O"}=qq|$y-$m-${d}T$h:$mn:$s|; + $f{"F"}=qq|$f{"A"}, $f{"B"} $f{"e"}, $f{"Y"}|; + if ($f{"W"}==0) { + $y--; + $tmp=Date_WeekOfYear(12,31,$y,1); + $tmp="0$tmp" if (length($tmp) < 2); + $f{"J"}=qq|$y-W$tmp-$f{"w"}|; + } else { + $f{"J"}=qq|$f{"G"}-W$f{"W"}-$f{"w"}|; + } + $f{"K"}=qq|$y-$f{"j"}|; + # %l is a special case. Since it requires the use of the calculator + # which requires this routine, an infinite recursion results. To get + # around this, %l is NOT determined every time this is called so the + # recursion breaks. + + # other formats + $f{"n"}="\n"; + $f{"t"}="\t"; + $f{"%"}="%"; + $f{"+"}="+"; + + foreach $format (@format) { + $format=reverse($format); + $out=""; + while ($format ne "") { + $c=chop($format); + if ($c eq "%") { + $c=chop($format); + if ($c eq "l") { + Date_Init(); + $date1=_DateCalc_DateDelta($Curr{"Now"},"-0:6:0:0:0:0:0"); + $date2=_DateCalc_DateDelta($Curr{"Now"},"+0:6:0:0:0:0:0"); + if (Date_Cmp($date,$date1)>=0 && Date_Cmp($date,$date2)<=0) { + $f{"l"}=qq|$f{"b"} $f{"e"} $h:$mn|; + } else { + $f{"l"}=qq|$f{"b"} $f{"e"} $f{"Y"}|; + } + $out .= $f{"$c"}; + } elsif (exists $f{"$c"}) { + $out .= $f{"$c"}; + } else { + $out .= $c; + } + } else { + $out .= $c; + } + } + push(@out,$out); + } + if ($scalar) { + return $out[0]; + } else { + return (@out); + } +} + +# Can't be in "use integer" because we're doing decimal arithmatic +no integer; +sub Delta_Format { + print "DEBUG: Delta_Format\n" if ($Curr{"Debug"} =~ /trace/); + my($delta,@arg)=@_; + my($mode); + if (lc($arg[0]) eq "approx") { + $mode = "approx"; + shift(@arg); + } else { + $mode = "exact"; + } + my($dec,@format) = @arg; + + $delta=ParseDateDelta($delta); + return "" if (! $delta); + my(@out,%f,$out,$c1,$c2,$scalar,$format)=(); + local($_)=$delta; + my($y,$M,$w,$d,$h,$m,$s)=_Delta_Split($delta); + # Get rid of positive signs. + ($y,$M,$w,$d,$h,$m,$s)=map { 1*$_; }($y,$M,$w,$d,$h,$m,$s); + + if (defined $dec && $dec>0) { + $dec="%." . ($dec*1) . "f"; + } else { + $dec="%f"; + } + + if (! wantarray) { + $format=join(" ",@format); + @format=($format); + $scalar=1; + } + + # Length of each unit in seconds + my($sl,$ml,$hl,$dl,$wl,$Ml,$yl)=(); + $sl = 1; + $ml = $sl*60; + $hl = $ml*60; + $dl = $hl*24; + $wl = $dl*7; + $yl = $dl*365.25; + $Ml = $yl/12; + + # The decimal amount of each unit contained in all smaller units + my($yd,$Md,$sd,$md,$hd,$dd,$wd)=(); + if ($mode eq "exact") { + $yd = $M/12; + $Md = 0; + } else { + $yd = ($M*$Ml + $w*$wl + $d*$dl + $h*$hl + $m*$ml + $s*$sl)/$yl; + $Md = ($w*$wl + $d*$dl + $h*$hl + $m*$ml + $s*$sl)/$Ml; + } + + $wd = ($d*$dl + $h*$hl + $m*$ml + $s*$sl)/$wl; + $dd = ($h*$hl + $m*$ml + $s*$sl)/$dl; + $hd = ($m*$ml + $s*$sl)/$hl; + $md = ($s*$sl)/$ml; + $sd = 0; + + # The amount of each unit contained in higher units. + my($yh,$Mh,$sh,$mh,$hh,$dh,$wh)=(); + $yh = 0; + $Mh = ($yh+$y)*12; + + if ($mode eq "exact") { + $wh = 0; + $dh = ($wh+$w)*7; + } else { + $wh = ($yh+$y+$M/12)*365.25/7; + $dh = ($wh+$w)*7; + } + + $hh = ($dh+$d)*24; + $mh = ($hh+$h)*60; + $sh = ($mh+$m)*60; + + # Set up the formats + + $f{"yv"} = $y; + $f{"Mv"} = $M; + $f{"wv"} = $w; + $f{"dv"} = $d; + $f{"hv"} = $h; + $f{"mv"} = $m; + $f{"sv"} = $s; + + $f{"yh"} = $y+$yh; + $f{"Mh"} = $M+$Mh; + $f{"wh"} = $w+$wh; + $f{"dh"} = $d+$dh; + $f{"hh"} = $h+$hh; + $f{"mh"} = $m+$mh; + $f{"sh"} = $s+$sh; + + $f{"yd"} = sprintf($dec,$y+$yd); + $f{"Md"} = sprintf($dec,$M+$Md); + $f{"wd"} = sprintf($dec,$w+$wd); + $f{"dd"} = sprintf($dec,$d+$dd); + $f{"hd"} = sprintf($dec,$h+$hd); + $f{"md"} = sprintf($dec,$m+$md); + $f{"sd"} = sprintf($dec,$s+$sd); + + $f{"yt"} = sprintf($dec,$yh+$y+$yd); + $f{"Mt"} = sprintf($dec,$Mh+$M+$Md); + $f{"wt"} = sprintf($dec,$wh+$w+$wd); + $f{"dt"} = sprintf($dec,$dh+$d+$dd); + $f{"ht"} = sprintf($dec,$hh+$h+$hd); + $f{"mt"} = sprintf($dec,$mh+$m+$md); + $f{"st"} = sprintf($dec,$sh+$s+$sd); + + $f{"%"} = "%"; + + foreach $format (@format) { + $format=reverse($format); + $out=""; + PARSE: while ($format) { + $c1=chop($format); + if ($c1 eq "%") { + $c1=chop($format); + if (exists($f{$c1})) { + $out .= $f{$c1}; + next PARSE; + } + $c2=chop($format); + if (exists($f{"$c1$c2"})) { + $out .= $f{"$c1$c2"}; + next PARSE; + } + $out .= $c1; + $format .= $c2; + } else { + $out .= $c1; + } + } + push(@out,$out); + } + if ($scalar) { + return $out[0]; + } else { + return (@out); + } +} +use integer; + +sub ParseRecur { + print "DEBUG: ParseRecur\n" if ($Curr{"Debug"} =~ /trace/); + Date_Init() if (! $Curr{"InitDone"}); + + my($recur,$dateb,$date0,$date1,$flag)=@_; + local($_)=$recur; + + my($recur_0,$recur_1,@recur0,@recur1)=(); + my(@tmp,$tmp,$each,$num,$y,$m,$d,$w,$h,$mn,$s,$delta,$y0,$y1,$yb)=(); + my($yy,$n,$dd,@d,@tmp2,$date,@date,@w,@tmp3,@m,@y,$tmp2,$d2,@flags)=(); + + # $date0, $date1, $dateb, $flag : passed in (these are always the final say + # in determining whether a date matches a + # recurrence IF they are present. + # $date_b, $date_0, $date_1 : if a value can be determined from the + # $flag_t recurrence, they are stored here. + # + # If values can be determined from the recurrence AND are passed in, the + # following are used: + # max($date0,$date_0) i.e. the later of the two dates + # min($date1,$date_1) i.e. the earlier of the two dates + # + # The base date that is used is the first one defined from + # $dateb $date_b + # The base date is only used if necessary (as determined by the recur). + # For example, "every other friday" requires a base date, but "2nd + # friday of every month" doesn't. + + my($date_b,$date_0,$date_1,$flag_t); + + # + # Check the arguments passed in. + # + + $date0="" if (! defined $date0); + $date1="" if (! defined $date1); + $dateb="" if (! defined $dateb); + $flag ="" if (! defined $flag); + + if ($dateb) { + $dateb=ParseDateString($dateb); + return "" if (! $dateb); + } + if ($date0) { + $date0=ParseDateString($date0); + return "" if (! $date0); + } + if ($date1) { + $date1=ParseDateString($date1); + return "" if (! $date1); + } + + # + # Parse the recur. $date_b, $date_0, and $date_e are values obtained + # from the recur. + # + + @tmp=_Recur_Split($_); + + if (@tmp) { + ($recur_0,$recur_1,$flag_t,$date_b,$date_0,$date_1)=@tmp; + $recur_0 = "" if (! defined $recur_0); + $recur_1 = "" if (! defined $recur_1); + $flag_t = "" if (! defined $flag_t); + $date_b = "" if (! defined $date_b); + $date_0 = "" if (! defined $date_0); + $date_1 = "" if (! defined $date_1); + + @recur0 = split(/:/,$recur_0); + @recur1 = split(/:/,$recur_1); + return "" if ($#recur0 + $#recur1 + 2 != 7); + + if ($date_b) { + $date_b=ParseDateString($date_b); + return "" if (! $date_b); + } + if ($date_0) { + $date_0=ParseDateString($date_0); + return "" if (! $date_0); + } + if ($date_1) { + $date_1=ParseDateString($date_1); + return "" if (! $date_1); + } + + } else { + + my($mmm)='\s*'.$Lang{$Cnf{"Language"}}{"Month"}; # \s*(jan|january|...) + my(%mmm)=%{ $Lang{$Cnf{"Language"}}{"MonthH"} }; # { jan=>1, ... } + my($wkexp)='\s*'.$Lang{$Cnf{"Language"}}{"Week"}; # \s*(mon|monday|...) + my(%week)=%{ $Lang{$Cnf{"Language"}}{"WeekH"} }; # { monday=>1, ... } + my($day)='\s*'.$Lang{$Cnf{"Language"}}{"Dabb"}; # \s*(?:d|day|days) + my($month)='\s*'.$Lang{$Cnf{"Language"}}{"Mabb"}; # \s*(?:mon|month|months) + my($week)='\s*'.$Lang{$Cnf{"Language"}}{"Wabb"}; # \s*(?:w|wk|week|weeks) + my($daysexp)=$Lang{$Cnf{"Language"}}{"DoM"}; # (1st|first|...31st) + my(%dayshash)=%{ $Lang{$Cnf{"Language"}}{"DoMH"} }; + # { 1st=>1,first=>1,...} + my($of)='\s*'.$Lang{$Cnf{"Language"}}{"Of"}; # \s*(?:in|of) + my($lastexp)=$Lang{$Cnf{"Language"}}{"Last"}; # (?:last) + my($each)=$Lang{$Cnf{"Language"}}{"Each"}; # (?:each|every) + + my($D)='\s*(\d+)'; + my($Y)='\s*(\d{4}|\d{2})'; + + # Change 1st to 1 + if (/(^|[^a-z])$daysexp($|[^a-z])/i) { + $tmp=lc($2); + $tmp=$dayshash{"$tmp"}; + s/(^|[^a-z])$daysexp($|[^a-z])/$1 $tmp $3/i; + } + s/\s*$//; + + # Get rid of "each" + if (/(^|[^a-z])$each($|[^a-z])/i) { + s/(^|[^a-z])$each($|[^a-z])/$1 $2/i; + $each=1; + } else { + $each=0; + } + + if ($each) { + + if (/^$D?$day(?:$of$mmm?$Y)?$/i || + /^$D?$day(?:$of$mmm())?$/i) { + # every [2nd] day in [june] 1997 + # every [2nd] day [in june] + ($num,$m,$y)=($1,$2,$3); + $num=1 if (! defined $num); + $m="" if (! defined $m); + $y="" if (! defined $y); + + $y=$Curr{"Y"} if (! $y); + if ($m) { + $m=$mmm{lc($m)}; + $date_0=_Date_Join($y,$m,1,0,0,0); + $date_1=_DateCalc_DateDelta($date_0,"+0:1:0:0:0:0:0",0); + } else { + $date_0=_Date_Join($y, 1,1,0,0,0); + $date_1=_Date_Join($y+1,1,1,0,0,0); + } + $date_b=DateCalc($date_0,"-0:0:0:1:0:0:0",0); + @recur0=(0,0,0,$num,0,0,0); + @recur1=(); + + } elsif (/^$D$day?$of$month(?:$of?$Y)?$/) { + # 2nd [day] of every month [in 1997] + ($num,$y)=($1,$2); + $y=$Curr{"Y"} if (! $y); + + $date_0=_Date_Join($y, 1,1,0,0,0); + $date_1=_Date_Join($y+1,1,1,0,0,0); + $date_b=$date_0; + + @recur0=(0,1,0); + @recur1=($num,0,0,0); + + } elsif (/^$D$wkexp$of$month(?:$of?$Y)?$/ || + /^($lastexp)$wkexp$of$month(?:$of?$Y)?$/) { + # 2nd tuesday of every month [in 1997] + # last tuesday of every month [in 1997] + ($num,$d,$y)=($1,$2,$3); + $y=$Curr{"Y"} if (! $y); + $d=$week{lc($d)}; + $num=-1 if ($num !~ /^$D$/); + + $date_0=_Date_Join($y,1,1,0,0,0); + $date_1=_Date_Join($y+1,1,1,0,0,0); + $date_b=$date_0; + + @recur0=(0,1); + @recur1=($num,$d,0,0,0); + + } elsif (/^$D?$wkexp(?:$of$mmm?$Y)?$/i || + /^$D?$wkexp(?:$of$mmm())?$/i) { + # every tuesday in june 1997 + # every 2nd tuesday in june 1997 + ($num,$d,$m,$y)=($1,$2,$3,$4); + $y=$Curr{"Y"} if (! $y); + $num=1 if (! defined $num); + $m="" if (! defined $m); + $d=$week{lc($d)}; + + if ($m) { + $m=$mmm{lc($m)}; + $date_0=_Date_Join($y,$m,1,0,0,0); + $date_1=_DateCalc_DateDelta($date_0,"+0:1:0:0:0:0:0",0); + } else { + $date_0=_Date_Join($y,1,1,0,0,0); + $date_1=_Date_Join($y+1,1,1,0,0,0); + } + $date_b=DateCalc($date_0,"-0:0:0:1:0:0:0",0); + + @recur0=(0,0,$num); + @recur1=($d,0,0,0); + + } else { + return ""; + } + + $date_0="" if ($date0); + $date_1="" if ($date1); + } else { + return ""; + } + } + + # + # Override with any values passed in + # + + $date0 = $date_0 if (! $date0); + $date1 = $date_1 if (! $date1); + $dateb = $date_b if (! $dateb); + if ($flag =~ s/^\+//) { + $flag = "$flag_t,$flag" if ($flag_t); + } + $flag = $flag_t if (! $flag); + $flag = "" if (! $flag); + + if (! wantarray) { + $tmp = join(":",@recur0); + $tmp .= "*" . join(":",@recur1) if (@recur1); + $tmp .= "*$flag*$dateb*$date0*$date1"; + return $tmp; + } + if (@recur0) { + return () if (! $date0 || ! $date1); # dateb is NOT required in all case + } + + # + # Some flags affect parsing. + # + + @flags = split(/,/,$flag); + my($f); + foreach $f (@flags) { + if ($f =~ /^EASTER$/i) { + ($y,$m,$w,$d,$h,$mn,$s)=(@recur0,@recur1); + # We want something that will return Jan 1 for the given years. + if ($#recur0==-1) { + @recur1=($y,1,0,1,$h,$mn,$s); + } elsif ($#recur0<=3) { + @recur0=($y,0,0,0); + @recur1=($h,$mn,$s); + } elsif ($#recur0==4) { + @recur0=($y,0,0,0,0); + @recur1=($mn,$s); + } elsif ($#recur0==5) { + @recur0=($y,0,0,0,0,0); + @recur1=($s); + } else { + @recur0=($y,0,0,0,0,0,0); + } + } + } + + # + # Determine the dates referenced by the recur. Also, fix the base date + # as necessary for the recurrences which require it. + # + + ($y,$m,$w,$d,$h,$mn,$s)=(@recur0,@recur1); + @y=@m=@w=@d=(); + my(@time)=($h,$mn,$s); + + RECUR: while (1) { + + if ($#recur0==-1) { + # * 0-M-W-D-H-MN-S => 0 * M-W-D-H-MN-S + + if ($y eq "0") { + push(@recur0,1); + shift(@recur1); + next RECUR; + } + + # Y-M-W-D-H-MN-S + + @y=_ReturnList($y); + foreach $y (@y) { + $y=_Date_FixYear($y) if (length($y)==2); + return () if (length($y)!=4 || ! _IsInt($y)); + } + + $date0=ParseDate("0000-01-01") if (! $date0); + $date1=ParseDate("9999-12-31 23:59:59") if (! $date1); + + if ($m eq "0" and $w eq "0") { + + # * Y-0-0-0-H-MN-S + # * Y-0-0-DOY-H-MN-S + + if ($d eq "0") { + @d=(1); + } else { + @d=_ReturnList($d); + return () if (! @d); + foreach $d (@d) { + return () if (! _IsInt($d,-366,366) || $d==0); + } + } + + @date=(); + foreach $yy (@y) { + my $diy = Date_DaysInYear($yy); + foreach $d (@d) { + my $tmpd = $d; + $tmpd += ($diy+1) if ($tmpd < 0); + next if (! _IsInt($tmpd,1,$diy)); + ($y,$m,$dd)=Date_NthDayOfYear($yy,$tmpd); + push(@date, _Date_Join($y,$m,$dd,0,0,0)); + } + } + last RECUR; + + } elsif ($w eq "0") { + + # * Y-M-0-0-H-MN-S + # * Y-M-0-DOM-H-MN-S + + @m=_ReturnList($m); + return () if (! @m); + foreach $m (@m) { + return () if (! _IsInt($m,1,12)); + } + + if ($d eq "0") { + @d=(1); + } else { + @d=_ReturnList($d); + return () if (! @d); + foreach $d (@d) { + return () if (! _IsInt($d,-31,31) || $d==0); + } + } + + @date=(); + foreach $y (@y) { + foreach $m (@m) { + my $dim = Date_DaysInMonth($m,$y); + foreach $d (@d) { + my $tmpd = $d; + $tmpd += ($dim+1) if ($d<0); + next if (! _IsInt($tmpd,1,$dim)); + $date=_Date_Join($y,$m,$tmpd,0,0,0); + push(@date,$date); + } + } + } + last RECUR; + + } elsif ($m eq "0") { + + # * Y-0-WOY-DOW-H-MN-S + # * Y-0-WOY-0-H-MN-S + + @w=_ReturnList($w); + return () if (! @w); + foreach $w (@w) { + return () if (! _IsInt($w,-53,53) || $w==0); + } + + if ($d eq "0") { + @d=(1); + } else { + @d=_ReturnList($d); + return () if (! @d); + foreach $d (@d) { + $d += 8 if ($d<0); + return () if (! _IsInt($d,1,7)); + } + } + + @date=(); + foreach $y (@y) { + foreach $w (@w) { + foreach $d (@d) { + my($tmpw,$del); + if ($w<0) { + $date="$y-12-31-00:00:00"; + $tmpw = (-$w)-1; + $del="-0:0:$tmpw:0:0:0:0"; + $date=Date_GetPrev($date,$d,1); + } else { + $date="$y-01-01-00:00:00"; + $tmpw = ($w)-1; + $del="0:0:$tmpw:0:0:0:0"; + $date=Date_GetNext($date,$d,1); + } + $date=_DateCalc_DateDelta($date,$del); + push(@date,$date) if ( (_Date_Split($date))[0] == $y); + } + } + } + last RECUR; + + } else { + + # * Y-M-WOM-DOW-H-MN-S + # * Y-M-WOM-0-H-MN-S + + @m=_ReturnList($m); + return () if (! @m); + @w=_ReturnList($w); + return () if (! @w); + if ($d eq "0") { + @d=(1); + } else { + @d=_ReturnList($d); + } + + @date=_Date_Recur_WoM(\@y,\@m,\@w,\@d); + last RECUR; + } + } + + if ($#recur0==0) { + + # Y * M-W-D-H-MN-S + $n=$y; + $n=1 if ($n==0); + + if ($m eq "0") { + + # Y * 0-W-D-H-MN-S => Y-0 * W-D-H-MN-S + push(@recur0,0); + shift(@recur1); + + } elsif ($w eq "0") { + + # Y * M-0-DOM-H-MN-S + return () if (! $dateb && $y != 1); + + @m=_ReturnList($m); + return () if (! @m); + foreach $m (@m) { + return () if (! _IsInt($m,1,12)); + } + + if ($d eq "0") { + @d = (1); + } else { + @d=_ReturnList($d); + return () if (! @d); + foreach $d (@d) { + return () if (! _IsInt($d,-31,31) || $d==0); + } + } + + # We need to find years that are a multiple of $n from $y(base) + ($y0)=( _Date_Split($date0, 1) )[0]; + ($y1)=( _Date_Split($date1, 1) )[0]; + if ($dateb) { + ($yb)=( _Date_Split($dateb, 1) )[0]; + } else { + # If $y=1, there is no base year + $yb=0; + } + + @date=(); + for ($yy=$y0; $yy<=$y1; $yy++) { + if (($yy-$yb)%$n == 0) { + foreach $m (@m) { + foreach $d (@d) { + my $dim = Date_DaysInMonth($m,$yy); + my $tmpd = $d; + if ($tmpd < 0) { + $tmpd += ($dim+1); + } + next if (! _IsInt($tmpd,1,$dim)); + $date=_Date_Join($yy,$m,$tmpd,0,0,0); + push(@date,$date); + } + } + } + } + last RECUR; + + } else { + + # Y * M-WOM-DOW-H-MN-S + # Y * M-WOM-0-H-MN-S + return () if (! $dateb && $y != 1); + + @m=_ReturnList($m); + return () if (! @m); + @w=_ReturnList($w); + return () if (! @w); + + if ($d eq "0") { + @d=(1); + } else { + @d=_ReturnList($d); + } + + ($y0)=( _Date_Split($date0, 1) )[0]; + ($y1)=( _Date_Split($date1, 1) )[0]; + if ($dateb) { + ($yb)=( _Date_Split($dateb, 1) )[0]; + } else { + # If $y=1, there is no base year + $yb=0; + } + @y=(); + for ($yy=$y0; $yy<=$y1; $yy++) { + if (($yy-$yb)%$n == 0) { + push(@y,$yy); + } + } + + @date=_Date_Recur_WoM(\@y,\@m,\@w,\@d); + last RECUR; + } + } + + if ($#recur0==1) { + + # Y-M * W-D-H-MN-S + + if ($w eq "0") { + # Y-M * 0-D-H-MN-S => Y-M-0 * D-H-MN-S + push(@recur0,0); + shift(@recur1); + + } elsif ($m==0) { + + # Y-0 * WOY-0-H-MN-S + # Y-0 * WOY-DOW-H-MN-S + return () if (! $dateb && $y != 1); + $n=$y; + $n=1 if ($n==0); + + @w=_ReturnList($w); + return () if (! @w); + foreach $w (@w) { + return () if ($w==0 || ! _IsInt($w,-53,53)); + } + + if ($d eq "0") { + @d=(1); + } else { + @d=_ReturnList($d); + return () if (! @d); + foreach $d (@d) { + $d += 8 if ($d<0); + return () if (! _IsInt($d,1,7)); + } + } + + # We need to find years that are a multiple of $n from $y(base) + ($y0)=( _Date_Split($date0, 1) )[0]; + ($y1)=( _Date_Split($date1, 1) )[0]; + if ($dateb) { + ($yb)=( _Date_Split($dateb, 1) )[0]; + } else { + # If $y=1, there is no base year + $yb=0; + } + + @date=(); + for ($yy=$y0; $yy<=$y1; $yy++) { + if (($yy-$yb)%$n == 0) { + foreach $w (@w) { + foreach $d (@d) { + my($tmpw,$del); + if ($w<0) { + $date="$yy-12-31-00:00:00"; + $tmpw = (-$w)-1; + $del="-0:0:$tmpw:0:0:0:0"; + $date=Date_GetPrev($date,$d,1); + } else { + $date="$yy-01-01-00:00:00"; + $tmpw = ($w)-1; + $del="0:0:$tmpw:0:0:0:0"; + $date=Date_GetNext($date,$d,1); + } + $date=DateCalc($date,$del); + next if ((_Date_Split($date))[0] != $yy); + push(@date,$date); + } + } + } + } + last RECUR; + + } else { + + # Y-M * WOM-0-H-MN-S + # Y-M * WOM-DOW-H-MN-S + return () if (! $dateb && ($y != 0 || $m != 1)); + @tmp=(@recur0); + push(@tmp,0) while ($#tmp<6); + $delta=join(":",@tmp); + $dateb=$date0 if (! $dateb); + @tmp=_Date_Recur($date0,$date1,$dateb,$delta); + + @w=_ReturnList($w); + @m=(); + if ($d eq "0") { + @d=(1); + } else { + @d=_ReturnList($d); + } + + @date=_Date_Recur_WoM(\@tmp,\@m,\@w,\@d); + last RECUR; + } + } + + if ($#recur0==2) { + # Y-M-W * D-H-MN-S + + if ($d eq "0") { + + # Y-M-W * 0-H-MN-S + return () if (! $dateb); + $y=1 if ($y==0 && $m==0 && $w==0); + $delta="$y:$m:$w:0:0:0:0"; + @date=_Date_Recur($date0,$date1,$dateb,$delta); + last RECUR; + + } elsif ($m==0 && $w==0) { + + # Y-0-0 * DOY-H-MN-S + $y=1 if ($y==0); + $n=$y; + return () if (! $dateb && $y!=1); + +