Merge branch 'wip-MDL-26754-master' of github.com:marinaglancy/moodle
authorEloy Lafuente (stronk7) <stronk7@moodle.org>
Tue, 16 Aug 2011 11:07:54 +0000 (13:07 +0200)
committerEloy Lafuente (stronk7) <stronk7@moodle.org>
Tue, 16 Aug 2011 11:07:54 +0000 (13:07 +0200)
136 files changed:
admin/cli/install.php
admin/cli/install_database.php
admin/cron.php
admin/index.php
admin/settings/server.php
backup/moodle2/restore_stepslib.php
backup/util/helper/backup_cron_helper.class.php
blocks/rss_client/editfeed.php
calendar/preferences.php
cohort/edit.php
cohort/index.php
course/edit.php
course/editcategory.php
course/format/topics/format.php
grade/edit/outcome/edit.php
grade/edit/scale/edit.php
grade/import/csv/index.php
install.php
lang/en/moodle.org.php
lang/en/moodle.php
lang/en/question.php
lib/blocklib.php
lib/datalib.php
lib/db/upgrade.php
lib/dml/moodle_database.php
lib/dml/pgsql_native_moodle_database.php
lib/filebrowser/file_info_context_course.php
lib/filebrowser/file_info_context_module.php
lib/filelib.php
lib/formslib.php
lib/grouplib.php
lib/javascript-static.js
lib/moodlelib.php
lib/outputrenderers.php
lib/sessionlib.php
lib/simpletest/portfolio_testclass.php
lib/simpletest/testrepositorylib.php
lib/timezone.txt
lib/weblib.php
mod/assignment/lib.php
mod/assignment/simpletest/test_assignment_portfolio_callers.php
mod/assignment/type/online/assignment.class.php
mod/chat/simpletest/test_chat_portfolio_callers.php
mod/data/simpletest/test_data_portfolio_callers.php
mod/feedback/item/label/lib.php
mod/forum/simpletest/test_forum_portfolio_callers.php
mod/glossary/simpletest/test_glossary_portfolio_callers.php
mod/lesson/editpage.php
mod/quiz/edit.php
mod/quiz/editlib.php
mod/quiz/lang/en/quiz.php
mod/quiz/lib.php
mod/quiz/report/overview/report.php
mod/quiz/report/statistics/responseanalysis.php
mod/quiz/review.php
mod/scorm/api.php
mod/scorm/datamodels/debug.js.php
mod/scorm/datamodels/scorm_12.js.php
mod/scorm/datamodels/scormlib.php
mod/scorm/db/upgrade.php
mod/scorm/lang/en/scorm.php
mod/scorm/lib.php
mod/scorm/loadSCO.php
mod/scorm/loaddatamodel.php
mod/scorm/locallib.php
mod/scorm/module.js
mod/scorm/player.js
mod/scorm/player.php
mod/scorm/rd.js [deleted file]
mod/scorm/report/basic/report.php
mod/scorm/styles.css
mod/scorm/userreport.php
mod/scorm/version.php
mod/survey/index.php
mod/survey/view.php
mod/wiki/lib.php
mod/wiki/pagelib.php
mod/wiki/view.php
mod/workshop/assessment.php
mod/workshop/exassessment.php
mod/workshop/excompare.php
mod/workshop/exsubmission.php
mod/workshop/form/accumulative/lib.php
mod/workshop/form/comments/lib.php
mod/workshop/form/numerrors/lib.php
mod/workshop/form/rubric/lib.php
mod/workshop/lang/en/workshop.php
mod/workshop/lib.php
mod/workshop/locallib.php
mod/workshop/renderer.php
mod/workshop/styles.css
mod/workshop/submission.php
mod/workshop/view.php
portfolio/boxnet/simpletest/testportfoliopluginboxnet.php
question/edit.php
question/editlib.php
question/format.php
question/format/aiken/format.php
question/format/aiken/simpletest/fixtures/questions.aiken.txt [new file with mode: 0644]
question/type/edit_question_form.php
question/type/match/questiontype.php
question/type/multichoice/backup/moodle2/backup_qtype_multichoice_plugin.class.php
question/type/multichoice/questiontype.php
question/type/questionbase.php
question/type/questiontypebase.php
rating/lib.php
rating/simpletest/testrating.php [new file with mode: 0644]
repository/local/lib.php
tag/edit.php
theme/anomaly/style/general.css
theme/arialist/style/core.css
theme/base/pix/horizontal-menu-submenu-indicator.png [new file with mode: 0644]
theme/base/pix/vertical-menu-submenu-indicator.png [new file with mode: 0644]
theme/base/style/blocks.css
theme/base/style/core.css
theme/binarius/style/core.css
theme/boxxie/style/core.css
theme/brick/style/core.css
theme/formal_white/style/formal_white.css
theme/formfactor/style/core.css
theme/formfactor/style/selected.css
theme/fusion/style/menus.css
theme/leatherbound/style/core.css
theme/magazine/style/core.css
theme/nimble/pix/horizontal-menu-submenu-indicator.png [new file with mode: 0644]
theme/nimble/pix/vertical-menu-submenu-indicator.png [new file with mode: 0644]
theme/nimble/style/colors.css
theme/nimble/style/menu.css
theme/nonzero/style/core.css
theme/sky_high/style/menu.css
theme/splash/style/sl.css
theme/standard/style/blocks.css
theme/yui_combo.php
user/edit.php
user/editadvanced.php
version.php

index 1c37f54..0dd5102 100644 (file)
@@ -115,12 +115,12 @@ if (function_exists('date_default_timezone_set') and function_exists('date_defau
 define('MOODLE_INTERNAL', true);
 
 // Check that PHP is of a sufficient version
-if (version_compare(phpversion(), "5.2.8") < 0) {
+if (version_compare(phpversion(), "5.3.2") < 0) {
     $phpversion = phpversion();
     // do NOT localise - lang strings would not work here and we CAN NOT move it after installib
-    echo "Sorry, Moodle 2.0 requires PHP 5.2.8 or later (currently using version $phpversion).\n";
-    echo "Please upgrade your server software or install latest Moodle 1.9.x instead.";
-    die;
+    fwrite(STDERR, "Moodle 2.1 or later requires at least PHP 5.3.2 (currently using version $phpversion).\n");
+    fwrite(STDERR, "Please upgrade your server software or install older Moodle version.\n");
+    exit(1);
 }
 
 // set up configuration
index 9e55c9c..44412ec 100644 (file)
@@ -55,12 +55,12 @@ Example:
 ";
 
 // Check that PHP is of a sufficient version
-if (version_compare(phpversion(), "5.2.8") < 0) {
+if (version_compare(phpversion(), "5.3.2") < 0) {
     $phpversion = phpversion();
     // do NOT localise - lang strings would not work here and we CAN NOT move it after installib
-    fwrite(STDERR, "Sorry, Moodle 2.0 requires PHP 5.2.8 or later (currently using version $phpversion).\n");
-    fwrite(STDERR, "Please upgrade your server software or install latest Moodle 1.9.x instead.\n");
-    die(1);
+    fwrite(STDERR, "Moodle 2.1 or later requires at least PHP 5.3.2 (currently using version $phpversion).\n");
+    fwrite(STDERR, "Please upgrade your server software or install older Moodle version.\n");
+    exit(1);
 }
 
 // Nothing to do if config.php does not exist
@@ -68,7 +68,7 @@ $configfile = dirname(dirname(dirname(__FILE__))).'/config.php';
 if (!file_exists($configfile)) {
     fwrite(STDERR, 'config.php does not exist, can not continue'); // do not localize
     fwrite(STDERR, "\n");
-    die(1);
+    exit(1);
 }
 
 // Include necessary libs
index e131e9b..5b473a3 100644 (file)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
+
+if (defined('STDIN')) {
+    fwrite(STDERR, "ERROR: This script no longer supports CLI, please use admin/cli/cron.php instead\n");
+    exit(1);
+}
+
 // This is a fake CLI script, it is a really ugly hack which emulates
 // CLI via web interface, please do not use this hack elsewhere
 define('CLI_SCRIPT', true);
index 77c0404..2329248 100644 (file)
@@ -30,11 +30,23 @@ if (!file_exists('../config.php')) {
 }
 
 // Check that PHP is of a sufficient version as soon as possible
-if (version_compare(phpversion(), '5.2.0') < 0) {
+if (version_compare(phpversion(), '5.3.2') < 0) {
     $phpversion = phpversion();
     // do NOT localise - lang strings would not work here and we CAN NOT move it to later place
-    echo "Sorry, Moodle 2.0 requires PHP 5.2.8 or later (currently using version $phpversion). ";
-    echo "Please upgrade your server software or use latest Moodle 1.9.x instead.";
+    echo "Moodle 2.1 or later requires at least PHP 5.3.2 (currently using version $phpversion).<br />";
+    echo "Please upgrade your server software or install older Moodle version.";
+    die;
+}
+
+// make sure iconv is available and actually works
+if (!function_exists('iconv')) {
+    // this should not happen, this must be very borked install
+    echo 'Moodle requires the iconv PHP extension. Please install or enable the iconv extension.';
+    die();
+}
+if (iconv('UTF-8', 'UTF-8//IGNORE', 'abc') !== 'abc') {
+    // known to be broken in mid-2011 MAMP installations
+    echo 'Broken iconv PHP extension detected, installation/upgrade can not continue.';
     die;
 }
 
@@ -121,7 +133,7 @@ if (!core_tables_exist()) {
         echo $OUTPUT->box($copyrightnotice, 'copyrightnotice');
         echo '<br />';
         $continue = new single_button(new moodle_url('/admin/index.php', array('lang'=>$CFG->lang, 'agreelicense'=>1)), get_string('continue'), 'get');
-        echo $OUTPUT->confirm(get_string('doyouagree'), $continue, "http://docs.moodle.org/en/License");
+        echo $OUTPUT->confirm(get_string('doyouagree'), $continue, "http://docs.moodle.org/dev/License");
         echo $OUTPUT->footer();
         die;
     }
@@ -455,8 +467,8 @@ if (!empty($CFG->maintenance_enabled)) {
 $copyrighttext = '<a href="http://moodle.org/">Moodle</a> '.
                  '<a href="http://docs.moodle.org/dev/Releases" title="'.$CFG->version.'">'.$CFG->release.'</a><br />'.
                  'Copyright &copy; 1999 onwards, Martin Dougiamas<br />'.
-                 'and <a href="http://docs.moodle.org/en/Credits">many other contributors</a>.<br />'.
-                 '<a href="http://docs.moodle.org/en/License">GNU Public License</a>';
+                 'and <a href="http://docs.moodle.org/dev/Credits">many other contributors</a>.<br />'.
+                 '<a href="http://docs.moodle.org/dev/License">GNU Public License</a>';
 echo $OUTPUT->box($copyrighttext, 'copyright');
 //////////////////////////////////////////////////////////////////////////////////////////////////
 
index e8d7ea7..0348cd3 100644 (file)
@@ -48,8 +48,8 @@ $temp->add(new admin_setting_configselect('sessiontimeout', get_string('sessiont
                                                                                                                                                       900 => get_string('numminutes', '', 15),
                                                                                                                                                       300 => get_string('numminutes', '', 5))));
 $temp->add(new admin_setting_configtext('sessioncookie', get_string('sessioncookie', 'admin'), get_string('configsessioncookie', 'admin'), '', PARAM_ALPHANUM));
-$temp->add(new admin_setting_configtext('sessioncookiepath', get_string('sessioncookiepath', 'admin'), get_string('configsessioncookiepath', 'admin'), '/', PARAM_LOCALURL));
-$temp->add(new admin_setting_configtext('sessioncookiedomain', get_string('sessioncookiedomain', 'admin'), get_string('configsessioncookiedomain', 'admin'), '', PARAM_TEXT, 50));
+$temp->add(new admin_setting_configtext('sessioncookiepath', get_string('sessioncookiepath', 'admin'), get_string('configsessioncookiepath', 'admin'), '', PARAM_RAW));
+$temp->add(new admin_setting_configtext('sessioncookiedomain', get_string('sessioncookiedomain', 'admin'), get_string('configsessioncookiedomain', 'admin'), '', PARAM_RAW, 50));
 $ADMIN->add('server', $temp);
 
 
index 643c478..0b02c01 100644 (file)
@@ -2637,6 +2637,12 @@ class restore_create_question_files extends restore_execution_step {
                                               $oldctxid, $this->task->get_userid(), 'question_answer', null, $newctxid, true);
             restore_dbops::send_files_to_pool($this->get_basepath(), $this->get_restoreid(), 'question', 'hint',
                                               $oldctxid, $this->task->get_userid(), 'question_hint', null, $newctxid, true);
+            restore_dbops::send_files_to_pool($this->get_basepath(), $this->get_restoreid(), 'question', 'correctfeedback',
+                                              $oldctxid, $this->task->get_userid(), 'question_created', $question->itemid, $newctxid, true);
+            restore_dbops::send_files_to_pool($this->get_basepath(), $this->get_restoreid(), 'question', 'partiallycorrectfeedback',
+                                              $oldctxid, $this->task->get_userid(), 'question_created', $question->itemid, $newctxid, true);
+            restore_dbops::send_files_to_pool($this->get_basepath(), $this->get_restoreid(), 'question', 'incorrectfeedback',
+                                              $oldctxid, $this->task->get_userid(), 'question_created', $question->itemid, $newctxid, true);
             // Add qtype dependent files
             $components = backup_qtype_plugin::get_components_and_fileareas($question->qtype);
             foreach ($components as $component => $fileareas) {
index ea07094..be15523 100644 (file)
@@ -312,7 +312,7 @@ abstract class backup_cron_automated_helper {
 
             $settings = array(
                 'users' => 'backup_auto_users',
-                'role_assignments' => 'backup_auto_users',
+                'role_assignments' => 'backup_auto_role_assignments',
                 'user_files' => 'backup_auto_user_files',
                 'activities' => 'backup_auto_activities',
                 'blocks' => 'backup_auto_blocks',
index 38eeb48..5711917 100644 (file)
@@ -140,7 +140,9 @@ class feed_edit_form extends moodleform {
                 return $url;
             }
 
-            return $rss->subscribe_url();
+            // return URL without quoting..
+            $discoveredurl = new moodle_url($rss->subscribe_url());
+            return $discoveredurl->out(false);
     }
 }
 
index a36c9f3..165466d 100644 (file)
@@ -9,7 +9,7 @@ require_once($CFG->dirroot.'/calendar/preferences_form.php');
 $courseid = required_param('course', PARAM_INT);
 $course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
 
-$PAGE->set_url('/calendar/preferences.php', array('id' => $courseid));
+$PAGE->set_url(new moodle_url('/calendar/preferences.php', array('course' => $courseid)));
 $PAGE->set_pagelayout('standard');
 
 require_login($course);
@@ -37,10 +37,13 @@ $prefs->maxevents  = get_user_preferences('calendar_maxevents', $defaultmaxevent
 $prefs->lookahead  = get_user_preferences('calendar_lookahead', $defaultlookahead);
 $prefs->persistflt = get_user_preferences('calendar_persistflt', 0);
 
-$form = new calendar_preferences_form();
+$form = new calendar_preferences_form($PAGE->url);
 $form->set_data($prefs);
 
-if ($data = $form->get_data() && confirm_sesskey()) {
+if ($form->is_cancelled()) {
+    redirect($viewurl);
+} else if ($form->is_submitted() && $form->is_validated() && confirm_sesskey()) {
+    $data = $form->get_data();
     if ($data->timeformat != CALENDAR_TF_12 && $data->timeformat != CALENDAR_TF_24) {
         $data->timeformat = '';
     }
@@ -68,7 +71,7 @@ if ($data = $form->get_data() && confirm_sesskey()) {
 $strcalendar = get_string('calendar', 'calendar');
 $strpreferences = get_string('calendarpreferences', 'calendar');
 
-$PAGE->navbar->add($strpreferences, new moodle_url('/calendar/view.php'));
+$PAGE->navbar->add($strpreferences);
 $PAGE->set_pagelayout('admin');
 $PAGE->set_title("$course->shortname: $strcalendar: $strpreferences");
 $PAGE->set_heading($course->fullname);
index 4063e9c..dc1bd08 100644 (file)
@@ -98,12 +98,12 @@ if ($delete and $cohort->id) {
 $editoroptions = array('maxfiles'=>0, 'context'=>$context);
 if ($cohort->id) {
     // edit existing
-    $cohort = file_prepare_standard_editor($cohort, 'description', $editoroptions);
+    $cohort = file_prepare_standard_editor($cohort, 'description', $editoroptions, $context);
     $strheading = get_string('editcohort', 'cohort');
 
 } else {
     // add new
-    $cohort = file_prepare_standard_editor($cohort, 'description', $editoroptions);
+    $cohort = file_prepare_standard_editor($cohort, 'description', $editoroptions, $context);
     $strheading = get_string('addcohort', 'cohort');
 }
 
index 0324c5a..62c4729 100644 (file)
@@ -47,6 +47,7 @@ if ($context->contextlevel == CONTEXT_COURSECAT) {
 }
 
 $manager = has_capability('moodle/cohort:manage', $context);
+$canassign = has_capability('moodle/cohort:assign', $context);
 if (!$manager) {
     require_capability('moodle/cohort:view', $context);
 }
@@ -84,18 +85,17 @@ foreach($cohorts as $cohort) {
         $line[] = get_string('pluginname', $cohort->component);
     }
 
-    if ($manager) {
-        if (empty($cohort->component)) {
-            $buttons = html_writer::link(new moodle_url('/cohort/edit.php', array('id'=>$cohort->id, 'delete'=>1)), html_writer::empty_tag('img', array('src'=>$OUTPUT->pix_url('t/delete'), 'alt'=>get_string('delete'), 'class'=>'iconsmall')));
-            $buttons .= ' ' . html_writer::link(new moodle_url('/cohort/edit.php', array('id'=>$cohort->id)), html_writer::empty_tag('img', array('src'=>$OUTPUT->pix_url('t/edit'), 'alt'=>get_string('edit'), 'class'=>'iconsmall')));
-            $buttons .= ' ' . html_writer::link(new moodle_url('/cohort/assign.php', array('id'=>$cohort->id)), html_writer::empty_tag('img', array('src'=>$OUTPUT->pix_url('i/users'), 'alt'=>get_string('assign', 'core_cohort'), 'class'=>'iconsmall')));
-        } else {
-            $buttons = '';
+    $buttons = array();
+    if (empty($cohort->component)) {
+        if ($manager) {
+            $buttons[] = html_writer::link(new moodle_url('/cohort/edit.php', array('id'=>$cohort->id, 'delete'=>1)), html_writer::empty_tag('img', array('src'=>$OUTPUT->pix_url('t/delete'), 'alt'=>get_string('delete'), 'class'=>'iconsmall')));
+            $buttons[] =  html_writer::link(new moodle_url('/cohort/edit.php', array('id'=>$cohort->id)), html_writer::empty_tag('img', array('src'=>$OUTPUT->pix_url('t/edit'), 'alt'=>get_string('edit'), 'class'=>'iconsmall')));
+        }
+        if ($manager or $canassign) {
+            $buttons[] = html_writer::link(new moodle_url('/cohort/assign.php', array('id'=>$cohort->id)), html_writer::empty_tag('img', array('src'=>$OUTPUT->pix_url('i/users'), 'alt'=>get_string('assign', 'core_cohort'), 'class'=>'iconsmall')));
         }
-    } else {
-        $buttons = '';
     }
-    $line[] = $buttons;
+    $line[] = implode(' ', $buttons);
 
     $data[] = $line;
 }
index b487132..053d8bb 100644 (file)
@@ -77,9 +77,13 @@ if (!empty($course)) {
         }
     }
     $course->allowedmods = $allowedmods;
+    //add context for editor
+    $editoroptions['context'] = $coursecontext;
     $course = file_prepare_standard_editor($course, 'summary', $editoroptions, $coursecontext, 'course', 'summary', 0);
 
 } else {
+    //editor should respect category context if course context is not set.
+    $editoroptions['context'] = $catcontext;
     $course = file_prepare_standard_editor($course, 'summary', $editoroptions, null, 'course', 'summary', null);
 }
 
index 3cff561..ceffc63 100644 (file)
@@ -13,6 +13,8 @@ require_once('editcategory_form.php');
 require_login();
 
 $id = optional_param('id', 0, PARAM_INT);
+$itemid = 0; //initalise itemid, as all files in category description has item id 0
+
 if ($id) {
     if (!$category = $DB->get_record('course_categories', array('id' => $id))) {
         print_error('unknowcategory');
@@ -42,15 +44,21 @@ if ($id) {
     $category->parent = $parent;
     require_capability('moodle/category:manage', $context);
     $strtitle = get_string("addnewcategory");
-    $editorcontext = null;
+    $editorcontext = $context;
+    $itemid = null; //set this explicitly, so files for parent category should not get loaded in draft area.
     $title = "$SITE->shortname: ".get_string('addnewcategory');
     $fullname = $SITE->fullname;
 }
 
 $PAGE->set_pagelayout('admin');
 
-$editoroptions = array('maxfiles' => EDITOR_UNLIMITED_FILES, 'maxbytes'=>$CFG->maxbytes, 'trusttext'=>true);
-$category = file_prepare_standard_editor($category, 'description', $editoroptions, $editorcontext, 'coursecat', 'description', 0);
+$editoroptions = array(
+    'maxfiles'  => EDITOR_UNLIMITED_FILES,
+    'maxbytes'  => $CFG->maxbytes,
+    'trusttext' => true,
+    'context'   => $editorcontext
+);
+$category = file_prepare_standard_editor($category, 'description', $editoroptions, $editorcontext, 'coursecat', 'description', $itemid);
 
 $mform = new editcategory_form('editcategory.php', compact('category', 'editoroptions'));
 $mform->set_data($category);
index aa1004f..d4a5f4e 100644 (file)
@@ -128,7 +128,6 @@ if ($thissection->summary or $thissection->sequence or $PAGE->user_is_editing())
 /// Now all the normal modules by topic
 /// Everything below uses "section" terminology - each "section" is a topic.
 
-$timenow = time();
 $section = 1;
 $sectionmenu = array();
 
index d301cfe..1f4d9b7 100644 (file)
@@ -103,7 +103,13 @@ if (!$courseid) {
 // default return url
 $gpr = new grade_plugin_return();
 $returnurl = $gpr->get_return_url('index.php?id='.$courseid);
-$editoroptions = array('maxfiles'=>EDITOR_UNLIMITED_FILES, 'maxbytes'=>$CFG->maxbytes, 'trusttext'=>false, 'noclean'=>true);
+$editoroptions = array(
+    'maxfiles'  => EDITOR_UNLIMITED_FILES,
+    'maxbytes'  => $CFG->maxbytes,
+    'trusttext' => false,
+    'noclean'   => true,
+    'context'   => $systemcontext
+);
 
 if (!empty($outcome_rec->id)) {
     $outcome_rec = file_prepare_standard_editor($outcome_rec, 'description', $editoroptions, $systemcontext, 'grade', 'outcome', $outcome_rec->id);
index 5787ed1..f226139 100644 (file)
@@ -88,7 +88,13 @@ if (!$courseid) {
 // default return url
 $gpr = new grade_plugin_return();
 $returnurl = $gpr->get_return_url('index.php?id='.$courseid);
-$editoroptions = array('maxfiles'=>EDITOR_UNLIMITED_FILES, 'maxbytes'=>$CFG->maxbytes, 'trusttext'=>false, 'noclean'=>true);
+$editoroptions = array(
+    'maxfiles'  => EDITOR_UNLIMITED_FILES,
+    'maxbytes'  => $CFG->maxbytes,
+    'trusttext' => false,
+    'noclean'   => true,
+    'context'   => $systemcontext
+);
 
 if (!empty($scale_rec->id)) {
     $scale_rec = file_prepare_standard_editor($scale_rec, 'description', $editoroptions, $systemcontext, 'grade', 'scale', $scale_rec->id);
index 8681a83..04844b0 100644 (file)
@@ -481,7 +481,7 @@ if ($formdata = $mform->get_data()) {
         fclose($fp);
         unlink($filename);
     } else {
-        print_error('cannotreadfil');
+        print_error('cannotreadfile');
     }
 
 } else {
index 3ff618b..14b0665 100644 (file)
@@ -62,8 +62,20 @@ if (function_exists('date_default_timezone_set') and function_exists('date_defau
 if (version_compare(phpversion(), "5.2.0") < 0) {
     $phpversion = phpversion();
     // do NOT localise - lang strings would not work here and we CAN not move it after installib
-    echo "Sorry, Moodle 2.0 requires PHP 5.2.8 or later (currently using version $phpversion).<br />";
-    echo "Please upgrade your server software or install latest Moodle 1.9.x instead.";
+    echo "Moodle 2.1 or later requires at least PHP 5.3.2 (currently using version $phpversion).<br />";
+    echo "Please upgrade your server software or install older Moodle version.";
+    die;
+}
+
+// make sure iconv is available and actually works
+if (!function_exists('iconv')) {
+    // this should not happen, this must be very borked install
+    echo 'Moodle requires the iconv PHP extension. Please install or enable the iconv extension.';
+    die();
+}
+if (iconv('UTF-8', 'UTF-8//IGNORE', 'abc') !== 'abc') {
+    // known to be broken in mid-2011 MAMP installations
+    echo 'Broken iconv PHP extension detected, installation can not continue.';
     die;
 }
 
@@ -169,7 +181,7 @@ $memlimit = @ini_get('memory_limit');
 if (!empty($memlimit) and $memlimit != -1) {
     if (get_real_size($memlimit) < get_real_size($minrequiredmemory)) {
         // do NOT localise - lang strings would not work here and we CAN not move it to later place
-        echo "Sorry, Moodle 2.0 requires at least {$minrequiredmemory}B of PHP memory.<br />";
+        echo "Moodle requires at least {$minrequiredmemory}B of PHP memory.<br />";
         echo "Please contact server administrator to fix PHP.ini memory settings.";
         die;
     }
@@ -481,7 +493,7 @@ if ($config->stage == INSTALL_DATABASETYPE) {
 
 
 if ($config->stage == INSTALL_ENVIRONMENT or $config->stage == INSTALL_PATHS) {
-    $version_fail = (version_compare(phpversion(), "5.2.8") < 0);
+    $version_fail = (version_compare(phpversion(), "5.3.2") < 0);
     $curl_fail    = ($lang !== 'en' and !extension_loaded('curl')); // needed for lang pack download
     $zip_fail     = ($lang !== 'en' and !extension_loaded('zip'));  // needed for lang pack download
 
@@ -494,7 +506,7 @@ if ($config->stage == INSTALL_ENVIRONMENT or $config->stage == INSTALL_PATHS) {
 
         echo '<div id="envresult"><dl>';
         if ($version_fail) {
-            $a = (object)array('needed'=>'5.2.8', 'current'=>phpversion());
+            $a = (object)array('needed'=>'5.3.2', 'current'=>phpversion());
             echo '<dt>'.get_string('phpversion', 'install').'</dt><dd>'.get_string('environmentrequireversion', 'admin', $a).'</dd>';
         }
         if ($curl_fail) {
index ab06c92..a5526ce 100644 (file)
@@ -76,7 +76,7 @@ $string['downloadcore'] = 'Our main method of distribution is via these standard
 $string['downloadcoretitle'] = 'Standard Moodle packages';
 $string['downloadcvs'] = 'Another way to get the core source code is by using CVS to connect directly to one of our mirrors of the code repository used by Moodle developers.  This makes upgrading very easy, even if you have made local changes to the source code.';
 $string['downloadcvstitle'] = 'Moodle via CVS';
-$string['downloadintro'] = 'Moodle is open source under the <a href="http://docs.moodle.org/en/License">GPL licence</a>.  Everything we produce is available for you to download and use for free.';
+$string['downloadintro'] = 'Moodle is open source under the <a href="http://docs.moodle.org/dev/License">GPL licence</a>.  Everything we produce is available for you to download and use for free.';
 $string['downloadlang'] = 'In current versions of Moodle, adding support for new languages has been automated from the administration menu within your site.  However, for some older versions of Moodle, new language packs need to be downloaded manually.';
 $string['downloadlangtitle'] = 'Language packs';
 $string['downloadlogotitle'] = 'Moodle logos';
index 50f5ebc..07bb2e9 100644 (file)
@@ -735,7 +735,7 @@ but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the Moodle License information page for full details:
-http://docs.moodle.org/en/License';
+http://docs.moodle.org/dev/License';
 $string['gpllicense'] = 'GPL license';
 $string['gpl3'] = 'Copyright (C) 1999 onwards Martin Dougiamas (http://moodle.com)
 
@@ -749,7 +749,7 @@ but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the Moodle License information page for full details:
-http://docs.moodle.org/en/License';
+http://docs.moodle.org/dev/License';
 $string['grade'] = 'Grade';
 $string['grades'] = 'Grades';
 $string['group'] = 'Group';
index 7a3e794..7b73533 100644 (file)
@@ -54,6 +54,7 @@ $string['cannotloadquestion'] = 'Could not load question';
 $string['cannotmovequestion'] = 'You can\'t use this script to move questions that have files associated with them from different areas.';
 $string['cannotopenforwriting'] = 'Cannot open for writing: {$a}';
 $string['cannotpreview'] = 'You can\'t preview these questions!';
+$string['cannotread'] = 'Cannot read import file (or file is empty)';
 $string['cannotretrieveqcat'] = 'Could not retrieve question category';
 $string['cannotunhidequestion'] = 'Failed to unhide the question.';
 $string['cannotunzip'] = 'Could not unzip file.';
index d8a1987..86fd35d 100644 (file)
@@ -1007,29 +1007,10 @@ class block_manager {
         $controls = array();
         $actionurl = $this->page->url->out(false, array('sesskey'=> sesskey()));
 
-        // Assign roles icon.
-        if (has_capability('moodle/role:assign', $block->context)) {
-            //TODO: please note it is sloppy to pass urls through page parameters!!
-            //      it is shortened because some web servers (e.g. IIS by default) give
-            //      a 'security' error if you try to pass a full URL as a GET parameter in another URL.
-
-            $return = $this->page->url->out(false);
-            $return = str_replace($CFG->wwwroot . '/', '', $return);
-
-            $controls[] = array('url' => $CFG->wwwroot . '/' . $CFG->admin .
-                    '/roles/assign.php?contextid=' . $block->context->id . '&returnurl=' . urlencode($return),
-                    'icon' => 'i/roles', 'caption' => get_string('assignroles', 'role'));
-        }
-
-        if ($this->page->user_can_edit_blocks() && $block->instance_can_be_hidden()) {
-            // Show/hide icon.
-            if ($block->instance->visible) {
-                $controls[] = array('url' => $actionurl . '&bui_hideid=' . $block->instance->id,
-                        'icon' => 't/hide', 'caption' => get_string('hide'));
-            } else {
-                $controls[] = array('url' => $actionurl . '&bui_showid=' . $block->instance->id,
-                        'icon' => 't/show', 'caption' => get_string('show'));
-            }
+        if ($this->page->user_can_edit_blocks()) {
+            // Move icon.
+            $controls[] = array('url' => $actionurl . '&bui_moveid=' . $block->instance->id,
+                    'icon' => 't/move', 'caption' => get_string('move'));
         }
 
         if ($this->page->user_can_edit_blocks() || $block->user_can_edit()) {
@@ -1048,10 +1029,28 @@ class block_manager {
             }
         }
 
-        if ($this->page->user_can_edit_blocks()) {
-            // Move icon.
-            $controls[] = array('url' => $actionurl . '&bui_moveid=' . $block->instance->id,
-                    'icon' => 't/move', 'caption' => get_string('move'));
+        if ($this->page->user_can_edit_blocks() && $block->instance_can_be_hidden()) {
+            // Show/hide icon.
+            if ($block->instance->visible) {
+                $controls[] = array('url' => $actionurl . '&bui_hideid=' . $block->instance->id,
+                        'icon' => 't/hide', 'caption' => get_string('hide'));
+            } else {
+                $controls[] = array('url' => $actionurl . '&bui_showid=' . $block->instance->id,
+                        'icon' => 't/show', 'caption' => get_string('show'));
+            }
+        }
+
+        // Assign roles icon.
+        if (has_capability('moodle/role:assign', $block->context)) {
+            //TODO: please note it is sloppy to pass urls through page parameters!!
+            //      it is shortened because some web servers (e.g. IIS by default) give
+            //      a 'security' error if you try to pass a full URL as a GET parameter in another URL.
+            $return = $this->page->url->out(false);
+            $return = str_replace($CFG->wwwroot . '/', '', $return);
+
+            $controls[] = array('url' => $CFG->wwwroot . '/' . $CFG->admin .
+                    '/roles/assign.php?contextid=' . $block->context->id . '&returnurl=' . urlencode($return),
+                    'icon' => 'i/roles', 'caption' => get_string('assignroles', 'role'));
         }
 
         return $controls;
index 8aa1f84..478156c 100644 (file)
@@ -847,7 +847,7 @@ function get_categories($parent='none', $sort=NULL, $shallow=true) {
                   FROM {course_categories} cc
                $ccjoin
                   JOIN {course_categories} ccp
-                       ON (cc.path LIKE ".$DB->sql_concat('ccp.path',"'%'").")
+                       ON ((cc.parent = ccp.id) OR (cc.path LIKE ".$DB->sql_concat('ccp.path',"'/%'")."))
                  WHERE ccp.id=?
                 $sort";
         $params = array($parent);
index 1935084..b80caa2 100644 (file)
@@ -2121,7 +2121,7 @@ WHERE gradeitemid IS NOT NULL AND grademax IS NOT NULL");
                 $instanceids[] = $blockinstance->id;
                 // If we have more than 1000 block instances now remove all block positions
                 // and empty the array
-                if (count($contextids) > 1000) {
+                if (count($instanceids) > 1000) {
                     $instanceidstring = join(',',$instanceids);
                     $DB->delete_records_select('block_positions', 'blockinstanceid IN ('.$instanceidstring.')');
                     $instanceids = array();
@@ -2131,8 +2131,10 @@ WHERE gradeitemid IS NOT NULL AND grademax IS NOT NULL");
 
         upgrade_cleanup_unwanted_block_contexts($contextids);
 
-        $instanceidstring = join(',',$instanceids);
-        $DB->delete_records_select('block_positions', 'blockinstanceid IN ('.$instanceidstring.')');
+        if ($instanceids) {
+            $instanceidstring = join(',',$instanceids);
+            $DB->delete_records_select('block_positions', 'blockinstanceid IN ('.$instanceidstring.')');
+        }
 
         unset($allblockinstances);
         unset($contextids);
index 83885c3..db88a9e 100644 (file)
@@ -502,19 +502,24 @@ abstract class moodle_database {
         $where = array();
         $params = array();
 
-        $columns = $this->get_columns($table);
-        foreach ($conditions as $key=>$value) {
-            if (!isset($columns[$key])) {
-                $a = new stdClass();
-                $a->fieldname = $key;
-                $a->tablename = $table;
-                throw new dml_exception('ddlfieldnotexist', $a);
-            }
-            $column = $columns[$key];
-            if ($column->meta_type == 'X') {
-                //ok so the column is a text column. sorry no text columns in the where clause conditions
-                throw new dml_exception('textconditionsnotallowed', $conditions);
+        if (debugging()) {
+            $columns = $this->get_columns($table);
+            foreach ($conditions as $key=>$value) {
+                if (!isset($columns[$key])) {
+                    $a = new stdClass();
+                    $a->fieldname = $key;
+                    $a->tablename = $table;
+                    throw new dml_exception('ddlfieldnotexist', $a);
+                }
+                $column = $columns[$key];
+                if ($column->meta_type == 'X') {
+                    //ok so the column is a text column. sorry no text columns in the where clause conditions
+                    throw new dml_exception('textconditionsnotallowed', $conditions);
+                }
             }
+        }
+
+        foreach ($conditions as $key=>$value) {
             if (is_int($key)) {
                 throw new dml_exception('invalidnumkey');
             }
index 4f82eda..9fa697f 100644 (file)
@@ -277,12 +277,12 @@ class pgsql_native_moodle_database extends moodle_database {
             return $this->tables;
         }
         $this->tables = array();
-        $prefix = str_replace('_', '\\\\_', $this->prefix);
+        $prefix = str_replace('_', '|_', $this->prefix);
         // Get them from information_schema instead of catalog as far as
         // we want to get only own session temp objects (catalog returns all)
         $sql = "SELECT table_name
                   FROM information_schema.tables
-                 WHERE table_name LIKE '$prefix%'
+                 WHERE table_name LIKE '$prefix%' ESCAPE '|'
                    AND table_type IN ('BASE TABLE', 'LOCAL TEMPORARY')";
         $this->query_start($sql, null, SQL_QUERY_AUX);
         $result = pg_query($this->pgsql, $sql);
index df8b0c4..14f5283 100644 (file)
@@ -53,10 +53,20 @@ class file_info_context_course extends file_info {
      * @param $filename
      */
     public function get_file_info($component, $filearea, $itemid, $filepath, $filename) {
+        // try to emulate require_login() tests here
+        if (!isloggedin()) {
+            return null;
+        }
+
         if (!$this->course->visible and !has_capability('moodle/course:viewhiddencourses', $this->context)) {
             return null;
         }
 
+        if (!is_viewing($this->context) and !is_enrolled($this->context)) {
+            // no peaking here if not enrolled or inspector
+            return null;
+        }
+
         if (empty($component)) {
             return $this;
         }
index e72e315..a8149c6 100644 (file)
@@ -75,11 +75,28 @@ class file_info_context_module extends file_info {
      * @param $filename
      */
     public function get_file_info($component, $filearea, $itemid, $filepath, $filename) {
-        if (!is_enrolled($this->context) and !is_viewing($this->context)) {
+        // try to emulate require_login() tests here
+        if (!isloggedin()) {
+            return null;
+        }
+
+        $coursecontext = get_course_context($this->context);
+        if (!$this->course->visible and !has_capability('moodle/course:viewhiddencourses', $coursecontext)) {
+            return null;
+        }
+
+        if (!is_viewing($this->context) and !is_enrolled($this->context)) {
             // no peaking here if not enrolled or inspector
             return null;
         }
 
+        $modinfo = get_fast_modinfo($this->course);
+        $cminfo = $modinfo->get_cm($this->cm->id);
+        if (!$cminfo->uservisible) {
+            // activity hidden sorry
+            return null;
+        }
+
         if (empty($component)) {
             return $this;
         }
index 7d8830b..5cc33d0 100644 (file)
@@ -111,6 +111,20 @@ function file_prepare_standard_editor($data, $field, array $options, $context=nu
         $options['noclean'] = false;
     }
 
+    //sanity check for passed context. This function doesn't expect $option['context'] to be set
+    //But this function is called before creating editor hence, this is one of the best places to check
+    //if context is used properly. This check notify developer that they missed passing context to editor.
+    if (isset($context) && !isset($options['context'])) {
+        //if $context is not null then make sure $option['context'] is also set.
+        debugging('Context for editor is not set in editoroptions. Hence editor will not respect editor filters', DEBUG_DEVELOPER);
+    } else if (isset($options['context']) && isset($context)) {
+        //If both are passed then they should be equal.
+        if ($options['context']->id != $context->id) {
+            $exceptionmsg = 'Editor context ['.$options['context']->id.'] is not equal to passed context ['.$context->id.']';
+            throw new coding_exception($exceptionmsg);
+        }
+    }
+
     if (is_null($itemid) or is_null($context)) {
         $contextid = null;
         $itemid = null;
index 1787b0f..e866188 100644 (file)
@@ -1576,6 +1576,10 @@ class MoodleQuickForm extends HTML_QuickForm_DHTMLRulesTableless {
             }
         }
 
+        if (is_array($this->_constantValues)) {
+            $unfiltered = HTML_QuickForm::arrayMerge($unfiltered, $this->_constantValues);
+        }
+
         return $unfiltered;
     }
     /**
@@ -1731,6 +1735,12 @@ var skipClientValidation = false;
 
 function qf_errorHandler(element, _qfMsg) {
   div = element.parentNode;
+
+  if ((div == undefined) || (element.name == undefined)) {
+    //no checking can be done for undefined elements so let server handle it.
+    return true;
+  }
+
   if (_qfMsg != \'\') {
     var errorSpan = document.getElementById(\'id_error_\'+element.name);
     if (!errorSpan) {
@@ -1780,16 +1790,25 @@ function qf_errorHandler(element, _qfMsg) {
                 $elementName);
             $js .= '
 function validate_' . $this->_formName . '_' . $escapedElementName . '(element) {
+  if (undefined == element) {
+     //required element was not found, then let form be submitted without client side validation
+     return true;
+  }
   var value = \'\';
   var errFlag = new Array();
   var _qfGroups = {};
   var _qfMsg = \'\';
   var frm = element.parentNode;
-  while (frm && frm.nodeName.toUpperCase() != "FORM") {
-    frm = frm.parentNode;
+  if ((undefined != element.name) && (frm != undefined)) {
+      while (frm && frm.nodeName.toUpperCase() != "FORM") {
+        frm = frm.parentNode;
+      }
+    ' . join("\n", $jsArr) . '
+      return qf_errorHandler(element, _qfMsg);
+  } else {
+    //element name should be defined else error msg will not be displayed.
+    return true;
   }
-' . join("\n", $jsArr) . '
-  return qf_errorHandler(element, _qfMsg);
 }
 ';
             $validateJS .= '
index 120de12..708d242 100644 (file)
@@ -717,7 +717,7 @@ function groups_course_module_visible($cm, $userid=null) {
  * @return void
  */
 function _group_verify_activegroup($courseid, $groupmode, $groupingid, array $allowedgroups) {
-    global $SESSION;
+    global $SESSION, $USER;
 
     // init activegroup array if necessary
     if (!isset($SESSION->activegroup)) {
@@ -742,7 +742,11 @@ function _group_verify_activegroup($courseid, $groupmode, $groupingid, array $al
             $SESSION->activegroup[$courseid][$groupmode][$groupingid] = 0; // all groups by default if user has accessallgroups
 
         } else if ($allowedgroups) {
-            $firstgroup = reset($allowedgroups);
+            if ($groupmode != SEPARATEGROUPS and $mygroups = groups_get_all_groups($courseid, $USER->id, $groupingid)) {
+                $firstgroup = reset($mygroups);
+            } else {
+                $firstgroup = reset($allowedgroups);
+            }
             $SESSION->activegroup[$courseid][$groupmode][$groupingid] = $firstgroup->id;
 
         } else {
index 2d6476a..536c141 100644 (file)
@@ -361,21 +361,29 @@ M.util.init_select_autosubmit = function(Y, formid, selectid, nothing) {
             // Make sure we have the form
             if (form) {
                 // Create a function to handle our change event
-                var processchange = function(e, lastindex) {
-                    if ((nothing===false || select.get('value') != nothing) && lastindex != select.get('selectedIndex')) {
+                var processchange = function(e, paramobject) {
+                    if ((nothing===false || select.get('value') != nothing) && paramobject.lastindex != select.get('selectedIndex')) {
+                        //prevent event bubbling and detach handlers to prevent multiple submissions caused by double clicking
+                        e.halt();
+                        paramobject.eventkeypress.detach();
+                        paramobject.eventblur.detach();
+                        paramobject.eventchangeorblur.detach();
+
                         this.submit();
                     }
                 };
                 // Attach the change event to the keypress, blur, and click actions.
                 // We don't use the change event because IE fires it on every arrow up/down
                 // event.... usability
-                Y.on('key', processchange, select, 'press:13', form, select.get('selectedIndex'));
-                select.on('blur', processchange, form, select.get('selectedIndex'));
+                var paramobject = new Object();
+                paramobject.lastindex = select.get('selectedIndex');
+                paramobject.eventkeypress = Y.on('key', processchange, select, 'press:13', form, paramobject);
+                paramobject.eventblur = select.on('blur', processchange, form, paramobject);
                 //little hack for chrome that need onChange event instead of onClick - see MDL-23224
                 if (Y.UA.webkit) {
-                    select.on('change', processchange, form, select.get('selectedIndex'));
+                    paramobject.eventchangeorblur = select.on('change', processchange, form, paramobject);
                 } else {
-                    select.on('click', processchange, form, select.get('selectedIndex'));
+                    paramobject.eventchangeorblur = select.on('click', processchange, form, paramobject);
                 }
             }
         }
index 6cf7236..e797bf6 100644 (file)
@@ -3509,6 +3509,9 @@ function delete_user($user) {
     // last course access not necessary either
     $DB->delete_records('user_lastaccess', array('userid'=>$user->id));
 
+    // force logout - may fail if file based sessions used, sorry
+    session_kill_user($user->id);
+
     // now do a final accesslib cleanup - removes all role assignments in user context and context itself
     delete_context(CONTEXT_USER, $user->id);
 
index be7eba7..b832df4 100644 (file)
@@ -2427,8 +2427,10 @@ EOD;
         // Increment the menu count. This is used for ID's that get worked with
         // in JavaScript as is essential
         $menucount++;
-        // Initialise this custom menu
-        $this->page->requires->js_init_call('M.core_custom_menu.init', array('custom_menu_'.$menucount));
+        // Initialise this custom menu (the custom menu object is contained in javascript-static
+        $jscode = js_writer::function_call_with_Y('M.core_custom_menu.init', array('custom_menu_'.$menucount));
+        $jscode = "(function(){{$jscode}})";
+        $this->page->requires->yui_module('node-menunav', $jscode);
         // Build the root nodes as required by YUI
         $content = html_writer::start_tag('div', array('id'=>'custom_menu_'.$menucount, 'class'=>'yui3-menu yui3-menu-horizontal javascript-disabled'));
         $content .= html_writer::start_tag('div', array('class'=>'yui3-menu-content'));
index becd7d7..53f0315 100644 (file)
@@ -279,11 +279,40 @@ abstract class session_stub implements moodle_session {
         if (!isset($CFG->sessioncookie)) {
             $CFG->sessioncookie = '';
         }
+
+        // make sure cookie domain makes sense for this wwwroot
         if (!isset($CFG->sessioncookiedomain)) {
             $CFG->sessioncookiedomain = '';
+        } else if ($CFG->sessioncookiedomain !== '') {
+            $host = parse_url($CFG->wwwroot, PHP_URL_HOST);
+            if ($CFG->sessioncookiedomain !== $host) {
+                if (substr($CFG->sessioncookiedomain, 0, 1) === '.') {
+                    if (!preg_match('|^.*'.preg_quote($CFG->sessioncookiedomain, '|').'$|', $host)) {
+                        // invalid domain - it must be end part of host
+                        $CFG->sessioncookiedomain = '';
+                    }
+                } else {
+                    if (!preg_match('|^.*\.'.preg_quote($CFG->sessioncookiedomain, '|').'$|', $host)) {
+                        // invalid domain - it must be end part of host
+                        $CFG->sessioncookiedomain = '';
+                    }
+                }
+            }
         }
+
+        // make sure the cookiepath is valid for this wwwroot or autodetect if not specified
         if (!isset($CFG->sessioncookiepath)) {
-            $CFG->sessioncookiepath = '/';
+            $CFG->sessioncookiepath = '';
+        }
+        if ($CFG->sessioncookiepath !== '/') {
+            $path = parse_url($CFG->wwwroot, PHP_URL_PATH).'/';
+            if ($CFG->sessioncookiepath === '') {
+                $CFG->sessioncookiepath = $path;
+            } else {
+                if (strpos($path, $CFG->sessioncookiepath) !== 0 or substr($CFG->sessioncookiepath, -1) !== '/') {
+                    $CFG->sessioncookiepath = $path;
+                }
+            }
         }
 
         //discard session ID from POST, GET and globals to tighten security,
index e02e7e5..9100c19 100644 (file)
@@ -38,7 +38,6 @@ if (!defined('MOODLE_INTERNAL')) {
 require_once("$CFG->libdir/portfoliolib.php");
 require_once("$CFG->libdir/portfolio/exporter.php");
 require_once("$CFG->libdir/portfolio/plugin.php");
-require_once("$CFG->dirroot/$CFG->admin/generator.php");
 
 class portfolio_plugin_test extends portfolio_plugin_push_base {
     public function expected_time($callertime){
index d4a44d1..4a23924 100644 (file)
@@ -36,7 +36,6 @@ if (!defined('MOODLE_INTERNAL')) {
 }
 
 require_once("$CFG->dirroot/repository/lib.php");
-require_once("$CFG->dirroot/$CFG->admin/generator.php");
 
 // Generate a mock class for each plugin subclass present
 $repository_plugins = get_list_of_plugins('repository');
index 0a4482f..01df2c7 100644 (file)
@@ -1049,1137 +1049,1153 @@ id,name,year,tzrule,gmtoff,dstoff,dst_month,dst_startday,dst_weekday,dst_skipwee
 1048,Europe/Kaliningrad,1992,Russia,120,60,3,-1,6,0,25:00,9,-1,6,0,24:00
 1049,Europe/Kaliningrad,1993,Russia,120,60,3,-1,0,0,04:00,9,-1,0,0,04:00
 1050,Europe/Kaliningrad,1996,Russia,120,60,3,-1,0,0,04:00,10,-1,0,0,04:00
-1051,Europe/Moscow,1970,Russia,180,60,9,1,-1,0,03:00,10,1,-1,0,02:00
-1052,Europe/Moscow,1981,Russia,180,60,4,1,-1,0,03:00,10,1,-1,0,02:00
-1053,Europe/Moscow,1984,Russia,180,60,4,1,-1,0,03:00,9,-1,0,0,05:00
-1054,Europe/Moscow,1985,Russia,180,60,3,-1,0,0,05:00,9,-1,0,0,05:00
-1055,Europe/Moscow,1991,Russia,120,60,3,-1,0,0,04:00,9,-1,0,0,04:00
-1056,Europe/Moscow,1992,Russia,180,60,3,-1,6,0,26:00,9,-1,6,0,25:00
-1057,Europe/Moscow,1993,Russia,180,60,3,-1,0,0,05:00,9,-1,0,0,05:00
-1058,Europe/Moscow,1996,Russia,180,60,3,-1,0,0,05:00,10,-1,0,0,05:00
-1059,Europe/Volgograd,1970,Russia,240,60,9,1,-1,0,04:00,10,1,-1,0,03:00
-1060,Europe/Volgograd,1981,Russia,240,60,4,1,-1,0,04:00,10,1,-1,0,03:00
-1061,Europe/Volgograd,1984,Russia,240,60,4,1,-1,0,04:00,9,-1,0,0,06:00
-1062,Europe/Volgograd,1985,Russia,240,60,3,-1,0,0,06:00,9,-1,0,0,06:00
-1063,Europe/Volgograd,1989,Russia,180,60,3,-1,0,0,05:00,9,-1,0,0,05:00
-1064,Europe/Volgograd,1991,,240,0,0,0,0,0,00:00,0,0,0,0,00:00
-1065,Europe/Volgograd,1992,Russia,180,60,3,-1,6,0,26:00,9,-1,6,0,25:00
-1066,Europe/Volgograd,1993,Russia,180,60,3,-1,0,0,05:00,9,-1,0,0,05:00
-1067,Europe/Volgograd,1996,Russia,180,60,3,-1,0,0,05:00,10,-1,0,0,05:00
-1068,Europe/Samara,1970,Russia,240,60,9,1,-1,0,04:00,10,1,-1,0,03:00
-1069,Europe/Samara,1981,Russia,240,60,4,1,-1,0,04:00,10,1,-1,0,03:00
-1070,Europe/Samara,1984,Russia,240,60,4,1,-1,0,04:00,9,-1,0,0,06:00
-1071,Europe/Samara,1985,Russia,240,60,3,-1,0,0,06:00,9,-1,0,0,06:00
-1072,Europe/Samara,1989,Russia,180,60,3,-1,0,0,05:00,9,-1,0,0,05:00
-1073,Europe/Samara,1991,Russia,240,60,3,-1,0,0,06:00,9,-1,0,0,06:00
-1074,Europe/Samara,1992,Russia,240,60,3,-1,6,0,27:00,9,-1,6,0,26:00
-1075,Europe/Samara,1993,Russia,240,60,3,-1,0,0,06:00,9,-1,0,0,06:00
-1076,Europe/Samara,1996,Russia,240,60,3,-1,0,0,06:00,10,-1,0,0,06:00
-1077,Europe/Samara,2010,Russia,180,60,3,-1,0,0,05:00,10,-1,0,0,05:00
-1078,Asia/Yekaterinburg,1970,Russia,300,60,9,1,-1,0,05:00,10,1,-1,0,04:00
-1079,Asia/Yekaterinburg,1981,Russia,300,60,4,1,-1,0,05:00,10,1,-1,0,04:00
-1080,Asia/Yekaterinburg,1984,Russia,300,60,4,1,-1,0,05:00,9,-1,0,0,07:00
-1081,Asia/Yekaterinburg,1985,Russia,300,60,3,-1,0,0,07:00,9,-1,0,0,07:00
-1082,Asia/Yekaterinburg,1991,Russia,240,60,3,-1,0,0,06:00,9,-1,0,0,06:00
-1083,Asia/Yekaterinburg,1992,Russia,300,60,3,-1,6,0,28:00,9,-1,6,0,27:00
-1084,Asia/Yekaterinburg,1993,Russia,300,60,3,-1,0,0,07:00,9,-1,0,0,07:00
-1085,Asia/Yekaterinburg,1996,Russia,300,60,3,-1,0,0,07:00,10,-1,0,0,07:00
-1086,Asia/Omsk,1970,Russia,360,60,9,1,-1,0,06:00,10,1,-1,0,05:00
-1087,Asia/Omsk,1981,Russia,360,60,4,1,-1,0,06:00,10,1,-1,0,05:00
-1088,Asia/Omsk,1984,Russia,360,60,4,1,-1,0,06:00,9,-1,0,0,08:00
-1089,Asia/Omsk,1985,Russia,360,60,3,-1,0,0,08:00,9,-1,0,0,08:00
-1090,Asia/Omsk,1991,Russia,300,60,3,-1,0,0,07:00,9,-1,0,0,07:00
-1091,Asia/Omsk,1992,Russia,360,60,3,-1,6,0,29:00,9,-1,6,0,28:00
-1092,Asia/Omsk,1993,Russia,360,60,3,-1,0,0,08:00,9,-1,0,0,08:00
-1093,Asia/Omsk,1996,Russia,360,60,3,-1,0,0,08:00,10,-1,0,0,08:00
-1094,Asia/Novosibirsk,1970,Russia,420,60,9,1,-1,0,07:00,10,1,-1,0,06:00
-1095,Asia/Novosibirsk,1981,Russia,420,60,4,1,-1,0,07:00,10,1,-1,0,06:00
-1096,Asia/Novosibirsk,1984,Russia,420,60,4,1,-1,0,07:00,9,-1,0,0,09:00
-1097,Asia/Novosibirsk,1985,Russia,420,60,3,-1,0,0,09:00,9,-1,0,0,09:00
-1098,Asia/Novosibirsk,1991,Russia,360,60,3,-1,0,0,08:00,9,-1,0,0,08:00
-1099,Asia/Novosibirsk,1992,Russia,420,60,3,-1,6,0,30:00,9,-1,6,0,29:00
-1100,Asia/Novosibirsk,1993,Russia,360,60,3,-1,0,0,08:00,9,-1,0,0,08:00
-1101,Asia/Novosibirsk,1996,Russia,360,60,3,-1,0,0,08:00,10,-1,0,0,08:00
-1102,Asia/Novokuznetsk,1970,Russia,420,60,9,1,-1,0,07:00,10,1,-1,0,06:00
-1103,Asia/Novokuznetsk,1981,Russia,420,60,4,1,-1,0,07:00,10,1,-1,0,06:00
-1104,Asia/Novokuznetsk,1984,Russia,420,60,4,1,-1,0,07:00,9,-1,0,0,09:00
-1105,Asia/Novokuznetsk,1985,Russia,420,60,3,-1,0,0,09:00,9,-1,0,0,09:00
-1106,Asia/Novokuznetsk,1991,Russia,360,60,3,-1,0,0,08:00,9,-1,0,0,08:00
-1107,Asia/Novokuznetsk,1992,Russia,420,60,3,-1,6,0,30:00,9,-1,6,0,29:00
-1108,Asia/Novokuznetsk,1993,Russia,420,60,3,-1,0,0,09:00,9,-1,0,0,09:00
-1109,Asia/Novokuznetsk,1996,Russia,420,60,3,-1,0,0,09:00,10,-1,0,0,09:00
-1110,Asia/Novokuznetsk,2010,Russia,360,60,3,-1,0,0,08:00,10,-1,0,0,08:00
-1111,Asia/Krasnoyarsk,1970,Russia,420,60,9,1,-1,0,07:00,10,1,-1,0,06:00
-1112,Asia/Krasnoyarsk,1981,Russia,420,60,4,1,-1,0,07:00,10,1,-1,0,06:00
-1113,Asia/Krasnoyarsk,1984,Russia,420,60,4,1,-1,0,07:00,9,-1,0,0,09:00
-1114,Asia/Krasnoyarsk,1985,Russia,420,60,3,-1,0,0,09:00,9,-1,0,0,09:00
-1115,Asia/Krasnoyarsk,1991,Russia,360,60,3,-1,0,0,08:00,9,-1,0,0,08:00
-1116,Asia/Krasnoyarsk,1992,Russia,420,60,3,-1,6,0,30:00,9,-1,6,0,29:00
-1117,Asia/Krasnoyarsk,1993,Russia,420,60,3,-1,0,0,09:00,9,-1,0,0,09:00
-1118,Asia/Krasnoyarsk,1996,Russia,420,60,3,-1,0,0,09:00,10,-1,0,0,09:00
-1119,Asia/Irkutsk,1970,Russia,480,60,9,1,-1,0,08:00,10,1,-1,0,07:00
-1120,Asia/Irkutsk,1981,Russia,480,60,4,1,-1,0,08:00,10,1,-1,0,07:00
-1121,Asia/Irkutsk,1984,Russia,480,60,4,1,-1,0,08:00,9,-1,0,0,10:00
-1122,Asia/Irkutsk,1985,Russia,480,60,3,-1,0,0,10:00,9,-1,0,0,10:00
-1123,Asia/Irkutsk,1991,Russia,420,60,3,-1,0,0,09:00,9,-1,0,0,09:00
-1124,Asia/Irkutsk,1992,Russia,480,60,3,-1,6,0,31:00,9,-1,6,0,30:00
-1125,Asia/Irkutsk,1993,Russia,480,60,3,-1,0,0,10:00,9,-1,0,0,10:00
-1126,Asia/Irkutsk,1996,Russia,480,60,3,-1,0,0,10:00,10,-1,0,0,10:00
-1127,Asia/Yakutsk,1970,Russia,540,60,9,1,-1,0,09:00,10,1,-1,0,08:00
-1128,Asia/Yakutsk,1981,Russia,540,60,4,1,-1,0,09:00,10,1,-1,0,08:00
-1129,Asia/Yakutsk,1984,Russia,540,60,4,1,-1,0,09:00,9,-1,0,0,11:00
-1130,Asia/Yakutsk,1985,Russia,540,60,3,-1,0,0,11:00,9,-1,0,0,11:00
-1131,Asia/Yakutsk,1991,Russia,480,60,3,-1,0,0,10:00,9,-1,0,0,10:00
-1132,Asia/Yakutsk,1992,Russia,540,60,3,-1,6,0,32:00,9,-1,6,0,31:00
-1133,Asia/Yakutsk,1993,Russia,540,60,3,-1,0,0,11:00,9,-1,0,0,11:00
-1134,Asia/Yakutsk,1996,Russia,540,60,3,-1,0,0,11:00,10,-1,0,0,11:00
-1135,Asia/Vladivostok,1970,Russia,600,60,9,1,-1,0,10:00,10,1,-1,0,09:00
-1136,Asia/Vladivostok,1981,Russia,600,60,4,1,-1,0,10:00,10,1,-1,0,09:00
-1137,Asia/Vladivostok,1984,Russia,600,60,4,1,-1,0,10:00,9,-1,0,0,12:00
-1138,Asia/Vladivostok,1985,Russia,600,60,3,-1,0,0,12:00,9,-1,0,0,12:00
-1139,Asia/Vladivostok,1991,Russia,540,60,3,-1,0,0,11:00,9,-1,0,0,11:00
-1140,Asia/Vladivostok,1992,Russia,600,60,3,-1,6,0,33:00,9,-1,6,0,32:00
-1141,Asia/Vladivostok,1993,Russia,600,60,3,-1,0,0,12:00,9,-1,0,0,12:00
-1142,Asia/Vladivostok,1996,Russia,600,60,3,-1,0,0,12:00,10,-1,0,0,12:00
-1143,Asia/Sakhalin,1970,Russia,660,60,9,1,-1,0,11:00,10,1,-1,0,10:00
-1144,Asia/Sakhalin,1981,Russia,660,60,4,1,-1,0,11:00,10,1,-1,0,10:00
-1145,Asia/Sakhalin,1984,Russia,660,60,4,1,-1,0,11:00,9,-1,0,0,13:00
-1146,Asia/Sakhalin,1985,Russia,660,60,3,-1,0,0,13:00,9,-1,0,0,13:00
-1147,Asia/Sakhalin,1991,Russia,600,60,3,-1,0,0,12:00,9,-1,0,0,12:00
-1148,Asia/Sakhalin,1992,Russia,660,60,3,-1,6,0,34:00,9,-1,6,0,33:00
-1149,Asia/Sakhalin,1993,Russia,660,60,3,-1,0,0,13:00,9,-1,0,0,13:00
-1150,Asia/Sakhalin,1996,Russia,660,60,3,-1,0,0,13:00,10,-1,0,0,13:00
-1151,Asia/Sakhalin,1997,Russia,600,60,3,-1,0,0,12:00,10,-1,0,0,12:00
-1152,Asia/Magadan,1970,Russia,660,60,9,1,-1,0,11:00,10,1,-1,0,10:00
-1153,Asia/Magadan,1981,Russia,660,60,4,1,-1,0,11:00,10,1,-1,0,10:00
-1154,Asia/Magadan,1984,Russia,660,60,4,1,-1,0,11:00,9,-1,0,0,13:00
-1155,Asia/Magadan,1985,Russia,660,60,3,-1,0,0,13:00,9,-1,0,0,13:00
-1156,Asia/Magadan,1991,Russia,600,60,3,-1,0,0,12:00,9,-1,0,0,12:00
-1157,Asia/Magadan,1992,Russia,660,60,3,-1,6,0,34:00,9,-1,6,0,33:00
-1158,Asia/Magadan,1993,Russia,660,60,3,-1,0,0,13:00,9,-1,0,0,13:00
-1159,Asia/Magadan,1996,Russia,660,60,3,-1,0,0,13:00,10,-1,0,0,13:00
-1160,Asia/Kamchatka,1970,Russia,720,60,9,1,-1,0,12:00,10,1,-1,0,11:00
-1161,Asia/Kamchatka,1981,Russia,720,60,4,1,-1,0,12:00,10,1,-1,0,11:00
-1162,Asia/Kamchatka,1984,Russia,720,60,4,1,-1,0,12:00,9,-1,0,0,14:00
-1163,Asia/Kamchatka,1985,Russia,720,60,3,-1,0,0,14:00,9,-1,0,0,14:00
-1164,Asia/Kamchatka,1991,Russia,660,60,3,-1,0,0,13:00,9,-1,0,0,13:00
-1165,Asia/Kamchatka,1992,Russia,720,60,3,-1,6,0,35:00,9,-1,6,0,34:00
-1166,Asia/Kamchatka,1993,Russia,720,60,3,-1,0,0,14:00,9,-1,0,0,14:00
-1167,Asia/Kamchatka,1996,Russia,720,60,3,-1,0,0,14:00,10,-1,0,0,14:00
-1168,Asia/Kamchatka,2010,Russia,660,60,3,-1,0,0,13:00,10,-1,0,0,13:00
-1169,Asia/Anadyr,1970,Russia,780,60,9,1,-1,0,13:00,10,1,-1,0,12:00
-1170,Asia/Anadyr,1981,Russia,780,60,4,1,-1,0,13:00,10,1,-1,0,12:00
-1171,Asia/Anadyr,1982,Russia,720,60,4,1,-1,0,12:00,10,1,-1,0,11:00
-1172,Asia/Anadyr,1984,Russia,720,60,4,1,-1,0,12:00,9,-1,0,0,14:00
-1173,Asia/Anadyr,1985,Russia,720,60,3,-1,0,0,14:00,9,-1,0,0,14:00
-1174,Asia/Anadyr,1991,Russia,660,60,3,-1,0,0,13:00,9,-1,0,0,13:00
-1175,Asia/Anadyr,1992,Russia,720,60,3,-1,6,0,35:00,9,-1,6,0,34:00
-1176,Asia/Anadyr,1993,Russia,720,60,3,-1,0,0,14:00,9,-1,0,0,14:00
-1177,Asia/Anadyr,1996,Russia,720,60,3,-1,0,0,14:00,10,-1,0,0,14:00
-1178,Asia/Anadyr,2010,Russia,660,60,3,-1,0,0,13:00,10,-1,0,0,13:00
-1179,Europe/Belgrade,1970,,60,0,0,0,0,0,00:00,0,0,0,0,00:00
-1180,Europe/Belgrade,1982,EU,60,60,3,-1,0,0,1:00,9,-1,0,0,1:00
-1181,Europe/Belgrade,1996,EU,60,60,3,-1,0,0,1:00,10,-1,0,0,1:00
-1182,Europe/Madrid,1970,Spain,60,60,4,30,-1,0,24:00,9,30,-1,0,01:00
-1183,Europe/Madrid,1974,Spain,60,60,4,13,6,0,24:00,10,1,0,0,01:00
-1184,Europe/Madrid,1976,Spain,60,60,3,27,-1,0,24:00,9,-1,0,0,01:00
-1185,Europe/Madrid,1977,Spain,60,60,4,2,-1,0,24:00,9,-1,0,0,01:00
-1186,Europe/Madrid,1978,Spain,60,60,4,2,-1,0,24:00,10,1,-1,0,01:00
-1187,Europe/Madrid,1979,EU,60,60,4,1,0,0,1:00,9,-1,0,0,1:00
-1188,Europe/Madrid,1981,EU,60,60,3,-1,0,0,1:00,9,-1,0,0,1:00
-1189,Europe/Madrid,1996,EU,60,60,3,-1,0,0,1:00,10,-1,0,0,1:00
-1190,Africa/Ceuta,1970,SpainAfrica,0,60,6,3,-1,0,12:00,10,1,-1,0,-1:00
-1191,Africa/Ceuta,1974,SpainAfrica,0,60,6,24,-1,0,00:00,9,1,-1,0,-1:00
-1192,Africa/Ceuta,1976,SpainAfrica,0,60,5,1,-1,0,00:00,8,1,-1,0,-1:00
-1193,Africa/Ceuta,1977,SpainAfrica,0,60,5,1,-1,0,00:00,9,28,-1,0,-1:00
-1194,Africa/Ceuta,1978,SpainAfrica,0,60,6,1,-1,0,00:00,8,4,-1,0,-1:00
-1195,Africa/Ceuta,1979,SpainAfrica,0,0,6,1,-1,0,00:00,8,4,-1,0,-1:00
-1196,Africa/Ceuta,1984,,60,0,0,0,0,0,00:00,0,0,0,0,00:00
-1197,Africa/Ceuta,1986,EU,60,60,3,-1,0,0,1:00,9,-1,0,0,1:00
-1198,Africa/Ceuta,1996,EU,60,60,3,-1,0,0,1:00,10,-1,0,0,1:00
-1199,Atlantic/Canary,1970,,0,0,0,0,0,0,00:00,0,0,0,0,00:00
-1200,Atlantic/Canary,1980,EU,0,60,4,1,0,0,1:00,9,-1,0,0,1:00
-1201,Atlantic/Canary,1981,EU,0,60,3,-1,0,0,1:00,9,-1,0,0,1:00
-1202,Atlantic/Canary,1996,EU,0,60,3,-1,0,0,1:00,10,-1,0,0,1:00
-1203,Europe/Stockholm,1970,,60,0,0,0,0,0,00:00,0,0,0,0,00:00
-1204,Europe/Stockholm,1980,EU,60,60,4,1,0,0,1:00,9,-1,0,0,1:00
-1205,Europe/Stockholm,1981,EU,60,60,3,-1,0,0,1:00,9,-1,0,0,1:00
-1206,Europe/Stockholm,1996,EU,60,60,3,-1,0,0,1:00,10,-1,0,0,1:00
-1207,Europe/Zurich,1970,Swiss,60,0,5,1,1,0,02:00,10,1,1,0,02:00
-1208,Europe/Zurich,1981,EU,60,60,3,-1,0,0,1:00,9,-1,0,0,1:00
-1209,Europe/Zurich,1996,EU,60,60,3,-1,0,0,1:00,10,-1,0,0,1:00
-1210,Europe/Istanbul,1970,Turkey,120,60,5,2,0,0,02:00,10,2,0,0,01:00
-1211,Europe/Istanbul,1973,Turkey,120,60,6,3,-1,0,03:00,11,4,-1,0,04:00
-1212,Europe/Istanbul,1974,Turkey,120,60,3,31,-1,0,04:00,11,3,-1,0,06:00
-1213,Europe/Istanbul,1975,Turkey,120,60,3,30,-1,0,02:00,10,-1,0,0,01:00
-1214,Europe/Istanbul,1976,Turkey,120,60,6,1,-1,0,02:00,10,-1,0,0,01:00
-1215,Europe/Istanbul,1977,Turkey,120,60,4,1,0,0,02:00,10,16,-1,0,01:00
-1216,Europe/Istanbul,1978,Turkey,180,60,4,1,0,0,03:00,1,1,-1,0,14:00
-1217,Europe/Istanbul,1979,Turkey,180,60,4,1,0,0,06:00,10,11,1,0,02:00
-1218,Europe/Istanbul,1981,Turkey,180,60,3,-1,0,0,06:00,10,11,1,0,02:00
-1219,Europe/Istanbul,1983,Turkey,180,60,7,31,-1,0,03:00,10,2,-1,0,02:00
-1220,Europe/Istanbul,1985,Turkey,120,60,4,20,-1,0,02:00,9,28,-1,0,01:00
-1221,Europe/Istanbul,1986,Turkey,120,60,3,-1,0,0,04:00,9,-1,0,0,04:00
-1222,Europe/Istanbul,1991,Turkey,120,60,3,-1,0,0,03:00,9,-1,0,0,03:00
-1223,Europe/Istanbul,1996,Turkey,120,60,3,-1,0,0,03:00,10,-1,0,0,03:00
-1224,Europe/Istanbul,2006,Turkey,120,0,3,-1,0,0,03:00,10,-1,0,0,03:00
-1225,Europe/Istanbul,2007,EU,120,0,3,-1,0,0,03:00,10,-1,0,0,03:00
-1226,Europe/Kiev,1970,Russia,180,60,9,1,-1,0,03:00,10,1,-1,0,02:00
-1227,Europe/Kiev,1981,Russia,180,60,4,1,-1,0,03:00,10,1,-1,0,02:00
-1228,Europe/Kiev,1984,Russia,180,60,4,1,-1,0,03:00,9,-1,0,0,05:00
-1229,Europe/Kiev,1985,Russia,180,60,3,-1,0,0,05:00,9,-1,0,0,05:00
-1230,Europe/Kiev,1990,,120,0,0,0,0,0,00:00,0,0,0,0,00:00
-1231,Europe/Kiev,1992,E-Eur,120,60,3,-1,0,0,02:00,9,-1,0,0,01:00
-1232,Europe/Kiev,1995,EU,120,60,3,-1,0,0,1:00,9,-1,0,0,1:00
-1233,Europe/Kiev,1996,EU,120,60,3,-1,0,0,1:00,10,-1,0,0,1:00
-1234,Europe/Uzhgorod,1970,Russia,180,60,9,1,-1,0,03:00,10,1,-1,0,02:00
-1235,Europe/Uzhgorod,1981,Russia,180,60,4,1,-1,0,03:00,10,1,-1,0,02:00
-1236,Europe/Uzhgorod,1984,Russia,180,60,4,1,-1,0,03:00,9,-1,0,0,05:00
-1237,Europe/Uzhgorod,1985,Russia,180,60,3,-1,0,0,05:00,9,-1,0,0,05:00
-1238,Europe/Uzhgorod,1990,,60,0,0,0,0,0,00:00,0,0,0,0,00:00
-1239,Europe/Uzhgorod,1991,,120,0,0,0,0,0,00:00,0,0,0,0,00:00
-1240,Europe/Uzhgorod,1992,E-Eur,120,60,3,-1,0,0,02:00,9,-1,0,0,01:00
-1241,Europe/Uzhgorod,1995,EU,120,60,3,-1,0,0,1:00,9,-1,0,0,1:00
-1242,Europe/Uzhgorod,1996,EU,120,60,3,-1,0,0,1:00,10,-1,0,0,1:00
-1243,Europe/Zaporozhye,1970,Russia,180,60,9,1,-1,0,03:00,10,1,-1,0,02:00
-1244,Europe/Zaporozhye,1981,Russia,180,60,4,1,-1,0,03:00,10,1,-1,0,02:00
-1245,Europe/Zaporozhye,1984,Russia,180,60,4,1,-1,0,03:00,9,-1,0,0,05:00
-1246,Europe/Zaporozhye,1985,Russia,180,60,3,-1,0,0,05:00,9,-1,0,0,05:00
-1247,Europe/Zaporozhye,1991,E-Eur,120,60,3,-1,0,0,02:00,9,-1,0,0,01:00
-1248,Europe/Zaporozhye,1995,EU,120,60,3,-1,0,0,1:00,9,-1,0,0,1:00
-1249,Europe/Zaporozhye,1996,EU,120,60,3,-1,0,0,1:00,10,-1,0,0,1:00
-1250,Europe/Simferopol,1970,Russia,180,60,9,1,-1,0,03:00,10,1,-1,0,02:00
-1251,Europe/Simferopol,1981,Russia,180,60,4,1,-1,0,03:00,10,1,-1,0,02:00
-1252,Europe/Simferopol,1984,Russia,180,60,4,1,-1,0,03:00,9,-1,0,0,05:00
-1253,Europe/Simferopol,1985,Russia,180,60,3,-1,0,0,05:00,9,-1,0,0,05:00
-1254,Europe/Simferopol,1990,,120,0,0,0,0,0,00:00,0,0,0,0,00:00
-1255,Europe/Simferopol,1992,E-Eur,120,60,3,-1,0,0,02:00,9,-1,0,0,01:00
-1256,Europe/Simferopol,1994,E-Eur,180,60,3,-1,0,0,03:00,9,-1,0,0,02:00
-1257,Europe/Simferopol,1996,Russia,180,60,3,-1,0,0,05:00,10,-1,0,0,05:00
-1258,Europe/Simferopol,1997,EU,120,60,3,-1,0,0,04:00,10,-1,0,0,04:00
-1259,EST,1970,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-1260,MST,1970,,-420,0,0,0,0,0,00:00,0,0,0,0,00:00
-1261,HST,1970,,-600,0,0,0,0,0,00:00,0,0,0,0,00:00
-1262,EST5EDT,1970,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
-1263,EST5EDT,1974,US,-300,60,1,6,-1,0,-3:00,10,-1,0,0,-4:00
-1264,EST5EDT,1975,US,-300,60,2,23,-1,0,-3:00,10,-1,0,0,-4:00
-1265,EST5EDT,1976,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
-1266,EST5EDT,1987,US,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
-1267,EST5EDT,2007,US,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
-1268,CST6CDT,1970,US,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
-1269,CST6CDT,1974,US,-360,60,1,6,-1,0,-4:00,10,-1,0,0,-5:00
-1270,CST6CDT,1975,US,-360,60,2,23,-1,0,-4:00,10,-1,0,0,-5:00
-1271,CST6CDT,1976,US,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
-1272,CST6CDT,1987,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1273,CST6CDT,2007,US,-360,60,3,8,0,0,-4:00,11,1,0,0,-5:00
-1274,MST7MDT,1970,US,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
-1275,MST7MDT,1974,US,-420,60,1,6,-1,0,-5:00,10,-1,0,0,-6:00
-1276,MST7MDT,1975,US,-420,60,2,23,-1,0,-5:00,10,-1,0,0,-6:00
-1277,MST7MDT,1976,US,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
-1278,MST7MDT,1987,US,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
-1279,MST7MDT,2007,US,-420,60,3,8,0,0,-5:00,11,1,0,0,-6:00
-1280,PST8PDT,1970,US,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
-1281,PST8PDT,1974,US,-480,60,1,6,-1,0,-6:00,10,-1,0,0,-7:00
-1282,PST8PDT,1975,US,-480,60,2,23,-1,0,-6:00,10,-1,0,0,-7:00
-1283,PST8PDT,1976,US,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
-1284,PST8PDT,1987,US,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
-1285,PST8PDT,2007,US,-480,60,3,8,0,0,-6:00,11,1,0,0,-7:00
-1286,America/New_York,1970,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
-1287,America/New_York,1974,US,-300,60,1,6,-1,0,-3:00,10,-1,0,0,-4:00
-1288,America/New_York,1975,US,-300,60,2,23,-1,0,-3:00,10,-1,0,0,-4:00
-1289,America/New_York,1976,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
-1290,America/New_York,1987,US,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
-1291,America/New_York,2007,US,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
-1292,America/Chicago,1970,US,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
-1293,America/Chicago,1974,US,-360,60,1,6,-1,0,-4:00,10,-1,0,0,-5:00
-1294,America/Chicago,1975,US,-360,60,2,23,-1,0,-4:00,10,-1,0,0,-5:00
-1295,America/Chicago,1976,US,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
-1296,America/Chicago,1987,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1297,America/Chicago,2007,US,-360,60,3,8,0,0,-4:00,11,1,0,0,-5:00
-1298,America/North_Dakota/Center,1970,US,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
-1299,America/North_Dakota/Center,1974,US,-420,60,1,6,-1,0,-5:00,10,-1,0,0,-6:00
-1300,America/North_Dakota/Center,1975,US,-420,60,2,23,-1,0,-5:00,10,-1,0,0,-6:00
-1301,America/North_Dakota/Center,1976,US,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
-1302,America/North_Dakota/Center,1987,US,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
-1303,America/North_Dakota/Center,1992,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1304,America/North_Dakota/Center,2007,US,-360,60,3,8,0,0,-4:00,11,1,0,0,-5:00
-1305,America/North_Dakota/New_Salem,1970,US,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
-1306,America/North_Dakota/New_Salem,1974,US,-420,60,1,6,-1,0,-5:00,10,-1,0,0,-6:00
-1307,America/North_Dakota/New_Salem,1975,US,-420,60,2,23,-1,0,-5:00,10,-1,0,0,-6:00
-1308,America/North_Dakota/New_Salem,1976,US,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
-1309,America/North_Dakota/New_Salem,1987,US,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
-1310,America/North_Dakota/New_Salem,2003,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1311,America/North_Dakota/New_Salem,2007,US,-360,60,3,8,0,0,-4:00,11,1,0,0,-5:00
-1312,America/North_Dakota/Beulah,1970,US,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
-1313,America/North_Dakota/Beulah,1974,US,-420,60,1,6,-1,0,-5:00,10,-1,0,0,-6:00
-1314,America/North_Dakota/Beulah,1975,US,-420,60,2,23,-1,0,-5:00,10,-1,0,0,-6:00
-1315,America/North_Dakota/Beulah,1976,US,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
-1316,America/North_Dakota/Beulah,1987,US,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
-1317,America/North_Dakota/Beulah,2007,US,-420,60,3,8,0,0,-5:00,11,1,0,0,-6:00
-1318,America/North_Dakota/Beulah,2010,US,-360,60,3,8,0,0,-4:00,11,1,0,0,-5:00
-1319,America/Denver,1970,US,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
-1320,America/Denver,1974,US,-420,60,1,6,-1,0,-5:00,10,-1,0,0,-6:00
-1321,America/Denver,1975,US,-420,60,2,23,-1,0,-5:00,10,-1,0,0,-6:00
-1322,America/Denver,1976,US,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
-1323,America/Denver,1987,US,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
-1324,America/Denver,2007,US,-420,60,3,8,0,0,-5:00,11,1,0,0,-6:00
-1325,America/Los_Angeles,1970,US,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
-1326,America/Los_Angeles,1974,US,-480,60,1,6,-1,0,-6:00,10,-1,0,0,-7:00
-1327,America/Los_Angeles,1975,US,-480,60,2,23,-1,0,-6:00,10,-1,0,0,-7:00
-1328,America/Los_Angeles,1976,US,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
-1329,America/Los_Angeles,1987,US,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
-1330,America/Los_Angeles,2007,US,-480,60,3,8,0,0,-6:00,11,1,0,0,-7:00
-1331,America/Juneau,1970,US,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
-1332,America/Juneau,1974,US,-480,60,1,6,-1,0,-6:00,10,-1,0,0,-7:00
-1333,America/Juneau,1975,US,-480,60,2,23,-1,0,-6:00,10,-1,0,0,-7:00
-1334,America/Juneau,1976,US,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
-1335,America/Juneau,1983,US,-540,60,4,-1,0,0,-7:00,10,-1,0,0,-8:00
-1336,America/Juneau,1987,US,-540,60,4,1,0,0,-7:00,10,-1,0,0,-8:00
-1337,America/Juneau,2007,US,-540,60,3,8,0,0,-7:00,11,1,0,0,-8:00
-1338,America/Sitka,1970,US,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
-1339,America/Sitka,1974,US,-480,60,1,6,-1,0,-6:00,10,-1,0,0,-7:00
-1340,America/Sitka,1975,US,-480,60,2,23,-1,0,-6:00,10,-1,0,0,-7:00
-1341,America/Sitka,1976,US,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
-1342,America/Sitka,1983,US,-540,60,4,-1,0,0,-7:00,10,-1,0,0,-8:00
-1343,America/Sitka,1987,US,-540,60,4,1,0,0,-7:00,10,-1,0,0,-8:00
-1344,America/Sitka,2007,US,-540,60,3,8,0,0,-7:00,11,1,0,0,-8:00
-1345,America/Metlakatla,1970,US,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
-1346,America/Metlakatla,1974,US,-480,60,1,6,-1,0,-6:00,10,-1,0,0,-7:00
-1347,America/Metlakatla,1975,US,-480,60,2,23,-1,0,-6:00,10,-1,0,0,-7:00
-1348,America/Metlakatla,1976,US,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
-1349,America/Metlakatla,1987,US,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
-1350,America/Metlakatla,2007,US,-480,60,3,8,0,0,-6:00,11,1,0,0,-7:00
-1351,America/Yakutat,1970,US,-540,60,4,-1,0,0,-7:00,10,-1,0,0,-8:00
-1352,America/Yakutat,1974,US,-540,60,1,6,-1,0,-7:00,10,-1,0,0,-8:00
-1353,America/Yakutat,1975,US,-540,60,2,23,-1,0,-7:00,10,-1,0,0,-8:00
-1354,America/Yakutat,1976,US,-540,60,4,-1,0,0,-7:00,10,-1,0,0,-8:00
-1355,America/Yakutat,1987,US,-540,60,4,1,0,0,-7:00,10,-1,0,0,-8:00
-1356,America/Yakutat,2007,US,-540,60,3,8,0,0,-7:00,11,1,0,0,-8:00
-1357,America/Anchorage,1970,US,-600,60,4,-1,0,0,-8:00,10,-1,0,0,-9:00
-1358,America/Anchorage,1974,US,-600,60,1,6,-1,0,-8:00,10,-1,0,0,-9:00
-1359,America/Anchorage,1975,US,-600,60,2,23,-1,0,-8:00,10,-1,0,0,-9:00
-1360,America/Anchorage,1976,US,-600,60,4,-1,0,0,-8:00,10,-1,0,0,-9:00
-1361,America/Anchorage,1983,US,-540,60,4,-1,0,0,-7:00,10,-1,0,0,-8:00
-1362,America/Anchorage,1987,US,-540,60,4,1,0,0,-7:00,10,-1,0,0,-8:00
-1363,America/Anchorage,2007,US,-540,60,3,8,0,0,-7:00,11,1,0,0,-8:00
-1364,America/Nome,1970,US,-660,60,4,-1,0,0,-9:00,10,-1,0,0,-10:00
-1365,America/Nome,1974,US,-660,60,1,6,-1,0,-9:00,10,-1,0,0,-10:00
-1366,America/Nome,1975,US,-660,60,2,23,-1,0,-9:00,10,-1,0,0,-10:00
-1367,America/Nome,1976,US,-660,60,4,-1,0,0,-9:00,10,-1,0,0,-10:00
-1368,America/Nome,1983,US,-540,60,4,-1,0,0,-7:00,10,-1,0,0,-8:00
-1369,America/Nome,1987,US,-540,60,4,1,0,0,-7:00,10,-1,0,0,-8:00
-1370,America/Nome,2007,US,-540,60,3,8,0,0,-7:00,11,1,0,0,-8:00
-1371,America/Adak,1970,US,-660,60,4,-1,0,0,-9:00,10,-1,0,0,-10:00
-1372,America/Adak,1974,US,-660,60,1,6,-1,0,-9:00,10,-1,0,0,-10:00
-1373,America/Adak,1975,US,-660,60,2,23,-1,0,-9:00,10,-1,0,0,-10:00
-1374,America/Adak,1976,US,-660,60,4,-1,0,0,-9:00,10,-1,0,0,-10:00
-1375,America/Adak,1983,US,-600,60,4,-1,0,0,-8:00,10,-1,0,0,-9:00
-1376,America/Adak,1987,US,-600,60,4,1,0,0,-8:00,10,-1,0,0,-9:00
-1377,America/Adak,2007,US,-600,60,3,8,0,0,-8:00,11,1,0,0,-9:00
-1378,Pacific/Honolulu,1970,,-600,0,0,0,0,0,00:00,0,0,0,0,00:00
-1379,America/Phoenix,1970,,-420,0,0,0,0,0,00:00,0,0,0,0,00:00
-1380,America/Boise,1970,US,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
-1381,America/Boise,1974,US,-420,60,1,6,-1,0,-5:00,10,-1,0,0,-6:00
-1382,America/Boise,1975,US,-420,60,2,23,-1,0,-5:00,10,-1,0,0,-6:00
-1383,America/Boise,1976,US,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
-1384,America/Boise,1987,US,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
-1385,America/Boise,2007,US,-420,60,3,8,0,0,-5:00,11,1,0,0,-6:00
-1386,America/Indiana/Indianapolis,1970,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
-1387,America/Indiana/Indianapolis,1971,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-1388,America/Indiana/Indianapolis,2006,US,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
-1389,America/Indiana/Indianapolis,2007,US,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
-1390,America/Indiana/Marengo,1970,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
-1391,America/Indiana/Marengo,1974,US,-300,60,1,6,-1,0,-3:00,10,-1,0,0,-4:00
-1392,America/Indiana/Marengo,1975,US,-300,60,2,23,-1,0,-3:00,10,-1,0,0,-4:00
-1393,America/Indiana/Marengo,1976,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-1394,America/Indiana/Marengo,2006,US,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
-1395,America/Indiana/Marengo,2007,US,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
-1396,America/Indiana/Vincennes,1970,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
-1397,America/Indiana/Vincennes,1971,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-1398,America/Indiana/Vincennes,2006,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1399,America/Indiana/Vincennes,2007,US,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
-1400,America/Indiana/Tell_City,1970,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
-1401,America/Indiana/Tell_City,1971,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-1402,America/Indiana/Tell_City,2006,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1403,America/Indiana/Tell_City,2007,US,-360,60,3,8,0,0,-4:00,11,1,0,0,-5:00
-1404,America/Indiana/Petersburg,1970,US,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
-1405,America/Indiana/Petersburg,1974,US,-360,60,1,6,-1,0,-4:00,10,-1,0,0,-5:00
-1406,America/Indiana/Petersburg,1975,US,-360,60,2,23,-1,0,-4:00,10,-1,0,0,-5:00
-1407,America/Indiana/Petersburg,1976,US,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
-1408,America/Indiana/Petersburg,1977,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-1409,America/Indiana/Petersburg,2006,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1410,America/Indiana/Petersburg,2007,US,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
-1411,America/Indiana/Knox,1970,US,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
-1412,America/Indiana/Knox,1974,US,-360,60,1,6,-1,0,-4:00,10,-1,0,0,-5:00
-1413,America/Indiana/Knox,1975,US,-360,60,2,23,-1,0,-4:00,10,-1,0,0,-5:00
-1414,America/Indiana/Knox,1976,US,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
-1415,America/Indiana/Knox,1987,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1416,America/Indiana/Knox,1991,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-1417,America/Indiana/Knox,2006,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1418,America/Indiana/Knox,2007,US,-360,60,3,8,0,0,-4:00,11,1,0,0,-5:00
-1419,America/Indiana/Winamac,1970,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
-1420,America/Indiana/Winamac,1971,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-1421,America/Indiana/Winamac,2006,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1422,America/Indiana/Winamac,2007,US,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
-1423,America/Indiana/Vevay,1970,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
-1424,America/Indiana/Vevay,1973,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-1425,America/Indiana/Vevay,2006,US,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
-1426,America/Indiana/Vevay,2007,US,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
-1427,America/Kentucky/Louisville,1970,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
-1428,America/Kentucky/Louisville,1974,US,-300,60,1,6,-1,0,-3:00,10,-1,0,0,-4:00
-1429,America/Kentucky/Louisville,1975,US,-300,60,2,23,-1,0,-3:00,10,-1,0,0,-4:00
-1430,America/Kentucky/Louisville,1976,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
-1431,America/Kentucky/Louisville,1987,US,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
-1432,America/Kentucky/Louisville,2007,US,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
-1433,America/Kentucky/Monticello,1970,US,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
-1434,America/Kentucky/Monticello,1974,US,-360,60,1,6,-1,0,-4:00,10,-1,0,0,-5:00
-1435,America/Kentucky/Monticello,1975,US,-360,60,2,23,-1,0,-4:00,10,-1,0,0,-5:00
-1436,America/Kentucky/Monticello,1976,US,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
-1437,America/Kentucky/Monticello,1987,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1438,America/Kentucky/Monticello,2000,US,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
-1439,America/Kentucky/Monticello,2007,US,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
-1440,America/Detroit,1970,Detroit,-300,0,6,14,-1,0,-3:00,10,-1,0,0,-4:00
-1441,America/Detroit,1973,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
-1442,America/Detroit,1974,US,-300,60,1,6,-1,0,-3:00,10,-1,0,0,-4:00
-1443,America/Detroit,1975,US,-300,60,2,23,-1,0,-3:00,10,-1,0,0,-4:00
-1444,America/Detroit,1976,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
-1445,America/Detroit,1987,US,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
-1446,America/Detroit,2007,US,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
-1447,America/Menominee,1970,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-1448,America/Menominee,1973,US,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
-1449,America/Menominee,1974,US,-360,60,1,6,-1,0,-4:00,10,-1,0,0,-5:00
-1450,America/Menominee,1975,US,-360,60,2,23,-1,0,-4:00,10,-1,0,0,-5:00
-1451,America/Menominee,1976,US,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
-1452,America/Menominee,1987,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1453,America/Menominee,2007,US,-360,60,3,8,0,0,-4:00,11,1,0,0,-5:00
-1454,America/St_Johns,1970,StJohns,-210,60,4,-1,0,0,-1:30,10,-1,0,0,-2:30
-1455,America/St_Johns,1987,StJohns,-210,60,4,1,0,0,-3:29,10,-1,0,0,-4:29
-1456,America/St_Johns,1988,StJohns,-210,120,4,1,0,0,-3:29,10,-1,0,0,-4:29
-1457,America/St_Johns,1989,StJohns,-210,60,4,1,0,0,-3:29,10,-1,0,0,-4:29
-1458,America/St_Johns,2007,StJohns,-210,60,3,8,0,0,-3:29,11,1,0,0,-4:29
-1459,America/Goose_Bay,1970,StJohns,-240,60,4,-1,0,0,-2:00,10,-1,0,0,-3:00
-1460,America/Goose_Bay,1987,StJohns,-240,60,4,1,0,0,-3:59,10,-1,0,0,-4:59
-1461,America/Goose_Bay,1988,StJohns,-240,120,4,1,0,0,-3:59,10,-1,0,0,-4:59
-1462,America/Goose_Bay,1989,StJohns,-240,60,4,1,0,0,-3:59,10,-1,0,0,-4:59
-1463,America/Goose_Bay,2007,StJohns,-240,60,3,8,0,0,-3:59,11,1,0,0,-4:59
-1464,America/Halifax,1970,Halifax,-240,60,4,-1,0,0,-2:00,10,-1,0,0,-3:00
-1465,America/Halifax,1973,Halifax,-240,0,4,-1,0,0,-2:00,10,-1,0,0,-3:00
-1466,America/Halifax,1974,Canada,-240,60,4,-1,0,0,-2:00,10,-1,0,0,-3:00
-1467,America/Halifax,1987,Canada,-240,60,4,1,0,0,-2:00,10,-1,0,0,-3:00
-1468,America/Halifax,2007,Canada,-240,60,3,8,0,0,-2:00,11,1,0,0,-3:00
-1469,America/Glace_Bay,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-1470,America/Glace_Bay,1972,Halifax,-240,60,4,-1,0,0,-2:00,10,-1,0,0,-3:00
-1471,America/Glace_Bay,1973,Halifax,-240,0,4,-1,0,0,-2:00,10,-1,0,0,-3:00
-1472,America/Glace_Bay,1974,Canada,-240,60,4,-1,0,0,-2:00,10,-1,0,0,-3:00
-1473,America/Glace_Bay,1987,Canada,-240,60,4,1,0,0,-2:00,10,-1,0,0,-3:00
-1474,America/Glace_Bay,2007,Canada,-240,60,3,8,0,0,-2:00,11,1,0,0,-3:00
-1475,America/Moncton,1970,Moncton,-240,60,4,-1,0,0,-2:00,10,-1,0,0,-3:00
-1476,America/Moncton,1973,Canada,-240,60,4,-1,0,0,-2:00,10,-1,0,0,-3:00
-1477,America/Moncton,1987,Canada,-240,60,4,1,0,0,-2:00,10,-1,0,0,-3:00
-1478,America/Moncton,1993,Moncton,-240,60,4,1,0,0,-3:59,10,-1,0,0,-4:59
-1479,America/Moncton,2006,Moncton,-240,0,4,1,0,0,-3:59,10,-1,0,0,-4:59
-1480,America/Moncton,2007,Canada,-240,60,3,8,0,0,-2:00,11,1,0,0,-3:00
-1481,America/Blanc-Sablon,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-1482,America/Montreal,1970,Mont,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
-1483,America/Montreal,1974,Canada,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
-1484,America/Montreal,1987,Canada,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
-1485,America/Montreal,2007,Canada,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
-1486,America/Toronto,1970,Toronto,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
-1487,America/Toronto,1973,Toronto,-300,0,4,-1,0,0,-3:00,10,-1,0,0,-4:00
-1488,America/Toronto,1974,Canada,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
-1489,America/Toronto,1987,Canada,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
-1490,America/Toronto,2007,Canada,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
-1491,America/Thunder_Bay,1970,Mont,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
-1492,America/Thunder_Bay,1973,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-1493,America/Thunder_Bay,1974,Canada,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
-1494,America/Thunder_Bay,1987,Canada,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
-1495,America/Thunder_Bay,2007,Canada,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
-1496,America/Nipigon,1970,Canada,-300,60,8,14,-1,0,23:00,9,30,-1,0,-4:00
-1497,America/Nipigon,1974,Canada,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
-1498,America/Nipigon,1987,Canada,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
-1499,America/Nipigon,2007,Canada,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
-1500,America/Rainy_River,1970,Canada,-360,60,8,14,-1,0,23:00,9,30,-1,0,-5:00
-1501,America/Rainy_River,1974,Canada,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
-1502,America/Rainy_River,1987,Canada,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1503,America/Rainy_River,2007,Canada,-360,60,3,8,0,0,-4:00,11,1,0,0,-5:00
-1504,America/Atikokan,1970,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-1505,America/Winnipeg,1970,Winn,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-4:00
-1506,America/Winnipeg,1987,Winn,-360,60,4,1,0,0,-4:00,10,-1,0,0,-4:00
-1507,America/Winnipeg,2005,Winn,-360,0,4,1,0,0,-4:00,10,-1,0,0,-4:00
-1508,America/Winnipeg,2006,Canada,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1509,America/Winnipeg,2007,Canada,-360,60,3,8,0,0,-4:00,11,1,0,0,-5:00
-1510,America/Regina,1970,,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
-1511,America/Swift_Current,1970,Swift,-420,0,4,-1,0,0,-5:00,9,-1,0,0,-6:00
-1512,America/Swift_Current,1972,,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
-1513,America/Edmonton,1970,Edm,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
-1514,America/Edmonton,1987,Canada,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
-1515,America/Edmonton,2007,Canada,-420,60,3,8,0,0,-5:00,11,1,0,0,-6:00
-1516,America/Vancouver,1970,Vanc,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
-1517,America/Vancouver,1987,Canada,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
-1518,America/Vancouver,2007,Canada,-480,60,3,8,0,0,-6:00,11,1,0,0,-7:00
-1519,America/Dawson_Creek,1970,Vanc,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
-1520,America/Dawson_Creek,1972,,-420,0,0,0,0,0,00:00,0,0,0,0,00:00
-1521,America/Pangnirtung,1970,NT_YK,-240,120,4,-1,0,0,-4:00,10,-1,0,0,-3:00
-1522,America/Pangnirtung,1980,NT_YK,-240,60,4,-1,0,0,-2:00,10,-1,0,0,-3:00
-1523,America/Pangnirtung,1987,NT_YK,-240,60,4,1,0,0,-2:00,10,-1,0,0,-3:00
-1524,America/Pangnirtung,1995,Canada,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
-1525,America/Pangnirtung,1999,Canada,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1526,America/Pangnirtung,2000,Canada,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
-1527,America/Pangnirtung,2007,Canada,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
-1528,America/Iqaluit,1970,NT_YK,-300,120,4,-1,0,0,-5:00,10,-1,0,0,-4:00
-1529,America/Iqaluit,1980,NT_YK,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
-1530,America/Iqaluit,1987,NT_YK,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
-1531,America/Iqaluit,1999,Canada,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1532,America/Iqaluit,2000,Canada,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
-1533,America/Iqaluit,2007,Canada,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
-1534,America/Resolute,1970,NT_YK,-360,120,4,-1,0,0,-6:00,10,-1,0,0,-5:00
-1535,America/Resolute,1980,NT_YK,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
-1536,America/Resolute,1987,NT_YK,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1537,America/Resolute,2000,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-1538,America/Resolute,2001,Canada,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1539,America/Resolute,2006,Resolute,-300,0,12,31,-1,0,07:00,11,1,0,0,-4:00
-1540,America/Resolute,2007,Resolute,-300,0,12,31,-1,0,07:00,3,8,0,0,-4:00
-1541,America/Rankin_Inlet,1970,NT_YK,-360,120,4,-1,0,0,-6:00,10,-1,0,0,-5:00
-1542,America/Rankin_Inlet,1980,NT_YK,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
-1543,America/Rankin_Inlet,1987,NT_YK,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1544,America/Rankin_Inlet,2000,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-1545,America/Rankin_Inlet,2001,Canada,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1546,America/Rankin_Inlet,2007,Canada,-360,60,3,8,0,0,-4:00,11,1,0,0,-5:00
-1547,America/Cambridge_Bay,1970,NT_YK,-420,120,4,-1,0,0,-7:00,10,-1,0,0,-6:00
-1548,America/Cambridge_Bay,1980,NT_YK,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
-1549,America/Cambridge_Bay,1987,NT_YK,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
-1550,America/Cambridge_Bay,1999,Canada,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1551,America/Cambridge_Bay,2000,,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
-1552,America/Cambridge_Bay,2001,Canada,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
-1553,America/Cambridge_Bay,2007,Canada,-420,60,3,8,0,0,-5:00,11,1,0,0,-6:00
-1554,America/Yellowknife,1970,NT_YK,-420,120,4,-1,0,0,-7:00,10,-1,0,0,-6:00
-1555,America/Yellowknife,1980,Canada,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
-1556,America/Yellowknife,1987,Canada,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
-1557,America/Yellowknife,2007,Canada,-420,60,3,8,0,0,-5:00,11,1,0,0,-6:00
-1558,America/Inuvik,1970,NT_YK,-480,120,4,-1,0,0,-8:00,10,-1,0,0,-7:00
-1559,America/Inuvik,1979,NT_YK,-420,120,4,-1,0,0,-7:00,10,-1,0,0,-6:00
-1560,America/Inuvik,1980,Canada,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
-1561,America/Inuvik,1987,Canada,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
-1562,America/Inuvik,2007,Canada,-420,60,3,8,0,0,-5:00,11,1,0,0,-6:00
-1563,America/Whitehorse,1970,NT_YK,-480,120,4,-1,0,0,-8:00,10,-1,0,0,-7:00
-1564,America/Whitehorse,1980,Canada,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
-1565,America/Whitehorse,1987,Canada,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
-1566,America/Whitehorse,2007,Canada,-480,60,3,8,0,0,-6:00,11,1,0,0,-7:00
-1567,America/Dawson,1970,NT_YK,-540,120,4,-1,0,0,-9:00,10,-1,0,0,-8:00
-1568,America/Dawson,1973,NT_YK,-480,120,4,-1,0,0,-8:00,10,-1,0,0,-7:00
-1569,America/Dawson,1980,Canada,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
-1570,America/Dawson,1987,Canada,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
-1571,America/Dawson,2007,Canada,-480,60,3,8,0,0,-6:00,11,1,0,0,-7:00
-1572,America/Cancun,1970,,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
-1573,America/Cancun,1981,Mexico,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-1574,America/Cancun,1996,Mexico,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
-1575,America/Cancun,1998,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1576,America/Cancun,2001,Mexico,-360,60,5,1,0,0,-4:00,9,-1,0,0,-5:00
-1577,America/Cancun,2002,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1578,America/Merida,1970,,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
-1579,America/Merida,1981,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-1580,America/Merida,1982,Mexico,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
-1581,America/Merida,1996,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1582,America/Merida,2001,Mexico,-360,60,5,1,0,0,-4:00,9,-1,0,0,-5:00
-1583,America/Merida,2002,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1584,America/Matamoros,1970,,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
-1585,America/Matamoros,1988,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1586,America/Matamoros,1989,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1587,America/Matamoros,2001,Mexico,-360,60,5,1,0,0,-4:00,9,-1,0,0,-5:00
-1588,America/Matamoros,2002,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1589,America/Matamoros,2010,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1590,America/Monterrey,1970,,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
-1591,America/Monterrey,1988,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1592,America/Monterrey,1989,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1593,America/Monterrey,2001,Mexico,-360,60,5,1,0,0,-4:00,9,-1,0,0,-5:00
-1594,America/Monterrey,2002,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1595,America/Mexico_City,1970,Mexico,-360,60,2,12,-1,0,-6:00,7,30,-1,0,-7:00
-1596,America/Mexico_City,1996,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1597,America/Mexico_City,2001,,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
-1598,America/Mexico_City,2002,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1599,America/Ojinaga,1970,,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
-1600,America/Ojinaga,1996,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1601,America/Ojinaga,1998,Mexico,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
-1602,America/Ojinaga,2001,Mexico,-420,60,5,1,0,0,-5:00,9,-1,0,0,-6:00
-1603,America/Ojinaga,2002,Mexico,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
-1604,America/Ojinaga,2010,US,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
-1605,America/Chihuahua,1970,,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
-1606,America/Chihuahua,1996,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1607,America/Chihuahua,1998,Mexico,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
-1608,America/Chihuahua,2001,Mexico,-420,60,5,1,0,0,-5:00,9,-1,0,0,-6:00
-1609,America/Chihuahua,2002,Mexico,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
-1610,America/Hermosillo,1970,Mexico,-420,60,2,12,-1,0,-7:00,7,30,-1,0,-8:00
-1611,America/Hermosillo,1996,Mexico,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
-1612,America/Hermosillo,1999,,-420,0,0,0,0,0,00:00,0,0,0,0,00:00
-1613,America/Mazatlan,1970,Mexico,-420,60,2,12,-1,0,-7:00,7,30,-1,0,-8:00
-1614,America/Mazatlan,1996,Mexico,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
-1615,America/Mazatlan,2001,Mexico,-420,60,5,1,0,0,-5:00,9,-1,0,0,-6:00
-1616,America/Mazatlan,2002,Mexico,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
-1617,America/Bahia_Banderas,1970,Mexico,-420,60,2,12,-1,0,-7:00,7,30,-1,0,-8:00
-1618,America/Bahia_Banderas,1996,Mexico,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
-1619,America/Bahia_Banderas,2001,Mexico,-420,60,5,1,0,0,-5:00,9,-1,0,0,-6:00
-1620,America/Bahia_Banderas,2002,Mexico,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
-1621,America/Bahia_Banderas,2010,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
-1622,America/Tijuana,1970,,-480,0,0,0,0,0,00:00,0,0,0,0,00:00
-1623,America/Tijuana,1976,US,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
-1624,America/Tijuana,1987,US,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
-1625,America/Tijuana,1996,Mexico,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
-1626,America/Tijuana,2001,US,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
-1627,America/Tijuana,2002,Mexico,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
-1628,America/Tijuana,2010,US,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
-1629,America/Santa_Isabel,1970,,-480,0,0,0,0,0,00:00,0,0,0,0,00:00
-1630,America/Santa_Isabel,1976,US,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
-1631,America/Santa_Isabel,1987,US,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
-1632,America/Santa_Isabel,1996,Mexico,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
-1633,America/Santa_Isabel,2001,US,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
-1634,America/Santa_Isabel,2002,Mexico,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
-1635,America/Anguilla,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-1636,America/Antigua,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-1637,America/Nassau,1970,Bahamas,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
-1638,America/Nassau,1975,Bahamas,-300,0,4,-1,0,0,-3:00,10,-1,0,0,-4:00
-1639,America/Nassau,1976,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
-1640,America/Nassau,1987,US,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
-1641,America/Nassau,2007,US,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
-1642,America/Barbados,1970,Barb,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-1643,America/Barbados,1977,Barb,-240,60,6,12,-1,0,-2:00,10,1,0,0,-3:00
-1644,America/Barbados,1978,Barb,-240,60,4,15,0,0,-2:00,10,1,0,0,-3:00
-1645,America/Barbados,1979,Barb,-240,60,4,15,0,0,-2:00,9,30,-1,0,-3:00
-1646,America/Barbados,1980,Barb,-240,60,4,15,0,0,-2:00,9,25,-1,0,-3:00
-1647,America/Barbados,1981,Barb,-240,0,4,15,0,0,-2:00,9,25,-1,0,-3:00
-1648,America/Belize,1970,Belize,-360,0,12,31,-1,0,06:00,2,9,0,0,-7:00
-1649,America/Belize,1973,Belize,-360,60,12,5,-1,0,-6:00,1,1,-1,0,05:00
-1650,America/Belize,1974,Belize,-360,0,12,31,-1,0,06:00,2,9,-1,0,-7:00
-1651,America/Belize,1982,Belize,-360,60,12,18,-1,0,-6:00,1,1,-1,0,05:00
-1652,America/Belize,1983,Belize,-360,0,12,31,-1,0,06:00,2,12,-1,0,-7:00
-1653,Atlantic/Bermuda,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-1654,Atlantic/Bermuda,1974,Bahamas,-240,60,4,-1,0,0,-2:00,10,-1,0,0,-3:00
-1655,Atlantic/Bermuda,1975,Bahamas,-240,0,4,-1,0,0,-2:00,10,-1,0,0,-3:00
-1656,Atlantic/Bermuda,1976,US,-240,60,4,-1,0,0,-2:00,10,-1,0,0,-3:00
-1657,Atlantic/Bermuda,1987,US,-240,60,4,1,0,0,-2:00,10,-1,0,0,-3:00
-1658,Atlantic/Bermuda,2007,US,-240,60,3,8,0,0,-2:00,11,1,0,0,-3:00
-1659,America/Cayman,1970,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-1660,America/Costa_Rica,1970,CR,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
-1661,America/Costa_Rica,1979,CR,-360,60,2,-1,0,0,-6:00,6,1,0,0,-7:00
-1662,America/Costa_Rica,1991,CR,-360,60,1,15,6,0,-6:00,7,1,-1,0,-7:00
-1663,America/Costa_Rica,1992,CR,-360,60,1,15,6,0,-6:00,3,15,-1,0,-7:00
-1664,America/Costa_Rica,1993,CR,-360,0,1,15,6,0,-6:00,3,15,-1,0,-7:00
-1665,America/Havana,1970,Cuba,-300,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
-1666,America/Havana,1972,Cuba,-300,60,4,-1,0,0,-5:00,10,8,-1,0,-6:00
-1667,America/Havana,1975,Cuba,-300,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
-1668,America/Havana,1978,Cuba,-300,60,5,7,-1,0,-5:00,10,8,0,0,-6:00
-1669,America/Havana,1979,Cuba,-300,60,3,15,0,0,-5:00,10,8,0,0,-6:00
-1670,America/Havana,1981,Cuba,-300,60,5,5,0,0,-5:00,10,8,0,0,-6:00
-1671,America/Havana,1986,Cuba,-300,60,3,14,0,0,-5:00,10,8,0,0,-6:00
-1672,America/Havana,1990,Cuba,-300,60,4,1,0,0,-5:00,10,8,0,0,-6:00
-1673,America/Havana,1991,Cuba,-300,60,4,1,0,0,-5:00,10,8,0,0,-5:00
-1674,America/Havana,1996,Cuba,-300,60,4,1,0,0,-5:00,10,6,-1,0,-5:00
-1675,America/Havana,1997,Cuba,-300,60,4,1,0,0,-5:00,10,12,-1,0,-5:00
-1676,America/Havana,1998,Cuba,-300,60,3,-1,0,0,-5:00,10,-1,0,0,-5:00
-1677,America/Havana,2000,Cuba,-300,60,4,1,0,0,-5:00,10,-1,0,0,-5:00
-1678,America/Havana,2004,Cuba,-300,60,4,1,0,0,-5:00,1,1,-1,0,06:00
-1679,America/Havana,2006,Cuba,-300,0,12,31,-1,0,07:00,10,-1,0,0,-5:00
-1680,America/Havana,2007,Cuba,-300,60,3,8,0,0,-5:00,10,-1,0,0,-5:00
-1681,America/Havana,2008,Cuba,-300,60,3,15,0,0,-5:00,10,-1,0,0,-5:00
-1682,America/Havana,2009,Cuba,-300,60,3,8,0,0,-5:00,10,-1,0,0,-5:00
-1683,America/Havana,2011,Cuba,-300,60,3,15,0,0,-5:00,10,-1,0,0,-5:00
-1684,America/Havana,2012,Cuba,-300,60,3,8,0,0,-5:00,10,-1,0,0,-5:00
-1685,America/Dominica,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-1686,America/Santo_Domingo,1970,DR,-300,30,10,-1,0,0,-5:00,2,21,-1,0,-6:00
-1687,America/Santo_Domingo,1971,DR,-300,30,10,-1,0,0,-5:00,1,20,-1,0,-6:00
-1688,America/Santo_Domingo,1972,DR,-300,30,10,-1,0,0,-5:00,1,21,-1,0,-6:00
-1689,America/Santo_Domingo,1974,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-1690,America/El_Salvador,1970,Salv,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
-1691,America/El_Salvador,1987,Salv,-360,60,5,1,0,0,-6:00,9,-1,0,0,-7:00
-1692,America/El_Salvador,1988,Salv,-360,0,5,1,0,0,-6:00,9,-1,0,0,-7:00
-1693,America/Grenada,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-1694,America/Guadeloupe,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-1695,America/Guatemala,1970,Guat,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
-1696,America/Guatemala,1973,Guat,-360,60,11,25,-1,0,-6:00,1,1,-1,0,05:00
-1697,America/Guatemala,1974,Guat,-360,0,12,31,-1,0,06:00,2,24,-1,0,-7:00
-1698,America/Guatemala,1983,Guat,-360,60,5,21,-1,0,-6:00,9,22,-1,0,-7:00
-1699,America/Guatemala,1991,Guat,-360,60,3,23,-1,0,-6:00,9,7,-1,0,-7:00
-1700,America/Guatemala,2006,Guat,-360,60,4,30,-1,0,-6:00,10,1,-1,0,-7:00
-1701,America/Guatemala,2007,Guat,-360,0,4,30,-1,0,-6:00,10,1,-1,0,-7:00
-1702,America/Port-au-Prince,1970,Haiti,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-1703,America/Port-au-Prince,1983,Haiti,-300,60,5,8,-1,0,-5:00,10,-1,0,0,-6:00
-1704,America/Port-au-Prince,1984,Haiti,-300,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
-1705,America/Port-au-Prince,1988,Haiti,-300,60,4,1,0,0,-4:00,10,-1,0,0,-4:00
-1706,America/Port-au-Prince,2005,Haiti,-300,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
-1707,America/Port-au-Prince,2006,Haiti,-300,0,4,1,0,0,-5:00,10,-1,0,0,-6:00
-1708,America/Tegucigalpa,1970,Hond,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
-1709,America/Tegucigalpa,1987,Hond,-360,60,5,1,0,0,-6:00,9,-1,0,0,-7:00
-1710,America/Tegucigalpa,2006,Hond,-360,60,5,1,0,0,-6:00,8,1,1,0,-7:00
-1711,America/Tegucigalpa,2007,Hond,-360,0,5,1,0,0,-6:00,8,1,1,0,-7:00
-1712,America/Jamaica,1970,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-1713,America/Jamaica,1974,US,-300,60,1,6,-1,0,-3:00,10,-1,0,0,-4:00
-1714,America/Jamaica,1975,US,-300,60,2,23,-1,0,-3:00,10,-1,0,0,-4:00
-1715,America/Jamaica,1976,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
-1716,America/Jamaica,1984,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-1717,America/Martinique,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-1718,America/Martinique,1980,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-1719,America/Montserrat,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-1720,America/Managua,1970,,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
-1721,America/Managua,1973,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-1722,America/Managua,1975,Nic,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
-1723,America/Managua,1979,Nic,-360,60,3,16,0,0,-6:00,6,23,1,0,-7:00
-1724,America/Managua,1992,,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
-1725,America/Managua,1993,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-1726,America/Managua,1997,Nic,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
-1727,America/Managua,2005,Nic,-360,60,4,10,-1,0,-6:00,10,1,0,0,-7:00
-1728,America/Managua,2006,Nic,-360,60,4,30,-1,0,-4:00,10,1,0,0,-6:00
-1729,America/Managua,2007,Nic,-360,0,4,30,-1,0,-4:00,10,1,0,0,-6:00
-1730,America/Panama,1970,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-1731,America/Puerto_Rico,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-1732,America/St_Kitts,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-1733,America/St_Lucia,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-1734,America/Miquelon,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-1735,America/Miquelon,1980,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1736,America/Miquelon,1987,Canada,-180,60,4,1,0,0,-1:00,10,-1,0,0,-2:00
-1737,America/Miquelon,2007,Canada,-180,60,3,8,0,0,-1:00,11,1,0,0,-2:00
-1738,America/St_Vincent,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-1739,America/Grand_Turk,1970,TC,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-1740,America/Grand_Turk,1979,TC,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
-1741,America/Grand_Turk,1987,TC,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
-1742,America/Grand_Turk,2007,TC,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
-1743,America/Tortola,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-1744,America/St_Thomas,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-1745,America/Argentina/Buenos_Aires,1970,Arg,-180,0,12,31,-1,0,09:00,4,1,0,0,-4:00
-1746,America/Argentina/Buenos_Aires,1974,Arg,-180,60,1,23,-1,0,-3:00,5,1,-1,0,-4:00
-1747,America/Argentina/Buenos_Aires,1988,Arg,-180,60,12,1,-1,0,-3:00,1,1,-1,0,08:00
-1748,America/Argentina/Buenos_Aires,1989,Arg,-180,60,10,15,0,0,-3:00,3,1,0,0,-4:00
-1749,America/Argentina/Buenos_Aires,1993,Arg,-180,0,12,31,-1,0,09:00,3,1,0,0,-4:00
-1750,America/Argentina/Buenos_Aires,1999,Arg,-240,60,10,1,0,0,-4:00,1,1,-1,0,07:00
-1751,America/Argentina/Buenos_Aires,2000,Arg,-180,0,12,31,-1,0,09:00,3,3,-1,0,-4:00
-1752,America/Argentina/Buenos_Aires,2007,Arg,-180,60,12,30,-1,0,-3:00,1,1,-1,0,08:00
-1753,America/Argentina/Buenos_Aires,2008,Arg,-180,60,10,15,0,0,-3:00,3,15,0,0,-4:00
-1754,America/Argentina/Buenos_Aires,2009,Arg,-180,0,12,31,-1,0,09:00,3,15,0,0,-4:00
-1755,America/Argentina/Cordoba,1970,Arg,-180,0,12,31,-1,0,09:00,4,1,0,0,-4:00
-1756,America/Argentina/Cordoba,1974,Arg,-180,60,1,23,-1,0,-3:00,5,1,-1,0,-4:00
-1757,America/Argentina/Cordoba,1988,Arg,-180,60,12,1,-1,0,-3:00,1,1,-1,0,08:00
-1758,America/Argentina/Cordoba,1989,Arg,-180,60,10,15,0,0,-3:00,3,1,0,0,-4:00
-1759,America/Argentina/Cordoba,1993,Arg,-180,0,12,31,-1,0,09:00,3,1,0,0,-4:00
-1760,America/Argentina/Cordoba,1999,Arg,-240,60,10,1,0,0,-4:00,1,1,-1,0,07:00
-1761,America/Argentina/Cordoba,2000,Arg,-180,0,12,31,-1,0,09:00,3,3,-1,0,-4:00
-1762,America/Argentina/Cordoba,2007,Arg,-180,60,12,30,-1,0,-3:00,1,1,-1,0,08:00
-1763,America/Argentina/Cordoba,2008,Arg,-180,60,10,15,0,0,-3:00,3,15,0,0,-4:00
-1764,America/Argentina/Cordoba,2009,Arg,-180,0,12,31,-1,0,09:00,3,15,0,0,-4:00
-1765,America/Argentina/Salta,1970,Arg,-180,0,12,31,-1,0,09:00,4,1,0,0,-4:00
-1766,America/Argentina/Salta,1974,Arg,-180,60,1,23,-1,0,-3:00,5,1,-1,0,-4:00
-1767,America/Argentina/Salta,1988,Arg,-180,60,12,1,-1,0,-3:00,1,1,-1,0,08:00
-1768,America/Argentina/Salta,1989,Arg,-180,60,10,15,0,0,-3:00,3,1,0,0,-4:00
-1769,America/Argentina/Salta,1993,Arg,-180,0,12,31,-1,0,09:00,3,1,0,0,-4:00
-1770,America/Argentina/Salta,1999,Arg,-240,60,10,1,0,0,-4:00,1,1,-1,0,07:00
-1771,America/Argentina/Salta,2000,Arg,-180,0,12,31,-1,0,09:00,3,3,-1,0,-4:00
-1772,America/Argentina/Salta,2007,Arg,-180,60,12,30,-1,0,-3:00,1,1,-1,0,08:00
-1773,America/Argentina/Salta,2008,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1774,America/Argentina/Tucuman,1970,Arg,-180,0,12,31,-1,0,09:00,4,1,0,0,-4:00
-1775,America/Argentina/Tucuman,1974,Arg,-180,60,1,23,-1,0,-3:00,5,1,-1,0,-4:00
-1776,America/Argentina/Tucuman,1988,Arg,-180,60,12,1,-1,0,-3:00,1,1,-1,0,08:00
-1777,America/Argentina/Tucuman,1989,Arg,-180,60,10,15,0,0,-3:00,3,1,0,0,-4:00
-1778,America/Argentina/Tucuman,1993,Arg,-180,0,12,31,-1,0,09:00,3,1,0,0,-4:00
-1779,America/Argentina/Tucuman,1999,Arg,-240,60,10,1,0,0,-4:00,1,1,-1,0,07:00
-1780,America/Argentina/Tucuman,2000,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1781,America/Argentina/Tucuman,2004,Arg,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1782,America/Argentina/Tucuman,2007,Arg,-180,60,12,30,-1,0,-3:00,1,1,-1,0,08:00
-1783,America/Argentina/Tucuman,2008,Arg,-180,60,10,15,0,0,-3:00,3,15,0,0,-4:00
-1784,America/Argentina/Tucuman,2009,Arg,-180,0,12,31,-1,0,09:00,3,15,0,0,-4:00
-1785,America/Argentina/La_Rioja,1970,Arg,-180,0,12,31,-1,0,09:00,4,1,0,0,-4:00
-1786,America/Argentina/La_Rioja,1974,Arg,-180,60,1,23,-1,0,-3:00,5,1,-1,0,-4:00
-1787,America/Argentina/La_Rioja,1988,Arg,-180,60,12,1,-1,0,-3:00,1,1,-1,0,08:00
-1788,America/Argentina/La_Rioja,1989,Arg,-180,60,10,15,0,0,-3:00,3,1,0,0,-4:00
-1789,America/Argentina/La_Rioja,1993,Arg,-180,0,12,31,-1,0,09:00,3,1,0,0,-4:00
-1790,America/Argentina/La_Rioja,1999,Arg,-240,60,10,1,0,0,-4:00,1,1,-1,0,07:00
-1791,America/Argentina/La_Rioja,2000,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1792,America/Argentina/La_Rioja,2004,Arg,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1793,America/Argentina/La_Rioja,2007,Arg,-180,60,12,30,-1,0,-3:00,1,1,-1,0,08:00
-1794,America/Argentina/La_Rioja,2008,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1795,America/Argentina/San_Juan,1970,Arg,-180,0,12,31,-1,0,09:00,4,1,0,0,-4:00
-1796,America/Argentina/San_Juan,1974,Arg,-180,60,1,23,-1,0,-3:00,5,1,-1,0,-4:00
-1797,America/Argentina/San_Juan,1988,Arg,-180,60,12,1,-1,0,-3:00,1,1,-1,0,08:00
-1798,America/Argentina/San_Juan,1989,Arg,-180,60,10,15,0,0,-3:00,3,1,0,0,-4:00
-1799,America/Argentina/San_Juan,1993,Arg,-180,0,12,31,-1,0,09:00,3,1,0,0,-4:00
-1800,America/Argentina/San_Juan,1999,Arg,-240,60,10,1,0,0,-4:00,1,1,-1,0,07:00
-1801,America/Argentina/San_Juan,2000,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1802,America/Argentina/San_Juan,2004,Arg,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1803,America/Argentina/San_Juan,2007,Arg,-180,60,12,30,-1,0,-3:00,1,1,-1,0,08:00
-1804,America/Argentina/San_Juan,2008,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1805,America/Argentina/Jujuy,1970,Arg,-180,0,12,31,-1,0,09:00,4,1,0,0,-4:00
-1806,America/Argentina/Jujuy,1974,Arg,-180,60,1,23,-1,0,-3:00,5,1,-1,0,-4:00
-1807,America/Argentina/Jujuy,1988,Arg,-180,60,12,1,-1,0,-3:00,1,1,-1,0,08:00
-1808,America/Argentina/Jujuy,1989,Arg,-180,60,10,15,0,0,-3:00,3,1,0,0,-4:00
-1809,America/Argentina/Jujuy,1990,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-1810,America/Argentina/Jujuy,1991,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1811,America/Argentina/Jujuy,1992,Arg,-180,60,10,15,0,0,-3:00,3,1,0,0,-4:00
-1812,America/Argentina/Jujuy,1993,Arg,-180,0,12,31,-1,0,09:00,3,1,0,0,-4:00
-1813,America/Argentina/Jujuy,1999,Arg,-240,60,10,1,0,0,-4:00,1,1,-1,0,07:00
-1814,America/Argentina/Jujuy,2000,Arg,-180,0,12,31,-1,0,09:00,3,3,-1,0,-4:00
-1815,America/Argentina/Jujuy,2007,Arg,-180,60,12,30,-1,0,-3:00,1,1,-1,0,08:00
-1816,America/Argentina/Jujuy,2008,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1817,America/Argentina/Catamarca,1970,Arg,-180,0,12,31,-1,0,09:00,4,1,0,0,-4:00
-1818,America/Argentina/Catamarca,1974,Arg,-180,60,1,23,-1,0,-3:00,5,1,-1,0,-4:00
-1819,America/Argentina/Catamarca,1988,Arg,-180,60,12,1,-1,0,-3:00,1,1,-1,0,08:00
-1820,America/Argentina/Catamarca,1989,Arg,-180,60,10,15,0,0,-3:00,3,1,0,0,-4:00
-1821,America/Argentina/Catamarca,1993,Arg,-180,0,12,31,-1,0,09:00,3,1,0,0,-4:00
-1822,America/Argentina/Catamarca,1999,Arg,-240,60,10,1,0,0,-4:00,1,1,-1,0,07:00
-1823,America/Argentina/Catamarca,2000,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1824,America/Argentina/Catamarca,2004,Arg,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1825,America/Argentina/Catamarca,2007,Arg,-180,60,12,30,-1,0,-3:00,1,1,-1,0,08:00
-1826,America/Argentina/Catamarca,2008,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1827,America/Argentina/Mendoza,1970,Arg,-180,0,12,31,-1,0,09:00,4,1,0,0,-4:00
-1828,America/Argentina/Mendoza,1974,Arg,-180,60,1,23,-1,0,-3:00,5,1,-1,0,-4:00
-1829,America/Argentina/Mendoza,1988,Arg,-180,60,12,1,-1,0,-3:00,1,1,-1,0,08:00
-1830,America/Argentina/Mendoza,1989,Arg,-180,60,10,15,0,0,-3:00,3,1,0,0,-4:00
-1831,America/Argentina/Mendoza,1990,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-1832,America/Argentina/Mendoza,1992,Arg,-180,60,10,15,0,0,-3:00,3,1,0,0,-4:00
-1833,America/Argentina/Mendoza,1993,Arg,-180,0,12,31,-1,0,09:00,3,1,0,0,-4:00
-1834,America/Argentina/Mendoza,1999,Arg,-240,60,10,1,0,0,-4:00,1,1,-1,0,07:00
-1835,America/Argentina/Mendoza,2000,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1836,America/Argentina/Mendoza,2004,Arg,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1837,America/Argentina/Mendoza,2007,Arg,-180,60,12,30,-1,0,-3:00,1,1,-1,0,08:00
-1838,America/Argentina/Mendoza,2008,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1839,America/Argentina/San_Luis,1970,Arg,-180,0,12,31,-1,0,09:00,4,1,0,0,-4:00
-1840,America/Argentina/San_Luis,1974,Arg,-180,60,1,23,-1,0,-3:00,5,1,-1,0,-4:00
-1841,America/Argentina/San_Luis,1988,Arg,-180,60,12,1,-1,0,-3:00,1,1,-1,0,08:00
-1842,America/Argentina/San_Luis,1989,Arg,-180,60,10,15,0,0,-3:00,3,1,0,0,-4:00
-1843,America/Argentina/San_Luis,1990,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-1844,America/Argentina/San_Luis,1991,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1845,America/Argentina/San_Luis,1999,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-1846,America/Argentina/San_Luis,2000,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1847,America/Argentina/San_Luis,2004,Arg,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1848,America/Argentina/San_Luis,2007,Arg,-180,60,12,30,-1,0,-3:00,1,1,-1,0,08:00
-1849,America/Argentina/San_Luis,2008,SanLuis,-240,60,10,8,0,0,-4:00,3,8,0,0,-5:00
-1850,America/Argentina/Rio_Gallegos,1970,Arg,-180,0,12,31,-1,0,09:00,4,1,0,0,-4:00
-1851,America/Argentina/Rio_Gallegos,1974,Arg,-180,60,1,23,-1,0,-3:00,5,1,-1,0,-4:00
-1852,America/Argentina/Rio_Gallegos,1988,Arg,-180,60,12,1,-1,0,-3:00,1,1,-1,0,08:00
-1853,America/Argentina/Rio_Gallegos,1989,Arg,-180,60,10,15,0,0,-3:00,3,1,0,0,-4:00
-1854,America/Argentina/Rio_Gallegos,1993,Arg,-180,0,12,31,-1,0,09:00,3,1,0,0,-4:00
-1855,America/Argentina/Rio_Gallegos,1999,Arg,-240,60,10,1,0,0,-4:00,1,1,-1,0,07:00
-1856,America/Argentina/Rio_Gallegos,2000,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1857,America/Argentina/Rio_Gallegos,2004,Arg,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1858,America/Argentina/Rio_Gallegos,2007,Arg,-180,60,12,30,-1,0,-3:00,1,1,-1,0,08:00
-1859,America/Argentina/Rio_Gallegos,2008,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1860,America/Argentina/Ushuaia,1970,Arg,-180,0,12,31,-1,0,09:00,4,1,0,0,-4:00
-1861,America/Argentina/Ushuaia,1974,Arg,-180,60,1,23,-1,0,-3:00,5,1,-1,0,-4:00
-1862,America/Argentina/Ushuaia,1988,Arg,-180,60,12,1,-1,0,-3:00,1,1,-1,0,08:00
-1863,America/Argentina/Ushuaia,1989,Arg,-180,60,10,15,0,0,-3:00,3,1,0,0,-4:00
-1864,America/Argentina/Ushuaia,1993,Arg,-180,0,12,31,-1,0,09:00,3,1,0,0,-4:00
-1865,America/Argentina/Ushuaia,1999,Arg,-240,60,10,1,0,0,-4:00,1,1,-1,0,07:00
-1866,America/Argentina/Ushuaia,2000,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1867,America/Argentina/Ushuaia,2004,Arg,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1868,America/Argentina/Ushuaia,2007,Arg,-180,60,12,30,-1,0,-3:00,1,1,-1,0,08:00
-1869,America/Argentina/Ushuaia,2008,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1870,America/Aruba,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-1871,America/La_Paz,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-1872,America/Noronha,1970,Brazil,-120,0,12,31,-1,0,10:00,3,1,-1,0,-3:00
-1873,America/Noronha,1985,Brazil,-120,60,11,2,-1,0,-2:00,1,1,-1,0,09:00
-1874,America/Noronha,1986,Brazil,-120,60,10,25,-1,0,-2:00,3,15,-1,0,-3:00
-1875,America/Noronha,1987,Brazil,-120,60,10,25,-1,0,-2:00,2,14,-1,0,-3:00
-1876,America/Noronha,1988,Brazil,-120,60,10,16,-1,0,-2:00,2,7,-1,0,-3:00
-1877,America/Noronha,1989,Brazil,-120,60,10,15,-1,0,-2:00,1,29,-1,0,-3:00
-1878,America/Noronha,1990,,-120,0,0,0,0,0,00:00,0,0,0,0,00:00
-1879,America/Noronha,1999,Brazil,-120,60,10,3,-1,0,-2:00,2,21,-1,0,-3:00
-1880,America/Noronha,2000,,-120,0,0,0,0,0,00:00,0,0,0,0,00:00
-1881,America/Noronha,2001,Brazil,-120,60,10,8,0,0,-2:00,2,15,0,0,-3:00
-1882,America/Noronha,2002,,-120,0,0,0,0,0,00:00,0,0,0,0,00:00
-1883,America/Belem,1970,Brazil,-180,0,12,31,-1,0,09:00,3,1,-1,0,-4:00
-1884,America/Belem,1985,Brazil,-180,60,11,2,-1,0,-3:00,1,1,-1,0,08:00
-1885,America/Belem,1986,Brazil,-180,60,10,25,-1,0,-3:00,3,15,-1,0,-4:00
-1886,America/Belem,1987,Brazil,-180,60,10,25,-1,0,-3:00,2,14,-1,0,-4:00
-1887,America/Belem,1988,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1888,America/Santarem,1970,Brazil,-240,0,12,31,-1,0,08:00,3,1,-1,0,-5:00
-1889,America/Santarem,1985,Brazil,-240,60,11,2,-1,0,-4:00,1,1,-1,0,07:00
-1890,America/Santarem,1986,Brazil,-240,60,10,25,-1,0,-4:00,3,15,-1,0,-5:00
-1891,America/Santarem,1987,Brazil,-240,60,10,25,-1,0,-4:00,2,14,-1,0,-5:00
-1892,America/Santarem,1988,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-1893,America/Santarem,2008,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1894,America/Fortaleza,1970,Brazil,-180,0,12,31,-1,0,09:00,3,1,-1,0,-4:00
-1895,America/Fortaleza,1985,Brazil,-180,60,11,2,-1,0,-3:00,1,1,-1,0,08:00
-1896,America/Fortaleza,1986,Brazil,-180,60,10,25,-1,0,-3:00,3,15,-1,0,-4:00
-1897,America/Fortaleza,1987,Brazil,-180,60,10,25,-1,0,-3:00,2,14,-1,0,-4:00
-1898,America/Fortaleza,1988,Brazil,-180,60,10,16,-1,0,-3:00,2,7,-1,0,-4:00
-1899,America/Fortaleza,1989,Brazil,-180,60,10,15,-1,0,-3:00,1,29,-1,0,-4:00
-1900,America/Fortaleza,1990,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1901,America/Fortaleza,1999,Brazil,-180,60,10,3,-1,0,-3:00,2,21,-1,0,-4:00
-1902,America/Fortaleza,2000,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1903,America/Fortaleza,2001,Brazil,-180,60,10,8,0,0,-3:00,2,15,0,0,-4:00
-1904,America/Fortaleza,2002,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1905,America/Recife,1970,Brazil,-180,0,12,31,-1,0,09:00,3,1,-1,0,-4:00
-1906,America/Recife,1985,Brazil,-180,60,11,2,-1,0,-3:00,1,1,-1,0,08:00
-1907,America/Recife,1986,Brazil,-180,60,10,25,-1,0,-3:00,3,15,-1,0,-4:00
-1908,America/Recife,1987,Brazil,-180,60,10,25,-1,0,-3:00,2,14,-1,0,-4:00
-1909,America/Recife,1988,Brazil,-180,60,10,16,-1,0,-3:00,2,7,-1,0,-4:00
-1910,America/Recife,1989,Brazil,-180,60,10,15,-1,0,-3:00,1,29,-1,0,-4:00
-1911,America/Recife,1990,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1912,America/Recife,1999,Brazil,-180,60,10,3,-1,0,-3:00,2,21,-1,0,-4:00
-1913,America/Recife,2000,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1914,America/Recife,2001,Brazil,-180,60,10,8,0,0,-3:00,2,15,0,0,-4:00
-1915,America/Recife,2002,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1916,America/Araguaina,1970,Brazil,-180,0,12,31,-1,0,09:00,3,1,-1,0,-4:00
-1917,America/Araguaina,1985,Brazil,-180,60,11,2,-1,0,-3:00,1,1,-1,0,08:00
-1918,America/Araguaina,1986,Brazil,-180,60,10,25,-1,0,-3:00,3,15,-1,0,-4:00
-1919,America/Araguaina,1987,Brazil,-180,60,10,25,-1,0,-3:00,2,14,-1,0,-4:00
-1920,America/Araguaina,1988,Brazil,-180,60,10,16,-1,0,-3:00,2,7,-1,0,-4:00
-1921,America/Araguaina,1989,Brazil,-180,60,10,15,-1,0,-3:00,1,29,-1,0,-4:00
-1922,America/Araguaina,1990,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1923,America/Araguaina,1995,Brazil,-180,60,10,11,0,0,-3:00,2,15,0,0,-4:00
-1924,America/Araguaina,1996,Brazil,-180,60,10,6,-1,0,-3:00,2,11,-1,0,-4:00
-1925,America/Araguaina,1997,Brazil,-180,60,10,6,-1,0,-3:00,2,16,-1,0,-4:00
-1926,America/Araguaina,1998,Brazil,-180,60,10,11,-1,0,-3:00,3,1,-1,0,-4:00
-1927,America/Araguaina,1999,Brazil,-180,60,10,3,-1,0,-3:00,2,21,-1,0,-4:00
-1928,America/Araguaina,2000,Brazil,-180,60,10,8,0,0,-3:00,2,27,-1,0,-4:00
-1929,America/Araguaina,2001,Brazil,-180,60,10,8,0,0,-3:00,2,15,0,0,-4:00
-1930,America/Araguaina,2002,Brazil,-180,60,11,3,-1,0,-3:00,2,15,0,0,-4:00
-1931,America/Araguaina,2003,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1932,America/Maceio,1970,Brazil,-180,0,12,31,-1,0,09:00,3,1,-1,0,-4:00
-1933,America/Maceio,1985,Brazil,-180,60,11,2,-1,0,-3:00,1,1,-1,0,08:00
-1934,America/Maceio,1986,Brazil,-180,60,10,25,-1,0,-3:00,3,15,-1,0,-4:00
-1935,America/Maceio,1987,Brazil,-180,60,10,25,-1,0,-3:00,2,14,-1,0,-4:00
-1936,America/Maceio,1988,Brazil,-180,60,10,16,-1,0,-3:00,2,7,-1,0,-4:00
-1937,America/Maceio,1989,Brazil,-180,60,10,15,-1,0,-3:00,1,29,-1,0,-4:00
-1938,America/Maceio,1990,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1939,America/Maceio,1995,Brazil,-180,60,10,11,0,0,-3:00,2,15,0,0,-4:00
-1940,America/Maceio,1996,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1941,America/Maceio,1999,Brazil,-180,60,10,3,-1,0,-3:00,2,21,-1,0,-4:00
-1942,America/Maceio,2000,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1943,America/Maceio,2001,Brazil,-180,60,10,8,0,0,-3:00,2,15,0,0,-4:00
-1944,America/Maceio,2002,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1945,America/Bahia,1970,Brazil,-180,0,12,31,-1,0,09:00,3,1,-1,0,-4:00
-1946,America/Bahia,1985,Brazil,-180,60,11,2,-1,0,-3:00,1,1,-1,0,08:00
-1947,America/Bahia,1986,Brazil,-180,60,10,25,-1,0,-3:00,3,15,-1,0,-4:00
-1948,America/Bahia,1987,Brazil,-180,60,10,25,-1,0,-3:00,2,14,-1,0,-4:00
-1949,America/Bahia,1988,Brazil,-180,60,10,16,-1,0,-3:00,2,7,-1,0,-4:00
-1950,America/Bahia,1989,Brazil,-180,60,10,15,-1,0,-3:00,1,29,-1,0,-4:00
-1951,America/Bahia,1990,Brazil,-180,60,10,21,-1,0,-3:00,2,11,-1,0,-4:00
-1952,America/Bahia,1991,Brazil,-180,60,10,20,-1,0,-3:00,2,17,-1,0,-4:00
-1953,America/Bahia,1992,Brazil,-180,60,10,25,-1,0,-3:00,2,9,-1,0,-4:00
-1954,America/Bahia,1993,Brazil,-180,60,10,11,0,0,-3:00,1,31,-1,0,-4:00
-1955,America/Bahia,1994,Brazil,-180,60,10,11,0,0,-3:00,2,15,0,0,-4:00
-1956,America/Bahia,1996,Brazil,-180,60,10,6,-1,0,-3:00,2,11,-1,0,-4:00
-1957,America/Bahia,1997,Brazil,-180,60,10,6,-1,0,-3:00,2,16,-1,0,-4:00
-1958,America/Bahia,1998,Brazil,-180,60,10,11,-1,0,-3:00,3,1,-1,0,-4:00
-1959,America/Bahia,1999,Brazil,-180,60,10,3,-1,0,-3:00,2,21,-1,0,-4:00
-1960,America/Bahia,2000,Brazil,-180,60,10,8,0,0,-3:00,2,27,-1,0,-4:00
-1961,America/Bahia,2001,Brazil,-180,60,10,8,0,0,-3:00,2,15,0,0,-4:00
-1962,America/Bahia,2002,Brazil,-180,60,11,3,-1,0,-3:00,2,15,0,0,-4:00
-1963,America/Bahia,2003,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-1964,America/Sao_Paulo,1970,Brazil,-180,0,12,31,-1,0,09:00,3,1,-1,0,-4:00
-1965,America/Sao_Paulo,1985,Brazil,-180,60,11,2,-1,0,-3:00,1,1,-1,0,08:00
-1966,America/Sao_Paulo,1986,Brazil,-180,60,10,25,-1,0,-3:00,3,15,-1,0,-4:00
-1967,America/Sao_Paulo,1987,Brazil,-180,60,10,25,-1,0,-3:00,2,14,-1,0,-4:00
-1968,America/Sao_Paulo,1988,Brazil,-180,60,10,16,-1,0,-3:00,2,7,-1,0,-4:00
-1969,America/Sao_Paulo,1989,Brazil,-180,60,10,15,-1,0,-3:00,1,29,-1,0,-4:00
-1970,America/Sao_Paulo,1990,Brazil,-180,60,10,21,-1,0,-3:00,2,11,-1,0,-4:00
-1971,America/Sao_Paulo,1991,Brazil,-180,60,10,20,-1,0,-3:00,2,17,-1,0,-4:00
-1972,America/Sao_Paulo,1992,Brazil,-180,60,10,25,-1,0,-3:00,2,9,-1,0,-4:00
-1973,America/Sao_Paulo,1993,Brazil,-180,60,10,11,0,0,-3:00,1,31,-1,0,-4:00
-1974,America/Sao_Paulo,1994,Brazil,-180,60,10,11,0,0,-3:00,2,15,0,0,-4:00
-1975,America/Sao_Paulo,1996,Brazil,-180,60,10,6,-1,0,-3:00,2,11,-1,0,-4:00
-1976,America/Sao_Paulo,1997,Brazil,-180,60,10,6,-1,0,-3:00,2,16,-1,0,-4:00
-1977,America/Sao_Paulo,1998,Brazil,-180,60,10,11,-1,0,-3:00,3,1,-1,0,-4:00
-1978,America/Sao_Paulo,1999,Brazil,-180,60,10,3,-1,0,-3:00,2,21,-1,0,-4:00
-1979,America/Sao_Paulo,2000,Brazil,-180,60,10,8,0,0,-3:00,2,27,-1,0,-4:00
-1980,America/Sao_Paulo,2001,Brazil,-180,60,10,8,0,0,-3:00,2,15,0,0,-4:00
-1981,America/Sao_Paulo,2002,Brazil,-180,60,11,3,-1,0,-3:00,2,15,0,0,-4:00
-1982,America/Sao_Paulo,2003,Brazil,-180,60,10,19,-1,0,-3:00,2,15,0,0,-4:00
-1983,America/Sao_Paulo,2004,Brazil,-180,60,11,2,-1,0,-3:00,2,15,0,0,-4:00
-1984,America/Sao_Paulo,2005,Brazil,-180,60,10,16,-1,0,-3:00,2,15,0,0,-4:00
-1985,America/Sao_Paulo,2006,Brazil,-180,60,11,5,-1,0,-3:00,2,15,0,0,-4:00
-1986,America/Sao_Paulo,2007,Brazil,-180,60,10,8,0,0,-3:00,2,25,-1,0,-4:00
-1987,America/Sao_Paulo,2008,Brazil,-180,60,10,15,0,0,-3:00,2,15,0,0,-4:00
-1988,America/Sao_Paulo,2012,Brazil,-180,60,10,15,0,0,-3:00,2,22,0,0,-4:00
-1989,America/Sao_Paulo,2013,Brazil,-180,60,10,15,0,0,-3:00,2,15,0,0,-4:00
-1990,America/Sao_Paulo,2015,Brazil,-180,60,10,15,0,0,-3:00,2,22,0,0,-4:00
-1991,America/Sao_Paulo,2016,Brazil,-180,60,10,15,0,0,-3:00,2,15,0,0,-4:00
-1992,America/Campo_Grande,1970,Brazil,-240,0,12,31,-1,0,08:00,3,1,-1,0,-5:00
-1993,America/Campo_Grande,1985,Brazil,-240,60,11,2,-1,0,-4:00,1,1,-1,0,07:00
-1994,America/Campo_Grande,1986,Brazil,-240,60,10,25,-1,0,-4:00,3,15,-1,0,-5:00
-1995,America/Campo_Grande,1987,Brazil,-240,60,10,25,-1,0,-4:00,2,14,-1,0,-5:00
-1996,America/Campo_Grande,1988,Brazil,-240,60,10,16,-1,0,-4:00,2,7,-1,0,-5:00
-1997,America/Campo_Grande,1989,Brazil,-240,60,10,15,-1,0,-4:00,1,29,-1,0,-5:00
-1998,America/Campo_Grande,1990,Brazil,-240,60,10,21,-1,0,-4:00,2,11,-1,0,-5:00
-1999,America/Campo_Grande,1991,Brazil,-240,60,10,20,-1,0,-4:00,2,17,-1,0,-5:00
-2000,America/Campo_Grande,1992,Brazil,-240,60,10,25,-1,0,-4:00,2,9,-1,0,-5:00
-2001,America/Campo_Grande,1993,Brazil,-240,60,10,11,0,0,-4:00,1,31,-1,0,-5:00
-2002,America/Campo_Grande,1994,Brazil,-240,60,10,11,0,0,-4:00,2,15,0,0,-5:00
-2003,America/Campo_Grande,1996,Brazil,-240,60,10,6,-1,0,-4:00,2,11,-1,0,-5:00
-2004,America/Campo_Grande,1997,Brazil,-240,60,10,6,-1,0,-4:00,2,16,-1,0,-5:00
-2005,America/Campo_Grande,1998,Brazil,-240,60,10,11,-1,0,-4:00,3,1,-1,0,-5:00
-2006,America/Campo_Grande,1999,Brazil,-240,60,10,3,-1,0,-4:00,2,21,-1,0,-5:00
-2007,America/Campo_Grande,2000,Brazil,-240,60,10,8,0,0,-4:00,2,27,-1,0,-5:00
-2008,America/Campo_Grande,2001,Brazil,-240,60,10,8,0,0,-4:00,2,15,0,0,-5:00
-2009,America/Campo_Grande,2002,Brazil,-240,60,11,3,-1,0,-4:00,2,15,0,0,-5:00
-2010,America/Campo_Grande,2003,Brazil,-240,60,10,19,-1,0,-4:00,2,15,0,0,-5:00
-2011,America/Campo_Grande,2004,Brazil,-240,60,11,2,-1,0,-4:00,2,15,0,0,-5:00
-2012,America/Campo_Grande,2005,Brazil,-240,60,10,16,-1,0,-4:00,2,15,0,0,-5:00
-2013,America/Campo_Grande,2006,Brazil,-240,60,11,5,-1,0,-4:00,2,15,0,0,-5:00
-2014,America/Campo_Grande,2007,Brazil,-240,60,10,8,0,0,-4:00,2,25,-1,0,-5:00
-2015,America/Campo_Grande,2008,Brazil,-240,60,10,15,0,0,-4:00,2,15,0,0,-5:00
-2016,America/Campo_Grande,2012,Brazil,-240,60,10,15,0,0,-4:00,2,22,0,0,-5:00
-2017,America/Campo_Grande,2013,Brazil,-240,60,10,15,0,0,-4:00,2,15,0,0,-5:00
-2018,America/Campo_Grande,2015,Brazil,-240,60,10,15,0,0,-4:00,2,22,0,0,-5:00
-2019,America/Campo_Grande,2016,Brazil,-240,60,10,15,0,0,-4:00,2,15,0,0,-5:00
-2020,America/Cuiaba,1970,Brazil,-240,0,12,31,-1,0,08:00,3,1,-1,0,-5:00
-2021,America/Cuiaba,1985,Brazil,-240,60,11,2,-1,0,-4:00,1,1,-1,0,07:00
-2022,America/Cuiaba,1986,Brazil,-240,60,10,25,-1,0,-4:00,3,15,-1,0,-5:00
-2023,America/Cuiaba,1987,Brazil,-240,60,10,25,-1,0,-4:00,2,14,-1,0,-5:00
-2024,America/Cuiaba,1988,Brazil,-240,60,10,16,-1,0,-4:00,2,7,-1,0,-5:00
-2025,America/Cuiaba,1989,Brazil,-240,60,10,15,-1,0,-4:00,1,29,-1,0,-5:00
-2026,America/Cuiaba,1990,Brazil,-240,60,10,21,-1,0,-4:00,2,11,-1,0,-5:00
-2027,America/Cuiaba,1991,Brazil,-240,60,10,20,-1,0,-4:00,2,17,-1,0,-5:00
-2028,America/Cuiaba,1992,Brazil,-240,60,10,25,-1,0,-4:00,2,9,-1,0,-5:00
-2029,America/Cuiaba,1993,Brazil,-240,60,10,11,0,0,-4:00,1,31,-1,0,-5:00
-2030,America/Cuiaba,1994,Brazil,-240,60,10,11,0,0,-4:00,2,15,0,0,-5:00
-2031,America/Cuiaba,1996,Brazil,-240,60,10,6,-1,0,-4:00,2,11,-1,0,-5:00
-2032,America/Cuiaba,1997,Brazil,-240,60,10,6,-1,0,-4:00,2,16,-1,0,-5:00
-2033,America/Cuiaba,1998,Brazil,-240,60,10,11,-1,0,-4:00,3,1,-1,0,-5:00
-2034,America/Cuiaba,1999,Brazil,-240,60,10,3,-1,0,-4:00,2,21,-1,0,-5:00
-2035,America/Cuiaba,2000,Brazil,-240,60,10,8,0,0,-4:00,2,27,-1,0,-5:00
-2036,America/Cuiaba,2001,Brazil,-240,60,10,8,0,0,-4:00,2,15,0,0,-5:00
-2037,America/Cuiaba,2002,Brazil,-240,60,11,3,-1,0,-4:00,2,15,0,0,-5:00
-2038,America/Cuiaba,2003,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-2039,America/Cuiaba,2004,Brazil,-240,60,11,2,-1,0,-4:00,2,15,0,0,-5:00
-2040,America/Cuiaba,2005,Brazil,-240,60,10,16,-1,0,-4:00,2,15,0,0,-5:00
-2041,America/Cuiaba,2006,Brazil,-240,60,11,5,-1,0,-4:00,2,15,0,0,-5:00
-2042,America/Cuiaba,2007,Brazil,-240,60,10,8,0,0,-4:00,2,25,-1,0,-5:00
-2043,America/Cuiaba,2008,Brazil,-240,60,10,15,0,0,-4:00,2,15,0,0,-5:00
-2044,America/Cuiaba,2012,Brazil,-240,60,10,15,0,0,-4:00,2,22,0,0,-5:00
-2045,America/Cuiaba,2013,Brazil,-240,60,10,15,0,0,-4:00,2,15,0,0,-5:00
-2046,America/Cuiaba,2015,Brazil,-240,60,10,15,0,0,-4:00,2,22,0,0,-5:00
-2047,America/Cuiaba,2016,Brazil,-240,60,10,15,0,0,-4:00,2,15,0,0,-5:00
-2048,America/Porto_Velho,1970,Brazil,-240,0,12,31,-1,0,08:00,3,1,-1,0,-5:00
-2049,America/Porto_Velho,1985,Brazil,-240,60,11,2,-1,0,-4:00,1,1,-1,0,07:00
-2050,America/Porto_Velho,1986,Brazil,-240,60,10,25,-1,0,-4:00,3,15,-1,0,-5:00
-2051,America/Porto_Velho,1987,Brazil,-240,60,10,25,-1,0,-4:00,2,14,-1,0,-5:00
-2052,America/Porto_Velho,1988,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-2053,America/Boa_Vista,1970,Brazil,-240,0,12,31,-1,0,08:00,3,1,-1,0,-5:00
-2054,America/Boa_Vista,1985,Brazil,-240,60,11,2,-1,0,-4:00,1,1,-1,0,07:00
-2055,America/Boa_Vista,1986,Brazil,-240,60,10,25,-1,0,-4:00,3,15,-1,0,-5:00
-2056,America/Boa_Vista,1987,Brazil,-240,60,10,25,-1,0,-4:00,2,14,-1,0,-5:00
-2057,America/Boa_Vista,1988,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-2058,America/Boa_Vista,1999,Brazil,-240,60,10,3,-1,0,-4:00,2,21,-1,0,-5:00
-2059,America/Boa_Vista,2000,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-2060,America/Manaus,1970,Brazil,-240,0,12,31,-1,0,08:00,3,1,-1,0,-5:00
-2061,America/Manaus,1985,Brazil,-240,60,11,2,-1,0,-4:00,1,1,-1,0,07:00
-2062,America/Manaus,1986,Brazil,-240,60,10,25,-1,0,-4:00,3,15,-1,0,-5:00
-2063,America/Manaus,1987,Brazil,-240,60,10,25,-1,0,-4:00,2,14,-1,0,-5:00
-2064,America/Manaus,1988,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-2065,America/Manaus,1993,Brazil,-240,60,10,11,0,0,-4:00,1,31,-1,0,-5:00
-2066,America/Manaus,1994,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-2067,America/Eirunepe,1970,Brazil,-300,0,12,31,-1,0,07:00,3,1,-1,0,-6:00
-2068,America/Eirunepe,1985,Brazil,-300,60,11,2,-1,0,-5:00,1,1,-1,0,06:00
-2069,America/Eirunepe,1986,Brazil,-300,60,10,25,-1,0,-5:00,3,15,-1,0,-6:00
-2070,America/Eirunepe,1987,Brazil,-300,60,10,25,-1,0,-5:00,2,14,-1,0,-6:00
-2071,America/Eirunepe,1988,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-2072,America/Eirunepe,1993,Brazil,-300,60,10,11,0,0,-5:00,1,31,-1,0,-6:00
-2073,America/Eirunepe,1994,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-2074,America/Eirunepe,2008,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-2075,America/Rio_Branco,1970,Brazil,-300,0,12,31,-1,0,07:00,3,1,-1,0,-6:00
-2076,America/Rio_Branco,1985,Brazil,-300,60,11,2,-1,0,-5:00,1,1,-1,0,06:00
-2077,America/Rio_Branco,1986,Brazil,-300,60,10,25,-1,0,-5:00,3,15,-1,0,-6:00
-2078,America/Rio_Branco,1987,Brazil,-300,60,10,25,-1,0,-5:00,2,14,-1,0,-6:00
-2079,America/Rio_Branco,1988,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-2080,America/Rio_Branco,2008,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-2081,America/Santiago,1970,Chile,-240,60,10,9,0,0,4:00,3,29,-1,0,3:00
-2082,America/Santiago,1971,Chile,-240,60,10,9,0,0,4:00,3,14,-1,0,3:00
-2083,America/Santiago,1972,Chile,-240,60,10,9,0,0,4:00,3,9,0,0,3:00
-2084,America/Santiago,1973,Chile,-240,60,9,30,-1,0,4:00,3,9,0,0,3:00
-2085,America/Santiago,1974,Chile,-240,60,10,9,0,0,4:00,3,9,0,0,3:00
-2086,America/Santiago,1987,Chile,-240,60,10,9,0,0,4:00,4,12,-1,0,3:00
-2087,America/Santiago,1988,Chile,-240,60,10,1,0,0,4:00,3,9,0,0,3:00
-2088,America/Santiago,1989,Chile,-240,60,10,9,0,0,4:00,3,9,0,0,3:00
-2089,America/Santiago,1990,Chile,-240,60,9,16,-1,0,4:00,3,18,-1,0,3:00
-2090,America/Santiago,1991,Chile,-240,60,10,9,0,0,4:00,3,9,0,0,3:00
-2091,America/Santiago,1997,Chile,-240,60,10,9,0,0,4:00,3,30,-1,0,3:00
-2092,America/Santiago,1998,Chile,-240,60,9,27,-1,0,4:00,3,9,0,0,3:00
-2093,America/Santiago,1999,Chile,-240,60,10,9,0,0,4:00,4,4,-1,0,3:00
-2094,America/Santiago,2000,Chile,-240,60,10,9,0,0,4:00,3,9,0,0,3:00
-2095,America/Santiago,2008,Chile,-240,60,10,9,0,0,4:00,3,30,-1,0,3:00
-2096,America/Santiago,2009,Chile,-240,60,10,9,0,0,4:00,3,9,0,0,3:00
-2097,America/Santiago,2010,Chile,-240,60,10,9,0,0,4:00,4,1,0,0,3:00
-2098,America/Santiago,2011,Chile,-240,60,8,16,0,0,4:00,5,2,0,0,3:00
-2099,America/Santiago,2012,Chile,-240,60,10,9,0,0,4:00,3,9,0,0,3:00
-2100,Pacific/Easter,1970,Chile,-420,60,10,9,0,0,4:00,3,29,-1,0,3:00
-2101,Pacific/Easter,1971,Chile,-420,60,10,9,0,0,4:00,3,14,-1,0,3:00
-2102,Pacific/Easter,1972,Chile,-420,60,10,9,0,0,4:00,3,9,0,0,3:00
-2103,Pacific/Easter,1973,Chile,-420,60,9,30,-1,0,4:00,3,9,0,0,3:00
-2104,Pacific/Easter,1974,Chile,-420,60,10,9,0,0,4:00,3,9,0,0,3:00
-2105,Pacific/Easter,1982,Chile,-360,60,10,9,0,0,4:00,3,9,0,0,3:00
-2106,Pacific/Easter,1987,Chile,-360,60,10,9,0,0,4:00,4,12,-1,0,3:00
-2107,Pacific/Easter,1988,Chile,-360,60,10,1,0,0,4:00,3,9,0,0,3:00
-2108,Pacific/Easter,1989,Chile,-360,60,10,9,0,0,4:00,3,9,0,0,3:00
-2109,Pacific/Easter,1990,Chile,-360,60,9,16,-1,0,4:00,3,18,-1,0,3:00
-2110,Pacific/Easter,1991,Chile,-360,60,10,9,0,0,4:00,3,9,0,0,3:00
-2111,Pacific/Easter,1997,Chile,-360,60,10,9,0,0,4:00,3,30,-1,0,3:00
-2112,Pacific/Easter,1998,Chile,-360,60,9,27,-1,0,4:00,3,9,0,0,3:00
-2113,Pacific/Easter,1999,Chile,-360,60,10,9,0,0,4:00,4,4,-1,0,3:00
-2114,Pacific/Easter,2000,Chile,-360,60,10,9,0,0,4:00,3,9,0,0,3:00
-2115,Pacific/Easter,2008,Chile,-360,60,10,9,0,0,4:00,3,30,-1,0,3:00
-2116,Pacific/Easter,2009,Chile,-360,60,10,9,0,0,4:00,3,9,0,0,3:00
-2117,Pacific/Easter,2010,Chile,-360,60,10,9,0,0,4:00,4,1,0,0,3:00
-2118,Pacific/Easter,2011,Chile,-360,60,8,16,0,0,4:00,5,2,0,0,3:00
-2119,Pacific/Easter,2012,Chile,-360,60,10,9,0,0,4:00,3,9,0,0,3:00
-2120,America/Bogota,1970,CO,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-2121,America/Bogota,1992,CO,-300,60,5,3,-1,0,-5:00,1,1,-1,0,06:00
-2122,America/Bogota,1993,CO,-300,0,12,31,-1,0,07:00,4,4,-1,0,-6:00
-2123,America/Curacao,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-2124,America/Guayaquil,1970,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-2125,Pacific/Galapagos,1970,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
-2126,Pacific/Galapagos,1986,,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
-2127,Atlantic/Stanley,1970,Falk,-240,0,12,31,-1,0,08:00,1,1,-1,0,-5:00
-2128,Atlantic/Stanley,1983,Falk,-180,60,9,-1,0,0,-3:00,1,1,-1,0,08:00
-2129,Atlantic/Stanley,1984,Falk,-180,60,9,16,-1,0,-3:00,4,-1,0,0,-4:00
-2130,Atlantic/Stanley,1985,Falk,-240,60,9,9,0,0,-4:00,4,-1,0,0,-5:00
-2131,Atlantic/Stanley,1986,Falk,-240,60,9,9,0,0,-4:00,4,16,0,0,-5:00
-2132,Atlantic/Stanley,2001,Falk,-240,60,9,1,0,0,-2:00,4,15,0,0,-3:00
-2133,Atlantic/Stanley,2011,Falk,-240,60,9,1,0,0,-2:00,1,1,-1,0,07:00
-2134,Atlantic/Stanley,2012,Falk,-240,60,9,1,0,0,-2:00,4,15,0,0,-3:00
-2135,America/Cayenne,1970,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-2136,America/Guyana,1970,,-225,0,0,0,0,0,00:00,0,0,0,0,00:00
-2137,America/Guyana,1975,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-2138,America/Guyana,1991,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-2139,America/Asuncion,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-2140,America/Asuncion,1972,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-2141,America/Asuncion,1974,Para,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-2142,America/Asuncion,1975,Para,-240,60,10,1,-1,0,-4:00,3,1,-1,0,-5:00
-2143,America/Asuncion,1979,Para,-240,60,10,1,-1,0,-4:00,4,1,-1,0,-5:00
-2144,America/Asuncion,1989,Para,-240,60,10,22,-1,0,-4:00,4,1,-1,0,-5:00
-2145,America/Asuncion,1990,Para,-240,60,10,1,-1,0,-4:00,4,1,-1,0,-5:00
-2146,America/Asuncion,1991,Para,-240,60,10,6,-1,0,-4:00,4,1,-1,0,-5:00
-2147,America/Asuncion,1992,Para,-240,60,10,5,-1,0,-4:00,3,1,-1,0,-5:00
-2148,America/Asuncion,1993,Para,-240,60,10,1,-1,0,-4:00,3,31,-1,0,-5:00
-2149,America/Asuncion,1994,Para,-240,60,10,1,-1,0,-4:00,2,-1,0,0,-5:00
-2150,America/Asuncion,1996,Para,-240,60,10,1,0,0,-4:00,3,1,-1,0,-5:00
-2151,America/Asuncion,1997,Para,-240,60,10,1,0,0,-4:00,2,-1,0,0,-5:00
-2152,America/Asuncion,1998,Para,-240,60,10,1,0,0,-4:00,3,1,0,0,-5:00
-2153,America/Asuncion,2002,Para,-240,60,9,1,0,0,-4:00,4,1,0,0,-5:00
-2154,America/Asuncion,2004,Para,-240,60,10,15,0,0,-4:00,4,1,0,0,-5:00
-2155,America/Asuncion,2005,Para,-240,60,10,15,0,0,-4:00,3,8,0,0,-5:00
-2156,America/Asuncion,2010,Para,-240,60,10,1,0,0,-4:00,4,8,0,0,-5:00
-2157,America/Lima,1970,Peru,-300,0,12,31,-1,0,07:00,3,24,0,0,-6:00
-2158,America/Lima,1986,Peru,-300,60,1,1,-1,0,-5:00,4,1,-1,0,-6:00
-2159,America/Lima,1995,Peru,-300,0,1,1,-1,0,-5:00,4,1,-1,0,-6:00
-2160,Atlantic/South_Georgia,1970,,-120,0,0,0,0,0,00:00,0,0,0,0,00:00
-2161,America/Paramaribo,1970,,-210,0,0,0,0,0,00:00,0,0,0,0,00:00
-2162,America/Paramaribo,1975,,-210,0,0,0,0,0,00:00,0,0,0,0,00:00
-2163,America/Paramaribo,1984,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
-2164,America/Port_of_Spain,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-2165,America/Montevideo,1970,Uruguay,-180,30,5,27,-1,0,-3:00,12,2,-1,0,-4:00
-2166,America/Montevideo,1972,Uruguay,-180,60,4,24,-1,0,-3:00,8,15,-1,0,-4:00
-2167,America/Montevideo,1974,Uruguay,-180,60,12,22,-1,0,-3:00,1,1,-1,0,08:00
-2168,America/Montevideo,1976,Uruguay,-180,0,12,31,-1,0,09:00,10,1,-1,0,-4:00
-2169,America/Montevideo,1977,Uruguay,-180,60,12,4,-1,0,-3:00,1,1,-1,0,08:00
-2170,America/Montevideo,1978,Uruguay,-180,0,12,31,-1,0,09:00,4,1,-1,0,-4:00
-2171,America/Montevideo,1979,Uruguay,-180,60,10,1,-1,0,-3:00,1,1,-1,0,08:00
-2172,America/Montevideo,1980,Uruguay,-180,0,12,31,-1,0,09:00,5,1,-1,0,-4:00
-2173,America/Montevideo,1987,Uruguay,-180,60,12,14,-1,0,-3:00,1,1,-1,0,08:00
-2174,America/Montevideo,1988,Uruguay,-180,60,12,11,-1,0,-3:00,3,14,-1,0,-4:00
-2175,America/Montevideo,1989,Uruguay,-180,60,10,29,-1,0,-3:00,3,12,-1,0,-4:00
-2176,America/Montevideo,1990,Uruguay,-180,60,10,21,0,0,-3:00,3,1,0,0,-4:00
-2177,America/Montevideo,1992,Uruguay,-180,60,10,18,-1,0,-3:00,3,1,0,0,-4:00
-2178,America/Montevideo,1993,Uruguay,-180,0,12,31,-1,0,09:00,2,28,-1,0,-4:00
-2179,America/Montevideo,2004,Uruguay,-180,60,9,19,-1,0,-3:00,1,1,-1,0,08:00
-2180,America/Montevideo,2005,Uruguay,-180,60,10,9,-1,0,-1:00,3,27,-1,0,-2:00
-2181,America/Montevideo,2006,Uruguay,-180,60,10,1,0,0,-1:00,3,12,-1,0,-2:00
-2182,America/Montevideo,2007,Uruguay,-180,60,10,1,0,0,-1:00,3,8,0,0,-2:00
-2183,America/Caracas,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
-2184,America/Caracas,2007,,-270,0,0,0,0,0,00:00,0,0,0,0,00:00
+1051,Europe/Kaliningrad,2011,,180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1052,Europe/Moscow,1970,Russia,180,60,9,1,-1,0,03:00,10,1,-1,0,02:00
+1053,Europe/Moscow,1981,Russia,180,60,4,1,-1,0,03:00,10,1,-1,0,02:00
+1054,Europe/Moscow,1984,Russia,180,60,4,1,-1,0,03:00,9,-1,0,0,05:00
+1055,Europe/Moscow,1985,Russia,180,60,3,-1,0,0,05:00,9,-1,0,0,05:00
+1056,Europe/Moscow,1991,Russia,120,60,3,-1,0,0,04:00,9,-1,0,0,04:00
+1057,Europe/Moscow,1992,Russia,180,60,3,-1,6,0,26:00,9,-1,6,0,25:00
+1058,Europe/Moscow,1993,Russia,180,60,3,-1,0,0,05:00,9,-1,0,0,05:00
+1059,Europe/Moscow,1996,Russia,180,60,3,-1,0,0,05:00,10,-1,0,0,05:00
+1060,Europe/Moscow,2011,,240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1061,Europe/Volgograd,1970,Russia,240,60,9,1,-1,0,04:00,10,1,-1,0,03:00
+1062,Europe/Volgograd,1981,Russia,240,60,4,1,-1,0,04:00,10,1,-1,0,03:00
+1063,Europe/Volgograd,1984,Russia,240,60,4,1,-1,0,04:00,9,-1,0,0,06:00
+1064,Europe/Volgograd,1985,Russia,240,60,3,-1,0,0,06:00,9,-1,0,0,06:00
+1065,Europe/Volgograd,1989,Russia,180,60,3,-1,0,0,05:00,9,-1,0,0,05:00
+1066,Europe/Volgograd,1991,,240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1067,Europe/Volgograd,1992,Russia,180,60,3,-1,6,0,26:00,9,-1,6,0,25:00
+1068,Europe/Volgograd,1993,Russia,180,60,3,-1,0,0,05:00,9,-1,0,0,05:00
+1069,Europe/Volgograd,1996,Russia,180,60,3,-1,0,0,05:00,10,-1,0,0,05:00
+1070,Europe/Volgograd,2011,,240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1071,Europe/Samara,1970,Russia,240,60,9,1,-1,0,04:00,10,1,-1,0,03:00
+1072,Europe/Samara,1981,Russia,240,60,4,1,-1,0,04:00,10,1,-1,0,03:00
+1073,Europe/Samara,1984,Russia,240,60,4,1,-1,0,04:00,9,-1,0,0,06:00
+1074,Europe/Samara,1985,Russia,240,60,3,-1,0,0,06:00,9,-1,0,0,06:00
+1075,Europe/Samara,1989,Russia,180,60,3,-1,0,0,05:00,9,-1,0,0,05:00
+1076,Europe/Samara,1991,Russia,240,60,3,-1,0,0,06:00,9,-1,0,0,06:00
+1077,Europe/Samara,1992,Russia,240,60,3,-1,6,0,27:00,9,-1,6,0,26:00
+1078,Europe/Samara,1993,Russia,240,60,3,-1,0,0,06:00,9,-1,0,0,06:00
+1079,Europe/Samara,1996,Russia,240,60,3,-1,0,0,06:00,10,-1,0,0,06:00
+1080,Europe/Samara,2010,Russia,180,60,3,-1,0,0,05:00,10,-1,0,0,05:00
+1081,Europe/Samara,2011,,240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1082,Asia/Yekaterinburg,1970,Russia,300,60,9,1,-1,0,05:00,10,1,-1,0,04:00
+1083,Asia/Yekaterinburg,1981,Russia,300,60,4,1,-1,0,05:00,10,1,-1,0,04:00
+1084,Asia/Yekaterinburg,1984,Russia,300,60,4,1,-1,0,05:00,9,-1,0,0,07:00
+1085,Asia/Yekaterinburg,1985,Russia,300,60,3,-1,0,0,07:00,9,-1,0,0,07:00
+1086,Asia/Yekaterinburg,1991,Russia,240,60,3,-1,0,0,06:00,9,-1,0,0,06:00
+1087,Asia/Yekaterinburg,1992,Russia,300,60,3,-1,6,0,28:00,9,-1,6,0,27:00
+1088,Asia/Yekaterinburg,1993,Russia,300,60,3,-1,0,0,07:00,9,-1,0,0,07:00
+1089,Asia/Yekaterinburg,1996,Russia,300,60,3,-1,0,0,07:00,10,-1,0,0,07:00
+1090,Asia/Yekaterinburg,2011,,360,0,0,0,0,0,00:00,0,0,0,0,00:00
+1091,Asia/Omsk,1970,Russia,360,60,9,1,-1,0,06:00,10,1,-1,0,05:00
+1092,Asia/Omsk,1981,Russia,360,60,4,1,-1,0,06:00,10,1,-1,0,05:00
+1093,Asia/Omsk,1984,Russia,360,60,4,1,-1,0,06:00,9,-1,0,0,08:00
+1094,Asia/Omsk,1985,Russia,360,60,3,-1,0,0,08:00,9,-1,0,0,08:00
+1095,Asia/Omsk,1991,Russia,300,60,3,-1,0,0,07:00,9,-1,0,0,07:00
+1096,Asia/Omsk,1992,Russia,360,60,3,-1,6,0,29:00,9,-1,6,0,28:00
+1097,Asia/Omsk,1993,Russia,360,60,3,-1,0,0,08:00,9,-1,0,0,08:00
+1098,Asia/Omsk,1996,Russia,360,60,3,-1,0,0,08:00,10,-1,0,0,08:00
+1099,Asia/Omsk,2011,,420,0,0,0,0,0,00:00,0,0,0,0,00:00
+1100,Asia/Novosibirsk,1970,Russia,420,60,9,1,-1,0,07:00,10,1,-1,0,06:00
+1101,Asia/Novosibirsk,1981,Russia,420,60,4,1,-1,0,07:00,10,1,-1,0,06:00
+1102,Asia/Novosibirsk,1984,Russia,420,60,4,1,-1,0,07:00,9,-1,0,0,09:00
+1103,Asia/Novosibirsk,1985,Russia,420,60,3,-1,0,0,09:00,9,-1,0,0,09:00
+1104,Asia/Novosibirsk,1991,Russia,360,60,3,-1,0,0,08:00,9,-1,0,0,08:00
+1105,Asia/Novosibirsk,1992,Russia,420,60,3,-1,6,0,30:00,9,-1,6,0,29:00
+1106,Asia/Novosibirsk,1993,Russia,360,60,3,-1,0,0,08:00,9,-1,0,0,08:00
+1107,Asia/Novosibirsk,1996,Russia,360,60,3,-1,0,0,08:00,10,-1,0,0,08:00
+1108,Asia/Novosibirsk,2011,,420,0,0,0,0,0,00:00,0,0,0,0,00:00
+1109,Asia/Novokuznetsk,1970,Russia,420,60,9,1,-1,0,07:00,10,1,-1,0,06:00
+1110,Asia/Novokuznetsk,1981,Russia,420,60,4,1,-1,0,07:00,10,1,-1,0,06:00
+1111,Asia/Novokuznetsk,1984,Russia,420,60,4,1,-1,0,07:00,9,-1,0,0,09:00
+1112,Asia/Novokuznetsk,1985,Russia,420,60,3,-1,0,0,09:00,9,-1,0,0,09:00
+1113,Asia/Novokuznetsk,1991,Russia,360,60,3,-1,0,0,08:00,9,-1,0,0,08:00
+1114,Asia/Novokuznetsk,1992,Russia,420,60,3,-1,6,0,30:00,9,-1,6,0,29:00
+1115,Asia/Novokuznetsk,1993,Russia,420,60,3,-1,0,0,09:00,9,-1,0,0,09:00
+1116,Asia/Novokuznetsk,1996,Russia,420,60,3,-1,0,0,09:00,10,-1,0,0,09:00
+1117,Asia/Novokuznetsk,2010,Russia,360,60,3,-1,0,0,08:00,10,-1,0,0,08:00
+1118,Asia/Novokuznetsk,2011,,420,0,0,0,0,0,00:00,0,0,0,0,00:00
+1119,Asia/Krasnoyarsk,1970,Russia,420,60,9,1,-1,0,07:00,10,1,-1,0,06:00
+1120,Asia/Krasnoyarsk,1981,Russia,420,60,4,1,-1,0,07:00,10,1,-1,0,06:00
+1121,Asia/Krasnoyarsk,1984,Russia,420,60,4,1,-1,0,07:00,9,-1,0,0,09:00
+1122,Asia/Krasnoyarsk,1985,Russia,420,60,3,-1,0,0,09:00,9,-1,0,0,09:00
+1123,Asia/Krasnoyarsk,1991,Russia,360,60,3,-1,0,0,08:00,9,-1,0,0,08:00
+1124,Asia/Krasnoyarsk,1992,Russia,420,60,3,-1,6,0,30:00,9,-1,6,0,29:00
+1125,Asia/Krasnoyarsk,1993,Russia,420,60,3,-1,0,0,09:00,9,-1,0,0,09:00
+1126,Asia/Krasnoyarsk,1996,Russia,420,60,3,-1,0,0,09:00,10,-1,0,0,09:00
+1127,Asia/Krasnoyarsk,2011,,480,0,0,0,0,0,00:00,0,0,0,0,00:00
+1128,Asia/Irkutsk,1970,Russia,480,60,9,1,-1,0,08:00,10,1,-1,0,07:00
+1129,Asia/Irkutsk,1981,Russia,480,60,4,1,-1,0,08:00,10,1,-1,0,07:00
+1130,Asia/Irkutsk,1984,Russia,480,60,4,1,-1,0,08:00,9,-1,0,0,10:00
+1131,Asia/Irkutsk,1985,Russia,480,60,3,-1,0,0,10:00,9,-1,0,0,10:00
+1132,Asia/Irkutsk,1991,Russia,420,60,3,-1,0,0,09:00,9,-1,0,0,09:00
+1133,Asia/Irkutsk,1992,Russia,480,60,3,-1,6,0,31:00,9,-1,6,0,30:00
+1134,Asia/Irkutsk,1993,Russia,480,60,3,-1,0,0,10:00,9,-1,0,0,10:00
+1135,Asia/Irkutsk,1996,Russia,480,60,3,-1,0,0,10:00,10,-1,0,0,10:00
+1136,Asia/Irkutsk,2011,,540,0,0,0,0,0,00:00,0,0,0,0,00:00
+1137,Asia/Yakutsk,1970,Russia,540,60,9,1,-1,0,09:00,10,1,-1,0,08:00
+1138,Asia/Yakutsk,1981,Russia,540,60,4,1,-1,0,09:00,10,1,-1,0,08:00
+1139,Asia/Yakutsk,1984,Russia,540,60,4,1,-1,0,09:00,9,-1,0,0,11:00
+1140,Asia/Yakutsk,1985,Russia,540,60,3,-1,0,0,11:00,9,-1,0,0,11:00
+1141,Asia/Yakutsk,1991,Russia,480,60,3,-1,0,0,10:00,9,-1,0,0,10:00
+1142,Asia/Yakutsk,1992,Russia,540,60,3,-1,6,0,32:00,9,-1,6,0,31:00
+1143,Asia/Yakutsk,1993,Russia,540,60,3,-1,0,0,11:00,9,-1,0,0,11:00
+1144,Asia/Yakutsk,1996,Russia,540,60,3,-1,0,0,11:00,10,-1,0,0,11:00
+1145,Asia/Yakutsk,2011,,600,0,0,0,0,0,00:00,0,0,0,0,00:00
+1146,Asia/Vladivostok,1970,Russia,600,60,9,1,-1,0,10:00,10,1,-1,0,09:00
+1147,Asia/Vladivostok,1981,Russia,600,60,4,1,-1,0,10:00,10,1,-1,0,09:00
+1148,Asia/Vladivostok,1984,Russia,600,60,4,1,-1,0,10:00,9,-1,0,0,12:00
+1149,Asia/Vladivostok,1985,Russia,600,60,3,-1,0,0,12:00,9,-1,0,0,12:00
+1150,Asia/Vladivostok,1991,Russia,540,60,3,-1,0,0,11:00,9,-1,0,0,11:00
+1151,Asia/Vladivostok,1992,Russia,600,60,3,-1,6,0,33:00,9,-1,6,0,32:00
+1152,Asia/Vladivostok,1993,Russia,600,60,3,-1,0,0,12:00,9,-1,0,0,12:00
+1153,Asia/Vladivostok,1996,Russia,600,60,3,-1,0,0,12:00,10,-1,0,0,12:00
+1154,Asia/Vladivostok,2011,,660,0,0,0,0,0,00:00,0,0,0,0,00:00
+1155,Asia/Sakhalin,1970,Russia,660,60,9,1,-1,0,11:00,10,1,-1,0,10:00
+1156,Asia/Sakhalin,1981,Russia,660,60,4,1,-1,0,11:00,10,1,-1,0,10:00
+1157,Asia/Sakhalin,1984,Russia,660,60,4,1,-1,0,11:00,9,-1,0,0,13:00
+1158,Asia/Sakhalin,1985,Russia,660,60,3,-1,0,0,13:00,9,-1,0,0,13:00
+1159,Asia/Sakhalin,1991,Russia,600,60,3,-1,0,0,12:00,9,-1,0,0,12:00
+1160,Asia/Sakhalin,1992,Russia,660,60,3,-1,6,0,34:00,9,-1,6,0,33:00
+1161,Asia/Sakhalin,1993,Russia,660,60,3,-1,0,0,13:00,9,-1,0,0,13:00
+1162,Asia/Sakhalin,1996,Russia,660,60,3,-1,0,0,13:00,10,-1,0,0,13:00
+1163,Asia/Sakhalin,1997,Russia,600,60,3,-1,0,0,12:00,10,-1,0,0,12:00
+1164,Asia/Sakhalin,2011,,660,0,0,0,0,0,00:00,0,0,0,0,00:00
+1165,Asia/Magadan,1970,Russia,660,60,9,1,-1,0,11:00,10,1,-1,0,10:00
+1166,Asia/Magadan,1981,Russia,660,60,4,1,-1,0,11:00,10,1,-1,0,10:00
+1167,Asia/Magadan,1984,Russia,660,60,4,1,-1,0,11:00,9,-1,0,0,13:00
+1168,Asia/Magadan,1985,Russia,660,60,3,-1,0,0,13:00,9,-1,0,0,13:00
+1169,Asia/Magadan,1991,Russia,600,60,3,-1,0,0,12:00,9,-1,0,0,12:00
+1170,Asia/Magadan,1992,Russia,660,60,3,-1,6,0,34:00,9,-1,6,0,33:00
+1171,Asia/Magadan,1993,Russia,660,60,3,-1,0,0,13:00,9,-1,0,0,13:00
+1172,Asia/Magadan,1996,Russia,660,60,3,-1,0,0,13:00,10,-1,0,0,13:00
+1173,Asia/Magadan,2011,,720,0,0,0,0,0,00:00,0,0,0,0,00:00
+1174,Asia/Kamchatka,1970,Russia,720,60,9,1,-1,0,12:00,10,1,-1,0,11:00
+1175,Asia/Kamchatka,1981,Russia,720,60,4,1,-1,0,12:00,10,1,-1,0,11:00
+1176,Asia/Kamchatka,1984,Russia,720,60,4,1,-1,0,12:00,9,-1,0,0,14:00
+1177,Asia/Kamchatka,1985,Russia,720,60,3,-1,0,0,14:00,9,-1,0,0,14:00
+1178,Asia/Kamchatka,1991,Russia,660,60,3,-1,0,0,13:00,9,-1,0,0,13:00
+1179,Asia/Kamchatka,1992,Russia,720,60,3,-1,6,0,35:00,9,-1,6,0,34:00
+1180,Asia/Kamchatka,1993,Russia,720,60,3,-1,0,0,14:00,9,-1,0,0,14:00
+1181,Asia/Kamchatka,1996,Russia,720,60,3,-1,0,0,14:00,10,-1,0,0,14:00
+1182,Asia/Kamchatka,2010,Russia,660,60,3,-1,0,0,13:00,10,-1,0,0,13:00
+1183,Asia/Kamchatka,2011,,720,0,0,0,0,0,00:00,0,0,0,0,00:00
+1184,Asia/Anadyr,1970,Russia,780,60,9,1,-1,0,13:00,10,1,-1,0,12:00
+1185,Asia/Anadyr,1981,Russia,780,60,4,1,-1,0,13:00,10,1,-1,0,12:00
+1186,Asia/Anadyr,1982,Russia,720,60,4,1,-1,0,12:00,10,1,-1,0,11:00
+1187,Asia/Anadyr,1984,Russia,720,60,4,1,-1,0,12:00,9,-1,0,0,14:00
+1188,Asia/Anadyr,1985,Russia,720,60,3,-1,0,0,14:00,9,-1,0,0,14:00
+1189,Asia/Anadyr,1991,Russia,660,60,3,-1,0,0,13:00,9,-1,0,0,13:00
+1190,Asia/Anadyr,1992,Russia,720,60,3,-1,6,0,35:00,9,-1,6,0,34:00
+1191,Asia/Anadyr,1993,Russia,720,60,3,-1,0,0,14:00,9,-1,0,0,14:00
+1192,Asia/Anadyr,1996,Russia,720,60,3,-1,0,0,14:00,10,-1,0,0,14:00
+1193,Asia/Anadyr,2010,Russia,660,60,3,-1,0,0,13:00,10,-1,0,0,13:00
+1194,Asia/Anadyr,2011,,720,0,0,0,0,0,00:00,0,0,0,0,00:00
+1195,Europe/Belgrade,1970,,60,0,0,0,0,0,00:00,0,0,0,0,00:00
+1196,Europe/Belgrade,1982,EU,60,60,3,-1,0,0,1:00,9,-1,0,0,1:00
+1197,Europe/Belgrade,1996,EU,60,60,3,-1,0,0,1:00,10,-1,0,0,1:00
+1198,Europe/Madrid,1970,Spain,60,60,4,30,-1,0,24:00,9,30,-1,0,01:00
+1199,Europe/Madrid,1974,Spain,60,60,4,13,6,0,24:00,10,1,0,0,01:00
+1200,Europe/Madrid,1976,Spain,60,60,3,27,-1,0,24:00,9,-1,0,0,01:00
+1201,Europe/Madrid,1977,Spain,60,60,4,2,-1,0,24:00,9,-1,0,0,01:00
+1202,Europe/Madrid,1978,Spain,60,60,4,2,-1,0,24:00,10,1,-1,0,01:00
+1203,Europe/Madrid,1979,EU,60,60,4,1,0,0,1:00,9,-1,0,0,1:00
+1204,Europe/Madrid,1981,EU,60,60,3,-1,0,0,1:00,9,-1,0,0,1:00
+1205,Europe/Madrid,1996,EU,60,60,3,-1,0,0,1:00,10,-1,0,0,1:00
+1206,Africa/Ceuta,1970,SpainAfrica,0,60,6,3,-1,0,12:00,10,1,-1,0,-1:00
+1207,Africa/Ceuta,1974,SpainAfrica,0,60,6,24,-1,0,00:00,9,1,-1,0,-1:00
+1208,Africa/Ceuta,1976,SpainAfrica,0,60,5,1,-1,0,00:00,8,1,-1,0,-1:00
+1209,Africa/Ceuta,1977,SpainAfrica,0,60,5,1,-1,0,00:00,9,28,-1,0,-1:00
+1210,Africa/Ceuta,1978,SpainAfrica,0,60,6,1,-1,0,00:00,8,4,-1,0,-1:00
+1211,Africa/Ceuta,1979,SpainAfrica,0,0,6,1,-1,0,00:00,8,4,-1,0,-1:00
+1212,Africa/Ceuta,1984,,60,0,0,0,0,0,00:00,0,0,0,0,00:00
+1213,Africa/Ceuta,1986,EU,60,60,3,-1,0,0,1:00,9,-1,0,0,1:00
+1214,Africa/Ceuta,1996,EU,60,60,3,-1,0,0,1:00,10,-1,0,0,1:00
+1215,Atlantic/Canary,1970,,0,0,0,0,0,0,00:00,0,0,0,0,00:00
+1216,Atlantic/Canary,1980,EU,0,60,4,1,0,0,1:00,9,-1,0,0,1:00
+1217,Atlantic/Canary,1981,EU,0,60,3,-1,0,0,1:00,9,-1,0,0,1:00
+1218,Atlantic/Canary,1996,EU,0,60,3,-1,0,0,1:00,10,-1,0,0,1:00
+1219,Europe/Stockholm,1970,,60,0,0,0,0,0,00:00,0,0,0,0,00:00
+1220,Europe/Stockholm,1980,EU,60,60,4,1,0,0,1:00,9,-1,0,0,1:00
+1221,Europe/Stockholm,1981,EU,60,60,3,-1,0,0,1:00,9,-1,0,0,1:00
+1222,Europe/Stockholm,1996,EU,60,60,3,-1,0,0,1:00,10,-1,0,0,1:00
+1223,Europe/Zurich,1970,Swiss,60,0,5,1,1,0,02:00,10,1,1,0,02:00
+1224,Europe/Zurich,1981,EU,60,60,3,-1,0,0,1:00,9,-1,0,0,1:00
+1225,Europe/Zurich,1996,EU,60,60,3,-1,0,0,1:00,10,-1,0,0,1:00
+1226,Europe/Istanbul,1970,Turkey,120,60,5,2,0,0,02:00,10,2,0,0,01:00
+1227,Europe/Istanbul,1973,Turkey,120,60,6,3,-1,0,03:00,11,4,-1,0,04:00
+1228,Europe/Istanbul,1974,Turkey,120,60,3,31,-1,0,04:00,11,3,-1,0,06:00
+1229,Europe/Istanbul,1975,Turkey,120,60,3,30,-1,0,02:00,10,-1,0,0,01:00
+1230,Europe/Istanbul,1976,Turkey,120,60,6,1,-1,0,02:00,10,-1,0,0,01:00
+1231,Europe/Istanbul,1977,Turkey,120,60,4,1,0,0,02:00,10,16,-1,0,01:00
+1232,Europe/Istanbul,1978,Turkey,180,60,4,1,0,0,03:00,1,1,-1,0,14:00
+1233,Europe/Istanbul,1979,Turkey,180,60,4,1,0,0,06:00,10,11,1,0,02:00
+1234,Europe/Istanbul,1981,Turkey,180,60,3,-1,0,0,06:00,10,11,1,0,02:00
+1235,Europe/Istanbul,1983,Turkey,180,60,7,31,-1,0,03:00,10,2,-1,0,02:00
+1236,Europe/Istanbul,1985,Turkey,120,60,4,20,-1,0,02:00,9,28,-1,0,01:00
+1237,Europe/Istanbul,1986,Turkey,120,60,3,-1,0,0,04:00,9,-1,0,0,04:00
+1238,Europe/Istanbul,1991,Turkey,120,60,3,-1,0,0,03:00,9,-1,0,0,03:00
+1239,Europe/Istanbul,1996,Turkey,120,60,3,-1,0,0,03:00,10,-1,0,0,03:00
+1240,Europe/Istanbul,2006,Turkey,120,0,3,-1,0,0,03:00,10,-1,0,0,03:00
+1241,Europe/Istanbul,2007,EU,120,0,3,-1,0,0,03:00,10,-1,0,0,03:00
+1242,Europe/Kiev,1970,Russia,180,60,9,1,-1,0,03:00,10,1,-1,0,02:00
+1243,Europe/Kiev,1981,Russia,180,60,4,1,-1,0,03:00,10,1,-1,0,02:00
+1244,Europe/Kiev,1984,Russia,180,60,4,1,-1,0,03:00,9,-1,0,0,05:00
+1245,Europe/Kiev,1985,Russia,180,60,3,-1,0,0,05:00,9,-1,0,0,05:00
+1246,Europe/Kiev,1990,,120,0,0,0,0,0,00:00,0,0,0,0,00:00
+1247,Europe/Kiev,1992,E-Eur,120,60,3,-1,0,0,02:00,9,-1,0,0,01:00
+1248,Europe/Kiev,1995,EU,120,60,3,-1,0,0,1:00,9,-1,0,0,1:00
+1249,Europe/Kiev,1996,EU,120,60,3,-1,0,0,1:00,10,-1,0,0,1:00
+1250,Europe/Uzhgorod,1970,Russia,180,60,9,1,-1,0,03:00,10,1,-1,0,02:00
+1251,Europe/Uzhgorod,1981,Russia,180,60,4,1,-1,0,03:00,10,1,-1,0,02:00
+1252,Europe/Uzhgorod,1984,Russia,180,60,4,1,-1,0,03:00,9,-1,0,0,05:00
+1253,Europe/Uzhgorod,1985,Russia,180,60,3,-1,0,0,05:00,9,-1,0,0,05:00
+1254,Europe/Uzhgorod,1990,,60,0,0,0,0,0,00:00,0,0,0,0,00:00
+1255,Europe/Uzhgorod,1991,,120,0,0,0,0,0,00:00,0,0,0,0,00:00
+1256,Europe/Uzhgorod,1992,E-Eur,120,60,3,-1,0,0,02:00,9,-1,0,0,01:00
+1257,Europe/Uzhgorod,1995,EU,120,60,3,-1,0,0,1:00,9,-1,0,0,1:00
+1258,Europe/Uzhgorod,1996,EU,120,60,3,-1,0,0,1:00,10,-1,0,0,1:00
+1259,Europe/Zaporozhye,1970,Russia,180,60,9,1,-1,0,03:00,10,1,-1,0,02:00
+1260,Europe/Zaporozhye,1981,Russia,180,60,4,1,-1,0,03:00,10,1,-1,0,02:00
+1261,Europe/Zaporozhye,1984,Russia,180,60,4,1,-1,0,03:00,9,-1,0,0,05:00
+1262,Europe/Zaporozhye,1985,Russia,180,60,3,-1,0,0,05:00,9,-1,0,0,05:00
+1263,Europe/Zaporozhye,1991,E-Eur,120,60,3,-1,0,0,02:00,9,-1,0,0,01:00
+1264,Europe/Zaporozhye,1995,EU,120,60,3,-1,0,0,1:00,9,-1,0,0,1:00
+1265,Europe/Zaporozhye,1996,EU,120,60,3,-1,0,0,1:00,10,-1,0,0,1:00
+1266,Europe/Simferopol,1970,Russia,180,60,9,1,-1,0,03:00,10,1,-1,0,02:00
+1267,Europe/Simferopol,1981,Russia,180,60,4,1,-1,0,03:00,10,1,-1,0,02:00
+1268,Europe/Simferopol,1984,Russia,180,60,4,1,-1,0,03:00,9,-1,0,0,05:00
+1269,Europe/Simferopol,1985,Russia,180,60,3,-1,0,0,05:00,9,-1,0,0,05:00
+1270,Europe/Simferopol,1990,,120,0,0,0,0,0,00:00,0,0,0,0,00:00
+1271,Europe/Simferopol,1992,E-Eur,120,60,3,-1,0,0,02:00,9,-1,0,0,01:00
+1272,Europe/Simferopol,1994,E-Eur,180,60,3,-1,0,0,03:00,9,-1,0,0,02:00
+1273,Europe/Simferopol,1996,Russia,180,60,3,-1,0,0,05:00,10,-1,0,0,05:00
+1274,Europe/Simferopol,1997,EU,120,60,3,-1,0,0,04:00,10,-1,0,0,04:00
+1275,EST,1970,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+1276,MST,1970,,-420,0,0,0,0,0,00:00,0,0,0,0,00:00
+1277,HST,1970,,-600,0,0,0,0,0,00:00,0,0,0,0,00:00
+1278,EST5EDT,1970,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
+1279,EST5EDT,1974,US,-300,60,1,6,-1,0,-3:00,10,-1,0,0,-4:00
+1280,EST5EDT,1975,US,-300,60,2,23,-1,0,-3:00,10,-1,0,0,-4:00
+1281,EST5EDT,1976,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
+1282,EST5EDT,1987,US,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
+1283,EST5EDT,2007,US,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
+1284,CST6CDT,1970,US,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
+1285,CST6CDT,1974,US,-360,60,1,6,-1,0,-4:00,10,-1,0,0,-5:00
+1286,CST6CDT,1975,US,-360,60,2,23,-1,0,-4:00,10,-1,0,0,-5:00
+1287,CST6CDT,1976,US,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
+1288,CST6CDT,1987,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1289,CST6CDT,2007,US,-360,60,3,8,0,0,-4:00,11,1,0,0,-5:00
+1290,MST7MDT,1970,US,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
+1291,MST7MDT,1974,US,-420,60,1,6,-1,0,-5:00,10,-1,0,0,-6:00
+1292,MST7MDT,1975,US,-420,60,2,23,-1,0,-5:00,10,-1,0,0,-6:00
+1293,MST7MDT,1976,US,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
+1294,MST7MDT,1987,US,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
+1295,MST7MDT,2007,US,-420,60,3,8,0,0,-5:00,11,1,0,0,-6:00
+1296,PST8PDT,1970,US,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
+1297,PST8PDT,1974,US,-480,60,1,6,-1,0,-6:00,10,-1,0,0,-7:00
+1298,PST8PDT,1975,US,-480,60,2,23,-1,0,-6:00,10,-1,0,0,-7:00
+1299,PST8PDT,1976,US,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
+1300,PST8PDT,1987,US,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
+1301,PST8PDT,2007,US,-480,60,3,8,0,0,-6:00,11,1,0,0,-7:00
+1302,America/New_York,1970,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
+1303,America/New_York,1974,US,-300,60,1,6,-1,0,-3:00,10,-1,0,0,-4:00
+1304,America/New_York,1975,US,-300,60,2,23,-1,0,-3:00,10,-1,0,0,-4:00
+1305,America/New_York,1976,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
+1306,America/New_York,1987,US,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
+1307,America/New_York,2007,US,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
+1308,America/Chicago,1970,US,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
+1309,America/Chicago,1974,US,-360,60,1,6,-1,0,-4:00,10,-1,0,0,-5:00
+1310,America/Chicago,1975,US,-360,60,2,23,-1,0,-4:00,10,-1,0,0,-5:00
+1311,America/Chicago,1976,US,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
+1312,America/Chicago,1987,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1313,America/Chicago,2007,US,-360,60,3,8,0,0,-4:00,11,1,0,0,-5:00
+1314,America/North_Dakota/Center,1970,US,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
+1315,America/North_Dakota/Center,1974,US,-420,60,1,6,-1,0,-5:00,10,-1,0,0,-6:00
+1316,America/North_Dakota/Center,1975,US,-420,60,2,23,-1,0,-5:00,10,-1,0,0,-6:00
+1317,America/North_Dakota/Center,1976,US,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
+1318,America/North_Dakota/Center,1987,US,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
+1319,America/North_Dakota/Center,1992,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1320,America/North_Dakota/Center,2007,US,-360,60,3,8,0,0,-4:00,11,1,0,0,-5:00
+1321,America/North_Dakota/New_Salem,1970,US,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
+1322,America/North_Dakota/New_Salem,1974,US,-420,60,1,6,-1,0,-5:00,10,-1,0,0,-6:00
+1323,America/North_Dakota/New_Salem,1975,US,-420,60,2,23,-1,0,-5:00,10,-1,0,0,-6:00
+1324,America/North_Dakota/New_Salem,1976,US,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
+1325,America/North_Dakota/New_Salem,1987,US,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
+1326,America/North_Dakota/New_Salem,2003,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1327,America/North_Dakota/New_Salem,2007,US,-360,60,3,8,0,0,-4:00,11,1,0,0,-5:00
+1328,America/North_Dakota/Beulah,1970,US,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
+1329,America/North_Dakota/Beulah,1974,US,-420,60,1,6,-1,0,-5:00,10,-1,0,0,-6:00
+1330,America/North_Dakota/Beulah,1975,US,-420,60,2,23,-1,0,-5:00,10,-1,0,0,-6:00
+1331,America/North_Dakota/Beulah,1976,US,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
+1332,America/North_Dakota/Beulah,1987,US,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
+1333,America/North_Dakota/Beulah,2007,US,-420,60,3,8,0,0,-5:00,11,1,0,0,-6:00
+1334,America/North_Dakota/Beulah,2010,US,-360,60,3,8,0,0,-4:00,11,1,0,0,-5:00
+1335,America/Denver,1970,US,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
+1336,America/Denver,1974,US,-420,60,1,6,-1,0,-5:00,10,-1,0,0,-6:00
+1337,America/Denver,1975,US,-420,60,2,23,-1,0,-5:00,10,-1,0,0,-6:00
+1338,America/Denver,1976,US,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
+1339,America/Denver,1987,US,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
+1340,America/Denver,2007,US,-420,60,3,8,0,0,-5:00,11,1,0,0,-6:00
+1341,America/Los_Angeles,1970,US,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
+1342,America/Los_Angeles,1974,US,-480,60,1,6,-1,0,-6:00,10,-1,0,0,-7:00
+1343,America/Los_Angeles,1975,US,-480,60,2,23,-1,0,-6:00,10,-1,0,0,-7:00
+1344,America/Los_Angeles,1976,US,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
+1345,America/Los_Angeles,1987,US,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
+1346,America/Los_Angeles,2007,US,-480,60,3,8,0,0,-6:00,11,1,0,0,-7:00
+1347,America/Juneau,1970,US,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
+1348,America/Juneau,1974,US,-480,60,1,6,-1,0,-6:00,10,-1,0,0,-7:00
+1349,America/Juneau,1975,US,-480,60,2,23,-1,0,-6:00,10,-1,0,0,-7:00
+1350,America/Juneau,1976,US,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
+1351,America/Juneau,1983,US,-540,60,4,-1,0,0,-7:00,10,-1,0,0,-8:00
+1352,America/Juneau,1987,US,-540,60,4,1,0,0,-7:00,10,-1,0,0,-8:00
+1353,America/Juneau,2007,US,-540,60,3,8,0,0,-7:00,11,1,0,0,-8:00
+1354,America/Sitka,1970,US,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
+1355,America/Sitka,1974,US,-480,60,1,6,-1,0,-6:00,10,-1,0,0,-7:00
+1356,America/Sitka,1975,US,-480,60,2,23,-1,0,-6:00,10,-1,0,0,-7:00
+1357,America/Sitka,1976,US,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
+1358,America/Sitka,1983,US,-540,60,4,-1,0,0,-7:00,10,-1,0,0,-8:00
+1359,America/Sitka,1987,US,-540,60,4,1,0,0,-7:00,10,-1,0,0,-8:00
+1360,America/Sitka,2007,US,-540,60,3,8,0,0,-7:00,11,1,0,0,-8:00
+1361,America/Metlakatla,1970,US,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
+1362,America/Metlakatla,1974,US,-480,60,1,6,-1,0,-6:00,10,-1,0,0,-7:00
+1363,America/Metlakatla,1975,US,-480,60,2,23,-1,0,-6:00,10,-1,0,0,-7:00
+1364,America/Metlakatla,1976,US,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
+1365,America/Metlakatla,1987,US,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
+1366,America/Metlakatla,2007,US,-480,60,3,8,0,0,-6:00,11,1,0,0,-7:00
+1367,America/Yakutat,1970,US,-540,60,4,-1,0,0,-7:00,10,-1,0,0,-8:00
+1368,America/Yakutat,1974,US,-540,60,1,6,-1,0,-7:00,10,-1,0,0,-8:00
+1369,America/Yakutat,1975,US,-540,60,2,23,-1,0,-7:00,10,-1,0,0,-8:00
+1370,America/Yakutat,1976,US,-540,60,4,-1,0,0,-7:00,10,-1,0,0,-8:00
+1371,America/Yakutat,1987,US,-540,60,4,1,0,0,-7:00,10,-1,0,0,-8:00
+1372,America/Yakutat,2007,US,-540,60,3,8,0,0,-7:00,11,1,0,0,-8:00
+1373,America/Anchorage,1970,US,-600,60,4,-1,0,0,-8:00,10,-1,0,0,-9:00
+1374,America/Anchorage,1974,US,-600,60,1,6,-1,0,-8:00,10,-1,0,0,-9:00
+1375,America/Anchorage,1975,US,-600,60,2,23,-1,0,-8:00,10,-1,0,0,-9:00
+1376,America/Anchorage,1976,US,-600,60,4,-1,0,0,-8:00,10,-1,0,0,-9:00
+1377,America/Anchorage,1983,US,-540,60,4,-1,0,0,-7:00,10,-1,0,0,-8:00
+1378,America/Anchorage,1987,US,-540,60,4,1,0,0,-7:00,10,-1,0,0,-8:00
+1379,America/Anchorage,2007,US,-540,60,3,8,0,0,-7:00,11,1,0,0,-8:00
+1380,America/Nome,1970,US,-660,60,4,-1,0,0,-9:00,10,-1,0,0,-10:00
+1381,America/Nome,1974,US,-660,60,1,6,-1,0,-9:00,10,-1,0,0,-10:00
+1382,America/Nome,1975,US,-660,60,2,23,-1,0,-9:00,10,-1,0,0,-10:00
+1383,America/Nome,1976,US,-660,60,4,-1,0,0,-9:00,10,-1,0,0,-10:00
+1384,America/Nome,1983,US,-540,60,4,-1,0,0,-7:00,10,-1,0,0,-8:00
+1385,America/Nome,1987,US,-540,60,4,1,0,0,-7:00,10,-1,0,0,-8:00
+1386,America/Nome,2007,US,-540,60,3,8,0,0,-7:00,11,1,0,0,-8:00
+1387,America/Adak,1970,US,-660,60,4,-1,0,0,-9:00,10,-1,0,0,-10:00
+1388,America/Adak,1974,US,-660,60,1,6,-1,0,-9:00,10,-1,0,0,-10:00
+1389,America/Adak,1975,US,-660,60,2,23,-1,0,-9:00,10,-1,0,0,-10:00
+1390,America/Adak,1976,US,-660,60,4,-1,0,0,-9:00,10,-1,0,0,-10:00
+1391,America/Adak,1983,US,-600,60,4,-1,0,0,-8:00,10,-1,0,0,-9:00
+1392,America/Adak,1987,US,-600,60,4,1,0,0,-8:00,10,-1,0,0,-9:00
+1393,America/Adak,2007,US,-600,60,3,8,0,0,-8:00,11,1,0,0,-9:00
+1394,Pacific/Honolulu,1970,,-600,0,0,0,0,0,00:00,0,0,0,0,00:00
+1395,America/Phoenix,1970,,-420,0,0,0,0,0,00:00,0,0,0,0,00:00
+1396,America/Boise,1970,US,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
+1397,America/Boise,1974,US,-420,60,1,6,-1,0,-5:00,10,-1,0,0,-6:00
+1398,America/Boise,1975,US,-420,60,2,23,-1,0,-5:00,10,-1,0,0,-6:00
+1399,America/Boise,1976,US,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
+1400,America/Boise,1987,US,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
+1401,America/Boise,2007,US,-420,60,3,8,0,0,-5:00,11,1,0,0,-6:00
+1402,America/Indiana/Indianapolis,1970,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
+1403,America/Indiana/Indianapolis,1971,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+1404,America/Indiana/Indianapolis,2006,US,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
+1405,America/Indiana/Indianapolis,2007,US,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
+1406,America/Indiana/Marengo,1970,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
+1407,America/Indiana/Marengo,1974,US,-300,60,1,6,-1,0,-3:00,10,-1,0,0,-4:00
+1408,America/Indiana/Marengo,1975,US,-300,60,2,23,-1,0,-3:00,10,-1,0,0,-4:00
+1409,America/Indiana/Marengo,1976,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+1410,America/Indiana/Marengo,2006,US,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
+1411,America/Indiana/Marengo,2007,US,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
+1412,America/Indiana/Vincennes,1970,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
+1413,America/Indiana/Vincennes,1971,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+1414,America/Indiana/Vincennes,2006,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1415,America/Indiana/Vincennes,2007,US,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
+1416,America/Indiana/Tell_City,1970,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
+1417,America/Indiana/Tell_City,1971,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+1418,America/Indiana/Tell_City,2006,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1419,America/Indiana/Tell_City,2007,US,-360,60,3,8,0,0,-4:00,11,1,0,0,-5:00
+1420,America/Indiana/Petersburg,1970,US,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
+1421,America/Indiana/Petersburg,1974,US,-360,60,1,6,-1,0,-4:00,10,-1,0,0,-5:00
+1422,America/Indiana/Petersburg,1975,US,-360,60,2,23,-1,0,-4:00,10,-1,0,0,-5:00
+1423,America/Indiana/Petersburg,1976,US,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
+1424,America/Indiana/Petersburg,1977,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+1425,America/Indiana/Petersburg,2006,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1426,America/Indiana/Petersburg,2007,US,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
+1427,America/Indiana/Knox,1970,US,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
+1428,America/Indiana/Knox,1974,US,-360,60,1,6,-1,0,-4:00,10,-1,0,0,-5:00
+1429,America/Indiana/Knox,1975,US,-360,60,2,23,-1,0,-4:00,10,-1,0,0,-5:00
+1430,America/Indiana/Knox,1976,US,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
+1431,America/Indiana/Knox,1987,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1432,America/Indiana/Knox,1991,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+1433,America/Indiana/Knox,2006,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1434,America/Indiana/Knox,2007,US,-360,60,3,8,0,0,-4:00,11,1,0,0,-5:00
+1435,America/Indiana/Winamac,1970,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
+1436,America/Indiana/Winamac,1971,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+1437,America/Indiana/Winamac,2006,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1438,America/Indiana/Winamac,2007,US,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
+1439,America/Indiana/Vevay,1970,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
+1440,America/Indiana/Vevay,1973,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+1441,America/Indiana/Vevay,2006,US,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
+1442,America/Indiana/Vevay,2007,US,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
+1443,America/Kentucky/Louisville,1970,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
+1444,America/Kentucky/Louisville,1974,US,-300,60,1,6,-1,0,-3:00,10,-1,0,0,-4:00
+1445,America/Kentucky/Louisville,1975,US,-300,60,2,23,-1,0,-3:00,10,-1,0,0,-4:00
+1446,America/Kentucky/Louisville,1976,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
+1447,America/Kentucky/Louisville,1987,US,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
+1448,America/Kentucky/Louisville,2007,US,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
+1449,America/Kentucky/Monticello,1970,US,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
+1450,America/Kentucky/Monticello,1974,US,-360,60,1,6,-1,0,-4:00,10,-1,0,0,-5:00
+1451,America/Kentucky/Monticello,1975,US,-360,60,2,23,-1,0,-4:00,10,-1,0,0,-5:00
+1452,America/Kentucky/Monticello,1976,US,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
+1453,America/Kentucky/Monticello,1987,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1454,America/Kentucky/Monticello,2000,US,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
+1455,America/Kentucky/Monticello,2007,US,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
+1456,America/Detroit,1970,Detroit,-300,0,6,14,-1,0,-3:00,10,-1,0,0,-4:00
+1457,America/Detroit,1973,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
+1458,America/Detroit,1974,US,-300,60,1,6,-1,0,-3:00,10,-1,0,0,-4:00
+1459,America/Detroit,1975,US,-300,60,2,23,-1,0,-3:00,10,-1,0,0,-4:00
+1460,America/Detroit,1976,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
+1461,America/Detroit,1987,US,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
+1462,America/Detroit,2007,US,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
+1463,America/Menominee,1970,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+1464,America/Menominee,1973,US,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
+1465,America/Menominee,1974,US,-360,60,1,6,-1,0,-4:00,10,-1,0,0,-5:00
+1466,America/Menominee,1975,US,-360,60,2,23,-1,0,-4:00,10,-1,0,0,-5:00
+1467,America/Menominee,1976,US,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
+1468,America/Menominee,1987,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1469,America/Menominee,2007,US,-360,60,3,8,0,0,-4:00,11,1,0,0,-5:00
+1470,America/St_Johns,1970,StJohns,-210,60,4,-1,0,0,-1:30,10,-1,0,0,-2:30
+1471,America/St_Johns,1987,StJohns,-210,60,4,1,0,0,-3:29,10,-1,0,0,-4:29
+1472,America/St_Johns,1988,StJohns,-210,120,4,1,0,0,-3:29,10,-1,0,0,-4:29
+1473,America/St_Johns,1989,StJohns,-210,60,4,1,0,0,-3:29,10,-1,0,0,-4:29
+1474,America/St_Johns,2007,StJohns,-210,60,3,8,0,0,-3:29,11,1,0,0,-4:29
+1475,America/Goose_Bay,1970,StJohns,-240,60,4,-1,0,0,-2:00,10,-1,0,0,-3:00
+1476,America/Goose_Bay,1987,StJohns,-240,60,4,1,0,0,-3:59,10,-1,0,0,-4:59
+1477,America/Goose_Bay,1988,StJohns,-240,120,4,1,0,0,-3:59,10,-1,0,0,-4:59
+1478,America/Goose_Bay,1989,StJohns,-240,60,4,1,0,0,-3:59,10,-1,0,0,-4:59
+1479,America/Goose_Bay,2007,StJohns,-240,60,3,8,0,0,-3:59,11,1,0,0,-4:59
+1480,America/Halifax,1970,Halifax,-240,60,4,-1,0,0,-2:00,10,-1,0,0,-3:00
+1481,America/Halifax,1973,Halifax,-240,0,4,-1,0,0,-2:00,10,-1,0,0,-3:00
+1482,America/Halifax,1974,Canada,-240,60,4,-1,0,0,-2:00,10,-1,0,0,-3:00
+1483,America/Halifax,1987,Canada,-240,60,4,1,0,0,-2:00,10,-1,0,0,-3:00
+1484,America/Halifax,2007,Canada,-240,60,3,8,0,0,-2:00,11,1,0,0,-3:00
+1485,America/Glace_Bay,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1486,America/Glace_Bay,1972,Halifax,-240,60,4,-1,0,0,-2:00,10,-1,0,0,-3:00
+1487,America/Glace_Bay,1973,Halifax,-240,0,4,-1,0,0,-2:00,10,-1,0,0,-3:00
+1488,America/Glace_Bay,1974,Canada,-240,60,4,-1,0,0,-2:00,10,-1,0,0,-3:00
+1489,America/Glace_Bay,1987,Canada,-240,60,4,1,0,0,-2:00,10,-1,0,0,-3:00
+1490,America/Glace_Bay,2007,Canada,-240,60,3,8,0,0,-2:00,11,1,0,0,-3:00
+1491,America/Moncton,1970,Moncton,-240,60,4,-1,0,0,-2:00,10,-1,0,0,-3:00
+1492,America/Moncton,1973,Canada,-240,60,4,-1,0,0,-2:00,10,-1,0,0,-3:00
+1493,America/Moncton,1987,Canada,-240,60,4,1,0,0,-2:00,10,-1,0,0,-3:00
+1494,America/Moncton,1993,Moncton,-240,60,4,1,0,0,-3:59,10,-1,0,0,-4:59
+1495,America/Moncton,2006,Moncton,-240,0,4,1,0,0,-3:59,10,-1,0,0,-4:59
+1496,America/Moncton,2007,Canada,-240,60,3,8,0,0,-2:00,11,1,0,0,-3:00
+1497,America/Blanc-Sablon,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1498,America/Montreal,1970,Mont,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
+1499,America/Montreal,1974,Canada,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
+1500,America/Montreal,1987,Canada,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
+1501,America/Montreal,2007,Canada,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
+1502,America/Toronto,1970,Toronto,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
+1503,America/Toronto,1973,Toronto,-300,0,4,-1,0,0,-3:00,10,-1,0,0,-4:00
+1504,America/Toronto,1974,Canada,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
+1505,America/Toronto,1987,Canada,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
+1506,America/Toronto,2007,Canada,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
+1507,America/Thunder_Bay,1970,Mont,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
+1508,America/Thunder_Bay,1973,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+1509,America/Thunder_Bay,1974,Canada,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
+1510,America/Thunder_Bay,1987,Canada,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
+1511,America/Thunder_Bay,2007,Canada,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
+1512,America/Nipigon,1970,Canada,-300,60,8,14,-1,0,23:00,9,30,-1,0,-4:00
+1513,America/Nipigon,1974,Canada,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
+1514,America/Nipigon,1987,Canada,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
+1515,America/Nipigon,2007,Canada,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
+1516,America/Rainy_River,1970,Canada,-360,60,8,14,-1,0,23:00,9,30,-1,0,-5:00
+1517,America/Rainy_River,1974,Canada,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
+1518,America/Rainy_River,1987,Canada,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1519,America/Rainy_River,2007,Canada,-360,60,3,8,0,0,-4:00,11,1,0,0,-5:00
+1520,America/Atikokan,1970,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+1521,America/Winnipeg,1970,Winn,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-4:00
+1522,America/Winnipeg,1987,Winn,-360,60,4,1,0,0,-4:00,10,-1,0,0,-4:00
+1523,America/Winnipeg,2005,Winn,-360,0,4,1,0,0,-4:00,10,-1,0,0,-4:00
+1524,America/Winnipeg,2006,Canada,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1525,America/Winnipeg,2007,Canada,-360,60,3,8,0,0,-4:00,11,1,0,0,-5:00
+1526,America/Regina,1970,,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
+1527,America/Swift_Current,1970,Swift,-420,0,4,-1,0,0,-5:00,9,-1,0,0,-6:00
+1528,America/Swift_Current,1972,,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
+1529,America/Edmonton,1970,Edm,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
+1530,America/Edmonton,1987,Canada,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
+1531,America/Edmonton,2007,Canada,-420,60,3,8,0,0,-5:00,11,1,0,0,-6:00
+1532,America/Vancouver,1970,Vanc,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
+1533,America/Vancouver,1987,Canada,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
+1534,America/Vancouver,2007,Canada,-480,60,3,8,0,0,-6:00,11,1,0,0,-7:00
+1535,America/Dawson_Creek,1970,Vanc,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
+1536,America/Dawson_Creek,1972,,-420,0,0,0,0,0,00:00,0,0,0,0,00:00
+1537,America/Pangnirtung,1970,NT_YK,-240,120,4,-1,0,0,-4:00,10,-1,0,0,-3:00
+1538,America/Pangnirtung,1980,NT_YK,-240,60,4,-1,0,0,-2:00,10,-1,0,0,-3:00
+1539,America/Pangnirtung,1987,NT_YK,-240,60,4,1,0,0,-2:00,10,-1,0,0,-3:00
+1540,America/Pangnirtung,1995,Canada,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
+1541,America/Pangnirtung,1999,Canada,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1542,America/Pangnirtung,2000,Canada,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
+1543,America/Pangnirtung,2007,Canada,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
+1544,America/Iqaluit,1970,NT_YK,-300,120,4,-1,0,0,-5:00,10,-1,0,0,-4:00
+1545,America/Iqaluit,1980,NT_YK,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
+1546,America/Iqaluit,1987,NT_YK,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
+1547,America/Iqaluit,1999,Canada,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1548,America/Iqaluit,2000,Canada,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
+1549,America/Iqaluit,2007,Canada,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
+1550,America/Resolute,1970,NT_YK,-360,120,4,-1,0,0,-6:00,10,-1,0,0,-5:00
+1551,America/Resolute,1980,NT_YK,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
+1552,America/Resolute,1987,NT_YK,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1553,America/Resolute,2000,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+1554,America/Resolute,2001,Canada,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1555,America/Resolute,2006,Resolute,-300,0,12,31,-1,0,07:00,11,1,0,0,-4:00
+1556,America/Resolute,2007,Resolute,-300,0,12,31,-1,0,07:00,3,8,0,0,-4:00
+1557,America/Rankin_Inlet,1970,NT_YK,-360,120,4,-1,0,0,-6:00,10,-1,0,0,-5:00
+1558,America/Rankin_Inlet,1980,NT_YK,-360,60,4,-1,0,0,-4:00,10,-1,0,0,-5:00
+1559,America/Rankin_Inlet,1987,NT_YK,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1560,America/Rankin_Inlet,2000,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+1561,America/Rankin_Inlet,2001,Canada,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1562,America/Rankin_Inlet,2007,Canada,-360,60,3,8,0,0,-4:00,11,1,0,0,-5:00
+1563,America/Cambridge_Bay,1970,NT_YK,-420,120,4,-1,0,0,-7:00,10,-1,0,0,-6:00
+1564,America/Cambridge_Bay,1980,NT_YK,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
+1565,America/Cambridge_Bay,1987,NT_YK,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
+1566,America/Cambridge_Bay,1999,Canada,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1567,America/Cambridge_Bay,2000,,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
+1568,America/Cambridge_Bay,2001,Canada,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
+1569,America/Cambridge_Bay,2007,Canada,-420,60,3,8,0,0,-5:00,11,1,0,0,-6:00
+1570,America/Yellowknife,1970,NT_YK,-420,120,4,-1,0,0,-7:00,10,-1,0,0,-6:00
+1571,America/Yellowknife,1980,Canada,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
+1572,America/Yellowknife,1987,Canada,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
+1573,America/Yellowknife,2007,Canada,-420,60,3,8,0,0,-5:00,11,1,0,0,-6:00
+1574,America/Inuvik,1970,NT_YK,-480,120,4,-1,0,0,-8:00,10,-1,0,0,-7:00
+1575,America/Inuvik,1979,NT_YK,-420,120,4,-1,0,0,-7:00,10,-1,0,0,-6:00
+1576,America/Inuvik,1980,Canada,-420,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
+1577,America/Inuvik,1987,Canada,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
+1578,America/Inuvik,2007,Canada,-420,60,3,8,0,0,-5:00,11,1,0,0,-6:00
+1579,America/Whitehorse,1970,NT_YK,-480,120,4,-1,0,0,-8:00,10,-1,0,0,-7:00
+1580,America/Whitehorse,1980,Canada,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
+1581,America/Whitehorse,1987,Canada,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
+1582,America/Whitehorse,2007,Canada,-480,60,3,8,0,0,-6:00,11,1,0,0,-7:00
+1583,America/Dawson,1970,NT_YK,-540,120,4,-1,0,0,-9:00,10,-1,0,0,-8:00
+1584,America/Dawson,1973,NT_YK,-480,120,4,-1,0,0,-8:00,10,-1,0,0,-7:00
+1585,America/Dawson,1980,Canada,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
+1586,America/Dawson,1987,Canada,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
+1587,America/Dawson,2007,Canada,-480,60,3,8,0,0,-6:00,11,1,0,0,-7:00
+1588,America/Cancun,1970,,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
+1589,America/Cancun,1981,Mexico,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+1590,America/Cancun,1996,Mexico,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
+1591,America/Cancun,1998,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1592,America/Cancun,2001,Mexico,-360,60,5,1,0,0,-4:00,9,-1,0,0,-5:00
+1593,America/Cancun,2002,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1594,America/Merida,1970,,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
+1595,America/Merida,1981,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+1596,America/Merida,1982,Mexico,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
+1597,America/Merida,1996,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1598,America/Merida,2001,Mexico,-360,60,5,1,0,0,-4:00,9,-1,0,0,-5:00
+1599,America/Merida,2002,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1600,America/Matamoros,1970,,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
+1601,America/Matamoros,1988,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1602,America/Matamoros,1989,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1603,America/Matamoros,2001,Mexico,-360,60,5,1,0,0,-4:00,9,-1,0,0,-5:00
+1604,America/Matamoros,2002,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1605,America/Matamoros,2010,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1606,America/Monterrey,1970,,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
+1607,America/Monterrey,1988,US,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1608,America/Monterrey,1989,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1609,America/Monterrey,2001,Mexico,-360,60,5,1,0,0,-4:00,9,-1,0,0,-5:00
+1610,America/Monterrey,2002,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1611,America/Mexico_City,1970,Mexico,-360,60,2,12,-1,0,-6:00,7,30,-1,0,-7:00
+1612,America/Mexico_City,1996,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1613,America/Mexico_City,2001,,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
+1614,America/Mexico_City,2002,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1615,America/Ojinaga,1970,,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
+1616,America/Ojinaga,1996,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1617,America/Ojinaga,1998,Mexico,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
+1618,America/Ojinaga,2001,Mexico,-420,60,5,1,0,0,-5:00,9,-1,0,0,-6:00
+1619,America/Ojinaga,2002,Mexico,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
+1620,America/Ojinaga,2010,US,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
+1621,America/Chihuahua,1970,,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
+1622,America/Chihuahua,1996,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1623,America/Chihuahua,1998,Mexico,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
+1624,America/Chihuahua,2001,Mexico,-420,60,5,1,0,0,-5:00,9,-1,0,0,-6:00
+1625,America/Chihuahua,2002,Mexico,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
+1626,America/Hermosillo,1970,Mexico,-420,60,2,12,-1,0,-7:00,7,30,-1,0,-8:00
+1627,America/Hermosillo,1996,Mexico,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
+1628,America/Hermosillo,1999,,-420,0,0,0,0,0,00:00,0,0,0,0,00:00
+1629,America/Mazatlan,1970,Mexico,-420,60,2,12,-1,0,-7:00,7,30,-1,0,-8:00
+1630,America/Mazatlan,1996,Mexico,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
+1631,America/Mazatlan,2001,Mexico,-420,60,5,1,0,0,-5:00,9,-1,0,0,-6:00
+1632,America/Mazatlan,2002,Mexico,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
+1633,America/Bahia_Banderas,1970,Mexico,-420,60,2,12,-1,0,-7:00,7,30,-1,0,-8:00
+1634,America/Bahia_Banderas,1996,Mexico,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
+1635,America/Bahia_Banderas,2001,Mexico,-420,60,5,1,0,0,-5:00,9,-1,0,0,-6:00
+1636,America/Bahia_Banderas,2002,Mexico,-420,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
+1637,America/Bahia_Banderas,2010,Mexico,-360,60,4,1,0,0,-4:00,10,-1,0,0,-5:00
+1638,America/Tijuana,1970,,-480,0,0,0,0,0,00:00,0,0,0,0,00:00
+1639,America/Tijuana,1976,US,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
+1640,America/Tijuana,1987,US,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
+1641,America/Tijuana,1996,Mexico,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
+1642,America/Tijuana,2001,US,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
+1643,America/Tijuana,2002,Mexico,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
+1644,America/Tijuana,2010,US,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
+1645,America/Santa_Isabel,1970,,-480,0,0,0,0,0,00:00,0,0,0,0,00:00
+1646,America/Santa_Isabel,1976,US,-480,60,4,-1,0,0,-6:00,10,-1,0,0,-7:00
+1647,America/Santa_Isabel,1987,US,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
+1648,America/Santa_Isabel,1996,Mexico,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
+1649,America/Santa_Isabel,2001,US,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
+1650,America/Santa_Isabel,2002,Mexico,-480,60,4,1,0,0,-6:00,10,-1,0,0,-7:00
+1651,America/Anguilla,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1652,America/Antigua,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1653,America/Nassau,1970,Bahamas,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
+1654,America/Nassau,1975,Bahamas,-300,0,4,-1,0,0,-3:00,10,-1,0,0,-4:00
+1655,America/Nassau,1976,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
+1656,America/Nassau,1987,US,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
+1657,America/Nassau,2007,US,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
+1658,America/Barbados,1970,Barb,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1659,America/Barbados,1977,Barb,-240,60,6,12,-1,0,-2:00,10,1,0,0,-3:00
+1660,America/Barbados,1978,Barb,-240,60,4,15,0,0,-2:00,10,1,0,0,-3:00
+1661,America/Barbados,1979,Barb,-240,60,4,15,0,0,-2:00,9,30,-1,0,-3:00
+1662,America/Barbados,1980,Barb,-240,60,4,15,0,0,-2:00,9,25,-1,0,-3:00
+1663,America/Barbados,1981,Barb,-240,0,4,15,0,0,-2:00,9,25,-1,0,-3:00
+1664,America/Belize,1970,Belize,-360,0,12,31,-1,0,06:00,2,9,0,0,-7:00
+1665,America/Belize,1973,Belize,-360,60,12,5,-1,0,-6:00,1,1,-1,0,05:00
+1666,America/Belize,1974,Belize,-360,0,12,31,-1,0,06:00,2,9,-1,0,-7:00
+1667,America/Belize,1982,Belize,-360,60,12,18,-1,0,-6:00,1,1,-1,0,05:00
+1668,America/Belize,1983,Belize,-360,0,12,31,-1,0,06:00,2,12,-1,0,-7:00
+1669,Atlantic/Bermuda,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1670,Atlantic/Bermuda,1974,Bahamas,-240,60,4,-1,0,0,-2:00,10,-1,0,0,-3:00
+1671,Atlantic/Bermuda,1975,Bahamas,-240,0,4,-1,0,0,-2:00,10,-1,0,0,-3:00
+1672,Atlantic/Bermuda,1976,US,-240,60,4,-1,0,0,-2:00,10,-1,0,0,-3:00
+1673,Atlantic/Bermuda,1987,US,-240,60,4,1,0,0,-2:00,10,-1,0,0,-3:00
+1674,Atlantic/Bermuda,2007,US,-240,60,3,8,0,0,-2:00,11,1,0,0,-3:00
+1675,America/Cayman,1970,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+1676,America/Costa_Rica,1970,CR,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
+1677,America/Costa_Rica,1979,CR,-360,60,2,-1,0,0,-6:00,6,1,0,0,-7:00
+1678,America/Costa_Rica,1991,CR,-360,60,1,15,6,0,-6:00,7,1,-1,0,-7:00
+1679,America/Costa_Rica,1992,CR,-360,60,1,15,6,0,-6:00,3,15,-1,0,-7:00
+1680,America/Costa_Rica,1993,CR,-360,0,1,15,6,0,-6:00,3,15,-1,0,-7:00
+1681,America/Havana,1970,Cuba,-300,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
+1682,America/Havana,1972,Cuba,-300,60,4,-1,0,0,-5:00,10,8,-1,0,-6:00
+1683,America/Havana,1975,Cuba,-300,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
+1684,America/Havana,1978,Cuba,-300,60,5,7,-1,0,-5:00,10,8,0,0,-6:00
+1685,America/Havana,1979,Cuba,-300,60,3,15,0,0,-5:00,10,8,0,0,-6:00
+1686,America/Havana,1981,Cuba,-300,60,5,5,0,0,-5:00,10,8,0,0,-6:00
+1687,America/Havana,1986,Cuba,-300,60,3,14,0,0,-5:00,10,8,0,0,-6:00
+1688,America/Havana,1990,Cuba,-300,60,4,1,0,0,-5:00,10,8,0,0,-6:00
+1689,America/Havana,1991,Cuba,-300,60,4,1,0,0,-5:00,10,8,0,0,-5:00
+1690,America/Havana,1996,Cuba,-300,60,4,1,0,0,-5:00,10,6,-1,0,-5:00
+1691,America/Havana,1997,Cuba,-300,60,4,1,0,0,-5:00,10,12,-1,0,-5:00
+1692,America/Havana,1998,Cuba,-300,60,3,-1,0,0,-5:00,10,-1,0,0,-5:00
+1693,America/Havana,2000,Cuba,-300,60,4,1,0,0,-5:00,10,-1,0,0,-5:00
+1694,America/Havana,2004,Cuba,-300,60,4,1,0,0,-5:00,1,1,-1,0,06:00
+1695,America/Havana,2006,Cuba,-300,0,12,31,-1,0,07:00,10,-1,0,0,-5:00
+1696,America/Havana,2007,Cuba,-300,60,3,8,0,0,-5:00,10,-1,0,0,-5:00
+1697,America/Havana,2008,Cuba,-300,60,3,15,0,0,-5:00,10,-1,0,0,-5:00
+1698,America/Havana,2009,Cuba,-300,60,3,8,0,0,-5:00,10,-1,0,0,-5:00
+1699,America/Havana,2011,Cuba,-300,60,3,15,0,0,-5:00,10,-1,0,0,-5:00
+1700,America/Havana,2012,Cuba,-300,60,3,8,0,0,-5:00,10,-1,0,0,-5:00
+1701,America/Dominica,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1702,America/Santo_Domingo,1970,DR,-300,30,10,-1,0,0,-5:00,2,21,-1,0,-6:00
+1703,America/Santo_Domingo,1971,DR,-300,30,10,-1,0,0,-5:00,1,20,-1,0,-6:00
+1704,America/Santo_Domingo,1972,DR,-300,30,10,-1,0,0,-5:00,1,21,-1,0,-6:00
+1705,America/Santo_Domingo,1974,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1706,America/El_Salvador,1970,Salv,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
+1707,America/El_Salvador,1987,Salv,-360,60,5,1,0,0,-6:00,9,-1,0,0,-7:00
+1708,America/El_Salvador,1988,Salv,-360,0,5,1,0,0,-6:00,9,-1,0,0,-7:00
+1709,America/Grenada,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1710,America/Guadeloupe,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1711,America/Guatemala,1970,Guat,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
+1712,America/Guatemala,1973,Guat,-360,60,11,25,-1,0,-6:00,1,1,-1,0,05:00
+1713,America/Guatemala,1974,Guat,-360,0,12,31,-1,0,06:00,2,24,-1,0,-7:00
+1714,America/Guatemala,1983,Guat,-360,60,5,21,-1,0,-6:00,9,22,-1,0,-7:00
+1715,America/Guatemala,1991,Guat,-360,60,3,23,-1,0,-6:00,9,7,-1,0,-7:00
+1716,America/Guatemala,2006,Guat,-360,60,4,30,-1,0,-6:00,10,1,-1,0,-7:00
+1717,America/Guatemala,2007,Guat,-360,0,4,30,-1,0,-6:00,10,1,-1,0,-7:00
+1718,America/Port-au-Prince,1970,Haiti,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+1719,America/Port-au-Prince,1983,Haiti,-300,60,5,8,-1,0,-5:00,10,-1,0,0,-6:00
+1720,America/Port-au-Prince,1984,Haiti,-300,60,4,-1,0,0,-5:00,10,-1,0,0,-6:00
+1721,America/Port-au-Prince,1988,Haiti,-300,60,4,1,0,0,-4:00,10,-1,0,0,-4:00
+1722,America/Port-au-Prince,2005,Haiti,-300,60,4,1,0,0,-5:00,10,-1,0,0,-6:00
+1723,America/Port-au-Prince,2006,Haiti,-300,0,4,1,0,0,-5:00,10,-1,0,0,-6:00
+1724,America/Tegucigalpa,1970,Hond,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
+1725,America/Tegucigalpa,1987,Hond,-360,60,5,1,0,0,-6:00,9,-1,0,0,-7:00
+1726,America/Tegucigalpa,2006,Hond,-360,60,5,1,0,0,-6:00,8,1,1,0,-7:00
+1727,America/Tegucigalpa,2007,Hond,-360,0,5,1,0,0,-6:00,8,1,1,0,-7:00
+1728,America/Jamaica,1970,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+1729,America/Jamaica,1974,US,-300,60,1,6,-1,0,-3:00,10,-1,0,0,-4:00
+1730,America/Jamaica,1975,US,-300,60,2,23,-1,0,-3:00,10,-1,0,0,-4:00
+1731,America/Jamaica,1976,US,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
+1732,America/Jamaica,1984,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+1733,America/Martinique,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1734,America/Martinique,1980,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1735,America/Montserrat,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1736,America/Managua,1970,,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
+1737,America/Managua,1973,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+1738,America/Managua,1975,Nic,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
+1739,America/Managua,1979,Nic,-360,60,3,16,0,0,-6:00,6,23,1,0,-7:00
+1740,America/Managua,1992,,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
+1741,America/Managua,1993,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+1742,America/Managua,1997,Nic,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
+1743,America/Managua,2005,Nic,-360,60,4,10,-1,0,-6:00,10,1,0,0,-7:00
+1744,America/Managua,2006,Nic,-360,60,4,30,-1,0,-4:00,10,1,0,0,-6:00
+1745,America/Managua,2007,Nic,-360,0,4,30,-1,0,-4:00,10,1,0,0,-6:00
+1746,America/Panama,1970,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+1747,America/Puerto_Rico,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1748,America/St_Kitts,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1749,America/St_Lucia,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1750,America/Miquelon,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1751,America/Miquelon,1980,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1752,America/Miquelon,1987,Canada,-180,60,4,1,0,0,-1:00,10,-1,0,0,-2:00
+1753,America/Miquelon,2007,Canada,-180,60,3,8,0,0,-1:00,11,1,0,0,-2:00
+1754,America/St_Vincent,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1755,America/Grand_Turk,1970,TC,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+1756,America/Grand_Turk,1979,TC,-300,60,4,-1,0,0,-3:00,10,-1,0,0,-4:00
+1757,America/Grand_Turk,1987,TC,-300,60,4,1,0,0,-3:00,10,-1,0,0,-4:00
+1758,America/Grand_Turk,2007,TC,-300,60,3,8,0,0,-3:00,11,1,0,0,-4:00
+1759,America/Tortola,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1760,America/St_Thomas,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1761,America/Argentina/Buenos_Aires,1970,Arg,-180,0,12,31,-1,0,09:00,4,1,0,0,-4:00
+1762,America/Argentina/Buenos_Aires,1974,Arg,-180,60,1,23,-1,0,-3:00,5,1,-1,0,-4:00
+1763,America/Argentina/Buenos_Aires,1988,Arg,-180,60,12,1,-1,0,-3:00,1,1,-1,0,08:00
+1764,America/Argentina/Buenos_Aires,1989,Arg,-180,60,10,15,0,0,-3:00,3,1,0,0,-4:00
+1765,America/Argentina/Buenos_Aires,1993,Arg,-180,0,12,31,-1,0,09:00,3,1,0,0,-4:00
+1766,America/Argentina/Buenos_Aires,1999,Arg,-240,60,10,1,0,0,-4:00,1,1,-1,0,07:00
+1767,America/Argentina/Buenos_Aires,2000,Arg,-180,0,12,31,-1,0,09:00,3,3,-1,0,-4:00
+1768,America/Argentina/Buenos_Aires,2007,Arg,-180,60,12,30,-1,0,-3:00,1,1,-1,0,08:00
+1769,America/Argentina/Buenos_Aires,2008,Arg,-180,60,10,15,0,0,-3:00,3,15,0,0,-4:00
+1770,America/Argentina/Buenos_Aires,2009,Arg,-180,0,12,31,-1,0,09:00,3,15,0,0,-4:00
+1771,America/Argentina/Cordoba,1970,Arg,-180,0,12,31,-1,0,09:00,4,1,0,0,-4:00
+1772,America/Argentina/Cordoba,1974,Arg,-180,60,1,23,-1,0,-3:00,5,1,-1,0,-4:00
+1773,America/Argentina/Cordoba,1988,Arg,-180,60,12,1,-1,0,-3:00,1,1,-1,0,08:00
+1774,America/Argentina/Cordoba,1989,Arg,-180,60,10,15,0,0,-3:00,3,1,0,0,-4:00
+1775,America/Argentina/Cordoba,1993,Arg,-180,0,12,31,-1,0,09:00,3,1,0,0,-4:00
+1776,America/Argentina/Cordoba,1999,Arg,-240,60,10,1,0,0,-4:00,1,1,-1,0,07:00
+1777,America/Argentina/Cordoba,2000,Arg,-180,0,12,31,-1,0,09:00,3,3,-1,0,-4:00
+1778,America/Argentina/Cordoba,2007,Arg,-180,60,12,30,-1,0,-3:00,1,1,-1,0,08:00
+1779,America/Argentina/Cordoba,2008,Arg,-180,60,10,15,0,0,-3:00,3,15,0,0,-4:00
+1780,America/Argentina/Cordoba,2009,Arg,-180,0,12,31,-1,0,09:00,3,15,0,0,-4:00
+1781,America/Argentina/Salta,1970,Arg,-180,0,12,31,-1,0,09:00,4,1,0,0,-4:00
+1782,America/Argentina/Salta,1974,Arg,-180,60,1,23,-1,0,-3:00,5,1,-1,0,-4:00
+1783,America/Argentina/Salta,1988,Arg,-180,60,12,1,-1,0,-3:00,1,1,-1,0,08:00
+1784,America/Argentina/Salta,1989,Arg,-180,60,10,15,0,0,-3:00,3,1,0,0,-4:00
+1785,America/Argentina/Salta,1993,Arg,-180,0,12,31,-1,0,09:00,3,1,0,0,-4:00
+1786,America/Argentina/Salta,1999,Arg,-240,60,10,1,0,0,-4:00,1,1,-1,0,07:00
+1787,America/Argentina/Salta,2000,Arg,-180,0,12,31,-1,0,09:00,3,3,-1,0,-4:00
+1788,America/Argentina/Salta,2007,Arg,-180,60,12,30,-1,0,-3:00,1,1,-1,0,08:00
+1789,America/Argentina/Salta,2008,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1790,America/Argentina/Tucuman,1970,Arg,-180,0,12,31,-1,0,09:00,4,1,0,0,-4:00
+1791,America/Argentina/Tucuman,1974,Arg,-180,60,1,23,-1,0,-3:00,5,1,-1,0,-4:00
+1792,America/Argentina/Tucuman,1988,Arg,-180,60,12,1,-1,0,-3:00,1,1,-1,0,08:00
+1793,America/Argentina/Tucuman,1989,Arg,-180,60,10,15,0,0,-3:00,3,1,0,0,-4:00
+1794,America/Argentina/Tucuman,1993,Arg,-180,0,12,31,-1,0,09:00,3,1,0,0,-4:00
+1795,America/Argentina/Tucuman,1999,Arg,-240,60,10,1,0,0,-4:00,1,1,-1,0,07:00
+1796,America/Argentina/Tucuman,2000,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1797,America/Argentina/Tucuman,2004,Arg,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1798,America/Argentina/Tucuman,2007,Arg,-180,60,12,30,-1,0,-3:00,1,1,-1,0,08:00
+1799,America/Argentina/Tucuman,2008,Arg,-180,60,10,15,0,0,-3:00,3,15,0,0,-4:00
+1800,America/Argentina/Tucuman,2009,Arg,-180,0,12,31,-1,0,09:00,3,15,0,0,-4:00
+1801,America/Argentina/La_Rioja,1970,Arg,-180,0,12,31,-1,0,09:00,4,1,0,0,-4:00
+1802,America/Argentina/La_Rioja,1974,Arg,-180,60,1,23,-1,0,-3:00,5,1,-1,0,-4:00
+1803,America/Argentina/La_Rioja,1988,Arg,-180,60,12,1,-1,0,-3:00,1,1,-1,0,08:00
+1804,America/Argentina/La_Rioja,1989,Arg,-180,60,10,15,0,0,-3:00,3,1,0,0,-4:00
+1805,America/Argentina/La_Rioja,1993,Arg,-180,0,12,31,-1,0,09:00,3,1,0,0,-4:00
+1806,America/Argentina/La_Rioja,1999,Arg,-240,60,10,1,0,0,-4:00,1,1,-1,0,07:00
+1807,America/Argentina/La_Rioja,2000,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1808,America/Argentina/La_Rioja,2004,Arg,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1809,America/Argentina/La_Rioja,2007,Arg,-180,60,12,30,-1,0,-3:00,1,1,-1,0,08:00
+1810,America/Argentina/La_Rioja,2008,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1811,America/Argentina/San_Juan,1970,Arg,-180,0,12,31,-1,0,09:00,4,1,0,0,-4:00
+1812,America/Argentina/San_Juan,1974,Arg,-180,60,1,23,-1,0,-3:00,5,1,-1,0,-4:00
+1813,America/Argentina/San_Juan,1988,Arg,-180,60,12,1,-1,0,-3:00,1,1,-1,0,08:00
+1814,America/Argentina/San_Juan,1989,Arg,-180,60,10,15,0,0,-3:00,3,1,0,0,-4:00
+1815,America/Argentina/San_Juan,1993,Arg,-180,0,12,31,-1,0,09:00,3,1,0,0,-4:00
+1816,America/Argentina/San_Juan,1999,Arg,-240,60,10,1,0,0,-4:00,1,1,-1,0,07:00
+1817,America/Argentina/San_Juan,2000,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1818,America/Argentina/San_Juan,2004,Arg,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1819,America/Argentina/San_Juan,2007,Arg,-180,60,12,30,-1,0,-3:00,1,1,-1,0,08:00
+1820,America/Argentina/San_Juan,2008,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1821,America/Argentina/Jujuy,1970,Arg,-180,0,12,31,-1,0,09:00,4,1,0,0,-4:00
+1822,America/Argentina/Jujuy,1974,Arg,-180,60,1,23,-1,0,-3:00,5,1,-1,0,-4:00
+1823,America/Argentina/Jujuy,1988,Arg,-180,60,12,1,-1,0,-3:00,1,1,-1,0,08:00
+1824,America/Argentina/Jujuy,1989,Arg,-180,60,10,15,0,0,-3:00,3,1,0,0,-4:00
+1825,America/Argentina/Jujuy,1990,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1826,America/Argentina/Jujuy,1991,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1827,America/Argentina/Jujuy,1992,Arg,-180,60,10,15,0,0,-3:00,3,1,0,0,-4:00
+1828,America/Argentina/Jujuy,1993,Arg,-180,0,12,31,-1,0,09:00,3,1,0,0,-4:00
+1829,America/Argentina/Jujuy,1999,Arg,-240,60,10,1,0,0,-4:00,1,1,-1,0,07:00
+1830,America/Argentina/Jujuy,2000,Arg,-180,0,12,31,-1,0,09:00,3,3,-1,0,-4:00
+1831,America/Argentina/Jujuy,2007,Arg,-180,60,12,30,-1,0,-3:00,1,1,-1,0,08:00
+1832,America/Argentina/Jujuy,2008,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1833,America/Argentina/Catamarca,1970,Arg,-180,0,12,31,-1,0,09:00,4,1,0,0,-4:00
+1834,America/Argentina/Catamarca,1974,Arg,-180,60,1,23,-1,0,-3:00,5,1,-1,0,-4:00
+1835,America/Argentina/Catamarca,1988,Arg,-180,60,12,1,-1,0,-3:00,1,1,-1,0,08:00
+1836,America/Argentina/Catamarca,1989,Arg,-180,60,10,15,0,0,-3:00,3,1,0,0,-4:00
+1837,America/Argentina/Catamarca,1993,Arg,-180,0,12,31,-1,0,09:00,3,1,0,0,-4:00
+1838,America/Argentina/Catamarca,1999,Arg,-240,60,10,1,0,0,-4:00,1,1,-1,0,07:00
+1839,America/Argentina/Catamarca,2000,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1840,America/Argentina/Catamarca,2004,Arg,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1841,America/Argentina/Catamarca,2007,Arg,-180,60,12,30,-1,0,-3:00,1,1,-1,0,08:00
+1842,America/Argentina/Catamarca,2008,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1843,America/Argentina/Mendoza,1970,Arg,-180,0,12,31,-1,0,09:00,4,1,0,0,-4:00
+1844,America/Argentina/Mendoza,1974,Arg,-180,60,1,23,-1,0,-3:00,5,1,-1,0,-4:00
+1845,America/Argentina/Mendoza,1988,Arg,-180,60,12,1,-1,0,-3:00,1,1,-1,0,08:00
+1846,America/Argentina/Mendoza,1989,Arg,-180,60,10,15,0,0,-3:00,3,1,0,0,-4:00
+1847,America/Argentina/Mendoza,1990,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1848,America/Argentina/Mendoza,1992,Arg,-180,60,10,15,0,0,-3:00,3,1,0,0,-4:00
+1849,America/Argentina/Mendoza,1993,Arg,-180,0,12,31,-1,0,09:00,3,1,0,0,-4:00
+1850,America/Argentina/Mendoza,1999,Arg,-240,60,10,1,0,0,-4:00,1,1,-1,0,07:00
+1851,America/Argentina/Mendoza,2000,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1852,America/Argentina/Mendoza,2004,Arg,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1853,America/Argentina/Mendoza,2007,Arg,-180,60,12,30,-1,0,-3:00,1,1,-1,0,08:00
+1854,America/Argentina/Mendoza,2008,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1855,America/Argentina/San_Luis,1970,Arg,-180,0,12,31,-1,0,09:00,4,1,0,0,-4:00
+1856,America/Argentina/San_Luis,1974,Arg,-180,60,1,23,-1,0,-3:00,5,1,-1,0,-4:00
+1857,America/Argentina/San_Luis,1988,Arg,-180,60,12,1,-1,0,-3:00,1,1,-1,0,08:00
+1858,America/Argentina/San_Luis,1989,Arg,-180,60,10,15,0,0,-3:00,3,1,0,0,-4:00
+1859,America/Argentina/San_Luis,1990,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1860,America/Argentina/San_Luis,1991,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1861,America/Argentina/San_Luis,1999,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1862,America/Argentina/San_Luis,2000,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1863,America/Argentina/San_Luis,2004,Arg,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1864,America/Argentina/San_Luis,2007,Arg,-180,60,12,30,-1,0,-3:00,1,1,-1,0,08:00
+1865,America/Argentina/San_Luis,2008,SanLuis,-240,60,10,8,0,0,-4:00,3,8,0,0,-5:00
+1866,America/Argentina/Rio_Gallegos,1970,Arg,-180,0,12,31,-1,0,09:00,4,1,0,0,-4:00
+1867,America/Argentina/Rio_Gallegos,1974,Arg,-180,60,1,23,-1,0,-3:00,5,1,-1,0,-4:00
+1868,America/Argentina/Rio_Gallegos,1988,Arg,-180,60,12,1,-1,0,-3:00,1,1,-1,0,08:00
+1869,America/Argentina/Rio_Gallegos,1989,Arg,-180,60,10,15,0,0,-3:00,3,1,0,0,-4:00
+1870,America/Argentina/Rio_Gallegos,1993,Arg,-180,0,12,31,-1,0,09:00,3,1,0,0,-4:00
+1871,America/Argentina/Rio_Gallegos,1999,Arg,-240,60,10,1,0,0,-4:00,1,1,-1,0,07:00
+1872,America/Argentina/Rio_Gallegos,2000,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1873,America/Argentina/Rio_Gallegos,2004,Arg,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1874,America/Argentina/Rio_Gallegos,2007,Arg,-180,60,12,30,-1,0,-3:00,1,1,-1,0,08:00
+1875,America/Argentina/Rio_Gallegos,2008,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1876,America/Argentina/Ushuaia,1970,Arg,-180,0,12,31,-1,0,09:00,4,1,0,0,-4:00
+1877,America/Argentina/Ushuaia,1974,Arg,-180,60,1,23,-1,0,-3:00,5,1,-1,0,-4:00
+1878,America/Argentina/Ushuaia,1988,Arg,-180,60,12,1,-1,0,-3:00,1,1,-1,0,08:00
+1879,America/Argentina/Ushuaia,1989,Arg,-180,60,10,15,0,0,-3:00,3,1,0,0,-4:00
+1880,America/Argentina/Ushuaia,1993,Arg,-180,0,12,31,-1,0,09:00,3,1,0,0,-4:00
+1881,America/Argentina/Ushuaia,1999,Arg,-240,60,10,1,0,0,-4:00,1,1,-1,0,07:00
+1882,America/Argentina/Ushuaia,2000,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1883,America/Argentina/Ushuaia,2004,Arg,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1884,America/Argentina/Ushuaia,2007,Arg,-180,60,12,30,-1,0,-3:00,1,1,-1,0,08:00
+1885,America/Argentina/Ushuaia,2008,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1886,America/Aruba,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1887,America/La_Paz,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1888,America/Noronha,1970,Brazil,-120,0,12,31,-1,0,10:00,3,1,-1,0,-3:00
+1889,America/Noronha,1985,Brazil,-120,60,11,2,-1,0,-2:00,1,1,-1,0,09:00
+1890,America/Noronha,1986,Brazil,-120,60,10,25,-1,0,-2:00,3,15,-1,0,-3:00
+1891,America/Noronha,1987,Brazil,-120,60,10,25,-1,0,-2:00,2,14,-1,0,-3:00
+1892,America/Noronha,1988,Brazil,-120,60,10,16,-1,0,-2:00,2,7,-1,0,-3:00
+1893,America/Noronha,1989,Brazil,-120,60,10,15,-1,0,-2:00,1,29,-1,0,-3:00
+1894,America/Noronha,1990,,-120,0,0,0,0,0,00:00,0,0,0,0,00:00
+1895,America/Noronha,1999,Brazil,-120,60,10,3,-1,0,-2:00,2,21,-1,0,-3:00
+1896,America/Noronha,2000,,-120,0,0,0,0,0,00:00,0,0,0,0,00:00
+1897,America/Noronha,2001,Brazil,-120,60,10,8,0,0,-2:00,2,15,0,0,-3:00
+1898,America/Noronha,2002,,-120,0,0,0,0,0,00:00,0,0,0,0,00:00
+1899,America/Belem,1970,Brazil,-180,0,12,31,-1,0,09:00,3,1,-1,0,-4:00
+1900,America/Belem,1985,Brazil,-180,60,11,2,-1,0,-3:00,1,1,-1,0,08:00
+1901,America/Belem,1986,Brazil,-180,60,10,25,-1,0,-3:00,3,15,-1,0,-4:00
+1902,America/Belem,1987,Brazil,-180,60,10,25,-1,0,-3:00,2,14,-1,0,-4:00
+1903,America/Belem,1988,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1904,America/Santarem,1970,Brazil,-240,0,12,31,-1,0,08:00,3,1,-1,0,-5:00
+1905,America/Santarem,1985,Brazil,-240,60,11,2,-1,0,-4:00,1,1,-1,0,07:00
+1906,America/Santarem,1986,Brazil,-240,60,10,25,-1,0,-4:00,3,15,-1,0,-5:00
+1907,America/Santarem,1987,Brazil,-240,60,10,25,-1,0,-4:00,2,14,-1,0,-5:00
+1908,America/Santarem,1988,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+1909,America/Santarem,2008,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1910,America/Fortaleza,1970,Brazil,-180,0,12,31,-1,0,09:00,3,1,-1,0,-4:00
+1911,America/Fortaleza,1985,Brazil,-180,60,11,2,-1,0,-3:00,1,1,-1,0,08:00
+1912,America/Fortaleza,1986,Brazil,-180,60,10,25,-1,0,-3:00,3,15,-1,0,-4:00
+1913,America/Fortaleza,1987,Brazil,-180,60,10,25,-1,0,-3:00,2,14,-1,0,-4:00
+1914,America/Fortaleza,1988,Brazil,-180,60,10,16,-1,0,-3:00,2,7,-1,0,-4:00
+1915,America/Fortaleza,1989,Brazil,-180,60,10,15,-1,0,-3:00,1,29,-1,0,-4:00
+1916,America/Fortaleza,1990,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1917,America/Fortaleza,1999,Brazil,-180,60,10,3,-1,0,-3:00,2,21,-1,0,-4:00
+1918,America/Fortaleza,2000,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1919,America/Fortaleza,2001,Brazil,-180,60,10,8,0,0,-3:00,2,15,0,0,-4:00
+1920,America/Fortaleza,2002,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1921,America/Recife,1970,Brazil,-180,0,12,31,-1,0,09:00,3,1,-1,0,-4:00
+1922,America/Recife,1985,Brazil,-180,60,11,2,-1,0,-3:00,1,1,-1,0,08:00
+1923,America/Recife,1986,Brazil,-180,60,10,25,-1,0,-3:00,3,15,-1,0,-4:00
+1924,America/Recife,1987,Brazil,-180,60,10,25,-1,0,-3:00,2,14,-1,0,-4:00
+1925,America/Recife,1988,Brazil,-180,60,10,16,-1,0,-3:00,2,7,-1,0,-4:00
+1926,America/Recife,1989,Brazil,-180,60,10,15,-1,0,-3:00,1,29,-1,0,-4:00
+1927,America/Recife,1990,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1928,America/Recife,1999,Brazil,-180,60,10,3,-1,0,-3:00,2,21,-1,0,-4:00
+1929,America/Recife,2000,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1930,America/Recife,2001,Brazil,-180,60,10,8,0,0,-3:00,2,15,0,0,-4:00
+1931,America/Recife,2002,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1932,America/Araguaina,1970,Brazil,-180,0,12,31,-1,0,09:00,3,1,-1,0,-4:00
+1933,America/Araguaina,1985,Brazil,-180,60,11,2,-1,0,-3:00,1,1,-1,0,08:00
+1934,America/Araguaina,1986,Brazil,-180,60,10,25,-1,0,-3:00,3,15,-1,0,-4:00
+1935,America/Araguaina,1987,Brazil,-180,60,10,25,-1,0,-3:00,2,14,-1,0,-4:00
+1936,America/Araguaina,1988,Brazil,-180,60,10,16,-1,0,-3:00,2,7,-1,0,-4:00
+1937,America/Araguaina,1989,Brazil,-180,60,10,15,-1,0,-3:00,1,29,-1,0,-4:00
+1938,America/Araguaina,1990,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1939,America/Araguaina,1995,Brazil,-180,60,10,11,0,0,-3:00,2,15,0,0,-4:00
+1940,America/Araguaina,1996,Brazil,-180,60,10,6,-1,0,-3:00,2,11,-1,0,-4:00
+1941,America/Araguaina,1997,Brazil,-180,60,10,6,-1,0,-3:00,2,16,-1,0,-4:00
+1942,America/Araguaina,1998,Brazil,-180,60,10,11,-1,0,-3:00,3,1,-1,0,-4:00
+1943,America/Araguaina,1999,Brazil,-180,60,10,3,-1,0,-3:00,2,21,-1,0,-4:00
+1944,America/Araguaina,2000,Brazil,-180,60,10,8,0,0,-3:00,2,27,-1,0,-4:00
+1945,America/Araguaina,2001,Brazil,-180,60,10,8,0,0,-3:00,2,15,0,0,-4:00
+1946,America/Araguaina,2002,Brazil,-180,60,11,3,-1,0,-3:00,2,15,0,0,-4:00
+1947,America/Araguaina,2003,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1948,America/Maceio,1970,Brazil,-180,0,12,31,-1,0,09:00,3,1,-1,0,-4:00
+1949,America/Maceio,1985,Brazil,-180,60,11,2,-1,0,-3:00,1,1,-1,0,08:00
+1950,America/Maceio,1986,Brazil,-180,60,10,25,-1,0,-3:00,3,15,-1,0,-4:00
+1951,America/Maceio,1987,Brazil,-180,60,10,25,-1,0,-3:00,2,14,-1,0,-4:00
+1952,America/Maceio,1988,Brazil,-180,60,10,16,-1,0,-3:00,2,7,-1,0,-4:00
+1953,America/Maceio,1989,Brazil,-180,60,10,15,-1,0,-3:00,1,29,-1,0,-4:00
+1954,America/Maceio,1990,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1955,America/Maceio,1995,Brazil,-180,60,10,11,0,0,-3:00,2,15,0,0,-4:00
+1956,America/Maceio,1996,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1957,America/Maceio,1999,Brazil,-180,60,10,3,-1,0,-3:00,2,21,-1,0,-4:00
+1958,America/Maceio,2000,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1959,America/Maceio,2001,Brazil,-180,60,10,8,0,0,-3:00,2,15,0,0,-4:00
+1960,America/Maceio,2002,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1961,America/Bahia,1970,Brazil,-180,0,12,31,-1,0,09:00,3,1,-1,0,-4:00
+1962,America/Bahia,1985,Brazil,-180,60,11,2,-1,0,-3:00,1,1,-1,0,08:00
+1963,America/Bahia,1986,Brazil,-180,60,10,25,-1,0,-3:00,3,15,-1,0,-4:00
+1964,America/Bahia,1987,Brazil,-180,60,10,25,-1,0,-3:00,2,14,-1,0,-4:00
+1965,America/Bahia,1988,Brazil,-180,60,10,16,-1,0,-3:00,2,7,-1,0,-4:00
+1966,America/Bahia,1989,Brazil,-180,60,10,15,-1,0,-3:00,1,29,-1,0,-4:00
+1967,America/Bahia,1990,Brazil,-180,60,10,21,-1,0,-3:00,2,11,-1,0,-4:00
+1968,America/Bahia,1991,Brazil,-180,60,10,20,-1,0,-3:00,2,17,-1,0,-4:00
+1969,America/Bahia,1992,Brazil,-180,60,10,25,-1,0,-3:00,2,9,-1,0,-4:00
+1970,America/Bahia,1993,Brazil,-180,60,10,11,0,0,-3:00,1,31,-1,0,-4:00
+1971,America/Bahia,1994,Brazil,-180,60,10,11,0,0,-3:00,2,15,0,0,-4:00
+1972,America/Bahia,1996,Brazil,-180,60,10,6,-1,0,-3:00,2,11,-1,0,-4:00
+1973,America/Bahia,1997,Brazil,-180,60,10,6,-1,0,-3:00,2,16,-1,0,-4:00
+1974,America/Bahia,1998,Brazil,-180,60,10,11,-1,0,-3:00,3,1,-1,0,-4:00
+1975,America/Bahia,1999,Brazil,-180,60,10,3,-1,0,-3:00,2,21,-1,0,-4:00
+1976,America/Bahia,2000,Brazil,-180,60,10,8,0,0,-3:00,2,27,-1,0,-4:00
+1977,America/Bahia,2001,Brazil,-180,60,10,8,0,0,-3:00,2,15,0,0,-4:00
+1978,America/Bahia,2002,Brazil,-180,60,11,3,-1,0,-3:00,2,15,0,0,-4:00
+1979,America/Bahia,2003,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+1980,America/Sao_Paulo,1970,Brazil,-180,0,12,31,-1,0,09:00,3,1,-1,0,-4:00
+1981,America/Sao_Paulo,1985,Brazil,-180,60,11,2,-1,0,-3:00,1,1,-1,0,08:00
+1982,America/Sao_Paulo,1986,Brazil,-180,60,10,25,-1,0,-3:00,3,15,-1,0,-4:00
+1983,America/Sao_Paulo,1987,Brazil,-180,60,10,25,-1,0,-3:00,2,14,-1,0,-4:00
+1984,America/Sao_Paulo,1988,Brazil,-180,60,10,16,-1,0,-3:00,2,7,-1,0,-4:00
+1985,America/Sao_Paulo,1989,Brazil,-180,60,10,15,-1,0,-3:00,1,29,-1,0,-4:00
+1986,America/Sao_Paulo,1990,Brazil,-180,60,10,21,-1,0,-3:00,2,11,-1,0,-4:00
+1987,America/Sao_Paulo,1991,Brazil,-180,60,10,20,-1,0,-3:00,2,17,-1,0,-4:00
+1988,America/Sao_Paulo,1992,Brazil,-180,60,10,25,-1,0,-3:00,2,9,-1,0,-4:00
+1989,America/Sao_Paulo,1993,Brazil,-180,60,10,11,0,0,-3:00,1,31,-1,0,-4:00
+1990,America/Sao_Paulo,1994,Brazil,-180,60,10,11,0,0,-3:00,2,15,0,0,-4:00
+1991,America/Sao_Paulo,1996,Brazil,-180,60,10,6,-1,0,-3:00,2,11,-1,0,-4:00
+1992,America/Sao_Paulo,1997,Brazil,-180,60,10,6,-1,0,-3:00,2,16,-1,0,-4:00
+1993,America/Sao_Paulo,1998,Brazil,-180,60,10,11,-1,0,-3:00,3,1,-1,0,-4:00
+1994,America/Sao_Paulo,1999,Brazil,-180,60,10,3,-1,0,-3:00,2,21,-1,0,-4:00
+1995,America/Sao_Paulo,2000,Brazil,-180,60,10,8,0,0,-3:00,2,27,-1,0,-4:00
+1996,America/Sao_Paulo,2001,Brazil,-180,60,10,8,0,0,-3:00,2,15,0,0,-4:00
+1997,America/Sao_Paulo,2002,Brazil,-180,60,11,3,-1,0,-3:00,2,15,0,0,-4:00
+1998,America/Sao_Paulo,2003,Brazil,-180,60,10,19,-1,0,-3:00,2,15,0,0,-4:00
+1999,America/Sao_Paulo,2004,Brazil,-180,60,11,2,-1,0,-3:00,2,15,0,0,-4:00
+2000,America/Sao_Paulo,2005,Brazil,-180,60,10,16,-1,0,-3:00,2,15,0,0,-4:00
+2001,America/Sao_Paulo,2006,Brazil,-180,60,11,5,-1,0,-3:00,2,15,0,0,-4:00
+2002,America/Sao_Paulo,2007,Brazil,-180,60,10,8,0,0,-3:00,2,25,-1,0,-4:00
+2003,America/Sao_Paulo,2008,Brazil,-180,60,10,15,0,0,-3:00,2,15,0,0,-4:00
+2004,America/Sao_Paulo,2012,Brazil,-180,60,10,15,0,0,-3:00,2,22,0,0,-4:00
+2005,America/Sao_Paulo,2013,Brazil,-180,60,10,15,0,0,-3:00,2,15,0,0,-4:00
+2006,America/Sao_Paulo,2015,Brazil,-180,60,10,15,0,0,-3:00,2,22,0,0,-4:00
+2007,America/Sao_Paulo,2016,Brazil,-180,60,10,15,0,0,-3:00,2,15,0,0,-4:00
+2008,America/Campo_Grande,1970,Brazil,-240,0,12,31,-1,0,08:00,3,1,-1,0,-5:00
+2009,America/Campo_Grande,1985,Brazil,-240,60,11,2,-1,0,-4:00,1,1,-1,0,07:00
+2010,America/Campo_Grande,1986,Brazil,-240,60,10,25,-1,0,-4:00,3,15,-1,0,-5:00
+2011,America/Campo_Grande,1987,Brazil,-240,60,10,25,-1,0,-4:00,2,14,-1,0,-5:00
+2012,America/Campo_Grande,1988,Brazil,-240,60,10,16,-1,0,-4:00,2,7,-1,0,-5:00
+2013,America/Campo_Grande,1989,Brazil,-240,60,10,15,-1,0,-4:00,1,29,-1,0,-5:00
+2014,America/Campo_Grande,1990,Brazil,-240,60,10,21,-1,0,-4:00,2,11,-1,0,-5:00
+2015,America/Campo_Grande,1991,Brazil,-240,60,10,20,-1,0,-4:00,2,17,-1,0,-5:00
+2016,America/Campo_Grande,1992,Brazil,-240,60,10,25,-1,0,-4:00,2,9,-1,0,-5:00
+2017,America/Campo_Grande,1993,Brazil,-240,60,10,11,0,0,-4:00,1,31,-1,0,-5:00
+2018,America/Campo_Grande,1994,Brazil,-240,60,10,11,0,0,-4:00,2,15,0,0,-5:00
+2019,America/Campo_Grande,1996,Brazil,-240,60,10,6,-1,0,-4:00,2,11,-1,0,-5:00
+2020,America/Campo_Grande,1997,Brazil,-240,60,10,6,-1,0,-4:00,2,16,-1,0,-5:00
+2021,America/Campo_Grande,1998,Brazil,-240,60,10,11,-1,0,-4:00,3,1,-1,0,-5:00
+2022,America/Campo_Grande,1999,Brazil,-240,60,10,3,-1,0,-4:00,2,21,-1,0,-5:00
+2023,America/Campo_Grande,2000,Brazil,-240,60,10,8,0,0,-4:00,2,27,-1,0,-5:00
+2024,America/Campo_Grande,2001,Brazil,-240,60,10,8,0,0,-4:00,2,15,0,0,-5:00
+2025,America/Campo_Grande,2002,Brazil,-240,60,11,3,-1,0,-4:00,2,15,0,0,-5:00
+2026,America/Campo_Grande,2003,Brazil,-240,60,10,19,-1,0,-4:00,2,15,0,0,-5:00
+2027,America/Campo_Grande,2004,Brazil,-240,60,11,2,-1,0,-4:00,2,15,0,0,-5:00
+2028,America/Campo_Grande,2005,Brazil,-240,60,10,16,-1,0,-4:00,2,15,0,0,-5:00
+2029,America/Campo_Grande,2006,Brazil,-240,60,11,5,-1,0,-4:00,2,15,0,0,-5:00
+2030,America/Campo_Grande,2007,Brazil,-240,60,10,8,0,0,-4:00,2,25,-1,0,-5:00
+2031,America/Campo_Grande,2008,Brazil,-240,60,10,15,0,0,-4:00,2,15,0,0,-5:00
+2032,America/Campo_Grande,2012,Brazil,-240,60,10,15,0,0,-4:00,2,22,0,0,-5:00
+2033,America/Campo_Grande,2013,Brazil,-240,60,10,15,0,0,-4:00,2,15,0,0,-5:00
+2034,America/Campo_Grande,2015,Brazil,-240,60,10,15,0,0,-4:00,2,22,0,0,-5:00
+2035,America/Campo_Grande,2016,Brazil,-240,60,10,15,0,0,-4:00,2,15,0,0,-5:00
+2036,America/Cuiaba,1970,Brazil,-240,0,12,31,-1,0,08:00,3,1,-1,0,-5:00
+2037,America/Cuiaba,1985,Brazil,-240,60,11,2,-1,0,-4:00,1,1,-1,0,07:00
+2038,America/Cuiaba,1986,Brazil,-240,60,10,25,-1,0,-4:00,3,15,-1,0,-5:00
+2039,America/Cuiaba,1987,Brazil,-240,60,10,25,-1,0,-4:00,2,14,-1,0,-5:00
+2040,America/Cuiaba,1988,Brazil,-240,60,10,16,-1,0,-4:00,2,7,-1,0,-5:00
+2041,America/Cuiaba,1989,Brazil,-240,60,10,15,-1,0,-4:00,1,29,-1,0,-5:00
+2042,America/Cuiaba,1990,Brazil,-240,60,10,21,-1,0,-4:00,2,11,-1,0,-5:00
+2043,America/Cuiaba,1991,Brazil,-240,60,10,20,-1,0,-4:00,2,17,-1,0,-5:00
+2044,America/Cuiaba,1992,Brazil,-240,60,10,25,-1,0,-4:00,2,9,-1,0,-5:00
+2045,America/Cuiaba,1993,Brazil,-240,60,10,11,0,0,-4:00,1,31,-1,0,-5:00
+2046,America/Cuiaba,1994,Brazil,-240,60,10,11,0,0,-4:00,2,15,0,0,-5:00
+2047,America/Cuiaba,1996,Brazil,-240,60,10,6,-1,0,-4:00,2,11,-1,0,-5:00
+2048,America/Cuiaba,1997,Brazil,-240,60,10,6,-1,0,-4:00,2,16,-1,0,-5:00
+2049,America/Cuiaba,1998,Brazil,-240,60,10,11,-1,0,-4:00,3,1,-1,0,-5:00
+2050,America/Cuiaba,1999,Brazil,-240,60,10,3,-1,0,-4:00,2,21,-1,0,-5:00
+2051,America/Cuiaba,2000,Brazil,-240,60,10,8,0,0,-4:00,2,27,-1,0,-5:00
+2052,America/Cuiaba,2001,Brazil,-240,60,10,8,0,0,-4:00,2,15,0,0,-5:00
+2053,America/Cuiaba,2002,Brazil,-240,60,11,3,-1,0,-4:00,2,15,0,0,-5:00
+2054,America/Cuiaba,2003,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+2055,America/Cuiaba,2004,Brazil,-240,60,11,2,-1,0,-4:00,2,15,0,0,-5:00
+2056,America/Cuiaba,2005,Brazil,-240,60,10,16,-1,0,-4:00,2,15,0,0,-5:00
+2057,America/Cuiaba,2006,Brazil,-240,60,11,5,-1,0,-4:00,2,15,0,0,-5:00
+2058,America/Cuiaba,2007,Brazil,-240,60,10,8,0,0,-4:00,2,25,-1,0,-5:00
+2059,America/Cuiaba,2008,Brazil,-240,60,10,15,0,0,-4:00,2,15,0,0,-5:00
+2060,America/Cuiaba,2012,Brazil,-240,60,10,15,0,0,-4:00,2,22,0,0,-5:00
+2061,America/Cuiaba,2013,Brazil,-240,60,10,15,0,0,-4:00,2,15,0,0,-5:00
+2062,America/Cuiaba,2015,Brazil,-240,60,10,15,0,0,-4:00,2,22,0,0,-5:00
+2063,America/Cuiaba,2016,Brazil,-240,60,10,15,0,0,-4:00,2,15,0,0,-5:00
+2064,America/Porto_Velho,1970,Brazil,-240,0,12,31,-1,0,08:00,3,1,-1,0,-5:00
+2065,America/Porto_Velho,1985,Brazil,-240,60,11,2,-1,0,-4:00,1,1,-1,0,07:00
+2066,America/Porto_Velho,1986,Brazil,-240,60,10,25,-1,0,-4:00,3,15,-1,0,-5:00
+2067,America/Porto_Velho,1987,Brazil,-240,60,10,25,-1,0,-4:00,2,14,-1,0,-5:00
+2068,America/Porto_Velho,1988,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+2069,America/Boa_Vista,1970,Brazil,-240,0,12,31,-1,0,08:00,3,1,-1,0,-5:00
+2070,America/Boa_Vista,1985,Brazil,-240,60,11,2,-1,0,-4:00,1,1,-1,0,07:00
+2071,America/Boa_Vista,1986,Brazil,-240,60,10,25,-1,0,-4:00,3,15,-1,0,-5:00
+2072,America/Boa_Vista,1987,Brazil,-240,60,10,25,-1,0,-4:00,2,14,-1,0,-5:00
+2073,America/Boa_Vista,1988,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+2074,America/Boa_Vista,1999,Brazil,-240,60,10,3,-1,0,-4:00,2,21,-1,0,-5:00
+2075,America/Boa_Vista,2000,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+2076,America/Manaus,1970,Brazil,-240,0,12,31,-1,0,08:00,3,1,-1,0,-5:00
+2077,America/Manaus,1985,Brazil,-240,60,11,2,-1,0,-4:00,1,1,-1,0,07:00
+2078,America/Manaus,1986,Brazil,-240,60,10,25,-1,0,-4:00,3,15,-1,0,-5:00
+2079,America/Manaus,1987,Brazil,-240,60,10,25,-1,0,-4:00,2,14,-1,0,-5:00
+2080,America/Manaus,1988,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+2081,America/Manaus,1993,Brazil,-240,60,10,11,0,0,-4:00,1,31,-1,0,-5:00
+2082,America/Manaus,1994,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+2083,America/Eirunepe,1970,Brazil,-300,0,12,31,-1,0,07:00,3,1,-1,0,-6:00
+2084,America/Eirunepe,1985,Brazil,-300,60,11,2,-1,0,-5:00,1,1,-1,0,06:00
+2085,America/Eirunepe,1986,Brazil,-300,60,10,25,-1,0,-5:00,3,15,-1,0,-6:00
+2086,America/Eirunepe,1987,Brazil,-300,60,10,25,-1,0,-5:00,2,14,-1,0,-6:00
+2087,America/Eirunepe,1988,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+2088,America/Eirunepe,1993,Brazil,-300,60,10,11,0,0,-5:00,1,31,-1,0,-6:00
+2089,America/Eirunepe,1994,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+2090,America/Eirunepe,2008,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+2091,America/Rio_Branco,1970,Brazil,-300,0,12,31,-1,0,07:00,3,1,-1,0,-6:00
+2092,America/Rio_Branco,1985,Brazil,-300,60,11,2,-1,0,-5:00,1,1,-1,0,06:00
+2093,America/Rio_Branco,1986,Brazil,-300,60,10,25,-1,0,-5:00,3,15,-1,0,-6:00
+2094,America/Rio_Branco,1987,Brazil,-300,60,10,25,-1,0,-5:00,2,14,-1,0,-6:00
+2095,America/Rio_Branco,1988,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+2096,America/Rio_Branco,2008,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+2097,America/Santiago,1970,Chile,-240,60,10,9,0,0,4:00,3,29,-1,0,3:00
+2098,America/Santiago,1971,Chile,-240,60,10,9,0,0,4:00,3,14,-1,0,3:00
+2099,America/Santiago,1972,Chile,-240,60,10,9,0,0,4:00,3,9,0,0,3:00
+2100,America/Santiago,1973,Chile,-240,60,9,30,-1,0,4:00,3,9,0,0,3:00
+2101,America/Santiago,1974,Chile,-240,60,10,9,0,0,4:00,3,9,0,0,3:00
+2102,America/Santiago,1987,Chile,-240,60,10,9,0,0,4:00,4,12,-1,0,3:00
+2103,America/Santiago,1988,Chile,-240,60,10,1,0,0,4:00,3,9,0,0,3:00
+2104,America/Santiago,1989,Chile,-240,60,10,9,0,0,4:00,3,9,0,0,3:00
+2105,America/Santiago,1990,Chile,-240,60,9,16,-1,0,4:00,3,18,-1,0,3:00
+2106,America/Santiago,1991,Chile,-240,60,10,9,0,0,4:00,3,9,0,0,3:00
+2107,America/Santiago,1997,Chile,-240,60,10,9,0,0,4:00,3,30,-1,0,3:00
+2108,America/Santiago,1998,Chile,-240,60,9,27,-1,0,4:00,3,9,0,0,3:00
+2109,America/Santiago,1999,Chile,-240,60,10,9,0,0,4:00,4,4,-1,0,3:00
+2110,America/Santiago,2000,Chile,-240,60,10,9,0,0,4:00,3,9,0,0,3:00
+2111,America/Santiago,2008,Chile,-240,60,10,9,0,0,4:00,3,30,-1,0,3:00
+2112,America/Santiago,2009,Chile,-240,60,10,9,0,0,4:00,3,9,0,0,3:00
+2113,America/Santiago,2010,Chile,-240,60,10,9,0,0,4:00,4,1,0,0,3:00
+2114,America/Santiago,2011,Chile,-240,60,8,16,0,0,4:00,5,2,0,0,3:00
+2115,America/Santiago,2012,Chile,-240,60,10,9,0,0,4:00,3,9,0,0,3:00
+2116,Pacific/Easter,1970,Chile,-420,60,10,9,0,0,4:00,3,29,-1,0,3:00
+2117,Pacific/Easter,1971,Chile,-420,60,10,9,0,0,4:00,3,14,-1,0,3:00
+2118,Pacific/Easter,1972,Chile,-420,60,10,9,0,0,4:00,3,9,0,0,3:00
+2119,Pacific/Easter,1973,Chile,-420,60,9,30,-1,0,4:00,3,9,0,0,3:00
+2120,Pacific/Easter,1974,Chile,-420,60,10,9,0,0,4:00,3,9,0,0,3:00
+2121,Pacific/Easter,1982,Chile,-360,60,10,9,0,0,4:00,3,9,0,0,3:00
+2122,Pacific/Easter,1987,Chile,-360,60,10,9,0,0,4:00,4,12,-1,0,3:00
+2123,Pacific/Easter,1988,Chile,-360,60,10,1,0,0,4:00,3,9,0,0,3:00
+2124,Pacific/Easter,1989,Chile,-360,60,10,9,0,0,4:00,3,9,0,0,3:00
+2125,Pacific/Easter,1990,Chile,-360,60,9,16,-1,0,4:00,3,18,-1,0,3:00
+2126,Pacific/Easter,1991,Chile,-360,60,10,9,0,0,4:00,3,9,0,0,3:00
+2127,Pacific/Easter,1997,Chile,-360,60,10,9,0,0,4:00,3,30,-1,0,3:00
+2128,Pacific/Easter,1998,Chile,-360,60,9,27,-1,0,4:00,3,9,0,0,3:00
+2129,Pacific/Easter,1999,Chile,-360,60,10,9,0,0,4:00,4,4,-1,0,3:00
+2130,Pacific/Easter,2000,Chile,-360,60,10,9,0,0,4:00,3,9,0,0,3:00
+2131,Pacific/Easter,2008,Chile,-360,60,10,9,0,0,4:00,3,30,-1,0,3:00
+2132,Pacific/Easter,2009,Chile,-360,60,10,9,0,0,4:00,3,9,0,0,3:00
+2133,Pacific/Easter,2010,Chile,-360,60,10,9,0,0,4:00,4,1,0,0,3:00
+2134,Pacific/Easter,2011,Chile,-360,60,8,16,0,0,4:00,5,2,0,0,3:00
+2135,Pacific/Easter,2012,Chile,-360,60,10,9,0,0,4:00,3,9,0,0,3:00
+2136,America/Bogota,1970,CO,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+2137,America/Bogota,1992,CO,-300,60,5,3,-1,0,-5:00,1,1,-1,0,06:00
+2138,America/Bogota,1993,CO,-300,0,12,31,-1,0,07:00,4,4,-1,0,-6:00
+2139,America/Curacao,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+2140,America/Guayaquil,1970,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+2141,Pacific/Galapagos,1970,,-300,0,0,0,0,0,00:00,0,0,0,0,00:00
+2142,Pacific/Galapagos,1986,,-360,0,0,0,0,0,00:00,0,0,0,0,00:00
+2143,Atlantic/Stanley,1970,Falk,-240,0,12,31,-1,0,08:00,1,1,-1,0,-5:00
+2144,Atlantic/Stanley,1983,Falk,-180,60,9,-1,0,0,-3:00,1,1,-1,0,08:00
+2145,Atlantic/Stanley,1984,Falk,-180,60,9,16,-1,0,-3:00,4,-1,0,0,-4:00
+2146,Atlantic/Stanley,1985,Falk,-240,60,9,9,0,0,-4:00,4,-1,0,0,-5:00
+2147,Atlantic/Stanley,1986,Falk,-240,60,9,9,0,0,-4:00,4,16,0,0,-5:00
+2148,Atlantic/Stanley,2001,Falk,-240,60,9,1,0,0,-2:00,4,15,0,0,-3:00
+2149,Atlantic/Stanley,2011,Falk,-240,60,9,1,0,0,-2:00,1,1,-1,0,07:00
+2150,Atlantic/Stanley,2012,Falk,-240,60,9,1,0,0,-2:00,4,15,0,0,-3:00
+2151,America/Cayenne,1970,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+2152,America/Guyana,1970,,-225,0,0,0,0,0,00:00,0,0,0,0,00:00
+2153,America/Guyana,1975,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+2154,America/Guyana,1991,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+2155,America/Asuncion,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+2156,America/Asuncion,1972,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+2157,America/Asuncion,1974,Para,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+2158,America/Asuncion,1975,Para,-240,60,10,1,-1,0,-4:00,3,1,-1,0,-5:00
+2159,America/Asuncion,1979,Para,-240,60,10,1,-1,0,-4:00,4,1,-1,0,-5:00
+2160,America/Asuncion,1989,Para,-240,60,10,22,-1,0,-4:00,4,1,-1,0,-5:00
+2161,America/Asuncion,1990,Para,-240,60,10,1,-1,0,-4:00,4,1,-1,0,-5:00
+2162,America/Asuncion,1991,Para,-240,60,10,6,-1,0,-4:00,4,1,-1,0,-5:00
+2163,America/Asuncion,1992,Para,-240,60,10,5,-1,0,-4:00,3,1,-1,0,-5:00
+2164,America/Asuncion,1993,Para,-240,60,10,1,-1,0,-4:00,3,31,-1,0,-5:00
+2165,America/Asuncion,1994,Para,-240,60,10,1,-1,0,-4:00,2,-1,0,0,-5:00
+2166,America/Asuncion,1996,Para,-240,60,10,1,0,0,-4:00,3,1,-1,0,-5:00
+2167,America/Asuncion,1997,Para,-240,60,10,1,0,0,-4:00,2,-1,0,0,-5:00
+2168,America/Asuncion,1998,Para,-240,60,10,1,0,0,-4:00,3,1,0,0,-5:00
+2169,America/Asuncion,2002,Para,-240,60,9,1,0,0,-4:00,4,1,0,0,-5:00
+2170,America/Asuncion,2004,Para,-240,60,10,15,0,0,-4:00,4,1,0,0,-5:00
+2171,America/Asuncion,2005,Para,-240,60,10,15,0,0,-4:00,3,8,0,0,-5:00
+2172,America/Asuncion,2010,Para,-240,60,10,1,0,0,-4:00,4,8,0,0,-5:00
+2173,America/Lima,1970,Peru,-300,0,12,31,-1,0,07:00,3,24,0,0,-6:00
+2174,America/Lima,1986,Peru,-300,60,1,1,-1,0,-5:00,4,1,-1,0,-6:00
+2175,America/Lima,1995,Peru,-300,0,1,1,-1,0,-5:00,4,1,-1,0,-6:00
+2176,Atlantic/South_Georgia,1970,,-120,0,0,0,0,0,00:00,0,0,0,0,00:00
+2177,America/Paramaribo,1970,,-210,0,0,0,0,0,00:00,0,0,0,0,00:00
+2178,America/Paramaribo,1975,,-210,0,0,0,0,0,00:00,0,0,0,0,00:00
+2179,America/Paramaribo,1984,,-180,0,0,0,0,0,00:00,0,0,0,0,00:00
+2180,America/Port_of_Spain,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+2181,America/Montevideo,1970,Uruguay,-180,30,5,27,-1,0,-3:00,12,2,-1,0,-4:00
+2182,America/Montevideo,1972,Uruguay,-180,60,4,24,-1,0,-3:00,8,15,-1,0,-4:00
+2183,America/Montevideo,1974,Uruguay,-180,60,12,22,-1,0,-3:00,1,1,-1,0,08:00
+2184,America/Montevideo,1976,Uruguay,-180,0,12,31,-1,0,09:00,10,1,-1,0,-4:00
+2185,America/Montevideo,1977,Uruguay,-180,60,12,4,-1,0,-3:00,1,1,-1,0,08:00
+2186,America/Montevideo,1978,Uruguay,-180,0,12,31,-1,0,09:00,4,1,-1,0,-4:00
+2187,America/Montevideo,1979,Uruguay,-180,60,10,1,-1,0,-3:00,1,1,-1,0,08:00
+2188,America/Montevideo,1980,Uruguay,-180,0,12,31,-1,0,09:00,5,1,-1,0,-4:00
+2189,America/Montevideo,1987,Uruguay,-180,60,12,14,-1,0,-3:00,1,1,-1,0,08:00
+2190,America/Montevideo,1988,Uruguay,-180,60,12,11,-1,0,-3:00,3,14,-1,0,-4:00
+2191,America/Montevideo,1989,Uruguay,-180,60,10,29,-1,0,-3:00,3,12,-1,0,-4:00
+2192,America/Montevideo,1990,Uruguay,-180,60,10,21,0,0,-3:00,3,1,0,0,-4:00
+2193,America/Montevideo,1992,Uruguay,-180,60,10,18,-1,0,-3:00,3,1,0,0,-4:00
+2194,America/Montevideo,1993,Uruguay,-180,0,12,31,-1,0,09:00,2,28,-1,0,-4:00
+2195,America/Montevideo,2004,Uruguay,-180,60,9,19,-1,0,-3:00,1,1,-1,0,08:00
+2196,America/Montevideo,2005,Uruguay,-180,60,10,9,-1,0,-1:00,3,27,-1,0,-2:00
+2197,America/Montevideo,2006,Uruguay,-180,60,10,1,0,0,-1:00,3,12,-1,0,-2:00
+2198,America/Montevideo,2007,Uruguay,-180,60,10,1,0,0,-1:00,3,8,0,0,-2:00
+2199,America/Caracas,1970,,-240,0,0,0,0,0,00:00,0,0,0,0,00:00
+2200,America/Caracas,2007,,-270,0,0,0,0,0,00:00,0,0,0,0,00:00
index 1232659..d314ef2 100644 (file)
@@ -1528,7 +1528,7 @@ function purify_html($text, $options = array()) {
         $config->set('Core.ConvertDocumentToFragment', true);
         $config->set('Core.Encoding', 'UTF-8');
         $config->set('HTML.Doctype', 'XHTML 1.0 Transitional');
-        $config->set('URI.AllowedSchemes', array('http'=>true, 'https'=>true, 'ftp'=>true, 'irc'=>true, 'nntp'=>true, 'news'=>true, 'rtsp'=>true, 'teamspeak'=>true, 'gopher'=>true, 'mms'=>true));
+        $config->set('URI.AllowedSchemes', array('http'=>true, 'https'=>true, 'ftp'=>true, 'irc'=>true, 'nntp'=>true, 'news'=>true, 'rtsp'=>true, 'teamspeak'=>true, 'gopher'=>true, 'mms'=>true, 'mailto'=>true));
         $config->set('Attr.AllowedFrameTargets', array('_blank'));
 
         if (!empty($CFG->allowobjectembed)) {
index 86c5832..60917e1 100644 (file)
@@ -2372,6 +2372,7 @@ class mod_assignment_grading_form extends moodleform {
         $editoroptions['noclean'] = false;
         $editoroptions['maxfiles'] = 0; //TODO: no files for now, we need to first implement assignment_feedback area, integration with gradebook, files support in quickgrading, etc. (skodak)
         $editoroptions['maxbytes'] = $this->_customdata->maxbytes;
+        $editoroptions['context'] = $this->_customdata->context;
         return $editoroptions;
     }
 
index 05b0e1e..f9ce0fa 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 require_once("$CFG->libdir/simpletest/portfolio_testclass.php");
 require_once("$CFG->dirroot/mod/assignment/lib.php");
-require_once("$CFG->dirroot/$CFG->admin/generator.php");
 require_once("$CFG->dirroot/mod/assignment/locallib.php");
 
 Mock::generate('assignment_portfolio_caller', 'mock_caller');
index 54532f7..b705528 100644 (file)
@@ -38,7 +38,12 @@ class assignment_online extends assignment_base {
 
         if ($editmode) {
             // prepare form and process submitted data
-            $editoroptions = array('noclean'=>false, 'maxfiles'=>EDITOR_UNLIMITED_FILES, 'maxbytes'=>$this->course->maxbytes);
+            $editoroptions = array(
+                'noclean'  => false,
+                'maxfiles' => EDITOR_UNLIMITED_FILES,
+                'maxbytes' => $this->course->maxbytes,
+                'context'  => $this->context
+            );
 
             $data = new stdClass();
             $data->id         = $this->cm->id;
index c8f1696..1069a43 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 require_once("$CFG->libdir/simpletest/portfolio_testclass.php");
 require_once("$CFG->dirroot/mod/chat/lib.php");
-require_once("$CFG->dirroot/$CFG->admin/generator.php");
 
 /*
  * TODO: The portfolio unit tests were obselete and did not work.
index 626ef7f..4ea08e4 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 require_once("$CFG->libdir/simpletest/portfolio_testclass.php");
 require_once("$CFG->dirroot/mod/data/lib.php");
-require_once("$CFG->dirroot/$CFG->admin/generator.php");
 require_once("$CFG->dirroot/mod/data/locallib.php");
 
 /*
index ce9b399..5e5df4c 100644 (file)
@@ -49,6 +49,10 @@ class feedback_item_label extends feedback_item_base {
         //preparing the editor for new file-api
         $item->presentationformat = FORMAT_HTML;
         $item->presentationtrust = 1;
+
+        // Append editor context to presentation options, giving preference to existing context.
+        $this->presentationoptions = array_merge(array('context' => $this->context), $this->presentationoptions);
+
         $item = file_prepare_standard_editor($item,
                                             'presentation', //name of the form element
                                             $this->presentationoptions,
index d6d6da0..503ef15 100644 (file)
@@ -26,7 +26,6 @@
 
 require_once("$CFG->libdir/simpletest/portfolio_testclass.php");
 require_once("$CFG->dirroot/mod/forum/lib.php");
-require_once("$CFG->dirroot/$CFG->admin/generator.php");
 
 /*
  * TODO: The portfolio unit tests were obselete and did not work.
index 066260b..78ac42a 100644 (file)
@@ -2,7 +2,6 @@
 require_once("$CFG->libdir/simpletest/portfolio_testclass.php");
 require_once("$CFG->dirroot/mod/glossary/lib.php");
 require_once("$CFG->dirroot/mod/glossary/locallib.php");
-require_once("$CFG->dirroot/$CFG->admin/generator.php");
 
 /*
  * TODO: The portfolio unit tests were obselete and did not work.
index e9bffb8..f725cae 100644 (file)
@@ -84,6 +84,7 @@ if ($edit) {
     $data = $editpage->properties();
     $data->pageid = $editpage->id;
     $data->id = $cm->id;
+    $editoroptions['context'] = $context;
     $data = file_prepare_standard_editor($data, 'contents', $editoroptions, $context, 'mod_lesson', 'page_contents',  $editpage->id);
     $mform->set_data($data);
     $PAGE->navbar->add(get_string('edit'), new moodle_url('/mod/lesson/edit.php', array('id'=>$id)));
index df4668a..15a9d8f 100644 (file)
@@ -453,8 +453,7 @@ echo '<div id="module" class="module">';
 echo '<div class="bd">';
 $questionbank->display('editq',
         $pagevars['qpage'],
-        $pagevars['qperpage'], $pagevars['qsortorder'],
-        $pagevars['qsortorderdecoded'],
+        $pagevars['qperpage'],
         $pagevars['cat'], $pagevars['recurse'], $pagevars['showhidden'],
         $pagevars['showquestiontext']);
 echo '</div>';
index 43dffcc..9f653c0 100644 (file)
@@ -1129,8 +1129,8 @@ class quiz_question_bank_view extends question_bank_view {
         return new moodle_url('/mod/quiz/edit.php', $params);
     }
 
-    public function display($tabname, $page, $perpage, $sortorder,
-            $sortorderdecoded, $cat, $recurse, $showhidden, $showquestiontext) {
+    public function display($tabname, $page, $perpage, $cat,
+            $recurse, $showhidden, $showquestiontext) {
         global $OUTPUT;
         if ($this->process_actions_needing_ui()) {
             return;
@@ -1150,7 +1150,7 @@ class quiz_question_bank_view extends question_bank_view {
         // continues with list of questions
         $this->display_question_list($this->contexts->having_one_edit_tab_cap($tabname),
                 $this->baseurl, $cat, $this->cm, $recurse, $page,
-                $perpage, $showhidden, $sortorder, $sortorderdecoded, $showquestiontext,
+                $perpage, $showhidden, $showquestiontext,
                 $this->contexts->having_cap('moodle/question:add'));
 
         $this->display_options($recurse, $showhidden, $showquestiontext);
@@ -1183,15 +1183,14 @@ class quiz_question_bank_view extends question_bank_view {
         echo '</span></div></div>';
     }
 
-    protected function display_options($recurse = 1, $showhidden = false,
-            $showquestiontext = false) {
+    protected function display_options($recurse, $showhidden, $showquestiontext) {
         echo '<form method="get" action="edit.php" id="displayoptions">';
         echo "<fieldset class='invisiblefieldset'>";
         echo html_writer::input_hidden_params($this->baseurl,
                 array('recurse', 'showhidden', 'showquestiontext'));
-        $this->display_category_form_checkbox('recurse',
+        $this->display_category_form_checkbox('recurse', $recurse,
                 get_string('includesubcategories', 'question'));
-        $this->display_category_form_checkbox('showhidden',
+        $this->display_category_form_checkbox('showhidden', $showhidden,
                 get_string('showhidden', 'question'));
         echo '<noscript><div class="centerpara"><input type="submit" value="' .
                 get_string('go') . '" />';
index 479579c..3feae77 100644 (file)
@@ -121,7 +121,6 @@ $string['cannotinsertrandomquestion'] = 'Could not insert new random question!';
 $string['cannotloadquestion'] = 'Could not load question options';
 $string['cannotloadtypeinfo'] = 'Unable to load questiontype specific question information';
 $string['cannotopen'] = 'Cannot open export file ({$a})';
-$string['cannotread'] = 'Cannot read import file (or file is empty)';
 $string['cannotrestore'] = 'Could not restore question sessions';
 $string['cannotreviewopen'] = 'You cannot review this attempt, it is still open.';
 $string['cannotsavelayout'] = 'Could not save layout';
index cde3701..a81aa5e 100644 (file)
@@ -588,6 +588,7 @@ function quiz_upgrade_grades() {
  */
 function quiz_grade_item_update($quiz, $grades = null) {
     global $CFG, $OUTPUT;
+    require_once($CFG->dirroot . '/mod/quiz/locallib.php');
     require_once($CFG->libdir.'/gradelib.php');
 
     if (array_key_exists('cmidnumber', $quiz)) { // may not be always present
index de70778..aec7809 100644 (file)
@@ -117,11 +117,7 @@ class quiz_overview_report extends quiz_attempt_report {
         }
 
         // Load the required questions.
-        if ($detailedmarks) {
-            $questions = quiz_report_get_significant_questions($quiz);
-        } else {
-            $questions = array();
-        }
+        $questions = quiz_report_get_significant_questions($quiz);
 
         $table = new quiz_report_overview_table($quiz, $this->context, $qmsubselect,
                 $groupstudents, $students, $detailedmarks, $questions, $candelete,
index 3aa9022..1c030f4 100644 (file)
@@ -98,12 +98,18 @@ class quiz_statistics_response_analyser {
 
     /**
      * @return bool whether this analysis has a response class more than one
-     *      different acutal response.
+     *      different acutal response, or if the actual response is different from
+     *      the model response.
      */
     public function has_actual_responses() {
         foreach ($this->responseclasses as $subpartid => $partclasses) {
-            foreach ($partclasses as $responseclassid => $notused) {
-                if (count($this->responses[$subpartid][$responseclassid]) > 1) {
+            foreach ($partclasses as $responseclassid => $modelresponse) {
+                $numresponses = count($this->responses[$subpartid][$responseclassid]);
+                if ($numresponses > 1) {
+                    return true;
+                }
+                $actualresponse = key($this->responses[$subpartid][$responseclassid]);
+                if ($numresponses == 1 && $actualresponse != $modelresponse->responseclass) {
                     return true;
                 }
             }
index 9d3c4ab..cd36bd9 100644 (file)
@@ -173,7 +173,7 @@ if ($attempt->timefinish) {
     );
     $summarydata['timetaken'] = array(
         'title'   => get_string('timetaken', 'quiz'),
-        'content' => format_time($timetaken),
+        'content' => $timetaken,
     );
 }
 
index e67fd70..88875ce 100644 (file)
@@ -60,7 +60,7 @@ require_login($course->id, false, $cm);
 
 if ($usertrack = scorm_get_tracks($scoid, $USER->id, $attempt)) {
     //according to SCORM 2004 spec(RTE V1, 4.2.8), only cmi.exit==suspend should allow previous datamodel elements on re-launch
-    if ($scorm->version != "SCORM_1.3" || (isset($usertrack->{'cmi.exit'}) && ($usertrack->{'cmi.exit'} == 'suspend'))) {
+    if (!scorm_version_check($scorm->version, SCORM_13) || (isset($usertrack->{'cmi.exit'}) && ($usertrack->{'cmi.exit'} == 'suspend'))) {
         foreach ($usertrack as $key => $value) {
             $userdata->$key = addslashes_js($value);
         }
@@ -93,6 +93,9 @@ if ($scodatas = scorm_get_sco($scoid, SCO_DATA)) {
 if (!$sco = scorm_get_sco($scoid)) {
     print_error('cannotfindsco', 'scorm');
 }
+if (scorm_version_check($scorm->version, SCORM_13)) {
+    $userdata->{'cmi.scaled_passing_score'} = $DB->get_field('scorm_seq_objective', 'minnormalizedmeasure', array('scoid'=>$scoid));
+}
 $scorm->version = strtolower(clean_param($scorm->version, PARAM_SAFEDIR));   // Just to be safe
 if (file_exists($CFG->dirroot.'/mod/scorm/datamodels/'.$scorm->version.'.js.php')) {
     include_once($CFG->dirroot.'/mod/scorm/datamodels/'.$scorm->version.'.js.php');
index 6ca2fd0..b84547a 100644 (file)
@@ -85,11 +85,11 @@ var logRow = 0;
 var logPopUpWindow = "N";
 var debugSCORMVersion = '<?php echo $scorm->version; ?>';
 <?php
-   $LMS_prefix = ($scorm->version == 'scorm_12' || $scorm->version == 'SCORM_1.2' || empty($scorm->version)) ? 'LMS' : '';
-   $LMS_api = ($scorm->version == 'scorm_12' || $scorm->version == 'SCORM_1.2' || empty($scorm->version)) ? 'API' : 'API_1484_11';
+   $LMS_prefix = (scorm_version_check($scorm->version, SCORM_12) || empty($scorm->version)) ? 'LMS' : '';
+   $LMS_api = (scorm_version_check($scorm->version, SCORM_12) || empty($scorm->version)) ? 'API' : 'API_1484_11';
 
    $LMS_elements = array();
-   if ($scorm->version == 'scorm_12' || $scorm->version == 'SCORM_1.2' || empty($scorm->version)) {
+   if (scorm_version_check($scorm->version, SCORM_12) || empty($scorm->version)) {
        $LMS_elements = array(   'cmi.core._children',
                                 'cmi.core.student_id',
                                 'cmi.core.student_name',
@@ -653,8 +653,8 @@ function UpdateLog(s) {
         + '             id="commitButton"'
         + '             name="commitButton">'
         + '            <input type="button"'
-        + '             value="<?php echo $scorm->version == 'scorm_12' ? 'LMSFinish' : 'Terminate'; ?>()  "'
-        + '             onclick="try<?php echo $scorm->version == 'scorm_12' ? 'LMSFinish' : 'LMSTerminate'; ?>();"'
+        + '             value="<?php echo scorm_version_check($scorm->version, SCORM_12) ? 'LMSFinish' : 'Terminate'; ?>()  "'
+        + '             onclick="try<?php echo scorm_version_check($scorm->version, SCORM_12) ? 'LMSFinish' : 'LMSTerminate'; ?>();"'
         + '             id="finishButton"'
         + '             name="finishButton">'
         + '         </td>'
index 75481d8..338ae7f 100644 (file)
@@ -586,7 +586,6 @@ function SCORMapi1_2() {
                                 }
                             } else {
                                 datastring += elementstring;
-                                eval('datamodel["'+elementmodel+'"].defaultvalue=data[property];');
                             }
                         }
                     }
index 8bee8d8..cc77fa7 100644 (file)
@@ -17,7 +17,7 @@
 function scorm_get_resources($blocks) {
     $resources = array();
     foreach ($blocks as $block) {
-        if ($block['name'] == 'RESOURCES') {
+        if ($block['name'] == 'RESOURCES' && isset($block['children'])) {
             foreach ($block['children'] as $resource) {
                 if ($resource['name'] == 'RESOURCE') {
                     $resources[addslashes_js($resource['attrs']['IDENTIFIER'])] = $resource['attrs'];
@@ -29,12 +29,14 @@ function scorm_get_resources($blocks) {
 }
 
 function scorm_get_manifest($blocks, $scoes) {
+    global $OUTPUT;
     static $parents = array();
     static $resources;
 
     static $manifest;
     static $organization;
 
+    $manifestresourcesnotfound = array();
     if (count($blocks) > 0) {
         foreach ($blocks as $block) {
             switch ($block['name']) {
@@ -130,11 +132,16 @@ function scorm_get_manifest($blocks, $scoes) {
                         if (isset($resources[$idref]['XML:BASE'])) {
                             $base = $resources[$idref]['XML:BASE'];
                         }
-                        $scoes->elements[$manifest][$organization][$identifier]->launch = $base.$resources[$idref]['HREF'];
-                        if (empty($resources[$idref]['ADLCP:SCORMTYPE'])) {
-                            $resources[$idref]['ADLCP:SCORMTYPE'] = 'asset';
+                        if (!isset($resources[$idref])) {
+                            $manifestresourcesnotfound[] = $idref;
+                            $scoes->elements[$manifest][$organization][$identifier]->launch = '';
+                        } else {
+                            $scoes->elements[$manifest][$organization][$identifier]->launch = $base.$resources[$idref]['HREF'];
+                            if (empty($resources[$idref]['ADLCP:SCORMTYPE'])) {
+                                $resources[$idref]['ADLCP:SCORMTYPE'] = 'asset';
+                            }
+                            $scoes->elements[$manifest][$organization][$identifier]->scormtype = $resources[$idref]['ADLCP:SCORMTYPE'];
                         }
-                        $scoes->elements[$manifest][$organization][$identifier]->scormtype = $resources[$idref]['ADLCP:SCORMTYPE'];
                     }
 
                     $parent = new stdClass();
@@ -473,6 +480,13 @@ function scorm_get_manifest($blocks, $scoes) {
             }
         }
     }
+    if (!empty($manifestresourcesnotfound)) {
+        //throw warning to user to let them know manifest contains references to resources that don't appear to exist.
+        if (!defined('DEBUGGING_PRINTED')) { //prevent redirect and display warning
+            define('DEBUGGING_PRINTED', 1);
+        }
+        echo $OUTPUT->notification(get_string('invalidmanifestresource', 'scorm').' '. implode(', ',$manifestresourcesnotfound));
+    }
     return $scoes;
 }
 
@@ -586,7 +600,7 @@ function scorm_parse_scorm($scorm, $manifest) {
                             $obj->primaryobj = $objective->primaryobj;
                             $obj->satisfiedbumeasure = $objective->satisfiedbymeasure;
                             $obj->objectiveid = $objective->objectiveid;
-                            $obj->minnormalizedmeasure = $objective->minnormalizedmeasure;
+                            $obj->minnormalizedmeasure = trim($objective->minnormalizedmeasure);
                             $objectiveid = $DB->insert_record('scorm_seq_objective', $obj);
                             if (isset($objective->mapinfos)) {
                                 foreach ($objective->mapinfos as $objmapinfo) {
index c5ce688..2335654 100644 (file)
@@ -546,7 +546,7 @@ function xmldb_scorm_upgrade($oldversion) {
         unset_config('updatetime', 'scorm');
         upgrade_mod_savepoint(true, 2011021402, 'scorm');
     }
-    
+
     if ($oldversion < 2011073100) {
         // change field type of objectiveid
         $table = new xmldb_table('scorm_seq_objective');
@@ -555,6 +555,22 @@ function xmldb_scorm_upgrade($oldversion) {
         upgrade_mod_savepoint(true, 2011073100, 'scorm');
     }
 
+    if ($oldversion < 2011080100) {
+        //MDL-28295 the behaviour of pop-up windows has now changed - it now loads the full Player in the window
+        //because of this, pop-up windows now include the TOC and the nav bar - disabling these for existing SCORMS
+        //as it is a change that most users won't expect.
+        //get all SCORMS that use a new window.
+        require_once($CFG->dirroot."/mod/scorm/lib.php");
+        $rs = $DB->get_recordset('scorm', array('popup' => 1), '', 'id,hidetoc,hidenav');
+        foreach ($rs as $scorm) {
+            $scorm->hidetoc = SCORM_TOC_DISABLED;
+            $scorm->hidenav = 1;
+            $DB->update_record('scorm', $scorm);
+        }
+        $rs->close();
+
+        upgrade_mod_savepoint(true, 2011080100, 'scorm');
+    }
     return true;
 }
 
index 2fcb0ec..b972a29 100644 (file)
@@ -146,6 +146,7 @@ $string['incomplete'] = 'Incomplete';
 $string['info'] = 'Info';
 $string['interactions'] = 'Interactions';
 $string['invalidactivity'] = 'Scorm activity is incorrect';
+$string['invalidmanifestresource'] = 'WARNING: The following resources were referenced in your manifest but couldn\'t be found:';
 $string['last'] = 'Last accessed on';
 $string['lastaccess'] = 'Last access';
 $string['lastattempt'] = 'Last attempt';
index 14690f2..8e3dfb2 100644 (file)
@@ -34,6 +34,11 @@ define('SCORM_TOC_HIDDEN', 1);
 define('SCORM_TOC_POPUP', 2);
 define('SCORM_TOC_DISABLED', 3);
 
+//used to check what SCORM version is being used.
+define('SCORM_12', 1);
+define('SCORM_13', 2);
+define('SCORM_AICC', 3);
+
 /**
  * Given an object containing all the necessary data,
  * (defined by the form in mod_form.php) this function
@@ -1084,3 +1089,38 @@ function scorm_page_type_list($pagetype, $parentcontext, $currentcontext) {
     $module_pagetype = array('mod-scorm-*'=>get_string('page-mod-scorm-x', 'scorm'));
     return $module_pagetype;
 }
+
+/**
+ * Returns the SCORM version used.
+ * @param string $scormversion comes from $scorm->version
+ * @param string $version one of the defined vars SCORM_12, SCORM_13, SCORM_AICC (or empty)
+ * @return Scorm version.
+ */
+function scorm_version_check($scormversion, $version='') {
+    $scormversion = trim(strtolower($scormversion));
+    if (empty($version) || $version==SCORM_12) {
+        if ($scormversion == 'scorm_12' || $scormversion == 'scorm_1.2') {
+            return SCORM_12;
+        }
+        if (!empty($version)) {
+            return false;
+        }
+    }
+    if (empty($version) || $version == SCORM_13) {
+        if ($scormversion == 'scorm_13' || $scormversion == 'scorm_1.3') {
+            return SCORM_13;
+        }
+        if (!empty($version)) {
+            return false;
+        }
+    }
+    if (empty($version) || $version == SCORM_AICC) {
+        if (strpos($scormversion, 'aicc')) {
+            return SCORM_AICC;
+        }
+        if (!empty($version)) {
+            return false;
+        }
+    }
+    return false;
+}
\ No newline at end of file
index 9a1d085..057ea84 100644 (file)
@@ -86,7 +86,7 @@ if (!isset($sco)) {
 
 if ($sco->scormtype == 'asset') {
     $attempt = scorm_get_last_attempt($scorm->id, $USER->id);
-    $element = ($scorm->version == 'scorm_13' || $scorm->version == 'SCORM_1.3') ? 'cmi.completion_status':'cmi.core.lesson_status';
+    $element = (scorm_version_check($scorm->version, SCORM_13)) ? 'cmi.completion_status':'cmi.core.lesson_status';
     $value = 'completed';
     $result = scorm_insert_track($USER->id, $scorm->id, $sco->id, $attempt, $element, $value);
 }
@@ -137,7 +137,7 @@ if (scorm_external_link($sco->launch)) {
 }
 
 // which API are we looking for
-$LMS_api = ($scorm->version == 'scorm_12' || $scorm->version == 'SCORM_1.2' || empty($scorm->version)) ? 'API' : 'API_1484_11';
+$LMS_api = (scorm_version_check($scorm->version, SCORM_12) || empty($scorm->version)) ? 'API' : 'API_1484_11';
 ?>
 <html>
     <head>
index eef5106..fb6e2eb 100644 (file)
@@ -61,7 +61,7 @@ $PAGE->set_url($url);
 require_login($course, false, $cm);
 
 if ($usertrack = scorm_get_tracks($scoid, $USER->id, $attempt)) {
-    if ((isset($usertrack->{'cmi.exit'}) && ($usertrack->{'cmi.exit'} != 'time-out')) || ($scorm->version != "SCORM_1.3")) {
+    if ((isset($usertrack->{'cmi.exit'}) && ($usertrack->{'cmi.exit'} != 'time-out')) || (!scorm_version_check($scorm->version, SCORM_13))) {
         foreach ($usertrack as $key => $value) {
             $userdata->$key = addslashes_js($value);
         }
index 51248fd..ea1dda6 100644 (file)
@@ -886,7 +886,7 @@ function scorm_reconstitute_array_element($sversion, $userdata, $element_name, $
     $count = 0;
     $count_sub = 0;
     $scormseperator = '_';
-    if ($sversion == 'scorm_13') { //scorm 1.3 elements use a . instead of an _
+    if (scorm_version_check($sversion, SCORM_13)) { //scorm 1.3 elements use a . instead of an _
         $scormseperator = '.';
     }
     // filter out the ones we want
@@ -902,7 +902,7 @@ function scorm_reconstitute_array_element($sversion, $userdata, $element_name, $
 
     // generate JavaScript
     foreach ($element_list as $element => $value) {
-        if ($sversion == 'scorm_13') {
+        if (scorm_version_check($sversion, SCORM_13)) {
             $element = preg_replace('/\.(\d+)\./', ".N\$1.", $element);
             preg_match('/\.(N\d+)\./', $element, $matches);
         } else {
@@ -929,7 +929,7 @@ function scorm_reconstitute_array_element($sversion, $userdata, $element_name, $
         }
 
         // now - flesh out the second level elements if there are any
-        if ($sversion == 'scorm_13') {
+        if (scorm_version_check($sversion, SCORM_13)) {
             $element = preg_replace('/(.*?\.N\d+\..*?)\.(\d+)\./', "\$1.N\$2.", $element);
             preg_match('/.*?\.N\d+\.(.*?)\.(N\d+)\./', $element, $matches);
         } else {
@@ -1113,7 +1113,7 @@ function scorm_get_attempt_count($userid, $scorm, $attempts_only=false) {
     if ($scorm->grademethod == GRADESCOES) {
         $element = 'cmi.core.lesson_status';
     }
-    if ($scorm->version == 'scorm_13' || $scorm->version == 'SCORM_1.3') {
+    if (scorm_version_check($scorm->version, SCORM_13)) {
         $element = 'cmi.score.raw';
     }
     $attempts = $DB->get_records_select('scorm_scoes_track', "element=? AND userid=? AND scormid=?", array($element, $userid, $scorm->id), 'attempt', 'DISTINCT attempt AS attemptnumber');
@@ -1288,9 +1288,6 @@ function scorm_get_toc($user,$scorm,$cmid,$toclink=TOCJSLINK,$currentorg='',$sco
         $usertracks = array();
         foreach ($scoes as $sco) {
             if (!empty($sco->launch)) {
-                if (empty($scoid)) {
-                    $scoid = $sco->id;
-                }
                 if ($usertrack = scorm_get_tracks($sco->id,$user->id,$attempt)) {
                     if ($usertrack->status == '') {
                         $usertrack->status = 'notattempted';
@@ -1306,6 +1303,7 @@ function scorm_get_toc($user,$scorm,$cmid,$toclink=TOCJSLINK,$currentorg='',$sco
         $nextid = 0;
         $findnext = false;
         $parents[$level]='/';
+        $prevsco = '';
         foreach ($scoes as $pos => $sco) {
             $isvisible = false;
             $sco->title = $sco->title;
@@ -1384,7 +1382,7 @@ function scorm_get_toc($user,$scorm,$cmid,$toclink=TOCJSLINK,$currentorg='',$sco
                         }
                         $strsuspended = get_string('suspended','scorm');
                         $exitvar = 'cmi.core.exit';
-                        if ($scorm->version == 'SCORM_1.3') {
+                        if (scorm_version_check($scorm->version, SCORM_13)) {
                             $exitvar = 'cmi.exit';
                         }
                         if ($incomplete && isset($usertrack->{$exitvar}) && ($usertrack->{$exitvar} == 'suspend')) {
@@ -1410,8 +1408,7 @@ function scorm_get_toc($user,$scorm,$cmid,$toclink=TOCJSLINK,$currentorg='',$sco
                             $previd = $sco->id;
                         }
                     }
-
-                    if ($scorm->version == 'SCORM_1.3') {
+                    if (scorm_version_check($scorm->version, SCORM_13)) {
                         require_once($CFG->dirroot.'/mod/scorm/datamodels/sequencinglib.php');
                         $prereq = scorm_seq_evaluate($sco->id,$usertracks);
                     } else {
@@ -1422,8 +1419,9 @@ function scorm_get_toc($user,$scorm,$cmid,$toclink=TOCJSLINK,$currentorg='',$sco
                         if ($sco->id == $scoid) {
                             $result->prerequisites = true;
                         }
-
-                        if ($toclink == TOCFULLURL) { //display toc with urls for structure page
+                        if (!empty($prevsco) && scorm_version_check($scorm->version, SCORM_13) && !empty($prevsco->hidecontinue)) {
+                            $result->toc .= '<span>'.$statusicon.'&nbsp;'.format_string($sco->title).'</span>';
+                        } else if ($toclink == TOCFULLURL) { //display toc with urls for structure page
                             $url = $CFG->wwwroot.'/mod/scorm/player.php?a='.$scorm->id.'&amp;currentorg='.$currentorg.$modestr.'&amp;scoid='.$sco->id;
                             $result->toc .= $statusicon.'&nbsp;<a href="'.$url.'">'.format_string($sco->title).'</a>'.$score."\n";
                         } else { //display toc for inside scorm player
@@ -1458,16 +1456,17 @@ function scorm_get_toc($user,$scorm,$cmid,$toclink=TOCJSLINK,$currentorg='',$sco
                     $nextid = $nextsco->id;
                 }
             }
+            $prevsco = $sco;
         }
         for ($i=0;$i<$level;$i++) {
             $result->toc .= "\t\t</ul></li>\n";
         }
 
         if ($play) {
-            if (empty($scoid)) {
-                $scoid = reset($scoes)->id;
+            // it is possible that $scoid is still not set, in this case we don't want an empty object
+            if ($scoid) {
+                $sco = scorm_get_sco($scoid);
             }
-            $sco = scorm_get_sco($scoid);
             $sco->previd = $previd;
             $sco->nextid = $nextid;
             $result->sco = $sco;
index 8467dfd..ef4d1ef 100644 (file)
@@ -120,7 +120,7 @@ M.mod_scorm.init = function(Y, hide_nav, hide_toc, toc_title, window_name, launc
                     var cwidth = scormplayerdata.cwidth;
                     var cheight = scormplayerdata.cheight;
                     var poptions = scormplayerdata.popupoptions;
-                    scorm_openpopup("loadSCO.php?" + node.title, window_name, poptions, cwidth, cheight);
+                    scorm_openpopup(M.cfg.wwwroot + "/mod/scorm/loadSCO.php?" + node.title, window_name, poptions, cwidth, cheight);
                 } else {
                     content.replaceChild(obj, old);
                 }
@@ -146,11 +146,11 @@ M.mod_scorm.init = function(Y, hide_nav, hide_toc, toc_title, window_name, launc
          * @return void
          */
         var scorm_fixnav = function() {
-            scorm_buttons[0].set('disabled', (scorm_skipprev(scorm_current_node) == null));
-            scorm_buttons[1].set('disabled', (scorm_prev(scorm_current_node) == null));
-            scorm_buttons[2].set('disabled', (scorm_up(scorm_current_node) == null));
-            scorm_buttons[3].set('disabled', (scorm_next(scorm_current_node) == null));
-            scorm_buttons[4].set('disabled', (scorm_skipnext(scorm_current_node) == null));
+            scorm_buttons[0].set('disabled', (scorm_skipprev(scorm_current_node) == null || scorm_skipprev(scorm_current_node).title == null));
+            scorm_buttons[1].set('disabled', (scorm_prev(scorm_current_node) == null || scorm_prev(scorm_current_node).title == null));
+            scorm_buttons[2].set('disabled', (scorm_up(scorm_current_node) == null) || scorm_up(scorm_current_node).title == null);
+            scorm_buttons[3].set('disabled', (scorm_next(scorm_current_node) == null) || scorm_next(scorm_current_node).title == null);
+            scorm_buttons[4].set('disabled', (scorm_skipnext(scorm_current_node) == null || scorm_skipnext(scorm_current_node).title == null));
         };
 
         var scorm_resize_parent = function() {
index 01ad0fe..2758d93 100644 (file)
@@ -14,8 +14,7 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 function scorm_openpopup(url,name,options,width,height) {
-    fullurl = M.cfg.wwwroot + '/mod/scorm/' + url;
-    windowobj = window.open(fullurl,name,options);
+    windowobj = window.open(url,name,options);
     if (!windowobj) {
         return;
     }
index ef3700b..781e763 100644 (file)
@@ -26,6 +26,7 @@ $scoid = required_param('scoid', PARAM_INT);  // sco ID
 $mode = optional_param('mode', 'normal', PARAM_ALPHA); // navigation mode
 $currentorg = optional_param('currentorg', '', PARAM_RAW); // selected organization
 $newattempt = optional_param('newattempt', 'off', PARAM_ALPHA); // the user request to start a new attempt
+$displaymode = optional_param('display','',PARAM_ALPHA);
 
 //IE 6 Bug workaround
 if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6') !== false) {
@@ -80,10 +81,14 @@ $strscorm  = get_string('modulename', 'scorm');
 $strpopup = get_string('popup', 'scorm');
 $strexit = get_string('exitactivity', 'scorm');
 
-$pagetitle = strip_tags("$course->shortname: ".format_string($scorm->name));
-$PAGE->set_title($pagetitle);
-$PAGE->set_heading($course->fullname);
 
+if ($displaymode == 'popup') {
+    $PAGE->set_pagelayout('popup');
+} else {
+    $pagetitle = strip_tags("$course->shortname: ".format_string($scorm->name));
+    $PAGE->set_title($pagetitle);
+    $PAGE->set_heading($course->fullname);
+}
 if (!$cm->visible and !has_capability('moodle/course:viewhiddenactivities', get_context_instance(CONTEXT_COURSE, $course->id))) {
     echo $OUTPUT->header();
     notice(get_string("activityiscurrentlyhidden"));
@@ -161,22 +166,17 @@ $completion = new completion_info($course);
 $completion->set_module_viewed($cm);
 
 // Print the page header
-$bodyscript = '';
-if ($scorm->popup == 1) {
-    $bodyscript = 'onunload="main.close();"';
+if (empty($scorm->popup) || $displaymode=='popup') {
+    $exitlink = '<a href="'.$CFG->wwwroot.'/course/view.php?id='.$scorm->course.'" title="'.$strexit.'">'.$strexit.'</a> ';
+    $PAGE->set_button($exitlink);
 }
 
-$exitlink = '<a href="'.$CFG->wwwroot.'/course/view.php?id='.$scorm->course.'" title="'.$strexit.'">'.$strexit.'</a> ';
-
-$PAGE->set_button($exitlink);
-
 $PAGE->requires->data_for_js('scormplayerdata', Array('cwidth'=>$scorm->width,
                                                       'cheight'=>$scorm->height,
                                                       'popupoptions' => $scorm->options), true);
 $PAGE->requires->js('/mod/scorm/request.js', true);
 $PAGE->requires->js('/lib/cookies.js', true);
 $PAGE->requires->css('/mod/scorm/styles.css');
-
 echo $OUTPUT->header();
 
 // NEW IMS TOC
@@ -196,15 +196,6 @@ $name = false;
             <script id="external-scormapi" type="text/JavaScript"></script>
         </div>
         <div id="scormtop">
-<?php
-if ($result->prerequisites) {
-    if ($scorm->popup != 0) {
-        //Added incase javascript popups are blocked we don't provide a direct link to the pop-up as JS communication can fail - the user must disable their pop-up blocker.
-        $linkcourse = '<a href="'.$CFG->wwwroot.'/course/view.php?id='.$scorm->course.'">' . get_string('finishscormlinkname', 'scorm') . '</a>';
-        echo $OUTPUT->box(get_string('finishscorm', 'scorm', $linkcourse), 'generalbox', 'altfinishlink');
-    }
-}
-?>
         <?php echo $mode == 'browse' ? '<div id="scormmode" class="scorm-left">'.get_string('browsemode', 'scorm')."</div>\n" : ''; ?>
         <?php echo $mode == 'review' ? '<div id="scormmode" class="scorm-left">'.get_string('reviewmode', 'scorm')."</div>\n" : ''; ?>
             <div id="scormnav" class="scorm-right">
@@ -216,7 +207,14 @@ if ($scorm->hidetoc == SCORM_TOC_POPUP) {
             </div> <!-- Scormnav -->
         </div> <!-- Scormtop -->
             <div id="toctree" class="generalbox">
-            <?php echo $result->toc; ?>
+                <?php
+                if (empty($scorm->popup) || $displaymode == 'popup') {
+                    echo $result->toc;
+                } else {
+                    //Added incase javascript popups are blocked we don't provide a direct link to the pop-up as JS communication can fail - the user must disable their pop-up blocker.
+                    $linkcourse = '<a href="'.$CFG->wwwroot.'/course/view.php?id='.$scorm->course.'">' . get_string('finishscormlinkname', 'scorm') . '</a>';
+                    echo $OUTPUT->box(get_string('finishscorm', 'scorm', $linkcourse), 'generalbox', 'altfinishlink');
+                }?>
             </div> <!-- toctree -->
         </div> <!--  tocbox -->
                 <noscript>
@@ -227,7 +225,7 @@ if ($scorm->hidetoc == SCORM_TOC_POPUP) {
                 </noscript>
 <?php
 if ($result->prerequisites) {
-    if ($scorm->popup != 0) {
+    if ($scorm->popup != 0 && $displaymode !=='popup') {
         // Clean the name for the window as IE is fussy
         $name = preg_replace("/[^A-Za-z0-9]/", "", $scorm->name);
         if (!$name) {
@@ -235,8 +233,9 @@ if ($result->prerequisites) {
         }
         $name = 'scorm_'.$name;
         echo html_writer::script('', $CFG->wwwroot.'/mod/scorm/player.js');
+        $url = new moodle_url($PAGE->url, array('scoid' => $sco->id, 'display' => 'popup'));
         echo html_writer::script(
-            js_writer::function_call('scorm_openpopup', Array("loadSCO.php?id=".$cm->id.$scoidpop,
+            js_writer::function_call('scorm_openpopup', Array($url->out(false),
                                                        $name, $scorm->options,
                                                        $scorm->width, $scorm->height)));
         ?>
@@ -257,13 +256,13 @@ if ($result->prerequisites) {
     </div> <!-- SCORM page -->
 <?php 
 // NEW IMS TOC
-if (!isset($result->toctitle)) {
-    $result->toctitle = get_string('toc', 'scorm');
+if (empty($scorm->popup) || $displaymode == 'popup') {
+    if (!isset($result->toctitle)) {
+        $result->toctitle = get_string('toc', 'scorm');
+    }
+    $PAGE->requires->js_init_call('M.mod_scorm.init', array($scorm->hidenav, $scorm->hidetoc, $result->toctitle, $name, $sco->id));
 }
-
-$PAGE->requires->js_init_call('M.mod_scorm.init', array($scorm->hidenav, $scorm->hidetoc, $result->toctitle, $name, $sco->id));
-
 if (!empty($forcejs)) {
     echo $OUTPUT->box(get_string("forcejavascriptmessage", "scorm"), "generalbox boxaligncenter forcejavascriptmessage");
 }
-echo $OUTPUT->footer();
+echo $OUTPUT->footer();
\ No newline at end of file
diff --git a/mod/scorm/rd.js b/mod/scorm/rd.js
deleted file mode 100644 (file)
index f24a121..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-<!--
-function attach_resize_event() {
-    YAHOO.util.Event.addListener(window, 'resize', scorm_resize);
-}
-
-var prev='';
-var next='';
-function scorm_set_prev(url) {
-    prev = url;
-}
-function scorm_set_next(url) {
-    next = url;
-}
-
-function scorm_get_element_style(obj, prop, cssProp) {
-    var ret = '';
-
-    if (obj.currentStyle) {
-        ret = obj.currentStyle[prop];
-    } else if (document.defaultView && document.defaultView.getComputedStyle) {
-        var compStyle = document.defaultView.getComputedStyle(obj, null);
-        ret = compStyle.getPropertyValue(cssProp);
-    }
-
-    if (ret == 'auto') ret = '0';
-    return ret;
-}
-
-function scorm_resize () {
-    var cwidth = scormplayerdata.cwidth;
-    var cheight = scormplayerdata.cheight;
-    var winwidth = 0, winheight = 0;
-    if( typeof( window.innerWidth ) == 'number' ) {
-        //Non-IE
-        winwidth = window.innerWidth;
-        winheight = window.innerHeight;
-    } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
-        //IE 6+ in 'standards compliant mode'
-        winwidth = document.documentElement.clientWidth;
-        winheight = document.documentElement.clientHeight;
-    } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
-        //IE 4 compatible
-        winwidth = document.body.clientWidth;
-        winheight = document.body.clientHeight;
-    }
-
-    var header = document.getElementById('header');
-    var content = document.getElementById('region-content');
-    var headerheight = 0;
-    if (content) {
-        headerheight = content.offsetTop;
-    }
-
-    var footer = document.getElementById('footer');
-    var imsnavbar = document.getElementById('tochead');
-    var scormtop = document.getElementById('scormtop');
-    var footerheight = 0;
-    var imsnavheight = 0;
-    var scormtopheight = 0;
-    if (footer) {
-        footerheight = footer.offsetHeight + parseInt(scorm_get_element_style(footer, 'marginTop', 'margin-top')) + parseInt(scorm_get_element_style(footer, 'marginBottom', 'margin-bottom'));
-    }
-    if (imsnavbar) {
-        imsnavheight = imsnavbar.offsetHeight;
-    }
-    if (scormtop) {
-        scormtopheight = scormtop.offsetHeight;
-    }
-
-    var topmargin = parseInt(scorm_get_element_style(document.getElementsByTagName('body')[0], 'marginTop', 'margin-top'));
-    var bottommargin = parseInt(scorm_get_element_style(document.getElementsByTagName('body')[0], 'marginBottom', 'margin-bottom'));
-
-    var totalheight = headerheight +
-                        footerheight +
-                        scormtopheight+
-                        topmargin +
-                        bottommargin+10; // +10 to save a minor vertical scroll always present!
-
-    var totalheighttoc = totalheight+imsnavheight;
-    // override total height with configured height if it is defined
-    if (cheight > 0) {
-      winheight = cheight;
-    }
-    var finalheighttoc = winheight - totalheighttoc;
-    if (finalheighttoc <= 0) {
-        finalheighttoc = winheight;
-    }
-    var finalheight = winheight - totalheight;
-    if (finalheight <= 0) {
-        finalheight = winheight;
-    }
-    var toctree = document.getElementById('toctree');
-    if (toctree != null){
-        var toctreeHeight = toctree.offsetHeight;
-        document.getElementById('toctree').style.height = finalheighttoc + 'px';
-        var scoframe2 = document.getElementById('scoframe1');
-        document.getElementById('scormobject').style.height = finalheight + 'px';
-    }else{
-        document.getElementById('scormobject').style.height = finalheight + 'px';
-        document.getElementById('scormpage').style.height = finalheight + 'px';
-    }
-
-    // resize the content container too to move the footer below the SCORM content
-    var contenti3 = document.getElementById('content-i3');
-    if (contenti3) {
-        contenti3.style.height = (winheight - totalheight + 30) + 'px';
-    } else {
-       document.getElementById('region-main-box').style.height = (finalheight + 30) + 'px';
-    }
-     // resize the content container too to move the footer below the SCORM content
-    var contenti3 = document.getElementById('content-i3');
-    if (contenti3) {
-        contenti3.style.height = (finalheight + 30) + 'px';
-    } else {
-        document.getElementById('region-main-box').style.height = (finalheight + 30) + 'px';
-    }
-}
--->
index 8a4c0b3..700ea4f 100644 (file)
@@ -422,7 +422,7 @@ class scorm_basic_report extends scorm_default_report {
                                     if ($trackdata->score_raw != '') {
                                         $score = $trackdata->score_raw;
                                         // add max score if it exists
-                                        if ($scorm->version == 'SCORM_1.3') {
+                                        if (scorm_version_check($scorm->version, SCORM_13)) {
                                             $maxkey = 'cmi.score.max';
                                         } else {
                                             $maxkey = 'cmi.core.score.max';
index f865623..3298fa9 100644 (file)
@@ -23,7 +23,7 @@
 #page-mod-scorm-view .structurelist  {list-style-type: none;white-space: nowrap;}
 #page-mod-scorm-view .structurelist  {list-style-type: none;white-space: nowrap;}
 
-#page-mod-scorm-player #altfinishlink {float: right; border: 0px; padding: 0px; }
+#page-mod-scorm-player #altfinishlink {font-size: 140%;border: 0px; padding: 0px; }
 #page-mod-scorm-player #altpopuplink  {position: left; padding: 5px; border: 0px; }
 #page-mod-scorm-player #scormmode  {float: left; border: 0px; }
 
index 411001d..b1a415c 100644 (file)
@@ -180,7 +180,7 @@ if (!empty($b)) {
     $table->width = '100%';
     $table->size = array('*', '*');
     $existelements = false;
-    if ($scorm->version == 'SCORM_1.3') {
+    if (scorm_version_check($scorm->version, SCORM_13)) {
         $elements = array(
                 'raw' => 'cmi.score.raw',
                 'min' => 'cmi.score.min',
index 14ccce0..59dfec0 100644 (file)
@@ -23,6 +23,6 @@
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
-$module->version  = 2011073100;   // The (date) version of this module
+$module->version  = 2011080100;   // The (date) version of this module
 $module->requires = 2010080300;   // The version of Moodle that is required
 $module->cron     = 300;            // How often should cron check this module (seconds)?
index 5e017ef..6154acf 100644 (file)
     }
 
     $table = new html_table();
+    $table->width = '100%';
 
     if ($usesections) {
-        $table->head  = array ($strsectionname, $strname, $strintro);
-        $table->align = array ('CENTER', 'LEFT', 'LEFT');
+        $table->head  = array ($strsectionname, $strname, $strstatus);
     } else {
-        $table->head  = array ($strname, $strintro);
-        $table->align = array ('LEFT', 'LEFT');
+        $table->head  = array ($strname, $strstatus);
     }
 
     $currentsection = '';
index 2c44687..34e2f68 100644 (file)
         print_error('invalidtmptid', 'survey');
     }
 
+// Update 'viewed' state if required by completion system
+require_once($CFG->libdir . '/completionlib.php');
+$completion = new completion_info($course);
+$completion->set_module_viewed($cm);
+
     $showscales = ($template->name != 'ciqname');
 
     $strsurvey = get_string("modulename", "survey");
index 7f9a3d6..1428819 100644 (file)
@@ -246,8 +246,6 @@ function wiki_supports($feature) {
         return true;
     case FEATURE_COMPLETION_TRACKS_VIEWS:
         return true;
-    case FEATURE_COMPLETION_HAS_RULES:
-        return true;
     case FEATURE_GRADE_HAS_GRADE:
         return false;
     case FEATURE_GRADE_OUTCOMES:
index 6266308..a81f685 100644 (file)
@@ -535,6 +535,8 @@ class page_wiki_edit extends page_wiki {
         switch ($format) {
         case 'html':
             $data->newcontentformat = FORMAT_HTML;
+            // Append editor context to editor options, giving preference to existing context.
+            page_wiki_edit::$attachmentoptions = array_merge(array('context' => $this->modcontext), page_wiki_edit::$attachmentoptions);
             $data = file_prepare_standard_editor($data, 'newcontent', page_wiki_edit::$attachmentoptions, $this->modcontext, 'mod_wiki', 'attachments', $this->subwiki->id);
             break;
         default:
index 6b6a40b..ae1c4d5 100644 (file)
@@ -258,6 +258,11 @@ require_capability('mod/wiki:viewpage', $context);
 
 add_to_log($course->id, 'wiki', 'view', 'view.php?id=' . $cm->id, $wiki->id);
 
+// Update 'viewed' state if required by completion system
+require_once($CFG->libdir . '/completionlib.php');
+$completion = new completion_info($course);
+$completion->set_module_viewed($cm);
+
 if (($edit != - 1) and $PAGE->user_allowed_editing()) {
     $USER->editing = $edit;
 }
index 78b34de..35756cc 100644 (file)
@@ -182,24 +182,33 @@ if (trim($workshop->instructreviewers)) {
     print_collapsible_region_end();
 }
 
+// extend the current assessment record with user details
+$assessment = $workshop->get_assessment_by_id($assessment->id);
+
 if ($isreviewer) {
-    echo $output->heading(get_string('assessmentbyyourself', 'workshop'), 2);
-} elseif (has_capability('mod/workshop:viewreviewernames', $workshop->context)) {
-    $assessment = $workshop->get_assessment_by_id($assessment->id); // extend the current record with user details
-    $reviewer   = new stdclass();
-    $reviewer->firstname = $assessment->reviewerfirstname;
-    $reviewer->lastname = $assessment->reviewerlastname;
-    echo $output->heading(get_string('assessmentbyknown', 'workshop', fullname($reviewer)), 2);
-} else {
-    echo $output->heading(get_string('assessmentbyunknown', 'workshop'), 2);
-}
+    $options    = array(
+        'showreviewer'  => true,
+        'showauthor'    => has_capability('mod/workshop:viewauthornames', $workshop->context),
+        'showform'      => $assessmenteditable or !is_null($assessment->grade),
+        'showweight'    => true,
+    );
+    $assessment = $workshop->prepare_assessment($assessment, $mform, $options);
+    $assessment->title = get_string('assessmentbyyourself', 'workshop');
+    echo $output->render($assessment);
 
-if ($mform) {
-    $mform->display();
 } else {
-    echo $output->heading(get_string('notassessed', 'workshop'));
+    $options    = array(
+        'showreviewer'  => has_capability('mod/workshop:viewreviewernames', $workshop->context),
+        'showauthor'    => has_capability('mod/workshop:viewauthornames', $workshop->context),
+        'showform'      => $assessmenteditable or !is_null($assessment->grade),
+        'showweight'    => true,
+    );
+    $assessment = $workshop->prepare_assessment($assessment, $mform, $options);
+    echo $output->render($assessment);
 }
-if ($canoverridegrades) {
+
+if (!$assessmenteditable and $canoverridegrades) {
     $feedbackform->display();
 }
+
 echo $output->footer();
index aee2e41..a487dff 100644 (file)
@@ -56,7 +56,7 @@ if ($isreviewer or $canmanage) {
 }
 
 // only the reviewer is allowed to modify the assessment
-if ($canmanage or ($isreviewer and $workshop->assessing_examples_allowed())) {
+if (($canmanage and $assessment->weight == 1) or ($isreviewer and $workshop->assessing_examples_allowed())) {
     $assessmenteditable = true;
 } else {
     $assessmenteditable = false;
@@ -119,17 +119,40 @@ if (trim($workshop->instructreviewers)) {
     print_collapsible_region_end();
 }
 
-if ($canmanage) {
-    echo $output->heading(get_string('assessmentreference', 'workshop'), 2);
-} elseif ($isreviewer) {
-    echo $output->heading(get_string('assessmentbyyourself', 'workshop'), 2);
-} else {
-    $assessment = $workshop->get_assessment_by_id($assessment->id); // extend the current record with user details
-    $reviewer   = new stdclass();
-    $reviewer->firstname = $assessment->reviewerfirstname;
-    $reviewer->lastname = $assessment->reviewerlastname;
-    echo $output->heading(get_string('assessmentbyknown', 'workshop', fullname($reviewer)), 2);
+// extend the current assessment record with user details
+$assessment = $workshop->get_assessment_by_id($assessment->id);
+
+if ($canmanage and $assessment->weight == 1) {
+    $options = array(
+        'showreviewer'  => false,
+        'showauthor'    => false,
+        'showform'      => true,
+        'showweight'    => false,
+    );
+    $assessment = $workshop->prepare_assessment($assessment, $mform, $options);
+    $assessment->title = get_string('assessmentreference', 'workshop');
+    echo $output->render($assessment);
+
+} else if ($isreviewer) {
+    $options = array(
+        'showreviewer'  => true,
+        'showauthor'    => false,
+        'showform'      => true,
+        'showweight'    => false,
+    );
+    $assessment = $workshop->prepare_assessment($assessment, $mform, $options);
+    $assessment->title = get_string('assessmentbyyourself', 'workshop');
+    echo $output->render($assessment);
+
+} else if ($canmanage) {
+    $options = array(
+        'showreviewer'  => true,
+        'showauthor'    => false,
+        'showform'      => true,
+        'showweight'    => false,
+    );
+    $assessment = $workshop->prepare_assessment($assessment, $mform, $options);
+    echo $output->render($assessment);
 }
 
-$mform->display();
 echo $output->footer();
index 5662860..126fc04 100644 (file)
@@ -78,33 +78,45 @@ echo $output->heading(get_string('assessedexample', 'workshop'), 2);
 
 echo $output->render($workshop->prepare_example_submission($example));
 
+// if the reference assessment is available, display it
 if (!empty($mformreference)) {
-    echo $output->heading(get_string('assessmentreference', 'workshop'), 2);
-    $a = new stdclass();
-    $a->received = $workshop->real_grade($reference->grade);
-    $a->max = $workshop->real_grade(100);
-    echo $output->heading(get_string('gradeinfo', 'workshop' , $a), 3);
-    $mformreference->display();
+    $options = array(
+        'showreviewer'  => false,
+        'showauthor'    => false,
+        'showform'      => true,
+        'showweight'    => false,
+    );
+    $reference = $workshop->prepare_assessment($reference, $mformreference, $options);
+    $reference->title = get_string('assessmentreference', 'workshop');
+    echo $output->render($reference);
 }
 
 if ($isreviewer) {
-    echo $output->heading(get_string('assessmentbyyourself', 'workshop'), 2);
+    $options = array(
+        'showreviewer'  => true,
+        'showauthor'    => false,
+        'showform'      => true,
+        'showweight'    => false,
+    );
+    $assessment = $workshop->prepare_assessment($assessment, $mformassessment, $options);
+    $assessment->title = get_string('assessmentbyyourself', 'workshop');
+    if ($workshop->assessing_examples_allowed()) {
+        $assessment->add_action(
+            new moodle_url($workshop->exsubmission_url($example->id), array('assess' => 'on', 'sesskey' => sesskey())),
+            get_string('reassess', 'workshop')
+        );
+    }
+    echo $output->render($assessment);
+
 } elseif ($canmanage) {
-    $reviewer   = new stdclass();
-    $reviewer->firstname = $assessment->reviewerfirstname;
-    $reviewer->lastname = $assessment->reviewerlastname;
-    echo $output->heading(get_string('assessmentbyknown', 'workshop', fullname($reviewer)), 2);
-}
-$a = new stdclass();
-$a->received = $workshop->real_grade($assessment->grade);
-$a->max = $workshop->real_grade(100);
-echo $output->heading(get_string('gradeinfo', 'workshop' , $a), 3);
-$mformassessment->display();
-echo $output->container_start('buttonsbar');
-if ($isreviewer and $workshop->assessing_examples_allowed()) {
-    $aurl = new moodle_url($workshop->exsubmission_url($example->id), array('assess' => 'on', 'sesskey' => sesskey()));
-    echo $output->single_button($aurl, get_string('reassess', 'workshop'), 'get');
+    $options = array(
+        'showreviewer'  => true,
+        'showauthor'    => false,
+        'showform'      => true,
+        'showweight'    => false,
+    );
+    $assessment = $workshop->prepare_assessment($assessment, $mformassessment, $options);
+    echo $output->render($assessment);
 }
-echo $output->container_end(); // buttonsbar
 
 echo $output->footer();
index 70870e8..486c278 100644 (file)
@@ -103,7 +103,14 @@ if ($edit and $canmanage) {
 
     $maxfiles       = $workshop->nattachments;
     $maxbytes       = $workshop->maxbytes;
-    $contentopts    = array('trusttext' => true, 'subdirs' => false, 'maxfiles' => $maxfiles, 'maxbytes' => $maxbytes);
+    $contentopts    = array(
+                        'trusttext' => true,
+                        'subdirs'   => false,
+                        'maxfiles'  => $maxfiles,
+                        'maxbytes'  => $maxbytes,
+                        'context'   => $workshop->context
+                      );
+
     $attachmentopts = array('subdirs' => true, 'maxfiles' => $maxfiles, 'maxbytes' => $maxbytes);
     $example        = file_prepare_standard_editor($example, 'content', $contentopts, $workshop->context,
                                         'mod_workshop', 'submission_content', $example->id);
index ec04384..1c960e2 100644 (file)
@@ -116,6 +116,9 @@ class workshop_accumulative_strategy implements workshop_strategy {
             $norepeats += self::ADDDIMS;
         }
 
+        // Append editor context to editor options, giving preference to existing context.
+        $this->descriptionopts = array_merge(array('context' => $PAGE->context), $this->descriptionopts);
+
         // prepare the embeded files
         for ($i = 0; $i < $nodimensions; $i++) {
             // prepare all editor elements
index 8fa7735..156eef8 100644 (file)
@@ -116,6 +116,9 @@ class workshop_comments_strategy implements workshop_strategy {
             $norepeats += self::ADDDIMS;
         }
 
+        // Append editor context to editor options, giving preference to existing context.
+        $this->descriptionopts = array_merge(array('context' => $PAGE->context), $this->descriptionopts);
+
         // prepare the embedded files
         for ($i = 0; $i < $nodimensions; $i++) {
             // prepare all editor elements
index 123160b..9fae313 100644 (file)
@@ -120,6 +120,9 @@ class workshop_numerrors_strategy implements workshop_strategy {
             $norepeats += self::ADDDIMS;
         }
 
+        // Append editor context to editor options, giving preference to existing context.
+        $this->descriptionopts = array_merge(array('context' => $PAGE->context), $this->descriptionopts);
+
         // prepare the embeded files
         for ($i = 0; $i < $nodimensions; $i++) {
             // prepare all editor elements
index 995a797..17b54c2 100644 (file)
@@ -126,6 +126,9 @@ class workshop_rubric_strategy implements workshop_strategy {
             $norepeats += self::ADDDIMS;
         }
 
+        // Append editor context to editor options, giving preference to existing context.
+        $this->descriptionopts = array_merge(array('context' => $this->workshop->context), $this->descriptionopts);
+
         // prepare the embeded files
         for ($i = 0; $i < $nodimensions; $i++) {
             // prepare all editor elements
index 9031486..2302ebb 100644 (file)
@@ -43,9 +43,10 @@ $string['assessedexample'] = 'Assessed example submission';
 $string['assessedsubmission'] = 'Assessed submission';
 $string['assessingexample'] = 'Assessing example submission';
 $string['assessingsubmission'] = 'Assessing submission';
-$string['assessmentbyknown'] = 'Assessment by {$a}';
-$string['assessmentbyunknown'] = 'Assessment';
-$string['assessmentbyyourself'] = 'Assessment by yourself';
+$string['assessment'] = 'Assessment';
+$string['assessmentby'] = 'by <a href="{$a->url}">{$a->name}</a>';
+$string['assessmentbyfullname'] = 'Assessment by {$a}';
+$string['assessmentbyyourself'] = 'Your assessment';
 $string['assessmentdeleted'] = 'Assessment deallocated';
 $string['assessmentend'] = 'Deadline for assessment';
 $string['assessmentenddatetime'] = 'Assessment deadline: {$a->daydatetime} ({$a->distanceday})';
@@ -114,6 +115,7 @@ $string['examplesmode'] = 'Mode of examples assessment';
 $string['examplesubmissions'] = 'Example submissions';
 $string['examplesvoluntary'] = 'Assessment of example submission is voluntary';
 $string['feedbackauthor'] = 'Feedback for the author';
+$string['feedbackby'] = 'Feedback by {$a}';
 $string['feedbackreviewer'] = 'Feedback for the reviewer';
 $string['formataggregatedgrade'] = '{$a->grade}';
 $string['formataggregatedgradeover'] = '<del>{$a->grade}</del><br /><ins>{$a->over}</ins>';
index 26880ed..051da2f 100644 (file)
@@ -864,12 +864,12 @@ function workshop_print_recent_mod_activity($activity, $courseid, $detail, $modn
             $url = new moodle_url('/user/view.php', array('id'=>$activity->user->id, 'course'=>$courseid));
             $name = fullname($activity->user);
             $link = html_writer::link($url, $name);
-            echo get_string('assessmentbyknown', 'workshop', $link);
+            echo get_string('assessmentbyfullname', 'workshop', $link);
             echo ' - '.userdate($activity->timestamp);
             echo html_writer::end_tag('div');
         } else {
             echo html_writer::start_tag('div', array('class'=>'anonymous'));
-            echo get_string('assessmentbyunknown', 'workshop');
+            echo get_string('assessment', 'workshop');
             echo ' - '.userdate($activity->timestamp);
             echo html_writer::end_tag('div');
         }
index 9aeaa83..f0c0c36 100644 (file)
@@ -489,16 +489,15 @@ class workshop {
     public function get_submissions($authorid='all') {
         global $DB;
 
-        $sql = 'SELECT s.id, s.workshopid, s.example, s.authorid, s.timecreated, s.timemodified,
+        $authorfields      = user_picture::fields('u', null, 'authoridx', 'author');
+        $gradeoverbyfields = user_picture::fields('t', null, 'gradeoverbyx', 'over');
+        $sql = "SELECT s.id, s.workshopid, s.example, s.authorid, s.timecreated, s.timemodified,
                        s.title, s.grade, s.gradeover, s.gradeoverby, s.published,
-                       u.lastname AS authorlastname, u.firstname AS authorfirstname,
-                       u.picture AS authorpicture, u.imagealt AS authorimagealt, u.email AS authoremail,
-                       t.lastname AS overlastname, t.firstname AS overfirstname,
-                       t.picture AS overpicture, t.imagealt AS overimagealt, t.email AS overemail
+                       $authorfields, $gradeoverbyfields
                   FROM {workshop_submissions} s
             INNER JOIN {user} u ON (s.authorid = u.id)
              LEFT JOIN {user} t ON (s.gradeoverby = t.id)
-                 WHERE s.example = 0 AND s.workshopid = :workshopid';
+                 WHERE s.example = 0 AND s.workshopid = :workshopid";
         $params = array('workshopid' => $this->id);
 
         if ('all' === $authorid) {
@@ -511,7 +510,7 @@ class workshop {
             // $authorid is empty
             return array();
         }
-        $sql .= ' ORDER BY u.lastname, u.firstname';
+        $sql .= " ORDER BY u.lastname, u.firstname";
 
         return $DB->get_records_sql($sql, $params);
     }
@@ -527,12 +526,13 @@ class workshop {
 
         // we intentionally check the workshopid here, too, so the workshop can't touch submissions
         // from other instances
-        $sql = 'SELECT s.*,
-                       u.lastname AS authorlastname, u.firstname AS authorfirstname, u.id AS authorid,
-                       u.picture AS authorpicture, u.imagealt AS authorimagealt, u.email AS authoremail
+        $authorfields      = user_picture::fields('u', null, 'authoridx', 'author');
+        $gradeoverbyfields = user_picture::fields('g', null, 'gradeoverbyx', 'gradeoverby');
+        $sql = "SELECT s.*, $authorfields, $gradeoverbyfields
                   FROM {workshop_submissions} s
             INNER JOIN {user} u ON (s.authorid = u.id)
-                 WHERE s.example = 0 AND s.workshopid = :workshopid AND s.id = :id';
+             LEFT JOIN {user} g ON (s.gradeoverby = g.id)
+                 WHERE s.example = 0 AND s.workshopid = :workshopid AND s.id = :id";
         $params = array('workshopid' => $this->id, 'id' => $id);
         return $DB->get_record_sql($sql, $params, MUST_EXIST);
     }
@@ -549,12 +549,13 @@ class workshop {
         if (empty($authorid)) {
             return false;
         }
-        $sql = 'SELECT s.*,
-                       u.lastname AS authorlastname, u.firstname AS authorfirstname, u.id AS authorid,
-                       u.picture AS authorpicture, u.imagealt AS authorimagealt, u.email AS authoremail
+        $authorfields      = user_picture::fields('u', null, 'authoridx', 'author');
+        $gradeoverbyfields = user_picture::fields('g', null, 'gradeoverbyx', 'gradeoverby');
+        $sql = "SELECT s.*, $authorfields, $gradeoverbyfields
                   FROM {workshop_submissions} s
             INNER JOIN {user} u ON (s.authorid = u.id)
-                 WHERE s.example = 0 AND s.workshopid = :workshopid AND s.authorid = :authorid';
+             LEFT JOIN {user} g ON (s.gradeoverby = g.id)
+                 WHERE s.example = 0 AND s.workshopid = :workshopid AND s.authorid = :authorid";
         $params = array('workshopid' => $this->id, 'authorid' => $authorid);
         return $DB->get_record_sql($sql, $params);
     }
@@ -567,10 +568,10 @@ class workshop {
     public function get_published_submissions($orderby='finalgrade DESC') {
         global $DB;
 
+        $authorfields = user_picture::fields('u', null, 'authoridx', 'author');
         $sql = "SELECT s.id, s.authorid, s.timecreated, s.timemodified,
                        s.title, s.grade, s.gradeover, COALESCE(s.gradeover,s.grade) AS finalgrade,
-                       u.lastname AS authorlastname, u.firstname AS authorfirstname, u.id AS authorid,
-                       u.picture AS authorpicture, u.imagealt AS authorimagealt, u.email AS authoremail
+                       $authorfields
                   FROM {workshop_submissions} s
             INNER JOIN {user} u ON (s.authorid = u.id)
                  WHERE s.example = 0 AND s.workshopid = :workshopid AND s.published = 1
@@ -705,6 +706,44 @@ class workshop {
         return $summary;
     }
 
+    /**
+     * Prepares renderable assessment component
+     *
+     * The $options array supports the following keys:
+     * showauthor - should the author user info be available for the renderer
+     * showreviewer - should the reviewer user info be available for the renderer
+     * showform - show the assessment form if it is available
+     *
+     * @param stdClass $record as returned by eg {@link self::get_assessment_by_id()}
+     * @param workshop_assessment_form|null $form as returned by {@link workshop_strategy::get_assessment_form()}
+     * @param array $options
+     * @return workshop_assessment
+     */
+    public function prepare_assessment(stdClass $record, $form, array $options = array()) {
+
+        $assessment             = new workshop_assessment($record, $options);
+        $assessment->url        = $this->assess_url($record->id);
+        $assessment->maxgrade   = $this->real_grade(100);
+
+        if (!empty($options['showform']) and !($form instanceof workshop_assessment_form)) {
+            debugging('Not a valid instance of workshop_assessment_form supplied', DEBUG_DEVELOPER);
+        }
+
+        if (!empty($options['showform']) and ($form instanceof workshop_assessment_form)) {
+            $assessment->form = $form;
+        }
+
+        if (empty($options['showweight'])) {
+            $assessment->weight = null;
+        }
+
+        if (!is_null($record->grade)) {
+            $assessment->realgrade = $this->real_grade($record->grade);
+        }
+
+        return $assessment;
+    }
+
     /**
      * Removes the submission and all relevant data
      *
@@ -730,17 +769,20 @@ class workshop {
     public function get_all_assessments() {
         global $DB;
 
-        $sql = 'SELECT a.id, a.submissionid, a.reviewerid, a.timecreated, a.timemodified,
+        $reviewerfields = user_picture::fields('reviewer', null, 'revieweridx', 'reviewer');
+        $authorfields   = user_picture::fields('author', null, 'authorid', 'author');
+        $overbyfields   = user_picture::fields('overby', null, 'gradinggradeoverbyx', 'overby');
+        $sql = "SELECT a.id, a.submissionid, a.reviewerid, a.timecreated, a.timemodified,
                        a.grade, a.gradinggrade, a.gradinggradeover, a.gradinggradeoverby,
-                       reviewer.id AS reviewerid,reviewer.firstname AS reviewerfirstname,reviewer.lastname as reviewerlastname,
-                       s.title,
-                       author.id AS authorid, author.firstname AS authorfirstname,author.lastname AS authorlastname
+                       $reviewerfields, $authorfields, $overbyfields,
+                       s.title
                   FROM {workshop_assessments} a
             INNER JOIN {user} reviewer ON (a.reviewerid = reviewer.id)
             INNER JOIN {workshop_submissions} s ON (a.submissionid = s.id)
             INNER JOIN {user} author ON (s.authorid = author.id)
+             LEFT JOIN {user} overby ON (a.gradinggradeoverby = overby.id)
                  WHERE s.workshopid = :workshopid AND s.example = 0
-              ORDER BY reviewer.lastname, reviewer.firstname';
+              ORDER BY reviewer.lastname, reviewer.firstname";
         $params = array('workshopid' => $this->id);
 
         return $DB->get_records_sql($sql, $params);
@@ -755,15 +797,16 @@ class workshop {
     public function get_assessment_by_id($id) {
         global $DB;
 
-        $sql = 'SELECT a.*,
-                       reviewer.id AS reviewerid,reviewer.firstname AS reviewerfirstname,reviewer.lastname as reviewerlastname,
-                       s.title,
-                       author.id AS authorid, author.firstname AS authorfirstname,author.lastname as authorlastname
+        $reviewerfields = user_picture::fields('reviewer', null, 'revieweridx', 'reviewer');
+        $authorfields   = user_picture::fields('author', null, 'authorid', 'author');
+        $overbyfields   = user_picture::fields('overby', null, 'gradinggradeoverbyx', 'overby');
+        $sql = "SELECT a.*, s.title, $reviewerfields, $authorfields, $overbyfields
                   FROM {workshop_assessments} a
             INNER JOIN {user} reviewer ON (a.reviewerid = reviewer.id)
             INNER JOIN {workshop_submissions} s ON (a.submissionid = s.id)
             INNER JOIN {user} author ON (s.authorid = author.id)
-                 WHERE a.id = :id AND s.workshopid = :workshopid';
+             LEFT JOIN {user} overby ON (a.gradinggradeoverby = overby.id)
+                 WHERE a.id = :id AND s.workshopid = :workshopid";
         $params = array('id' => $id, 'workshopid' => $this->id);
 
         return $DB->get_record_sql($sql, $params, MUST_EXIST);
@@ -779,15 +822,16 @@ class workshop {
     public function get_assessment_of_submission_by_user($submissionid, $reviewerid) {
         global $DB;
 
-        $sql = 'SELECT a.*,
-                       reviewer.id AS reviewerid,reviewer.firstname AS reviewerfirstname,reviewer.lastname as reviewerlastname,
-                       s.title,
-                       author.id AS authorid, author.firstname AS authorfirstname,author.lastname as authorlastname
+        $reviewerfields = user_picture::fields('reviewer', null, 'revieweridx', 'reviewer');
+        $authorfields   = user_picture::fields('author', null, 'authorid', 'author');
+        $overbyfields   = user_picture::fields('overby', null, 'gradinggradeoverbyx', 'overby');
+        $sql = "SELECT a.*, s.title, $reviewerfields, $authorfields, $overbyfields
                   FROM {workshop_assessments} a
             INNER JOIN {user} reviewer ON (a.reviewerid = reviewer.id)
             INNER JOIN {workshop_submissions} s ON (a.submissionid = s.id AND s.example = 0)
             INNER JOIN {user} author ON (s.authorid = author.id)
-                 WHERE s.id = :sid AND reviewer.id = :rid AND s.workshopid = :workshopid';
+             LEFT JOIN {user} overby ON (a.gradinggradeoverby = overby.id)
+                 WHERE s.id = :sid AND reviewer.id = :rid AND s.workshopid = :workshopid";
         $params = array('sid' => $submissionid, 'rid' => $reviewerid, 'workshopid' => $this->id);
 
         return $DB->get_record_sql($sql, $params, IGNORE_MISSING);
@@ -802,12 +846,15 @@ class workshop {
     public function get_assessments_of_submission($submissionid) {
         global $DB;
 
-        $sql = 'SELECT a.*,
-                       reviewer.id AS reviewerid,reviewer.firstname AS reviewerfirstname,reviewer.lastname AS reviewerlastname
+        $reviewerfields = user_picture::fields('reviewer', null, 'revieweridx', 'reviewer');
+        $overbyfields   = user_picture::fields('overby', null, 'gradinggradeoverbyx', 'overby');
+        $sql = "SELECT a.*, s.title, $reviewerfields, $overbyfields
                   FROM {workshop_assessments} a
             INNER JOIN {user} reviewer ON (a.reviewerid = reviewer.id)
             INNER JOIN {workshop_submissions} s ON (a.submissionid = s.id)
-                 WHERE s.example = 0 AND s.id = :submissionid AND s.workshopid = :workshopid';
+             LEFT JOIN {user} overby ON (a.gradinggradeoverby = overby.id)
+                 WHERE s.example = 0 AND s.id = :submissionid AND s.workshopid = :workshopid
+              ORDER BY reviewer.lastname, reviewer.firstname, reviewer.id";
         $params = array('submissionid' => $submissionid, 'workshopid' => $this->id);
 
         return $DB->get_records_sql($sql, $params);
@@ -822,17 +869,18 @@ class workshop {
     public function get_assessments_by_reviewer($reviewerid) {
         global $DB;
 
-        $sql = 'SELECT a.*,
-                       reviewer.id AS reviewerid,reviewer.firstname AS reviewerfirstname,reviewer.lastname AS reviewerlastname,
+        $reviewerfields = user_picture::fields('reviewer', null, 'revieweridx', 'reviewer');
+        $authorfields   = user_picture::fields('author', null, 'authorid', 'author');
+        $overbyfields   = user_picture::fields('overby', null, 'gradinggradeoverbyx', 'overby');
+        $sql = "SELECT a.*, $reviewerfields, $authorfields, $overbyfields,
                        s.id AS submissionid, s.title AS submissiontitle, s.timecreated AS submissioncreated,
-                       s.timemodified AS submissionmodified,
-                       author.id AS authorid, author.firstname AS authorfirstname,author.lastname AS authorlastname,
-                       author.picture AS authorpicture, author.imagealt AS authorimagealt, author.email AS authoremail
+                       s.timemodified AS submissionmodified
                   FROM {workshop_assessments} a
             INNER JOIN {user} reviewer ON (a.reviewerid = reviewer.id)
             INNER JOIN {workshop_submissions} s ON (a.submissionid = s.id)
             INNER JOIN {user} author ON (s.authorid = author.id)
-                 WHERE s.example = 0 AND reviewer.id = :reviewerid AND s.workshopid = :workshopid';
+             LEFT JOIN {user} overby ON (a.gradinggradeoverby = overby.id)
+                 WHERE s.example = 0 AND reviewer.id = :reviewerid AND s.workshopid = :workshopid";
         $params = array('reviewerid' => $reviewerid, 'workshopid' => $this->id);
 
         return $DB->get_records_sql($sql, $params);
@@ -2619,6 +2667,124 @@ class workshop_example_submission extends workshop_example_submission_summary im
     protected $fields = array('id', 'title', 'content', 'contentformat', 'contenttrust', 'attachment');
 }
 
+
+/**
+ * Common base class for assessments rendering
+ *
+ * Subclasses of this class convert raw assessment record from
+ * workshop_assessments table (as returned by {@see workshop::get_assessment_by_id()}
+ * for example) into renderable objects.
+ */
+abstract class workshop_assessment_base {
+
+    /** @var string the optional title of the assessment */
+    public $title = '';
+
+    /** @var workshop_assessment_form $form as returned by {@link workshop_strategy::get_assessment_form()} */
+    public $form;
+
+    /** @var moodle_url */
+    public $url;
+
+    /** @var float|null the real received grade */
+    public $realgrade = null;
+
+    /** @var float the real maximum grade */
+    public $maxgrade;
+
+    /** @var stdClass|null reviewer user info */
+    public $reviewer = null;
+
+    /** @var stdClass|null assessed submission's author user info */
+    public $author = null;
+
+    /** @var array of actions */
+    public $actions = array();
+
+    /* @var array of columns that are assigned as properties */
+    protected $fields = array();
+
+    /**
+     * Copies the properties of the given database record into properties of $this instance
+     *
+     * The $options keys are: showreviewer, showauthor
+     * @param stdClass $assessment full record
+     * @param array $options additional properties
+     */
+    public function __construct(stdClass $record, array $options = array()) {
+
+        foreach ($this->fields as $field) {
+            if (!property_exists($record, $field)) {
+                throw new coding_exception('Assessment record must provide public property ' . $field);
+            }
+            if (!property_exists($this, $field)) {
+                throw new coding_exception('Renderable component must accept public property ' . $field);
+            }
+            $this->{$field} = $record->{$field};
+        }
+
+        if (!empty($options['showreviewer'])) {
+            $this->reviewer = user_picture::unalias($record, null, 'revieweridx', 'reviewer');
+        }
+
+        if (!empty($options['showauthor'])) {
+            $this->author = user_picture::unalias($record, null, 'authorid', 'author');
+        }
+    }
+
+    /**
+     * Adds a new action
+     *
+     * @param moodle_url $url action URL
+     * @param string $label action label
+     * @param string $method get|post
+     */
+    public function add_action(moodle_url $url, $label, $method = 'get') {
+
+        $action = new stdClass();
+        $action->url = $url;
+        $action->label = $label;
+        $action->method = $method;
+
+        $this->actions[] = $action;
+    }
+}
+
+
+/**
+ * Represents a rendarable full assessment
+ */
+class workshop_assessment extends workshop_assessment_base implements renderable {
+
+    /** @var int */
+    public $id;
+
+    /** @var int */
+    public $submissionid;
+
+    /** @var int */
+    public $weight;
+
+    /** @var int */
+    public $timecreated;
+
+    /** @var int */
+    public $timemodified;
+
+    /** @var float */
+    public $grade;
+
+    /** @var float */
+    public $gradinggrade;
+
+    /** @var float */
+    public $gradinggradeover;
+
+    /** @var array */
+    protected $fields = array('id', 'submissionid', 'weight', 'timecreated',
+        'timemodified', 'grade', 'gradinggrade', 'gradinggradeover');
+}
+
 /**
  * Renderable message to be displayed to the user
  *
@@ -2813,3 +2979,93 @@ class workshop_grading_report implements renderable {
         return $this->options;
     }
 }
+
+
+/**
+ * Base class for renderable feedback for author and feedback for reviewer
+ */
+abstract class workshop_feedback {
+
+    /** @var stdClass the user info */
+    protected $provider = null;
+
+    /** @var string the feedback text */
+    protected $content = null;
+
+    /** @var int format of the feedback text */
+    protected $format = null;
+
+    /**
+     * @return stdClass the user info
+     */
+    public function get_provider() {
+
+        if (is_null($this->provider)) {
+            throw new coding_exception('Feedback provider not set');
+        }
+
+        return $this->provider;
+    }
+
+    /**
+     * @return string the feedback text
+     */
+    public function get_content() {
+
+        if (is_null($this->content)) {
+            throw new coding_exception('Feedback content not set');
+        }
+
+        return $this->content;
+    }
+
+    /**
+     * @return int format of the feedback text
+     */
+    public function get_format() {
+
+        if (is_null($this->format)) {
+            throw new coding_exception('Feedback text format not set');
+        }
+
+        return $this->format;
+    }
+}
+
+
+/**
+ * Renderable feedback for the author of submission
+ */
+class workshop_feedback_author extends workshop_feedback implements renderable {
+
+    /**
+     * Extracts feedback from the given submission record
+     *
+     * @param stdClass $submission record as returned by {@see self::get_submission_by_id()}
+     */
+    public function __construct(stdClass $submission) {
+
+        $this->provider = user_picture::unalias($submission, null, 'gradeoverbyx', 'gradeoverby');
+        $this->content  = $submission->feedbackauthor;
+        $this->format   = $submission->feedbackauthorformat;
+    }
+}
+
+
+/**
+ * Renderable feedback for the reviewer
+ */
+class workshop_feedback_reviewer extends workshop_feedback implements renderable {
+
+    /**
+     * Extracts feedback from the given assessment record
+     *
+     * @param stdClass $assessment record as returned by eg {@see self::get_assessment_by_id()}
+     */
+    public function __construct(stdClass $assessment) {
+
+        $this->provider = user_picture::unalias($assessment, null, 'gradinggradeoverbyx', 'overby');
+        $this->content  = $assessment->feedbackreviewer;
+        $this->format   = $assessment->feedbackreviewerformat;
+    }
+}
index 1b1333e..955a171 100644 (file)
@@ -91,7 +91,14 @@ class mod_workshop_renderer extends plugin_renderer_base {
         }
         $o .= $this->output->container_start($classes);
         $o .= $this->output->container_start('header');
-        $o .= $this->output->heading(format_string($submission->title), 3, 'title');
+
+        $title = format_string($submission->title);
+
+        if ($this->page->url != $submission->url) {
+            $title = html_writer::link($submission->url, $title);
+        }
+
+        $o .= $this->output->heading($title, 3, 'title');
 
         if (!$anonymous) {
             $author             = new stdclass();
@@ -490,6 +497,137 @@ class mod_workshop_renderer extends plugin_renderer_base {
         return html_writer::table($table);
     }
 
+    /**
+     * Renders the feedback for the author of the submission
+     *
+     * @param workshop_feedback_author $feedback
+     * @return string HTML
+     */
+    protected function render_workshop_feedback_author(workshop_feedback_author $feedback) {
+        return $this->helper_render_feedback($feedback);
+    }
+
+    /**
+     * Renders the feedback for the reviewer of the submission
+     *
+     * @param workshop_feedback_reviewer $feedback
+     * @return string HTML
+     */
+    protected function render_workshop_feedback_reviewer(workshop_feedback_reviewer $feedback) {
+        return $this->helper_render_feedback($feedback);
+    }
+
+    /**
+     * Helper method to rendering feedback
+     *
+     * @param workshop_feedback_author|workshop_feedback_reviewer $feedback
+     * @return string HTML
+     */
+    private function helper_render_feedback($feedback) {
+
+        $o  = '';    // output HTML code
+        $o .= $this->output->container_start('feedback feedbackforauthor');
+        $o .= $this->output->container_start('header');
+        $o .= $this->output->heading(get_string('feedbackby', 'workshop', s(fullname($feedback->get_provider()))), 3, 'title');
+
+        $userpic = $this->output->user_picture($feedback->get_provider(), array('courseid' => $this->page->course->id, 'size' => 32));
+        $o .= $this->output->container($userpic, 'picture');
+        $o .= $this->output->container_end(); // end of header
+
+        $content = format_text($feedback->get_content(), $feedback->get_format(), array('overflowdiv' => true));
+        $o .= $this->output->container($content, 'content');
+
+        $o .= $this->output->container_end();
+
+        return $o;
+    }
+
+    /**
+     * Renders the full assessment
+     *
+     * @param workshop_assessment $assessment
+     * @return string HTML
+     */
+    protected function render_workshop_assessment(workshop_assessment $assessment) {
+
+        $o = ''; // output HTML code
+        $anonymous = is_null($assessment->reviewer);
+        $classes = 'assessment-full';
+        if ($anonymous) {
+            $classes .= ' anonymous';
+        }
+
+        $o .= $this->output->container_start($classes);
+        $o .= $this->output->container_start('header');
+
+        if (!empty($assessment->title)) {
+            $title = s($assessment->title);
+        } else {
+            $title = get_string('assessment', 'workshop');
+        }
+        if ($this->page->url != $assessment->url) {
+            $o .= $this->output->container(html_writer::link($assessment->url, $title), 'title');
+        } else {
+            $o .= $this->output->container($title, 'title');
+        }
+
+        if (!$anonymous) {
+            $reviewer   = $assessment->reviewer;
+            $userpic    = $this->output->user_picture($reviewer, array('courseid' => $this->page->course->id, 'size' => 32));
+
+            $userurl    = new moodle_url('/user/view.php',
+                                       array('id' => $reviewer->id, 'course' => $this->page->course->id));
+            $a          = new stdClass();
+            $a->name    = fullname($reviewer);
+            $a->url     = $userurl->out();
+            $byfullname = get_string('assessmentby', 'workshop', $a);
+            $oo         = $this->output->container($userpic, 'picture');
+            $oo        .= $this->output->container($byfullname, 'fullname');
+
+            $o .= $this->output->container($oo, 'reviewer');
+        }
+
+        if (is_null($assessment->realgrade)) {
+            $o .= $this->output->container(
+                get_string('notassessed', 'workshop'),
+                'grade nograde'
+            );
+        } else {
+            $a              = new stdClass();
+            $a->max         = $assessment->maxgrade;
+            $a->received    = $assessment->realgrade;
+            $o .= $this->output->container(
+                get_string('gradeinfo', 'workshop', $a),
+                'grade'
+            );
+
+            if (!is_null($assessment->weight) and $assessment->weight != 1) {
+                $o .= $this->output->container(
+                    get_string('weightinfo', 'workshop', $assessment->weight),
+                    'weight'
+                );
+            }
+        }
+
+        $o .= $this->output->container_start('actions');
+        foreach ($assessment->actions as $action) {
+            $o .= $this->output->single_button($action->url, $action->label, $action->method);
+        }
+        $o .= $this->output->container_end(); // actions
+
+        $o .= $this->output->container_end(); // header
+
+        if (!is_null($assessment->form)) {
+            $o .= print_collapsible_region_start('assessment-form-wrapper', uniqid('workshop-assessment'),
+                    get_string('assessmentform', 'workshop'), '', false, true);
+            $o .= $this->output->container(self::moodleform($assessment->form), 'assessment-form');
+            $o .= print_collapsible_region_end(true);
+        }
+
+        $o .= $this->output->container_end(); // main wrapper
+
+        return $o;
+    }
 
     ////////////////////////////////////////////////////////////////////////////
     // Internal rendering helper methods
@@ -726,6 +864,22 @@ class mod_workshop_renderer extends plugin_renderer_base {
     // Static helpers
     ////////////////////////////////////////////////////////////////////////////
 
+    /**
+     * Helper method dealing with the fact we can not just fetch the output of moodleforms
+     *
+     * @param moodleform $mform
+     * @return string HTML
+     */
+    protected static function moodleform(moodleform $mform) {
+
+        ob_start();
+        $mform->display();
+        $o = ob_get_contents();
+        ob_end_clean();
+
+        return $o;
+    }
+
     /**
      * Helper function returning the n-th item of the array
      *
index 22c4851..aea0cf8 100644 (file)
@@ -45,7 +45,8 @@
 
 .path-mod-workshop .submission-summary.anonymous .title,
 .path-mod-workshop .submission-summary.anonymous .author,
-.path-mod-workshop .submission-summary.anonymous .userdate {
+.path-mod-workshop .submission-summary.anonymous .userdate,
+.path-mod-workshop .submission-summary.anonymous .grade-status {
     margin: 0px 0px 0px 5px;
 }
 
 }
 
 /**
- * Assessment
+ * Assessment - full display
  */
-.path-mod-workshop .assessment-summary.graded {
+.path-mod-workshop .assessment-full {
+    border: 1px solid #ddd;
+    margin: 0px auto 1em auto;
+}
+
+.path-mod-workshop .assessment-full .header {
+    position: relative;
+    background-color: #ddd;
+    padding: 3px;
+    min-height: 35px;
+}
+
+.path-mod-workshop .assessment-full .header .title {
+    font-weight: bold;
+}
+
+.path-mod-workshop .assessment-full .header .title,
+.path-mod-workshop .assessment-full .header .reviewer,
+.path-mod-workshop .assessment-full .header .grade,
+.path-mod-workshop .assessment-full .header .weight {
+    margin: 0px 0px 0px 40px;
+}
+
+.path-mod-workshop .assessment-full.anonymous .header .title,
+.path-mod-workshop .assessment-full.anonymous .header .reviewer,
+.path-mod-workshop .assessment-full.anonymous .header .grade,
+.path-mod-workshop .assessment-full.anonymous .header .weight {
+    margin: 0px 0px 0px 5px;
+}
+
+.path-mod-workshop .assessment-full .header .reviewer .picture {
+    position: absolute;
+    top: 3px;
+    left: 3px;
+}
+
+.path-mod-workshop .assessment-full .header .actions {
+    position: absolute;
+    top: 5px;
+    right: 5px;
+    text-align: right;
+}
+
+.path-mod-workshop .assessment-full .header .actions .singlebutton,
+.path-mod-workshop .assessment-full .header .actions .singlebutton form,
+.path-mod-workshop .assessment-full .header .actions .singlebutton form div {
+    display: inline;
+}
+
+.path-mod-workshop .assessment-full .assessment-form-wrapper {
+    margin-top: 0.5em;
+    padding: 0px 1em;
+}
+
+.path-mod-workshop .assessment-summary.graded .singlebutton input[type="submit"],
+.path-mod-workshop .example-summary.graded .singlebutton input[type="submit"] {
     background-color: #e7f1c3;
 }
 
-.path-mod-workshop .example-summary.notgraded {
+.path-mod-workshop .assessment-summary.notgraded .singlebutton input[type="submit"],
+.path-mod-workshop .example-summary.notgraded .singlebutton input[type="submit"] {
     background-color: #ffd3d9;
 }
 
+/**
+ * Assessment form
+ */
 .path-mod-workshop .assessmentform .description {
     margin: 0px 1em;
 }
     vertical-align: top;
 }
 
+/**
+ * Feedback
+ */
+.path-mod-workshop .feedback {
+    border: 1px solid #ddd;
+    margin: 0px auto 1em auto;
+    width: 80%;
+}
+
+.path-mod-workshop .feedback .header {
+    position: relative;
+    background-color: #ddd;
+    padding: 3px;
+    min-height: 35px;
+}
+
+.path-mod-workshop .feedback .header .title {
+    margin: 0px 0px 0px 40px;
+}
+
+.path-mod-workshop .feedback .header .picture {
+    position: absolute;
+    top: 3px;
+    left: 3px;
+}
+
+.path-mod-workshop .feedback .content {
+    padding: 5px 10px;
+}
+
 /**
  * Misc
  */
index 2932c90..9e2c2cd 100644 (file)
@@ -43,7 +43,11 @@ if (isguestuser()) {
 $workshop = $DB->get_record('workshop', array('id' => $cm->instance), '*', MUST_EXIST);
 $workshop = new workshop($workshop, $cm, $course);
 
-$PAGE->set_url($workshop->submission_url(), array('cmid' => $cmid, 'id' => $id, 'edit' => $edit));
+$PAGE->set_url($workshop->submission_url(), array('cmid' => $cmid, 'id' => $id));
+
+if ($edit) {
+    $PAGE->url->param('edit', $edit);
+}
 
 if ($id) { // submission is specified
     $submission = $workshop->get_submission_by_id($id);
@@ -120,7 +124,14 @@ if ($edit) {
 
     $maxfiles       = $workshop->nattachments;
     $maxbytes       = $workshop->maxbytes;
-    $contentopts    = array('trusttext' => true, 'subdirs' => false, 'maxfiles' => $maxfiles, 'maxbytes' => $maxbytes);
+    $contentopts    = array(
+                        'trusttext' => true,
+                        'subdirs'   => false,
+                        'maxfiles'  => $maxfiles,
+                        'maxbytes'  => $maxbytes,
+                        'context'   => $workshop->context
+                      );
+
     $attachmentopts = array('subdirs' => true, 'maxfiles' => $maxfiles, 'maxbytes' => $maxbytes);
     $submission     = file_prepare_standard_editor($submission, 'content', $contentopts, $workshop->context,
                                         'mod_workshop', 'submission_content', $submission->id);
@@ -272,69 +283,79 @@ if ($submission->id and !$edit and !$isreviewer and $canallocate and $workshop->
     echo $output->single_button($url, get_string('assess', 'workshop'), 'post');
 }
 
+if (($workshop->phase == workshop::PHASE_CLOSED) and ($ownsubmission or $canviewall)) {
+    if (!empty($submission->gradeoverby) and strlen(trim($submission->feedbackauthor)) > 0) {
+        echo $output->render(new workshop_feedback_author($submission));
+    }
+}
+
 // and possibly display the submission's review(s)
 
 if ($isreviewer) {
-    $strategy = $workshop->grading_strategy_instance();
-    $mform = $strategy->get_assessment_form($PAGE->url, 'assessment', $userassessment, false);
-    echo $output->heading(get_string('assessmentbyyourself', 'workshop'), 2);
-    // reviewers can always see the grades they gave even they are not available yet
-    if (is_null($userassessment->grade)) {
-        echo $output->heading(get_string('notassessed', 'workshop'), 3);
-        if ($workshop->assessing_allowed($USER->id)) {
-            echo $output->container($output->single_button($workshop->assess_url($userassessment->id), get_string('assess', 'workshop'), 'get'),
-                    array('class' => 'buttonsbar'));
-        }
-    } else {
-        $a = new stdclass();
-        $a->max = $workshop->real_grade(100);
-        $a->received = $workshop->real_grade($userassessment->grade);
-        echo $output->heading(get_string('gradeinfo', 'workshop', $a), 3);
-        if ($userassessment->weight != 1) {
-            echo $output->heading(get_string('weightinfo', 'workshop', $userassessment->weight), 3);
+    // user's own assessment
+    $strategy   = $workshop->grading_strategy_instance();
+    $mform      = $strategy->get_assessment_form($PAGE->url, 'assessment', $userassessment, false);
+    $options    = array(
+        'showreviewer'  => true,
+        'showauthor'    => $showauthor,
+        'showform'      => !is_null($userassessment->grade),
+        'showweight'    => true,
+    );
+    $assessment = $workshop->prepare_assessment($userassessment, $mform, $options);
+    $assessment->title = get_string('assessmentbyyourself', 'workshop');
+
+    if ($workshop->assessing_allowed($USER->id)) {
+        if (is_null($userassessment->grade)) {
+            $assessment->add_action($workshop->assess_url($assessment->id), get_string('assess', 'workshop'));
+        } else {
+            $assessment->add_action($workshop->assess_url($assessment->id), get_string('reassess', 'workshop'));
         }
-        if ($workshop->assessing_allowed($USER->id)) {
-            echo $output->container($output->single_button($workshop->assess_url($userassessment->id), get_string('reassess', 'workshop'), 'get'),
-                    array('class' => 'buttonsbar'));
+    }
+    if ($canoverride) {
+        $assessment->add_action($workshop->assess_url($assessment->id), get_string('assessmentsettings', 'workshop'));
+    }
+
+    echo $output->render($assessment);
+
+    if ($workshop->phase == workshop::PHASE_CLOSED) {
+        if (strlen(trim($userassessment->feedbackreviewer)) > 0) {
+            echo $output->render(new workshop_feedback_reviewer($userassessment));
         }
-        $mform->display();
     }
 }
 
 if (has_capability('mod/workshop:viewallassessments', $workshop->context) or ($ownsubmission and $workshop->assessments_available())) {
-    $strategy = $workshop->grading_strategy_instance();
-    $assessments = $workshop->get_assessments_of_submission($submission->id);
-    $canviewreviewernames = has_capability('mod/workshop:viewreviewernames', $workshop->context);
+    // other assessments
+    $strategy       = $workshop->grading_strategy_instance();
+    $assessments    = $workshop->get_assessments_of_submission($submission->id);
+    $showreviewer   = has_capability('mod/workshop:viewreviewernames', $workshop->context);
     foreach ($assessments as $assessment) {
         if ($assessment->reviewerid == $USER->id) {
             // own assessment has been displayed already
             continue;
         }
-        if (is_null($assessment->grade)) {
-            // not graded assessment are not displayed
+        if (is_null($assessment->grade) and !has_capability('mod/workshop:viewallassessments', $workshop->context)) {
+            // students do not see peer-assessment that are not graded yet
             continue;
         }
-        if ($canviewreviewernames) {
-            $reviewer = new stdclass();
-            $reviewer->firstname = $assessment->reviewerfirstname;
-            $reviewer->lastname = $assessment->reviewerlastname;
-            echo $output->heading(get_string('assessmentbyknown', 'workshop', fullname($reviewer)), 2);
-        } else {
-            echo $output->heading(get_string('assessmentbyunknown', 'workshop'), 2);
-        }
-        $a = new stdclass();
-        $a->max = $workshop->real_grade(100);
-        $a->received = $workshop->real_grade($assessment->grade);
-        echo $output->heading(get_string('gradeinfo', 'workshop', $a), 3);
-        if ($assessment->weight != 1) {
-            echo $output->heading(get_string('weightinfo', 'workshop', $assessment->weight), 3);
+        $mform      = $strategy->get_assessment_form($PAGE->url, 'assessment', $assessment, false);
+        $options    = array(
+            'showreviewer'  => $showreviewer,
+            'showauthor'    => $showauthor,
+            'showform'      => !is_null($assessment->grade),
+            'showweight'    => true,
+        );
+        $displayassessment = $workshop->prepare_assessment($assessment, $mform, $options);
+        if ($canoverride) {
+            $displayassessment->add_action($workshop->assess_url($assessment->id), get_string('assessmentsettings', 'workshop'));
         }
-        if (has_capability('mod/workshop:overridegrades', $workshop->context)) {
-            echo $output->container($output->single_button($workshop->assess_url($assessment->id), get_string('assessmentsettings', 'workshop'), 'get'),
-                    array('class' => 'buttonsbar'));
+        echo $output->render($displayassessment);
+
+        if ($workshop->phase == workshop::PHASE_CLOSED and has_capability('mod/workshop:viewallassessments', $workshop->context)) {
+            if (strlen(trim($assessment->feedbackreviewer)) > 0) {
+                echo $output->render(new workshop_feedback_reviewer($assessment));
+            }
         }
-        $mform = $strategy->get_assessment_form($PAGE->url, 'assessment', $assessment, false);
-        $mform->display();
     }
 }
 
index b733ce9..999894d 100644 (file)
@@ -493,6 +493,11 @@ case workshop::PHASE_CLOSED:
             echo $output->container(get_string('noyoursubmission', 'workshop'));
         }
         echo $output->box_end();
+
+        if (!empty($submission->gradeoverby) and strlen(trim($submission->feedbackauthor)) > 0) {
+            echo $output->render(new workshop_feedback_author($submission));
+        }
+
         print_collapsible_region_end();
     }
     if (has_capability('mod/workshop:viewpublishedsubmissions', $workshop->context)) {
@@ -535,6 +540,10 @@ case workshop::PHASE_CLOSED:
             echo $output->box_start('generalbox assessment-summary' . $class);
             echo $output->render($workshop->prepare_submission_summary($submission, $shownames));
             echo $output->box_end();
+
+            if (strlen(trim($assessment->feedbackreviewer)) > 0) {
+                echo $output->render(new workshop_feedback_reviewer($assessment));
+            }
         }
         print_collapsible_region_end();
     }
index f3099de..20600d1 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 require_once("$CFG->libdir/simpletest/testportfoliolib.php");
 require_once("$CFG->dirroot/portfolio/boxnet/lib.php");
-require_once("$CFG->dirroot/$CFG->admin/generator.php");
 
 /*
  * TODO: The portfolio unit tests were obselete and did not work.
index c52b4a4..5359fe7 100644 (file)
@@ -65,9 +65,9 @@ $PAGE->set_heading($COURSE->fullname);
 echo $OUTPUT->header();
 
 echo '<div class="questionbankwindow boxwidthwide boxaligncenter">';
-$questionbank->display('questions', $pagevars['qpage'],
-        $pagevars['qperpage'], $pagevars['qsortorder'], $pagevars['qsortorderdecoded'],
-        $pagevars['cat'], $pagevars['recurse'], $pagevars['showhidden'], $pagevars['showquestiontext']);
+$questionbank->display('questions', $pagevars['qpage'], $pagevars['qperpage'],
+        $pagevars['cat'], $pagevars['recurse'], $pagevars['showhidden'],
+        $pagevars['showquestiontext']);
 echo "</div>\n";
 
 echo $OUTPUT->footer();
index 27f74a6..52faf97 100644 (file)
@@ -155,7 +155,6 @@ abstract class question_bank_column_base {
 
     /**
      * Output the column header cell.
-     * @param int $currentsort 0 for none. 1 for normal sort, -1 for reverse sort.
      */
     public function display_header() {
         echo '<th class="header ' . $this->get_classes() . '" scope="col">';
@@ -1168,8 +1167,8 @@ class question_bank_view {
      * category      Chooses the category
      * displayoptions Sets display options
      */
-    public function display($tabname, $page, $perpage, $sortorder,
-            $sortorderdecoded, $cat, $recurse, $showhidden, $showquestiontext){
+    public function display($tabname, $page, $perpage, $cat,
+            $recurse, $showhidden, $showquestiontext) {
         global $PAGE, $OUTPUT;
 
         if ($this->process_actions_needing_ui()) {
@@ -1191,8 +1190,9 @@ class question_bank_view {
         $this->print_category_info($category);
 
         // continues with list of questions
-        $this->display_question_list($this->contexts->having_one_edit_tab_cap($tabname), $this->baseurl, $cat, $this->cm,
-                $recurse, $page, $perpage, $showhidden, $sortorder, $sortorderdecoded, $showquestiontext,
+        $this->display_question_list($this->contexts->having_one_edit_tab_cap($tabname),
+                $this->baseurl, $cat, $this->cm,
+                $recurse, $page, $perpage, $showhidden, $showquestiontext,
                 $this->contexts->having_cap('moodle/question:add'));
     }
 
@@ -1246,13 +1246,13 @@ class question_bank_view {
         echo "</div>\n";
     }
 
-    protected function display_options($recurse = 1, $showhidden = false, $showquestiontext = false) {
+    protected function display_options($recurse, $showhidden, $showquestiontext) {
         echo '<form method="get" action="edit.php" id="displayoptions">';
         echo "<fieldset class='invisiblefieldset'>";
         echo html_writer::input_hidden_params($this->baseurl, array('recurse', 'showhidden', 'showquestiontext'));
-        $this->display_category_form_checkbox('recurse', get_string('includesubcategories', 'question'));
-        $this->display_category_form_checkbox('showhidden', get_string('showhidden', 'question'));
-        $this->display_category_form_checkbox('qbshowtext', get_string('showquestiontext', 'question'));
+        $this->display_category_form_checkbox('recurse', $recurse, get_string('includesubcategories', 'question'));
+        $this->display_category_form_checkbox('showhidden', $showhidden, get_string('showhidden', 'question'));
+        $this->display_category_form_checkbox('qbshowtext', $showquestiontext, get_string('showquestiontext', 'question'));
         echo '<noscript><div class="centerpara"><input type="submit" value="'. get_string('go') .'" />';
         echo '</div></noscript></fieldset></form>';
     }
@@ -1260,10 +1260,10 @@ class question_bank_view {
     /**
      * Print a single option checkbox. Used by the preceeding.
      */
-    protected function display_category_form_checkbox($name, $label) {
+    protected function display_category_form_checkbox($name, $value, $label) {
         echo '<div><input type="hidden" id="' . $name . '_off" name="' . $name . '" value="0" />';
         echo '<input type="checkbox" id="' . $name . '_on" name="' . $name . '" value="1"';
-        if (optional_param($name, false, PARAM_BOOL)) {
+        if ($value) {
             echo ' checked="checked"';
         }
         echo ' onchange="getElementById(\'displayoptions\').submit(); return true;" />';
@@ -1297,7 +1297,6 @@ class question_bank_view {
     */
     protected function display_question_list($contexts, $pageurl, $categoryandcontext,
             $cm = null, $recurse=1, $page=0, $perpage=100, $showhidden=false,
-            $sortorder='typename', $sortorderdecoded='qtype, name ASC',
             $showquestiontext = false, $addcontexts = array()) {
         global $CFG, $DB, $OUTPUT;
 
@@ -1639,17 +1638,12 @@ function question_edit_setup($edittab, $baseurl, $requirecmid = false, $requirec
         $pagevars['qperpage'] = DEFAULT_QUESTIONS_PER_PAGE;
     }
 
-    $sortoptions = array('alpha' => 'name, qtype ASC',
-                          'typealpha' => 'qtype, name ASC',
-                          'age' => 'id ASC');
-
-    if ($sortorder = optional_param('qsortorder', '', PARAM_ALPHA)) {
-        $pagevars['qsortorderdecoded'] = $sortoptions[$sortorder];
-        $pagevars['qsortorder'] = $sortorder;
-        $thispageurl->param('qsortorder', $sortorder);
-    } else {
-        $pagevars['qsortorderdecoded'] = $sortoptions['typealpha'];
-        $pagevars['qsortorder'] = 'typealpha';
+    for ($i = 1; $i <= question_bank_view::MAX_SORTS; $i++) {
+        $param = 'qbs' . $i;
+        if (!$sort = optional_param($param, '', PARAM_ALPHAEXT)) {
+            break;
+        }
+        $thispageurl->param($param, $sort);
     }
 
     $defaultcategory = question_make_default_categories($contexts->all());
index 8cdbfbd..dc3db4a 100644 (file)
@@ -394,6 +394,8 @@ class qformat_default {
 
             $question->createdby = $USER->id;
             $question->timecreated = time();
+            $question->modifiedby = $USER->id;
+            $question->timemodified = time();
 
             $question->id = $DB->insert_record('question', $question);
             if (isset($question->questiontextfiles)) {
@@ -595,7 +597,9 @@ class qformat_default {
         $question->image = "";
         $question->usecase = 0;
         $question->multiplier = array();
+        $question->questiontextformat = FORMAT_MOODLE;
         $question->generalfeedback = '';
+        $question->generalfeedbackformat = FORMAT_MOODLE;
         $question->correctfeedback = '';
         $question->partiallycorrectfeedback = '';
         $question->incorrectfeedback = '';
index d9db4bb..4e64c2f 100644 (file)
@@ -76,12 +76,11 @@ class qformat_aiken extends qformat_default {
                 }
                 if (preg_match('/^[A-Z][).][ \t]/', $nowline)) {
                     // A choice. Trim off the label and space, then save
-                    $question->answer[] = htmlspecialchars(trim(substr($nowline, 2)), ENT_NOQUOTES);
+                    $question->answer[] = $this->text_field(
+                            htmlspecialchars(trim(substr($nowline, 2)), ENT_NOQUOTES));
                     $question->fraction[] = 0;
-                    $question->feedback[] = '';
-                    continue;
-                }
-                if (preg_match('/^ANSWER:/', $nowline)) {
+                    $question->feedback[] = $this->text_field('');
+                } else if (preg_match('/^ANSWER:/', $nowline)) {
                     // The line that indicates the correct answer. This question is finised.
                     $ans = trim(substr($nowline, strpos($nowline, ':') + 1));
                     $ans = substr($ans, 0, 1);
@@ -97,15 +96,31 @@ class qformat_aiken extends qformat_default {
                     // Must be the first line of a new question, since no recognised prefix.
                     $question->qtype = MULTICHOICE;
                     $question->name = shorten_text(s($nowline), 50);
-                    $question->questiontext = s($nowline);
+                    $question->questiontext = htmlspecialchars(trim($nowline), ENT_NOQUOTES);
+                    $question->questiontextformat = FORMAT_HTML;
+                    $question->generalfeedback = '';
+                    $question->generalfeedbackformat = FORMAT_HTML;
                     $question->single = 1;
-                    $question->feedback[] = '';
+                    $question->answer = array();
+                    $question->fraction = array();
+                    $question->feedback = array();
+                    $question->correctfeedback = $this->text_field('');
+                    $question->partiallycorrectfeedback = $this->text_field('');
+                    $question->incorrectfeedback = $this->text_field('');
                 }
             }
         }
         return $questions;
     }
 
+    protected function text_field($text) {
+        return array(
+            'text' => htmlspecialchars(trim($text), ENT_NOQUOTES),
+            'format' => FORMAT_HTML,
+            'files' => array(),
+        );
+    }
+
     public function readquestion($lines) {
         //this is no longer needed but might still be called by default.php
         return;
diff --git a/question/format/aiken/simpletest/fixtures/questions.aiken.txt b/question/format/aiken/simpletest/fixtures/questions.aiken.txt
new file mode 100644 (file)
index 0000000..b8c24d4
--- /dev/null
@@ -0,0 +1,11 @@
+The Moodle project was started by:
+A) Petr Skoda
+B) Martin Dougiamas
+C) Eloy Lafuente
+D) Tim Hunt
+ANSWER: B
+
+Moodle's abilities include handling user input that includes <html class="cool"> & images:
+A) True
+B) False
+ANSWER: A
index b08e7fb..757099b 100644 (file)
@@ -355,7 +355,7 @@ abstract class question_edit_form extends moodleform {
         $mform = $this->_form;
 
         $repeated = array();
-        $repeated[] = $mform->createElement('header', 'answerhdr', get_string('hintn', 'question'));
+        $repeated[] = $mform->createElement('header', 'hinthdr', get_string('hintn', 'question'));
         $repeated[] = $mform->createElement('editor', 'hint', get_string('hinttext', 'question'),
                 array('rows' => 5), $this->editoroptions);
         $repeatedoptions['hint']['type'] = PARAM_RAW;
index 8828030..36f08b5 100644 (file)
@@ -206,6 +206,8 @@ class qtype_match extends question_type {
             $fs->move_area_files_to_new_context($oldcontextid,
                     $newcontextid, 'qtype_match', 'subquestion', $subquestionid);
         }
+
+        $this->move_files_in_combined_feedback($questionid, $oldcontextid, $newcontextid);
     }
 
     protected function delete_files($questionid, $contextid) {
@@ -220,11 +222,6 @@ class qtype_match extends question_type {
             $fs->delete_area_files($contextid, 'qtype_match', 'subquestion', $subquestionid);
         }
 
-        $fs->delete_area_files($contextid, 'qtype_multichoice',
-                'correctfeedback', $questionid);
-        $fs->delete_area_files($contextid, 'qtype_multichoice',
-                'partiallycorrectfeedback', $questionid);
-        $fs->delete_area_files($contextid, 'qtype_multichoice',
-                'incorrectfeedback', $questionid);
+        $this->delete_files_in_combined_feedback($questionid, $contextid);
     }
 }
index b4d20db..70724e0 100644 (file)
@@ -69,17 +69,4 @@ class backup_qtype_multichoice_plugin extends backup_qtype_plugin {
 
         return $plugin;
     }
-
-    /**
-     * Returns one array with filearea => mappingname elements for the qtype
-     *
-     * Used by {@link get_components_and_fileareas} to know about all the qtype
-     * files to be processed both in backup and restore.
-     */
-    public static function get_qtype_fileareas() {
-        return array(
-            'correctfeedback' => 'question_created',
-            'partiallycorrectfeedback' => 'question_created',
-            'incorrectfeedback' => 'question_created');
-    }
 }
index f7b46ad..240bc4c 100644 (file)
@@ -231,30 +231,14 @@ class qtype_multichoice extends question_type {
     }
 
     public function move_files($questionid, $oldcontextid, $newcontextid) {
-        $fs = get_file_storage();
-
         parent::move_files($questionid, $oldcontextid, $newcontextid);
         $this->move_files_in_answers($questionid, $oldcontextid, $newcontextid, true);
-
-        $fs->move_area_files_to_new_context($oldcontextid,
-                $newcontextid, 'qtype_multichoice', 'correctfeedback', $questionid);
-        $fs->move_area_files_to_new_context($oldcontextid,
-                $newcontextid, 'qtype_multichoice', 'partiallycorrectfeedback', $questionid);
-        $fs->move_area_files_to_new_context($oldcontextid,
-                $newcontextid, 'qtype_multichoice', 'incorrectfeedback', $questionid);
+        $this->move_files_in_combined_feedback($questionid, $oldcontextid, $newcontextid);
     }
 
     protected function delete_files($questionid, $contextid) {
-        $fs = get_file_storage();
-
         parent::delete_files($questionid, $contextid);
         $this->delete_files_in_answers($questionid, $contextid, true);
-
-        $fs->delete_area_files($contextid,
-                'qtype_multichoice', 'correctfeedback', $questionid);
-        $fs->delete_area_files($contextid,
-                'qtype_multichoice', 'partiallycorrectfeedback', $questionid);
-        $fs->delete_area_files($contextid,
-                'qtype_multichoice', 'incorrectfeedback', $questionid);
+        $this->delete_files_in_combined_feedback($questionid, $contextid);
     }
 }
index f45bf40..edd9266 100644 (file)
@@ -454,7 +454,7 @@ class question_classified_response {
     }
 
     public static function no_response() {
-        return new question_classified_response(null, null, null);
+        return new question_classified_response(null, get_string('noresponse', 'question'), null);
     }
 }
 
index 7576669..d127c6e 100644 (file)
@@ -1107,6 +1107,28 @@ class question_type {
         }
     }
 
+    /**
+     * Move all the files belonging to this question's answers when the question
+     * is moved from one context to another.
+     * @param int $questionid the question being moved.
+     * @param int $oldcontextid the context it is moving from.
+     * @param int $newcontextid the context it is moving to.
+     * @param bool $answerstoo whether there is an 'answer' question area,
+     *      as well as an 'answerfeedback' one. Default false.
+     */
+    protected function move_files_in_combined_feedback($questionid, $oldcontextid,
+            $newcontextid) {
+        global $DB;
+        $fs = get_file_storage();
+
+        $fs->move_area_files_to_new_context($oldcontextid,
+                $newcontextid, 'question', 'correctfeedback', $questionid);
+        $fs->move_area_files_to_new_context($oldcontextid,
+                $newcontextid, 'question', 'partiallycorrectfeedback', $questionid);
+        $fs->move_area_files_to_new_context($oldcontextid,
+                $newcontextid, 'question', 'incorrectfeedback', $questionid);
+    }
+
     /**
      * Delete all the files belonging to this question.
      * @param int $questionid the question being deleted.
@@ -1139,6 +1161,25 @@ class question_type {
         }
     }
 
+    /**
+     * Delete all the files belonging to this question's answers.
+     * @param int $questionid the question being deleted.
+     * @param int $contextid the context the question is in.
+     * @param bool $answerstoo whether there is an 'answer' question area,
+     *      as well as an 'answerfeedback' one. Default false.
+     */
+    protected function delete_files_in_combined_feedback($questionid, $contextid) {
+        global $DB;
+        $fs = get_file_storage();
+
+        $fs->delete_area_files($contextid,
+                'question', 'correctfeedback', $questionid);
+        $fs->delete_area_files($contextid,
+                'question', 'partiallycorrectfeedback', $questionid);
+        $fs->delete_area_files($contextid,
+                'question', 'incorrectfeedback', $questionid);
+    }
+
     public function import_file($context, $component, $filearea, $itemid, $file) {
         $fs = get_file_storage();
         $record = new stdClass();
index f1a511e..f75a548 100644 (file)
@@ -567,22 +567,25 @@ class rating_manager {
         $params['component']    = $options->component;
         $params['ratingarea'] = $options->ratingarea;
 
-        $sql = "SELECT r.itemid, r.component, r.ratingarea, r.contextid,
-                       $aggregatestr(r.rating) AS aggrrating, COUNT(r.rating) AS numratings,
-                       ur.id, ur.userid, ur.scaleid, ur.rating AS usersrating
+        $sql = "SELECT r.id, r.itemid, r.userid, r.scaleid, r.rating AS usersrating
+                  FROM {rating} r
+                 WHERE r.userid = :userid AND
+                       r.contextid = :contextid AND
+                       r.itemid {$itemidtest} AND
+                       r.component = :component AND
+                       r.ratingarea = :ratingarea
+              ORDER BY r.itemid";
+        $userratings = $DB->get_records_sql($sql, $params);
+
+        $sql = "SELECT r.itemid, $aggregatestr(r.rating) AS aggrrating, COUNT(r.rating) AS numratings
                   FROM {rating} r
-             LEFT JOIN {rating} ur ON ur.contextid = r.contextid AND
-                                      ur.itemid = r.itemid AND
-                                      ur.component = r.component AND
-                                      ur.ratingarea = r.ratingarea AND
-                                      ur.userid = :userid
                  WHERE r.contextid = :contextid AND
                        r.itemid {$itemidtest} AND
                        r.component = :component AND
                        r.ratingarea = :ratingarea
-              GROUP BY r.itemid, r.component, r.ratingarea, r.contextid, ur.id, ur.userid, ur.scaleid
+              GROUP BY r.itemid, r.component, r.ratingarea, r.contextid
               ORDER BY r.itemid";
-        $ratingsrecords = $DB->get_records_sql($sql, $params);
+        $aggregateratings = $DB->get_records_sql($sql, $params);
 
         $ratingoptions = new stdClass;
         $ratingoptions->context = $options->context;
@@ -590,25 +593,37 @@ class rating_manager {
         $ratingoptions->ratingarea = $options->ratingarea;
         $ratingoptions->settings = $this->generate_rating_settings_object($options);
         foreach ($options->items as $item) {
-            if (array_key_exists($item->{$itemidcol}, $ratingsrecords)) {
-                // Note: rec->scaleid = the id of scale at the time the rating was submitted
-                // may be different from the current scale id
-                $rec = $ratingsrecords[$item->{$itemidcol}];
+            $founduserrating = false;
+            foreach($userratings as $userrating) {
+                //look for an existing rating from this user of this item
+                if ($item->{$itemidcol} == $userrating->itemid) {
+                    // Note: rec->scaleid = the id of scale at the time the rating was submitted
+                    // may be different from the current scale id
+                    $ratingoptions->scaleid = $userrating->scaleid;
+                    $ratingoptions->userid = $userrating->userid;
+                    $ratingoptions->id = $userrating->id;
+                    $ratingoptions->rating = min($userrating->usersrating, $ratingoptions->settings->scale->max);
+
+                    $founduserrating = true;
+                    break;
+                }
+            }
+            if (!$founduserrating) {
+                $ratingoptions->scaleid = null;
+                $ratingoptions->userid = null;
+                $ratingoptions->id = null;
+                $ratingoptions->rating =  null;
+            }
+
+            if (array_key_exists($item->{$itemidcol}, $aggregateratings)) {
+                $rec = $aggregateratings[$item->{$itemidcol}];
                 $ratingoptions->itemid = $item->{$itemidcol};
-                $ratingoptions->scaleid = $rec->scaleid;
-                $ratingoptions->userid = $rec->userid;
-                $ratingoptions->id = $rec->id;
                 $ratingoptions->aggregate = min($rec->aggrrating, $ratingoptions->settings->scale->max);
                 $ratingoptions->count = $rec->numratings;
-                $ratingoptions->rating = min($rec->usersrating, $ratingoptions->settings->scale->max);
             } else {
                 $ratingoptions->itemid = $item->{$itemidcol};
-                $ratingoptions->scaleid = null;
-                $ratingoptions->userid = null;
-                $ratingoptions->id = null;
                 $ratingoptions->aggregate = null;
                 $ratingoptions->count = 0;
-                $ratingoptions->rating =  null;
             }
 
             $rating = new rating($ratingoptions);
diff --git a/rating/simpletest/testrating.php b/rating/simpletest/testrating.php
new file mode 100644 (file)
index 0000000..910544c
--- /dev/null
@@ -0,0 +1,225 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Unit tests for rating/lib.php
+ *
+ * @package    moodlecore
+ * @subpackage rating
+ * @copyright  2011 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com}
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+// Include all the needed stuff
+require_once($CFG->dirroot . '/rating/lib.php');
+
+/**
+ * Unit test case for all the rating/lib.php requiring DB mockup & manipulation
+ */
+class rating_db_test extends UnitTestCaseUsingDatabase {
+
+    public static $includecoverage = array(
+        'rating/lib.php'
+    );
+
+    protected $testtables = array(
+            'lib' => array(
+                'rating', 'scale'));
+
+    public function setUp() {
+        parent::setUp();
+
+        $this->switch_to_test_db(); // Switch to test DB for all the execution
+
+        foreach ($this->testtables as $dir => $tables) {
+            $this->create_test_tables($tables, $dir); // Create tables
+        }
+    }
+
+    /**
+     * Test the current get_ratings method main sql
+     */
+    function test_get_ratings_sql() {
+
+        // We load 3 items. Each is rated twice. For simplicity itemid == user id of the item owner
+        $ctxid = SYSCONTEXTID;
+        $this->load_test_data('rating',
+                array('contextid', 'component', 'ratingarea', 'itemid', 'scaleid', 'rating', 'userid', 'timecreated', 'timemodified'), array(
+
+                //user 1's items. Average == 2
+                array(    $ctxid , 'mod_forum',       'post',       1 ,       10 ,       1 ,       2 ,            1 ,              1),
+                array(    $ctxid , 'mod_forum',       'post',       1 ,       10 ,       3 ,       3 ,            1 ,              1),
+
+                //user 2's items. Average == 3
+                array(    $ctxid , 'mod_forum',       'post',       2 ,       10 ,       1 ,       1 ,            1 ,              1),
+                array(    $ctxid , 'mod_forum',       'post',       2 ,       10 ,       5 ,       3 ,            1 ,              1),
+
+                //user 3's items. Average == 4
+                array(    $ctxid , 'mod_forum',       'post',       3 ,       10 ,       3 ,       1 ,            1 ,              1),
+                array(    $ctxid , 'mod_forum',       'post',       3 ,       10 ,       5 ,       2 ,            1 ,              1)
+                ));
+
+        // a post (item) by user 1 (rated above by user 2 and 3 with average = 2)
+        $user1posts = array(
+                (object)array('id' => 1, 'userid' => 1, 'message' => 'hello'));
+        // a post (item) by user 2 (rated above by user 1 and 3 with average = 3)
+        $user2posts = array(
+                (object)array('id' => 2, 'userid' => 2, 'message' => 'world'));
+        // a post (item) by user 3 (rated above by user 1 and 2 with average = 4)
+        $user3posts = array(
+                (object)array('id' => 3, 'userid' => 3, 'message' => 'moodle'));
+
+        // Prepare the default options
+        $defaultoptions = array (
+                'context'    => get_context_instance(CONTEXT_SYSTEM),
+                'component'  => 'mod_forum',
+                'ratingarea' => 'post',
+                'scaleid'    => 10,
+                'aggregate'  => RATING_AGGREGATE_AVERAGE);
+
+        $rm = new rating_manager();
+
+        // STEP 1: Retreive ratings using the current user
+
+        // Get results for user 1's item (expected average 1 + 3 / 2 = 2)
+        $toptions = (object)array_merge($defaultoptions, array('items' => $user1posts));
+        $result = $rm->get_ratings($toptions);
+        $this->assertEqual(count($result), count($user1posts));
+        $this->assertEqual($result[0]->id, $user1posts[0]->id);
+        $this->assertEqual($result[0]->userid, $user1posts[0]->userid);
+        $this->assertEqual($result[0]->message, $user1posts[0]->message);
+        $this->assertEqual($result[0]->rating->count, 2);
+        $this->assertEqual($result[0]->rating->aggregate, 2);
+        // Note that $result[0]->rating->rating is somewhat random
+        // We didn't supply a user ID so $USER was used which will vary depending on who runs the tests
+
+        // Get results for items of user 2 (expected average 1 + 5 / 2 = 3)
+        $toptions = (object)array_merge($defaultoptions, array('items' => $user2posts));
+        $result = $rm->get_ratings($toptions);
+        $this->assertEqual(count($result), count($user2posts));
+        $this->assertEqual($result[0]->id, $user2posts[0]->id);
+        $this->assertEqual($result[0]->userid, $user2posts[0]->userid);
+        $this->assertEqual($result[0]->message, $user2posts[0]->message);
+        $this->assertEqual($result[0]->rating->count, 2);
+        $this->assertEqual($result[0]->rating->aggregate, 3);
+        // Note that $result[0]->rating->rating is somewhat random
+        // We didn't supply a user ID so $USER was used which will vary depending on who runs the tests
+
+        // Get results for items of user 3 (expected average 3 + 5 / 2 = 4)
+        $toptions = (object)array_merge($defaultoptions, array('items' => $user3posts));
+        $result = $rm->get_ratings($toptions);
+        $this->assertEqual(count($result), count($user3posts));
+        $this->assertEqual($result[0]->id, $user3posts[0]->id);
+        $this->assertEqual($result[0]->userid, $user3posts[0]->userid);
+        $this->assertEqual($result[0]->message, $user3posts[0]->message);
+        $this->assertEqual($result[0]->rating->count, 2);
+        $this->assertEqual($result[0]->rating->aggregate, 4);
+        // Note that $result[0]->rating->rating is somewhat random
+        // We didn't supply a user ID so $USER was used which will vary depending on who runs the tests
+
+        // Get results for items of user 1 & 2 together (expected averages are 2 and 3, as tested above)
+        $posts = array_merge($user1posts, $user2posts);
+        $toptions = (object)array_merge($defaultoptions, array('items' => $posts));
+        $result = $rm->get_ratings($toptions);
+        $this->assertEqual(count($result), count($posts));
+        $this->assertEqual($result[0]->id, $posts[0]->id);
+        $this->assertEqual($result[0]->userid, $posts[0]->userid);
+        $this->assertEqual($result[0]->message, $posts[0]->message);
+        $this->assertEqual($result[0]->rating->count, 2);
+        $this->assertEqual($result[0]->rating->aggregate, 2);
+        // Note that $result[0]->rating->rating is somewhat random
+        // We didn't supply a user ID so $USER was used which will vary depending on who runs the tests
+
+        $this->assertEqual($result[1]->id, $posts[1]->id);
+        $this->assertEqual($result[1]->userid, $posts[1]->userid);
+        $this->assertEqual($result[1]->message, $posts[1]->message);
+        $this->assertEqual($result[1]->rating->count, 2);
+        $this->assertEqual($result[1]->rating->aggregate, 3);
+        // Note that $result[0]->rating->rating is somewhat random
+        // We didn't supply a user ID so $USER was used which will vary depending on who runs the tests
+
+        // STEP 2: Retrieve ratings by a specified user
+        //         We still expect complete aggregations and counts
+
+        // Get results for items of user 1 rated by user 2 (avg 2, rating 1)
+        $toptions = (object)array_merge($defaultoptions, array('items' => $user1posts, 'userid' => 2));
+        $result = $rm->get_ratings($toptions);
+        $this->assertEqual(count($result), count($user1posts));
+        $this->assertEqual($result[0]->id, $user1posts[0]->id);
+        $this->assertEqual($result[0]->userid, $user1posts[0]->userid);
+        $this->assertEqual($result[0]->message, $user1posts[0]->message);
+        $this->assertEqual($result[0]->rating->count, 2);
+        $this->assertEqual($result[0]->rating->aggregate, 2);
+        $this->assertEqual($result[0]->rating->rating, 1); //user 2 rated user 1 "1"
+        $this->assertEqual($result[0]->rating->userid, $toptions->userid); // Must be the passed userid
+
+        // Get results for items of user 1 rated by user 3
+        $toptions = (object)array_merge($defaultoptions, array('items' => $user1posts, 'userid' => 3));
+        $result = $rm->get_ratings($toptions);
+        $this->assertEqual(count($result), count($user1posts));
+        $this->assertEqual($result[0]->id, $user1posts[0]->id);
+        $this->assertEqual($result[0]->userid, $user1posts[0]->userid);
+        $this->assertEqual($result[0]->message, $user1posts[0]->message);
+        $this->assertEqual($result[0]->rating->count, 2);
+        $this->assertEqual($result[0]->rating->aggregate, 2);
+        $this->assertEqual($result[0]->rating->rating, 3); //user 3 rated user 1 "3"
+        $this->assertEqual($result[0]->rating->userid, $toptions->userid); // Must be the passed userid
+
+        // Get results for items of user 1 & 2 together rated by user 3
+        $posts = array_merge($user1posts, $user2posts);
+        $toptions = (object)array_merge($defaultoptions, array('items' => $posts, 'userid' => 3));
+        $result = $rm->get_ratings($toptions);
+        $this->assertEqual(count($result), count($posts));
+        $this->assertEqual($result[0]->id, $posts[0]->id);
+        $th