[sword-svn] r144 - in trunk: . as_is/borland source source/allinone source/common source/common/unicode source/config source/data source/data/coll source/data/locales source/data/mappings source/data/misc source/data/rbnf source/i18n source/i18n/unicode source/layout source/layoutex source/samples/datefmt source/samples/layout source/samples/msgfmt source/samples/translit source/test/cintltst source/test/intltest source/test/letest source/test/testdata source/tools/genbrk source/tools/genctd source/tools/genuca source/tools/tzcode

chrislit at www.crosswire.org chrislit at www.crosswire.org
Mon Mar 24 04:52:40 MST 2008


Author: chrislit
Date: 2008-03-24 04:52:37 -0700 (Mon, 24 Mar 2008)
New Revision: 144

Added:
   trunk/source/data/coll/colfiles.mk
   trunk/source/data/misc/metazoneInfo.txt
   trunk/source/data/rbnf/rbnffiles.mk
   trunk/source/i18n/zonemeta.cpp
   trunk/source/i18n/zonemeta.h
   trunk/source/i18n/zstrfmt.cpp
   trunk/source/i18n/zstrfmt.h
   trunk/source/test/intltest/tzfmttst.cpp
   trunk/source/test/intltest/tzfmttst.h
   trunk/source/test/intltest/tzoffloc.cpp
   trunk/source/test/intltest/tzoffloc.h
Modified:
   trunk/as_is/borland/icuin.bpf
   trunk/as_is/borland/icuin.bpr
   trunk/readme.html
   trunk/source/Makefile.in
   trunk/source/allinone/allinone.sln
   trunk/source/common/putil.c
   trunk/source/common/ubidi.c
   trunk/source/common/uloc.c
   trunk/source/common/unicode/uversion.h
   trunk/source/config/Makefile.inc.in
   trunk/source/config/icu-config-bottom
   trunk/source/config/mh-aix-gcc
   trunk/source/config/mh-cygwin-msvc
   trunk/source/data/Makefile.in
   trunk/source/data/build.xml
   trunk/source/data/locales/bg.txt
   trunk/source/data/locales/cs.txt
   trunk/source/data/locales/da.txt
   trunk/source/data/locales/en.txt
   trunk/source/data/locales/en_AU.txt
   trunk/source/data/locales/en_CA.txt
   trunk/source/data/locales/en_GB.txt
   trunk/source/data/locales/en_NZ.txt
   trunk/source/data/locales/en_ZA.txt
   trunk/source/data/locales/en_ZW.txt
   trunk/source/data/locales/es.txt
   trunk/source/data/locales/es_DO.txt
   trunk/source/data/locales/es_GT.txt
   trunk/source/data/locales/es_HN.txt
   trunk/source/data/locales/es_MX.txt
   trunk/source/data/locales/es_NI.txt
   trunk/source/data/locales/es_PA.txt
   trunk/source/data/locales/es_PE.txt
   trunk/source/data/locales/es_PR.txt
   trunk/source/data/locales/es_SV.txt
   trunk/source/data/locales/es_US.txt
   trunk/source/data/locales/fa.txt
   trunk/source/data/locales/fi.txt
   trunk/source/data/locales/fr.txt
   trunk/source/data/locales/fr_CA.txt
   trunk/source/data/locales/hu.txt
   trunk/source/data/locales/is.txt
   trunk/source/data/locales/it.txt
   trunk/source/data/locales/ja.txt
   trunk/source/data/locales/ka.txt
   trunk/source/data/locales/ko.txt
   trunk/source/data/locales/nl.txt
   trunk/source/data/locales/pt.txt
   trunk/source/data/locales/pt_PT.txt
   trunk/source/data/locales/ro.txt
   trunk/source/data/locales/sl.txt
   trunk/source/data/locales/sv.txt
   trunk/source/data/locales/th.txt
   trunk/source/data/locales/tr.txt
   trunk/source/data/locales/zh.txt
   trunk/source/data/locales/zh_Hans_SG.txt
   trunk/source/data/locales/zh_Hant.txt
   trunk/source/data/makedata.mak
   trunk/source/data/mappings/convrtrs.txt
   trunk/source/data/misc/miscfiles.mk
   trunk/source/data/misc/supplementalData.txt
   trunk/source/data/misc/zoneinfo.txt
   trunk/source/i18n/Makefile.in
   trunk/source/i18n/basictz.cpp
   trunk/source/i18n/calendar.cpp
   trunk/source/i18n/datefmt.cpp
   trunk/source/i18n/dtfmtsym.cpp
   trunk/source/i18n/i18n.vcproj
   trunk/source/i18n/nfsubs.cpp
   trunk/source/i18n/olsontz.cpp
   trunk/source/i18n/olsontz.h
   trunk/source/i18n/rbtz.cpp
   trunk/source/i18n/simpletz.cpp
   trunk/source/i18n/smpdtfmt.cpp
   trunk/source/i18n/timezone.cpp
   trunk/source/i18n/ucln_in.h
   trunk/source/i18n/ucol.cpp
   trunk/source/i18n/ucol_bld.cpp
   trunk/source/i18n/ucol_elm.cpp
   trunk/source/i18n/ucol_elm.h
   trunk/source/i18n/ucol_tok.cpp
   trunk/source/i18n/ucol_tok.h
   trunk/source/i18n/unicode/basictz.h
   trunk/source/i18n/unicode/dtfmtsym.h
   trunk/source/i18n/unicode/rbtz.h
   trunk/source/i18n/unicode/simpletz.h
   trunk/source/i18n/unicode/smpdtfmt.h
   trunk/source/i18n/unicode/timezone.h
   trunk/source/i18n/usearch.cpp
   trunk/source/i18n/usrchimp.h
   trunk/source/layout/GlyphIterator.cpp
   trunk/source/layout/GlyphIterator.h
   trunk/source/layout/IndicReordering.cpp
   trunk/source/layout/KhmerReordering.cpp
   trunk/source/layout/LookupProcessor.cpp
   trunk/source/layout/OpenTypeLayoutEngine.cpp
   trunk/source/layout/OpenTypeTables.h
   trunk/source/layout/ThaiLayoutEngine.cpp
   trunk/source/layout/TibetanReordering.cpp
   trunk/source/layoutex/ParagraphLayout.cpp
   trunk/source/samples/datefmt/README.TXT
   trunk/source/samples/layout/layout.cpp
   trunk/source/samples/msgfmt/README.TXT
   trunk/source/samples/translit/README.TXT
   trunk/source/test/cintltst/callcoll.c
   trunk/source/test/cintltst/cloctst.c
   trunk/source/test/cintltst/cmsccoll.c
   trunk/source/test/cintltst/udatatst.c
   trunk/source/test/cintltst/usrchdat.c
   trunk/source/test/cintltst/usrchtst.c
   trunk/source/test/intltest/Makefile.in
   trunk/source/test/intltest/dtfmtrtts.cpp
   trunk/source/test/intltest/dtfmttst.cpp
   trunk/source/test/intltest/intltest.vcproj
   trunk/source/test/intltest/itformat.cpp
   trunk/source/test/intltest/itrbnf.cpp
   trunk/source/test/intltest/itrbnf.h
   trunk/source/test/intltest/loctest.cpp
   trunk/source/test/intltest/miscdtfm.cpp
   trunk/source/test/intltest/srchtest.cpp
   trunk/source/test/intltest/srchtest.h
   trunk/source/test/intltest/tzrulets.cpp
   trunk/source/test/intltest/tztest.cpp
   trunk/source/test/intltest/tztest.h
   trunk/source/test/letest/Makefile.in
   trunk/source/test/letest/cletest.c
   trunk/source/test/letest/letest.cpp
   trunk/source/test/testdata/calendar.txt
   trunk/source/test/testdata/format.txt
   trunk/source/test/testdata/structLocale.txt
   trunk/source/test/testdata/tstfiles.mk
   trunk/source/tools/genbrk/genbrk.1.in
   trunk/source/tools/genctd/genctd.1.in
   trunk/source/tools/genuca/genuca.cpp
   trunk/source/tools/tzcode/readme.txt
Log:
Updated ICU to 3.8.1


Modified: trunk/as_is/borland/icuin.bpf
===================================================================
--- trunk/as_is/borland/icuin.bpf	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/as_is/borland/icuin.bpf	2008-03-24 11:52:37 UTC (rev 144)
@@ -118,6 +118,8 @@
 USEUNIT("..\..\source\i18n\tztrans.cpp");
 USEUNIT("..\..\source\i18n\udatpg.cpp");
 USEUNIT("..\..\source\i18n\vtzone.cpp");
+USEUNIT("..\..\source\i18n\zonemeta.cpp");
+USEUNIT("..\..\source\i18n\zstrfmt.cpp");
 //---------------------------------------------------------------------------
 #define Library
 

Modified: trunk/as_is/borland/icuin.bpr
===================================================================
--- trunk/as_is/borland/icuin.bpr	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/as_is/borland/icuin.bpr	2008-03-24 11:52:37 UTC (rev 144)
@@ -60,7 +60,8 @@
       ..\..\source\i18n\persncal.obj ..\..\source\i18n\rbtz.obj 
       ..\..\source\i18n\reldtfmt.obj ..\..\source\i18n\taiwncal.obj 
       ..\..\source\i18n\tzrule.obj ..\..\source\i18n\tztrans.obj 
-      ..\..\source\i18n\udatpg.obj ..\..\source\i18n\vtzone.obj"/>
+      ..\..\source\i18n\udatpg.obj ..\..\source\i18n\vtzone.obj 
+      ..\..\source\i18n\zonemeta.obj ..\..\source\i18n\zstrfmt.obj"/>
     <RESFILES value=""/>
     <IDLFILES value=""/>
     <IDLGENFILES value=""/>

Modified: trunk/readme.html
===================================================================
--- trunk/readme.html	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/readme.html	2008-03-24 11:52:37 UTC (rev 144)
@@ -33,7 +33,7 @@
      <abbr title="International Components for Unicode">ICU</abbr> 3.8
     ReadMe</h1>
 
-    <p>Version: 2007 September 12<br />
+    <p>Version: 2007 September 16<br />
      Copyright &copy; 1997-2007 International Business Machines Corporation and
     others. All Rights Reserved.</p>
     <!-- Remember that there is a copyright at the end too -->
@@ -242,13 +242,12 @@
       <strong>icu-nnnn.tgz</strong>, where nnnn is the version number. The .zip
       file is used for Windows platforms, while the .tgz file is preferred on
       most other platforms.<br />
-       Please unzip this file. It will reconstruct the source directory, which
-      includes anonymous CVS control directories (see below).</li>
+       Please unzip this file. </li>
 
-      <li><strong>CVS Source Repository:</strong><br />
+      <li><strong>Subversion Source Repository:</strong><br />
        If you are interested in developing features, patches, or bug fixes for
       ICU, you should probably be working with the latest version of the ICU
-      source code. You will need to check the code out of our CVS repository to
+      source code. You will need to check the code out of our Subversion repository to
       ensure that you have the most recent version of all of the files. See our
       <a href="http://www.icu-project.org/repository/">source
       repository</a> for details.</li>
@@ -526,7 +525,7 @@
       <tr>
         <td>Windows XP</td>
 
-        <td>Microsoft Visual C++ .NET 2005 (8.0)</td>
+        <td>Microsoft Visual C++ 2005 (8.0)</td>
 
         <td>Reference platform</td>
       </tr>
@@ -599,7 +598,7 @@
       <tr>
         <td>Windows 2000 with Cygwin</td>
 
-        <td>Microsoft Visual C++ .NET 2003 (7.1)</td>
+        <td>Microsoft Visual C++ 2003 (7.1)</td>
 
         <td>Regularly tested</td>
       </tr>
@@ -607,7 +606,7 @@
       <tr>
         <td>Windows Vista x86</td>
 
-        <td>Microsoft Visual C++ .NET 2005 (8.0)</td>
+        <td>Microsoft Visual C++ 2005 (8.0)</td>
 
         <td>Regularly tested</td>
       </tr>
@@ -663,7 +662,7 @@
       <tr>
         <td>Windows Vista x64</td>
 
-        <td>Microsoft Visual C++ .NET 2005 (8.0)</td>
+        <td>Microsoft Visual C++ 2005 (8.0)</td>
 
         <td>Rarely tested</td>
       </tr>
@@ -761,7 +760,7 @@
     <ul>
       <li>Microsoft Windows 2000 or above</li>
 
-      <li>Microsoft Visual C++ 2003</li>
+      <li>Microsoft Visual C++ 2005</li>
 
       <li><a href="#HowToBuildCygwin">Cygwin</a> is required when other versions
       of Microsoft Visual C++ and other compilers are used to build ICU.</li>
@@ -779,7 +778,7 @@
       not work without the location of the ICU DLL files in the path.</li>
 
       <li>Open the "<i>&lt;ICU&gt;</i>\source\allinone\allinone.sln" workspace
-      file in Microsoft Visual Studio .NET 2003. (This solution includes all the
+      file in Microsoft Visual Studio 2003. (This solution includes all the
       International Components for Unicode libraries, necessary ICU building
       tools, and the test suite projects). Please see the <a href=
       "#HowToBuildWindowsCommandLine">command line note below</a> if you want to
@@ -1019,7 +1018,7 @@
     installation and uninstallation of files on the system, as well as the
     integrity of the system configuration. You may want to check if ICU can be
     packaged for your package management tools by looking into the "packaging"
-    directory. (Please note that if you are using a snapshot of ICU from CVS, it
+    directory. (Please note that if you are using a snapshot of ICU from Subversion, it
     is probable that the packaging scripts or related files are not up to date
     with the contents of ICU at this time, so use them with caution).</p>
 

Modified: trunk/source/Makefile.in
===================================================================
--- trunk/source/Makefile.in	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/Makefile.in	2008-03-24 11:52:37 UTC (rev 144)
@@ -125,6 +125,7 @@
 	@$(MKINSTALLDIRS) $(DESTDIR)$(sbindir)
 	$(INSTALL_DATA) @platform_make_fragment@ $(DESTDIR)$(pkgdatadir)/config/@platform_make_fragment_name@
 	$(INSTALL_SCRIPT) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(pkgdatadir)/mkinstalldirs
+	$(INSTALL_SCRIPT) $(top_srcdir)/install-sh $(DESTDIR)$(pkgdatadir)/install-sh
 	$(INSTALL_DATA) $(top_srcdir)/../license.html $(DESTDIR)$(pkgdatadir)/license.html
 	$(INSTALL_SCRIPT) $(top_builddir)/config/icu-config $(DESTDIR)$(bindir)/icu-config
 	$(INSTALL_DATA) $(top_builddir)/config/Makefile.inc $(DESTDIR)$(pkglibdir)/Makefile.inc

Modified: trunk/source/allinone/allinone.sln
===================================================================
--- trunk/source/allinone/allinone.sln	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/allinone/allinone.sln	2008-03-24 11:52:37 UTC (rev 144)
@@ -82,9 +82,9 @@
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gentest", "..\tools\gentest\gentest.vcproj", "{77C78066-746F-4EA6-B3FE-B8C8A4A97891}"
 	ProjectSection(ProjectDependencies) = postProject
+		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+		{ECA6B435-B4FA-4F9F-BF95-F451D078FC47} = {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}
 		{6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
-		{ECA6B435-B4FA-4F9F-BF95-F451D078FC47} = {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}
-		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
 	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "genuca", "..\tools\genuca\genuca.vcproj", "{86829694-A375-4C58-B4EA-96EF514E3225}"
@@ -232,11 +232,12 @@
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "letest", "..\test\letest\letest.vcproj", "{67351485-4D18-4245-BE39-A7EF0675ACD2}"
 	ProjectSection(ProjectDependencies) = postProject
+		{0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776}
+		{37FC2C7F-1904-4811-8955-2F478830EAD1} = {37FC2C7F-1904-4811-8955-2F478830EAD1}
 		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
 		{ECA6B435-B4FA-4F9F-BF95-F451D078FC47} = {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}
 		{6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
 		{C920062A-0647-4553-A3B2-37C58065664B} = {C920062A-0647-4553-A3B2-37C58065664B}
-		{0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776}
 	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "icuswap", "..\tools\icuswap\icuswap.vcproj", "{39690C2A-AD89-45E4-893A-899496B85785}"

Modified: trunk/source/common/putil.c
===================================================================
--- trunk/source/common/putil.c	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/common/putil.c	2008-03-24 11:52:37 UTC (rev 144)
@@ -1367,7 +1367,9 @@
 /*
 Due to various platform differences, one platform may specify a charset,
 when they really mean a different charset. Remap the names so that they are
-compatible with ICU.
+compatible with ICU. Only conflicting/ambiguous aliases should be resolved
+here. Before adding anything to this function, please consider adding unique
+names to the ICU alias table in the data directory.
 */
 static const char*
 remapPlatformDependentCodepage(const char *locale, const char *name) {
@@ -1426,7 +1428,17 @@
         name = "eucjis";
     }
 #elif defined(U_LINUX)
-    if (uprv_strcmp(name, "eucjp") == 0) {
+    if (locale != NULL && uprv_strcmp(name, "euc") == 0) {
+        /* Linux underspecifies the "EUC" name. */
+        if (uprv_strcmp(locale, "korean") == 0) {
+            name = "EUC-KR";
+        }
+        else if (uprv_strcmp(locale, "japanese") == 0) {
+            /* See comment below about eucJP */
+            name = "eucjis";
+        }
+    }
+    else if (uprv_strcmp(name, "eucjp") == 0) {
         /*
         ibm-1350 is the best match, but unavailable.
         ibm-954 is mostly a superset of ibm-1350.

Modified: trunk/source/common/ubidi.c
===================================================================
--- trunk/source/common/ubidi.c	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/common/ubidi.c	2008-03-24 11:52:37 UTC (rev 144)
@@ -1923,7 +1923,8 @@
          * Examples for "insignificant" ones are empty embeddings
          * LRE-PDF, LRE-RLE-PDF-PDF, etc.
          */
-        if(embeddingLevels==NULL && !(pBiDi->flags&DIRPROP_FLAG_MULTI_RUNS)) {
+        if(embeddingLevels==NULL && pBiDi->paraCount<=1 &&
+                                   !(pBiDi->flags&DIRPROP_FLAG_MULTI_RUNS)) {
             resolveImplicitLevels(pBiDi, 0, length,
                                     GET_LR_FROM_LEVEL(GET_PARALEVEL(pBiDi, 0)),
                                     GET_LR_FROM_LEVEL(GET_PARALEVEL(pBiDi, length-1)));

Modified: trunk/source/common/uloc.c
===================================================================
--- trunk/source/common/uloc.c	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/common/uloc.c	2008-03-24 11:52:37 UTC (rev 144)
@@ -170,7 +170,7 @@
     "ty",  "tyv", "udm", "ug",  "uga", "uk",  "umb", "und", "ur",
     "uz",  "vai", "ve",  "vi",  "vo",  "vot", "wa",  "wak",
     "wal", "war", "was", "wen", "wo",  "xal", "xh",  "yao", "yap",
-    "yi",  "yo",  "ypk", "za",  "zap", "zen", "zh",  "znd",
+    "yi",  "yo",  "ypk", "za",  "zap", "zbl", "zen", "zh",  "znd",
     "zu",  "zun", "zxx", "zza",
 NULL,
     "in",  "iw",  "ji",  "jw",  "sh",    /* obsolete language codes */
@@ -310,8 +310,8 @@
     "uzb", "vai", "ven", "vie", "vol", "vot", "wln", "wak",
 /*  "wal", "war", "was", "wen", "wo",  "xal", "xh",  "yao", "yap",    */
     "wal", "war", "was", "wen", "wol", "xal", "xho", "yao", "yap",
-/*  "yi",  "yo",  "ypk", "za",  "zap", "zen", "zh",  "znd",    */
-    "yid", "yor", "ypk", "zha", "zap", "zen", "zho", "znd",
+/*  "yi",  "yo",  "ypk", "za",  "zap", "zbl", "zen", "zh",  "znd",    */
+    "yid", "yor", "ypk", "zha", "zap", "zbl", "zen", "zho", "znd",
 /*  "zu",  "zun", "zxx", "zza",                                         */
     "zul", "zun", "zxx", "zza",
 NULL,
@@ -348,7 +348,7 @@
     "AD",  "AE",  "AF",  "AG",  "AI",  "AL",  "AM",  "AN",
     "AO",  "AQ",  "AR",  "AS",  "AT",  "AU",  "AW",  "AX",  "AZ",
     "BA",  "BB",  "BD",  "BE",  "BF",  "BG",  "BH",  "BI",
-    "BJ",  "BM",  "BN",  "BO",  "BR",  "BS",  "BT",  "BV",
+    "BJ",  "BL",  "BM",  "BN",  "BO",  "BR",  "BS",  "BT",  "BV",
     "BW",  "BY",  "BZ",  "CA",  "CC",  "CD",  "CF",  "CG",
     "CH",  "CI",  "CK",  "CL",  "CM",  "CN",  "CO",  "CR",
     "CU",  "CV",  "CX",  "CY",  "CZ",  "DE",  "DJ",  "DK",
@@ -361,31 +361,31 @@
     "IT",  "JE",  "JM",  "JO",  "JP",  "KE",  "KG",  "KH",  "KI",
     "KM",  "KN",  "KP",  "KR",  "KW",  "KY",  "KZ",  "LA",
     "LB",  "LC",  "LI",  "LK",  "LR",  "LS",  "LT",  "LU",
-    "LV",  "LY",  "MA",  "MC",  "MD",  "MG",  "MH",  "MK",
+    "LV",  "LY",  "MA",  "MC",  "MD",  "ME",  "MF",  "MG",  "MH",  "MK",
     "ML",  "MM",  "MN",  "MO",  "MP",  "MQ",  "MR",  "MS",
     "MT",  "MU",  "MV",  "MW",  "MX",  "MY",  "MZ",  "NA",
     "NC",  "NE",  "NF",  "NG",  "NI",  "NL",  "NO",  "NP",
     "NR",  "NU",  "NZ",  "OM",  "PA",  "PE",  "PF",  "PG",
     "PH",  "PK",  "PL",  "PM",  "PN",  "PR",  "PS",  "PT",
-    "PW",  "PY",  "QA",  "RE",  "RO",  "RU",  "RW",  "SA",
+    "PW",  "PY",  "QA",  "RE",  "RO",  "RS",  "RU",  "RW",  "SA",
     "SB",  "SC",  "SD",  "SE",  "SG",  "SH",  "SI",  "SJ",
     "SK",  "SL",  "SM",  "SN",  "SO",  "SR",  "ST",  "SV",
     "SY",  "SZ",  "TC",  "TD",  "TF",  "TG",  "TH",  "TJ",
     "TK",  "TL",  "TM",  "TN",  "TO",  "TR",  "TT",  "TV",
     "TW",  "TZ",  "UA",  "UG",  "UM",  "US",  "UY",  "UZ",
     "VA",  "VC",  "VE",  "VG",  "VI",  "VN",  "VU",  "WF",
-    "WS",  "YE",  "YT",  "YU",  "ZA",  "ZM",  "ZW",  "ZZ",
+    "WS",  "YE",  "YT",  "ZA",  "ZM",  "ZW",
 NULL,
-    "FX",  "RO",  "TP",  "ZR",   /* obsolete country codes */
+    "FX",  "CS",  "RO",  "TP",  "YU",  "ZR",   /* obsolete country codes */
 NULL
 };
 
 static const char* const DEPRECATED_COUNTRIES[] ={
-    "BU", "DY", "FX", "HV", "NH", "RH", "TP", "YU", "ZR", NULL, NULL /* deprecated country list */
+    "BU", "CS", "DY", "FX", "HV", "NH", "RH", "TP", "YU", "ZR", NULL, NULL /* deprecated country list */
 };
 static const char* const REPLACEMENT_COUNTRIES[] = {
-/*  "BU", "DY", "FX", "HV", "NH", "RH", "TP", "YU", "ZR" */
-    "MM", "BJ", "FR", "BF", "VU", "ZW", "TL", "CS", "CD", NULL, NULL  /* replacement country codes */      
+/*  "BU", "CS", "DY", "FX", "HV", "NH", "RH", "TP", "YU", "ZR" */
+    "MM", "RS", "BJ", "FR", "BF", "VU", "ZW", "TL", "RS", "CD", NULL, NULL  /* replacement country codes */      
 };
     
 /**
@@ -408,8 +408,8 @@
     "AGO", "ATA", "ARG", "ASM", "AUT", "AUS", "ABW", "ALA", "AZE",
 /*  "BA",  "BB",  "BD",  "BE",  "BF",  "BG",  "BH",  "BI",     */
     "BIH", "BRB", "BGD", "BEL", "BFA", "BGR", "BHR", "BDI",
-/*  "BJ",  "BM",  "BN",  "BO",  "BR",  "BS",  "BT",  "BV",     */
-    "BEN", "BMU", "BRN", "BOL", "BRA", "BHS", "BTN", "BVT",
+/*  "BJ",  "BL",  "BM",  "BN",  "BO",  "BR",  "BS",  "BT",  "BV",     */
+    "BEN", "BLM", "BMU", "BRN", "BOL", "BRA", "BHS", "BTN", "BVT",
 /*  "BW",  "BY",  "BZ",  "CA",  "CC",  "CD",  "CF",  "CG",     */
     "BWA", "BLR", "BLZ", "CAN", "CCK", "COD", "CAF", "COG",
 /*  "CH",  "CI",  "CK",  "CL",  "CM",  "CN",  "CO",  "CR",     */
@@ -420,22 +420,22 @@
     "DMA", "DOM", "DZA", "ECU", "EST", "EGY", "ESH", "ERI",
 /*  "ES",  "ET",  "FI",  "FJ",  "FK",  "FM",  "FO",  "FR",     */
     "ESP", "ETH", "FIN", "FJI", "FLK", "FSM", "FRO", "FRA",
-/*  "GA",   "GB",   "GD",   "GE",    "GF",   "GG",   "GH",  "GI",  "GL",     */
+/*  "GA",  "GB",  "GD",  "GE",  "GF",  "GG",  "GH",  "GI",  "GL",     */
     "GAB", "GBR", "GRD", "GEO", "GUF", "GGY", "GHA", "GIB", "GRL",
 /*  "GM",  "GN",  "GP",  "GQ",  "GR",  "GS",  "GT",  "GU",     */
     "GMB", "GIN", "GLP", "GNQ", "GRC", "SGS", "GTM", "GUM",
 /*  "GW",  "GY",  "HK",  "HM",  "HN",  "HR",  "HT",  "HU",     */
     "GNB", "GUY", "HKG", "HMD", "HND", "HRV", "HTI", "HUN",
-/*  ID",    "IE",   "IL",    "IM",   "IN",   "IO",   "IQ",   "IR",   "IS" */
-    "IDN", "IRL", "ISR", "IMN", "IND", "IOT", "IRQ", "IRN", "ISL",	   
-/*  "IT",   "JE",   "JM",   "JO",    "JP",   "KE",   "KG",  "KH",  "KI",     */
+/*  "ID",  "IE",  "IL",  "IM",  "IN",  "IO",  "IQ",  "IR",  "IS" */
+    "IDN", "IRL", "ISR", "IMN", "IND", "IOT", "IRQ", "IRN", "ISL",
+/*  "IT",  "JE",  "JM",  "JO",  "JP",  "KE",  "KG",  "KH",  "KI",     */
     "ITA", "JEY", "JAM", "JOR", "JPN", "KEN", "KGZ", "KHM", "KIR",
 /*  "KM",  "KN",  "KP",  "KR",  "KW",  "KY",  "KZ",  "LA",     */
     "COM", "KNA", "PRK", "KOR", "KWT", "CYM", "KAZ", "LAO",
 /*  "LB",  "LC",  "LI",  "LK",  "LR",  "LS",  "LT",  "LU",     */
     "LBN", "LCA", "LIE", "LKA", "LBR", "LSO", "LTU", "LUX",
-/*  "LV",  "LY",  "MA",  "MC",  "MD",  "MG",  "MH",  "MK",     */
-    "LVA", "LBY", "MAR", "MCO", "MDA", "MDG", "MHL", "MKD",
+/*  "LV",  "LY",  "MA",  "MC",  "MD",  "ME",  "MF",  "MG",  "MH",  "MK",     */
+    "LVA", "LBY", "MAR", "MCO", "MDA", "MNE", "MAF", "MDG", "MHL", "MKD",
 /*  "ML",  "MM",  "MN",  "MO",  "MP",  "MQ",  "MR",  "MS",     */
     "MLI", "MMR", "MNG", "MAC", "MNP", "MTQ", "MRT", "MSR",
 /*  "MT",  "MU",  "MV",  "MW",  "MX",  "MY",  "MZ",  "NA",     */
@@ -446,8 +446,8 @@
     "NRU", "NIU", "NZL", "OMN", "PAN", "PER", "PYF", "PNG",
 /*  "PH",  "PK",  "PL",  "PM",  "PN",  "PR",  "PS",  "PT",     */
     "PHL", "PAK", "POL", "SPM", "PCN", "PRI", "PSE", "PRT",
-/*  "PW",  "PY",  "QA",  "RE",  "RO",  "RU",  "RW",  "SA",     */
-    "PLW", "PRY", "QAT", "REU", "ROU", "RUS", "RWA", "SAU",
+/*  "PW",  "PY",  "QA",  "RE",  "RO",  "RS",  "RU",  "RW",  "SA",     */
+    "PLW", "PRY", "QAT", "REU", "ROU", "SRB", "RUS", "RWA", "SAU",
 /*  "SB",  "SC",  "SD",  "SE",  "SG",  "SH",  "SI",  "SJ",     */
     "SLB", "SYC", "SDN", "SWE", "SGP", "SHN", "SVN", "SJM",
 /*  "SK",  "SL",  "SM",  "SN",  "SO",  "SR",  "ST",  "SV",     */
@@ -460,11 +460,11 @@
     "TWN", "TZA", "UKR", "UGA", "UMI", "USA", "URY", "UZB",
 /*  "VA",  "VC",  "VE",  "VG",  "VI",  "VN",  "VU",  "WF",     */
     "VAT", "VCT", "VEN", "VGB", "VIR", "VNM", "VUT", "WLF",
-/*  "WS",  "YE",  "YT",  "YU",  "ZA",  "ZM",  "ZW", "ZZZ"          */
-    "WSM", "YEM", "MYT", "YUG", "ZAF", "ZMB", "ZWE",  "ZZZ",
+/*  "WS",  "YE",  "YT",  "ZA",  "ZM",  "ZW",          */
+    "WSM", "YEM", "MYT", "ZAF", "ZMB", "ZWE",
 NULL,
-/*  "FX",  "RO",  "TP",  "ZR",   */
-    "FXX", "ROM", "TMP", "ZAR",
+/*  "FX",  "CS",  "RO",  "TP",  "YU",  "ZR",   */
+    "FXX", "SCG", "ROM", "TMP", "YUG", "ZAR",
 NULL
 };
 

Modified: trunk/source/common/unicode/uversion.h
===================================================================
--- trunk/source/common/unicode/uversion.h	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/common/unicode/uversion.h	2008-03-24 11:52:37 UTC (rev 144)
@@ -73,7 +73,7 @@
  *  This value will change in the subsequent releases of ICU
  *  @stable ICU 2.4
  */
-#define U_ICU_VERSION_PATCHLEVEL_NUM 0
+#define U_ICU_VERSION_PATCHLEVEL_NUM 1
 
 /** Glued version suffix for renamers 
  *  This value will change in the subsequent releases of ICU
@@ -86,7 +86,7 @@
  *  This value will change in the subsequent releases of ICU
  *  @stable ICU 2.4
  */
-#define U_ICU_VERSION "3.8"
+#define U_ICU_VERSION "3.8.1"
 
 /** The current ICU library major/minor version as a string without dots, for library name suffixes. 
  *  This value will change in the subsequent releases of ICU

Modified: trunk/source/config/Makefile.inc.in
===================================================================
--- trunk/source/config/Makefile.inc.in	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/config/Makefile.inc.in	2008-03-24 11:52:37 UTC (rev 144)
@@ -177,7 +177,8 @@
 DEFAULT_MODE = @DATA_PACKAGING_MODE@
 DEFS = @DEFS@ 
 FFLAGS = @FFLAGS@
-INSTALL  =  @INSTALL@
+# use a consistent INSTALL 
+INSTALL  =  $(SHELL) $(pkgdatadir)/install-sh -c
 INSTALL_DATA  =  @INSTALL_DATA@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM  =  @INSTALL_PROGRAM@

Modified: trunk/source/config/icu-config-bottom
===================================================================
--- trunk/source/config/icu-config-bottom	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/config/icu-config-bottom	2008-03-24 11:52:37 UTC (rev 144)
@@ -59,6 +59,8 @@
     echo "  --unicode-version      Print version of Unicode data used in ICU ($UNICODE_VERSION)"
     echo "  --version              Print ICU version ($VERSION)"
     echo "  --incfile              Print path to Makefile.inc (for -O option of pkgdata)"
+    echo "  --install              Print path to install-sh"
+    echo "  --mkinstalldirs              Print path to mkinstalldirs"
 }
 
 ## Print the normal usage message
@@ -145,6 +147,14 @@
 	    echo $sbindir
 	    ;;
 
+	--mkinstalldirs)
+	    echo ${MKINSTALLDIRS}
+	    ;;
+
+	--install)
+	    echo ${INSTALL}
+	    ;;
+
 	--invoke=*)
 	    QUOT="\""
             CMD="${var}"

Modified: trunk/source/config/mh-aix-gcc
===================================================================
--- trunk/source/config/mh-aix-gcc	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/config/mh-aix-gcc	2008-03-24 11:52:37 UTC (rev 144)
@@ -43,6 +43,7 @@
 ## Override Versioned target for a shared library.
 FINAL_SO_TARGET=  $(basename $(SO_TARGET))$(SO_TARGET_VERSION).$(SO)
 MIDDLE_SO_TARGET= $(basename $(SO_TARGET))$(SO_TARGET_VERSION_MAJOR).$(SO)
+SHARED_OBJECT = $(notdir $(FINAL_SO_TARGET:.$(SO)=.$(SOBJ)))
 
 # The following is for Makefile.inc's use.
 ICULIBSUFFIX_VERSION = $(LIB_VERSION_MAJOR)
@@ -59,6 +60,8 @@
 GENCCODE_ASSEMBLY=-a xlc
 
 ## Shared object suffix
+SOBJ=   so
+# without the -brtl option, the library names use .a. AIX is funny that way.
 SO=	a
 A=	a
 
@@ -70,6 +73,8 @@
 ## Build archive from shared object
 %.a : %.so
 	$(AR) $(ARFLAGS) $@ $<
+$(LIBDIR)/%.a : %.so
+	$(AR) $(ARFLAGS) $@ $<
 
 ## Build import list from export list
 %.e : %.exp

Modified: trunk/source/config/mh-cygwin-msvc
===================================================================
--- trunk/source/config/mh-cygwin-msvc	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/config/mh-cygwin-msvc	2008-03-24 11:52:37 UTC (rev 144)
@@ -32,7 +32,7 @@
 
 ifeq ($(ENABLE_RELEASE),1)
 # Make sure that assertions are disabled
-CPPFLAGS+=-DU_RELEASE=1
+CPPFLAGS+=-DU_RELEASE=1#M#
 endif
 
 # /GF pools strings and places them into read-only memory
@@ -76,10 +76,10 @@
 A = lib
 
 # Cygwin's ar can't handle Win64 right now. So we use Microsoft's tool instead.
-AR = LIB.EXE
-ARFLAGS := /nologo $(ARFLAGS:r=)
-RANLIB = ls -s
-AR_OUTOPT = /OUT:
+AR = LIB.EXE#M#
+ARFLAGS := /nologo $(ARFLAGS:r=)#M#
+RANLIB = ls -s#M#
+AR_OUTOPT = /OUT:#M#
 
 ## An import library is needed for z/OS and MSVC
 IMPORT_LIB_EXT = .lib
@@ -176,12 +176,12 @@
 MIDDLE_SO_TARGET=$(FINAL_SO_TARGET)
 
 ## Starting in MSVC 2005, manifest files are required. This reduces the obnoxiousness of this feature.
-POST_SO_BUILD_STEP = @([ -e $<.manifest ] && \
-( echo Embedding manifest into $< && mt.exe -manifest $<.manifest -outputresource:"$<;2" && rm -rf $<.manifest )) \
-|| true
-POST_BUILD_STEP = ([ -e $@.manifest ] && \
-( echo Embedding manifest into $@ && mt.exe -manifest $@.manifest -outputresource:"$@;1" && rm -rf $@.manifest )) \
-|| true
+	POST_SO_BUILD_STEP = @([ -e $<.manifest ] && \
+	( echo Embedding manifest into $< && mt.exe -manifest $<.manifest -outputresource:"$<;2" && rm -rf $<.manifest )) \
+	|| true
+	POST_BUILD_STEP = ([ -e $@.manifest ] && \
+	( echo Embedding manifest into $@ && mt.exe -manifest $@.manifest -outputresource:"$@;1" && rm -rf $@.manifest )) \
+	|| true
 
 ## Special pkgdata information that is needed
 PKGDATA_VERSIONING = -r $(SO_TARGET_VERSION_MAJOR)

Modified: trunk/source/data/Makefile.in
===================================================================
--- trunk/source/data/Makefile.in	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/Makefile.in	2008-03-24 11:52:37 UTC (rev 144)
@@ -243,7 +243,7 @@
 -include $(RBNFSRCDIR)/rbnflocal.mk
 -include $(TRANSLITSRCDIR)/trnslocal.mk
 ifdef GENRB_SOURCE
-RES_SRC= root.txt $(GENRB_SOURCE) $(GENRB_ALIAS_SOURCE) $(GENRB_SOURCE_LOCAL)
+RES_SRC= root.txt $(GENRB_SOURCE) $(GENRB_ALIAS_SOURCE) $(GENRB_SOURCE_LOCAL) $(GENRB_ALIAS_SOURCE_LOCAL)
 RES_SRC_FILES = $(RES_SRC:%=$(LOCSRCDIR)/%)
 INSTALLED_RB_FILES = $(GENRB_SOURCE:%.txt=%) $(GENRB_SOURCE_LOCAL:%.txt=%)
 endif

Modified: trunk/source/data/build.xml
===================================================================
--- trunk/source/data/build.xml	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/build.xml	2008-03-24 11:52:37 UTC (rev 144)
@@ -70,7 +70,7 @@
         </taskdef>
     </target>
     <!-- target for generating ICU data -->
-    <target name="all" depends="locales, resfiles, collation, colfiles, supplementalData, brkitr, brkfiles" />
+    <target name="all" depends="locales, resfiles, collation, colfiles, supplementalData, metazoneInfo, brkitr, brkfiles" />
 
     <!-- parallel target -->
     <target name="pall" depends="init">
@@ -237,6 +237,20 @@
             </run>
         </cldr-build>
     </target>
+    <target name="metazoneInfo" depends="init,setup" description="builds metazoneInfo.txt from metazoneInfo.xml">
+        <cldr-build toolName="org.unicode.cldr.icu.LDML2ICUConverter" destFile="metazoneInfo.txt" noArgs="true">
+            <!-- launch the tool and generate the data after reading the config file -->
+            <run>
+                <args>
+                    <arg name="-s" value="${env.CLDR_DIR}/common/supplemental" />
+                    <arg name="-d" value="${env.ICU4C_DIR}/source/data/misc"/>
+                    <arg name="-z"/>
+                    <arg name="-f"/>
+                    <arg name="-m" value="${env.CLDR_DIR}/common/supplemental" />
+                </args>
+            </run>
+        </cldr-build>
+    </target>
     <target name="brkitr" depends="init,setup" description="builds break iterator files in ICU text format">
         <cldr-build toolName="org.unicode.cldr.icu.LDML2ICUConverter" srcFile=".*xml" destFile=".*txt">
             <run>
@@ -316,6 +330,9 @@
             <fileset id="locales" dir="${env.ICU4C_DIR}/source/data/misc">
                 <include name="supplementalData.txt" />
             </fileset>
+            <fileset id="locales" dir="${env.ICU4C_DIR}/source/data/misc">
+                <include name="metazoneInfo.txt" />
+            </fileset>
         </delete>
     </target>
 </project>

Added: trunk/source/data/coll/colfiles.mk
===================================================================
--- trunk/source/data/coll/colfiles.mk	                        (rev 0)
+++ trunk/source/data/coll/colfiles.mk	2008-03-24 11:52:37 UTC (rev 144)
@@ -0,0 +1,87 @@
+# *   Copyright (C) 1998-2007, International Business Machines
+# *   Corporation and others.  All Rights Reserved.
+COLLATION_CLDR_VERSION = 1.5
+# A list of txt's to build
+# Note: 
+#
+#   If you are thinking of modifying this file, READ THIS. 
+#
+# Instead of changing this file [unless you want to check it back in],
+# you should consider creating a 'collocal.mk' file in this same directory.
+# Then, you can have your local changes remain even if you upgrade or
+# reconfigure ICU.
+#
+# Example 'collocal.mk' files:
+#
+#  * To add an additional locale to the list: 
+#    _____________________________________________________
+#    |  COLLATION_SOURCE_LOCAL =   myLocale.txt ...
+#
+#  * To REPLACE the default list and only build with a few
+#     locale:
+#    _____________________________________________________
+#    |  COLLATION_SOURCE = ar.txt ar_AE.txt en.txt de.txt zh.txt
+#
+#
+# Generated by LDML2ICUConverter, from LDML source files. 
+
+# Aliases which do not have a corresponding xx.xml file (see icu-config.xml & build.xml)
+COLLATION_SYNTHETIC_ALIAS = de_.txt de__PHONEBOOK.txt es_.txt es__TRADITIONAL.txt\
+ hi_.txt hi__DIRECT.txt in.txt in_ID.txt iw.txt\
+ iw_IL.txt no.txt no_NO.txt sh.txt sh_BA.txt\
+ sh_YU.txt sr_BA.txt sr_ME.txt sr_RS.txt zh_.txt\
+ zh_CN.txt zh_HK.txt zh_MO.txt zh_SG.txt zh_TW.txt\
+ zh_TW_STROKE.txt zh__PINYIN.txt
+
+
+# All aliases (to not be included under 'installed'), but not including root.
+COLLATION_ALIAS_SOURCE = $(COLLATION_SYNTHETIC_ALIAS)
+
+
+# Empty locales, used for validSubLocale fallback.
+COLLATION_EMPTY_SOURCE = ar_AE.txt ar_BH.txt ar_DZ.txt ar_EG.txt\
+ ar_IQ.txt ar_JO.txt ar_KW.txt ar_LB.txt ar_LY.txt\
+ ar_MA.txt ar_OM.txt ar_QA.txt ar_SA.txt ar_SD.txt\
+ ar_SY.txt ar_TN.txt ar_YE.txt as_IN.txt be_BY.txt\
+ bg_BG.txt ca_ES.txt cs_CZ.txt da_DK.txt de_AT.txt\
+ de_BE.txt de_CH.txt de_DE.txt de_LU.txt el_GR.txt\
+ en_AU.txt en_BW.txt en_CA.txt en_GB.txt en_HK.txt\
+ en_IE.txt en_IN.txt en_MT.txt en_NZ.txt en_PH.txt\
+ en_SG.txt en_US.txt en_US_POSIX.txt en_VI.txt en_ZA.txt\
+ en_ZW.txt es_AR.txt es_BO.txt es_CL.txt es_CO.txt\
+ es_CR.txt es_DO.txt es_EC.txt es_ES.txt es_GT.txt\
+ es_HN.txt es_MX.txt es_NI.txt es_PA.txt es_PE.txt\
+ es_PR.txt es_PY.txt es_SV.txt es_US.txt es_UY.txt\
+ es_VE.txt et_EE.txt fa_IR.txt fi_FI.txt fo_FO.txt\
+ fr_BE.txt fr_CA.txt fr_CH.txt fr_FR.txt fr_LU.txt\
+ ga.txt ga_IE.txt gu_IN.txt he_IL.txt hi_IN.txt\
+ hr_HR.txt hu_HU.txt id.txt id_ID.txt is_IS.txt\
+ it_CH.txt it_IT.txt ja_JP.txt kk_KZ.txt kl_GL.txt\
+ kn_IN.txt ko_KR.txt lt_LT.txt lv_LV.txt mk_MK.txt\
+ mr_IN.txt ms.txt ms_BN.txt ms_MY.txt mt_MT.txt\
+ nb_NO.txt nl.txt nl_BE.txt nl_NL.txt nn_NO.txt\
+ om_ET.txt om_KE.txt pa_IN.txt pl_PL.txt ps_AF.txt\
+ pt.txt pt_BR.txt pt_PT.txt ro_RO.txt ru_RU.txt\
+ ru_UA.txt sk_SK.txt sl_SI.txt sq_AL.txt sr_Cyrl.txt\
+ sr_Cyrl_BA.txt sr_Cyrl_ME.txt sr_Cyrl_RS.txt sr_Latn_BA.txt sr_Latn_ME.txt\
+ sr_Latn_RS.txt sv_FI.txt sv_SE.txt ta_IN.txt te_IN.txt\
+ th_TH.txt tr_TR.txt uk_UA.txt vi_VN.txt zh_Hans.txt\
+ zh_Hans_CN.txt zh_Hans_SG.txt zh_Hant_HK.txt zh_Hant_MO.txt zh_Hant_TW.txt
+
+
+# Ordinary resources
+COLLATION_SOURCE = $(COLLATION_EMPTY_SOURCE) ar.txt as.txt be.txt bg.txt\
+ bn.txt ca.txt cs.txt cy.txt da.txt\
+ de.txt el.txt en.txt en_BE.txt eo.txt\
+ es.txt et.txt fa.txt fa_AF.txt fi.txt\
+ fo.txt fr.txt gu.txt haw.txt he.txt\
+ hi.txt hr.txt hu.txt is.txt it.txt\
+ ja.txt kk.txt kl.txt km.txt kn.txt\
+ ko.txt kok.txt lt.txt lv.txt mk.txt\
+ ml.txt mr.txt mt.txt nb.txt nn.txt\
+ om.txt or.txt pa.txt pl.txt ps.txt\
+ ro.txt ru.txt sk.txt sl.txt sq.txt\
+ sr.txt sr_Latn.txt sv.txt ta.txt te.txt\
+ th.txt tr.txt uk.txt vi.txt zh.txt\
+ zh_Hant.txt
+

Modified: trunk/source/data/locales/bg.txt
===================================================================
--- trunk/source/data/locales/bg.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/bg.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -1413,7 +1413,7 @@
             traditional{"Традиционно"}
         }
     }
-    Version{"1.89"}
+    Version{"1.90"}
     calendar{
         gregorian{
             AmPmMarkers{
@@ -2197,12 +2197,6 @@
         "meta:GMT"{
             ls{"Часова зона Гринуич"}
         }
-        "meta:Hawaii"{
-            ld{"Лятна часова зона Хавай"}
-            ls{"Часова зона Хавай"}
-            sd{"HDT"}
-            ss{"HST"}
-        }
         "meta:Israel"{
             ld{"Лятна часова зона Израел"}
             ls{"Часова зона Израел"}

Modified: trunk/source/data/locales/cs.txt
===================================================================
--- trunk/source/data/locales/cs.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/cs.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -1441,7 +1441,7 @@
             japanese{"Japonský kalendář"}
         }
     }
-    Version{"1.103"}
+    Version{"1.104"}
     calendar{
         gregorian{
             AmPmMarkers{
@@ -1723,12 +1723,6 @@
             ls{"Greenwichský střední čas"}
             ss{"GMT"}
         }
-        "meta:Hawaii"{
-            ld{"Havajský letní čas"}
-            ls{"Havajský standardní čas"}
-            sd{"HDT"}
-            ss{"HST"}
-        }
         "meta:Israel"{
             ld{"Izraelský letní čas"}
             ls{"Izraelský standardní čas"}

Modified: trunk/source/data/locales/da.txt
===================================================================
--- trunk/source/data/locales/da.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/da.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -1918,7 +1918,7 @@
             traditional{"traditionel sorteringsrækkefølge"}
         }
     }
-    Version{"1.89"}
+    Version{"1.90"}
     calendar{
         gregorian{
             AmPmMarkers{
@@ -2270,7 +2270,6 @@
             lg{"mellemeuropæisk tid"}
             ls{"mellemeuropæisk normaltid"}
             sd{"CEST"}
-            sg{"CET"}
             ss{"CET"}
         }
         "meta:Europe_Eastern"{
@@ -2279,7 +2278,6 @@
             lg{"østeuropæisk tid"}
             ls{"østeuropæisk normaltid"}
             sd{"EEST"}
-            sg{"EET"}
             ss{"EET"}
         }
         "meta:Europe_Western"{
@@ -2287,23 +2285,14 @@
             ld{"vesteuropæisk sommertid"}
             lg{"vesteuropæisk tid"}
             ls{"vesteuropæisk normaltid"}
-            sg{"WET"}
+            sd{"WEST"}
+            ss{"WET"}
         }
         "meta:GMT"{
             cu:int{1}
-            ld{"GMT-sommertid"}
-            lg{"verdenstid"}
             ls{"Verdenstid"}
-            sd{"GMT"}
-            sg{"GMT"}
             ss{"GMT"}
         }
-        "meta:Hawaii"{
-            ld{"Hawaii-sommertid"}
-            ls{"Hawaii-normaltid"}
-            sd{"HDT"}
-            ss{"HST"}
-        }
         "meta:Israel"{
             ld{"Israelsk sommertid"}
             ls{"Israelsk normaltid"}

Modified: trunk/source/data/locales/en.txt
===================================================================
--- trunk/source/data/locales/en.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/en.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -75,6 +75,7 @@
         BH{"Bahrain"}
         BI{"Burundi"}
         BJ{"Benin"}
+        BL{"Saint Barthélemy"}
         BM{"Bermuda"}
         BN{"Brunei"}
         BO{"Bolivia"}
@@ -188,6 +189,7 @@
         MC{"Monaco"}
         MD{"Moldova"}
         ME{"Montenegro"}
+        MF{"Saint Martin"}
         MG{"Madagascar"}
         MH{"Marshall Islands"}
         MK{"Macedonia"}
@@ -1882,6 +1884,7 @@
         ypk{"Yupik Language"}
         za{"Zhuang"}
         zap{"Zapotec"}
+        zbl{"Blissymbols"}
         zen{"Zenaga"}
         zh{"Chinese"}
         zh_Hans{"Simplified Chinese"}
@@ -1918,6 +1921,7 @@
     Scripts{
         Arab{"Arabic"}
         Armn{"Armenian"}
+        Avst{"Avestan"}
         Bali{"Balinese"}
         Batk{"Batak"}
         Beng{"Bengali"}
@@ -1981,6 +1985,7 @@
         Lyci{"Lycian"}
         Lydi{"Lydian"}
         Mand{"Mandaean"}
+        Mani{"Manichaean"}
         Maya{"Mayan hieroglyphs"}
         Mero{"Meroitic"}
         Mlym{"Malayalam"}
@@ -1996,12 +2001,14 @@
         Osma{"Osmanya"}
         Perm{"Old Permic"}
         Phag{"Phags-pa"}
+        Phlv{"Book Pahlavi"}
         Phnx{"Phoenician"}
         Plrd{"Pollard Phonetic"}
         Qaai{"Inherited"}
         Rjng{"Rejang"}
         Roro{"Rongorongo"}
         Runr{"Runic"}
+        Samr{"Samaritan"}
         Sara{"Sarati"}
         Saur{"Saurashtra"}
         Sgnw{"SignWriting"}
@@ -2057,6 +2064,7 @@
     Variants{
         1606NICT{"Late Middle French to 1606"}
         1901{"Traditional German orthography"}
+        1994{"Standardized Resian orthography"}
         1996{"German orthography of 1996"}
         AREVELA{"Eastern Armenian"}
         BAKU1926{"Unified Turkic Latin Alphabet"}
@@ -2067,6 +2075,7 @@
         GAULISH{"Gaulish"}
         GUOYU{"Mandarin or Standard Chinese"}
         HAKKA{"Hakka"}
+        LIPAW{"The Lipovaz dialect of Resian"}
         LOJBAN{"Lojban"}
         MONOTON{"Monotonic"}
         NEDIS{"Natisone dialect"}
@@ -2077,12 +2086,13 @@
         REVISED{"Revised Orthography"}
         ROZAJ{"Resian"}
         SAAHO{"Saho"}
+        SCOTLAND{"Scottish Standard English"}
         SCOUSE{"Scouse"}
         SOLBA{"Stolvizza/Solbica dialect"}
         TARASK{"Taraskievica orthography"}
         XIANG{"Xiang or Hunanese"}
     }
-    Version{"1.156"}
+    Version{"1.161"}
     calendar{
         gregorian{
             AmPmMarkers{
@@ -2253,8 +2263,8 @@
         "meta:Acre"{
             ld{"Acre Summer Time"}
             ls{"Acre Time"}
-            sd{"ACST"}
-            ss{"ACT"}
+            sd{"ACST (Acre)"}
+            ss{"ACT (Acre)"}
         }
         "meta:Afghanistan"{
             ls{"Afghanistan Time"}
@@ -2698,23 +2708,10 @@
             ls{"Guyana Time"}
             ss{"GYT"}
         }
-        "meta:Hawaii"{
-            cu:int{1}
-            ld{"Hawaii Daylight Time"}
-            lg{"Hawaii Time"}
-            ls{"Hawaii Standard Time"}
-            sd{"HDT"}
-            sg{"HT"}
-            ss{"HST"}
-        }
         "meta:Hawaii_Aleutian"{
             cu:int{1}
-            ld{"Hawaii-Aleutian Daylight Time"}
-            lg{"Hawaii-Aleutian Time"}
             ls{"Hawaii-Aleutian Standard Time"}
-            sd{"HADT"}
-            sg{"HAT"}
-            ss{"HAST"}
+            ss{"HST"}
         }
         "meta:Hong_Kong"{
             ld{"Hong Kong Summer Time"}

Modified: trunk/source/data/locales/en_AU.txt
===================================================================
--- trunk/source/data/locales/en_AU.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/en_AU.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -23,7 +23,7 @@
         "#,##0%",
         "#E0",
     }
-    Version{"1.45"}
+    Version{"1.46"}
     calendar{
         gregorian{
             DateTimeElements:intvector{

Modified: trunk/source/data/locales/en_CA.txt
===================================================================
--- trunk/source/data/locales/en_CA.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/en_CA.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -17,7 +17,7 @@
             "US Dollar",
         }
     }
-    Version{"1.53"}
+    Version{"1.54"}
     calendar{
         gregorian{
             DateTimeElements:intvector{

Modified: trunk/source/data/locales/en_GB.txt
===================================================================
--- trunk/source/data/locales/en_GB.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/en_GB.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -13,7 +13,7 @@
         "#,##0%",
         "#E0",
     }
-    Version{"1.54"}
+    Version{"1.55"}
     calendar{
         gregorian{
             DateTimePatterns{

Modified: trunk/source/data/locales/en_NZ.txt
===================================================================
--- trunk/source/data/locales/en_NZ.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/en_NZ.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -23,7 +23,7 @@
         "#,##0%",
         "#E0",
     }
-    Version{"1.48"}
+    Version{"1.49"}
     calendar{
         gregorian{
             DateTimeElements:intvector{

Modified: trunk/source/data/locales/en_ZA.txt
===================================================================
--- trunk/source/data/locales/en_ZA.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/en_ZA.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -13,7 +13,7 @@
         "#,##0%",
         "#E0",
     }
-    Version{"1.49"}
+    Version{"1.50"}
     calendar{
         gregorian{
             DateTimeElements:intvector{

Modified: trunk/source/data/locales/en_ZW.txt
===================================================================
--- trunk/source/data/locales/en_ZW.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/en_ZW.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -19,7 +19,7 @@
         "#,##0%",
         "#E0",
     }
-    Version{"1.42"}
+    Version{"1.43"}
     calendar{
         gregorian{
             DateTimeElements:intvector{

Modified: trunk/source/data/locales/es.txt
===================================================================
--- trunk/source/data/locales/es.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/es.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -1953,7 +1953,7 @@
     Variants{
         REVISED{"Ortografía revisada"}
     }
-    Version{"1.98"}
+    Version{"1.99"}
     calendar{
         gregorian{
             AmPmMarkers{
@@ -2496,7 +2496,7 @@
         "meta:China"{
             ld{"Hora de verano de China"}
             ls{"Hora estándar de China"}
-            ss{"CTT"}
+            ss{"CST (China)"}
         }
         "meta:Europe_Central"{
             ld{"Hora de verano de Europa Central"}
@@ -2514,11 +2514,8 @@
             ls{"Hora media de Greenwich"}
             ss{"GMT"}
         }
-        "meta:Hawaii"{
+        "meta:Hawaii_Aleutian"{
             cu:int{1}
-            ld{"Hora de verano de Hawai"}
-            ls{"Hora estándar de Hawai"}
-            sd{"HDT"}
             ss{"HST"}
         }
         "meta:Israel"{
@@ -2536,7 +2533,7 @@
         "meta:Newfoundland"{
             ld{"Hora de verano de Newfoundland"}
             ls{"Hora estándar de Newfoundland"}
-            ss{"CNT"}
+            ss{"NST"}
         }
     }
 }

Modified: trunk/source/data/locales/es_DO.txt
===================================================================
--- trunk/source/data/locales/es_DO.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/es_DO.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -7,5 +7,19 @@
 // *
 // ***************************************************************************
 es_DO{
-    Version{"1.49"}
+    NumberElements{
+        ".",
+        ",",
+        ";",
+        "%",
+        "0",
+        "#",
+        "-",
+        "E",
+        "‰",
+        "∞",
+        "NaN",
+        "+",
+    }
+    Version{"1.50"}
 }

Modified: trunk/source/data/locales/es_GT.txt
===================================================================
--- trunk/source/data/locales/es_GT.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/es_GT.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -7,7 +7,21 @@
 // *
 // ***************************************************************************
 es_GT{
-    Version{"1.49"}
+    NumberElements{
+        ".",
+        ",",
+        ";",
+        "%",
+        "0",
+        "#",
+        "-",
+        "E",
+        "‰",
+        "∞",
+        "NaN",
+        "+",
+    }
+    Version{"1.50"}
     calendar{
         gregorian{
             DateTimePatterns{

Modified: trunk/source/data/locales/es_HN.txt
===================================================================
--- trunk/source/data/locales/es_HN.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/es_HN.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -7,7 +7,21 @@
 // *
 // ***************************************************************************
 es_HN{
-    Version{"1.50"}
+    NumberElements{
+        ".",
+        ",",
+        ";",
+        "%",
+        "0",
+        "#",
+        "-",
+        "E",
+        "‰",
+        "∞",
+        "NaN",
+        "+",
+    }
+    Version{"1.51"}
     calendar{
         gregorian{
             DateTimePatterns{

Modified: trunk/source/data/locales/es_MX.txt
===================================================================
--- trunk/source/data/locales/es_MX.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/es_MX.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -13,5 +13,19 @@
             "peso mexicano",
         }
     }
-    Version{"1.48"}
+    NumberElements{
+        ".",
+        ",",
+        ";",
+        "%",
+        "0",
+        "#",
+        "-",
+        "E",
+        "‰",
+        "∞",
+        "NaN",
+        "+",
+    }
+    Version{"1.49"}
 }

Modified: trunk/source/data/locales/es_NI.txt
===================================================================
--- trunk/source/data/locales/es_NI.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/es_NI.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -7,5 +7,19 @@
 // *
 // ***************************************************************************
 es_NI{
-    Version{"1.49"}
+    NumberElements{
+        ".",
+        ",",
+        ";",
+        "%",
+        "0",
+        "#",
+        "-",
+        "E",
+        "‰",
+        "∞",
+        "NaN",
+        "+",
+    }
+    Version{"1.50"}
 }

Modified: trunk/source/data/locales/es_PA.txt
===================================================================
--- trunk/source/data/locales/es_PA.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/es_PA.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -7,7 +7,21 @@
 // *
 // ***************************************************************************
 es_PA{
-    Version{"1.50"}
+    NumberElements{
+        ".",
+        ",",
+        ";",
+        "%",
+        "0",
+        "#",
+        "-",
+        "E",
+        "‰",
+        "∞",
+        "NaN",
+        "+",
+    }
+    Version{"1.51"}
     calendar{
         gregorian{
             DateTimePatterns{

Modified: trunk/source/data/locales/es_PE.txt
===================================================================
--- trunk/source/data/locales/es_PE.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/es_PE.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -7,7 +7,21 @@
 // *
 // ***************************************************************************
 es_PE{
-    Version{"1.51"}
+    NumberElements{
+        ".",
+        ",",
+        ";",
+        "%",
+        "0",
+        "#",
+        "-",
+        "E",
+        "‰",
+        "∞",
+        "NaN",
+        "+",
+    }
+    Version{"1.52"}
     calendar{
         gregorian{
             DateTimePatterns{

Modified: trunk/source/data/locales/es_PR.txt
===================================================================
--- trunk/source/data/locales/es_PR.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/es_PR.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -13,7 +13,21 @@
             "dólar estadounidense",
         }
     }
-    Version{"1.51"}
+    NumberElements{
+        ".",
+        ",",
+        ";",
+        "%",
+        "0",
+        "#",
+        "-",
+        "E",
+        "‰",
+        "∞",
+        "NaN",
+        "+",
+    }
+    Version{"1.52"}
     calendar{
         gregorian{
             DateTimePatterns{

Modified: trunk/source/data/locales/es_SV.txt
===================================================================
--- trunk/source/data/locales/es_SV.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/es_SV.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -7,5 +7,19 @@
 // *
 // ***************************************************************************
 es_SV{
-    Version{"1.49"}
+    NumberElements{
+        ".",
+        ",",
+        ";",
+        "%",
+        "0",
+        "#",
+        "-",
+        "E",
+        "‰",
+        "∞",
+        "NaN",
+        "+",
+    }
+    Version{"1.50"}
 }

Modified: trunk/source/data/locales/es_US.txt
===================================================================
--- trunk/source/data/locales/es_US.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/es_US.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -8,11 +8,25 @@
 // ***************************************************************************
 es_US{
     MeasurementSystem:int{1}
+    NumberElements{
+        ".",
+        ",",
+        ";",
+        "%",
+        "0",
+        "#",
+        "-",
+        "E",
+        "‰",
+        "∞",
+        "NaN",
+        "+",
+    }
     PaperSize:intvector{
         279,
         216,
     }
-    Version{"1.58"}
+    Version{"1.59"}
     calendar{
         gregorian{
             DateTimeElements:intvector{

Modified: trunk/source/data/locales/fa.txt
===================================================================
--- trunk/source/data/locales/fa.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/fa.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -1056,7 +1056,7 @@
         1996{"رسم‌الخط آلمانی ۱۹۹۶ میلادی"}
         REVISED{"رسم‌الخط تجدیدنظرشده"}
     }
-    Version{"1.78"}
+    Version{"1.79"}
     calendar{
         gregorian{
             AmPmMarkers{
@@ -1615,8 +1615,8 @@
             ec{"تاهیتی"}
         }
         "meta:Afghanistan"{
-            lg{"وقت افغانستان"}
-            sg{"AFT"}
+            ls{"وقت افغانستان"}
+            ss{"AFT"}
         }
         "meta:Iran"{
             ld{"وقت تابستانی ایران"}

Modified: trunk/source/data/locales/fi.txt
===================================================================
--- trunk/source/data/locales/fi.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/fi.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -2069,7 +2069,7 @@
         SCOUSE{"englannin scouse-murre"}
         VALENCIA{"katalaanin valencia-murre"}
     }
-    Version{"1.94"}
+    Version{"1.96"}
     calendar{
         gregorian{
             AmPmMarkers{
@@ -2500,9 +2500,6 @@
         "meta:Africa_Eastern"{
             cu:int{0}
         }
-        "meta:Africa_FarWestern"{
-            cu:int{0}
-        }
         "meta:Africa_Southern"{
             cu:int{0}
         }
@@ -2759,13 +2756,6 @@
         "meta:Guyana"{
             cu:int{0}
         }
-        "meta:Hawaii"{
-            cu:int{0}
-            ld{"Havaijin kesäaika"}
-            ls{"Havaijin normaaliaika"}
-            sd{"HDT"}
-            ss{"HST"}
-        }
         "meta:Hawaii_Aleutian"{
             cu:int{0}
         }

Modified: trunk/source/data/locales/fr.txt
===================================================================
--- trunk/source/data/locales/fr.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/fr.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -2023,7 +2023,7 @@
         SCOUSE{"dialecte scouse"}
         VALENCIA{"valencien"}
     }
-    Version{"1.104"}
+    Version{"1.107"}
     calendar{
         chinese{
             monthNames{
@@ -2639,13 +2639,6 @@
             sd{"HAEE"}
             ss{"HEE"}
         }
-        "meta:Hawaii"{
-            ld{"Heure avancée d’Hawaï"}
-            lg{"Heure d’Hawaï"}
-            ls{"Heure normale d’Hawaï"}
-            sd{"HDT"}
-            ss{"HST"}
-        }
         "meta:Israel"{
             ld{"Heure avancée d’Israël"}
             ls{"Heure normale d’Israël"}

Modified: trunk/source/data/locales/fr_CA.txt
===================================================================
--- trunk/source/data/locales/fr_CA.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/fr_CA.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -23,7 +23,7 @@
         "#,##0 %",
         "#E0",
     }
-    Version{"1.49"}
+    Version{"1.50"}
     calendar{
         gregorian{
             DateTimeElements:intvector{

Modified: trunk/source/data/locales/hu.txt
===================================================================
--- trunk/source/data/locales/hu.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/hu.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -1748,7 +1748,7 @@
         NEDIS{"Natisone dialektus"}
         REVISED{"Átdolgozott helyesírás"}
     }
-    Version{"1.87"}
+    Version{"1.89"}
     calendar{
         buddhist{
             eras{

Modified: trunk/source/data/locales/is.txt
===================================================================
--- trunk/source/data/locales/is.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/is.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -1404,7 +1404,7 @@
             traditional{"Hefðbundin"}
         }
     }
-    Version{"1.76"}
+    Version{"1.77"}
     calendar{
         gregorian{
             DateTimePatterns{

Modified: trunk/source/data/locales/it.txt
===================================================================
--- trunk/source/data/locales/it.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/it.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -1956,7 +1956,7 @@
         ROZAJ{"resiano"}
         SAAHO{"saho"}
     }
-    Version{"1.92"}
+    Version{"1.93"}
     calendar{
         gregorian{
             AmPmMarkers{
@@ -2325,7 +2325,7 @@
             ls{"Ora Standard Alaska"}
         }
         "meta:China"{
-            ld{"Ora Standard Cina"}
+            ld{"Ora Legale Cina"}
             ls{"Ora Standard Cina"}
             sd{"CDT (Cina)"}
             ss{"CST (Cina)"}

Modified: trunk/source/data/locales/ja.txt
===================================================================
--- trunk/source/data/locales/ja.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/ja.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -1975,7 +1975,7 @@
         POSIX{"コンピュータ"}
         REVISED{"改訂版"}
     }
-    Version{"1.114"}
+    Version{"1.115"}
     calendar{
         gregorian{
             AmPmMarkers{
@@ -3044,12 +3044,6 @@
             ls{"グリニッジ標準時"}
             ss{"GMT"}
         }
-        "meta:Hawaii"{
-            ld{"ハワイ夏時間"}
-            ls{"ハワイ標準時"}
-            sd{"HDT"}
-            ss{"HST"}
-        }
         "meta:Israel"{
             ld{"イスラエル夏時間"}
             ls{"イスラエル標準時"}

Modified: trunk/source/data/locales/ka.txt
===================================================================
--- trunk/source/data/locales/ka.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/ka.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -250,7 +250,7 @@
     LocaleScript{
         "Geor",
     }
-    Version{"1.46"}
+    Version{"1.47"}
     calendar{
         gregorian{
             quarters{

Modified: trunk/source/data/locales/ko.txt
===================================================================
--- trunk/source/data/locales/ko.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/ko.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -1906,7 +1906,7 @@
     Variants{
         REVISED{"개정"}
     }
-    Version{"1.95"}
+    Version{"1.96"}
     calendar{
         buddhist{
             eras{
@@ -2951,12 +2951,6 @@
             ls{"그리니치 표준시"}
             ss{"GMT"}
         }
-        "meta:Hawaii"{
-            ld{"하와이 하계 표준시"}
-            ls{"하와이 표준시"}
-            sd{"HDT"}
-            ss{"HST"}
-        }
         "meta:Israel"{
             ld{"이스라엘 하계 표준시"}
             ls{"이스라엘 표준시"}

Modified: trunk/source/data/locales/nl.txt
===================================================================
--- trunk/source/data/locales/nl.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/nl.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -1996,7 +1996,7 @@
         SAAHO{"Saho"}
         SCOUSE{"Liverpools (Scouse)"}
     }
-    Version{"1.93"}
+    Version{"1.94"}
     calendar{
         gregorian{
             DateTimePatterns{
@@ -2516,12 +2516,6 @@
             ls{"Greenwich Mean Time"}
             ss{"GMT"}
         }
-        "meta:Hawaii"{
-            ld{"Hawaï-zomertijd"}
-            ls{"Hawaï-standaardtijd"}
-            sd{"HDT"}
-            ss{"HST"}
-        }
         "meta:Israel"{
             ld{"Israëlische zomertijd"}
             ls{"Israëlische standaardtijd"}

Modified: trunk/source/data/locales/pt.txt
===================================================================
--- trunk/source/data/locales/pt.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/pt.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -1991,7 +1991,7 @@
         SAAHO{"saho"}
         SCOUSE{"scouse"}
     }
-    Version{"1.89"}
+    Version{"1.91"}
     calendar{
         buddhist{
             DateTimePatterns{
@@ -2443,7 +2443,7 @@
             lg{"Horário da Austrália Central"}
             ls{"Horário Padrão da Austrália Central"}
             sd{"ACDT"}
-            ss{"ACST"}
+            ss{"ACST (Austrália)"}
         }
         "meta:Australia_Eastern"{
             ld{"Horário de Verão da Austrália Oriental"}
@@ -2611,21 +2611,9 @@
             ls{"Horário Padrão de Gulf"}
             ss{"GST"}
         }
-        "meta:Hawaii"{
-            ld{"Horário de Verão do Havaí"}
-            lg{"Horário do Havaí"}
-            ls{"Horário Padrão do Havaí"}
-            sd{"HDT"}
-            sg{"HT"}
-            ss{"HST"}
-        }
         "meta:Hawaii_Aleutian"{
-            ld{"Horário de Verão do Havaí-Aleuta"}
-            lg{"Horário do Havaí-Aleuta"}
             ls{"Horário Padrão do Havaí-Aleuta"}
-            sd{"HADT"}
-            sg{"HAT"}
-            ss{"HAST"}
+            ss{"HST"}
         }
         "meta:India"{
             ls{"Horário Padrão da Índia"}
@@ -2647,7 +2635,7 @@
             ld{"Horário de Verão de Israel"}
             ls{"Horário Padrão de Israel"}
             sd{"IDT"}
-            ss{"IST"}
+            ss{"IST (Israel)"}
         }
         "meta:Japan"{
             ld{"Horário de Verão do Japão"}
@@ -2668,7 +2656,7 @@
             ss{"EKST"}
         }
         "meta:Kazakhstan_Western"{
-            ls{"Horário da Argentina Ocidental"}
+            ls{"Horário do Cazaquistão Ocidental"}
             ss{"WKST"}
         }
         "meta:Kizilorda"{

Modified: trunk/source/data/locales/pt_PT.txt
===================================================================
--- trunk/source/data/locales/pt_PT.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/pt_PT.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -199,7 +199,7 @@
             phonebook{"Ordem da Lista Telefónica"}
         }
     }
-    Version{"1.63"}
+    Version{"1.64"}
     calendar{
         buddhist{
             DateTimePatterns{
@@ -400,10 +400,6 @@
         "meta:Europe_Central"{
             ls{"Horário Padrão da Europa Central"}
         }
-        "meta:Hawaii"{
-            ld{"Horário de Verão do Havai"}
-            ls{"Horário Padrão do Havai"}
-        }
         "meta:Newfoundland"{
             ld{"Horário de Verão da Terra Nova"}
             ls{"Horário Padrão da Terra Nova"}

Modified: trunk/source/data/locales/ro.txt
===================================================================
--- trunk/source/data/locales/ro.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/ro.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -864,8 +864,8 @@
             "leu vechi",
         }
         RON{
-            "=0#lei noi|1#leu nou|1<lei noi" /** (choice)  */,
-            "leu nou",
+            "=0#lei|1#leu|1<lei" /** (choice)  */,
+            "leu",
         }
         RSD{
             "RSD",
@@ -1443,7 +1443,7 @@
             traditional{"sortare tradițională"}
         }
     }
-    Version{"1.85"}
+    Version{"1.86"}
     calendar{
         buddhist{
             DateTimePatterns{

Modified: trunk/source/data/locales/sl.txt
===================================================================
--- trunk/source/data/locales/sl.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/sl.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -397,7 +397,7 @@
             traditional{"Tradicionano zlaganje"}
         }
     }
-    Version{"1.84"}
+    Version{"1.85"}
     calendar{
         gregorian{
             DateTimePatterns{

Modified: trunk/source/data/locales/sv.txt
===================================================================
--- trunk/source/data/locales/sv.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/sv.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -2048,7 +2048,7 @@
         SCOUSE{"scouse"}
         VALENCIA{"valensisk dialekt"}
     }
-    Version{"1.108"}
+    Version{"1.109"}
     calendar{
         gregorian{
             AmPmMarkers{
@@ -2497,29 +2497,25 @@
             lg{"västbrasiliansk tid"}
         }
         "meta:Africa_Central"{
-            lg{"centralafrikansk tid"}
             ls{"centralafrikansk tid"}
-            sg{"CAT"}
             ss{"CAT"}
         }
         "meta:Africa_Eastern"{
             lg{"östafrikansk tid"}
             ls{"östafrikansk normaltid"}
-            sg{"EAT"}
             ss{"EAT"}
         }
         "meta:Africa_Southern"{
             lg{"sydafrikansk tid"}
             ls{"sydafrikansk normaltid"}
-            sd{"sydafrikansk sommartid"}
-            ss{"SAT"}
+            sg{"SAT"}
+            ss{"SAST"}
         }
         "meta:Africa_Western"{
             ld{"västafrikansk sommartid"}
             lg{"västafrikansk tid"}
             ls{"västafrikansk normaltid"}
             sd{"VAST"}
-            sg{"WAT"}
             ss{"WAT"}
         }
         "meta:Alaska"{
@@ -2568,8 +2564,8 @@
             ld{"saudiarabisk sommartid"}
             lg{"saudiarabisk tid"}
             ls{"saudiarabisk normaltid"}
-            sg{"AT"}
-            ss{"AST"}
+            sg{"AT (saudiarabisk)"}
+            ss{"AST (saudiarabisk)"}
         }
         "meta:Argentina"{
             lg{"östargentinsk tid"}
@@ -2660,7 +2656,6 @@
             lg{"centraleuropeisk tid"}
             ls{"Centraleuropa, normaltid"}
             sd{"CEST"}
-            sg{"CET"}
             ss{"CET"}
         }
         "meta:Europe_Eastern"{
@@ -2669,7 +2664,6 @@
             lg{"östeuropeisk tid"}
             ls{"Östeuropa, normaltid"}
             sd{"EEST"}
-            sg{"EET"}
             ss{"EET"}
         }
         "meta:Europe_Western"{
@@ -2678,16 +2672,11 @@
             lg{"västeuropeisk tid"}
             ls{"västeuropeisk normaltid"}
             sd{"WEST"}
-            sg{"WET"}
             ss{"WET"}
         }
         "meta:GMT"{
             cu:int{1}
-            ld{"greenwichtid"}
-            lg{"greenwichtid"}
             ls{"Greenwichtid"}
-            sd{"GMT"}
-            sg{"GMT"}
             ss{"GMT"}
         }
         "meta:Galapagos"{
@@ -2714,13 +2703,6 @@
         "meta:Guam"{
             lg{"Guamtid"}
         }
-        "meta:Hawaii"{
-            ld{"Hawaii, sommartid"}
-            lg{"hawaiiansk tid"}
-            ls{"Hawaii, normaltid"}
-            sd{"HDT"}
-            ss{"HST"}
-        }
         "meta:India"{
             lg{"indisk tid"}
         }
@@ -2741,7 +2723,7 @@
             lg{"israelisk tid"}
             ls{"Israel, normaltid"}
             sd{"IDT"}
-            ss{"IST"}
+            ss{"IST (Israel)"}
         }
         "meta:Japan"{
             ld{"Japan, sommartid"}
@@ -2776,8 +2758,8 @@
             ld{"Newfoundland, sommartid"}
             lg{"New Foundland-tid"}
             ls{"Newfoundland, normaltid"}
-            sd{"CDT"}
-            ss{"CNT"}
+            sd{"NDT"}
+            ss{"NST"}
         }
         "meta:Pakistan"{
             lg{"pakistansk tid"}

Modified: trunk/source/data/locales/th.txt
===================================================================
--- trunk/source/data/locales/th.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/th.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -1964,7 +1964,7 @@
         ROZAJ{"เรเซียน"}
         SAAHO{"ซาโฮ"}
     }
-    Version{"1.94"}
+    Version{"1.95"}
     calendar{
         buddhist{
             DateTimePatterns{

Modified: trunk/source/data/locales/tr.txt
===================================================================
--- trunk/source/data/locales/tr.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/tr.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -2041,7 +2041,7 @@
         SAAHO{"Saho"}
         SCOUSE{"Scouse"}
     }
-    Version{"1.91"}
+    Version{"1.92"}
     calendar{
         coptic{
             monthNames{
@@ -2435,8 +2435,8 @@
         "meta:Acre"{
             ld{"Acre Yaz Saati"}
             ls{"Acre Saati"}
-            sd{"ACST"}
-            ss{"ACT"}
+            sd{"ACST (Acre)"}
+            ss{"ACT (Acre)"}
         }
         "meta:Afghanistan"{
             ls{"Afganistan Saati"}
@@ -2842,21 +2842,9 @@
             ls{"Guyana Saati"}
             ss{"GYT"}
         }
-        "meta:Hawaii"{
-            ld{"Hawaii Yaz Saati"}
-            lg{"Hawaii Saati"}
-            ls{"Hawaii Standart Saati"}
-            sd{"HDT"}
-            sg{"HT"}
-            ss{"HST"}
-        }
         "meta:Hawaii_Aleutian"{
-            ld{"Hawaii-Aleutian Yaz Saati"}
-            lg{"Hawaii-Aleutian Saati"}
             ls{"Hawaii-Aleutian Standart Saati"}
-            sd{"HADT"}
-            sg{"HAT"}
-            ss{"HAST"}
+            ss{"HST"}
         }
         "meta:Hong_Kong"{
             ld{"Hong Kong Yaz Saati"}
@@ -3207,7 +3195,7 @@
         }
         "meta:South_Georgia"{
             ls{"Güney Georgia Saati"}
-            ss{"GST (S. Georgia)"}
+            ss{"GST (Güney Georgia)"}
         }
         "meta:Suriname"{
             ls{"Surinam Saati"}

Modified: trunk/source/data/locales/zh.txt
===================================================================
--- trunk/source/data/locales/zh.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/zh.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -2026,7 +2026,7 @@
         REVISED{"已修订的拼字学"}
         SAAHO{"萨霍"}
     }
-    Version{"1.103"}
+    Version{"1.105"}
     calendar{
         gregorian{
             AmPmMarkers{
@@ -3278,22 +3278,14 @@
             ls{"Acre 标准时间"}
         }
         "meta:Africa_Central"{
-            ld{"非洲中部夏令时间"}
             lg{"非洲中部时间"}
             ls{"中部非洲标准时间"}
         }
         "meta:Africa_Eastern"{
-            ld{"非洲东部夏令时间"}
             lg{"非洲东部时间"}
             ls{"东部非洲标准时间"}
         }
-        "meta:Africa_FarWestern"{
-            ld{"非洲西部夏令时间"}
-            lg{"非洲西部时间"}
-            ls{"非洲西部标准时间"}
-        }
         "meta:Africa_Southern"{
-            ld{"非洲南部夏令时间"}
             lg{"非洲南部时间"}
             ls{"南部非洲标准时间"}
         }
@@ -3380,17 +3372,11 @@
             ls{"格林尼治标准时间"}
             ss{"GMT"}
         }
-        "meta:Hawaii"{
-            ld{"夏威夷夏令时间"}
-            ls{"夏威夷标准时间"}
-            sd{"HDT"}
-            ss{"HST"}
-        }
         "meta:Israel"{
             ld{"以色列夏令时间"}
             ls{"以色列标准时间"}
             sd{"IDT"}
-            ss{"IST"}
+            ss{"IST (Israel)"}
         }
         "meta:Japan"{
             ld{"日本夏令时间"}

Modified: trunk/source/data/locales/zh_Hans_SG.txt
===================================================================
--- trunk/source/data/locales/zh_Hans_SG.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/zh_Hans_SG.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -7,7 +7,7 @@
 // *
 // ***************************************************************************
 zh_Hans_SG{
-    Version{"1.46"}
+    Version{"1.47"}
     calendar{
         gregorian{
             DateTimeElements:intvector{

Modified: trunk/source/data/locales/zh_Hant.txt
===================================================================
--- trunk/source/data/locales/zh_Hant.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/locales/zh_Hant.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -1662,7 +1662,7 @@
         REVISED{"已修訂"}
         SAAHO{"SAAHO"}
     }
-    Version{"1.89"}
+    Version{"1.91"}
     calendar{
         gregorian{
             DateTimePatterns{
@@ -2470,7 +2470,7 @@
         }
         "meta:Aqtau"{
             ld{"阿克陶夏令時間"}
-            ls{"阿克陶夏令時間"}
+            ls{"阿克陶標準時間"}
             sd{"AQTST (阿克陶)"}
             ss{"AQTT (阿克陶)"}
         }
@@ -2511,9 +2511,6 @@
         "meta:GMT"{
             ls{"格林威治標準時間"}
         }
-        "meta:Hawaii"{
-            ls{"夏威夷標準時間"}
-        }
         "meta:Israel"{
             ls{"以色列標準時間"}
         }

Modified: trunk/source/data/makedata.mak
===================================================================
--- trunk/source/data/makedata.mak	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/makedata.mak	2008-03-24 11:52:37 UTC (rev 144)
@@ -250,7 +250,7 @@
 !ENDIF
 
 !IFDEF GENRB_SOURCE
-RB_FILES = root.res $(GENRB_ALIAS_SOURCE:.txt=.res) $(GENRB_SOURCE:.txt=.res)
+RB_FILES = root.res $(GENRB_ALIAS_SOURCE:.txt=.res) $(GENRB_ALIAS_SOURCE_LOCAL:.txt=.res) $(GENRB_SOURCE:.txt=.res)
 ALL_RES = $(ALL_RES) res_index.res
 !ENDIF
 

Modified: trunk/source/data/mappings/convrtrs.txt
===================================================================
--- trunk/source/data/mappings/convrtrs.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/mappings/convrtrs.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -372,6 +372,7 @@
                         iso-ir-126 { IANA WINDOWS }
                         ISO_8859-7:1987 { IANA* WINDOWS }
                         windows-28597 { WINDOWS* }
+                        sun_eu_greek # For Solaris
 
 # ISO Greek (w/o euro update)
 # JDK 1.5 has these aliases.

Added: trunk/source/data/misc/metazoneInfo.txt
===================================================================
--- trunk/source/data/misc/metazoneInfo.txt	                        (rev 0)
+++ trunk/source/data/misc/metazoneInfo.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -0,0 +1,3719 @@
+// ***************************************************************************
+// *
+// * Copyright (C) 2007 International Business Machines
+// * Corporation and others.  All Rights Reserved.
+// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java
+// * Source File:<path>/metazoneInfo.xml
+// *
+// ***************************************************************************
+metazoneInfo:table(nofallback){
+    metazoneMappings{
+        "Africa:Abidjan"{
+            mz0{
+                "GMT",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Accra"{
+            mz0{
+                "GMT",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Addis_Ababa"{
+            mz0{
+                "Africa_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Algiers"{
+            mz0{
+                "Europe_Western",
+                "1970-01-01 00:00",
+                "1977-10-20 23:00",
+            }
+            mz1{
+                "Europe_Central",
+                "1977-10-20 23:00",
+                "1979-10-25 23:00",
+            }
+            mz2{
+                "Europe_Western",
+                "1979-10-25 23:00",
+                "1981-05-01 00:00",
+            }
+            mz3{
+                "Europe_Central",
+                "1981-05-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Asmera"{
+            mz0{
+                "Africa_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Bamako"{
+            mz0{
+                "GMT",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Bangui"{
+            mz0{
+                "Africa_Western",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Banjul"{
+            mz0{
+                "GMT",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Bissau"{
+            mz0{
+                "Africa_FarWestern",
+                "1970-01-01 00:00",
+                "1975-01-01 01:00",
+            }
+            mz1{
+                "GMT",
+                "1975-01-01 01:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Blantyre"{
+            mz0{
+                "Africa_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Brazzaville"{
+            mz0{
+                "Africa_Western",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Bujumbura"{
+            mz0{
+                "Africa_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Cairo"{
+            mz0{
+                "Europe_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Casablanca"{
+            mz0{
+                "Europe_Western",
+                "1970-01-01 00:00",
+                "1984-03-16 00:00",
+            }
+            mz1{
+                "Europe_Central",
+                "1984-03-16 00:00",
+                "1985-12-31 23:00",
+            }
+            mz2{
+                "Europe_Western",
+                "1985-12-31 23:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Ceuta"{
+            mz0{
+                "Europe_Western",
+                "1970-01-01 00:00",
+                "1984-03-16 00:00",
+            }
+            mz1{
+                "Europe_Central",
+                "1984-03-16 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Conakry"{
+            mz0{
+                "GMT",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Dakar"{
+            mz0{
+                "GMT",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Dar_es_Salaam"{
+            mz0{
+                "Africa_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Djibouti"{
+            mz0{
+                "Africa_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Douala"{
+            mz0{
+                "Africa_Western",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:El_Aaiun"{
+            mz0{
+                "Africa_FarWestern",
+                "1970-01-01 00:00",
+                "1976-04-14 01:00",
+            }
+            mz1{
+                "Europe_Western",
+                "1976-04-14 01:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Freetown"{
+            mz0{
+                "GMT",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Gaborone"{
+            mz0{
+                "Africa_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Harare"{
+            mz0{
+                "Africa_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Johannesburg"{
+            mz0{
+                "Africa_Southern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Kampala"{
+            mz0{
+                "Africa_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Khartoum"{
+            mz0{
+                "Africa_Central",
+                "1970-01-01 00:00",
+                "2000-01-15 10:00",
+            }
+            mz1{
+                "Africa_Eastern",
+                "2000-01-15 10:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Kigali"{
+            mz0{
+                "Africa_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Kinshasa"{
+            mz0{
+                "Africa_Western",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Lagos"{
+            mz0{
+                "Africa_Western",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Libreville"{
+            mz0{
+                "Africa_Western",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Lome"{
+            mz0{
+                "GMT",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Luanda"{
+            mz0{
+                "Africa_Western",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Lubumbashi"{
+            mz0{
+                "Africa_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Lusaka"{
+            mz0{
+                "Africa_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Malabo"{
+            mz0{
+                "Africa_Western",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Maputo"{
+            mz0{
+                "Africa_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Maseru"{
+            mz0{
+                "Africa_Southern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Mbabane"{
+            mz0{
+                "Africa_Southern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Mogadishu"{
+            mz0{
+                "Africa_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Monrovia"{
+            mz0{
+                "Liberia",
+                "1970-01-01 00:00",
+                "1972-05-01 00:45",
+            }
+            mz1{
+                "GMT",
+                "1972-05-01 00:45",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Nairobi"{
+            mz0{
+                "Africa_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Ndjamena"{
+            mz0{
+                "Africa_Western",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Niamey"{
+            mz0{
+                "Africa_Western",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Nouakchott"{
+            mz0{
+                "GMT",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Ouagadougou"{
+            mz0{
+                "GMT",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Porto-Novo"{
+            mz0{
+                "Africa_Western",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Sao_Tome"{
+            mz0{
+                "GMT",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Tripoli"{
+            mz0{
+                "Europe_Eastern",
+                "1970-01-01 00:00",
+                "1981-12-31 22:00",
+            }
+            mz1{
+                "Europe_Central",
+                "1981-12-31 22:00",
+                "1990-05-03 23:00",
+            }
+            mz2{
+                "Europe_Eastern",
+                "1990-05-03 23:00",
+                "1996-09-29 22:00",
+            }
+            mz3{
+                "Europe_Central",
+                "1996-09-29 22:00",
+                "1997-10-03 22:00",
+            }
+            mz4{
+                "Europe_Eastern",
+                "1997-10-03 22:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Tunis"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Africa:Windhoek"{
+            mz0{
+                "Africa_Southern",
+                "1970-01-01 00:00",
+                "1990-03-20 22:00",
+            }
+            mz1{
+                "Africa_Central",
+                "1990-03-20 22:00",
+                "1994-04-02 22:00",
+            }
+            mz2{
+                "Africa_Western",
+                "1994-04-02 22:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Adak"{
+            mz0{
+                "Bering",
+                "1970-01-01 00:00",
+                "1983-10-30 12:00",
+            }
+            mz1{
+                "Hawaii_Aleutian",
+                "1983-10-30 12:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Anchorage"{
+            mz0{
+                "Alaska_Hawaii",
+                "1970-01-01 00:00",
+                "1983-10-30 11:00",
+            }
+            mz1{
+                "Alaska",
+                "1983-10-30 11:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Anguilla"{
+            mz0{
+                "Atlantic",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Antigua"{
+            mz0{
+                "Atlantic",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Araguaina"{
+            mz0{
+                "Brasilia",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Argentina:La_Rioja"{
+            mz0{
+                "Argentina",
+                "1970-01-01 00:00",
+                "1991-03-01 02:00",
+            }
+            mz1{
+                "Argentina_Western",
+                "1991-03-01 02:00",
+                "1991-05-07 04:00",
+            }
+            mz2{
+                "Argentina",
+                "1991-05-07 04:00",
+                "2004-06-01 03:00",
+            }
+            mz3{
+                "Argentina_Western",
+                "2004-06-01 03:00",
+                "2004-06-20 04:00",
+            }
+            mz4{
+                "Argentina",
+                "2004-06-20 04:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Argentina:Rio_Gallegos"{
+            mz0{
+                "Argentina",
+                "1970-01-01 00:00",
+                "2004-06-01 03:00",
+            }
+            mz1{
+                "Argentina_Western",
+                "2004-06-01 03:00",
+                "2004-06-20 04:00",
+            }
+            mz2{
+                "Argentina",
+                "2004-06-20 04:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Argentina:San_Juan"{
+            mz0{
+                "Argentina",
+                "1970-01-01 00:00",
+                "1991-03-01 02:00",
+            }
+            mz1{
+                "Argentina_Western",
+                "1991-03-01 02:00",
+                "1991-05-07 04:00",
+            }
+            mz2{
+                "Argentina",
+                "1991-05-07 04:00",
+                "2004-05-31 03:00",
+            }
+            mz3{
+                "Argentina_Western",
+                "2004-05-31 03:00",
+                "2004-07-25 04:00",
+            }
+            mz4{
+                "Argentina",
+                "2004-07-25 04:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Argentina:Tucuman"{
+            mz0{
+                "Argentina",
+                "1970-01-01 00:00",
+                "1991-03-03 02:00",
+            }
+            mz1{
+                "Argentina_Western",
+                "1991-03-03 02:00",
+                "1991-10-20 04:00",
+            }
+            mz2{
+                "Argentina",
+                "1991-10-20 04:00",
+                "2004-06-01 03:00",
+            }
+            mz3{
+                "Argentina_Western",
+                "2004-06-01 03:00",
+                "2004-06-13 04:00",
+            }
+            mz4{
+                "Argentina",
+                "2004-06-13 04:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Argentina:Ushuaia"{
+            mz0{
+                "Argentina",
+                "1970-01-01 00:00",
+                "2004-05-30 03:00",
+            }
+            mz1{
+                "Argentina_Western",
+                "2004-05-30 03:00",
+                "2004-06-20 04:00",
+            }
+            mz2{
+                "Argentina",
+                "2004-06-20 04:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Aruba"{
+            mz0{
+                "Atlantic",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Asuncion"{
+            mz0{
+                "Paraguay",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Bahia"{
+            mz0{
+                "Brasilia",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Barbados"{
+            mz0{
+                "Atlantic",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Belem"{
+            mz0{
+                "Brasilia",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Belize"{
+            mz0{
+                "America_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Blanc-Sablon"{
+            mz0{
+                "Atlantic",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Boa_Vista"{
+            mz0{
+                "Amazon",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Bogota"{
+            mz0{
+                "Colombia",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Boise"{
+            mz0{
+                "America_Mountain",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Buenos_Aires"{
+            mz0{
+                "Argentina",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Cambridge_Bay"{
+            mz0{
+                "America_Mountain",
+                "1970-01-01 00:00",
+                "1999-10-31 08:00",
+            }
+            mz1{
+                "America_Central",
+                "1999-10-31 08:00",
+                "2000-10-29 07:00",
+            }
+            mz2{
+                "America_Eastern",
+                "2000-10-29 07:00",
+                "2000-11-05 05:00",
+            }
+            mz3{
+                "America_Central",
+                "2000-11-05 05:00",
+                "2001-04-01 09:00",
+            }
+            mz4{
+                "America_Mountain",
+                "2001-04-01 09:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Campo_Grande"{
+            mz0{
+                "Amazon",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Cancun"{
+            mz0{
+                "America_Central",
+                "1970-01-01 00:00",
+                "1981-12-23 06:00",
+            }
+            mz1{
+                "America_Eastern",
+                "1981-12-23 06:00",
+                "1998-08-02 06:00",
+            }
+            mz2{
+                "America_Central",
+                "1998-08-02 06:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Caracas"{
+            mz0{
+                "Venezuela",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Catamarca"{
+            mz0{
+                "Argentina",
+                "1970-01-01 00:00",
+                "1991-03-03 02:00",
+            }
+            mz1{
+                "Argentina_Western",
+                "1991-03-03 02:00",
+                "1991-10-20 04:00",
+            }
+            mz2{
+                "Argentina",
+                "1991-10-20 04:00",
+                "2004-06-01 03:00",
+            }
+            mz3{
+                "Argentina_Western",
+                "2004-06-01 03:00",
+                "2004-06-20 04:00",
+            }
+            mz4{
+                "Argentina",
+                "2004-06-20 04:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Cayenne"{
+            mz0{
+                "French_Guiana",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Cayman"{
+            mz0{
+                "America_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Chicago"{
+            mz0{
+                "America_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Chihuahua"{
+            mz0{
+                "America_Central",
+                "1970-01-01 00:00",
+                "1998-04-05 09:00",
+            }
+            mz1{
+                "America_Mountain",
+                "1998-04-05 09:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Coral_Harbour"{
+            mz0{
+                "America_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Cordoba"{
+            mz0{
+                "Argentina",
+                "1970-01-01 00:00",
+                "1991-03-03 02:00",
+            }
+            mz1{
+                "Argentina_Western",
+                "1991-03-03 02:00",
+                "1991-10-20 04:00",
+            }
+            mz2{
+                "Argentina",
+                "1991-10-20 04:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Costa_Rica"{
+            mz0{
+                "America_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Cuiaba"{
+            mz0{
+                "Amazon",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Curacao"{
+            mz0{
+                "Atlantic",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Danmarkshavn"{
+            mz0{
+                "Greenland_Western",
+                "1970-01-01 00:00",
+                "1996-01-01 03:00",
+            }
+            mz1{
+                "GMT",
+                "1996-01-01 03:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Dawson"{
+            mz0{
+                "Yukon",
+                "1970-01-01 00:00",
+                "1973-10-28 09:00",
+            }
+            mz1{
+                "America_Pacific",
+                "1973-10-28 09:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Dawson_Creek"{
+            mz0{
+                "America_Pacific",
+                "1970-01-01 00:00",
+                "1972-08-30 09:00",
+            }
+            mz1{
+                "America_Mountain",
+                "1972-08-30 09:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Denver"{
+            mz0{
+                "America_Mountain",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Detroit"{
+            mz0{
+                "America_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Dominica"{
+            mz0{
+                "Atlantic",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Edmonton"{
+            mz0{
+                "America_Mountain",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Eirunepe"{
+            mz0{
+                "Acre",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:El_Salvador"{
+            mz0{
+                "America_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Fortaleza"{
+            mz0{
+                "Brasilia",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Glace_Bay"{
+            mz0{
+                "Atlantic",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Godthab"{
+            mz0{
+                "Greenland_Western",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Goose_Bay"{
+            mz0{
+                "Atlantic",
+                "1970-01-01 00:00",
+                "1988-04-03 04:01",
+            }
+            mz1{
+                "Goose_Bay",
+                "1988-04-03 04:01",
+                "1988-10-30 02:01",
+            }
+            mz2{
+                "Atlantic",
+                "1988-10-30 02:01",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Grand_Turk"{
+            mz0{
+                "America_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Grenada"{
+            mz0{
+                "Atlantic",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Guadeloupe"{
+            mz0{
+                "Atlantic",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Guatemala"{
+            mz0{
+                "America_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Guayaquil"{
+            mz0{
+                "Ecuador",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Guyana"{
+            mz0{
+                "Guyana",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Halifax"{
+            mz0{
+                "Atlantic",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Havana"{
+            mz0{
+                "Cuba",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Hermosillo"{
+            mz0{
+                "America_Pacific",
+                "1970-01-01 00:00",
+                "1970-01-01 08:00",
+            }
+            mz1{
+                "America_Mountain",
+                "1970-01-01 08:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Indiana:Knox"{
+            mz0{
+                "America_Central",
+                "1970-01-01 00:00",
+                "1991-10-27 07:00",
+            }
+            mz1{
+                "America_Eastern",
+                "1991-10-27 07:00",
+                "2006-04-02 07:00",
+            }
+            mz2{
+                "America_Central",
+                "2006-04-02 07:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Indiana:Marengo"{
+            mz0{
+                "America_Eastern",
+                "1970-01-01 00:00",
+                "1974-01-06 07:00",
+            }
+            mz1{
+                "America_Central",
+                "1974-01-06 07:00",
+                "1974-10-27 07:00",
+            }
+            mz2{
+                "America_Eastern",
+                "1974-10-27 07:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Indiana:Petersburg"{
+            mz0{
+                "America_Central",
+                "1970-01-01 00:00",
+                "1977-10-30 07:00",
+            }
+            mz1{
+                "America_Eastern",
+                "1977-10-30 07:00",
+                "2006-04-02 07:00",
+            }
+            mz2{
+                "America_Central",
+                "2006-04-02 07:00",
+                "2007-11-04 07:00",
+            }
+            mz3{
+                "America_Eastern",
+                "2007-11-04 07:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Indiana:Tell_City"{
+            mz0{
+                "America_Eastern",
+                "1970-01-01 00:00",
+                "2006-04-02 07:00",
+            }
+            mz1{
+                "America_Central",
+                "2006-04-02 07:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Indiana:Vevay"{
+            mz0{
+                "America_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Indiana:Vincennes"{
+            mz0{
+                "America_Eastern",
+                "1970-01-01 00:00",
+                "2006-04-02 07:00",
+            }
+            mz1{
+                "America_Central",
+                "2006-04-02 07:00",
+                "2007-11-04 07:00",
+            }
+            mz2{
+                "America_Eastern",
+                "2007-11-04 07:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Indiana:Winamac"{
+            mz0{
+                "America_Eastern",
+                "1970-01-01 00:00",
+                "2006-04-02 07:00",
+            }
+            mz1{
+                "America_Central",
+                "2006-04-02 07:00",
+                "2007-03-11 08:00",
+            }
+            mz2{
+                "America_Eastern",
+                "2007-03-11 08:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Indianapolis"{
+            mz0{
+                "America_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Inuvik"{
+            mz0{
+                "America_Pacific",
+                "1970-01-01 00:00",
+                "1979-04-29 10:00",
+            }
+            mz1{
+                "America_Mountain",
+                "1979-04-29 10:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Iqaluit"{
+            mz0{
+                "America_Eastern",
+                "1970-01-01 00:00",
+                "1999-10-31 06:00",
+            }
+            mz1{
+                "America_Central",
+                "1999-10-31 06:00",
+                "2000-10-29 07:00",
+            }
+            mz2{
+                "America_Eastern",
+                "2000-10-29 07:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Jamaica"{
+            mz0{
+                "America_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Jujuy"{
+            mz0{
+                "Argentina",
+                "1970-01-01 00:00",
+                "1990-03-04 02:00",
+            }
+            mz1{
+                "Argentina_Western",
+                "1990-03-04 02:00",
+                "1991-10-06 04:00",
+            }
+            mz2{
+                "Argentina",
+                "1991-10-06 04:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Juneau"{
+            mz0{
+                "America_Pacific",
+                "1970-01-01 00:00",
+                "1983-10-30 09:00",
+            }
+            mz1{
+                "Alaska",
+                "1983-10-30 09:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Kentucky:Monticello"{
+            mz0{
+                "America_Central",
+                "1970-01-01 00:00",
+                "2000-10-29 07:00",
+            }
+            mz1{
+                "America_Eastern",
+                "2000-10-29 07:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:La_Paz"{
+            mz0{
+                "Bolivia",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Lima"{
+            mz0{
+                "Peru",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Los_Angeles"{
+            mz0{
+                "America_Pacific",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Louisville"{
+            mz0{
+                "America_Eastern",
+                "1970-01-01 00:00",
+                "1974-01-06 07:00",
+            }
+            mz1{
+                "America_Central",
+                "1974-01-06 07:00",
+                "1974-10-27 07:00",
+            }
+            mz2{
+                "America_Eastern",
+                "1974-10-27 07:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Maceio"{
+            mz0{
+                "Brasilia",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Managua"{
+            mz0{
+                "America_Central",
+                "1970-01-01 00:00",
+                "1973-05-01 06:00",
+            }
+            mz1{
+                "America_Eastern",
+                "1973-05-01 06:00",
+                "1975-02-16 05:00",
+            }
+            mz2{
+                "America_Central",
+                "1975-02-16 05:00",
+                "1992-01-01 10:00",
+            }
+            mz3{
+                "America_Eastern",
+                "1992-01-01 10:00",
+                "1992-09-24 05:00",
+            }
+            mz4{
+                "America_Central",
+                "1992-09-24 05:00",
+                "1993-01-01 06:00",
+            }
+            mz5{
+                "America_Eastern",
+                "1993-01-01 06:00",
+                "1997-01-01 05:00",
+            }
+            mz6{
+                "America_Central",
+                "1997-01-01 05:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Manaus"{
+            mz0{
+                "Amazon",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Martinique"{
+            mz0{
+                "Atlantic",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Mazatlan"{
+            mz0{
+                "America_Pacific",
+                "1970-01-01 00:00",
+                "1970-01-01 08:00",
+            }
+            mz1{
+                "America_Mountain",
+                "1970-01-01 08:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Mendoza"{
+            mz0{
+                "Argentina",
+                "1970-01-01 00:00",
+                "1990-03-04 02:00",
+            }
+            mz1{
+                "Argentina_Western",
+                "1990-03-04 02:00",
+                "1992-10-18 04:00",
+            }
+            mz2{
+                "Argentina",
+                "1992-10-18 04:00",
+                "2004-05-23 03:00",
+            }
+            mz3{
+                "Argentina_Western",
+                "2004-05-23 03:00",
+                "2004-09-26 04:00",
+            }
+            mz4{
+                "Argentina",
+                "2004-09-26 04:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Menominee"{
+            mz0{
+                "America_Eastern",
+                "1970-01-01 00:00",
+                "1973-04-29 07:00",
+            }
+            mz1{
+                "America_Central",
+                "1973-04-29 07:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Merida"{
+            mz0{
+                "America_Central",
+                "1970-01-01 00:00",
+                "1981-12-23 06:00",
+            }
+            mz1{
+                "America_Eastern",
+                "1981-12-23 06:00",
+                "1982-12-02 05:00",
+            }
+            mz2{
+                "America_Central",
+                "1982-12-02 05:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Mexico_City"{
+            mz0{
+                "America_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Miquelon"{
+            mz0{
+                "Atlantic",
+                "1970-01-01 00:00",
+                "1980-05-01 04:00",
+            }
+            mz1{
+                "Pierre_Miquelon",
+                "1980-05-01 04:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Moncton"{
+            mz0{
+                "Atlantic",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Monterrey"{
+            mz0{
+                "America_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Montevideo"{
+            mz0{
+                "Uruguay",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Montreal"{
+            mz0{
+                "America_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Montserrat"{
+            mz0{
+                "Atlantic",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Nassau"{
+            mz0{
+                "America_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:New_York"{
+            mz0{
+                "America_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Nipigon"{
+            mz0{
+                "America_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Nome"{
+            mz0{
+                "Bering",
+                "1970-01-01 00:00",
+                "1983-10-30 12:00",
+            }
+            mz1{
+                "Alaska",
+                "1983-10-30 12:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Noronha"{
+            mz0{
+                "Noronha",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:North_Dakota:Center"{
+            mz0{
+                "America_Mountain",
+                "1970-01-01 00:00",
+                "1992-10-25 08:00",
+            }
+            mz1{
+                "America_Central",
+                "1992-10-25 08:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:North_Dakota:New_Salem"{
+            mz0{
+                "America_Mountain",
+                "1970-01-01 00:00",
+                "2003-10-26 08:00",
+            }
+            mz1{
+                "America_Central",
+                "2003-10-26 08:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Panama"{
+            mz0{
+                "America_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Pangnirtung"{
+            mz0{
+                "Atlantic",
+                "1970-01-01 00:00",
+                "1995-04-02 06:00",
+            }
+            mz1{
+                "America_Eastern",
+                "1995-04-02 06:00",
+                "1999-10-31 06:00",
+            }
+            mz2{
+                "America_Central",
+                "1999-10-31 06:00",
+                "2000-10-29 07:00",
+            }
+            mz3{
+                "America_Eastern",
+                "2000-10-29 07:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Paramaribo"{
+            mz0{
+                "Dutch_Guiana",
+                "1970-01-01 00:00",
+                "1975-11-20 03:30",
+            }
+            mz1{
+                "Suriname",
+                "1975-11-20 03:30",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Phoenix"{
+            mz0{
+                "America_Mountain",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Port-au-Prince"{
+            mz0{
+                "America_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Port_of_Spain"{
+            mz0{
+                "Atlantic",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Porto_Velho"{
+            mz0{
+                "Amazon",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Puerto_Rico"{
+            mz0{
+                "Atlantic",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Rainy_River"{
+            mz0{
+                "America_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Rankin_Inlet"{
+            mz0{
+                "America_Central",
+                "1970-01-01 00:00",
+                "2000-10-29 07:00",
+            }
+            mz1{
+                "America_Eastern",
+                "2000-10-29 07:00",
+                "2001-04-01 08:00",
+            }
+            mz2{
+                "America_Central",
+                "2001-04-01 08:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Recife"{
+            mz0{
+                "Brasilia",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Regina"{
+            mz0{
+                "America_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Resolute"{
+            mz0{
+                "America_Central",
+                "1970-01-01 00:00",
+                "2000-10-29 07:00",
+            }
+            mz1{
+                "America_Eastern",
+                "2000-10-29 07:00",
+                "2001-04-01 08:00",
+            }
+            mz2{
+                "America_Central",
+                "2001-04-01 08:00",
+                "2006-10-29 07:00",
+            }
+            mz3{
+                "America_Eastern",
+                "2006-10-29 07:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Rio_Branco"{
+            mz0{
+                "Acre",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Santiago"{
+            mz0{
+                "Chile",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Santo_Domingo"{
+            mz0{
+                "Dominican",
+                "1970-01-01 00:00",
+                "1974-10-27 05:00",
+            }
+            mz1{
+                "Atlantic",
+                "1974-10-27 05:00",
+                "2000-10-29 06:00",
+            }
+            mz2{
+                "America_Eastern",
+                "2000-10-29 06:00",
+                "2000-12-03 06:00",
+            }
+            mz3{
+                "Atlantic",
+                "2000-12-03 06:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Sao_Paulo"{
+            mz0{
+                "Brasilia",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Scoresbysund"{
+            mz0{
+                "Greenland_Central",
+                "1970-01-01 00:00",
+                "1981-03-29 02:00",
+            }
+            mz1{
+                "Greenland_Eastern",
+                "1981-03-29 02:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Shiprock"{
+            mz0{
+                "America_Mountain",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:St_Johns"{
+            mz0{
+                "Newfoundland",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:St_Kitts"{
+            mz0{
+                "Atlantic",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:St_Lucia"{
+            mz0{
+                "Atlantic",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:St_Thomas"{
+            mz0{
+                "Atlantic",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:St_Vincent"{
+            mz0{
+                "Atlantic",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Swift_Current"{
+            mz0{
+                "America_Mountain",
+                "1970-01-01 00:00",
+                "1972-04-30 09:00",
+            }
+            mz1{
+                "America_Central",
+                "1972-04-30 09:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Tegucigalpa"{
+            mz0{
+                "America_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Thule"{
+            mz0{
+                "Atlantic",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Thunder_Bay"{
+            mz0{
+                "America_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Tijuana"{
+            mz0{
+                "America_Pacific",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Toronto"{
+            mz0{
+                "America_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Tortola"{
+            mz0{
+                "Atlantic",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Vancouver"{
+            mz0{
+                "America_Pacific",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Whitehorse"{
+            mz0{
+                "America_Pacific",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Winnipeg"{
+            mz0{
+                "America_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Yakutat"{
+            mz0{
+                "Yukon",
+                "1970-01-01 00:00",
+                "1983-10-30 10:00",
+            }
+            mz1{
+                "Alaska",
+                "1983-10-30 10:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "America:Yellowknife"{
+            mz0{
+                "America_Mountain",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Antarctica:Casey"{
+            mz0{
+                "Australia_Western",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Antarctica:Davis"{
+            mz0{
+                "Davis",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Antarctica:DumontDUrville"{
+            mz0{
+                "DumontDUrville",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Antarctica:Mawson"{
+            mz0{
+                "Mawson",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Antarctica:McMurdo"{
+            mz0{
+                "New_Zealand",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Antarctica:Palmer"{
+            mz0{
+                "Argentina",
+                "1970-01-01 00:00",
+                "1982-05-01 03:00",
+            }
+            mz1{
+                "Chile",
+                "1982-05-01 03:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Antarctica:Rothera"{
+            mz0{
+                "Rothera",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Antarctica:Syowa"{
+            mz0{
+                "Syowa",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Antarctica:Vostok"{
+            mz0{
+                "Vostok",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Arctic:Longyearbyen"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Aden"{
+            mz0{
+                "Arabian",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Almaty"{
+            mz0{
+                "Almaty",
+                "1970-01-01 00:00",
+                "2005-03-14 18:00",
+            }
+            mz1{
+                "Kazakhstan_Eastern",
+                "2005-03-14 18:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Amman"{
+            mz0{
+                "Europe_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Anadyr"{
+            mz0{
+                "Anadyr",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Aqtau"{
+            mz0{
+                "Shevchenko",
+                "1970-01-01 00:00",
+                "1991-12-15 19:00",
+            }
+            mz1{
+                "Aqtau",
+                "1991-12-15 19:00",
+                "2005-03-14 20:00",
+            }
+            mz2{
+                "Kazakhstan_Western",
+                "2005-03-14 20:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Aqtobe"{
+            mz0{
+                "Aktyubinsk",
+                "1970-01-01 00:00",
+                "1991-12-15 19:00",
+            }
+            mz1{
+                "Aqtobe",
+                "1991-12-15 19:00",
+                "2005-03-14 19:00",
+            }
+            mz2{
+                "Kazakhstan_Western",
+                "2005-03-14 19:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Ashgabat"{
+            mz0{
+                "Ashkhabad",
+                "1970-01-01 00:00",
+                "1991-10-26 20:00",
+            }
+            mz1{
+                "Turkmenistan",
+                "1991-10-26 20:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Baghdad"{
+            mz0{
+                "Arabian",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Bahrain"{
+            mz0{
+                "Gulf",
+                "1970-01-01 00:00",
+                "1972-05-31 20:00",
+            }
+            mz1{
+                "Arabian",
+                "1972-05-31 20:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Baku"{
+            mz0{
+                "Baku",
+                "1970-01-01 00:00",
+                "1991-08-29 20:00",
+            }
+            mz1{
+                "Azerbaijan",
+                "1991-08-29 20:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Bangkok"{
+            mz0{
+                "Indochina",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Beirut"{
+            mz0{
+                "Europe_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Bishkek"{
+            mz0{
+                "Frunze",
+                "1970-01-01 00:00",
+                "1991-08-30 20:00",
+            }
+            mz1{
+                "Kyrgystan",
+                "1991-08-30 20:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Brunei"{
+            mz0{
+                "Brunei",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Calcutta"{
+            mz0{
+                "India",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Choibalsan"{
+            mz0{
+                "Mongolia",
+                "1970-01-01 00:00",
+                "1983-03-31 16:00",
+            }
+            mz1{
+                "Choibalsan",
+                "1983-03-31 16:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Chongqing"{
+            mz0{
+                "Long_Shu",
+                "1970-01-01 00:00",
+                "1980-04-30 17:00",
+            }
+            mz1{
+                "China",
+                "1980-04-30 17:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Colombo"{
+            mz0{
+                "India",
+                "1970-01-01 00:00",
+                "1996-05-24 18:30",
+            }
+            mz1{
+                "Lanka",
+                "1996-05-24 18:30",
+                "2006-04-14 18:30",
+            }
+            mz2{
+                "India",
+                "2006-04-14 18:30",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Damascus"{
+            mz0{
+                "Europe_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Dhaka"{
+            mz0{
+                "Dacca",
+                "1970-01-01 00:00",
+                "1971-03-25 18:00",
+            }
+            mz1{
+                "Bangladesh",
+                "1971-03-25 18:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Dili"{
+            mz0{
+                "East_Timor",
+                "1970-01-01 00:00",
+                "1976-05-02 15:00",
+            }
+            mz1{
+                "Indonesia_Central",
+                "1976-05-02 15:00",
+                "2000-09-16 16:00",
+            }
+            mz2{
+                "East_Timor",
+                "2000-09-16 16:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Dubai"{
+            mz0{
+                "Gulf",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Dushanbe"{
+            mz0{
+                "Dushanbe",
+                "1970-01-01 00:00",
+                "1991-09-08 21:00",
+            }
+            mz1{
+                "Tajikistan",
+                "1991-09-08 21:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Gaza"{
+            mz0{
+                "Israel",
+                "1970-01-01 00:00",
+                "1995-12-31 22:00",
+            }
+            mz1{
+                "Europe_Eastern",
+                "1995-12-31 22:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Harbin"{
+            mz0{
+                "Changbai",
+                "1970-01-01 00:00",
+                "1980-04-30 15:30",
+            }
+            mz1{
+                "China",
+                "1980-04-30 15:30",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Hong_Kong"{
+            mz0{
+                "Hong_Kong",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Hovd"{
+            mz0{
+                "Hovd",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Irkutsk"{
+            mz0{
+                "Irkutsk",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Jakarta"{
+            mz0{
+                "Indonesia_Western",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Jayapura"{
+            mz0{
+                "Indonesia_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Jerusalem"{
+            mz0{
+                "Israel",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Kabul"{
+            mz0{
+                "Afghanistan",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Kamchatka"{
+            mz0{
+                "Kamchatka",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Karachi"{
+            mz0{
+                "Karachi",
+                "1970-01-01 00:00",
+                "1971-03-25 19:00",
+            }
+            mz1{
+                "Pakistan",
+                "1971-03-25 19:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Kashgar"{
+            mz0{
+                "Kashgar",
+                "1970-01-01 00:00",
+                "1980-04-30 19:00",
+            }
+            mz1{
+                "China",
+                "1980-04-30 19:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Katmandu"{
+            mz0{
+                "Nepal",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Krasnoyarsk"{
+            mz0{
+                "Krasnoyarsk",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Kuala_Lumpur"{
+            mz0{
+                "Malaya",
+                "1970-01-01 00:00",
+                "1981-12-31 16:30",
+            }
+            mz1{
+                "Malaysia",
+                "1981-12-31 16:30",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Kuching"{
+            mz0{
+                "Borneo",
+                "1970-01-01 00:00",
+                "1981-12-31 16:00",
+            }
+            mz1{
+                "Malaysia",
+                "1981-12-31 16:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Kuwait"{
+            mz0{
+                "Arabian",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Macau"{
+            mz0{
+                "Macau",
+                "1970-01-01 00:00",
+                "1999-12-19 16:00",
+            }
+            mz1{
+                "China",
+                "1999-12-19 16:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Magadan"{
+            mz0{
+                "Magadan",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Makassar"{
+            mz0{
+                "Indonesia_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Manila"{
+            mz0{
+                "Philippines",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Muscat"{
+            mz0{
+                "Gulf",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Nicosia"{
+            mz0{
+                "Europe_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Novosibirsk"{
+            mz0{
+                "Novosibirsk",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Omsk"{
+            mz0{
+                "Omsk",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Oral"{
+            mz0{
+                "Uralsk",
+                "1970-01-01 00:00",
+                "1991-12-15 20:00",
+            }
+            mz1{
+                "Oral",
+                "1991-12-15 20:00",
+                "2005-03-14 20:00",
+            }
+            mz2{
+                "Kazakhstan_Western",
+                "2005-03-14 20:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Phnom_Penh"{
+            mz0{
+                "Indochina",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Pontianak"{
+            mz0{
+                "Indonesia_Central",
+                "1970-01-01 00:00",
+                "1987-12-31 16:00",
+            }
+            mz1{
+                "Indonesia_Western",
+                "1987-12-31 16:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Pyongyang"{
+            mz0{
+                "Korea",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Qatar"{
+            mz0{
+                "Gulf",
+                "1970-01-01 00:00",
+                "1972-05-31 20:00",
+            }
+            mz1{
+                "Arabian",
+                "1972-05-31 20:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Qyzylorda"{
+            mz0{
+                "Kizilorda",
+                "1970-01-01 00:00",
+                "1991-12-15 19:00",
+            }
+            mz1{
+                "Qyzylorda",
+                "1991-12-15 19:00",
+                "2005-03-14 18:00",
+            }
+            mz2{
+                "Kazakhstan_Eastern",
+                "2005-03-14 18:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Rangoon"{
+            mz0{
+                "Myanmar",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Riyadh"{
+            mz0{
+                "Arabian",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Saigon"{
+            mz0{
+                "Indochina",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Sakhalin"{
+            mz0{
+                "Sakhalin",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Samarkand"{
+            mz0{
+                "Samarkand",
+                "1970-01-01 00:00",
+                "1981-09-30 18:00",
+            }
+            mz1{
+                "Tashkent",
+                "1981-09-30 18:00",
+                "1982-03-31 18:00",
+            }
+            mz2{
+                "Samarkand",
+                "1982-03-31 18:00",
+                "1991-08-31 18:00",
+            }
+            mz3{
+                "Uzbekistan",
+                "1991-08-31 18:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Seoul"{
+            mz0{
+                "Korea",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Shanghai"{
+            mz0{
+                "China",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Singapore"{
+            mz0{
+                "Singapore",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Taipei"{
+            mz0{
+                "China",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Tashkent"{
+            mz0{
+                "Tashkent",
+                "1970-01-01 00:00",
+                "1991-08-31 18:00",
+            }
+            mz1{
+                "Uzbekistan",
+                "1991-08-31 18:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Tbilisi"{
+            mz0{
+                "Tbilisi",
+                "1970-01-01 00:00",
+                "1991-04-08 20:00",
+            }
+            mz1{
+                "Georgia",
+                "1991-04-08 20:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Tehran"{
+            mz0{
+                "Iran",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Thimphu"{
+            mz0{
+                "India",
+                "1970-01-01 00:00",
+                "1987-09-30 18:30",
+            }
+            mz1{
+                "Bhutan",
+                "1987-09-30 18:30",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Tokyo"{
+            mz0{
+                "Japan",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Ulaanbaatar"{
+            mz0{
+                "Mongolia",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Urumqi"{
+            mz0{
+                "Urumqi",
+                "1970-01-01 00:00",
+                "1980-04-30 18:00",
+            }
+            mz1{
+                "China",
+                "1980-04-30 18:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Vientiane"{
+            mz0{
+                "Indochina",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Vladivostok"{
+            mz0{
+                "Vladivostok",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Yakutsk"{
+            mz0{
+                "Yakutsk",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Yekaterinburg"{
+            mz0{
+                "Sverdlovsk",
+                "1970-01-01 00:00",
+                "1992-01-18 22:00",
+            }
+            mz1{
+                "Yekaterinburg",
+                "1992-01-18 22:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Asia:Yerevan"{
+            mz0{
+                "Yerevan",
+                "1970-01-01 00:00",
+                "1991-09-22 20:00",
+            }
+            mz1{
+                "Armenia",
+                "1991-09-22 20:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Atlantic:Azores"{
+            mz0{
+                "Azores",
+                "1970-01-01 00:00",
+                "1992-09-27 02:00",
+            }
+            mz1{
+                "Europe_Western",
+                "1992-09-27 02:00",
+                "1993-03-28 01:00",
+            }
+            mz2{
+                "Azores",
+                "1993-03-28 01:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Atlantic:Bermuda"{
+            mz0{
+                "Atlantic",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Atlantic:Canary"{
+            mz0{
+                "Europe_Western",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Atlantic:Cape_Verde"{
+            mz0{
+                "Cape_Verde",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Atlantic:Faeroe"{
+            mz0{
+                "Europe_Western",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Atlantic:Jan_Mayen"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Atlantic:Madeira"{
+            mz0{
+                "Europe_Western",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Atlantic:Reykjavik"{
+            mz0{
+                "GMT",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Atlantic:South_Georgia"{
+            mz0{
+                "South_Georgia",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Atlantic:St_Helena"{
+            mz0{
+                "GMT",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Atlantic:Stanley"{
+            mz0{
+                "Falkland",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Australia:Adelaide"{
+            mz0{
+                "Australia_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Australia:Brisbane"{
+            mz0{
+                "Australia_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Australia:Broken_Hill"{
+            mz0{
+                "Australia_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Australia:Currie"{
+            mz0{
+                "Australia_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Australia:Darwin"{
+            mz0{
+                "Australia_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Australia:Eucla"{
+            mz0{
+                "Australia_CentralWestern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Australia:Hobart"{
+            mz0{
+                "Australia_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Australia:Lindeman"{
+            mz0{
+                "Australia_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Australia:Lord_Howe"{
+            mz0{
+                "Australia_Eastern",
+                "1970-01-01 00:00",
+                "1981-02-28 14:00",
+            }
+            mz1{
+                "Lord_Howe",
+                "1981-02-28 14:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Australia:Melbourne"{
+            mz0{
+                "Australia_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Australia:Perth"{
+            mz0{
+                "Australia_Western",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Australia:Sydney"{
+            mz0{
+                "Australia_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Amsterdam"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Andorra"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Athens"{
+            mz0{
+                "Europe_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Belgrade"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Berlin"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Bratislava"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Brussels"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Bucharest"{
+            mz0{
+                "Europe_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Budapest"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Chisinau"{
+            mz0{
+                "Moscow",
+                "1970-01-01 00:00",
+                "1990-05-05 21:00",
+            }
+            mz1{
+                "Europe_Eastern",
+                "1990-05-05 21:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Copenhagen"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Dublin"{
+            mz0{
+                "Irish",
+                "1970-01-01 00:00",
+                "1971-10-31 02:00",
+            }
+            mz1{
+                "GMT",
+                "1971-10-31 02:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Gibraltar"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Guernsey"{
+            mz0{
+                "British",
+                "1970-01-01 00:00",
+                "1971-10-31 02:00",
+            }
+            mz1{
+                "GMT",
+                "1971-10-31 02:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Helsinki"{
+            mz0{
+                "Europe_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Isle_of_Man"{
+            mz0{
+                "British",
+                "1970-01-01 00:00",
+                "1971-10-31 02:00",
+            }
+            mz1{
+                "GMT",
+                "1971-10-31 02:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Istanbul"{
+            mz0{
+                "Europe_Eastern",
+                "1970-01-01 00:00",
+                "1978-10-14 21:00",
+            }
+            mz1{
+                "Turkey",
+                "1978-10-14 21:00",
+                "1985-04-19 21:00",
+            }
+            mz2{
+                "Europe_Eastern",
+                "1985-04-19 21:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Jersey"{
+            mz0{
+                "British",
+                "1970-01-01 00:00",
+                "1971-10-31 02:00",
+            }
+            mz1{
+                "GMT",
+                "1971-10-31 02:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Kaliningrad"{
+            mz0{
+                "Moscow",
+                "1970-01-01 00:00",
+                "1991-03-30 23:00",
+            }
+            mz1{
+                "Europe_Eastern",
+                "1991-03-30 23:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Kiev"{
+            mz0{
+                "Moscow",
+                "1970-01-01 00:00",
+                "1990-06-30 23:00",
+            }
+            mz1{
+                "Europe_Eastern",
+                "1990-06-30 23:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Lisbon"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "1976-09-26 00:00",
+            }
+            mz1{
+                "Europe_Western",
+                "1976-09-26 00:00",
+                "1992-09-27 01:00",
+            }
+            mz2{
+                "Europe_Central",
+                "1992-09-27 01:00",
+                "1996-03-31 01:00",
+            }
+            mz3{
+                "Europe_Western",
+                "1996-03-31 01:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Ljubljana"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:London"{
+            mz0{
+                "British",
+                "1970-01-01 00:00",
+                "1971-10-31 02:00",
+            }
+            mz1{
+                "GMT",
+                "1971-10-31 02:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Luxembourg"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Madrid"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Malta"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Mariehamn"{
+            mz0{
+                "Europe_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Minsk"{
+            mz0{
+                "Moscow",
+                "1970-01-01 00:00",
+                "1991-03-30 23:00",
+            }
+            mz1{
+                "Europe_Eastern",
+                "1991-03-30 23:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Monaco"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Moscow"{
+            mz0{
+                "Moscow",
+                "1970-01-01 00:00",
+                "1991-03-30 23:00",
+            }
+            mz1{
+                "Europe_Eastern",
+                "1991-03-30 23:00",
+                "1992-01-19 00:00",
+            }
+            mz2{
+                "Moscow",
+                "1992-01-19 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Oslo"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Paris"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Podgorica"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Prague"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Riga"{
+            mz0{
+                "Moscow",
+                "1970-01-01 00:00",
+                "1989-03-25 23:00",
+            }
+            mz1{
+                "Europe_Eastern",
+                "1989-03-25 23:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Rome"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Samara"{
+            mz0{
+                "Kuybyshev",
+                "1970-01-01 00:00",
+                "1991-10-20 00:00",
+            }
+            mz1{
+                "Samara",
+                "1991-10-20 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:San_Marino"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Sarajevo"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Simferopol"{
+            mz0{
+                "Moscow",
+                "1970-01-01 00:00",
+                "1990-06-30 23:00",
+            }
+            mz1{
+                "Europe_Eastern",
+                "1990-06-30 23:00",
+                "1994-04-30 21:00",
+            }
+            mz2{
+                "Moscow",
+                "1994-04-30 21:00",
+                "1997-03-30 01:00",
+            }
+            mz3{
+                "Europe_Eastern",
+                "1997-03-30 01:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Skopje"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Sofia"{
+            mz0{
+                "Europe_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Stockholm"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Tallinn"{
+            mz0{
+                "Moscow",
+                "1970-01-01 00:00",
+                "1989-03-25 23:00",
+            }
+            mz1{
+                "Europe_Eastern",
+                "1989-03-25 23:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Tirane"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Uzhgorod"{
+            mz0{
+                "Moscow",
+                "1970-01-01 00:00",
+                "1990-06-30 23:00",
+            }
+            mz1{
+                "Europe_Central",
+                "1990-06-30 23:00",
+                "1991-03-31 02:00",
+            }
+            mz2{
+                "Europe_Eastern",
+                "1991-03-31 02:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Vaduz"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Vatican"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Vienna"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Vilnius"{
+            mz0{
+                "Moscow",
+                "1970-01-01 00:00",
+                "1991-03-30 23:00",
+            }
+            mz1{
+                "Europe_Eastern",
+                "1991-03-30 23:00",
+                "1998-03-29 01:00",
+            }
+            mz2{
+                "Europe_Central",
+                "1998-03-29 01:00",
+                "1999-10-31 01:00",
+            }
+            mz3{
+                "Europe_Eastern",
+                "1999-10-31 01:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Volgograd"{
+            mz0{
+                "Volgograd",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Warsaw"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Zagreb"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Zaporozhye"{
+            mz0{
+                "Moscow",
+                "1970-01-01 00:00",
+                "1991-03-30 23:00",
+            }
+            mz1{
+                "Europe_Eastern",
+                "1991-03-30 23:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Europe:Zurich"{
+            mz0{
+                "Europe_Central",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Indian:Antananarivo"{
+            mz0{
+                "Africa_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Indian:Chagos"{
+            mz0{
+                "Indian_Ocean",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Indian:Christmas"{
+            mz0{
+                "Christmas",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Indian:Cocos"{
+            mz0{
+                "Cocos",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Indian:Comoro"{
+            mz0{
+                "Africa_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Indian:Kerguelen"{
+            mz0{
+                "French_Southern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Indian:Mahe"{
+            mz0{
+                "Seychelles",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Indian:Maldives"{
+            mz0{
+                "Maldives",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Indian:Mauritius"{
+            mz0{
+                "Mauritius",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Indian:Mayotte"{
+            mz0{
+                "Africa_Eastern",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Indian:Reunion"{
+            mz0{
+                "Reunion",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Apia"{
+            mz0{
+                "Bering",
+                "1970-01-01 00:00",
+                "1983-10-30 12:00",
+            }
+            mz1{
+                "Samoa",
+                "1983-10-30 12:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Auckland"{
+            mz0{
+                "New_Zealand",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Chatham"{
+            mz0{
+                "Chatham",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Easter"{
+            mz0{
+                "Easter",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Efate"{
+            mz0{
+                "Vanuatu",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Enderbury"{
+            mz0{
+                "Phoenix_Islands",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Fakaofo"{
+            mz0{
+                "Tokelau",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Fiji"{
+            mz0{
+                "Fiji",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Funafuti"{
+            mz0{
+                "Tuvalu",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Galapagos"{
+            mz0{
+                "Ecuador",
+                "1970-01-01 00:00",
+                "1986-01-01 05:00",
+            }
+            mz1{
+                "Galapagos",
+                "1986-01-01 05:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Gambier"{
+            mz0{
+                "Gambier",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Guadalcanal"{
+            mz0{
+                "Solomon",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Guam"{
+            mz0{
+                "Guam",
+                "1970-01-01 00:00",
+                "2000-12-22 14:00",
+            }
+            mz1{
+                "Chamorro",
+                "2000-12-22 14:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Honolulu"{
+            mz0{
+                "Alaska_Hawaii",
+                "1970-01-01 00:00",
+                "1983-10-30 11:00",
+            }
+            mz1{
+                "Hawaii_Aleutian",
+                "1983-10-30 11:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Johnston"{
+            mz0{
+                "Alaska_Hawaii",
+                "1970-01-01 00:00",
+                "1983-10-30 11:00",
+            }
+            mz1{
+                "Hawaii_Aleutian",
+                "1983-10-30 11:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Kiritimati"{
+            mz0{
+                "Line_Islands",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Kosrae"{
+            mz0{
+                "Kosrae",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Kwajalein"{
+            mz0{
+                "Kwajalein",
+                "1970-01-01 00:00",
+                "1993-08-20 12:00",
+            }
+            mz1{
+                "Marshall_Islands",
+                "1993-08-20 12:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Majuro"{
+            mz0{
+                "Marshall_Islands",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Marquesas"{
+            mz0{
+                "Marquesas",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Midway"{
+            mz0{
+                "Bering",
+                "1970-01-01 00:00",
+                "1983-10-30 12:00",
+            }
+            mz1{
+                "Samoa",
+                "1983-10-30 12:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Nauru"{
+            mz0{
+                "Nauru",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Niue"{
+            mz0{
+                "Niue",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Norfolk"{
+            mz0{
+                "Norfolk",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Noumea"{
+            mz0{
+                "New_Caledonia",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Pago_Pago"{
+            mz0{
+                "Bering",
+                "1970-01-01 00:00",
+                "1983-10-30 12:00",
+            }
+            mz1{
+                "Samoa",
+                "1983-10-30 12:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Palau"{
+            mz0{
+                "Palau",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Pitcairn"{
+            mz0{
+                "Pitcairn",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Ponape"{
+            mz0{
+                "Ponape",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Port_Moresby"{
+            mz0{
+                "Papua_New_Guinea",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Rarotonga"{
+            mz0{
+                "Cook",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Saipan"{
+            mz0{
+                "North_Mariana",
+                "1970-01-01 00:00",
+                "2000-12-22 14:00",
+            }
+            mz1{
+                "Chamorro",
+                "2000-12-22 14:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Tahiti"{
+            mz0{
+                "Tahiti",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Tarawa"{
+            mz0{
+                "Gilbert_Islands",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Tongatapu"{
+            mz0{
+                "Tonga",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Truk"{
+            mz0{
+                "Truk",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Wake"{
+            mz0{
+                "Wake",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+        "Pacific:Wallis"{
+            mz0{
+                "Wallis",
+                "1970-01-01 00:00",
+                "9999-12-31 23:59",
+            }
+        }
+    }
+}

Modified: trunk/source/data/misc/miscfiles.mk
===================================================================
--- trunk/source/data/misc/miscfiles.mk	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/misc/miscfiles.mk	2008-03-24 11:52:37 UTC (rev 144)
@@ -23,4 +23,4 @@
 #
 
 MISC_SOURCE = \
-zoneinfo.txt supplementalData.txt
+zoneinfo.txt supplementalData.txt metazoneInfo.txt

Modified: trunk/source/data/misc/supplementalData.txt
===================================================================
--- trunk/source/data/misc/supplementalData.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/misc/supplementalData.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -516,6 +516,26 @@
                 }
             }
         }
+        BL{
+            {
+                id{"EUR"}
+                from:intvector{ /** 1999-01-01  */
+                    213,
+                    320825952,
+                }
+            }
+            {
+                id{"FRF"}
+                from:intvector{ /** 1960-01-01  */
+                    -74,
+                    -2086527392,
+                }
+                to:intvector{ /** 2002-02-17  */
+                    235,
+                    1908405440,
+                }
+            }
+        }
         BM{
             {
                 id{"BMD"}
@@ -654,6 +674,19 @@
                 }
             }
         }
+        BU{
+            {
+                id{"BUK"}
+                from:intvector{ /** 1952-07-01  */
+                    -133,
+                    -1143896928,
+                }
+                to:intvector{ /** 1989-06-18  */
+                    139,
+                    -210261440,
+                }
+            }
+        }
         BV{
             {
                 id{"NOK"}
@@ -875,10 +908,10 @@
         }
         CS{
             {
-                id{"EUR"}
-                from:intvector{ /** 2003-02-04  */
-                    242,
-                    -2038532928,
+                id{"CSD"}
+                from:intvector{ /** 2002-05-15  */
+                    235,
+                    1735785440,
                 }
                 to:intvector{ /** 2006-06-03  */
                     264,
@@ -886,10 +919,10 @@
                 }
             }
             {
-                id{"CSD"}
-                from:intvector{ /** 2002-05-15  */
-                    235,
-                    1735785440,
+                id{"EUR"}
+                from:intvector{ /** 2003-02-04  */
+                    242,
+                    -2038532928,
                 }
                 to:intvector{ /** 2006-06-03  */
                     264,
@@ -971,9 +1004,9 @@
                     -412,
                     -1215901344,
                 }
-                to:intvector{ /** 2008-02-01  */
+                to:intvector{ /** 2008-01-31  */
                     279,
-                    849844416,
+                    -853182880,
                 }
             }
         }
@@ -997,6 +1030,19 @@
                 }
             }
         }
+        DD{
+            {
+                id{"DDM"}
+                from:intvector{ /** 1948-07-20  */
+                    -162,
+                    -1178645344,
+                }
+                to:intvector{ /** 1990-10-02  */
+                    146,
+                    -121192512,
+                }
+            }
+        }
         DE{
             {
                 id{"EUR"}
@@ -1424,9 +1470,9 @@
         GP{
             {
                 id{"EUR"}
-                from:intvector{ /** 1999  */
+                from:intvector{ /** 1999-01-01  */
                     213,
-                    320765952,
+                    320825952,
                 }
             }
             {
@@ -2210,6 +2256,26 @@
                 }
             }
         }
+        MF{
+            {
+                id{"EUR"}
+                from:intvector{ /** 1999-01-01  */
+                    213,
+                    320825952,
+                }
+            }
+            {
+                id{"FRF"}
+                from:intvector{ /** 1960-01-01  */
+                    -74,
+                    -2086527392,
+                }
+                to:intvector{ /** 2002-02-17  */
+                    235,
+                    1908405440,
+                }
+            }
+        }
         MG{
             {
                 id{"MGA"}
@@ -2389,9 +2455,9 @@
                     -15,
                     1784869440,
                 }
-                to:intvector{ /** 2008-02-01  */
+                to:intvector{ /** 2008-01-31  */
                     279,
-                    849844416,
+                    -853182880,
                 }
             }
             {
@@ -2920,6 +2986,15 @@
                 }
             }
         }
+        QU{
+            {
+                id{"EUR"}
+                from:intvector{ /** 1999-01-01  */
+                    213,
+                    320825952,
+                }
+            }
+        }
         RE{
             {
                 id{"EUR"}
@@ -3061,9 +3136,9 @@
         SD{
             {
                 id{"SDG"}
-                from:intvector{ /** 2007-01-09  */
+                from:intvector{ /** 2007-01-10  */
                     272,
-                    69755488,
+                    156155488,
                 }
             }
             {
@@ -3296,6 +3371,19 @@
                 }
             }
         }
+        SU{
+            {
+                id{"SUR"}
+                from:intvector{ /** 1961-01-01  */
+                    -67,
+                    -528898464,
+                }
+                to:intvector{ /** 1991-12-25  */
+                    154,
+                    -957610880,
+                }
+            }
+        }
         SV{
             {
                 id{"SVC"}
@@ -3495,6 +3583,30 @@
                 }
             }
         }
+        TP{
+            {
+                id{"TPE"}
+                from:intvector{ /** 1959-01-02  */
+                    -81,
+                    823610976,
+                }
+                to:intvector{ /** 2002-05-20  */
+                    235,
+                    -2127181856,
+                }
+            }
+            {
+                id{"IDR"}
+                from:intvector{ /** 1975-12-07  */
+                    36,
+                    -628269952,
+                }
+                to:intvector{ /** 2002-05-20  */
+                    235,
+                    -2127181856,
+                }
+            }
+        }
         TR{
             {
                 id{"TRY"}
@@ -3814,6 +3926,41 @@
                 }
             }
         }
+        YU{
+            {
+                id{"YUM"}
+                from:intvector{ /** 1994-01-24  */
+                    176,
+                    -839551392,
+                }
+                to:intvector{ /** 2002-05-15  */
+                    235,
+                    1735785440,
+                }
+            }
+            {
+                id{"YUN"}
+                from:intvector{ /** 1990-01-01  */
+                    146,
+                    -208132512,
+                }
+                to:intvector{ /** 1992-07-24  */
+                    162,
+                    426918048,
+                }
+            }
+            {
+                id{"YUD"}
+                from:intvector{ /** 1966-01-01  */
+                    -30,
+                    -1676288416,
+                }
+                to:intvector{ /** 1990-01-01  */
+                    146,
+                    -208132512,
+                }
+            }
+        }
         ZA{
             {
                 id{"ZAR"}
@@ -3832,6 +3979,30 @@
                 }
             }
         }
+        ZR{
+            {
+                id{"ZRN"}
+                from:intvector{ /** 1993-11-01  */
+                    168,
+                    -2413024,
+                }
+                to:intvector{ /** 1998-07  */
+                    205,
+                    -1150042976,
+                }
+            }
+            {
+                id{"ZRZ"}
+                from:intvector{ /** 1971-10-27  */
+                    7,
+                    -576738368,
+                }
+                to:intvector{ /** 1993-11-01  */
+                    168,
+                    -2413024,
+                }
+            }
+        }
         ZW{
             {
                 id{"ZWD"}
@@ -4258,13 +4429,6 @@
                 }
             }
         }
-        auv{
-            secondary{
-                territories{
-                    "FR",
-                }
-            }
-        }
         av{
             primary{
                 scripts{
@@ -4998,6 +5162,13 @@
                 }
             }
         }
+        dsb{
+            primary{
+                scripts{
+                    "Latn",
+                }
+            }
+        }
         dv{
             primary{
                 scripts{
@@ -5361,6 +5532,7 @@
                     "BF",
                     "BI",
                     "BJ",
+                    "BL",
                     "CA",
                     "CD",
                     "CF",
@@ -5381,6 +5553,7 @@
                     "LU",
                     "MA",
                     "MC",
+                    "MF",
                     "MG",
                     "ML",
                     "MQ",
@@ -5409,6 +5582,20 @@
                 }
             }
         }
+        frr{
+            primary{
+                scripts{
+                    "Latn",
+                }
+            }
+        }
+        frs{
+            primary{
+                scripts{
+                    "Latn",
+                }
+            }
+        }
         fud{
             secondary{
                 territories{
@@ -5833,6 +6020,13 @@
                 }
             }
         }
+        hsb{
+            primary{
+                scripts{
+                    "Latn",
+                }
+            }
+        }
         ht{
             primary{
                 scripts{
@@ -6136,6 +6330,13 @@
                 }
             }
         }
+        kg{
+            secondary{
+                territories{
+                    "CD",
+                }
+            }
+        }
         kha{
             primary{
                 scripts{
@@ -6275,7 +6476,7 @@
         ko{
             primary{
                 scripts{
-                    "Hang",
+                    "Kore",
                 }
                 territories{
                     "KP",
@@ -6312,13 +6513,6 @@
                 }
             }
         }
-        kon{
-            secondary{
-                territories{
-                    "CD",
-                }
-            }
-        }
         kos{
             primary{
                 scripts{
@@ -7128,6 +7322,13 @@
                 }
             }
         }
+        nds{
+            primary{
+                scripts{
+                    "Latn",
+                }
+            }
+        }
         ne{
             primary{
                 scripts{
@@ -7307,6 +7508,11 @@
                     "Latn",
                 }
             }
+            secondary{
+                territories{
+                    "FR",
+                }
+            }
         }
         om{
             primary{
@@ -8864,6 +9070,13 @@
                 }
             }
         }
+        zbl{
+            primary{
+                scripts{
+                    "Blis",
+                }
+            }
+        }
         zh{
             primary{
                 scripts{
@@ -8925,8 +9138,8 @@
             "meta:Africa_Eastern_TZ"{"Africa/Dar_es_Salaam"}
             "meta:Africa_Eastern_UG"{"Africa/Kampala"}
             "meta:Africa_Eastern_YT"{"Indian/Mayotte"}
-            "meta:Africa_FarWestern_001"{"Africa/Bissau"}
-            "meta:Africa_FarWestern_EH"{"Africa/El_Aaiun"}
+            "meta:Africa_FarWestern_001"{"Africa/El_Aaiun"}
+            "meta:Africa_FarWestern_GW"{"Africa/Bissau"}
             "meta:Africa_Southern_001"{"Africa/Johannesburg"}
             "meta:Africa_Southern_LS"{"Africa/Maseru"}
             "meta:Africa_Southern_SZ"{"Africa/Mbabane"}
@@ -8939,11 +9152,10 @@
             "meta:Africa_Western_CM"{"Africa/Douala"}
             "meta:Africa_Western_GA"{"Africa/Libreville"}
             "meta:Africa_Western_GQ"{"Africa/Malabo"}
-            "meta:Africa_Western_NA"{"Africa/Windhoek"}
             "meta:Africa_Western_NE"{"Africa/Niamey"}
             "meta:Africa_Western_TD"{"Africa/Ndjamena"}
             "meta:Aktyubinsk_001"{"Asia/Aqtobe"}
-            "meta:Alaska_001"{"America/Anchorage"}
+            "meta:Alaska_001"{"America/Juneau"}
             "meta:Alaska_Hawaii_001"{"America/Anchorage"}
             "meta:Almaty_001"{"Asia/Almaty"}
             "meta:Amazon_001"{"America/Manaus"}
@@ -8980,7 +9192,7 @@
             "meta:Arabian_QA"{"Asia/Qatar"}
             "meta:Arabian_YE"{"Asia/Aden"}
             "meta:Argentina_001"{"America/Buenos_Aires"}
-            "meta:Argentina_Western_001"{"America/Catamarca"}
+            "meta:Argentina_Western_001"{"America/Mendoza"}
             "meta:Armenia_001"{"Asia/Yerevan"}
             "meta:Ashkhabad_001"{"Asia/Ashgabat"}
             "meta:Atlantic_001"{"America/Halifax"}
@@ -9017,6 +9229,7 @@
             "meta:Bolivia_001"{"America/La_Paz"}
             "meta:Borneo_001"{"Asia/Kuching"}
             "meta:Brasilia_001"{"America/Sao_Paulo"}
+            "meta:British_001"{"Europe/London"}
             "meta:Brunei_001"{"Asia/Brunei"}
             "meta:Cape_Verde_001"{"Atlantic/Cape_Verde"}
             "meta:Chamorro_001"{"Pacific/Saipan"}
@@ -9036,6 +9249,7 @@
             "meta:Cuba_001"{"America/Havana"}
             "meta:Dacca_001"{"Asia/Dhaka"}
             "meta:Davis_001"{"Antarctica/Davis"}
+            "meta:Dominican_001"{"America/Santo_Domingo"}
             "meta:DumontDUrville_001"{"Antarctica/DumontDUrville"}
             "meta:Dushanbe_001"{"Asia/Dushanbe"}
             "meta:Dutch_Guiana_001"{"America/Paramaribo"}
@@ -9089,9 +9303,8 @@
             "meta:Europe_Eastern_PS"{"Asia/Gaza"}
             "meta:Europe_Eastern_RU"{"Europe/Kaliningrad"}
             "meta:Europe_Eastern_SY"{"Asia/Damascus"}
-            "meta:Europe_Eastern_TR"{"Europe/Istanbul"}
             "meta:Europe_Eastern_UA"{"Europe/Kiev"}
-            "meta:Europe_Western_001"{"Europe/Lisbon"}
+            "meta:Europe_Western_001"{"Atlantic/Canary"}
             "meta:Europe_Western_EH"{"Africa/El_Aaiun"}
             "meta:Europe_Western_FO"{"Atlantic/Faeroe"}
             "meta:Europe_Western_MA"{"Africa/Casablanca"}
@@ -9100,7 +9313,7 @@
             "meta:French_Guiana_001"{"America/Cayenne"}
             "meta:French_Southern_001"{"Indian/Kerguelen"}
             "meta:Frunze_001"{"Asia/Bishkek"}
-            "meta:GMT_001"{"Etc/GMT"}
+            "meta:GMT_001"{"Atlantic/Reykjavik"}
             "meta:GMT_BF"{"Africa/Ouagadougou"}
             "meta:GMT_CI"{"Africa/Abidjan"}
             "meta:GMT_GB"{"Europe/London"}
@@ -9110,7 +9323,6 @@
             "meta:GMT_GN"{"Africa/Conakry"}
             "meta:GMT_GW"{"Africa/Bissau"}
             "meta:GMT_IE"{"Europe/Dublin"}
-            "meta:GMT_IS"{"Atlantic/Reykjavik"}
             "meta:GMT_LR"{"Africa/Monrovia"}
             "meta:GMT_ML"{"Africa/Bamako"}
             "meta:GMT_MR"{"Africa/Nouakchott"}
@@ -9123,6 +9335,7 @@
             "meta:Gambier_001"{"Pacific/Gambier"}
             "meta:Georgia_001"{"Asia/Tbilisi"}
             "meta:Gilbert_Islands_001"{"Pacific/Tarawa"}
+            "meta:Goose_Bay_001"{"America/Goose_Bay"}
             "meta:Greenland_Central_001"{"America/Scoresbysund"}
             "meta:Greenland_Eastern_001"{"America/Scoresbysund"}
             "meta:Greenland_Western_001"{"America/Godthab"}
@@ -9130,8 +9343,7 @@
             "meta:Gulf_001"{"Asia/Dubai"}
             "meta:Gulf_OM"{"Asia/Muscat"}
             "meta:Guyana_001"{"America/Guyana"}
-            "meta:Hawaii_001"{"Pacific/Honolulu"}
-            "meta:Hawaii_Aleutian_001"{"America/Adak"}
+            "meta:Hawaii_Aleutian_001"{"Pacific/Honolulu"}
             "meta:Hong_Kong_001"{"Asia/Hong_Kong"}
             "meta:Hovd_001"{"Asia/Hovd"}
             "meta:India_001"{"Asia/Calcutta"}
@@ -9145,6 +9357,7 @@
             "meta:Indonesia_Eastern_001"{"Asia/Jayapura"}
             "meta:Indonesia_Western_001"{"Asia/Jakarta"}
             "meta:Iran_001"{"Asia/Tehran"}
+            "meta:Irish_001"{"Europe/Dublin"}
             "meta:Irkutsk_001"{"Asia/Irkutsk"}
             "meta:Israel_001"{"Asia/Jerusalem"}
             "meta:Japan_001"{"Asia/Tokyo"}
@@ -9152,7 +9365,7 @@
             "meta:Karachi_001"{"Asia/Karachi"}
             "meta:Kashgar_001"{"Asia/Kashgar"}
             "meta:Kazakhstan_Eastern_001"{"Asia/Almaty"}
-            "meta:Kazakhstan_Western_001"{"Asia/Aqtau"}
+            "meta:Kazakhstan_Western_001"{"Asia/Aqtobe"}
             "meta:Kizilorda_001"{"Asia/Qyzylorda"}
             "meta:Korea_001"{"Asia/Seoul"}
             "meta:Korea_KP"{"Asia/Pyongyang"}
@@ -9162,13 +9375,14 @@
             "meta:Kwajalein_001"{"Pacific/Kwajalein"}
             "meta:Kyrgystan_001"{"Asia/Bishkek"}
             "meta:Lanka_001"{"Asia/Colombo"}
+            "meta:Liberia_001"{"Africa/Monrovia"}
             "meta:Line_Islands_001"{"Pacific/Kiritimati"}
             "meta:Long_Shu_001"{"Asia/Chongqing"}
             "meta:Lord_Howe_001"{"Australia/Lord_Howe"}
             "meta:Macau_001"{"Asia/Macau"}
             "meta:Magadan_001"{"Asia/Magadan"}
             "meta:Malaya_001"{"Asia/Kuala_Lumpur"}
-            "meta:Malaysia_001"{"Asia/Kuala_Lumpur"}
+            "meta:Malaysia_001"{"Asia/Kuching"}
             "meta:Maldives_001"{"Indian/Maldives"}
             "meta:Marquesas_001"{"Pacific/Marquesas"}
             "meta:Marshall_Islands_001"{"Pacific/Majuro"}
@@ -9189,6 +9403,7 @@
             "meta:North_Mariana_001"{"Pacific/Saipan"}
             "meta:Novosibirsk_001"{"Asia/Novosibirsk"}
             "meta:Omsk_001"{"Asia/Omsk"}
+            "meta:Oral_001"{"Asia/Oral"}
             "meta:Pakistan_001"{"Asia/Karachi"}
             "meta:Palau_001"{"Pacific/Palau"}
             "meta:Papua_New_Guinea_001"{"Pacific/Port_Moresby"}
@@ -9238,7 +9453,7 @@
             "meta:Yakutsk_001"{"Asia/Yakutsk"}
             "meta:Yekaterinburg_001"{"Asia/Yekaterinburg"}
             "meta:Yerevan_001"{"Asia/Yerevan"}
-            "meta:Yukon_001"{"America/Dawson"}
+            "meta:Yukon_001"{"America/Yakutat"}
         }
         windows{
             "Africa:Cairo"{"Egypt"}
@@ -9252,7 +9467,7 @@
             "America:Buenos_Aires"{"SA Eastern"}
             "America:Caracas"{"SA Western"}
             "America:Chicago"{"Central"}
-            "America:Chihuahua"{"Mountain Standard Time (Mexico)"}
+            "America:Chihuahua"{"Mexico Standard Time 2"}
             "America:Denver"{"Mountain"}
             "America:Godthab"{"Greenland"}
             "America:Guatemala"{"Central America"}
@@ -9260,7 +9475,7 @@
             "America:Indianapolis"{"US Eastern"}
             "America:Los_Angeles"{"Pacific"}
             "America:Manaus"{"Central Brazilian"}
-            "America:Mexico_City"{"Central Standard Time (Mexico)"}
+            "America:Mexico_City"{"Mexico"}
             "America:Montevideo"{"Montevideo"}
             "America:New_York"{"Eastern"}
             "America:Noronha"{"Mid-Atlantic"}
@@ -9468,6 +9683,7 @@
             "AN",
             "AW",
             "BB",
+            "BL",
             "BS",
             "CU",
             "DM",
@@ -9479,6 +9695,7 @@
             "KN",
             "KY",
             "LC",
+            "MF",
             "MQ",
             "MS",
             "PR",
@@ -10138,6 +10355,9 @@
         "America:Indiana:Petersburg"{
             territory{"US"}
         }
+        "America:Indiana:Tell_City"{
+            territory{"US"}
+        }
         "America:Indiana:Vevay"{
             territory{"US"}
         }
@@ -10335,6 +10555,9 @@
                 "Canada/Saskatchewan",
             }
         }
+        "America:Resolute"{
+            territory{"CA"}
+        }
         "America:Rio_Branco"{
             territory{"BR"}
             aliases{

Modified: trunk/source/data/misc/zoneinfo.txt
===================================================================
--- trunk/source/data/misc/zoneinfo.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/data/misc/zoneinfo.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -3,9 +3,9 @@
 // Corporation and others.  All Rights Reserved.
 //---------------------------------------------------------
 // Build tool: tz2icu
-// Build date: Mon Aug 20 12:23:13 2007
+// Build date: Mon Dec  3 08:17:10 2007
 // Olson source: ftp://elsie.nci.nih.gov/pub/
-// Olson version: 2007g
+// Olson version: 2007j
 // ICU version: 3.8
 //---------------------------------------------------------
 // >> !!! >>   THIS IS A MACHINE-GENERATED FILE   << !!! <<
@@ -13,10 +13,10 @@
 //---------------------------------------------------------
 
 zoneinfo:table(nofallback) {
- TZVersion { "2007g" }
+ TZVersion { "2007j" }
  Zones:array { 
-  /* ACT */ :int { 323 } //Z#0
-,  /* AET */ :int { 335 } //Z#1
+  /* ACT */ :int { 325 } //Z#0
+,  /* AET */ :int { 337 } //Z#1
 ,  /* AGT */ :int { 63 } //Z#2
 ,  /* ART */ :int { 18 } //Z#3
 ,  /* AST */ :int { 59 } //Z#4
@@ -34,7 +34,7 @@
     :intvector { -2147483648, -1062210920 }
     :intvector { 9320, 0, 10800, 0 }
     :bin { "0001" }
-    :intvector { 7, 364 }
+    :intvector { 7, 366 }
   } //Z#7
 ,  /* Africa/Algiers */ :array {
     :intvector { -2147483648, -1855958961, -1689814800, -1680397200, -1665363600, -1648342800, -1635123600, -1616893200, -1604278800, -1585443600, -1574038800, -1552266000, -1539997200, -1531443600, -956365200, -950486400, -942012000, -812502000, -796262400, -781052400, -766630800, -733280400, -439430400, -212029200, 41468400, 54774000, 231724800, 246236400, 259545600, 275274000, 309740400, 325468800, 341802000, 357523200 }
@@ -85,12 +85,12 @@
     :bin { "00" }
   } //Z#17
 ,  /* Africa/Cairo */ :array {
-    :intvector { -2147483648, -929844000, -923108400, -906170400, -892868400, -875844000, -857790000, -844308000, -825822000, -812685600, -794199600, -779853600, -762663600, -399088800, -386650800, -368330400, -355114800, -336790800, -323654400, -305168400, -292032000, -273632400, -260496000, -242096400, -228960000, -210560400, -197424000, -178938000, -165801600, -147402000, -134265600, -115866000, -102643200, -84330000, -71107200, -52707600, -39484800, -21171600, -7948800, 10364400, 23587200, 41900400, 55123200, 73522800, 86745600, 105058800, 118281600, 136594800, 149817600, 168130800, 181353600, 199753200, 212976000, 231289200, 244512000, 262825200, 276048000, 294361200, 307584000, 325983600, 339206400, 357519600, 370742400, 396399600, 402278400, 426812400, 433814400, 452214000, 465436800, 483750000, 496972800, 515286000, 528508800, 546822000, 560044800, 578444400, 591667200, 610412400, 623203200, 641516400, 654739200, 673052400, 686275200, 704674800, 717897600, 736210800, 749433600, 767746800, 780969600, 799020000, 812322000, 830469600, 843771600, 861919200, 875221200, 893368800, 906670800, 925423200, 938725200, 956872800, 970174800, 988322400, 1001624400, 1019772000, 1033074000, 1051221600, 1064523600, 1083276000, 1096578000, 1114725600, 1128027600, 1146175200, 1158872400, 1177624800, 1189112400 }
+    :intvector { -2147483648, -929844000, -923108400, -906170400, -892868400, -875844000, -857790000, -844308000, -825822000, -812685600, -794199600, -779853600, -762663600, -399088800, -386650800, -368330400, -355114800, -336790800, -323654400, -305168400, -292032000, -273632400, -260496000, -242096400, -228960000, -210560400, -197424000, -178938000, -165801600, -147402000, -134265600, -115866000, -102643200, -84330000, -71107200, -52707600, -39484800, -21171600, -7948800, 10364400, 23587200, 41900400, 55123200, 73522800, 86745600, 105058800, 118281600, 136594800, 149817600, 168130800, 181353600, 199753200, 212976000, 231289200, 244512000, 262825200, 276048000, 294361200, 307584000, 325983600, 339206400, 357519600, 370742400, 396399600, 402278400, 426812400, 433814400, 452214000, 465436800, 483750000, 496972800, 515286000, 528508800, 546822000, 560044800, 578444400, 591667200, 610412400, 623203200, 641516400, 654739200, 673052400, 686275200, 704674800, 717897600, 736210800, 749433600, 767746800, 780969600, 799020000, 812322000, 830469600, 843771600, 861919200, 875221200, 893368800, 906670800, 925423200, 938725200, 956872800, 970174800, 988322400, 1001624400, 1019772000, 1033074000, 1051221600, 1064523600, 1083276000, 1096578000, 1114725600, 1128027600, 1146175200, 1158872400, 1177624800, 1189112400, 1209074400, 1219957200 }
     :intvector { 7200, 0, 7200, 3600 }
-    :bin { "00010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
+    :bin { "000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "Egypt"
-    :intvector { 7200, 2008 }
-    :intvector { 3, 18, 369 }
+    :intvector { 7200, 2009 }
+    :intvector { 3, 18, 371 }
   } //Z#18
 ,  /* Africa/Casablanca */ :array {
     :intvector { -2147483648, -1773012580, -956361600, -950490000, -942019200, -761187600, -617241600, -605149200, -81432000, -71110800, 141264000, 147222000, 199756800, 207702000, 231292800, 244249200, 265507200, 271033200, 448243200, 504918000 }
@@ -148,7 +148,7 @@
     :intvector { -2147483648, -2109290652 }
     :intvector { 7200, 0, 7452, 0 }
     :bin { "0100" }
-    :intvector { 29, 346 }
+    :intvector { 29, 348 }
   } //Z#29
 ,  /* Africa/Johannesburg */ :array {
     :intvector { -2147483648, -2109288600, -860976000, -845254800, -829526400, -813805200 }
@@ -275,7 +275,7 @@
     :intvector { -2147483648, -1577926364, -574902000, -568087200, -512175600, -504928800, -449888400, -441856800, -347158800, 378684000, 386463600, 402271200, 417999600, 433807200, 449622000, 465429600, 481590000, 496965600, 512953200, 528674400, 544230000, 560037600, 575852400, 591660000, 607388400, 623196000, 641775600, 844034400, 860108400, 875916000 }
     :intvector { 3164, 0, 3600, 0, 3600, 3600, 7200, 0 }
     :bin { "000102010201020103010201020102010201020102010201020103010203" }
-    :intvector { 55, 495 }
+    :intvector { 55, 497 }
   } //Z#55
 ,  /* Africa/Tunis */ :array {
     :intvector { -2147483648, -1855958961, -969242400, -950493600, -941940000, -891136800, -877827600, -857257200, -844556400, -842918400, -842223600, -828230400, -812502000, -796269600, -781052400, -766634400, 231202800, 243903600, 262825200, 276044400, 581122800, 591145200, 606870000, 622594800, 641516400, 654649200, 1114902000, 1128038400, 1143334800, 1162083600 }
@@ -297,7 +297,7 @@
     :bin { "000101000001000100010001000100010001000100010001000100010001000100010202030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" }
     "US"
     :intvector { -36000, 2008 }
-    :intvector { 58, 77, 579 }
+    :intvector { 58, 77, 581 }
   } //Z#58
 ,  /* America/Anchorage */ :array {
     :intvector { -2147483648, -880200000, -769395600, -765378000, -86882400, -21470400, -5749200, 9979200, 25700400, 41428800, 57754800, 73483200, 89204400, 104932800, 120654000, 126705600, 152103600, 162388800, 183553200, 199281600, 215607600, 230731200, 247057200, 262785600, 278506800, 294235200, 309956400, 325684800, 341406000, 357134400, 372855600, 388584000, 404910000, 420033600, 436359600, 439030800, 452084400, 467805600, 483534000, 499255200, 514983600, 530704800, 544618800, 562154400, 576068400, 594208800, 607518000, 625658400, 638967600, 657108000, 671022000, 688557600, 702471600, 720007200, 733921200, 752061600, 765370800, 783511200, 796820400, 814960800, 828874800, 846410400, 860324400, 877860000, 891774000, 909309600, 923223600, 941364000, 954673200, 972813600, 986122800, 1004263200, 1018177200, 1035712800, 1049626800, 1067162400, 1081076400, 1099216800, 1112526000, 1130666400, 1143975600, 1162116000, 1173610800, 1194170400 }
@@ -305,7 +305,7 @@
     :bin { "000101000001000100010001000100010001000100010001000100010001000100010202030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" }
     "US"
     :intvector { -32400, 2008 }
-    :intvector { 4, 59, 575, 578 }
+    :intvector { 4, 59, 577, 580 }
   } //Z#59
 ,  /* America/Anguilla */ :array {
     :intvector { -2147483648, -1825098464 }
@@ -339,7 +339,7 @@
     :intvector { -2147483648, -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667965600, 687931200, 699415200, 719377200, 731469600, 938919600, 952052400 }
     :intvector { -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 }
     :bin { "000102010201020102010201020102010201020102010201020102010201020102010201020102010201030403040304030401040304030203" }
-    :intvector { 66, 97, 183 }
+    :intvector { 66, 97, 184 }
   } //Z#66
 ,  /* America/Argentina/Jujuy */ :array {
     :intvector { -2147483648, -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 657086400, 669178800, 686721600, 699415200, 719377200, 731469600, 938919600, 952052400 }
@@ -356,7 +356,7 @@
     :intvector { -2147483648, -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 655963200, 667796400, 687499200, 699418800, 719380800, 731469600, 938919600, 952052400, 1085281200, 1096171200 }
     :intvector { -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 }
     :bin { "0001020102010201020102010201020102010201020102010201020102010201020102010201020102010304030403040102010201040302030103" }
-    :intvector { 69, 151 }
+    :intvector { 69, 152 }
   } //Z#69
 ,  /* America/Argentina/Rio_Gallegos */ :array {
     :intvector { -2147483648, -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667965600, 687927600, 699415200, 719377200, 731469600, 938919600, 952052400, 1086058800, 1087704000 }
@@ -448,11 +448,11 @@
     :intvector { -25200, 2008 }
   } //Z#87
 ,  /* America/Campo_Grande */ :array {
-    :intvector { -2147483648, -1767212492, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200, 592977600, 602046000, 624427200, 634705200, 656481600, 666759600, 687931200, 697604400, 719985600, 728449200, 750830400, 761713200, 782280000, 793162800, 813729600, 824007600, 844574400, 856062000, 876110400, 888721200, 908078400, 919566000, 938923200, 951620400, 970977600, 982465200, 1003032000, 1013914800, 1036296000, 1045364400, 1066536000, 1076814000, 1099368000, 1108868400, 1129435200, 1140318000, 1162699200, 1172372400, 1194148800 }
+    :intvector { -2147483648, -1767212492, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200, 592977600, 602046000, 624427200, 634705200, 656481600, 666759600, 687931200, 697604400, 719985600, 728449200, 750830400, 761713200, 782280000, 793162800, 813729600, 824007600, 844574400, 856062000, 876110400, 888721200, 908078400, 919566000, 938923200, 951620400, 970977600, 982465200, 1003032000, 1013914800, 1036296000, 1045364400, 1066536000, 1076814000, 1099368000, 1108868400, 1129435200, 1140318000, 1162699200, 1172372400, 1192334400, 1203217200, 1223784000 }
     :intvector { -14400, 0, -14400, 3600, -13108, 0 }
-    :bin { "020001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001" }
+    :bin { "0200010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001" }
     "Brazil"
-    :intvector { -14400, 2008 }
+    :intvector { -14400, 2009 }
   } //Z#88
 ,  /* America/Cancun */ :array {
     :intvector { -2147483648, -1514743200, 377935200, 828860400, 846396000, 860310000, 877845600, 891759600, 902037600, 909298800, 923212800, 941353200, 954662400, 972802800, 989136000, 1001833200, 1018166400, 1035702000 }
@@ -462,9 +462,9 @@
     :intvector { -21600, 2003 }
   } //Z#89
 ,  /* America/Caracas */ :array {
-    :intvector { -2147483648, -1826739140, -157750200 }
+    :intvector { -2147483648, -1826739140, -157750200, 1197183600 }
     :intvector { -16200, 0, -16060, 0, -14400, 0 }
-    :bin { "010002" }
+    :bin { "01000200" }
   } //Z#90
 ,  /* America/Catamarca */ :int { 64 } //Z#91
 ,  /* America/Cayenne */ :array {
@@ -483,7 +483,7 @@
     :bin { "0001000100010001000100010001000100010001000100010001000100010001000100010002000100010001000100010001010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "US"
     :intvector { -21600, 2008 }
-    :intvector { 94, 349, 566, 581 }
+    :intvector { 94, 351, 568, 583 }
   } //Z#94
 ,  /* America/Chihuahua */ :array {
     :intvector { -2147483648, -1514739600, -1343066400, -1234807200, -1220292000, -1207159200, -1191344400, 828864000, 846399600, 860313600, 877849200, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 989139600, 1001836800, 1018170000, 1035705600 }
@@ -500,11 +500,11 @@
     :bin { "02000100010001000100" }
   } //Z#98
 ,  /* America/Cuiaba */ :array {
-    :intvector { -2147483648, -1767212140, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200, 592977600, 602046000, 624427200, 634705200, 656481600, 666759600, 687931200, 697604400, 719985600, 728449200, 750830400, 761713200, 782280000, 793162800, 813729600, 824007600, 844574400, 856062000, 876110400, 888721200, 908078400, 919566000, 938923200, 951620400, 970977600, 982465200, 1003032000, 1013914800, 1036296000, 1045364400, 1099368000, 1108868400, 1129435200, 1140318000, 1162699200, 1172372400, 1194148800 }
+    :intvector { -2147483648, -1767212140, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200, 592977600, 602046000, 624427200, 634705200, 656481600, 666759600, 687931200, 697604400, 719985600, 728449200, 750830400, 761713200, 782280000, 793162800, 813729600, 824007600, 844574400, 856062000, 876110400, 888721200, 908078400, 919566000, 938923200, 951620400, 970977600, 982465200, 1003032000, 1013914800, 1036296000, 1045364400, 1099368000, 1108868400, 1129435200, 1140318000, 1162699200, 1172372400, 1192334400, 1203217200, 1223784000 }
     :intvector { -14400, 0, -14400, 3600, -13460, 0 }
-    :bin { "02000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001" }
+    :bin { "020001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001" }
     "Brazil"
-    :intvector { -14400, 2008 }
+    :intvector { -14400, 2009 }
   } //Z#99
 ,  /* America/Curacao */ :array {
     :intvector { -2147483648, -1826738656, -157750200 }
@@ -534,7 +534,7 @@
     :bin { "0001000100010001000101000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "US"
     :intvector { -25200, 2008 }
-    :intvector { 104, 188, 510, 571, 587 }
+    :intvector { 104, 189, 512, 573, 589 }
   } //Z#104
 ,  /* America/Detroit */ :array {
     :intvector { -2147483648, -2051202469, -1724083200, -880218000, -769395600, -765396000, -684349200, -671047200, -80499600, -68666400, 104914800, 120636000, 126687600, 152085600, 167814000, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 }
@@ -542,7 +542,7 @@
     :bin { "0100020303020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" }
     "US"
     :intvector { -18000, 2008 }
-    :intvector { 105, 586 }
+    :intvector { 105, 588 }
   } //Z#105
 ,  /* America/Dominica */ :array {
     :intvector { -2147483648, -1846266804 }
@@ -555,7 +555,7 @@
     :bin { "0001020102010201020102010201020201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" }
     "Canada"
     :intvector { -25200, 2008 }
-    :intvector { 107, 356 }
+    :intvector { 107, 358 }
   } //Z#107
 ,  /* America/Eirunepe */ :array {
     :intvector { -2147483648, -1767208832, -1206950400, -1191355200, -1175367600, -1159819200, -633812400, -622062000, -602276400, -591825600, -570740400, -560203200, -539118000, -531345600, -191358000, -184190400, -155156400, -150062400, -128890800, -121118400, -99946800, -89582400, -68410800, -57960000, 499755600, 511243200, 530600400, 540273600, 562136400, 571204800, 750834000, 761716800 }
@@ -567,7 +567,7 @@
     :intvector { -21600, 0, -21600, 3600, -21408, 0 }
     :bin { "020001000100" }
   } //Z#109
-,  /* America/Ensenada */ :int { 198 } //Z#110
+,  /* America/Ensenada */ :int { 200 } //Z#110
 ,  /* America/Fort_Wayne */ :int { 125 } //Z#111
 ,  /* America/Fortaleza */ :array {
     :intvector { -2147483648, -1767216360, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 938919600, 951616800, 970974000, 972180000, 1003028400, 1013911200 }
@@ -611,6 +611,7 @@
     :intvector { -2147483648, -1848254032 }
     :intvector { -14768, 0, -14400, 0 }
     :bin { "0001" }
+    :intvector { 118, 149, 190 }
   } //Z#118
 ,  /* America/Guatemala */ :array {
     :intvector { -2147483648, -1617040676, 123055200, 130914000, 422344800, 433054800, 669708000, 684219600, 1146376800, 1159678800 }
@@ -633,15 +634,15 @@
     :bin { "00010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010202010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" }
     "Canada"
     :intvector { -14400, 2008 }
-    :intvector { 122, 352, 564 }
+    :intvector { 122, 354, 566 }
   } //Z#122
 ,  /* America/Havana */ :array {
-    :intvector { -2147483648, -1402813824, -1311534000, -1300996800, -933534000, -925675200, -902084400, -893620800, -870030000, -862171200, -775681200, -767822400, -744231600, -736372800, -144702000, -134251200, -113425200, -102542400, -86295600, -72907200, -54154800, -41457600, -21495600, -5774400, 9954000, 25675200, 41403600, 57729600, 73458000, 87364800, 104907600, 118900800, 136357200, 150436800, 167806800, 183528000, 199256400, 215582400, 230706000, 247032000, 263365200, 276667200, 290581200, 308721600, 322030800, 340171200, 358318800, 371620800, 389768400, 403070400, 421218000, 434520000, 452667600, 466574400, 484117200, 498024000, 511333200, 529473600, 542782800, 560923200, 574837200, 592372800, 606286800, 623822400, 638946000, 655876800, 671000400, 687330000, 702450000, 718779600, 733899600, 750229200, 765349200, 781678800, 796798800, 813128400, 828853200, 844578000, 860302800, 876632400, 891147600, 909291600, 922597200, 941346000, 954651600, 972795600, 986101200, 1004245200, 1018155600, 1035694800, 1049605200, 1067144400, 1081054800, 1162098000, 1173589200, 1194152400 }
+    :intvector { -2147483648, -1402813824, -1311534000, -1300996800, -933534000, -925675200, -902084400, -893620800, -870030000, -862171200, -775681200, -767822400, -744231600, -736372800, -144702000, -134251200, -113425200, -102542400, -86295600, -72907200, -54154800, -41457600, -21495600, -5774400, 9954000, 25675200, 41403600, 57729600, 73458000, 87364800, 104907600, 118900800, 136357200, 150436800, 167806800, 183528000, 199256400, 215582400, 230706000, 247032000, 263365200, 276667200, 290581200, 308721600, 322030800, 340171200, 358318800, 371620800, 389768400, 403070400, 421218000, 434520000, 452667600, 466574400, 484117200, 498024000, 511333200, 529473600, 542782800, 560923200, 574837200, 592372800, 606286800, 623822400, 638946000, 655876800, 671000400, 687330000, 702450000, 718779600, 733899600, 750229200, 765349200, 781678800, 796798800, 813128400, 828853200, 844578000, 860302800, 876632400, 891147600, 909291600, 922597200, 941346000, 954651600, 972795600, 986101200, 1004245200, 1018155600, 1035694800, 1049605200, 1067144400, 1081054800, 1162098000, 1173589200, 1193547600 }
     :intvector { -19776, 0, -18000, 0, -18000, 3600 }
     :bin { "000102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" }
     "Cuba"
     :intvector { -18000, 2008 }
-    :intvector { 123, 363 }
+    :intvector { 123, 365 }
   } //Z#123
 ,  /* America/Hermosillo */ :array {
     :intvector { -2147483648, -1514739600, -1343066400, -1234807200, -1220292000, -1207159200, -1191344400, -873828000, -661539600, 28800, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400 }
@@ -654,7 +655,7 @@
     :bin { "000100010001000101000100010001000100010001000100010001000200020302030203020302" }
     "US"
     :intvector { -18000, 2008 }
-    :intvector { 111, 125, 133, 475, 582 }
+    :intvector { 111, 125, 133, 477, 584 }
   } //Z#125
 ,  /* America/Indiana/Knox */ :array {
     :intvector { -2147483648, -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -769395600, -765392400, -715795200, -702493200, -684345600, -671043600, -652896000, -639594000, -620841600, -608144400, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -447267600, -431539200, -415818000, -400089600, -386787600, -368640000, -355338000, -337190400, -321469200, -305740800, -289414800, -273686400, -257965200, -242236800, -195066000, -84384000, -68662800, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 1143961200, 1162105200, 1173600000, 1194159600 }
@@ -662,7 +663,7 @@
     :bin { "00010001000101000100010001000100010001000100010001000100010001000100010001000200010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010201000100" }
     "US"
     :intvector { -21600, 2008 }
-    :intvector { 126, 141, 585 }
+    :intvector { 126, 141, 587 }
   } //Z#126
 ,  /* America/Indiana/Marengo */ :array {
     :intvector { -2147483648, -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -769395600, -765392400, -589392000, -576090000, -495043200, -481741200, -463593600, -450291600, -431539200, -418237200, -400089600, -386787600, -368640000, -355338000, -337190400, -323888400, -305740800, -292438800, -273686400, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 126687600, 152089200, 162370800, 183535200, 1143961200, 1162101600, 1173596400, 1194156000 }
@@ -725,7 +726,7 @@
     :intvector { -2147483648, -1827687168, 136364400, 152085600, 162370800, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600 }
     :intvector { -18432, 0, -18000, 0, -18000, 3600 }
     :bin { "00010201020102010201020102010201020102010201" }
-    :intvector { 136, 492 }
+    :intvector { 136, 494 }
   } //Z#136
 ,  /* America/Jujuy */ :int { 67 } //Z#137
 ,  /* America/Juneau */ :array {
@@ -767,7 +768,7 @@
     :bin { "000100010001010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "US"
     :intvector { -28800, 2008 }
-    :intvector { 144, 515, 573, 588, 589 }
+    :intvector { 144, 517, 575, 590, 591 }
   } //Z#144
 ,  /* America/Louisville */ :int { 139 } //Z#145
 ,  /* America/Maceio */ :array {
@@ -784,1962 +785,1964 @@
     :intvector { -2147483648, -1767211196, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200, 750830400, 761713200 }
     :intvector { -14404, 0, -14400, 0, -14400, 3600 }
     :bin { "0001020102010201020102010201020102010201020102010201020102010201" }
-    :intvector { 148, 345 }
+    :intvector { 148, 347 }
   } //Z#148
+,  /* America/Marigot */ :int { 118 } //Z#149
 ,  /* America/Martinique */ :array {
     :intvector { -2147483648, -1851537340, 323841600, 338958000 }
     :intvector { -14660, 0, -14400, 0, -14400, 3600 }
     :bin { "00010201" }
-  } //Z#149
+  } //Z#150
 ,  /* America/Mazatlan */ :array {
     :intvector { -2147483648, -1514739600, -1343066400, -1234807200, -1220292000, -1207159200, -1191344400, -873828000, -661539600, 28800, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 989139600, 1001836800, 1018170000, 1035705600 }
     :intvector { -28800, 0, -25540, 0, -25200, 0, -25200, 3600, -21600, 0 }
     :bin { "010204020402040200020302030203020302030203020302" }
     "Mexico"
     :intvector { -25200, 2003 }
-    :intvector { 150, 501 }
-  } //Z#150
-,  /* America/Mendoza */ :int { 69 } //Z#151
+    :intvector { 151, 503 }
+  } //Z#151
+,  /* America/Mendoza */ :int { 69 } //Z#152
 ,  /* America/Menominee */ :array {
     :intvector { -2147483648, -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -769395600, -765392400, -747244800, -733942800, -116438400, -100112400, -21484800, 104914800, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 }
     :intvector { -21600, 0, -21600, 3600, -18000, 0 }
     :bin { "0001000100010100010001000201000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "US"
     :intvector { -21600, 2008 }
-  } //Z#152
+  } //Z#153
 ,  /* America/Merida */ :array {
     :intvector { -2147483648, -1514743200, 377935200, 407653200, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 989136000, 1001833200, 1018166400, 1035702000 }
     :intvector { -21600, 0, -21600, 3600, -21508, 0, -18000, 0 }
     :bin { "020003000100010001000100010001000100" }
     "Mexico"
     :intvector { -21600, 2003 }
-  } //Z#153
+  } //Z#154
 ,  /* America/Mexico_City */ :array {
     :intvector { -2147483648, -1514739600, -1343066400, -1234807200, -1220292000, -1207159200, -1191344400, -975261600, -963169200, -917114400, -907354800, -821901600, -810068400, -627501600, -612990000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 989136000, 1001833200, 1018166400, 1035702000 }
     :intvector { -25200, 0, -23796, 0, -21600, 0, -21600, 3600 }
     :bin { "0100020002000203020302030203020302030203020302030203020302" }
     "Mexico"
     :intvector { -21600, 2003 }
-    :intvector { 154, 502 }
-  } //Z#154
+    :intvector { 155, 504 }
+  } //Z#155
 ,  /* America/Miquelon */ :array {
     :intvector { -2147483648, -1850328920, 326001600, 544597200, 562132800, 576046800, 594187200, 607496400, 625636800, 638946000, 657086400, 671000400, 688536000, 702450000, 719985600, 733899600, 752040000, 765349200, 783489600, 796798800, 814939200, 828853200, 846388800, 860302800, 877838400, 891752400, 909288000, 923202000, 941342400, 954651600, 972792000, 986101200, 1004241600, 1018155600, 1035691200, 1049605200, 1067140800, 1081054800, 1099195200, 1112504400, 1130644800, 1143954000, 1162094400, 1173589200, 1194148800 }
     :intvector { -14400, 0, -13480, 0, -10800, 0, -10800, 3600 }
     :bin { "010002030203020302030203020302030203020302030203020302030203020302030203020302030203020302" }
     "Canada"
     :intvector { -10800, 2008 }
-  } //Z#155
+  } //Z#156
 ,  /* America/Moncton */ :array {
     :intvector { -2147483648, -2131642800, -1632074400, -1614798000, -1153681200, -1145822400, -1122231600, -1114372800, -1090782000, -1082923200, -1059332400, -1051473600, -1027882800, -1020024000, -996433200, -988574400, -965674800, -955396800, -934743600, -923947200, -904503600, -891892800, -880221600, -769395600, -765399600, -747252000, -733950000, -715802400, -702500400, -684352800, -671050800, -652903200, -639601200, -620848800, -608151600, -589399200, -576097200, -557949600, -544647600, -526500000, -513198000, -495050400, -481748400, -463600800, -450298800, -431546400, -418244400, -400096800, -384375600, -368647200, -352926000, -337197600, -321476400, -305748000, -289422000, -273693600, -257972400, -242244000, -226522800, -210794400, -195073200, -179344800, -163623600, -147895200, -131569200, -116445600, -100119600, -84391200, -68670000, -52941600, -37220400, -21492000, -5770800, 9957600, 25678800, 41407200, 57733200, 73461600, 89182800, 136360800, 152082000, 167810400, 183531600, 199260000, 215586000, 230709600, 247035600, 262764000, 278485200, 294213600, 309934800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800, 544600800, 562136400, 576050400, 594190800, 607500000, 625640400, 638949600, 657090000, 671004000, 688539600, 702453600, 719989200, 733896060, 752036460, 765345660, 783486060, 796795260, 814935660, 828849660, 846385260, 860299260, 877834860, 891748860, 909284460, 923198460, 941338860, 954648060, 972788460, 986097660, 1004238060, 1018152060, 1035687660, 1049601660, 1067137260, 1081051260, 1099191660, 1112500860, 1130641260, 1143950460, 1162090860, 1173592800, 1194152400 }
     :intvector { -18000, 0, -14400, 0, -14400, 3600 }
     :bin { "000102010201020102010201020102010201020102010202010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" }
     "Canada"
     :intvector { -14400, 2008 }
-  } //Z#156
+  } //Z#157
 ,  /* America/Monterrey */ :array {
     :intvector { -2147483648, -1514743200, 576057600, 594198000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 989136000, 1001833200, 1018166400, 1035702000 }
     :intvector { -24076, 0, -21600, 0, -21600, 3600 }
     :bin { "000102010201020102010201020102010201" }
     "Mexico"
     :intvector { -21600, 2003 }
-  } //Z#157
+  } //Z#158
 ,  /* America/Montevideo */ :array {
     :intvector { -2147483648, -1567455316, -1459542600, -1443819600, -1428006600, -1412283600, -1396470600, -1380747600, -1141590600, -1128286800, -1110141000, -1096837200, -1078691400, -1065387600, -1046637000, -1033938000, -1015187400, -1002488400, -983737800, -971038800, -952288200, -938984400, -920838600, -907534800, -896819400, -883602000, -853619400, -845848800, -334789200, -319672800, -314226000, -309996000, -149720400, -134604000, -118270800, -100044000, -86821200, -68508000, -50446800, -34119000, -18910800, -2583000, 12625200, 28953000, 72932400, 82692000, 132116400, 156911400, 212983200, 250052400, 260244000, 307594800, 325994400, 566449200, 574308000, 597812400, 605671200, 625633200, 636516000, 656478000, 667965600, 688532400, 699415200, 719377200, 730864800, 1095562800, 1111896000, 1128834000, 1142136000, 1159678800, 1173585600, 1191733200 }
     :intvector { -13484, 0, -12600, 0, -12600, 1800, -10800, 0, -10800, 1800, -10800, 3600 }
     :bin { "000102010201020102010201020102010201020102010201020105030503050305030503050304030403040305030405030503050305030503050305030503050305030503050305" }
     "Uruguay"
     :intvector { -10800, 2008 }
-  } //Z#158
+  } //Z#159
 ,  /* America/Montreal */ :array {
     :intvector { -2147483648, -1665334800, -1662753600, -1632070800, -1614794400, -1601742600, -1583775000, -1567355400, -1554053400, -1535907600, -1522603800, -1504458000, -1491154200, -1439830800, -1428255000, -1409504400, -1396805400, -1378054800, -1365355800, -1346612400, -1333915200, -1315162800, -1301860800, -1283713200, -1270411200, -1252263600, -1238961600, -1220814000, -1207512000, -1188759600, -1176062400, -1157310000, -1144008000, -1125860400, -1112558400, -1094410800, -1081108800, -1062961200, -1049659200, -1031511600, -1018209600, -1000062000, -986760000, -968007600, -955310400, -936558000, -880218000, -769395600, -765396000, -747248400, -733946400, -715798800, -702496800, -684349200, -671047200, -652899600, -636573600, -620845200, -605124000, -589395600, -576093600, -557946000, -544644000, -526496400, -513194400, -495046800, -481744800, -463597200, -450295200, -431542800, -418240800, -400093200, -384372000, -368643600, -352922400, -337194000, -321472800, -305744400, -289418400, -273690000, -257968800, -242240400, -226519200, -210790800, -195069600, -179341200, -163620000, -147891600, -131565600, -116442000, -100116000, -84387600, -68666400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 136364400, 152085600, 167814000, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173!
 596400, 1194156000 }
     :intvector { -18000, 0, -18000, 3600 }
     :bin { "0001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000101010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "Canada"
     :intvector { -18000, 2008 }
-  } //Z#159
+  } //Z#160
 ,  /* America/Montserrat */ :array {
     :intvector { -2147483648, -1846266608 }
     :intvector { -14932, 0, -14400, 0 }
     :bin { "0001" }
-  } //Z#160
+  } //Z#161
 ,  /* America/Nassau */ :array {
     :intvector { -2147483648, -1825095036, -179341200, -163620000, -147891600, -131565600, -116442000, -100116000, -84387600, -68666400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 136364400, 152085600, 167814000, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 }
     :intvector { -18564, 0, -18000, 0, -18000, 3600 }
     :bin { "000102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" }
     "US"
     :intvector { -18000, 2008 }
-  } //Z#161
+  } //Z#162
 ,  /* America/New_York */ :array {
     :intvector { -2147483648, -1633280400, -1615140000, -1601830800, -1583690400, -1570381200, -1551636000, -1536512400, -1523210400, -1504458000, -1491760800, -1473008400, -1459706400, -1441558800, -1428256800, -1410109200, -1396807200, -1378659600, -1365357600, -1347210000, -1333908000, -1315155600, -1301853600, -1283706000, -1270404000, -1252256400, -1238954400, -1220806800, -1207504800, -1189357200, -1176055200, -1157302800, -1144605600, -1125853200, -1112551200, -1094403600, -1081101600, -1062954000, -1049652000, -1031504400, -1018202400, -1000054800, -986752800, -968000400, -955303200, -936550800, -923248800, -905101200, -891799200, -880218000, -769395600, -765396000, -747248400, -733946400, -715798800, -702496800, -684349200, -671047200, -652899600, -639597600, -620845200, -608148000, -589395600, -576093600, -557946000, -544644000, -526496400, -513194400, -495046800, -481744800, -463597200, -447271200, -431542800, -415821600, -400093200, -384372000, -368643600, -352922400, -337194000, -321472800, -305744400, -289418400, -273690000, -257968800, -242240400, -226519200, -210790800, -195069600, -179341200, -163620000, -147891600, -131565600, -116442000, -100116000, -84387600, -68666400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 126687600, 152085600, 162370800, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130!
 652000, 1143961200, 1162101600, 1173596400, 1194156000 }
     :intvector { -18000, 0, -18000, 3600 }
     :bin { "0001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "US"
     :intvector { -18000, 2008 }
-    :intvector { 162, 568, 583 }
-  } //Z#162
+    :intvector { 163, 570, 585 }
+  } //Z#163
 ,  /* America/Nipigon */ :array {
     :intvector { -2147483648, -1632070800, -1614794400, -923252400, -880218000, -769395600, -765396000, 136364400, 152085600, 167814000, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 }
     :intvector { -18000, 0, -18000, 3600 }
     :bin { "000100010101000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "Canada"
     :intvector { -18000, 2008 }
-  } //Z#163
+  } //Z#164
 ,  /* America/Nome */ :array {
     :intvector { -2147483648, -880196400, -769395600, -765374400, -86878800, -21466800, -5745600, 9982800, 25704000, 41432400, 57758400, 73486800, 89208000, 104936400, 120657600, 126709200, 152107200, 162392400, 183556800, 199285200, 215611200, 230734800, 247060800, 262789200, 278510400, 294238800, 309960000, 325688400, 341409600, 357138000, 372859200, 388587600, 404913600, 420037200, 436363200, 439030800, 452084400, 467805600, 483534000, 499255200, 514983600, 530704800, 544618800, 562154400, 576068400, 594208800, 607518000, 625658400, 638967600, 657108000, 671022000, 688557600, 702471600, 720007200, 733921200, 752061600, 765370800, 783511200, 796820400, 814960800, 828874800, 846410400, 860324400, 877860000, 891774000, 909309600, 923223600, 941364000, 954673200, 972813600, 986122800, 1004263200, 1018177200, 1035712800, 1049626800, 1067162400, 1081076400, 1099216800, 1112526000, 1130666400, 1143975600, 1162116000, 1173610800, 1194170400 }
     :intvector { -39600, 0, -39600, 3600, -32400, 0, -32400, 3600 }
     :bin { "000101000001000100010001000100010001000100010001000100010001000100010202030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" }
     "US"
     :intvector { -32400, 2008 }
-  } //Z#164
+  } //Z#165
 ,  /* America/Noronha */ :array {
     :intvector { -2147483648, -1767217820, -1206961200, -1191366000, -1175378400, -1159830000, -633823200, -622072800, -602287200, -591836400, -570751200, -560214000, -539128800, -531356400, -191368800, -184201200, -155167200, -150073200, -128901600, -121129200, -99957600, -89593200, -68421600, -57970800, 499744800, 511232400, 530589600, 540262800, 562125600, 571194000, 592970400, 602038800, 624420000, 634698000, 938916000, 951613200, 970970400, 971571600, 1003024800, 1013907600 }
     :intvector { -7780, 0, -7200, 0, -7200, 3600 }
     :bin { "00010201020102010201020102010201020102010201020102010201020102010201020102010201" }
-    :intvector { 165, 343 }
-  } //Z#165
+    :intvector { 166, 345 }
+  } //Z#166
 ,  /* America/North_Dakota/Center */ :array {
     :intvector { -2147483648, -1633273200, -1615132800, -1601823600, -1583683200, -880210800, -769395600, -765388800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 126694800, 152092800, 162378000, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 }
     :intvector { -25200, 0, -25200, 3600, -21600, 0, -21600, 3600 }
     :bin { "000100010001010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000102030203020302030203020302030203020302030203020302030203020302" }
     "US"
     :intvector { -21600, 2008 }
-  } //Z#166
+  } //Z#167
 ,  /* America/North_Dakota/New_Salem */ :array {
     :intvector { -2147483648, -1633273200, -1615132800, -1601823600, -1583683200, -880210800, -769395600, -765388800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 126694800, 152092800, 162378000, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 }
     :intvector { -25200, 0, -25200, 3600, -21600, 0, -21600, 3600 }
     :bin { "000100010001010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001020302030203020302" }
     "US"
     :intvector { -21600, 2008 }
-  } //Z#167
+  } //Z#168
 ,  /* America/Panama */ :array {
     :intvector { -2147483648, -1946918424 }
     :intvector { -19176, 0, -18000, 0 }
     :bin { "0001" }
-  } //Z#168
+  } //Z#169
 ,  /* America/Pangnirtung */ :array {
     :intvector { -2147483648, -1546300800, -880221600, -769395600, -765399600, -147902400, -131572800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800, 544600800, 562136400, 576050400, 594190800, 607500000, 625640400, 638949600, 657090000, 671004000, 688539600, 702453600, 719989200, 733903200, 752043600, 765352800, 783493200, 796802400, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954662400, 972802800, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 }
     :intvector { -21600, 0, -21600, 3600, -18000, 0, -18000, 3600, -14400, 0, -14400, 3600, -14400, 7200, 0, 0 }
     :bin { "070405050406040504050405040504050405040504050405040504050405040504050405040302030203020302030001020302030203020302030203020302" }
     "Canada"
     :intvector { -18000, 2008 }
-  } //Z#169
+  } //Z#170
 ,  /* America/Paramaribo */ :array {
     :intvector { -2147483648, -1861906760, -1104524348, -765317964, 185686200, 465449400 }
     :intvector { -13252, 0, -13240, 0, -13236, 0, -12600, 0, -10800, 0 }
     :bin { "010002030304" }
-  } //Z#170
+  } //Z#171
 ,  /* America/Phoenix */ :array {
     :intvector { -2147483648, -1633273200, -1615132800, -1601823600, -1583683200, -880210800, -820519140, -812653140, -796845540, -84380400, -68659200 }
     :intvector { -25200, 0, -25200, 3600 }
     :bin { "0001000100010001000100" }
-    :intvector { 171, 512, 580 }
-  } //Z#171
+    :intvector { 172, 514, 582 }
+  } //Z#172
 ,  /* America/Port-au-Prince */ :array {
     :intvector { -2147483648, -1670483460, 421218000, 436334400, 452062800, 467784000, 483512400, 499233600, 514962000, 530683200, 546411600, 562132800, 576050400, 594194400, 607500000, 625644000, 638949600, 657093600, 671004000, 688543200, 702453600, 719992800, 733903200, 752047200, 765352800, 783496800, 796802400, 814946400, 828856800, 846396000, 860306400, 877845600, 1112504400, 1130644800, 1143954000, 1162094400 }
     :intvector { -18000, 0, -18000, 3600, -17340, 0 }
     :bin { "020001000100010001000100010001000100010001000100010001000100010001000100" }
-  } //Z#172
+  } //Z#173
 ,  /* America/Port_of_Spain */ :array {
     :intvector { -2147483648, -1825098836 }
     :intvector { -14764, 0, -14400, 0 }
     :bin { "0001" }
-  } //Z#173
-,  /* America/Porto_Acre */ :int { 182 } //Z#174
+  } //Z#174
+,  /* America/Porto_Acre */ :int { 183 } //Z#175
 ,  /* America/Porto_Velho */ :array {
     :intvector { -2147483648, -1767210264, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200 }
     :intvector { -15336, 0, -14400, 0, -14400, 3600 }
     :bin { "000102010201020102010201020102010201020102010201020102010201" }
-  } //Z#175
+  } //Z#176
 ,  /* America/Puerto_Rico */ :array {
     :intvector { -2147483648, -873057600, -769395600, -765399600 }
     :intvector { -14400, 0, -14400, 3600 }
     :bin { "00010100" }
-    :intvector { 176, 514 }
-  } //Z#176
+    :intvector { 177, 516 }
+  } //Z#177
 ,  /* America/Rainy_River */ :array {
     :intvector { -2147483648, -1632067200, -1614790800, -923248800, -880214400, -769395600, -765392400, 136368000, 152089200, 167817600, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 }
     :intvector { -21600, 0, -21600, 3600 }
     :bin { "000100010101000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "Canada"
     :intvector { -21600, 2008 }
-  } //Z#177
+  } //Z#178
 ,  /* America/Rankin_Inlet */ :array {
     :intvector { -2147483648, -410227200, -147895200, -131565600, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 }
     :intvector { -21600, 0, -21600, 3600, -21600, 7200, -18000, 0, 0, 0 }
     :bin { "040002000100010001000100010001000100010001000100010001000100010001000100010001000100010001030100010001000100010001000100" }
     "Canada"
     :intvector { -21600, 2008 }
-  } //Z#178
+  } //Z#179
 ,  /* America/Recife */ :array {
     :intvector { -2147483648, -1767217224, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 938919600, 951616800, 970974000, 971575200, 1003028400, 1013911200 }
     :intvector { -10800, 0, -10800, 3600, -8376, 0 }
     :bin { "02000100010001000100010001000100010001000100010001000100010001000100010001000100" }
-  } //Z#179
+  } //Z#180
 ,  /* America/Regina */ :array {
     :intvector { -2147483648, -2030202084, -1632063600, -1614787200, -1251651600, -1238349600, -1220202000, -1206900000, -1188752400, -1175450400, -1156698000, -1144000800, -1125248400, -1111946400, -1032714000, -1016992800, -1001264400, -986148000, -969814800, -954093600, -937760400, -922039200, -906310800, -890589600, -880210800, -769395600, -765388800, -748450800, -732729600, -715791600, -702489600, -684342000, -671040000, -652892400, -639590400, -620838000, -608140800, -589388400, -576086400, -557938800, -544636800, -526489200, -513187200, -495039600, -481737600, -463590000, -450288000, -431535600, -418233600, -400086000, -386784000, -337186800, -321465600, -305737200 }
     :intvector { -25200, 0, -25200, 3600, -25116, 0, -21600, 0 }
     :bin { "020001000100010001000100010001000100010001000100010100010001000100010001000100010001000100010001000100010003" }
-    :intvector { 180, 354, 359 }
-  } //Z#180
+    :intvector { 181, 356, 361 }
+  } //Z#181
 ,  /* America/Resolute */ :array {
     :intvector { -2147483648, -704937600, -147895200, -131565600, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200 }
     :intvector { -21600, 0, -21600, 3600, -21600, 7200, -18000, 0, 0, 0 }
     :bin { "04000200010001000100010001000100010001000100010001000100010001000100010001000100010001000103010001000100010001000103" }
-  } //Z#181
+  } //Z#182
 ,  /* America/Rio_Branco */ :array {
     :intvector { -2147483648, -1767209328, -1206950400, -1191355200, -1175367600, -1159819200, -633812400, -622062000, -602276400, -591825600, -570740400, -560203200, -539118000, -531345600, -191358000, -184190400, -155156400, -150062400, -128890800, -121118400, -99946800, -89582400, -68410800, -57960000, 499755600, 511243200, 530600400, 540273600, 562136400, 571204800 }
     :intvector { -18000, 0, -18000, 3600, -16272, 0 }
     :bin { "020001000100010001000100010001000100010001000100010001000100" }
-    :intvector { 174, 182, 342 }
-  } //Z#182
-,  /* America/Rosario */ :int { 66 } //Z#183
+    :intvector { 175, 183, 344 }
+  } //Z#183
+,  /* America/Rosario */ :int { 66 } //Z#184
 ,  /* America/Santiago */ :array {
     :intvector { -2147483648, -1893439034, -1688410800, -1619983034, -1593806400, -1335986234, -1317585600, -1304362800, -1286049600, -1272826800, -1254513600, -1241290800, -1222977600, -1209754800, -1191355200, -1178132400, -870552000, -865278000, -736376400, -713646000, -36619200, -23922000, -3355200, 7527600, 24465600, 37767600, 55915200, 69217200, 87969600, 100666800, 118209600, 132116400, 150868800, 163566000, 182318400, 195620400, 213768000, 227070000, 245217600, 258519600, 277272000, 289969200, 308721600, 321418800, 340171200, 353473200, 371620800, 384922800, 403070400, 416372400, 434520000, 447822000, 466574400, 479271600, 498024000, 510721200, 529473600, 545194800, 560923200, 574225200, 591768000, 605674800, 624427200, 637729200, 653457600, 668574000, 687326400, 700628400, 718776000, 732078000, 750225600, 763527600, 781675200, 794977200, 813729600, 826426800, 845179200, 859690800, 876628800, 889930800, 906868800, 923194800, 939528000, 952830000, 971582400 }
     :intvector { -18000, 0, -18000, 3600, -16966, 0, -14400, 0, -14400, 3600 }
     :bin { "02000203020100010001000100010001000100030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304" }
     "Chile"
     :intvector { -14400, 2001 }
-    :intvector { 184, 361 }
-  } //Z#184
+    :intvector { 185, 363 }
+  } //Z#185
 ,  /* America/Santo_Domingo */ :array {
     :intvector { -2147483648, -1159773600, -100119600, -89668800, -5770800, 4422600, 25678800, 33193800, 57733200, 64816200, 89182800, 96438600, 120632400, 127974600, 152082000, 972799200, 975823200 }
     :intvector { -18000, 0, -18000, 1800, -18000, 3600, -16800, 0, -14400, 0 }
     :bin { "0300020001000100010001000100040004" }
-  } //Z#185
+  } //Z#186
 ,  /* America/Sao_Paulo */ :array {
-    :intvector { -2147483648, -1767214412, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -195426000, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 656478000, 666756000, 687927600, 697600800, 719982000, 728445600, 750826800, 761709600, 782276400, 793159200, 813726000, 824004000, 844570800, 856058400, 876106800, 888717600, 908074800, 919562400, 938919600, 951616800, 970974000, 982461600, 1003028400, 1013911200, 1036292400, 1045360800, 1066532400, 1076810400, 1099364400, 1108864800, 1129431600, 1140314400, 1162695600, 1172368800, 1194145200 }
+    :intvector { -2147483648, -1767214412, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -195426000, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 656478000, 666756000, 687927600, 697600800, 719982000, 728445600, 750826800, 761709600, 782276400, 793159200, 813726000, 824004000, 844570800, 856058400, 876106800, 888717600, 908074800, 919562400, 938919600, 951616800, 970974000, 982461600, 1003028400, 1013911200, 1036292400, 1045360800, 1066532400, 1076810400, 1099364400, 1108864800, 1129431600, 1140314400, 1162695600, 1172368800, 1192330800, 1203213600, 1223780400 }
     :intvector { -11188, 0, -10800, 0, -10800, 3600 }
-    :bin { "000102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102" }
+    :bin { "0001020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102" }
     "Brazil"
-    :intvector { -10800, 2008 }
-    :intvector { 186, 340, 344 }
-  } //Z#186
+    :intvector { -10800, 2009 }
+    :intvector { 187, 342, 346 }
+  } //Z#187
 ,  /* America/Scoresbysund */ :array {
     :intvector { -2147483648, -1686090728, 323841600, 338961600, 354679200, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { -7200, 0, -7200, 3600, -5272, 0, -3600, 0, -3600, 3600 }
     :bin { "020001000403040304030403040304030403040304030403040304030403040304030403" }
     "EU"
     :intvector { -3600, 1997 }
-  } //Z#187
-,  /* America/Shiprock */ :int { 104 } //Z#188
+  } //Z#188
+,  /* America/Shiprock */ :int { 104 } //Z#189
+,  /* America/St_Barthelemy */ :int { 118 } //Z#190
 ,  /* America/St_Johns */ :array {
     :intvector { -2147483648, -1664130548, -1650137348, -1632076148, -1614799748, -1598650148, -1590100148, -1567286948, -1551565748, -1535837348, -1520116148, -1503782948, -1488666548, -1472333348, -1457216948, -1440883748, -1425767348, -1409434148, -1394317748, -1377984548, -1362263348, -1346534948, -1330813748, -1314480548, -1299364148, -1283030948, -1267914548, -1251581348, -1236464948, -1220131748, -1205015348, -1188682148, -1172960948, -1156627748, -1141511348, -1125178148, -1110061748, -1096921748, -1093728600, -1078612200, -1061670600, -1048973400, -1030221000, -1017523800, -998771400, -986074200, -966717000, -954624600, -935267400, -922570200, -903817800, -891120600, -872368200, -769395600, -765401400, -746044200, -733347000, -714594600, -701897400, -683145000, -670447800, -651695400, -638998200, -619641000, -606943800, -589401000, -576099000, -557951400, -544649400, -526501800, -513199800, -495052200, -481750200, -463602600, -450300600, -431548200, -418246200, -400098600, -386796600, -368649000, -355347000, -337199400, -323897400, -305749800, -289423800, -273695400, -257974200, -242245800, -226524600, -210796200, -195075000, -179346600, -163625400, -147897000, -131571000, -116447400, -100121400, -84393000, -68671800, -52943400, -37222200, -21493800, -5772600, 9955800, 25677000, 41405400, 57731400, 73459800, 89181000, 104909400, 120630600, 136359000, 152080200, 167808600, 183529800, 199258200, 215584200, 230707800, 247033800, 262762200, 278483400, 294211800, 309933000, 325661400, 341382600, 357111000, 372832200, 388560600, 404886600, 420010200, 436336200, 452064600, 467785800, 483514200, 499235400, 514963800, 530685000, 544591860, 562127460, 576041460, 594178260, 607491060, 625631460, 638940660, 657081060, 670995060, 688530660, 702444660, 719980260, 733894260, 752034660, 765343860, 783484260, 796793460, 814933860, 828847860, 846383460, 860297460, 877833060, 891747060, 909282660, 923196660, 941337060, 954646260, 972786660, 986095860, 1004236260, 1018150260, 1035685860, 1049599860, 1067135460, 10!
 81049460, 1099189860, 1112499060, 1130639460, 1143948660, 1162089060, 1173583860, 1194143460 }
     :intvector { -12652, 0, -12652, 3600, -12600, 0, -12600, 3600, -12600, 7200 }
     :bin { "0001000100010001000100010001000100010001000100010001000100010001000100010002030203020302030203020302030203030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030204020302030203020302030203020302030203020302030203020302030203020302030203020302" }
     "StJohns"
     :intvector { -12600, 2008 }
-    :intvector { 189, 348, 357 }
-  } //Z#189
+    :intvector { 191, 350, 359 }
+  } //Z#191
 ,  /* America/St_Kitts */ :array {
     :intvector { -2147483648, -1825098548 }
     :intvector { -15052, 0, -14400, 0 }
     :bin { "0001" }
-  } //Z#190
+  } //Z#192
 ,  /* America/St_Lucia */ :array {
     :intvector { -2147483648, -1830369360 }
     :intvector { -14640, 0, -14400, 0 }
     :bin { "0001" }
-  } //Z#191
+  } //Z#193
 ,  /* America/St_Thomas */ :array {
     :intvector { -2147483648, -1846266016 }
     :intvector { -15584, 0, -14400, 0 }
     :bin { "0001" }
-    :intvector { 192, 202 }
-  } //Z#192
+    :intvector { 194, 204 }
+  } //Z#194
 ,  /* America/St_Vincent */ :array {
     :intvector { -2147483648, -1830369304 }
     :intvector { -14696, 0, -14400, 0 }
     :bin { "0001" }
-  } //Z#193
+  } //Z#195
 ,  /* America/Swift_Current */ :array {
     :intvector { -2147483648, -2030201320, -1632063600, -1614787200, -880210800, -769395600, -765388800, -747241200, -732729600, -715791600, -702489600, -684342000, -671040000, -652892400, -639590400, -400086000, -384364800, -337186800, -321465600, -305737200, -292435200, -273682800, -260985600, 73472400 }
     :intvector { -25880, 0, -25200, 0, -25200, 3600, -21600, 0 }
     :bin { "000102010202010201020102010201020102010201020103" }
-  } //Z#194
+  } //Z#196
 ,  /* America/Tegucigalpa */ :array {
     :intvector { -2147483648, -1538503868, 547020000, 559717200, 578469600, 591166800, 1146981600, 1154926800 }
     :intvector { -21600, 0, -21600, 3600, -20932, 0 }
     :bin { "0200010001000100" }
-  } //Z#195
+  } //Z#197
 ,  /* America/Thule */ :array {
     :intvector { -2147483648, -1686079492, 670399200, 686120400, 701848800, 717570000, 733903200, 752043600, 765352800, 783493200, 796802400, 814942800, 828856800, 846392400, 860306400, 877842000, 891756000, 909291600, 923205600, 941346000, 954655200, 972795600, 986104800, 1004245200, 1018159200, 1035694800, 1049608800, 1067144400, 1081058400, 1099198800, 1112508000, 1130648400, 1143957600, 1162098000, 1173592800, 1194152400 }
     :intvector { -16508, 0, -14400, 0, -14400, 3600 }
     :bin { "000102010201020102010201020102010201020102010201020102010201020102010201" }
     "Thule"
     :intvector { -14400, 2008 }
-  } //Z#196
+  } //Z#198
 ,  /* America/Thunder_Bay */ :array {
     :intvector { -2147483648, -1893434400, -880218000, -769395600, -765396000, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 136364400, 152085600, 167814000, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 }
     :intvector { -21600, 0, -18000, 0, -18000, 3600 }
     :bin { "00010202010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" }
     "Canada"
     :intvector { -18000, 2008 }
-  } //Z#197
+  } //Z#199
 ,  /* America/Tijuana */ :array {
     :intvector { -2147483648, -1514736000, -1451667600, -1343062800, -1234803600, -1222963200, -1207242000, -873820800, -769395600, -761677200, -686073600, -661539600, -495036000, -481734000, -463586400, -450284400, -431532000, -418230000, -400082400, -386780400, -368632800, -355330800, -337183200, -323881200, -305733600, -292431600, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200 }
     :intvector { -28800, 0, -28800, 3600, -28084, 0, -25200, 0 }
     :bin { "0203000300010001010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "Mexico"
     :intvector { -28800, 2003 }
-    :intvector { 110, 198, 500 }
-  } //Z#198
+    :intvector { 110, 200, 502 }
+  } //Z#200
 ,  /* America/Toronto */ :array {
     :intvector { -2147483648, -1632070800, -1614794400, -1601753400, -1583697600, -1567357200, -1554667200, -1534698000, -1524074400, -1503248400, -1492365600, -1471798800, -1460916000, -1440954000, -1428861600, -1409504400, -1397412000, -1378054800, -1365962400, -1346605200, -1333908000, -1315155600, -1301853600, -1283706000, -1270404000, -1252256400, -1238954400, -1220806800, -1207504800, -1188752400, -1176055200, -1157302800, -1144000800, -1125853200, -1112551200, -1094403600, -1081101600, -1062954000, -1049652000, -1031504400, -1018202400, -1000054800, -986752800, -968000400, -955303200, -936550800, -880218000, -769395600, -765396000, -747248400, -733946400, -715806000, -702504000, -684356400, -671054400, -652906800, -634161600, -620845200, -602704800, -589395600, -576093600, -557946000, -544644000, -526496400, -513194400, -495046800, -481744800, -463597200, -450295200, -431542800, -418240800, -400093200, -384372000, -368643600, -352922400, -337194000, -321472800, -305744400, -289418400, -273690000, -257968800, -242240400, -226519200, -210790800, -195069600, -179341200, -163620000, -147891600, -131565600, -116442000, -100116000, -84387600, -68666400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 136364400, 152085600, 167814000, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173!
 596400, 1194156000 }
     :intvector { -18000, 0, -18000, 3600 }
     :bin { "0001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000101010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "Canada"
     :intvector { -18000, 2008 }
-    :intvector { 199, 355 }
-  } //Z#199
+    :intvector { 201, 357 }
+  } //Z#201
 ,  /* America/Tortola */ :array {
     :intvector { -2147483648, -1846266092 }
     :intvector { -15508, 0, -14400, 0 }
     :bin { "0001" }
-  } //Z#200
+  } //Z#202
 ,  /* America/Vancouver */ :array {
     :intvector { -2147483648, -1632060000, -1614783600, -880207200, -769395600, -765385200, -747237600, -732726000, -715788000, -702486000, -684338400, -671036400, -652888800, -639586800, -620834400, -608137200, -589384800, -576082800, -557935200, -544633200, -526485600, -513183600, -495036000, -481734000, -463586400, -450284400, -431532000, -418230000, -400082400, -386780400, -368632800, -355330800, -337183200, -323881200, -305733600, -292431600, -273679200, -260982000, -242229600, -226508400, -210780000, -195058800, -179330400, -163609200, -147880800, -131554800, -116431200, -100105200, -84376800, -68655600, -52927200, -37206000, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 136375200, 152096400, 167824800, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200, 1049623200, 1067158800, 1081072800, 1099213200, 1112522400, 1130662800, 1143972000, 1162112400, 1173607200, 1194166800 }
     :intvector { -28800, 0, -28800, 3600 }
     :bin { "00010001010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "Canada"
     :intvector { -28800, 2008 }
-    :intvector { 201, 358 }
-  } //Z#201
-,  /* America/Virgin */ :int { 192 } //Z#202
+    :intvector { 203, 360 }
+  } //Z#203
+,  /* America/Virgin */ :int { 194 } //Z#204
 ,  /* America/Whitehorse */ :array {
     :intvector { -2147483648, -1632056400, -1615125600, -1596978000, -1583164800, -880203600, -769395600, -765381600, -147884400, -131554800, -110552400, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200, 1049623200, 1067158800, 1081072800, 1099213200, 1112522400, 1130662800, 1143972000, 1162112400, 1173607200, 1194166800 }
     :intvector { -32400, 0, -32400, 3600, -32400, 7200, -28800, 0, -28800, 3600 }
     :bin { "00010001000101000200030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403" }
     "Canada"
     :intvector { -28800, 2008 }
-    :intvector { 203, 360 }
-  } //Z#203
+    :intvector { 205, 362 }
+  } //Z#205
 ,  /* America/Winnipeg */ :array {
     :intvector { -2147483648, -1694368800, -1681671600, -1632067200, -1614790800, -1029686400, -1018198800, -880214400, -769395600, -765392400, -746035200, -732733200, -715795200, -702493200, -684345600, -671043600, -652896000, -639594000, -620755200, -607626000, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -450291600, -431539200, -418237200, -400089600, -386787600, -368640000, -355338000, -337190400, -321469200, -305740800, -292438800, -210787200, -198090000, -116438400, -100108800, -84384000, -68659200, -52934400, -37209600, -21484800, -5760000, 9964800, 25689600, 41414400, 57744000, 73468800, 89193600, 104918400, 120643200, 136368000, 152092800, 167817600, 183542400, 199267200, 215596800, 230716800, 247046400, 262771200, 278496000, 294220800, 309945600, 325670400, 341395200, 357120000, 372844800, 388569600, 404899200, 420019200, 436348800, 452073600, 467798400, 483523200, 499248000, 514972800, 530697600, 544608000, 562147200, 576057600, 594201600, 607507200, 625651200, 638956800, 657100800, 671011200, 688550400, 702460800, 720000000, 733910400, 752054400, 765360000, 783504000, 796809600, 814953600, 828864000, 846403200, 860313600, 877852800, 891763200, 909302400, 923212800, 941356800, 954662400, 972806400, 986112000, 1004256000, 1018166400, 1035705600, 1049616000, 1067155200, 1081065600, 1099209600, 1112515200, 1130659200, 1136095200, 1143964800, 1162105200, 1173600000, 1194159600 }
     :intvector { -21600, 0, -21600, 3600 }
     :bin { "00010001000100010100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000001000100" }
     "Canada"
     :intvector { -21600, 2008 }
-    :intvector { 204, 353 }
-  } //Z#204
+    :intvector { 206, 355 }
+  } //Z#206
 ,  /* America/Yakutat */ :array {
     :intvector { -2147483648, -880203600, -769395600, -765381600, -21474000, -5752800, 9975600, 25696800, 41425200, 57751200, 73479600, 89200800, 104929200, 120650400, 126702000, 152100000, 162385200, 183549600, 199278000, 215604000, 230727600, 247053600, 262782000, 278503200, 294231600, 309952800, 325681200, 341402400, 357130800, 372852000, 388580400, 404906400, 420030000, 436356000, 439030800, 452084400, 467805600, 483534000, 499255200, 514983600, 530704800, 544618800, 562154400, 576068400, 594208800, 607518000, 625658400, 638967600, 657108000, 671022000, 688557600, 702471600, 720007200, 733921200, 752061600, 765370800, 783511200, 796820400, 814960800, 828874800, 846410400, 860324400, 877860000, 891774000, 909309600, 923223600, 941364000, 954673200, 972813600, 986122800, 1004263200, 1018177200, 1035712800, 1049626800, 1067162400, 1081076400, 1099216800, 1112526000, 1130666400, 1143975600, 1162116000, 1173610800, 1194170400 }
     :intvector { -32400, 0, -32400, 3600 }
     :bin { "0001010001000100010001000100010001000100010001000100010001000100010000010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "US"
     :intvector { -32400, 2008 }
-  } //Z#205
+  } //Z#207
 ,  /* America/Yellowknife */ :array {
     :intvector { -2147483648, -1104537600, -880210800, -769395600, -765388800, -147891600, -131562000, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1173603600, 1194163200 }
     :intvector { -25200, 0, -25200, 3600, -25200, 7200, 0, 0 }
     :bin { "030001010002000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "Canada"
     :intvector { -25200, 2008 }
-  } //Z#206
+  } //Z#208
 ,  /* Antarctica/Casey */ :array {
     :intvector { -2147483648, -31536000 }
     :intvector { 0, 0, 28800, 0 }
     :bin { "0001" }
-  } //Z#207
+  } //Z#209
 ,  /* Antarctica/Davis */ :array {
     :intvector { -2147483648, -409190400, -163062000, -28857600 }
     :intvector { 0, 0, 25200, 0 }
     :bin { "00010001" }
-  } //Z#208
+  } //Z#210
 ,  /* Antarctica/DumontDUrville */ :array {
     :intvector { -2147483648, -725846400, -566992800, -415497600 }
     :intvector { 0, 0, 36000, 0 }
     :bin { "00010001" }
-  } //Z#209
+  } //Z#211
 ,  /* Antarctica/Mawson */ :array {
     :intvector { -2147483648, -501206400 }
     :intvector { 0, 0, 21600, 0 }
     :bin { "0001" }
-  } //Z#210
+  } //Z#212
 ,  /* Antarctica/McMurdo */ :array {
     :intvector { -2147483648, -441849600, 152632800, 162309600, 183477600, 194968800, 215532000, 226418400, 246981600, 257868000, 278431200, 289317600, 309880800, 320767200, 341330400, 352216800, 372780000, 384271200, 404834400, 415720800, 436284000, 447170400, 467733600, 478620000, 499183200, 510069600, 530632800, 541519200, 562082400, 573573600, 594136800, 605023200, 623772000, 637682400, 655221600, 669132000, 686671200, 700581600, 718120800, 732636000, 749570400, 764085600, 781020000, 795535200, 812469600, 826984800, 844524000, 858434400, 875973600, 889884000, 907423200, 921938400, 938872800, 953388000, 970322400, 984837600, 1002376800, 1016287200, 1033826400, 1047736800, 1065276000, 1079791200, 1096725600, 1111240800, 1128175200, 1142690400, 1159624800, 1174140000, 1191074400, 1207404000, 1222524000 }
     :intvector { 0, 0, 43200, 0, 43200, 3600 }
     :bin { "0001020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102" }
     "NZAQ"
     :intvector { 43200, 2009 }
-    :intvector { 211, 214 }
-  } //Z#211
+    :intvector { 213, 216 }
+  } //Z#213
 ,  /* Antarctica/Palmer */ :array {
     :intvector { -2147483648, -157766400, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 389070000, 403070400, 416372400, 434520000, 447822000, 466574400, 479271600, 498024000, 510721200, 529473600, 545194800, 560923200, 574225200, 591768000, 605674800, 624427200, 637729200, 653457600, 668574000, 687326400, 700628400, 718776000, 732078000, 750225600, 763527600, 781675200, 794977200, 813729600, 826426800, 845179200, 859690800, 876628800, 889930800, 906868800, 923194800, 939528000, 952830000, 971582400 }
     :intvector { -14400, 0, -14400, 3600, -10800, 0, -10800, 3600, 0, 0 }
     :bin { "04010001000100010001000203020001000100010001000100010001000100010001000100010001000100010001000100010001" }
     "ChileAQ"
     :intvector { -14400, 2001 }
-  } //Z#212
+  } //Z#214
 ,  /* Antarctica/Rothera */ :array {
     :intvector { -2147483648, 218246400 }
     :intvector { -10800, 0, 0, 0 }
     :bin { "0100" }
-  } //Z#213
-,  /* Antarctica/South_Pole */ :int { 211 } //Z#214
+  } //Z#215
+,  /* Antarctica/South_Pole */ :int { 213 } //Z#216
 ,  /* Antarctica/Syowa */ :array {
     :intvector { -2147483648, -407808000 }
     :intvector { 0, 0, 10800, 0 }
     :bin { "0001" }
-  } //Z#215
+  } //Z#217
 ,  /* Antarctica/Vostok */ :array {
     :intvector { -2147483648, -380073600 }
     :intvector { 0, 0, 21600, 0 }
     :bin { "0001" }
-  } //Z#216
-,  /* Arctic/Longyearbyen */ :int { 439 } //Z#217
+  } //Z#218
+,  /* Arctic/Longyearbyen */ :int { 441 } //Z#219
 ,  /* Asia/Aden */ :array {
     :intvector { -2147483648, -631162848 }
     :intvector { 10800, 0, 10848, 0 }
     :bin { "0100" }
-  } //Z#218
+  } //Z#220
 ,  /* Asia/Almaty */ :array {
     :intvector { -2147483648, -1441170468, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 662666400, 701802000, 717523200, 733262400, 748987200, 764712000, 780436800, 796161600, 811886400, 828216000, 846360000, 859665600, 877809600, 891115200, 909259200, 922564800, 941313600, 954014400, 972763200, 985464000, 1004212800, 1017518400, 1035662400, 1048968000, 1067112000, 1080417600, 1099166400, 1110823200 }
     :intvector { 18000, 0, 18468, 0, 21600, 0, 21600, 3600 }
     :bin { "010002030203020302030203020302030203020302030202030203020302030203020302030203020302030203020302030202" }
-  } //Z#219
+  } //Z#221
 ,  /* Asia/Amman */ :array {
     :intvector { -2147483648, -1230776624, 108165600, 118270800, 136591200, 149806800, 168127200, 181342800, 199749600, 215643600, 231285600, 244501200, 262735200, 275950800, 481154400, 496962000, 512949600, 528670800, 544399200, 560120400, 575848800, 592174800, 610581600, 623624400, 641167200, 655074000, 671839200, 685918800, 702856800, 717973200, 733701600, 749422800, 765151200, 779662800, 797205600, 811116000, 828655200, 843170400, 860104800, 874620000, 891554400, 906069600, 930780000, 938642400, 954367200, 970092000, 985816800, 1001541600, 1017266400, 1032991200, 1048716000, 1066946400, 1080165600, 1097791200, 1112220000, 1128031200, 1143669600, 1161900000 }
     :intvector { 7200, 0, 7200, 3600, 8624, 0 }
     :bin { "02000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "Jordan"
     :intvector { 7200, 2007 }
-  } //Z#220
+  } //Z#222
 ,  /* Asia/Anadyr */ :array {
     :intvector { -2147483648, -1441194596, -1247572800, 354884400, 370692000, 386420400, 402231600, 417960000, 433767600, 449582400, 465314400, 481039200, 496764000, 512488800, 528213600, 543938400, 559663200, 575388000, 591112800, 606837600, 622562400, 638287200, 654616800, 670341600, 686070000, 695746800, 701780400, 717501600, 733240800, 748965600, 764690400, 780415200, 796140000, 811864800, 828194400, 846338400 }
     :intvector { 39600, 0, 39600, 3600, 42596, 0, 43200, 0, 43200, 3600, 46800, 0, 46800, 3600 }
     :bin { "020305060504030403040304030403040304030403040301000304030403040304030403" }
     "Russia"
     :intvector { 43200, 1997 }
-  } //Z#221
+  } //Z#223
 ,  /* Asia/Aqtau */ :array {
     :intvector { -2147483648, -1441164064, -1247544000, -220942800, 370724400, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 662670000, 692823600, 701805600, 717526800, 733266000, 748990800, 764715600, 780440400, 796165200, 811893600, 828223200, 846367200, 859672800, 877816800, 891122400, 909266400, 922572000, 941320800, 954021600, 972770400, 985471200, 1004220000, 1017525600, 1035669600, 1048975200, 1067119200, 1080424800, 1099173600, 1110830400 }
     :intvector { 12064, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 }
     :bin { "00010303050403040304030403040304030403040304030303040304030403020102010201020102010201020102010201020103" }
-  } //Z#222
+  } //Z#224
 ,  /* Asia/Aqtobe */ :array {
     :intvector { -2147483648, -1441165720, -1247544000, 354913200, 370720800, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 662670000, 692823600, 701805600, 717526800, 733266000, 748990800, 764715600, 780440400, 796165200, 811890000, 828219600, 846363600, 859669200, 877813200, 891118800, 909262800, 922568400, 941317200, 954018000, 972766800, 985467600, 1004216400, 1017522000, 1035666000, 1048971600, 1067115600, 1080421200, 1099170000, 1110826800 }
     :intvector { 13720, 0, 14400, 0, 18000, 0, 18000, 3600, 21600, 0 }
     :bin { "00010203040302030203020302030203020302030203020202030203020302030203020302030203020302030203020302030202" }
-  } //Z#223
+  } //Z#225
 ,  /* Asia/Ashgabat */ :array {
     :intvector { -2147483648, -1441166012, -1247544000, 354913200, 370720800, 386449200, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 688507200, 695772000 }
     :intvector { 14012, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600 }
     :bin { "000103040304030403040304030403040304030403040302010103" }
-    :intvector { 224, 225 }
-  } //Z#224
-,  /* Asia/Ashkhabad */ :int { 224 } //Z#225
+    :intvector { 226, 227 }
+  } //Z#226
+,  /* Asia/Ashkhabad */ :int { 226 } //Z#227
 ,  /* Asia/Baghdad */ :array {
     :intvector { -2147483648, -1641005856, 389048400, 402264000, 417906000, 433800000, 449614800, 465422400, 481150800, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622591200, 638316000, 654645600, 670464000, 686275200 }
     :intvector { 10656, 0, 10800, 0, 10800, 3600 }
     :bin { "00010201020102010201020102010201020102010201" }
     "Iraq"
     :intvector { 10800, 1992 }
-  } //Z#226
+  } //Z#228
 ,  /* Asia/Bahrain */ :array {
     :intvector { -2147483648, -1577935340, 76190400 }
     :intvector { 10800, 0, 12140, 0, 14400, 0 }
     :bin { "010200" }
-  } //Z#227
+  } //Z#229
 ,  /* Asia/Baku */ :array {
     :intvector { -2147483648, -1441163964, -405140400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622591200, 638316000, 654645600, 670370400, 683496000, 686098800, 701812800, 717534000, 828234000, 846378000, 852062400, 859680000, 877824000 }
     :intvector { 10800, 0, 10800, 3600, 11964, 0, 14400, 0, 14400, 3600 }
     :bin { "020003040304030403040304030403040304030403040301010001030403030403" }
     "Azer"
     :intvector { 14400, 1998 }
-  } //Z#228
+  } //Z#230
 ,  /* Asia/Bangkok */ :array {
     :intvector { -2147483648, -1570084924 }
     :intvector { 24124, 0, 25200, 0 }
     :bin { "0001" }
-  } //Z#229
+  } //Z#231
 ,  /* Asia/Beirut */ :array {
     :intvector { -2147483648, -1570413600, -1552186800, -1538359200, -1522551600, -1507514400, -1490583600, -1473645600, -1460948400, -399866400, -386650800, -368330400, -355114800, -336794400, -323578800, -305172000, -291956400, -273636000, -260420400, 78012000, 86734800, 105055200, 118270800, 136591200, 149806800, 168127200, 181342800, 199749600, 212965200, 231285600, 244501200, 262735200, 275950800, 452210400, 466722000, 483746400, 498258000, 515282400, 529794000, 546818400, 561330000, 581119200, 592952400, 610754400, 624488400, 641512800, 656024400, 673048800, 687560400, 704671200, 718146000, 733269600, 748990800, 764719200, 780440400, 796168800, 811890000, 828223200, 843944400, 859672800, 875394000, 891122400, 906843600, 922572000, 941317200 }
     :intvector { 7200, 0, 7200, 3600 }
     :bin { "0001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "Lebanon"
     :intvector { 7200, 2000 }
-  } //Z#230
+  } //Z#232
 ,  /* Asia/Bishkek */ :array {
     :intvector { -2147483648, -1441169904, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 683582400, 703018800, 717530400, 734468400, 748980000, 765918000, 780429600, 797367600, 811879200, 828817200, 843933600, 859671000, 877811400, 891120600, 909261000, 922570200, 941315400, 954019800, 972765000, 985469400, 1004214600, 1017523800, 1035664200, 1048973400, 1067113800, 1080423000, 1099168200, 1111872600, 1123783200 }
     :intvector { 17904, 0, 18000, 0, 18000, 3600, 21600, 0, 21600, 3600 }
     :bin { "0001030403040304030403040304030403040304030403020102010201020102010201020102010201020102010201020102010203" }
-  } //Z#231
+  } //Z#233
 ,  /* Asia/Brunei */ :array {
     :intvector { -2147483648, -1383464380, -1167636600 }
     :intvector { 27000, 0, 27580, 0, 28800, 0 }
     :bin { "010002" }
-  } //Z#232
+  } //Z#234
 ,  /* Asia/Calcutta */ :array {
     :intvector { -2147483648, -891582800, -872058600, -862637400, -764145000 }
     :intvector { 19800, 0, 19800, 3600, 21200, 0, 23400, 0 }
     :bin { "0203000100" }
-    :intvector { 233, 476 }
-  } //Z#233
+    :intvector { 235, 478 }
+  } //Z#235
 ,  /* Asia/Choibalsan */ :array {
     :intvector { -2147483648, -2032933080, 252435600, 417974400, 433778400, 449593200, 465314400, 481042800, 496764000, 512492400, 528213600, 543942000, 559663200, 575391600, 591112800, 606841200, 622562400, 638290800, 654616800, 670345200, 686066400, 701794800, 717516000, 733244400, 748965600, 764694000, 780415200, 796143600, 811864800, 828198000, 843919200, 859647600, 875368800, 891097200, 906818400, 988390800, 1001692800, 1017421200, 1033142400, 1048870800, 1064592000, 1080320400, 1096041600, 1111770000, 1127491200, 1143219600, 1159545600 }
     :intvector { 25200, 0, 27480, 0, 28800, 0, 32400, 0, 32400, 3600 }
     :bin { "0100020403040304030403040304030403040304030403040304030403040304030403040304030403040304030403" }
-  } //Z#234
+  } //Z#236
 ,  /* Asia/Chongqing */ :array {
     :intvector { -2147483648, -1325487980, 325962000, 515520000, 527007600, 545155200, 558457200, 576604800, 589906800, 608659200, 621961200, 640108800, 653410800, 671558400, 684860400 }
     :intvector { 25200, 0, 25580, 0, 28800, 0, 28800, 3600 }
     :bin { "010002030203020302030203020302" }
-    :intvector { 235, 236 }
-  } //Z#235
-,  /* Asia/Chungking */ :int { 235 } //Z#236
+    :intvector { 237, 238 }
+  } //Z#237
+,  /* Asia/Chungking */ :int { 237 } //Z#238
 ,  /* Asia/Colombo */ :array {
     :intvector { -2147483648, -2019705572, -883287000, -862639200, -764051400, 832962600, 846266400, 1145039400 }
     :intvector { 19172, 0, 19800, 0, 19800, 1800, 19800, 3600, 21600, 0, 23400, 0 }
     :bin { "0001020301050401" }
-  } //Z#237
-,  /* Asia/Dacca */ :int { 240 } //Z#238
+  } //Z#239
+,  /* Asia/Dacca */ :int { 242 } //Z#240
 ,  /* Asia/Damascus */ :array {
-    :intvector { -2147483648, -1577931912, -1568592000, -1554080400, -1537142400, -1522630800, -1505692800, -1491181200, -1474243200, -1459126800, -242265600, -228877200, -210556800, -197427600, -178934400, -165718800, -147398400, -134269200, -116467200, -102646800, -84326400, -71110800, -52704000, -39488400, -21168000, -7952400, 10368000, 23583600, 41904000, 55119600, 73526400, 86742000, 105062400, 118278000, 136598400, 149814000, 168134400, 181350000, 199756800, 212972400, 231292800, 241916400, 262828800, 273452400, 418694400, 433810800, 450316800, 465433200, 508896000, 529196400, 541555200, 562633200, 574387200, 594255600, 607305600, 623199600, 638928000, 654649200, 670456800, 686264400, 702684000, 717886800, 733096800, 748904400, 765151200, 780958800, 796687200, 812494800, 828309600, 844117200, 859759200, 875653200, 891208800, 907189200, 922917600, 938725200, 954540000, 970347600, 986076000, 1001883600, 1017612000, 1033419600, 1049148000, 1064955600, 1080770400, 1096578000, 1112306400, 1128114000, 1143842400, 1158872400, 1175205600, 1191186000 }
+    :intvector { -2147483648, -1577931912, -1568592000, -1554080400, -1537142400, -1522630800, -1505692800, -1491181200, -1474243200, -1459126800, -242265600, -228877200, -210556800, -197427600, -178934400, -165718800, -147398400, -134269200, -116467200, -102646800, -84326400, -71110800, -52704000, -39488400, -21168000, -7952400, 10368000, 23583600, 41904000, 55119600, 73526400, 86742000, 105062400, 118278000, 136598400, 149814000, 168134400, 181350000, 199756800, 212972400, 231292800, 241916400, 262828800, 273452400, 418694400, 433810800, 450316800, 465433200, 508896000, 529196400, 541555200, 562633200, 574387200, 594255600, 607305600, 623199600, 638928000, 654649200, 670456800, 686264400, 702684000, 717886800, 733096800, 748904400, 765151200, 780958800, 796687200, 812494800, 828309600, 844117200, 859759200, 875653200, 891208800, 907189200, 922917600, 938725200, 954540000, 970347600, 986076000, 1001883600, 1017612000, 1033419600, 1049148000, 1064955600, 1080770400, 1096578000, 1112306400, 1128114000, 1143842400, 1158872400, 1175205600, 1193950800 }
     :intvector { 7200, 0, 7200, 3600, 8712, 0 }
     :bin { "0200010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "Syria"
     :intvector { 7200, 2008 }
-  } //Z#239
+  } //Z#241
 ,  /* Asia/Dhaka */ :array {
     :intvector { -2147483648, -891582800, -872058600, -862637400, -576138600, 38772000 }
     :intvector { 19800, 0, 21200, 0, 21600, 0, 23400, 0 }
     :bin { "010300030202" }
-    :intvector { 238, 240, 341 }
-  } //Z#240
+    :intvector { 240, 242, 343 }
+  } //Z#242
 ,  /* Asia/Dili */ :array {
     :intvector { -2147483648, -1830414140, -879152400, -766054800, 199897200, 969120000 }
     :intvector { 28800, 0, 30140, 0, 32400, 0 }
     :bin { "010002020002" }
-  } //Z#241
+  } //Z#243
 ,  /* Asia/Dubai */ :array {
     :intvector { -2147483648, -1577936472 }
     :intvector { 13272, 0, 14400, 0 }
     :bin { "0001" }
-  } //Z#242
+  } //Z#244
 ,  /* Asia/Dushanbe */ :array {
     :intvector { -2147483648, -1441168512, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 684363600 }
     :intvector { 16512, 0, 18000, 0, 18000, 3600, 21600, 0, 21600, 3600 }
     :bin { "00010304030403040304030403040304030403040304030201" }
-  } //Z#243
+  } //Z#245
 ,  /* Asia/Gaza */ :array {
-    :intvector { -2147483648, -933645600, -857358000, -844300800, -825822000, -812685600, -794199600, -779853600, -762656400, -748310400, -731127600, -399088800, -386650800, -368330400, -355114800, -336790800, -323654400, -305168400, -292032000, -273632400, -260496000, -242096400, -228960000, -210560400, -197424000, -178938000, -165801600, -147402000, -134265600, -115866000, -102643200, -84330000, -81313200, 142380000, 150843600, 167176800, 178664400, 482277600, 495579600, 516751200, 526424400, 545436000, 558478800, 576540000, 589237200, 609890400, 620773200, 638316000, 651618000, 669765600, 683672400, 701820000, 715726800, 733701600, 747176400, 765151200, 778021200, 796600800, 810075600, 820447200, 828655200, 843170400, 860104800, 874620000, 891554400, 906069600, 915141600, 924213600, 939934800, 956268000, 971989200, 987717600, 1003438800, 1019167200, 1034888400, 1050616800, 1066338000, 1082066400, 1096581600, 1113516000, 1128380400, 1143842400, 1158872400, 1175378400, 1192741200 }
+    :intvector { -2147483648, -933645600, -857358000, -844300800, -825822000, -812685600, -794199600, -779853600, -762656400, -748310400, -731127600, -399088800, -386650800, -368330400, -355114800, -336790800, -323654400, -305168400, -292032000, -273632400, -260496000, -242096400, -228960000, -210560400, -197424000, -178938000, -165801600, -147402000, -134265600, -115866000, -102643200, -84330000, -81313200, 142380000, 150843600, 167176800, 178664400, 482277600, 495579600, 516751200, 526424400, 545436000, 558478800, 576540000, 589237200, 609890400, 620773200, 638316000, 651618000, 669765600, 683672400, 701820000, 715726800, 733701600, 747176400, 765151200, 778021200, 796600800, 810075600, 820447200, 828655200, 843170400, 860104800, 874620000, 891554400, 906069600, 915141600, 924213600, 939934800, 956268000, 971989200, 987717600, 1003438800, 1019167200, 1034888400, 1050616800, 1066338000, 1082066400, 1096581600, 1113516000, 1128380400, 1143842400, 1158872400, 1175378400, 1189638000 }
     :intvector { 7200, 0, 7200, 3600 }
     :bin { "00010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000001000100010000010001000100010001000100010001000100" }
     "Palestine"
     :intvector { 7200, 2008 }
-  } //Z#244
+  } //Z#246
 ,  /* Asia/Harbin */ :array {
     :intvector { -2147483648, -1325492804, -1194078600, -946800000, -115894800, 325956600, 515520000, 527007600, 545155200, 558457200, 576604800, 589906800, 608659200, 621961200, 640108800, 653410800, 671558400, 684860400 }
     :intvector { 28800, 0, 28800, 3600, 30404, 0, 30600, 0, 32400, 0 }
     :bin { "020300040300010001000100010001000100" }
-  } //Z#245
+  } //Z#247
 ,  /* Asia/Hong_Kong */ :array {
     :intvector { -2147483648, -2056692996, -747981000, -728544600, -717049800, -694503000, -683785800, -668064600, -654755400, -636615000, -623305800, -605165400, -591856200, -573715800, -559801800, -542266200, -528352200, -510211800, -498112200, -478762200, -466662600, -446707800, -435213000, -415258200, -403158600, -383808600, -371709000, -352359000, -340259400, -320909400, -308809800, -288855000, -277360200, -257405400, -245910600, -225955800, -213856200, -194506200, -182406600, -163056600, -148537800, -132816600, -117088200, -101367000, -85638600, -69312600, -53584200, -37863000, -22134600, -6413400, 9315000, 25036200, 40764600, 56485800, 72214200, 88540200, 104268600, 119989800, 135718200, 151439400, 167167800, 182889000, 198617400, 214338600, 230067000, 245788200, 295385400, 309292200, 326835000, 340741800 }
     :intvector { 27396, 0, 28800, 0, 28800, 3600 }
     :bin { "00010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" }
-    :intvector { 246, 474 }
-  } //Z#246
+    :intvector { 248, 476 }
+  } //Z#248
 ,  /* Asia/Hovd */ :array {
     :intvector { -2147483648, -2032927596, 252439200, 417978000, 433785600, 449600400, 465321600, 481050000, 496771200, 512499600, 528220800, 543949200, 559670400, 575398800, 591120000, 606848400, 622569600, 638298000, 654624000, 670352400, 686073600, 701802000, 717523200, 733251600, 748972800, 764701200, 780422400, 796150800, 811872000, 828205200, 843926400, 859654800, 875376000, 891104400, 906825600, 988398000, 1001700000, 1017428400, 1033149600, 1048878000, 1064599200, 1080327600, 1096048800, 1111777200, 1127498400, 1143226800, 1159552800 }
     :intvector { 21600, 0, 21996, 0, 25200, 0, 25200, 3600 }
     :bin { "0100020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" }
-  } //Z#247
+  } //Z#249
 ,  /* Asia/Irkutsk */ :array {
     :intvector { -2147483648, -1575874640, -1247554800, 354902400, 370710000, 386438400, 402246000, 417974400, 433782000, 449596800, 465328800, 481053600, 496778400, 512503200, 528228000, 543952800, 559677600, 575402400, 591127200, 606852000, 622576800, 638301600, 654631200, 670356000, 686084400, 695761200, 701794800, 717516000, 733255200, 748980000, 764704800, 780429600, 796154400, 811879200, 828208800, 846352800 }
     :intvector { 25040, 0, 25200, 0, 25200, 3600, 28800, 0, 28800, 3600 }
     :bin { "000103040304030403040304030403040304030403040302010304030403040304030403" }
     "Russia"
     :intvector { 28800, 1997 }
-  } //Z#248
-,  /* Asia/Istanbul */ :int { 424 } //Z#249
+  } //Z#250
+,  /* Asia/Istanbul */ :int { 426 } //Z#251
 ,  /* Asia/Jakarta */ :array {
     :intvector { -2147483648, -1451719200, -1172906400, -876641400, -766054800, -683883000, -620812800, -189415800 }
     :intvector { 25200, 0, 25632, 0, 26400, 0, 27000, 0, 28800, 0, 32400, 0 }
     :bin { "0102030503040300" }
-  } //Z#250
+  } //Z#252
 ,  /* Asia/Jayapura */ :array {
     :intvector { -2147483648, -1172913768, -799491600, -189423000 }
     :intvector { 32400, 0, 33768, 0, 34200, 0 }
     :bin { "01000200" }
-  } //Z#251
+  } //Z#253
 ,  /* Asia/Jerusalem */ :array {
     :intvector { -2147483648, -1641003640, -933645600, -857358000, -844300800, -825822000, -812685600, -794199600, -779853600, -762656400, -748310400, -731127600, -681962400, -673243200, -667962000, -652327200, -636426000, -622087200, -608947200, -591847200, -572486400, -558576000, -542851200, -527731200, -514425600, -490845600, -482986800, -459475200, -451537200, -428551200, -418262400, -400032000, -387428400, 142380000, 150843600, 167176800, 178664400, 482277600, 495579600, 516751200, 526424400, 545436000, 558478800, 576540000, 589237200, 609890400, 620773200, 638316000, 651618000, 669765600, 683672400, 701820000, 715726800, 733701600, 747176400, 765151200, 778021200, 796600800, 810075600, 826840800, 842821200, 858895200, 874184400, 890344800, 905029200, 923011200, 936313200, 955670400, 970783200, 986770800, 1001282400, 1017356400, 1033941600, 1048806000, 1065132000, 1081292400, 1095804000, 1112313600, 1128812400, 1143763200, 1159657200, 1175212800, 1189897200, 1206662400, 1223161200, 1238112000, 1254006000, 1269561600, 1284246000, 1301616000, 1317510000, 1333065600, 1348354800, 1364515200, 1378594800, 1395964800, 1411858800, 1427414400, 1442703600, 1459468800, 1475967600, 1490918400, 1506207600, 1522368000, 1537052400, 1553817600, 1570316400, 1585267200, 1601161200, 1616716800, 1631401200, 1648771200, 1664665200, 1680220800, 1695510000, 1711670400, 1728169200, 1743120000, 1759014000, 1774569600, 1789858800, 1806019200, 1823122800, 1838073600, 1853362800, 1869523200, 1884207600, 1900972800, 1917471600, 1932422400, 1947711600, 1963872000, 1978556400, 1995926400, 2011820400, 2027376000, 2042060400, 2058825600, 2075324400, 2090275200, 2106169200, 2121724800, 2136409200 }
     :intvector { 7200, 0, 7200, 3600, 7200, 7200, 8440, 0 }
     :bin { "0300010001000100010001000201000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
-    :intvector { 252, 292, 490 }
-  } //Z#252
+    :intvector { 254, 294, 492 }
+  } //Z#254
 ,  /* Asia/Kabul */ :array {
     :intvector { -2147483648, -788932800 }
     :intvector { 14400, 0, 16200, 0 }
     :bin { "0001" }
-  } //Z#253
+  } //Z#255
 ,  /* Asia/Kamchatka */ :array {
     :intvector { -2147483648, -1487759676, -1247569200, 354888000, 370695600, 386424000, 402231600, 417960000, 433767600, 449582400, 465314400, 481039200, 496764000, 512488800, 528213600, 543938400, 559663200, 575388000, 591112800, 606837600, 622562400, 638287200, 654616800, 670341600, 686070000, 695746800, 701780400, 717501600, 733240800, 748965600, 764690400, 780415200, 796140000, 811864800, 828194400, 846338400 }
     :intvector { 38076, 0, 39600, 0, 39600, 3600, 43200, 0, 43200, 3600 }
     :bin { "000103040304030403040304030403040304030403040302010304030403040304030403" }
     "Russia"
     :intvector { 43200, 1997 }
-  } //Z#254
+  } //Z#256
 ,  /* Asia/Karachi */ :array {
     :intvector { -2147483648, -1988166492, -862637400, -764145000, -576135000, 38775600, 1018119660, 1033840860 }
     :intvector { 16092, 0, 18000, 0, 18000, 3600, 19800, 0, 19800, 3600 }
     :bin { "0003040301010201" }
-    :intvector { 255, 511 }
-  } //Z#255
+    :intvector { 257, 513 }
+  } //Z#257
 ,  /* Asia/Kashgar */ :array {
     :intvector { -2147483648, -1325480636, -946791000, 325969200, 515520000, 527007600, 545155200, 558457200, 576604800, 589906800, 608659200, 621961200, 640108800, 653410800, 671558400, 684860400 }
     :intvector { 18000, 0, 18236, 0, 19800, 0, 28800, 0, 28800, 3600 }
     :bin { "01020003040304030403040304030403" }
-  } //Z#256
+  } //Z#258
 ,  /* Asia/Katmandu */ :array {
     :intvector { -2147483648, -1577943676, 504901800 }
     :intvector { 19800, 0, 20476, 0, 20700, 0 }
     :bin { "010002" }
-  } //Z#257
+  } //Z#259
 ,  /* Asia/Krasnoyarsk */ :array {
     :intvector { -2147483648, -1577513480, -1247551200, 354906000, 370713600, 386442000, 402249600, 417978000, 433785600, 449600400, 465332400, 481057200, 496782000, 512506800, 528231600, 543956400, 559681200, 575406000, 591130800, 606855600, 622580400, 638305200, 654634800, 670359600, 686088000, 695764800, 701798400, 717519600, 733258800, 748983600, 764708400, 780433200, 796158000, 811882800, 828212400, 846356400 }
     :intvector { 21600, 0, 21600, 3600, 22280, 0, 25200, 0, 25200, 3600 }
     :bin { "020003040304030403040304030403040304030403040301000304030403040304030403" }
     "Russia"
     :intvector { 25200, 1997 }
-  } //Z#258
+  } //Z#260
 ,  /* Asia/Kuala_Lumpur */ :array {
     :intvector { -2147483648, -2038200925, -1167634800, -1073028000, -894180000, -879665400, -767005200, 378664200 }
     :intvector { 24925, 0, 25200, 0, 25200, 1200, 26400, 0, 27000, 0, 28800, 0, 32400, 0 }
     :bin { "0001020304060405" }
-  } //Z#259
+  } //Z#261
 ,  /* Asia/Kuching */ :array {
     :intvector { -2147483648, -1383463280, -1167636600, -1082448000, -1074586800, -1050825600, -1042964400, -1019289600, -1011428400, -987753600, -979892400, -956217600, -948356400, -924595200, -916734000, -893059200, -885198000, -879667200, -767005200, 378662400 }
     :intvector { 26480, 0, 27000, 0, 28800, 0, 28800, 1200, 32400, 0 }
     :bin { "0001020302030203020302030203020302040202" }
-  } //Z#260
+  } //Z#262
 ,  /* Asia/Kuwait */ :array {
     :intvector { -2147483648, -631163516 }
     :intvector { 10800, 0, 11516, 0 }
     :bin { "0100" }
-  } //Z#261
-,  /* Asia/Macao */ :int { 263 } //Z#262
+  } //Z#263
+,  /* Asia/Macao */ :int { 265 } //Z#264
 ,  /* Asia/Macau */ :array {
     :intvector { -2147483648, -1830411260, -277360200, -257405400, -245910600, -225955800, -214473600, -194506200, -182406600, -163056600, -150969600, -131619600, -117088200, -101367000, -85638600, -69312600, -53584200, -37863000, -22134600, -6413400, 9315000, 25036200, 40764600, 56485800, 72201600, 87922800, 103651200, 119977200, 135705600, 151439400, 167167800, 182889000, 198617400, 214338600, 230067000, 245788200, 261504000, 277225200, 292953600, 309279600, 325008000, 340729200, 945619200 }
     :intvector { 27260, 0, 28800, 0, 28800, 3600 }
     :bin { "00010201020102010201020102010201020102010201020102010201020102010201020102010201020101" }
-    :intvector { 262, 263 }
-  } //Z#263
+    :intvector { 264, 265 }
+  } //Z#265
 ,  /* Asia/Magadan */ :array {
     :intvector { -2147483648, -1441188192, -1247565600, 354891600, 370699200, 386427600, 402235200, 417963600, 433771200, 449586000, 465318000, 481042800, 496767600, 512492400, 528217200, 543942000, 559666800, 575391600, 591116400, 606841200, 622566000, 638290800, 654620400, 670345200, 686073600, 695750400, 701784000, 717505200, 733244400, 748969200, 764694000, 780418800, 796143600, 811868400, 828198000, 846342000 }
     :intvector { 36000, 0, 36000, 3600, 36192, 0, 39600, 0, 39600, 3600 }
     :bin { "020003040304030403040304030403040304030403040301000304030403040304030403" }
     "Russia"
     :intvector { 39600, 1997 }
-  } //Z#264
+  } //Z#266
 ,  /* Asia/Makassar */ :array {
     :intvector { -2147483648, -1577951856, -1172908656, -880272000, -766054800 }
     :intvector { 28656, 0, 28800, 0, 32400, 0 }
     :bin { "0000010201" }
-    :intvector { 265, 296 }
-  } //Z#265
+    :intvector { 267, 298 }
+  } //Z#267
 ,  /* Asia/Manila */ :array {
     :intvector { -2147483648, -1046678400, -1038733200, -873273600, -794221200, -496224000, -489315600, 259344000, 275151600 }
     :intvector { 28800, 0, 28800, 3600, 32400, 0 }
     :bin { "000100020001000100" }
-  } //Z#266
+  } //Z#268
 ,  /* Asia/Muscat */ :array {
     :intvector { -2147483648, -1577937260 }
     :intvector { 14060, 0, 14400, 0 }
     :bin { "0001" }
-  } //Z#267
+  } //Z#269
 ,  /* Asia/Nicosia */ :array {
     :intvector { -2147483648, -1518920008, 166572000, 182293200, 200959200, 213829200, 228866400, 243982800, 260316000, 276123600, 291765600, 307486800, 323820000, 338936400, 354664800, 370386000, 386114400, 401835600, 417564000, 433285200, 449013600, 465339600, 481068000, 496789200, 512517600, 528238800, 543967200, 559688400, 575416800, 591138000, 606866400, 622587600, 638316000, 654642000, 670370400, 686091600, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796168800, 811890000, 828223200, 843944400, 859672800, 875394000, 891122400, 909277200, 922582800, 941331600 }
     :intvector { 7200, 0, 7200, 3600, 8008, 0 }
     :bin { "02000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "EUAsia"
     :intvector { 7200, 2000 }
-    :intvector { 268, 438 }
-  } //Z#268
+    :intvector { 270, 440 }
+  } //Z#270
 ,  /* Asia/Novosibirsk */ :array {
     :intvector { -2147483648, -1579476700, -1247551200, 354906000, 370713600, 386442000, 402249600, 417978000, 433785600, 449600400, 465332400, 481057200, 496782000, 512506800, 528231600, 543956400, 559681200, 575406000, 591130800, 606855600, 622580400, 638305200, 654634800, 670359600, 686088000, 695764800, 701798400, 717519600, 733258800, 738086400, 748987200, 764712000, 780436800, 796161600, 811886400, 828216000, 846360000 }
     :intvector { 19900, 0, 21600, 0, 21600, 3600, 25200, 0, 25200, 3600 }
     :bin { "00010304030403040304030403040304030403040304030201030403040201020102010201" }
     "Russia"
     :intvector { 21600, 1997 }
-  } //Z#269
+  } //Z#271
 ,  /* Asia/Omsk */ :array {
     :intvector { -2147483648, -1582088016, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 686091600, 695768400, 701802000, 717523200, 733262400, 748987200, 764712000, 780436800, 796161600, 811886400, 828216000, 846360000 }
     :intvector { 17616, 0, 18000, 0, 18000, 3600, 21600, 0, 21600, 3600 }
     :bin { "000103040304030403040304030403040304030403040302010304030403040304030403" }
     "Russia"
     :intvector { 21600, 1997 }
-  } //Z#270
+  } //Z#272
 ,  /* Asia/Oral */ :array {
     :intvector { -2147483648, -1441164324, -1247544000, 354913200, 370720800, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622591200, 638316000, 654645600, 662673600, 692827200, 701809200, 717530400, 733269600, 748994400, 764719200, 780444000, 796168800, 811893600, 828223200, 846367200, 859672800, 877816800, 891122400, 909266400, 922572000, 941320800, 954021600, 972770400, 985471200, 1004220000, 1017525600, 1035669600, 1048975200, 1067119200, 1080424800, 1099173600, 1110830400 }
     :intvector { 12324, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 }
     :bin { "00010304050403040304030403040304030403020102010101020102010201020102010201020102010201020102010201020103" }
-  } //Z#271
+  } //Z#273
 ,  /* Asia/Phnom_Penh */ :array {
     :intvector { -2147483648, -2005973980, -1855983920, -1819954800, -1220428800 }
     :intvector { 25180, 0, 25200, 0, 25580, 0, 28800, 0 }
     :bin { "0002010301" }
-  } //Z#272
+  } //Z#274
 ,  /* Asia/Pontianak */ :array {
     :intvector { -2147483648, -1946186240, -1172906240, -881220600, -766054800, -683883000, -620812800, -189415800, 567964800 }
     :intvector { 25200, 0, 26240, 0, 27000, 0, 28800, 0, 32400, 0 }
     :bin { "010102040203020300" }
-  } //Z#273
+  } //Z#275
 ,  /* Asia/Pyongyang */ :array {
     :intvector { -2147483648, -2053931400, -1325494800, -1199262600, -498128400, -264931200 }
     :intvector { 28800, 0, 30600, 0, 32400, 0 }
     :bin { "010201020002" }
-  } //Z#274
+  } //Z#276
 ,  /* Asia/Qatar */ :array {
     :intvector { -2147483648, -1577935568, 76190400 }
     :intvector { 10800, 0, 12368, 0, 14400, 0 }
     :bin { "010200" }
-  } //Z#275
+  } //Z#277
 ,  /* Asia/Qyzylorda */ :array {
     :intvector { -2147483648, -1441167712, -1247544000, 354913200, 370720800, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 662670000, 692823600, 695768400, 701802000, 717523200, 733262400, 748987200, 764712000, 780436800, 796161600, 811886400, 828216000, 846360000, 859665600, 877809600, 891115200, 909259200, 922564800, 941313600, 954014400, 972763200, 985464000, 1004212800, 1017518400, 1035662400, 1048968000, 1067112000, 1080417600, 1099166400, 1110823200 }
     :intvector { 14400, 0, 15712, 0, 18000, 0, 18000, 3600, 21600, 0, 21600, 3600 }
     :bin { "0100020304030203020302030203020302030203020302020204050405040504050405040504050405040504050405040504050404" }
-  } //Z#276
+  } //Z#278
 ,  /* Asia/Rangoon */ :array {
     :intvector { -2147483648, -1577946276, -873268200, -778410000 }
     :intvector { 23076, 0, 23400, 0, 32400, 0 }
     :bin { "00010201" }
-  } //Z#277
+  } //Z#279
 ,  /* Asia/Riyadh */ :array {
     :intvector { -2147483648, -631163212 }
     :intvector { 10800, 0, 11212, 0 }
     :bin { "0100" }
-  } //Z#278
+  } //Z#280
 ,  /* Asia/Riyadh87 */ :array {
     :intvector { -2147483648, 536489776, 536576206, 536662631, 536749061, 536835486, 536921916, 537008341, 537094766, 537181191, 537267616, 537354041, 537440466, 537526886, 537613311, 537699731, 537786151, 537872571, 537958991, 538045411, 538131831, 538218246, 538304666, 538391081, 538477496, 538563911, 538650326, 538736736, 538823151, 538909561, 538995971, 539082381, 539168791, 539255196, 539341606, 539428011, 539514416, 539600821, 539687226, 539860031, 540378426, 540551221, 540637616, 540724011, 540810406, 540896801, 540983191, 541069586, 541155976, 541242366, 541328756, 541415146, 541501536, 541587926, 541674316, 541760701, 541847091, 541933476, 542019861, 542106251, 542192636, 542279021, 542365406, 542451791, 542538171, 542624556, 542710941, 542797326, 542883706, 542970091, 543056471, 543142856, 543229236, 543315621, 543402001, 543488386, 543574766, 543661146, 543747531, 543833911, 543920291, 544006676, 544093056, 544179441, 544265821, 544352201, 544438586, 544524966, 544611351, 544697731, 544784116, 544870501, 544956881, 545043266, 545129651, 545216031, 545302416, 545388801, 545475186, 545561571, 545647961, 545734346, 545820731, 545907121, 545993506, 546079896, 546166281, 546252671, 546339061, 546425451, 546511841, 546598231, 546684621, 546771011, 546857406, 546943796, 547030191, 547116586, 547202981, 547289376, 547375771, 547462166, 547548561, 547721356, 548412561, 548585366, 548671771, 548758176, 548844581, 548930986, 549017391, 549103796, 549190206, 549276611, 549363021, 549449426, 549535836, 549622246, 549708656, 549795066, 549881476, 549967886, 550054296, 550140706, 550227121, 550313531, 550399946, 550486356, 550572766, 550659181, 550745591, 550832006, 550918421, 551004831, 551091246, 551177656, 551264071, 551350486, 551436896, 551523311, 551609721, 551696136, 551782546, 551868961, 551955371, 552041786, 552128196, 552214606, 552301021, 552387431, 552473841, 552560251, 552646661, 552733071, 552819481, 552905891, 552992296, 553078706, 553165116, 553251521, 553337926, 553424336, 553510741, 553597!
 146, 553683551, 553856356, 553942761, 554201966, 554547561, 554806756, 554893151, 554979546, 555065941, 555152336, 555238731, 555325126, 555411516, 555497911, 555584301, 555670691, 555757081, 555843471, 555929861, 556016251, 556102641, 556189026, 556275416, 556361801, 556448186, 556534571, 556620956, 556707341, 556793726, 556880111, 556966496, 557052876, 557139261, 557225641, 557312026, 557398406, 557484786, 557571166, 557657551, 557743931, 557830311, 557916691, 558003071, 558089451, 558175826, 558262206, 558348586, 558434966, 558521346, 558607721, 558694101, 558780481, 558866861, 558953236, 559039616, 559125996, 559212371, 559298751, 559385131, 559471511, 559557891, 559644271, 559730646, 559817026, 559903406, 559989786, 560076166, 560162551, 560248931, 560335311, 560421691, 560508076, 560594456, 560680841, 560767221, 560853606, 560939991, 561026376, 561112761, 561199146, 561285531, 561371921, 561458306, 561544696, 561631081, 561717471, 561803861, 561890251, 561976641, 562063036, 562149426, 562235821, 562322211, 562408606, 562495001, 562667796, 562840591, 563186196, 563359001, 563445406, 563531811, 563618216, 563704621, 563791031, 563877436, 563963846, 564050256, 564136666, 564223081, 564309491, 564395906, 564482321, 564568736, 564655151, 564741566, 564827986, 564914406, 565000821, 565087241, 565173661, 565260086, 565346506, 565432926, 565519351, 565605776, 565692201, 565778626, 565865051, 565951476, 566037901, 566124326, 566210756, 566297181, 566383611, 566470041, 566556466, 566642896, 566729326, 566815756, 566902186, 566988616, 567075046, 567161476, 567247906, 567334336, 567420766, 567507196, 567593621, 567680051, 567766481, 567852911, 567939341, 567982541 }
     :intvector { 11224, -855, 11224, -850, 11224, -845, 11224, -840, 11224, -835, 11224, -830, 11224, -825, 11224, -820, 11224, -815, 11224, -810, 11224, -805, 11224, -800, 11224, -795, 11224, -790, 11224, -785, 11224, -780, 11224, -775, 11224, -770, 11224, -760, 11224, -750, 11224, -740, 11224, -735, 11224, -725, 11224, -720, 11224, -715, 11224, -705, 11224, -700, 11224, -690, 11224, -685, 11224, -675, 11224, -670, 11224, -660, 11224, -655, 11224, -645, 11224, -635, 11224, -630, 11224, -615, 11224, -595, 11224, -580, 11224, -575, 11224, -565, 11224, -555, 11224, -550, 11224, -535, 11224, -530, 11224, -515, 11224, -510, 11224, -495, 11224, -490, 11224, -480, 11224, -465, 11224, -460, 11224, -445, 11224, -440, 11224, -425, 11224, -415, 11224, -410, 11224, -390, 11224, -385, 11224, -380, 11224, -375, 11224, -370, 11224, -365, 11224, -360, 11224, -355, 11224, -350, 11224, -345, 11224, -340, 11224, -335, 11224, -330, 11224, -325, 11224, -320, 11224, -315, 11224, -310, 11224, -305, 11224, -300, 11224, -295, 11224, -285, 11224, -280, 11224, -275, 11224, -265, 11224, -255, 11224, -250, 11224, -245, 11224, -240, 11224, -230, 11224, -225, 11224, -220, 11224, -210, 11224, -200, 11224, -195, 11224, -190, 11224, -185, 11224, -180, 11224, -175, 11224, -170, 11224, -165, 11224, -160, 11224, -155, 11224, -150, 11224, -145, 11224, -140, 11224, -135, 11224, -125, 11224, -120, 11224, -110, 11224, -105, 11224, -100, 11224, -95, 11224, -90, 11224, -85, 11224, -80, 11224, -75, 11224, -70, 11224, -65, 11224, -55, 11224, -50, 11224, -45, 11224, -40, 11224, -30, 11224, -25, 11224, -20, 11224, -15, 11224, -10, 11224, -5, 11224, 0, 11224, 5, 11224, 10, 11224, 15, 11224, 20, 11224, 25, 11224, 30, 11224, 40, 11224, 45, 11224, 55, 11224, 65, 11224, 70, 11224, 80, 11224, 85, 11224, 90, 11224, 95, 11224, 100, 11224, 105, 11224, 110, 11224, 115, 11224, 120, 11224, 125, 11224, 130, 11224, 135, 11224, 140, 11224, 145, 11224, 150, 11224, 155, 11224, 160, 11224, 165, 11224, 170, 11224, 180, 11224, 185, 11224, 190, 11224, 195, 11224, 200, !
 11224, 205, 11224, 210, 11224, 215, 11224, 220, 11224, 230, 11224, 250, 11224, 255, 11224, 275, 11224, 280, 11224, 295, 11224, 310, 11224, 315, 11224, 335, 11224, 340, 11224, 360, 11224, 365, 11224, 380, 11224, 395, 11224, 405, 11224, 420, 11224, 425, 11224, 445, 11224, 450, 11224, 465, 11224, 475, 11224, 485, 11224, 500, 11224, 505, 11224, 525, 11224, 530, 11224, 550, 11224, 570, 11224, 575, 11224, 590, 11224, 600, 11224, 610, 11224, 625, 11224, 645, 11224, 650, 11224, 665, 11224, 670, 11224, 685, 11224, 690, 11224, 700, 11224, 715, 11224, 720, 11224, 735, 11224, 755, 11224, 770, 11224, 785, 11224, 790, 11224, 800, 11224, 810, 11224, 815, 11224, 825, 11224, 830, 11224, 840, 11224, 845, 11224, 855, 11224, 870, 11224, 880, 11224, 885, 11224, 895, 11224, 905, 11224, 910, 11224, 915, 11224, 920, 11224, 925, 11224, 930, 11224, 935, 11224, 940, 11224, 945, 11224, 950, 11224, 955, 11224, 960, 11224, 965, 11224, 970, 11224, 975, 11224, 980, 11224, 985 }
     :bin { "7d5955514d49433e39373532302e2b2927252422201e1b1917151312100e0c0a080705040302010001020304050608090b0d0f1112131416181a1c1d1f2123242526282a2c2d2f3133343638393d4044484b4e505356585b5e6265676a6d707376787b7e8083858688898c8e90929496989a9b9c9d9e9fa0a1a2a3a4a3a2a1a09f9e9d9c9b9a98979593918f8d8b8988868583817f7c7a777573716f6c69686664615f5c5a5857555351504f4d4c4a4847454342413f3e3d3c3b3a393a3b3c3d3e3f4041434446484a4c4d4f50525456585a5d606366686b6e7274777b7f8285878a8e92979b9ea2a5a7a8aaacaeafb1b3b5b6b8babcbebfc0c2c4c5c6c8cacccecfd0d1d2d4d6d8dadbdcdddfe0e2e4e6e7e9eaecedeeeff0efeeedecebeae8e7e5e3e1dfdedcdbd9d7d5d3d1d0cfcdcbc9c7c5c3c1bfbdbbb9b7b4b2b0adaba9a6a49e99938d88847f7975706a66607d" }
-    :intvector { 279, 503 }
-  } //Z#279
+    :intvector { 281, 505 }
+  } //Z#281
 ,  /* Asia/Riyadh88 */ :array {
     :intvector { -2147483648, 568025771, 568112196, 568198626, 568285056, 568371481, 568457906, 568544336, 568630761, 568717186, 568803611, 568890036, 568976461, 569062881, 569149306, 569235726, 569322146, 569408566, 569494986, 569581406, 569667826, 569754241, 569840661, 569927076, 570013491, 570099906, 570186321, 570272736, 570359146, 570445556, 570531966, 570618376, 570704786, 570791196, 570877601, 570964011, 571050416, 571136821, 571223226, 571396031, 571914426, 572087221, 572173616, 572260011, 572346406, 572432801, 572519196, 572605586, 572691976, 572778371, 572864761, 572951151, 573037541, 573123926, 573210316, 573296706, 573383091, 573469481, 573555866, 573642251, 573728636, 573815021, 573901406, 573987791, 574074176, 574160561, 574246946, 574333326, 574419711, 574506096, 574592476, 574678861, 574765241, 574851626, 574938006, 575024386, 575110771, 575197151, 575283536, 575369916, 575456296, 575542681, 575629061, 575715441, 575801826, 575888206, 575974591, 576060971, 576147356, 576233736, 576320121, 576406501, 576492886, 576579271, 576665651, 576752036, 576838421, 576924806, 577011191, 577097576, 577183961, 577270346, 577356736, 577443121, 577529511, 577615896, 577702286, 577788671, 577875061, 577961451, 578047841, 578134231, 578220626, 578307016, 578393406, 578479801, 578566191, 578652586, 578738981, 578825376, 578911771, 578998166, 579084561, 579257356, 579948561, 580121366, 580207771, 580294176, 580380581, 580466986, 580553391, 580639796, 580726201, 580812611, 580899016, 580985426, 581071836, 581158246, 581244651, 581331061, 581417471, 581503886, 581590296, 581676706, 581763116, 581849531, 581935941, 582022351, 582108766, 582195176, 582281591, 582368001, 582454416, 582540831, 582627241, 582713656, 582800066, 582886481, 582972896, 583059306, 583145721, 583232131, 583318546, 583404956, 583491371, 583577781, 583664196, 583750606, 583837016, 583923426, 584009841, 584096251, 584182661, 584269071, 584355481, 584441886, 584528296, 584614706, 584701111, 584787521, 584873926, 584960331, 585046736, 585133!
 141, 585219546, 585305951, 585392356, 585478761, 585737966, 586169961, 586342756, 586429151, 586601946, 586688341, 586774731, 586861126, 586947521, 587033911, 587120301, 587206696, 587293086, 587379476, 587465866, 587552251, 587638641, 587725031, 587811416, 587897806, 587984191, 588070576, 588156961, 588243346, 588329731, 588416116, 588502496, 588588881, 588675266, 588761646, 588848026, 588934411, 589020791, 589107171, 589193551, 589279936, 589366316, 589452696, 589539076, 589625456, 589711831, 589798211, 589884591, 589970971, 590057351, 590143726, 590230106, 590316486, 590402866, 590489241, 590575621, 590662001, 590748381, 590834756, 590921136, 591007516, 591093896, 591180276, 591266651, 591353031, 591439411, 591525791, 591612171, 591698551, 591784936, 591871316, 591957696, 592044081, 592130461, 592216846, 592303226, 592389611, 592475996, 592562381, 592648766, 592735151, 592821536, 592907921, 592994311, 593080696, 593167086, 593253476, 593339861, 593426256, 593512646, 593599036, 593685426, 593771821, 593858216, 593944611, 594031006, 594117401, 594203796, 594376591, 594722196, 594895001, 595067806, 595154216, 595240621, 595327026, 595413436, 595499846, 595586256, 595672666, 595759076, 595845491, 595931901, 596018316, 596104731, 596191146, 596277566, 596363981, 596450401, 596536816, 596623236, 596709656, 596796081, 596882501, 596968921, 597055346, 597141771, 597228191, 597314616, 597401041, 597487471, 597573896, 597660321, 597746751, 597833176, 597919606, 598006031, 598092461, 598178891, 598265321, 598351751, 598438176, 598524606, 598611036, 598697466, 598783896, 598870326, 598956756, 599043186, 599129616, 599216046, 599302476, 599388906, 599475331, 599561761, 599604961 }
     :intvector { 11224, -855, 11224, -850, 11224, -845, 11224, -840, 11224, -835, 11224, -830, 11224, -825, 11224, -820, 11224, -810, 11224, -800, 11224, -795, 11224, -790, 11224, -785, 11224, -780, 11224, -775, 11224, -770, 11224, -765, 11224, -760, 11224, -750, 11224, -745, 11224, -740, 11224, -730, 11224, -715, 11224, -705, 11224, -700, 11224, -690, 11224, -685, 11224, -675, 11224, -665, 11224, -660, 11224, -650, 11224, -645, 11224, -630, 11224, -615, 11224, -610, 11224, -600, 11224, -590, 11224, -585, 11224, -570, 11224, -550, 11224, -535, 11224, -530, 11224, -520, 11224, -505, 11224, -500, 11224, -485, 11224, -465, 11224, -460, 11224, -450, 11224, -435, 11224, -430, 11224, -410, 11224, -395, 11224, -390, 11224, -385, 11224, -380, 11224, -375, 11224, -370, 11224, -365, 11224, -360, 11224, -355, 11224, -350, 11224, -345, 11224, -340, 11224, -335, 11224, -330, 11224, -325, 11224, -320, 11224, -310, 11224, -305, 11224, -300, 11224, -295, 11224, -290, 11224, -285, 11224, -280, 11224, -275, 11224, -265, 11224, -255, 11224, -250, 11224, -240, 11224, -230, 11224, -220, 11224, -215, 11224, -205, 11224, -200, 11224, -195, 11224, -185, 11224, -180, 11224, -170, 11224, -160, 11224, -155, 11224, -145, 11224, -140, 11224, -130, 11224, -125, 11224, -120, 11224, -110, 11224, -105, 11224, -100, 11224, -95, 11224, -90, 11224, -80, 11224, -75, 11224, -70, 11224, -65, 11224, -60, 11224, -55, 11224, -50, 11224, -45, 11224, -40, 11224, -35, 11224, -30, 11224, -25, 11224, -15, 11224, -10, 11224, 0, 11224, 5, 11224, 10, 11224, 15, 11224, 20, 11224, 25, 11224, 30, 11224, 35, 11224, 40, 11224, 45, 11224, 50, 11224, 55, 11224, 60, 11224, 65, 11224, 70, 11224, 80, 11224, 90, 11224, 100, 11224, 105, 11224, 110, 11224, 115, 11224, 120, 11224, 125, 11224, 130, 11224, 135, 11224, 140, 11224, 145, 11224, 150, 11224, 160, 11224, 165, 11224, 170, 11224, 175, 11224, 180, 11224, 185, 11224, 190, 11224, 195, 11224, 200, 11224, 205, 11224, 210, 11224, 215, 11224, 220, 11224, 225, 11224, 250, 11224, 255, 11224, 270, 11224, 285, 11224, 29!
 0, 11224, 310, 11224, 315, 11224, 335, 11224, 345, 11224, 355, 11224, 370, 11224, 375, 11224, 395, 11224, 400, 11224, 420, 11224, 425, 11224, 440, 11224, 455, 11224, 460, 11224, 480, 11224, 500, 11224, 505, 11224, 525, 11224, 535, 11224, 545, 11224, 560, 11224, 565, 11224, 585, 11224, 605, 11224, 625, 11224, 630, 11224, 640, 11224, 655, 11224, 660, 11224, 675, 11224, 680, 11224, 695, 11224, 715, 11224, 720, 11224, 730, 11224, 740, 11224, 750, 11224, 760, 11224, 765, 11224, 775, 11224, 780, 11224, 795, 11224, 810, 11224, 825, 11224, 830, 11224, 840, 11224, 845, 11224, 855, 11224, 860, 11224, 865, 11224, 875, 11224, 880, 11224, 885, 11224, 890, 11224, 900, 11224, 910, 11224, 915, 11224, 920, 11224, 930, 11224, 940, 11224, 950, 11224, 955, 11224, 960, 11224, 965, 11224, 970, 11224, 975, 11224, 980, 11224, 985 }
     :bin { "7355514e4a45413b3633312f2d2b2927262422201e1c1a18161513110f0d0b0908070604030201000102030405060708090a0c0e101214151617191b1d1f202123252627282a2c2d2e30323334383b3f4345494c4e50525557595b5e606366696c6f717376797b7e8082838587898b8d8e8f91929495969798999a9b9a9998979695949392908f8e8c8a8987858382817f7c7a78757371706d6a686564615f5d5b5a5857555351504f4e4c4b494745444341403e3d3c3b3a3938373635363738393a3c3d3e4042434446484b4c4d4f50525456585a5c5f6164676b6e7174787b7f8284888d9094989c9d9fa1a2a4a6a8a9abadafb0b1b3b5b7b8b9babcbec0c1c2c4c6c8cacbcccdcfd1d3d5d7d8dadbdcdddedfe0e1e2e3e4e5e4e3e2e0dfdedddcdbd9d8d6d4d2d0cecccbc9c7c5c3c1bfbdbbb9b8b6b4b2b0aeacaaa7a5a3a09e9c97918c86827d77726d67625d5a5673" }
-    :intvector { 280, 504 }
-  } //Z#280
+    :intvector { 282, 506 }
+  } //Z#282
 ,  /* Asia/Riyadh89 */ :array {
     :intvector { -2147483648, 599648191, 599734621, 599821046, 599907476, 599993901, 600080326, 600166751, 600253181, 600339606, 600426031, 600512451, 600598876, 600685301, 600771721, 600858141, 600944561, 601030981, 601117401, 601203821, 601290241, 601376656, 601463071, 601549491, 601635906, 601722316, 601808731, 601895146, 601981556, 602067966, 602154376, 602240786, 602327196, 602413601, 602500011, 602586416, 602672821, 602759226, 602932031, 603104836, 603364031, 603536826, 603709621, 603796016, 603882411, 603968806, 604055196, 604141591, 604227981, 604314371, 604400761, 604487151, 604573541, 604659931, 604746321, 604832706, 604919096, 605005481, 605091871, 605178256, 605264641, 605351026, 605437411, 605523796, 605610181, 605696566, 605782946, 605869331, 605955716, 606042096, 606128481, 606214861, 606301246, 606387626, 606474011, 606560391, 606646771, 606733156, 606819536, 606905916, 606992301, 607078681, 607165066, 607251446, 607337826, 607424211, 607510591, 607596976, 607683356, 607769741, 607856121, 607942506, 608028886, 608115271, 608201656, 608288041, 608374426, 608460811, 608547196, 608633581, 608719966, 608806351, 608892736, 608979126, 609065511, 609151901, 609238286, 609324676, 609411066, 609497456, 609583846, 609670236, 609756626, 609843016, 609929411, 610015801, 610102196, 610188586, 610274981, 610361376, 610447771, 610534166, 610706961, 610879756, 611484561, 611657366, 611743771, 611916576, 612002981, 612089391, 612175796, 612262201, 612348611, 612435016, 612521426, 612607831, 612694241, 612780651, 612867061, 612953471, 613039881, 613126291, 613212701, 613299116, 613385526, 613471936, 613558351, 613644761, 613731176, 613817586, 613904001, 613990411, 614076826, 614163241, 614249651, 614336066, 614422476, 614508891, 614595306, 614681716, 614768131, 614854541, 614940956, 615027366, 615113781, 615200191, 615286601, 615373016, 615459426, 615545836, 615632246, 615718656, 615805066, 615891476, 615977886, 616064296, 616150701, 616237111, 616323516, 616409926, 616496331, 616582736, 616669141, 616755!
 546, 616841951, 616928356, 617101161, 617273966, 617705961, 617878756, 618051551, 618137946, 618224341, 618310736, 618397126, 618483521, 618569911, 618656306, 618742696, 618829086, 618915476, 619001866, 619088256, 619174646, 619261031, 619347421, 619433806, 619520191, 619606581, 619692966, 619779351, 619865736, 619952116, 620038501, 620124886, 620211266, 620297651, 620384031, 620470416, 620556796, 620643176, 620729561, 620815941, 620902321, 620988701, 621075081, 621161461, 621247841, 621334216, 621420596, 621506976, 621593356, 621679736, 621766111, 621852491, 621938871, 622025251, 622111626, 622198006, 622284386, 622370766, 622457141, 622543521, 622629901, 622716281, 622802661, 622889041, 622975416, 623061796, 623148176, 623234561, 623320941, 623407321, 623493701, 623580086, 623666466, 623752846, 623839231, 623925616, 624011996, 624098381, 624184766, 624271151, 624357536, 624443926, 624530311, 624616696, 624703086, 624789476, 624875866, 624962256, 625048646, 625135036, 625221426, 625307821, 625394216, 625480606, 625567001, 625653396, 625826191, 626085386, 626171791, 626430996, 626517401, 626603806, 626690211, 626776616, 626863021, 626949431, 627035841, 627122251, 627208661, 627295071, 627381486, 627467896, 627554311, 627640726, 627727141, 627813561, 627899976, 627986396, 628072816, 628159231, 628245651, 628332076, 628418496, 628504916, 628591341, 628677766, 628764191, 628850611, 628937036, 629023466, 629109891, 629196316, 629282746, 629369171, 629455601, 629542026, 629628456, 629714886, 629801316, 629887741, 629974171, 630060601, 630147031, 630233461, 630319891, 630406321, 630492751, 630579181, 630665611, 630752041, 630838471, 630924896, 631011326, 631097756, 631140956 }
     :intvector { 11224, -860, 11224, -855, 11224, -850, 11224, -845, 11224, -840, 11224, -835, 11224, -830, 11224, -825, 11224, -820, 11224, -815, 11224, -810, 11224, -805, 11224, -800, 11224, -795, 11224, -790, 11224, -785, 11224, -780, 11224, -775, 11224, -770, 11224, -765, 11224, -755, 11224, -745, 11224, -740, 11224, -730, 11224, -720, 11224, -715, 11224, -705, 11224, -695, 11224, -680, 11224, -665, 11224, -650, 11224, -645, 11224, -635, 11224, -625, 11224, -620, 11224, -605, 11224, -590, 11224, -585, 11224, -570, 11224, -565, 11224, -555, 11224, -545, 11224, -540, 11224, -525, 11224, -520, 11224, -505, 11224, -500, 11224, -485, 11224, -475, 11224, -470, 11224, -455, 11224, -450, 11224, -435, 11224, -430, 11224, -415, 11224, -405, 11224, -395, 11224, -390, 11224, -385, 11224, -380, 11224, -375, 11224, -370, 11224, -365, 11224, -360, 11224, -355, 11224, -350, 11224, -345, 11224, -340, 11224, -335, 11224, -330, 11224, -325, 11224, -320, 11224, -310, 11224, -305, 11224, -300, 11224, -290, 11224, -280, 11224, -270, 11224, -260, 11224, -255, 11224, -250, 11224, -245, 11224, -240, 11224, -235, 11224, -230, 11224, -225, 11224, -215, 11224, -205, 11224, -200, 11224, -190, 11224, -180, 11224, -175, 11224, -165, 11224, -160, 11224, -155, 11224, -150, 11224, -145, 11224, -140, 11224, -130, 11224, -125, 11224, -120, 11224, -115, 11224, -110, 11224, -100, 11224, -95, 11224, -90, 11224, -80, 11224, -75, 11224, -65, 11224, -55, 11224, -50, 11224, -40, 11224, -35, 11224, -25, 11224, -20, 11224, -10, 11224, -5, 11224, 0, 11224, 10, 11224, 15, 11224, 25, 11224, 35, 11224, 40, 11224, 50, 11224, 55, 11224, 60, 11224, 65, 11224, 75, 11224, 85, 11224, 90, 11224, 95, 11224, 100, 11224, 105, 11224, 110, 11224, 115, 11224, 120, 11224, 125, 11224, 130, 11224, 135, 11224, 140, 11224, 145, 11224, 150, 11224, 160, 11224, 165, 11224, 175, 11224, 180, 11224, 185, 11224, 190, 11224, 195, 11224, 200, 11224, 205, 11224, 210, 11224, 215, 11224, 220, 11224, 235, 11224, 240, 11224, 260, 11224, 265, 11224, 285, 11224, 290, 11224, 305, 1!
 1224, 320, 11224, 325, 11224, 350, 11224, 370, 11224, 375, 11224, 390, 11224, 405, 11224, 410, 11224, 430, 11224, 435, 11224, 455, 11224, 460, 11224, 475, 11224, 485, 11224, 495, 11224, 510, 11224, 515, 11224, 535, 11224, 540, 11224, 560, 11224, 565, 11224, 580, 11224, 585, 11224, 600, 11224, 610, 11224, 615, 11224, 635, 11224, 655, 11224, 660, 11224, 675, 11224, 680, 11224, 690, 11224, 700, 11224, 710, 11224, 725, 11224, 730, 11224, 745, 11224, 760, 11224, 780, 11224, 795, 11224, 800, 11224, 810, 11224, 815, 11224, 825, 11224, 835, 11224, 840, 11224, 850, 11224, 865, 11224, 880, 11224, 890, 11224, 900, 11224, 905, 11224, 910, 11224, 915, 11224, 920, 11224, 925, 11224, 930, 11224, 935, 11224, 940, 11224, 945, 11224, 950, 11224, 955, 11224, 960, 11224, 965, 11224, 970, 11224, 975, 11224, 980, 11224, 985, 11224, 990 }
     :bin { "7556514d4a46413c373532302e2b29272523211f1d1c1b1917161412100e0c0a080705040302010001020304050608090b0d0f1113141517181a1b1c1d1e2022232426282a2c2d2f31333436383b3f4346494b4d505356585a5c606266686a6c6e70727476787a7b7e7f81838587898b8d8e8f90919394959697989998979695949291908f8e8d8c8a88868482807f7d7b7a7877757371706e6c6b69676562615e5c5a5957565552504e4d4c4b4a484746444341403f3e3d3c3b3a393a3b3c3d3e3f4142444547484a4b4c4d4f51545657595b5d616366696b6d6f727577797c7f82868a8e9195999b9d9ea0a2a3a4a6a8aaabadafb1b2b4b6b8babbbcbec0c2c4c5c6c7c8cacccecfd0d1d2d3d5d7d9dbdddedfe1e2e3e4e5e4e3e2e1e0dfdedcdad8d6d4d2d1d0cfcdcbc9c7c6c5c3c1bfbdbbb9b7b5b3b0aeaca9a7a5a3a19f9c9a96908c86807c7874706c68645f5a75" }
-    :intvector { 281, 505 }
-  } //Z#281
+    :intvector { 283, 507 }
+  } //Z#283
 ,  /* Asia/Saigon */ :array {
     :intvector { -2147483648, -2005974400, -1855983920, -1819954800, -1220428800 }
     :intvector { 25200, 0, 25580, 0, 25600, 0, 28800, 0 }
     :bin { "0201000300" }
-    :intvector { 282, 593 }
-  } //Z#282
+    :intvector { 284, 595 }
+  } //Z#284
 ,  /* Asia/Sakhalin */ :array {
     :intvector { -2147483648, -2031039048, -1009875600, -768560400, 354891600, 370699200, 386427600, 402235200, 417963600, 433771200, 449586000, 465318000, 481042800, 496767600, 512492400, 528217200, 543942000, 559666800, 575391600, 591116400, 606841200, 622566000, 638290800, 654620400, 670345200, 686073600, 695750400, 701784000, 717505200, 733244400, 748969200, 764694000, 780418800, 796143600, 811868400, 828198000, 846342000, 859647600, 877795200 }
     :intvector { 32400, 0, 34248, 0, 36000, 0, 36000, 3600, 39600, 0, 39600, 3600 }
     :bin { "010000040504050405040504050405040504050405040504030204050405040504050405040302" }
     "Russia"
     :intvector { 36000, 1998 }
-  } //Z#283
+  } //Z#285
 ,  /* Asia/Samarkand */ :array {
     :intvector { -2147483648, -1441168032, -1247544000, 354913200, 370720800, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 683661600, 686091600, 694206000 }
     :intvector { 14400, 0, 16032, 0, 18000, 0, 18000, 3600, 21600, 0 }
     :bin { "010002030403020302030203020302030203020302030203030202" }
-  } //Z#284
+  } //Z#286
 ,  /* Asia/Seoul */ :array {
     :intvector { -2147483648, -2053931400, -1325494800, -1199262600, -498128400, -303984000, -293533200, -264931200, -39515400, 547570800, 560872800, 579020400, 592322400 }
     :intvector { 28800, 0, 28800, 3600, 30600, 0, 32400, 0, 32400, 3600 }
     :bin { "02030203000100020304030403" }
-    :intvector { 285, 560 }
-  } //Z#285
+    :intvector { 287, 562 }
+  } //Z#287
 ,  /* Asia/Shanghai */ :array {
     :intvector { -2147483648, -1325491552, -933494400, -923130000, -908784000, -891594000, 515520000, 527007600, 545155200, 558457200, 576604800, 589906800, 608659200, 621961200, 640108800, 653410800, 671558400, 684860400 }
     :intvector { 28800, 0, 28800, 3600, 29152, 0 }
     :bin { "020001000100010001000100010001000100" }
-    :intvector { 286, 351, 513 }
-  } //Z#286
+    :intvector { 288, 353, 515 }
+  } //Z#288
 ,  /* Asia/Singapore */ :array {
     :intvector { -2147483648, -2038200925, -1167634800, -1073028000, -894180000, -879665400, -767005200, -138785400, 378664200 }
     :intvector { 24925, 0, 25200, 0, 25200, 1200, 26400, 0, 27000, 0, 28800, 0, 32400, 0 }
     :bin { "000102030406040405" }
-    :intvector { 287, 562 }
-  } //Z#287
+    :intvector { 289, 564 }
+  } //Z#289
 ,  /* Asia/Taipei */ :array {
     :intvector { -2147483648, -778579200, -765363600, -747043200, -733827600, -715507200, -702291600, -683884800, -670669200, -652348800, -639133200, -620812800, -607597200, -589276800, -576061200, -562924800, -541760400, -528710400, -510224400, -497174400, -478688400, -465638400, -449830800, -434016000, -418208400, -402480000, -386672400, -370944000, -355136400, -339408000, -323600400, -302515200, -291978000, -270979200, -260442000, 133977600, 149785200, 165513600, 181321200, 331142400, 339087600 }
     :intvector { 28800, 0, 28800, 3600 }
     :bin { "0001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
-    :intvector { 288, 559 }
-  } //Z#288
+    :intvector { 290, 561 }
+  } //Z#290
 ,  /* Asia/Tashkent */ :array {
     :intvector { -2147483648, -1441168632, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 683661600, 686091600, 694206000 }
     :intvector { 16632, 0, 18000, 0, 18000, 3600, 21600, 0, 21600, 3600 }
     :bin { "000103040304030403040304030403040304030403040302020101" }
-  } //Z#289
+  } //Z#291
 ,  /* Asia/Tbilisi */ :array {
     :intvector { -2147483648, -1441162756, -405140400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622591200, 638316000, 654645600, 670370400, 671140800, 686098800, 694213200, 701816400, 717537600, 733266000, 748987200, 764715600, 780436800, 796161600, 811882800, 828216000, 859662000, 877806000, 891115200, 909255600, 922564800, 941310000, 954014400, 972759600, 985464000, 1004209200, 1017518400, 1035658800, 1048968000, 1067108400, 1080417600, 1088276400, 1099177200, 1111878000 }
     :intvector { 10756, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 }
     :bin { "000103040304030403040304030403040304030403040302020101020102010203040304040304030403040304030403040304020103" }
-  } //Z#290
+  } //Z#292
 ,  /* Asia/Tehran */ :array {
-    :intvector { -2147483648, -1704165944, -757394744, 247177800, 259272000, 277758000, 283982400, 290809800, 306531000, 322432200, 338499000, 673216200, 685481400, 701209800, 717103800, 732745800, 748639800, 764281800, 780175800, 795817800, 811711800, 827353800, 843247800, 858976200, 874870200, 890512200, 906406200, 922048200, 937942200, 953584200, 969478200, 985206600, 1001100600, 1016742600, 1032636600, 1048278600, 1064172600, 1079814600, 1095708600, 1111437000, 1127331000 }
+    :intvector { -2147483648, -1704165944, -757394744, 247177800, 259272000, 277758000, 283982400, 290809800, 306531000, 322432200, 338499000, 673216200, 685481400, 701209800, 717103800, 732745800, 748639800, 764281800, 780175800, 795817800, 811711800, 827353800, 843247800, 858976200, 874870200, 890512200, 906406200, 922048200, 937942200, 953584200, 969478200, 985206600, 1001100600, 1016742600, 1032636600, 1048278600, 1064172600, 1079814600, 1095708600, 1111437000, 1127331000, 1206045000, 1221939000, 1237667400, 1253561400, 1269203400, 1285097400, 1300739400, 1316633400, 1332275400, 1348169400, 1363897800, 1379791800, 1395433800, 1411327800, 1426969800, 1442863800, 1458505800, 1474399800, 1490128200, 1506022200, 1521664200, 1537558200, 1553200200, 1569094200, 1584736200, 1600630200, 1616358600, 1632252600, 1647894600, 1663788600, 1679430600, 1695324600, 1710966600, 1726860600, 1742589000, 1758483000, 1774125000, 1790019000, 1805661000, 1821555000, 1837197000, 1853091000, 1868733000, 1884627000, 1900355400, 1916249400, 1931891400, 1947785400, 1963427400, 1979321400, 1994963400, 2010857400, 2026585800, 2042479800, 2058121800, 2074015800, 2089657800, 2105551800, 2121193800, 2137087800 }
     :intvector { 12344, 0, 12600, 0, 12600, 3600, 14400, 0, 14400, 3600 }
-    :bin { "0000010304030102010201020102010201020102010201020102010201020102010201020102010201" }
-    :intvector { 291, 489 }
-  } //Z#291
-,  /* Asia/Tel_Aviv */ :int { 252 } //Z#292
-,  /* Asia/Thimbu */ :int { 294 } //Z#293
+    :bin { "0000010304030102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" }
+    :intvector { 293, 491 }
+  } //Z#293
+,  /* Asia/Tel_Aviv */ :int { 254 } //Z#294
+,  /* Asia/Thimbu */ :int { 296 } //Z#295
 ,  /* Asia/Thimphu */ :array {
     :intvector { -2147483648, -706341516, 560025000 }
     :intvector { 19800, 0, 21516, 0, 21600, 0 }
     :bin { "010002" }
-    :intvector { 293, 294 }
-  } //Z#294
+    :intvector { 295, 296 }
+  } //Z#296
 ,  /* Asia/Tokyo */ :array {
     :intvector { -2147483648, -1009875600, -683794800, -672393600, -654764400, -640944000, -620290800, -609494400, -588841200, -578044800 }
     :intvector { 32400, 0, 32400, 3600 }
     :bin { "00000100010001000100" }
-    :intvector { 295, 491, 493 }
-  } //Z#295
-,  /* Asia/Ujung_Pandang */ :int { 265 } //Z#296
+    :intvector { 297, 493, 495 }
+  } //Z#297
+,  /* Asia/Ujung_Pandang */ :int { 267 } //Z#298
 ,  /* Asia/Ulaanbaatar */ :array {
     :intvector { -2147483648, -2032931252, 252435600, 417974400, 433782000, 449596800, 465318000, 481046400, 496767600, 512496000, 528217200, 543945600, 559666800, 575395200, 591116400, 606844800, 622566000, 638294400, 654620400, 670348800, 686070000, 701798400, 717519600, 733248000, 748969200, 764697600, 780418800, 796147200, 811868400, 828201600, 843922800, 859651200, 875372400, 891100800, 906822000, 988394400, 1001696400, 1017424800, 1033146000, 1048874400, 1064595600, 1080324000, 1096045200, 1111773600, 1127494800, 1143223200, 1159549200 }
     :intvector { 25200, 0, 25652, 0, 28800, 0, 28800, 3600 }
     :bin { "0100020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" }
-    :intvector { 297, 298 }
-  } //Z#297
-,  /* Asia/Ulan_Bator */ :int { 297 } //Z#298
+    :intvector { 299, 300 }
+  } //Z#299
+,  /* Asia/Ulan_Bator */ :int { 299 } //Z#300
 ,  /* Asia/Urumqi */ :array {
     :intvector { -2147483648, -1325483420, 325965600, 515520000, 527007600, 545155200, 558457200, 576604800, 589906800, 608659200, 621961200, 640108800, 653410800, 671558400, 684860400 }
     :intvector { 21020, 0, 21600, 0, 28800, 0, 28800, 3600 }
     :bin { "000102030203020302030203020302" }
-  } //Z#299
+  } //Z#301
 ,  /* Asia/Vientiane */ :array {
     :intvector { -2147483648, -2005973424, -1855983920, -1819954800, -1220428800 }
     :intvector { 24624, 0, 25200, 0, 25580, 0, 28800, 0 }
     :bin { "0002010301" }
-  } //Z#300
+  } //Z#302
 ,  /* Asia/Vladivostok */ :array {
     :intvector { -2147483648, -1487321264, -1247562000, 354895200, 370702800, 386431200, 402238800, 417967200, 433774800, 449589600, 465321600, 481046400, 496771200, 512496000, 528220800, 543945600, 559670400, 575395200, 591120000, 606844800, 622569600, 638294400, 654624000, 670348800, 686077200, 695754000, 701787600, 717508800, 733248000, 748972800, 764697600, 780422400, 796147200, 811872000, 828201600, 846345600 }
     :intvector { 31664, 0, 32400, 0, 32400, 3600, 36000, 0, 36000, 3600 }
     :bin { "000103040304030403040304030403040304030403040302010304030403040304030403" }
     "Russia"
     :intvector { 36000, 1997 }
-  } //Z#301
+  } //Z#303
 ,  /* Asia/Yakutsk */ :array {
     :intvector { -2147483648, -1579423120, -1247558400, 354898800, 370706400, 386434800, 402242400, 417970800, 433778400, 449593200, 465325200, 481050000, 496774800, 512499600, 528224400, 543949200, 559674000, 575398800, 591123600, 606848400, 622573200, 638298000, 654627600, 670352400, 686080800, 695757600, 701791200, 717512400, 733251600, 748976400, 764701200, 780426000, 796150800, 811875600, 828205200, 846349200 }
     :intvector { 28800, 0, 28800, 3600, 31120, 0, 32400, 0, 32400, 3600 }
     :bin { "020003040304030403040304030403040304030403040301000304030403040304030403" }
     "Russia"
     :intvector { 32400, 1997 }
-  } //Z#302
+  } //Z#304
 ,  /* Asia/Yekaterinburg */ :array {
     :intvector { -2147483648, -1592611344, -1247544000, 354913200, 370720800, 386449200, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 695772000, 701805600, 717526800, 733266000, 748990800, 764715600, 780440400, 796165200, 811890000, 828219600, 846363600 }
     :intvector { 14400, 0, 14400, 3600, 14544, 0, 18000, 0, 18000, 3600 }
     :bin { "020003040304030403040304030403040304030403040301000304030403040304030403" }
     "Russia"
     :intvector { 18000, 1997 }
-  } //Z#303
+  } //Z#305
 ,  /* Asia/Yerevan */ :array {
     :intvector { -2147483648, -1441162680, -405140400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622591200, 638316000, 654645600, 670370400, 685569600, 686098800, 701812800, 717534000, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 852062400, 859672800, 877816800 }
     :intvector { 10680, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 }
     :bin { "00010304030403040304030403040304030403040304030202010201020102010203030403" }
     "RussiaAsia"
     :intvector { 14400, 1998 }
-    :intvector { 304, 506 }
-  } //Z#304
+    :intvector { 306, 508 }
+  } //Z#306
 ,  /* Atlantic/Azores */ :array {
     :intvector { -2147483648, -1849557928, -1689548400, -1677794400, -1667430000, -1647730800, -1635807600, -1616194800, -1604358000, -1584658800, -1572735600, -1553036400, -1541199600, -1521500400, -1442444400, -1426806000, -1379286000, -1364770800, -1348441200, -1333321200, -1316386800, -1301266800, -1284332400, -1269817200, -1221433200, -1206918000, -1191193200, -1175468400, -1127689200, -1111964400, -1096844400, -1080514800, -1063580400, -1049065200, -1033340400, -1017615600, -1002495600, -986166000, -969231600, -950482800, -942015600, -922662000, -906937200, -891126000, -877302000, -873676800, -864000000, -857948400, -845852400, -842832000, -831340800, -825894000, -814402800, -810777600, -799891200, -794444400, -782953200, -779328000, -768441600, -762994800, -749084400, -733359600, -717624000, -701899200, -686174400, -670449600, -654724800, -639000000, -591825600, -575496000, -559771200, -544046400, -528321600, -512596800, -496872000, -481147200, -465422400, -449697600, -433972800, -417643200, -401918400, -386193600, -370468800, -354744000, -339019200, -323294400, -307569600, -291844800, -276120000, -260395200, -244670400, -228340800, -212616000, -196891200, -181166400, -165441600, -149716800, -133992000, -118267200, 228272400, 243997200, 260326800, 276051600, 291776400, 307504800, 323226000, 338954400, 354679200, 370404000, 386128800, 401853600, 417582000, 433303200, 449028000, 465357600, 481082400, 496807200, 512532000, 528256800, 543981600, 559706400, 575431200, 591156000, 606880800, 622605600, 638330400, 654660000, 670384800, 686109600, 701834400, 717559200, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { -7200, 0, -7200, 3600, -7200, 7200, -6872, 0, -3600, 0, -3600, 3600, 0, 0 }
     :bin { "03000100010001000100010001000100010001000100010001000100010001000100010001000100010001000102010001020100010201000102010001000100010001000100010001000100010001000100010001000100010001000100010001000405040504050405040504050405040504050405040504050405040504050405060504050405040504" }
     "EU"
     :intvector { -3600, 1997 }
-  } //Z#305
+  } //Z#307
 ,  /* Atlantic/Bermuda */ :array {
     :intvector { -2147483648, -1262281256, 136360800, 152082000, 167810400, 183531600, 199260000, 215586000, 230709600, 247035600, 262764000, 278485200, 294213600, 309934800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800, 544600800, 562136400, 576050400, 594190800, 607500000, 625640400, 638949600, 657090000, 671004000, 688539600, 702453600, 719989200, 733903200, 752043600, 765352800, 783493200, 796802400, 814942800, 828856800, 846392400, 860306400, 877842000, 891756000, 909291600, 923205600, 941346000, 954655200, 972795600, 986104800, 1004245200, 1018159200, 1035694800, 1049608800, 1067144400, 1081058400, 1099198800, 1112508000, 1130648400, 1143957600, 1162098000, 1173592800, 1194152400 }
     :intvector { -15544, 0, -14400, 0, -14400, 3600 }
     :bin { "00010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" }
     "US"
     :intvector { -14400, 2008 }
-  } //Z#306
+  } //Z#308
 ,  /* Atlantic/Canary */ :array {
     :intvector { -2147483648, -1509663504, -733874400, 323827200, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { -3696, 0, -3600, 0, 0, 0, 0, 3600 }
     :bin { "00010203020302030203020302030203020302030203020302030203020302030203020302" }
     "EU"
     :intvector { 0, 1997 }
-  } //Z#307
+  } //Z#309
 ,  /* Atlantic/Cape_Verde */ :array {
     :intvector { -2147483648, -1988144756, -862610400, -764118000, 186120000 }
     :intvector { -7200, 0, -7200, 3600, -5644, 0, -3600, 0 }
     :bin { "0200010003" }
-  } //Z#308
-,  /* Atlantic/Faeroe */ :int { 310 } //Z#309
+  } //Z#310
+,  /* Atlantic/Faeroe */ :int { 312 } //Z#311
 ,  /* Atlantic/Faroe */ :array {
     :intvector { -2147483648, -1955748776, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { -1624, 0, 0, 0, 0, 3600 }
     :bin { "00010201020102010201020102010201020102010201020102010201020102010201" }
     "EU"
     :intvector { 0, 1997 }
-    :intvector { 309, 310 }
-  } //Z#310
-,  /* Atlantic/Jan_Mayen */ :int { 439 } //Z#311
+    :intvector { 311, 312 }
+  } //Z#312
+,  /* Atlantic/Jan_Mayen */ :int { 441 } //Z#313
 ,  /* Atlantic/Madeira */ :array {
     :intvector { -2147483648, -1849560744, -1689552000, -1677798000, -1667433600, -1647734400, -1635811200, -1616198400, -1604361600, -1584662400, -1572739200, -1553040000, -1541203200, -1521504000, -1442448000, -1426809600, -1379289600, -1364774400, -1348444800, -1333324800, -1316390400, -1301270400, -1284336000, -1269820800, -1221436800, -1206921600, -1191196800, -1175472000, -1127692800, -1111968000, -1096848000, -1080518400, -1063584000, -1049068800, -1033344000, -1017619200, -1002499200, -986169600, -969235200, -950486400, -942019200, -922665600, -906940800, -891129600, -877305600, -873680400, -864003600, -857952000, -845856000, -842835600, -831344400, -825897600, -814406400, -810781200, -799894800, -794448000, -782956800, -779331600, -768445200, -762998400, -749088000, -733363200, -717627600, -701902800, -686178000, -670453200, -654728400, -639003600, -591829200, -575499600, -559774800, -544050000, -528325200, -512600400, -496875600, -481150800, -465426000, -449701200, -433976400, -417646800, -401922000, -386197200, -370472400, -354747600, -339022800, -323298000, -307573200, -291848400, -276123600, -260398800, -244674000, -228344400, -212619600, -196894800, -181170000, -165445200, -149720400, -133995600, -118270800, 228268800, 243993600, 260323200, 276048000, 291772800, 307501200, 323222400, 338950800, 354675600, 370400400, 386125200, 401850000, 417578400, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { -4056, 0, -3600, 0, -3600, 3600, -3600, 7200, 0, 0, 0, 3600 }
     :bin { "00010201020102010201020102010201020102010201020102010201020102010201020102010201020102010203020102030201020302010203020102010201020102010201020102010201020102010201020102010201020102010201020102010405040504050405040504050405040504050405040504050405040504050405040504050405040504" }
     "EU"
     :intvector { 0, 1997 }
-  } //Z#312
+  } //Z#314
 ,  /* Atlantic/Reykjavik */ :array {
     :intvector { -2147483648, -1956609132, -1668211200, -1647212400, -1636675200, -1613430000, -968025600, -949615200, -942008400, -920239200, -909957600, -888789600, -877903200, -857944800, -846453600, -826495200, -815004000, -795045600, -783554400, -762991200, -752104800, -731541600, -717631200, -700092000, -686181600, -668642400, -654732000, -636588000, -623282400, -605743200, -591832800, -573688800, -559778400, -542239200, -528328800, -510789600, -496879200, -479340000, -465429600, -447890400, -433980000, -415836000, -401925600, -384386400, -370476000, -352936800, -339026400, -321487200, -307576800, -290037600, -276127200, -258588000, -244677600, -226533600, -212623200, -195084000, -181173600, -163634400, -149724000, -132184800, -118274400, -100735200, -86824800, -68680800, -54770400 }
     :intvector { -5268, 0, -3600, 0, -3600, 3600, 0, 0 }
     :bin { "0001020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020103" }
-    :intvector { 313, 477 }
-  } //Z#313
+    :intvector { 315, 479 }
+  } //Z#315
 ,  /* Atlantic/South_Georgia */ :array {
     :intvector { -2147483648 }
     :intvector { -7200, 0 }
     :bin { "00" }
-  } //Z#314
+  } //Z#316
 ,  /* Atlantic/St_Helena */ :array {
     :intvector { -2147483648, -599614632 }
     :intvector { -1368, 0, 0, 0 }
     :bin { "0001" }
-  } //Z#315
+  } //Z#317
 ,  /* Atlantic/Stanley */ :array {
     :intvector { -2147483648, -1824235716, -1018209600, -1003093200, -986760000, -971643600, -954705600, -939589200, -923256000, -908139600, -891806400, -876690000, -860356800, -852066000, 420609600, 433306800, 452052000, 464151600, 483501600, 495601200, 514350000, 527054400, 545799600, 558504000, 577249200, 589953600, 608698800, 621403200, 640753200, 652852800, 672202800, 684907200, 703652400, 716356800, 735102000, 747806400, 766551600, 779256000, 798001200, 810705600, 830055600, 842760000, 861505200, 874209600, 892954800, 905659200, 924404400, 937108800, 955854000, 968558400, 987310800, 999410400 }
     :intvector { -14400, 0, -14400, 3600, -13884, 0, -10800, 0, -10800, 3600 }
     :bin { "02000100010001000100010001000304030403010001000100010001000100010001000100010001000100010001000100010001" }
     "Falk"
     :intvector { -14400, 2002 }
-  } //Z#316
-,  /* Australia/ACT */ :int { 335 } //Z#317
+  } //Z#318
+,  /* Australia/ACT */ :int { 337 } //Z#319
 ,  /* Australia/Adelaide */ :array {
     :intvector { -2147483648, -1672565340, -1665390600, -883639800, -876126600, -860398200, -844677000, -828343800, -813227400, 57688200, 67969800, 89137800, 100024200, 120587400, 131473800, 152037000, 162923400, 183486600, 194977800, 215541000, 226427400, 246990600, 257877000, 278440200, 289326600, 309889800, 320776200, 341339400, 352225800, 372789000, 384280200, 404843400, 415729800, 436293000, 447179400, 467742600, 478629000, 499192200, 511288200, 530037000, 542737800, 562091400, 574792200, 594145800, 606241800, 625595400, 637691400, 657045000, 667931400, 688494600, 701195400, 719944200, 731435400, 751998600, 764094600, 783448200, 796149000, 814897800, 828203400, 846347400, 859653000, 877797000, 891102600, 909246600, 922552200, 941301000, 954001800, 972750600, 985451400, 1004200200, 1017505800, 1035649800, 1048955400, 1067099400, 1080405000, 1099153800, 1111854600, 1130603400, 1143909000, 1162053000, 1174753800, 1193502600, 1207413000, 1223137800 }
     :intvector { 34200, 0, 34200, 3600 }
     :bin { "000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001" }
     "AS"
     :intvector { 34200, 2009 }
-    :intvector { 318, 334 }
-  } //Z#318
+    :intvector { 320, 336 }
+  } //Z#320
 ,  /* Australia/Brisbane */ :array {
     :intvector { -2147483648, -1672567140, -1665392400, -883641600, -876128400, -860400000, -844678800, -828345600, -813229200, 57686400, 67968000, 625593600, 636480000, 657043200, 667929600, 688492800, 699379200 }
     :intvector { 36000, 0, 36000, 3600 }
     :bin { "0001000100010001000100010001000100" }
-    :intvector { 319, 333 }
-  } //Z#319
+    :intvector { 321, 335 }
+  } //Z#321
 ,  /* Australia/Broken_Hill */ :array {
     :intvector { -2147483648, -1672565340, -1665390600, -883639800, -876126600, -860398200, -844677000, -828343800, -813227400, 57688200, 67969800, 89137800, 100024200, 120587400, 131473800, 152037000, 162923400, 183486600, 194977800, 215541000, 226427400, 246990600, 257877000, 278440200, 289326600, 309889800, 320776200, 341339400, 352225800, 372789000, 386699400, 404843400, 415729800, 436293000, 447179400, 467742600, 478629000, 499192200, 511288200, 530037000, 542737800, 562091400, 574792200, 594145800, 606241800, 625595400, 636481800, 657045000, 667931400, 688494600, 699381000, 719944200, 731435400, 751998600, 762885000, 783448200, 794334600, 814897800, 828203400, 846347400, 859653000, 877797000, 891102600, 909246600, 922552200, 941301000, 946647000, 954001800, 972750600, 985451400, 1004200200, 1017505800, 1035649800, 1048955400, 1067099400, 1080405000, 1099153800, 1111854600, 1130603400, 1143909000, 1162053000, 1174753800, 1193502600, 1207413000, 1223137800 }
     :intvector { 34200, 0, 34200, 3600 }
     :bin { "00010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000101000100010001000100010001000100010001" }
     "AS"
     :intvector { 34200, 2009 }
-    :intvector { 320, 339 }
-  } //Z#320
-,  /* Australia/Canberra */ :int { 335 } //Z#321
+    :intvector { 322, 341 }
+  } //Z#322
+,  /* Australia/Canberra */ :int { 337 } //Z#323
 ,  /* Australia/Currie */ :array {
     :intvector { -2147483648, -1680508800, -1665392400, -883641600, -876128400, -860400000, -844678800, -828345600, -813229200, 57686400, 67968000, 89136000, 100022400, 120585600, 131472000, 152035200, 162921600, 183484800, 194976000, 215539200, 226425600, 246988800, 257875200, 278438400, 289324800, 309888000, 320774400, 341337600, 352224000, 372787200, 386092800, 404841600, 417542400, 436291200, 447177600, 467740800, 478627200, 499190400, 510076800, 530035200, 542736000, 562089600, 574790400, 594144000, 606240000, 625593600, 637689600, 657043200, 670348800, 686678400, 701798400, 718128000, 733248000, 749577600, 764697600, 781027200, 796147200, 812476800, 828201600, 844531200, 859651200, 875980800, 891100800, 907430400, 922550400, 938880000, 954000000, 967305600, 985449600, 1002384000, 1017504000, 1033833600, 1048953600, 1065283200, 1080403200, 1096732800, 1111852800, 1128182400, 1143907200, 1159632000, 1174752000, 1191686400, 1207411200, 1223136000 }
     :intvector { 36000, 0, 36000, 3600 }
     :bin { "000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001" }
     "AT"
     :intvector { 36000, 2009 }
-  } //Z#322
+  } //Z#324
 ,  /* Australia/Darwin */ :array {
     :intvector { -2147483648, -1672565340, -1665390600, -883639800, -876126600, -860398200, -844677000, -828343800, -813227400 }
     :intvector { 34200, 0, 34200, 3600 }
     :bin { "000100010001000100" }
-    :intvector { 0, 323, 331 }
-  } //Z#323
+    :intvector { 0, 325, 333 }
+  } //Z#325
 ,  /* Australia/Eucla */ :array {
     :intvector { -2147483648, -1672562640, -1665387900, -883637100, -876123900, -860395500, -844674300, 152039700, 162926100, 436295700, 447182100, 690311700, 699383700, 1165079700, 1174756500, 1193505300, 1206810900, 1224954900, 1238260500 }
     :intvector { 31500, 0, 31500, 3600 }
     :bin { "00010001000100010001000100010001000100" }
-  } //Z#324
+  } //Z#326
 ,  /* Australia/Hobart */ :array {
     :intvector { -2147483648, -1680508800, -1665392400, -883641600, -876128400, -860400000, -844678800, -828345600, -813229200, -71136000, -55411200, -37267200, -25776000, -5817600, 5673600, 25632000, 37728000, 57686400, 67968000, 89136000, 100022400, 120585600, 131472000, 152035200, 162921600, 183484800, 194976000, 215539200, 226425600, 246988800, 257875200, 278438400, 289324800, 309888000, 320774400, 341337600, 352224000, 372787200, 386092800, 404841600, 417542400, 436291200, 447177600, 467740800, 478627200, 499190400, 510076800, 530035200, 542736000, 562089600, 574790400, 594144000, 606240000, 625593600, 637689600, 657043200, 670348800, 686678400, 701798400, 718128000, 733248000, 749577600, 764697600, 781027200, 796147200, 812476800, 828201600, 844531200, 859651200, 875980800, 891100800, 907430400, 922550400, 938880000, 954000000, 967305600, 985449600, 1002384000, 1017504000, 1033833600, 1048953600, 1065283200, 1080403200, 1096732800, 1111852800, 1128182400, 1143907200, 1159632000, 1174752000, 1191686400, 1207411200, 1223136000 }
     :intvector { 36000, 0, 36000, 3600 }
     :bin { "0001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001" }
     "AT"
     :intvector { 36000, 2009 }
-    :intvector { 325, 336 }
-  } //Z#325
-,  /* Australia/LHI */ :int { 328 } //Z#326
+    :intvector { 327, 338 }
+  } //Z#327
+,  /* Australia/LHI */ :int { 330 } //Z#328
 ,  /* Australia/Lindeman */ :array {
     :intvector { -2147483648, -1672567140, -1665392400, -883641600, -876128400, -860400000, -844678800, -828345600, -813229200, 57686400, 67968000, 625593600, 636480000, 657043200, 667929600, 688492800, 699379200, 709912800, 719942400, 731433600, 751996800, 762883200 }
     :intvector { 36000, 0, 36000, 3600 }
     :bin { "00010001000100010001000100010001000001000100" }
-  } //Z#327
+  } //Z#329
 ,  /* Australia/Lord_Howe */ :array {
     :intvector { -2147483648, 352216800, 372785400, 384273000, 404839800, 415722600, 436289400, 447172200, 467739000, 478621800, 499188600, 511282800, 530033400, 542732400, 562087800, 574786800, 594142200, 606236400, 625591800, 636476400, 657041400, 667926000, 688491000, 699375600, 719940600, 731430000, 751995000, 762879600, 783444600, 794329200, 814894200, 828198000, 846343800, 859647600, 877793400, 891097200, 909243000, 922546800, 941297400, 953996400, 967303800, 985446000, 1004196600, 1017500400, 1035646200, 1048950000, 1067095800, 1080399600, 1099150200, 1111849200, 1130599800, 1143903600, 1162049400, 1174748400, 1193499000, 1207407600, 1223134200 }
     :intvector { 36000, 0, 37800, 0, 37800, 1800, 37800, 3600 }
     :bin { "000103010301030103010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102" }
     "LH"
     :intvector { 37800, 2009 }
-    :intvector { 326, 328 }
-  } //Z#328
+    :intvector { 328, 330 }
+  } //Z#330
 ,  /* Australia/Melbourne */ :array {
     :intvector { -2147483648, -1672567140, -1665392400, -883641600, -876128400, -860400000, -844678800, -828345600, -813229200, 57686400, 67968000, 89136000, 100022400, 120585600, 131472000, 152035200, 162921600, 183484800, 194976000, 215539200, 226425600, 246988800, 257875200, 278438400, 289324800, 309888000, 320774400, 341337600, 352224000, 372787200, 384278400, 404841600, 415728000, 436291200, 447177600, 467740800, 478627200, 499190400, 511286400, 530035200, 542736000, 561484800, 574790400, 594144000, 606240000, 625593600, 637689600, 657043200, 667929600, 688492800, 699379200, 719942400, 731433600, 751996800, 762883200, 783446400, 796147200, 814896000, 828201600, 846345600, 859651200, 877795200, 891100800, 909244800, 922550400, 941299200, 954000000, 967305600, 985449600, 1004198400, 1017504000, 1035648000, 1048953600, 1067097600, 1080403200, 1099152000, 1111852800, 1130601600, 1143907200, 1162051200, 1174752000, 1193500800, 1207411200, 1223136000 }
     :intvector { 36000, 0, 36000, 3600 }
     :bin { "000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001" }
     "AV"
     :intvector { 36000, 2009 }
-    :intvector { 329, 337 }
-  } //Z#329
-,  /* Australia/NSW */ :int { 335 } //Z#330
-,  /* Australia/North */ :int { 323 } //Z#331
+    :intvector { 331, 339 }
+  } //Z#331
+,  /* Australia/NSW */ :int { 337 } //Z#332
+,  /* Australia/North */ :int { 325 } //Z#333
 ,  /* Australia/Perth */ :array {
     :intvector { -2147483648, -1672559940, -1665385200, -883634400, -876121200, -860392800, -844671600, 152042400, 162928800, 436298400, 447184800, 690314400, 699386400, 1165082400, 1174759200, 1193508000, 1206813600, 1224957600, 1238263200 }
     :intvector { 28800, 0, 28800, 3600 }
     :bin { "00010001000100010001000100010001000100" }
-    :intvector { 332, 338 }
-  } //Z#332
-,  /* Australia/Queensland */ :int { 319 } //Z#333
-,  /* Australia/South */ :int { 318 } //Z#334
+    :intvector { 334, 340 }
+  } //Z#334
+,  /* Australia/Queensland */ :int { 321 } //Z#335
+,  /* Australia/South */ :int { 320 } //Z#336
 ,  /* Australia/Sydney */ :array {
     :intvector { -2147483648, -1672567140, -1665392400, -883641600, -876128400, -860400000, -844678800, -828345600, -813229200, 57686400, 67968000, 89136000, 100022400, 120585600, 131472000, 152035200, 162921600, 183484800, 194976000, 215539200, 226425600, 246988800, 257875200, 278438400, 289324800, 309888000, 320774400, 341337600, 352224000, 372787200, 386697600, 404841600, 415728000, 436291200, 447177600, 467740800, 478627200, 499190400, 511286400, 530035200, 542736000, 562089600, 574790400, 594144000, 606240000, 625593600, 636480000, 657043200, 667929600, 688492800, 699379200, 719942400, 731433600, 751996800, 762883200, 783446400, 794332800, 814896000, 828201600, 846345600, 859651200, 877795200, 891100800, 909244800, 922550400, 941299200, 954000000, 967305600, 985449600, 1004198400, 1017504000, 1035648000, 1048953600, 1067097600, 1080403200, 1099152000, 1111852800, 1130601600, 1143907200, 1162051200, 1174752000, 1193500800, 1207411200, 1223136000 }
     :intvector { 36000, 0, 36000, 3600 }
     :bin { "000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001" }
     "AN"
     :intvector { 36000, 2009 }
-    :intvector { 1, 317, 321, 330, 335 }
-  } //Z#335
-,  /* Australia/Tasmania */ :int { 325 } //Z#336
-,  /* Australia/Victoria */ :int { 329 } //Z#337
-,  /* Australia/West */ :int { 332 } //Z#338
-,  /* Australia/Yancowinna */ :int { 320 } //Z#339
-,  /* BET */ :int { 186 } //Z#340
-,  /* BST */ :int { 240 } //Z#341
-,  /* Brazil/Acre */ :int { 182 } //Z#342
-,  /* Brazil/DeNoronha */ :int { 165 } //Z#343
-,  /* Brazil/East */ :int { 186 } //Z#344
-,  /* Brazil/West */ :int { 148 } //Z#345
-,  /* CAT */ :int { 29 } //Z#346
+    :intvector { 1, 319, 323, 332, 337 }
+  } //Z#337
+,  /* Australia/Tasmania */ :int { 327 } //Z#338
+,  /* Australia/Victoria */ :int { 331 } //Z#339
+,  /* Australia/West */ :int { 334 } //Z#340
+,  /* Australia/Yancowinna */ :int { 322 } //Z#341
+,  /* BET */ :int { 187 } //Z#342
+,  /* BST */ :int { 242 } //Z#343
+,  /* Brazil/Acre */ :int { 183 } //Z#344
+,  /* Brazil/DeNoronha */ :int { 166 } //Z#345
+,  /* Brazil/East */ :int { 187 } //Z#346
+,  /* Brazil/West */ :int { 148 } //Z#347
+,  /* CAT */ :int { 29 } //Z#348
 ,  /* CET */ :array {
     :intvector { -2147483648, -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 3600, 0, 3600, 3600 }
     :bin { "0001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "C-Eur"
     :intvector { 3600, 1997 }
-  } //Z#347
-,  /* CNT */ :int { 189 } //Z#348
-,  /* CST */ :int { 94 } //Z#349
+  } //Z#349
+,  /* CNT */ :int { 191 } //Z#350
+,  /* CST */ :int { 94 } //Z#351
 ,  /* CST6CDT */ :array {
     :intvector { -2147483648, -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -769395600, -765392400, -84384000, -68662800, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 }
     :intvector { -21600, 0, -21600, 3600 }
     :bin { "000100010001010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "US"
     :intvector { -21600, 2008 }
-  } //Z#350
-,  /* CTT */ :int { 286 } //Z#351
-,  /* Canada/Atlantic */ :int { 122 } //Z#352
-,  /* Canada/Central */ :int { 204 } //Z#353
-,  /* Canada/East-Saskatchewan */ :int { 180 } //Z#354
-,  /* Canada/Eastern */ :int { 199 } //Z#355
-,  /* Canada/Mountain */ :int { 107 } //Z#356
-,  /* Canada/Newfoundland */ :int { 189 } //Z#357
-,  /* Canada/Pacific */ :int { 201 } //Z#358
-,  /* Canada/Saskatchewan */ :int { 180 } //Z#359
-,  /* Canada/Yukon */ :int { 203 } //Z#360
-,  /* Chile/Continental */ :int { 184 } //Z#361
-,  /* Chile/EasterIsland */ :int { 520 } //Z#362
-,  /* Cuba */ :int { 123 } //Z#363
-,  /* EAT */ :int { 7 } //Z#364
-,  /* ECT */ :int { 440 } //Z#365
+  } //Z#352
+,  /* CTT */ :int { 288 } //Z#353
+,  /* Canada/Atlantic */ :int { 122 } //Z#354
+,  /* Canada/Central */ :int { 206 } //Z#355
+,  /* Canada/East-Saskatchewan */ :int { 181 } //Z#356
+,  /* Canada/Eastern */ :int { 201 } //Z#357
+,  /* Canada/Mountain */ :int { 107 } //Z#358
+,  /* Canada/Newfoundland */ :int { 191 } //Z#359
+,  /* Canada/Pacific */ :int { 203 } //Z#360
+,  /* Canada/Saskatchewan */ :int { 181 } //Z#361
+,  /* Canada/Yukon */ :int { 205 } //Z#362
+,  /* Chile/Continental */ :int { 185 } //Z#363
+,  /* Chile/EasterIsland */ :int { 522 } //Z#364
+,  /* Cuba */ :int { 123 } //Z#365
+,  /* EAT */ :int { 7 } //Z#366
+,  /* ECT */ :int { 442 } //Z#367
 ,  /* EET */ :array {
     :intvector { -2147483648, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 7200, 0, 7200, 3600 }
     :bin { "0001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "EU"
     :intvector { 7200, 1997 }
-  } //Z#366
+  } //Z#368
 ,  /* EST */ :array {
     :intvector {  }
     :intvector { -18000, 0 }
     :bin { "" }
-  } //Z#367
+  } //Z#369
 ,  /* EST5EDT */ :array {
     :intvector { -2147483648, -1633280400, -1615140000, -1601830800, -1583690400, -880218000, -769395600, -765396000, -84387600, -68666400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 126687600, 152085600, 162370800, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 }
     :intvector { -18000, 0, -18000, 3600 }
     :bin { "000100010001010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "US"
     :intvector { -18000, 2008 }
-  } //Z#368
-,  /* Egypt */ :int { 18 } //Z#369
-,  /* Eire */ :int { 419 } //Z#370
+  } //Z#370
+,  /* Egypt */ :int { 18 } //Z#371
+,  /* Eire */ :int { 421 } //Z#372
 ,  /* Etc/GMT */ :array {
     :intvector {  }
     :intvector { 0, 0 }
     :bin { "" }
-    :intvector { 371, 372, 385, 400, 401, 468, 469, 470, 471, 472 }
-  } //Z#371
-,  /* Etc/GMT+0 */ :int { 371 } //Z#372
+    :intvector { 373, 374, 387, 402, 403, 470, 471, 472, 473, 474 }
+  } //Z#373
+,  /* Etc/GMT+0 */ :int { 373 } //Z#374
 ,  /* Etc/GMT+1 */ :array {
     :intvector {  }
     :intvector { -3600, 0 }
     :bin { "" }
-  } //Z#373
+  } //Z#375
 ,  /* Etc/GMT+10 */ :array {
     :intvector {  }
     :intvector { -36000, 0 }
     :bin { "" }
-    :intvector { 374, 569 }
-  } //Z#374
+    :intvector { 376, 571 }
+  } //Z#376
 ,  /* Etc/GMT+11 */ :array {
     :intvector {  }
     :intvector { -39600, 0 }
     :bin { "" }
-  } //Z#375
+  } //Z#377
 ,  /* Etc/GMT+12 */ :array {
     :intvector {  }
     :intvector { -43200, 0 }
     :bin { "" }
-  } //Z#376
+  } //Z#378
 ,  /* Etc/GMT+2 */ :array {
     :intvector {  }
     :intvector { -7200, 0 }
     :bin { "" }
-  } //Z#377
+  } //Z#379
 ,  /* Etc/GMT+3 */ :array {
     :intvector {  }
     :intvector { -10800, 0 }
     :bin { "" }
-  } //Z#378
+  } //Z#380
 ,  /* Etc/GMT+4 */ :array {
     :intvector {  }
     :intvector { -14400, 0 }
     :bin { "" }
-    :intvector { 379, 563 }
-  } //Z#379
+    :intvector { 381, 565 }
+  } //Z#381
 ,  /* Etc/GMT+5 */ :array {
     :intvector {  }
     :intvector { -18000, 0 }
     :bin { "" }
-    :intvector { 380, 567 }
-  } //Z#380
+    :intvector { 382, 569 }
+  } //Z#382
 ,  /* Etc/GMT+6 */ :array {
     :intvector {  }
     :intvector { -21600, 0 }
     :bin { "" }
-    :intvector { 381, 565 }
-  } //Z#381
+    :intvector { 383, 567 }
+  } //Z#383
 ,  /* Etc/GMT+7 */ :array {
     :intvector {  }
     :intvector { -25200, 0 }
     :bin { "" }
-    :intvector { 382, 570 }
-  } //Z#382
+    :intvector { 384, 572 }
+  } //Z#384
 ,  /* Etc/GMT+8 */ :array {
     :intvector {  }
     :intvector { -28800, 0 }
     :bin { "" }
-    :intvector { 383, 572 }
-  } //Z#383
+    :intvector { 385, 574 }
+  } //Z#385
 ,  /* Etc/GMT+9 */ :array {
     :intvector {  }
     :intvector { -32400, 0 }
     :bin { "" }
-    :intvector { 384, 574 }
-  } //Z#384
-,  /* Etc/GMT-0 */ :int { 371 } //Z#385
+    :intvector { 386, 576 }
+  } //Z#386
+,  /* Etc/GMT-0 */ :int { 373 } //Z#387
 ,  /* Etc/GMT-1 */ :array {
     :intvector {  }
     :intvector { 3600, 0 }
     :bin { "" }
-  } //Z#386
+  } //Z#388
 ,  /* Etc/GMT-10 */ :array {
     :intvector {  }
     :intvector { 36000, 0 }
     :bin { "" }
-  } //Z#387
+  } //Z#389
 ,  /* Etc/GMT-11 */ :array {
     :intvector {  }
     :intvector { 39600, 0 }
     :bin { "" }
-  } //Z#388
+  } //Z#390
 ,  /* Etc/GMT-12 */ :array {
     :intvector {  }
     :intvector { 43200, 0 }
     :bin { "" }
-  } //Z#389
+  } //Z#391
 ,  /* Etc/GMT-13 */ :array {
     :intvector {  }
     :intvector { 46800, 0 }
     :bin { "" }
-  } //Z#390
+  } //Z#392
 ,  /* Etc/GMT-14 */ :array {
     :intvector {  }
     :intvector { 50400, 0 }
     :bin { "" }
-  } //Z#391
+  } //Z#393
 ,  /* Etc/GMT-2 */ :array {
     :intvector {  }
     :intvector { 7200, 0 }
     :bin { "" }
-  } //Z#392
+  } //Z#394
 ,  /* Etc/GMT-3 */ :array {
     :intvector {  }
     :intvector { 10800, 0 }
     :bin { "" }
-  } //Z#393
+  } //Z#395
 ,  /* Etc/GMT-4 */ :array {
     :intvector {  }
     :intvector { 14400, 0 }
     :bin { "" }
-  } //Z#394
+  } //Z#396
 ,  /* Etc/GMT-5 */ :array {
     :intvector {  }
     :intvector { 18000, 0 }
     :bin { "" }
-  } //Z#395
+  } //Z#397
 ,  /* Etc/GMT-6 */ :array {
     :intvector {  }
     :intvector { 21600, 0 }
     :bin { "" }
-  } //Z#396
+  } //Z#398
 ,  /* Etc/GMT-7 */ :array {
     :intvector {  }
     :intvector { 25200, 0 }
     :bin { "" }
-  } //Z#397
+  } //Z#399
 ,  /* Etc/GMT-8 */ :array {
     :intvector {  }
     :intvector { 28800, 0 }
     :bin { "" }
-  } //Z#398
+  } //Z#400
 ,  /* Etc/GMT-9 */ :array {
     :intvector {  }
     :intvector { 32400, 0 }
     :bin { "" }
-  } //Z#399
-,  /* Etc/GMT0 */ :int { 371 } //Z#400
-,  /* Etc/Greenwich */ :int { 371 } //Z#401
+  } //Z#401
+,  /* Etc/GMT0 */ :int { 373 } //Z#402
+,  /* Etc/Greenwich */ :int { 373 } //Z#403
 ,  /* Etc/UCT */ :array {
     :intvector {  }
     :intvector { 0, 0 }
     :bin { "" }
-    :intvector { 402, 577 }
-  } //Z#402
+    :intvector { 404, 579 }
+  } //Z#404
 ,  /* Etc/UTC */ :array {
     :intvector {  }
     :intvector { 0, 0 }
     :bin { "" }
-    :intvector { 403, 404, 406, 591, 592, 596 }
-  } //Z#403
-,  /* Etc/Universal */ :int { 403 } //Z#404
+    :intvector { 405, 406, 408, 593, 594, 598 }
+  } //Z#405
+,  /* Etc/Universal */ :int { 405 } //Z#406
 ,  /* Etc/Unknown */ :array {
     :intvector {  }
     :intvector { 0, 0 }
     :bin { "" }
-  } //Z#405
-,  /* Etc/Zulu */ :int { 403 } //Z#406
+  } //Z#407
+,  /* Etc/Zulu */ :int { 405 } //Z#408
 ,  /* Europe/Amsterdam */ :array {
     :intvector { -2147483648, -1693700372, -1680484772, -1663453172, -1650147572, -1633213172, -1617488372, -1601158772, -1586038772, -1569709172, -1554589172, -1538259572, -1523139572, -1507501172, -1490566772, -1470176372, -1459117172, -1443997172, -1427667572, -1406672372, -1396217972, -1376950772, -1364768372, -1345414772, -1333318772, -1313792372, -1301264372, -1282256372, -1269814772, -1250720372, -1238365172, -1219184372, -1206915572, -1186957172, -1175465972, -1156025972, -1143411572, -1124489972, -1111961972, -1092953972, -1080512372, -1061331572, -1049062772, -1029190772, -1025745572, -1017613200, -998259600, -986163600, -966723600, -954109200, -935022000, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -766623600, 220921200, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 1172, 0, 1172, 3600, 1200, 0, 1200, 3600, 3600, 0, 3600, 3600 }
     :bin { "000100010001000100010001000100010001000100010001000100010001000100010001000100010001000103020302030205040504050405040405040504050405040504050405040504050405040504050405040504050405040504050405040504" }
     "EU"
     :intvector { 3600, 1997 }
-  } //Z#407
+  } //Z#409
 ,  /* Europe/Andorra */ :array {
     :intvector { -2147483648, -733881600, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 0, 0, 3600, 0, 3600, 3600 }
     :bin { "0001020102010201020102010201020102010201020102010201" }
     "EU"
     :intvector { 3600, 1997 }
-  } //Z#408
+  } //Z#410
 ,  /* Europe/Athens */ :array {
     :intvector { -2147483648, -1686101632, -1182996000, -1178161200, -906861600, -904878000, -857257200, -844477200, -828237600, -812422800, -552362400, -541652400, 166485600, 186184800, 198028800, 213753600, 228873600, 244080000, 260323200, 275446800, 291798000, 307407600, 323388000, 338936400, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 3600, 0, 3600, 3600, 5692, 0, 7200, 0, 7200, 3600 }
     :bin { "0203040304010001000304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403" }
     "EU"
     :intvector { 7200, 1997 }
-  } //Z#409
-,  /* Europe/Belfast */ :int { 430 } //Z#410
+  } //Z#411
+,  /* Europe/Belfast */ :int { 432 } //Z#412
 ,  /* Europe/Belgrade */ :array {
     :intvector { -2147483648, -905824800, -857257200, -844556400, -828226800, -812502000, -796777200, -777942000, -766623600, 407199600, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 3600, 0, 3600, 3600 }
     :bin { "0001000100010001000001000100010001000100010001000100010001000100010001000100" }
     "EU"
     :intvector { 3600, 1997 }
-    :intvector { 411, 429, 441, 447, 449, 462 }
-  } //Z#411
+    :intvector { 413, 431, 443, 449, 451, 464 }
+  } //Z#413
 ,  /* Europe/Berlin */ :array {
     :intvector { -2147483648, -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -776563200, -765936000, -761180400, -748479600, -733273200, -717634800, -714610800, -710380800, -701910000, -684975600, -670460400, -654130800, -639010800, 315529200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 3600, 0, 3600, 3600, 3600, 7200 }
     :bin { "0001000100010001000100010001020100010001020100010001000001000100010001000100010001000100010001000100010001000100010001000100" }
     "EU"
     :intvector { 3600, 1997 }
-  } //Z#412
-,  /* Europe/Bratislava */ :int { 442 } //Z#413
+  } //Z#414
+,  /* Europe/Bratislava */ :int { 444 } //Z#415
 ,  /* Europe/Brussels */ :array {
     :intvector { -2147483648, -1740355200, -1693702800, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -1613826000, -1604278800, -1585530000, -1574038800, -1552266000, -1539997200, -1520557200, -1507510800, -1490576400, -1473642000, -1459126800, -1444006800, -1427677200, -1411952400, -1396227600, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301263200, -1284328800, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1191189600, -1175464800, -1160344800, -1143410400, -1127685600, -1111960800, -1096840800, -1080511200, -1063576800, -1049061600, -1033336800, -1017612000, -1002492000, -986162400, -969228000, -950479200, -942012000, -934668000, -857257200, -844556400, -828226800, -812502000, -799293600, -798073200, -781052400, -766623600, -745455600, -733273200, 220921200, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 0, 0, 0, 3600, 3600, 0, 3600, 3600 }
     :bin { "0002030203020302000100010001000100010001000100010001000100010001000100010001000100010001000100010001000103020302030302030203020203020302030203020302030203020302030203020302030203020302030203020302030203020302" }
     "EU"
     :intvector { 3600, 1997 }
-  } //Z#414
+  } //Z#416
 ,  /* Europe/Bucharest */ :array {
     :intvector { -2147483648, -1213148664, -1187056800, -1175479200, -1159754400, -1144029600, -1127700000, -1111975200, -1096250400, -1080525600, -1064800800, -1049076000, -1033351200, -1017626400, -1001901600, -986176800, -970452000, -954727200, 296604000, 307486800, 323816400, 338940000, 354672000, 370396800, 386121600, 401846400, 417571200, 433296000, 449020800, 465350400, 481075200, 496800000, 512524800, 528249600, 543974400, 559699200, 575424000, 591148800, 606873600, 622598400, 638323200, 654652800, 662680800, 670370400, 686095200, 701820000, 717544800, 733269600, 748994400, 757375200, 764719200, 780440400, 796168800, 811890000, 828223200, 846363600, 859683600, 877827600 }
     :intvector { 6264, 0, 7200, 0, 7200, 3600 }
     :bin { "00010201020102010201020102010201020102010201020102010201020102010201020102010201020101020102010201010201020102010201" }
     "EU"
     :intvector { 7200, 1998 }
-  } //Z#415
+  } //Z#417
 ,  /* Europe/Budapest */ :array {
     :intvector { -2147483648, -1693706400, -1680483600, -1663455600, -1650150000, -1640998800, -1633212000, -1617577200, -1600466400, -1587250800, -1569708000, -1554332400, -906937200, -857257200, -844556400, -828226800, -812502000, -796777200, -778471200, -762487200, -749689200, -733359600, -717634800, -701910000, -686185200, -670460400, -654130800, -639010800, -621990000, -605660400, -492656400, -481168800, -461120400, -449632800, -428547600, -418269600, -397094400, -386809200, 323827200, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 3600, 0, 3600, 3600 }
     :bin { "000100010000010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "EU"
     :intvector { 3600, 1997 }
-  } //Z#416
+  } //Z#418
 ,  /* Europe/Chisinau */ :array {
     :intvector { -2147483648, -1637114100, -1213148664, -1187056800, -1175479200, -1159754400, -1144029600, -1127700000, -1111975200, -1096250400, -1080525600, -1064800800, -1049076000, -1033351200, -1017626400, -1001901600, -986176800, -970452000, -954727200, -927165600, -898138800, -857257200, -844556400, -828226800, -812502000, -800157600, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 631141200, 641941200, 670377600, 686102400, 694216800, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796168800, 811890000, 828223200, 846363600, 859683600, 877827600 }
     :intvector { 3600, 0, 3600, 3600, 6264, 0, 6900, 0, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 }
     :bin { "03020405040504050405040504050405040504050100010001060706070607060706070607060706070607060604050404050405040504050405040504" }
     "EU"
     :intvector { 7200, 1998 }
-    :intvector { 417, 454 }
-  } //Z#417
+    :intvector { 419, 456 }
+  } //Z#419
 ,  /* Europe/Copenhagen */ :array {
     :intvector { -2147483648, -1692496800, -1680490800, -935110800, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -769388400, -747010800, -736383600, -715215600, -706748400, -683161200, -675298800, 315529200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 3600, 0, 3600, 3600 }
     :bin { "00010001000100010001000100010001000001000100010001000100010001000100010001000100010001000100010001000100" }
     "EU"
     :intvector { 3600, 1997 }
-  } //Z#418
+  } //Z#420
 ,  /* Europe/Dublin */ :array {
     :intvector { -2147483648, -1691962479, -1680471279, -1664143200, -1650146400, -1633903200, -1617487200, -1601848800, -1586037600, -1570399200, -1552168800, -1538344800, -1522533600, -1517011200, -1507500000, -1490565600, -1473631200, -1460930400, -1442786400, -1428876000, -1410732000, -1396216800, -1379282400, -1364767200, -1348437600, -1333317600, -1315778400, -1301263200, -1284328800, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1189980000, -1175464800, -1159135200, -1143410400, -1126476000, -1111960800, -1095631200, -1080511200, -1063576800, -1049061600, -1032127200, -1017612000, -1001282400, -986162400, -969228000, -950479200, -942012000, -733359600, -719445600, -699490800, -684972000, -668037600, -654732000, -636588000, -622072800, -605743200, -590623200, -574293600, -558568800, -542239200, -527119200, -512604000, -496274400, -481154400, -464220000, -449704800, -432165600, -417650400, -401320800, -386200800, -369266400, -354751200, -337816800, -323301600, -306972000, -291852000, -276732000, -257983200, -245282400, -226533600, -213228000, -195084000, -182383200, -163634400, -150933600, -132184800, -119484000, -100735200, -88034400, -68680800, -59004000, -37242000, 57722400, 69818400, 89172000, 101268000, 120621600, 132717600, 152071200, 164167200, 183520800, 196221600, 214970400, 227671200, 246420000, 259120800, 278474400, 290570400, 309924000, 322020000, 341373600, 354675600, 372819600, 386125200, 404269200, 417574800, 435718800, 449024400, 467773200, 481078800, 499222800, 512528400, 530672400, 543978000, 562122000, 575427600, 593571600, 606877200, 625626000, 638326800, 657075600, 670381200, 688525200, 701830800, 719974800, 733280400, 751424400, 764730000, 782874000, 796179600, 814323600, 820454400, 828234000, 846378000 }
     :intvector { -1521, 0, -1521, 3600, 0, 0, 0, 3600, 3600, 0 }
     :bin { "00010203020302030203020302020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030402030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302020302" }
     "EU"
     :intvector { 0, 1997 }
-    :intvector { 370, 419 }
-  } //Z#419
+    :intvector { 372, 421 }
+  } //Z#421
 ,  /* Europe/Gibraltar */ :array {
     :intvector { -2147483648, -1691964000, -1680472800, -1664143200, -1650146400, -1633903200, -1617487200, -1601848800, -1586037600, -1570399200, -1552168800, -1538344800, -1522533600, -1507500000, -1490565600, -1473631200, -1460930400, -1442786400, -1428876000, -1410732000, -1396216800, -1379282400, -1364767200, -1348437600, -1333317600, -1315778400, -1301263200, -1284328800, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1189980000, -1175464800, -1159135200, -1143410400, -1126476000, -1111960800, -1095631200, -1080511200, -1063576800, -1049061600, -1032127200, -1017612000, -1001282400, -986162400, -969228000, -950479200, -942012000, -904518000, -896050800, -875487600, -864601200, -844038000, -832546800, -812588400, -798073200, -781052400, -772066800, -764805600, -748476000, -733356000, -719445600, -717030000, -706748400, -699487200, -687996000, -668037600, -654732000, -636588000, -622072800, -605743200, -590623200, -574293600, -558568800, -542239200, -527119200, -512604000, -496274400, -481154400, -464220000, -449704800, -432165600, -417650400, -401320800, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 0, 0, 0, 3600, 0, 7200, 3600, 0, 3600, 3600 }
     :bin { "0001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001020102010201020102010001000102010001000100010001000100010001000100010003040304030403040304030403040304030403040304030403040304030403" }
     "EU"
     :intvector { 3600, 1997 }
-  } //Z#420
-,  /* Europe/Guernsey */ :int { 430 } //Z#421
+  } //Z#422
+,  /* Europe/Guernsey */ :int { 432 } //Z#423
 ,  /* Europe/Helsinki */ :array {
     :intvector { -2147483648, -1535938792, -875671200, -859863600, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 5992, 0, 7200, 0, 7200, 3600 }
     :bin { "000102010201020102010201020102010201020102010201020102010201020102010201" }
     "EU"
     :intvector { 7200, 1997 }
-    :intvector { 422, 434 }
-  } //Z#422
-,  /* Europe/Isle_of_Man */ :int { 430 } //Z#423
+    :intvector { 424, 436 }
+  } //Z#424
+,  /* Europe/Isle_of_Man */ :int { 432 } //Z#425
 ,  /* Europe/Istanbul */ :array {
     :intvector { -2147483648, -1869875816, -1693706400, -1680490800, -1570413600, -1552186800, -1538359200, -1522551600, -1507514400, -1490583600, -1440208800, -1428030000, -1409709600, -1396494000, -931140000, -922762800, -917834400, -892436400, -875844000, -857358000, -781063200, -764737200, -744343200, -733806000, -716436000, -701924400, -684986400, -670474800, -654141600, -639025200, -621828000, -606970800, -590032800, -575434800, -235620000, -228279600, -177732000, -165726000, 10533600, 23835600, 41983200, 55285200, 74037600, 87339600, 107910000, 121219200, 133920000, 152676000, 165362400, 183502800, 202428000, 215557200, 228866400, 245797200, 260316000, 277246800, 308779200, 323827200, 340228800, 354672000, 371678400, 386121600, 403128000, 428446800, 433886400, 482792400, 496702800, 512524800, 528249600, 543974400, 559699200, 575424000, 591148800, 606873600, 622598400, 638323200, 654652800, 670374000, 686098800, 701823600, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1167602400, 1174784400, 1193533200 }
     :intvector { 7016, 0, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 }
     :bin { "00010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102040304030403040304030201020102010201020102010201020102010201020102010201020102010201020102010201020102010201010201" }
     "EU"
     :intvector { 7200, 2008 }
-    :intvector { 249, 424, 576 }
-  } //Z#424
-,  /* Europe/Jersey */ :int { 430 } //Z#425
+    :intvector { 251, 426, 578 }
+  } //Z#426
+,  /* Europe/Jersey */ :int { 432 } //Z#427
 ,  /* Europe/Kaliningrad */ :array {
     :intvector { -2147483648, -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -788922000, -778730400, -762663600, -757389600, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 686102400, 701816400, 717537600, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 846374400 }
     :intvector { 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 }
     :bin { "00010001000100010001000100020302040504050405040504050405040504050405040504030203020302030203020302" }
     "Russia"
     :intvector { 7200, 1997 }
-  } //Z#426
+  } //Z#428
 ,  /* Europe/Kiev */ :array {
     :intvector { -2147483648, -1441159324, -1247536800, -892522800, -857257200, -844556400, -828226800, -825382800, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 631141200, 646786800, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 7324, 0, 10800, 0, 10800, 3600 }
     :bin { "0402050100010005060506050605060506050605060506050605050203020302030203020302" }
     "EU"
     :intvector { 7200, 1997 }
-  } //Z#427
+  } //Z#429
 ,  /* Europe/Lisbon */ :array {
     :intvector { -2147483648, -1830381808, -1689555600, -1677801600, -1667437200, -1647738000, -1635814800, -1616202000, -1604365200, -1584666000, -1572742800, -1553043600, -1541206800, -1521507600, -1442451600, -1426813200, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301274000, -1284339600, -1269824400, -1221440400, -1206925200, -1191200400, -1175475600, -1127696400, -1111971600, -1096851600, -1080522000, -1063587600, -1049072400, -1033347600, -1017622800, -1002502800, -986173200, -969238800, -950490000, -942022800, -922669200, -906944400, -891133200, -877309200, -873684000, -864007200, -857955600, -845859600, -842839200, -831348000, -825901200, -814410000, -810784800, -799898400, -794451600, -782960400, -779335200, -768448800, -763002000, -749091600, -733366800, -717631200, -701906400, -686181600, -670456800, -654732000, -639007200, -591832800, -575503200, -559778400, -544053600, -528328800, -512604000, -496879200, -481154400, -465429600, -449704800, -433980000, -417650400, -401925600, -386200800, -370476000, -354751200, -339026400, -323301600, -307576800, -291852000, -276127200, -260402400, -244677600, -228348000, -212623200, -196898400, -181173600, -165448800, -149724000, -133999200, -118274400, 212544000, 228268800, 243993600, 260323200, 276048000, 291772800, 307501200, 323222400, 338950800, 354675600, 370400400, 386125200, 401850000, 417578400, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { -2192, 0, 0, 0, 0, 3600, 0, 7200, 3600, 0, 3600, 3600 }
     :bin { "0001020102010201020102010201020102010201020102010201020102010201020102010201020102010201020302010203020102030201020302010201020102010201020102010201020102010201020102010201020102010201020102010201040102010201020102010201020102010201020102010201020102010201020102040504050405040201" }
     "EU"
     :intvector { 0, 1997 }
-    :intvector { 428, 558 }
-  } //Z#428
-,  /* Europe/Ljubljana */ :int { 411 } //Z#429
+    :intvector { 430, 560 }
+  } //Z#430
+,  /* Europe/Ljubljana */ :int { 413 } //Z#431
 ,  /* Europe/London */ :array {
     :intvector { -2147483648, -1691964000, -1680472800, -1664143200, -1650146400, -1633903200, -1617487200, -1601848800, -1586037600, -1570399200, -1552168800, -1538344800, -1522533600, -1507500000, -1490565600, -1473631200, -1460930400, -1442786400, -1428876000, -1410732000, -1396216800, -1379282400, -1364767200, -1348437600, -1333317600, -1315778400, -1301263200, -1284328800, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1189980000, -1175464800, -1159135200, -1143410400, -1126476000, -1111960800, -1095631200, -1080511200, -1063576800, -1049061600, -1032127200, -1017612000, -1001282400, -986162400, -969228000, -950479200, -942012000, -904518000, -896050800, -875487600, -864601200, -844038000, -832546800, -812588400, -798073200, -781052400, -772066800, -764805600, -748476000, -733356000, -719445600, -717030000, -706748400, -699487200, -687996000, -668037600, -654732000, -636588000, -622072800, -605743200, -590623200, -574293600, -558568800, -542239200, -527119200, -512604000, -496274400, -481154400, -464220000, -449704800, -432165600, -417650400, -401320800, -386200800, -369266400, -354751200, -337816800, -323301600, -306972000, -291852000, -276732000, -257983200, -245282400, -226533600, -213228000, -195084000, -182383200, -163634400, -150933600, -132184800, -119484000, -100735200, -88034400, -68680800, -59004000, -37242000, 57722400, 69818400, 89172000, 101268000, 120621600, 132717600, 152071200, 164167200, 183520800, 196221600, 214970400, 227671200, 246420000, 259120800, 278474400, 290570400, 309924000, 322020000, 341373600, 354675600, 372819600, 386125200, 404269200, 417574800, 435718800, 449024400, 467773200, 481078800, 499222800, 512528400, 530672400, 543978000, 562122000, 575427600, 593571600, 606877200, 625626000, 638326800, 657075600, 670381200, 688525200, 701830800, 719974800, 733280400, 751424400, 764730000, 782874000, 796179600, 814323600, 820454400, 828234000, 846378000 }
     :intvector { 0, 0, 0, 3600, 0, 7200, 3600, 0 }
     :bin { "0001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001020102010201020102010001000102010001000100010001000100010001000100010001000100010001000100010001000100010001000100010300010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100000100" }
     "EU"
     :intvector { 0, 1997 }
-    :intvector { 410, 421, 423, 425, 430, 466, 467 }
-  } //Z#430
+    :intvector { 412, 423, 425, 427, 432, 468, 469 }
+  } //Z#432
 ,  /* Europe/Luxembourg */ :array {
     :intvector { -2147483648, -2069713476, -1692496800, -1680483600, -1662343200, -1650157200, -1632006000, -1618700400, -1612659600, -1604278800, -1585519200, -1574038800, -1552258800, -1539997200, -1520550000, -1507510800, -1490572800, -1473642000, -1459119600, -1444006800, -1427673600, -1411866000, -1396224000, -1379293200, -1364774400, -1348448400, -1333324800, -1316394000, -1301270400, -1284339600, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1191189600, -1175464800, -1160344800, -1143410400, -1127685600, -1111960800, -1096840800, -1080511200, -1063576800, -1049061600, -1033336800, -1017612000, -1002492000, -986162400, -969228000, -950479200, -942012000, -935186400, -857257200, -844556400, -828226800, -812502000, -797986800, -781052400, -766623600, -745455600, -733273200, 220921200, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 0, 0, 0, 3600, 1476, 0, 3600, 0, 3600, 3600 }
     :bin { "02030403040304030001000100010001000100010001000100010001000100010001000100010001000100010001000100010001040304030403040304030304030403040304030403040304030403040304030403040304030403040304030403040304030403" }
     "EU"
     :intvector { 3600, 1997 }
-  } //Z#431
+  } //Z#433
 ,  /* Europe/Madrid */ :array {
     :intvector { -2147483648, -1661734800, -1648429200, -1631926800, -1616893200, -1601254800, -1585357200, -1442451600, -1427677200, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301274000, -1284339600, -1269824400, -1029114000, -1017622800, -1002848400, -986173200, -969238800, -954118800, -940208400, -873079200, -862538400, -842839200, -828237600, -811389600, -796010400, -779940000, -765421200, -748490400, -733888800, -652327200, -639190800, 135122400, 150246000, 167176800, 181695600, 196812000, 212540400, 228866400, 243990000, 260402400, 276044400, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 0, 0, 0, 3600, 0, 7200, 3600, 0, 3600, 3600 }
     :bin { "00010001000100010001000100010001000100010001000102010201020102010203040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403" }
     "EU"
     :intvector { 3600, 1997 }
-  } //Z#432
+  } //Z#434
 ,  /* Europe/Malta */ :array {
     :intvector { -2147483648, -1690851600, -1680483600, -1664758800, -1649034000, -1635123600, -1616979600, -1604278800, -1585530000, -1571014800, -1555290000, -932432400, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -766717200, -750898800, -733359600, -719456400, -701917200, -689209200, -670460400, -114051600, -103168800, -81997200, -71719200, -50547600, -40269600, -18493200, -8215200, 12956400, 23234400, 43801200, 54687600, 75855600, 86738400, 102380400, 118105200, 135730800, 148518000, 167187600, 180489600, 198637200, 211939200, 230086800, 243388800, 261536400, 274838400, 292986000, 306288000, 323312400, 338342400, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 3600, 0, 3600, 3600 }
     :bin { "000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "EU"
     :intvector { 3600, 1997 }
-  } //Z#433
-,  /* Europe/Mariehamn */ :int { 422 } //Z#434
+  } //Z#435
+,  /* Europe/Mariehamn */ :int { 424 } //Z#436
 ,  /* Europe/Minsk */ :array {
     :intvector { -2147483648, -1441158600, -1247536800, -899780400, -857257200, -844556400, -828226800, -812502000, -804650400, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 631141200, 670374000, 686102400, 701820000, 717544800, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 846374400 }
     :intvector { 3600, 0, 3600, 3600, 6600, 0, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 }
     :bin { "02030501000100010506050605060506050605060506050605060505040304030403040304030403" }
     "Russia"
     :intvector { 7200, 1997 }
-  } //Z#435
+  } //Z#437
 ,  /* Europe/Monaco */ :array {
     :intvector { -2147483648, -1855958961, -1689814800, -1680397200, -1665363600, -1648342800, -1635123600, -1616893200, -1604278800, -1585443600, -1574038800, -1552266000, -1539997200, -1520557200, -1507510800, -1490576400, -1470618000, -1459126800, -1444006800, -1427677200, -1411952400, -1396227600, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301274000, -1284339600, -1269824400, -1253494800, -1238374800, -1221440400, -1206925200, -1191200400, -1175475600, -1160355600, -1143421200, -1127696400, -1111971600, -1096851600, -1080522000, -1063587600, -1049072400, -1033347600, -1017622800, -1002502800, -986173200, -969238800, -950490000, -942012000, -904438800, -891136800, -877827600, -857257200, -844556400, -828226800, -812502000, -796266000, -781052400, -766623600, 196819200, 212540400, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 0, 0, 0, 3600, 0, 7200, 561, 0, 3600, 0, 3600, 3600 }
     :bin { "03000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000102010201020102010204050405040504050405040504050405040504050405040504050405040504050405040504050405040504" }
     "EU"
     :intvector { 3600, 1997 }
-  } //Z#436
+  } //Z#438
 ,  /* Europe/Moscow */ :array {
     :intvector { -2147483648, -1688265000, -1656819048, -1641353448, -1627965048, -1618716648, -1596429048, -1593829848, -1589860800, -1542427200, -1539493200, -1525323600, -1522728000, -1491188400, -1247536800, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 686102400, 695779200, 701812800, 717534000, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800 }
     :intvector { 7200, 0, 7200, 3600, 9000, 0, 9048, 0, 9048, 3600, 9048, 7200, 10800, 0, 10800, 3600, 10800, 7200 }
     :bin { "020304030504050706070807060006070607060706070607060706070607060706070601000607060706070607060706" }
     "Russia"
     :intvector { 10800, 1997 }
-    :intvector { 437, 594 }
-  } //Z#437
-,  /* Europe/Nicosia */ :int { 268 } //Z#438
+    :intvector { 439, 596 }
+  } //Z#439
+,  /* Europe/Nicosia */ :int { 270 } //Z#440
 ,  /* Europe/Oslo */ :array {
     :intvector { -2147483648, -1691884800, -1680573600, -927511200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -765327600, -340844400, -324514800, -308790000, -293065200, -277340400, -261615600, -245890800, -230166000, -214441200, -198716400, -182991600, -166662000, -147913200, -135212400, 315529200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 3600, 0, 3600, 3600 }
     :bin { "000100010001000100010001000100010001000100010001000001000100010001000100010001000100010001000100010001000100010001000100" }
     "EU"
     :intvector { 3600, 1997 }
-    :intvector { 217, 311, 439 }
-  } //Z#439
+    :intvector { 219, 313, 441 }
+  } //Z#441
 ,  /* Europe/Paris */ :array {
     :intvector { -2147483648, -1855958901, -1689814800, -1680397200, -1665363600, -1648342800, -1635123600, -1616893200, -1604278800, -1585443600, -1574038800, -1552266000, -1539997200, -1520557200, -1507510800, -1490576400, -1470618000, -1459126800, -1444006800, -1427677200, -1411952400, -1396227600, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301274000, -1284339600, -1269824400, -1253494800, -1238374800, -1221440400, -1206925200, -1191200400, -1175475600, -1160355600, -1143421200, -1127696400, -1111971600, -1096851600, -1080522000, -1063587600, -1049072400, -1033347600, -1017622800, -1002502800, -986173200, -969238800, -950490000, -942012000, -932436000, -857257200, -844556400, -828226800, -812502000, -800071200, -796266000, -781052400, -766623600, 196819200, 212540400, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 0, 0, 0, 3600, 0, 7200, 561, 0, 3600, 0, 3600, 3600 }
     :bin { "030001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001050405040502010204050405040504050405040504050405040504050405040504050405040504050405040504050405040504" }
     "EU"
     :intvector { 3600, 1997 }
-    :intvector { 365, 440 }
-  } //Z#440
-,  /* Europe/Podgorica */ :int { 411 } //Z#441
+    :intvector { 367, 442 }
+  } //Z#442
+,  /* Europe/Podgorica */ :int { 413 } //Z#443
 ,  /* Europe/Prague */ :array {
     :intvector { -2147483648, -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -798073200, -780534000, -761180400, -746578800, -733359600, -716425200, -701910000, -684975600, -670460400, -654217200, -639010800, 283993200, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 3600, 0, 3600, 3600 }
     :bin { "000100010001000100010001000100010001000100010000010001000100010001000100010001000100010001000100010001000100010001000100" }
     "EU"
     :intvector { 3600, 1997 }
-    :intvector { 413, 442 }
-  } //Z#442
+    :intvector { 415, 444 }
+  } //Z#444
 ,  /* Europe/Riga */ :array {
     :intvector { -2147483648, -1632008184, -1618702584, -1601681784, -1597275384, -1377308184, -928029600, -899521200, -857257200, -844556400, -828226800, -812502000, -796777200, -795834000, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622598400, 638323200, 654652800, 670377600, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 843955200, 853797600, 859683600, 877827600, 891133200, 909277200, 922582800, 941331600, 951775200, 985482000, 1004230800 }
     :intvector { 3600, 0, 3600, 3600, 5784, 0, 5784, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 }
     :bin { "0203020302040601000100010006070607060706070607060706070607060504050405040504050405040504050404050405040504040504" }
     "EU"
     :intvector { 7200, 2002 }
-  } //Z#443
+  } //Z#445
 ,  /* Europe/Rome */ :array {
     :intvector { -2147483648, -1690851600, -1680483600, -1664758800, -1649034000, -1635123600, -1616979600, -1604278800, -1585530000, -1571014800, -1555290000, -932432400, -857257200, -844556400, -828226800, -812502000, -804823200, -798080400, -781052400, -766717200, -750898800, -733359600, -719456400, -701917200, -689209200, -670460400, -114051600, -103168800, -81997200, -71719200, -50547600, -40269600, -18493200, -8215200, 12956400, 23234400, 43801200, 54687600, 75855600, 86738400, 107910000, 118188000, 138754800, 149637600, 170809200, 181090800, 202258800, 212540400, 233103600, 243990000, 265158000, 276044400, 296607600, 307494000, 315529200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 3600, 0, 3600, 3600 }
     :bin { "0001000100010001000100010001000101000100010001000100010001000100010001000100010001000100010001000100010001000001000100010001000100010001000100010001000100010001000100010001000100" }
     "EU"
     :intvector { 3600, 1997 }
-    :intvector { 444, 446, 457 }
-  } //Z#444
+    :intvector { 446, 448, 459 }
+  } //Z#446
 ,  /* Europe/Samara */ :array {
     :intvector { -2147483648, -1593825636, -1247540400, -1102305600, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622594800, 638319600, 654649200, 670374000, 686102400, 687916800, 701809200, 717530400, 733269600, 748994400, 764719200, 780444000, 796168800, 811893600, 828223200, 846367200 }
     :intvector { 7200, 3600, 10800, 0, 10800, 3600, 12036, 0, 14400, 0, 14400, 3600 }
     :bin { "03010404050405040504050405040504050405040201020100010405040504050405040504" }
     "Russia"
     :intvector { 14400, 1997 }
-  } //Z#445
-,  /* Europe/San_Marino */ :int { 444 } //Z#446
-,  /* Europe/Sarajevo */ :int { 411 } //Z#447
+  } //Z#447
+,  /* Europe/San_Marino */ :int { 446 } //Z#448
+,  /* Europe/Sarajevo */ :int { 413 } //Z#449
 ,  /* Europe/Simferopol */ :array {
     :intvector { -2147483648, -1441160160, -1247536800, -888894000, -857257200, -844556400, -828226800, -812502000, -811648800, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 631141200, 646786800, 701820000, 717541200, 733269600, 748990800, 764719200, 767739600, 780436800, 796165200, 811886400, 828219600, 828230400, 846374400, 852066000, 859683600, 877827600 }
     :intvector { 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 8160, 0, 10800, 0, 10800, 3600 }
     :bin { "0402050100010001050605060506050605060506050605060506050502030203020306050605060605050302" }
     "EU"
     :intvector { 7200, 1998 }
-  } //Z#448
-,  /* Europe/Skopje */ :int { 411 } //Z#449
+  } //Z#450
+,  /* Europe/Skopje */ :int { 413 } //Z#451
 ,  /* Europe/Sofia */ :array {
     :intvector { -2147483648, -857257200, -844556400, -828226800, -812502000, -796777200, -781048800, 291762000, 307576800, 323816400, 339026400, 355266000, 370393200, 386715600, 401846400, 417571200, 433296000, 449020800, 465350400, 481075200, 496800000, 512524800, 528249600, 543974400, 559699200, 575424000, 591148800, 606873600, 622598400, 638323200, 654652800, 662680800, 670370400, 686091600, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796168800, 811890000, 828223200, 846363600, 859683600, 877827600 }
     :intvector { 3600, 0, 3600, 3600, 7200, 0, 7200, 3600 }
     :bin { "02000100010002030203020302030203020302030203020302030203020302020302030203020302030203020302" }
     "EU"
     :intvector { 7200, 1998 }
-  } //Z#450
+  } //Z#452
 ,  /* Europe/Stockholm */ :array {
     :intvector { -2147483648, -1692496800, -1680483600, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 3600, 0, 3600, 3600 }
     :bin { "00010001000100010001000100010001000100010001000100010001000100010001000100" }
     "EU"
     :intvector { 3600, 1997 }
-  } //Z#451
+  } //Z#453
 ,  /* Europe/Tallinn */ :array {
     :intvector { -2147483648, -1638322740, -1632006000, -1618700400, -1593824400, -1535938740, -927943200, -892954800, -857257200, -844556400, -828226800, -812502000, -797652000, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622598400, 638323200, 654652800, 670377600, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 846374400, 859680000, 877824000, 891129600, 906411600, 909277200, 922582800, 941331600, 941407200, 1017536400, 1035680400 }
     :intvector { 3600, 0, 3600, 3600, 5940, 0, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 }
     :bin { "02000100020305010001000105060506050605060506050605060506050403040304030403040304030403040304030404030403030403" }
     "EU"
     :intvector { 7200, 2003 }
-  } //Z#452
+  } //Z#454
 ,  /* Europe/Tirane */ :array {
     :intvector { -2147483648, -1767230360, -932346000, -857257200, -844556400, -843519600, 136854000, 149896800, 168130800, 181432800, 199839600, 213141600, 231894000, 244591200, 263257200, 276040800, 294706800, 307490400, 326156400, 339458400, 357087600, 370389600, 389142000, 402444000, 419468400, 433807200, 449622000, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 3600, 0, 3600, 3600, 4760, 0 }
     :bin { "02000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "EU"
     :intvector { 3600, 1997 }
-  } //Z#453
-,  /* Europe/Tiraspol */ :int { 417 } //Z#454
+  } //Z#455
+,  /* Europe/Tiraspol */ :int { 419 } //Z#456
 ,  /* Europe/Uzhgorod */ :array {
     :intvector { -2147483648, -938905200, -857257200, -844556400, -828226800, -812502000, -796874400, -794714400, -773456400, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 631141200, 646786800, 670384800, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 }
     :bin { "00010001000101000405040504050405040504050405040504050404000203020302030203020302" }
     "EU"
     :intvector { 7200, 1997 }
-  } //Z#455
+  } //Z#457
 ,  /* Europe/Vaduz */ :array {
     :intvector { -2147483648, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 3600, 0, 3600, 3600 }
     :bin { "000100010001000100010001000100010001000100010001000100010001000100" }
     "EU"
     :intvector { 3600, 1997 }
-  } //Z#456
-,  /* Europe/Vatican */ :int { 444 } //Z#457
+  } //Z#458
+,  /* Europe/Vatican */ :int { 446 } //Z#459
 ,  /* Europe/Vienna */ :array {
     :intvector { -2147483648, -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -1577926800, -1569711600, -1555801200, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -780188400, -757386000, -748479600, -733359600, -717634800, -701910000, -684975600, -670460400, 323823600, 338940000, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 3600, 0, 3600, 3600 }
     :bin { "0001000100010000010001000100010001000001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "EU"
     :intvector { 3600, 1997 }
-  } //Z#458
+  } //Z#460
 ,  /* Europe/Vilnius */ :array {
     :intvector { -2147483648, -1672536240, -1585100136, -1561251600, -1553565600, -928198800, -900126000, -857257200, -844556400, -828226800, -812502000, -802144800, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 846374400, 859680000, 877824000, 883605600, 891133200, 909277200, 922582800, 941331600, 1041372000, 1048986000, 1067130000 }
     :intvector { 3600, 0, 3600, 3600, 5040, 0, 5736, 0, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 }
     :bin { "020300040006010001000106070607060706070607060706070607060706070605040504050405040504050405040401000104040504" }
     "EU"
     :intvector { 7200, 2004 }
-  } //Z#459
+  } //Z#461
 ,  /* Europe/Volgograd */ :array {
     :intvector { -2147483648, -1577761060, -1411873200, -1247540400, -256881600, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622594800, 638319600, 654649200, 670374000, 701820000, 717534000, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800 }
     :intvector { 10660, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 }
     :bin { "000101030304030403040304030403040304030403020102010302010201020102010201" }
     "Russia"
     :intvector { 10800, 1997 }
-  } //Z#460
+  } //Z#462
 ,  /* Europe/Warsaw */ :array {
     :intvector { -2147483648, -1717032240, -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -1600473600, -1587168000, -1501725600, -931734000, -857257200, -844556400, -828226800, -812502000, -796874400, -796608000, -778726800, -762660000, -748486800, -733273200, -715215600, -701910000, -684975600, -670460400, -654130800, -639010800, -397094400, -386812800, -371088000, -355363200, -334195200, -323308800, -307584000, -291859200, -271296000, -260409600, -239846400, -228960000, -208396800, -197510400, -176342400, -166060800, 220921200, 228873600, 243993600, 260323200, 276048000, 291772800, 307497600, 323827200, 338947200, 354672000, 370396800, 386121600, 401846400, 417571200, 433296000, 449020800, 465350400, 481075200, 496800000, 512524800, 528249600, 543974400, 559699200, 567990000, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 3600, 0, 3600, 3600, 5040, 0, 7200, 0, 7200, 3600 }
     :bin { "0200010001000103040300010001000101000100010001000100010001000100010001000100010001000100000100010001000100010001000100010001000100010000010001000100010001000100010001000100" }
     "EU"
     :intvector { 3600, 1997 }
-    :intvector { 461, 557 }
-  } //Z#461
-,  /* Europe/Zagreb */ :int { 411 } //Z#462
+    :intvector { 463, 559 }
+  } //Z#463
+,  /* Europe/Zagreb */ :int { 413 } //Z#464
 ,  /* Europe/Zaporozhye */ :array {
     :intvector { -2147483648, -1441160400, -1247536800, -894769200, -857257200, -844556400, -828226800, -826419600, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 686091600, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 8400, 0, 10800, 0, 10800, 3600 }
     :bin { "04020501000100050605060506050605060506050605060506050605030203020302030203020302" }
     "EU"
     :intvector { 7200, 1997 }
-  } //Z#463
+  } //Z#465
 ,  /* Europe/Zurich */ :array {
     :intvector { -2147483648, -920336400, -915242400, -904518000, -891223200, -873068400, -859773600, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 3600, 0, 3600, 3600 }
     :bin { "000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "EU"
     :intvector { 3600, 1997 }
-  } //Z#464
+  } //Z#466
 ,  /* Factory */ :array {
     :intvector {  }
     :intvector { 0, 0 }
     :bin { "" }
-  } //Z#465
-,  /* GB */ :int { 430 } //Z#466
-,  /* GB-Eire */ :int { 430 } //Z#467
-,  /* GMT */ :int { 371 } //Z#468
-,  /* GMT+0 */ :int { 371 } //Z#469
-,  /* GMT-0 */ :int { 371 } //Z#470
-,  /* GMT0 */ :int { 371 } //Z#471
-,  /* Greenwich */ :int { 371 } //Z#472
+  } //Z#467
+,  /* GB */ :int { 432 } //Z#468
+,  /* GB-Eire */ :int { 432 } //Z#469
+,  /* GMT */ :int { 373 } //Z#470
+,  /* GMT+0 */ :int { 373 } //Z#471
+,  /* GMT-0 */ :int { 373 } //Z#472
+,  /* GMT0 */ :int { 373 } //Z#473
+,  /* Greenwich */ :int { 373 } //Z#474
 ,  /* HST */ :array {
     :intvector {  }
     :intvector { -36000, 0 }
     :bin { "" }
-  } //Z#473
-,  /* Hongkong */ :int { 246 } //Z#474
-,  /* IET */ :int { 125 } //Z#475
-,  /* IST */ :int { 233 } //Z#476
-,  /* Iceland */ :int { 313 } //Z#477
+  } //Z#475
+,  /* Hongkong */ :int { 248 } //Z#476
+,  /* IET */ :int { 125 } //Z#477
+,  /* IST */ :int { 235 } //Z#478
+,  /* Iceland */ :int { 315 } //Z#479
 ,  /* Indian/Antananarivo */ :array {
     :intvector { -2147483648, -1846293004, -499924800, -492062400 }
     :intvector { 10800, 0, 10800, 3600, 11404, 0 }
     :bin { "02000100" }
-  } //Z#478
+  } //Z#480
 ,  /* Indian/Chagos */ :array {
     :intvector { -2147483648, -1988167780, 820436400 }
     :intvector { 17380, 0, 18000, 0, 21600, 0 }
     :bin { "000102" }
-  } //Z#479
+  } //Z#481
 ,  /* Indian/Christmas */ :array {
     :intvector { -2147483648 }
     :intvector { 25200, 0 }
     :bin { "00" }
-  } //Z#480
+  } //Z#482
 ,  /* Indian/Cocos */ :array {
     :intvector { -2147483648 }
     :intvector { 23400, 0 }
     :bin { "00" }
-  } //Z#481
+  } //Z#483
 ,  /* Indian/Comoro */ :array {
     :intvector { -2147483648, -1846291984 }
     :intvector { 10384, 0, 10800, 0 }
     :bin { "0001" }
-  } //Z#482
+  } //Z#484
 ,  /* Indian/Kerguelen */ :array {
     :intvector { -2147483648, -631152000 }
     :intvector { 0, 0, 18000, 0 }
     :bin { "0001" }
-  } //Z#483
+  } //Z#485
 ,  /* Indian/Mahe */ :array {
     :intvector { -2147483648, -2006653308 }
     :intvector { 13308, 0, 14400, 0 }
     :bin { "0001" }
-  } //Z#484
+  } //Z#486
 ,  /* Indian/Maldives */ :array {
     :intvector { -2147483648, -315636840 }
     :intvector { 17640, 0, 18000, 0 }
     :bin { "0001" }
-  } //Z#485
+  } //Z#487
 ,  /* Indian/Mauritius */ :array {
     :intvector { -2147483648, -1988164200 }
     :intvector { 13800, 0, 14400, 0 }
     :bin { "0001" }
-  } //Z#486
+  } //Z#488
 ,  /* Indian/Mayotte */ :array {
     :intvector { -2147483648, -1846292456 }
     :intvector { 10800, 0, 10856, 0 }
     :bin { "0100" }
-  } //Z#487
+  } //Z#489
 ,  /* Indian/Reunion */ :array {
     :intvector { -2147483648, -1848886912 }
     :intvector { 13312, 0, 14400, 0 }
     :bin { "0001" }
-  } //Z#488
-,  /* Iran */ :int { 291 } //Z#489
-,  /* Israel */ :int { 252 } //Z#490
-,  /* JST */ :int { 295 } //Z#491
-,  /* Jamaica */ :int { 136 } //Z#492
-,  /* Japan */ :int { 295 } //Z#493
-,  /* Kwajalein */ :int { 534 } //Z#494
-,  /* Libya */ :int { 55 } //Z#495
+  } //Z#490
+,  /* Iran */ :int { 293 } //Z#491
+,  /* Israel */ :int { 254 } //Z#492
+,  /* JST */ :int { 297 } //Z#493
+,  /* Jamaica */ :int { 136 } //Z#494
+,  /* Japan */ :int { 297 } //Z#495
+,  /* Kwajalein */ :int { 536 } //Z#496
+,  /* Libya */ :int { 55 } //Z#497
 ,  /* MET */ :array {
     :intvector { -2147483648, -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 3600, 0, 3600, 3600 }
     :bin { "0001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "C-Eur"
     :intvector { 3600, 1997 }
-  } //Z#496
-,  /* MIT */ :int { 517 } //Z#497
+  } //Z#498
+,  /* MIT */ :int { 519 } //Z#499
 ,  /* MST */ :array {
     :intvector {  }
     :intvector { -25200, 0 }
     :bin { "" }
-  } //Z#498
+  } //Z#500
 ,  /* MST7MDT */ :array {
     :intvector { -2147483648, -1633273200, -1615132800, -1601823600, -1583683200, -880210800, -769395600, -765388800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 126694800, 152092800, 162378000, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1173603600, 1194163200 }
     :intvector { -25200, 0, -25200, 3600 }
     :bin { "000100010001010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "US"
     :intvector { -25200, 2008 }
-  } //Z#499
-,  /* Mexico/BajaNorte */ :int { 198 } //Z#500
-,  /* Mexico/BajaSur */ :int { 150 } //Z#501
-,  /* Mexico/General */ :int { 154 } //Z#502
-,  /* Mideast/Riyadh87 */ :int { 279 } //Z#503
-,  /* Mideast/Riyadh88 */ :int { 280 } //Z#504
-,  /* Mideast/Riyadh89 */ :int { 281 } //Z#505
-,  /* NET */ :int { 304 } //Z#506
-,  /* NST */ :int { 518 } //Z#507
-,  /* NZ */ :int { 518 } //Z#508
-,  /* NZ-CHAT */ :int { 519 } //Z#509
-,  /* Navajo */ :int { 104 } //Z#510
-,  /* PLT */ :int { 255 } //Z#511
-,  /* PNT */ :int { 171 } //Z#512
-,  /* PRC */ :int { 286 } //Z#513
-,  /* PRT */ :int { 176 } //Z#514
-,  /* PST */ :int { 144 } //Z#515
+  } //Z#501
+,  /* Mexico/BajaNorte */ :int { 200 } //Z#502
+,  /* Mexico/BajaSur */ :int { 151 } //Z#503
+,  /* Mexico/General */ :int { 155 } //Z#504
+,  /* Mideast/Riyadh87 */ :int { 281 } //Z#505
+,  /* Mideast/Riyadh88 */ :int { 282 } //Z#506
+,  /* Mideast/Riyadh89 */ :int { 283 } //Z#507
+,  /* NET */ :int { 306 } //Z#508
+,  /* NST */ :int { 520 } //Z#509
+,  /* NZ */ :int { 520 } //Z#510
+,  /* NZ-CHAT */ :int { 521 } //Z#511
+,  /* Navajo */ :int { 104 } //Z#512
+,  /* PLT */ :int { 257 } //Z#513
+,  /* PNT */ :int { 172 } //Z#514
+,  /* PRC */ :int { 288 } //Z#515
+,  /* PRT */ :int { 177 } //Z#516
+,  /* PST */ :int { 144 } //Z#517
 ,  /* PST8PDT */ :array {
     :intvector { -2147483648, -1633269600, -1615129200, -1601820000, -1583679600, -880207200, -769395600, -765385200, -84376800, -68655600, -52927200, -37206000, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 126698400, 152096400, 162381600, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200, 1049623200, 1067158800, 1081072800, 1099213200, 1112522400, 1130662800, 1143972000, 1162112400, 1173607200, 1194166800 }
     :intvector { -28800, 0, -28800, 3600 }
     :bin { "000100010001010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "US"
     :intvector { -28800, 2008 }
-  } //Z#516
+  } //Z#518
 ,  /* Pacific/Apia */ :array {
     :intvector { -2147483648, -1861878784, -631110600 }
     :intvector { -41400, 0, -41216, 0, -39600, 0 }
     :bin { "010002" }
-    :intvector { 497, 517 }
-  } //Z#517
+    :intvector { 499, 519 }
+  } //Z#519
 ,  /* Pacific/Auckland */ :array {
     :intvector { -2147483648, -1330335000, -1320057000, -1300699800, -1287396000, -1269250200, -1255946400, -1237800600, -1224496800, -1206351000, -1192442400, -1174901400, -1160992800, -1143451800, -1125914400, -1112607000, -1094464800, -1081157400, -1063015200, -1049707800, -1031565600, -1018258200, -1000116000, -986808600, -968061600, -955359000, -936612000, -923304600, -757425600, 152632800, 162309600, 183477600, 194968800, 215532000, 226418400, 246981600, 257868000, 278431200, 289317600, 309880800, 320767200, 341330400, 352216800, 372780000, 384271200, 404834400, 415720800, 436284000, 447170400, 467733600, 478620000, 499183200, 510069600, 530632800, 541519200, 562082400, 573573600, 594136800, 605023200, 623772000, 637682400, 655221600, 669132000, 686671200, 700581600, 718120800, 732636000, 749570400, 764085600, 781020000, 795535200, 812469600, 826984800, 844524000, 858434400, 875973600, 889884000, 907423200, 921938400, 938872800, 953388000, 970322400, 984837600, 1002376800, 1016287200, 1033826400, 1047736800, 1065276000, 1079791200, 1096725600, 1111240800, 1128175200, 1142690400, 1159624800, 1174140000, 1191074400, 1207404000, 1222524000 }
     :intvector { 41400, 0, 41400, 1800, 41400, 3600, 43200, 0, 43200, 3600 }
     :bin { "0002000100010001000100010001000100010001000100010001000103040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304" }
     "NZ"
     :intvector { 43200, 2009 }
-    :intvector { 507, 508, 518 }
-  } //Z#518
+    :intvector { 509, 510, 520 }
+  } //Z#520
 ,  /* Pacific/Chatham */ :array {
     :intvector { -2147483648, -410271228, 152632800, 162309600, 183477600, 194968800, 215532000, 226418400, 246981600, 257868000, 278431200, 289317600, 309880800, 320767200, 341330400, 352216800, 372780000, 384271200, 404834400, 415720800, 436284000, 447170400, 467733600, 478620000, 499183200, 510069600, 530632800, 541519200, 562082400, 573573600, 594136800, 605023200, 623772000, 637682400, 655221600, 669132000, 686671200, 700581600, 718120800, 732636000, 749570400, 764085600, 781020000, 795535200, 812469600, 826984800, 844524000, 858434400, 875973600, 889884000, 907423200, 921938400, 938872800, 953388000, 970322400, 984837600, 1002376800, 1016287200, 1033826400, 1047736800, 1065276000, 1079791200, 1096725600, 1111240800, 1128175200, 1142690400, 1159624800, 1174140000, 1191074400, 1207404000, 1222524000 }
     :intvector { 44028, 0, 45900, 0, 45900, 3600 }
     :bin { "0001020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102" }
     "Chatham"
     :intvector { 45900, 2009 }
-    :intvector { 509, 519 }
-  } //Z#519
+    :intvector { 511, 521 }
+  } //Z#521
 ,  /* Pacific/Easter */ :array {
     :intvector { -2147483648, -1178124152, -870552000, -865278000, -736376400, -36619200, -23922000, -3355200, 7527600, 24465600, 37767600, 55915200, 69217200, 87969600, 100666800, 118209600, 132116400, 150868800, 163566000, 182318400, 195620400, 213768000, 227070000, 245217600, 258519600, 277272000, 289969200, 308721600, 321418800, 340171200, 353473200, 371620800, 384922800, 403070400, 416372400, 434520000, 447822000, 466574400, 479271600, 498024000, 510721200, 529473600, 545194800, 560923200, 574225200, 591768000, 605674800, 624427200, 637729200, 653457600, 668574000, 687326400, 700628400, 718776000, 732078000, 750225600, 763527600, 781675200, 794977200, 813729600, 826426800, 845179200, 859690800, 876628800, 889930800, 906868800, 923194800, 939528000, 952830000, 971582400 }
     :intvector { -26248, 0, -25200, 0, -25200, 3600, -21600, 0, -21600, 3600 }
     :bin { "00020102010201020102010201020102010201020102010201020102010201020304030403040304030403040304030403040304030403040304030403040304030403040304" }
     "Chile"
     :intvector { -21600, 2001 }
-    :intvector { 362, 520 }
-  } //Z#520
+    :intvector { 364, 522 }
+  } //Z#522
 ,  /* Pacific/Efate */ :array {
     :intvector { -2147483648, -1829387596, 433256400, 448977600, 467298000, 480427200, 496760400, 511876800, 528210000, 543931200, 559659600, 575380800, 591109200, 606830400, 622558800, 638280000, 654008400, 669729600, 686062800, 696340800, 719931600, 727790400 }
     :intvector { 39600, 0, 39600, 3600, 40396, 0 }
     :bin { "02000100010001000100010001000100010001000100" }
-  } //Z#521
+  } //Z#523
 ,  /* Pacific/Enderbury */ :array {
     :intvector { -2147483648, 307627200, 788958000 }
     :intvector { -43200, 0, -39600, 0, 46800, 0 }
     :bin { "000102" }
-  } //Z#522
+  } //Z#524
 ,  /* Pacific/Fakaofo */ :array {
     :intvector { -2147483648 }
     :intvector { -36000, 0 }
     :bin { "00" }
-  } //Z#523
+  } //Z#525
 ,  /* Pacific/Fiji */ :array {
     :intvector { -2147483648, -1709985220, 909842400, 920124000, 941896800, 951573600 }
     :intvector { 42820, 0, 43200, 0, 43200, 3600 }
     :bin { "000102010201" }
-  } //Z#524
+  } //Z#526
 ,  /* Pacific/Funafuti */ :array {
     :intvector { -2147483648 }
     :intvector { 43200, 0 }
     :bin { "00" }
-  } //Z#525
+  } //Z#527
 ,  /* Pacific/Galapagos */ :array {
     :intvector { -2147483648, -1230746496, 504939600 }
     :intvector { -21600, 0, -21504, 0, -18000, 0 }
     :bin { "010200" }
-  } //Z#526
+  } //Z#528
 ,  /* Pacific/Gambier */ :array {
     :intvector { -2147483648, -1806678012 }
     :intvector { -32400, 0, -32388, 0 }
     :bin { "0100" }
-  } //Z#527
+  } //Z#529
 ,  /* Pacific/Guadalcanal */ :array {
     :intvector { -2147483648, -1806748788 }
     :intvector { 38388, 0, 39600, 0 }
     :bin { "0001" }
-    :intvector { 528, 561 }
-  } //Z#528
+    :intvector { 530, 563 }
+  } //Z#530
 ,  /* Pacific/Guam */ :array {
     :intvector { -2147483648, 977493600 }
     :intvector { 36000, 0 }
     :bin { "0000" }
-  } //Z#529
+  } //Z#531
 ,  /* Pacific/Honolulu */ :array {
     :intvector { -2147483648, -1157283000, -1155472200, -880198200, -769395600, -765376200, -712150200 }
     :intvector { -37800, 0, -37800, 3600, -36000, 0 }
     :bin { "00010001010002" }
-    :intvector { 530, 584 }
-  } //Z#530
+    :intvector { 532, 586 }
+  } //Z#532
 ,  /* Pacific/Johnston */ :array {
     :intvector {  }
     :intvector { -36000, 0 }
     :bin { "" }
-  } //Z#531
+  } //Z#533
 ,  /* Pacific/Kiritimati */ :array {
     :intvector { -2147483648, 307622400, 788954400 }
     :intvector { -38400, 0, -36000, 0, 50400, 0 }
     :bin { "000102" }
-  } //Z#532
+  } //Z#534
 ,  /* Pacific/Kosrae */ :array {
     :intvector { -2147483648, -7988400, 915105600 }
     :intvector { 39600, 0, 43200, 0 }
     :bin { "000100" }
-  } //Z#533
+  } //Z#535
 ,  /* Pacific/Kwajalein */ :array {
     :intvector { -2147483648, -7988400, 745848000 }
     :intvector { -43200, 0, 39600, 0, 43200, 0 }
     :bin { "010002" }
-    :intvector { 494, 534 }
-  } //Z#534
+    :intvector { 496, 536 }
+  } //Z#536
 ,  /* Pacific/Majuro */ :array {
     :intvector { -2147483648, -7988400 }
     :intvector { 39600, 0, 43200, 0 }
     :bin { "0001" }
-  } //Z#535
+  } //Z#537
 ,  /* Pacific/Marquesas */ :array {
     :intvector { -2147483648, -1806676920 }
     :intvector { -34200, 0, -33480, 0 }
     :bin { "0100" }
-  } //Z#536
+  } //Z#538
 ,  /* Pacific/Midway */ :array {
     :intvector { -2147483648, -428504400, -420645600, -86878800, 439038000 }
     :intvector { -39600, 0, -39600, 3600 }
     :bin { "0001000000" }
-  } //Z#537
+  } //Z#539
 ,  /* Pacific/Nauru */ :array {
     :intvector { -2147483648, -1545131260, -877347000, -800960400, 294323400 }
     :intvector { 32400, 0, 40060, 0, 41400, 0, 43200, 0 }
     :bin { "0102000203" }
-  } //Z#538
+  } //Z#540
 ,  /* Pacific/Niue */ :array {
     :intvector { -2147483648, -599575200, 276089400 }
     :intvector { -41400, 0, -40800, 0, -39600, 0 }
     :bin { "010002" }
-  } //Z#539
+  } //Z#541
 ,  /* Pacific/Norfolk */ :array {
     :intvector { -2147483648, -599656320 }
     :intvector { 40320, 0, 41400, 0 }
     :bin { "0001" }
-  } //Z#540
+  } //Z#542
 ,  /* Pacific/Noumea */ :array {
     :intvector { -2147483648, -1829387148, 250002000, 257342400, 281451600, 288878400, 849366000, 857228400 }
     :intvector { 39600, 0, 39600, 3600, 39948, 0 }
     :bin { "0200010001000100" }
-  } //Z#541
+  } //Z#543
 ,  /* Pacific/Pago_Pago */ :array {
     :intvector { -2147483648, -1861879032, -631110600, -86878800, 439038000 }
     :intvector { -41400, 0, -40968, 0, -39600, 0 }
     :bin { "0100020202" }
-    :intvector { 542, 549, 590 }
-  } //Z#542
+    :intvector { 544, 551, 592 }
+  } //Z#544
 ,  /* Pacific/Palau */ :array {
     :intvector { -2147483648 }
     :intvector { 32400, 0 }
     :bin { "00" }
-  } //Z#543
+  } //Z#545
 ,  /* Pacific/Pitcairn */ :array {
     :intvector { -2147483648, 893665800 }
     :intvector { -30600, 0, -28800, 0 }
     :bin { "0001" }
-  } //Z#544
+  } //Z#546
 ,  /* Pacific/Ponape */ :array {
     :intvector { -2147483648 }
     :intvector { 39600, 0 }
     :bin { "00" }
-  } //Z#545
+  } //Z#547
 ,  /* Pacific/Port_Moresby */ :array {
     :intvector { -2147483648 }
     :intvector { 36000, 0 }
     :bin { "00" }
-  } //Z#546
+  } //Z#548
 ,  /* Pacific/Rarotonga */ :array {
     :intvector { -2147483648, 279714600, 289387800, 309952800, 320837400, 341402400, 352287000, 372852000, 384341400, 404906400, 415791000, 436356000, 447240600, 467805600, 478690200, 499255200, 510139800, 530704800, 541589400, 562154400, 573643800, 594208800, 605093400, 625658400, 636543000, 657108000, 667992600 }
     :intvector { -37800, 0, -36000, 0, -36000, 1800 }
     :bin { "000201020102010201020102010201020102010201020102010201" }
-  } //Z#547
+  } //Z#549
 ,  /* Pacific/Saipan */ :array {
     :intvector { -2147483648, -7981200, 977493600 }
     :intvector { 32400, 0, 36000, 0 }
     :bin { "000101" }
-  } //Z#548
-,  /* Pacific/Samoa */ :int { 542 } //Z#549
+  } //Z#550
+,  /* Pacific/Samoa */ :int { 544 } //Z#551
 ,  /* Pacific/Tahiti */ :array {
     :intvector { -2147483648, -1806674504 }
     :intvector { -36000, 0, -35896, 0 }
     :bin { "0100" }
-  } //Z#550
+  } //Z#552
 ,  /* Pacific/Tarawa */ :array {
     :intvector { -2147483648 }
     :intvector { 43200, 0 }
     :bin { "00" }
-  } //Z#551
+  } //Z#553
 ,  /* Pacific/Tongatapu */ :array {
     :intvector { -2147483648, -915193200, 939214800, 953384400, 973342800, 980596800, 1004792400, 1012046400 }
     :intvector { 44400, 0, 46800, 0, 46800, 3600 }
     :bin { "0001020102010201" }
-  } //Z#552
+  } //Z#554
 ,  /* Pacific/Truk */ :array {
     :intvector { -2147483648 }
     :intvector { 36000, 0 }
     :bin { "00" }
-    :intvector { 553, 556 }
-  } //Z#553
+    :intvector { 555, 558 }
+  } //Z#555
 ,  /* Pacific/Wake */ :array {
     :intvector { -2147483648 }
     :intvector { 43200, 0 }
     :bin { "00" }
-  } //Z#554
+  } //Z#556
 ,  /* Pacific/Wallis */ :array {
     :intvector { -2147483648 }
     :intvector { 43200, 0 }
     :bin { "00" }
-  } //Z#555
-,  /* Pacific/Yap */ :int { 553 } //Z#556
-,  /* Poland */ :int { 461 } //Z#557
-,  /* Portugal */ :int { 428 } //Z#558
-,  /* ROC */ :int { 288 } //Z#559
-,  /* ROK */ :int { 285 } //Z#560
-,  /* SST */ :int { 528 } //Z#561
-,  /* Singapore */ :int { 287 } //Z#562
-,  /* SystemV/AST4 */ :int { 379 } //Z#563
-,  /* SystemV/AST4ADT */ :int { 122 } //Z#564
-,  /* SystemV/CST6 */ :int { 381 } //Z#565
-,  /* SystemV/CST6CDT */ :int { 94 } //Z#566
-,  /* SystemV/EST5 */ :int { 380 } //Z#567
-,  /* SystemV/EST5EDT */ :int { 162 } //Z#568
-,  /* SystemV/HST10 */ :int { 374 } //Z#569
-,  /* SystemV/MST7 */ :int { 382 } //Z#570
-,  /* SystemV/MST7MDT */ :int { 104 } //Z#571
-,  /* SystemV/PST8 */ :int { 383 } //Z#572
-,  /* SystemV/PST8PDT */ :int { 144 } //Z#573
-,  /* SystemV/YST9 */ :int { 384 } //Z#574
-,  /* SystemV/YST9YDT */ :int { 59 } //Z#575
-,  /* Turkey */ :int { 424 } //Z#576
-,  /* UCT */ :int { 402 } //Z#577
-,  /* US/Alaska */ :int { 59 } //Z#578
-,  /* US/Aleutian */ :int { 58 } //Z#579
-,  /* US/Arizona */ :int { 171 } //Z#580
-,  /* US/Central */ :int { 94 } //Z#581
-,  /* US/East-Indiana */ :int { 125 } //Z#582
-,  /* US/Eastern */ :int { 162 } //Z#583
-,  /* US/Hawaii */ :int { 530 } //Z#584
-,  /* US/Indiana-Starke */ :int { 126 } //Z#585
-,  /* US/Michigan */ :int { 105 } //Z#586
-,  /* US/Mountain */ :int { 104 } //Z#587
-,  /* US/Pacific */ :int { 144 } //Z#588
-,  /* US/Pacific-New */ :int { 144 } //Z#589
-,  /* US/Samoa */ :int { 542 } //Z#590
-,  /* UTC */ :int { 403 } //Z#591
-,  /* Universal */ :int { 403 } //Z#592
-,  /* VST */ :int { 282 } //Z#593
-,  /* W-SU */ :int { 437 } //Z#594
+  } //Z#557
+,  /* Pacific/Yap */ :int { 555 } //Z#558
+,  /* Poland */ :int { 463 } //Z#559
+,  /* Portugal */ :int { 430 } //Z#560
+,  /* ROC */ :int { 290 } //Z#561
+,  /* ROK */ :int { 287 } //Z#562
+,  /* SST */ :int { 530 } //Z#563
+,  /* Singapore */ :int { 289 } //Z#564
+,  /* SystemV/AST4 */ :int { 381 } //Z#565
+,  /* SystemV/AST4ADT */ :int { 122 } //Z#566
+,  /* SystemV/CST6 */ :int { 383 } //Z#567
+,  /* SystemV/CST6CDT */ :int { 94 } //Z#568
+,  /* SystemV/EST5 */ :int { 382 } //Z#569
+,  /* SystemV/EST5EDT */ :int { 163 } //Z#570
+,  /* SystemV/HST10 */ :int { 376 } //Z#571
+,  /* SystemV/MST7 */ :int { 384 } //Z#572
+,  /* SystemV/MST7MDT */ :int { 104 } //Z#573
+,  /* SystemV/PST8 */ :int { 385 } //Z#574
+,  /* SystemV/PST8PDT */ :int { 144 } //Z#575
+,  /* SystemV/YST9 */ :int { 386 } //Z#576
+,  /* SystemV/YST9YDT */ :int { 59 } //Z#577
+,  /* Turkey */ :int { 426 } //Z#578
+,  /* UCT */ :int { 404 } //Z#579
+,  /* US/Alaska */ :int { 59 } //Z#580
+,  /* US/Aleutian */ :int { 58 } //Z#581
+,  /* US/Arizona */ :int { 172 } //Z#582
+,  /* US/Central */ :int { 94 } //Z#583
+,  /* US/East-Indiana */ :int { 125 } //Z#584
+,  /* US/Eastern */ :int { 163 } //Z#585
+,  /* US/Hawaii */ :int { 532 } //Z#586
+,  /* US/Indiana-Starke */ :int { 126 } //Z#587
+,  /* US/Michigan */ :int { 105 } //Z#588
+,  /* US/Mountain */ :int { 104 } //Z#589
+,  /* US/Pacific */ :int { 144 } //Z#590
+,  /* US/Pacific-New */ :int { 144 } //Z#591
+,  /* US/Samoa */ :int { 544 } //Z#592
+,  /* UTC */ :int { 405 } //Z#593
+,  /* Universal */ :int { 405 } //Z#594
+,  /* VST */ :int { 284 } //Z#595
+,  /* W-SU */ :int { 439 } //Z#596
 ,  /* WET */ :array {
     :intvector { -2147483648, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 }
     :intvector { 0, 0, 0, 3600 }
     :bin { "0001000100010001000100010001000100010001000100010001000100010001000100010001000100" }
     "EU"
     :intvector { 0, 1997 }
-  } //Z#595
-,  /* Zulu */ :int { 403 } //Z#596
+  } //Z#597
+,  /* Zulu */ :int { 405 } //Z#598
  }
  Names {
     "ACT","AET","AGT","ART","AST","Africa/Abidjan","Africa/Accra" // 6
@@ -2791,129 +2794,130 @@
     ,"America/Kentucky/Louisville","America/Kentucky/Monticello" // 140
     ,"America/Knox_IN","America/La_Paz","America/Lima" // 143
     ,"America/Los_Angeles","America/Louisville","America/Maceio" // 146
-    ,"America/Managua","America/Manaus","America/Martinique" // 149
-    ,"America/Mazatlan","America/Mendoza","America/Menominee" // 152
-    ,"America/Merida","America/Mexico_City","America/Miquelon" // 155
-    ,"America/Moncton","America/Monterrey","America/Montevideo" // 158
-    ,"America/Montreal","America/Montserrat","America/Nassau" // 161
-    ,"America/New_York","America/Nipigon","America/Nome" // 164
-    ,"America/Noronha","America/North_Dakota/Center","America/North_Dakota/New_Salem" // 167
-    ,"America/Panama","America/Pangnirtung","America/Paramaribo" // 170
-    ,"America/Phoenix","America/Port-au-Prince","America/Port_of_Spain" // 173
-    ,"America/Porto_Acre","America/Porto_Velho","America/Puerto_Rico" // 176
-    ,"America/Rainy_River","America/Rankin_Inlet","America/Recife" // 179
-    ,"America/Regina","America/Resolute","America/Rio_Branco" // 182
-    ,"America/Rosario","America/Santiago","America/Santo_Domingo" // 185
-    ,"America/Sao_Paulo","America/Scoresbysund","America/Shiprock" // 188
-    ,"America/St_Johns","America/St_Kitts","America/St_Lucia" // 191
-    ,"America/St_Thomas","America/St_Vincent","America/Swift_Current" // 194
-    ,"America/Tegucigalpa","America/Thule","America/Thunder_Bay" // 197
-    ,"America/Tijuana","America/Toronto","America/Tortola" // 200
-    ,"America/Vancouver","America/Virgin","America/Whitehorse" // 203
-    ,"America/Winnipeg","America/Yakutat","America/Yellowknife" // 206
-    ,"Antarctica/Casey","Antarctica/Davis","Antarctica/DumontDUrville" // 209
-    ,"Antarctica/Mawson","Antarctica/McMurdo","Antarctica/Palmer" // 212
-    ,"Antarctica/Rothera","Antarctica/South_Pole","Antarctica/Syowa" // 215
-    ,"Antarctica/Vostok","Arctic/Longyearbyen","Asia/Aden" // 218
-    ,"Asia/Almaty","Asia/Amman","Asia/Anadyr","Asia/Aqtau" // 222
-    ,"Asia/Aqtobe","Asia/Ashgabat","Asia/Ashkhabad","Asia/Baghdad" // 226
-    ,"Asia/Bahrain","Asia/Baku","Asia/Bangkok","Asia/Beirut" // 230
-    ,"Asia/Bishkek","Asia/Brunei","Asia/Calcutta","Asia/Choibalsan" // 234
-    ,"Asia/Chongqing","Asia/Chungking","Asia/Colombo","Asia/Dacca" // 238
-    ,"Asia/Damascus","Asia/Dhaka","Asia/Dili","Asia/Dubai" // 242
-    ,"Asia/Dushanbe","Asia/Gaza","Asia/Harbin","Asia/Hong_Kong" // 246
-    ,"Asia/Hovd","Asia/Irkutsk","Asia/Istanbul","Asia/Jakarta" // 250
-    ,"Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka" // 254
-    ,"Asia/Karachi","Asia/Kashgar","Asia/Katmandu","Asia/Krasnoyarsk" // 258
-    ,"Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macao" // 262
-    ,"Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila" // 266
-    ,"Asia/Muscat","Asia/Nicosia","Asia/Novosibirsk","Asia/Omsk" // 270
-    ,"Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak","Asia/Pyongyang" // 274
-    ,"Asia/Qatar","Asia/Qyzylorda","Asia/Rangoon","Asia/Riyadh" // 278
-    ,"Asia/Riyadh87","Asia/Riyadh88","Asia/Riyadh89","Asia/Saigon" // 282
-    ,"Asia/Sakhalin","Asia/Samarkand","Asia/Seoul","Asia/Shanghai" // 286
-    ,"Asia/Singapore","Asia/Taipei","Asia/Tashkent","Asia/Tbilisi" // 290
-    ,"Asia/Tehran","Asia/Tel_Aviv","Asia/Thimbu","Asia/Thimphu" // 294
-    ,"Asia/Tokyo","Asia/Ujung_Pandang","Asia/Ulaanbaatar" // 297
-    ,"Asia/Ulan_Bator","Asia/Urumqi","Asia/Vientiane","Asia/Vladivostok" // 301
-    ,"Asia/Yakutsk","Asia/Yekaterinburg","Asia/Yerevan" // 304
-    ,"Atlantic/Azores","Atlantic/Bermuda","Atlantic/Canary" // 307
-    ,"Atlantic/Cape_Verde","Atlantic/Faeroe","Atlantic/Faroe" // 310
-    ,"Atlantic/Jan_Mayen","Atlantic/Madeira","Atlantic/Reykjavik" // 313
-    ,"Atlantic/South_Georgia","Atlantic/St_Helena","Atlantic/Stanley" // 316
-    ,"Australia/ACT","Australia/Adelaide","Australia/Brisbane" // 319
-    ,"Australia/Broken_Hill","Australia/Canberra","Australia/Currie" // 322
-    ,"Australia/Darwin","Australia/Eucla","Australia/Hobart" // 325
-    ,"Australia/LHI","Australia/Lindeman","Australia/Lord_Howe" // 328
-    ,"Australia/Melbourne","Australia/NSW","Australia/North" // 331
-    ,"Australia/Perth","Australia/Queensland","Australia/South" // 334
-    ,"Australia/Sydney","Australia/Tasmania","Australia/Victoria" // 337
-    ,"Australia/West","Australia/Yancowinna","BET","BST" // 341
-    ,"Brazil/Acre","Brazil/DeNoronha","Brazil/East","Brazil/West" // 345
-    ,"CAT","CET","CNT","CST","CST6CDT","CTT","Canada/Atlantic" // 352
-    ,"Canada/Central","Canada/East-Saskatchewan","Canada/Eastern" // 355
-    ,"Canada/Mountain","Canada/Newfoundland","Canada/Pacific" // 358
-    ,"Canada/Saskatchewan","Canada/Yukon","Chile/Continental" // 361
-    ,"Chile/EasterIsland","Cuba","EAT","ECT","EET","EST" // 367
-    ,"EST5EDT","Egypt","Eire","Etc/GMT","Etc/GMT+0","Etc/GMT+1" // 373
-    ,"Etc/GMT+10","Etc/GMT+11","Etc/GMT+12","Etc/GMT+2" // 377
-    ,"Etc/GMT+3","Etc/GMT+4","Etc/GMT+5","Etc/GMT+6","Etc/GMT+7" // 382
-    ,"Etc/GMT+8","Etc/GMT+9","Etc/GMT-0","Etc/GMT-1","Etc/GMT-10" // 387
-    ,"Etc/GMT-11","Etc/GMT-12","Etc/GMT-13","Etc/GMT-14" // 391
-    ,"Etc/GMT-2","Etc/GMT-3","Etc/GMT-4","Etc/GMT-5","Etc/GMT-6" // 396
-    ,"Etc/GMT-7","Etc/GMT-8","Etc/GMT-9","Etc/GMT0","Etc/Greenwich" // 401
-    ,"Etc/UCT","Etc/UTC","Etc/Universal","Etc/Unknown" // 405
-    ,"Etc/Zulu","Europe/Amsterdam","Europe/Andorra","Europe/Athens" // 409
-    ,"Europe/Belfast","Europe/Belgrade","Europe/Berlin" // 412
-    ,"Europe/Bratislava","Europe/Brussels","Europe/Bucharest" // 415
-    ,"Europe/Budapest","Europe/Chisinau","Europe/Copenhagen" // 418
-    ,"Europe/Dublin","Europe/Gibraltar","Europe/Guernsey" // 421
-    ,"Europe/Helsinki","Europe/Isle_of_Man","Europe/Istanbul" // 424
-    ,"Europe/Jersey","Europe/Kaliningrad","Europe/Kiev" // 427
-    ,"Europe/Lisbon","Europe/Ljubljana","Europe/London" // 430
-    ,"Europe/Luxembourg","Europe/Madrid","Europe/Malta" // 433
-    ,"Europe/Mariehamn","Europe/Minsk","Europe/Monaco" // 436
-    ,"Europe/Moscow","Europe/Nicosia","Europe/Oslo","Europe/Paris" // 440
-    ,"Europe/Podgorica","Europe/Prague","Europe/Riga","Europe/Rome" // 444
-    ,"Europe/Samara","Europe/San_Marino","Europe/Sarajevo" // 447
-    ,"Europe/Simferopol","Europe/Skopje","Europe/Sofia" // 450
-    ,"Europe/Stockholm","Europe/Tallinn","Europe/Tirane" // 453
-    ,"Europe/Tiraspol","Europe/Uzhgorod","Europe/Vaduz" // 456
-    ,"Europe/Vatican","Europe/Vienna","Europe/Vilnius" // 459
-    ,"Europe/Volgograd","Europe/Warsaw","Europe/Zagreb" // 462
-    ,"Europe/Zaporozhye","Europe/Zurich","Factory","GB" // 466
-    ,"GB-Eire","GMT","GMT+0","GMT-0","GMT0","Greenwich" // 472
-    ,"HST","Hongkong","IET","IST","Iceland","Indian/Antananarivo" // 478
-    ,"Indian/Chagos","Indian/Christmas","Indian/Cocos" // 481
-    ,"Indian/Comoro","Indian/Kerguelen","Indian/Mahe","Indian/Maldives" // 485
-    ,"Indian/Mauritius","Indian/Mayotte","Indian/Reunion" // 488
-    ,"Iran","Israel","JST","Jamaica","Japan","Kwajalein" // 494
-    ,"Libya","MET","MIT","MST","MST7MDT","Mexico/BajaNorte" // 500
-    ,"Mexico/BajaSur","Mexico/General","Mideast/Riyadh87" // 503
-    ,"Mideast/Riyadh88","Mideast/Riyadh89","NET","NST" // 507
-    ,"NZ","NZ-CHAT","Navajo","PLT","PNT","PRC","PRT","PST" // 515
-    ,"PST8PDT","Pacific/Apia","Pacific/Auckland","Pacific/Chatham" // 519
-    ,"Pacific/Easter","Pacific/Efate","Pacific/Enderbury" // 522
-    ,"Pacific/Fakaofo","Pacific/Fiji","Pacific/Funafuti" // 525
-    ,"Pacific/Galapagos","Pacific/Gambier","Pacific/Guadalcanal" // 528
-    ,"Pacific/Guam","Pacific/Honolulu","Pacific/Johnston" // 531
-    ,"Pacific/Kiritimati","Pacific/Kosrae","Pacific/Kwajalein" // 534
-    ,"Pacific/Majuro","Pacific/Marquesas","Pacific/Midway" // 537
-    ,"Pacific/Nauru","Pacific/Niue","Pacific/Norfolk","Pacific/Noumea" // 541
-    ,"Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn" // 544
-    ,"Pacific/Ponape","Pacific/Port_Moresby","Pacific/Rarotonga" // 547
-    ,"Pacific/Saipan","Pacific/Samoa","Pacific/Tahiti" // 550
-    ,"Pacific/Tarawa","Pacific/Tongatapu","Pacific/Truk" // 553
-    ,"Pacific/Wake","Pacific/Wallis","Pacific/Yap","Poland" // 557
-    ,"Portugal","ROC","ROK","SST","Singapore","SystemV/AST4" // 563
-    ,"SystemV/AST4ADT","SystemV/CST6","SystemV/CST6CDT" // 566
-    ,"SystemV/EST5","SystemV/EST5EDT","SystemV/HST10","SystemV/MST7" // 570
-    ,"SystemV/MST7MDT","SystemV/PST8","SystemV/PST8PDT" // 573
-    ,"SystemV/YST9","SystemV/YST9YDT","Turkey","UCT","US/Alaska" // 578
-    ,"US/Aleutian","US/Arizona","US/Central","US/East-Indiana" // 582
-    ,"US/Eastern","US/Hawaii","US/Indiana-Starke","US/Michigan" // 586
-    ,"US/Mountain","US/Pacific","US/Pacific-New","US/Samoa" // 590
-    ,"UTC","Universal","VST","W-SU","WET","Zulu" // 596
+    ,"America/Managua","America/Manaus","America/Marigot" // 149
+    ,"America/Martinique","America/Mazatlan","America/Mendoza" // 152
+    ,"America/Menominee","America/Merida","America/Mexico_City" // 155
+    ,"America/Miquelon","America/Moncton","America/Monterrey" // 158
+    ,"America/Montevideo","America/Montreal","America/Montserrat" // 161
+    ,"America/Nassau","America/New_York","America/Nipigon" // 164
+    ,"America/Nome","America/Noronha","America/North_Dakota/Center" // 167
+    ,"America/North_Dakota/New_Salem","America/Panama" // 169
+    ,"America/Pangnirtung","America/Paramaribo","America/Phoenix" // 172
+    ,"America/Port-au-Prince","America/Port_of_Spain","America/Porto_Acre" // 175
+    ,"America/Porto_Velho","America/Puerto_Rico","America/Rainy_River" // 178
+    ,"America/Rankin_Inlet","America/Recife","America/Regina" // 181
+    ,"America/Resolute","America/Rio_Branco","America/Rosario" // 184
+    ,"America/Santiago","America/Santo_Domingo","America/Sao_Paulo" // 187
+    ,"America/Scoresbysund","America/Shiprock","America/St_Barthelemy" // 190
+    ,"America/St_Johns","America/St_Kitts","America/St_Lucia" // 193
+    ,"America/St_Thomas","America/St_Vincent","America/Swift_Current" // 196
+    ,"America/Tegucigalpa","America/Thule","America/Thunder_Bay" // 199
+    ,"America/Tijuana","America/Toronto","America/Tortola" // 202
+    ,"America/Vancouver","America/Virgin","America/Whitehorse" // 205
+    ,"America/Winnipeg","America/Yakutat","America/Yellowknife" // 208
+    ,"Antarctica/Casey","Antarctica/Davis","Antarctica/DumontDUrville" // 211
+    ,"Antarctica/Mawson","Antarctica/McMurdo","Antarctica/Palmer" // 214
+    ,"Antarctica/Rothera","Antarctica/South_Pole","Antarctica/Syowa" // 217
+    ,"Antarctica/Vostok","Arctic/Longyearbyen","Asia/Aden" // 220
+    ,"Asia/Almaty","Asia/Amman","Asia/Anadyr","Asia/Aqtau" // 224
+    ,"Asia/Aqtobe","Asia/Ashgabat","Asia/Ashkhabad","Asia/Baghdad" // 228
+    ,"Asia/Bahrain","Asia/Baku","Asia/Bangkok","Asia/Beirut" // 232
+    ,"Asia/Bishkek","Asia/Brunei","Asia/Calcutta","Asia/Choibalsan" // 236
+    ,"Asia/Chongqing","Asia/Chungking","Asia/Colombo","Asia/Dacca" // 240
+    ,"Asia/Damascus","Asia/Dhaka","Asia/Dili","Asia/Dubai" // 244
+    ,"Asia/Dushanbe","Asia/Gaza","Asia/Harbin","Asia/Hong_Kong" // 248
+    ,"Asia/Hovd","Asia/Irkutsk","Asia/Istanbul","Asia/Jakarta" // 252
+    ,"Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka" // 256
+    ,"Asia/Karachi","Asia/Kashgar","Asia/Katmandu","Asia/Krasnoyarsk" // 260
+    ,"Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macao" // 264
+    ,"Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila" // 268
+    ,"Asia/Muscat","Asia/Nicosia","Asia/Novosibirsk","Asia/Omsk" // 272
+    ,"Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak","Asia/Pyongyang" // 276
+    ,"Asia/Qatar","Asia/Qyzylorda","Asia/Rangoon","Asia/Riyadh" // 280
+    ,"Asia/Riyadh87","Asia/Riyadh88","Asia/Riyadh89","Asia/Saigon" // 284
+    ,"Asia/Sakhalin","Asia/Samarkand","Asia/Seoul","Asia/Shanghai" // 288
+    ,"Asia/Singapore","Asia/Taipei","Asia/Tashkent","Asia/Tbilisi" // 292
+    ,"Asia/Tehran","Asia/Tel_Aviv","Asia/Thimbu","Asia/Thimphu" // 296
+    ,"Asia/Tokyo","Asia/Ujung_Pandang","Asia/Ulaanbaatar" // 299
+    ,"Asia/Ulan_Bator","Asia/Urumqi","Asia/Vientiane","Asia/Vladivostok" // 303
+    ,"Asia/Yakutsk","Asia/Yekaterinburg","Asia/Yerevan" // 306
+    ,"Atlantic/Azores","Atlantic/Bermuda","Atlantic/Canary" // 309
+    ,"Atlantic/Cape_Verde","Atlantic/Faeroe","Atlantic/Faroe" // 312
+    ,"Atlantic/Jan_Mayen","Atlantic/Madeira","Atlantic/Reykjavik" // 315
+    ,"Atlantic/South_Georgia","Atlantic/St_Helena","Atlantic/Stanley" // 318
+    ,"Australia/ACT","Australia/Adelaide","Australia/Brisbane" // 321
+    ,"Australia/Broken_Hill","Australia/Canberra","Australia/Currie" // 324
+    ,"Australia/Darwin","Australia/Eucla","Australia/Hobart" // 327
+    ,"Australia/LHI","Australia/Lindeman","Australia/Lord_Howe" // 330
+    ,"Australia/Melbourne","Australia/NSW","Australia/North" // 333
+    ,"Australia/Perth","Australia/Queensland","Australia/South" // 336
+    ,"Australia/Sydney","Australia/Tasmania","Australia/Victoria" // 339
+    ,"Australia/West","Australia/Yancowinna","BET","BST" // 343
+    ,"Brazil/Acre","Brazil/DeNoronha","Brazil/East","Brazil/West" // 347
+    ,"CAT","CET","CNT","CST","CST6CDT","CTT","Canada/Atlantic" // 354
+    ,"Canada/Central","Canada/East-Saskatchewan","Canada/Eastern" // 357
+    ,"Canada/Mountain","Canada/Newfoundland","Canada/Pacific" // 360
+    ,"Canada/Saskatchewan","Canada/Yukon","Chile/Continental" // 363
+    ,"Chile/EasterIsland","Cuba","EAT","ECT","EET","EST" // 369
+    ,"EST5EDT","Egypt","Eire","Etc/GMT","Etc/GMT+0","Etc/GMT+1" // 375
+    ,"Etc/GMT+10","Etc/GMT+11","Etc/GMT+12","Etc/GMT+2" // 379
+    ,"Etc/GMT+3","Etc/GMT+4","Etc/GMT+5","Etc/GMT+6","Etc/GMT+7" // 384
+    ,"Etc/GMT+8","Etc/GMT+9","Etc/GMT-0","Etc/GMT-1","Etc/GMT-10" // 389
+    ,"Etc/GMT-11","Etc/GMT-12","Etc/GMT-13","Etc/GMT-14" // 393
+    ,"Etc/GMT-2","Etc/GMT-3","Etc/GMT-4","Etc/GMT-5","Etc/GMT-6" // 398
+    ,"Etc/GMT-7","Etc/GMT-8","Etc/GMT-9","Etc/GMT0","Etc/Greenwich" // 403
+    ,"Etc/UCT","Etc/UTC","Etc/Universal","Etc/Unknown" // 407
+    ,"Etc/Zulu","Europe/Amsterdam","Europe/Andorra","Europe/Athens" // 411
+    ,"Europe/Belfast","Europe/Belgrade","Europe/Berlin" // 414
+    ,"Europe/Bratislava","Europe/Brussels","Europe/Bucharest" // 417
+    ,"Europe/Budapest","Europe/Chisinau","Europe/Copenhagen" // 420
+    ,"Europe/Dublin","Europe/Gibraltar","Europe/Guernsey" // 423
+    ,"Europe/Helsinki","Europe/Isle_of_Man","Europe/Istanbul" // 426
+    ,"Europe/Jersey","Europe/Kaliningrad","Europe/Kiev" // 429
+    ,"Europe/Lisbon","Europe/Ljubljana","Europe/London" // 432
+    ,"Europe/Luxembourg","Europe/Madrid","Europe/Malta" // 435
+    ,"Europe/Mariehamn","Europe/Minsk","Europe/Monaco" // 438
+    ,"Europe/Moscow","Europe/Nicosia","Europe/Oslo","Europe/Paris" // 442
+    ,"Europe/Podgorica","Europe/Prague","Europe/Riga","Europe/Rome" // 446
+    ,"Europe/Samara","Europe/San_Marino","Europe/Sarajevo" // 449
+    ,"Europe/Simferopol","Europe/Skopje","Europe/Sofia" // 452
+    ,"Europe/Stockholm","Europe/Tallinn","Europe/Tirane" // 455
+    ,"Europe/Tiraspol","Europe/Uzhgorod","Europe/Vaduz" // 458
+    ,"Europe/Vatican","Europe/Vienna","Europe/Vilnius" // 461
+    ,"Europe/Volgograd","Europe/Warsaw","Europe/Zagreb" // 464
+    ,"Europe/Zaporozhye","Europe/Zurich","Factory","GB" // 468
+    ,"GB-Eire","GMT","GMT+0","GMT-0","GMT0","Greenwich" // 474
+    ,"HST","Hongkong","IET","IST","Iceland","Indian/Antananarivo" // 480
+    ,"Indian/Chagos","Indian/Christmas","Indian/Cocos" // 483
+    ,"Indian/Comoro","Indian/Kerguelen","Indian/Mahe","Indian/Maldives" // 487
+    ,"Indian/Mauritius","Indian/Mayotte","Indian/Reunion" // 490
+    ,"Iran","Israel","JST","Jamaica","Japan","Kwajalein" // 496
+    ,"Libya","MET","MIT","MST","MST7MDT","Mexico/BajaNorte" // 502
+    ,"Mexico/BajaSur","Mexico/General","Mideast/Riyadh87" // 505
+    ,"Mideast/Riyadh88","Mideast/Riyadh89","NET","NST" // 509
+    ,"NZ","NZ-CHAT","Navajo","PLT","PNT","PRC","PRT","PST" // 517
+    ,"PST8PDT","Pacific/Apia","Pacific/Auckland","Pacific/Chatham" // 521
+    ,"Pacific/Easter","Pacific/Efate","Pacific/Enderbury" // 524
+    ,"Pacific/Fakaofo","Pacific/Fiji","Pacific/Funafuti" // 527
+    ,"Pacific/Galapagos","Pacific/Gambier","Pacific/Guadalcanal" // 530
+    ,"Pacific/Guam","Pacific/Honolulu","Pacific/Johnston" // 533
+    ,"Pacific/Kiritimati","Pacific/Kosrae","Pacific/Kwajalein" // 536
+    ,"Pacific/Majuro","Pacific/Marquesas","Pacific/Midway" // 539
+    ,"Pacific/Nauru","Pacific/Niue","Pacific/Norfolk","Pacific/Noumea" // 543
+    ,"Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn" // 546
+    ,"Pacific/Ponape","Pacific/Port_Moresby","Pacific/Rarotonga" // 549
+    ,"Pacific/Saipan","Pacific/Samoa","Pacific/Tahiti" // 552
+    ,"Pacific/Tarawa","Pacific/Tongatapu","Pacific/Truk" // 555
+    ,"Pacific/Wake","Pacific/Wallis","Pacific/Yap","Poland" // 559
+    ,"Portugal","ROC","ROK","SST","Singapore","SystemV/AST4" // 565
+    ,"SystemV/AST4ADT","SystemV/CST6","SystemV/CST6CDT" // 568
+    ,"SystemV/EST5","SystemV/EST5EDT","SystemV/HST10","SystemV/MST7" // 572
+    ,"SystemV/MST7MDT","SystemV/PST8","SystemV/PST8PDT" // 575
+    ,"SystemV/YST9","SystemV/YST9YDT","Turkey","UCT","US/Alaska" // 580
+    ,"US/Aleutian","US/Arizona","US/Central","US/East-Indiana" // 584
+    ,"US/Eastern","US/Hawaii","US/Indiana-Starke","US/Michigan" // 588
+    ,"US/Mountain","US/Pacific","US/Pacific-New","US/Samoa" // 592
+    ,"UTC","Universal","VST","W-SU","WET","Zulu" // 598
  }
  Rules { 
   AN:intvector {
@@ -2932,7 +2936,7 @@
     2, -31, -1, 14400, 0, 9, -31, -1, 18000, 0, 3600
   } //_#4
   Brazil:intvector {
-    10, 1, -1, 0, 0, 1, -29, -1, 0, 0, 3600
+    9, 8, -1, 0, 0, 1, 15, -1, 0, 0, 3600
   } //_#5
   C-Eur:intvector {
     2, -31, -1, 7200, 1, 9, -31, -1, 7200, 1, 3600
@@ -2950,7 +2954,7 @@
     9, 9, -1, 14400, 2, 2, 9, -1, 10800, 2, 3600
   } //_#10
   Cuba:intvector {
-    2, 8, -1, 0, 1, 10, 1, -1, 0, 1, 3600
+    2, 8, -1, 0, 1, 9, -31, -1, 0, 1, 3600
   } //_#11
   EU:intvector {
     2, -31, -1, 3600, 2, 9, -31, -1, 3600, 2, 3600
@@ -2959,7 +2963,7 @@
     2, -31, -1, 3600, 2, 9, -31, -1, 3600, 2, 3600
   } //_#13
   Egypt:intvector {
-    3, -30, -6, 0, 1, 8, 1, -5, 82800, 1, 3600
+    3, -30, -6, 0, 1, 7, -31, -5, 82800, 1, 3600
   } //_#14
   Falk:intvector {
     8, 1, -1, 7200, 0, 3, 15, -1, 7200, 0, 3600
@@ -2989,7 +2993,7 @@
     8, 1, -1, 7200, 0, 3, 1, -1, 7200, 0, 3600
   } //_#23
   Palestine:intvector {
-    3, 1, 0, 0, 0, 9, 15, -6, 0, 0, 3600
+    3, 1, 0, 0, 0, 8, 8, -5, 7200, 0, 3600
   } //_#24
   Para:intvector {
     9, 15, -1, 0, 0, 2, 8, -1, 0, 0, 3600
@@ -3004,7 +3008,7 @@
     2, 8, -1, 60, 0, 10, 1, -1, 60, 0, 3600
   } //_#28
   Syria:intvector {
-    2, -31, -6, 0, 0, 9, 1, 0, 0, 0, 3600
+    2, -31, -6, 0, 0, 10, 1, -6, 0, 0, 3600
   } //_#29
   TC:intvector {
     2, 8, -1, 7200, 0, 10, 1, -1, 7200, 0, 3600
@@ -3023,248 +3027,250 @@
   } //_#34
  }
  Regions { 
-  Default:intvector { 279, 280, 281, 347, 350, 366, 367, 368, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 465, 468, 469, 470, 471, 472, 473, 496, 498, 499, 503, 504, 505, 516, 563, 565, 567, 569, 570, 572, 574, 577, 591, 592, 595, 596 } //R#0
-  AD:intvector { 408 } //R#1
-  AE:intvector { 242 } //R#2
-  AF:intvector { 253 } //R#3
+  Default:intvector { 281, 282, 283, 349, 352, 368, 369, 370, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 467, 470, 471, 472, 473, 474, 475, 498, 500, 501, 505, 506, 507, 518, 565, 567, 569, 571, 572, 574, 576, 579, 593, 594, 597, 598 } //R#0
+  AD:intvector { 410 } //R#1
+  AE:intvector { 244 } //R#2
+  AF:intvector { 255 } //R#3
   AG:intvector { 61 } //R#4
   AI:intvector { 60 } //R#5
-  AL:intvector { 453 } //R#6
-  AM:intvector { 304, 506 } //R#7
+  AL:intvector { 455 } //R#6
+  AM:intvector { 306, 508 } //R#7
   AN:intvector { 100 } //R#8
   AO:intvector { 38 } //R#9
-  AQ:intvector { 207, 208, 209, 210, 211, 212, 213, 214, 215, 216 } //R#10
-  AR:intvector { 2, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 86, 91, 97, 137, 151, 183 } //R#11
-  AS:intvector { 542, 549, 590 } //R#12
-  AT:intvector { 458 } //R#13
-  AU:intvector { 0, 1, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339 } //R#14
+  AQ:intvector { 209, 210, 211, 212, 213, 214, 215, 216, 217, 218 } //R#10
+  AR:intvector { 2, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 86, 91, 97, 137, 152, 184 } //R#11
+  AS:intvector { 544, 551, 592 } //R#12
+  AT:intvector { 460 } //R#13
+  AU:intvector { 0, 1, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341 } //R#14
   AW:intvector { 74 } //R#15
-  AX:intvector { 434 } //R#16
-  AZ:intvector { 228 } //R#17
-  BA:intvector { 447 } //R#18
+  AX:intvector { 436 } //R#16
+  AZ:intvector { 230 } //R#17
+  BA:intvector { 449 } //R#18
   BB:intvector { 79 } //R#19
-  BD:intvector { 238, 240, 341 } //R#20
-  BE:intvector { 414 } //R#21
+  BD:intvector { 240, 242, 343 } //R#20
+  BE:intvector { 416 } //R#21
   BF:intvector { 51 } //R#22
-  BG:intvector { 450 } //R#23
-  BH:intvector { 227 } //R#24
+  BG:intvector { 452 } //R#23
+  BH:intvector { 229 } //R#24
   BI:intvector { 17 } //R#25
   BJ:intvector { 52 } //R#26
-  BM:intvector { 306 } //R#27
-  BN:intvector { 232 } //R#28
-  BO:intvector { 142 } //R#29
-  BR:intvector { 62, 78, 80, 83, 88, 99, 108, 112, 146, 148, 165, 174, 175, 179, 182, 186, 340, 342, 343, 344, 345 } //R#30
-  BS:intvector { 161 } //R#31
-  BT:intvector { 293, 294 } //R#32
-  BW:intvector { 28 } //R#33
-  BY:intvector { 435 } //R#34
-  BZ:intvector { 81 } //R#35
-  CA:intvector { 76, 82, 87, 96, 102, 103, 107, 113, 115, 122, 134, 135, 156, 159, 163, 169, 177, 178, 180, 181, 189, 194, 197, 199, 201, 203, 204, 206, 348, 352, 353, 354, 355, 356, 357, 358, 359, 360, 564 } //R#36
-  CC:intvector { 481 } //R#37
-  CD:intvector { 34, 39 } //R#38
-  CF:intvector { 12 } //R#39
-  CG:intvector { 16 } //R#40
-  CH:intvector { 464 } //R#41
-  CI:intvector { 5 } //R#42
-  CK:intvector { 547 } //R#43
-  CL:intvector { 184, 361, 362, 520 } //R#44
-  CM:intvector { 25 } //R#45
-  CN:intvector { 235, 236, 245, 256, 286, 299, 351, 513 } //R#46
-  CO:intvector { 84 } //R#47
-  CR:intvector { 98 } //R#48
-  CU:intvector { 123, 363 } //R#49
-  CV:intvector { 308 } //R#50
-  CX:intvector { 480 } //R#51
-  CY:intvector { 268, 438 } //R#52
-  CZ:intvector { 442 } //R#53
-  DE:intvector { 412 } //R#54
-  DJ:intvector { 24 } //R#55
-  DK:intvector { 418 } //R#56
-  DM:intvector { 106 } //R#57
-  DO:intvector { 185 } //R#58
-  DZ:intvector { 8 } //R#59
-  EC:intvector { 120, 526 } //R#60
-  EE:intvector { 452 } //R#61
-  EG:intvector { 3, 18, 369 } //R#62
-  EH:intvector { 26 } //R#63
-  ER:intvector { 9, 10 } //R#64
-  ES:intvector { 20, 307, 432 } //R#65
-  ET:intvector { 7, 364 } //R#66
-  FI:intvector { 422 } //R#67
-  FJ:intvector { 524 } //R#68
-  FK:intvector { 316 } //R#69
-  FM:intvector { 533, 545, 553, 556 } //R#70
-  FO:intvector { 309, 310 } //R#71
-  FR:intvector { 365, 440 } //R#72
-  GA:intvector { 36 } //R#73
-  GB:intvector { 410, 430, 466, 467 } //R#74
-  GD:intvector { 117 } //R#75
-  GE:intvector { 290 } //R#76
-  GF:intvector { 92 } //R#77
-  GG:intvector { 421 } //R#78
-  GH:intvector { 6 } //R#79
-  GI:intvector { 420 } //R#80
-  GL:intvector { 101, 114, 187, 196 } //R#81
-  GM:intvector { 13 } //R#82
-  GN:intvector { 21 } //R#83
-  GP:intvector { 118 } //R#84
-  GQ:intvector { 41 } //R#85
-  GR:intvector { 409 } //R#86
-  GS:intvector { 314 } //R#87
-  GT:intvector { 119 } //R#88
-  GU:intvector { 529 } //R#89
-  GW:intvector { 14 } //R#90
-  GY:intvector { 121 } //R#91
-  HK:intvector { 246, 474 } //R#92
-  HN:intvector { 195 } //R#93
-  HR:intvector { 462 } //R#94
-  HT:intvector { 172 } //R#95
-  HU:intvector { 416 } //R#96
-  ID:intvector { 250, 251, 265, 273, 296 } //R#97
-  IE:intvector { 370, 419 } //R#98
-  IL:intvector { 252, 292, 490 } //R#99
-  IM:intvector { 423 } //R#100
-  IN:intvector { 233, 476 } //R#101
-  IO:intvector { 479 } //R#102
-  IQ:intvector { 226 } //R#103
-  IR:intvector { 291, 489 } //R#104
-  IS:intvector { 313, 477 } //R#105
-  IT:intvector { 444 } //R#106
-  JE:intvector { 425 } //R#107
-  JM:intvector { 136, 492 } //R#108
-  JO:intvector { 220 } //R#109
-  JP:intvector { 295, 491, 493 } //R#110
-  KE:intvector { 47 } //R#111
-  KG:intvector { 231 } //R#112
-  KH:intvector { 272 } //R#113
-  KI:intvector { 522, 532, 551 } //R#114
-  KM:intvector { 482 } //R#115
-  KN:intvector { 190 } //R#116
-  KP:intvector { 274 } //R#117
-  KR:intvector { 285, 560 } //R#118
-  KW:intvector { 261 } //R#119
-  KY:intvector { 93 } //R#120
-  KZ:intvector { 219, 222, 223, 271, 276 } //R#121
-  LA:intvector { 300 } //R#122
-  LB:intvector { 230 } //R#123
-  LC:intvector { 191 } //R#124
-  LI:intvector { 456 } //R#125
-  LK:intvector { 237 } //R#126
-  LR:intvector { 46 } //R#127
-  LS:intvector { 43 } //R#128
-  LT:intvector { 459 } //R#129
-  LU:intvector { 431 } //R#130
-  LV:intvector { 443 } //R#131
-  LY:intvector { 55, 495 } //R#132
-  MA:intvector { 19 } //R#133
-  MC:intvector { 436 } //R#134
-  MD:intvector { 417, 454 } //R#135
-  ME:intvector { 441 } //R#136
-  MG:intvector { 478 } //R#137
-  MH:intvector { 494, 534, 535 } //R#138
-  MK:intvector { 449 } //R#139
-  ML:intvector { 11, 54 } //R#140
-  MM:intvector { 277 } //R#141
-  MN:intvector { 234, 247, 297, 298 } //R#142
-  MO:intvector { 262, 263 } //R#143
-  MP:intvector { 548 } //R#144
-  MQ:intvector { 149 } //R#145
-  MR:intvector { 50 } //R#146
-  MS:intvector { 160 } //R#147
-  MT:intvector { 433 } //R#148
-  MU:intvector { 486 } //R#149
-  MV:intvector { 485 } //R#150
-  MW:intvector { 15 } //R#151
-  MX:intvector { 89, 95, 110, 124, 150, 153, 154, 157, 198, 500, 501, 502 } //R#152
-  MY:intvector { 259, 260 } //R#153
-  MZ:intvector { 42 } //R#154
-  NA:intvector { 57 } //R#155
-  NC:intvector { 541 } //R#156
-  NE:intvector { 49 } //R#157
-  NF:intvector { 540 } //R#158
-  NG:intvector { 35 } //R#159
-  NI:intvector { 147 } //R#160
-  NL:intvector { 407 } //R#161
-  NO:intvector { 439 } //R#162
-  NP:intvector { 257 } //R#163
-  NR:intvector { 538 } //R#164
-  NU:intvector { 539 } //R#165
-  NZ:intvector { 507, 508, 509, 518, 519 } //R#166
-  OM:intvector { 267 } //R#167
-  PA:intvector { 168 } //R#168
-  PE:intvector { 143 } //R#169
-  PF:intvector { 527, 536, 550 } //R#170
-  PG:intvector { 546 } //R#171
-  PH:intvector { 266 } //R#172
-  PK:intvector { 255, 511 } //R#173
-  PL:intvector { 461, 557 } //R#174
-  PM:intvector { 155 } //R#175
-  PN:intvector { 544 } //R#176
-  PR:intvector { 176, 514 } //R#177
-  PS:intvector { 244 } //R#178
-  PT:intvector { 305, 312, 428, 558 } //R#179
-  PW:intvector { 543 } //R#180
-  PY:intvector { 75 } //R#181
-  QA:intvector { 275 } //R#182
-  RE:intvector { 488 } //R#183
-  RO:intvector { 415 } //R#184
-  RS:intvector { 411 } //R#185
-  RU:intvector { 221, 248, 254, 258, 264, 269, 270, 283, 301, 302, 303, 426, 437, 445, 460, 594 } //R#186
-  RW:intvector { 33 } //R#187
-  SA:intvector { 278 } //R#188
-  SB:intvector { 528, 561 } //R#189
-  SC:intvector { 484 } //R#190
-  SD:intvector { 32 } //R#191
-  SE:intvector { 451 } //R#192
-  SG:intvector { 287, 562 } //R#193
-  SH:intvector { 315 } //R#194
-  SI:intvector { 429 } //R#195
-  SJ:intvector { 217, 311 } //R#196
-  SK:intvector { 413 } //R#197
-  SL:intvector { 27 } //R#198
-  SM:intvector { 446 } //R#199
-  SN:intvector { 22 } //R#200
-  SO:intvector { 45 } //R#201
-  SR:intvector { 170 } //R#202
-  ST:intvector { 53 } //R#203
-  SV:intvector { 109 } //R#204
-  SY:intvector { 239 } //R#205
-  SZ:intvector { 44 } //R#206
-  TC:intvector { 116 } //R#207
-  TD:intvector { 48 } //R#208
-  TF:intvector { 483 } //R#209
-  TG:intvector { 37 } //R#210
-  TH:intvector { 229 } //R#211
-  TJ:intvector { 243 } //R#212
-  TK:intvector { 523 } //R#213
-  TL:intvector { 241 } //R#214
-  TM:intvector { 224, 225 } //R#215
-  TN:intvector { 56 } //R#216
-  TO:intvector { 552 } //R#217
-  TR:intvector { 249, 424, 576 } //R#218
-  TT:intvector { 173 } //R#219
-  TV:intvector { 525 } //R#220
-  TW:intvector { 288, 559 } //R#221
-  TZ:intvector { 23 } //R#222
-  UA:intvector { 427, 448, 455, 463 } //R#223
-  UG:intvector { 31 } //R#224
-  UM:intvector { 531, 537, 554 } //R#225
-  US:intvector { 4, 58, 59, 77, 85, 94, 104, 105, 111, 125, 126, 127, 128, 129, 130, 131, 132, 133, 138, 139, 140, 141, 144, 145, 152, 162, 164, 166, 167, 171, 188, 205, 349, 475, 510, 512, 515, 530, 566, 568, 571, 573, 575, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589 } //R#226
-  UY:intvector { 158 } //R#227
-  UZ:intvector { 284, 289 } //R#228
-  VA:intvector { 457 } //R#229
-  VC:intvector { 193 } //R#230
-  VE:intvector { 90 } //R#231
-  VG:intvector { 200 } //R#232
-  VI:intvector { 192, 202 } //R#233
-  VN:intvector { 282, 593 } //R#234
-  VU:intvector { 521 } //R#235
-  WF:intvector { 555 } //R#236
-  WS:intvector { 497, 517 } //R#237
-  YE:intvector { 218 } //R#238
-  YT:intvector { 487 } //R#239
-  ZA:intvector { 30 } //R#240
-  ZM:intvector { 40 } //R#241
-  ZW:intvector { 29, 346 } //R#242
+  BL:intvector { 190 } //R#27
+  BM:intvector { 308 } //R#28
+  BN:intvector { 234 } //R#29
+  BO:intvector { 142 } //R#30
+  BR:intvector { 62, 78, 80, 83, 88, 99, 108, 112, 146, 148, 166, 175, 176, 180, 183, 187, 342, 344, 345, 346, 347 } //R#31
+  BS:intvector { 162 } //R#32
+  BT:intvector { 295, 296 } //R#33
+  BW:intvector { 28 } //R#34
+  BY:intvector { 437 } //R#35
+  BZ:intvector { 81 } //R#36
+  CA:intvector { 76, 82, 87, 96, 102, 103, 107, 113, 115, 122, 134, 135, 157, 160, 164, 170, 178, 179, 181, 182, 191, 196, 199, 201, 203, 205, 206, 208, 350, 354, 355, 356, 357, 358, 359, 360, 361, 362, 566 } //R#37
+  CC:intvector { 483 } //R#38
+  CD:intvector { 34, 39 } //R#39
+  CF:intvector { 12 } //R#40
+  CG:intvector { 16 } //R#41
+  CH:intvector { 466 } //R#42
+  CI:intvector { 5 } //R#43
+  CK:intvector { 549 } //R#44
+  CL:intvector { 185, 363, 364, 522 } //R#45
+  CM:intvector { 25 } //R#46
+  CN:intvector { 237, 238, 247, 258, 288, 301, 353, 515 } //R#47
+  CO:intvector { 84 } //R#48
+  CR:intvector { 98 } //R#49
+  CU:intvector { 123, 365 } //R#50
+  CV:intvector { 310 } //R#51
+  CX:intvector { 482 } //R#52
+  CY:intvector { 270, 440 } //R#53
+  CZ:intvector { 444 } //R#54
+  DE:intvector { 414 } //R#55
+  DJ:intvector { 24 } //R#56
+  DK:intvector { 420 } //R#57
+  DM:intvector { 106 } //R#58
+  DO:intvector { 186 } //R#59
+  DZ:intvector { 8 } //R#60
+  EC:intvector { 120, 528 } //R#61
+  EE:intvector { 454 } //R#62
+  EG:intvector { 3, 18, 371 } //R#63
+  EH:intvector { 26 } //R#64
+  ER:intvector { 9, 10 } //R#65
+  ES:intvector { 20, 309, 434 } //R#66
+  ET:intvector { 7, 366 } //R#67
+  FI:intvector { 424 } //R#68
+  FJ:intvector { 526 } //R#69
+  FK:intvector { 318 } //R#70
+  FM:intvector { 535, 547, 555, 558 } //R#71
+  FO:intvector { 311, 312 } //R#72
+  FR:intvector { 367, 442 } //R#73
+  GA:intvector { 36 } //R#74
+  GB:intvector { 412, 432, 468, 469 } //R#75
+  GD:intvector { 117 } //R#76
+  GE:intvector { 292 } //R#77
+  GF:intvector { 92 } //R#78
+  GG:intvector { 423 } //R#79
+  GH:intvector { 6 } //R#80
+  GI:intvector { 422 } //R#81
+  GL:intvector { 101, 114, 188, 198 } //R#82
+  GM:intvector { 13 } //R#83
+  GN:intvector { 21 } //R#84
+  GP:intvector { 118 } //R#85
+  GQ:intvector { 41 } //R#86
+  GR:intvector { 411 } //R#87
+  GS:intvector { 316 } //R#88
+  GT:intvector { 119 } //R#89
+  GU:intvector { 531 } //R#90
+  GW:intvector { 14 } //R#91
+  GY:intvector { 121 } //R#92
+  HK:intvector { 248, 476 } //R#93
+  HN:intvector { 197 } //R#94
+  HR:intvector { 464 } //R#95
+  HT:intvector { 173 } //R#96
+  HU:intvector { 418 } //R#97
+  ID:intvector { 252, 253, 267, 275, 298 } //R#98
+  IE:intvector { 372, 421 } //R#99
+  IL:intvector { 254, 294, 492 } //R#100
+  IM:intvector { 425 } //R#101
+  IN:intvector { 235, 478 } //R#102
+  IO:intvector { 481 } //R#103
+  IQ:intvector { 228 } //R#104
+  IR:intvector { 293, 491 } //R#105
+  IS:intvector { 315, 479 } //R#106
+  IT:intvector { 446 } //R#107
+  JE:intvector { 427 } //R#108
+  JM:intvector { 136, 494 } //R#109
+  JO:intvector { 222 } //R#110
+  JP:intvector { 297, 493, 495 } //R#111
+  KE:intvector { 47 } //R#112
+  KG:intvector { 233 } //R#113
+  KH:intvector { 274 } //R#114
+  KI:intvector { 524, 534, 553 } //R#115
+  KM:intvector { 484 } //R#116
+  KN:intvector { 192 } //R#117
+  KP:intvector { 276 } //R#118
+  KR:intvector { 287, 562 } //R#119
+  KW:intvector { 263 } //R#120
+  KY:intvector { 93 } //R#121
+  KZ:intvector { 221, 224, 225, 273, 278 } //R#122
+  LA:intvector { 302 } //R#123
+  LB:intvector { 232 } //R#124
+  LC:intvector { 193 } //R#125
+  LI:intvector { 458 } //R#126
+  LK:intvector { 239 } //R#127
+  LR:intvector { 46 } //R#128
+  LS:intvector { 43 } //R#129
+  LT:intvector { 461 } //R#130
+  LU:intvector { 433 } //R#131
+  LV:intvector { 445 } //R#132
+  LY:intvector { 55, 497 } //R#133
+  MA:intvector { 19 } //R#134
+  MC:intvector { 438 } //R#135
+  MD:intvector { 419, 456 } //R#136
+  ME:intvector { 443 } //R#137
+  MF:intvector { 149 } //R#138
+  MG:intvector { 480 } //R#139
+  MH:intvector { 496, 536, 537 } //R#140
+  MK:intvector { 451 } //R#141
+  ML:intvector { 11, 54 } //R#142
+  MM:intvector { 279 } //R#143
+  MN:intvector { 236, 249, 299, 300 } //R#144
+  MO:intvector { 264, 265 } //R#145
+  MP:intvector { 550 } //R#146
+  MQ:intvector { 150 } //R#147
+  MR:intvector { 50 } //R#148
+  MS:intvector { 161 } //R#149
+  MT:intvector { 435 } //R#150
+  MU:intvector { 488 } //R#151
+  MV:intvector { 487 } //R#152
+  MW:intvector { 15 } //R#153
+  MX:intvector { 89, 95, 110, 124, 151, 154, 155, 158, 200, 502, 503, 504 } //R#154
+  MY:intvector { 261, 262 } //R#155
+  MZ:intvector { 42 } //R#156
+  NA:intvector { 57 } //R#157
+  NC:intvector { 543 } //R#158
+  NE:intvector { 49 } //R#159
+  NF:intvector { 542 } //R#160
+  NG:intvector { 35 } //R#161
+  NI:intvector { 147 } //R#162
+  NL:intvector { 409 } //R#163
+  NO:intvector { 441 } //R#164
+  NP:intvector { 259 } //R#165
+  NR:intvector { 540 } //R#166
+  NU:intvector { 541 } //R#167
+  NZ:intvector { 509, 510, 511, 520, 521 } //R#168
+  OM:intvector { 269 } //R#169
+  PA:intvector { 169 } //R#170
+  PE:intvector { 143 } //R#171
+  PF:intvector { 529, 538, 552 } //R#172
+  PG:intvector { 548 } //R#173
+  PH:intvector { 268 } //R#174
+  PK:intvector { 257, 513 } //R#175
+  PL:intvector { 463, 559 } //R#176
+  PM:intvector { 156 } //R#177
+  PN:intvector { 546 } //R#178
+  PR:intvector { 177, 516 } //R#179
+  PS:intvector { 246 } //R#180
+  PT:intvector { 307, 314, 430, 560 } //R#181
+  PW:intvector { 545 } //R#182
+  PY:intvector { 75 } //R#183
+  QA:intvector { 277 } //R#184
+  RE:intvector { 490 } //R#185
+  RO:intvector { 417 } //R#186
+  RS:intvector { 413 } //R#187
+  RU:intvector { 223, 250, 256, 260, 266, 271, 272, 285, 303, 304, 305, 428, 439, 447, 462, 596 } //R#188
+  RW:intvector { 33 } //R#189
+  SA:intvector { 280 } //R#190
+  SB:intvector { 530, 563 } //R#191
+  SC:intvector { 486 } //R#192
+  SD:intvector { 32 } //R#193
+  SE:intvector { 453 } //R#194
+  SG:intvector { 289, 564 } //R#195
+  SH:intvector { 317 } //R#196
+  SI:intvector { 431 } //R#197
+  SJ:intvector { 219, 313 } //R#198
+  SK:intvector { 415 } //R#199
+  SL:intvector { 27 } //R#200
+  SM:intvector { 448 } //R#201
+  SN:intvector { 22 } //R#202
+  SO:intvector { 45 } //R#203
+  SR:intvector { 171 } //R#204
+  ST:intvector { 53 } //R#205
+  SV:intvector { 109 } //R#206
+  SY:intvector { 241 } //R#207
+  SZ:intvector { 44 } //R#208
+  TC:intvector { 116 } //R#209
+  TD:intvector { 48 } //R#210
+  TF:intvector { 485 } //R#211
+  TG:intvector { 37 } //R#212
+  TH:intvector { 231 } //R#213
+  TJ:intvector { 245 } //R#214
+  TK:intvector { 525 } //R#215
+  TL:intvector { 243 } //R#216
+  TM:intvector { 226, 227 } //R#217
+  TN:intvector { 56 } //R#218
+  TO:intvector { 554 } //R#219
+  TR:intvector { 251, 426, 578 } //R#220
+  TT:intvector { 174 } //R#221
+  TV:intvector { 527 } //R#222
+  TW:intvector { 290, 561 } //R#223
+  TZ:intvector { 23 } //R#224
+  UA:intvector { 429, 450, 457, 465 } //R#225
+  UG:intvector { 31 } //R#226
+  UM:intvector { 533, 539, 556 } //R#227
+  US:intvector { 4, 58, 59, 77, 85, 94, 104, 105, 111, 125, 126, 127, 128, 129, 130, 131, 132, 133, 138, 139, 140, 141, 144, 145, 153, 163, 165, 167, 168, 172, 189, 207, 351, 477, 512, 514, 517, 532, 568, 570, 573, 575, 577, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591 } //R#228
+  UY:intvector { 159 } //R#229
+  UZ:intvector { 286, 291 } //R#230
+  VA:intvector { 459 } //R#231
+  VC:intvector { 195 } //R#232
+  VE:intvector { 90 } //R#233
+  VG:intvector { 202 } //R#234
+  VI:intvector { 194, 204 } //R#235
+  VN:intvector { 284, 595 } //R#236
+  VU:intvector { 523 } //R#237
+  WF:intvector { 557 } //R#238
+  WS:intvector { 499, 519 } //R#239
+  YE:intvector { 220 } //R#240
+  YT:intvector { 489 } //R#241
+  ZA:intvector { 30 } //R#242
+  ZM:intvector { 40 } //R#243
+  ZW:intvector { 29, 348 } //R#244
  }
 }

Added: trunk/source/data/rbnf/rbnffiles.mk
===================================================================
--- trunk/source/data/rbnf/rbnffiles.mk	                        (rev 0)
+++ trunk/source/data/rbnf/rbnffiles.mk	2008-03-24 11:52:37 UTC (rev 144)
@@ -0,0 +1,55 @@
+# *   Copyright (C) 1997-2005, International Business Machines
+# *   Corporation and others.  All Rights Reserved.
+# A list of txt's to build
+# Note: 
+#
+#   If you are thinking of modifying this file, READ THIS. 
+#
+# Instead of changing this file [unless you want to check it back in],
+# you should consider creating a 'reslocal.mk' file in this same directory.
+# Then, you can have your local changes remain even if you upgrade or
+# reconfigure ICU.
+#
+# Example 'rbnflocal.mk' files:
+#
+#  * To add an additional locale to the list: 
+#    _____________________________________________________
+#    |  RBNF_SOURCE_LOCAL =   myLocale.txt ...
+#
+#  * To REPLACE the default list and only build with a few
+#     locale:
+#    _____________________________________________________
+#    |  RBNF_SOURCE = ar.txt ar_AE.txt en.txt de.txt zh.txt
+#
+#
+
+
+# This is the list of locales that are built, but not considered installed in ICU.
+# These are usually aliased locales or the root locale.
+RBNF_ALIAS_SOURCE = 
+
+
+# Please try to keep this list in alphabetical order
+RBNF_SOURCE = \
+da.txt \
+de.txt \
+en.txt en_GB.txt\
+eo.txt \
+es.txt \
+fa.txt fa_AF.txt \
+fr.txt fr_BE.txt fr_CH.txt \
+ga.txt \
+he.txt \
+it.txt \
+ja.txt \
+mt.txt \
+nl.txt \
+pl.txt \
+pt.txt \
+ru.txt \
+sv.txt \
+th.txt \
+uk.txt 
+
+#These are not in use yet
+# el.txt \

Modified: trunk/source/i18n/Makefile.in
===================================================================
--- trunk/source/i18n/Makefile.in	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/i18n/Makefile.in	2008-03-24 11:52:37 UTC (rev 144)
@@ -78,7 +78,7 @@
 regexcmp.o rematch.o repattrn.o regexst.o udatpg.o uregex.o uregexc.o \
 ulocdata.o measfmt.o currfmt.o curramt.o currunit.o measure.o utmscale.o \
 csdetect.o csmatch.o csr2022.o csrecog.o csrmbcs.o csrsbcs.o csrucode.o csrutf8.o inputext.o \
-windtfmt.o winnmfmt.o basictz.o dtrule.o rbtz.o tzrule.o tztrans.o vtzone.o
+windtfmt.o winnmfmt.o basictz.o dtrule.o rbtz.o tzrule.o tztrans.o vtzone.o zonemeta.o zstrfmt.o
 
 ## Header files to install
 HEADERS = $(srcdir)/unicode/*.h

Modified: trunk/source/i18n/basictz.cpp
===================================================================
--- trunk/source/i18n/basictz.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/i18n/basictz.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -512,6 +512,15 @@
     transitionRules = NULL;
 }
 
+void
+BasicTimeZone::getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt,
+                            int32_t& rawOffset, int32_t& dstOffset, UErrorCode& status) /*const*/ {
+    if (U_FAILURE(status)) {
+        return;
+    }
+    status = U_UNSUPPORTED_ERROR;
+}
+
 U_NAMESPACE_END
 
 #endif /* #if !UCONFIG_NO_FORMATTING */

Modified: trunk/source/i18n/calendar.cpp
===================================================================
--- trunk/source/i18n/calendar.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/i18n/calendar.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -1093,7 +1093,7 @@
     double localMillis = internalGetTime();
     int32_t rawOffset, dstOffset;
     getTimeZone().getOffset(localMillis, FALSE, rawOffset, dstOffset, ec);
-    localMillis += rawOffset; 
+    localMillis += (rawOffset + dstOffset); 
 
     // Mark fields as set.  Do this before calling handleComputeFields().
     uint32_t mask =   //fInternalSetMask;
@@ -1133,33 +1133,8 @@
     //__FILE__, __LINE__, fFields[UCAL_JULIAN_DAY], localMillis);
 #endif  
 
-    // In some cases we will have to call this method again below to
-    // adjust for DST pushing us into the next Julian day.
     computeGregorianAndDOWFields(fFields[UCAL_JULIAN_DAY], ec);
 
-    int32_t millisInDay =  (int32_t) (localMillis - (days * kOneDay));
-    if (millisInDay < 0) millisInDay += (int32_t)kOneDay;
-
-    // Adjust our millisInDay for DST.  dstOffset will be zero if DST
-    // is not in effect at this time of year, or if our zone does not
-    // use DST.
-    millisInDay += dstOffset;
-
-    // If DST has pushed us into the next day, we must call
-    // computeGregorianAndDOWFields() again.  This happens in DST between
-    // 12:00 am and 1:00 am every day.  The first call to
-    // computeGregorianAndDOWFields() will give the wrong day, since the
-    // Standard time is in the previous day.
-    if (millisInDay >= (int32_t)kOneDay) {
-        millisInDay -= (int32_t)kOneDay; // ASSUME dstOffset < 24:00
-
-        // We don't worry about overflow of JULIAN_DAY because the
-        // allowable range of JULIAN_DAY has slop at the ends (that is,
-        // the max is less that 0x7FFFFFFF and the min is greater than
-        // -0x80000000).
-        computeGregorianAndDOWFields(++fFields[UCAL_JULIAN_DAY], ec);
-    }
-
     // Call framework method to have subclass compute its fields.
     // These must include, at a minimum, MONTH, DAY_OF_MONTH,
     // EXTENDED_YEAR, YEAR, DAY_OF_YEAR.  This method will call internalSet(),
@@ -1173,6 +1148,7 @@
     // Compute time-related fields.  These are indepent of the date and
     // of the subclass algorithm.  They depend only on the local zone
     // wall milliseconds in day.
+    int32_t millisInDay =  (int32_t) (localMillis - (days * kOneDay));
     fFields[UCAL_MILLISECONDS_IN_DAY] = millisInDay;
     fFields[UCAL_MILLISECOND] = millisInDay % 1000;
     millisInDay /= 1000;
@@ -2346,11 +2322,11 @@
         // 1. The transition into DST.  Here, a designated time of 2:00 am - 2:59 am
         //    can be in standard or in DST depending.  However, 2:00 am is an invalid
         //    representation (the representation jumps from 1:59:59 am Std to 3:00:00 am DST).
-        //    We assume standard time.
+        //    We assume standard time, that is, 2:30 am is interpreted as 3:30 am DST.
         // 2. The transition out of DST.  Here, a designated time of 1:00 am - 1:59 am
         //    can be in standard or DST.  Both are valid representations (the rep
         //    jumps from 1:59:59 DST to 1:00:00 Std).
-        //    Again, we assume standard time.
+        //    Again, we assume standard time, that is, 1:30 am is interpreted as 1:30 am Std.
         // We use the TimeZone object, unless the user has explicitly set the ZONE_OFFSET
         // or DST_OFFSET fields; then we use those fields.
         if (fStamp[UCAL_ZONE_OFFSET] >= ((int32_t)kMinimumUserStamp) ||

Modified: trunk/source/i18n/datefmt.cpp
===================================================================
--- trunk/source/i18n/datefmt.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/i18n/datefmt.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -170,24 +170,32 @@
 DateFormat::parse(const UnicodeString& text,
                   ParsePosition& pos) const
 {
+    UDate d = 0; // Error return UDate is 0 (the epoch)
     if (fCalendar != NULL) {
         int32_t start = pos.getIndex();
+
+        // Parse may update TimeZone used by the calendar.
+        TimeZone *tzsav = (TimeZone*)fCalendar->getTimeZone().clone();
+
         fCalendar->clear();
         parse(text, *fCalendar, pos);
         if (pos.getIndex() != start) {
             UErrorCode ec = U_ZERO_ERROR;
-            UDate d = fCalendar->getTime(ec);
-            if (U_SUCCESS(ec)) {
-                return d; // Successful function exit
+            d = fCalendar->getTime(ec);
+            if (U_FAILURE(ec)) {
+                // We arrive here if fCalendar is non-lenient and there
+                // is an out-of-range field.  We don't know which field
+                // was illegal so we set the error index to the start.
+                pos.setIndex(start);
+                pos.setErrorIndex(start);
+                d = 0;
             }
-            // We arrive here if fCalendar is non-lenient and there
-            // is an out-of-range field.  We don't know which field
-            // was illegal so we set the error index to the start.
-            pos.setIndex(start);
-            pos.setErrorIndex(start);
         }
+
+        // Restore TimeZone
+        fCalendar->adoptTimeZone(tzsav);
     }
-    return 0; // Error return UDate is 0 (the epoch)
+    return d;
 }
 
 //----------------------------------------------------------------------

Modified: trunk/source/i18n/dtfmtsym.cpp
===================================================================
--- trunk/source/i18n/dtfmtsym.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/i18n/dtfmtsym.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -34,7 +34,8 @@
 #include "locbased.h"
 #include "gregoimp.h"
 #include "hash.h"
-#include "uresimp.h" 
+#include "uresimp.h"
+#include "zstrfmt.h"
 
 // *****************************************************************************
 // class DateFormatSymbols
@@ -130,6 +131,17 @@
     {0x0047, 0x004D, 0x0054, 0x0000}  /* "GMT" */
 };
 
+static const UChar gLastResortGmtFormat[] =
+    {0x0047, 0x004D, 0x0054, 0x007B, 0x0030, 0x007D, 0x0000}; /* GMT{0} */
+
+static const UChar gLastResortGmtHourFormats[4][10] =
+{
+    {0x002D, 0x0048, 0x0048, 0x003A, 0x006D, 0x006D, 0x003A, 0x0073, 0x0073, 0x0000}, /* -HH:mm:ss */
+    {0x002D, 0x0048, 0x0048, 0x003A, 0x006D, 0x006D, 0x0000, 0x0000, 0x0000, 0x0000}, /* -HH:mm */
+    {0x002B, 0x0048, 0x0048, 0x003A, 0x006D, 0x006D, 0x003A, 0x0073, 0x0073, 0x0000}, /* +HH:mm:ss */
+    {0x002B, 0x0048, 0x0048, 0x003A, 0x006D, 0x006D, 0x0000, 0x0000, 0x0000, 0x0000}  /* +HH:mm */
+};
+
 /* Sizes for the last resort string arrays */
 typedef enum LastResortSize {
     kMonthNum = 13,
@@ -148,7 +160,10 @@
     kEraLen = 3,
 
     kZoneNum = 5,
-    kZoneLen = 4
+    kZoneLen = 4,
+
+    kGmtHourNum = 4,
+    kGmtHourLen = 10
 } LastResortSize;
 
 U_NAMESPACE_BEGIN
@@ -171,39 +186,15 @@
 static const char gNamesStandaloneTag[]="stand-alone";
 static const char gAmPmMarkersTag[]="AmPmMarkers";
 static const char gQuartersTag[]="quarters";
-static const char gMaptimezonesTag[]="mapTimezones";
-static const char gMetazonesTag[]="metazones";
-static const char gTerritoryTag[]="territory";
-static const char gCountriesTag[]="Countries";
-static const char gZoneFormattingTag[]="zoneFormatting";
-static const char gMultizoneTag[]="multizone";
-static const char gRegionFormatTag[]="zoneStrings/regionFormat";
-static const char gFallbackFormatTag[]="zoneStrings/fallbackFormat";
 
-/**
- * These are the tags we expect to see in time zone data resource bundle files
- * associated with a locale.
- */
 static const char gZoneStringsTag[]="zoneStrings";
+static const char gGmtFormatTag[]="gmtFormat";
+static const char gHourFormatTag[]="hourFormat";
+
 static const char gLocalPatternCharsTag[]="localPatternChars";
 
 static UMTX LOCK;
 
-/*
- * Keep this variable in synch with max length of display strings
- */
-#define ZID_KEY_MAX 128
-#define UTZ_MAX_DISPLAY_STRINGS_LENGTH 7
-#define UTZ_SHORT_GENERIC   "sg"
-#define UTZ_SHORT_STANDARD  "ss"
-#define UTZ_SHORT_DAYLIGHT  "sd"
-#define UTZ_LONG_GENERIC    "lg"
-#define UTZ_LONG_STANDARD   "ls"
-#define UTZ_LONG_DAYLIGHT   "ld"
-#define UTZ_EXEMPLAR_CITY   "ec"
-#define UTZ_USES_METAZONE   "um"
-#define UTZ_COMMONLY_USED   "cu"
-
 /**
  * Jitterbug 2974: MSVC has a bug whereby new X[0] behaves badly.
  * Work around this.
@@ -212,12 +203,6 @@
     return new UnicodeString[count ? count : 1];
 }
 
-U_CDECL_BEGIN
-static void deleteUnicodeStringArray(void* obj) {
-    delete[] (UnicodeString*)obj;
-}
-U_CDECL_END
-
 //------------------------------------------------------
 
 DateFormatSymbols::DateFormatSymbols(const Locale& locale,
@@ -327,26 +312,25 @@
     assignArray(fShortQuarters, fShortQuartersCount, other.fShortQuarters, other.fShortQuartersCount);
     assignArray(fStandaloneQuarters, fStandaloneQuartersCount, other.fStandaloneQuarters, other.fStandaloneQuartersCount);
     assignArray(fStandaloneShortQuarters, fStandaloneShortQuartersCount, other.fStandaloneShortQuarters, other.fStandaloneShortQuartersCount);
-    // the zoneStrings data is initialized on demand
-    //fZoneStringsRowCount = other.fZoneStringsRowCount;
-    //fZoneStringsColCount = other.fZoneStringsColCount;
-    //createZoneStrings((const UnicodeString**)other.fZoneStrings);
-    // initialize on demand
-    fZoneStringsHash = NULL;
-    fZoneIDEnumeration = NULL;
-    fZoneStrings = NULL;
-    fZoneStringsColCount = 0;
-    fZoneStringsRowCount = 0;
-    fResourceBundle = NULL;
-    fCountry = other.fCountry;
-    if(other.fZoneStringsHash!=NULL){
-        fZoneStringsHash = createZoneStringsHash(other.fZoneStringsHash);
-        fZoneIDEnumeration = other.fZoneIDEnumeration->clone();
-    }else{
-        UErrorCode status =U_ZERO_ERROR;
-        fResourceBundle = ures_clone(other.fResourceBundle, &status);
-        // TODO: what should be done in case of error?
+    fGmtFormat = other.fGmtFormat;
+    assignArray(fGmtHourFormats, fGmtHourFormatsCount, other.fGmtHourFormats, other.fGmtHourFormatsCount);
+ 
+    if (other.fZoneStrings != NULL) {
+        fZoneStringsColCount = other.fZoneStringsColCount;
+        fZoneStringsRowCount = other.fZoneStringsRowCount;
+        createZoneStrings((const UnicodeString**)other.fZoneStrings);
+
+    } else {
+        fZoneStrings = NULL;
+        fZoneStringsColCount = 0;
+        fZoneStringsRowCount = 0;
     }
+    fZSFLocale = other.fZSFLocale;
+    // Other zone strings data is created on demand
+    fZoneStringFormat = NULL;
+    fLocaleZoneStrings = NULL;
+    fZSFCachePtr = NULL;
+    fZSFLocal = NULL;
 
     // fastCopyFrom() - see assignArray comments
     fLocalPatternChars.fastCopyFrom(other.fLocalPatternChars);
@@ -389,6 +373,7 @@
     if (fShortQuarters)            delete[] fShortQuarters;
     if (fStandaloneQuarters)       delete[] fStandaloneQuarters;
     if (fStandaloneShortQuarters)  delete[] fStandaloneShortQuarters;
+    if (fGmtHourFormats)           delete[] fGmtHourFormats;
 
     disposeZoneStrings();
 }
@@ -396,23 +381,32 @@
 void DateFormatSymbols::disposeZoneStrings()
 {
     if (fZoneStrings) {
-        for (int32_t row=0; row<fZoneStringsRowCount; ++row)
+        for (int32_t row = 0; row < fZoneStringsRowCount; ++row) {
             delete[] fZoneStrings[row];
+        }
         uprv_free(fZoneStrings);
-    } 
-    if(fZoneStringsHash){
-        delete fZoneStringsHash;
-        fZoneStringsHash =  NULL;
     }
-    if(fZoneIDEnumeration){
-        delete fZoneIDEnumeration; 
-        fZoneIDEnumeration = NULL;
+    if (fLocaleZoneStrings) {
+        for (int32_t row = 0; row < fZoneStringsRowCount; ++row) {
+            delete[] fLocaleZoneStrings[row];
+        }
+        uprv_free(fLocaleZoneStrings);
     }
-    if (fResourceBundle){
-        ures_close(fResourceBundle);
-        fResourceBundle = NULL;
+    if (fZSFLocal) {
+        delete fZSFLocal;
     }
+    if (fZSFCachePtr) {
+        delete fZSFCachePtr;
+    }
 
+    fZoneStrings = NULL;
+    fLocaleZoneStrings = NULL;
+    fZoneStringsRowCount = 0;
+    fZoneStringsColCount = 0;
+
+    fZoneStringFormat = NULL;
+    fZSFLocal = NULL;
+    fZSFCachePtr = NULL;
 }
 
 UBool
@@ -454,7 +448,9 @@
         fQuartersCount == other.fQuartersCount &&
         fShortQuartersCount == other.fShortQuartersCount &&
         fStandaloneQuartersCount == other.fStandaloneQuartersCount &&
-        fStandaloneShortQuartersCount == other.fStandaloneShortQuartersCount)
+        fStandaloneShortQuartersCount == other.fStandaloneShortQuartersCount &&
+        fGmtHourFormatsCount == other.fGmtHourFormatsCount &&
+        fGmtFormat == other.fGmtFormat)
     {
         // Now compare the arrays themselves
         if (arrayCompare(fEras, other.fEras, fErasCount) &&
@@ -475,25 +471,25 @@
             arrayCompare(fQuarters, other.fQuarters, fQuartersCount) &&
             arrayCompare(fShortQuarters, other.fShortQuarters, fShortQuartersCount) &&
             arrayCompare(fStandaloneQuarters, other.fStandaloneQuarters, fStandaloneQuartersCount) &&
-            arrayCompare(fStandaloneShortQuarters, other.fStandaloneShortQuarters, fStandaloneShortQuartersCount))
+            arrayCompare(fStandaloneShortQuarters, other.fStandaloneShortQuarters, fStandaloneShortQuartersCount) &&
+            arrayCompare(fGmtHourFormats, other.fGmtHourFormats, fGmtHourFormatsCount))
         {
-            
-            if(fZoneStringsHash == NULL || other.fZoneStringsHash == NULL){
-                // fZoneStringsHash is not initialized compare the resource bundles
-                if(ures_equal(fResourceBundle, other.fResourceBundle)== FALSE){
-                    return FALSE;
+            // Compare the contents of fZoneStrings
+            if (fZoneStrings == NULL && other.fZoneStrings == NULL) {
+                if (fZSFLocale == other.fZSFLocale) {
+                    return TRUE;
                 }
-            }else{
-                if(fZoneStringsHash->equals(*other.fZoneStringsHash) == FALSE){
-                    return FALSE;
+            } else if (fZoneStrings != NULL && other.fZoneStrings != NULL) {
+                if (fZoneStringsRowCount == other.fZoneStringsRowCount
+                    && fZoneStringsColCount == other.fZoneStringsColCount) {
+                    UBool cmpres = TRUE;
+                    for (int32_t i = 0; (i < fZoneStringsRowCount) && cmpres; i++) {
+                        cmpres = arrayCompare(fZoneStrings[i], other.fZoneStrings[i], fZoneStringsColCount);
+                    }
+                    return cmpres;
                 }
-                // we always make sure that we update the enumeration when the hash is
-                // updated. So we can be sure that once we compare the hashes  the 
-                // enumerations are also equal
             }
-            // since fZoneStrings data member is deprecated .. and may not be initialized
-            // so don't compare them
-            return TRUE;
+            return FALSE;
         }
     }
     return FALSE;
@@ -997,25 +993,73 @@
 }
 
 //------------------------------------------------------
+const ZoneStringFormat*
+DateFormatSymbols::getZoneStringFormat(void) const {
+    umtx_lock(&LOCK);
+    if (fZoneStringFormat == NULL) {
+        ((DateFormatSymbols*)this)->initZoneStringFormat();
+    }
+    umtx_unlock(&LOCK);
+    return fZoneStringFormat;
+}
 
+void
+DateFormatSymbols::initZoneStringFormat(void) {
+    if (fZoneStringFormat == NULL) {
+        UErrorCode status = U_ZERO_ERROR;
+        if (fZoneStrings) {
+            // Create an istance of ZoneStringFormat by the custom zone strings array
+            fZSFLocal = new ZoneStringFormat((const UnicodeString* const*)fZoneStrings, fZoneStringsRowCount,
+                fZoneStringsColCount, status);
+            if (U_FAILURE(status)) {
+                delete fZSFLocal;
+            } else {
+                fZoneStringFormat = (const ZoneStringFormat*)fZSFLocal;
+            }
+        } else {
+            fZSFCachePtr = ZoneStringFormat::getZoneStringFormat(fZSFLocale, status);
+            if (U_FAILURE(status)) {
+                delete fZSFCachePtr;
+            } else {
+                fZoneStringFormat = fZSFCachePtr->get();
+            }
+        }
+    }
+}
+
 const UnicodeString**
 DateFormatSymbols::getZoneStrings(int32_t& rowCount, int32_t& columnCount) const
 {
+    const UnicodeString **result = NULL;
+
     umtx_lock(&LOCK);
-    UErrorCode status = U_ZERO_ERROR;
-    if(fZoneStrings==NULL){
-        // cast away const to get around the problem for lazy initialization
-        ((DateFormatSymbols*)this)->initZoneStringsArray(status);
+    if (fZoneStrings == NULL) {
+        if (fLocaleZoneStrings == NULL) {
+            ((DateFormatSymbols*)this)->initZoneStringsArray();
+        }
+        result = (const UnicodeString**)fLocaleZoneStrings;
+    } else {
+        result = (const UnicodeString**)fZoneStrings;
     }
     rowCount = fZoneStringsRowCount;
     columnCount = fZoneStringsColCount;
     umtx_unlock(&LOCK);
-    if(U_FAILURE(status)){
-        rowCount = 0;
-        columnCount = 0;
-        return NULL;
+
+    return result;
+}
+
+void
+DateFormatSymbols::initZoneStringsArray(void) {
+    if (fZoneStrings == NULL && fLocaleZoneStrings == NULL) {
+        if (fZoneStringFormat == NULL) {
+            initZoneStringFormat();
+        }
+        if (fZoneStringFormat) {
+            UErrorCode status = U_ZERO_ERROR;
+            fLocaleZoneStrings = fZoneStringFormat->createZoneStringsArray(uprv_getUTCtime() /* use current time */,
+                fZoneStringsRowCount, fZoneStringsColCount, status);
+        }
     }
-    return (const UnicodeString**)fZoneStrings; // Compiler requires cast
 }
 
 void
@@ -1030,7 +1074,6 @@
     fZoneStringsRowCount = rowCount;
     fZoneStringsColCount = columnCount;
     createZoneStrings((const UnicodeString**)strings);
-    initZoneStrings((const UnicodeString**)strings, rowCount,columnCount, status);
 }
 
 //------------------------------------------------------
@@ -1144,14 +1187,22 @@
     fStandaloneQuartersCount = 0;
     fStandaloneShortQuarters = NULL;
     fStandaloneShortQuartersCount = 0;
+    fGmtHourFormats = NULL;
+    fGmtHourFormatsCount = 0;
     fZoneStringsRowCount = 0;
     fZoneStringsColCount = 0;
     fZoneStrings = NULL;
-    fZoneStringsHash = NULL;
-    fZoneIDEnumeration = NULL;
-    fResourceBundle   = NULL;
-    fCountry = NULL;
-    
+    fLocaleZoneStrings = NULL;
+
+    fZoneStringFormat = NULL;
+    fZSFLocal = NULL;
+    fZSFCachePtr = NULL;
+
+    // We need to preserve the requested locale for
+    // lazy ZoneStringFormat instantiation.  ZoneStringFormat
+    // is region sensitive, thus, bundle locale bundle's locale
+    // is not sufficient.
+    fZSFLocale = locale;
       
     if (U_FAILURE(status)) return;
 
@@ -1161,9 +1212,13 @@
      * these.
      */
     CalendarData calData(locale, type, status);
-    fResourceBundle = ures_open(NULL, locale.getName(), &status);
-    fCountry = locale.getCountry();
 
+    /**
+     * Use the localeBundle for getting zone GMT formatting patterns
+     */
+    UResourceBundle *localeBundle = ures_open(NULL, locale.getName(), &status);
+    UResourceBundle *zoneStringsArray = ures_getByKeyWithFallback(localeBundle, gZoneStringsTag, NULL, &status);
+
     // load the first data item
     UResourceBundle *erasMain = calData.getByKey(gErasTag, status);
     UResourceBundle *eras = ures_getByKeyWithFallback(erasMain, gAbbreviatedTag, NULL, &status);
@@ -1212,6 +1267,8 @@
             initField(&fShortQuarters, fShortQuartersCount, (const UChar *)gLastResortQuarters, kQuarterNum, kQuarterLen, status);
             initField(&fStandaloneQuarters, fStandaloneQuartersCount, (const UChar *)gLastResortQuarters, kQuarterNum, kQuarterLen, status);
             initField(&fStandaloneShortQuarters, fStandaloneShortQuartersCount, (const UChar *)gLastResortQuarters, kQuarterNum, kQuarterLen, status);
+            initField(&fGmtHourFormats, fGmtHourFormatsCount, (const UChar *)gLastResortGmtHourFormats, kGmtHourNum, kGmtHourLen, status);
+            fGmtFormat.setTo(TRUE, gLastResortGmtFormat, -1);
             fLocalPatternChars.setTo(TRUE, gPatternChars, PATTERN_CHARS_LEN);
         }
         goto cleanup;
@@ -1274,6 +1331,41 @@
         status = U_ZERO_ERROR;
         initField(&fStandaloneShortQuarters, fStandaloneShortQuartersCount, calData.getByKey2(gQuartersTag, gNamesAbbrTag, status), status);
     }
+
+    // GMT format patterns
+    resStr = ures_getStringByKeyWithFallback(zoneStringsArray, gGmtFormatTag, &len, &status);
+    if (len > 0) {
+        fGmtFormat.setTo(TRUE, resStr, len);
+    }
+
+    resStr = ures_getStringByKeyWithFallback(zoneStringsArray, gHourFormatTag, &len, &status);
+    if (len > 0) {
+        UChar *sep = u_strchr(resStr, (UChar)0x003B /* ';' */);
+        if (sep != NULL) {
+            fGmtHourFormats = newUnicodeStringArray(GMT_HOUR_COUNT);
+            if (fGmtHourFormats == NULL) {
+                status = U_MEMORY_ALLOCATION_ERROR;
+            } else {
+                fGmtHourFormatsCount = GMT_HOUR_COUNT;
+                fGmtHourFormats[GMT_NEGATIVE_HM].setTo(TRUE, sep + 1, -1);
+                fGmtHourFormats[GMT_POSITIVE_HM].setTo(FALSE, resStr, sep - resStr);
+
+                // CLDR 1.5 does not have GMT offset pattern including second field.
+                // For now, append "ss" to the end.
+                if (fGmtHourFormats[GMT_NEGATIVE_HM].indexOf((UChar)0x003A /* ':' */) != -1) {
+                    fGmtHourFormats[GMT_NEGATIVE_HMS] = fGmtHourFormats[GMT_NEGATIVE_HM] + ":ss";
+                } else {
+                    fGmtHourFormats[GMT_NEGATIVE_HMS] = fGmtHourFormats[GMT_NEGATIVE_HM] + "ss";
+                }
+                if (fGmtHourFormats[GMT_POSITIVE_HM].indexOf((UChar)0x003A /* ':' */) != -1) {
+                    fGmtHourFormats[GMT_POSITIVE_HMS] = fGmtHourFormats[GMT_POSITIVE_HM] + ":ss";
+                } else {
+                    fGmtHourFormats[GMT_POSITIVE_HMS] = fGmtHourFormats[GMT_POSITIVE_HM] + "ss";
+                }
+            }
+        }
+    }
+
     // ICU 3.8 or later version no longer uses localized date-time pattern characters by default (ticket#5597)
     /*
     // fastCopyFrom()/setTo() - see assignArray comments
@@ -1411,977 +1503,16 @@
 cleanup:
     ures_close(eras);
     ures_close(eraNames);
+    ures_close(zoneStringsArray);
+    ures_close(localeBundle);
 }
 
-/**
- * Package private: used by SimpleDateFormat
- * Gets the index for the given time zone ID to obtain the timezone
- * strings for formatting. The time zone ID is just for programmatic
- * lookup. NOT LOCALIZED!!!
- * @param ID the given time zone ID.
- * @return the index of the given time zone ID.  Returns -1 if
- * the given time zone ID can't be located in the DateFormatSymbols object.
- * @see java.util.SimpleTimeZone
- */
-int32_t DateFormatSymbols::getZoneIndex(const UnicodeString& ID) const
-{
-    int32_t result = _getZoneIndex(ID);
-    if (result >= 0) {
-        return result;
-    }
-
-    // Do a search through the equivalency group for the given ID
-    int32_t n = TimeZone::countEquivalentIDs(ID);
-    if (n > 1) {
-        int32_t i;
-        for (i=0; i<n; ++i) {
-            UnicodeString equivID = TimeZone::getEquivalentID(ID, i);
-            if (equivID != ID) {
-                int32_t equivResult = _getZoneIndex(equivID);
-                if (equivResult >= 0) {
-                    return equivResult;
-                }
-            }
-        }
-    }
-
-    return -1;
-}
-
-/**
- * Lookup the given ID.  Do NOT do an equivalency search.
- */
-int32_t DateFormatSymbols::_getZoneIndex(const UnicodeString& ID) const
-{
-    for(int32_t index = 0; index < fZoneStringsRowCount; index++) {
-        if (0 == ID.caseCompare(fZoneStrings[index][0], 0)) {
-            return index;
-        }
-    }
-
-    return -1;
-}
-
 Locale 
 DateFormatSymbols::getLocale(ULocDataLocaleType type, UErrorCode& status) const {
     U_LOCALE_BASED(locBased, *this);
     return locBased.getLocale(type, status);
 }
 
-class TimeZoneKeysEnumeration : public StringEnumeration {
-private:
-    UnicodeString* strings;
-    int32_t length;
-    int32_t current;
-    int32_t capacity;
-    TimeZoneKeysEnumeration(UnicodeString* oldStrs, int32_t count){
-        strings = newUnicodeStringArray(count);
-        if(strings==NULL){
-            return;
-        }
-        capacity = count;
-        current = 0;
-        for(length = 0; length<capacity; length++){
-            strings[length].setTo(oldStrs[length]);
-        }
-    }    
-public:
-    static UClassID U_EXPORT2 getStaticClassID(void);
-    virtual UClassID getDynamicClassID(void) const;
-
-    TimeZoneKeysEnumeration(int32_t count, UErrorCode status){
-        strings = newUnicodeStringArray(count);
-        if(strings == NULL){
-            status = U_MEMORY_ALLOCATION_ERROR;
-        }
-        length = 0; 
-        current = 0;
-        capacity = count;
-    }
-
-    void put(const UnicodeString& str, UErrorCode& status){
-        if(length < capacity){
-            strings[length++].setTo(str);
-        }else{
-            status = U_INDEX_OUTOFBOUNDS_ERROR;
-        }
-    }
-    virtual ~TimeZoneKeysEnumeration() {
-        delete[] strings;
-    }
-
-    virtual StringEnumeration * clone() const
-    {
-        return new TimeZoneKeysEnumeration(strings, length);
-    }
-
-    virtual int32_t count(UErrorCode &/*status*/) const {
-        return length;
-    }
-    virtual const UChar* unext(int32_t *resultLength, UErrorCode& /*status*/){
-        if(current < length){
-            const UChar* ret = strings[current].getBuffer();
-            *resultLength = strings[current].length();
-            current++;
-            return ret;
-        }
-        return NULL;
-    }
-
-    virtual const UnicodeString* snext(UErrorCode& status) {
-        if(U_FAILURE(status)){
-            return NULL;
-        }
-        if(current < length){
-            return &strings[current++];
-        }
-        return NULL;
-    }
-    /* this method is for thread safe iteration */
-    const UnicodeString* snext(int32_t& pos, UErrorCode& status)const {
-        if(U_FAILURE(status)){
-            return NULL;
-        }
-        if(pos < length){
-            return &strings[pos++];
-        }
-        return NULL;
-    }
-
-    virtual void reset(UErrorCode& /*status*/) {
-        current = 0;
-
-    }
-private:
-    UBool equals(const StringEnumeration& other) const{
-        if (other.getDynamicClassID() != TimeZoneKeysEnumeration::getStaticClassID()) {
-            return FALSE;
-        }
-        TimeZoneKeysEnumeration& enum2 =  (TimeZoneKeysEnumeration&)(other);
-        UErrorCode status = U_ZERO_ERROR;
-
-        int32_t count1 = count(status);
-        int32_t count2 = other.count(status);
-        if(count1 != count2){
-            return FALSE;
-        }
-        int32_t pos1 = 0; 
-        int32_t pos2 = 0;
-        const UnicodeString* str1 = NULL;
-        const UnicodeString* str2 = NULL;
-
-        while((str1 = snext(pos1, status))!=NULL){ 
-            str2 = enum2.snext(pos2, status);
-            if(U_FAILURE(status)){
-                return FALSE;
-            }
-            if(*str1 != *str2){
-                // bail out at the first failure
-                return FALSE;
-            }
-            
-        }
-        // if we reached here that means that the enumerations are equal
-        return TRUE;
-    }
-public:
-    virtual UBool operator==(const StringEnumeration& that)const{
-        return ((this == &that) ||
-            (getDynamicClassID() == that.getDynamicClassID() &&
-            StringEnumeration::operator==(that) &&
-            equals(that)));
-    }
-};
-
-UOBJECT_DEFINE_RTTI_IMPLEMENTATION(TimeZoneKeysEnumeration)
-
-void
-DateFormatSymbols::initZoneStringsArray(UErrorCode& status){
-    if(fZoneStringsHash == NULL){
-        initZoneStrings(status);
-    }
-    if(U_FAILURE(status)){
-        return;
-    }
-    fZoneStringsRowCount = fZoneIDEnumeration->count(status);
-    fZoneStringsColCount = 8;
-    fZoneStrings = (UnicodeString **)uprv_malloc(fZoneStringsRowCount * sizeof(UnicodeString *));
-    /* if we can't get a chunk of heap then the system is going down. Pin the blame on system*/
-    if (fZoneStrings == NULL) {
-        status = U_MEMORY_ALLOCATION_ERROR;
-        return;
-    }
-    const UnicodeString *zid = NULL;
-    TimeZoneKeysEnumeration *keys = (TimeZoneKeysEnumeration*) fZoneIDEnumeration;
-    int32_t pos = 0;
-    int32_t i = 0;
-    while((zid=keys->snext(pos,status))!=NULL){
-        *(fZoneStrings+i) = newUnicodeStringArray(fZoneStringsColCount);
-        /* test for NULL */
-        if ((*(fZoneStrings+i)) == 0) {
-            status = U_MEMORY_ALLOCATION_ERROR;
-            return;
-        }
-        UnicodeString* strings = (UnicodeString*)fZoneStringsHash->get(*zid);
-        fZoneStrings[i][0].setTo(*zid);
-        fZoneStrings[i][1].setTo(strings[TIMEZONE_LONG_STANDARD]);
-        fZoneStrings[i][2].setTo(strings[TIMEZONE_SHORT_STANDARD]);
-        fZoneStrings[i][3].setTo(strings[TIMEZONE_LONG_DAYLIGHT]);
-        fZoneStrings[i][4].setTo(strings[TIMEZONE_SHORT_DAYLIGHT]);
-        fZoneStrings[i][5].setTo(strings[TIMEZONE_EXEMPLAR_CITY]);
-        fZoneStrings[i][6].setTo(strings[TIMEZONE_LONG_GENERIC]);
-        fZoneStrings[i][7].setTo(strings[TIMEZONE_SHORT_GENERIC]);
-        i++;
-    }
-}
-
-U_CDECL_BEGIN
-static UBool U_CALLCONV 
-compareTZHashValues(const UHashTok val1, const UHashTok val2){
-
-    const UnicodeString* array1 = (UnicodeString*) val1.pointer;
-    const UnicodeString* array2 = (UnicodeString*) val2.pointer;
-    if(array1==array2){
-        return TRUE;
-    }
-    if(array1==NULL || array2==NULL){
-        return FALSE;
-    }
-    for(int32_t j=0; j< UTZ_MAX_DISPLAY_STRINGS_LENGTH; j++){
-        if(array1[j] != array2[j]){
-            return FALSE;
-        }
-    }
-    return TRUE;
-}
-U_CDECL_END
-
-void
-DateFormatSymbols::initZoneStrings(UErrorCode &status){
-    if(U_FAILURE(status)){
-        return;
-    }  
-
-    if(fZoneStringsHash != NULL){
-        return;
-    }
-    int32_t i;
-
-    fZoneStringsHash = new Hashtable(uhash_compareUnicodeString, compareTZHashValues, status);
-    if(fZoneStringsHash==NULL){
-        status = U_MEMORY_ALLOCATION_ERROR;
-        return;
-    }
-    fZoneStringsHash->setValueDeleter(deleteUnicodeStringArray);
-
-    if(fResourceBundle != NULL){
-        UnicodeString solidus = UNICODE_STRING_SIMPLE("/");
-        UnicodeString colon = UNICODE_STRING_SIMPLE(":");
-        UResourceBundle *zoneArray, *zoneItem;
-        for(const UResourceBundle* rb = fResourceBundle; rb!=NULL; rb=ures_getParentBundle(rb)){
-            zoneArray = ures_getByKey(rb, gZoneStringsTag, NULL, &status);
-            if(U_FAILURE(status)){
-                break;
-            }
-            while(ures_hasNext(zoneArray)){
-                UErrorCode tempStatus = U_ZERO_ERROR;
-                zoneItem = ures_getNextResource(zoneArray, NULL, &status);
-                UnicodeString key(ures_getKey(zoneItem), -1, US_INV);
-                if (key.indexOf(colon) == -1) {
-                    ures_close(zoneItem);
-                    continue;
-                }
-                UnicodeString* strArray = newUnicodeStringArray(UTZ_MAX_DISPLAY_STRINGS_LENGTH);
-                key.findAndReplace(colon, solidus);
-                int32_t len = 0;
-                //fetch the strings with fine grained fallback
-                const UChar* str = ures_getStringByKeyWithFallback(zoneItem,UTZ_SHORT_STANDARD, &len, &tempStatus);
-                if(U_SUCCESS(tempStatus)){
-                    strArray[TIMEZONE_SHORT_STANDARD].setTo(TRUE, str, len);
-                }else{
-                    tempStatus = U_ZERO_ERROR;
-                }
-                str = ures_getStringByKeyWithFallback(zoneItem,UTZ_SHORT_GENERIC, &len, &tempStatus);
-                if(U_SUCCESS(tempStatus)){
-                    strArray[TIMEZONE_SHORT_GENERIC].setTo(TRUE, str, len);
-                }else{
-                    tempStatus = U_ZERO_ERROR;
-                }                
-                str = ures_getStringByKeyWithFallback(zoneItem,UTZ_SHORT_DAYLIGHT, &len, &tempStatus);
-                if(U_SUCCESS(tempStatus)){
-                    strArray[TIMEZONE_SHORT_DAYLIGHT].setTo(TRUE, str, len);
-                }else{
-                    tempStatus = U_ZERO_ERROR;
-                }
-                str = ures_getStringByKeyWithFallback(zoneItem,UTZ_LONG_STANDARD, &len, &tempStatus);
-                if(U_SUCCESS(tempStatus)){
-                    strArray[TIMEZONE_LONG_STANDARD].setTo(TRUE, str, len);
-                }else{
-                    tempStatus = U_ZERO_ERROR;
-                }
-                str = ures_getStringByKeyWithFallback(zoneItem,UTZ_LONG_GENERIC, &len, &tempStatus);
-                if(U_SUCCESS(tempStatus)){
-                    strArray[TIMEZONE_LONG_GENERIC].setTo(TRUE, str, len);
-                }else{
-                    tempStatus = U_ZERO_ERROR;
-                }                
-                str = ures_getStringByKeyWithFallback(zoneItem,UTZ_LONG_DAYLIGHT, &len, &tempStatus);
-                if(U_SUCCESS(tempStatus)){
-                    strArray[TIMEZONE_LONG_DAYLIGHT].setTo(TRUE, str, len);
-                }else{
-                    tempStatus = U_ZERO_ERROR;
-                }
-                str = ures_getStringByKeyWithFallback(zoneItem,UTZ_EXEMPLAR_CITY, &len, &tempStatus);
-                if(U_SUCCESS(tempStatus)){
-                    strArray[TIMEZONE_EXEMPLAR_CITY].setTo(TRUE, str, len);
-                }else{
-                    tempStatus = U_ZERO_ERROR;
-                }
-                // store the strings in hash
-                fZoneStringsHash->put(key, strArray, status);
-                ures_close(zoneItem);
-            }
-
-            ures_close(zoneArray);
-        }
-
-        // Need to make sure that all zoneStrings in root are covered as well, otherwise metazone lookups won't
-        // work properly
-        UResourceBundle* root_res = ures_open(NULL, "", &status);
-        zoneArray = ures_getByKey(root_res, gZoneStringsTag, NULL, &status);
-        if (U_SUCCESS(status)) {
-            while(ures_hasNext(zoneArray)){
-                UErrorCode tempStatus = U_ZERO_ERROR;
-                zoneItem = ures_getNextResource(zoneArray, NULL, &status);
-                UnicodeString key(ures_getKey(zoneItem), -1, US_INV);
-                if ( key.indexOf(colon) == -1 ) {
-                    ures_close(zoneItem);
-                    continue;
-                }
-                key.findAndReplace(colon, solidus);
-
-                // Don't step on anything that is already there
-                UnicodeString* existingArray = (UnicodeString*)fZoneStringsHash->get(key);
-                if(existingArray != NULL){
-                    ures_close(zoneItem);
-                    continue;
-                }
-                UnicodeString* strArray = newUnicodeStringArray(UTZ_MAX_DISPLAY_STRINGS_LENGTH);
-                int32_t len = 0;
-
-                const UChar *str = ures_getStringByKeyWithFallback(zoneItem,UTZ_EXEMPLAR_CITY, &len, &tempStatus);
-                if(U_SUCCESS(tempStatus)){
-                    strArray[TIMEZONE_EXEMPLAR_CITY].setTo(TRUE, str, len);
-                }else{
-                    tempStatus = U_ZERO_ERROR;
-                }
-                // store the strings in hash
-                fZoneStringsHash->put(key, strArray, status);
-                ures_close(zoneItem);
-            }
-            ures_close(zoneArray);
-            ures_close(root_res);
-        }
-
-        int32_t length = fZoneStringsHash->count();
-        TimeZoneKeysEnumeration* keysEnum = new TimeZoneKeysEnumeration(length, status);
-        fZoneIDEnumeration = keysEnum;
-        if(fZoneIDEnumeration==NULL){
-            delete fZoneStringsHash;
-            fZoneStringsHash = NULL;
-            status = U_MEMORY_ALLOCATION_ERROR;
-            return;
-        }
-        int32_t pos=-1;
-        const UnicodeString* key; 
-        const UHashElement* elem = NULL;
-        while((elem = fZoneStringsHash->nextElement(pos))!= NULL){  
-            const UHashTok keyTok = elem->key;
-            key = (const UnicodeString*)keyTok.pointer;
-            keysEnum->put(*key, status);
-        }
-    }else{
-        //last resort strings
-        UnicodeString* array = newUnicodeStringArray(UTZ_MAX_DISPLAY_STRINGS_LENGTH);
-        if(array==NULL){
-            delete fZoneStringsHash;
-            status = U_MEMORY_ALLOCATION_ERROR;
-            return;
-        }
-        int32_t length = ARRAY_LENGTH(gLastResortZoneStrings);
-        UnicodeString key(gLastResortZoneStrings[0]);
-        TimeZoneKeysEnumeration* keysEnum = new TimeZoneKeysEnumeration(length, status);
-        fZoneIDEnumeration = keysEnum;
-        if(fZoneIDEnumeration==NULL){
-            delete fZoneStringsHash;
-            delete[] array;
-            fZoneStringsHash = NULL;
-            status = U_MEMORY_ALLOCATION_ERROR;
-            return;
-        }
-        keysEnum->put(key, status);
-        int32_t j=1;
-        for(i=0; i< length; ){
-            array[i++].setTo(gLastResortZoneStrings[j++]);
-        }
-        fZoneStringsHash->put(key, array, status);
-    }
-}
-void 
-DateFormatSymbols::initZoneStrings(const UnicodeString** strings, int32_t rowCount, int32_t columnCount, UErrorCode& status){
-    if(strings==NULL || rowCount<0 || columnCount<0){
-        status = U_ILLEGAL_ARGUMENT_ERROR;
-        return;
-    }
-    TimeZoneKeysEnumeration* keysEnum = new TimeZoneKeysEnumeration(rowCount, status);
-    fZoneIDEnumeration = keysEnum;
-    if(U_FAILURE(status)){
-        return;
-    }
-    if(fZoneIDEnumeration==NULL){
-        status = U_MEMORY_ALLOCATION_ERROR;
-        return;
-    }
-    fZoneStringsHash = new Hashtable(uhash_compareUnicodeString, compareTZHashValues, status);
-    if(U_FAILURE(status)){
-        return;
-    }
-    if(fZoneStringsHash==NULL){
-        status = U_MEMORY_ALLOCATION_ERROR;
-        return;
-    }
-    fZoneStringsHash->setValueDeleter(deleteUnicodeStringArray);
-    for (int32_t row=0; row<rowCount; ++row){
-        // the first string in the array is the key.
-        UnicodeString key = strings[row][0];
-        keysEnum->put(key, status);
-        UnicodeString* array = newUnicodeStringArray(UTZ_MAX_DISPLAY_STRINGS_LENGTH);
-        if(array==NULL){
-            status = U_MEMORY_ALLOCATION_ERROR;
-            return;
-        }
-        for (int32_t col=1; col<columnCount; ++col) {
-            // fastCopyFrom() - see assignArray comments
-            switch (col){
-                case 1:
-                    array[TIMEZONE_LONG_STANDARD].setTo(strings[row][col]);
-                    break;
-                case 2:
-                    array[TIMEZONE_SHORT_STANDARD].setTo(strings[row][col]);
-                    break;
-                case 3:
-                    array[TIMEZONE_LONG_DAYLIGHT].setTo(strings[row][col]);
-                    break;
-                case 4:
-                     array[TIMEZONE_LONG_DAYLIGHT].setTo(strings[row][col]);
-                     break;
-                case 5:
-                     array[TIMEZONE_EXEMPLAR_CITY].setTo(strings[row][col]);
-                     break;
-                case 6:
-                     array[TIMEZONE_LONG_GENERIC].setTo(strings[row][col]);
-                     break; 
-                case 7:
-                     array[TIMEZONE_SHORT_GENERIC].setTo(strings[row][col]);
-                     break;
-                default:
-                    status = U_ILLEGAL_ARGUMENT_ERROR;
-            }
-            // populate the hash table
-            fZoneStringsHash->put(strings[row][0], array, status);
-        }
-    }
-
-}
-
-UnicodeString&
-DateFormatSymbols::getZoneString(const UnicodeString &zid, const TimeZoneTranslationType type, 
-                                 UnicodeString &result, UErrorCode &status){
-
-    if(fZoneStringsHash == NULL){
-        //lazy initialization
-        initZoneStrings(status);
-    }
-    if(U_FAILURE(status)){
-        return result;
-    }
-
-    UnicodeString* stringsArray = (UnicodeString*)fZoneStringsHash->get(zid);
-    if(stringsArray != NULL){
-        result.setTo(stringsArray[type],0);
-    }
-    return result;
-}
-
-UnicodeString
-DateFormatSymbols::getMetazoneString(const UnicodeString &zid, const TimeZoneTranslationType type, Calendar &cal,
-                                 UnicodeString &result, UErrorCode &status)
-{
-    UErrorCode tempStatus = U_ZERO_ERROR;
-    int32_t len;
-    UnicodeString mzid(UNICODE_STRING_SIMPLE("meta/"));
-
-    // Get the appropriate metazone mapping from the resource bundles
-
-    char usesMetazoneKey[ZID_KEY_MAX];
-    char zidkey[ZID_KEY_MAX];
-
-    uprv_strcpy(usesMetazoneKey,gZoneStringsTag);
-    uprv_strcat(usesMetazoneKey,"/");
-
-    len = zid.length();
-    len = (len >= (ZID_KEY_MAX-1) ? ZID_KEY_MAX-1 : len);
-    u_UCharsToChars(zid.getBuffer(), zidkey, len);
-    zidkey[len] = 0; // NULL terminate
-
-    // Replace / with : for zid
-    len = (int32_t)uprv_strlen(zidkey);
-    for (int i = 0; i < len; i++) {
-        if (zidkey[i] == '/') {
-            zidkey[i] = ':';
-        }
-    }
-
-    uprv_strcat(usesMetazoneKey,zidkey);
-    uprv_strcat(usesMetazoneKey,"/");
-    uprv_strcat(usesMetazoneKey,UTZ_USES_METAZONE);
-
-    UResourceBundle *um = ures_getByKeyWithFallback(fResourceBundle, usesMetazoneKey, NULL, &tempStatus);
-    if (U_FAILURE(tempStatus)) {
-        return result;
-    }
-
-    UnicodeString* stringsArray = (UnicodeString*)fZoneStringsHash->get(zid);
-
-    if(stringsArray != NULL){
-        SimpleDateFormat df(UNICODE_STRING_SIMPLE("yyyy-MM-dd HH:mm"), Locale(""),tempStatus);
-        TimeZone *tz = TimeZone::createTimeZone(zid);
-        df.setTimeZone(*tz);
-        delete tz;
-        UnicodeString theTime;
-        df.format(cal.getTime(tempStatus),theTime);
-
-        while (ures_hasNext(um)) {
-            UResourceBundle *mz = ures_getNextResource(um,NULL,&status);
-            const UChar *mz_name = ures_getStringByIndex(mz,0,&len,&status);
-            const UChar *mz_from = ures_getStringByIndex(mz,1,&len,&status);
-            const UChar *mz_to   = ures_getStringByIndex(mz,2,&len,&status);
-            ures_close(mz);
-            if(U_FAILURE(status)){
-                break;
-            }
-
-            if (mz_name[0] != 0 &&
-                UnicodeString(TRUE, mz_from, -1) <= theTime &&
-                UnicodeString(TRUE, mz_to, -1) > theTime )
-            {
-                mzid += mz_name;
-                getZoneString(mzid,type,result,status);
-                break;
-            }
-        }
-    } 
-    ures_close(um);
-    if ( mzid.length() > 5 ) {
-        return mzid;
-    }
-    return result;
-}
-
-UnicodeString&
-DateFormatSymbols::getFallbackString(const UnicodeString &zid, UnicodeString &result, UErrorCode &status)
-{
-    UnicodeString exemplarCity;
-    char zidkey[ZID_KEY_MAX];
-    char zoneTerritoryChars[ULOC_COUNTRY_CAPACITY];
-    UnicodeString displayCountry;
-    UnicodeString solidus = UNICODE_STRING_SIMPLE("/");
-    UnicodeString und = UNICODE_STRING_SIMPLE("_");
-    UnicodeString spc = UNICODE_STRING_SIMPLE(" ");
-    const UChar* aZone = NULL;
-    UBool IsMultiZone = FALSE;
-
-   
-    int32_t len = zid.length();
-    len = (len >= (ZID_KEY_MAX-1) ? ZID_KEY_MAX-1 : len);
-    u_UCharsToChars(zid.getBuffer(), zidkey, len);
-    zidkey[len] = 0; // NULL terminate
-
-    // Replace / with : for zid
-    len = (int32_t)uprv_strlen(zidkey);
-    for (int i = 0; i < len; i++) {
-        if (zidkey[i] == '/') {
-            zidkey[i] = ':';
-        }
-    }
-
-    result.remove();
-
-    UResourceBundle* supplementalDataBundle = ures_openDirect(NULL, kSUPPLEMENTAL, &status);
-    if (U_FAILURE(status) || fResourceBundle == NULL ) {
-        return result;
-    }
-       
-    UResourceBundle* zoneFormatting = ures_getByKey(supplementalDataBundle, gZoneFormattingTag, NULL, &status);
-    UResourceBundle* thisZone = ures_getByKey(zoneFormatting, zidkey, NULL, &status);
-    if (U_FAILURE(status)) {
-        ures_close(zoneFormatting);
-        ures_close(supplementalDataBundle);
-        return result; 
-    }
-
-    UResourceBundle* multiZone = ures_getByKey(zoneFormatting, gMultizoneTag, NULL, &status);
-    const UChar *zoneTerritory = ures_getStringByKey(thisZone,gTerritoryTag,&len,&status);
-    u_UCharsToChars(zoneTerritory, zoneTerritoryChars, u_strlen(zoneTerritory));
-    zoneTerritoryChars[u_strlen(zoneTerritory)] = 0; // NULL terminate
-
-    UResourceBundle* countries = ures_getByKey(fResourceBundle, gCountriesTag, NULL, &status);
-    if ( u_strlen(zoneTerritory) > 0 && countries != NULL ) {
-        displayCountry = ures_getStringByKeyWithFallback(countries,zoneTerritoryChars,&len,&status);
-    }
-
-    if ( U_FAILURE(status) ) {
-        status = U_ZERO_ERROR;
-        displayCountry = UnicodeString(zoneTerritory);
-    }
-
-    while ( ures_hasNext(multiZone) ) {
-        aZone = ures_getNextString(multiZone,&len,NULL,&status);
-        if ( u_strcmp(aZone,zoneTerritory) == 0 ) {
-            IsMultiZone = TRUE;
-            continue;
-        }
-    }
-    
-    if ( IsMultiZone ) {
-        getZoneString(zid, TIMEZONE_EXEMPLAR_CITY, exemplarCity, status);
-        if ( exemplarCity.length()==0 ) {
-	    exemplarCity.setTo(UnicodeString(zid,zid.lastIndexOf(solidus)+1));
-            exemplarCity.findAndReplace(und,spc);
-        }
-        Formattable cityCountryArray[2];
-        UnicodeString pattern = UnicodeString(ures_getStringByKeyWithFallback(fResourceBundle,gFallbackFormatTag,&len,&status));
-        if ( U_FAILURE(status) ) {
-            pattern = UNICODE_STRING_SIMPLE("{1} ({0})");
-            status = U_ZERO_ERROR;
-        }
-        cityCountryArray[0].adoptString(new UnicodeString(exemplarCity));
-        cityCountryArray[1].adoptString(new UnicodeString(displayCountry));
-        MessageFormat::format(pattern,cityCountryArray, 2, result, status);
-    } else {
-        Formattable countryArray[1];
-        UnicodeString pattern = UnicodeString(ures_getStringByKeyWithFallback(fResourceBundle,gRegionFormatTag,&len,&status));
-        if ( U_FAILURE(status) ) {
-            pattern = UNICODE_STRING_SIMPLE("{0}");
-            status = U_ZERO_ERROR;
-        }
-        countryArray[0].adoptString(new UnicodeString(displayCountry));
-        MessageFormat::format(pattern,countryArray, 1, result, status);
-    }
-    
-    ures_close(thisZone);
-    ures_close(zoneFormatting);
-    ures_close(supplementalDataBundle);
-    ures_close(countries);
-    ures_close(multiZone);
-
-    return result;
-}
-
-UBool
-DateFormatSymbols::isCommonlyUsed(const UnicodeString &zid){
-    UErrorCode status=U_ZERO_ERROR;
-    UResourceBundle *zoneArray, *zoneItem, *cuRes;
-    UnicodeString solidus = UNICODE_STRING_SIMPLE("/");
-    UnicodeString colon = UNICODE_STRING_SIMPLE(":");
-    UnicodeString key(zid);
-    char keychars[ZID_KEY_MAX+1];
-
-    key.findAndReplace(solidus,colon);
-
-    for(const UResourceBundle* rb = fResourceBundle; rb!=NULL; rb=ures_getParentBundle(rb)){
-        zoneArray = ures_getByKey(rb, gZoneStringsTag, NULL, &status);
-        if(U_FAILURE(status)){
-            status = U_ZERO_ERROR;
-            continue;
-        }
-        int32_t len = key.length();
-        u_UCharsToChars(key.getBuffer(), keychars, len);
-        keychars[len] = 0; // NULL terminate
-        zoneItem = ures_getByKey(zoneArray,keychars,NULL, &status);
-        if(U_FAILURE(status)){
-            ures_close(zoneArray);
-            status = U_ZERO_ERROR;
-            continue;
-        }
-
-        cuRes = ures_getByKey(zoneItem,UTZ_COMMONLY_USED,NULL,&status);
-        if(U_FAILURE(status)){
-            ures_close(zoneItem);
-            ures_close(zoneArray);
-            status = U_ZERO_ERROR;
-            continue;
-        }
-        int32_t cuValue = ures_getInt(cuRes,&status);
-
-        ures_close(cuRes);
-        ures_close(zoneItem);
-        ures_close(zoneArray);
-
-        if(U_FAILURE(status)){
-            status = U_ZERO_ERROR;
-            continue;
-        }
-
-        if ( cuValue == 1 ) {
-            return TRUE;
-        }
-    }
-    return FALSE;
-}
-
-StringEnumeration* 
-DateFormatSymbols::createZoneStringIDs(UErrorCode &status){
-    if(U_FAILURE(status)){
-        return NULL;
-    }
-    if(fZoneStringsHash == NULL){
-        //lazy initialization
-        initZoneStrings(status);
-    }
-    return fZoneIDEnumeration->clone();
-}
-
-/**
- * Sets timezone strings.
- * @draft ICU 3.6
- */
-void 
-DateFormatSymbols::setZoneString(const UnicodeString &zid, const TimeZoneTranslationType type,
-                                 const UnicodeString &value, UErrorCode &status){
-    if(fZoneStringsHash == NULL){
-        //lazy initialization
-        initZoneStrings(status);
-    }
-    if(U_FAILURE(status)){
-        return;
-    }
-    UnicodeString* stringsArray = (UnicodeString*)fZoneStringsHash->get(zid);
-    if(stringsArray != NULL){
-        stringsArray[type].setTo(value);
-    }else{
-        stringsArray = newUnicodeStringArray(UTZ_MAX_DISPLAY_STRINGS_LENGTH); 
-        if(stringsArray==NULL){
-            status = U_MEMORY_ALLOCATION_ERROR;
-            return;
-        }
-        stringsArray[type].setTo(value);
-        fZoneStringsHash->put(zid, stringsArray, status);
-        TimeZoneKeysEnumeration* keys = (TimeZoneKeysEnumeration*) fZoneIDEnumeration;
-        keys->put(zid, status);
-    }
-}
-
-Hashtable* 
-DateFormatSymbols::createZoneStringsHash(const Hashtable* otherHash){
-    UErrorCode status = U_ZERO_ERROR;
-    Hashtable* hash = new Hashtable(uhash_compareUnicodeString, compareTZHashValues, status);
-    if(hash==NULL){
-        return NULL;
-    }
-    if(U_FAILURE(status)){
-        return NULL;
-    }
-    hash->setValueDeleter(deleteUnicodeStringArray);
-    int32_t pos = -1;
-    const UHashElement* elem = NULL;
-    // walk through the hash table and create a deep clone 
-    while((elem = otherHash->nextElement(pos))!= NULL){
-        const UHashTok otherKeyTok = elem->key;
-        const UHashTok otherValueTok = elem->value;
-        UnicodeString* otherKey = (UnicodeString*)otherKeyTok.pointer;
-        UnicodeString* otherArray = (UnicodeString*)otherValueTok.pointer;
-        UnicodeString* array = newUnicodeStringArray(UTZ_MAX_DISPLAY_STRINGS_LENGTH);
-        if(array==NULL){
-            return NULL;
-        }
-        UnicodeString key(*otherKey);
-        for(int32_t i=0; i<UTZ_MAX_DISPLAY_STRINGS_LENGTH; i++){
-            array[i].setTo(otherArray[i]);
-        }
-        hash->put(key, array, status);
-        if(U_FAILURE(status)){
-            delete[] array;
-            return NULL;
-        }
-    } 
-    return hash;
-}
-
-
-UnicodeString&
-DateFormatSymbols::getZoneID(const UnicodeString& zid, UnicodeString& result, UErrorCode& status){
-    if(fZoneStringsHash == NULL){
-        initZoneStrings(status); 
-    }
-    if(U_FAILURE(status)){
-        return result;
-    }
-    UnicodeString* strings = (UnicodeString*)fZoneStringsHash->get(zid);
-    if (strings != NULL) {
-        return result.setTo(zid,0);
-    }
-
-    // Do a search through the equivalency group for the given ID
-    int32_t n = TimeZone::countEquivalentIDs(zid);
-    if (n > 1) {
-        int32_t i;
-        for (i=0; i<n; ++i) {
-            UnicodeString equivID = TimeZone::getEquivalentID(zid, i);
-            if (equivID != zid) {
-                strings = (UnicodeString*)fZoneStringsHash->get(equivID);
-                if (strings != NULL) {
-                    return result.setTo(equivID,0);
-                }
-            }
-        }
-    }else{
-        result.setTo(zid);
-    }
-    return result;
-}
-
-void
-DateFormatSymbols::getZoneType(const UnicodeString& zid, const UnicodeString& text, int32_t start, 
-                               TimeZoneTranslationType& type, UnicodeString& value, UErrorCode& status){
-    if(fZoneStringsHash == NULL){
-        initZoneStrings(status);
-    }
-    if(U_FAILURE(status)){
-        return;
-    }
-    type = TIMEZONE_COUNT;
-    UnicodeString* strings = (UnicodeString*)fZoneStringsHash->get(zid);
-    if(strings != NULL){
-        for(int32_t j=0; j<UTZ_MAX_DISPLAY_STRINGS_LENGTH; j++){
-            if(strings[j].length() >0 && text.caseCompare(start, strings[j].length(), strings[j], 0)==0){
-                type = (TimeZoneTranslationType)j;
-                value.setTo(strings[j]);
-                return;
-            }
-        }
-    }
-}
-void
-DateFormatSymbols::findZoneIDTypeValue( UnicodeString& zid, const UnicodeString& text, int32_t start, 
-                                        TimeZoneTranslationType& type, UnicodeString& value,
-                                        UErrorCode& status){
-    if(fZoneStringsHash == NULL){
-        initZoneStrings(status);
-    }
-    if(U_FAILURE(status)){
-        return;
-    }
-    const UnicodeString* myKey = NULL;
-    int32_t pos = 0;
-    TimeZoneKeysEnumeration *keys = (TimeZoneKeysEnumeration*)fZoneIDEnumeration;
-    while( (myKey=keys->snext(pos, status))!= NULL){
-        UnicodeString* strings = (UnicodeString*)fZoneStringsHash->get(*myKey);
-        if(strings != NULL){
-            for(int32_t j=0; j<UTZ_MAX_DISPLAY_STRINGS_LENGTH; j++){
-                if(strings[j].length()>0 && text.caseCompare(start, strings[j].length(), strings[j], 0)==0){
-                    type = (TimeZoneTranslationType)j;
-                    value.setTo(strings[j]);
-                    if (myKey->startsWith(UNICODE_STRING_SIMPLE("meta"))) {
-                       zid.setTo(resolveParsedMetazone(*myKey));
-                    }
-                    else {
-                       zid.setTo(*myKey);
-                    }
-                    return;
-                }
-            }
-        }
-    }
-
-    // Check for generic tz fallback strings if we have gone through all zone strings and haven't found
-    // anything.  
-
-    UnicodeString fbString;
-    StringEnumeration *tzKeys = TimeZone::createEnumeration();
-
-    while( (myKey=tzKeys->snext(status))!= NULL){
-        status = U_ZERO_ERROR;
-        this->getFallbackString(*myKey,fbString,status);
-        if ( U_FAILURE(status) ) {
-           status = U_ZERO_ERROR;
-           continue;
-        }
-        
-        if(fbString.length()>0 && text.compare(start, fbString.length(), fbString)==0){
-            type = (TimeZoneTranslationType) TIMEZONE_LONG_GENERIC;
-            value.setTo(fbString);
-            zid.setTo(*myKey);
-            break;
-        }
-    }
-    delete tzKeys;
-}
-
-UnicodeString
-DateFormatSymbols::resolveParsedMetazone( const UnicodeString& zid ) {
-
-    UErrorCode status = U_ZERO_ERROR;
-
-    UResourceBundle* supplementalDataBundle = ures_openDirect(NULL, kSUPPLEMENTAL, &status);
-    UResourceBundle* mapTz = ures_getByKey(supplementalDataBundle, gMaptimezonesTag, NULL, &status);
-    if(U_FAILURE(status)){
-        ures_close(supplementalDataBundle);
-        return UNICODE_STRING_SIMPLE("Etc/GMT");
-    }
-
-    UResourceBundle* metazoneMap = ures_getByKey(mapTz, gMetazonesTag, NULL, &status);
-    char mzMapKey[ZID_KEY_MAX+4];
-
-    int32_t len = zid.length();
-    len = (len >= (ZID_KEY_MAX-1) ? ZID_KEY_MAX-1 : len);
-    u_UCharsToChars(zid.getBuffer(), mzMapKey, len);
-    mzMapKey[len] = 0; // NULL terminate
-
-    for (int i = 0; i < len; i++) {
-        if (mzMapKey[i] == '/') {
-            mzMapKey[i] = ':';
-        }
-    }
-
-    uprv_strcat(mzMapKey,"_");
-    uprv_strcat(mzMapKey,fCountry);
-
-    int32_t len2;
-    const UChar* resStr = ures_getStringByKey(metazoneMap, mzMapKey, &len2, &status);
-
-    // If we can't find a territory-specific metazone mapping, then use the generic one
-    // which is the metazone name followed by _001
-
-    if(U_FAILURE(status)){
-        status = U_ZERO_ERROR;
-        mzMapKey[len] = 0;
-        uprv_strcat(mzMapKey,"_001");
-        resStr = ures_getStringByKey(metazoneMap, mzMapKey, &len2, &status);
-    }
-
-    ures_close(metazoneMap);
-    ures_close(mapTz);
-    ures_close(supplementalDataBundle);
-
-    if(U_SUCCESS(status)){
-        return resStr;
-    }
-    else {
-        return UNICODE_STRING_SIMPLE("Etc/GMT");
-    }
-
-}
 U_NAMESPACE_END
 
 #endif /* #if !UCONFIG_NO_FORMATTING */

Modified: trunk/source/i18n/i18n.vcproj
===================================================================
--- trunk/source/i18n/i18n.vcproj	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/i18n/i18n.vcproj	2008-03-24 11:52:37 UTC (rev 144)
@@ -529,6 +529,24 @@
 			<File
 				RelativePath=".\unicode\basictz.h"
 				>
+				<FileConfiguration
+					Name="Release|Win32"
+					>
+					<Tool
+						Name="VCCustomBuildTool"
+						CommandLine="copy &quot;$(InputPath)&quot; ..\..\include\unicode"
+						Outputs="..\..\include\unicode\$(InputFileName)"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Debug|Win32"
+					>
+					<Tool
+						Name="VCCustomBuildTool"
+						CommandLine="copy &quot;$(InputPath)&quot; ..\..\include\unicode"
+						Outputs="..\..\include\unicode\$(InputFileName)"
+					/>
+				</FileConfiguration>
 			</File>
 			<File
 				RelativePath=".\buddhcal.cpp"
@@ -799,6 +817,24 @@
 			<File
 				RelativePath=".\unicode\dtrule.h"
 				>
+				<FileConfiguration
+					Name="Release|Win32"
+					>
+					<Tool
+						Name="VCCustomBuildTool"
+						CommandLine="copy &quot;$(InputPath)&quot; ..\..\include\unicode"
+						Outputs="..\..\include\unicode\$(InputFileName)"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Debug|Win32"
+					>
+					<Tool
+						Name="VCCustomBuildTool"
+						CommandLine="copy &quot;$(InputPath)&quot; ..\..\include\unicode"
+						Outputs="..\..\include\unicode\$(InputFileName)"
+					/>
+				</FileConfiguration>
 			</File>
 			<File
 				RelativePath=".\unicode\fieldpos.h"
@@ -1147,6 +1183,24 @@
 			<File
 				RelativePath=".\unicode\rbtz.h"
 				>
+				<FileConfiguration
+					Name="Release|Win32"
+					>
+					<Tool
+						Name="VCCustomBuildTool"
+						CommandLine="copy &quot;$(InputPath)&quot; ..\..\include\unicode&#x0D;&#x0A;"
+						Outputs="..\..\include\unicode\$(InputFileName)"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Debug|Win32"
+					>
+					<Tool
+						Name="VCCustomBuildTool"
+						CommandLine="copy &quot;$(InputPath)&quot; ..\..\include\unicode&#x0D;&#x0A;"
+						Outputs="..\..\include\unicode\$(InputFileName)"
+					/>
+				</FileConfiguration>
 			</File>
 			<File
 				RelativePath=".\reldtfmt.cpp"
@@ -1249,6 +1303,24 @@
 			<File
 				RelativePath=".\unicode\tzrule.h"
 				>
+				<FileConfiguration
+					Name="Release|Win32"
+					>
+					<Tool
+						Name="VCCustomBuildTool"
+						CommandLine="copy &quot;$(InputPath)&quot; ..\..\include\unicode"
+						Outputs="..\..\include\unicode\$(InputFileName)"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Debug|Win32"
+					>
+					<Tool
+						Name="VCCustomBuildTool"
+						CommandLine="copy &quot;$(InputPath)&quot; ..\..\include\unicode"
+						Outputs="..\..\include\unicode\$(InputFileName)"
+					/>
+				</FileConfiguration>
 			</File>
 			<File
 				RelativePath=".\tztrans.cpp"
@@ -1257,6 +1329,24 @@
 			<File
 				RelativePath=".\unicode\tztrans.h"
 				>
+				<FileConfiguration
+					Name="Release|Win32"
+					>
+					<Tool
+						Name="VCCustomBuildTool"
+						CommandLine="copy &quot;$(InputPath)&quot; ..\..\include\unicode"
+						Outputs="..\..\include\unicode\$(InputFileName)"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Debug|Win32"
+					>
+					<Tool
+						Name="VCCustomBuildTool"
+						CommandLine="copy &quot;$(InputPath)&quot; ..\..\include\unicode"
+						Outputs="..\..\include\unicode\$(InputFileName)"
+					/>
+				</FileConfiguration>
 			</File>
 			<File
 				RelativePath=".\ucal.cpp"
@@ -1456,6 +1546,15 @@
 				RelativePath=".\unicode\utmscale.h"
 				>
 				<FileConfiguration
+					Name="Release|Win32"
+					>
+					<Tool
+						Name="VCCustomBuildTool"
+						CommandLine="copy &quot;$(InputPath)&quot; ..\..\include\unicode"
+						Outputs="..\..\include\unicode\$(InputFileName)"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
 					Name="Debug|Win32"
 					>
 					<Tool
@@ -1472,6 +1571,24 @@
 			<File
 				RelativePath=".\unicode\vtzone.h"
 				>
+				<FileConfiguration
+					Name="Release|Win32"
+					>
+					<Tool
+						Name="VCCustomBuildTool"
+						CommandLine="copy &quot;$(InputPath)&quot; ..\..\include\unicode"
+						Outputs="..\..\include\unicode\$(InputFileName)"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Debug|Win32"
+					>
+					<Tool
+						Name="VCCustomBuildTool"
+						CommandLine="copy &quot;$(InputPath)&quot; ..\..\include\unicode"
+						Outputs="..\..\include\unicode\$(InputFileName)"
+					/>
+				</FileConfiguration>
 			</File>
 			<File
 				RelativePath=".\windtfmt.cpp"
@@ -1521,6 +1638,22 @@
 				RelativePath=".\winnmfmt.h"
 				>
 			</File>
+			<File
+				RelativePath=".\zonemeta.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\zonemeta.h"
+				>
+			</File>
+			<File
+				RelativePath=".\zstrfmt.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\zstrfmt.h"
+				>
+			</File>
 		</Filter>
 		<Filter
 			Name="misc"

Modified: trunk/source/i18n/nfsubs.cpp
===================================================================
--- trunk/source/i18n/nfsubs.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/i18n/nfsubs.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -97,7 +97,11 @@
     }
 
     virtual double transformNumber(double number) const {
-        return uprv_floor(number / divisor);
+        if (getRuleSet()) {
+            return uprv_floor(number / divisor);
+        } else {
+            return number/divisor;
+        }
     }
 
     virtual double composeRuleValue(double newRuleValue, double /*oldRuleValue*/) const {

Modified: trunk/source/i18n/olsontz.cpp
===================================================================
--- trunk/source/i18n/olsontz.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/i18n/olsontz.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -317,11 +317,11 @@
                                     millis, monthLength, ec);
     }
 
-    // Compute local epoch seconds from input fields
-    double time = Grego::fieldsToDay(year, month, dom) * SECONDS_PER_DAY +
-        uprv_floor(millis / (double) U_MILLIS_PER_SECOND);
-
-    return zoneOffset(findTransition(time, TRUE)) * U_MILLIS_PER_SECOND;
+    // Compute local epoch millis from input fields
+    UDate date = (UDate)(Grego::fieldsToDay(year, month, dom) * U_MILLIS_PER_DAY + millis);
+    int32_t rawoff, dstoff;
+    getHistoricalOffset(date, TRUE, kDaylight, kStandard, rawoff, dstoff);
+    return rawoff + dstoff;
 }
 
 /**
@@ -332,40 +332,30 @@
     if (U_FAILURE(ec)) {
         return;
     }
-
     // The check against finalMillis will suffice most of the time, except
     // for the case in which finalMillis == DBL_MAX, date == DBL_MAX,
     // and finalZone == 0.  For this case we add "&& finalZone != 0".
     if (date >= finalMillis && finalZone != 0) {
-        int32_t year, month, dom, dow;
-        double millis;
-        double days = Math::floorDivide(date, (double)U_MILLIS_PER_DAY, millis);
-        
-        Grego::dayToFields(days, year, month, dom, dow);
+        finalZone->getOffset(date, local, rawoff, dstoff, ec);
+    } else {
+        getHistoricalOffset(date, local, kFormer, kLatter, rawoff, dstoff);
+    }
+}
 
-        rawoff = finalZone->getRawOffset();
-
-        if (!local) {
-            // Adjust from GMT to local
-            date += rawoff;
-            double days2 = Math::floorDivide(date, (double)U_MILLIS_PER_DAY, millis);
-            if (days2 != days) {
-                Grego::dayToFields(days2, year, month, dom, dow);
-            }
-        }
-
-        dstoff = finalZone->getOffset(
-            GregorianCalendar::AD, year, month,
-            dom, (uint8_t) dow, (int32_t) millis, ec) - rawoff;
+void
+OlsonTimeZone::getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt,
+                                  int32_t& rawoff, int32_t& dstoff, UErrorCode& ec) /*const*/ {
+    if (U_FAILURE(ec)) {
         return;
     }
-
-    double secs = uprv_floor(date / U_MILLIS_PER_SECOND);
-    int16_t i = findTransition(secs, local);
-    rawoff = rawOffset(i) * U_MILLIS_PER_SECOND;
-    dstoff = dstOffset(i) * U_MILLIS_PER_SECOND;
+    if (date >= finalMillis && finalZone != 0) {
+        finalZone->getOffsetFromLocal(date, nonExistingTimeOpt, duplicatedTimeOpt, rawoff, dstoff, ec);
+    } else {
+        getHistoricalOffset(date, TRUE, nonExistingTimeOpt, duplicatedTimeOpt, rawoff, dstoff);
+    }
 }
 
+
 /**
  * TimeZone API.
  */
@@ -394,69 +384,84 @@
             double days = Math::floorDivide(((double)ms), (double)U_MILLIS_PER_DAY, millis);
             
             Grego::dayToFields(days, year, month, dom, dow);
-            U_DEBUG_TZ_MSG(("   findTransition:  time %.1f (%04d.%02d.%02d+%.1fh)\n", ms,
+            U_DEBUG_TZ_MSG(("   getHistoricalOffset:  time %.1f (%04d.%02d.%02d+%.1fh)\n", ms,
                             year, month+1, dom, (millis/kOneHour)));
     }
 #endif
 
-/**
- * Find the smallest i (in 0..transitionCount-1) such that time >=
- * transition(i), where transition(i) is either the GMT or the local
- * transition time, as specified by `local'.
- * @param time epoch seconds, either GMT or local wall
- * @param local if TRUE, `time' is in local wall units, otherwise it
- * is GMT
- * @return an index i, where 0 <= i < transitionCount, and
- * transition(i) <= time < transition(i+1), or i == 0 if
- * transitionCount == 0 or time < transition(0).
- */
-int16_t OlsonTimeZone::findTransition(double time, UBool local) const {
-    int16_t i = 0;
-    U_DEBUG_TZ_MSG(("findTransition(%.1f, %s)\n", time, local?"T":"F"));
+void
+OlsonTimeZone::getHistoricalOffset(UDate date, UBool local,
+                                   int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt,
+                                   int32_t& rawoff, int32_t& dstoff) const {
+    U_DEBUG_TZ_MSG(("getHistoricalOffset(%.1f, %s, %d, %d, raw, dst)\n",
+        date, local?"T":"F", NonExistingTimeOpt, DuplicatedTimeOpt));
 #if defined U_DEBUG_TZ
-        printTime(time*1000.0);
+        printTime(date*1000.0);
 #endif
-    
     if (transitionCount != 0) {
+        double sec = uprv_floor(date / U_MILLIS_PER_SECOND);
         // Linear search from the end is the fastest approach, since
         // most lookups will happen at/near the end.
+        int16_t i;
         for (i = transitionCount - 1; i > 0; --i) {
             int32_t transition = transitionTimes[i];
+
             if (local) {
-                int32_t zoneOffsetPrev = zoneOffset(typeData[i-1]);
-                int32_t zoneOffsetCurr = zoneOffset(typeData[i]);
+                int32_t offsetBefore = zoneOffset(typeData[i-1]);
+                UBool dstBefore = dstOffset(typeData[i-1]) != 0;
+
+                int32_t offsetAfter = zoneOffset(typeData[i]);
+                UBool dstAfter = dstOffset(typeData[i]) != 0;
+
+                UBool dstToStd = dstBefore && !dstAfter;
+                UBool stdToDst = !dstBefore && dstAfter;
                 
-                // use the lowest offset ( == standard time ). as per tzregts.cpp which says:
-
-                    /**
-                     * @bug 4084933
-                     * The expected behavior of TimeZone around the boundaries is:
-                     * (Assume transition time of 2:00 AM)
-                     *    day of onset 1:59 AM STD  = display name 1:59 AM ST
-                     *                 2:00 AM STD  = display name 3:00 AM DT
-                     *    day of end   0:59 AM STD  = display name 1:59 AM DT
-                     *                 1:00 AM STD  = display name 1:00 AM ST
-                     */
-                if(zoneOffsetPrev<zoneOffsetCurr) {
-                    transition += zoneOffsetPrev;
+                if (offsetAfter - offsetBefore >= 0) {
+                    // Positive transition, which makes a non-existing local time range
+                    if (((NonExistingTimeOpt & kStdDstMask) == kStandard && dstToStd)
+                            || ((NonExistingTimeOpt & kStdDstMask) == kDaylight && stdToDst)) {
+                        transition += offsetBefore;
+                    } else if (((NonExistingTimeOpt & kStdDstMask) == kStandard && stdToDst)
+                            || ((NonExistingTimeOpt & kStdDstMask) == kDaylight && dstToStd)) {
+                        transition += offsetAfter;
+                    } else if ((NonExistingTimeOpt & kFormerLatterMask) == kLatter) {
+                        transition += offsetBefore;
+                    } else {
+                        // Interprets the time with rule before the transition,
+                        // default for non-existing time range
+                        transition += offsetAfter;
+                    }
                 } else {
-                    transition += zoneOffsetCurr;
+                    // Negative transition, which makes a duplicated local time range
+                    if (((DuplicatedTimeOpt & kStdDstMask) == kStandard && dstToStd)
+                            || ((DuplicatedTimeOpt & kStdDstMask) == kDaylight && stdToDst)) {
+                        transition += offsetAfter;
+                    } else if (((DuplicatedTimeOpt & kStdDstMask) == kStandard && stdToDst)
+                            || ((DuplicatedTimeOpt & kStdDstMask) == kDaylight && dstToStd)) {
+                        transition += offsetBefore;
+                    } else if ((DuplicatedTimeOpt & kFormerLatterMask) == kFormer) {
+                        transition += offsetBefore;
+                    } else {
+                        // Interprets the time with rule after the transition,
+                        // default for duplicated local time range
+                        transition += offsetAfter;
+                    }
                 }
             }
-            if (time >= transition) {
-                U_DEBUG_TZ_MSG(("Found@%d: time=%.1f, localtransition=%d (orig %d) dz %d\n", i, time, transition, transitionTimes[i],
+            if (sec >= transition) {
+                U_DEBUG_TZ_MSG(("Found@%d: time=%.1f, localtransition=%d (orig %d) dz %d\n", i, sec, transition, transitionTimes[i],
                     zoneOffset(typeData[i-1])));
 #if defined U_DEBUG_TZ
-        printTime(transition*1000.0);
-        printTime(transitionTimes[i]*1000.0);
+                printTime(transition*1000.0);
+                printTime(transitionTimes[i]*1000.0);
 #endif
                 break;
             } else {
-                U_DEBUG_TZ_MSG(("miss@%d: time=%.1f, localtransition=%d (orig %d) dz %d\n", i, time, transition, transitionTimes[i],
+                U_DEBUG_TZ_MSG(("miss@%d: time=%.1f, localtransition=%d (orig %d) dz %d\n", i, sec, transition, transitionTimes[i],
                     zoneOffset(typeData[i-1])));
 #if defined U_DEBUG_TZ
-        printTime(transition*1000.0);
-        printTime(transitionTimes[i]*1000.0);
+                printTime(transition*1000.0);
+                printTime(transitionTimes[i]*1000.0);
 #endif
             }
         }
@@ -465,17 +470,25 @@
 
         // Check invariants for GMT times; if these pass for GMT times
         // the local logic should be working too.
-        U_ASSERT(local || time < transitionTimes[0] || time >= transitionTimes[i]);
-        U_ASSERT(local || i == transitionCount-1 || time < transitionTimes[i+1]);
+        U_ASSERT(local || sec < transitionTimes[0] || sec >= transitionTimes[i]);
+        U_ASSERT(local || i == transitionCount-1 || sec < transitionTimes[i+1]);
 
-        U_DEBUG_TZ_MSG(("findTransition(%.1f, %s)= trans %d\n", time, local?"T":"F", i));
-        i = typeData[i];
+        U_DEBUG_TZ_MSG(("getHistoricalOffset(%.1f, %s, %d, %d, raw, dst) - trans %d\n",
+            date, local?"T":"F", NonExistingTimeOpt, DuplicatedTimeOpt, i));
+
+        // Since ICU tzdata 2007c, the first transition data is actually not a
+        // transition, but used for representing the initial offset.  So the code
+        // below works even if i == 0.
+        int16_t index = typeData[i];
+        rawoff = rawOffset(index) * U_MILLIS_PER_SECOND;
+        dstoff = dstOffset(index) * U_MILLIS_PER_SECOND;
+    } else {
+        // No transitions, single pair of offsets only
+        rawoff = rawOffset(0) * U_MILLIS_PER_SECOND;
+        dstoff = dstOffset(0) * U_MILLIS_PER_SECOND;
     }
-
-    U_ASSERT(i>=0 && i<typeCount);
-    
-    U_DEBUG_TZ_MSG(("findTransition(%.1f, %s)=%d, offset %d\n", time, local?"T":"F", i, zoneOffset(i)));
-    return i;
+    U_DEBUG_TZ_MSG(("getHistoricalOffset(%.1f, %s, %d, %d, raw, dst) - raw=%d, dst=%d\n",
+        date, local?"T":"F", NonExistingTimeOpt, DuplicatedTimeOpt, rawoff, dstoff));
 }
 
 /**

Modified: trunk/source/i18n/olsontz.h
===================================================================
--- trunk/source/i18n/olsontz.h	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/i18n/olsontz.h	2008-03-24 11:52:37 UTC (rev 144)
@@ -182,6 +182,12 @@
                    int32_t& dstOffset, UErrorCode& ec) const;
 
     /**
+     * BasicTimeZone API.
+     */
+    virtual void getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt,
+        int32_t& rawoff, int32_t& dstoff, UErrorCode& ec) /*const*/;
+
+    /**
      * TimeZone API.  This method has no effect since objects of this
      * class are quasi-immutable (the base class allows the ID to be
      * changed).
@@ -279,7 +285,9 @@
 
     void constructEmpty();
 
-    int16_t findTransition(double time, UBool local) const;
+    void getHistoricalOffset(UDate date, UBool local,
+        int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt,
+        int32_t& rawoff, int32_t& dstoff) const;
 
     int32_t zoneOffset(int16_t index) const;
     int32_t rawOffset(int16_t index) const;

Modified: trunk/source/i18n/rbtz.cpp
===================================================================
--- trunk/source/i18n/rbtz.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/i18n/rbtz.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -46,14 +46,6 @@
     return TRUE;
 }
 
-static UDate getTransitionTime(Transition* transition, UBool local) {
-    UDate time = transition->time;
-    if (local) {
-        time += transition->from->getRawOffset() + transition->from->getDSTSavings();
-    }
-    return time;
-}
-
 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(RuleBasedTimeZone)
 
 RuleBasedTimeZone::RuleBasedTimeZone(const UnicodeString& id, InitialTimeZoneRule* initialRule)
@@ -183,7 +175,7 @@
             for (i = 0; i < historicCount; i++) {
                 done[i] = FALSE;
             }
-            while (true) {
+            while (TRUE) {
                 int32_t curStdOffset = curRule->getRawOffset();
                 int32_t curDstSavings = curRule->getDSTSavings();
                 UDate nextTransitionTime = MAX_MILLIS;
@@ -377,7 +369,7 @@
     }
     int32_t rawOffset, dstOffset;
     UDate time = (UDate)Grego::fieldsToDay(year, month, day) * U_MILLIS_PER_DAY + millis;
-    getOffset(time, true, rawOffset, dstOffset, status);
+    getOffsetInternal(time, TRUE, kDaylight, kStandard, rawOffset, dstOffset, status);
     if (U_FAILURE(status)) {
         return 0;
     }
@@ -387,6 +379,24 @@
 void
 RuleBasedTimeZone::getOffset(UDate date, UBool local, int32_t& rawOffset,
                              int32_t& dstOffset, UErrorCode& status) const {
+    getOffsetInternal(date, local, kFormer, kLatter, rawOffset, dstOffset, status);
+}
+
+void
+RuleBasedTimeZone::getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt,
+                                      int32_t& rawOffset, int32_t& dstOffset, UErrorCode& status) /*const*/ {
+    getOffsetInternal(date, TRUE, nonExistingTimeOpt, duplicatedTimeOpt, rawOffset, dstOffset, status);
+}
+
+
+/*
+ * The internal getOffset implementation
+ */
+void
+RuleBasedTimeZone::getOffsetInternal(UDate date, UBool local,
+                                     int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt,
+                                     int32_t& rawOffset, int32_t& dstOffset,
+                                     UErrorCode& status) const {
     rawOffset = 0;
     dstOffset = 0;
 
@@ -404,15 +414,17 @@
     if (fHistoricTransitions == NULL) {
         rule = fInitialRule;
     } else {
-        UDate tstart = getTransitionTime((Transition*)fHistoricTransitions->elementAt(0), local);
+        UDate tstart = getTransitionTime((Transition*)fHistoricTransitions->elementAt(0),
+            local, NonExistingTimeOpt, DuplicatedTimeOpt);
         if (date < tstart) {
             rule = fInitialRule;
         } else {
             int32_t idx = fHistoricTransitions->size() - 1;
-            UDate tend = getTransitionTime((Transition*)fHistoricTransitions->elementAt(idx), local);
+            UDate tend = getTransitionTime((Transition*)fHistoricTransitions->elementAt(idx),
+                local, NonExistingTimeOpt, DuplicatedTimeOpt);
             if (date > tend) {
                 if (fFinalRules != NULL) {
-                    rule = findRuleInFinal(date, local);
+                    rule = findRuleInFinal(date, local, NonExistingTimeOpt, DuplicatedTimeOpt);
                 } else {
                     // no final rule, use the last rule
                     rule = ((Transition*)fHistoricTransitions->elementAt(idx))->to;
@@ -420,7 +432,8 @@
             } else {
                 // Find a historical transition
                 while (idx >= 0) {
-                    if (date >= getTransitionTime((Transition*)fHistoricTransitions->elementAt(idx), local)) {
+                    if (date >= getTransitionTime((Transition*)fHistoricTransitions->elementAt(idx),
+                        local, NonExistingTimeOpt, DuplicatedTimeOpt)) {
                         break;
                     }
                     idx--;
@@ -651,7 +664,8 @@
 }
 
 TimeZoneRule*
-RuleBasedTimeZone::findRuleInFinal(UDate date, UBool local) const {
+RuleBasedTimeZone::findRuleInFinal(UDate date, UBool local,
+                                   int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt) const {
     if (fFinalRules == NULL) {
         return NULL;
     }
@@ -664,12 +678,25 @@
 
     UDate start0, start1;
     UDate base;
+    int32_t localDelta;
 
-    base = local ? date - fr1->getRawOffset() - fr1->getDSTSavings() : date;
-    UBool avail0 = fr0->getPreviousStart(base, fr1->getRawOffset(), fr1->getDSTSavings(), true, start0);
+    base = date;
+    if (local) {
+        localDelta = getLocalDelta(fr1->getRawOffset(), fr1->getDSTSavings(),
+                                   fr0->getRawOffset(), fr0->getDSTSavings(),
+                                   NonExistingTimeOpt, DuplicatedTimeOpt);
+        base -= localDelta;
+    }
+    UBool avail0 = fr0->getPreviousStart(base, fr1->getRawOffset(), fr1->getDSTSavings(), TRUE, start0);
 
-    base = local ? date - fr0->getRawOffset() - fr0->getDSTSavings() : date;
-    UBool avail1 = fr1->getPreviousStart(base, fr0->getRawOffset(), fr0->getDSTSavings(), true, start1);
+    base = date;
+    if (local) {
+        localDelta = getLocalDelta(fr0->getRawOffset(), fr0->getDSTSavings(),
+                                   fr1->getRawOffset(), fr1->getDSTSavings(),
+                                   NonExistingTimeOpt, DuplicatedTimeOpt);
+        base -= localDelta;
+    }
+    UBool avail1 = fr1->getPreviousStart(base, fr0->getRawOffset(), fr0->getDSTSavings(), TRUE, start1);
 
     if (avail0 && (!avail1 || start0 > start1)) {
         return fr0;
@@ -689,14 +716,14 @@
     UBool found = FALSE;
     Transition result;
     Transition *tzt = (Transition*)fHistoricTransitions->elementAt(0);
-    UDate tt = getTransitionTime(tzt, FALSE);
+    UDate tt = tzt->time;
     if (tt > base || (inclusive && tt == base)) {
         result = *tzt;
         found = TRUE;
     } else {
         int32_t idx = fHistoricTransitions->size() - 1;        
         tzt = (Transition*)fHistoricTransitions->elementAt(idx);
-        tt = getTransitionTime(tzt, FALSE);
+        tt = tzt->time;
         if (inclusive && tt == base) {
             result = *tzt;
             found = TRUE;
@@ -730,7 +757,7 @@
             Transition *prev = tzt;
             while (idx > 0) {
                 tzt = (Transition*)fHistoricTransitions->elementAt(idx);
-                tt = getTransitionTime(tzt, FALSE);
+                tt = tzt->time;
                 if (tt < base || (!inclusive && tt == base)) {
                     break;
                 }
@@ -772,14 +799,14 @@
     UBool found = FALSE;
     Transition result;
     Transition *tzt = (Transition*)fHistoricTransitions->elementAt(0);
-    UDate tt = getTransitionTime(tzt, FALSE);
+    UDate tt = tzt->time;
     if (inclusive && tt == base) {
         result = *tzt;
         found = TRUE;
     } else if (tt < base) {
         int32_t idx = fHistoricTransitions->size() - 1;        
         tzt = (Transition*)fHistoricTransitions->elementAt(idx);
-        tt = getTransitionTime(tzt, FALSE);
+        tt = tzt->time;
         if (inclusive && tt == base) {
             result = *tzt;
             found = TRUE;
@@ -813,7 +840,7 @@
             idx--;
             while (idx >= 0) {
                 tzt = (Transition*)fHistoricTransitions->elementAt(idx);
-                tt = getTransitionTime(tzt, FALSE);
+                tt = tzt->time;
                 if (tt < base || (inclusive && tt == base)) {
                     break;
                 }
@@ -839,6 +866,63 @@
     return FALSE;
 }
 
+UDate
+RuleBasedTimeZone::getTransitionTime(Transition* transition, UBool local,
+                                     int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt) const {
+    UDate time = transition->time;
+    if (local) {
+        time += getLocalDelta(transition->from->getRawOffset(), transition->from->getDSTSavings(),
+                              transition->to->getRawOffset(), transition->to->getDSTSavings(),
+                              NonExistingTimeOpt, DuplicatedTimeOpt);
+    }
+    return time;
+}
+
+int32_t
+RuleBasedTimeZone::getLocalDelta(int32_t rawBefore, int32_t dstBefore, int32_t rawAfter, int32_t dstAfter,
+                             int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt) const {
+    int32_t delta = 0;
+
+    int32_t offsetBefore = rawBefore + dstBefore;
+    int32_t offsetAfter = rawAfter + dstAfter;
+
+    UBool dstToStd = (dstBefore != 0) && (dstAfter == 0);
+    UBool stdToDst = (dstBefore == 0) && (dstAfter != 0);
+
+    if (offsetAfter - offsetBefore >= 0) {
+        // Positive transition, which makes a non-existing local time range
+        if (((NonExistingTimeOpt & kStdDstMask) == kStandard && dstToStd)
+                || ((NonExistingTimeOpt & kStdDstMask) == kDaylight && stdToDst)) {
+            delta = offsetBefore;
+        } else if (((NonExistingTimeOpt & kStdDstMask) == kStandard && stdToDst)
+                || ((NonExistingTimeOpt & kStdDstMask) == kDaylight && dstToStd)) {
+            delta = offsetAfter;
+        } else if ((NonExistingTimeOpt & kFormerLatterMask) == kLatter) {
+            delta = offsetBefore;
+        } else {
+            // Interprets the time with rule before the transition,
+            // default for non-existing time range
+            delta = offsetAfter;
+        }
+    } else {
+        // Negative transition, which makes a duplicated local time range
+        if (((DuplicatedTimeOpt & kStdDstMask) == kStandard && dstToStd)
+                || ((DuplicatedTimeOpt & kStdDstMask) == kDaylight && stdToDst)) {
+            delta = offsetAfter;
+        } else if (((DuplicatedTimeOpt & kStdDstMask) == kStandard && stdToDst)
+                || ((DuplicatedTimeOpt & kStdDstMask) == kDaylight && dstToStd)) {
+            delta = offsetBefore;
+        } else if ((DuplicatedTimeOpt & kFormerLatterMask) == kFormer) {
+            delta = offsetBefore;
+        } else {
+            // Interprets the time with rule after the transition,
+            // default for duplicated local time range
+            delta = offsetAfter;
+        }
+    }
+    return delta;
+}
+
 U_NAMESPACE_END
 
 #endif /* #if !UCONFIG_NO_FORMATTING */

Modified: trunk/source/i18n/simpletz.cpp
===================================================================
--- trunk/source/i18n/simpletz.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/i18n/simpletz.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -502,6 +502,55 @@
     return result;
 }
 
+void
+SimpleTimeZone::getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt,
+                                   int32_t& rawOffsetGMT, int32_t& savingsDST, UErrorCode& status) /*const*/ {
+    if (U_FAILURE(status)) {
+        return;
+    }
+
+    rawOffsetGMT = getRawOffset();
+    int32_t year, month, dom, dow;
+    double day = uprv_floor(date / U_MILLIS_PER_DAY);
+    int32_t millis = (int32_t) (date - day * U_MILLIS_PER_DAY);
+
+    Grego::dayToFields(day, year, month, dom, dow);
+
+    savingsDST = getOffset(GregorianCalendar::AD, year, month, dom,
+                          (uint8_t) dow, millis,
+                          Grego::monthLength(year, month),
+                          status) - rawOffsetGMT;
+    if (U_FAILURE(status)) {
+        return;
+    }
+
+    UBool recalc = FALSE;
+
+    // Now we need some adjustment
+    if (savingsDST > 0) {
+        if ((nonExistingTimeOpt & kStdDstMask) == kStandard
+            || (nonExistingTimeOpt & kStdDstMask) != kDaylight && (nonExistingTimeOpt & kFormerLatterMask) != kLatter) {
+            date -= getDSTSavings();
+            recalc = TRUE;
+        }
+    } else {
+        if ((duplicatedTimeOpt & kStdDstMask) == kDaylight
+                || (duplicatedTimeOpt & kStdDstMask) != kStandard && (duplicatedTimeOpt & kFormerLatterMask) == kFormer) {
+            date -= getDSTSavings();
+            recalc = TRUE;
+        }
+    }
+    if (recalc) {
+        day = uprv_floor(date / U_MILLIS_PER_DAY);
+        millis = (int32_t) (date - day * U_MILLIS_PER_DAY);
+        Grego::dayToFields(day, year, month, dom, dow);
+        savingsDST = getOffset(GregorianCalendar::AD, year, month, dom,
+                          (uint8_t) dow, millis,
+                          Grego::monthLength(year, month),
+                          status) - rawOffsetGMT;
+    }
+}
+
 // -------------------------------------
 
 /**
@@ -966,8 +1015,8 @@
         return FALSE;
     }
     UDate stdDate, dstDate;
-    UBool stdAvail = stdRule->getPreviousStart(base, dstRule->getRawOffset(), dstRule->getDSTSavings(), false, stdDate);
-    UBool dstAvail = dstRule->getPreviousStart(base, stdRule->getRawOffset(), stdRule->getDSTSavings(), false, dstDate);
+    UBool stdAvail = stdRule->getPreviousStart(base, dstRule->getRawOffset(), dstRule->getDSTSavings(), inclusive, stdDate);
+    UBool dstAvail = dstRule->getPreviousStart(base, stdRule->getRawOffset(), stdRule->getDSTSavings(), inclusive, dstDate);
     if (stdAvail && (!dstAvail || stdDate > dstDate)) {
         result.setTime(stdDate);
         result.setFrom((const TimeZoneRule&)*dstRule);

Modified: trunk/source/i18n/smpdtfmt.cpp
===================================================================
--- trunk/source/i18n/smpdtfmt.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/i18n/smpdtfmt.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -41,10 +41,18 @@
 #include "unicode/dcfmtsym.h"
 #include "unicode/uchar.h"
 #include "unicode/ustring.h"
+#include "unicode/basictz.h"
+#include "unicode/simpletz.h"
+#include "unicode/rbtz.h"
+#include "unicode/vtzone.h"
+#include "olsontz.h"
 #include "util.h"
 #include "gregoimp.h" 
 #include "cstring.h"
 #include "uassert.h"
+#include "zstrfmt.h"
+#include "cmemory.h"
+#include "umutex.h"
 #include <float.h>
 
 #if defined( U_DEBUG_CALSVC ) || defined (U_DEBUG_CAL)
@@ -66,6 +74,19 @@
 static const UChar gGmt[]      = {0x0047, 0x004D, 0x0054, 0x0000};         // "GMT"
 static const UChar gGmtPlus[]  = {0x0047, 0x004D, 0x0054, 0x002B, 0x0000}; // "GMT+"
 static const UChar gGmtMinus[] = {0x0047, 0x004D, 0x0054, 0x002D, 0x0000}; // "GMT-"
+static const UChar gDefGmtPat[]       = {0x0047, 0x004D, 0x0054, 0x007B, 0x0030, 0x007D, 0x0000}; /* GMT{0} */
+static const UChar gDefGmtNegHmsPat[] = {0x002D, 0x0048, 0x0048, 0x003A, 0x006D, 0x006D, 0x003A, 0x0073, 0x0073, 0x0000}; /* -HH:mm:ss */
+static const UChar gDefGmtNegHmPat[]  = {0x002D, 0x0048, 0x0048, 0x003A, 0x006D, 0x006D, 0x0000}; /* -HH:mm */
+static const UChar gDefGmtPosHmsPat[] = {0x002B, 0x0048, 0x0048, 0x003A, 0x006D, 0x006D, 0x003A, 0x0073, 0x0073, 0x0000}; /* +HH:mm:ss */
+static const UChar gDefGmtPosHmPat[]  = {0x002B, 0x0048, 0x0048, 0x003A, 0x006D, 0x006D, 0x0000}; /* +HH:mm */
+typedef enum GmtPatSize {
+    kGmtLen = 3,
+    kGmtPatLen = 6,
+    kNegHmsLen = 9,
+    kNegHmLen = 6,
+    kPosHmsLen = 9,
+    kPosHmLen = 6
+} GmtPatSize;
 
 // This is a pattern-of-last-resort used when we can't load a usable pattern out
 // of a resource.
@@ -83,21 +104,36 @@
  * These are the tags we expect to see in normal resource bundle files associated
  * with a locale.
  */
-static const char kSUPPLEMENTAL[]="supplementalData";
-static const char gZoneFormattingTag[]="zoneFormatting";
-static const char gAliases[]="aliases";
 static const char gDateTimePatternsTag[]="DateTimePatterns";
 
+static const UChar gEtcUTC[] = {0x45, 0x74, 0x63, 0x2F, 0x55, 0x54, 0x43, 0x00}; // "Etc/UTC"
+static const UChar QUOTE = 0x27; // Single quote
+enum {
+    kGMTNegativeHMS = 0,
+    kGMTNegativeHM,
+    kGMTPositiveHMS,
+    kGMTPositiveHM,
+
+    kNumGMTFormatters
+};
+
+static UMTX LOCK;
+
 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SimpleDateFormat)
 
-static const UChar QUOTE = 0x27; // Single quote
-
 //----------------------------------------------------------------------
 
 SimpleDateFormat::~SimpleDateFormat()
 {
     delete fSymbols;
-    delete parsedTimeZone; // sanity check
+    if (fGMTFormatters) {
+        for (int32_t i = 0; i < kNumGMTFormatters; i++) {
+            if (fGMTFormatters[i]) {
+                delete fGMTFormatters[i];
+            }
+        }
+        uprv_free(fGMTFormatters);
+    }
 }
 
 //----------------------------------------------------------------------
@@ -105,7 +141,7 @@
 SimpleDateFormat::SimpleDateFormat(UErrorCode& status)
   :   fLocale(Locale::getDefault()),
       fSymbols(NULL),
-      parsedTimeZone(NULL)
+      fGMTFormatters(NULL)
 {
     construct(kShort, (EStyle) (kShort + kDateOffset), fLocale, status);
     initializeDefaultCentury();
@@ -118,7 +154,7 @@
 :   fPattern(pattern),
     fLocale(Locale::getDefault()),
     fSymbols(NULL),
-    parsedTimeZone(NULL)
+    fGMTFormatters(NULL)
 {
     initializeSymbols(fLocale, initializeCalendar(NULL,fLocale,status), status);
     initialize(fLocale, status);
@@ -132,7 +168,7 @@
                                    UErrorCode& status)
 :   fPattern(pattern),
     fLocale(locale),
-    parsedTimeZone(NULL)
+    fGMTFormatters(NULL)
 {
     initializeSymbols(fLocale, initializeCalendar(NULL,fLocale,status), status);
     initialize(fLocale, status);
@@ -147,7 +183,7 @@
 :   fPattern(pattern),
     fLocale(Locale::getDefault()),
     fSymbols(symbolsToAdopt),
-    parsedTimeZone(NULL)
+    fGMTFormatters(NULL)
 {
     initializeCalendar(NULL,fLocale,status);
     initialize(fLocale, status);
@@ -162,7 +198,7 @@
 :   fPattern(pattern),
     fLocale(Locale::getDefault()),
     fSymbols(new DateFormatSymbols(symbols)),
-    parsedTimeZone(NULL)
+    fGMTFormatters(NULL)
 {
     initializeCalendar(NULL, fLocale, status);
     initialize(fLocale, status);
@@ -178,7 +214,7 @@
                                    UErrorCode& status)
 :   fLocale(locale),
     fSymbols(NULL),
-    parsedTimeZone(NULL)
+    fGMTFormatters(NULL)
 {
     construct(timeStyle, dateStyle, fLocale, status);
     if(U_SUCCESS(status)) {
@@ -198,7 +234,7 @@
 :   fPattern(gDefaultPattern),
     fLocale(locale),
     fSymbols(NULL),
-    parsedTimeZone(NULL)
+    fGMTFormatters(NULL)
 {
     if (U_FAILURE(status)) return;
     initializeSymbols(fLocale, initializeCalendar(NULL, fLocale, status),status);
@@ -226,7 +262,7 @@
 SimpleDateFormat::SimpleDateFormat(const SimpleDateFormat& other)
 :   DateFormat(other),
     fSymbols(NULL),
-    parsedTimeZone(NULL)
+    fGMTFormatters(NULL)
 {
     *this = other;
 }
@@ -243,8 +279,6 @@
     delete fSymbols;
     fSymbols = NULL;
 
-    delete parsedTimeZone; parsedTimeZone = NULL;
-
     if (other.fSymbols)
         fSymbols = new DateFormatSymbols(*other.fSymbols);
 
@@ -585,22 +619,338 @@
 }
 
 //---------------------------------------------------------------------
-inline void SimpleDateFormat::appendGMT(UnicodeString &appendTo, Calendar& cal, UErrorCode& status) const{
-    int32_t value = cal.get(UCAL_ZONE_OFFSET, status) +
-    cal.get(UCAL_DST_OFFSET, status);
+void
+SimpleDateFormat::appendGMT(UnicodeString &appendTo, Calendar& cal, UErrorCode& status) const{
+    int32_t offset = cal.get(UCAL_ZONE_OFFSET, status) + cal.get(UCAL_DST_OFFSET, status);
+    if (U_FAILURE(status)) {
+        return;
+    }
+    if (isDefaultGMTFormat()) {
+        formatGMTDefault(appendTo, offset);
+    } else {
+        ((SimpleDateFormat*)this)->initGMTFormatters(status);
+        if (U_SUCCESS(status)) {
+            int32_t type;
+            if (offset < 0) {
+                offset = -offset;
+                type = (offset % U_MILLIS_PER_MINUTE) == 0 ? kGMTNegativeHM : kGMTNegativeHMS;
+            } else {
+                type = (offset % U_MILLIS_PER_MINUTE) == 0 ? kGMTPositiveHM : kGMTPositiveHMS;
+            }
+            Formattable param(offset, Formattable::kIsDate);
+            FieldPosition fpos(0);
+            fGMTFormatters[type]->format(&param, 1, appendTo, fpos, status);
+        }
+    }
+}
 
-    if (value < 0) {
+int32_t
+SimpleDateFormat::parseGMT(const UnicodeString &text, ParsePosition &pos) const {
+    if (!isDefaultGMTFormat()) {
+        int32_t start = pos.getIndex();
+
+        // Quick check
+        UBool prefixMatch = FALSE;
+        int32_t prefixLen = fSymbols->fGmtFormat.indexOf((UChar)0x007B /* '{' */);
+        if (prefixLen > 0 && text.compare(start, prefixLen, fSymbols->fGmtFormat, 0, prefixLen) == 0) {
+            prefixMatch = TRUE;
+        }
+        if (prefixMatch) {
+            // Prefix matched
+            UErrorCode status = U_ZERO_ERROR;
+            ((SimpleDateFormat*)this)->initGMTFormatters(status);
+            if (U_SUCCESS(status)) {
+                Formattable parsed;
+                int32_t parsedCount;
+
+                // Try negative Hms
+                fGMTFormatters[kGMTNegativeHMS]->parseObject(text, parsed, pos);
+                if (pos.getErrorIndex() == -1 && pos.getIndex() > start) {
+                    parsed.getArray(parsedCount);
+                    if (parsedCount == 1 && parsed[0].getType() == Formattable::kDate) {
+                        return (int32_t)(-1 * parsed[0].getDate());
+                    }
+                }
+
+                // Reset ParsePosition
+                pos.setIndex(start);
+                pos.setErrorIndex(-1);
+
+                // Try positive Hms
+                fGMTFormatters[kGMTPositiveHMS]->parseObject(text, parsed, pos);
+                if (pos.getErrorIndex() == -1 && pos.getIndex() > start) {
+                    parsed.getArray(parsedCount);
+                    if (parsedCount == 1 && parsed[0].getType() == Formattable::kDate) {
+                        return (int32_t)parsed[0].getDate();
+                    }
+                }
+
+                // Reset ParsePosition
+                pos.setIndex(start);
+                pos.setErrorIndex(-1);
+
+                // Try negative Hm
+                fGMTFormatters[kGMTNegativeHM]->parseObject(text, parsed, pos);
+                if (pos.getErrorIndex() == -1 && pos.getIndex() > start) {
+                    parsed.getArray(parsedCount);
+                    if (parsedCount == 1 && parsed[0].getType() == Formattable::kDate) {
+                        return (int32_t)(-1 * parsed[0].getDate());
+                    }
+                }
+
+                // Reset ParsePosition
+                pos.setIndex(start);
+                pos.setErrorIndex(-1);
+
+                // Try positive Hm
+                fGMTFormatters[kGMTPositiveHM]->parseObject(text, parsed, pos);
+                if (pos.getErrorIndex() == -1 && pos.getIndex() > start) {
+                    parsed.getArray(parsedCount);
+                    if (parsedCount == 1 && parsed[0].getType() == Formattable::kDate) {
+                        return (int32_t)parsed[0].getDate();
+                    }
+                }
+
+                // Reset ParsePosition
+                pos.setIndex(start);
+                pos.setErrorIndex(-1);
+            }
+            // fall through to the default GMT parsing method
+        }
+    }
+    return parseGMTDefault(text, pos);
+}
+
+void
+SimpleDateFormat::formatGMTDefault(UnicodeString &appendTo, int32_t offset) const {
+    if (offset < 0) {
         appendTo += gGmtMinus;
-        value = -value; // suppress the '-' sign for text display.
+        offset = -offset; // suppress the '-' sign for text display.
     }else{
         appendTo += gGmtPlus;
     }
 
-    zeroPaddingNumber(appendTo, (int32_t)(value/U_MILLIS_PER_HOUR), 2, 2);
+    offset /= U_MILLIS_PER_SECOND; // now in seconds
+    int32_t sec = offset % 60;
+    offset /= 60;
+    int32_t min = offset % 60;
+    int32_t hour = offset / 60;
+
+
+    zeroPaddingNumber(appendTo, hour, 2, 2);
     appendTo += (UChar)0x003A /*':'*/;
-    zeroPaddingNumber(appendTo, (int32_t)((value%U_MILLIS_PER_HOUR)/U_MILLIS_PER_MINUTE), 2, 2);
+    zeroPaddingNumber(appendTo, min, 2, 2);
+    if (sec != 0) {
+        appendTo += (UChar)0x003A /*':'*/;
+        zeroPaddingNumber(appendTo, sec, 2, 2);
+    }
 }
 
+int32_t
+SimpleDateFormat::parseGMTDefault(const UnicodeString &text, ParsePosition &pos) const {
+    int32_t start = pos.getIndex();
+
+    if (start + kGmtLen + 1 >= text.length()) {
+        pos.setErrorIndex(start);
+        return 0;
+    }
+
+    int32_t cur = start;
+    // "GMT"
+    if (text.compare(start, kGmtLen, gGmt) != 0) {
+        pos.setErrorIndex(start);
+        return 0;
+    }
+    cur += kGmtLen;
+    // Sign
+    UBool negative = FALSE;
+    if (text.charAt(cur) == (UChar)0x002D /* minus */) {
+        negative = TRUE;
+    } else if (text.charAt(cur) != (UChar)0x002B /* plus */) {
+        pos.setErrorIndex(cur);
+        return 0;
+    }
+    cur++;
+
+    // Numbers
+    int32_t numLen;
+    pos.setIndex(cur);
+
+    Formattable number;
+    parseInt(text, number, 6, pos, FALSE);
+    numLen = pos.getIndex() - cur;
+
+    if (numLen <= 0) {
+        pos.setIndex(start);
+        pos.setErrorIndex(cur);
+        return 0;
+    }
+
+    int32_t numVal = number.getLong();
+
+    int32_t hour = 0;
+    int32_t min = 0;
+    int32_t sec = 0;
+
+    if (numLen <= 2) {
+        // H[H][:mm[:ss]]
+        hour = numVal;
+        cur += numLen;
+        if (cur + 2 < text.length() && text.charAt(cur) == (UChar)0x003A /* colon */) {
+            cur++;
+            pos.setIndex(cur);
+            parseInt(text, number, 2, pos, FALSE);
+            numLen = pos.getIndex() - cur;
+            if (numLen == 2) {
+                // got minute field
+                min = number.getLong();
+                cur += numLen;
+                if (cur + 2 < text.length() && text.charAt(cur) == (UChar)0x003A /* colon */) {
+                    cur++;
+                    pos.setIndex(cur);
+                    parseInt(text, number, 2, pos, FALSE);
+                    numLen = pos.getIndex() - cur;
+                    if (numLen == 2) {
+                        // got second field
+                        sec = number.getLong();
+                    } else {
+                        // reset position
+                        pos.setIndex(cur - 1);
+                        pos.setErrorIndex(-1);
+                    }
+                }
+            } else {
+                // reset postion
+                pos.setIndex(cur - 1);
+                pos.setErrorIndex(-1);
+            }
+        }
+    } else if (numLen == 3 || numLen == 4) {
+        // Hmm or HHmm
+        hour = numVal / 100;
+        min = numVal % 100;
+    } else if (numLen == 5 || numLen == 6) {
+        // Hmmss or HHmmss
+        hour = numVal / 10000;
+        min = (numVal % 10000) / 100;
+        sec = numVal % 100;
+    } else {
+        // HHmmss followed by bogus numbers
+        pos.setIndex(cur + 6);
+
+        int32_t shift = numLen - 6;
+        while (shift > 0) {
+            numVal /= 10;
+            shift--;
+        }
+        hour = numVal / 10000;
+        min = (numVal % 10000) / 100;
+        sec = numVal % 100;
+    }
+
+    int32_t offset = ((hour*60 + min)*60 + sec)*1000;
+    if (negative) {
+        offset = -offset;
+    }
+    return offset;
+}
+
+UBool
+SimpleDateFormat::isDefaultGMTFormat() const {
+    // GMT pattern
+    if (fSymbols->fGmtFormat.length() == 0) {
+        // No GMT pattern is set
+        return TRUE;
+    } else if (fSymbols->fGmtFormat.compare(gDefGmtPat, kGmtPatLen) != 0) {
+        return FALSE;
+    }
+    // Hour patterns
+    if (fSymbols->fGmtHourFormats == NULL || fSymbols->fGmtHourFormatsCount != DateFormatSymbols::GMT_HOUR_COUNT) {
+        // No Hour pattern is set
+        return TRUE;
+    } else if ((fSymbols->fGmtHourFormats[DateFormatSymbols::GMT_NEGATIVE_HMS].compare(gDefGmtNegHmsPat, kNegHmsLen) != 0)
+        || (fSymbols->fGmtHourFormats[DateFormatSymbols::GMT_NEGATIVE_HM].compare(gDefGmtNegHmPat, kNegHmLen) != 0)
+        || (fSymbols->fGmtHourFormats[DateFormatSymbols::GMT_POSITIVE_HMS].compare(gDefGmtPosHmsPat, kPosHmsLen) != 0)
+        || (fSymbols->fGmtHourFormats[DateFormatSymbols::GMT_POSITIVE_HM].compare(gDefGmtPosHmPat, kPosHmLen) != 0)) {
+        return FALSE;
+    }
+    return TRUE;
+}
+
+void
+SimpleDateFormat::formatRFC822TZ(UnicodeString &appendTo, int32_t offset) const {
+    UChar sign = 0x002B /* '+' */;
+    if (offset < 0) {
+        offset = -offset;
+        sign = 0x002D /* '-' */;
+    }
+    appendTo.append(sign);
+
+    int32_t offsetH = offset / U_MILLIS_PER_HOUR;
+    offset = offset % U_MILLIS_PER_HOUR;
+    int32_t offsetM = offset / U_MILLIS_PER_MINUTE;
+    offset = offset % U_MILLIS_PER_MINUTE;
+    int32_t offsetS = offset / U_MILLIS_PER_SECOND;
+
+    int32_t num = 0, denom = 0;
+    if (offsetS == 0) {
+        offset = offsetH*100 + offsetM; // HHmm
+        num = offset % 10000;
+        denom = 1000;
+    } else {
+        offset = offsetH*10000 + offsetM*100 + offsetS; // HHmmss
+        num = offset % 1000000;
+        denom = 100000;
+    }
+    while (denom >= 1) {
+        UChar digit = (UChar)0x0030 + (num / denom);
+        appendTo.append(digit);
+        num = num % denom;
+        denom /= 10;
+    }
+}
+
+void
+SimpleDateFormat::initGMTFormatters(UErrorCode &status) {
+    if (U_FAILURE(status)) {
+        return;
+    }
+    umtx_lock(&LOCK);
+    if (fGMTFormatters == NULL) {
+        fGMTFormatters = (MessageFormat**)uprv_malloc(kNumGMTFormatters * sizeof(MessageFormat*));
+        if (fGMTFormatters) {
+            for (int32_t i = 0; i < kNumGMTFormatters; i++) {
+                const UnicodeString *hourPattern;
+                switch (i) {
+                    case kGMTNegativeHMS:
+                        hourPattern = &(fSymbols->fGmtHourFormats[DateFormatSymbols::GMT_NEGATIVE_HMS]);
+                        break;
+                    case kGMTNegativeHM:
+                        hourPattern = &(fSymbols->fGmtHourFormats[DateFormatSymbols::GMT_NEGATIVE_HM]);
+                        break;
+                    case kGMTPositiveHMS:
+                        hourPattern = &(fSymbols->fGmtHourFormats[DateFormatSymbols::GMT_POSITIVE_HMS]);
+                        break;
+                    case kGMTPositiveHM:
+                        hourPattern = &(fSymbols->fGmtHourFormats[DateFormatSymbols::GMT_POSITIVE_HM]);
+                        break;
+                }
+                fGMTFormatters[i] = new MessageFormat(fSymbols->fGmtFormat, status);
+                if (U_FAILURE(status)) {
+                    break;
+                }
+                SimpleDateFormat *sdf = (SimpleDateFormat*)this->clone();
+                sdf->adoptTimeZone(TimeZone::createTimeZone(UnicodeString(gEtcUTC)));
+                sdf->applyPattern(*hourPattern);
+                fGMTFormatters[i]->adoptFormat(0, sdf);
+            }
+        } else {
+            status = U_MEMORY_ALLOCATION_ERROR;
+        }
+    }
+    umtx_unlock(&LOCK);
+}
+
 //---------------------------------------------------------------------
 void
 SimpleDateFormat::subFormat(UnicodeString &appendTo,
@@ -775,145 +1125,57 @@
     // then the time zone shows up as "GMT+hh:mm" or "GMT-hh:mm" (where "hh:mm" is the
     // offset from GMT) regardless of how many z's were in the pattern symbol
     case UDAT_TIMEZONE_FIELD: 
+    case UDAT_TIMEZONE_GENERIC_FIELD:
     case UDAT_TIMEZONE_SPECIAL_FIELD: 
-    case UDAT_TIMEZONE_GENERIC_FIELD: {
-        UnicodeString str;
-        UnicodeString zid;
-        UnicodeString mzid;
-        UnicodeString displayString;
-        zid = fSymbols->getZoneID(cal.getTimeZone().getID(str), zid, status);
-        if(U_FAILURE(status)){
-            break;
-        }
-        if (zid.length() == 0) {
-            appendGMT(appendTo, cal, status);
-        }
-        else {
-            zoneIDCanonicalize(zid);
-            if (patternCharIndex == UDAT_TIMEZONE_GENERIC_FIELD) {
-                if(count < 4){
-                    if (cal.getTimeZone().useDaylightTime()) {
-                        fSymbols->getZoneString(zid, DateFormatSymbols::TIMEZONE_SHORT_GENERIC, displayString, status);
-                        if ( !fSymbols->isCommonlyUsed(zid)) {
-                            displayString.remove();
-                        }
-                        if(displayString.length()==0) {
-                            mzid = fSymbols->getMetazoneString(zid, DateFormatSymbols::TIMEZONE_SHORT_GENERIC, cal, displayString, status);
-                            if ( !fSymbols->isCommonlyUsed(mzid)) {
-                                displayString.remove();
-                            }
-                        }
+        {
+            UnicodeString zoneString;
+            const ZoneStringFormat *zsf = fSymbols->getZoneStringFormat();
+            if (zsf) {
+                if (patternCharIndex == UDAT_TIMEZONE_FIELD) {
+                    if (count < 4) {
+                        // "z", "zz", "zzz"
+                        zsf->getSpecificShortString(cal, TRUE /*commonly used only*/,
+                            zoneString, status);
+                    } else {
+                        // "zzzz"
+                        zsf->getSpecificLongString(cal, zoneString, status);
                     }
-                    else {
-                        fSymbols->getZoneString(zid, DateFormatSymbols::TIMEZONE_SHORT_STANDARD, displayString, status);
-                        if ( !fSymbols->isCommonlyUsed(zid)) {
-                            displayString.remove();
-                        }
-                        if(displayString.length()==0) {
-                            mzid = fSymbols->getMetazoneString(zid, DateFormatSymbols::TIMEZONE_SHORT_STANDARD, cal, displayString, status);
-                            if ( !fSymbols->isCommonlyUsed(mzid)) {
-                                displayString.remove();
-                            }
-                        }
+                } else if (patternCharIndex == UDAT_TIMEZONE_GENERIC_FIELD) {
+                    if (count == 1) {
+                        // "v"
+                        zsf->getGenericShortString(cal, TRUE /*commonly used only*/,
+                            zoneString, status);
+                    } else if (count == 4) {
+                        // "vvvv"
+                        zsf->getGenericLongString(cal, zoneString, status);
                     }
-                    if(displayString.length()==0) {
-                       fSymbols->getFallbackString(zid, displayString, status);
+                } else { // patternCharIndex == UDAT_TIMEZONE_SPECIAL_FIELD
+                    if (count == 1) {
+                        // "V"
+                        zsf->getSpecificShortString(cal, FALSE /*ignore commonly used*/,
+                            zoneString, status);
+                    } else if (count == 4) {
+                        // "VVVV"
+                        zsf->getGenericLocationString(cal, zoneString, status);
                     }
-                }else{
-                    if (cal.getTimeZone().useDaylightTime()) {
-                        fSymbols->getZoneString(zid, DateFormatSymbols::TIMEZONE_LONG_GENERIC, displayString, status);
-                        if(displayString.length()==0) {
-                           mzid = fSymbols->getMetazoneString(zid, DateFormatSymbols::TIMEZONE_LONG_GENERIC, cal, displayString, status);
-                        }
-                    }
-                    else {
-                        fSymbols->getZoneString(zid, DateFormatSymbols::TIMEZONE_LONG_STANDARD, displayString, status);
-                        if(displayString.length()==0) {
-                           mzid = fSymbols->getMetazoneString(zid, DateFormatSymbols::TIMEZONE_LONG_STANDARD, cal, displayString, status);
-                        }
-                    }
-
-                    if(displayString.length()==0) {
-                       fSymbols->getFallbackString(zid, displayString, status);
-                    }
                 }
             }
-            else if (patternCharIndex == UDAT_TIMEZONE_SPECIAL_FIELD) {
-                if(count == 4){ // VVVV format - always get fallback string.
-                       fSymbols->getFallbackString(zid, displayString, status);
-                }
-                else if (count == 1){ // V format - ignore commonlyUsed
-                    if (cal.get(UCAL_DST_OFFSET, status) != 0) {
-                        fSymbols->getZoneString(zid, DateFormatSymbols::TIMEZONE_SHORT_DAYLIGHT, displayString, status);
-                        if(displayString.length()==0) {
-                            mzid = fSymbols->getMetazoneString(zid, DateFormatSymbols::TIMEZONE_SHORT_DAYLIGHT, cal, displayString, status);
-                        }
-                    }
-                    else {
-                        fSymbols->getZoneString(zid, DateFormatSymbols::TIMEZONE_SHORT_STANDARD, displayString, status);
-                        if(displayString.length()==0) {
-                            mzid = fSymbols->getMetazoneString(zid, DateFormatSymbols::TIMEZONE_SHORT_STANDARD, cal, displayString, status);
-                        }
-                    }
-                }
+            if (zoneString.isEmpty()) {
+                appendGMT(appendTo, cal, status);
             } else {
-                if (cal.get(UCAL_DST_OFFSET, status) != 0) {
-                    if(count < 4){
-                        fSymbols->getZoneString(zid, DateFormatSymbols::TIMEZONE_SHORT_DAYLIGHT, displayString, status);
-                        if ( fSymbols->isCommonlyUsed(zid) == FALSE ) {
-                            displayString.remove();
-                        }
-                        if(displayString.length()==0) {
-                            mzid = fSymbols->getMetazoneString(zid, DateFormatSymbols::TIMEZONE_SHORT_DAYLIGHT, cal, displayString, status);
-                            if ( fSymbols->isCommonlyUsed(mzid) == FALSE ) {
-                                displayString.remove();
-                            }
-                        }
-                    }else{
-                        fSymbols->getZoneString(zid, DateFormatSymbols::TIMEZONE_LONG_DAYLIGHT, displayString, status);
-                        if(displayString.length()==0)
-                           fSymbols->getMetazoneString(zid, DateFormatSymbols::TIMEZONE_LONG_DAYLIGHT, cal, displayString, status);
-                    }
-                }else{
-                    if(count < 4){
-                        fSymbols->getZoneString(zid, DateFormatSymbols::TIMEZONE_SHORT_STANDARD, displayString, status);
-                        if ( !fSymbols->isCommonlyUsed(zid)) {
-                            displayString.remove();
-                        }
-                        if(displayString.length()==0) {
-                            mzid = fSymbols->getMetazoneString(zid, DateFormatSymbols::TIMEZONE_SHORT_STANDARD, cal, displayString, status);
-                            if ( fSymbols->isCommonlyUsed(mzid) == FALSE ) {
-                                displayString.remove();
-                            }
-                        }
-                    }else{
-                        fSymbols->getZoneString(zid, DateFormatSymbols::TIMEZONE_LONG_STANDARD, displayString, status);
-                        if(displayString.length()==0)
-                           fSymbols->getMetazoneString(zid, DateFormatSymbols::TIMEZONE_LONG_STANDARD, cal, displayString, status);
-                    }
-                }
+                appendTo += zoneString;
             }
-            if(displayString.length()==0){
-                appendGMT(appendTo, cal, status);
-            }else{
-                appendTo += displayString;
-            }
         }
-      }
-    break;
-    
-    case 23: // 'Z' - TIMEZONE_RFC
-        {
-            UChar sign = 43/*'+'*/;
-            value = (cal.get(UCAL_ZONE_OFFSET, status) +
-                     cal.get(UCAL_DST_OFFSET, status)) / U_MILLIS_PER_MINUTE;
-            if (value < 0) {
-                value = -value;
-                sign = 45/*'-'*/;
-            }
-            value = (value / 60) * 100 + (value % 60); // minutes => KKmm
-            appendTo += sign;
-            zeroPaddingNumber(appendTo, value, 4, 4);
+        break;
+
+    case UDAT_TIMEZONE_RFC_FIELD: // 'Z' - TIMEZONE_RFC
+        if (count < 4) {
+            // RFC822 format, must use ASCII digits
+            value = (cal.get(UCAL_ZONE_OFFSET, status) + cal.get(UCAL_DST_OFFSET, status));
+            formatRFC822TZ(appendTo, value);
+        } else {
+            // long form, localized GMT pattern
+            appendGMT(appendTo, cal, status);
         }
         break;
 
@@ -955,88 +1217,8 @@
         pos.setEndIndex(appendTo.length());
     }
 }
-//----------------------------------------------------------------------
 
-void
-SimpleDateFormat::zoneIDCanonicalize(UnicodeString &zid) const
-{
-    UnicodeString colon = UNICODE_STRING_SIMPLE(":");
-    UnicodeString solidus = UNICODE_STRING_SIMPLE("/");
-    char zidkey[ZID_KEY_MAX];
-    int32_t len;
-
-    UErrorCode status = U_ZERO_ERROR;
-    UResourceBundle* supplementalDataBundle = ures_openDirect(NULL, kSUPPLEMENTAL, &status);
-    if (U_FAILURE(status)) {
-        return;
-    }
-       
-    UResourceBundle* zoneFormatting = ures_getByKey(supplementalDataBundle, gZoneFormattingTag, NULL, &status);
-
-    // First try to lookup the zone itself, since most of the time the canonical ID and the ID itself
-    // will be the same.  This should save us a significant amount of time.
-
-    len = zid.length();
-    len = (len >= (ZID_KEY_MAX-1) ? ZID_KEY_MAX-1 : len);
-    u_UCharsToChars(zid.getBuffer(), zidkey, len);
-    zidkey[len] = 0; // NULL terminate
-
-    // Replace / with : for zid
-    len = (int32_t)uprv_strlen(zidkey);
-    for (int i = 0; i < len; i++) {
-        if (zidkey[i] == '/') {
-            zidkey[i] = ':';
-        }
-    }
-
-    UResourceBundle* tryThisZone = ures_getByKey(zoneFormatting,zidkey,NULL,&status);
-    if (U_SUCCESS(status)) {
-         ures_close(tryThisZone);
-         ures_close(zoneFormatting);
-         ures_close(supplementalDataBundle);
-         return;
-    }
-    else {
-        status = U_ZERO_ERROR;
-    }
-
-    // Didn't find it, so go searching for an alias
-
-    while ( ures_hasNext(zoneFormatting)) {
-        UResourceBundle *currentZone = ures_getNextResource(zoneFormatting,NULL,&status);
-        if (U_FAILURE(status)) {
-             break;
-        }
-        
-        const char *currentZoneString= ures_getKey(currentZone);
-
-        UResourceBundle *zoneAliases = ures_getByKey(currentZone,gAliases,NULL, &status);
-        if (U_FAILURE(status)) {
-            status = U_ZERO_ERROR;
-            ures_close(currentZone);
-            continue;
-        }
-        while ( ures_hasNext(zoneAliases)) {
-            int32_t len;
-            const UChar* alias = ures_getNextString(zoneAliases,&len,NULL,&status);
-            if ( zid.compare(alias)==0 ) {
-                zid.setTo(UnicodeString(currentZoneString, -1, US_INV));
-                zid.findAndReplace(colon,solidus);
-                ures_close(zoneAliases);
-                ures_close(currentZone);
-                ures_close(zoneFormatting);
-                ures_close(supplementalDataBundle);
-                return;
-            }     
-        }   
-        ures_close(zoneAliases);
-        ures_close(currentZone);
-    }
-    ures_close(zoneFormatting);
-    ures_close(supplementalDataBundle);
-}
 //----------------------------------------------------------------------
-
 void
 SimpleDateFormat::zeroPaddingNumber(UnicodeString &appendTo, int32_t value, int32_t minDigits, int32_t maxDigits) const
 {
@@ -1073,9 +1255,8 @@
     UBool ambiguousYear[] = { FALSE };
     int32_t count = 0;
 
-    // hack, clear parsedTimeZone, cast away const
-    delete parsedTimeZone;
-    ((SimpleDateFormat*)this)->parsedTimeZone = NULL;
+    // hack, reset tztype, cast away const
+    ((SimpleDateFormat*)this)->tztype = TZTYPE_UNK;
 
     // For parsing abutting numeric fields. 'abutPat' is the
     // offset into 'pattern' of the first of 2 or more abutting
@@ -1271,39 +1452,127 @@
     // front or the back of the default century.  This only works because we adjust
     // the year correctly to start with in other cases -- see subParse().
     UErrorCode status = U_ZERO_ERROR;
-    if (ambiguousYear[0] || parsedTimeZone != NULL) // If this is true then the two-digit year == the default start year
+    if (ambiguousYear[0] || tztype != TZTYPE_UNK) // If this is true then the two-digit year == the default start year
     {
         // We need a copy of the fields, and we need to avoid triggering a call to
         // complete(), which will recalculate the fields.  Since we can't access
         // the fields[] array in Calendar, we clone the entire object.  This will
         // stop working if Calendar.clone() is ever rewritten to call complete().
-        Calendar *copy = cal.clone();
+        Calendar *copy;
         if (ambiguousYear[0]) {
+            copy = cal.clone();
             UDate parsedDate = copy->getTime(status);
             // {sfb} check internalGetDefaultCenturyStart
             if (fHaveDefaultCentury && (parsedDate < fDefaultCenturyStart)) {
                 // We can't use add here because that does a complete() first.
                 cal.set(UCAL_YEAR, fDefaultCenturyStartYear + 100);
             }
+            delete copy;
         }
 
-        if (parsedTimeZone != NULL) {
-            TimeZone *tz = parsedTimeZone;
+        if (tztype != TZTYPE_UNK) {
+            copy = cal.clone();
+            const TimeZone & tz = cal.getTimeZone();
+            BasicTimeZone *btz = NULL;
 
-            // the calendar represents the parse as gmt time
-            // we need to turn this into local time, so we add the raw offset
-            // then we ask the timezone to handle this local time
-            int32_t rawOffset = 0;
-            int32_t dstOffset = 0;
-            tz->getOffset(copy->getTime(status)+tz->getRawOffset(), TRUE, 
-                rawOffset, dstOffset, status);
-            if (U_SUCCESS(status)) {
-                cal.set(UCAL_ZONE_OFFSET, rawOffset);
-                cal.set(UCAL_DST_OFFSET, dstOffset);
+            if (tz.getDynamicClassID() == OlsonTimeZone::getStaticClassID()
+                || tz.getDynamicClassID() == SimpleTimeZone::getStaticClassID()
+                || tz.getDynamicClassID() == RuleBasedTimeZone::getStaticClassID()
+                || tz.getDynamicClassID() == VTimeZone::getStaticClassID()) {
+                btz = (BasicTimeZone*)&tz;
             }
+
+            // Get local millis
+            copy->set(UCAL_ZONE_OFFSET, 0);
+            copy->set(UCAL_DST_OFFSET, 0);
+            UDate localMillis = copy->getTime(status);
+
+            // Make sure parsed time zone type (Standard or Daylight)
+            // matches the rule used by the parsed time zone.
+            int32_t raw, dst;
+            if (btz != NULL) {
+                if (tztype == TZTYPE_STD) {
+                    btz->getOffsetFromLocal(localMillis,
+                        BasicTimeZone::kStandard, BasicTimeZone::kStandard, raw, dst, status);
+                } else {
+                    btz->getOffsetFromLocal(localMillis,
+                        BasicTimeZone::kDaylight, BasicTimeZone::kDaylight, raw, dst, status);
+                }
+            } else {
+                // No good way to resolve ambiguous time at transition,
+                // but following code work in most case.
+                tz.getOffset(localMillis, TRUE, raw, dst, status);
+            }
+
+            // Now, compare the results with parsed type, either standard or daylight saving time
+            int32_t resolvedSavings = dst;
+            if (tztype == TZTYPE_STD) {
+                if (dst != 0) {
+                    // Override DST_OFFSET = 0 in the result calendar
+                    resolvedSavings = 0;
+                }
+            } else { // tztype == TZTYPE_DST
+                if (dst == 0) {
+                    if (btz != NULL) {
+                        UDate time = localMillis + raw;
+                        // We use the nearest daylight saving time rule.
+                        TimeZoneTransition beforeTrs, afterTrs;
+                        UDate beforeT = time, afterT = time;
+                        int32_t beforeSav = 0, afterSav = 0;
+                        UBool beforeTrsAvail, afterTrsAvail;
+
+                        // Search for DST rule before or on the time
+                        while (TRUE) {
+                            beforeTrsAvail = btz->getPreviousTransition(beforeT, TRUE, beforeTrs);
+                            if (!beforeTrsAvail) {
+                                break;
+                            }
+                            beforeT = beforeTrs.getTime() - 1;
+                            beforeSav = beforeTrs.getFrom()->getDSTSavings();
+                            if (beforeSav != 0) {
+                                break;
+                            }
+                        }
+
+                        // Search for DST rule after the time
+                        while (TRUE) {
+                            afterTrsAvail = btz->getNextTransition(afterT, FALSE, afterTrs);
+                            if (!afterTrsAvail) {
+                                break;
+                            }
+                            afterT = afterTrs.getTime();
+                            afterSav = afterTrs.getTo()->getDSTSavings();
+                            if (afterSav != 0) {
+                                break;
+                            }
+                        }
+
+                        if (beforeTrsAvail && afterTrsAvail) {
+                            if (time - beforeT > afterT - time) {
+                                resolvedSavings = afterSav;
+                            } else {
+                                resolvedSavings = beforeSav;
+                            }
+                        } else if (beforeTrsAvail && beforeSav != 0) {
+                            resolvedSavings = beforeSav;
+                        } else if (afterTrsAvail && afterSav != 0) {
+                            resolvedSavings = afterSav;
+                        } else {
+                            resolvedSavings = btz->getDSTSavings();
+                        }
+                    } else {
+                        resolvedSavings = tz.getDSTSavings();
+                    }
+                    if (resolvedSavings == 0) {
+                        // final fallback
+                        resolvedSavings = U_MILLIS_PER_HOUR;
+                    }
+                }
+            }
+            cal.set(UCAL_ZONE_OFFSET, raw);
+            cal.set(UCAL_DST_OFFSET, resolvedSavings);
+            delete copy;
         }
-
-        delete copy;
     }
 
     // If any Calendar calls failed, we pretend that we
@@ -1785,127 +2054,153 @@
     case UDAT_TIMEZONE_FIELD:
     case UDAT_TIMEZONE_RFC_FIELD:
     case UDAT_TIMEZONE_GENERIC_FIELD:
+    case UDAT_TIMEZONE_SPECIAL_FIELD:
         {
-        // First try to parse generic forms such as GMT-07:00. Do this first
-        // in case localized DateFormatZoneData contains the string "GMT"
-        // for a zone; in that case, we don't want to match the first three
-        // characters of GMT+/-HH:MM etc.
+            int32_t offset = 0;
+            UBool parsed = FALSE;
 
-        int32_t sign = 0;
-        int32_t offset;
-        int32_t gmtLen = u_strlen(gGmt);
+            // Step 1
+            // Check if this is a long GMT offset string (either localized or default)
+            offset = parseGMT(text, pos);
+            if (pos.getIndex() - start > 0) {
+                parsed = TRUE;
+            }
+            if (!parsed) {
+                // Step 2
+                // Check if this is an RFC822 time zone offset.
+                // ICU supports the standard RFC822 format [+|-]HHmm
+                // and its extended form [+|-]HHmmSS.
+                do {
+                    int32_t sign = 0;
+                    UChar signChar = text.charAt(start);
+                    if (signChar == (UChar)0x002B /* '+' */) {
+                        sign = 1;
+                    } else if (signChar == (UChar)0x002D /* '-' */) {
+                        sign = -1;
+                    } else {
+                        // Not an RFC822 offset string
+                        break;
+                    }
 
-        // For time zones that have no known names, look for strings
-        // of the form:
-        //    GMT[+-]hours:minutes or
-        //    GMT[+-]hhmm or
-        //    GMT.
-        
-        if ((text.length() - start) >= gmtLen &&
-            (text.caseCompare(start, gmtLen, gGmt, 0, gmtLen, U_FOLD_CASE_DEFAULT)) == 0)
-          {
-            cal.set(UCAL_DST_OFFSET, 0);
+                    // Parse digits
+                    int32_t orgPos = start + 1;
+                    pos.setIndex(orgPos);
+                    parseInt(text, number, 6, pos, FALSE);
+                    int32_t numLen = pos.getIndex() - orgPos;
+                    if (numLen <= 0) {
+                        break;
+                    }
 
-            pos.setIndex(start + gmtLen);
+                    // Followings are possible format (excluding sign char)
+                    // HHmmSS
+                    // HmmSS
+                    // HHmm
+                    // Hmm
+                    // HH
+                    // H
+                    int32_t val = number.getLong();
+                    int32_t hour = 0, min = 0, sec = 0;
+                    switch(numLen) {
+                    case 1: // H
+                    case 2: // HH
+                        hour = val;
+                        break;
+                    case 3: // Hmm
+                    case 4: // HHmm
+                        hour = val / 100;
+                        min = val % 100;
+                        break;
+                    case 5: // Hmmss
+                    case 6: // HHmmss
+                        hour = val / 10000;
+                        min = (val % 10000) / 100;
+                        sec = val % 100;
+                        break;
+                    }
+                    if (hour > 23 || min > 59 || sec > 59) {
+                        // Invalid value range
+                        break;
+                    }
+                    offset = (((hour * 60) + min) * 60 + sec) * 1000 * sign;
+                    parsed = TRUE;
+                } while (FALSE);
 
-            if( text[pos.getIndex()] == 0x002B /*'+'*/ )
-              sign = 1;
-            else if( text[pos.getIndex()] == 0x002D /*'-'*/ )
-              sign = -1;
-            else {
-              cal.set(UCAL_ZONE_OFFSET, 0 );
-              return pos.getIndex();
+                if (!parsed) {
+                    // Failed to parse.  Reset the position.
+                    pos.setIndex(start);
+                }
             }
 
-            // Look for hours:minutes or hhmm.
-            pos.setIndex(pos.getIndex() + 1);
-            int32_t parseStart = pos.getIndex();
-            Formattable tzNumber;
-            fNumberFormat->parse(text, tzNumber, pos);
-            if( pos.getIndex() == parseStart) {
-              return -start;
+            if (parsed) {
+                // offset was successfully parsed as either a long GMT string or RFC822 zone offset
+                // string.  Create normalized zone ID for the offset.
+                
+                UnicodeString tzID(gGmt);
+                formatRFC822TZ(tzID, offset);
+                //TimeZone *customTZ = TimeZone::createTimeZone(tzID);
+                TimeZone *customTZ = new SimpleTimeZone(offset, tzID);    // faster than TimeZone::createTimeZone
+                cal.adoptTimeZone(customTZ);
+
+                return pos.getIndex();
             }
-            if( text[pos.getIndex()] == 0x003A /*':'*/ ) {
-              // This is the hours:minutes case
-              offset = tzNumber.getLong() * 60;
-              pos.setIndex(pos.getIndex() + 1);
-              parseStart = pos.getIndex();
-              fNumberFormat->parse(text, tzNumber, pos);
-              if( pos.getIndex() == parseStart) {
-                return -start;
-              }
-              offset += tzNumber.getLong();
-            }
-            else {
-              // This is the hhmm case.
-              offset = tzNumber.getLong();
-              if( offset < 24 )
-                offset *= 60;
-              else
-                offset = offset % 100 + offset / 100 * 60;
-            }
 
-            // Fall through for final processing below of 'offset' and 'sign'.
-          }
-        else {
+            // Step 3
             // At this point, check for named time zones by looking through
             // the locale data from the DateFormatZoneData strings.
             // Want to be able to parse both short and long forms.
-                        // !!! side effect, might set parsedZoneString 
-            UErrorCode status = U_ZERO_ERROR;
-            int32_t result = subParseZoneString(text, start, cal, status);
-            if (result != 0) {
-                return result;
-            }
+            // optimize for calendar's current time zone
+            const ZoneStringFormat *zsf = fSymbols->getZoneStringFormat();
+            if (zsf) {
+                UErrorCode status = U_ZERO_ERROR;
+                const ZoneStringInfo *zsinfo = NULL;
+                int32_t matchLen;
 
-            // As a last resort, look for numeric timezones of the form
-            // [+-]hhmm as specified by RFC 822.  This code is actually
-            // a little more permissive than RFC 822.  It will try to do
-            // its best with numbers that aren't strictly 4 digits long
-            DecimalFormat fmt(UNICODE_STRING_SIMPLE("+####;-####"), status);
-            if(U_FAILURE(status))
-                return -start;
-            fmt.setParseIntegerOnly(TRUE);
-            int32_t parseStart = pos.getIndex();
-            Formattable tzNumber;
-            fmt.parse( text, tzNumber, pos );
-            if( pos.getIndex() == parseStart) {
-                return -start;   // Wasn't actually a number.
-            }
-            offset = tzNumber.getLong();
-            sign = 1;
-            if( offset < 0 ) {
-                sign = -1;
-                offset = -offset;
-            }
-            if( offset < 24 )
-                offset = offset * 60;
-            else
-                offset = offset % 100 + offset / 100 * 60;
+                switch (patternCharIndex) {
+                    case UDAT_TIMEZONE_FIELD: // 'z'
+                        if (count < 4) {
+                            zsinfo = zsf->findSpecificShort(text, start, matchLen, status);
+                        } else {
+                            zsinfo = zsf->findSpecificLong(text, start, matchLen, status);
+                        }
+                        break;
+                    case UDAT_TIMEZONE_GENERIC_FIELD: // 'v'
+                        if (count == 1) {
+                            zsinfo = zsf->findGenericShort(text, start, matchLen, status);
+                        } else if (count == 4) {
+                            zsinfo = zsf->findGenericLong(text, start, matchLen, status);
+                        }
+                        break;
+                    case UDAT_TIMEZONE_SPECIAL_FIELD: // 'V'
+                        if (count == 1) {
+                            zsinfo = zsf->findSpecificShort(text, start, matchLen, status);
+                        } else if (count == 4) {
+                            zsinfo = zsf->findGenericLocation(text, start, matchLen, status);
+                        }
+                        break;
+                }
 
-            // Fall through for final processing below of 'offset' and 'sign'.
-        }
+                if (U_SUCCESS(status) && zsinfo != NULL) {
+                    if (zsinfo->isStandard()) {
+                        ((SimpleDateFormat*)this)->tztype = TZTYPE_STD;
+                    } else if (zsinfo->isDaylight()) {
+                        ((SimpleDateFormat*)this)->tztype = TZTYPE_DST;
+                    }
+                    UnicodeString tzid;
+                    zsinfo->getID(tzid);
 
-        // Do the final processing for both of the above cases.  We only
-        // arrive here if the form GMT+/-... or an RFC 822 form was seen.
-        if (sign != 0)
-        {
-            offset *= U_MILLIS_PER_MINUTE * sign;
-
-            if (cal.getTimeZone().useDaylightTime())
-            {
-                cal.set(UCAL_DST_OFFSET, U_MILLIS_PER_HOUR);
-                offset -= U_MILLIS_PER_HOUR;
+                    UnicodeString current;
+                    cal.getTimeZone().getID(current);
+                    if (tzid != current) {
+                        TimeZone *tz = TimeZone::createTimeZone(tzid);
+                        cal.adoptTimeZone(tz);
+                    }
+                    return start + matchLen;
+                }
             }
-            cal.set(UCAL_ZONE_OFFSET, offset);
-
-            return pos.getIndex();
+            // complete failure
+            return -start;
         }
 
-        // All efforts to parse a zone failed.
-        return -start;
-        }
-
     default:
         // Handle "generic" fields
         int32_t parseStart = pos.getIndex();
@@ -1928,61 +2223,6 @@
     }
 }
 
-int32_t
-SimpleDateFormat::subParseZoneString(const UnicodeString& text, int32_t start, Calendar& cal, UErrorCode& status) const
-{
-  // At this point, check for named time zones by looking through
-  // the locale data from the DateFormatZoneData strings.
-  // Want to be able to parse both short and long forms.
-
-  // optimize for calendar's current time zone
-  TimeZone *tz = NULL;
-  UnicodeString id;  
-  UnicodeString zid, value;
-  DateFormatSymbols::TimeZoneTranslationType type = DateFormatSymbols::TIMEZONE_COUNT;
-  fSymbols->getZoneID(getTimeZone().getID(id), zid, status);
-  if(zid.length() > 0){
-      fSymbols->findZoneIDTypeValue(zid, text, start, type, value, status);
-      if(type != DateFormatSymbols::TIMEZONE_COUNT) {
-          tz = TimeZone::createTimeZone(zid);
-      }
-  }
-  
-  if(U_FAILURE(status)){
-      return 0;
-  }
-  if (tz != NULL) { // Matched any ?
-    // always set zone offset, needed to get correct hour in wall time
-    // when checking daylight savings
-    cal.set(UCAL_ZONE_OFFSET, tz->getRawOffset());
-    if (type==DateFormatSymbols::TIMEZONE_SHORT_STANDARD || type==DateFormatSymbols::TIMEZONE_LONG_STANDARD ) {
-      // standard time
-      cal.set(UCAL_DST_OFFSET, 0);
-      delete tz; tz = NULL;
-    } else if (type==DateFormatSymbols::TIMEZONE_SHORT_DAYLIGHT || type==DateFormatSymbols::TIMEZONE_LONG_DAYLIGHT ) {
-      // daylight time
-      // !!! todo - no getDSTSavings() in ICU's timezone
-      // use the correct DST SAVINGS for the zone.
-      // cal.set(UCAL_DST_OFFSET, tz->getDSTSavings());
-      cal.set(UCAL_DST_OFFSET, U_MILLIS_PER_HOUR);
-      delete tz; tz = NULL;
-    } else { 
-      // either standard or daylight
-      // need to finish getting the date, then compute dst offset as appropriate
-
-      // !!! hack for api compatibility, can't modify subParse(...) so can't
-      // pass this back any other way.  cast away const.
-      ((SimpleDateFormat*)this)->parsedTimeZone = tz;
-    }
-
-    return start + value.length();
-  }
-  
-
-  // complete failure
-  return 0;
-}
-
 /**
  * Parse an integer using fNumberFormat.  This method is semantically
  * const, but actually may modify fNumberFormat.
@@ -1991,6 +2231,17 @@
                                 Formattable& number,
                                 ParsePosition& pos,
                                 UBool allowNegative) const {
+    parseInt(text, number, -1, pos, allowNegative);
+}
+
+/**
+ * Parse an integer using fNumberFormat up to maxDigits.
+ */
+void SimpleDateFormat::parseInt(const UnicodeString& text,
+                                Formattable& number,
+                                int32_t maxDigits,
+                                ParsePosition& pos,
+                                UBool allowNegative) const {
     UnicodeString oldPrefix;
     DecimalFormat* df = NULL;
     if (!allowNegative &&
@@ -1999,10 +2250,27 @@
         df->getNegativePrefix(oldPrefix);
         df->setNegativePrefix(SUPPRESS_NEGATIVE_PREFIX);
     }
+    int32_t oldPos = pos.getIndex();
     fNumberFormat->parse(text, number, pos);
     if (df != NULL) {
         df->setNegativePrefix(oldPrefix);
     }
+
+    if (maxDigits > 0) {
+        // adjust the result to fit into
+        // the maxDigits and move the position back
+        int32_t nDigits = pos.getIndex() - oldPos;
+        if (nDigits > maxDigits) {
+            int32_t val = number.getLong();
+            nDigits -= maxDigits;
+            while (nDigits > 0) {
+                val /= 10;
+                nDigits--;
+            }
+            pos.setIndex(oldPos + maxDigits);
+            number.setLong(val);
+        }
+    }
 }
 
 //----------------------------------------------------------------------

Modified: trunk/source/i18n/timezone.cpp
===================================================================
--- trunk/source/i18n/timezone.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/i18n/timezone.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -88,6 +88,7 @@
 #define kDEFAULT  "Default"
 #define kMAX_CUSTOM_HOUR    23
 #define kMAX_CUSTOM_MIN     59
+#define kMAX_CUSTOM_SEC     59
 #define MINUS 0x002D
 #define PLUS 0x002B
 #define ZERO_DIGIT 0x0030
@@ -100,6 +101,7 @@
 static const int32_t       GMT_ID_LENGTH = 3;
 
 static UMTX                             LOCK;
+static UMTX                             TZSET_LOCK;
 static U_NAMESPACE_QUALIFIER TimeZone*  DEFAULT_ZONE = NULL;
 static U_NAMESPACE_QUALIFIER TimeZone*  _GMT = NULL; // cf. TimeZone::GMT
 
@@ -129,6 +131,10 @@
         umtx_destroy(&LOCK);
         LOCK = NULL;
     }
+    if (TZSET_LOCK) {
+        umtx_destroy(&TZSET_LOCK);
+        TZSET_LOCK = NULL;
+    }
 
     return TRUE;
 }
@@ -511,12 +517,19 @@
     // First, try to create a system timezone, based
     // on the string ID in tzname[0].
     {
-        // NOTE: Global mutex here; TimeZone mutex above
-        // mutexed to avoid threading issues in the platform fcns.
-        // Some of the locale/timezone OS functions may not be thread safe, 
-        //  so the intent is that any setting from anywhere within ICU 
-        //  happens with the ICU global mutex held.
-        Mutex lock;
+        // NOTE: Local mutex here. TimeZone mutex below
+        // mutexed to avoid threading issues in the platform functions.
+        // Some of the locale/timezone OS functions may not be thread safe,
+        // so the intent is that any setting from anywhere within ICU
+        // happens while the ICU mutex is held.
+        // The operating system might actually use ICU to implement timezones.
+        // So we may have ICU calling ICU here, like on AIX.
+        // In order to prevent a double lock of a non-reentrant mutex in a
+        // different part of ICU, we use TZSET_LOCK to allow only one instance
+        // of ICU to query these thread unsafe OS functions at any given time.
+        Mutex lock(&TZSET_LOCK);
+
+        ucln_i18n_registerCleanup(UCLN_I18N_TIMEZONE, timeZone_cleanup);
         uprv_tzset(); // Initialize tz... system data
         
         // Get the timezone ID from the host.  This function should do
@@ -529,6 +542,13 @@
         rawOffset = uprv_timezone() * -U_MILLIS_PER_SECOND;
     }
 
+    UBool initialized;
+    UMTX_CHECK(&LOCK, (DEFAULT_ZONE != NULL), initialized);
+    if (initialized) {
+        /* Hrmph? Either a race condition happened, or tzset initialized ICU. */
+        return;
+    }
+
     TimeZone* default_zone = NULL;
 
     /* Make sure that the string is NULL terminated to prevent BoundsChecker/Purify warnings. */
@@ -617,13 +637,13 @@
 {
     /* This is here to prevent race conditions. */
     UBool needsInit;
-    UMTX_CHECK(&LOCK, (DEFAULT_ZONE == 0), needsInit);
+    UMTX_CHECK(&LOCK, (DEFAULT_ZONE == NULL), needsInit);
     if (needsInit) {
         initDefault();
     }
 
     Mutex lock(&LOCK); // In case adoptDefault is called
-    return DEFAULT_ZONE->clone();
+    return (DEFAULT_ZONE != NULL) ? DEFAULT_ZONE->clone() : NULL;
 }
 
 // -------------------------------------
@@ -668,36 +688,40 @@
     }
 
     rawOffset = getRawOffset();
-
-    // Convert to local wall millis if necessary
     if (!local) {
         date += rawOffset; // now in local standard millis
     }
 
-    // When local==FALSE, we might have to recompute. This loop is
-    // executed once, unless a recomputation is required; then it is
-    // executed twice.
+    // When local == TRUE, date might not be in local standard
+    // millis.  getOffset taking 7 parameters used here assume
+    // the given time in day is local standard time.
+    // At STD->DST transition, there is a range of time which
+    // does not exist.  When 'date' is in this time range
+    // (and local == TRUE), this method interprets the specified
+    // local time as DST.  At DST->STD transition, there is a
+    // range of time which occurs twice.  In this case, this
+    // method interprets the specified local time as STD.
+    // To support the behavior above, we need to call getOffset
+    // (with 7 args) twice when local == true and DST is
+    // detected in the initial call.
     for (int32_t pass=0; ; ++pass) {
         int32_t year, month, dom, dow;
         double day = uprv_floor(date / U_MILLIS_PER_DAY);
         int32_t millis = (int32_t) (date - day * U_MILLIS_PER_DAY);
-        
+
         Grego::dayToFields(day, year, month, dom, dow);
-        
+
         dstOffset = getOffset(GregorianCalendar::AD, year, month, dom,
                               (uint8_t) dow, millis,
                               Grego::monthLength(year, month),
                               ec) - rawOffset;
 
-        // Recompute if local==FALSE, dstOffset!=0, and addition of
-        // the dstOffset puts us in a different day.
-        if (pass!=0 || local || dstOffset==0) {
+        // Recompute if local==TRUE, dstOffset!=0.
+        if (pass!=0 || !local || dstOffset == 0) {
             break;
         }
-        date += dstOffset;
-        if (uprv_floor(date / U_MILLIS_PER_DAY) == day) {
-            break;
-        }
+        // adjust to local standard millis
+        date -= dstOffset;
     }
 }
 
@@ -1074,7 +1098,34 @@
 
 // ---------------------------------------
 
+UnicodeString&
+TimeZone::getOlsonCanonicalID(const UnicodeString &id, UnicodeString &canonical) {
+    UErrorCode ec = U_ZERO_ERROR;
+    canonical.remove();
+    UResourceBundle *top = ures_openDirect(0, kZONEINFO, &ec);
+    UResourceBundle *res = getZoneByName(top, id, NULL, ec);
+    if (U_SUCCESS(ec)) {
+        if (ures_getSize(res) == 1) {
+            int32_t deref = ures_getInt(res, &ec);
+            UResourceBundle *nres = ures_getByKey(top, kNAMES, NULL, &ec); // dereference Names section
+            int32_t len;
+            const UChar* tmp = ures_getStringByIndex(nres, deref, &len, &ec);
+            if (U_SUCCESS(ec)) {
+                canonical.setTo(tmp, len);
+            }
+            ures_close(nres);
+        } else {
+            canonical.setTo(id);
+        }
+    }
+    ures_close(res);
+    ures_close(top);
+    return canonical;
+}
 
+// ---------------------------------------
+
+
 UnicodeString&
 TimeZone::getDisplayName(UnicodeString& result) const
 {
@@ -1173,11 +1224,12 @@
         UBool negative = FALSE;
         int32_t hour = 0;
         int32_t min = 0;
+        int32_t sec = 0;
 
         if (id[pos.getIndex()] == MINUS /*'-'*/)
             negative = TRUE;
         else if (id[pos.getIndex()] != PLUS /*'+'*/)
-            return 0;
+            return NULL;
         pos.setIndex(pos.getIndex() + 1);
 
         UErrorCode success = U_ZERO_ERROR;
@@ -1196,75 +1248,125 @@
         numberFormat->parse(id, n, pos);
         if (pos.getIndex() == start) {
             delete numberFormat;
-            return 0;
+            return NULL;
         }
         hour = n.getLong();
 
-        if (pos.getIndex() < id.length() &&
-            id[pos.getIndex()] == 0x003A /*':'*/)
-        {
+        if (pos.getIndex() < id.length()) {
+            if (pos.getIndex() - start > 2
+                || id[pos.getIndex()] != 0x003A /*':'*/) {
+                delete numberFormat;
+                return NULL;
+            }
             // hh:mm
             pos.setIndex(pos.getIndex() + 1);
             int32_t oldPos = pos.getIndex();
             n.setLong(kParseFailed);
             numberFormat->parse(id, n, pos);
-            if (pos.getIndex() == oldPos) {
+            if ((pos.getIndex() - oldPos) != 2) {
+                // must be 2 digits
                 delete numberFormat;
-                return 0;
+                return NULL;
             }
             min = n.getLong();
-        }
-        else 
-        {
-            // hhmm or hh
+            if (pos.getIndex() < id.length()) {
+                if (id[pos.getIndex()] != 0x003A /*':'*/) {
+                    delete numberFormat;
+                    return NULL;
+                }
+                // [:ss]
+                pos.setIndex(pos.getIndex() + 1);
+                oldPos = pos.getIndex();
+                n.setLong(kParseFailed);
+                numberFormat->parse(id, n, pos);
+                if (pos.getIndex() != id.length()
+                        || (pos.getIndex() - oldPos) != 2) {
+                    delete numberFormat;
+                    return NULL;
+                }
+                sec = n.getLong();
+            }
+        } else {
+            // Supported formats are below -
+            //
+            // HHmmss
+            // Hmmss
+            // HHmm
+            // Hmm
+            // HH
+            // H
 
-            // Be strict about interpreting something as hh; it must be
-            // an offset < 23, and it must be one or two digits. Thus
-            // 0010 is interpreted as 00:10, but 10 is interpreted as
-            // 10:00.
-            if (hour > kMAX_CUSTOM_HOUR || (pos.getIndex() - start) > 2) {
-                min = hour % 100;
-                hour /= 100;
+            int32_t length = pos.getIndex() - start;
+            if (length <= 0 || 6 < length) {
+                // invalid length
+                delete numberFormat;
+                return NULL;
             }
+            switch (length) {
+                case 1:
+                case 2:
+                    // already set to hour
+                    break;
+                case 3:
+                case 4:
+                    min = hour % 100;
+                    hour /= 100;
+                    break;
+                case 5:
+                case 6:
+                    sec = hour % 100;
+                    min = (hour/100) % 100;
+                    hour /= 10000;
+                    break;
+            }
         }
 
         delete numberFormat;
 
-        if (hour > kMAX_CUSTOM_HOUR || min > kMAX_CUSTOM_MIN) {
+        if (hour > kMAX_CUSTOM_HOUR || min > kMAX_CUSTOM_MIN || sec > kMAX_CUSTOM_SEC) {
             return 0;
         }
 
-        // Create time zone ID in RFC822 format - GMT[+|-]hhmm
-        UnicodeString tzRFC(GMT_ID);
-        if (hour|min) {
+        // Create time zone ID - GMT[+|-]hhmm[ss]
+        UnicodeString tzID(GMT_ID);
+        if (hour | min | sec) {
             if (negative) {
-                tzRFC += (UChar)MINUS;
+                tzID += (UChar)MINUS;
             } else {
-                tzRFC += (UChar)PLUS;
+                tzID += (UChar)PLUS;
             }
 
             if (hour < 10) {
-                tzRFC += (UChar)ZERO_DIGIT;
+                tzID += (UChar)ZERO_DIGIT;
             } else {
-                tzRFC += (UChar)(ZERO_DIGIT + hour/10);
+                tzID += (UChar)(ZERO_DIGIT + hour/10);
             }
-            tzRFC += (UChar)(ZERO_DIGIT + hour%10);
+            tzID += (UChar)(ZERO_DIGIT + hour%10);
 
             if (min < 10) {
-                tzRFC += (UChar)ZERO_DIGIT;
+                tzID += (UChar)ZERO_DIGIT;
             } else {
-                tzRFC += (UChar)(ZERO_DIGIT + min/10);
+                tzID += (UChar)(ZERO_DIGIT + min/10);
             }
-            tzRFC += (UChar)(ZERO_DIGIT + min%10);
+            tzID += (UChar)(ZERO_DIGIT + min%10);
+
+            if (sec) {
+                if (sec < 10) {
+                    tzID += (UChar)ZERO_DIGIT;
+                } else {
+                    tzID += (UChar)(ZERO_DIGIT + sec/10);
+                }
+                tzID += (UChar)(ZERO_DIGIT + sec%10);
+            }
         }
 
-        int32_t offset = (hour * 60 + min) * 60 * 1000;
-        if(negative) {
+        int32_t offset = ((hour * 60 + min) * 60 + sec) * 1000;
+        if (negative) {
             offset = -offset;
         }
-        return new SimpleTimeZone(offset, tzRFC);
+        return new SimpleTimeZone(offset, tzID);
     }
-    return 0;
+    return NULL;
 }
 
 

Modified: trunk/source/i18n/ucln_in.h
===================================================================
--- trunk/source/i18n/ucln_in.h	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/i18n/ucln_in.h	2008-03-24 11:52:37 UTC (rev 144)
@@ -39,6 +39,8 @@
     UCLN_I18N_UCOL,
     UCLN_I18N_UCOL_BLD,
     UCLN_I18N_CSDET,
+    UCLN_I18N_ZONEMETA,
+    UCLN_I18N_ZSFORMAT,
     UCLN_I18N_COUNT /* This must be last */
 } ECleanupI18NType;
 

Modified: trunk/source/i18n/ucol.cpp
===================================================================
--- trunk/source/i18n/ucol.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/i18n/ucol.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -6054,6 +6054,8 @@
               level = UCOL_PSK_QUIN;
               break;
           }
+		  if(CE==0)
+			  continue;
           if(isShiftedCE(CE, LVT, &wasShifted)) {
             CE >>= 16; /* get primary */
             if(CE != 0) {

Modified: trunk/source/i18n/ucol_bld.cpp
===================================================================
--- trunk/source/i18n/ucol_bld.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/i18n/ucol_bld.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -27,6 +27,7 @@
 #include "ucln_in.h" 
 #include "umutex.h"
 #include "unicode/uniset.h"
+#include "unormimp.h"
 
 static const InverseUCATableHeader* _staticInvUCA = NULL;
 static UDataMemory* invUCA_DATA_MEM = NULL;
@@ -825,6 +826,7 @@
     UColToken *tok = lh->first;
     UColToken *expt = NULL;
     uint32_t i = 0, j = 0;
+    const uint16_t  *fcdTrieData = unorm_getFCDTrie(status);
 
     while(tok != NULL && U_SUCCESS(*status)) {
         /* first, check if there are any expansions */
@@ -912,11 +914,26 @@
             uprv_memcpy(el.uchars, (tok->source & 0x00FFFFFF) + src->source, el.cSize*sizeof(UChar));
         }
         if(src->UCA != NULL) {
+            UBool containCombinMarks = FALSE;
             for(i = 0; i<el.cSize; i++) {
                 if(UCOL_ISJAMO(el.cPoints[i])) {
                     t->image->jamoSpecial = TRUE;
                 }
+                if ( !src->buildCCTabFlag ) {
+                    // check combining class
+                    int16_t fcd = unorm_getFCD16(fcdTrieData, el.cPoints[i]);
+                    if ( (fcd && 0xff) == 0 ) {
+                        // reset flag when current char is not combining mark.
+                        containCombinMarks = FALSE;  
+                    }
+                    else {
+                        containCombinMarks = TRUE;
+                    }
+                }
             }
+            if ( !src->buildCCTabFlag && containCombinMarks ) {
+                src->buildCCTabFlag = TRUE;
+            }
         }
 
         /* and then, add it */
@@ -1214,11 +1231,9 @@
     // Add completely ignorable elements
     utrie_enum(&t->UCA->mapping, NULL, _processUCACompleteIgnorables, t);
 
+    // add tailoring characters related canonical closures
+    uprv_uca_canonicalClosure(t, src, status);
 
-    // canonical closure
-    uprv_uca_canonicalClosure(t, status);
-
-
     /* still need to produce compatibility closure */
 
     UCATableHeader *myData = uprv_uca_assembleTable(t, status);  

Modified: trunk/source/i18n/ucol_elm.cpp
===================================================================
--- trunk/source/i18n/ucol_elm.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/i18n/ucol_elm.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -1,7 +1,8 @@
+
 /*
 *******************************************************************************
 *
-*   Copyright (C) 2001-2006, International Business Machines
+*   Copyright (C) 2001-2007, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *
 *******************************************************************************
@@ -32,6 +33,7 @@
 #include "unicode/ucoleitr.h"
 #include "unicode/normlzr.h"
 #include "ucol_elm.h"
+#include "ucol_tok.h"
 #include "unormimp.h"
 #include "unicode/caniter.h"
 #include "cmemory.h"
@@ -203,6 +205,7 @@
     }
     uprv_memset(t->unsafeCP, 0, UCOL_UNSAFECP_TABLE_SIZE);
     uprv_memset(t->contrEndCP, 0, UCOL_UNSAFECP_TABLE_SIZE);
+    t->cmLookup = NULL;
     return t;
 
 allocation_failure:
@@ -391,6 +394,11 @@
 
         uprv_free(t->unsafeCP);
         uprv_free(t->contrEndCP);
+        
+        if (t->cmLookup != NULL) {
+            uprv_free(t->cmLookup->cPoints);
+            uprv_free(t->cmLookup);
+        }
 
         uprv_free(t);
     }
@@ -675,27 +683,96 @@
     *htByte |= (1 << (hash & 7));
 }
 
+static void
+uprv_uca_createCMTable(tempUCATable *t, int32_t noOfCM, UErrorCode *status) {
+    t->cmLookup = (CombinClassTable *)uprv_malloc(sizeof(CombinClassTable));
+    if (t->cmLookup==NULL) {
+        *status = U_MEMORY_ALLOCATION_ERROR;
+        return;
+    }
+    t->cmLookup->cPoints=(UChar *)uprv_malloc(noOfCM*sizeof(UChar));
+    if (t->cmLookup->cPoints ==NULL) {
+        uprv_free(t->cmLookup);
+        t->cmLookup = NULL;
+        *status = U_MEMORY_ALLOCATION_ERROR;
+        return;
+    }
 
-/*  to the UnsafeCP hash table, add all chars with combining class != 0     */
+    t->cmLookup->size=noOfCM;
+    uprv_memset(t->cmLookup->index, 0, sizeof(t->cmLookup->index));
+
+    return;
+}
+
+static void
+uprv_uca_copyCMTable(tempUCATable *t, UChar *cm, uint16_t *index) {
+    int32_t count=0;
+
+    for (int32_t i=0; i<256; ++i) {
+        if (index[i]>0) {
+            // cPoints is ordered by combining class value.
+            uprv_memcpy(t->cmLookup->cPoints+count, cm+(i<<8), index[i]*sizeof(UChar));
+            count += index[i];
+        }
+        t->cmLookup->index[i]=count;
+    }
+    return;
+}
+
+/* 1. to the UnsafeCP hash table, add all chars with combining class != 0     */
+/* 2. build combining marks table for all chars with combining class != 0     */
 static void uprv_uca_unsafeCPAddCCNZ(tempUCATable *t, UErrorCode *status) {
 
     UChar              c;
     uint16_t           fcd;     // Hi byte is lead combining class.
     // lo byte is trailing combing class.
     const uint16_t    *fcdTrieData;
-
+    UBool buildCMTable = (t->cmLookup==NULL); // flag for building combining class table
+    UChar *cm=NULL;
+    uint16_t index[256];
+    int32_t count=0;
     fcdTrieData = unorm_getFCDTrie(status);
     if (U_FAILURE(*status)) {
         return;
     }
 
+    if (buildCMTable) {
+        if (cm==NULL) {
+            cm = (UChar *)uprv_malloc(sizeof(UChar)*UCOL_MAX_CM_TAB);
+            if (cm==NULL) {
+                *status = U_MEMORY_ALLOCATION_ERROR;
+                return;
+            }
+        }
+        uprv_memset(index, 0, sizeof(index));
+    }
     for (c=0; c<0xffff; c++) {
         fcd = unorm_getFCD16(fcdTrieData, c);
         if (fcd >= 0x100 ||               // if the leading combining class(c) > 0 ||
-            (UTF_IS_LEAD(c) && fcd != 0)) //    c is a leading surrogate with some FCD data
+            (UTF_IS_LEAD(c) && fcd != 0)) {//    c is a leading surrogate with some FCD data
+            if (buildCMTable) {
+                uint32_t cClass = fcd & 0xff;
+                uint32_t temp=(cClass<<8)+index[cClass];
+                cm[(cClass<<8)+index[cClass]] = c; //
+                index[cClass]++;
+                count++;
+            }
             unsafeCPSet(t->unsafeCP, c);
+        }
     }
 
+    // copy to cm table
+    if (buildCMTable) {
+        uprv_uca_createCMTable(t, count, status);
+        if(U_FAILURE(*status)) {
+            if (cm!=NULL) {
+                uprv_free(cm);
+            }
+            return;
+        }
+        uprv_uca_copyCMTable(t, cm, index);
+    }
+
     if(t->prefixLookup != NULL) {
         int32_t i = -1;
         const UHashElement *e = NULL;
@@ -705,21 +782,25 @@
         while((e = uhash_nextElement(t->prefixLookup, &i)) != NULL) {
             element = (UCAElements *)e->value.pointer;
             // codepoints here are in the NFD form. We need to add the
-            // first code point of the NFC form to unsafe, because 
+            // first code point of the NFC form to unsafe, because
             // strcoll needs to backup over them.
             NFCbufLen = unorm_normalize(element->cPoints, element->cSize, UNORM_NFC, 0,
                 NFCbuf, 256, status);
             unsafeCPSet(t->unsafeCP, NFCbuf[0]);
-        } 
+        }
     }
+
+    if (cm!=NULL) {
+        uprv_free(cm);
+    }
 }
 
-static uint32_t uprv_uca_addPrefix(tempUCATable *t, uint32_t CE, 
+static uint32_t uprv_uca_addPrefix(tempUCATable *t, uint32_t CE,
                                    UCAElements *element, UErrorCode *status)
 {
     // currently the longest prefix we're supporting in Japanese is two characters
     // long. Although this table could quite easily mimic complete contraction stuff
-    // there is no good reason to make a general solution, as it would require some 
+    // there is no good reason to make a general solution, as it would require some
     // error prone messing.
     CntTable *contractions = t->contractions;
     UChar32 cp;
@@ -744,7 +825,7 @@
 #endif
 
     for (j = 1; j<element->prefixSize; j++) {   /* First add NFD prefix chars to unsafe CP hash table */
-        // Unless it is a trail surrogate, which is handled algoritmically and 
+        // Unless it is a trail surrogate, which is handled algoritmically and
         // shouldn't take up space in the table.
         if(!(UTF_IS_TRAIL(element->prefix[j]))) {
             unsafeCPSet(t->unsafeCP, element->prefix[j]);
@@ -784,7 +865,7 @@
     element->cSize = element->prefixSize;
 
     // Add the last char of the contraction to the contraction-end hash table.
-    // unless it is a trail surrogate, which is handled algorithmically and 
+    // unless it is a trail surrogate, which is handled algorithmically and
     // shouldn't be in the table
     if(!(UTF_IS_TRAIL(element->cPoints[element->cSize -1]))) {
         ContrEndCPSet(t->contrEndCP, element->cPoints[element->cSize -1]);
@@ -793,7 +874,7 @@
     // First we need to check if contractions starts with a surrogate
     UTF_NEXT_CHAR(element->cPoints, cpsize, element->cSize, cp);
 
-    // If there are any Jamos in the contraction, we should turn on special 
+    // If there are any Jamos in the contraction, we should turn on special
     // processing for Jamos
     if(UCOL_ISJAMO(element->prefix[0])) {
         t->image->jamoSpecial = TRUE;
@@ -801,7 +882,7 @@
     /* then we need to deal with it */
     /* we could aready have something in table - or we might not */
 
-    if(!isPrefix(CE)) { 
+    if(!isPrefix(CE)) {
         /* if it wasn't contraction, we wouldn't end up here*/
         int32_t firstContractionOffset = 0;
         firstContractionOffset = uprv_cnttab_addContraction(contractions, UPRV_CNTTAB_NEWELEMENT, 0, CE, status);
@@ -1557,45 +1638,348 @@
 }
 U_CDECL_END
 
+static void
+uprv_uca_setMapCE(tempUCATable *t, UCAElements *element, UErrorCode *status) {
+    uint32_t expansion = 0;
+    int32_t j;
+
+    ExpansionTable *expansions = t->expansions;
+    if(element->noOfCEs == 2 // a two CE expansion
+        && isContinuation(element->CEs[1]) // which  is a continuation
+        && (element->CEs[1] & (~(0xFF << 24 | UCOL_CONTINUATION_MARKER))) == 0 // that has only primaries in continuation,
+        && (((element->CEs[0]>>8) & 0xFF) == UCOL_BYTE_COMMON) // a common secondary
+        && ((element->CEs[0] & 0xFF) == UCOL_BYTE_COMMON) // and a common tertiary
+        ) {
+            element->mapCE = UCOL_SPECIAL_FLAG | (LONG_PRIMARY_TAG<<24) // a long primary special
+                | ((element->CEs[0]>>8) & 0xFFFF00) // first and second byte of primary
+                | ((element->CEs[1]>>24) & 0xFF);   // third byte of primary
+        } else {
+            expansion = (uint32_t)(UCOL_SPECIAL_FLAG | (EXPANSION_TAG<<UCOL_TAG_SHIFT)
+                | ((uprv_uca_addExpansion(expansions, element->CEs[0], status)+(headersize>>2))<<4)
+                & 0xFFFFF0);
+
+            for(j = 1; j<(int32_t)element->noOfCEs; j++) {
+                uprv_uca_addExpansion(expansions, element->CEs[j], status);
+            }
+            if(element->noOfCEs <= 0xF) {
+                expansion |= element->noOfCEs;
+            } else {
+                uprv_uca_addExpansion(expansions, 0, status);
+            }
+            element->mapCE = expansion;
+            uprv_uca_setMaxExpansion(element->CEs[element->noOfCEs - 1],
+                (uint8_t)element->noOfCEs,
+                t->maxExpansions,
+                status);
+        }
+}
+
+static void
+uprv_uca_addFCD4AccentedContractions(tempUCATable *t,
+                                      UCollationElements* colEl,
+                                      UChar *data,
+                                      int32_t len,
+                                      UCAElements *el,
+                                      UErrorCode *status) {
+    UChar decomp[256], comp[256];
+    int32_t decLen, compLen;
+
+    decLen = unorm_normalize(data, len, UNORM_NFD, 0, decomp, 256, status);
+    compLen = unorm_normalize(data, len, UNORM_NFC, 0, comp, 256, status);
+    decomp[decLen] = comp[compLen] = 0;
+
+    el->cPoints = decomp;
+    el->cSize = decLen;
+    el->noOfCEs = 0;
+    el->prefixSize = 0;
+    el->prefix = el->prefixChars;
+
+    UCAElements *prefix=(UCAElements *)uhash_get(t->prefixLookup, el);
+    el->cPoints = comp;
+    el->cSize = compLen;
+    el->prefix = el->prefixChars;
+    el->prefixSize = 0;
+    if(prefix == NULL) {
+        el->noOfCEs = 0;
+        ucol_setText(colEl, decomp, decLen, status);
+        while((el->CEs[el->noOfCEs] = ucol_next(colEl, status)) != (uint32_t)UCOL_NULLORDER) {
+            el->noOfCEs++;
+        }
+        uprv_uca_setMapCE(t, el, status);
+        uprv_uca_addAnElement(t, el, status);
+    }
+}
+
+static void
+uprv_uca_addMultiCMContractions(tempUCATable *t,
+                                UCollationElements* colEl,
+                                tempTailorContext *c,
+                                UCAElements *el,
+                                UErrorCode *status) {
+    CombinClassTable *cmLookup = t->cmLookup;
+    UChar  newDecomp[256];
+    int32_t maxComp, newDecLen;
+    const uint16_t  *fcdTrieData = unorm_getFCDTrie(status);
+    int16_t curClass = (unorm_getFCD16(fcdTrieData, c->tailoringCM) & 0xff);
+    CompData *precomp = c->precomp;
+    int32_t  compLen = c->compLen;
+    UChar *comp = c->comp;
+    maxComp = c->precompLen;
+
+    for (int32_t j=0; j < maxComp; j++) {
+        int32_t count=0;
+        int32_t newClass=0;
+        do {
+            if ( count == 0 ) {  // Decompose the saved precomposed char.
+                UChar temp[2];
+                temp[0]=precomp[j].cp;
+                temp[1]=0;
+                newDecLen = unorm_normalize(temp, 1, UNORM_NFD, 0,
+                            newDecomp, sizeof(newDecomp)/sizeof(UChar), status);
+                newDecomp[newDecLen++] = cmLookup->cPoints[c->cmPos];
+            }
+            else {  // swap 2 combining marks when they are equal.
+                uprv_memcpy(newDecomp, c->decomp, sizeof(UChar)*(c->decompLen));
+                newDecLen = c->decompLen;
+                newDecomp[newDecLen++] = precomp[j].cClass;
+            }
+            newDecomp[newDecLen] = 0;
+            compLen = unorm_normalize(newDecomp, newDecLen, UNORM_NFC, 0,
+                              comp, 256, status);
+            if (compLen==1) {
+                comp[compLen++] = newDecomp[newDecLen++] = c->tailoringCM;
+                comp[compLen] = newDecomp[newDecLen] = 0;
+                el->cPoints = newDecomp;
+                el->cSize = newDecLen;
+
+                UCAElements *prefix=(UCAElements *)uhash_get(t->prefixLookup, el);
+                el->cPoints = c->comp;
+                el->cSize = compLen;
+                el->prefix = el->prefixChars;
+                el->prefixSize = 0;
+                if(prefix == NULL) {
+                    el->noOfCEs = 0;
+                    ucol_setText(colEl, newDecomp, newDecLen, status);
+                    while((el->CEs[el->noOfCEs] = ucol_next(colEl, status)) != (uint32_t)UCOL_NULLORDER) {
+                        el->noOfCEs++;
+                    }
+                    uprv_uca_setMapCE(t, el, status);
+                    uprv_uca_finalizeAddition(t, el, status);
+
+                    // Save the current precomposed char and its class to find any
+                    // other combining mark combinations.
+                    precomp[c->precompLen].cp=comp[0];
+                    precomp[c->precompLen].cClass = curClass;
+                    c->precompLen++;
+                }
+            }
+        } while (++count<2 && (precomp[j].cClass == curClass));
+    }
+
+}
+
+static void
+uprv_uca_addTailCanonicalClosures(tempUCATable *t,
+                                  UCollationElements* colEl,
+                                  UChar baseCh,
+                                  UChar cMark,
+                                  UCAElements *el,
+                                  UErrorCode *status) {
+    CombinClassTable *cmLookup = t->cmLookup;
+    const uint16_t  *fcdTrieData = unorm_getFCDTrie(status);
+    int16_t maxIndex = (unorm_getFCD16(fcdTrieData, cMark) & 0xff );
+    UCAElements element;
+    uint16_t *index;
+    UChar  decomp[256];
+    UChar  comp[256];
+    CompData precomp[256];   // precomposed array
+    int32_t  precompLen = 0; // count for precomp
+    int32_t i, len, decompLen, curClass, replacedPos;
+    tempTailorContext c;
+
+    if ( cmLookup == NULL ) {
+        return;
+    }
+    index = cmLookup->index;
+    int32_t cClass=(unorm_getFCD16(fcdTrieData, cMark) & 0xff);
+    maxIndex = (int32_t)index[(unorm_getFCD16(fcdTrieData, cMark) & 0xff)-1];
+    c.comp = comp;
+    c.decomp = decomp;
+    c.precomp = precomp;
+    c.tailoringCM =  cMark;
+
+    if (cClass>0) {
+        maxIndex = (int32_t)index[cClass-1];
+    }
+    else {
+        maxIndex=0;
+    }
+    decomp[0]=baseCh;
+    for ( i=0; i<maxIndex ; i++ ) {
+        decomp[1] = cmLookup->cPoints[i];
+        decomp[2]=0;
+        decompLen=2;
+        len = unorm_normalize(decomp, decompLen, UNORM_NFC, 0, comp, 256, status);
+        if (len==1) {
+            // Save the current precomposed char and its class to find any
+            // other combining mark combinations.
+            precomp[precompLen].cp=comp[0];
+            curClass = precomp[precompLen].cClass =
+                       index[unorm_getFCD16(fcdTrieData, decomp[1]) & 0xff];
+            precompLen++;
+            replacedPos=0;
+            for (decompLen=0; decompLen< (int32_t)el->cSize; decompLen++) {
+                decomp[decompLen] = el->cPoints[decompLen];
+                if (decomp[decompLen]==cMark) {
+                    replacedPos = decompLen;  // record the position for later use
+                }
+            }
+            if ( replacedPos != 0 ) {
+                decomp[replacedPos]=cmLookup->cPoints[i];
+            }
+            decomp[decompLen] = 0;
+            len = unorm_normalize(decomp, decompLen, UNORM_NFC, 0, comp, 256, status);
+            comp[len++] = decomp[decompLen++] = cMark;
+            comp[len] = decomp[decompLen] = 0;
+            element.cPoints = decomp;
+            element.cSize = decompLen;
+            element.noOfCEs = 0;
+            element.prefix = el->prefixChars;
+            element.prefixSize = 0;
+
+            UCAElements *prefix=(UCAElements *)uhash_get(t->prefixLookup, &element);
+            element.cPoints = comp;
+            element.cSize = len;
+            element.prefix = el->prefixChars;
+            element.prefixSize = 0;
+            if(prefix == NULL) {
+                element.noOfCEs = 0;
+                ucol_setText(colEl, decomp, decompLen, status);
+                while((element.CEs[element.noOfCEs] = ucol_next(colEl, status)) != (uint32_t)UCOL_NULLORDER) {
+                    element.noOfCEs++;
+                }
+                uprv_uca_setMapCE(t, &element, status);
+                uprv_uca_finalizeAddition(t, &element, status);
+            }
+
+            // This is a fix for tailoring contractions with accented
+            // character at the end of contraction string.
+            if ((len>2) && 
+                (unorm_getFCD16(fcdTrieData, comp[len-2]) & 0xff00)==0) {
+                uprv_uca_addFCD4AccentedContractions(t, colEl, comp, len, &element, status);
+            }
+
+            if (precompLen >1) {
+                c.compLen = len;
+                c.decompLen = decompLen;
+                c.precompLen = precompLen;
+                c.cmPos = i;
+                uprv_uca_addMultiCMContractions(t, colEl, &c, &element, status);
+                precompLen = c.precompLen;
+            }
+        }
+    }
+}
+
 U_CAPI int32_t U_EXPORT2
-uprv_uca_canonicalClosure(tempUCATable *t, UErrorCode *status) 
+uprv_uca_canonicalClosure(tempUCATable *t,
+                          UColTokenParser *src,
+                          UErrorCode *status)
 {
     enumStruct context;
     context.noOfClosures = 0;
-    if(U_SUCCESS(*status)) {
-        UCollator *tempColl = NULL;
-        tempUCATable *tempTable = uprv_uca_cloneTempTable(t, status);
+    UCAElements el;
+    UColToken *tok;
+    UColToken *expt = NULL;
+    uint32_t i = 0, j = 0;
+    UChar  baseChar, firstCM;
+    const uint16_t  *fcdTrieData = unorm_getFCDTrie(status);
 
-        UCATableHeader *tempData = uprv_uca_assembleTable(tempTable, status);
-        tempColl = ucol_initCollator(tempData, 0, t->UCA, status);
-        uprv_uca_closeTempTable(tempTable);    
+    if(!U_SUCCESS(*status)) {
+        return 0;
+    }
 
-        if(U_SUCCESS(*status)) {
-            tempColl->rb = NULL;
-            tempColl->elements = NULL;
-            tempColl->validLocale = NULL;
-            tempColl->requestedLocale = NULL;
-            tempColl->hasRealData = TRUE;
-            tempColl->freeImageOnClose = TRUE;
-        } else if(tempData != 0) {
-            uprv_free(tempData);
-        }
+    UCollator *tempColl = NULL;
+    tempUCATable *tempTable = uprv_uca_cloneTempTable(t, status);
 
-        /* produce canonical closure */
-        UCollationElements* colEl = ucol_openElements(tempColl, NULL, 0, status);
+    UCATableHeader *tempData = uprv_uca_assembleTable(tempTable, status);
+    tempColl = ucol_initCollator(tempData, 0, t->UCA, status);
+    if ( tempTable->cmLookup != NULL ) {
+        t->cmLookup = tempTable->cmLookup;  // copy over to t
+        tempTable->cmLookup = NULL;
+    }
+    uprv_uca_closeTempTable(tempTable);
 
-        context.t = t;
-        context.tempColl = tempColl;
-        context.colEl = colEl;
-        context.status = status;
-        u_enumCharTypes(_enumCategoryRangeClosureCategory, &context);
+    if(U_SUCCESS(*status)) {
+        tempColl->rb = NULL;
+        tempColl->elements = NULL;
+        tempColl->validLocale = NULL;
+        tempColl->requestedLocale = NULL;
+        tempColl->hasRealData = TRUE;
+        tempColl->freeImageOnClose = TRUE;
+    } else if(tempData != 0) {
+        uprv_free(tempData);
+    }
 
+    /* produce canonical closure */
+    UCollationElements* colEl = ucol_openElements(tempColl, NULL, 0, status);
+
+    context.t = t;
+    context.tempColl = tempColl;
+    context.colEl = colEl;
+    context.status = status;
+    u_enumCharTypes(_enumCategoryRangeClosureCategory, &context);
+
+    if ( (src==NULL) || !src->buildCCTabFlag ) {
         ucol_closeElements(colEl);
         ucol_close(tempColl);
+        return context.noOfClosures;  // no extra contraction needed to add
     }
+
+    for (i=0; i < src->resultLen; i++) {
+        baseChar = firstCM= (UChar)0;
+        tok = src->lh[i].first;
+        while (tok != NULL && U_SUCCESS(*status)) {
+            el.prefix = el.prefixChars;
+            el.cPoints = el.uchars;
+            if(tok->prefix != 0) {
+                el.prefixSize = tok->prefix>>24;
+                uprv_memcpy(el.prefix, src->source + (tok->prefix & 0x00FFFFFF), el.prefixSize*sizeof(UChar));
+
+                el.cSize = (tok->source >> 24)-(tok->prefix>>24);
+                uprv_memcpy(el.uchars, (tok->source & 0x00FFFFFF)+(tok->prefix>>24) + src->source, el.cSize*sizeof(UChar));
+            } else {
+                el.prefixSize = 0;
+                *el.prefix = 0;
+
+                el.cSize = (tok->source >> 24);
+                uprv_memcpy(el.uchars, (tok->source & 0x00FFFFFF) + src->source, el.cSize*sizeof(UChar));
+            }
+            if(src->UCA != NULL) {
+                for(j = 0; j<el.cSize; j++) {
+                    int16_t fcd = unorm_getFCD16(fcdTrieData, el.cPoints[j]);
+                    if ( (fcd & 0xff) == 0 ) {
+                        baseChar = el.cPoints[j];  // last base character
+                        firstCM=0;  // reset combining mark value
+                    }
+                    else {
+                        if ( (baseChar!=0) && (firstCM==0) ) {
+                            firstCM = el.cPoints[j];  // first combining mark
+                        }
+                    }
+                }
+            }
+            if ( (baseChar!= (UChar)0) && (firstCM != (UChar)0) ) {
+                // find all the canonical rules
+                uprv_uca_addTailCanonicalClosures(t, colEl, baseChar, firstCM, &el, status);
+            }
+            tok = tok->next;
+        }
+    }
+    ucol_closeElements(colEl);
+    ucol_close(tempColl);
+    
     return context.noOfClosures;
 }
 
 #endif /* #if !UCONFIG_NO_COLLATION */
-
-

Modified: trunk/source/i18n/ucol_elm.h
===================================================================
--- trunk/source/i18n/ucol_elm.h	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/i18n/ucol_elm.h	2008-03-24 11:52:37 UTC (rev 144)
@@ -22,6 +22,7 @@
 #define UCOL_UCAELEMS_H
 
 #include "unicode/utypes.h"
+#include "ucol_tok.h"
 
 #if !UCONFIG_NO_COLLATION
 
@@ -43,6 +44,13 @@
 */
 #define UCOL_ELM_TRIE_CAPACITY 0x40000
 
+/* This is the maxmun capacity for temparay combining class 
+ * table.  The table will be compacted after scanning all the
+ * Unicode codepoints.
+*/
+#define UCOL_MAX_CM_TAB  0x10000
+
+
 typedef struct {
     uint32_t *CEs;
     int32_t position;
@@ -85,6 +93,12 @@
 } MaxExpansionTable;
 
 typedef struct {
+    uint16_t   index[256];  /* index of cPoints by combining class 0-255. */
+    UChar      *cPoints;    /* code point array of all combining marks */
+    uint32_t   size;        /* total number of combining marks */
+} CombinClassTable;
+
+typedef struct {
   /*CompactEIntArray      *mapping; */
   UNewTrie                 *mapping; 
   ExpansionTable        *expansions; 
@@ -97,17 +111,33 @@
   uint8_t               *contrEndCP;
   const UCollator       *UCA;
   UHashtable      *prefixLookup;
+  CombinClassTable      *cmLookup;  /* combining class lookup for tailoring. */
 } tempUCATable; 
 
+typedef struct {
+    UChar cp;
+    uint16_t cClass;   // combining class
+}CompData;
+
+typedef struct {
+    CompData *precomp;
+    int32_t precompLen;
+    UChar *decomp;
+    int32_t decompLen;
+    UChar *comp;
+    int32_t compLen;
+    uint16_t curClass;
+    uint16_t tailoringCM;
+    int32_t  cmPos;
+}tempTailorContext;
+
 U_CAPI tempUCATable * U_EXPORT2 uprv_uca_initTempTable(UCATableHeader *image, UColOptionSet *opts, const UCollator *UCA, UColCETags initTag, UColCETags supplementaryInitTag, UErrorCode *status);
 U_CAPI tempUCATable * U_EXPORT2 uprv_uca_cloneTempTable(tempUCATable *t, UErrorCode *status);
 U_CAPI void U_EXPORT2 uprv_uca_closeTempTable(tempUCATable *t);
 U_CAPI uint32_t U_EXPORT2 uprv_uca_addAnElement(tempUCATable *t, UCAElements *element, UErrorCode *status);
 U_CAPI UCATableHeader * U_EXPORT2 uprv_uca_assembleTable(tempUCATable *t, UErrorCode *status);
 U_CAPI int32_t U_EXPORT2
-uprv_uca_canonicalClosure(tempUCATable *t, UErrorCode *status);
-
-
+uprv_uca_canonicalClosure(tempUCATable *t, UColTokenParser *src, UErrorCode *status);
 #define paddedsize(something) ((something)+((((something)%4)!=0)?(4-(something)%4):0))
 #define headersize (paddedsize(sizeof(UCATableHeader))+paddedsize(sizeof(UColOptionSet)))
 

Modified: trunk/source/i18n/ucol_tok.cpp
===================================================================
--- trunk/source/i18n/ucol_tok.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/i18n/ucol_tok.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -1817,8 +1817,8 @@
     src->parsedToken.prefixOffset = 0;
     src->parsedToken.flags = 0;
     src->parsedToken.strength = UCOL_TOK_UNSET;
+    src->buildCCTabFlag = FALSE;
 
-
     if(U_FAILURE(*status)) {
         return;
     }

Modified: trunk/source/i18n/ucol_tok.h
===================================================================
--- trunk/source/i18n/ucol_tok.h	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/i18n/ucol_tok.h	2008-03-24 11:52:37 UTC (rev 144)
@@ -1,7 +1,7 @@
 /*
 *******************************************************************************
 *
-*   Copyright (C) 2001-2006, International Business Machines
+*   Copyright (C) 2001-2007, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *
 *******************************************************************************
@@ -122,6 +122,7 @@
   UColToken *varTop;
   USet *copySet;
   USet *removeSet;
+  UBool buildCCTabFlag;  /* Tailoring rule requirs building combining class table. */
 } UColTokenParser;
 
 typedef struct {

Modified: trunk/source/i18n/unicode/basictz.h
===================================================================
--- trunk/source/i18n/unicode/basictz.h	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/i18n/unicode/basictz.h	2008-03-24 11:52:37 UTC (rev 144)
@@ -140,8 +140,37 @@
     virtual void getSimpleRulesNear(UDate date, InitialTimeZoneRule*& initial,
         AnnualTimeZoneRule*& std, AnnualTimeZoneRule*& dst, UErrorCode& status) /*const*/;
 
+
+    /**
+     * The time type option bit flags used by getOffsetFromLocal
+     * @internal
+     */
+    enum {
+        kStandard = 0x01,
+        kDaylight = 0x03,
+        kFormer = 0x04,
+        kLatter = 0x0C
+    };
+
+    /**
+     * Get time zone offsets from local wall time.
+     * @internal
+     */
+    virtual void getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt,
+        int32_t& rawOffset, int32_t& dstOffset, UErrorCode& status) /*const*/;
+
 protected:
+
     /**
+     * The time type option bit masks used by getOffsetFromLocal
+     * @internal
+     */
+    enum {
+        kStdDstMask = kDaylight,
+        kFormerLatterMask = kLatter
+    };
+
+    /**
      * Default constructor.
      * @draft ICU 3.8
      */

Modified: trunk/source/i18n/unicode/dtfmtsym.h
===================================================================
--- trunk/source/i18n/unicode/dtfmtsym.h	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/i18n/unicode/dtfmtsym.h	2008-03-24 11:52:37 UTC (rev 144)
@@ -37,6 +37,8 @@
 /* forward declaration */
 class SimpleDateFormat;
 class Hashtable;
+class ZoneStringFormat;
+class SafeZoneStringFormatPtr;
 
 /**
  * DateFormatSymbols is a public class for encapsulating localizable date-time
@@ -445,100 +447,6 @@
      */
     static UClassID U_EXPORT2 getStaticClassID();
 
-    /**
-     * The translation type of the translated zone strings
-     * @internal ICU 3.6
-     */
-    enum TimeZoneTranslationType {
-        TIMEZONE_SHORT_GENERIC,
-        TIMEZONE_SHORT_STANDARD,
-        TIMEZONE_SHORT_DAYLIGHT,
-        TIMEZONE_LONG_GENERIC,
-        TIMEZONE_LONG_STANDARD,
-        TIMEZONE_LONG_DAYLIGHT,
-        TIMEZONE_EXEMPLAR_CITY,
-        TIMEZONE_COUNT
-    };
-    
-    /**
-     * Creates an enumeration of time zone IDs. The object is owned by the caller and should delete it after use.
-     * The time zone IDs are just for programmatic lookup. NOT LOCALIZED!!!
-     * @param status   Input/output parameter, set to success or
-     *                 failure code upon return.
-     * @return A new StringEnumeration object
-     * @internal ICU 3.6
-     */
-    virtual StringEnumeration* createZoneStringIDs(UErrorCode &status);
-
-    /**
-     * Gets timezone string give the key and translation type
-     * @param ID       The ID of zone strings,  e.g: "America/Los_Angeles".
-     *                 The time zone ID is  for programmatic lookup.
-     * @param type     The translation type requested
-     * @param result   Output parameter to recieve the translation string
-     * @param status   Input/output parameter, set to success or
-     *                 failure code upon return.
-     * @return the input UnicodeString parameter for chaining
-     * @internal ICU 3.8
-     */
-    UnicodeString& getZoneString(const UnicodeString &ID, const TimeZoneTranslationType type, UnicodeString &result, UErrorCode &status);
-
-    /**
-     * Gets metazone string given the key and translation type and calendar
-     * @param ID       The ID of zone strings,  e.g: "America/Los_Angeles".
-     *                 The time zone ID is  for programmatic lookup.
-     * @param type     The translation type requested
-     * @param cal      The calendar
-     * @param result   Output parameter to recieve the translation string
-     * @param status   Input/output parameter, set to success or
-     *                 failure code upon return.
-     * @return the input UnicodeString parameter for chaining
-     * @internal ICU 3.8
-     */
-    UnicodeString getMetazoneString(const UnicodeString &ID, const TimeZoneTranslationType type, Calendar &cal, UnicodeString &result, UErrorCode &status);
-
-    /**
-     * Gets fallback string given the key
-     * @param ID       The ID of zone strings,  e.g: "America/Los_Angeles".
-     *                 The time zone ID is  for programmatic lookup.
-     * @param result   Output parameter to recieve the translation string
-     * @param status   Input/output parameter, set to success or
-     *                 failure code upon return.
-     * @return the input UnicodeString parameter for chaining
-     * @internal ICU 3.8
-     */
-    UnicodeString& getFallbackString(const UnicodeString &ID, UnicodeString &result, UErrorCode &status);
-
-    /**
-     * Sets timezone string for the given the ID and translation type
-     * @param ID       The ID of zone strings,  e.g: "America/Los_Angeles".
-     *                 The time zone ID is for programmatic lookup.
-     * @param type     The translation type to set the value for
-     * @param value    The string with which current translation needs to be replaced
-     * @param status   Input/output parameter, set to success or     
-     * @internal ICU 3.6
-     */
-
-    /**
-     * Determines if the Commonly Used flag is set for this zone 
-     * @param zid      The ID of zone strings,  e.g: "America/Los_Angeles".
-     *                 The time zone ID is  for programmatic lookup.
-     * @return         A boolean value indicating if the zone is commonlyUsed or not.
-     * @internal ICU 3.8
-     */
-    UBool isCommonlyUsed(const UnicodeString &zid);
-    
-    /**
-     * Sets timezone string for the given the ID and translation type
-     * @param ID       The ID of zone strings,  e.g: "America/Los_Angeles".
-     *                 The time zone ID is for programmatic lookup.
-     * @param type     The translation type to set the value for
-     * @param value    The string with which current translation needs to be replaced
-     * @param status   Input/output parameter, set to success or     
-     * @internal ICU 3.6
-     */
-    void setZoneString(const UnicodeString &ID, const TimeZoneTranslationType type, const UnicodeString &value, UErrorCode &status);
-
 private:
 
     friend class SimpleDateFormat;
@@ -661,15 +569,36 @@
     /**
      * The format data of all the timezones in this locale.
      */
-    UnicodeString** fZoneStrings;
+    UnicodeString   **fZoneStrings;         // Zone string array set by setZoneStrings
+    UnicodeString   **fLocaleZoneStrings;   // Zone string array created by the locale
     int32_t         fZoneStringsRowCount;
     int32_t         fZoneStringsColCount;
-    StringEnumeration* fZoneIDEnumeration;
-    Hashtable*         fZoneStringsHash;
-    UResourceBundle* fResourceBundle;
-    const char*      fCountry;
 
+    const ZoneStringFormat  *fZoneStringFormat;
+    ZoneStringFormat        *fZSFLocal;         // Local ZoneStringFormat instance
+    SafeZoneStringFormatPtr *fZSFCachePtr;      // Cached ZoneStringFormat
+    Locale                  fZSFLocale;         // Locale used for getting ZoneStringFormat
+
     /**
+     * Pattern string used for localized time zone GMT format.  For example, "GMT{0}"
+     */
+    UnicodeString   fGmtFormat;
+
+    /**
+     * Pattern strings used for formatting zone offset in a localized time zone GMT string.
+     */
+    UnicodeString  *fGmtHourFormats;
+    int32_t         fGmtHourFormatsCount; 
+
+    enum GMTHourType {
+        GMT_NEGATIVE_HMS = 0,
+        GMT_NEGATIVE_HM,
+        GMT_POSITIVE_HMS,
+        GMT_POSITIVE_HM,
+        GMT_HOUR_COUNT
+    };
+
+    /**
      * Localized date-time pattern characters. For example: use 'u' as 'y'.
      */
     UnicodeString   fLocalPatternChars;
@@ -729,21 +658,6 @@
     void createZoneStrings(const UnicodeString *const * otherStrings);
 
     /**
-     * Package private: used by SimpleDateFormat
-     * Gets the index for the given time zone ID to obtain the timezone
-     * strings for formatting. The time zone ID is just for programmatic
-     * lookup. NOT LOCALIZED!!!
-     * @param ID the given time zone ID.
-     * @return the index of the given time zone ID.  Returns -1 if
-     * the given time zone ID can't be located in the DateFormatSymbols object.
-     * @see java.util.SimpleTimeZone
-     */
-    int32_t getZoneIndex(const UnicodeString& ID) const;
-
-    // Internal method; see source for documentation
-    int32_t _getZoneIndex(const UnicodeString& id) const;
-
-    /**
      * Delete all the storage owned by this object.
      */
     void dispose(void);
@@ -754,67 +668,26 @@
      */
     void copyData(const DateFormatSymbols& other);
 
+
     /**
-     * Delete just the zone strings.
+     * Returns a ZoneStringFormat, used only by SimpleDateFormat for now.
      */
-    void disposeZoneStrings(void);
+    const ZoneStringFormat* getZoneStringFormat(void) const;
 
     /**
-     * Initializes the zoneStrings hash and keys StringEnumeration after reading the zoneStrings resource
+     * Create a ZoneStringFormat by locale if not yet availble
      */
-    void initZoneStrings(UErrorCode &status);
-    /** 
-     * initialzes the zoneStrings has and keys enumeration after reading the strings[][]. Required for backwards
-     * compatibility of setZoneStrings method
-     */
-    void initZoneStrings(const UnicodeString** strings, int32_t rowCount, int32_t collumnCount, UErrorCode& status);
+    void initZoneStringFormat(void);
+
     /**
-     * initialization of the fZoneStrings data member
+     * Create zone strings array by locale if not yet available
      */
-    void initZoneStringsArray(UErrorCode& status);
+    void initZoneStringsArray(void);
+
     /**
-     * Creates a deep clone of the Hashtable
+     * Delete just the zone strings.
      */
-    Hashtable* createZoneStringsHash(const Hashtable* otherHash);
-    
-    /**
-     * Fetches the key from the hashtable for a given ID.
-     * e.g: for a given ID such as PST returns "Americal/Los_Angeles"
-     * Used by SimpleDateFormat class.
-     * @param ID The id of the time zone for which the key needs to be fetched
-     * @param result Output parameter to recieve the key.
-     * @return the input UnicodeString object for chaining
-     */
-    UnicodeString& getZoneID(const UnicodeString& zid, UnicodeString& result, UErrorCode& status);
-    
-    /**
-     * Fetches the zone type and zone string from the hashtable for a given key.
-     * e.g: for key: "Americal/Los_Angeles", text: "2004/1/1 PT 1:00" and start:9
-     * returns TIMEZONE_SHORT_GENERIC and "PT". 
-     * Used by SimpleDateFormat class.
-     * @param ID the name of the timezone
-     * @param text the string containing the time zone translation
-     * @param start The position in string where time zone string starts
-     * @param type  output parameter to recieve the type of time zone string
-     * @param value output parameter to recieve the the acutal time zone string
-     */
-    void getZoneType(const UnicodeString& zid, const UnicodeString& text, int32_t start, TimeZoneTranslationType& type, UnicodeString& value, UErrorCode& status);
-    
-    /**
-     * Fetches the zone type and zone string from the hashtable by cycling through all elements in the hashtable.
-     * e.g: text: "2004/1/1 PT 1:00" and start:9
-     * returns "Americal/Los_Angeles", TIMEZONE_SHORT_GENERIC and "PT". Used by SimpleDateFormat class.
-     * Used by SimpleDateFormat class.
-     * @param ID output parameter to recieve the key name of the time zone
-     * @param text the string containing the time zone translation
-     * @param start The position in string where time zone string starts
-     * @param type  output parameter to recieve the type of time zone string
-     * @param value output parameter to recieve the the acutal time zone string
-     * @param status output parameter to recive the error information
-     */
-    void findZoneIDTypeValue(UnicodeString& zid, const UnicodeString& text, int32_t start, TimeZoneTranslationType& type, UnicodeString& value, UErrorCode& status);
-
-    UnicodeString resolveParsedMetazone(const UnicodeString& zid);
+    void disposeZoneStrings(void);
 };
 
 U_NAMESPACE_END

Modified: trunk/source/i18n/unicode/rbtz.h
===================================================================
--- trunk/source/i18n/unicode/rbtz.h	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/i18n/unicode/rbtz.h	2008-03-24 11:52:37 UTC (rev 144)
@@ -23,6 +23,7 @@
 
 // forward declaration
 class UVector;
+struct Transition;
 
 class U_I18N_API RuleBasedTimeZone : public BasicTimeZone {
 public:
@@ -289,13 +290,27 @@
     virtual void getTimeZoneRules(const InitialTimeZoneRule*& initial,
         const TimeZoneRule* trsrules[], int32_t& trscount, UErrorCode& status) /*const*/;
 
+    /**
+     * Get time zone offsets from local wall time.
+     * @internal
+     */
+    virtual void getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt,
+        int32_t& rawOffset, int32_t& dstOffset, UErrorCode& status) /*const*/;
+
 private:
     void deleteRules(void);
     void deleteTransitions(void);
     UVector* copyRules(UVector* source);
-    TimeZoneRule* findRuleInFinal(UDate date, UBool local) const;
+    TimeZoneRule* findRuleInFinal(UDate date, UBool local,
+        int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt) const;
     UBool findNext(UDate base, UBool inclusive, UDate& time, TimeZoneRule*& from, TimeZoneRule*& to) const;
     UBool findPrev(UDate base, UBool inclusive, UDate& time, TimeZoneRule*& from, TimeZoneRule*& to) const;
+    int32_t getLocalDelta(int32_t rawBefore, int32_t dstBefore, int32_t rawAfter, int32_t dstAfter,
+        int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt) const;
+    UDate getTransitionTime(Transition* transition, UBool local,
+        int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt) const;
+    void getOffsetInternal(UDate date, UBool local, int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt,
+        int32_t& rawOffset, int32_t& dstOffset, UErrorCode& ec) const;
 
     InitialTimeZoneRule *fInitialRule;
     UVector             *fHistoricRules;

Modified: trunk/source/i18n/unicode/simpletz.h
===================================================================
--- trunk/source/i18n/unicode/simpletz.h	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/i18n/unicode/simpletz.h	2008-03-24 11:52:37 UTC (rev 144)
@@ -617,6 +617,13 @@
                            int32_t& dstOffset, UErrorCode& ec) const;
 
     /**
+     * Get time zone offsets from local wall time.
+     * @internal
+     */
+    virtual void getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt,
+        int32_t& rawOffset, int32_t& dstOffset, UErrorCode& status) /*const*/;
+
+    /**
      * Returns the TimeZone's raw GMT offset (i.e., the number of milliseconds to add
      * to GMT to get local time, before taking daylight savings time into account).
      *

Modified: trunk/source/i18n/unicode/smpdtfmt.h
===================================================================
--- trunk/source/i18n/unicode/smpdtfmt.h	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/i18n/unicode/smpdtfmt.h	2008-03-24 11:52:37 UTC (rev 144)
@@ -38,6 +38,7 @@
 
 class DateFormatSymbols;
 class DateFormat;
+class MessageFormat;
 
 /**
  *
@@ -650,13 +651,6 @@
                                 UErrorCode& status) const; // in case of illegal argument
 
     /**
-     * Used to resolve Time Zone aliases
-     *
-     * @param zid       Time Zone ID to Canonicalize ( resolve aliases )
-     */
-    void zoneIDCanonicalize( UnicodeString & ) const;
-
-    /**
      * Used by subFormat() to format a numeric value.
      * Appends to toAppendTo a string representation of "value"
      * having a number of digits between "minDigits" and
@@ -767,6 +761,12 @@
                   ParsePosition& pos,
                   UBool allowNegative) const;
 
+    void parseInt(const UnicodeString& text,
+                  Formattable& number,
+                  int32_t maxDigits,
+                  ParsePosition& pos,
+                  UBool allowNegative) const;
+
     /**
      * Translate a pattern, mapping each character in the from string to the
      * corresponding character in the to string. Return an error if the original
@@ -793,25 +793,22 @@
      *                  if the operation succeeds.
      */
     void         parseAmbiguousDatesAsAfter(UDate startDate, UErrorCode& status);
-
+    
     /**
-     * Given text, a start in the text, and a row index, return the column index that
-     * of the zone name that matches (case insensitive) at start, or 0 if none matches.
-     *
-    int32_t      matchZoneString(const UnicodeString& text, int32_t start, int32_t zi) const;
-    */
+     * Private methods for formatting/parsing GMT string
+     */
+    void appendGMT(UnicodeString &appendTo, Calendar& cal, UErrorCode& status) const;
+    void formatGMTDefault(UnicodeString &appendTo, int32_t offset) const;
+    int32_t parseGMT(const UnicodeString &text, ParsePosition &pos) const;
+    int32_t parseGMTDefault(const UnicodeString &text, ParsePosition &pos) const;
+    UBool isDefaultGMTFormat() const;
 
+    void formatRFC822TZ(UnicodeString &appendTo, int32_t offset) const;
+
     /**
-     * Given text, a start in the text, and a calendar, return the next offset in the text
-     * after matching the zone string.  If we fail to match, return 0.  Update the calendar
-     * as appropriate.
+     * Initialize MessageFormat instances used for GMT formatting/parsing
      */
-    int32_t      subParseZoneString(const UnicodeString& text, int32_t start, Calendar& cal, UErrorCode& status) const;
-    
-    /**
-     * append the gmt string
-     */
-    inline void appendGMT(UnicodeString &appendTo, Calendar& cal, UErrorCode& status) const;
+    void initGMTFormatters(UErrorCode &status);
 
     /**
      * Used to map pattern characters to Calendar field identifiers.
@@ -854,8 +851,19 @@
      */
     /*transient*/ int32_t   fDefaultCenturyStartYear;
 
-    /*transient*/ TimeZone* parsedTimeZone; // here to avoid api change
+    enum ParsedTZType {
+        TZTYPE_UNK,
+        TZTYPE_STD,
+        TZTYPE_DST
+    };
 
+    ParsedTZType tztype; // here to avoid api change
+
+    /*
+     * MessageFormat instances used for localized GMT format
+     */
+    MessageFormat   **fGMTFormatters;
+
     UBool fHaveDefaultCentury;
 };
 

Modified: trunk/source/i18n/unicode/timezone.h
===================================================================
--- trunk/source/i18n/unicode/timezone.h	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/i18n/unicode/timezone.h	2008-03-24 11:52:37 UTC (rev 144)
@@ -670,6 +670,15 @@
     static UResourceBundle* loadRule(const UResourceBundle* top, const UnicodeString& ruleid, UResourceBundle* oldbundle, UErrorCode&status);
 
 private:
+    friend class ZoneMeta;
+
+    /**
+     * Get a canonical Olson zone ID for the given ID.  If the given ID is not valid,
+     * this method returns empty string as the result.  If the given ID is a link, then the
+     * referenced ID (canonical ID) is returned.
+     */
+    static UnicodeString& getOlsonCanonicalID(const UnicodeString &id, UnicodeString &canonical);
+
     static TimeZone*        createCustomTimeZone(const UnicodeString&); // Creates a time zone based on the string.
 
     /**

Modified: trunk/source/i18n/usearch.cpp
===================================================================
--- trunk/source/i18n/usearch.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/i18n/usearch.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -1,6 +1,6 @@
 /*
 **********************************************************************
-*   Copyright (C) 2001-2006 IBM and others. All rights reserved.
+*   Copyright (C) 2001-2007 IBM and others. All rights reserved.
 **********************************************************************
 *   Date        Name        Description
 *  07/02/2001   synwee      Creation.
@@ -320,13 +320,19 @@
     const UChar      *patterntext = pattern->text;
           int32_t     length      = pattern->textLength;
           int32_t index       = 0;
-
-    pattern->hasPrefixAccents = getFCD(patterntext, &index, length) >> 
-                                                     SECOND_LAST_BYTE_SHIFT_;
-    index = length;
-    UTF_BACK_1(patterntext, 0, index);
-    pattern->hasSuffixAccents = getFCD(patterntext, &index, length) & 
-                                                             LAST_BYTE_MASK_;
+    
+    // Since the strength is primary, accents are ignored in the pattern.
+    if (strsrch->strength == UCOL_PRIMARY) {
+    	pattern->hasPrefixAccents = 0;
+    	pattern->hasSuffixAccents = 0;
+    } else {
+	    pattern->hasPrefixAccents = getFCD(patterntext, &index, length) >> 
+	                                                     SECOND_LAST_BYTE_SHIFT_;
+	    index = length;
+	    UTF_BACK_1(patterntext, 0, index);
+	    pattern->hasSuffixAccents = getFCD(patterntext, &index, length) & 
+	                                                             LAST_BYTE_MASK_;
+    }
     // since intializePattern is an internal method status is a success.
     return initializePatternCETable(strsrch, status);   
 }
@@ -426,6 +432,35 @@
 }
 
 /**
+* Check to make sure that the match length is at the end of the character by 
+* using the breakiterator.
+* @param strsrch string search data 
+* @param start target text start offset
+* @param end target text end offset
+*/
+static
+void checkBreakBoundary(const UStringSearch *strsrch, int32_t *start, 
+                               int32_t *end)
+{
+#if !UCONFIG_NO_BREAK_ITERATION
+    UBreakIterator *breakiterator = strsrch->search->internalBreakIter;
+    if (breakiterator) {
+	    int32_t matchend = *end;
+	    int32_t matchstart = *start;
+	    
+	    if (!ubrk_isBoundary(breakiterator, matchend))
+	    	*end = ubrk_following(breakiterator, matchend);
+	    
+	    /* Check the start of the matched text to make sure it doesn't have any accents 
+	     * before it.  This code may not be necessary and so it is commented out */
+	    /*if (!ubrk_isBoundary(breakiterator, matchstart) && !ubrk_isBoundary(breakiterator, matchstart-1)) {
+	    	*start = ubrk_preceding(breakiterator, matchstart);
+	    }*/
+    }
+#endif
+}
+
+/**
 * Determine whether the target text in UStringSearch bounded by the offset 
 * start and end is one or more whole units of text as 
 * determined by the breakiterator in UStringSearch.
@@ -439,6 +474,7 @@
 {
 #if !UCONFIG_NO_BREAK_ITERATION
     UBreakIterator *breakiterator = strsrch->search->breakIter;
+    //TODO: Add here.
     if (breakiterator) {
         int32_t startindex = ubrk_first(breakiterator);
         int32_t endindex   = ubrk_last(breakiterator);
@@ -705,7 +741,7 @@
             uint32_t            firstce   = strsrch->pattern.CE[0];
             UBool               ignorable = TRUE;
             uint32_t            ce        = UCOL_IGNORABLE;
-            while (U_SUCCESS(*status) && ce != firstce) {
+            while (U_SUCCESS(*status) && ce != firstce && ce != UCOL_NULLORDER) {
                 offset = ucol_getOffset(coleiter);
                 if (ce != firstce && ce != UCOL_IGNORABLE) {
                     ignorable = FALSE;
@@ -858,11 +894,14 @@
                 }
                 count ++;
             }
-            int32_t ce = getCE(strsrch, ucol_next(coleiter, &status));
+            int32_t ce = ucol_next(coleiter, &status);
             if (U_FAILURE(status)) {
                 return TRUE;
             }
             if (ce != UCOL_NULLORDER && ce != UCOL_IGNORABLE) {
+            	ce = getCE(strsrch, ce);
+            }
+            if (ce != UCOL_NULLORDER && ce != UCOL_IGNORABLE) {
                 if (ucol_getOffset(coleiter) <= end) {
                     return TRUE;
                 }
@@ -1120,6 +1159,11 @@
         *textoffset = getNextUStringSearchBaseOffset(strsrch, *textoffset);  
         return FALSE;
     }
+
+    //Add breakiterator boundary check for primary strength search.
+    if (!strsrch->search->breakIter && strsrch->strength == UCOL_PRIMARY) {
+    	checkBreakBoundary(strsrch, &start, textoffset);
+    }
         
     // totally match, we will get rid of the ending ignorables.
     strsrch->search->matchedIndex  = start;
@@ -1963,6 +2007,12 @@
                                             *textoffset);
         return FALSE;
     }
+    
+    //Add breakiterator boundary check for primary strength search.
+    if (!strsrch->search->breakIter && strsrch->strength == UCOL_PRIMARY) {
+    	checkBreakBoundary(strsrch, textoffset, &end);
+    }
+    
     strsrch->search->matchedIndex = *textoffset;
     strsrch->search->matchedLength = end - *textoffset;
     return TRUE;
@@ -2552,8 +2602,9 @@
         
         result->search->breakIter  = breakiter;
 #if !UCONFIG_NO_BREAK_ITERATION
+        result->search->internalBreakIter = ubrk_open(UBRK_CHARACTER, ucol_getLocale(result->collator, ULOC_VALID_LOCALE, status), text, textlength, status);
         if (breakiter) {
-            ubrk_setText(breakiter, text, textlength, status);
+        	ubrk_setText(breakiter, text, textlength, status);
         }
 #endif
 
@@ -2598,6 +2649,9 @@
         if (strsrch->ownCollator && strsrch->collator) {
             ucol_close((UCollator *)strsrch->collator);
         }
+        if (strsrch->search->internalBreakIter) {
+        	ubrk_close(strsrch->search->internalBreakIter);
+        }
         uprv_free(strsrch->search);
         uprv_free(strsrch);
     }
@@ -2736,7 +2790,7 @@
                                                UErrorCode     *status)
 {
     if (U_SUCCESS(*status) && strsrch) {
-        strsrch->search->breakIter = breakiter;
+    	strsrch->search->breakIter = breakiter;
         if (breakiter) {
             ubrk_setText(breakiter, strsrch->search->text, 
                          strsrch->search->textLength, status);
@@ -2780,6 +2834,7 @@
                 ubrk_setText(strsrch->search->breakIter, text, 
                              textlength, status);
             }
+            ubrk_setText(strsrch->search->internalBreakIter, text, textlength, status);
 #endif
         }
     }
@@ -2812,6 +2867,11 @@
             strsrch->collator    = collator;
             strsrch->strength    = ucol_getStrength(collator);
             strsrch->ceMask      = getMask(strsrch->strength);
+#if !UCONFIG_NO_BREAK_ITERATION
+        	ubrk_close(strsrch->search->internalBreakIter);
+        	strsrch->search->internalBreakIter = ubrk_open(UBRK_CHARACTER, ucol_getLocale(collator, ULOC_VALID_LOCALE, status), 
+        											 strsrch->search->text, strsrch->search->textLength, status);
+#endif
             // if status is a failure, ucol_getAttribute returns UCOL_DEFAULT
             strsrch->toShift     =  
                ucol_getAttribute(collator, UCOL_ALTERNATE_HANDLING, status) == 
@@ -3229,9 +3289,10 @@
             }
         }
 
-        targetce = lastce;
+        //targetce = lastce;
         
         while (found && patternceindex > 0) {
+        	lastce = targetce;
             targetce    = ucol_previous(coleiter, status);
             if (U_FAILURE(*status) || targetce == UCOL_NULLORDER) {
                 found = FALSE;
@@ -3245,6 +3306,8 @@
             patternceindex --;
             found = found && targetce == patternce[patternceindex]; 
         }
+        
+        targetce = lastce;
 
         if (!found) {
             if (U_FAILURE(*status)) {
@@ -3411,7 +3474,7 @@
             if (firstce == UCOL_NULLORDER || firstce == UCOL_IGNORABLE) {
                 firstce = targetce;
             }
-            if (targetce == UCOL_IGNORABLE) {
+            if (targetce == UCOL_IGNORABLE && strsrch->strength != UCOL_PRIMARY) {
                 continue;
             }         
             if (targetce == patternce[0]) {
@@ -3425,9 +3488,10 @@
             }
         }
 
-        targetce = firstce;
+        //targetce = firstce;
         
         while (found && (patternceindex < patterncelength)) {
+        	firstce = targetce;
             targetce    = ucol_next(coleiter, status);
             if (U_FAILURE(*status) || targetce == UCOL_NULLORDER) {
                 found = FALSE;
@@ -3441,11 +3505,14 @@
             found = found && targetce == patternce[patternceindex]; 
             patternceindex ++;
         }
+        
+        targetce = firstce;
 
         if (!found) {
             if (U_FAILURE(*status)) {
                 break;
             }
+            
             textoffset = reverseShift(strsrch, textoffset, targetce, 
                                       patternceindex);
             patternceindex = 0;

Modified: trunk/source/i18n/usrchimp.h
===================================================================
--- trunk/source/i18n/usrchimp.h	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/i18n/usrchimp.h	2008-03-24 11:52:37 UTC (rev 144)
@@ -1,6 +1,6 @@
 /*
 **********************************************************************
-*   Copyright (C) 2001-2004 IBM and others. All rights reserved.
+*   Copyright (C) 2001-2007 IBM and others. All rights reserved.
 **********************************************************************
 *   Date        Name        Description
 *  08/13/2001   synwee      Creation.
@@ -26,6 +26,7 @@
           int32_t             textLength; // exact length
           UBool               isOverlap;
           UBool               isCanonicalMatch;
+          UBreakIterator	 *internalBreakIter;  //internal character breakiterator
           UBreakIterator     *breakIter;
     // value USEARCH_DONE is the default value
     // if we are not at the start of the text or the end of the text, 

Added: trunk/source/i18n/zonemeta.cpp
===================================================================
--- trunk/source/i18n/zonemeta.cpp	                        (rev 0)
+++ trunk/source/i18n/zonemeta.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -0,0 +1,873 @@
+/*
+*******************************************************************************
+* Copyright (C) 2007, International Business Machines Corporation and         *
+* others. All Rights Reserved.                                                *
+*******************************************************************************
+*/
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_FORMATTING
+
+#include "zonemeta.h"
+
+#include "unicode/timezone.h"
+#include "unicode/ustring.h"
+#include "unicode/putil.h"
+
+#include "umutex.h"
+#include "uvector.h"
+#include "cmemory.h"
+#include "gregoimp.h"
+#include "cstring.h"
+#include "ucln_in.h"
+
+static UBool gZoneMetaInitialized = FALSE;
+
+// Metazone mapping tables
+static UMTX gZoneMetaLock = NULL;
+static U_NAMESPACE_QUALIFIER Hashtable *gCanonicalMap = NULL;
+static U_NAMESPACE_QUALIFIER Hashtable *gOlsonToMeta = NULL;
+static U_NAMESPACE_QUALIFIER Hashtable *gMetaToOlson = NULL;
+
+U_CDECL_BEGIN
+/**
+ * Cleanup callback func
+ */
+static UBool U_CALLCONV zoneMeta_cleanup(void)
+{
+     umtx_destroy(&gZoneMetaLock);
+
+    if (gCanonicalMap != NULL) {
+        delete gCanonicalMap;
+        gCanonicalMap = NULL;
+    }
+
+    if (gOlsonToMeta != NULL) {
+        delete gOlsonToMeta;
+        gOlsonToMeta = NULL;
+    }
+
+    if (gMetaToOlson != NULL) {
+        delete gMetaToOlson;
+        gMetaToOlson = NULL;
+    }
+
+    gZoneMetaInitialized = FALSE;
+
+    return TRUE;
+}
+
+/**
+ * Deleter for UVector
+ */
+static void U_CALLCONV
+deleteUVector(void *obj) {
+   delete (U_NAMESPACE_QUALIFIER UVector*) obj;
+}
+
+/**
+ * Deleter for CanonicalMapEntry
+ */
+static void U_CALLCONV
+deleteCanonicalMapEntry(void *obj) {
+    U_NAMESPACE_QUALIFIER CanonicalMapEntry *entry = (U_NAMESPACE_QUALIFIER CanonicalMapEntry*)obj;
+    uprv_free(entry->id);
+    uprv_free(entry);
+}
+
+/**
+ * Deleter for OlsonToMetaMappingEntry
+ */
+static void U_CALLCONV
+deleteOlsonToMetaMappingEntry(void *obj) {
+    U_NAMESPACE_QUALIFIER OlsonToMetaMappingEntry *entry = (U_NAMESPACE_QUALIFIER OlsonToMetaMappingEntry*)obj;
+    uprv_free(entry);
+}
+
+/**
+ * Deleter for MetaToOlsonMappingEntry
+ */
+static void U_CALLCONV
+deleteMetaToOlsonMappingEntry(void *obj) {
+    U_NAMESPACE_QUALIFIER MetaToOlsonMappingEntry *entry = (U_NAMESPACE_QUALIFIER MetaToOlsonMappingEntry*)obj;
+    uprv_free(entry->territory);
+    uprv_free(entry);
+}
+U_CDECL_END
+
+U_NAMESPACE_BEGIN
+
+#define ZID_KEY_MAX 128
+static const char gZoneStringsTag[]     = "zoneStrings";
+static const char gUseMetazoneTag[]     = "um";
+
+static const char gSupplementalData[]   = "supplementalData";
+static const char gMapTimezonesTag[]    = "mapTimezones";
+static const char gMetazonesTag[]       = "metazones";
+static const char gZoneFormattingTag[]  = "zoneFormatting";
+static const char gTerritoryTag[]       = "territory";
+static const char gAliasesTag[]         = "aliases";
+static const char gMultizoneTag[]       = "multizone";
+
+static const char gMetazoneInfo[]       = "metazoneInfo";
+static const char gMetazoneMappings[]   = "metazoneMappings";
+
+#define MZID_PREFIX_LEN 5
+static const char gMetazoneIdPrefix[]   = "meta:";
+
+static const UChar gWorld[] = {0x30, 0x30, 0x31, 0x00}; // "001"
+
+#define ASCII_DIGIT(c) (((c)>=0x30 && (c)<=0x39) ? (c)-0x30 : -1)
+
+/*
+ * Convert a date string used by metazone mappings to UDate.
+ * The format used by CLDR metazone mapping is "yyyy-MM-dd HH:mm".
+ */
+ static UDate parseDate (const UChar *text, UErrorCode &status) {
+    if (U_FAILURE(status)) {
+        return 0;
+    }
+    int32_t len = u_strlen(text);
+    if (len != 16 && len != 10) {
+        // It must be yyyy-MM-dd HH:mm (length 16) or yyyy-MM-dd (length 10)
+        status = U_INVALID_FORMAT_ERROR;
+        return 0;
+    }
+
+    int32_t year = 0, month = 0, day = 0, hour = 0, min = 0, n;
+    int32_t idx;
+
+    // "yyyy" (0 - 3)
+    for (idx = 0; idx <= 3 && U_SUCCESS(status); idx++) {
+        n = ASCII_DIGIT(text[idx]);
+        if (n >= 0) {
+            year = 10*year + n;
+        } else {
+            status = U_INVALID_FORMAT_ERROR;
+        }
+    }
+    // "MM" (5 - 6)
+    for (idx = 5; idx <= 6 && U_SUCCESS(status); idx++) {
+        n = ASCII_DIGIT(text[idx]);
+        if (n >= 0) {
+            month = 10*month + n;
+        } else {
+            status = U_INVALID_FORMAT_ERROR;
+        }
+    }
+    // "dd" (8 - 9)
+    for (idx = 8; idx <= 9 && U_SUCCESS(status); idx++) {
+        n = ASCII_DIGIT(text[idx]);
+        if (n >= 0) {
+            day = 10*day + n;
+        } else {
+            status = U_INVALID_FORMAT_ERROR;
+        }
+    }
+    if (len == 16) {
+        // "HH" (11 - 12)
+        for (idx = 11; idx <= 12 && U_SUCCESS(status); idx++) {
+            n = ASCII_DIGIT(text[idx]);
+            if (n >= 0) {
+                hour = 10*hour + n;
+            } else {
+                status = U_INVALID_FORMAT_ERROR;
+            }
+        }
+        // "mm" (14 - 15)
+        for (idx = 14; idx <= 15 && U_SUCCESS(status); idx++) {
+            n = ASCII_DIGIT(text[idx]);
+            if (n >= 0) {
+                min = 10*min + n;
+            } else {
+                status = U_INVALID_FORMAT_ERROR;
+            }
+        }
+    }
+
+    if (U_SUCCESS(status)) {
+        UDate date = Grego::fieldsToDay(year, month - 1, day) * U_MILLIS_PER_DAY
+            + hour * U_MILLIS_PER_HOUR + min * U_MILLIS_PER_MINUTE;
+        return date;
+    }
+    return 0;
+}
+
+ /*
+ * Initialize global objects
+ */
+void
+ZoneMeta::initialize(void) {
+    UBool initialized;
+    UMTX_CHECK(&gZoneMetaLock, gZoneMetaInitialized, initialized);
+    if (initialized) {
+        return;
+    }
+
+    // Initialize hash tables
+    Hashtable *tmpCanonicalMap = createCanonicalMap();
+    Hashtable *tmpOlsonToMeta = createOlsonToMetaMap();
+    if (tmpOlsonToMeta == NULL) {
+        // With ICU 3.8 data
+        tmpOlsonToMeta = createOlsonToMetaMapOld();
+    }
+    Hashtable *tmpMetaToOlson = createMetaToOlsonMap();
+
+    umtx_lock(&gZoneMetaLock);
+    if (gZoneMetaInitialized) {
+        // Another thread already created mappings
+        delete tmpCanonicalMap;
+        delete tmpOlsonToMeta;
+        delete tmpMetaToOlson;
+    } else {
+        gZoneMetaInitialized = TRUE;
+        gCanonicalMap = tmpCanonicalMap;
+        gOlsonToMeta = tmpOlsonToMeta;
+        gMetaToOlson = tmpMetaToOlson;
+        ucln_i18n_registerCleanup(UCLN_I18N_ZONEMETA, zoneMeta_cleanup);
+    }
+    umtx_unlock(&gZoneMetaLock);
+}
+
+Hashtable*
+ZoneMeta::createCanonicalMap(void) {
+    UErrorCode status = U_ZERO_ERROR;
+
+    Hashtable *canonicalMap = NULL;
+    UResourceBundle *zoneFormatting = NULL;
+    UResourceBundle *tzitem = NULL;
+    UResourceBundle *aliases = NULL;
+
+    canonicalMap = new Hashtable(uhash_compareUnicodeString, NULL, status);
+    if (U_FAILURE(status)) {
+        return NULL;
+    }
+    canonicalMap->setValueDeleter(deleteCanonicalMapEntry);
+
+    zoneFormatting = ures_openDirect(NULL, gSupplementalData, &status);
+    zoneFormatting = ures_getByKey(zoneFormatting, gZoneFormattingTag, zoneFormatting, &status);
+    if (U_FAILURE(status)) {
+        goto error_cleanup;
+    }
+
+    while (ures_hasNext(zoneFormatting)) {
+        tzitem = ures_getNextResource(zoneFormatting, tzitem, &status);
+        if (U_FAILURE(status)) {
+            status = U_ZERO_ERROR;
+            continue;
+        }
+        if (ures_getType(tzitem) != URES_TABLE) {
+            continue;
+        }
+
+        int32_t territoryLen;
+        const UChar *territory = ures_getStringByKey(tzitem, gTerritoryTag, &territoryLen, &status);
+        if (U_FAILURE(status)) {
+            territory = NULL;
+            status = U_ZERO_ERROR;
+        }
+
+        int32_t tzidLen = 0;
+        char tzid[ZID_KEY_MAX];
+        const char *tzkey = ures_getKey(tzitem);
+        uprv_strcpy(tzid, tzkey);
+        // Replace ':' with '/'
+        char *p = tzid;
+        while (*p) {
+            if (*p == ':') {
+                *p = '/';
+            }
+            p++;
+            tzidLen++;
+        }
+
+        // Create canonical map entry
+        CanonicalMapEntry *entry = (CanonicalMapEntry*)uprv_malloc(sizeof(CanonicalMapEntry));
+        if (entry == NULL) {
+            status = U_MEMORY_ALLOCATION_ERROR;
+            goto error_cleanup;
+        }
+        entry->id = (UChar*)uprv_malloc((tzidLen + 1) * sizeof(UChar));
+        if (entry->id == NULL) {
+            status = U_MEMORY_ALLOCATION_ERROR;
+            uprv_free(entry);
+            goto error_cleanup;
+        }
+        u_charsToUChars(tzid, entry->id, tzidLen + 1);
+
+        if (territory == NULL || u_strcmp(territory, gWorld) == 0) {
+            entry->country = NULL;
+        } else {
+            entry->country = territory;
+        }
+
+        // Put this entry to the table
+        canonicalMap->put(UnicodeString(entry->id), entry, status);
+        if (U_FAILURE(status)) {
+            deleteCanonicalMapEntry(entry);
+            goto error_cleanup;
+        }
+
+        // Get aliases
+        aliases = ures_getByKey(tzitem, gAliasesTag, aliases, &status);
+        if (U_FAILURE(status)) {
+            // No aliases
+            status = U_ZERO_ERROR;
+            continue;
+        }
+
+        while (ures_hasNext(aliases)) {
+            const UChar* alias = ures_getNextString(aliases, NULL, NULL, &status);
+            if (U_FAILURE(status)) {
+                status = U_ZERO_ERROR;
+                continue;
+            }
+            // Create canonical map entry for this alias
+            entry = (CanonicalMapEntry*)uprv_malloc(sizeof(CanonicalMapEntry));
+            if (entry == NULL) {
+                status = U_MEMORY_ALLOCATION_ERROR;
+                goto error_cleanup;
+            }
+            entry->id = (UChar*)uprv_malloc((tzidLen + 1) * sizeof(UChar));
+            if (entry->id == NULL) {
+                status = U_MEMORY_ALLOCATION_ERROR;
+                uprv_free(entry);
+                goto error_cleanup;
+            }
+            u_charsToUChars(tzid, entry->id, tzidLen + 1);
+
+            if (territory  == NULL || u_strcmp(territory, gWorld) == 0) {
+                entry->country = NULL;
+            } else {
+                entry->country = territory;
+            }
+            canonicalMap->put(UnicodeString(alias), entry, status);
+            if (U_FAILURE(status)) {
+                deleteCanonicalMapEntry(entry);
+                goto error_cleanup;
+            }
+        }
+    }
+
+normal_cleanup:
+    ures_close(aliases);
+    ures_close(tzitem);
+    ures_close(zoneFormatting);
+    return canonicalMap;
+
+error_cleanup:
+    delete canonicalMap;
+    canonicalMap = NULL;
+
+    goto normal_cleanup;
+}
+
+/*
+ * Creating Olson tzid to metazone mappings from resource (3.8.1 and beyond)
+ */
+Hashtable*
+ZoneMeta::createOlsonToMetaMap(void) {
+    UErrorCode status = U_ZERO_ERROR;
+
+    Hashtable *olsonToMeta = NULL;
+    UResourceBundle *metazoneMappings = NULL;
+    UResourceBundle *zoneItem = NULL;
+    UResourceBundle *mz = NULL;
+    StringEnumeration *tzids = NULL;
+
+    olsonToMeta = new Hashtable(uhash_compareUnicodeString, NULL, status);
+    if (U_FAILURE(status)) {
+        return NULL;
+    }
+    olsonToMeta->setValueDeleter(deleteUVector);
+
+    // Read metazone mappings from metazoneInfo bundle
+    metazoneMappings = ures_openDirect(NULL, gMetazoneInfo, &status);
+    metazoneMappings = ures_getByKey(metazoneMappings, gMetazoneMappings, metazoneMappings, &status);
+    if (U_FAILURE(status)) {
+        goto error_cleanup;
+    }
+
+    // Walk through all canonical tzids
+    char zidkey[ZID_KEY_MAX];
+
+    tzids = TimeZone::createEnumeration();
+    const UnicodeString *tzid;
+    while ((tzid = tzids->snext(status))) {
+        if (U_FAILURE(status)) {
+            goto error_cleanup;
+        }
+        // We may skip aliases, because the bundle
+        // contains only canonical IDs.  For now, try
+        // all of them.
+        tzid->extract(0, tzid->length(), zidkey, (int)sizeof(zidkey), US_INV);
+        zidkey[sizeof(zidkey)-1] = 0; // NULL terminate just in case.
+
+        // Replace '/' with ':'
+        UBool foundSep = FALSE;
+        char *p = zidkey;
+        while (*p) {
+            if (*p == '/') {
+                *p = ':';
+                foundSep = TRUE;
+            }
+            p++;
+        }
+        if (!foundSep) {
+            // A valid time zone key has at least one separator
+            continue;
+        }
+
+        zoneItem = ures_getByKey(metazoneMappings, zidkey, zoneItem, &status);
+        if (U_FAILURE(status)) {
+            status = U_ZERO_ERROR;
+            continue;
+        }
+
+        UVector *mzMappings = NULL;
+        while (ures_hasNext(zoneItem)) {
+            mz = ures_getNextResource(zoneItem, mz, &status);
+            const UChar *mz_name = ures_getStringByIndex(mz, 0, NULL, &status);
+            const UChar *mz_from = ures_getStringByIndex(mz, 1, NULL, &status);
+            const UChar *mz_to   = ures_getStringByIndex(mz, 2, NULL, &status);
+
+            if(U_FAILURE(status)){
+                status = U_ZERO_ERROR;
+                continue;
+            }
+            // We do not want to use SimpleDateformat to parse boundary dates,
+            // because this code could be triggered by the initialization code
+            // used by SimpleDateFormat.
+            UDate from = parseDate(mz_from, status);
+            UDate to = parseDate(mz_to, status);
+            if (U_FAILURE(status)) {
+                status = U_ZERO_ERROR;
+                continue;
+            }
+
+            OlsonToMetaMappingEntry *entry = (OlsonToMetaMappingEntry*)uprv_malloc(sizeof(OlsonToMetaMappingEntry));
+            if (entry == NULL) {
+                status = U_MEMORY_ALLOCATION_ERROR;
+                break;
+            }
+            entry->mzid = mz_name;
+            entry->from = from;
+            entry->to = to;
+
+            if (mzMappings == NULL) {
+                mzMappings = new UVector(deleteOlsonToMetaMappingEntry, NULL, status);
+                if (U_FAILURE(status)) {
+                    delete mzMappings;
+                    deleteOlsonToMetaMappingEntry(entry);
+                    uprv_free(entry);
+                    break;
+                }
+            }
+
+            mzMappings->addElement(entry, status);
+            if (U_FAILURE(status)) {
+                break;
+            }
+        }
+
+        if (U_FAILURE(status)) {
+            if (mzMappings != NULL) {
+                delete mzMappings;
+            }
+            goto error_cleanup;
+        }
+        if (mzMappings != NULL) {
+            olsonToMeta->put(*tzid, mzMappings, status);
+            if (U_FAILURE(status)) {
+                delete mzMappings;
+                goto error_cleanup;
+            }
+        }
+    }
+
+normal_cleanup:
+    if (tzids != NULL) {
+        delete tzids;
+    }
+    ures_close(zoneItem);
+    ures_close(mz);
+    ures_close(metazoneMappings);
+    return olsonToMeta;
+
+error_cleanup:
+    if (olsonToMeta != NULL) {
+        delete olsonToMeta;
+        olsonToMeta = NULL;
+    }
+    goto normal_cleanup;
+}
+
+/*
+ * Creating Olson tzid to metazone mappings from ICU resource (3.8)
+ */
+Hashtable*
+ZoneMeta::createOlsonToMetaMapOld(void) {
+    UErrorCode status = U_ZERO_ERROR;
+
+    Hashtable *olsonToMeta = NULL;
+    UResourceBundle *zoneStringsArray = NULL;
+    UResourceBundle *mz = NULL;
+    UResourceBundle *zoneItem = NULL;
+    UResourceBundle *useMZ = NULL;
+    StringEnumeration *tzids = NULL;
+
+    olsonToMeta = new Hashtable(uhash_compareUnicodeString, NULL, status);
+    if (U_FAILURE(status)) {
+        return NULL;
+    }
+    olsonToMeta->setValueDeleter(deleteUVector);
+
+    // Read metazone mappings from root bundle
+    zoneStringsArray = ures_openDirect(NULL, "", &status);
+    zoneStringsArray = ures_getByKey(zoneStringsArray, gZoneStringsTag, zoneStringsArray, &status);
+    if (U_FAILURE(status)) {
+        goto error_cleanup;
+    }
+
+    // Walk through all canonical tzids
+    char zidkey[ZID_KEY_MAX];
+
+    tzids = TimeZone::createEnumeration();
+    const UnicodeString *tzid;
+    while ((tzid = tzids->snext(status))) {
+        if (U_FAILURE(status)) {
+            goto error_cleanup;
+        }
+        // We may skip aliases, because the bundle
+        // contains only canonical IDs.  For now, try
+        // all of them.
+        tzid->extract(0, tzid->length(), zidkey, (int)sizeof(zidkey), US_INV);
+        zidkey[sizeof(zidkey)-1] = 0; // NULL terminate just in case.
+
+        // Replace '/' with ':'
+        UBool foundSep = FALSE;
+        char *p = zidkey;
+        while (*p) {
+            if (*p == '/') {
+                *p = ':';
+                foundSep = TRUE;
+            }
+            p++;
+        }
+        if (!foundSep) {
+            // A valid time zone key has at least one separator
+            continue;
+        }
+
+        zoneItem = ures_getByKey(zoneStringsArray, zidkey, zoneItem, &status);
+        useMZ = ures_getByKey(zoneItem, gUseMetazoneTag, useMZ, &status);
+        if (U_FAILURE(status)) {
+            status = U_ZERO_ERROR;
+            continue;
+        }
+
+        UVector *mzMappings = NULL;
+        while (ures_hasNext(useMZ)) {
+            mz = ures_getNextResource(useMZ, mz, &status);
+            const UChar *mz_name = ures_getStringByIndex(mz, 0, NULL, &status);
+            const UChar *mz_from = ures_getStringByIndex(mz, 1, NULL, &status);
+            const UChar *mz_to   = ures_getStringByIndex(mz, 2, NULL, &status);
+
+            if(U_FAILURE(status)){
+                status = U_ZERO_ERROR;
+                continue;
+            }
+            // We do not want to use SimpleDateformat to parse boundary dates,
+            // because this code could be triggered by the initialization code
+            // used by SimpleDateFormat.
+            UDate from = parseDate(mz_from, status);
+            UDate to = parseDate(mz_to, status);
+            if (U_FAILURE(status)) {
+                status = U_ZERO_ERROR;
+                continue;
+            }
+
+            OlsonToMetaMappingEntry *entry = (OlsonToMetaMappingEntry*)uprv_malloc(sizeof(OlsonToMetaMappingEntry));
+            if (entry == NULL) {
+                status = U_MEMORY_ALLOCATION_ERROR;
+                break;
+            }
+            entry->mzid = mz_name;
+            entry->from = from;
+            entry->to = to;
+
+            if (mzMappings == NULL) {
+                mzMappings = new UVector(deleteOlsonToMetaMappingEntry, NULL, status);
+                if (U_FAILURE(status)) {
+                    delete mzMappings;
+                    deleteOlsonToMetaMappingEntry(entry);
+                    uprv_free(entry);
+                    break;
+                }
+            }
+
+            mzMappings->addElement(entry, status);
+            if (U_FAILURE(status)) {
+                break;
+            }
+        }
+
+        if (U_FAILURE(status)) {
+            if (mzMappings != NULL) {
+                delete mzMappings;
+            }
+            goto error_cleanup;
+        }
+        if (mzMappings != NULL) {
+            olsonToMeta->put(*tzid, mzMappings, status);
+            if (U_FAILURE(status)) {
+                delete mzMappings;
+                goto error_cleanup;
+            }
+        }
+    }
+
+normal_cleanup:
+    if (tzids != NULL) {
+        delete tzids;
+    }
+    ures_close(zoneItem);
+    ures_close(useMZ);
+    ures_close(mz);
+    ures_close(zoneStringsArray);
+    return olsonToMeta;
+
+error_cleanup:
+    if (olsonToMeta != NULL) {
+        delete olsonToMeta;
+    }
+    goto normal_cleanup;
+}
+
+Hashtable*
+ZoneMeta::createMetaToOlsonMap(void) {
+    UErrorCode status = U_ZERO_ERROR;
+
+    Hashtable *metaToOlson = NULL;
+    UResourceBundle *metazones = NULL;
+    UResourceBundle *mz = NULL;
+
+    metaToOlson = new Hashtable(uhash_compareUnicodeString, NULL, status);
+    if (U_FAILURE(status)) {
+        return NULL;
+    }
+    metaToOlson->setValueDeleter(deleteUVector);
+
+    metazones = ures_openDirect(NULL, gSupplementalData, &status);
+    metazones = ures_getByKey(metazones, gMapTimezonesTag, metazones, &status);
+    metazones = ures_getByKey(metazones, gMetazonesTag, metazones, &status);
+    if (U_FAILURE(status)) {
+        goto error_cleanup;
+    }
+
+    while (ures_hasNext(metazones)) {
+        mz = ures_getNextResource(metazones, mz, &status);
+        if (U_FAILURE(status)) {
+            status = U_ZERO_ERROR;
+            continue;
+        }
+        const char *mzkey = ures_getKey(mz);
+        if (uprv_strncmp(mzkey, gMetazoneIdPrefix, MZID_PREFIX_LEN) == 0) {
+            const char *mzid = mzkey + MZID_PREFIX_LEN;
+            const char *territory = uprv_strrchr(mzid, '_');
+            int32_t mzidLen = 0;
+            int32_t territoryLen = 0;
+            if (territory) {
+                mzidLen = territory - mzid;
+                territory++;
+                territoryLen = uprv_strlen(territory);
+            }
+            if (mzidLen > 0 && territoryLen > 0) {
+                int32_t tzidLen;
+                const UChar *tzid = ures_getStringByIndex(mz, 0, &tzidLen, &status);
+                if (U_SUCCESS(status)) {
+                    // Create MetaToOlsonMappingEntry
+                    MetaToOlsonMappingEntry *entry = (MetaToOlsonMappingEntry*)uprv_malloc(sizeof(MetaToOlsonMappingEntry));
+                    if (entry == NULL) {
+                        status = U_MEMORY_ALLOCATION_ERROR;
+                        goto error_cleanup;
+                    }
+                    entry->id = tzid;
+                    entry->territory = (UChar*)uprv_malloc((territoryLen + 1) * sizeof(UChar));
+                    if (entry->territory == NULL) {
+                        status = U_MEMORY_ALLOCATION_ERROR;
+                        uprv_free(entry);
+                        goto error_cleanup;
+                    }
+                    u_charsToUChars(territory, entry->territory, territoryLen + 1);
+
+                    // Check if mapping entries for metazone is already available
+                    UnicodeString mzidStr(mzid, mzidLen, US_INV);
+                    UVector *tzMappings = (UVector*)metaToOlson->get(mzidStr);
+                    if (tzMappings == NULL) {
+                        // Create new UVector and put it into the hashtable
+                        tzMappings = new UVector(deleteMetaToOlsonMappingEntry, NULL, status);
+                        metaToOlson->put(mzidStr, tzMappings, status);
+                        if (U_FAILURE(status)) {
+                            if (tzMappings != NULL) {
+                                delete tzMappings;
+                            }
+                            deleteMetaToOlsonMappingEntry(entry);
+                            goto error_cleanup;
+                        }
+                    }
+                    tzMappings->addElement(entry, status);
+                    if (U_FAILURE(status)) {
+                        goto error_cleanup;
+                    }
+                } else {
+                    status = U_ZERO_ERROR;
+                }
+            }
+        }
+    }
+
+normal_cleanup:
+    ures_close(mz);
+    ures_close(metazones);
+    return metaToOlson;
+
+error_cleanup:
+    if (metaToOlson != NULL) {
+        delete metaToOlson;
+    }
+    goto normal_cleanup;
+}
+
+UnicodeString&
+ZoneMeta::getCanonicalID(const UnicodeString &tzid, UnicodeString &canonicalID) {
+    const CanonicalMapEntry *entry = getCanonicalInfo(tzid);
+    if (entry != NULL) {
+        canonicalID.setTo(entry->id);
+    } else {
+        // Use the input tzid
+        canonicalID.setTo(tzid);
+    }
+    return canonicalID;
+}
+
+UnicodeString&
+ZoneMeta::getCanonicalCountry(const UnicodeString &tzid, UnicodeString &canonicalCountry) {
+    const CanonicalMapEntry *entry = getCanonicalInfo(tzid);
+    if (entry != NULL && entry->country != NULL) {
+        canonicalCountry.setTo(entry->country);
+    } else {
+        // Use the input tzid
+        canonicalCountry.remove();
+    }
+    return canonicalCountry;
+}
+
+const CanonicalMapEntry*
+ZoneMeta::getCanonicalInfo(const UnicodeString &tzid) {
+    initialize();
+    CanonicalMapEntry *entry = NULL;
+    UnicodeString canonicalOlsonId;
+    TimeZone::getOlsonCanonicalID(tzid, canonicalOlsonId);
+    if (!canonicalOlsonId.isEmpty()) {
+        if (gCanonicalMap != NULL) {
+            entry = (CanonicalMapEntry*)gCanonicalMap->get(tzid);
+        }
+    }
+    return entry;
+}
+
+UnicodeString&
+ZoneMeta::getSingleCountry(const UnicodeString &tzid, UnicodeString &country) {
+    UErrorCode status = U_ZERO_ERROR;
+
+    // Get canonical country for the zone
+    getCanonicalCountry(tzid, country);
+
+    if (!country.isEmpty()) { 
+        UResourceBundle *supplementalDataBundle = ures_openDirect(NULL, gSupplementalData, &status);
+        UResourceBundle *zoneFormatting = ures_getByKey(supplementalDataBundle, gZoneFormattingTag, NULL, &status);
+        UResourceBundle *multizone = ures_getByKey(zoneFormatting, gMultizoneTag, NULL, &status);
+
+        if (U_SUCCESS(status)) {
+            while (ures_hasNext(multizone)) {
+                int32_t len;
+                const UChar* multizoneCountry = ures_getNextString(multizone, &len, NULL, &status);
+                if (country.compare(multizoneCountry, len) == 0) {
+                    // Included in the multizone country list
+                    country.remove();
+                    break;
+                }
+            }
+        }
+
+        ures_close(multizone);
+        ures_close(zoneFormatting);
+        ures_close(supplementalDataBundle);
+    }
+
+    return country;
+}
+
+UnicodeString&
+ZoneMeta::getMetazoneID(const UnicodeString &tzid, UDate date, UnicodeString &result) {
+    UBool isSet = FALSE;
+    const UVector *mappings = getMetazoneMappings(tzid);
+    if (mappings != NULL) {
+        for (int32_t i = 0; i < mappings->size(); i++) {
+            OlsonToMetaMappingEntry *mzm = (OlsonToMetaMappingEntry*)mappings->elementAt(i);
+            if (mzm->from <= date && mzm->to > date) {
+                result.setTo(mzm->mzid, -1);
+                isSet = TRUE;
+                break;
+            }
+        }
+    }
+    if (!isSet) {
+        result.remove();
+    }
+    return result;
+}
+
+const UVector*
+ZoneMeta::getMetazoneMappings(const UnicodeString &tzid) {
+    initialize();
+    const UVector *result = NULL;
+    if (gOlsonToMeta != NULL) {
+        result = (UVector*)gOlsonToMeta->get(tzid);
+    }
+    return result;
+}
+
+UnicodeString&
+ZoneMeta::getZoneIdByMetazone(const UnicodeString &mzid, const UnicodeString &region, UnicodeString &result) {
+    initialize();
+    UBool isSet = FALSE;
+    if (gMetaToOlson != NULL) {
+        UVector *mappings = (UVector*)gMetaToOlson->get(mzid);
+        if (mappings != NULL) {
+            // Find a preferred time zone for the given region.
+            for (int32_t i = 0; i < mappings->size(); i++) {
+                MetaToOlsonMappingEntry *olsonmap = (MetaToOlsonMappingEntry*)mappings->elementAt(i);
+                if (region.compare(olsonmap->territory, -1) == 0) {
+                    result.setTo(olsonmap->id);
+                    isSet = TRUE;
+                    break;
+                } else if (u_strcmp(olsonmap->territory, gWorld) == 0) {
+                    result.setTo(olsonmap->id);
+                    isSet = TRUE;
+                }
+            }
+        }
+    }
+    if (!isSet) {
+        result.remove();
+    }
+    return result;
+}
+
+
+U_NAMESPACE_END
+
+#endif /* #if !UCONFIG_NO_FORMATTING */

Added: trunk/source/i18n/zonemeta.h
===================================================================
--- trunk/source/i18n/zonemeta.h	                        (rev 0)
+++ trunk/source/i18n/zonemeta.h	2008-03-24 11:52:37 UTC (rev 144)
@@ -0,0 +1,84 @@
+/*
+*******************************************************************************
+* Copyright (C) 2007, International Business Machines Corporation and         *
+* others. All Rights Reserved.                                                *
+*******************************************************************************
+*/
+#ifndef ZONEMETA_H
+#define ZONEMETA_H
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_FORMATTING
+
+#include "unicode/unistr.h"
+#include "hash.h"
+
+U_NAMESPACE_BEGIN
+
+typedef struct CanonicalMapEntry {
+    UChar *id;
+    const UChar *country; // const because it's a reference to a resource bundle string.
+} CanonicalMapEntry;
+
+typedef struct OlsonToMetaMappingEntry {
+    const UChar *mzid; // const because it's a reference to a resource bundle string.
+    UDate from;
+    UDate to;
+} OlsonToMetaMappingEntry;
+
+typedef struct MetaToOlsonMappingEntry {
+    const UChar *id; // const because it's a reference to a resource bundle string.
+    UChar *territory;
+} MetaToOlsonMappingEntry;
+
+class UVector;
+
+class U_I18N_API ZoneMeta {
+public:
+    /**
+     * Return the canonical id for this tzid, which might be the id itself.
+     * If there is no canonical id for it, return the passed-in id.
+     */
+    static UnicodeString& getCanonicalID(const UnicodeString &tzid, UnicodeString &canonicalID);
+
+    /**
+     * Return the canonical country code for this tzid.  If we have none, or if the time zone
+     * is not associated with a country, return null.
+     */
+    static UnicodeString& getCanonicalCountry(const UnicodeString &tzid, UnicodeString &canonicalCountry);
+
+    /**
+     * Return the country code if this is a 'single' time zone that can fallback to just
+     * the country, otherwise return empty string.  (Note, one must also check the locale data
+     * to see that there is a localization for the country in order to implement
+     * tr#35 appendix J step 5.)
+     */
+    static UnicodeString& getSingleCountry(const UnicodeString &tzid, UnicodeString &country);
+
+    /**
+     * Returns a CLDR metazone ID for the given Olson tzid and time.
+     */
+    static UnicodeString& getMetazoneID(const UnicodeString &tzid, UDate date, UnicodeString &result);
+    /**
+     * Returns an Olson ID for the ginve metazone and region
+     */
+    static UnicodeString& getZoneIdByMetazone(const UnicodeString &mzid, const UnicodeString &region, UnicodeString &result);
+
+    static const UVector* getMetazoneMappings(const UnicodeString &tzid);
+
+private:
+    static void initialize(void);
+
+    static const CanonicalMapEntry* getCanonicalInfo(const UnicodeString &tzid);
+
+    static Hashtable* createCanonicalMap(void);
+    static Hashtable* createOlsonToMetaMapOld(void);
+    static Hashtable* createOlsonToMetaMap(void);
+    static Hashtable* createMetaToOlsonMap(void);
+};
+
+U_NAMESPACE_END
+
+#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif // ZONEMETA_H

Added: trunk/source/i18n/zstrfmt.cpp
===================================================================
--- trunk/source/i18n/zstrfmt.cpp	                        (rev 0)
+++ trunk/source/i18n/zstrfmt.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -0,0 +1,1604 @@
+/*
+*******************************************************************************
+* Copyright (C) 2007, International Business Machines Corporation and         *
+* others. All Rights Reserved.                                                *
+*******************************************************************************
+*/
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_FORMATTING
+
+#include "zstrfmt.h"
+
+#include "unicode/ustring.h"
+#include "unicode/putil.h"
+#include "unicode/msgfmt.h"
+#include "unicode/basictz.h"
+#include "unicode/simpletz.h"
+#include "unicode/rbtz.h"
+#include "unicode/vtzone.h"
+
+#include "uvector.h"
+#include "cstring.h"
+#include "cmemory.h"
+#include "uresimp.h"
+#include "zonemeta.h"
+#include "olsontz.h"
+#include "umutex.h"
+#include "ucln_in.h"
+
+/**
+ * global ZoneStringFormatCache stuffs
+ */
+static UMTX gZSFCacheLock = NULL;
+static U_NAMESPACE_QUALIFIER ZSFCache *gZoneStringFormatCache = NULL;
+
+U_CDECL_BEGIN
+/**
+ * ZoneStringFormatCache cleanup callback func
+ */
+static UBool U_CALLCONV zoneStringFormat_cleanup(void)
+{
+    umtx_destroy(&gZSFCacheLock);
+    if (gZoneStringFormatCache != NULL) {
+        delete gZoneStringFormatCache;
+        gZoneStringFormatCache = NULL;
+    }
+    gZoneStringFormatCache = NULL;
+    return TRUE;
+}
+
+/**
+ * Deleter for ZoneStringInfo
+ */
+static void U_CALLCONV
+deleteZoneStringInfo(void *obj) {
+    delete (U_NAMESPACE_QUALIFIER ZoneStringInfo*)obj;
+}
+
+/**
+ * Deleter for ZoneStrings
+ */
+static void U_CALLCONV
+deleteZoneStrings(void *obj) {
+    delete (U_NAMESPACE_QUALIFIER ZoneStrings*)obj;
+}
+U_CDECL_END
+
+U_NAMESPACE_BEGIN
+
+#define ZID_KEY_MAX 128
+
+static const char gCountriesTag[]       = "Countries";
+static const char gZoneStringsTag[]     = "zoneStrings";
+static const char gShortGenericTag[]    = "sg";
+static const char gShortStandardTag[]   = "ss";
+static const char gShortDaylightTag[]   = "sd";
+static const char gLongGenericTag[]     = "lg";
+static const char gLongStandardTag[]    = "ls";
+static const char gLongDaylightTag[]    = "ld";
+static const char gExemplarCityTag[]    = "ec";
+static const char gCommonlyUsedTag[]    = "cu";
+static const char gFallbackFormatTag[]  = "fallbackFormat";
+static const char gRegionFormatTag[]    = "regionFormat";
+
+#define MZID_PREFIX_LEN 5
+static const char gMetazoneIdPrefix[]   = "meta:";
+
+#define MAX_METAZONES_PER_ZONE 10
+
+static const UChar gDefFallbackPattern[]    = {0x7B, 0x31, 0x7D, 0x20, 0x28, 0x7B, 0x30, 0x7D, 0x29, 0x00}; // "{1} ({0})"
+static const UChar gDefRegionPattern[]      = {0x7B, 0x30, 0x7D, 0x00}; // "{0}"
+static const UChar gCommonlyUsedTrue[]      = {0x31, 0x00}; // "1"
+
+static const double kDstCheckRange      = (double)184*U_MILLIS_PER_DAY;
+
+static int32_t
+getTimeZoneTranslationTypeIndex(TimeZoneTranslationType type) {
+    int32_t typeIdx = 0;
+    switch (type) {
+        case LOCATION:
+            typeIdx = ZSIDX_LOCATION;
+            break;
+        case GENERIC_LONG:
+            typeIdx = ZSIDX_LONG_GENERIC;
+            break;
+        case GENERIC_SHORT:
+            typeIdx = ZSIDX_SHORT_GENERIC;
+            break;
+        case STANDARD_LONG:
+            typeIdx = ZSIDX_LONG_STANDARD;
+            break;
+        case STANDARD_SHORT:
+            typeIdx = ZSIDX_SHORT_STANDARD;
+            break;
+        case DAYLIGHT_LONG:
+            typeIdx = ZSIDX_LONG_DAYLIGHT;
+            break;
+        case DAYLIGHT_SHORT:
+            typeIdx = ZSIDX_SHORT_DAYLIGHT;
+            break;
+    }
+    return typeIdx;
+}
+
+static int32_t
+getTimeZoneTranslationType(TimeZoneTranslationTypeIndex typeIdx) {
+    int32_t type = 0;
+    switch (typeIdx) {
+        case ZSIDX_LOCATION:
+            type = LOCATION;
+            break;
+        case ZSIDX_LONG_GENERIC:
+            type = GENERIC_LONG;
+            break;
+        case ZSIDX_SHORT_GENERIC:
+            type = GENERIC_SHORT;
+            break;
+        case ZSIDX_LONG_STANDARD:
+            type = STANDARD_LONG;
+            break;
+        case ZSIDX_SHORT_STANDARD:
+            type = STANDARD_SHORT;
+            break;
+        case ZSIDX_LONG_DAYLIGHT:
+            type = DAYLIGHT_LONG;
+            break;
+        case ZSIDX_SHORT_DAYLIGHT:
+            type = DAYLIGHT_SHORT;
+            break;
+    }
+    return type;
+}
+
+#define DEFAULT_CHARACTERNODE_CAPACITY 1
+
+// ----------------------------------------------------------------------------
+CharacterNode::CharacterNode(UChar32 c, UObjectDeleter *valueDeleterFunc, UErrorCode &status)
+: UMemory(),
+  fChildren(valueDeleterFunc, NULL, DEFAULT_CHARACTERNODE_CAPACITY, status),
+  fValues(valueDeleterFunc, NULL, DEFAULT_CHARACTERNODE_CAPACITY, status),
+  fValueDeleter(valueDeleterFunc),
+  fCharacter(c)
+{
+}
+
+CharacterNode::~CharacterNode() {
+    while (!fChildren.isEmpty()) {
+        CharacterNode *node = (CharacterNode*)fChildren.orphanElementAt(0);
+        delete node;
+    }
+}
+
+void
+CharacterNode::addValue(void *value, UErrorCode &status) {
+    if (U_FAILURE(status)) {
+        return;
+    }
+    fValues.addElement(value, status);
+}
+
+CharacterNode*
+CharacterNode::addChildNode(UChar32 c, UErrorCode &status) {
+    if (U_FAILURE(status)) {
+        return NULL;
+    }
+    CharacterNode *result = NULL;
+    for (int32_t i = 0; i < fChildren.size(); i++) {
+        CharacterNode *node = (CharacterNode*)fChildren.elementAt(i);
+        if (node->getCharacter() == c) {
+            result = node;
+            break;
+        }
+    }
+    if (result == NULL) {
+        result = new CharacterNode(c, fValueDeleter, status);
+        fChildren.addElement(result, status);
+    }
+
+    return result;
+}
+
+CharacterNode*
+CharacterNode::getChildNode(UChar32 c) const {
+    CharacterNode *result = NULL;
+    for (int32_t i = 0; i < fChildren.size(); i++) {
+        CharacterNode *node = (CharacterNode*)fChildren.elementAt(i);
+        if (node->getCharacter() == c) {
+            result = node;
+            break;
+        }
+    }
+    return result;
+}
+
+// ----------------------------------------------------------------------------
+TextTrieMap::TextTrieMap(UBool ignoreCase, UObjectDeleter *valueDeleterFunc)
+: UMemory(), fIgnoreCase(ignoreCase), fValueDeleter(valueDeleterFunc), fRoot(NULL) {
+}
+
+TextTrieMap::~TextTrieMap() {
+    if (fRoot != NULL) {
+        delete fRoot;
+    }
+}
+
+void
+TextTrieMap::put(const UnicodeString &key, void *value, UErrorCode &status) {
+    if (fRoot == NULL) {
+        fRoot = new CharacterNode(0, fValueDeleter, status);
+    }
+
+    UnicodeString keyString(key);
+    if (fIgnoreCase) {
+        keyString.foldCase();
+    }
+
+    CharacterNode *node = fRoot;
+    int32_t index = 0;
+    while (index < keyString.length()) {
+        UChar32 c = keyString.char32At(index);
+        node = node->addChildNode(c, status);  
+        if (U_FAILURE(status)) {
+            return;
+        }
+        index = keyString.moveIndex32(index, 1);
+    }
+    node->addValue(value, status);
+}
+
+void
+TextTrieMap::search(const UnicodeString &text, int32_t start,
+                  TextTrieMapSearchResultHandler *handler, UErrorCode &status) const {
+    if (fRoot == NULL) {
+        return;
+    }
+    search(fRoot, text, start, start, handler, status);
+}
+
+void
+TextTrieMap::search(CharacterNode *node, const UnicodeString &text, int32_t start,
+                  int32_t index, TextTrieMapSearchResultHandler *handler, UErrorCode &status) const {
+    if (U_FAILURE(status)) {
+        return;
+    }
+    const UVector *values = node->getValues();
+    if (values != NULL) {
+        if (!handler->handleMatch(index - start, values, status)) {
+            return;
+        }
+        if (U_FAILURE(status)) {
+            return;
+        }
+    }
+    UChar32 c = text.char32At(index);
+    if (fIgnoreCase) {
+        // size of character may grow after fold operation
+        UnicodeString tmp(c);
+        tmp.foldCase();
+        int32_t tmpidx = 0;
+        while (tmpidx < tmp.length()) {
+            c = tmp.char32At(tmpidx);
+            node = node->getChildNode(c);
+            if (node == NULL) {
+                break;
+            }
+            tmpidx = tmp.moveIndex32(tmpidx, 1);
+        }
+    } else {
+        node = node->getChildNode(c);
+    }
+    if (node != NULL) {
+        search(node, text, start, index+1, handler, status);
+    }
+}
+
+// ----------------------------------------------------------------------------
+ZoneStringInfo::ZoneStringInfo(const UnicodeString &id, const UnicodeString &str,
+                               TimeZoneTranslationType type)
+: UMemory(), fId(id), fStr(str), fType(type) {
+}
+
+ZoneStringInfo::~ZoneStringInfo() {
+}
+// ----------------------------------------------------------------------------
+ZoneStringSearchResultHandler::ZoneStringSearchResultHandler(UErrorCode &status)
+: UMemory(), fResults(status)
+{
+    clear();
+}
+
+ZoneStringSearchResultHandler::~ZoneStringSearchResultHandler() {
+    clear();
+}
+
+UBool
+ZoneStringSearchResultHandler::handleMatch(int32_t matchLength, const UVector *values, UErrorCode &status) {
+    if (U_FAILURE(status)) {
+        return FALSE;
+    }
+    if (values != NULL) {
+        for (int32_t i = 0; values->size(); i++) {
+            ZoneStringInfo *zsinfo = (ZoneStringInfo*)values->elementAt(i);
+            if (zsinfo == NULL) {
+                break;
+            }
+            // Update the results
+            UBool foundType = FALSE;
+            for (int32_t j = 0; j < fResults.size(); j++) {
+                ZoneStringInfo *tmp = (ZoneStringInfo*)fResults.elementAt(j);
+                if (zsinfo->fType == tmp->fType) {
+                    int32_t lenidx = getTimeZoneTranslationTypeIndex(tmp->fType);
+                    if (matchLength > fMatchLen[lenidx]) {
+                        // Same type, longer match
+                        fResults.setElementAt(zsinfo, j);
+                        fMatchLen[lenidx] = matchLength;
+                    }
+                    foundType = TRUE;
+                    break;
+                }
+            }
+            if (!foundType) {
+                // not found in the current list
+                fResults.addElement(zsinfo, status);
+                fMatchLen[getTimeZoneTranslationTypeIndex(zsinfo->fType)] = matchLength;
+            }
+        }
+    }
+    return TRUE;
+}
+
+int32_t
+ZoneStringSearchResultHandler::countMatches(void) {
+    return fResults.size();
+}
+
+const ZoneStringInfo*
+ZoneStringSearchResultHandler::getMatch(int32_t index, int32_t &matchLength) {
+    ZoneStringInfo *zsinfo = NULL;
+    if (index < fResults.size()) {
+        zsinfo = (ZoneStringInfo*)fResults.elementAt(index);
+        matchLength = fMatchLen[getTimeZoneTranslationTypeIndex(zsinfo->fType)];
+    }
+    return zsinfo;
+}
+
+void
+ZoneStringSearchResultHandler::clear(void) {
+    fResults.removeAllElements();
+    for (int32_t i = 0; i < (int32_t)(sizeof(fMatchLen)/sizeof(fMatchLen[0])); i++) {
+        fMatchLen[i] = 0;
+    }
+}
+// ----------------------------------------------------------------------------
+ZoneStringFormat::ZoneStringFormat(const UnicodeString* const* strings,
+                                   int32_t rowCount, int32_t columnCount, UErrorCode &status)
+: UMemory(),
+  fLocale(""),
+  fTzidToStrings(uhash_compareUnicodeString, NULL, status),
+  fMzidToStrings(uhash_compareUnicodeString, NULL, status),
+  fZoneStringsTrie(TRUE, deleteZoneStringInfo)
+{
+    if (U_FAILURE(status)) {
+        return;
+    }
+    fLocale.setToBogus();
+    if (strings == NULL || columnCount <= 0 || rowCount <= 0) {
+        status = U_ILLEGAL_ARGUMENT_ERROR;
+        return;
+    }
+
+    fTzidToStrings.setValueDeleter(deleteZoneStrings);
+
+    for (int32_t row = 0; row < rowCount; row++) {
+        if (strings[row][0].isEmpty()) {
+            continue;
+        }
+        UnicodeString *names = new UnicodeString[ZSIDX_COUNT];
+        for (int32_t col = 1; col < columnCount; col++) {
+            if (!strings[row][col].isEmpty()) {
+                int32_t typeIdx = -1;
+                switch (col) {
+                    case 1:
+                        typeIdx = ZSIDX_LONG_STANDARD;
+                        break;
+                    case 2:
+                        typeIdx = ZSIDX_SHORT_STANDARD;
+                        break;
+                    case 3:
+                        typeIdx = ZSIDX_LONG_DAYLIGHT;
+                        break;
+                    case 4:
+                        typeIdx = ZSIDX_SHORT_DAYLIGHT;
+                        break;
+                    case 5:
+                        typeIdx = ZSIDX_LOCATION;
+                        break;
+                    case 6:
+                        typeIdx = ZSIDX_LONG_GENERIC;
+                        break;
+                    case 7:
+                        typeIdx = ZSIDX_SHORT_GENERIC;
+                        break;
+                }
+                if (typeIdx != -1) {
+                    names[typeIdx].setTo(strings[row][col]);
+
+                    // Put the name into the trie
+                    int32_t type = getTimeZoneTranslationType((TimeZoneTranslationTypeIndex)typeIdx);
+                    ZoneStringInfo *zsinf = new ZoneStringInfo(strings[row][0], strings[row][col], (TimeZoneTranslationType)type);
+                    fZoneStringsTrie.put(strings[row][col], zsinf, status);
+                    if (U_FAILURE(status)) {
+                        delete zsinf;
+                        goto error_cleanup;
+                    }
+                }
+            }
+        }
+        ZoneStrings *zstrings = new ZoneStrings(names, ZSIDX_COUNT, TRUE, NULL, 0, 0);
+        fTzidToStrings.put(strings[row][0], zstrings, status);
+        if (U_FAILURE(status)) {
+            delete zstrings;
+            goto error_cleanup;
+        }
+    }
+    return;
+
+error_cleanup:
+    return;
+}
+
+ZoneStringFormat::ZoneStringFormat(const Locale &locale, UErrorCode &status)
+: UMemory(),
+  fLocale(locale),
+  fTzidToStrings(uhash_compareUnicodeString, NULL, status),
+  fMzidToStrings(uhash_compareUnicodeString, NULL, status),
+  fZoneStringsTrie(TRUE, deleteZoneStringInfo)
+{
+    if (U_FAILURE(status)) {
+        return;
+    }
+    fTzidToStrings.setValueDeleter(deleteZoneStrings);
+    fMzidToStrings.setValueDeleter(deleteZoneStrings);
+
+    UResourceBundle *zoneStringsArray = ures_open(NULL, locale.getName(), &status);
+    zoneStringsArray = ures_getByKeyWithFallback(zoneStringsArray, gZoneStringsTag, zoneStringsArray, &status);
+    if (U_FAILURE(status)) {
+        // If no locale bundles are available, zoneStrings will be null.
+        // We still want to go through the rest of zone strings initialization,
+        // because generic location format is generated from tzid for the case.
+        // The rest of code should work even zoneStrings is null.
+        status = U_ZERO_ERROR;
+        ures_close(zoneStringsArray);
+        zoneStringsArray = NULL;
+    }
+
+    StringEnumeration *tzids = NULL;
+    MessageFormat *fallbackFmt = NULL;
+    MessageFormat *regionFmt = NULL;
+
+    UResourceBundle *zoneItem = NULL;
+    UResourceBundle *metazoneItem = NULL;
+
+    char zidkey[ZID_KEY_MAX];
+    const UChar *zstrarray[ZSIDX_COUNT];
+    const UChar *mzstrarray[ZSIDX_COUNT];
+    UnicodeString mzPartialLoc[MAX_METAZONES_PER_ZONE][4];
+
+    UnicodeString region;
+    getRegion(region);
+
+    fallbackFmt = getFallbackFormat(locale, status);
+    if (U_FAILURE(status)) {
+        goto error_cleanup;
+    }
+    regionFmt = getRegionFormat(locale, status);
+    if (U_FAILURE(status)) {
+        goto error_cleanup;
+    }
+
+    tzids = TimeZone::createEnumeration();
+    const char *tzid;
+    while ((tzid = tzids->next(NULL, status))) {
+        if (U_FAILURE(status)) {
+            goto error_cleanup;
+        }
+        // Skip non-canonical IDs
+        UnicodeString utzid(tzid, -1, US_INV);
+        UnicodeString canonicalID;
+        ZoneMeta::getCanonicalID(utzid, canonicalID);
+        if (utzid != canonicalID) {
+            continue;
+        }
+
+        uprv_strcpy(zidkey, tzid);
+
+        // Replace '/' with ':'
+        char *pCity = NULL;
+        char *p = zidkey;
+        while (*p) {
+            if (*p == '/') {
+                *p = ':';
+                pCity = p + 1;
+            }
+            p++;
+        }
+
+        if (zoneStringsArray != NULL) {
+            zoneItem = ures_getByKeyWithFallback(zoneStringsArray, zidkey, zoneItem, &status);
+            if (U_FAILURE(status)) {
+                // If failed to open the zone item, create only location string
+                ures_close(zoneItem);
+                zoneItem = NULL;
+                status = U_ZERO_ERROR;
+            }
+        }
+        zstrarray[ZSIDX_LONG_STANDARD] = getZoneStringFromBundle(zoneItem, gLongStandardTag);
+        zstrarray[ZSIDX_SHORT_STANDARD] = getZoneStringFromBundle(zoneItem, gShortStandardTag);
+        zstrarray[ZSIDX_LONG_DAYLIGHT] = getZoneStringFromBundle(zoneItem, gLongDaylightTag);
+        zstrarray[ZSIDX_SHORT_DAYLIGHT] = getZoneStringFromBundle(zoneItem, gShortDaylightTag);
+        zstrarray[ZSIDX_LONG_GENERIC] = getZoneStringFromBundle(zoneItem, gLongGenericTag);
+        zstrarray[ZSIDX_SHORT_GENERIC] = getZoneStringFromBundle(zoneItem, gShortGenericTag);
+
+        // Compose location format string
+        UnicodeString location;
+        UnicodeString country;
+        UnicodeString city;
+        UnicodeString countryCode;
+        ZoneMeta::getCanonicalCountry(utzid, countryCode);
+        if (countryCode.isEmpty()) {
+            zstrarray[ZSIDX_LOCATION] = NULL;
+        } else {
+            const UChar* tmpCity = getZoneStringFromBundle(zoneItem, gExemplarCityTag);
+            if (tmpCity != NULL) {
+                city.setTo(TRUE, tmpCity, -1);
+            } else {
+                city.setTo(UnicodeString(pCity, -1, US_INV));
+                // Replace '_' with ' '
+                for (int32_t i = 0; i < city.length(); i++) {
+                    if (city.charAt(i) == (UChar)0x5F /*'_'*/) {
+                        city.setCharAt(i, (UChar)0x20 /*' '*/);
+                    }
+                }
+            }
+            getLocalizedCountry(countryCode, locale, country);
+            UnicodeString singleCountry;
+            ZoneMeta::getSingleCountry(utzid, singleCountry);
+            FieldPosition fpos;
+            if (singleCountry.isEmpty()) {
+                Formattable params [] = {
+                    Formattable(city),
+                    Formattable(country)
+                };
+                fallbackFmt->format(params, 2, location, fpos, status);
+            } else {
+                // If the zone is only one zone in the country, do not add city
+                Formattable params [] = {
+                    Formattable(country)
+                };
+                regionFmt->format(params, 1, location, fpos, status);
+            }
+            if (U_FAILURE(status)) {
+                goto error_cleanup;
+            }
+
+            // Workaround for reducing UMR warning in Purify.
+            // Append NULL before calling getTerminatedBuffer()
+            int32_t locLen = location.length();
+            location.append((UChar)0).truncate(locLen);
+
+            zstrarray[ZSIDX_LOCATION] = location.getTerminatedBuffer();
+        }
+
+        UBool commonlyUsed = isCommonlyUsed(zoneItem);
+
+        // Resolve metazones used by this zone
+        int32_t mzPartialLocIdx = 0;
+        const UVector *metazoneMappings = ZoneMeta::getMetazoneMappings(utzid);
+        if (metazoneMappings != NULL) {
+            for (int32_t i = 0; i < metazoneMappings->size(); i++) {
+                const OlsonToMetaMappingEntry *mzmap = (const OlsonToMetaMappingEntry*)metazoneMappings->elementAt(i);
+                UnicodeString mzid(mzmap->mzid);
+                const ZoneStrings *mzStrings = (const ZoneStrings*)fMzidToStrings.get(mzid);
+                if (mzStrings == NULL) {
+                    // If the metazone strings are not yet processed, do it now.
+                    char mzidkey[ZID_KEY_MAX];
+                    uprv_strcpy(mzidkey, gMetazoneIdPrefix);
+                    u_UCharsToChars(mzmap->mzid, mzidkey + MZID_PREFIX_LEN, u_strlen(mzmap->mzid) + 1);
+                    metazoneItem = ures_getByKeyWithFallback(zoneStringsArray, mzidkey, metazoneItem, &status);
+                    if (U_FAILURE(status)) {
+                        // No resources available for this metazone
+                        // Resource bundle will be cleaned up after end of the loop.
+                        status = U_ZERO_ERROR;
+                        continue;
+                    }
+                    UBool mzCommonlyUsed = isCommonlyUsed(metazoneItem);
+                    mzstrarray[ZSIDX_LONG_STANDARD] = getZoneStringFromBundle(metazoneItem, gLongStandardTag);
+                    mzstrarray[ZSIDX_SHORT_STANDARD] = getZoneStringFromBundle(metazoneItem, gShortStandardTag);
+                    mzstrarray[ZSIDX_LONG_DAYLIGHT] = getZoneStringFromBundle(metazoneItem, gLongDaylightTag);
+                    mzstrarray[ZSIDX_SHORT_DAYLIGHT] = getZoneStringFromBundle(metazoneItem, gShortDaylightTag);
+                    mzstrarray[ZSIDX_LONG_GENERIC] = getZoneStringFromBundle(metazoneItem, gLongGenericTag);
+                    mzstrarray[ZSIDX_SHORT_GENERIC] = getZoneStringFromBundle(metazoneItem, gShortGenericTag);
+                    mzstrarray[ZSIDX_LOCATION] = NULL;
+
+                    int32_t lastNonNullIdx = ZSIDX_COUNT - 1;
+                    while (lastNonNullIdx >= 0) {
+                        if (mzstrarray[lastNonNullIdx] != NULL) {
+                            break;
+                        }
+                        lastNonNullIdx--;
+                    }
+                    UnicodeString *strings_mz = NULL;
+                    ZoneStrings *tmp_mzStrings = NULL;
+                    if (lastNonNullIdx >= 0) {
+                        // Create UnicodeString array and put strings to the zone string trie
+                        strings_mz = new UnicodeString[lastNonNullIdx + 1];
+
+                        UnicodeString preferredIdForLocale;
+                        ZoneMeta::getZoneIdByMetazone(mzid, region, preferredIdForLocale);
+
+                        for (int32_t typeidx = 0; typeidx <= lastNonNullIdx; typeidx++) {
+                            if (mzstrarray[typeidx] != NULL) {
+                                strings_mz[typeidx].setTo(TRUE, mzstrarray[typeidx], -1);
+
+                                // Add a metazone string to the zone string trie
+                                int32_t type = getTimeZoneTranslationType((TimeZoneTranslationTypeIndex)typeidx);
+                                ZoneStringInfo *zsinfo = new ZoneStringInfo(preferredIdForLocale, strings_mz[typeidx], (TimeZoneTranslationType)type);
+                                fZoneStringsTrie.put(strings_mz[typeidx], zsinfo, status);
+                                if (U_FAILURE(status)) {
+                                    delete zsinfo;
+                                    delete strings_mz;
+                                    goto error_cleanup;
+                                }
+                            }
+                        }
+                        tmp_mzStrings = new ZoneStrings(strings_mz, lastNonNullIdx + 1, mzCommonlyUsed, NULL, 0, 0);
+                    } else {
+                        // Create ZoneStrings with empty contents
+                        tmp_mzStrings = new ZoneStrings(NULL, 0, FALSE, NULL, 0, 0);
+                    }
+
+                    fMzidToStrings.put(mzid, tmp_mzStrings, status);
+                    if (U_FAILURE(status)) {
+                        delete tmp_mzStrings;
+                        goto error_cleanup;
+                    }
+
+                    mzStrings = tmp_mzStrings;
+                }
+
+                // Compose generic partial location format
+                UnicodeString lg;
+                UnicodeString sg;
+
+                mzStrings->getString(ZSIDX_LONG_GENERIC, lg);
+                mzStrings->getString(ZSIDX_SHORT_GENERIC, sg);
+
+                if (!lg.isEmpty() || !sg.isEmpty()) {
+                    UBool addMzPartialLocationNames = TRUE;
+                    for (int32_t j = 0; j < mzPartialLocIdx; j++) {
+                        if (mzPartialLoc[j][0] == mzid) {
+                            // already processed
+                            addMzPartialLocationNames = FALSE;
+                            break;
+                        }
+                    }
+                    if (addMzPartialLocationNames) {
+                        UnicodeString *locationPart = NULL;
+                        // Check if the zone is the preferred zone for the territory associated with the zone
+                        UnicodeString preferredID;
+                        ZoneMeta::getZoneIdByMetazone(mzid, countryCode, preferredID);
+                        if (utzid == preferredID) {
+                            // Use country for the location
+                            locationPart = &country;
+                        } else {
+                            // Use city for the location
+                            locationPart = &city;
+                        }
+                        // Reset the partial location string array
+                        mzPartialLoc[mzPartialLocIdx][0].setTo(mzid);
+                        mzPartialLoc[mzPartialLocIdx][1].remove();
+                        mzPartialLoc[mzPartialLocIdx][2].remove();
+                        mzPartialLoc[mzPartialLocIdx][3].remove();
+
+                        if (locationPart != NULL) {
+                            FieldPosition fpos;
+                            if (!lg.isEmpty()) {
+                                Formattable params [] = {
+                                    Formattable(*locationPart),
+                                    Formattable(lg)
+                                };
+                                fallbackFmt->format(params, 2, mzPartialLoc[mzPartialLocIdx][1], fpos, status);
+                            }
+                            if (!sg.isEmpty()) {
+                                Formattable params [] = {
+                                    Formattable(*locationPart),
+                                    Formattable(sg)
+                                };
+                                fallbackFmt->format(params, 2, mzPartialLoc[mzPartialLocIdx][2], fpos, status);
+                                if (mzStrings->isShortFormatCommonlyUsed()) {
+                                    mzPartialLoc[mzPartialLocIdx][3].setTo(TRUE, gCommonlyUsedTrue, -1);
+                                }
+                            }
+                            if (U_FAILURE(status)) {
+                                goto error_cleanup;
+                            }
+                        }
+                        mzPartialLocIdx++;
+                    }
+                }
+            }
+        }
+        // Collected names for a zone
+
+        // Create UnicodeString array for localized zone strings
+        int32_t lastIdx = ZSIDX_COUNT - 1;
+        while (lastIdx >= 0) {
+            if (zstrarray[lastIdx] != NULL) {
+                break;
+            }
+            lastIdx--;
+        }
+        UnicodeString *strings = NULL;
+        int32_t stringsCount = lastIdx + 1;
+
+        if (stringsCount > 0) {
+            strings = new UnicodeString[stringsCount];
+            for (int32_t i = 0; i < stringsCount; i++) {
+                if (zstrarray[i] != NULL) {
+                    strings[i].setTo(zstrarray[i], -1);
+
+                    // Add names to the trie
+                    int32_t type = getTimeZoneTranslationType((TimeZoneTranslationTypeIndex)i);
+                    ZoneStringInfo *zsinfo = new ZoneStringInfo(utzid, strings[i], (TimeZoneTranslationType)type);
+                    fZoneStringsTrie.put(strings[i], zsinfo, status);
+                    if (U_FAILURE(status)) {
+                        delete zsinfo;
+                        delete[] strings;
+                        goto error_cleanup;
+                    }
+                }
+            }
+        }
+
+        // Create UnicodeString array for generic partial location strings
+        UnicodeString **genericPartialLocationNames = NULL;
+        int32_t genericPartialRowCount = mzPartialLocIdx;
+        int32_t genericPartialColCount = 4;
+
+        if (genericPartialRowCount != 0) {
+            genericPartialLocationNames = (UnicodeString**)uprv_malloc(genericPartialRowCount * sizeof(UnicodeString*));
+            if (genericPartialLocationNames == NULL) {
+                status = U_MEMORY_ALLOCATION_ERROR;
+                delete[] strings;
+                goto error_cleanup;
+            }
+            for (int32_t i = 0; i < genericPartialRowCount; i++) {
+                genericPartialLocationNames[i] = new UnicodeString[genericPartialColCount];
+                for (int32_t j = 0; j < genericPartialColCount; j++) {
+                    genericPartialLocationNames[i][j].setTo(mzPartialLoc[i][j]);
+                    // Add names to the trie
+                    if ((j == 1 || j == 2) &&!genericPartialLocationNames[i][j].isEmpty()) {
+                        ZoneStringInfo *zsinfo;
+                        TimeZoneTranslationType type = (j == 1) ? GENERIC_LONG : GENERIC_SHORT;
+                        zsinfo = new ZoneStringInfo(utzid, genericPartialLocationNames[i][j], type);
+                        fZoneStringsTrie.put(genericPartialLocationNames[i][j], zsinfo, status);
+                        if (U_FAILURE(status)) {
+                            delete[] genericPartialLocationNames[i];
+                            uprv_free(genericPartialLocationNames);
+                            delete[] strings;
+                            goto error_cleanup;
+                        }
+                    }
+                }
+            }
+        }
+
+        // Finally, create ZoneStrings instance and put it into the tzidToStinrgs map
+        ZoneStrings *zstrings = new ZoneStrings(strings, stringsCount, commonlyUsed,
+            genericPartialLocationNames, genericPartialRowCount, genericPartialColCount);
+
+        fTzidToStrings.put(utzid, zstrings, status);
+        if (U_FAILURE(status)) {
+            delete zstrings;
+            goto error_cleanup;
+        }
+    }
+
+error_cleanup:
+    if (fallbackFmt != NULL) {
+        delete fallbackFmt;
+    }
+    if (regionFmt != NULL) {
+        delete regionFmt;
+    }
+    if (tzids != NULL) {
+        delete tzids;
+    }
+    ures_close(zoneItem);
+    ures_close(metazoneItem);
+    ures_close(zoneStringsArray);
+}
+
+ZoneStringFormat::~ZoneStringFormat() {
+}
+
+SafeZoneStringFormatPtr*
+ZoneStringFormat::getZoneStringFormat(const Locale& locale, UErrorCode &status) {
+    umtx_lock(&gZSFCacheLock);
+    if (gZoneStringFormatCache == NULL) {
+        gZoneStringFormatCache = new ZSFCache(10 /* capacity */);
+        ucln_i18n_registerCleanup(UCLN_I18N_ZSFORMAT, zoneStringFormat_cleanup);
+    }
+    umtx_unlock(&gZSFCacheLock);
+
+    return gZoneStringFormatCache->get(locale, status);
+}
+
+
+UnicodeString**
+ZoneStringFormat::createZoneStringsArray(UDate date, int32_t &rowCount, int32_t &colCount, UErrorCode &status) const {
+    if (U_FAILURE(status)) {
+        return NULL;
+    }
+    UnicodeString **result = NULL;
+    rowCount = 0;
+    colCount = 0;
+
+    // Collect canonical time zone IDs
+    UVector canonicalIDs(uhash_deleteUnicodeString, uhash_compareUnicodeString, status);
+    if (U_FAILURE(status)) {
+        return NULL;
+    }
+    StringEnumeration *tzids = TimeZone::createEnumeration();
+    const UChar *tzid;
+    while ((tzid = tzids->unext(NULL, status))) {
+        if (U_FAILURE(status)) {
+            delete tzids;
+            return NULL;
+        }
+        UnicodeString utzid(tzid);
+        UnicodeString canonicalID;
+        ZoneMeta::getCanonicalID(UnicodeString(tzid), canonicalID);
+        if (utzid == canonicalID) {
+            canonicalIDs.addElement(new UnicodeString(utzid), status);
+            if (U_FAILURE(status)) {
+                delete tzids;
+                return NULL;
+            }
+        }
+    }
+    delete tzids;
+
+    // Allocate array
+    result = (UnicodeString**)uprv_malloc(canonicalIDs.size() * sizeof(UnicodeString*));
+    if (result == NULL) {
+        status = U_MEMORY_ALLOCATION_ERROR;
+        return NULL;
+    }
+    for (int32_t i = 0; i < canonicalIDs.size(); i++) {
+        result[i] = new UnicodeString[8];
+        UnicodeString *id = (UnicodeString*)canonicalIDs.elementAt(i);
+        result[i][0].setTo(*id);
+        getLongStandard(*id, date, result[i][1]);
+        getShortStandard(*id, date, FALSE, result[i][2]);
+        getLongDaylight(*id, date, result[i][3]);
+        getShortDaylight(*id, date, FALSE, result[i][4]);
+        getGenericLocation(*id, result[i][5]);
+        getLongGenericNonLocation(*id, date, result[i][6]);
+        getShortGenericNonLocation(*id, date, FALSE, result[i][7]);
+    }
+
+    rowCount = canonicalIDs.size();
+    colCount = 8;
+    return result;
+}
+
+UnicodeString&
+ZoneStringFormat::getSpecificLongString(const Calendar &cal, UnicodeString &result,
+                                        UErrorCode &status) const {
+    result.remove();
+    if (U_FAILURE(status)) {
+        return result;
+    }
+    UnicodeString tzid;
+    cal.getTimeZone().getID(tzid);
+    UDate date = cal.getTime(status);
+    if (cal.get(UCAL_DST_OFFSET, status) == 0) {
+        return getString(tzid, ZSIDX_LONG_STANDARD, date, FALSE /*not used*/, result);
+    } else {
+        return getString(tzid, ZSIDX_LONG_DAYLIGHT, date, FALSE /*not used*/, result);
+    }
+}
+
+UnicodeString&
+ZoneStringFormat::getSpecificShortString(const Calendar &cal, UBool commonlyUsedOnly,
+                                         UnicodeString &result, UErrorCode &status) const {
+    result.remove();
+    if (U_FAILURE(status)) {
+        return result;
+    }
+    UnicodeString tzid;
+    cal.getTimeZone().getID(tzid);
+    UDate date = cal.getTime(status);
+    if (cal.get(UCAL_DST_OFFSET, status) == 0) {
+        return getString(tzid, ZSIDX_SHORT_STANDARD, date, commonlyUsedOnly, result);
+    } else {
+        return getString(tzid, ZSIDX_SHORT_DAYLIGHT, date, commonlyUsedOnly, result);
+    }
+}
+
+UnicodeString&
+ZoneStringFormat::getGenericLongString(const Calendar &cal, UnicodeString &result,
+                                       UErrorCode &status) const {
+    return getGenericString(cal, FALSE /*long*/, FALSE /* not used */, result, status);
+}
+
+UnicodeString&
+ZoneStringFormat::getGenericShortString(const Calendar &cal, UBool commonlyUsedOnly,
+                                        UnicodeString &result, UErrorCode &status) const {
+    return getGenericString(cal, TRUE /*short*/, commonlyUsedOnly, result, status);
+}
+
+UnicodeString&
+ZoneStringFormat::getGenericLocationString(const Calendar &cal, UnicodeString &result,
+                                           UErrorCode &status) const {
+    UnicodeString tzid;
+    cal.getTimeZone().getID(tzid);
+    UDate date = cal.getTime(status);
+    return getString(tzid, ZSIDX_LOCATION, date, FALSE /*not used*/, result);
+}
+
+const ZoneStringInfo*
+ZoneStringFormat::findSpecificLong(const UnicodeString &text, int32_t start,
+                                   int32_t &matchLength, UErrorCode &status) const {
+    return find(text, start, STANDARD_LONG | DAYLIGHT_LONG, matchLength, status);
+}
+
+const ZoneStringInfo*
+ZoneStringFormat::findSpecificShort(const UnicodeString &text, int32_t start,
+                                    int32_t &matchLength, UErrorCode &status) const {
+    return find(text, start, STANDARD_SHORT | DAYLIGHT_SHORT, matchLength, status);
+}
+
+const ZoneStringInfo*
+ZoneStringFormat::findGenericLong(const UnicodeString &text, int32_t start,
+                                  int32_t &matchLength, UErrorCode &status) const {
+    return find(text, start, GENERIC_LONG | STANDARD_LONG | LOCATION, matchLength, status);
+}
+
+const ZoneStringInfo*
+ZoneStringFormat::findGenericShort(const UnicodeString &text, int32_t start,
+                                   int32_t &matchLength, UErrorCode &status) const {
+    return find(text, start, GENERIC_SHORT | STANDARD_SHORT | LOCATION, matchLength, status);
+}
+
+const ZoneStringInfo*
+ZoneStringFormat::findGenericLocation(const UnicodeString &text, int32_t start,
+                                      int32_t &matchLength, UErrorCode &status) const {
+    return find(text, start, LOCATION, matchLength, status);
+}
+
+UnicodeString&
+ZoneStringFormat::getString(const UnicodeString &tzid, TimeZoneTranslationTypeIndex typeIdx, UDate date,
+                            UBool commonlyUsedOnly, UnicodeString& result) const {
+    result.remove();
+
+    // ICU's own array does not have entries for aliases
+    UnicodeString canonicalID;
+    ZoneMeta::getCanonicalID(tzid, canonicalID);
+
+    if (fTzidToStrings.count() > 0) {
+        ZoneStrings *zstrings = (ZoneStrings*)fTzidToStrings.get(canonicalID);
+        if (zstrings != NULL) {
+            switch (typeIdx) {
+                case ZSIDX_LONG_STANDARD:
+                case ZSIDX_LONG_DAYLIGHT:
+                case ZSIDX_LONG_GENERIC:
+                case ZSIDX_LOCATION:
+                    zstrings->getString(typeIdx, result);
+                    break;
+                case ZSIDX_SHORT_STANDARD:
+                case ZSIDX_SHORT_DAYLIGHT:
+                case ZSIDX_SHORT_GENERIC:
+                    if (!commonlyUsedOnly || zstrings->isShortFormatCommonlyUsed()) {
+                        zstrings->getString(typeIdx, result);
+                    }
+                    break;
+            }
+        }
+    }
+    if (result.isEmpty() && fMzidToStrings.count() > 0 && typeIdx != ZSIDX_LOCATION) {
+        // Try metazone
+        UnicodeString mzid;
+        ZoneMeta::getMetazoneID(canonicalID, date, mzid);
+        if (!mzid.isEmpty()) {
+            ZoneStrings *mzstrings = (ZoneStrings*)fMzidToStrings.get(mzid);
+            if (mzstrings != NULL) {
+                switch (typeIdx) {
+                    case ZSIDX_LONG_STANDARD:
+                    case ZSIDX_LONG_DAYLIGHT:
+                    case ZSIDX_LONG_GENERIC:
+                    case ZSIDX_LOCATION:
+                        mzstrings->getString(typeIdx, result);
+                        break;
+                    case ZSIDX_SHORT_STANDARD:
+                    case ZSIDX_SHORT_DAYLIGHT:
+                    case ZSIDX_SHORT_GENERIC:
+                        if (!commonlyUsedOnly || mzstrings->isShortFormatCommonlyUsed()) {
+                            mzstrings->getString(typeIdx, result);
+                        }
+                        break;
+                }
+            }
+        }
+    }
+    return result;
+}
+
+UnicodeString&
+ZoneStringFormat::getGenericString(const Calendar &cal, UBool isShort, UBool commonlyUsedOnly,
+                                   UnicodeString &result, UErrorCode &status) const {
+    result.remove();
+    UDate time = cal.getTime(status);
+    if (U_FAILURE(status)) {
+        return result;
+    }
+    const TimeZone &tz = cal.getTimeZone();
+    UnicodeString tzid;
+    tz.getID(tzid);
+
+    // ICU's own array does not have entries for aliases
+    UnicodeString canonicalID;
+    ZoneMeta::getCanonicalID(tzid, canonicalID);
+
+    ZoneStrings *zstrings;
+    if (fTzidToStrings.count() > 0) {
+        zstrings = (ZoneStrings*)fTzidToStrings.get(canonicalID);
+        if (zstrings != NULL) {
+            if (isShort) {
+                if (!commonlyUsedOnly || zstrings->isShortFormatCommonlyUsed()) {
+                    zstrings->getString(ZSIDX_SHORT_GENERIC, result);
+                }
+            } else {
+                zstrings->getString(ZSIDX_LONG_GENERIC, result);
+            }
+        }
+    }
+    if (result.isEmpty() && fMzidToStrings.count() > 0) {
+        // try metazone
+        int32_t raw, sav;
+        UnicodeString mzid;
+        ZoneMeta::getMetazoneID(canonicalID, time, mzid);
+        if (!mzid.isEmpty()) {
+            UBool useStandard = FALSE;
+            sav = cal.get(UCAL_DST_OFFSET, status);
+            if (U_FAILURE(status)) {
+                return result;
+            }
+            if (sav == 0) {
+                useStandard = TRUE;
+                // Check if the zone actually uses daylight saving time around the time
+                TimeZone *tmptz = tz.clone();
+                BasicTimeZone *btz = NULL;
+                if (tmptz->getDynamicClassID() == OlsonTimeZone::getStaticClassID()
+                    || tmptz->getDynamicClassID() == SimpleTimeZone::getStaticClassID()
+                    || tmptz->getDynamicClassID() == RuleBasedTimeZone::getStaticClassID()
+                    || tmptz->getDynamicClassID() == VTimeZone::getStaticClassID()) {
+                    btz = (BasicTimeZone*)tmptz;
+                }
+
+                if (btz != NULL) {
+                    TimeZoneTransition before;
+                    UBool beforTrs = btz->getPreviousTransition(time, TRUE, before);
+                    if (beforTrs
+                            && (time - before.getTime() < kDstCheckRange)
+                            && before.getFrom()->getDSTSavings() != 0) {
+                        useStandard = FALSE;
+                    } else {
+                        TimeZoneTransition after;
+                        UBool afterTrs = btz->getNextTransition(time, FALSE, after);
+                        if (afterTrs
+                                && (after.getTime() - time < kDstCheckRange)
+                                && after.getTo()->getDSTSavings() != 0) {
+                            useStandard = FALSE;
+                        }
+                    }
+                } else {
+                    // If not BasicTimeZone... only if the instance is not an ICU's implementation.
+                    // We may get a wrong answer in edge case, but it should practically work OK.
+                    tmptz->getOffset(time - kDstCheckRange, FALSE, raw, sav, status);
+                    if (sav != 0) {
+                        useStandard = FALSE;
+                    } else {
+                        tmptz->getOffset(time + kDstCheckRange, FALSE, raw, sav, status);
+                        if (sav != 0){
+                            useStandard = FALSE;
+                        }
+                    }
+                    if (U_FAILURE(status)) {
+                        delete tmptz;
+                        result.remove();
+                        return result;
+                    }
+                }
+                delete tmptz;
+            }
+            if (useStandard) {
+                getString(canonicalID, (isShort ? ZSIDX_SHORT_STANDARD : ZSIDX_LONG_STANDARD),
+                    time, commonlyUsedOnly, result);
+
+                // Note:
+                // In CLDR 1.5.1, a same localization is used for both generic and standard
+                // for some metazones in some locales.  This is actually data bugs and should
+                // be resolved in later versions of CLDR.  For now, we check if the standard
+                // name is different from its generic name below.
+                if (!result.isEmpty()) {
+                    UnicodeString genericNonLocation;
+                    getString(canonicalID, (isShort ? ZSIDX_SHORT_GENERIC : ZSIDX_LONG_GENERIC),
+                        time, commonlyUsedOnly, genericNonLocation);
+                    if (!genericNonLocation.isEmpty() && result == genericNonLocation) {
+                        result.remove();
+                    }
+                }
+            }
+            if (result.isEmpty()) {
+                ZoneStrings *mzstrings = (ZoneStrings*)fMzidToStrings.get(mzid);
+                if (mzstrings != NULL) {
+                    if (isShort) {
+                        if (!commonlyUsedOnly || mzstrings->isShortFormatCommonlyUsed()) {
+                            mzstrings->getString(ZSIDX_SHORT_GENERIC, result);
+                        }
+                    } else {
+                        mzstrings->getString(ZSIDX_LONG_GENERIC, result);
+                    }
+                }
+                if (!result.isEmpty()) {
+                    // Check if the offsets at the given time matches the preferred zone's offsets
+                    UnicodeString preferredId;
+                    UnicodeString region;
+                    ZoneMeta::getZoneIdByMetazone(mzid, getRegion(region), preferredId);
+                    if (canonicalID != preferredId) {
+                        // Check if the offsets at the given time are identical with the preferred zone
+                        raw = cal.get(UCAL_ZONE_OFFSET, status);
+                        if (U_FAILURE(status)) {
+                            result.remove();
+                            return result;
+                        }
+                        TimeZone *preferredZone = TimeZone::createTimeZone(preferredId);
+                        int32_t prfRaw, prfSav;
+                        // Check offset in preferred time zone with wall time.
+                        // With getOffset(time, false, preferredOffsets),
+                        // you may get incorrect results because of time overlap at DST->STD
+                        // transition.
+                        preferredZone->getOffset(time + raw + sav, TRUE, prfRaw, prfSav, status);
+                        delete preferredZone;
+
+                        if (U_FAILURE(status)) {
+                            result.remove();
+                            return result;
+                        }
+                        if ((raw != prfRaw || sav != prfSav) && zstrings != NULL) {
+                            // Use generic partial location string as fallback
+                            zstrings->getGenericPartialLocationString(mzid, isShort, commonlyUsedOnly, result);
+                        }
+                    }
+                }
+            }
+        }
+    }
+    if (result.isEmpty()) {
+        // Use location format as the final fallback
+        getString(canonicalID, ZSIDX_LOCATION, time, FALSE /*not used*/, result);
+    }
+
+    return result;
+}
+
+UnicodeString&
+ZoneStringFormat::getGenericPartialLocationString(const UnicodeString &tzid, UBool isShort,
+                                                  UDate date, UBool commonlyUsedOnly, UnicodeString &result) const {
+    result.remove();
+    if (fTzidToStrings.count() <= 0) {
+        return result;
+    }
+
+    UnicodeString canonicalID;
+    ZoneMeta::getCanonicalID(tzid, canonicalID);
+
+    UnicodeString mzid;
+    ZoneMeta::getMetazoneID(canonicalID, date, mzid);
+
+    if (!mzid.isEmpty()) {
+        ZoneStrings *zstrings = (ZoneStrings*)fTzidToStrings.get(canonicalID);
+        if (zstrings != NULL) {
+            zstrings->getGenericPartialLocationString(mzid, isShort, commonlyUsedOnly, result);
+        }
+    }
+    return result;
+}
+
+const ZoneStringInfo*
+ZoneStringFormat::find(const UnicodeString &text, int32_t start, int32_t types,
+                       int32_t &matchLength, UErrorCode &status) const {
+    matchLength = 0;
+    if (U_FAILURE(status)) {
+        return NULL;
+    }
+    if (fZoneStringsTrie.isEmpty()) {
+        return NULL;
+    }
+    const ZoneStringInfo *result = NULL;
+    const ZoneStringInfo *fallback = NULL;
+    int32_t fallbackMatchLen = 0;
+
+    ZoneStringSearchResultHandler handler(status);
+    fZoneStringsTrie.search(text, start, (TextTrieMapSearchResultHandler*)&handler, status);
+    if (U_SUCCESS(status)) {
+        int32_t numMatches = handler.countMatches();
+        for (int32_t i = 0; i < numMatches; i++) {
+            int32_t tmpMatchLen;
+            const ZoneStringInfo *tmp = handler.getMatch(i, tmpMatchLen);
+            if ((types & tmp->fType) != 0) {
+                if (result == NULL || matchLength < tmpMatchLen) {
+                    result = tmp;
+                    matchLength = tmpMatchLen;
+                } else if (matchLength == tmpMatchLen) {
+                    // Tie breaker - there are some examples that a
+                    // long standard name is identical with a location
+                    // name - for example, "Uruguay Time".  In this case,
+                    // we interpret it as generic, not specific.
+                    if (tmp->isGeneric() && !result->isGeneric()) {
+                        result = tmp;
+                    }
+                }
+            } else if (result == NULL) {
+                if (fallback == NULL || fallbackMatchLen < tmpMatchLen) {
+                    fallback = tmp;
+                    fallbackMatchLen = tmpMatchLen;
+                } else if (fallbackMatchLen == tmpMatchLen) {
+                    if (tmp->isGeneric() && !fallback->isGeneric()) {
+                        fallback = tmp;
+                    }
+                }
+            }
+        }
+        if (result == NULL && fallback != NULL) {
+            result = fallback;
+            matchLength = fallbackMatchLen;
+        }
+    }
+    return result;
+}
+
+
+UnicodeString&
+ZoneStringFormat::getRegion(UnicodeString &region) const {
+    const char* country = fLocale.getCountry();
+    // TODO: Utilize addLikelySubtag in Locale to resolve default region
+    // when the implementation is ready.
+    region.setTo(UnicodeString(country, -1, US_INV));
+    return region;
+}
+
+MessageFormat*
+ZoneStringFormat::getFallbackFormat(const Locale &locale, UErrorCode &status) {
+    if (U_FAILURE(status)) {
+        return NULL;
+    }
+    UnicodeString pattern(TRUE, gDefFallbackPattern, -1);
+    UResourceBundle *zoneStringsArray = ures_open(NULL, locale.getName(), &status);
+    zoneStringsArray = ures_getByKeyWithFallback(zoneStringsArray, gZoneStringsTag, zoneStringsArray, &status);
+    int32_t len;
+    const UChar *flbkfmt = ures_getStringByKeyWithFallback(zoneStringsArray, gFallbackFormatTag, &len, &status);
+    if (U_SUCCESS(status)) {
+        pattern.setTo(flbkfmt);
+    } else {
+        status = U_ZERO_ERROR;
+    }
+    ures_close(zoneStringsArray);
+
+    MessageFormat *fallbackFmt = new MessageFormat(pattern, status);
+    return fallbackFmt;
+}
+
+MessageFormat*
+ZoneStringFormat::getRegionFormat(const Locale& locale, UErrorCode &status) {
+    if (U_FAILURE(status)) {
+        return NULL;
+    }
+    UnicodeString pattern(TRUE, gDefRegionPattern, -1);
+    UResourceBundle *zoneStringsArray = ures_open(NULL, locale.getName(), &status);
+    zoneStringsArray = ures_getByKeyWithFallback(zoneStringsArray, gZoneStringsTag, zoneStringsArray, &status);
+    int32_t len;
+    const UChar *regionfmt = ures_getStringByKeyWithFallback(zoneStringsArray, gRegionFormatTag, &len, &status);
+    if (U_SUCCESS(status)) {
+        pattern.setTo(regionfmt);
+    } else {
+        status = U_ZERO_ERROR;
+    }
+    ures_close(zoneStringsArray);
+
+    MessageFormat *regionFmt = new MessageFormat(pattern, status);
+    return regionFmt;
+}
+
+const UChar*
+ZoneStringFormat::getZoneStringFromBundle(const UResourceBundle *zoneitem, const char *key) {
+    const UChar *str = NULL;
+    if (zoneitem != NULL) {
+        UErrorCode status = U_ZERO_ERROR;
+        int32_t len;
+        str = ures_getStringByKeyWithFallback(zoneitem, key, &len, &status);
+        if (U_FAILURE(status)) {
+            str = NULL;
+        }
+    }
+    return str;
+}
+
+UBool
+ZoneStringFormat::isCommonlyUsed(const UResourceBundle *zoneitem) {
+    if (zoneitem == NULL) {
+        return TRUE;
+    }
+
+    UBool commonlyUsed = FALSE;
+    UErrorCode status = U_ZERO_ERROR;
+    UResourceBundle *cuRes = ures_getByKey(zoneitem, gCommonlyUsedTag, NULL, &status);
+    int32_t cuValue = ures_getInt(cuRes, &status);
+    if (U_SUCCESS(status)) {
+        if (cuValue == 1) {
+            commonlyUsed = TRUE;
+        }
+    }
+    ures_close(cuRes);
+    return commonlyUsed;
+}
+
+UnicodeString&
+ZoneStringFormat::getLocalizedCountry(const UnicodeString &countryCode, const Locale &locale, UnicodeString &displayCountry) {
+    // We do not want to use display country names only from the target language bundle
+    // Note: we should do this in better way.
+    displayCountry.remove();
+    int32_t ccLen = countryCode.length();
+    if (ccLen > 0 && ccLen < ULOC_COUNTRY_CAPACITY) {
+        UErrorCode status = U_ZERO_ERROR;
+        UResourceBundle *localeBundle = ures_open(NULL, locale.getName(), &status);
+        if (U_SUCCESS(status)) {
+            const char *bundleLocStr = ures_getLocale(localeBundle, &status);
+            if (U_SUCCESS(status) && uprv_strlen(bundleLocStr) > 0) {
+                Locale bundleLoc(bundleLocStr);
+                if (uprv_strcmp(bundleLocStr, "root") != 0 && uprv_strcmp(bundleLoc.getLanguage(), locale.getLanguage()) == 0) {
+                    // Create a fake locale strings
+                    char tmpLocStr[ULOC_COUNTRY_CAPACITY + 3];
+                    uprv_strcpy(tmpLocStr, "xx_");
+                    u_UCharsToChars(countryCode.getBuffer(), &tmpLocStr[3], ccLen);
+                    tmpLocStr[3 + ccLen] = 0;
+
+                    Locale tmpLoc(tmpLocStr);
+                    tmpLoc.getDisplayCountry(locale, displayCountry);
+                }
+            }
+        }
+        ures_close(localeBundle);
+    }
+    if (displayCountry.isEmpty()) {
+        // Use the country code as the fallback
+        displayCountry.setTo(countryCode);
+    }
+    return displayCountry;
+}
+
+// ----------------------------------------------------------------------------
+/*
+ * This constructor adopts the input UnicodeString arrays.
+ */
+ZoneStrings::ZoneStrings(UnicodeString *strings, int32_t stringsCount, UBool commonlyUsed,
+       UnicodeString **genericPartialLocationStrings, int32_t genericRowCount, int32_t genericColCount)
+: UMemory(), fStrings(strings), fStringsCount(stringsCount), fIsCommonlyUsed(commonlyUsed),
+  fGenericPartialLocationStrings(genericPartialLocationStrings), 
+  fGenericPartialLocationRowCount(genericRowCount), fGenericPartialLocationColCount(genericColCount) {
+}
+
+ZoneStrings::~ZoneStrings() {
+    if (fStrings != NULL) {
+        delete[] fStrings;
+    }
+    if (fGenericPartialLocationStrings != NULL) {
+        for (int32_t i = 0; i < fGenericPartialLocationRowCount; i++) {
+            delete[] fGenericPartialLocationStrings[i];
+        }
+        uprv_free(fGenericPartialLocationStrings);
+    }
+}
+
+
+UnicodeString&
+ZoneStrings::getString(int32_t typeIdx, UnicodeString &result) const {
+    if (typeIdx >= 0 && typeIdx < fStringsCount) {
+        result.setTo(fStrings[typeIdx]);
+    } else {
+        result.remove();
+    }
+    return result;
+}
+
+UnicodeString&
+ZoneStrings::getGenericPartialLocationString(const UnicodeString &mzid, UBool isShort,
+                                        UBool commonlyUsedOnly, UnicodeString &result) const {
+    UBool isSet = FALSE;
+    if (fGenericPartialLocationColCount >= 2) {
+        for (int32_t i = 0; i < fGenericPartialLocationRowCount; i++) {
+            if (fGenericPartialLocationStrings[i][0] == mzid) {
+                if (isShort) {
+                    if (fGenericPartialLocationColCount >= 3) {
+                        if (!commonlyUsedOnly || 
+                            fGenericPartialLocationColCount == 3 || fGenericPartialLocationStrings[i][3].length() != 0) {
+                            result.setTo(fGenericPartialLocationStrings[i][2]);
+                            isSet = TRUE;
+                        }
+                    }
+                } else {
+                    result.setTo(fGenericPartialLocationStrings[i][1]);
+                    isSet = TRUE;
+                }
+                break;
+            }
+        }
+    }
+    if (!isSet) {
+        result.remove();
+    }
+    return result;
+}
+
+// --------------------------------------------------------------
+SafeZoneStringFormatPtr::SafeZoneStringFormatPtr(ZSFCacheEntry *cacheEntry)
+: UMemory(), fCacheEntry(cacheEntry) {
+}
+
+SafeZoneStringFormatPtr::~SafeZoneStringFormatPtr() {
+    fCacheEntry->delRef();
+}
+
+const ZoneStringFormat*
+SafeZoneStringFormatPtr::get() const {
+    return fCacheEntry->getZoneStringFormat();
+}
+
+ZSFCacheEntry::ZSFCacheEntry(const Locale &locale, ZoneStringFormat *zsf, ZSFCacheEntry *next)
+: UMemory(), fLocale(locale), fZoneStringFormat(zsf),
+ fNext(next), fRefCount(1)
+{
+}
+
+ZSFCacheEntry::~ZSFCacheEntry () {
+    delete fZoneStringFormat;
+}
+
+const ZoneStringFormat*
+ZSFCacheEntry::getZoneStringFormat(void) {
+    return (const ZoneStringFormat*)fZoneStringFormat;
+}
+
+void
+ZSFCacheEntry::delRef(void) {
+    umtx_lock(&gZSFCacheLock);
+    --fRefCount;
+    umtx_unlock(&gZSFCacheLock);
+}
+
+ZSFCache::ZSFCache(int32_t capacity)
+: UMemory(), fCapacity(capacity), fFirst(NULL) {
+}
+
+ZSFCache::~ZSFCache() {
+    ZSFCacheEntry *entry = fFirst;
+    while (entry) {
+        ZSFCacheEntry *next = entry->fNext;
+        delete entry;
+        entry = next;
+    }
+}
+
+SafeZoneStringFormatPtr*
+ZSFCache::get(const Locale &locale, UErrorCode &status) {
+    SafeZoneStringFormatPtr *result = NULL;
+
+    // Search the cache entry list
+    ZSFCacheEntry *entry = NULL;
+    ZSFCacheEntry *next, *prev;
+
+    umtx_lock(&gZSFCacheLock);
+    entry = fFirst;
+    prev = NULL;
+    while (entry) {
+        next = entry->fNext;
+        if (entry->fLocale == locale) {
+            // Add reference count
+            entry->fRefCount++;
+
+            // move the entry to the top
+            if (entry != fFirst) {
+                prev->fNext = next;
+                entry->fNext = fFirst;
+                fFirst = entry;
+            }
+            break;
+        }
+        prev = entry;
+        entry = next;
+    }
+    umtx_unlock(&gZSFCacheLock);
+
+    // Create a new ZoneStringFormat
+    if (entry == NULL) {
+        ZoneStringFormat *zsf = new ZoneStringFormat(locale, status);
+        if (U_FAILURE(status)) {
+            return NULL;
+        }
+        // Now add the new entry
+        umtx_lock(&gZSFCacheLock);
+        // Make sure no other threads already created the one for the same locale
+        entry = fFirst;
+        prev = NULL;
+        while (entry) {
+            next = entry->fNext;
+            if (entry->fLocale == locale) {
+                // Add reference count
+                entry->fRefCount++;
+
+                // move the entry to the top
+                if (entry != fFirst) {
+                    prev->fNext = next;
+                    entry->fNext = fFirst;
+                    fFirst = entry;
+                }
+                break;
+            }
+            prev = entry;
+            entry = next;
+        }
+        if (entry == NULL) {
+            // Add the new one to the top
+            next = fFirst;
+            entry = new ZSFCacheEntry(locale, zsf, next);
+            fFirst = entry;
+        } else {
+            delete zsf;
+        }
+        umtx_unlock(&gZSFCacheLock);
+    }
+
+    result = new SafeZoneStringFormatPtr(entry);
+
+    // Now, delete unused cache entries beyond the capacity
+    umtx_lock(&gZSFCacheLock);
+    entry = fFirst;
+    prev = NULL;
+    int32_t idx = 1;
+    while (entry) {
+        next = entry->fNext;
+        if (idx >= fCapacity && entry->fRefCount == 0) {
+            if (entry == fFirst) {
+                fFirst = next;
+            } else {
+                prev->fNext = next;
+            }
+            delete entry;
+        } else {
+            prev = entry;
+        }
+        entry = next;
+        idx++;
+    }
+    umtx_unlock(&gZSFCacheLock);
+
+    return result;
+}
+
+U_NAMESPACE_END
+
+#endif /* #if !UCONFIG_NO_FORMATTING */

Added: trunk/source/i18n/zstrfmt.h
===================================================================
--- trunk/source/i18n/zstrfmt.h	                        (rev 0)
+++ trunk/source/i18n/zstrfmt.h	2008-03-24 11:52:37 UTC (rev 144)
@@ -0,0 +1,442 @@
+/*
+*******************************************************************************
+* Copyright (C) 2007, International Business Machines Corporation and         *
+* others. All Rights Reserved.                                                *
+*******************************************************************************
+*/
+#ifndef ZSTRFMT_H
+#define ZSTRFMT_H
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_FORMATTING
+
+#include "unicode/unistr.h"
+#include "unicode/calendar.h"
+#include "hash.h"
+#include "uvector.h"
+
+U_NAMESPACE_BEGIN
+
+/*
+ * Character node used by TextTrieMap
+ */
+class CharacterNode : public UMemory {
+public:
+    CharacterNode(UChar32 c, UObjectDeleter *fn, UErrorCode &status);
+    virtual ~CharacterNode();
+
+    inline UChar32 getCharacter(void) const;
+    inline const UVector* getValues(void) const;
+    inline const UVector* getChildNodes(void) const;
+
+    void addValue(void *value, UErrorCode &status);
+    CharacterNode* addChildNode(UChar32 c, UErrorCode &status);
+    CharacterNode* getChildNode(UChar32 c) const;
+
+private:
+    UVector fChildren;
+    UVector fValues;
+    UObjectDeleter  *fValueDeleter;
+    UChar32 fCharacter;
+};
+
+inline UChar32 CharacterNode::getCharacter(void) const {
+    return fCharacter;
+}
+
+inline const UVector* CharacterNode::getValues(void) const {
+    return &fValues;
+}
+
+inline const UVector* CharacterNode::getChildNodes(void) const {
+    return &fChildren;
+}
+
+/*
+ * Search result handler callback interface used by TextTrieMap search.
+ */
+class TextTrieMapSearchResultHandler {
+public:
+    virtual UBool handleMatch(int32_t matchLength,
+        const UVector *values, UErrorCode& status) = 0;
+};
+
+/**
+ * TextTrieMap is a trie implementation for supporting
+ * fast prefix match for the string key.
+ */
+class TextTrieMap : public UMemory {
+public:
+    TextTrieMap(UBool ignoreCase, UObjectDeleter *valueDeleterFunc);
+    virtual ~TextTrieMap();
+
+    void put(const UnicodeString &key, void *value, UErrorCode &status);
+    void search(const UnicodeString &text, int32_t start,
+        TextTrieMapSearchResultHandler *handler, UErrorCode& status) const;
+    inline int32_t isEmpty() const;
+
+private:
+    UBool           fIgnoreCase;
+    UObjectDeleter  *fValueDeleter;
+    CharacterNode   *fRoot;
+
+    void search(CharacterNode *node, const UnicodeString &text, int32_t start,
+        int32_t index, TextTrieMapSearchResultHandler *handler, UErrorCode &status) const;
+};
+
+inline UChar32 TextTrieMap::isEmpty(void) const {
+    return fRoot == NULL;
+}
+
+// Name types, these bit flag are used for zone string lookup
+enum TimeZoneTranslationType {
+    LOCATION        = 0x0001,
+    GENERIC_LONG    = 0x0002,
+    GENERIC_SHORT   = 0x0004,
+    STANDARD_LONG   = 0x0008,
+    STANDARD_SHORT  = 0x0010,
+    DAYLIGHT_LONG   = 0x0020,
+    DAYLIGHT_SHORT  = 0x0040
+};
+
+// Name type index, these constants are used for index in the zone strings array.
+enum TimeZoneTranslationTypeIndex {
+    ZSIDX_LOCATION = 0,
+    ZSIDX_LONG_STANDARD,
+    ZSIDX_SHORT_STANDARD,
+    ZSIDX_LONG_DAYLIGHT,
+    ZSIDX_SHORT_DAYLIGHT,
+    ZSIDX_LONG_GENERIC,
+    ZSIDX_SHORT_GENERIC,
+
+    ZSIDX_COUNT
+};
+
+class MessageFormat;
+
+/*
+ * ZoneStringInfo is a class holding a localized zone string
+ * information.
+ */
+class ZoneStringInfo : public UMemory {
+public:
+    virtual ~ZoneStringInfo();
+
+    inline UnicodeString& getID(UnicodeString &result) const;
+    inline UnicodeString& getString(UnicodeString &result) const;
+    inline UBool isStandard(void) const;
+    inline UBool isDaylight(void) const;
+    inline UBool isGeneric(void) const;
+
+private:
+    friend class ZoneStringFormat;
+    friend class ZoneStringSearchResultHandler;
+
+    ZoneStringInfo(const UnicodeString &id, const UnicodeString &str, TimeZoneTranslationType type);
+
+    UnicodeString   fId;
+    UnicodeString   fStr;
+    TimeZoneTranslationType fType;
+};
+
+inline UnicodeString& ZoneStringInfo::getID(UnicodeString &result) const {
+    return result.setTo(fId);
+}
+
+inline UnicodeString& ZoneStringInfo::getString(UnicodeString &result) const {
+    return result.setTo(fStr);
+}
+
+inline UBool ZoneStringInfo::isStandard(void) const {
+    return (fType == STANDARD_LONG || fType == STANDARD_SHORT);
+}
+
+inline UBool ZoneStringInfo::isDaylight(void) const {
+    return (fType == DAYLIGHT_LONG || fType == DAYLIGHT_SHORT);
+}
+
+inline UBool ZoneStringInfo::isGeneric(void) const {
+    return (fType == LOCATION || fType == GENERIC_LONG || fType == GENERIC_SHORT);
+}
+
+class SafeZoneStringFormatPtr;
+
+class ZoneStringFormat : public UMemory {
+public:
+    ZoneStringFormat(const UnicodeString* const* strings, int32_t rowCount, int32_t columnCount, UErrorCode &status);
+    ZoneStringFormat(const Locale& locale, UErrorCode &status);
+    virtual ~ZoneStringFormat();
+
+    static SafeZoneStringFormatPtr* getZoneStringFormat(const Locale& locale, UErrorCode &status);
+
+    /*
+     * Create a snapshot of old zone strings array for the given date
+     */
+    UnicodeString** createZoneStringsArray(UDate date, int32_t &rowCount, int32_t &colCount, UErrorCode &status) const;
+
+    const UnicodeString** getZoneStrings(int32_t &rowCount, int32_t &columnCount) const;
+
+    UnicodeString& getSpecificLongString(const Calendar &cal,
+        UnicodeString &result, UErrorCode &status) const;
+
+    UnicodeString& getSpecificShortString(const Calendar &cal,
+        UBool commonlyUsedOnly, UnicodeString &result, UErrorCode &status) const;
+
+    UnicodeString& getGenericLongString(const Calendar &cal,
+        UnicodeString &result, UErrorCode &status) const;
+
+    UnicodeString& getGenericShortString(const Calendar &cal,
+        UBool commonlyUsedOnly, UnicodeString &result, UErrorCode &status) const;
+
+    UnicodeString& getGenericLocationString(const Calendar &cal,
+        UnicodeString &result, UErrorCode &status) const;
+
+    const ZoneStringInfo* findSpecificLong(const UnicodeString &text, int32_t start,
+        int32_t &matchLength, UErrorCode &status) const;
+    const ZoneStringInfo* findSpecificShort(const UnicodeString &text, int32_t start,
+        int32_t &matchLength, UErrorCode &status) const;
+    const ZoneStringInfo* findGenericLong(const UnicodeString &text, int32_t start,
+        int32_t &matchLength, UErrorCode &status) const;
+    const ZoneStringInfo* findGenericShort(const UnicodeString &text, int32_t start,
+        int32_t &matchLength, UErrorCode &status) const;
+    const ZoneStringInfo* findGenericLocation(const UnicodeString &text, int32_t start,
+        int32_t &matchLength, UErrorCode &status) const;
+
+    // Following APIs are not used by SimpleDateFormat, but public for testing purpose
+    inline UnicodeString& getLongStandard(const UnicodeString &tzid, UDate date,
+        UnicodeString &result) const;
+    inline UnicodeString& getLongDaylight(const UnicodeString &tzid, UDate date,
+        UnicodeString &result) const;
+    inline UnicodeString& getLongGenericNonLocation(const UnicodeString &tzid, UDate date,
+        UnicodeString &result) const;
+    inline UnicodeString& getLongGenericPartialLocation(const UnicodeString &tzid, UDate date,
+        UnicodeString &result) const;
+    inline UnicodeString& getShortStandard(const UnicodeString &tzid, UDate date, UBool commonlyUsedOnly,
+        UnicodeString &result) const;
+    inline UnicodeString& getShortDaylight(const UnicodeString &tzid, UDate date, UBool commonlyUsedOnly,
+        UnicodeString &result) const;
+    inline UnicodeString& getShortGenericNonLocation(const UnicodeString &tzid, UDate date, UBool commonlyUsedOnly,
+        UnicodeString &result) const;
+    inline UnicodeString& getShortGenericPartialLocation(const UnicodeString &tzid, UDate date, UBool commonlyUsedOnly,
+        UnicodeString &result) const;
+    inline UnicodeString& getGenericLocation(const UnicodeString &tzid, UnicodeString &result) const;
+
+private:
+    Locale      fLocale;
+    Hashtable   fTzidToStrings;
+    Hashtable   fMzidToStrings;
+    TextTrieMap fZoneStringsTrie;
+
+    /*
+     * Private method to get a zone string except generic partial location types.
+     */
+    UnicodeString& getString(const UnicodeString &tzid, TimeZoneTranslationTypeIndex typeIdx, UDate date,
+        UBool commonlyUsedOnly, UnicodeString& result) const;
+
+    /*
+     * Private method to get a generic string, with fallback logic involved,
+     * that is,
+     * 
+     * 1. If a generic non-location string is avaiable for the zone, return it.
+     * 2. If a generic non-location string is associated with a metazone and 
+     *    the zone never use daylight time around the given date, use the standard
+     *    string (if available).
+     *    
+     *    Note: In CLDR1.5.1, the same localization is used for generic and standard.
+     *    In this case, we do not use the standard string and do the rest.
+     *    
+     * 3. If a generic non-location string is associated with a metazone and
+     *    the offset at the given time is different from the preferred zone for the
+     *    current locale, then return the generic partial location string (if avaiable)
+     * 4. If a generic non-location string is not available, use generic location
+     *    string.
+     */
+    UnicodeString& getGenericString(const Calendar &cal, UBool isShort, UBool commonlyUsedOnly,
+        UnicodeString &result, UErrorCode &status) const;
+
+    /*
+     * Private method to get a generic partial location string
+     */
+    UnicodeString& getGenericPartialLocationString(const UnicodeString &tzid, UBool isShort,
+        UDate date, UBool commonlyUsedOnly, UnicodeString &result) const;
+
+    /*
+     * Find a prefix matching time zone for the given zone string types.
+     * @param text The text contains a time zone string
+     * @param start The start index within the text
+     * @param types The bit mask representing a set of requested types
+     * @param matchLength Receives the match length
+     * @param status
+     * @return If any zone string matched for the requested types, returns a
+     * ZoneStringInfo for the longest match.  If no matches are found for
+     * the requested types, returns a ZoneStringInfo for the longest match
+     * for any other types.  If nothing matches at all, returns null.
+     */
+    const ZoneStringInfo* find(const UnicodeString &text, int32_t start, int32_t types,
+        int32_t &matchLength, UErrorCode &status) const;
+
+    UnicodeString& getRegion(UnicodeString &region) const;
+
+    static MessageFormat* getFallbackFormat(const Locale &locale, UErrorCode &status);
+    static MessageFormat* getRegionFormat(const Locale &locale, UErrorCode &status);
+    static const UChar* getZoneStringFromBundle(const UResourceBundle *zoneitem, const char *key);
+    static UBool isCommonlyUsed(const UResourceBundle *zoneitem);
+    static UnicodeString& getLocalizedCountry(const UnicodeString &countryCode, const Locale &locale,
+        UnicodeString &displayCountry);
+};
+
+inline UnicodeString&
+ZoneStringFormat::getLongStandard(const UnicodeString &tzid, UDate date,
+                                  UnicodeString &result) const {
+    return getString(tzid, ZSIDX_LONG_STANDARD, date, FALSE /* not used */, result);
+}
+
+inline UnicodeString&
+ZoneStringFormat::getLongDaylight(const UnicodeString &tzid, UDate date,
+                                  UnicodeString &result) const {
+    return getString(tzid, ZSIDX_LONG_DAYLIGHT, date, FALSE /* not used */, result);
+}
+
+inline UnicodeString&
+ZoneStringFormat::getLongGenericNonLocation(const UnicodeString &tzid, UDate date,
+                                            UnicodeString &result) const {
+    return getString(tzid, ZSIDX_LONG_GENERIC, date, FALSE /* not used */, result);
+}
+
+inline UnicodeString&
+ZoneStringFormat::getLongGenericPartialLocation(const UnicodeString &tzid, UDate date,
+                                                UnicodeString &result) const {
+    return getGenericPartialLocationString(tzid, FALSE, date, FALSE /* not used */, result);
+}
+
+inline UnicodeString&
+ZoneStringFormat::getShortStandard(const UnicodeString &tzid, UDate date, UBool commonlyUsedOnly,
+                                   UnicodeString &result) const {
+    return getString(tzid, ZSIDX_SHORT_STANDARD, date, commonlyUsedOnly, result);
+}
+
+inline UnicodeString&
+ZoneStringFormat::getShortDaylight(const UnicodeString &tzid, UDate date, UBool commonlyUsedOnly,
+                                   UnicodeString &result) const {
+    return getString(tzid, ZSIDX_SHORT_DAYLIGHT, date, commonlyUsedOnly, result);
+}
+
+inline UnicodeString&
+ZoneStringFormat::getShortGenericNonLocation(const UnicodeString &tzid, UDate date, UBool commonlyUsedOnly,
+                                             UnicodeString &result) const {
+    return getString(tzid, ZSIDX_SHORT_GENERIC, date, commonlyUsedOnly, result);
+}
+
+inline UnicodeString&
+ZoneStringFormat::getShortGenericPartialLocation(const UnicodeString &tzid, UDate date, UBool commonlyUsedOnly,
+                                                 UnicodeString &result) const {
+    return getGenericPartialLocationString(tzid, TRUE, date, commonlyUsedOnly, result);
+}
+
+inline UnicodeString&
+ZoneStringFormat::getGenericLocation(const UnicodeString &tzid, UnicodeString &result) const {
+    return getString(tzid, ZSIDX_LOCATION, 0 /*not used*/, FALSE /*not used*/, result);
+}
+
+
+/*
+ * ZooneStrings is a container of localized zone strings used by ZoneStringFormat
+ */
+class ZoneStrings : public UMemory {
+public:
+    ZoneStrings(UnicodeString *strings, int32_t stringsCount, UBool commonlyUsed,
+        UnicodeString **genericPartialLocationStrings, int32_t genericRowCount, int32_t genericColCount);
+    virtual ~ZoneStrings();
+
+    UnicodeString& getString(int32_t typeIdx, UnicodeString &result) const;
+    inline UBool isShortFormatCommonlyUsed(void) const;
+    UnicodeString& getGenericPartialLocationString(const UnicodeString &mzid, UBool isShort,
+        UBool commonlyUsedOnly, UnicodeString &result) const;
+
+private:
+    UnicodeString   *fStrings;
+    int32_t         fStringsCount;
+    UBool           fIsCommonlyUsed;
+    UnicodeString   **fGenericPartialLocationStrings;
+    int32_t         fGenericPartialLocationRowCount;
+    int32_t         fGenericPartialLocationColCount;
+};
+
+inline UBool
+ZoneStrings::isShortFormatCommonlyUsed(void) const {
+    return fIsCommonlyUsed;
+}
+
+/*
+ * ZoneStringSearchResultHandler is an implementation of
+ * TextTrieMapSearchHandler.  This class is used by ZoneStringFormat
+ * for collecting search results for localized zone strings.
+ */
+class ZoneStringSearchResultHandler : public UMemory, TextTrieMapSearchResultHandler {
+public:
+    ZoneStringSearchResultHandler(UErrorCode &status);
+    virtual ~ZoneStringSearchResultHandler();
+
+    virtual UBool handleMatch(int32_t matchLength, const UVector *values, UErrorCode &status);
+    int32_t countMatches(void);
+    const ZoneStringInfo* getMatch(int32_t index, int32_t &matchLength);
+    void clear(void);
+
+private:
+    UVector fResults;
+    int32_t fMatchLen[ZSIDX_COUNT];
+};
+
+
+/*
+ * ZoneStringFormat cache implementation
+ */
+class ZSFCacheEntry : public UMemory {
+public:
+    ~ZSFCacheEntry();
+
+    void delRef(void);
+    const ZoneStringFormat* getZoneStringFormat(void);
+
+private:
+    friend class ZSFCache;
+
+    ZSFCacheEntry(const Locale &locale, ZoneStringFormat *zsf, ZSFCacheEntry *next);
+
+    Locale              fLocale;
+    ZoneStringFormat    *fZoneStringFormat;
+    ZSFCacheEntry       *fNext;
+    int32_t             fRefCount;
+};
+
+class SafeZoneStringFormatPtr : public UMemory {
+public:
+    ~SafeZoneStringFormatPtr();
+    const ZoneStringFormat* get() const;
+
+private:
+    friend class ZSFCache;
+
+    SafeZoneStringFormatPtr(ZSFCacheEntry *cacheEntry);
+
+    ZSFCacheEntry   *fCacheEntry;
+};
+
+class ZSFCache : public UMemory {
+public:
+    ZSFCache(int32_t capacity);
+    ~ZSFCache();
+
+    SafeZoneStringFormatPtr* get(const Locale &locale, UErrorCode &status);
+
+private:
+    int32_t         fCapacity;
+    ZSFCacheEntry   *fFirst;
+};
+
+U_NAMESPACE_END
+
+#endif /* #if !UCONFIG_NO_FORMATTING */
+
+#endif // ZSTRFMT_H

Modified: trunk/source/layout/GlyphIterator.cpp
===================================================================
--- trunk/source/layout/GlyphIterator.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/layout/GlyphIterator.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -19,7 +19,7 @@
                              FeatureMask theFeatureMask, const GlyphDefinitionTableHeader *theGlyphDefinitionTableHeader)
   : direction(1), position(-1), nextLimit(-1), prevLimit(-1),
     glyphStorage(theGlyphStorage), glyphPositionAdjustments(theGlyphPositionAdjustments),
-    srcIndex(-1), destIndex(-1), lookupFlags(theLookupFlags), featureMask(theFeatureMask),
+    srcIndex(-1), destIndex(-1), lookupFlags(theLookupFlags), featureMask(theFeatureMask), glyphGroup(0),
     glyphClassDefinitionTable(NULL), markAttachClassDefinitionTable(NULL)
 
 {
@@ -53,6 +53,7 @@
     destIndex = that.destIndex;
     lookupFlags = that.lookupFlags;
     featureMask = that.featureMask;
+    glyphGroup  = that.glyphGroup;
     glyphClassDefinitionTable = that.glyphClassDefinitionTable;
     markAttachClassDefinitionTable = that.markAttachClassDefinitionTable;
 }
@@ -70,6 +71,7 @@
     destIndex = that.destIndex;
     lookupFlags = that.lookupFlags;
     featureMask = newFeatureMask;
+    glyphGroup  = 0;
     glyphClassDefinitionTable = that.glyphClassDefinitionTable;
     markAttachClassDefinitionTable = that.markAttachClassDefinitionTable;
 }
@@ -87,6 +89,7 @@
     destIndex = that.destIndex;
     lookupFlags = newLookupFlags;
     featureMask = that.featureMask;
+    glyphGroup  = that.glyphGroup;
     glyphClassDefinitionTable = that.glyphClassDefinitionTable;
     markAttachClassDefinitionTable = that.markAttachClassDefinitionTable;
 }
@@ -100,6 +103,7 @@
 {
     position     = prevLimit;
     featureMask  = newFeatureMask;
+    glyphGroup   = 0;
     lookupFlags  = newLookupFlags;
 }
 
@@ -396,7 +400,7 @@
     }
 }
 
-le_bool GlyphIterator::hasFeatureTag() const
+le_bool GlyphIterator::hasFeatureTag(le_bool matchGroup) const
 {
     if (featureMask == 0) {
         return TRUE;
@@ -405,14 +409,18 @@
     LEErrorCode success = LE_NO_ERROR;
     FeatureMask fm = glyphStorage.getAuxData(position, success);
 
-    return (fm & featureMask) != 0;
+    return ((fm & featureMask) == featureMask) && (!matchGroup || (fm & LE_GLYPH_GROUP_MASK) == glyphGroup);
 }
 
 le_bool GlyphIterator::findFeatureTag()
 {
+  //glyphGroup = 0;
+
     while (nextInternal()) {
-        if (hasFeatureTag()) {
-            prevInternal();
+        if (hasFeatureTag(FALSE)) {
+            LEErrorCode success = LE_NO_ERROR;
+
+            glyphGroup = (glyphStorage.getAuxData(position, success) & LE_GLYPH_GROUP_MASK);
             return TRUE;
         }
     }
@@ -440,7 +448,7 @@
 
 le_bool GlyphIterator::next(le_uint32 delta)
 {
-    return nextInternal(delta) && hasFeatureTag();
+    return nextInternal(delta) && hasFeatureTag(TRUE);
 }
 
 le_bool GlyphIterator::prevInternal(le_uint32 delta)
@@ -462,7 +470,7 @@
 
 le_bool GlyphIterator::prev(le_uint32 delta)
 {
-    return prevInternal(delta) && hasFeatureTag();
+    return prevInternal(delta) && hasFeatureTag(TRUE);
 }
 
 le_int32 GlyphIterator::getMarkComponent(le_int32 markPosition) const

Modified: trunk/source/layout/GlyphIterator.h
===================================================================
--- trunk/source/layout/GlyphIterator.h	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/layout/GlyphIterator.h	2008-03-24 11:52:37 UTC (rev 144)
@@ -74,7 +74,7 @@
 
 private:
     le_bool filterGlyph(le_uint32 index) const;
-    le_bool hasFeatureTag() const;
+    le_bool hasFeatureTag(le_bool matchGroup) const;
     le_bool nextInternal(le_uint32 delta = 1);
     le_bool prevInternal(le_uint32 delta = 1);
 
@@ -90,6 +90,7 @@
     le_int32    destIndex;
     le_uint16   lookupFlags;
     FeatureMask featureMask;
+    le_int32    glyphGroup;
 
     const GlyphClassDefinitionTable *glyphClassDefinitionTable;
     const MarkAttachClassDefinitionTable *markAttachClassDefinitionTable;

Modified: trunk/source/layout/IndicReordering.cpp
===================================================================
--- trunk/source/layout/IndicReordering.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/layout/IndicReordering.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -52,6 +52,7 @@
 
 class IndicReorderingOutput : public UMemory {
 private:
+    le_int32   fSyllableCount;
     le_int32   fOutIndex;
     LEUnicode *fOutChars;
 
@@ -130,7 +131,7 @@
 
 public:
     IndicReorderingOutput(LEUnicode *outChars, LEGlyphStorage &glyphStorage, MPreFixups *mpreFixups)
-        : fOutIndex(0), fOutChars(outChars), fGlyphStorage(glyphStorage),
+        : fSyllableCount(0), fOutIndex(0), fOutChars(outChars), fGlyphStorage(glyphStorage),
           fMpre(0), fMpreIndex(0), fMbelow(0), fMbelowIndex(0), fMabove(0), fMaboveIndex(0),
           fMpost(0), fMpostIndex(0), fLengthMark(0), fLengthMarkIndex(0), fVirama(0), fViramaIndex(0),
           fMatraFeatures(0), fMPreOutIndex(-1), fMPreFixups(mpreFixups),
@@ -147,6 +148,8 @@
 
     void reset()
     {
+        fSyllableCount += 1;
+
         fMpre = fMbelow = fMabove = fMpost = fLengthMark = fVirama = 0;
         fMPreOutIndex = -1;
         
@@ -161,7 +164,7 @@
         fOutChars[fOutIndex] = ch;
 
         fGlyphStorage.setCharIndex(fOutIndex, charIndex, success);
-        fGlyphStorage.setAuxData(fOutIndex, charFeatures, success);
+        fGlyphStorage.setAuxData(fOutIndex, charFeatures | (fSyllableCount & LE_GLYPH_GROUP_MASK), success);
 
         fOutIndex += 1;
     }

Modified: trunk/source/layout/KhmerReordering.cpp
===================================================================
--- trunk/source/layout/KhmerReordering.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/layout/KhmerReordering.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -1,6 +1,6 @@
 /*
  *
- * (C) Copyright IBM Corp. 1998-2006 - All Rights Reserved 
+ * (C) Copyright IBM Corp. 1998-2007 - All Rights Reserved 
  *
  * This file is a modification of the ICU file IndicReordering.cpp
  * by Jens Herden and Javier Sola for Khmer language 
@@ -126,6 +126,7 @@
 
 class KhmerReorderingOutput : public UMemory {
 private:
+    le_int32 fSyllableCount;
     le_int32 fOutIndex;
     LEUnicode *fOutChars;
 
@@ -134,7 +135,7 @@
 
 public:
     KhmerReorderingOutput(LEUnicode *outChars, LEGlyphStorage &glyphStorage)
-        : fOutIndex(0), fOutChars(outChars), fGlyphStorage(glyphStorage)
+        : fSyllableCount(0), fOutIndex(0), fOutChars(outChars), fGlyphStorage(glyphStorage)
     {
         // nothing else to do...
     }
@@ -144,6 +145,11 @@
         // nothing to do here...
     }
 
+    void reset()
+    {
+        fSyllableCount += 1;
+    }
+
     void writeChar(LEUnicode ch, le_uint32 charIndex, FeatureMask charFeatures)
     {
         LEErrorCode success = LE_NO_ERROR;
@@ -151,7 +157,7 @@
         fOutChars[fOutIndex] = ch;
 
         fGlyphStorage.setCharIndex(fOutIndex, charIndex, success);
-        fGlyphStorage.setAuxData(fOutIndex, charFeatures, success);
+        fGlyphStorage.setAuxData(fOutIndex, charFeatures | (fSyllableCount & LE_GLYPH_GROUP_MASK), success);
 
         fOutIndex += 1;
     }
@@ -364,6 +370,8 @@
     // several syllables.
     while (prev < charCount) {
         le_int32 syllable = findSyllable(classTable, chars, prev, charCount);
+
+        output.reset();
    
         // write a pre vowel or the pre part of a split vowel first
         // and look out for coeng + ro. RO is the only vowel of type 2, and

Modified: trunk/source/layout/LookupProcessor.cpp
===================================================================
--- trunk/source/layout/LookupProcessor.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/layout/LookupProcessor.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -1,6 +1,6 @@
 /*
  *
- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
+ * (C) Copyright IBM Corp. 1998-2007 - All Rights Reserved
  *
  */
 
@@ -67,11 +67,7 @@
             glyphIterator.reset(lookupFlags, selectMask);
 
             while (glyphIterator.findFeatureTag()) {
-                le_uint32 delta = 1;
-
-                while (glyphIterator.next(delta)) {
-                    delta = applyLookupTable(lookupTable, &glyphIterator, fontInstance);
-                }
+                applyLookupTable(lookupTable, &glyphIterator, fontInstance);
             }
 
             newGlyphCount = glyphIterator.applyInsertions();

Modified: trunk/source/layout/OpenTypeLayoutEngine.cpp
===================================================================
--- trunk/source/layout/OpenTypeLayoutEngine.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/layout/OpenTypeLayoutEngine.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -332,16 +332,25 @@
         delete adjustments;
     }
 
-    LEGlyphID zwnj = fFontInstance->mapCharToGlyph(0x200C);
-    LEGlyphID nbsp = fFontInstance->mapCharToGlyph(0x00A0);
+    LEGlyphID zwnj  = fFontInstance->mapCharToGlyph(0x200C);
+#if 0
+    // The nbsp translation was only here to make one
+    // broken font work. Not a good idea in general... 
+    LEGlyphID nbsp  = fFontInstance->mapCharToGlyph(0x00A0);
+    LEGlyphID space = fFontInstance->mapCharToGlyph(0x0020);
+#endif
 
-    for (le_int32 g = 0; g < glyphCount; g += 1) {
-        LEGlyphID glyph = glyphStorage[g];
+    if (zwnj != 0x0000) {
+        for (le_int32 g = 0; g < glyphCount; g += 1) {
+            LEGlyphID glyph = glyphStorage[g];
 
-        if (glyph == zwnj) {
-            glyphStorage[g] = LE_SET_GLYPH(glyph, 0xFFFF);
-        } else if (glyph == nbsp) {
-            glyphStorage[g] = LE_SET_GLYPH(glyph, 0x0003);
+            if (glyph == zwnj) {
+                glyphStorage[g] = LE_SET_GLYPH(glyph, 0xFFFF);
+    #if 0
+            } else if (glyph == nbsp) {
+                glyphStorage[g] = LE_SET_GLYPH(glyph, space);
+    #endif
+            }
         }
     }
 

Modified: trunk/source/layout/OpenTypeTables.h
===================================================================
--- trunk/source/layout/OpenTypeTables.h	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/layout/OpenTypeTables.h	2008-03-24 11:52:37 UTC (rev 144)
@@ -1,6 +1,6 @@
 /*
  *
- * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
+ * (C) Copyright IBM Corp. 1998-2007 - All Rights Reserved
  *
  */
 
@@ -21,6 +21,8 @@
 typedef le_uint16 Offset;
 typedef le_uint8  ATag[4];
 typedef le_uint32 fixed32;
+
+#define LE_GLYPH_GROUP_MASK 0x00000001UL
 typedef le_uint32 FeatureMask;
 
 #define SWAPT(atag) ((LETag) ((atag[0] << 24) + (atag[1] << 16) + (atag[2] << 8) + atag[3]))

Modified: trunk/source/layout/ThaiLayoutEngine.cpp
===================================================================
--- trunk/source/layout/ThaiLayoutEngine.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/layout/ThaiLayoutEngine.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -23,7 +23,10 @@
     fErrorChar = 0x25CC;
 
     // Figure out which presentation forms the font uses
-    if (fontInstance->canDisplay(0x0E64)) {
+    if (! fontInstance->canDisplay(0x0E01)) {
+        // No Thai in font; don't use presentation forms.
+        fGlyphSet = 3;
+    } else if (fontInstance->canDisplay(0x0E64)) {
         // WorldType uses reserved space in Thai block
         fGlyphSet = 0;
     } else if (fontInstance->canDisplay(0xF701)) {

Modified: trunk/source/layout/TibetanReordering.cpp
===================================================================
--- trunk/source/layout/TibetanReordering.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/layout/TibetanReordering.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -1,6 +1,6 @@
 /*
  *
- * (C) Copyright IBM Corp. 1998-2006 - All Rights Reserved 
+ * (C) Copyright IBM Corp. 1998-2007 - All Rights Reserved 
  *
  * Developed at DIT - Government of Bhutan
  *
@@ -128,6 +128,7 @@
 
 class TibetanReorderingOutput : public UMemory {
 private:
+    le_int32 fSyllableCount;
     le_int32 fOutIndex;
     LEUnicode *fOutChars;
 
@@ -136,7 +137,7 @@
 
 public:
     TibetanReorderingOutput(LEUnicode *outChars, LEGlyphStorage &glyphStorage)
-        : fOutIndex(0), fOutChars(outChars), fGlyphStorage(glyphStorage)
+        : fSyllableCount(0), fOutIndex(0), fOutChars(outChars), fGlyphStorage(glyphStorage)
     {
         // nothing else to do...
     }
@@ -146,6 +147,11 @@
         // nothing to do here...
     }
 
+    void reset()
+    {
+        fSyllableCount += 1;
+    }
+
     void writeChar(LEUnicode ch, le_uint32 charIndex, FeatureMask featureMask)
     {
         LEErrorCode success = LE_NO_ERROR;
@@ -325,7 +331,9 @@
     // This loop only exits when we reach the end of a run, which may contain 
     // several syllables.
     while (prev < charCount) {
-        le_int32 syllable = findSyllable(classTable, chars, prev, charCount);   
+        le_int32 syllable = findSyllable(classTable, chars, prev, charCount);  
+
+        output.reset();
        
         // shall we add a dotted circle?
         // If in the position in which the base should be (first char in the string) there is

Modified: trunk/source/layoutex/ParagraphLayout.cpp
===================================================================
--- trunk/source/layoutex/ParagraphLayout.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/layoutex/ParagraphLayout.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -971,8 +971,13 @@
             glyphToCharMap[outGlyph] = fGlyphToCharMap[glyphBase + inGlyph];
         }
     } else {
-        for (outGlyph = 0, inGlyph = rightGlyph - 1; inGlyph >= leftGlyph; inGlyph -= 1, outGlyph += 1) {
-            glyphToCharMap[outGlyph] = fGlyphToCharMap[glyphBase + inGlyph];
+        // Because fGlyphToCharMap is stored in logical order to facilitate line breaking,
+        // we need to map the physical glyph indices to logical indices while we copy the
+        // character indices.
+        le_int32 base = glyphBase + fStyleRunInfo[run].glyphCount - 1;
+
+        for (outGlyph = 0, inGlyph = leftGlyph; inGlyph < rightGlyph; inGlyph += 1, outGlyph += 1) {
+            glyphToCharMap[outGlyph] = fGlyphToCharMap[base - inGlyph];
         }
     }
 

Modified: trunk/source/samples/datefmt/README.TXT
===================================================================
--- trunk/source/samples/datefmt/README.TXT	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/samples/datefmt/README.TXT	2008-03-24 11:52:37 UTC (rev 144)
@@ -1,14 +1,14 @@
-Copyright (c) 2002-2005, International Business Machines Corporation and others. All Rights Reserved.
+Copyright (c) 2002-2007, International Business Machines Corporation and others. All Rights Reserved.
 This is an exercise for the ICU Workshop (September 2000).
 ** Workshop homepage is:  
-  http://icu.sourceforge.net/docs/workshop_2000/agenda.html
+  http://www.icu-project.org/docs/workshop_2000/agenda.html
 
   Day 2: September 12th 2000
   Pre-requsit:
   1. All the hardware and software requirements from Day 1.
   2. Attended or fully understand Day 1 material.
   3. Read through the ICU user's guide at
-  http://icu.sourceforge.net/userguide/.
+  http://www.icu-project.org/userguide/.
 
   #Date/Time/Number Formatting Support
   9:30am - 10:30am

Modified: trunk/source/samples/layout/layout.cpp
===================================================================
--- trunk/source/samples/layout/layout.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/samples/layout/layout.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -146,7 +146,7 @@
         context->height = 400;
 
         context->paragraph = Paragraph::paragraphFactory("Sample.txt", font, guiSupport);
-        SetWindowLongPtr(hwnd, 0, (LONG_PTR) context);
+        SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR) context);
 
         windowCount += 1;
         ReleaseDC(hwnd, hdc);
@@ -157,7 +157,7 @@
 
     case WM_SIZE:
     {
-        context = (Context *) GetWindowLongPtr(hwnd, 0);
+        context = (Context *) GetWindowLongPtr(hwnd, GWLP_USERDATA);
         context->width  = LOWORD(lParam);
         context->height = HIWORD(lParam);
 
@@ -214,7 +214,7 @@
         SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
         GetScrollInfo(hwnd, SB_VERT, &si);
 
-        context = (Context *) GetWindowLongPtr(hwnd, 0);
+        context = (Context *) GetWindowLongPtr(hwnd, GWLP_USERDATA);
 
         if (context->paragraph != NULL && si.nPos != vertPos) {
             ScrollWindow(hwnd, 0, context->paragraph->getLineHeight() * (vertPos - si.nPos), NULL, NULL);
@@ -239,7 +239,7 @@
 
         firstLine = si.nPos;
 
-        context = (Context *) GetWindowLongPtr(hwnd, 0);
+        context = (Context *) GetWindowLongPtr(hwnd, GWLP_USERDATA);
 
         if (context->paragraph != NULL) {
             surface->setHDC(hdc);
@@ -295,7 +295,7 @@
                 Paragraph *newParagraph = Paragraph::paragraphFactory(szFileName, font, guiSupport);
 
                 if (newParagraph != NULL) {
-                    context = (Context *) GetWindowLongPtr(hwnd, 0);
+                    context = (Context *) GetWindowLongPtr(hwnd, GWLP_USERDATA);
 
                     if (context->paragraph != NULL) {
                         delete context->paragraph;
@@ -332,7 +332,7 @@
 
     case WM_DESTROY:
     {
-        context = (Context *) GetWindowLongPtr(hwnd, 0);
+        context = (Context *) GetWindowLongPtr(hwnd, GWLP_USERDATA);
 
         if (context != NULL && context->paragraph != NULL) {
             delete context->paragraph;

Modified: trunk/source/samples/msgfmt/README.TXT
===================================================================
--- trunk/source/samples/msgfmt/README.TXT	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/samples/msgfmt/README.TXT	2008-03-24 11:52:37 UTC (rev 144)
@@ -1,14 +1,14 @@
-Copyright (c) 2002-2005, International Business Machines Corporation and others. All Rights Reserved.
+Copyright (c) 2002-2007, International Business Machines Corporation and others. All Rights Reserved.
 This is an exercise for the ICU Workshop (September 2000).
 
-  http://icu.sourceforge.net/docs/workshop_2000/agenda.html
+  http://www.icu-project.org/docs/workshop_2000/agenda.html
 
   Day 2: September 12th 2000
   Pre-requisites:
   1. All the hardware and software requirements from Day 1.
   2. Attended or fully understand Day 1 material.
   3. Read through the ICU user's guide at
-  http://icu.sourceforge.net/userguide/.
+  http://www.icu-project.org/userguide/.
 
   #Date/Time/Number Formatting Support
   9:30am - 10:30am

Modified: trunk/source/samples/translit/README.TXT
===================================================================
--- trunk/source/samples/translit/README.TXT	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/samples/translit/README.TXT	2008-03-24 11:52:37 UTC (rev 144)
@@ -1,13 +1,13 @@
-Copyright (c) 2002-2005, International Business Machines Corporation and others. All Rights Reserved.
+Copyright (c) 2002-2007, International Business Machines Corporation and others. All Rights Reserved.
 This is an exercise for the ICU Workshop (September 2000).
-  http://icu.sourceforge.net/docs/workshop_2000/agenda.html
+  http://www.icu-project.org/docs/workshop_2000/agenda.html
 
   Day 2: September 12th 2000
   Pre-requisite:
   1. All the hardware and software requirements from Day 1.
   2. Attended or fully understand Day 1 material.
   3. Read through the ICU user's guide at
-  http://icu.sourceforge.net/userguide/.
+  http://www.icu-project.org/userguide/.
 
   #Transformation Support
   10:45am - 12:00pm

Modified: trunk/source/test/cintltst/callcoll.c
===================================================================
--- trunk/source/test/cintltst/callcoll.c	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/test/cintltst/callcoll.c	2008-03-24 11:52:37 UTC (rev 144)
@@ -210,7 +210,7 @@
   UErrorCode status = U_ZERO_ERROR;
   UResourceBundle *ColEl = NULL;
 
-  UResourceBundle *loc = ures_open(NULL, locName, &status);;
+  UResourceBundle *loc = ures_open(U_ICUDATA_COLL, locName, &status);;
 
   if(U_SUCCESS(status)) {
     status = U_ZERO_ERROR;

Modified: trunk/source/test/cintltst/cloctst.c
===================================================================
--- trunk/source/test/cintltst/cloctst.c	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/test/cintltst/cloctst.c	2008-03-24 11:52:37 UTC (rev 144)
@@ -867,9 +867,11 @@
     const char* const* str=uloc_getISOLanguages();
     const char* const* str1=uloc_getISOCountries();
     const char* test;
+    const char *key = NULL;
     int32_t count = 0, skipped = 0;
     int32_t expect;
     UResourceBundle *res;
+    UResourceBundle *subRes;
     UErrorCode status = U_ZERO_ERROR;
 
     /*  test getISOLanguages*/
@@ -878,38 +880,38 @@
 
     /* use structLocale - this data is no longer in root */
     res = ures_openDirect(loadTestData(&status), "structLocale", &status);
-    ures_getByKey(res, "Languages", res, &status);
+    subRes = ures_getByKey(res, "Languages", NULL, &status);
     if (U_FAILURE(status)) {
         log_err("There is an error in structLocale's ures_getByKey(\"Languages\"), status=%s\n", u_errorName(status));
         return;
     }
 
+    expect = ures_getSize(subRes);
     for(count = 0; *(str+count) != 0; count++)
     {
-        const char *key = NULL;
+        key = NULL;
         test = *(str+count);
         status = U_ZERO_ERROR;
 
         do {
             /* Skip over language tags. This API only returns language codes. */
             skipped += (key != NULL);
-            ures_getNextString(res, NULL, &key, &status);
+            ures_getNextString(subRes, NULL, &key, &status);
         }
         while (key != NULL && strchr(key, '_'));
 
         if(key == NULL)
             break;
-        if(!strcmp(key,"root"))
-            ures_getNextString(res, NULL, &key, &status);
-        if(!strcmp(key,"Fallback"))
-            ures_getNextString(res, NULL, &key, &status);
-        if(!strcmp(key,"sh")) /* Remove this once sh is removed. */
-            ures_getNextString(res, NULL, &key, &status);
+        /* TODO: Consider removing sh, which is deprecated */
+        if(strcmp(key,"root") == 0 || strcmp(key,"Fallback") == 0 || strcmp(key,"sh") == 0) {
+            ures_getNextString(subRes, NULL, &key, &status);
+            skipped++;
+        }
 #if U_CHARSET_FAMILY==U_ASCII_FAMILY
         /* This code only works on ASCII machines where the keys are stored in ASCII order */
         if(strcmp(test,key)) {
             /* The first difference usually implies the place where things get out of sync */
-            log_err("FAIL diff at offset %d, \"%s\" != \"%s\"\n", count, test, key);
+            log_err("FAIL Language diff at offset %d, \"%s\" != \"%s\"\n", count, test, key);
         }
 #endif
 
@@ -925,30 +927,70 @@
             log_err("FAIL getISOLanguages() has obsolete language code %s\n", test);
     }
 
-    /* We check root, just in case the en locale is removed. The en locale should have the same number of resources. */
-    expect = ures_getSize(res) - 1; /* Ignore root */
-    expect -= 1; /* TODO: Remove this line once sh goes away. */
-    expect -= skipped;
-    ures_close(res);
+    expect -= skipped; /* Ignore the skipped resources from structLocale */
 
     if(count!=expect) {
         log_err("There is an error in getISOLanguages, got %d, expected %d (as per structLocale)\n", count, expect);
     }
 
+    subRes = ures_getByKey(res, "Countries", subRes, &status);
     log_verbose("Testing ISO Countries");
+    skipped = 0;
+    expect = ures_getSize(subRes) - 1; /* Skip ZZ */
     for(count = 0; *(str1+count) != 0; count++)
     {
+        key = NULL;
         test = *(str1+count);
+        do {
+            /* Skip over numeric UN tags. This API only returns ISO-3166 codes. */
+            skipped += (key != NULL);
+            ures_getNextString(subRes, NULL, &key, &status);
+        }
+        while (key != NULL && strlen(key) != 2);
+
+        if(key == NULL)
+            break;
+        /* TODO: Consider removing CS, which is deprecated */
+        while(strcmp(key,"QO") == 0 || strcmp(key,"QU") == 0 || strcmp(key,"CS") == 0) {
+            ures_getNextString(subRes, NULL, &key, &status);
+            skipped++;
+        }
+#if U_CHARSET_FAMILY==U_ASCII_FAMILY
+        /* This code only works on ASCII machines where the keys are stored in ASCII order */
+        if(strcmp(test,key)) {
+            /* The first difference usually implies the place where things get out of sync */
+            log_err("FAIL Country diff at offset %d, \"%s\" != \"%s\"\n", count, test, key);
+        }
+#endif
         if(!strcmp(test,"FX"))
             log_err("FAIL getISOCountries() has obsolete country code %s\n", test);
+        if(!strcmp(test,"YU"))
+            log_err("FAIL getISOCountries() has obsolete country code %s\n", test);
         if(!strcmp(test,"ZR"))
             log_err("FAIL getISOCountries() has obsolete country code %s\n", test);
     }
-    expect=244;
+
+    ures_getNextString(subRes, NULL, &key, &status);
+    if (strcmp(key, "ZZ") != 0) {
+        log_err("ZZ was expected to be the last entry in structLocale, but got %s\n", key);
+    }
+#if U_CHARSET_FAMILY==U_EBCDIC_FAMILY
+    /* On EBCDIC machines, the numbers are sorted last. Account for those in the skipped value too. */
+    key = NULL;
+    do {
+        /* Skip over numeric UN tags. uloc_getISOCountries only returns ISO-3166 codes. */
+        skipped += (key != NULL);
+        ures_getNextString(subRes, NULL, &key, &status);
+    }
+    while (U_SUCCESS(status) && key != NULL && strlen(key) != 2);
+#endif
+    expect -= skipped; /* Ignore the skipped resources from structLocale */
     if(count!=expect)
     {
         log_err("There is an error in getISOCountries, got %d, expected %d \n", count, expect);
     }
+    ures_close(subRes);
+    ures_close(res);
 }
 
 static void setUpDataTable()
@@ -1199,6 +1241,7 @@
         { "in",  "ind", "in", "", "" },
         { "id",  "ind", "id", "", "" }, /* NO aliasing */
         { "sh",  "srp", "sh", "", "" },
+        { "zz_CS",  "", "zz", "SCG", "CS" },
         { "zz_FX",  "", "zz", "FXX", "FX" },
         { "zz_RO",  "", "zz", "ROU", "RO" },
         { "zz_TP",  "", "zz", "TMP", "TP" },
@@ -1210,6 +1253,7 @@
         { "zz_ZAR",  "", "zz", "ZAR", "ZR" },
         { "zz_TMP",  "", "zz", "TMP", "TP" },
         { "zz_TLS",  "", "zz", "TLS", "TL" },
+        { "zz_YUG",  "", "zz", "YUG", "YU" },
         { "mlt_PSE", "mlt", "mt", "PSE", "PS" },
         { "iw", "heb", "iw", "", "" },
         { "ji", "yid", "ji", "", "" },

Modified: trunk/source/test/cintltst/cmsccoll.c
===================================================================
--- trunk/source/test/cintltst/cmsccoll.c	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/test/cintltst/cmsccoll.c	2008-03-24 11:52:37 UTC (rev 144)
@@ -1351,6 +1351,12 @@
         log_verbose("Don't know how to test Phonebook because the reset is on an expanding character\n");
         continue;
       }
+      if (uprv_strcmp("km", locName)==0 ||
+          uprv_strcmp("km_KH", locName)==0 ||
+          uprv_strcmp("zh", locName)==0 ||
+          uprv_strcmp("zh_Hant", locName)==0 ) {
+          continue;  /* TODO: enable these locale tests after trac#6040 is fixed. */
+      }
       log_verbose("Testing locale %s\n", locName);
       coll = ucol_open(locName, &status);
       if(U_SUCCESS(status)) {
@@ -4766,7 +4772,233 @@
     genericRulesStarter(rules, test, sizeof(test)/sizeof(test[0]));
 }
 
+static void
+TestVI5913(void)
+{
+    UErrorCode status = U_ZERO_ERROR;
+    int32_t i, j;
+    UCollator *coll =NULL;
+    uint8_t  resColl[100], expColl[100];
+    int32_t  rLen, tLen, ruleLen, sLen, kLen;
+    UChar rule[256]={0x26, 0x62, 0x3c, 0x1FF3, 0};  /* &a<0x1FF3-omega with Ypogegrammeni*/
+    UChar rule2[256]={0x26, 0x7a, 0x3c, 0x0161, 0};  /* &z<s with caron*/
+    UChar rule3[256]={0x26, 0x7a, 0x3c, 0x0061, 0x00ea, 0};  /* &z<a+e with circumflex.*/
+    UChar tData[][20]={
+        {0x1EAC, 0},
+        {0x0041, 0x0323, 0x0302, 0},
+        {0x1EA0, 0x0302, 0},
+        {0x00C2, 0x0323, 0},
+        {0x1ED8, 0},  /* O with dot and circumflex */
+        {0x1ECC, 0x0302, 0},
+        {0x1EB7, 0},
+        {0x1EA1, 0x0306, 0},
+    };
+    UChar tailorData[][20]={
+        {0x1FA2, 0},  /* Omega with 3 combining marks */
+        {0x03C9, 0x0313, 0x0300, 0x0345, 0},
+        {0x1FF3, 0x0313, 0x0300, 0},
+        {0x1F60, 0x0300, 0x0345, 0},
+        {0x1F62, 0x0345, 0},
+        {0x1FA0, 0x0300, 0},
+    };
+    UChar tailorData2[][20]={
+        {0x1E63, 0x030C, 0},  /* s with dot below + caron */
+        {0x0073, 0x0323, 0x030C, 0},
+        {0x0073, 0x030C, 0x0323, 0},
+    };
+    UChar tailorData3[][20]={
+        {0x007a, 0},  /*  z */
+        {0x0061, 0x0065, 0},  /*  a + e */
+        {0x0061, 0x00ea, 0}, /* a + e with circumflex */
+        {0x0061, 0x1EC7, 0},  /* a+ e with dot below and circumflex */
+        {0x0061, 0x1EB9, 0x0302, 0}, /* a + e with dot below + combining circumflex */
+        {0x0061, 0x00EA, 0x0323, 0},  /* a + e with circumflex + combining dot below */
+        {0x00EA, 0x0323, 0},  /* e with circumflex + combining dot below */
+        {0x00EA, 0},  /* e with circumflex  */
+    };
 
+    /* Test Vietnamese sort. */
+    coll = ucol_open("vi", &status);
+    log_verbose("\n\nVI collation:");
+    if ( !ucol_equal(coll, tData[0], u_strlen(tData[0]), tData[2], u_strlen(tData[2])) ) {
+        log_err("\\u1EAC not equals to \\u1EA0+\\u0302\n");
+    }
+    if ( !ucol_equal(coll, tData[0], u_strlen(tData[0]), tData[3], u_strlen(tData[3])) ) {
+        log_err("\\u1EAC not equals to \\u00c2+\\u0323\n");
+    }
+    if ( !ucol_equal(coll, tData[5], u_strlen(tData[5]), tData[4], u_strlen(tData[4])) ) {
+        log_err("\\u1ED8 not equals to \\u1ECC+\\u0302\n");
+    }
+    if ( !ucol_equal(coll, tData[7], u_strlen(tData[7]), tData[6], u_strlen(tData[6])) ) {
+        log_err("\\u1EB7 not equals to \\u1EA1+\\u0306\n");
+    }
+
+    for (j=0; j<8; j++) {
+        tLen = u_strlen(tData[j]);
+        log_verbose("\n Data :%s  \tlen: %d key: ", tData[j], tLen);
+        rLen = ucol_getSortKey(coll, tData[j], tLen, resColl, 100);
+        for(i = 0; i<rLen; i++) {
+            log_verbose(" %02X", resColl[i]);
+        }
+    }
+
+    ucol_close(coll);
+
+    /* Test Russian sort. */
+    coll = ucol_open("ro", &status);
+    log_verbose("\n\nRO collation:");
+    if ( !ucol_equal(coll, tData[0], u_strlen(tData[0]), tData[1], u_strlen(tData[1])) ) {
+        log_err("\\u1EAC not equals to \\u1EA0+\\u0302\n");
+    }
+    if ( !ucol_equal(coll, tData[4], u_strlen(tData[4]), tData[5], u_strlen(tData[5])) ) {
+        log_err("\\u1EAC not equals to \\u00c2+\\u0323\n");
+    }
+    if ( !ucol_equal(coll, tData[6], u_strlen(tData[6]), tData[7], u_strlen(tData[7])) ) {
+        log_err("\\u1EB7 not equals to \\u1EA1+\\u0306\n");
+    }
+
+    for (j=4; j<8; j++) {
+        tLen = u_strlen(tData[j]);
+        log_verbose("\n Data :%s  \tlen: %d key: ", tData[j], tLen);
+        rLen = ucol_getSortKey(coll, tData[j], tLen, resColl, 100);
+        for(i = 0; i<rLen; i++) {
+            log_verbose(" %02X", resColl[i]);
+        }
+    }
+    ucol_close(coll);
+
+    /* Test the precomposed Greek character with 3 combining marks. */
+    log_verbose("\n\nTailoring test: Greek character with 3 combining marks");
+    ruleLen = u_strlen(rule);
+    coll = ucol_openRules(rule, ruleLen, UCOL_OFF, UCOL_TERTIARY, NULL,&status);
+    sLen = u_strlen(tailorData[0]);
+    for (j=1; j<6; j++) {
+        tLen = u_strlen(tailorData[j]);
+        if ( !ucol_equal(coll, tailorData[0], sLen, tailorData[j], tLen))  {
+            log_err("\n \\u1FA2 not equals to data[%d]:%s\n", j, tailorData[j]);
+        }
+    }
+    /* Test getSortKey. */
+    tLen = u_strlen(tailorData[0]);
+    kLen=ucol_getSortKey(coll, tailorData[0], tLen, expColl, 100);
+    for (j=0; j<6; j++) {
+        tLen = u_strlen(tailorData[j]);
+        rLen = ucol_getSortKey(coll, tailorData[j], tLen, resColl, 100);
+        if ( kLen!=rLen || uprv_memcmp(expColl, resColl, rLen*sizeof(uint8_t))!=0 ) {
+            log_err("\n Data[%d] :%s  \tlen: %d key: ", j, tailorData[j], tLen);
+            for(i = 0; i<rLen; i++) {
+                log_err(" %02X", resColl[i]);
+            }
+        }
+    }
+    ucol_close(coll);
+
+    log_verbose("\n\nTailoring test for s with caron:");
+    ruleLen = u_strlen(rule2);
+    coll = ucol_openRules(rule2, ruleLen, UCOL_OFF, UCOL_TERTIARY, NULL,&status);
+    tLen = u_strlen(tailorData2[0]);
+    kLen=ucol_getSortKey(coll, tailorData2[0], tLen, expColl, 100);
+    for (j=1; j<3; j++) {
+        tLen = u_strlen(tailorData2[j]);
+        rLen = ucol_getSortKey(coll, tailorData2[j], tLen, resColl, 100);
+        if ( kLen!=rLen || uprv_memcmp(expColl, resColl, rLen*sizeof(uint8_t))!=0 ) {
+            log_err("\n After tailoring Data[%d] :%s  \tlen: %d key: ", j, tailorData[j], tLen);
+            for(i = 0; i<rLen; i++) {
+                log_err(" %02X", resColl[i]);
+            }
+        }
+    }
+    ucol_close(coll);
+
+    log_verbose("\n\nTailoring test for &z< ae with circumflex:");
+     ruleLen = u_strlen(rule3);
+     coll = ucol_openRules(rule3, ruleLen, UCOL_OFF, UCOL_TERTIARY, NULL,&status);
+     tLen = u_strlen(tailorData3[3]);
+     kLen=ucol_getSortKey(coll, tailorData3[3], tLen, expColl, 100);
+     for (j=4; j<6; j++) {
+         tLen = u_strlen(tailorData3[j]);
+         rLen = ucol_getSortKey(coll, tailorData3[j], tLen, resColl, 100);
+
+         if ( kLen!=rLen || uprv_memcmp(expColl, resColl, rLen*sizeof(uint8_t))!=0 ) {
+             log_err("\n After tailoring Data[%d] :%s  \tlen: %d key: ", j, tailorData[j], tLen);
+             for(i = 0; i<rLen; i++) {
+                 log_err(" %02X", resColl[i]);
+             }
+         }
+
+         log_verbose("\n Test Data[%d] :%s  \tlen: %d key: ", j, tailorData[j], tLen);
+          for(i = 0; i<rLen; i++) {
+              log_verbose(" %02X", resColl[i]);
+          }
+     }
+     ucol_close(coll);
+}
+
+#define TSKC_DATA_SIZE 5
+#define TSKC_BUF_SIZE  50
+static void
+TestSortKeyConsistency(void)
+{
+    UErrorCode icuRC = U_ZERO_ERROR;
+    UCollator* ucol;
+    UChar data[] = { 0xFFFD, 0x0006, 0x0006, 0x0006, 0xFFFD};
+
+    uint8_t bufFull[TSKC_DATA_SIZE][TSKC_BUF_SIZE];
+    uint8_t bufPart[TSKC_DATA_SIZE][TSKC_BUF_SIZE];
+	int32_t i, j, i2;
+
+    ucol = ucol_openFromShortString("LEN_S4", FALSE, NULL, &icuRC);
+    if (U_FAILURE(icuRC))
+	{
+	    log_err("ucol_openFromShortString failed\n");
+        return;
+	}
+
+    for (i = 0; i < TSKC_DATA_SIZE; i++)
+    {
+        UCharIterator uiter;
+        uint32_t state[2] = { 0, 0 };
+        int32_t dataLen = i+1;
+	    for (j=0; j<TSKC_BUF_SIZE; j++)
+	        bufFull[i][j] = bufPart[i][j] = 0;
+
+        /* Full sort key */
+        ucol_getSortKey(ucol, data, dataLen, bufFull[i], TSKC_BUF_SIZE);
+
+        /* Partial sort key */
+        uiter_setString(&uiter, data, dataLen);
+        ucol_nextSortKeyPart(ucol, &uiter, state, bufPart[i], TSKC_BUF_SIZE, &icuRC);
+        if (U_FAILURE(icuRC))
+		{
+		    log_err("ucol_nextSortKeyPart failed\n");
+			ucol_close(ucol);
+			return;
+		}
+
+	    for (i2=0; i2<i; i2++)
+	    {
+	        UBool fullMatch = TRUE;
+		    UBool partMatch = TRUE;
+		    for (j=0; j<TSKC_BUF_SIZE; j++)
+		    {
+			    fullMatch = fullMatch && (bufFull[i][j] != bufFull[i2][j]);
+			    partMatch = partMatch && (bufPart[i][j] != bufPart[i2][j]);
+		    }
+			if (fullMatch != partMatch) {
+		        log_err(fullMatch ? "full key was consistent, but partial key changed\n"
+					              : "partial key was consistent, but full key changed\n");
+				ucol_close(ucol);
+				return;
+			}
+	    }
+
+    }
+
+    /*=============================================*/
+   ucol_close(ucol);
+}
+
+
 #define TEST(x) addTest(root, &x, "tscoll/cmsccoll/" # x)
 
 void addMiscCollTest(TestNode** root)
@@ -4836,7 +5068,8 @@
     TEST(TestJ5223);
     TEST(TestJ5232);
     TEST(TestJ5367);
+    TEST(TestSortKeyConsistency);
+    TEST(TestVI5913);  /* VI, RO tailored rules */
 }
 
 #endif /* #if !UCONFIG_NO_COLLATION */
-

Modified: trunk/source/test/cintltst/udatatst.c
===================================================================
--- trunk/source/test/cintltst/udatatst.c	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/test/cintltst/udatatst.c	2008-03-24 11:52:37 UTC (rev 144)
@@ -199,10 +199,10 @@
     strcat(icuDataFilePath, dirSepString);
     strcat(icuDataFilePath, U_ICUDATA_NAME);
     strcat(icuDataFilePath, "_");
-    strcat(icuDataFilePath, "unorm.icu");
+    strcat(icuDataFilePath, "cnvalias.icu");
 
     /* lots_of_mallocs(); */
-/*    if (stat(icuDataFilePath, &stat_buf) == 0)*/
+    if (stat(icuDataFilePath, &stat_buf) == 0)
     {
         int i;
         log_verbose("%s exists, so..\n", icuDataFilePath);
@@ -222,11 +222,11 @@
             }
         }
     }
-/*    else
+    else
     {
          log_verbose("Skipping tests of udata_open() on %s.  File not present in this configuration.\n",
              icuDataFilePath);
-    }*/
+    }
 
     free(icuDataFilePath);
     icuDataFilePath = NULL;

Modified: trunk/source/test/cintltst/usrchdat.c
===================================================================
--- trunk/source/test/cintltst/usrchdat.c	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/test/cintltst/usrchdat.c	2008-03-24 11:52:37 UTC (rev 144)
@@ -1,5 +1,5 @@
 /********************************************************************
- * Copyright (c) 2001-2006 International Business Machines 
+ * Copyright (c) 2001-2007 International Business Machines 
  * Corporation and others. All Rights Reserved.
  ********************************************************************
  * File USRCHDAT.H
@@ -256,8 +256,8 @@
 static const char *IGNORABLERULE = "&a = \\u0300";
 
 static const SearchData IGNORABLE[] = {
-    {"\\u0315\\u0300 \\u0315\\u0300\\u0315 ", "\\u0300", NULL, UCOL_PRIMARY, NULL, 
-    {0, 3, -1}, {2, 3}},
+    {"\\u0300\\u0315 \\u0300\\u0315 ", "\\u0300", NULL, UCOL_PRIMARY, NULL, 
+    {0, 3, -1}, {2, 2}},
     {NULL, NULL, NULL, UCOL_TERTIARY, NULL, {-1}, {0}}
 };
 
@@ -485,6 +485,14 @@
     {NULL, NULL, NULL, UCOL_TERTIARY, NULL, {-1}, {0}}
 };
 
+static const SearchData DIACTRICMATCH[] = {
+		{"\\u03BA\\u03B1\\u03B9\\u0300\\u0020\\u03BA\\u03B1\\u1F76", "\\u03BA\\u03B1\\u03B9", NULL, UCOL_PRIMARY, NULL, {0, 5,-1}, {4, 3}},
+		{"\\u0061\\u0061\\u00E1", "\\u0061\\u00E1", NULL, UCOL_SECONDARY, NULL, {1, -1}, {2}},
+		{"\\u0020\\u00C2\\u0303\\u0020\\u0041\\u0061\\u1EAA\\u0041\\u0302\\u0303\\u00C2\\u0303\\u1EAB\\u0061\\u0302\\u0303\\u00E2\\u0303\\uD806\\uDC01\\u0300\\u0020",
+		 "\\u00C2\\u0303", "LDE_AN_CX_EX_FX_HX_NX_S1", UCOL_PRIMARY, NULL, {1, 4, 5, 6, 7, 10, 12, 13, 16,-1}, {2, 1, 1, 1, 3, 2, 1, 3, 2}},
+		{NULL, NULL, NULL, UCOL_TERTIARY, NULL, {-1}, {0}}
+};
+
 #endif /* #if !UCONFIG_NO_COLLATION */
 
 #endif

Modified: trunk/source/test/cintltst/usrchtst.c
===================================================================
--- trunk/source/test/cintltst/usrchtst.c	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/test/cintltst/usrchtst.c	2008-03-24 11:52:37 UTC (rev 144)
@@ -1537,6 +1537,58 @@
     ucol_close(collator);
 }
 
+static void TestDiactricMatch(void) 
+{
+    UChar          pattern[128];
+    UChar          text[128];
+    UErrorCode     status = U_ZERO_ERROR;
+    UStringSearch *strsrch = NULL;
+    UCollator *coll = NULL;
+    uint32_t       count = 0;
+    SearchData search;
+
+    memset(pattern, 0, 128*sizeof(UChar));
+    memset(text, 0, 128*sizeof(UChar));
+    
+    strsrch = usearch_open(pattern, 1, text, 1, uloc_getDefault(), NULL, &status);
+	if (U_FAILURE(status)) {
+        log_err("Error opening string search %s\n", u_errorName(status));
+        return;
+    }
+       
+    search = DIACTRICMATCH[count];
+    while (search.text != NULL) {
+    	if (search.collator != NULL) {
+    		coll = ucol_openFromShortString(search.collator, FALSE, NULL, &status);
+    	} else {
+    		coll = ucol_open(uloc_getDefault(), &status);
+    		ucol_setStrength(coll, search.strength);
+    	}
+    	if (U_FAILURE(status)) {
+	        log_err("Error opening string search collator %s\n", u_errorName(status));
+	        return;
+	    }
+    	
+    	usearch_setCollator(strsrch, coll, &status);
+    	if (U_FAILURE(status)) {
+	        log_err("Error setting string search collator %s\n", u_errorName(status));
+	        return;
+	    }
+    
+        u_unescape(search.text, text, 128);
+        u_unescape(search.pattern, pattern, 128);
+        usearch_setText(strsrch, text, -1, &status);
+        usearch_setPattern(strsrch, pattern, -1, &status);
+        if (!assertEqualWithUStringSearch(strsrch, search)) {
+            log_err("Error at test number %d\n", count);
+        }
+        ucol_close(coll);
+        
+        search = DIACTRICMATCH[++count];
+    }
+    usearch_close(strsrch);
+}
+
 static void TestCanonical(void)
 {
     int count = 0;
@@ -2191,6 +2243,7 @@
                                  "tscoll/usrchtst/TestContractionCanonical");
     addTest(root, &TestEnd, "tscoll/usrchtst/TestEnd");
     addTest(root, &TestNumeric, "tscoll/usrchtst/TestNumeric");
+    addTest(root, &TestDiactricMatch, "tscoll/usrchtst/TestDiactricMatch");
 }
 
 #endif /* #if !UCONFIG_NO_COLLATION */

Modified: trunk/source/test/intltest/Makefile.in
===================================================================
--- trunk/source/test/intltest/Makefile.in	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/test/intltest/Makefile.in	2008-03-24 11:52:37 UTC (rev 144)
@@ -56,7 +56,7 @@
 itrbnf.o itrbnfrt.o itrbnfp.o ucaconf.o icusvtst.o \
 uobjtest.o idnaref.o idnaconf.o nptrans.o punyref.o testidn.o testidna.o incaltst.o \
 calcasts.o v32test.o uvectest.o textfile.o tokiter.o utxttest.o \
-windttst.o winnmtst.o winutil.o csdetest.o tzrulets.o
+windttst.o winnmtst.o winutil.o csdetest.o tzrulets.o tzoffloc.o tzfmttst.o
 
 
 DEPS = $(OBJECTS:.o=.d)

Modified: trunk/source/test/intltest/dtfmtrtts.cpp
===================================================================
--- trunk/source/test/intltest/dtfmtrtts.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/test/intltest/dtfmtrtts.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -293,7 +293,8 @@
     // patterns we have, but it may be a problem later.
 
     UBool hasEra = (pat.indexOf(UnicodeString("G")) != -1);
-    UBool hasZone = (pat.indexOf(UnicodeString("Z")) != -1) || (pat.indexOf(UnicodeString("z")) != -1) || (pat.indexOf(UnicodeString("v")) != -1);
+    UBool hasZoneDisplayName = (pat.indexOf(UnicodeString("z")) != -1) || (pat.indexOf(UnicodeString("v")) != -1) 
+        || (pat.indexOf(UnicodeString("V")) != -1);
 
     // Because patterns contain incomplete data representing the Date,
     // we must be careful of how we do the roundtrip.  We start with
@@ -375,7 +376,8 @@
             int maxSmatch = 1;
             if (dmatch > maxDmatch) {
                 // Time-only pattern with zone information and a starting date in PST.
-                if(timeOnly && hasZone && fmt->getTimeZone().inDaylightTime(d[0], status) && ! failure(status, "TimeZone::inDST()")) {
+                if(timeOnly && hasZoneDisplayName
+                        && fmt->getTimeZone().inDaylightTime(d[0], status) && ! failure(status, "TimeZone::inDST()")) {
                     maxDmatch = 3;
                     maxSmatch = 2;
                 }
@@ -402,16 +404,20 @@
                         && getField(d[0], UCAL_YEAR)
                             != getField(d[dmatch], UCAL_YEAR)
                         && !failure(status, "error status [smatch>maxSmatch]")
-                        && ((hasZone
+                        && ((hasZoneDisplayName
                          && (fmt->getTimeZone().inDaylightTime(d[0], status)
                                 == fmt->getTimeZone().inDaylightTime(d[dmatch], status)
                             || getField(d[0], UCAL_MONTH) == UCAL_APRIL
                             || getField(d[0], UCAL_MONTH) == UCAL_OCTOBER))
-                         || !hasZone)
+                         || !hasZoneDisplayName)
                          )
                 {
                     maxSmatch = 2;
-                }                
+                }
+                // If zone display name is used, fallback format might be used before 1970
+                else if (hasZoneDisplayName && d[0] < 0) {
+                    maxSmatch = 2;
+                }
             }
 
             if(dmatch > maxDmatch || smatch > maxSmatch) { // Special case for Japanese and Islamic (could have large negative years)

Modified: trunk/source/test/intltest/dtfmttst.cpp
===================================================================
--- trunk/source/test/intltest/dtfmttst.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/test/intltest/dtfmttst.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -69,21 +69,20 @@
         TESTCASE(23,TestGreekMay);
         TESTCASE(24,TestGenericTime);
         TESTCASE(25,TestGenericTimeZoneOrder);
-        TESTCASE(26,TestTimeZoneStringsAPI);
-        TESTCASE(27,TestHost);
-        TESTCASE(28,TestEras);
-        TESTCASE(29,TestNarrowNames);
-        TESTCASE(30,TestStandAloneDays);
-        TESTCASE(31,TestStandAloneMonths);
-        TESTCASE(32,TestQuarters);
-        TESTCASE(33,TestZTimeZoneParsing);
-        TESTCASE(34,TestRelative);
-        TESTCASE(35,TestRelativeClone);
-        TESTCASE(36,TestHostClone);
-        TESTCASE(37,TestTimeZoneDisplayName);
+        TESTCASE(26,TestHost);
+        TESTCASE(27,TestEras);
+        TESTCASE(28,TestNarrowNames);
+        TESTCASE(29,TestStandAloneDays);
+        TESTCASE(30,TestStandAloneMonths);
+        TESTCASE(31,TestQuarters);
+        TESTCASE(32,TestZTimeZoneParsing);
+        TESTCASE(33,TestRelative);
+        TESTCASE(34,TestRelativeClone);
+        TESTCASE(35,TestHostClone);
+        TESTCASE(36,TestTimeZoneDisplayName);
         /*
-        TESTCASE(38,TestRelativeError);
-        TESTCASE(39,TestRelativeOther);
+        TESTCASE(37,TestRelativeError);
+        TESTCASE(38,TestRelativeOther);
         */
         default: name = ""; break;
     }
@@ -100,7 +99,7 @@
     /*
      * Computational variables.
      */
-    int32_t offset, hours, minutes;
+    int32_t offset, hours, minutes, seconds;
     /*
      * Instantiate a SimpleDateFormat set up to produce a full time
      zone name.
@@ -141,8 +140,12 @@
         }
         hours = offset/3600000;
         minutes = (offset%3600000)/60000;
+        seconds = (offset%60000)/1000;
         UnicodeString dstOffset = (UnicodeString)"" + sign + (hours < 10 ? "0" : "") +
             (int32_t)hours + ":" + (minutes < 10 ? "0" : "") + (int32_t)minutes;
+        if (seconds != 0) {
+            dstOffset = dstOffset + ":" + (seconds < 10 ? "0" : "") + seconds;
+        }
         /*
          * Instantiate a date so we can display the time zone name.
          */
@@ -382,7 +385,7 @@
         "Wed", "225", "2", "33", "3", "PM", "2", "2", "PDT", "1997", "4", "1997", "2450674", "52452513", "-0700", "PT",  "4", "8", "3", "3","PDT",
 
         "Anno Domini", "1997", "August", "0013", "0014", "0014", "0034", "0012", "5130",
-        "Wednesday", "0225", "0002", "0033", "0003", "PM", "0002", "0002", "Pacific Daylight Time", "1997", "0004", "1997", "2450674", "52452513", "-0700",
+        "Wednesday", "0225", "0002", "0033", "0003", "PM", "0002", "0002", "Pacific Daylight Time", "1997", "0004", "1997", "2450674", "52452513", "GMT-07:00",
         "Pacific Time",  "Wednesday", "August", "3rd quarter", "3rd quarter", "United States (Los Angeles)"
     };
 
@@ -1752,7 +1755,7 @@
         "y/M/d H:mm zzzz", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 Pacific Standard Time",
         "y/M/d H:mm zzz", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 PST",
         "y/M/d H:mm vvvv", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 Pacific Time",
-        "y/M/d H:mm vvv", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 PT",
+        "y/M/d H:mm v", "F", "2004 01 01 01:00 PST", "2004/1/1 1:00 PT",
         // non-generic timezone string influences dst offset even if wrong for date/time
         "y/M/d H:mm zzz", "pf", "2004/1/1 1:00 PDT", "2004 01 01 01:00 PDT", "2004/1/1 0:00 PST",
         "y/M/d H:mm vvvv", "pf", "2004/1/1 1:00 PDT", "2004 01 01 01:00 PDT", "2004/1/1 0:00 Pacific Time",
@@ -1765,21 +1768,25 @@
         "y/M/d H:mm vvvv", "pf", "2004/7/1 1:00 PT", "2004 07 01 01:00 PDT", "2004/7/1 1:00 Pacific Time",
         // daylight savings time transition edge cases.
         // time to parse does not really exist, PT interpreted as earlier time
-        "y/M/d H:mm zzz", "pf", "2005/4/3 2:30 PT", "2005 04 03 01:30 PST", "2005/4/3 1:30 PST", // adjust earlier
+        "y/M/d H:mm zzz", "pf", "2005/4/3 2:30 PT", "2005 04 03 03:30 PDT", "2005/4/3 3:30 PDT",
         "y/M/d H:mm zzz", "pf", "2005/4/3 2:30 PST", "2005 04 03 03:30 PDT", "2005/4/3 3:30 PDT",
         "y/M/d H:mm zzz", "pf", "2005/4/3 2:30 PDT", "2005 04 03 01:30 PST", "2005/4/3 1:30 PST",
-        "y/M/d H:mm vvv", "pf", "2005/4/3 2:30 PT", "2005 04 03 01:30 PST", "2005/4/3 1:30 PT", // adjust earlier
-        "y/M/d H:mm vvv", "pf", "2005/4/3 2:30 PST", "2005 04 03 03:30 PDT", "2005/4/3 3:30 PT",
-        "y/M/d H:mm vvv", "pf", "2005/4/3 2:30 PDT", "2005 04 03 01:30 PST", "2005/4/3 1:30 PT",
-        "y/M/d H:mm", "pf", "2005/4/3 2:30", "2005 04 03 01:30 PST", "2005/4/3 1:30",
-        // time to parse is ambiguous, PT interpreted as LATER time (?)
-        "y/M/d H:mm zzz", "pf", "2004/10/31 1:30 PT", "2004 10 31 01:30 PST", "2004/10/31 1:30 PST", // 1:30a PT -> 1:30a PST (later)
+        "y/M/d H:mm v", "pf", "2005/4/3 2:30 PT", "2005 04 03 03:30 PDT", "2005/4/3 3:30 PT",
+        "y/M/d H:mm v", "pf", "2005/4/3 2:30 PST", "2005 04 03 03:30 PDT", "2005/4/3 3:30 PT",
+        "y/M/d H:mm v", "pf", "2005/4/3 2:30 PDT", "2005 04 03 01:30 PST", "2005/4/3 1:30 PT",
+        "y/M/d H:mm", "pf", "2005/4/3 2:30", "2005 04 03 03:30 PDT", "2005/4/3 3:30",
+        // time to parse is ambiguous, PT interpreted as later time
+        "y/M/d H:mm zzz", "pf", "2005/10/30 1:30 PT", "2005 10 30 01:30 PST", "2005/10/30 1:30 PST",
+        "y/M/d H:mm v", "pf", "2005/10/30 1:30 PT", "2005 10 30  01:30 PST", "2005/10/30 1:30 PT",
+        "y/M/d H:mm", "pf", "2005/10/30 1:30 PT", "2005 10 30 01:30 PST", "2005/10/30 1:30",
+
+        "y/M/d H:mm zzz", "pf", "2004/10/31 1:30 PT", "2004 10 31 01:30 PST", "2004/10/31 1:30 PST",
         "y/M/d H:mm zzz", "pf", "2004/10/31 1:30 PST", "2004 10 31 01:30 PST", "2004/10/31 1:30 PST",
         "y/M/d H:mm zzz", "pf", "2004/10/31 1:30 PDT", "2004 10 31 01:30 PDT", "2004/10/31 1:30 PDT",
-        "y/M/d H:mm vvv", "pf", "2004/10/31 1:30 PT", "2004 10 31 01:30 PST", "2004/10/31 1:30 PT", // 1:30a PT -> 1:30a PST (later)
-        "y/M/d H:mm vvv", "pf", "2004/10/31 1:30 PST", "2004 10 31 01:30 PST", "2004/10/31 1:30 PT",
-        "y/M/d H:mm vvv", "pf", "2004/10/31 1:30 PDT", "2004 10 31 01:30 PDT", "2004/10/31 1:30 PT",
-        "y/M/d H:mm", "pf", "2004/10/31 1:30", "2004 10 31 01:30 PST", "2004/10/31 1:30", // 1:30a PT -> 1:30a PST (later)
+        "y/M/d H:mm v", "pf", "2004/10/31 1:30 PT", "2004 10 31 01:30 PST", "2004/10/31 1:30 PT",
+        "y/M/d H:mm v", "pf", "2004/10/31 1:30 PST", "2004 10 31 01:30 PST", "2004/10/31 1:30 PT",
+        "y/M/d H:mm v", "pf", "2004/10/31 1:30 PDT", "2004 10 31 01:30 PDT", "2004/10/31 1:30 PT",
+        "y/M/d H:mm", "pf", "2004/10/31 1:30", "2004 10 31 01:30 PST", "2004/10/31 1:30",
   };
   const int32_t ZDATA_length = sizeof(ZDATA)/ sizeof(ZDATA[0]);
   expect(ZDATA, ZDATA_length, en);
@@ -1864,66 +1871,6 @@
   expect(XDATA, XDATA_length, en);
 }
 
-void DateFormatTest::TestTimeZoneStringsAPI() {
-    // Verify data
-    UErrorCode status  = U_ZERO_ERROR;
-    DateFormatSymbols symbols(Locale::getUS(), status);
-    StringEnumeration* keys = symbols.createZoneStringIDs(status);
-    if(U_FAILURE(status)){
-        errln("Could not create the StringEnumeration for Locale::getUS(). Error: %s", u_errorName(status)); 
-        return;
-    }
-    
-    StringEnumeration* keys2 = symbols.createZoneStringIDs(status);
-    ASSERT_OK(status);
-     if(*keys2!=*keys){
-        errln("operator!= failed for TimeZoneStringsEnum");
-    }
-    const UnicodeString* key = NULL;
-
-    while( (key = keys->snext(status))!=NULL){ 
-        logln(prettify(*key)); 
-    }
-    if(U_FAILURE(status)){
-        errln("Could not iterate over the StringEnumeration. Error: %s", u_errorName(status)); 
-        return;
-    }
-    UnicodeString expectedKey("meta/Hawaii");
-    UnicodeString expectedStrs[DateFormatSymbols::TIMEZONE_COUNT];
-    expectedStrs[DateFormatSymbols::TIMEZONE_SHORT_GENERIC].setTo("HT");
-    expectedStrs[DateFormatSymbols::TIMEZONE_SHORT_STANDARD].setTo("HST");
-    expectedStrs[DateFormatSymbols::TIMEZONE_SHORT_DAYLIGHT].setTo("HDT");
-    expectedStrs[DateFormatSymbols::TIMEZONE_LONG_GENERIC].setTo("Hawaii Time");
-    expectedStrs[DateFormatSymbols::TIMEZONE_LONG_STANDARD].setTo("Hawaii Standard Time");
-    expectedStrs[DateFormatSymbols::TIMEZONE_LONG_DAYLIGHT].setTo("Hawaii Daylight Time");
-    expectedStrs[DateFormatSymbols::TIMEZONE_EXEMPLAR_CITY].setTo("");
-    for(int32_t i=0; i<DateFormatSymbols::TIMEZONE_COUNT; i++){
-        UnicodeString result;
-        result = symbols.getZoneString(expectedKey, (DateFormatSymbols::TimeZoneTranslationType)i, result,status);
-        if(U_FAILURE(status)){
-            errln("Could not retrieve display name. Error: %s", u_errorName(status)); 
-            return;
-        }
-        if(expectedStrs[i] != result){
-            errln("Did not get the expected string. Expected: "+expectedStrs[i]+ UnicodeString(" Got: ") + result ); 
-        }
-    }
-    expectedKey.setTo("America/Los_Angeles",0);
-    UnicodeString exemplarCity("Phoenix");
-    UnicodeString result;
-    symbols.setZoneString(expectedKey,DateFormatSymbols::TIMEZONE_EXEMPLAR_CITY, exemplarCity, status);
-    if(U_FAILURE(status)){
-        errln("setZoneString() did not succeed. Error: %s", u_errorName(status)); 
-        return;
-    }    
-    result = symbols.getZoneString(expectedKey, DateFormatSymbols::TIMEZONE_EXEMPLAR_CITY, result,status);
-    if(result != exemplarCity){ 
-        errln("setZoneString() did not succeed. Expected: " + exemplarCity + " Got: " + result); 
-    }
-    delete keys;
-    delete keys2;
-}
-
 void DateFormatTest::TestZTimeZoneParsing(void) {
     UErrorCode status = U_ZERO_ERROR;
     const Locale en("en");

Modified: trunk/source/test/intltest/intltest.vcproj
===================================================================
--- trunk/source/test/intltest/intltest.vcproj	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/test/intltest/intltest.vcproj	2008-03-24 11:52:37 UTC (rev 144)
@@ -790,6 +790,22 @@
 				>
 			</File>
 			<File
+				RelativePath=".\tzfmttst.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\tzfmttst.h"
+				>
+			</File>
+			<File
+				RelativePath=".\tzoffloc.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\tzoffloc.h"
+				>
+			</File>
+			<File
 				RelativePath=".\tzregts.cpp"
 				>
 			</File>

Modified: trunk/source/test/intltest/itformat.cpp
===================================================================
--- trunk/source/test/intltest/itformat.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/test/intltest/itformat.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -46,6 +46,8 @@
 #include "dadrcal.h"        // DataDrivenCalendarTest
 #include "dadrfmt.h"        // DataDrivenFormatTest
 #include "dtptngts.h"       // IntlTestDateTimePatternGeneratorAPI
+#include "tzoffloc.h"       // TimeZoneOffsetLocalTest
+#include "tzfmttst.h"       // TimeZoneFormatTest
 
 
 #define TESTCLASS(id, TestClass)          \
@@ -110,6 +112,8 @@
         TESTCLASS(30,DataDrivenCalendarTest);
         TESTCLASS(31,DataDrivenFormatTest);
         TESTCLASS(32,IntlTestDateTimePatternGeneratorAPI);
+        TESTCLASS(33,TimeZoneOffsetLocalTest);
+        TESTCLASS(34,TimeZoneFormatTest);
 
 
         default: name = ""; break; //needed to end loop

Modified: trunk/source/test/intltest/itrbnf.cpp
===================================================================
--- trunk/source/test/intltest/itrbnf.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/test/intltest/itrbnf.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -65,6 +65,7 @@
         TESTCASE(15, TestAllLocales);
         TESTCASE(16, TestHebrewFraction);
         TESTCASE(17, TestPortugueseSpellout);
+        TESTCASE(18, TestMultiplierSubstitution);
 #else
         TESTCASE(0, TestRBNFDisabled);
 #endif
@@ -1767,6 +1768,31 @@
 }
 
 void 
+IntlTestRBNF::TestMultiplierSubstitution(void) {
+  UnicodeString rules("=#,##0=;1,000,000: <##0.###< million;");
+  UErrorCode status = U_ZERO_ERROR;
+  UParseError parse_error;
+  RuleBasedNumberFormat *rbnf = 
+    new RuleBasedNumberFormat(rules, Locale::getUS(), parse_error, status);
+  if (U_SUCCESS(status)) {
+    UnicodeString res;
+    FieldPosition pos;
+    double n = 1234000.0;
+    rbnf->format(n, res, pos);
+    delete rbnf;
+
+    UnicodeString expected = UNICODE_STRING_SIMPLE("1.234 million");
+    if (expected != res) {
+      UnicodeString msg = "Expected: ";
+      msg.append(expected);
+      msg.append(" but got ");
+      msg.append(res);
+      errln(msg);
+    }
+  }
+}
+
+void 
 IntlTestRBNF::doTest(RuleBasedNumberFormat* formatter, const char* const testData[][2], UBool testParsing) 
 {
   // man, error reporting would be easier with printf-style syntax for unicode string and formattable

Modified: trunk/source/test/intltest/itrbnf.h
===================================================================
--- trunk/source/test/intltest/itrbnf.h	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/test/intltest/itrbnf.h	2008-03-24 11:52:37 UTC (rev 144)
@@ -1,6 +1,6 @@
 /*
  *******************************************************************************
- * Copyright (C) 1996-2006, International Business Machines Corporation and    *
+ * Copyright (C) 1996-2007, International Business Machines Corporation and    *
  * others. All Rights Reserved.                                                *
  *******************************************************************************
  */
@@ -122,6 +122,12 @@
    */
   virtual void TestHebrewFraction();
 
+  /**
+   * Regression test, don't truncate
+   * when doing multiplier substitution to a number format rule.
+   */
+  virtual void TestMultiplierSubstitution();
+
  protected:
   virtual void doTest(RuleBasedNumberFormat* formatter, const char* const testData[][2], UBool testParsing);
   virtual void doLenientParseTest(RuleBasedNumberFormat* formatter, const char* testData[][2]);

Modified: trunk/source/test/intltest/loctest.cpp
===================================================================
--- trunk/source/test/intltest/loctest.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/test/intltest/loctest.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -857,8 +857,8 @@
       ;
 
     /* TODO: Change this test to be more like the cloctst version? */
-    if (testCount != 488)
-        errln("Expected getISOLanguages() to return 488 languages; it returned %d", testCount);
+    if (testCount != 489)
+        errln("Expected getISOLanguages() to return 489 languages; it returned %d", testCount);
     else {
         for (i = 0; i < 15; i++) {
             int32_t j;
@@ -888,7 +888,7 @@
     for(testCount=0;test[testCount];testCount++)
       ;
 
-    if (testCount != 244){
+    if (testCount != 246){
         errln("Expected getISOCountries to return 240 countries; it returned %d", testCount);
     }else {
         for (i = 0; i < spot2Len; i++) {

Modified: trunk/source/test/intltest/miscdtfm.cpp
===================================================================
--- trunk/source/test/intltest/miscdtfm.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/test/intltest/miscdtfm.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -313,7 +313,7 @@
 
     UnicodeString jstShort = "JST";
     
-    UnicodeString tzID = "meta/Japan";
+    UnicodeString tzID = "Asia/Tokyo";
 
     UnicodeString jdtLong(jdtLongC, 5, 5);
  

Modified: trunk/source/test/intltest/srchtest.cpp
===================================================================
--- trunk/source/test/intltest/srchtest.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/test/intltest/srchtest.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -154,6 +154,7 @@
         CASE(33, TestUClassID)
         CASE(34, TestSubclass)
         CASE(35, TestCoverage)
+        CASE(36, TestDiactricMatch)
         default: name = ""; break;
     }
 }
@@ -1544,6 +1545,43 @@
     delete strsrch;
     delete collator;
 }
+
+void StringSearchTest::TestDiactricMatch()
+{
+	UChar temp[128];
+    UErrorCode status = U_ZERO_ERROR;
+    int        count  = 0;
+    RuleBasedCollator* coll = NULL;
+    StringSearch *strsrch = NULL;
+
+    UnicodeString pattern("pattern");
+    UnicodeString text("text");
+    
+    const SearchData *search; 
+    
+    search = &(DIACTRICMATCH[count]);
+    while (search->text != NULL) {
+   		coll = getCollator(search->collator);
+    	coll->setStrength(getECollationStrength(search->strength));
+    	strsrch = new StringSearch(pattern, text, coll, getBreakIterator(search->breaker), status);
+    	if (U_FAILURE(status)) {
+	        errln("Error opening string search %s", u_errorName(status));
+	        return;
+	    }  
+        u_unescape(search->text, temp, 128);
+        text.setTo(temp, u_strlen(temp));
+        u_unescape(search->pattern, temp, 128);
+        pattern.setTo(temp, u_strlen(temp));
+        strsrch->setText(text, status);
+        strsrch->setPattern(pattern, status);
+        if (!assertEqualWithStringSearch(strsrch, search)) {
+            errln("Error at test number %d", count);
+        }
+        search = &(DIACTRICMATCH[++count]);
+        delete strsrch;
+    }
+    
+}
  
 void StringSearchTest::TestCanonical()
 {

Modified: trunk/source/test/intltest/srchtest.h
===================================================================
--- trunk/source/test/intltest/srchtest.h	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/test/intltest/srchtest.h	2008-03-24 11:52:37 UTC (rev 144)
@@ -88,6 +88,7 @@
     void TestUClassID();
     void TestSubclass();
     void TestCoverage();
+    void TestDiactricMatch();
 };
 
 #endif /* #if !UCONFIG_NO_COLLATION */

Added: trunk/source/test/intltest/tzfmttst.cpp
===================================================================
--- trunk/source/test/intltest/tzfmttst.cpp	                        (rev 0)
+++ trunk/source/test/intltest/tzfmttst.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -0,0 +1,458 @@
+/*
+*******************************************************************************
+* Copyright (C) 2007, International Business Machines Corporation and         *
+* others. All Rights Reserved.                                                *
+*******************************************************************************
+*/
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_FORMATTING
+
+#include "tzfmttst.h"
+
+#include "unicode/timezone.h"
+#include "unicode/simpletz.h"
+#include "unicode/calendar.h"
+#include "unicode/strenum.h"
+#include "unicode/smpdtfmt.h"
+#include "unicode/uchar.h"
+#include "unicode/basictz.h"
+#include "cstring.h"
+#include "zonemeta.h"
+
+#define DEBUG_ALL 0
+
+static const char* PATTERNS[] = {"z", "zzzz", "Z", "ZZZZ", "v", "vvvv", "V", "VVVV"};
+static const int NUM_PATTERNS = sizeof(PATTERNS)/sizeof(const char*);
+
+void
+TimeZoneFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
+{
+    if (exec) {
+        logln("TestSuite TimeZoneFormatTest");
+    }
+    switch (index) {
+        TESTCASE(0, TestTimeZoneRoundTrip);
+        TESTCASE(1, TestTimeRoundTrip);
+        default: name = ""; break;
+    }
+}
+
+void
+TimeZoneFormatTest::TestTimeZoneRoundTrip(void) {
+    UErrorCode status = U_ZERO_ERROR;
+
+    SimpleTimeZone unknownZone(-31415, (UnicodeString)"Etc/Unknown");
+    int32_t badDstOffset = -1234;
+    int32_t badZoneOffset = -2345;
+
+    int32_t testDateData[][3] = {
+        {2007, 1, 15},
+        {2007, 6, 15},
+        {1990, 1, 15},
+        {1990, 6, 15},
+        {1960, 1, 15},
+        {1960, 6, 15},
+    };
+
+    Calendar *cal = Calendar::createInstance(TimeZone::createTimeZone((UnicodeString)"UTC"), status);
+    if (U_FAILURE(status)) {
+        errln("Calendar::createInstance failed");
+        return;
+    }
+
+    // Set up rule equivalency test range
+    UDate low, high;
+    cal->set(1900, UCAL_JANUARY, 1);
+    low = cal->getTime(status);
+    cal->set(2040, UCAL_JANUARY, 1);
+    high = cal->getTime(status);
+    if (U_FAILURE(status)) {
+        errln("getTime failed");
+        return;
+    }
+
+    // Set up test dates
+    UDate DATES[(sizeof(testDateData)/sizeof(int32_t))/3];
+    const int32_t nDates = (sizeof(testDateData)/sizeof(int32_t))/3;
+    cal->clear();
+    for (int32_t i = 0; i < nDates; i++) {
+        cal->set(testDateData[i][0], testDateData[i][1], testDateData[i][2]);
+        DATES[i] = cal->getTime(status);
+        if (U_FAILURE(status)) {
+            errln("getTime failed");
+            return;
+        }
+    }
+
+    // Set up test locales
+    const Locale locales1[] = {
+        Locale("en_US")
+    };
+    const Locale locales2[] = {
+        Locale("en_US"),
+        Locale("en"),
+        Locale("en_CA"),
+        Locale("fr"),
+        Locale("zh_Hant")
+    };
+
+    const Locale *LOCALES;
+    int32_t nLocales;
+    if (DEBUG_ALL) {
+        LOCALES = Locale::getAvailableLocales(nLocales);
+    } else if (quick) {
+        LOCALES = locales1;
+        nLocales = sizeof(locales1)/sizeof(Locale);
+    } else {
+        LOCALES = locales2;
+        nLocales = sizeof(locales2)/sizeof(Locale);
+    }
+
+    StringEnumeration *tzids = TimeZone::createEnumeration();
+    if (U_FAILURE(status)) {
+        errln("tzids->count failed");
+        return;
+    }
+
+    int32_t inRaw, inDst;
+    int32_t outRaw, outDst;
+
+    // Run the roundtrip test
+    for (int32_t locidx = 0; locidx < nLocales; locidx++) {
+        for (int32_t patidx = 0; patidx < NUM_PATTERNS; patidx++) {
+
+            //DEBUG static const char* PATTERNS[] = {"z", "zzzz", "Z", "ZZZZ", "v", "vvvv", "V", "VVVV"};
+            //if (patidx != 1) continue;
+
+            SimpleDateFormat *sdf = new SimpleDateFormat((UnicodeString)PATTERNS[patidx], LOCALES[locidx], status);
+            if (U_FAILURE(status)) {
+                errln((UnicodeString)"new SimpleDateFormat failed for pattern " +
+                    PATTERNS[patidx] + " for locale " + LOCALES[locidx].getName());
+                status = U_ZERO_ERROR;
+                continue;
+            }
+
+            tzids->reset(status);
+            const UnicodeString *tzid;
+            while ((tzid = tzids->snext(status))) {
+                TimeZone *tz = TimeZone::createTimeZone(*tzid);
+
+                for (int32_t datidx = 0; datidx < nDates; datidx++) {
+                    UnicodeString tzstr;
+                    FieldPosition fpos(0);
+                    // Format
+                    sdf->setTimeZone(*tz);
+                    sdf->format(DATES[datidx], tzstr, fpos);
+
+                    // Before parse, set unknown zone to SimpleDateFormat instance
+                    // just for making sure that it does not depends on the time zone
+                    // originally set.
+                    sdf->setTimeZone(unknownZone);
+
+                    // Parse
+                    ParsePosition pos(0);
+                    Calendar *outcal = Calendar::createInstance(unknownZone, status);
+                    if (U_FAILURE(status)) {
+                        errln("Failed to create an instance of calendar for receiving parse result.");
+                        status = U_ZERO_ERROR;
+                        continue;
+                    }
+                    outcal->set(UCAL_DST_OFFSET, badDstOffset);
+                    outcal->set(UCAL_ZONE_OFFSET, badZoneOffset);
+
+                    sdf->parse(tzstr, *outcal, pos);
+
+                    // Check the result
+                    const TimeZone &outtz = outcal->getTimeZone();
+                    UnicodeString outtzid;
+                    outtz.getID(outtzid);
+
+                    tz->getOffset(DATES[datidx], false, inRaw, inDst, status);
+                    if (U_FAILURE(status)) {
+                        errln((UnicodeString)"Failed to get offsets from time zone" + *tzid);
+                        status = U_ZERO_ERROR;
+                    }
+                    outtz.getOffset(DATES[datidx], false, outRaw, outDst, status);
+                    if (U_FAILURE(status)) {
+                        errln((UnicodeString)"Failed to get offsets from time zone" + outtzid);
+                        status = U_ZERO_ERROR;
+                    }
+
+                    // Check if localized GMT format or RFC format is used.
+                    int32_t numDigits = 0;
+                    for (int n = 0; n < tzstr.length(); n++) {
+                        if (u_isdigit(tzstr.charAt(n))) {
+                            numDigits++;
+                        }
+                    }
+                    if (numDigits >= 4) {
+                        // Localized GMT or RFC: total offset (raw + dst) must be preserved.
+                        int32_t inOffset = inRaw + inDst;
+                        int32_t outOffset = outRaw + outDst;
+                        if (inOffset != outOffset) {
+                            errln((UnicodeString)"Offset round trip failed; tz=" + *tzid
+                                + ", locale=" + LOCALES[locidx].getName() + ", pattern=" + PATTERNS[patidx]
+                                + ", time=" + DATES[datidx] + ", str=" + tzstr
+                                + ", inOffset=" + inOffset + ", outOffset=" + outOffset);
+                        }
+                    } else if (uprv_strcmp(PATTERNS[patidx], "z") == 0 || uprv_strcmp(PATTERNS[patidx], "zzzz") == 0
+                            || uprv_strcmp(PATTERNS[patidx], "v") == 0 || uprv_strcmp(PATTERNS[patidx], "vvvv") == 0
+                            || uprv_strcmp(PATTERNS[patidx], "V") == 0) {
+                        // Specific or generic: raw offset must be preserved.
+                        if (inRaw != outRaw) {
+                            errln((UnicodeString)"Raw offset round trip failed; tz=" + *tzid
+                                + ", locale=" + LOCALES[locidx].getName() + ", pattern=" + PATTERNS[patidx]
+                                + ", time=" + DATES[datidx] + ", str=" + tzstr
+                                + ", inRawOffset=" + inRaw + ", outRawOffset=" + outRaw);
+                        }
+                    } else { // "VVVV"
+                        // Location: time zone rule must be preserved.
+                        UnicodeString canonical;
+                        ZoneMeta::getCanonicalID(*tzid, canonical);
+                        if (outtzid != canonical) {
+                            // Canonical ID did not match - check the rules
+                            if (!((BasicTimeZone*)&outtz)->hasEquivalentTransitions((BasicTimeZone&)*tz, low, high, TRUE, status)) {
+                                errln("Canonical round trip failed; tz=" + *tzid
+                                    + ", locale=" + LOCALES[locidx].getName() + ", pattern=" + PATTERNS[patidx]
+                                    + ", time=" + DATES[datidx] + ", str=" + tzstr
+                                    + ", outtz=" + outtzid);
+                            }
+                            if (U_FAILURE(status)) {
+                                errln("hasEquivalentTransitions failed");
+                                status = U_ZERO_ERROR;
+                            }
+                        }
+                    }
+                    delete outcal;
+                }
+                delete tz;
+            }
+            delete sdf;
+        }
+    }
+    delete cal;
+    delete tzids;
+}
+
+void
+TimeZoneFormatTest::TestTimeRoundTrip(void) {
+    UErrorCode status = U_ZERO_ERROR;
+
+    Calendar *cal = Calendar::createInstance(TimeZone::createTimeZone((UnicodeString)"UTC"), status);
+    if (U_FAILURE(status)) {
+        errln("Calendar::createInstance failed");
+        return;
+    }
+
+    UDate START_TIME, END_TIME;
+
+    if (DEBUG_ALL) {
+        cal->set(1900, UCAL_JANUARY, 1);
+    } else {
+        cal->set(1965, UCAL_JANUARY, 1);
+    }
+    START_TIME = cal->getTime(status);
+
+    cal->set(2015, UCAL_JANUARY, 1);
+    END_TIME = cal->getTime(status);
+    if (U_FAILURE(status)) {
+        errln("getTime failed");
+        return;
+    }
+
+    // Whether each pattern is ambiguous at DST->STD local time overlap
+    UBool AMBIGUOUS_DST_DECESSION[] = {FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE};
+    // Whether each pattern is ambiguous at STD->STD/DST->DST local time overlap
+    UBool AMBIGUOUS_NEGATIVE_SHIFT[] = {TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE};
+
+    UnicodeString BASEPATTERN("yyyy-MM-dd'T'HH:mm:ss.SSS");
+
+    // timer for performance analysis
+    UDate timer;
+    UDate times[NUM_PATTERNS];
+    for (int32_t i = 0; i < NUM_PATTERNS; i++) {
+        times[i] = 0;
+    }
+
+    UBool REALLY_VERBOSE = FALSE;
+
+    // Set up test locales
+    const Locale locales1[] = {
+        Locale("en_US")
+    };
+    const Locale locales2[] = {
+        Locale("en_US"),
+        Locale("en"),
+        Locale("de_DE"),
+        Locale("es_ES"),
+        Locale("fr_FR"),
+        Locale("it_IT"),
+        Locale("ja_JP"),
+        Locale("ko_KR"),
+        Locale("pt_BR"),
+        Locale("zh_Hans_CN"),
+        Locale("zh_Hant_TW")
+    };
+
+    const Locale *LOCALES;
+    int32_t nLocales;
+    if (DEBUG_ALL) {
+        LOCALES = Locale::getAvailableLocales(nLocales);
+    } else if (quick) {
+        LOCALES = locales1;
+        nLocales = sizeof(locales1)/sizeof(Locale);
+    } else {
+        LOCALES = locales2;
+        nLocales = sizeof(locales2)/sizeof(Locale);
+    }
+
+    StringEnumeration *tzids = TimeZone::createEnumeration();
+    if (U_FAILURE(status)) {
+        errln("tzids->count failed");
+        return;
+    }
+
+    int32_t testCounts = 0;
+    UDate testTimes[4];
+    UBool expectedRoundTrip[4];
+    int32_t testLen = 0;
+
+    for (int32_t locidx = 0; locidx < nLocales; locidx++) {
+        logln((UnicodeString)"Locale: " + LOCALES[locidx].getName());
+
+        for (int32_t patidx = 0; patidx < NUM_PATTERNS; patidx++) {
+            logln((UnicodeString)"    pattern: " + PATTERNS[patidx]);
+
+            //DEBUG static const char* PATTERNS[] = {"z", "zzzz", "Z", "ZZZZ", "v", "vvvv", "V", "VVVV"};
+            //if (patidx != 1) continue;
+
+            UnicodeString pattern(BASEPATTERN);
+            pattern.append(" ").append(PATTERNS[patidx]);
+
+            SimpleDateFormat *sdf = new SimpleDateFormat(pattern, LOCALES[locidx], status);
+            if (U_FAILURE(status)) {
+                errln((UnicodeString)"new SimpleDateFormat failed for pattern " +
+                    pattern + " for locale " + LOCALES[locidx].getName());
+                status = U_ZERO_ERROR;
+                continue;
+            }
+
+            tzids->reset(status);
+            const UnicodeString *tzid;
+
+            timer = Calendar::getNow();
+
+            while ((tzid = tzids->snext(status))) {
+                UnicodeString canonical;
+                ZoneMeta::getCanonicalID(*tzid, canonical);
+                if (*tzid != canonical) {
+                    // Skip aliases
+                    continue;
+                }
+                BasicTimeZone *tz = (BasicTimeZone*)TimeZone::createTimeZone(*tzid);
+                sdf->setTimeZone(*tz);
+
+                UDate t = START_TIME;
+                TimeZoneTransition tzt;
+                UBool tztAvail = FALSE;
+                UBool middle = TRUE;
+
+                while (t < END_TIME) {
+                    if (!tztAvail) {
+                        testTimes[0] = t;
+                        expectedRoundTrip[0] = TRUE;
+                        testLen = 1;
+                    } else {
+                        int32_t fromOffset = tzt.getFrom()->getRawOffset() + tzt.getFrom()->getDSTSavings();
+                        int32_t toOffset = tzt.getTo()->getRawOffset() + tzt.getTo()->getDSTSavings();
+                        int32_t delta = toOffset - fromOffset;
+                        if (delta < 0) {
+                            UBool isDstDecession = tzt.getFrom()->getDSTSavings() > 0 && tzt.getTo()->getDSTSavings() == 0;
+                            testTimes[0] = t + delta - 1;
+                            expectedRoundTrip[0] = TRUE;
+                            testTimes[1] = t + delta;
+                            expectedRoundTrip[1] = isDstDecession ?
+                                    !AMBIGUOUS_DST_DECESSION[patidx] : !AMBIGUOUS_NEGATIVE_SHIFT[patidx];
+                            testTimes[2] = t - 1;
+                            expectedRoundTrip[2] = isDstDecession ?
+                                    !AMBIGUOUS_DST_DECESSION[patidx] : !AMBIGUOUS_NEGATIVE_SHIFT[patidx];
+                            testTimes[3] = t;
+                            expectedRoundTrip[3] = TRUE;
+                            testLen = 4;
+                        } else {
+                            testTimes[0] = t - 1;
+                            expectedRoundTrip[0] = TRUE;
+                            testTimes[1] = t;
+                            expectedRoundTrip[1] = TRUE;
+                            testLen = 2;
+                        }
+                    }
+                    for (int32_t testidx = 0; testidx < testLen; testidx++) {
+                        if (quick) {
+                            // reduce regular test time
+                            if (!expectedRoundTrip[testidx]) {
+                                continue;
+                            }
+                        }
+                        testCounts++;
+
+                        UnicodeString text;
+                        FieldPosition fpos(0);
+                        sdf->format(testTimes[testidx], text, fpos);
+
+                        UDate parsedDate = sdf->parse(text, status);
+                        if (U_FAILURE(status)) {
+                            errln((UnicodeString)"Failed to parse " + text);
+                            status = U_ZERO_ERROR;
+                            continue;
+                        }
+                        if (parsedDate != testTimes[testidx]) {
+                            UnicodeString msg = (UnicodeString)"Time round trip failed for "
+                                + "tzid=" + *tzid
+                                + ", locale=" + LOCALES[locidx].getName()
+                                + ", pattern=" + PATTERNS[patidx]
+                                + ", text=" + text
+                                + ", time=" + testTimes[testidx]
+                                + ", restime=" + parsedDate
+                                + ", diff=" + (parsedDate - testTimes[testidx]);
+                            if (expectedRoundTrip[testidx]) {
+                                errln((UnicodeString)"FAIL: " + msg);
+                            } else if (REALLY_VERBOSE) {
+                                logln(msg);
+                            }
+                        }
+                    }
+                    tztAvail = tz->getNextTransition(t, FALSE, tzt);
+                    if (!tztAvail) {
+                        break;
+                    }
+                    if (middle) {
+                        // Test the date in the middle of two transitions.
+                        t += (int64_t)((tzt.getTime() - t)/2);
+                        middle = FALSE;
+                        tztAvail = FALSE;
+                    } else {
+                        t = tzt.getTime();
+                    }
+                }
+                delete tz;
+            }
+            times[patidx] += (Calendar::getNow() - timer);
+            delete sdf;
+        }
+    }
+    UDate total = 0;
+    logln("### Elapsed time by patterns ###");
+    for (int32_t i = 0; i < NUM_PATTERNS; i++) {
+        logln(UnicodeString("") + times[i] + "ms (" + PATTERNS[i] + ")");
+        total += times[i];
+    }
+    logln((UnicodeString)"Total: " + total + "ms");
+    logln((UnicodeString)"Iteration: " + testCounts);
+
+    delete cal;
+    delete tzids;
+}
+
+#endif /* #if !UCONFIG_NO_FORMATTING */

Added: trunk/source/test/intltest/tzfmttst.h
===================================================================
--- trunk/source/test/intltest/tzfmttst.h	                        (rev 0)
+++ trunk/source/test/intltest/tzfmttst.h	2008-03-24 11:52:37 UTC (rev 144)
@@ -0,0 +1,27 @@
+/*
+*******************************************************************************
+* Copyright (C) 2007, International Business Machines Corporation and         *
+* others. All Rights Reserved.                                                *
+*******************************************************************************
+*/
+
+#ifndef _TIMEZONEFORMATTEST_
+#define _TIMEZONEFORMATTEST_
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_FORMATTING
+
+#include "intltest.h"
+
+class TimeZoneFormatTest : public IntlTest {
+    // IntlTest override
+    void runIndexedTest(int32_t index, UBool exec, const char*& name, char* par);
+
+    void TestTimeZoneRoundTrip(void);
+    void TestTimeRoundTrip(void);
+};
+
+#endif /* #if !UCONFIG_NO_FORMATTING */
+ 
+#endif // _TIMEZONEFORMATTEST_

Added: trunk/source/test/intltest/tzoffloc.cpp
===================================================================
--- trunk/source/test/intltest/tzoffloc.cpp	                        (rev 0)
+++ trunk/source/test/intltest/tzoffloc.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -0,0 +1,329 @@
+/*
+*******************************************************************************
+* Copyright (C) 2007, International Business Machines Corporation and         *
+* others. All Rights Reserved.                                                *
+*******************************************************************************
+*/
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_FORMATTING
+
+#include "tzoffloc.h"
+
+#include "unicode/ucal.h"
+#include "unicode/timezone.h"
+#include "unicode/calendar.h"
+#include "unicode/dtrule.h"
+#include "unicode/tzrule.h"
+#include "unicode/rbtz.h"
+#include "unicode/simpletz.h"
+#include "unicode/tzrule.h"
+#include "unicode/smpdtfmt.h"
+#include "unicode/gregocal.h"
+
+void
+TimeZoneOffsetLocalTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
+{
+    if (exec) {
+        logln("TestSuite TimeZoneOffsetLocalTest");
+    }
+    switch (index) {
+        TESTCASE(0, TestGetOffsetAroundTransition);
+        default: name = ""; break;
+    }
+}
+
+/*
+ * Testing getOffset APIs around rule transition by local standard/wall time.
+ */
+void
+TimeZoneOffsetLocalTest::TestGetOffsetAroundTransition() {
+    const int32_t NUM_DATES = 10;
+    const int32_t NUM_TIMEZONES = 3;
+
+    const int32_t HOUR = 60*60*1000;
+    const int32_t MINUTE = 60*1000;
+
+    const int32_t DATES[NUM_DATES][6] = {
+        {2006, UCAL_APRIL, 2, 1, 30, 1*HOUR+30*MINUTE},
+        {2006, UCAL_APRIL, 2, 2, 00, 2*HOUR},
+        {2006, UCAL_APRIL, 2, 2, 30, 2*HOUR+30*MINUTE},
+        {2006, UCAL_APRIL, 2, 3, 00, 3*HOUR},
+        {2006, UCAL_APRIL, 2, 3, 30, 3*HOUR+30*MINUTE},
+        {2006, UCAL_OCTOBER, 29, 0, 30, 0*HOUR+30*MINUTE},
+        {2006, UCAL_OCTOBER, 29, 1, 00, 1*HOUR},
+        {2006, UCAL_OCTOBER, 29, 1, 30, 1*HOUR+30*MINUTE},
+        {2006, UCAL_OCTOBER, 29, 2, 00, 2*HOUR},
+        {2006, UCAL_OCTOBER, 29, 2, 30, 2*HOUR+30*MINUTE},
+    };
+
+    // Expected offsets by int32_t getOffset(uint8_t era, int32_t year, int32_t month, int32_t day,
+    // uint8_t dayOfWeek, int32_t millis, UErrorCode& status)
+    const int32_t OFFSETS1[NUM_DATES] = {
+        // April 2, 2006
+        -8*HOUR,
+        -7*HOUR,
+        -7*HOUR,
+        -7*HOUR,
+        -7*HOUR,
+
+        // October 29, 2006
+        -7*HOUR,
+        -8*HOUR,
+        -8*HOUR,
+        -8*HOUR,
+        -8*HOUR,
+    };
+
+    // Expected offsets by void getOffset(UDate date, UBool local, int32_t& rawOffset,
+    // int32_t& dstOffset, UErrorCode& ec) with local=TRUE
+    // or void getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt,
+    // int32_t& rawOffset, int32_t& dstOffset, UErrorCode& status) with
+    // nonExistingTimeOpt=kStandard/duplicatedTimeOpt=kStandard
+    const int32_t OFFSETS2[NUM_DATES][2] = {
+        // April 2, 2006
+        {-8*HOUR, 0},
+        {-8*HOUR, 0},
+        {-8*HOUR, 0},
+        {-8*HOUR, 1*HOUR},
+        {-8*HOUR, 1*HOUR},
+
+        // Oct 29, 2006
+        {-8*HOUR, 1*HOUR},
+        {-8*HOUR, 0},
+        {-8*HOUR, 0},
+        {-8*HOUR, 0},
+        {-8*HOUR, 0},
+    };
+
+    // Expected offsets by void getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt,
+    // int32_t duplicatedTimeOpt, int32_t& rawOffset, int32_t& dstOffset, UErrorCode& status) with
+    // nonExistingTimeOpt=kDaylight/duplicatedTimeOpt=kDaylight
+    const int32_t OFFSETS3[][2] = {
+        // April 2, 2006
+        {-8*HOUR, 0},
+        {-8*HOUR, 1*HOUR},
+        {-8*HOUR, 1*HOUR},
+        {-8*HOUR, 1*HOUR},
+        {-8*HOUR, 1*HOUR},
+
+        // October 29, 2006
+        {-8*HOUR, 1*HOUR},
+        {-8*HOUR, 1*HOUR},
+        {-8*HOUR, 1*HOUR},
+        {-8*HOUR, 0},
+        {-8*HOUR, 0},
+    };
+
+    UErrorCode status = U_ZERO_ERROR;
+
+    int32_t rawOffset, dstOffset;
+    TimeZone* utc = TimeZone::createTimeZone("UTC");
+    Calendar* cal = Calendar::createInstance(*utc, status);
+    if (U_FAILURE(status)) {
+        errln("Calendar::createInstance failed");
+        return;
+    }
+    cal->clear();
+
+    // Set up TimeZone objects - OlsonTimeZone, SimpleTimeZone and RuleBasedTimeZone
+    BasicTimeZone *TESTZONES[NUM_TIMEZONES];
+
+    TESTZONES[0] = (BasicTimeZone*)TimeZone::createTimeZone("America/Los_Angeles");
+    TESTZONES[1] = new SimpleTimeZone(-8*HOUR, "Simple Pacific Time",
+                                        UCAL_APRIL, 1, UCAL_SUNDAY, 2*HOUR,
+                                        UCAL_OCTOBER, -1, UCAL_SUNDAY, 2*HOUR, status);
+    if (U_FAILURE(status)) {
+        errln("SimpleTimeZone constructor failed");
+        return;
+    }
+
+    InitialTimeZoneRule *ir = new InitialTimeZoneRule(
+            "Pacific Standard Time", // Initial time Name
+            -8*HOUR,        // Raw offset
+            0*HOUR);        // DST saving amount
+
+    RuleBasedTimeZone *rbPT = new RuleBasedTimeZone("Rule based Pacific Time", ir);
+
+    DateTimeRule *dtr;
+    AnnualTimeZoneRule *atzr;
+    const int32_t STARTYEAR = 2000;
+
+    dtr = new DateTimeRule(UCAL_APRIL, 1, UCAL_SUNDAY,
+                        2*HOUR, DateTimeRule::WALL_TIME); // 1st Sunday in April, at 2AM wall time
+    atzr = new AnnualTimeZoneRule("Pacific Daylight Time",
+            -8*HOUR /* rawOffset */, 1*HOUR /* dstSavings */, dtr,
+            STARTYEAR, AnnualTimeZoneRule::MAX_YEAR);
+    rbPT->addTransitionRule(atzr, status);
+    if (U_FAILURE(status)) {
+        errln("Could not add DST start rule to the RuleBasedTimeZone rbPT");
+        return;
+    }
+
+    dtr = new DateTimeRule(UCAL_OCTOBER, -1, UCAL_SUNDAY,
+                        2*HOUR, DateTimeRule::WALL_TIME); // last Sunday in October, at 2AM wall time
+    atzr = new AnnualTimeZoneRule("Pacific Standard Time",
+            -8*HOUR /* rawOffset */, 0 /* dstSavings */, dtr,
+            STARTYEAR, AnnualTimeZoneRule::MAX_YEAR);
+    rbPT->addTransitionRule(atzr, status);
+    if (U_FAILURE(status)) {
+        errln("Could not add STD start rule to the RuleBasedTimeZone rbPT");
+        return;
+    }
+
+    rbPT->complete(status);
+    if (U_FAILURE(status)) {
+        errln("complete() failed for RuleBasedTimeZone rbPT");
+        return;
+    }
+
+    TESTZONES[2] = rbPT;
+
+    // Calculate millis
+    UDate MILLIS[NUM_DATES];
+    for (int32_t i = 0; i < NUM_DATES; i++) {
+        cal->clear();
+        cal->set(DATES[i][0], DATES[i][1], DATES[i][2], DATES[i][3], DATES[i][4]);
+        MILLIS[i] = cal->getTime(status);
+        if (U_FAILURE(status)) {
+            errln("cal->getTime failed");
+            return;
+        }
+    }
+
+    SimpleDateFormat df(UnicodeString("yyyy-MM-dd HH:mm:ss"), status);
+    if (U_FAILURE(status)) {
+        errln("Failed to initialize a SimpleDateFormat");
+    }
+    df.setTimeZone(*utc);
+    UnicodeString dateStr;
+
+    // Test getOffset(uint8_t era, int32_t year, int32_t month, int32_t day,
+    // uint8_t dayOfWeek, int32_t millis, UErrorCode& status)
+    for (int32_t i = 0; i < NUM_TIMEZONES; i++) {
+        for (int32_t d = 0; d < NUM_DATES; d++) {
+            status = U_ZERO_ERROR;
+            int32_t offset = TESTZONES[i]->getOffset(GregorianCalendar::AD, DATES[d][0], DATES[d][1], DATES[d][2],
+                                                UCAL_SUNDAY, DATES[d][5], status);
+            if (U_FAILURE(status)) {
+                errln((UnicodeString)"getOffset(era,year,month,day,dayOfWeek,millis,status) failed for TESTZONES[" + i + "]");
+            } else if (offset != OFFSETS1[d]) {
+                dateStr.remove();
+                df.format(MILLIS[d], dateStr);
+                errln((UnicodeString)"Bad offset returned by TESTZONES[" + i + "] at "
+                        + dateStr + "(standard) - Got: " + offset + " Expected: " + OFFSETS1[d]);
+            }
+        }
+    }
+
+    // Test getOffset(UDate date, UBool local, int32_t& rawOffset,
+    // int32_t& dstOffset, UErrorCode& ec) with local = TRUE
+    for (int32_t i = 0; i < NUM_TIMEZONES; i++) {
+        for (int32_t m = 0; m < NUM_DATES; m++) {
+            status = U_ZERO_ERROR;
+            TESTZONES[i]->getOffset(MILLIS[m], TRUE, rawOffset, dstOffset, status);
+            if (U_FAILURE(status)) {
+                errln((UnicodeString)"getOffset(date,local,rawOfset,dstOffset,ec) failed for TESTZONES[" + i + "]");
+            } else if (rawOffset != OFFSETS2[m][0] || dstOffset != OFFSETS2[m][1]) {
+                dateStr.remove();
+                df.format(MILLIS[m], dateStr);
+                errln((UnicodeString)"Bad offset returned by TESTZONES[" + i + "] at "
+                        + dateStr + "(wall) - Got: "
+                        + rawOffset + "/" + dstOffset
+                        + " Expected: " + OFFSETS2[m][0] + "/" + OFFSETS2[m][1]);
+            }
+        }
+    }
+
+    // Test getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt,
+    // int32_t& rawOffset, int32_t& dstOffset, UErroCode& status)
+    // with nonExistingTimeOpt=kStandard/duplicatedTimeOpt=kStandard
+    for (int32_t i = 0; i < NUM_TIMEZONES; i++) {
+        for (int m = 0; m < NUM_DATES; m++) {
+            status = U_ZERO_ERROR;
+            TESTZONES[i]->getOffsetFromLocal(MILLIS[m], BasicTimeZone::kStandard, BasicTimeZone::kStandard,
+                rawOffset, dstOffset, status);
+            if (U_FAILURE(status)) {
+                errln((UnicodeString)"getOffsetFromLocal with kStandard/kStandard failed for TESTZONES[" + i + "]");
+            } else if (rawOffset != OFFSETS2[m][0] || dstOffset != OFFSETS2[m][1]) {
+                dateStr.remove();
+                df.format(MILLIS[m], dateStr);
+                errln((UnicodeString)"Bad offset returned by TESTZONES[" + i + "] at "
+                        + dateStr + "(wall/kStandard/kStandard) - Got: "
+                        + rawOffset + "/" + dstOffset
+                        + " Expected: " + OFFSETS2[m][0] + "/" + OFFSETS2[m][1]);
+            }
+        }
+    }
+
+    // Test getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt,
+    // int32_t& rawOffset, int32_t& dstOffset, UErroCode& status)
+    // with nonExistingTimeOpt=kDaylight/duplicatedTimeOpt=kDaylight
+    for (int32_t i = 0; i < NUM_TIMEZONES; i++) {
+        for (int m = 0; m < NUM_DATES; m++) {
+            status = U_ZERO_ERROR;
+            TESTZONES[i]->getOffsetFromLocal(MILLIS[m], BasicTimeZone::kDaylight, BasicTimeZone::kDaylight,
+                rawOffset, dstOffset, status);
+            if (U_FAILURE(status)) {
+                errln((UnicodeString)"getOffsetFromLocal with kDaylight/kDaylight failed for TESTZONES[" + i + "]");
+            } else if (rawOffset != OFFSETS3[m][0] || dstOffset != OFFSETS3[m][1]) {
+                dateStr.remove();
+                df.format(MILLIS[m], dateStr);
+                errln((UnicodeString)"Bad offset returned by TESTZONES[" + i + "] at "
+                        + dateStr + "(wall/kDaylight/kDaylight) - Got: "
+                        + rawOffset + "/" + dstOffset
+                        + " Expected: " + OFFSETS3[m][0] + "/" + OFFSETS3[m][1]);
+            }
+        }
+    }
+
+    // Test getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt,
+    // int32_t& rawOffset, int32_t& dstOffset, UErroCode& status)
+    // with nonExistingTimeOpt=kFormer/duplicatedTimeOpt=kLatter
+    for (int32_t i = 0; i < NUM_TIMEZONES; i++) {
+        for (int m = 0; m < NUM_DATES; m++) {
+            status = U_ZERO_ERROR;
+            TESTZONES[i]->getOffsetFromLocal(MILLIS[m], BasicTimeZone::kFormer, BasicTimeZone::kLatter,
+                rawOffset, dstOffset, status);
+            if (U_FAILURE(status)) {
+                errln((UnicodeString)"getOffsetFromLocal with kFormer/kLatter failed for TESTZONES[" + i + "]");
+            } else if (rawOffset != OFFSETS2[m][0] || dstOffset != OFFSETS2[m][1]) {
+                dateStr.remove();
+                df.format(MILLIS[m], dateStr);
+                errln((UnicodeString)"Bad offset returned by TESTZONES[" + i + "] at "
+                        + dateStr + "(wall/kFormer/kLatter) - Got: "
+                        + rawOffset + "/" + dstOffset
+                        + " Expected: " + OFFSETS2[m][0] + "/" + OFFSETS2[m][1]);
+            }
+        }
+    }
+
+    // Test getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt,
+    // int32_t& rawOffset, int32_t& dstOffset, UErroCode& status)
+    // with nonExistingTimeOpt=kLatter/duplicatedTimeOpt=kFormer
+    for (int32_t i = 0; i < NUM_TIMEZONES; i++) {
+        for (int m = 0; m < NUM_DATES; m++) {
+            status = U_ZERO_ERROR;
+            TESTZONES[i]->getOffsetFromLocal(MILLIS[m], BasicTimeZone::kLatter, BasicTimeZone::kFormer,
+                rawOffset, dstOffset, status);
+            if (U_FAILURE(status)) {
+                errln((UnicodeString)"getOffsetFromLocal with kLatter/kFormer failed for TESTZONES[" + i + "]");
+            } else if (rawOffset != OFFSETS3[m][0] || dstOffset != OFFSETS3[m][1]) {
+                dateStr.remove();
+                df.format(MILLIS[m], dateStr);
+                errln((UnicodeString)"Bad offset returned by TESTZONES[" + i + "] at "
+                        + dateStr + "(wall/kLatter/kFormer) - Got: "
+                        + rawOffset + "/" + dstOffset
+                        + " Expected: " + OFFSETS3[m][0] + "/" + OFFSETS3[m][1]);
+            }
+        }
+    }
+
+    for (int32_t i = 0; i < NUM_TIMEZONES; i++) {
+        delete TESTZONES[i];
+    }
+    delete utc;
+    delete cal;
+}
+
+#endif /* #if !UCONFIG_NO_FORMATTING */

Added: trunk/source/test/intltest/tzoffloc.h
===================================================================
--- trunk/source/test/intltest/tzoffloc.h	                        (rev 0)
+++ trunk/source/test/intltest/tzoffloc.h	2008-03-24 11:52:37 UTC (rev 144)
@@ -0,0 +1,26 @@
+/*
+*******************************************************************************
+* Copyright (C) 2007, International Business Machines Corporation and         *
+* others. All Rights Reserved.                                                *
+*******************************************************************************
+*/
+
+#ifndef _TIMEZONEOFFSETLOCALTEST_
+#define _TIMEZONEOFFSETLOCALTEST_
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_FORMATTING
+
+#include "intltest.h"
+
+class TimeZoneOffsetLocalTest : public IntlTest {
+    // IntlTest override
+    void runIndexedTest(int32_t index, UBool exec, const char*& name, char* par);
+
+    void TestGetOffsetAroundTransition(void);
+};
+
+#endif /* #if !UCONFIG_NO_FORMATTING */
+ 
+#endif // _TIMEZONEOFFSETLOCALTEST_

Modified: trunk/source/test/intltest/tzrulets.cpp
===================================================================
--- trunk/source/test/intltest/tzrulets.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/test/intltest/tzrulets.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -1470,6 +1470,7 @@
     delete t2;
     delete t3;
     delete t4;
+    delete t5;
 }
 
 /*

Modified: trunk/source/test/intltest/tztest.cpp
===================================================================
--- trunk/source/test/intltest/tztest.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/test/intltest/tztest.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -18,6 +18,7 @@
 #include "cmemory.h"
 #include "putilimp.h"
 #include "cstring.h"
+#include "olsontz.h"
 
 #define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
 
@@ -755,53 +756,92 @@
     }
 }
 
+
 /**
  * Utility function for TestCustomParse
  */
-UnicodeString& TimeZoneTest::formatMinutes(int32_t min, UnicodeString& rv, UBool insertSep/*=TRUE*/)
-{
-        rv.remove();
+UnicodeString& TimeZoneTest::formatOffset(int32_t offset, UnicodeString &rv) {
+    rv.remove();
+    UChar sign = 0x002B;
+    if (offset < 0) {
+        sign = 0x002D;
+        offset = -offset;
+    }
 
-        UChar sign = 0x002B;
-        if (min < 0) {
-            sign = 0x002D;
-            min = -min;
-        }
-        int h = min/60;
-        min = min%60;
+    int32_t s = offset % 60;
+    offset /= 60;
+    int32_t m = offset % 60;
+    int32_t h = offset / 60;
 
-        rv += (UChar)(sign);
-        if(h >= 10)
-            rv += (UChar)(0x0030 + (h/10));
-        else
-            rv += "0";
+    rv += (UChar)(sign);
+    if (h >= 10) {
+        rv += (UChar)(0x0030 + (h/10));
+    } else {
+        rv += (UChar)0x0030;
+    }
+    rv += (UChar)(0x0030 + (h%10));
 
-        rv += (UChar)(0x0030 + (h%10));
+    rv += (UChar)0x003A; /* ':' */
+    if (m >= 10) {
+        rv += (UChar)(0x0030 + (m/10));
+    } else {
+        rv += (UChar)0x0030;
+    }
+    rv += (UChar)(0x0030 + (m%10));
 
-        if (insertSep)
-            rv += ":";
-
-        if(min >= 10)
-            rv += (UChar)(0x0030 + (min/10));
-        else
-            rv += "0";
-
-        rv += (UChar)(0x0030 + (min%10));
-
-        return rv;
+    if (s) {
+        rv += (UChar)0x003A; /* ':' */
+        if (s >= 10) {
+            rv += (UChar)(0x0030 + (s/10));
+        } else {
+            rv += (UChar)0x0030;
+        }
+        rv += (UChar)(0x0030 + (s%10));
+    }
+    return rv;
 }
 
 /**
- * Utility function for TestCustomParse, generating RFC822 style
- * time zone string for the give offset in minutes
+ * Utility function for TestCustomParse, generating time zone ID
+ * string for the give offset.
  */
-UnicodeString& TimeZoneTest::formatRFC822TZ(int32_t min, UnicodeString& rv)
-{
-    UnicodeString offsetStr;
-    formatMinutes(min, offsetStr, FALSE);
+UnicodeString& TimeZoneTest::formatTZID(int32_t offset, UnicodeString &rv) {
     rv.remove();
+    UChar sign = 0x002B;
+    if (offset < 0) {
+        sign = 0x002D;
+        offset = -offset;
+    }
+
+    int32_t s = offset % 60;
+    offset /= 60;
+    int32_t m = offset % 60;
+    int32_t h = offset / 60;
+
     rv += "GMT";
-    rv += offsetStr;
+    rv += (UChar)(sign);
+    if (h >= 10) {
+        rv += (UChar)(0x0030 + (h/10));
+    } else {
+        rv += (UChar)0x0030;
+    }
+    rv += (UChar)(0x0030 + (h%10));
+
+    if (m >= 10) {
+        rv += (UChar)(0x0030 + (m/10));
+    } else {
+        rv += (UChar)0x0030;
+    }
+    rv += (UChar)(0x0030 + (m%10));
+
+    if (s) {
+        if (s >= 10) {
+            rv += (UChar)(0x0030 + (s/10));
+        } else {
+            rv += (UChar)0x0030;
+        }
+        rv += (UChar)(0x0030 + (s%10));
+    }
     return rv;
 }
 
@@ -825,92 +865,63 @@
     }
     kData[] =
     {
-        // ID        Expected offset in minutes
-        //{"GMT",       kUnparseable},   //Isn't custom. Can't test it here. [returns normal GMT]
+        // ID        Expected offset in seconds
+        {"GMT",       kUnparseable},   //Isn't custom. [returns normal GMT]
         {"GMT-YOUR.AD.HERE", kUnparseable},
-        // {"GMT0",      kUnparseable}, // ICU 2.8: An Olson zone ID
-        // {"GMT+0",     (0)}, // ICU 2.8: An Olson zone ID
-        {"GMT+1",     (60)},
-        {"GMT-0030",  (-30)},
+        {"GMT0",      kUnparseable},
+        {"GMT+0",     (0)},
+        {"GMT+1",     (1*60*60)},
+        {"GMT-0030",  (-30*60)},
         {"GMT+15:99", kUnparseable},
         {"GMT+",      kUnparseable},
         {"GMT-",      kUnparseable},
         {"GMT+0:",    kUnparseable},
         {"GMT-:",     kUnparseable},
-        {"GMT-YOUR.AD.HERE",     kUnparseable},
-        {"GMT+0010",  (10)}, // Interpret this as 00:10
-        {"GMT-10",    (-10*60)},
-        {"GMT+30",    (30)},
-        {"GMT-3:30",  (-(3*60+30))},
-        {"GMT-230",   (-(2*60+30))},
+        {"GMT-YOUR.AD.HERE",    kUnparseable},
+        {"GMT+0010",  (10*60)}, // Interpret this as 00:10
+        {"GMT-10",    (-10*60*60)},
+        {"GMT+30",    kUnparseable},
+        {"GMT-3:30",  (-(3*60+30)*60)},
+        {"GMT-230",   (-(2*60+30)*60)},
+        {"GMT+05:13:05",    ((5*60+13)*60+5)},
+        {"GMT-71023",       (-((7*60+10)*60+23))},
+        {"GMT+01:23:45:67", kUnparseable},
+        {"GMT+01:234",      kUnparseable},
+        {"GMT-2:31:123",    kUnparseable},
+        {"GMT+3:75",        kUnparseable},
+        {"GMT-01010101",    kUnparseable},
         {0,           0}
     };
 
-    for (i=0; kData[i].customId != 0; i++)
-    {
+    for (i=0; kData[i].customId != 0; i++) {
         UnicodeString id(kData[i].customId);
         int32_t exp = kData[i].expectedOffset;
-/*
-        { // for no data test Jitterbug 4354
-            UErrorCode success = U_ZERO_ERROR;
-            NumberFormat* numberFormat = NumberFormat::createInstance(success);
-            if (U_FAILURE(success)) {
-                dataerrln(" NumberFormat::createInstance() error");
-                return;
-            }
-            delete numberFormat;
-        }
-        */
-
         TimeZone *zone = TimeZone::createTimeZone(id);
         UnicodeString   itsID, temp;
 
-        logln();
-        logln("testing # " + formatMinutes(i, temp) + id);
-
-        /*
-        if(zone == NULL)
-        {
-            errln("FAIL: Could not createTimeZone(" + id + "). Returned NULL.");
-            continue;
-        }
-        */
-
-
-        if (! zone->getID(itsID).compare("GMT"))
-        //if(zone == NULL)
-        {
-            logln(id + " -> generic GMT");
-            // When TimeZone.getTimeZone() can't parse the id, it
-            // returns GMT -- a dubious practice, but required for
-            // backward compatibility.
-            if (exp != kUnparseable) {
-                errln("FAIL: Expected offset of " + formatMinutes(exp,temp) +
-                                    " for " + id + ", got parse failure");
-            }
-        }
-        else
-        {
+        if (zone->getDynamicClassID() == OlsonTimeZone::getStaticClassID()) {
+            logln(id + " -> Olson time zone");
+        } else {
             zone->getID(itsID);
-            int32_t ioffset = zone->getRawOffset()/60000;
+            int32_t ioffset = zone->getRawOffset()/1000;
             UnicodeString offset, expectedID;
-            formatMinutes(ioffset, offset);
-            formatRFC822TZ(ioffset, expectedID);
-            logln(id + " -> " + itsID + " GMT" + offset);
-            if (exp == kUnparseable)
-            {
-                errln("FAIL: Expected parse failure for " + id +
-                                    ", got offset of " + offset +
-                                    ", id " + itsID);
+            formatOffset(ioffset, offset);
+            formatTZID(ioffset, expectedID);
+            logln(id + " -> " + itsID + " " + offset);
+            if (exp == kUnparseable && itsID != "GMT") {
+                errln("Expected parse failure for " + id +
+                      ", got offset of " + offset +
+                      ", id " + itsID);
             }
-            else if (ioffset != exp ||
-                     (itsID.compare(expectedID) != 0))
-            {
-                errln("Expected offset of " + formatMinutes(exp,temp) +
-                                    ", id " + expectedID +
-                                    ", for " + id +
-                                    ", got offset of " + offset +
-                                    ", id " + itsID);
+            // JDK 1.3 creates custom zones with the ID "Custom"
+            // JDK 1.4 creates custom zones with IDs of the form "GMT+02:00"
+            // ICU creates custom zones with IDs of the form "GMT+0200"
+            else if (exp != kUnparseable && (ioffset != exp || itsID != expectedID)) {
+                errln("Expected offset of " + formatOffset(exp, temp) +
+                      ", id " + expectedID +
+                      ", for " + id +
+                      ", got offset of " + offset +
+                      ", id " + itsID);
             }
         }
         delete zone;
@@ -1548,6 +1559,9 @@
     // Time zone with daylight savings time from the first Sunday in November
     // to the last Sunday in February.
     // Similar to the new rule for Brazil (Sao Paulo) in tzdata2006n.
+    //
+    // Note: In tzdata2007h, the rule had changed, so no actual zones uses
+    // lastSun in Feb anymore.
     SimpleTimeZone tz1(-3 * U_MILLIS_PER_HOUR,          // raw offset: 3h before (west of) GMT
                        UNICODE_STRING("nov-feb", 7),
                        UCAL_NOVEMBER, 1, UCAL_SUNDAY,   // start: November, first, Sunday
@@ -1560,18 +1574,10 @@
         return;
     }
 
-    // Time zone for Brazil, with effectively the same rules as above,
-    // but expressed with DOW_GE_DOM_MODE and DOW_LE_DOM_MODE rules.
-    TimeZone *tz2 = TimeZone::createTimeZone(UNICODE_STRING_SIMPLE("America/Sao_Paulo"));
-    if (U_FAILURE(status) || (*tz2 == *TimeZone::getGMT())) {
-        delete tz2;
-        errln("Unable to create the America/Sao_Paulo TimeZone: %s", u_errorName(status));
-        return;
-    }
-
-    // Now hardcode the same rules as for Brazil, so that we cover the intended code
-    // even when in the future zoneinfo hardcodes these transition dates.
-    SimpleTimeZone tz3(-3 * U_MILLIS_PER_HOUR,          // raw offset: 3h before (west of) GMT
+    // Now hardcode the same rules as for Brazil in tzdata 2006n, so that
+    // we cover the intended code even when in the future zoneinfo hardcodes
+    // these transition dates.
+    SimpleTimeZone tz2(-3 * U_MILLIS_PER_HOUR,          // raw offset: 3h before (west of) GMT
                        UNICODE_STRING("nov-feb2", 8),
                        UCAL_NOVEMBER, 1, -UCAL_SUNDAY,  // start: November, 1 or after, Sunday
                        0,                               //        midnight wall time
@@ -1617,7 +1623,7 @@
         { 2010, UCAL_FEBRUARY, 28, 02, 00, 00, -3 }
     };
 
-    TimeZone *timezones[] = { &tz1, tz2, &tz3 };
+    TimeZone *timezones[] = { &tz1, &tz2 };
 
     TimeZone *tz;
     UDate dt;
@@ -1653,7 +1659,6 @@
             }
         }
     }
-    delete tz2;
 }
 
 #endif /* #if !UCONFIG_NO_FORMATTING */

Modified: trunk/source/test/intltest/tztest.h
===================================================================
--- trunk/source/test/intltest/tztest.h	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/test/intltest/tztest.h	2008-03-24 11:52:37 UTC (rev 144)
@@ -92,8 +92,8 @@
 
 private:
     // internal functions
-    static UnicodeString& formatMinutes(int32_t min, UnicodeString& rv, UBool insertSep = TRUE);
-    static UnicodeString& formatRFC822TZ(int32_t min, UnicodeString& rv);
+    static UnicodeString& formatOffset(int32_t offset, UnicodeString& rv);
+    static UnicodeString& formatTZID(int32_t offset, UnicodeString& rv);
 };
 
 #endif /* #if !UCONFIG_NO_FORMATTING */

Modified: trunk/source/test/letest/Makefile.in
===================================================================
--- trunk/source/test/letest/Makefile.in	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/test/letest/Makefile.in	2008-03-24 11:52:37 UTC (rev 144)
@@ -35,9 +35,9 @@
 CPPFLAGS += -I$(top_builddir)/common
 endif
 
-CPPFLAGS += -I$(top_builddir)/common -I$(top_srcdir)/common -I$(top_srcdir)/i18n -I$(top_srcdir)/tools/ctestfw -I$(top_srcdir)/tools/toolutil -I$(top_srcdir)/layout -I$(top_srcdir)
+CPPFLAGS += -I$(top_builddir)/common -I$(top_srcdir)/common -I$(top_srcdir)/i18n -I$(top_srcdir)/tools/ctestfw -I$(top_srcdir)/tools/toolutil -I$(top_srcdir)/layout -I$(top_srcdir)/layoutex -I$(top_srcdir)
 DEFS += -D'U_TOPSRCDIR="$(top_srcdir)/"' -D'U_TOPBUILDDIR="$(BUILDDIR)"'
-LIBS = $(LIBICULE) $(LIBICUUC) $(LIBICUI18N) $(LIBCTESTFW) $(LIBICUTOOLUTIL) @LIBS@ @LIB_M@
+LIBS = $(LIBICULX) $(LIBICULE) $(LIBICUUC) $(LIBICUI18N) $(LIBCTESTFW) $(LIBICUTOOLUTIL) @LIBS@ @LIB_M@
 
 COMMONOBJECTS = letsutil.o cmaps.o FontTableCache.o SimpleFontInstance.o PortableFontInstance.o
 TESTOBJECTS   = letest.o

Modified: trunk/source/test/letest/cletest.c
===================================================================
--- trunk/source/test/letest/cletest.c	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/test/letest/cletest.c	2008-03-24 11:52:37 UTC (rev 144)
@@ -14,8 +14,11 @@
 
 #include "layout/LETypes.h"
 #include "layout/LEScripts.h"
-#include "loengine.h"
+#include "layout/loengine.h"
 
+#include "layout/playout.h"
+#include "layout/plruns.h"
+
 #include "cfonts.h"
 
 #include "letest.h"
@@ -478,12 +481,246 @@
 	readTestFile(testFilePath, doTestCase);
 }
 
+/*
+ * From ticket:5923:
+ *
+ * Build a paragraph that contains a mixture of left to right and right to left text.
+ * Break it into multiple lines and make sure that the glyphToCharMap for run in each
+ * line is correct.
+ *
+ * Note: it might be a good idea to also check the glyphs and positions for each run,
+ * that we get the expected number of runs per line and that the line breaks are where
+ * we expect them to be. Really, it would be a good idea to make a whole test suite
+ * for pl_paragraph.
+ */
+static void U_CALLCONV GlyphToCharTest(void)
+{
+    LEErrorCode status = LE_NO_ERROR;
+    le_font *font;
+    pl_fontRuns *fontRuns;
+    pl_paragraph *paragraph;
+    const pl_line *line;
+    /*
+     * This is the same text that's in <icu>/source/samples/layout/Sample.txt
+     */
+    LEUnicode chars[] = {
+        /*BOM*/ 0x0054, 0x0068, 0x0065, 0x0020, 0x004c, 0x0061, 0x0079, 
+        0x006f, 0x0075, 0x0074, 0x0045, 0x006e, 0x0067, 0x0069, 0x006e, 
+        0x0065, 0x0020, 0x0064, 0x006f, 0x0065, 0x0073, 0x0020, 0x0061, 
+        0x006c, 0x006c, 0x0020, 0x0074, 0x0068, 0x0065, 0x0020, 0x0077, 
+        0x006f, 0x0072, 0x006b, 0x0020, 0x006e, 0x0065, 0x0063, 0x0065, 
+        0x0073, 0x0073, 0x0061, 0x0072, 0x0079, 0x0020, 0x0074, 0x006f, 
+        0x0020, 0x0064, 0x0069, 0x0073, 0x0070, 0x006c, 0x0061, 0x0079, 
+        0x0020, 0x0055, 0x006e, 0x0069, 0x0063, 0x006f, 0x0064, 0x0065, 
+        0x0020, 0x0074, 0x0065, 0x0078, 0x0074, 0x0020, 0x0077, 0x0072, 
+        0x0069, 0x0074, 0x0074, 0x0065, 0x006e, 0x0020, 0x0069, 0x006e, 
+        0x0020, 0x006c, 0x0061, 0x006e, 0x0067, 0x0075, 0x0061, 0x0067, 
+        0x0065, 0x0073, 0x0020, 0x0077, 0x0069, 0x0074, 0x0068, 0x0020, 
+        0x0063, 0x006f, 0x006d, 0x0070, 0x006c, 0x0065, 0x0078, 0x0020, 
+        0x0077, 0x0072, 0x0069, 0x0074, 0x0069, 0x006e, 0x0067, 0x0020, 
+        0x0073, 0x0079, 0x0073, 0x0074, 0x0065, 0x006d, 0x0073, 0x0020, 
+        0x0073, 0x0075, 0x0063, 0x0068, 0x0020, 0x0061, 0x0073, 0x0020, 
+        0x0048, 0x0069, 0x006e, 0x0064, 0x0069, 0x0020, 0x0028, 0x0939, 
+        0x093f, 0x0928, 0x094d, 0x0926, 0x0940, 0x0029, 0x0020, 0x0054, 
+        0x0068, 0x0061, 0x0069, 0x0020, 0x0028, 0x0e44, 0x0e17, 0x0e22, 
+        0x0029, 0x0020, 0x0061, 0x006e, 0x0064, 0x0020, 0x0041, 0x0072, 
+        0x0061, 0x0062, 0x0069, 0x0063, 0x0020, 0x0028, 0x0627, 0x0644, 
+        0x0639, 0x0631, 0x0628, 0x064a, 0x0629, 0x0029, 0x002e, 0x0020, 
+        0x0048, 0x0065, 0x0072, 0x0065, 0x0027, 0x0073, 0x0020, 0x0061, 
+        0x0020, 0x0073, 0x0061, 0x006d, 0x0070, 0x006c, 0x0065, 0x0020, 
+        0x006f, 0x0066, 0x0020, 0x0073, 0x006f, 0x006d, 0x0065, 0x0020, 
+        0x0074, 0x0065, 0x0078, 0x0074, 0x0020, 0x0077, 0x0072, 0x0069, 
+        0x0074, 0x0074, 0x0065, 0x006e, 0x0020, 0x0069, 0x006e, 0x0020, 
+        0x0053, 0x0061, 0x006e, 0x0073, 0x006b, 0x0072, 0x0069, 0x0074, 
+        0x003a, 0x0020, 0x0936, 0x094d, 0x0930, 0x0940, 0x092e, 0x0926, 
+        0x094d, 0x0020, 0x092d, 0x0917, 0x0935, 0x0926, 0x094d, 0x0917, 
+        0x0940, 0x0924, 0x093e, 0x0020, 0x0905, 0x0927, 0x094d, 0x092f, 
+        0x093e, 0x092f, 0x0020, 0x0905, 0x0930, 0x094d, 0x091c, 0x0941, 
+        0x0928, 0x0020, 0x0935, 0x093f, 0x0937, 0x093e, 0x0926, 0x0020, 
+        0x092f, 0x094b, 0x0917, 0x0020, 0x0927, 0x0943, 0x0924, 0x0930, 
+        0x093e, 0x0937, 0x094d, 0x091f, 0x094d, 0x0930, 0x0020, 0x0909, 
+        0x0935, 0x093e, 0x091a, 0x0964, 0x0020, 0x0927, 0x0930, 0x094d, 
+        0x092e, 0x0915, 0x094d, 0x0937, 0x0947, 0x0924, 0x094d, 0x0930, 
+        0x0947, 0x0020, 0x0915, 0x0941, 0x0930, 0x0941, 0x0915, 0x094d, 
+        0x0937, 0x0947, 0x0924, 0x094d, 0x0930, 0x0947, 0x0020, 0x0938, 
+        0x092e, 0x0935, 0x0947, 0x0924, 0x093e, 0x0020, 0x092f, 0x0941, 
+        0x092f, 0x0941, 0x0924, 0x094d, 0x0938, 0x0935, 0x0903, 0x0020, 
+        0x092e, 0x093e, 0x092e, 0x0915, 0x093e, 0x0903, 0x0020, 0x092a, 
+        0x093e, 0x0923, 0x094d, 0x0921, 0x0935, 0x093e, 0x0936, 0x094d, 
+        0x091a, 0x0948, 0x0935, 0x0020, 0x0915, 0x093f, 0x092e, 0x0915, 
+        0x0941, 0x0930, 0x094d, 0x0935, 0x0924, 0x0020, 0x0938, 0x0902, 
+        0x091c, 0x092f, 0x0020, 0x0048, 0x0065, 0x0072, 0x0065, 0x0027, 
+        0x0073, 0x0020, 0x0061, 0x0020, 0x0073, 0x0061, 0x006d, 0x0070, 
+        0x006c, 0x0065, 0x0020, 0x006f, 0x0066, 0x0020, 0x0073, 0x006f, 
+        0x006d, 0x0065, 0x0020, 0x0074, 0x0065, 0x0078, 0x0074, 0x0020, 
+        0x0077, 0x0072, 0x0069, 0x0074, 0x0074, 0x0065, 0x006e, 0x0020, 
+        0x0069, 0x006e, 0x0020, 0x0041, 0x0072, 0x0061, 0x0062, 0x0069, 
+        0x0063, 0x003a, 0x0020, 0x0623, 0x0633, 0x0627, 0x0633, 0x064b, 
+        0x0627, 0x060c, 0x0020, 0x062a, 0x062a, 0x0639, 0x0627, 0x0645, 
+        0x0644, 0x0020, 0x0627, 0x0644, 0x062d, 0x0648, 0x0627, 0x0633, 
+        0x064a, 0x0628, 0x0020, 0x0641, 0x0642, 0x0637, 0x0020, 0x0645, 
+        0x0639, 0x0020, 0x0627, 0x0644, 0x0623, 0x0631, 0x0642, 0x0627, 
+        0x0645, 0x060c, 0x0020, 0x0648, 0x062a, 0x0642, 0x0648, 0x0645, 
+        0x0020, 0x0628, 0x062a, 0x062e, 0x0632, 0x064a, 0x0646, 0x0020, 
+        0x0627, 0x0644, 0x0623, 0x062d, 0x0631, 0x0641, 0x0020, 0x0648, 
+        0x0627, 0x0644, 0x0645, 0x062d, 0x0627, 0x0631, 0x0641, 0x0020, 
+        0x0627, 0x0644, 0x0623, 0x062e, 0x0631, 0x0649, 0x0020, 0x0628, 
+        0x0639, 0x062f, 0x0020, 0x0623, 0x0646, 0x0020, 0x062a, 0x064f, 
+        0x0639, 0x0637, 0x064a, 0x0020, 0x0631, 0x0642, 0x0645, 0x0627, 
+        0x0020, 0x0645, 0x0639, 0x064a, 0x0646, 0x0627, 0x0020, 0x0644, 
+        0x0643, 0x0644, 0x0020, 0x0648, 0x0627, 0x062d, 0x062f, 0x0020, 
+        0x0645, 0x0646, 0x0647, 0x0627, 0x002e, 0x0020, 0x0648, 0x0642, 
+        0x0628, 0x0644, 0x0020, 0x0627, 0x062e, 0x062a, 0x0631, 0x0627, 
+        0x0639, 0x0020, 0x0022, 0x064a, 0x0648, 0x0646, 0x0650, 0x0643, 
+        0x0648, 0x062f, 0x0022, 0x060c, 0x0020, 0x0643, 0x0627, 0x0646, 
+        0x0020, 0x0647, 0x0646, 0x0627, 0x0643, 0x0020, 0x0645, 0x0626, 
+        0x0627, 0x062a, 0x0020, 0x0627, 0x0644, 0x0623, 0x0646, 0x0638, 
+        0x0645, 0x0629, 0x0020, 0x0644, 0x0644, 0x062a, 0x0634, 0x0641, 
+        0x064a, 0x0631, 0x0020, 0x0648, 0x062a, 0x062e, 0x0635, 0x064a, 
+        0x0635, 0x0020, 0x0647, 0x0630, 0x0647, 0x0020, 0x0627, 0x0644, 
+        0x0623, 0x0631, 0x0642, 0x0627, 0x0645, 0x0020, 0x0644, 0x0644, 
+        0x0645, 0x062d, 0x0627, 0x0631, 0x0641, 0x060c, 0x0020, 0x0648, 
+        0x0644, 0x0645, 0x0020, 0x064a, 0x0648, 0x062c, 0x062f, 0x0020, 
+        0x0646, 0x0638, 0x0627, 0x0645, 0x0020, 0x062a, 0x0634, 0x0641, 
+        0x064a, 0x0631, 0x0020, 0x0648, 0x0627, 0x062d, 0x062f, 0x0020, 
+        0x064a, 0x062d, 0x062a, 0x0648, 0x064a, 0x0020, 0x0639, 0x0644, 
+        0x0649, 0x0020, 0x062c, 0x0645, 0x064a, 0x0639, 0x0020, 0x0627, 
+        0x0644, 0x0645, 0x062d, 0x0627, 0x0631, 0x0641, 0x0020, 0x0627, 
+        0x0644, 0x0636, 0x0631, 0x0648, 0x0631, 0x064a, 0x0629, 0x0020, 
+        0x0061, 0x006e, 0x0064, 0x0020, 0x0068, 0x0065, 0x0072, 0x0065, 
+        0x0027, 0x0073, 0x0020, 0x0061, 0x0020, 0x0073, 0x0061, 0x006d, 
+        0x0070, 0x006c, 0x0065, 0x0020, 0x006f, 0x0066, 0x0020, 0x0073, 
+        0x006f, 0x006d, 0x0065, 0x0020, 0x0074, 0x0065, 0x0078, 0x0074, 
+        0x0020, 0x0077, 0x0072, 0x0069, 0x0074, 0x0074, 0x0065, 0x006e, 
+        0x0020, 0x0069, 0x006e, 0x0020, 0x0054, 0x0068, 0x0061, 0x0069, 
+        0x003a, 0x0020, 0x0e1a, 0x0e17, 0x0e17, 0x0e35, 0x0e48, 0x0e51, 
+        0x0e1e, 0x0e32, 0x0e22, 0x0e38, 0x0e44, 0x0e0b, 0x0e42, 0x0e04, 
+        0x0e25, 0x0e19, 0x0e42, 0x0e14, 0x0e42, 0x0e23, 0x0e18, 0x0e35, 
+        0x0e2d, 0x0e32, 0x0e28, 0x0e31, 0x0e22, 0x0e2d, 0x0e22, 0x0e39, 
+        0x0e48, 0x0e17, 0x0e48, 0x0e32, 0x0e21, 0x0e01, 0x0e25, 0x0e32, 
+        0x0e07, 0x0e17, 0x0e38, 0x0e48, 0x0e07, 0x0e43, 0x0e2b, 0x0e0d, 
+        0x0e48, 0x0e43, 0x0e19, 0x0e41, 0x0e04, 0x0e19, 0x0e0b, 0x0e31, 
+        0x0e2a, 0x0e01, 0x0e31, 0x0e1a, 0x0e25, 0x0e38, 0x0e07, 0x0e40, 
+        0x0e2e, 0x0e19, 0x0e23, 0x0e35, 0x0e0a, 0x0e32, 0x0e27, 0x0e44, 
+        0x0e23, 0x0e48, 0x0e41, 0x0e25, 0x0e30, 0x0e1b, 0x0e49, 0x0e32, 
+        0x0e40, 0x0e2d, 0x0e47, 0x0e21, 0x0e20, 0x0e23, 0x0e23, 0x0e22, 
+        0x0e32, 0x0e0a, 0x0e32, 0x0e27, 0x0e44, 0x0e23, 0x0e48, 0x0e1a, 
+        0x0e49, 0x0e32, 0x0e19, 0x0e02, 0x0e2d, 0x0e07, 0x0e1e, 0x0e27, 
+        0x0e01, 0x0e40, 0x0e02, 0x0e32, 0x0e2b, 0x0e25, 0x0e31, 0x0e07, 
+        0x0e40, 0x0e25, 0x0e47, 0x0e01, 0x0e40, 0x0e1e, 0x0e23, 0x0e32, 
+        0x0e30, 0x0e44, 0x0e21, 0x0e49, 0x0e2a, 0x0e23, 0x0e49, 0x0e32, 
+        0x0e07, 0x0e1a, 0x0e49, 0x0e32, 0x0e19, 0x0e15, 0x0e49, 0x0e2d, 
+        0x0e07, 0x0e02, 0x0e19, 0x0e21, 0x0e32, 0x0e14, 0x0e49, 0x0e27, 
+        0x0e22, 0x0e40, 0x0e01, 0x0e27, 0x0e35, 0x0e22, 0x0e19, 0x0e40, 
+        0x0e1b, 0x0e47, 0x0e19, 0x0e23, 0x0e30, 0x0e22, 0x0e30, 0x0e17, 
+        0x0e32, 0x0e07, 0x0e2b, 0x0e25, 0x0e32, 0x0e22, 0x0e44, 0x0e21, 
+        0x0e25, 0x0e4c
+    };
+    le_int32 charCount = LE_ARRAY_SIZE(chars);
+    le_int32 charIndex = 0, lineNumber = 1;
+    le_int32 run, i;
+    const float lineWidth = 600;
+
+    font = le_simpleFontOpen(12, &status);
+
+    if (LE_FAILURE(status)) {
+        log_err("le_simpleFontOpen(12, &status) failed");
+        goto finish;
+    }
+
+    fontRuns = pl_openEmptyFontRuns(0);
+    pl_addFontRun(fontRuns, font, charCount);
+
+    paragraph = pl_create(chars, charCount, fontRuns, NULL, NULL, NULL, 0, FALSE, &status);
+
+    pl_closeFontRuns(fontRuns);
+
+    if (LE_FAILURE(status)) {
+        log_err("pl_create failed.");
+        goto close_font;
+    }
+
+    pl_reflow(paragraph);
+    while ((line = pl_nextLine(paragraph, lineWidth)) != NULL) {
+        le_int32 runCount = pl_countLineRuns(line);
+
+        for(run = 0; run < runCount; run += 1) {
+            const pl_visualRun *visualRun = pl_getLineVisualRun(line, run);
+            const le_int32 glyphCount = pl_getVisualRunGlyphCount(visualRun);
+            const le_int32 *glyphToCharMap = pl_getVisualRunGlyphToCharMap(visualRun);
+
+            if (pl_getVisualRunDirection(visualRun) == UBIDI_RTL) {
+                /*
+                 * For a right to left run, make sure that the character indices
+                 * increase from the right most glyph to the left most glyph. If
+                 * there are any one to many glyph substitutions, we might get several
+                 * glyphs in a row with the same character index.
+                 */
+                for(i = glyphCount - 1; i >= 0; i -= 1) {
+                    le_int32 ix = glyphToCharMap[i];
+
+                    if (ix != charIndex) {
+                        if (ix != charIndex - 1) {
+                            log_err("Bad glyph to char index for glyph %d on line %d: expected %d, got %d\n",
+                                i, lineNumber, charIndex, ix);
+                            goto close_paragraph; /* once there's one error, we can't count on anything else... */
+                        }
+                    } else {
+                        charIndex += 1;
+                    }
+                }
+            } else {
+                /*
+                 * We can't just check the order of the character indices
+                 * for left to right runs because Indic text might have been
+                 * reordered. What we can do is find the minimum and maximum
+                 * character indices in the run and make sure that the minimum
+                 * is equal to charIndex and then advance charIndex to the maximum.
+                 */
+                le_int32 minIndex = 0x7FFFFFFF, maxIndex = -1;
+
+                for(i = 0; i < glyphCount; i += 1) {
+                    le_int32 ix = glyphToCharMap[i];
+
+                    if (ix > maxIndex) {
+                        maxIndex = ix;
+                    }
+
+                    if (ix < minIndex) {
+                        minIndex = ix;
+                    }
+                }
+
+                if (minIndex != charIndex) {
+                    log_err("Bad minIndex for run %d on line %d: expected %d, got %d\n",
+                        run, lineNumber, charIndex, minIndex);
+                    goto close_paragraph; /* once there's one error, we can't count on anything else... */
+                }
+
+                charIndex = maxIndex + 1;
+            }
+        }
+
+        lineNumber += 1;
+    }
+
+close_paragraph:
+    pl_close(paragraph);
+
+close_font:
+    le_fontClose(font);
+
+finish:
+    return;
+}
+
 U_CFUNC void addCTests(TestNode **root)
 {
-    addTest(root, &ParamTest,      "c_api/ParameterTest");
-    addTest(root, &FactoryTest,    "c_api/FactoryTest");
-    addTest(root, &AccessTest,     "c_layout/AccessTest");
-    addTest(root, &DataDrivenTest, "c_layout/DataDrivenTest");
+    addTest(root, &ParamTest,       "c_api/ParameterTest");
+    addTest(root, &FactoryTest,     "c_api/FactoryTest");
+    addTest(root, &AccessTest,      "c_layout/AccessTest");
+    addTest(root, &DataDrivenTest,  "c_layout/DataDrivenTest");
+    addTest(root, &GlyphToCharTest, "c_paragraph/GlyphToCharTest");
 }
 
 

Modified: trunk/source/test/letest/letest.cpp
===================================================================
--- trunk/source/test/letest/letest.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/test/letest/letest.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -23,6 +23,9 @@
 #include "layout/LEScripts.h"
 #include "layout/LayoutEngine.h"
 
+#include "layout/ParagraphLayout.h"
+#include "layout/RunArrays.h"
+
 #include "PortableFontInstance.h"
 #include "SimpleFontInstance.h"
 
@@ -715,13 +718,242 @@
 }
 U_CDECL_END
 
+U_CDECL_BEGIN
+/*
+ * From ticket:5923:
+ *
+ * Build a paragraph that contains a mixture of left to right and right to left text.
+ * Break it into multiple lines and make sure that the glyphToCharMap for run in each
+ * line is correct.
+ *
+ * Note: it might be a good idea to also check the glyphs and positions for each run,
+ * that we get the expected number of runs per line and that the line breaks are where
+ * we expect them to be. Really, it would be a good idea to make a whole test suite
+ * for ParagraphLayout.
+ */
+static void U_CALLCONV GlyphToCharTest(void)
+{
+    LEErrorCode status = LE_NO_ERROR;
+    LEFontInstance *font;
+    FontRuns fontRuns(0);
+    ParagraphLayout *paragraphLayout;
+    const ParagraphLayout::Line *line;
+    /*
+     * This is the same text that's in <icu>/source/samples/layout/Sample.txt
+     */
+    LEUnicode chars[] = {
+        /*BOM*/ 0x0054, 0x0068, 0x0065, 0x0020, 0x004c, 0x0061, 0x0079, 
+        0x006f, 0x0075, 0x0074, 0x0045, 0x006e, 0x0067, 0x0069, 0x006e, 
+        0x0065, 0x0020, 0x0064, 0x006f, 0x0065, 0x0073, 0x0020, 0x0061, 
+        0x006c, 0x006c, 0x0020, 0x0074, 0x0068, 0x0065, 0x0020, 0x0077, 
+        0x006f, 0x0072, 0x006b, 0x0020, 0x006e, 0x0065, 0x0063, 0x0065, 
+        0x0073, 0x0073, 0x0061, 0x0072, 0x0079, 0x0020, 0x0074, 0x006f, 
+        0x0020, 0x0064, 0x0069, 0x0073, 0x0070, 0x006c, 0x0061, 0x0079, 
+        0x0020, 0x0055, 0x006e, 0x0069, 0x0063, 0x006f, 0x0064, 0x0065, 
+        0x0020, 0x0074, 0x0065, 0x0078, 0x0074, 0x0020, 0x0077, 0x0072, 
+        0x0069, 0x0074, 0x0074, 0x0065, 0x006e, 0x0020, 0x0069, 0x006e, 
+        0x0020, 0x006c, 0x0061, 0x006e, 0x0067, 0x0075, 0x0061, 0x0067, 
+        0x0065, 0x0073, 0x0020, 0x0077, 0x0069, 0x0074, 0x0068, 0x0020, 
+        0x0063, 0x006f, 0x006d, 0x0070, 0x006c, 0x0065, 0x0078, 0x0020, 
+        0x0077, 0x0072, 0x0069, 0x0074, 0x0069, 0x006e, 0x0067, 0x0020, 
+        0x0073, 0x0079, 0x0073, 0x0074, 0x0065, 0x006d, 0x0073, 0x0020, 
+        0x0073, 0x0075, 0x0063, 0x0068, 0x0020, 0x0061, 0x0073, 0x0020, 
+        0x0048, 0x0069, 0x006e, 0x0064, 0x0069, 0x0020, 0x0028, 0x0939, 
+        0x093f, 0x0928, 0x094d, 0x0926, 0x0940, 0x0029, 0x0020, 0x0054, 
+        0x0068, 0x0061, 0x0069, 0x0020, 0x0028, 0x0e44, 0x0e17, 0x0e22, 
+        0x0029, 0x0020, 0x0061, 0x006e, 0x0064, 0x0020, 0x0041, 0x0072, 
+        0x0061, 0x0062, 0x0069, 0x0063, 0x0020, 0x0028, 0x0627, 0x0644, 
+        0x0639, 0x0631, 0x0628, 0x064a, 0x0629, 0x0029, 0x002e, 0x0020, 
+        0x0048, 0x0065, 0x0072, 0x0065, 0x0027, 0x0073, 0x0020, 0x0061, 
+        0x0020, 0x0073, 0x0061, 0x006d, 0x0070, 0x006c, 0x0065, 0x0020, 
+        0x006f, 0x0066, 0x0020, 0x0073, 0x006f, 0x006d, 0x0065, 0x0020, 
+        0x0074, 0x0065, 0x0078, 0x0074, 0x0020, 0x0077, 0x0072, 0x0069, 
+        0x0074, 0x0074, 0x0065, 0x006e, 0x0020, 0x0069, 0x006e, 0x0020, 
+        0x0053, 0x0061, 0x006e, 0x0073, 0x006b, 0x0072, 0x0069, 0x0074, 
+        0x003a, 0x0020, 0x0936, 0x094d, 0x0930, 0x0940, 0x092e, 0x0926, 
+        0x094d, 0x0020, 0x092d, 0x0917, 0x0935, 0x0926, 0x094d, 0x0917, 
+        0x0940, 0x0924, 0x093e, 0x0020, 0x0905, 0x0927, 0x094d, 0x092f, 
+        0x093e, 0x092f, 0x0020, 0x0905, 0x0930, 0x094d, 0x091c, 0x0941, 
+        0x0928, 0x0020, 0x0935, 0x093f, 0x0937, 0x093e, 0x0926, 0x0020, 
+        0x092f, 0x094b, 0x0917, 0x0020, 0x0927, 0x0943, 0x0924, 0x0930, 
+        0x093e, 0x0937, 0x094d, 0x091f, 0x094d, 0x0930, 0x0020, 0x0909, 
+        0x0935, 0x093e, 0x091a, 0x0964, 0x0020, 0x0927, 0x0930, 0x094d, 
+        0x092e, 0x0915, 0x094d, 0x0937, 0x0947, 0x0924, 0x094d, 0x0930, 
+        0x0947, 0x0020, 0x0915, 0x0941, 0x0930, 0x0941, 0x0915, 0x094d, 
+        0x0937, 0x0947, 0x0924, 0x094d, 0x0930, 0x0947, 0x0020, 0x0938, 
+        0x092e, 0x0935, 0x0947, 0x0924, 0x093e, 0x0020, 0x092f, 0x0941, 
+        0x092f, 0x0941, 0x0924, 0x094d, 0x0938, 0x0935, 0x0903, 0x0020, 
+        0x092e, 0x093e, 0x092e, 0x0915, 0x093e, 0x0903, 0x0020, 0x092a, 
+        0x093e, 0x0923, 0x094d, 0x0921, 0x0935, 0x093e, 0x0936, 0x094d, 
+        0x091a, 0x0948, 0x0935, 0x0020, 0x0915, 0x093f, 0x092e, 0x0915, 
+        0x0941, 0x0930, 0x094d, 0x0935, 0x0924, 0x0020, 0x0938, 0x0902, 
+        0x091c, 0x092f, 0x0020, 0x0048, 0x0065, 0x0072, 0x0065, 0x0027, 
+        0x0073, 0x0020, 0x0061, 0x0020, 0x0073, 0x0061, 0x006d, 0x0070, 
+        0x006c, 0x0065, 0x0020, 0x006f, 0x0066, 0x0020, 0x0073, 0x006f, 
+        0x006d, 0x0065, 0x0020, 0x0074, 0x0065, 0x0078, 0x0074, 0x0020, 
+        0x0077, 0x0072, 0x0069, 0x0074, 0x0074, 0x0065, 0x006e, 0x0020, 
+        0x0069, 0x006e, 0x0020, 0x0041, 0x0072, 0x0061, 0x0062, 0x0069, 
+        0x0063, 0x003a, 0x0020, 0x0623, 0x0633, 0x0627, 0x0633, 0x064b, 
+        0x0627, 0x060c, 0x0020, 0x062a, 0x062a, 0x0639, 0x0627, 0x0645, 
+        0x0644, 0x0020, 0x0627, 0x0644, 0x062d, 0x0648, 0x0627, 0x0633, 
+        0x064a, 0x0628, 0x0020, 0x0641, 0x0642, 0x0637, 0x0020, 0x0645, 
+        0x0639, 0x0020, 0x0627, 0x0644, 0x0623, 0x0631, 0x0642, 0x0627, 
+        0x0645, 0x060c, 0x0020, 0x0648, 0x062a, 0x0642, 0x0648, 0x0645, 
+        0x0020, 0x0628, 0x062a, 0x062e, 0x0632, 0x064a, 0x0646, 0x0020, 
+        0x0627, 0x0644, 0x0623, 0x062d, 0x0631, 0x0641, 0x0020, 0x0648, 
+        0x0627, 0x0644, 0x0645, 0x062d, 0x0627, 0x0631, 0x0641, 0x0020, 
+        0x0627, 0x0644, 0x0623, 0x062e, 0x0631, 0x0649, 0x0020, 0x0628, 
+        0x0639, 0x062f, 0x0020, 0x0623, 0x0646, 0x0020, 0x062a, 0x064f, 
+        0x0639, 0x0637, 0x064a, 0x0020, 0x0631, 0x0642, 0x0645, 0x0627, 
+        0x0020, 0x0645, 0x0639, 0x064a, 0x0646, 0x0627, 0x0020, 0x0644, 
+        0x0643, 0x0644, 0x0020, 0x0648, 0x0627, 0x062d, 0x062f, 0x0020, 
+        0x0645, 0x0646, 0x0647, 0x0627, 0x002e, 0x0020, 0x0648, 0x0642, 
+        0x0628, 0x0644, 0x0020, 0x0627, 0x062e, 0x062a, 0x0631, 0x0627, 
+        0x0639, 0x0020, 0x0022, 0x064a, 0x0648, 0x0646, 0x0650, 0x0643, 
+        0x0648, 0x062f, 0x0022, 0x060c, 0x0020, 0x0643, 0x0627, 0x0646, 
+        0x0020, 0x0647, 0x0646, 0x0627, 0x0643, 0x0020, 0x0645, 0x0626, 
+        0x0627, 0x062a, 0x0020, 0x0627, 0x0644, 0x0623, 0x0646, 0x0638, 
+        0x0645, 0x0629, 0x0020, 0x0644, 0x0644, 0x062a, 0x0634, 0x0641, 
+        0x064a, 0x0631, 0x0020, 0x0648, 0x062a, 0x062e, 0x0635, 0x064a, 
+        0x0635, 0x0020, 0x0647, 0x0630, 0x0647, 0x0020, 0x0627, 0x0644, 
+        0x0623, 0x0631, 0x0642, 0x0627, 0x0645, 0x0020, 0x0644, 0x0644, 
+        0x0645, 0x062d, 0x0627, 0x0631, 0x0641, 0x060c, 0x0020, 0x0648, 
+        0x0644, 0x0645, 0x0020, 0x064a, 0x0648, 0x062c, 0x062f, 0x0020, 
+        0x0646, 0x0638, 0x0627, 0x0645, 0x0020, 0x062a, 0x0634, 0x0641, 
+        0x064a, 0x0631, 0x0020, 0x0648, 0x0627, 0x062d, 0x062f, 0x0020, 
+        0x064a, 0x062d, 0x062a, 0x0648, 0x064a, 0x0020, 0x0639, 0x0644, 
+        0x0649, 0x0020, 0x062c, 0x0645, 0x064a, 0x0639, 0x0020, 0x0627, 
+        0x0644, 0x0645, 0x062d, 0x0627, 0x0631, 0x0641, 0x0020, 0x0627, 
+        0x0644, 0x0636, 0x0631, 0x0648, 0x0631, 0x064a, 0x0629, 0x0020, 
+        0x0061, 0x006e, 0x0064, 0x0020, 0x0068, 0x0065, 0x0072, 0x0065, 
+        0x0027, 0x0073, 0x0020, 0x0061, 0x0020, 0x0073, 0x0061, 0x006d, 
+        0x0070, 0x006c, 0x0065, 0x0020, 0x006f, 0x0066, 0x0020, 0x0073, 
+        0x006f, 0x006d, 0x0065, 0x0020, 0x0074, 0x0065, 0x0078, 0x0074, 
+        0x0020, 0x0077, 0x0072, 0x0069, 0x0074, 0x0074, 0x0065, 0x006e, 
+        0x0020, 0x0069, 0x006e, 0x0020, 0x0054, 0x0068, 0x0061, 0x0069, 
+        0x003a, 0x0020, 0x0e1a, 0x0e17, 0x0e17, 0x0e35, 0x0e48, 0x0e51, 
+        0x0e1e, 0x0e32, 0x0e22, 0x0e38, 0x0e44, 0x0e0b, 0x0e42, 0x0e04, 
+        0x0e25, 0x0e19, 0x0e42, 0x0e14, 0x0e42, 0x0e23, 0x0e18, 0x0e35, 
+        0x0e2d, 0x0e32, 0x0e28, 0x0e31, 0x0e22, 0x0e2d, 0x0e22, 0x0e39, 
+        0x0e48, 0x0e17, 0x0e48, 0x0e32, 0x0e21, 0x0e01, 0x0e25, 0x0e32, 
+        0x0e07, 0x0e17, 0x0e38, 0x0e48, 0x0e07, 0x0e43, 0x0e2b, 0x0e0d, 
+        0x0e48, 0x0e43, 0x0e19, 0x0e41, 0x0e04, 0x0e19, 0x0e0b, 0x0e31, 
+        0x0e2a, 0x0e01, 0x0e31, 0x0e1a, 0x0e25, 0x0e38, 0x0e07, 0x0e40, 
+        0x0e2e, 0x0e19, 0x0e23, 0x0e35, 0x0e0a, 0x0e32, 0x0e27, 0x0e44, 
+        0x0e23, 0x0e48, 0x0e41, 0x0e25, 0x0e30, 0x0e1b, 0x0e49, 0x0e32, 
+        0x0e40, 0x0e2d, 0x0e47, 0x0e21, 0x0e20, 0x0e23, 0x0e23, 0x0e22, 
+        0x0e32, 0x0e0a, 0x0e32, 0x0e27, 0x0e44, 0x0e23, 0x0e48, 0x0e1a, 
+        0x0e49, 0x0e32, 0x0e19, 0x0e02, 0x0e2d, 0x0e07, 0x0e1e, 0x0e27, 
+        0x0e01, 0x0e40, 0x0e02, 0x0e32, 0x0e2b, 0x0e25, 0x0e31, 0x0e07, 
+        0x0e40, 0x0e25, 0x0e47, 0x0e01, 0x0e40, 0x0e1e, 0x0e23, 0x0e32, 
+        0x0e30, 0x0e44, 0x0e21, 0x0e49, 0x0e2a, 0x0e23, 0x0e49, 0x0e32, 
+        0x0e07, 0x0e1a, 0x0e49, 0x0e32, 0x0e19, 0x0e15, 0x0e49, 0x0e2d, 
+        0x0e07, 0x0e02, 0x0e19, 0x0e21, 0x0e32, 0x0e14, 0x0e49, 0x0e27, 
+        0x0e22, 0x0e40, 0x0e01, 0x0e27, 0x0e35, 0x0e22, 0x0e19, 0x0e40, 
+        0x0e1b, 0x0e47, 0x0e19, 0x0e23, 0x0e30, 0x0e22, 0x0e30, 0x0e17, 
+        0x0e32, 0x0e07, 0x0e2b, 0x0e25, 0x0e32, 0x0e22, 0x0e44, 0x0e21, 
+        0x0e25, 0x0e4c
+    };
+    le_int32 charCount = LE_ARRAY_SIZE(chars);
+    le_int32 charIndex = 0, lineNumber = 1;
+    const float lineWidth = 600;
+
+    font = new SimpleFontInstance(12, status);
+
+    if (LE_FAILURE(status)) {
+        goto finish;
+    }
+
+    fontRuns.add(font, charCount);
+
+    paragraphLayout = new ParagraphLayout(chars, charCount, &fontRuns, NULL, NULL, NULL, 0, FALSE, status);
+
+    if (LE_FAILURE(status)) {
+        goto close_font;
+    }
+
+    paragraphLayout->reflow();
+    while ((line = paragraphLayout->nextLine(lineWidth)) != NULL) {
+        le_int32 runCount = line->countRuns();
+
+        for(le_int32 run = 0; run < runCount; run += 1) {
+            const ParagraphLayout::VisualRun *visualRun = line->getVisualRun(run);
+            le_int32 glyphCount = visualRun->getGlyphCount();
+            const le_int32 *glyphToCharMap = visualRun->getGlyphToCharMap();
+
+            if (visualRun->getDirection() == UBIDI_RTL) {
+                /*
+                 * For a right to left run, make sure that the character indices
+                 * increase from the right most glyph to the left most glyph. If
+                 * there are any one to many glyph substitutions, we might get several
+                 * glyphs in a row with the same character index.
+                 */
+                for(le_int32 i = glyphCount - 1; i >= 0; i -= 1) {
+                    le_int32 ix = glyphToCharMap[i];
+
+                    if (ix != charIndex) {
+                        if (ix != charIndex - 1) {
+                            log_err("Bad glyph to char index for glyph %d on line %d: expected %d, got %d\n",
+                                i, lineNumber, charIndex, ix);
+                            goto close_paragraph; // once there's one error, we can't count on anything else...
+                        }
+                    } else {
+                        charIndex += 1;
+                    }
+                }
+            } else {
+                /*
+                 * We can't just check the order of the character indices
+                 * for left to right runs because Indic text might have been
+                 * reordered. What we can do is find the minimum and maximum
+                 * character indices in the run and make sure that the minimum
+                 * is equal to charIndex and then advance charIndex to the maximum.
+                 */
+                le_int32 minIndex = 0x7FFFFFFF, maxIndex = -1;
+
+                for(le_int32 i = 0; i < glyphCount; i += 1) {
+                    le_int32 ix = glyphToCharMap[i];
+
+                    if (ix > maxIndex) {
+                        maxIndex = ix;
+                    }
+
+                    if (ix < minIndex) {
+                        minIndex = ix;
+                    }
+                }
+
+                if (minIndex != charIndex) {
+                    log_err("Bad minIndex for run %d on line %d: expected %d, got %d\n",
+                        run, lineNumber, charIndex, minIndex);
+                    goto close_paragraph; // once there's one error, we can't count on anything else...
+                }
+
+                charIndex = maxIndex + 1;
+            }
+        }
+
+        lineNumber += 1;
+    }
+close_paragraph:
+    delete paragraphLayout;
+
+close_font:
+    delete font;
+
+finish:
+    return;
+}
+U_CDECL_END
+
 static void addAllTests(TestNode **root)
 {
-    addTest(root, &ScriptTest,     "api/ScriptTest");
-    addTest(root, &ParamTest,      "api/ParameterTest");
-    addTest(root, &FactoryTest,    "api/FactoryTest");
-    addTest(root, &AccessTest,     "layout/AccessTest");
-    addTest(root, &DataDrivenTest, "layout/DataDrivenTest");
+    addTest(root, &ScriptTest,      "api/ScriptTest");
+    addTest(root, &ParamTest,       "api/ParameterTest");
+    addTest(root, &FactoryTest,     "api/FactoryTest");
+    addTest(root, &AccessTest,      "layout/AccessTest");
+    addTest(root, &DataDrivenTest,  "layout/DataDrivenTest");
+    addTest(root, &GlyphToCharTest, "paragraph/GlyphToCharTest");
 
     addCTests(root);
 }

Modified: trunk/source/test/testdata/calendar.txt
===================================================================
--- trunk/source/test/testdata/calendar.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/test/testdata/calendar.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -1,92 +1,92 @@
-// Copyright (c) 2007 International Business Machines
-// Corporation and others. All Rights Reserved.
-calendar:table(nofallback) {
-    Info {
-        Description { "These are the data driven calendar tests" }
-        LongDescription {   "Data for data driven calendar tests." }
-    }
-    TestData {
-        TestCalendarConversion {
-            Headers { "locale","from","to" }
-            Info {
-                Description { "Test data for calendar conversion :" }
-            }
-            Settings {
-                {
-                    ToCalendar { "en_US at calendar=gregorian" }
-                    Type { "convert_fwd" }
-                },
-                {
-                    ToCalendar { "en_US at calendar=gregorian" }
-                    Type { "convert_rev" }
-                },
-            }
-            //   "0/1/1912/june/4 == gregorian year=1912, ERA=AD, same month, same day 
-            Cases { 
-               {
-                    "en_US at calendar=taiwan",         
-                    "ERA=1,YEAR=1,MONTH=JUNE,DATE=4",  // tw  
-                    "ERA=1,YEAR=1912,MONTH=,DATE="     // greg
-               },
-               {
-                    "en_US at calendar=taiwan",         
-                    "ERA=1,YEAR=3,MONTH=FEBRUARY,DATE=12",  // tw  
-                    "ERA=1,YEAR=1914,MONTH=,DATE="     // greg
-               },
-               {
-                    "en_US at calendar=taiwan",         
-                    "ERA=1,YEAR=96,MONTH=FEBRUARY,DATE=12",  // tw  
-                    "ERA=1,YEAR=2007,MONTH=,DATE="     // greg
-               },
-               // before 1912:
-               // [before minguo]2   1[month] 24[day] -> 1910-1-24 
-               {
-                    "en_US at calendar=taiwan", 
-                    "ERA=0,YEAR=2,MONTH=JANUARY,DATE=24", // tw
-                    "ERA=1,YEAR=1910,MONTH=JANUARY,DATE=24", // greg
-               }
-            }
-        }
-        TestCalendarOperations {
-            Headers { "locale","from","operation","params","to" }
-            Info {
-                Description { "Test data for calendar operation :" }
-            }
-            Settings {
-                {
-                    Type { "ops" }
-                },
-            }
-            Cases { 
-               {
-                    "en_US at calendar=taiwan",         
-                    "ERA=1,YEAR=1,MONTH=JUNE,DATE=4",  // tw  
-                    "roll",
-                    "DATE=1", // date + 1
-                    "ERA=1,YEAR=1,MONTH=JUNE,DATE=5",  // tw  
-               },
-               {
-                    "en_US at calendar=taiwan",         
-                    "ERA=1,YEAR=1,MONTH=JUNE,DATE=4",  // tw  
-                    "add",
-                    "DATE=1", // date + 1
-                    "ERA=1,YEAR=1,MONTH=JUNE,DATE=5",  // tw  
-               },
-               {
-                    "en_US at calendar=taiwan",         
-                    "ERA=1,YEAR=1,MONTH=JUNE,DATE=4",  // tw  
-                    "roll",
-                    "YEAR=1", // date + 1
-                    "ERA=1,YEAR=2,MONTH=JUNE,DATE=4",  // tw  
-               },
-               {
-                    "en_US at calendar=taiwan",         
-                    "ERA=1,YEAR=1,MONTH=JUNE,DATE=4",  // tw  
-                    "add",
-                    "YEAR=1", // date + 1
-                    "ERA=1,YEAR=2,MONTH=JUNE,DATE=4",  // tw  
-               },
-	    }
-        }	          
-    }	    
+// Copyright (c) 2007 International Business Machines
+// Corporation and others. All Rights Reserved.
+calendar:table(nofallback) {
+    Info {
+        Description { "These are the data driven calendar tests" }
+        LongDescription {   "Data for data driven calendar tests." }
+    }
+    TestData {
+        TestCalendarConversion {
+            Headers { "locale","from","to" }
+            Info {
+                Description { "Test data for calendar conversion :" }
+            }
+            Settings {
+                {
+                    ToCalendar { "en_US at calendar=gregorian" }
+                    Type { "convert_fwd" }
+                },
+                {
+                    ToCalendar { "en_US at calendar=gregorian" }
+                    Type { "convert_rev" }
+                },
+            }
+            //   "0/1/1912/june/4 == gregorian year=1912, ERA=AD, same month, same day 
+            Cases { 
+               {
+                    "en_US at calendar=taiwan",         
+                    "ERA=1,YEAR=1,MONTH=JUNE,DATE=4",  // tw  
+                    "ERA=1,YEAR=1912,MONTH=,DATE="     // greg
+               },
+               {
+                    "en_US at calendar=taiwan",         
+                    "ERA=1,YEAR=3,MONTH=FEBRUARY,DATE=12",  // tw  
+                    "ERA=1,YEAR=1914,MONTH=,DATE="     // greg
+               },
+               {
+                    "en_US at calendar=taiwan",         
+                    "ERA=1,YEAR=96,MONTH=FEBRUARY,DATE=12",  // tw  
+                    "ERA=1,YEAR=2007,MONTH=,DATE="     // greg
+               },
+               // before 1912:
+               // [before minguo]2   1[month] 24[day] -> 1910-1-24 
+               {
+                    "en_US at calendar=taiwan", 
+                    "ERA=0,YEAR=2,MONTH=JANUARY,DATE=24", // tw
+                    "ERA=1,YEAR=1910,MONTH=JANUARY,DATE=24", // greg
+               }
+            }
+        }
+        TestCalendarOperations {
+            Headers { "locale","from","operation","params","to" }
+            Info {
+                Description { "Test data for calendar operation :" }
+            }
+            Settings {
+                {
+                    Type { "ops" }
+                },
+            }
+            Cases { 
+               {
+                    "en_US at calendar=taiwan",         
+                    "ERA=1,YEAR=1,MONTH=JUNE,DATE=4",  // tw  
+                    "roll",
+                    "DATE=1", // date + 1
+                    "ERA=1,YEAR=1,MONTH=JUNE,DATE=5",  // tw  
+               },
+               {
+                    "en_US at calendar=taiwan",         
+                    "ERA=1,YEAR=1,MONTH=JUNE,DATE=4",  // tw  
+                    "add",
+                    "DATE=1", // date + 1
+                    "ERA=1,YEAR=1,MONTH=JUNE,DATE=5",  // tw  
+               },
+               {
+                    "en_US at calendar=taiwan",         
+                    "ERA=1,YEAR=1,MONTH=JUNE,DATE=4",  // tw  
+                    "roll",
+                    "YEAR=1", // date + 1
+                    "ERA=1,YEAR=2,MONTH=JUNE,DATE=4",  // tw  
+               },
+               {
+                    "en_US at calendar=taiwan",         
+                    "ERA=1,YEAR=1,MONTH=JUNE,DATE=4",  // tw  
+                    "add",
+                    "YEAR=1", // date + 1
+                    "ERA=1,YEAR=2,MONTH=JUNE,DATE=4",  // tw  
+               },
+	    }
+        }	          
+    }	    
 }
\ No newline at end of file

Modified: trunk/source/test/testdata/format.txt
===================================================================
--- trunk/source/test/testdata/format.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/test/testdata/format.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -1,105 +1,105 @@
-// Copyright (c) 2007 International Business Machines
-// Corporation and others. All Rights Reserved.
-format:table(nofallback) {
-    Info {
-        Description { "These are the data driven format tests" }
-        LongDescription {   "Data for data driven format tests." }
-    }
-    TestData {
-        TestDateFormatBasic {
-            Info {
-                Description { "Test data for format and parse :" }
-            }
-            Settings {
-                // options: 'format', or 'parse'.  One can be omitted if this is a 1 way test.
-                {
-                    Type { "date_format" }
-                },
-                {
-                    Type { "date_parse" }
-                },
-            }
-            Headers { "locale","spec", "date", "str"}
-            // locale: locale including calendar type
-            // spec:   either 'PATTERN=y mm h' etc, or 'DATE=SHORT,TIME=LONG'
-            // date:   either 'MILLIS=####' where #### is an unsigned long (millis), or a calendar spec ERA=0,YEAR=1, etc.. applied to the calendar type specified by the locale
-            // str:   the expected unicode string
-            Cases { 
-               {
-                    "en_US at calendar=gregorian",         
-                    "DATE=SHORT,TIME=SHORT",
-                    "ERA=1,YEAR=2007,MONTH=AUGUST,DATE=8,HOUR_OF_DAY=18,MINUTE=54,SECOND=0",
-                    "8/8/07 6:54 PM"
-               },
-               {
-                    "zh_TW at calendar=taiwan",
-                    "DATE=LONG",
-                    "ERA=1,YEAR=98,MONTH=0,DATE=24",
-                    "民國98年1月24日",
-               },
-               {
-                    //民國前2年1月24日 -> 1910-1-24 
-                    "zh_TW at calendar=taiwan",
-                    "DATE=LONG",
-                    "ERA=0,YEAR=2,MONTH=0,DATE=24",
-                    "民國前2年1月24日",
-               },
-            }
-        }
-        TestFormatRelative {
-            Info {
-                Description { "relative format :" }
-            }
-            Settings {
-                {
-                    Type { "date_format" }
-                },
-            }
-            Headers { "locale","spec", "date", "str"}
-            Cases { 
-               {
-                    "en_US at calendar=gregorian",         
-                    "DATE=RELATIVE_SHORT",
-                    "RELATIVE_MILLIS=86410000", // one day from now
-                    "Tomorrow"
-               },
-               {
-                    "en_US at calendar=gregorian",         
-                    "DATE=RELATIVE_SHORT",
-                    "RELATIVE_MILLIS=0", // one day before now
-                    "Today"
-               },
-               {
-                    "en_US at calendar=gregorian",         
-                    "DATE=RELATIVE_SHORT",
-                    "RELATIVE_MILLIS=-86410000", // one day before now
-                    "Yesterday"
-               },
-               {
-                    "mt_MT at calendar=gregorian",         
-                    "DATE=RELATIVE_SHORT",
-                    "RELATIVE_MILLIS=86410000", // one day from now
-                    "Għada"
-               },
-               {
-                    "mt_MT at calendar=gregorian",         
-                    "DATE=RELATIVE_SHORT",
-                    "RELATIVE_MILLIS=0", // one day before now
-                    "Illum"
-               },
-               {
-                    "mt_MT at calendar=gregorian",         
-                    "DATE=RELATIVE_SHORT",
-                    "RELATIVE_MILLIS=-86410000", // one day before now
-                    "Lbieraħ"
-               },
-               {
-                    "ru",
-                    "DATE=RELATIVE_SHORT",
-                    "RELATIVE_MILLIS=-172810000", // 2 days ago
-                    "Позавчера"
-               },
-            }
-        }
-    }
-}
+// Copyright (c) 2007 International Business Machines
+// Corporation and others. All Rights Reserved.
+format:table(nofallback) {
+    Info {
+        Description { "These are the data driven format tests" }
+        LongDescription {   "Data for data driven format tests." }
+    }
+    TestData {
+        TestDateFormatBasic {
+            Info {
+                Description { "Test data for format and parse :" }
+            }
+            Settings {
+                // options: 'format', or 'parse'.  One can be omitted if this is a 1 way test.
+                {
+                    Type { "date_format" }
+                },
+                {
+                    Type { "date_parse" }
+                },
+            }
+            Headers { "locale","spec", "date", "str"}
+            // locale: locale including calendar type
+            // spec:   either 'PATTERN=y mm h' etc, or 'DATE=SHORT,TIME=LONG'
+            // date:   either 'MILLIS=####' where #### is an unsigned long (millis), or a calendar spec ERA=0,YEAR=1, etc.. applied to the calendar type specified by the locale
+            // str:   the expected unicode string
+            Cases { 
+               {
+                    "en_US at calendar=gregorian",         
+                    "DATE=SHORT,TIME=SHORT",
+                    "ERA=1,YEAR=2007,MONTH=AUGUST,DATE=8,HOUR_OF_DAY=18,MINUTE=54,SECOND=0",
+                    "8/8/07 6:54 PM"
+               },
+               {
+                    "zh_TW at calendar=taiwan",
+                    "DATE=LONG",
+                    "ERA=1,YEAR=98,MONTH=0,DATE=24",
+                    "民國98年1月24日",
+               },
+               {
+                    //民國前2年1月24日 -> 1910-1-24 
+                    "zh_TW at calendar=taiwan",
+                    "DATE=LONG",
+                    "ERA=0,YEAR=2,MONTH=0,DATE=24",
+                    "民國前2年1月24日",
+               },
+            }
+        }
+        TestFormatRelative {
+            Info {
+                Description { "relative format :" }
+            }
+            Settings {
+                {
+                    Type { "date_format" }
+                },
+            }
+            Headers { "locale","spec", "date", "str"}
+            Cases { 
+               {
+                    "en_US at calendar=gregorian",         
+                    "DATE=RELATIVE_SHORT",
+                    "RELATIVE_MILLIS=86410000", // one day from now
+                    "Tomorrow"
+               },
+               {
+                    "en_US at calendar=gregorian",         
+                    "DATE=RELATIVE_SHORT",
+                    "RELATIVE_MILLIS=0", // one day before now
+                    "Today"
+               },
+               {
+                    "en_US at calendar=gregorian",         
+                    "DATE=RELATIVE_SHORT",
+                    "RELATIVE_MILLIS=-86410000", // one day before now
+                    "Yesterday"
+               },
+               {
+                    "mt_MT at calendar=gregorian",         
+                    "DATE=RELATIVE_SHORT",
+                    "RELATIVE_MILLIS=86410000", // one day from now
+                    "Għada"
+               },
+               {
+                    "mt_MT at calendar=gregorian",         
+                    "DATE=RELATIVE_SHORT",
+                    "RELATIVE_MILLIS=0", // one day before now
+                    "Illum"
+               },
+               {
+                    "mt_MT at calendar=gregorian",         
+                    "DATE=RELATIVE_SHORT",
+                    "RELATIVE_MILLIS=-86410000", // one day before now
+                    "Lbieraħ"
+               },
+               {
+                    "ru",
+                    "DATE=RELATIVE_SHORT",
+                    "RELATIVE_MILLIS=-172810000", // 2 days ago
+                    "Позавчера"
+               },
+            }
+        }
+    }
+}

Modified: trunk/source/test/testdata/structLocale.txt
===================================================================
--- trunk/source/test/testdata/structLocale.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/test/testdata/structLocale.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -72,6 +72,7 @@
         BH{""}
         BI{""}
         BJ{""}
+        BL{""}
         BM{""}
         BN{""}
         BO{""}
@@ -185,6 +186,7 @@
         MC{""}
         MD{""}
         ME{""}
+        MF{""}
         MG{""}
         MH{""}
         MK{""}
@@ -231,7 +233,6 @@
         PW{""}
         PY{""}
         QA{""}
-        QE{""}
         QO{""}
         QU{""}
         RE{""}
@@ -253,7 +254,6 @@
         SM{""}
         SN{""}
         SO{""}
-        SP{""}
         SR{""}
         ST{""}
         SV{""}
@@ -1897,6 +1897,7 @@
         ypk{""}
         za{""}
         zap{""}
+        zbl{""}
         zen{""}
         zh{""}
         zh_Hans{""}
@@ -1938,6 +1939,7 @@
     Scripts{
         Arab{""}
         Armn{""}
+        Avst{""}
         Bali{""}
         Batk{""}
         Beng{""}
@@ -2001,6 +2003,7 @@
         Lyci{""}
         Lydi{""}
         Mand{""}
+        Mani{""}
         Maya{""}
         Mero{""}
         Mlym{""}
@@ -2016,12 +2019,14 @@
         Osma{""}
         Perm{""}
         Phag{""}
+        Phlv{""}
         Phnx{""}
         Plrd{""}
         Qaai{""}
         Rjng{""}
         Roro{""}
         Runr{""}
+        Samr{""}
         Sara{""}
         Saur{""}
         Sgnw{""}
@@ -2080,6 +2085,7 @@
         1606NICT{""}
         1694ACAD{""}
         1901{""}
+        1994{""}
         1996{""}
         AREVELA{""}
         AREVMDA{""}
@@ -2091,6 +2097,7 @@
         GAULISH{""}
         GUOYU{""}
         HAKKA{""}
+        LIPAW{""}
         LOJBAN{""}
         MONOTON{""}
         NEDIS{""}
@@ -2102,6 +2109,7 @@
         REVISED{""}
         ROZAJ{""}
         SAAHO{""}
+        SCOTLAND{""}
         SCOUSE{""}
         SOLBA{""}
         TARASK{""}

Modified: trunk/source/test/testdata/tstfiles.mk
===================================================================
--- trunk/source/test/testdata/tstfiles.mk	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/test/testdata/tstfiles.mk	2008-03-24 11:52:37 UTC (rev 144)
@@ -1,10 +1,10 @@
-# Copyright (C) 2007, International Business Machines Corporation and others.  All Rights Reserved.
-#
-# TEST_RES_SOURCE defines data driven tests and other resource files to be included with 
-# the testdata package. For ordinary resource bundles, they only need to be referenced here.
-#
-# Not everything has been moved to this file yet, as this is a new facility.
-#
-
-TEST_RES_SOURCE=DataDrivenCollationTest.txt calendar.txt format.txt
-
+# Copyright (C) 2007, International Business Machines Corporation and others.  All Rights Reserved.
+#
+# TEST_RES_SOURCE defines data driven tests and other resource files to be included with 
+# the testdata package. For ordinary resource bundles, they only need to be referenced here.
+#
+# Not everything has been moved to this file yet, as this is a new facility.
+#
+
+TEST_RES_SOURCE=DataDrivenCollationTest.txt calendar.txt format.txt
+

Modified: trunk/source/tools/genbrk/genbrk.1.in
===================================================================
--- trunk/source/tools/genbrk/genbrk.1.in	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/tools/genbrk/genbrk.1.in	2008-03-24 11:52:37 UTC (rev 144)
@@ -2,7 +2,7 @@
 .\"
 .\" genbrk.1: manual page for the genbrk utility
 .\"
-.\" Copyright (C) 2005-2006 IBM, Inc. and others.
+.\" Copyright (C) 2005-2006 International Business Machines Corporation and others
 .\"
 .TH GENBRK 1 "2 December 2005" "ICU MANPAGE" "ICU @VERSION@ Manual"
 .SH NAME
@@ -106,7 +106,7 @@
 .SH VERSION
 1.0
 .SH COPYRIGHT
-Copyright (C) 2005 IBM, Inc. and others.
+Copyright (C) 2005 International Business Machines Corporation and others
 .SH SEE ALSO
-.BR http://icu.sourceforge.net/userguide/boundaryAnalysis.html
+.BR http://www.icu-project.org/userguide/boundaryAnalysis.html
 

Modified: trunk/source/tools/genctd/genctd.1.in
===================================================================
--- trunk/source/tools/genctd/genctd.1.in	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/tools/genctd/genctd.1.in	2008-03-24 11:52:37 UTC (rev 144)
@@ -2,7 +2,7 @@
 .\"
 .\" genctd.1: manual page for the genctd utility
 .\"
-.\" Copyright (C) 2006 IBM, Inc. and others.
+.\" Copyright (C) 2006-2007 International Business Machines Corporation and others
 .\"
 .TH GENCTD 1 "8 March 2006" "ICU MANPAGE" "ICU @VERSION@ Manual"
 .SH NAME
@@ -105,7 +105,7 @@
 .SH VERSION
 1.0
 .SH COPYRIGHT
-Copyright (C) 2006 IBM, Inc. and others.
+Copyright (C) 2006 International Business Machines Corporation and others
 .SH SEE ALSO
-.BR http://icu.sourceforge.net/userguide/boundaryAnalysis.html
+.BR http://www.icu-project.org/userguide/boundaryAnalysis.html
 

Modified: trunk/source/tools/genuca/genuca.cpp
===================================================================
--- trunk/source/tools/genuca/genuca.cpp	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/tools/genuca/genuca.cpp	2008-03-24 11:52:37 UTC (rev 144)
@@ -986,7 +986,7 @@
     /* first set up constants for implicit calculation */
     uprv_uca_initImplicitConstants(consts.UCA_PRIMARY_IMPLICIT_MIN, consts.UCA_PRIMARY_IMPLICIT_MAX, status);
     /* do the closure */
-    int32_t noOfClosures = uprv_uca_canonicalClosure(t, status);
+    int32_t noOfClosures = uprv_uca_canonicalClosure(t, NULL, status);
     if(noOfClosures != 0) {
       fprintf(stderr, "Warning: %i canonical closures occured!\n", (int)noOfClosures);
     }

Modified: trunk/source/tools/tzcode/readme.txt
===================================================================
--- trunk/source/tools/tzcode/readme.txt	2007-09-26 23:01:17 UTC (rev 143)
+++ trunk/source/tools/tzcode/readme.txt	2008-03-24 11:52:37 UTC (rev 144)
@@ -23,7 +23,7 @@
 
 References:
 
-ICU4C:  http://icu.sourceforge.net/
+ICU4C:  http://www.icu-project.org/
 Olson:  ftp://elsie.nci.nih.gov/pub/
 
 ----------------------------------------------------------------------




More information about the sword-cvs mailing list