Merge "Fix replacement time zone ID generation logic" am: 34c79e8076 am: 4be6b86335 am: 48fec76b86

Original change: https://android-review.googlesource.com/c/platform/system/timezone/+/1477258

Change-Id: Ia052655c445876dc0984897752fc664e1c1db2da
diff --git a/input_tools/android/tzlookup_generator/src/main/java/com/android/libcore/timezone/tzlookup/zonetree/CountryZoneTree.java b/input_tools/android/tzlookup_generator/src/main/java/com/android/libcore/timezone/tzlookup/zonetree/CountryZoneTree.java
index 88c9f21..43ace04 100644
--- a/input_tools/android/tzlookup_generator/src/main/java/com/android/libcore/timezone/tzlookup/zonetree/CountryZoneTree.java
+++ b/input_tools/android/tzlookup_generator/src/main/java/com/android/libcore/timezone/tzlookup/zonetree/CountryZoneTree.java
@@ -31,6 +31,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 import static java.util.stream.Collectors.toList;
 
@@ -510,7 +511,7 @@
                 }
 
                 Instant endInstant = node.getEndInstant();
-                String replacementTimeZoneId = findReplacementTimeZoneId(node);
+                String replacementTimeZoneId = getReplacementTimeZoneIdOrNull(node);
                 if (!node.isLeaf()) {
                     ZoneInfo primaryZone = node.getPrimaryZoneInfo();
                     addZoneEntryIfMissing(endInstant, replacementTimeZoneId, primaryZone);
@@ -525,22 +526,34 @@
             }
 
             /**
-             * Find the time zone that the node ultimately "merges" into, i.e. the one it is
-             * effectively replaced by.
+             * Takes a {@link ZoneNode} and if the parent node has a different primary zone ID, then
+             * this method returns that zone ID. {@code null} is returned otherwise.
              */
-            private String findReplacementTimeZoneId(ZoneNode node) {
-                if (node.getParent().isRoot()) {
+            private String getReplacementTimeZoneIdOrNull(ZoneNode node) {
+                if (node.isRoot()) {
+                    // There is no parent node, so there can be no replacement ID.
                     return null;
                 }
-                do {
-                    node = node.getParent();
-                } while (!node.getParent().isRoot());
-                return node.primaryZoneInfo.getZoneId();
+
+                String zoneId = node.primaryZoneInfo.getZoneId();
+                String replacementId = node.getParent().primaryZoneInfo.getZoneId();
+                if (Objects.equals(zoneId, replacementId)) {
+                    // Often, the parent node will have the same primary zone ID. A zone ID cannot
+                    // replace itself. Since we're traversing the tree "preorder" this is fine - if
+                    // there is a replacement later in time it will already have been found.
+                    return null;
+                }
+                return replacementId;
             }
 
             private void addZoneEntryIfMissing(
                     Instant endInstant, String replacementTimeZoneId, ZoneInfo zoneInfo) {
                 String zoneId = zoneInfo.getZoneId();
+
+                if (Objects.equals(zoneId, replacementTimeZoneId)) {
+                    throw new IllegalStateException(zoneId + " cannot replace itself. Cycle!");
+                }
+
                 if (!notAfterCutOff.isAfter(endInstant)) {
                     // notAfterCutOff <= endInstant
                     endInstant = null;
diff --git a/input_tools/android/tzlookup_generator/src/test/java/com/android/libcore/timezone/tzlookup/TzLookupGeneratorTest.java b/input_tools/android/tzlookup_generator/src/test/java/com/android/libcore/timezone/tzlookup/TzLookupGeneratorTest.java
index a3d4976..75c5ae9 100644
--- a/input_tools/android/tzlookup_generator/src/test/java/com/android/libcore/timezone/tzlookup/TzLookupGeneratorTest.java
+++ b/input_tools/android/tzlookup_generator/src/test/java/com/android/libcore/timezone/tzlookup/TzLookupGeneratorTest.java
@@ -645,26 +645,26 @@
                 + "<id notafter=\"1130652000000\" repl=\"America/New_York\">America/Indiana/Indianapolis</id>\n"
                 + "<id notafter=\"1194159600000\" repl=\"America/New_York\">America/Indiana/Vincennes</id>\n"
                 + "<id notafter=\"1173600000000\" repl=\"America/New_York\">America/Indiana/Winamac</id>\n"
-                + "<id notafter=\"183535200000\" repl=\"America/New_York\">America/Indiana/Marengo</id>\n"
-                + "<id notafter=\"247042800000\" repl=\"America/New_York\">America/Indiana/Petersburg</id>\n"
-                + "<id notafter=\"89186400000\" repl=\"America/New_York\">America/Indiana/Vevay</id>\n"
+                + "<id notafter=\"183535200000\" repl=\"America/Indiana/Indianapolis\">America/Indiana/Marengo</id>\n"
+                + "<id notafter=\"247042800000\" repl=\"America/Indiana/Vincennes\">America/Indiana/Petersburg</id>\n"
+                + "<id notafter=\"89186400000\" repl=\"America/Indiana/Indianapolis\">America/Indiana/Vevay</id>\n"
                 + "<id>America/Chicago</id>\n"
-                + "<id notafter=\"688546800000\" repl=\"America/Chicago\">America/Indiana/Knox</id>\n"
+                + "<id notafter=\"688546800000\" repl=\"America/Indiana/Tell_City\">America/Indiana/Knox</id>\n"
                 + "<id notafter=\"104918400000\" repl=\"America/Chicago\">America/Menominee</id>\n"
                 + "<id notafter=\"720000000000\" repl=\"America/Chicago\">America/North_Dakota/Center</id>\n"
                 + "<id notafter=\"1067155200000\" repl=\"America/Chicago\">America/North_Dakota/New_Salem</id>\n"
                 + "<id notafter=\"1143964800000\" repl=\"America/Chicago\">America/Indiana/Tell_City</id>\n"
                 + "<id notafter=\"1289116800000\" repl=\"America/Chicago\">America/North_Dakota/Beulah</id>\n"
                 + "<id>America/Denver</id>\n"
+                + "<id notafter=\"129114000000\" repl=\"America/Denver\">America/Boise</id>\n"
                 + "<id>America/Phoenix</id>\n"
-                + "<id notafter=\"129114000000\" repl=\"America/Phoenix\">America/Boise</id>\n"
                 + "<id>America/Los_Angeles</id>\n"
                 + "<id>America/Anchorage</id>\n"
                 + "<id notafter=\"436359600000\" repl=\"America/Anchorage\">America/Juneau</id>\n"
-                + "<id notafter=\"436356000000\" repl=\"America/Anchorage\">America/Yakutat</id>\n"
+                + "<id notafter=\"436356000000\" repl=\"America/Juneau\">America/Yakutat</id>\n"
                 + "<id notafter=\"436363200000\" repl=\"America/Anchorage\">America/Nome</id>\n"
                 + "<id notafter=\"1547978400000\" repl=\"America/Anchorage\">America/Metlakatla</id>\n"
-                + "<id notafter=\"341402400000\" repl=\"America/Anchorage\">America/Sitka</id>\n"
+                + "<id notafter=\"341402400000\" repl=\"America/Juneau\">America/Sitka</id>\n"
                 + "<id>Pacific/Honolulu</id>\n"
                 + "<id>America/Adak</id>\n";
         String[] expectedTzLookupXmlLines = expectedTzLookupOutput.split("\\n");
@@ -693,21 +693,21 @@
         addReplacement(b, 1130652000000L, "America/New_York", "America/Indiana/Indianapolis");
         addReplacement(b, 1194159600000L, "America/New_York", "America/Indiana/Vincennes");
         addReplacement(b, 1173600000000L, "America/New_York", "America/Indiana/Winamac");
-        addReplacement(b, 183535200000L, "America/New_York", "America/Indiana/Marengo");
-        addReplacement(b, 247042800000L, "America/New_York", "America/Indiana/Petersburg");
-        addReplacement(b, 89186400000L, "America/New_York", "America/Indiana/Vevay");
-        addReplacement(b, 688546800000L, "America/Chicago", "America/Indiana/Knox");
+        addReplacement(b, 183535200000L, "America/Indiana/Indianapolis", "America/Indiana/Marengo");
+        addReplacement(b, 247042800000L, "America/Indiana/Vincennes", "America/Indiana/Petersburg");
+        addReplacement(b, 89186400000L, "America/Indiana/Indianapolis", "America/Indiana/Vevay");
+        addReplacement(b, 688546800000L, "America/Indiana/Tell_City", "America/Indiana/Knox");
         addReplacement(b, 104918400000L, "America/Chicago", "America/Menominee");
         addReplacement(b, 720000000000L, "America/Chicago", "America/North_Dakota/Center");
         addReplacement(b, 1067155200000L, "America/Chicago", "America/North_Dakota/New_Salem");
         addReplacement(b, 1143964800000L, "America/Chicago", "America/Indiana/Tell_City");
         addReplacement(b, 1289116800000L, "America/Chicago", "America/North_Dakota/Beulah");
-        addReplacement(b, 129114000000L, "America/Phoenix", "America/Boise");
+        addReplacement(b, 129114000000L, "America/Denver", "America/Boise");
         addReplacement(b, 436359600000L, "America/Anchorage", "America/Juneau");
-        addReplacement(b, 436356000000L, "America/Anchorage", "America/Yakutat");
+        addReplacement(b, 436356000000L, "America/Juneau", "America/Yakutat");
         addReplacement(b, 436363200000L, "America/Anchorage", "America/Nome");
         addReplacement(b, 1547978400000L, "America/Anchorage", "America/Metlakatla");
-        addReplacement(b, 341402400000L, "America/Anchorage", "America/Sitka");;
+        addReplacement(b, 341402400000L, "America/Juneau", "America/Sitka");;
 
         tzIdsBuilder.addCountryMappings(b);
         assertEquals(tzIdsBuilder.build(), outputData.timeZoneIds);
diff --git a/input_tools/android/tzlookup_generator/src/test/java/com/android/libcore/timezone/tzlookup/zonetree/CountryZoneTreeTest.java b/input_tools/android/tzlookup_generator/src/test/java/com/android/libcore/timezone/tzlookup/zonetree/CountryZoneTreeTest.java
index 3986215..f3ff299 100644
--- a/input_tools/android/tzlookup_generator/src/test/java/com/android/libcore/timezone/tzlookup/zonetree/CountryZoneTreeTest.java
+++ b/input_tools/android/tzlookup_generator/src/test/java/com/android/libcore/timezone/tzlookup/zonetree/CountryZoneTreeTest.java
@@ -108,6 +108,8 @@
                 Instant.ofEpochSecond(338950800); /* 1980-09-28T01:00:00Z */
         assertEquals(expectedNotUsedAfterInstant,
                 countryZoneUsage.getNotUsedAfterInstant("Europe/Busingen"));
+        assertEquals("Europe/Berlin",
+                countryZoneUsage.getNotUsedReplacementId("Europe/Busingen"));
     }
 
     @Test
@@ -154,7 +156,11 @@
                 Instant.ofEpochSecond(762883200); /* 1994-03-05T16:00:00Z */
         assertEquals(expectedNotUsedAfterInstant,
                 countryZoneUsage.getNotUsedAfterInstant("Australia/Lindeman"));
+        assertEquals("Australia/Brisbane",
+                countryZoneUsage.getNotUsedReplacementId("Australia/Lindeman"));
+
         assertNull(countryZoneUsage.getNotUsedAfterInstant("Australia/Brisbane"));
+        assertNull(countryZoneUsage.getNotUsedReplacementId("Australia/Brisbane"));
     }
 
     private static Country parseCountry(String text) throws Exception {
diff --git a/output_data/android/tzids.prototxt b/output_data/android/tzids.prototxt
index 4f082bf..9030977 100644
--- a/output_data/android/tzids.prototxt
+++ b/output_data/android/tzids.prototxt
@@ -94,37 +94,37 @@
   }
   timeZoneReplacements {
     replacedId: "America/Argentina/Salta"
-    replacementId: "America/Argentina/Buenos_Aires"
+    replacementId: "America/Argentina/Mendoza"
     fromMillis: 1096171200000
   }
   timeZoneReplacements {
     replacedId: "America/Argentina/San_Juan"
-    replacementId: "America/Argentina/Buenos_Aires"
+    replacementId: "America/Argentina/Salta"
     fromMillis: 1090728000000
   }
   timeZoneReplacements {
     replacedId: "America/Argentina/Jujuy"
-    replacementId: "America/Argentina/Buenos_Aires"
+    replacementId: "America/Argentina/Salta"
     fromMillis: 687931200000
   }
   timeZoneReplacements {
     replacedId: "America/Argentina/Catamarca"
-    replacementId: "America/Argentina/Buenos_Aires"
+    replacementId: "America/Argentina/Salta"
     fromMillis: 1087704000000
   }
   timeZoneReplacements {
     replacedId: "America/Argentina/La_Rioja"
-    replacementId: "America/Argentina/Buenos_Aires"
+    replacementId: "America/Argentina/Catamarca"
     fromMillis: 687931200000
   }
   timeZoneReplacements {
     replacedId: "America/Argentina/Rio_Gallegos"
-    replacementId: "America/Argentina/Buenos_Aires"
+    replacementId: "America/Argentina/La_Rioja"
     fromMillis: 673588800000
   }
   timeZoneReplacements {
     replacedId: "America/Argentina/Ushuaia"
-    replacementId: "America/Argentina/Buenos_Aires"
+    replacementId: "America/Argentina/Salta"
     fromMillis: 1087704000000
   }
 }
@@ -209,7 +209,7 @@
   }
   timeZoneReplacements {
     replacedId: "Australia/Currie"
-    replacementId: "Australia/Sydney"
+    replacementId: "Australia/Hobart"
     fromMillis: 37728000000
   }
   timeZoneReplacements {
@@ -333,32 +333,32 @@
   }
   timeZoneReplacements {
     replacedId: "America/Santarem"
-    replacementId: "America/Sao_Paulo"
+    replacementId: "America/Recife"
     fromMillis: 1214280000000
   }
   timeZoneReplacements {
     replacedId: "America/Recife"
-    replacementId: "America/Sao_Paulo"
+    replacementId: "America/Bahia"
     fromMillis: 1330221600000
   }
   timeZoneReplacements {
     replacedId: "America/Fortaleza"
-    replacementId: "America/Sao_Paulo"
+    replacementId: "America/Recife"
     fromMillis: 972180000000
   }
   timeZoneReplacements {
     replacedId: "America/Belem"
-    replacementId: "America/Sao_Paulo"
+    replacementId: "America/Recife"
     fromMillis: 1013911200000
   }
   timeZoneReplacements {
     replacedId: "America/Maceio"
-    replacementId: "America/Sao_Paulo"
+    replacementId: "America/Fortaleza"
     fromMillis: 824004000000
   }
   timeZoneReplacements {
     replacedId: "America/Araguaina"
-    replacementId: "America/Sao_Paulo"
+    replacementId: "America/Bahia"
     fromMillis: 1361066400000
   }
   timeZoneReplacements {
@@ -368,7 +368,7 @@
   }
   timeZoneReplacements {
     replacedId: "America/Campo_Grande"
-    replacementId: "America/Manaus"
+    replacementId: "America/Cuiaba"
     fromMillis: 1076814000000
   }
   timeZoneReplacements {
@@ -490,17 +490,17 @@
   }
   timeZoneReplacements {
     replacedId: "America/Nipigon"
-    replacementId: "America/Toronto"
+    replacementId: "America/Thunder_Bay"
     fromMillis: 89186400000
   }
   timeZoneReplacements {
     replacedId: "America/Pangnirtung"
-    replacementId: "America/Toronto"
+    replacementId: "America/Iqaluit"
     fromMillis: 796806000000
   }
   timeZoneReplacements {
     replacedId: "America/Swift_Current"
-    replacementId: "America/Winnipeg"
+    replacementId: "America/Regina"
     fromMillis: 73472400000
   }
   timeZoneReplacements {
@@ -510,7 +510,7 @@
   }
   timeZoneReplacements {
     replacedId: "America/Rainy_River"
-    replacementId: "America/Winnipeg"
+    replacementId: "America/Rankin_Inlet"
     fromMillis: 986112000000
   }
   timeZoneReplacements {
@@ -525,22 +525,22 @@
   }
   timeZoneReplacements {
     replacedId: "America/Dawson_Creek"
-    replacementId: "America/Edmonton"
+    replacementId: "America/Whitehorse"
     fromMillis: 1604214000000
   }
   timeZoneReplacements {
     replacedId: "America/Creston"
-    replacementId: "America/Edmonton"
+    replacementId: "America/Dawson_Creek"
     fromMillis: 84013200000
   }
   timeZoneReplacements {
     replacedId: "America/Fort_Nelson"
-    replacementId: "America/Edmonton"
+    replacementId: "America/Dawson_Creek"
     fromMillis: 1425808800000
   }
   timeZoneReplacements {
     replacedId: "America/Inuvik"
-    replacementId: "America/Edmonton"
+    replacementId: "America/Yellowknife"
     fromMillis: 294228000000
   }
   timeZoneReplacements {
@@ -550,7 +550,7 @@
   }
   timeZoneReplacements {
     replacedId: "America/Dawson"
-    replacementId: "America/Edmonton"
+    replacementId: "America/Whitehorse"
     fromMillis: 120646800000
   }
 }
@@ -1497,7 +1497,7 @@
   }
   timeZoneReplacements {
     replacedId: "Asia/Khandyga"
-    replacementId: "Asia/Chita"
+    replacementId: "Asia/Yakutsk"
     fromMillis: 1315832400000
   }
   timeZoneReplacements {
@@ -1517,7 +1517,7 @@
   }
   timeZoneReplacements {
     replacedId: "Europe/Astrakhan"
-    replacementId: "Europe/Saratov"
+    replacementId: "Europe/Ulyanovsk"
     fromMillis: 701823600000
   }
 }
@@ -1704,7 +1704,7 @@
   }
   timeZoneReplacements {
     replacedId: "Europe/Uzhgorod"
-    replacementId: "Europe/Kiev"
+    replacementId: "Europe/Zaporozhye"
     fromMillis: 686091600000
   }
 }
@@ -1830,7 +1830,7 @@
   }
   timeZoneReplacements {
     replacedId: "America/Indiana/Petersburg"
-    replacementId: "America/New_York"
+    replacementId: "America/Indiana/Vincennes"
     fromMillis: 247042800000
   }
   timeZoneReplacements {
@@ -1840,12 +1840,12 @@
   }
   timeZoneReplacements {
     replacedId: "America/Indiana/Vevay"
-    replacementId: "America/New_York"
+    replacementId: "America/Indiana/Indianapolis"
     fromMillis: 89186400000
   }
   timeZoneReplacements {
     replacedId: "America/Indiana/Marengo"
-    replacementId: "America/New_York"
+    replacementId: "America/Indiana/Indianapolis"
     fromMillis: 183535200000
   }
   timeZoneReplacements {
@@ -1860,7 +1860,7 @@
   }
   timeZoneReplacements {
     replacedId: "America/Indiana/Knox"
-    replacementId: "America/Chicago"
+    replacementId: "America/Indiana/Tell_City"
     fromMillis: 688546800000
   }
   timeZoneReplacements {
@@ -1880,7 +1880,7 @@
   }
   timeZoneReplacements {
     replacedId: "America/Boise"
-    replacementId: "America/Phoenix"
+    replacementId: "America/Denver"
     fromMillis: 129114000000
   }
   timeZoneReplacements {
@@ -1890,7 +1890,7 @@
   }
   timeZoneReplacements {
     replacedId: "America/Sitka"
-    replacementId: "America/Anchorage"
+    replacementId: "America/Juneau"
     fromMillis: 341402400000
   }
   timeZoneReplacements {
@@ -1905,7 +1905,7 @@
   }
   timeZoneReplacements {
     replacedId: "America/Yakutat"
-    replacementId: "America/Anchorage"
+    replacementId: "America/Juneau"
     fromMillis: 436356000000
   }
 }
diff --git a/output_data/android/tzlookup.xml b/output_data/android/tzlookup.xml
index a3e15b7..a41aee4 100644
--- a/output_data/android/tzlookup.xml
+++ b/output_data/android/tzlookup.xml
@@ -45,13 +45,13 @@
    <id notafter="687931200000" repl="America/Argentina/Buenos_Aires" alts="America/Cordoba,America/Rosario">America/Argentina/Cordoba</id>
    <id notafter="1237082400000" repl="America/Argentina/Buenos_Aires" alts="America/Mendoza">America/Argentina/Mendoza</id>
    <id notafter="1087099200000" repl="America/Argentina/Buenos_Aires">America/Argentina/Tucuman</id>
-   <id notafter="1096171200000" repl="America/Argentina/Buenos_Aires">America/Argentina/Salta</id>
-   <id notafter="1090728000000" repl="America/Argentina/Buenos_Aires">America/Argentina/San_Juan</id>
-   <id notafter="687931200000" repl="America/Argentina/Buenos_Aires" alts="America/Jujuy">America/Argentina/Jujuy</id>
-   <id notafter="1087704000000" repl="America/Argentina/Buenos_Aires" alts="America/Argentina/ComodRivadavia,America/Catamarca">America/Argentina/Catamarca</id>
-   <id notafter="687931200000" repl="America/Argentina/Buenos_Aires">America/Argentina/La_Rioja</id>
-   <id notafter="673588800000" repl="America/Argentina/Buenos_Aires">America/Argentina/Rio_Gallegos</id>
-   <id notafter="1087704000000" repl="America/Argentina/Buenos_Aires">America/Argentina/Ushuaia</id>
+   <id notafter="1096171200000" repl="America/Argentina/Mendoza">America/Argentina/Salta</id>
+   <id notafter="1090728000000" repl="America/Argentina/Salta">America/Argentina/San_Juan</id>
+   <id notafter="687931200000" repl="America/Argentina/Salta" alts="America/Jujuy">America/Argentina/Jujuy</id>
+   <id notafter="1087704000000" repl="America/Argentina/Salta" alts="America/Argentina/ComodRivadavia,America/Catamarca">America/Argentina/Catamarca</id>
+   <id notafter="687931200000" repl="America/Argentina/Catamarca">America/Argentina/La_Rioja</id>
+   <id notafter="673588800000" repl="America/Argentina/La_Rioja">America/Argentina/Rio_Gallegos</id>
+   <id notafter="1087704000000" repl="America/Argentina/Salta">America/Argentina/Ushuaia</id>
    <id>America/Argentina/San_Luis</id>
   </country>
   <country code="as" default="Pacific/Pago_Pago" everutc="n">
@@ -64,7 +64,7 @@
    <id alts="Australia/ACT,Australia/Canberra,Australia/NSW">Australia/Sydney</id>
    <id notafter="796147200000" repl="Australia/Sydney" alts="Australia/Victoria">Australia/Melbourne</id>
    <id notafter="1193500800000" repl="Australia/Sydney" alts="Australia/Tasmania">Australia/Hobart</id>
-   <id notafter="37728000000" repl="Australia/Sydney">Australia/Currie</id>
+   <id notafter="37728000000" repl="Australia/Hobart">Australia/Currie</id>
    <id alts="Australia/Queensland">Australia/Brisbane</id>
    <id notafter="762883200000" repl="Australia/Brisbane">Australia/Lindeman</id>
    <id notafter="1286035200000" repl="Australia/Sydney">Antarctica/Macquarie</id>
@@ -130,15 +130,15 @@
    <id alts="Brazil/DeNoronha">America/Noronha</id>
    <id alts="Brazil/East">America/Sao_Paulo</id>
    <id notafter="1550368800000" repl="America/Sao_Paulo">America/Bahia</id>
-   <id notafter="1214280000000" repl="America/Sao_Paulo">America/Santarem</id>
-   <id notafter="1330221600000" repl="America/Sao_Paulo">America/Recife</id>
-   <id notafter="972180000000" repl="America/Sao_Paulo">America/Fortaleza</id>
-   <id notafter="1013911200000" repl="America/Sao_Paulo">America/Belem</id>
-   <id notafter="824004000000" repl="America/Sao_Paulo">America/Maceio</id>
-   <id notafter="1361066400000" repl="America/Sao_Paulo">America/Araguaina</id>
+   <id notafter="1214280000000" repl="America/Recife">America/Santarem</id>
+   <id notafter="1330221600000" repl="America/Bahia">America/Recife</id>
+   <id notafter="972180000000" repl="America/Recife">America/Fortaleza</id>
+   <id notafter="1013911200000" repl="America/Recife">America/Belem</id>
+   <id notafter="824004000000" repl="America/Fortaleza">America/Maceio</id>
+   <id notafter="1361066400000" repl="America/Bahia">America/Araguaina</id>
    <id alts="Brazil/West">America/Manaus</id>
    <id notafter="1550372400000" repl="America/Manaus">America/Cuiaba</id>
-   <id notafter="1076814000000" repl="America/Manaus">America/Campo_Grande</id>
+   <id notafter="1076814000000" repl="America/Cuiaba">America/Campo_Grande</id>
    <id notafter="761713200000" repl="America/Manaus">America/Porto_Velho</id>
    <id notafter="971578800000" repl="America/Manaus">America/Boa_Vista</id>
    <id alts="America/Porto_Acre,Brazil/Acre">America/Rio_Branco</id>
@@ -172,21 +172,21 @@
    <id>America/Blanc-Sablon</id>
    <id notafter="120636000000" repl="America/Toronto">America/Thunder_Bay</id>
    <id notafter="972802800000" repl="America/Toronto">America/Iqaluit</id>
-   <id notafter="89186400000" repl="America/Toronto">America/Nipigon</id>
-   <id notafter="796806000000" repl="America/Toronto">America/Pangnirtung</id>
+   <id notafter="89186400000" repl="America/Thunder_Bay">America/Nipigon</id>
+   <id notafter="796806000000" repl="America/Iqaluit">America/Pangnirtung</id>
    <id alts="America/Coral_Harbour">America/Atikokan</id>
    <id alts="Canada/Saskatchewan">America/Regina</id>
-   <id notafter="73472400000" repl="America/Winnipeg">America/Swift_Current</id>
+   <id notafter="73472400000" repl="America/Regina">America/Swift_Current</id>
    <id notafter="1130659200000" repl="America/Winnipeg">America/Rankin_Inlet</id>
-   <id notafter="986112000000" repl="America/Winnipeg">America/Rainy_River</id>
+   <id notafter="986112000000" repl="America/Rankin_Inlet">America/Rainy_River</id>
    <id notafter="1173600000000" repl="America/Winnipeg">America/Resolute</id>
    <id notafter="309945600000" repl="America/Edmonton">America/Yellowknife</id>
-   <id notafter="1604214000000" repl="America/Edmonton">America/Dawson_Creek</id>
-   <id notafter="84013200000" repl="America/Edmonton">America/Creston</id>
-   <id notafter="1425808800000" repl="America/Edmonton">America/Fort_Nelson</id>
-   <id notafter="294228000000" repl="America/Edmonton">America/Inuvik</id>
+   <id notafter="1604214000000" repl="America/Whitehorse">America/Dawson_Creek</id>
+   <id notafter="84013200000" repl="America/Dawson_Creek">America/Creston</id>
+   <id notafter="1425808800000" repl="America/Dawson_Creek">America/Fort_Nelson</id>
+   <id notafter="294228000000" repl="America/Yellowknife">America/Inuvik</id>
    <id notafter="986115600000" repl="America/Edmonton">America/Cambridge_Bay</id>
-   <id notafter="120646800000" repl="America/Edmonton">America/Dawson</id>
+   <id notafter="120646800000" repl="America/Whitehorse">America/Dawson</id>
    <id alts="Canada/Yukon">America/Whitehorse</id>
   </country>
   <country code="cc" default="Indian/Cocos" everutc="n">
@@ -698,7 +698,7 @@
    <id notafter="1315828800000" repl="Asia/Vladivostok">Asia/Ust-Nera</id>
    <id>Asia/Chita</id>
    <id notafter="1459015200000" repl="Asia/Chita">Asia/Yakutsk</id>
-   <id notafter="1315832400000" repl="Asia/Chita">Asia/Khandyga</id>
+   <id notafter="1315832400000" repl="Asia/Yakutsk">Asia/Khandyga</id>
    <id>Asia/Irkutsk</id>
    <id>Asia/Krasnoyarsk</id>
    <id notafter="1459022400000" repl="Asia/Krasnoyarsk">Asia/Novokuznetsk</id>
@@ -710,7 +710,7 @@
    <id>Europe/Samara</id>
    <id>Europe/Saratov</id>
    <id notafter="1480806000000" repl="Europe/Saratov">Europe/Ulyanovsk</id>
-   <id notafter="701823600000" repl="Europe/Saratov">Europe/Astrakhan</id>
+   <id notafter="701823600000" repl="Europe/Ulyanovsk">Europe/Astrakhan</id>
    <id>Europe/Volgograd</id>
    <id alts="W-SU">Europe/Moscow</id>
    <id>Europe/Kirov</id>
@@ -833,7 +833,7 @@
   <country code="ua" default="Europe/Kiev" everutc="n">
    <id>Europe/Kiev</id>
    <id notafter="686102400000" repl="Europe/Kiev">Europe/Zaporozhye</id>
-   <id notafter="686091600000" repl="Europe/Kiev">Europe/Uzhgorod</id>
+   <id notafter="686091600000" repl="Europe/Zaporozhye">Europe/Uzhgorod</id>
    <id picker="n">Europe/Simferopol</id>
   </country>
   <country code="ug" default="Africa/Kampala" everutc="n">
@@ -850,27 +850,27 @@
    <id notafter="1130652000000" repl="America/New_York" alts="America/Fort_Wayne,America/Indianapolis,US/East-Indiana">America/Indiana/Indianapolis</id>
    <id notafter="1194159600000" repl="America/New_York">America/Indiana/Vincennes</id>
    <id notafter="972802800000" repl="America/New_York">America/Kentucky/Monticello</id>
-   <id notafter="247042800000" repl="America/New_York">America/Indiana/Petersburg</id>
+   <id notafter="247042800000" repl="America/Indiana/Vincennes">America/Indiana/Petersburg</id>
    <id notafter="1173600000000" repl="America/New_York">America/Indiana/Winamac</id>
-   <id notafter="89186400000" repl="America/New_York">America/Indiana/Vevay</id>
-   <id notafter="183535200000" repl="America/New_York">America/Indiana/Marengo</id>
+   <id notafter="89186400000" repl="America/Indiana/Indianapolis">America/Indiana/Vevay</id>
+   <id notafter="183535200000" repl="America/Indiana/Indianapolis">America/Indiana/Marengo</id>
    <id alts="US/Central">America/Chicago</id>
    <id notafter="104918400000" repl="America/Chicago">America/Menominee</id>
    <id notafter="1143964800000" repl="America/Chicago">America/Indiana/Tell_City</id>
-   <id notafter="688546800000" repl="America/Chicago" alts="America/Knox_IN,US/Indiana-Starke">America/Indiana/Knox</id>
+   <id notafter="688546800000" repl="America/Indiana/Tell_City" alts="America/Knox_IN,US/Indiana-Starke">America/Indiana/Knox</id>
    <id notafter="1289116800000" repl="America/Chicago">America/North_Dakota/Beulah</id>
    <id notafter="1067155200000" repl="America/Chicago">America/North_Dakota/New_Salem</id>
    <id notafter="720000000000" repl="America/Chicago">America/North_Dakota/Center</id>
    <id alts="America/Shiprock,Navajo,US/Mountain">America/Denver</id>
    <id alts="US/Arizona">America/Phoenix</id>
-   <id notafter="129114000000" repl="America/Phoenix">America/Boise</id>
+   <id notafter="129114000000" repl="America/Denver">America/Boise</id>
    <id alts="US/Pacific">America/Los_Angeles</id>
    <id alts="US/Alaska">America/Anchorage</id>
    <id notafter="436359600000" repl="America/Anchorage">America/Juneau</id>
-   <id notafter="341402400000" repl="America/Anchorage">America/Sitka</id>
+   <id notafter="341402400000" repl="America/Juneau">America/Sitka</id>
    <id notafter="436363200000" repl="America/Anchorage">America/Nome</id>
    <id notafter="1547978400000" repl="America/Anchorage">America/Metlakatla</id>
-   <id notafter="436356000000" repl="America/Anchorage">America/Yakutat</id>
+   <id notafter="436356000000" repl="America/Juneau">America/Yakutat</id>
    <id alts="Pacific/Johnston,US/Hawaii">Pacific/Honolulu</id>
    <id alts="America/Atka,US/Aleutian">America/Adak</id>
   </country>
diff --git a/output_data/distro/distro.zip b/output_data/distro/distro.zip
index 05d8697..f6ec8fb 100644
--- a/output_data/distro/distro.zip
+++ b/output_data/distro/distro.zip
Binary files differ
diff --git a/testing/data/test1/output_data/android/tzlookup.xml b/testing/data/test1/output_data/android/tzlookup.xml
index e70c285..328ff79 100644
--- a/testing/data/test1/output_data/android/tzlookup.xml
+++ b/testing/data/test1/output_data/android/tzlookup.xml
@@ -45,13 +45,13 @@
    <id notafter="687931200000" repl="America/Argentina/Buenos_Aires" alts="America/Cordoba,America/Rosario">America/Argentina/Cordoba</id>
    <id notafter="1237082400000" repl="America/Argentina/Buenos_Aires" alts="America/Mendoza">America/Argentina/Mendoza</id>
    <id notafter="1087099200000" repl="America/Argentina/Buenos_Aires">America/Argentina/Tucuman</id>
-   <id notafter="1096171200000" repl="America/Argentina/Buenos_Aires">America/Argentina/Salta</id>
-   <id notafter="1090728000000" repl="America/Argentina/Buenos_Aires">America/Argentina/San_Juan</id>
-   <id notafter="687931200000" repl="America/Argentina/Buenos_Aires" alts="America/Jujuy">America/Argentina/Jujuy</id>
-   <id notafter="1087704000000" repl="America/Argentina/Buenos_Aires" alts="America/Argentina/ComodRivadavia,America/Catamarca">America/Argentina/Catamarca</id>
-   <id notafter="687931200000" repl="America/Argentina/Buenos_Aires">America/Argentina/La_Rioja</id>
-   <id notafter="673588800000" repl="America/Argentina/Buenos_Aires">America/Argentina/Rio_Gallegos</id>
-   <id notafter="1087704000000" repl="America/Argentina/Buenos_Aires">America/Argentina/Ushuaia</id>
+   <id notafter="1096171200000" repl="America/Argentina/Mendoza">America/Argentina/Salta</id>
+   <id notafter="1090728000000" repl="America/Argentina/Salta">America/Argentina/San_Juan</id>
+   <id notafter="687931200000" repl="America/Argentina/Salta" alts="America/Jujuy">America/Argentina/Jujuy</id>
+   <id notafter="1087704000000" repl="America/Argentina/Salta" alts="America/Argentina/ComodRivadavia,America/Catamarca">America/Argentina/Catamarca</id>
+   <id notafter="687931200000" repl="America/Argentina/Catamarca">America/Argentina/La_Rioja</id>
+   <id notafter="673588800000" repl="America/Argentina/La_Rioja">America/Argentina/Rio_Gallegos</id>
+   <id notafter="1087704000000" repl="America/Argentina/Salta">America/Argentina/Ushuaia</id>
    <id>America/Argentina/San_Luis</id>
   </country>
   <country code="as" default="Pacific/Pago_Pago" everutc="n">
@@ -64,7 +64,7 @@
    <id alts="Australia/ACT,Australia/Canberra,Australia/NSW">Australia/Sydney</id>
    <id notafter="796147200000" repl="Australia/Sydney" alts="Australia/Victoria">Australia/Melbourne</id>
    <id notafter="1193500800000" repl="Australia/Sydney" alts="Australia/Tasmania">Australia/Hobart</id>
-   <id notafter="37728000000" repl="Australia/Sydney">Australia/Currie</id>
+   <id notafter="37728000000" repl="Australia/Hobart">Australia/Currie</id>
    <id alts="Australia/Queensland">Australia/Brisbane</id>
    <id notafter="762883200000" repl="Australia/Brisbane">Australia/Lindeman</id>
    <id notafter="1286035200000" repl="Australia/Sydney">Antarctica/Macquarie</id>
@@ -130,15 +130,15 @@
    <id alts="Brazil/DeNoronha">America/Noronha</id>
    <id alts="Brazil/East">America/Sao_Paulo</id>
    <id notafter="1550368800000" repl="America/Sao_Paulo">America/Bahia</id>
-   <id notafter="1214280000000" repl="America/Sao_Paulo">America/Santarem</id>
-   <id notafter="1330221600000" repl="America/Sao_Paulo">America/Recife</id>
-   <id notafter="972180000000" repl="America/Sao_Paulo">America/Fortaleza</id>
-   <id notafter="1013911200000" repl="America/Sao_Paulo">America/Belem</id>
-   <id notafter="824004000000" repl="America/Sao_Paulo">America/Maceio</id>
-   <id notafter="1361066400000" repl="America/Sao_Paulo">America/Araguaina</id>
+   <id notafter="1214280000000" repl="America/Recife">America/Santarem</id>
+   <id notafter="1330221600000" repl="America/Bahia">America/Recife</id>
+   <id notafter="972180000000" repl="America/Recife">America/Fortaleza</id>
+   <id notafter="1013911200000" repl="America/Recife">America/Belem</id>
+   <id notafter="824004000000" repl="America/Fortaleza">America/Maceio</id>
+   <id notafter="1361066400000" repl="America/Bahia">America/Araguaina</id>
    <id alts="Brazil/West">America/Manaus</id>
    <id notafter="1550372400000" repl="America/Manaus">America/Cuiaba</id>
-   <id notafter="1076814000000" repl="America/Manaus">America/Campo_Grande</id>
+   <id notafter="1076814000000" repl="America/Cuiaba">America/Campo_Grande</id>
    <id notafter="761713200000" repl="America/Manaus">America/Porto_Velho</id>
    <id notafter="971578800000" repl="America/Manaus">America/Boa_Vista</id>
    <id alts="America/Porto_Acre,Brazil/Acre">America/Rio_Branco</id>
@@ -172,21 +172,21 @@
    <id>America/Blanc-Sablon</id>
    <id notafter="120636000000" repl="America/Toronto">America/Thunder_Bay</id>
    <id notafter="972802800000" repl="America/Toronto">America/Iqaluit</id>
-   <id notafter="89186400000" repl="America/Toronto">America/Nipigon</id>
-   <id notafter="796806000000" repl="America/Toronto">America/Pangnirtung</id>
+   <id notafter="89186400000" repl="America/Thunder_Bay">America/Nipigon</id>
+   <id notafter="796806000000" repl="America/Iqaluit">America/Pangnirtung</id>
    <id alts="America/Coral_Harbour">America/Atikokan</id>
    <id alts="Canada/Saskatchewan">America/Regina</id>
-   <id notafter="73472400000" repl="America/Winnipeg">America/Swift_Current</id>
+   <id notafter="73472400000" repl="America/Regina">America/Swift_Current</id>
    <id notafter="1130659200000" repl="America/Winnipeg">America/Rankin_Inlet</id>
-   <id notafter="986112000000" repl="America/Winnipeg">America/Rainy_River</id>
+   <id notafter="986112000000" repl="America/Rankin_Inlet">America/Rainy_River</id>
    <id notafter="1173600000000" repl="America/Winnipeg">America/Resolute</id>
    <id notafter="309945600000" repl="America/Edmonton">America/Yellowknife</id>
-   <id notafter="1604214000000" repl="America/Edmonton">America/Dawson_Creek</id>
-   <id notafter="84013200000" repl="America/Edmonton">America/Creston</id>
-   <id notafter="1425808800000" repl="America/Edmonton">America/Fort_Nelson</id>
-   <id notafter="294228000000" repl="America/Edmonton">America/Inuvik</id>
+   <id notafter="1604214000000" repl="America/Whitehorse">America/Dawson_Creek</id>
+   <id notafter="84013200000" repl="America/Dawson_Creek">America/Creston</id>
+   <id notafter="1425808800000" repl="America/Dawson_Creek">America/Fort_Nelson</id>
+   <id notafter="294228000000" repl="America/Yellowknife">America/Inuvik</id>
    <id notafter="986115600000" repl="America/Edmonton">America/Cambridge_Bay</id>
-   <id notafter="120646800000" repl="America/Edmonton">America/Dawson</id>
+   <id notafter="120646800000" repl="America/Whitehorse">America/Dawson</id>
    <id alts="Canada/Yukon">America/Whitehorse</id>
   </country>
   <country code="cc" default="Indian/Cocos" everutc="n">
@@ -698,7 +698,7 @@
    <id notafter="1315828800000" repl="Asia/Vladivostok">Asia/Ust-Nera</id>
    <id>Asia/Chita</id>
    <id notafter="1459015200000" repl="Asia/Chita">Asia/Yakutsk</id>
-   <id notafter="1315832400000" repl="Asia/Chita">Asia/Khandyga</id>
+   <id notafter="1315832400000" repl="Asia/Yakutsk">Asia/Khandyga</id>
    <id>Asia/Irkutsk</id>
    <id>Asia/Krasnoyarsk</id>
    <id notafter="1459022400000" repl="Asia/Krasnoyarsk">Asia/Novokuznetsk</id>
@@ -710,7 +710,7 @@
    <id>Europe/Samara</id>
    <id>Europe/Saratov</id>
    <id notafter="1480806000000" repl="Europe/Saratov">Europe/Ulyanovsk</id>
-   <id notafter="701823600000" repl="Europe/Saratov">Europe/Astrakhan</id>
+   <id notafter="701823600000" repl="Europe/Ulyanovsk">Europe/Astrakhan</id>
    <id>Europe/Volgograd</id>
    <id alts="W-SU">Europe/Moscow</id>
    <id>Europe/Kirov</id>
@@ -833,7 +833,7 @@
   <country code="ua" default="Europe/Kiev" everutc="n">
    <id>Europe/Kiev</id>
    <id notafter="686102400000" repl="Europe/Kiev">Europe/Zaporozhye</id>
-   <id notafter="686091600000" repl="Europe/Kiev">Europe/Uzhgorod</id>
+   <id notafter="686091600000" repl="Europe/Zaporozhye">Europe/Uzhgorod</id>
    <id picker="n">Europe/Simferopol</id>
   </country>
   <country code="ug" default="Africa/Kampala" everutc="n">
@@ -850,27 +850,27 @@
    <id notafter="1130652000000" repl="America/New_York" alts="America/Fort_Wayne,America/Indianapolis,US/East-Indiana">America/Indiana/Indianapolis</id>
    <id notafter="1194159600000" repl="America/New_York">America/Indiana/Vincennes</id>
    <id notafter="972802800000" repl="America/New_York">America/Kentucky/Monticello</id>
-   <id notafter="247042800000" repl="America/New_York">America/Indiana/Petersburg</id>
+   <id notafter="247042800000" repl="America/Indiana/Vincennes">America/Indiana/Petersburg</id>
    <id notafter="1173600000000" repl="America/New_York">America/Indiana/Winamac</id>
-   <id notafter="89186400000" repl="America/New_York">America/Indiana/Vevay</id>
-   <id notafter="183535200000" repl="America/New_York">America/Indiana/Marengo</id>
+   <id notafter="89186400000" repl="America/Indiana/Indianapolis">America/Indiana/Vevay</id>
+   <id notafter="183535200000" repl="America/Indiana/Indianapolis">America/Indiana/Marengo</id>
    <id alts="US/Central">America/Chicago</id>
    <id notafter="104918400000" repl="America/Chicago">America/Menominee</id>
    <id notafter="1143964800000" repl="America/Chicago">America/Indiana/Tell_City</id>
-   <id notafter="688546800000" repl="America/Chicago" alts="America/Knox_IN,US/Indiana-Starke">America/Indiana/Knox</id>
+   <id notafter="688546800000" repl="America/Indiana/Tell_City" alts="America/Knox_IN,US/Indiana-Starke">America/Indiana/Knox</id>
    <id notafter="1289116800000" repl="America/Chicago">America/North_Dakota/Beulah</id>
    <id notafter="1067155200000" repl="America/Chicago">America/North_Dakota/New_Salem</id>
    <id notafter="720000000000" repl="America/Chicago">America/North_Dakota/Center</id>
    <id alts="America/Shiprock,Navajo,US/Mountain">America/Denver</id>
    <id alts="US/Arizona">America/Phoenix</id>
-   <id notafter="129114000000" repl="America/Phoenix">America/Boise</id>
+   <id notafter="129114000000" repl="America/Denver">America/Boise</id>
    <id alts="US/Pacific">America/Los_Angeles</id>
    <id alts="US/Alaska">America/Anchorage</id>
    <id notafter="436359600000" repl="America/Anchorage">America/Juneau</id>
-   <id notafter="341402400000" repl="America/Anchorage">America/Sitka</id>
+   <id notafter="341402400000" repl="America/Juneau">America/Sitka</id>
    <id notafter="436363200000" repl="America/Anchorage">America/Nome</id>
    <id notafter="1547978400000" repl="America/Anchorage">America/Metlakatla</id>
-   <id notafter="436356000000" repl="America/Anchorage">America/Yakutat</id>
+   <id notafter="436356000000" repl="America/Juneau">America/Yakutat</id>
    <id alts="Pacific/Johnston,US/Hawaii">Pacific/Honolulu</id>
    <id alts="America/Atka,US/Aleutian">America/Adak</id>
   </country>
diff --git a/testing/data/test1/output_data/distro/distro.zip b/testing/data/test1/output_data/distro/distro.zip
index a829101..a88c2c2 100644
--- a/testing/data/test1/output_data/distro/distro.zip
+++ b/testing/data/test1/output_data/distro/distro.zip
Binary files differ
diff --git a/testing/data/test2/output_data/android/tzlookup.xml b/testing/data/test2/output_data/android/tzlookup.xml
index 5f453a8..f997f3f 100644
--- a/testing/data/test2/output_data/android/tzlookup.xml
+++ b/testing/data/test2/output_data/android/tzlookup.xml
@@ -45,13 +45,13 @@
    <id notafter="687931200000" repl="America/Argentina/Buenos_Aires" alts="America/Cordoba,America/Rosario">America/Argentina/Cordoba</id>
    <id notafter="1237082400000" repl="America/Argentina/Buenos_Aires" alts="America/Mendoza">America/Argentina/Mendoza</id>
    <id notafter="1087099200000" repl="America/Argentina/Buenos_Aires">America/Argentina/Tucuman</id>
-   <id notafter="1096171200000" repl="America/Argentina/Buenos_Aires">America/Argentina/Salta</id>
-   <id notafter="1090728000000" repl="America/Argentina/Buenos_Aires">America/Argentina/San_Juan</id>
-   <id notafter="687931200000" repl="America/Argentina/Buenos_Aires" alts="America/Jujuy">America/Argentina/Jujuy</id>
-   <id notafter="1087704000000" repl="America/Argentina/Buenos_Aires" alts="America/Argentina/ComodRivadavia,America/Catamarca">America/Argentina/Catamarca</id>
-   <id notafter="687931200000" repl="America/Argentina/Buenos_Aires">America/Argentina/La_Rioja</id>
-   <id notafter="673588800000" repl="America/Argentina/Buenos_Aires">America/Argentina/Rio_Gallegos</id>
-   <id notafter="1087704000000" repl="America/Argentina/Buenos_Aires">America/Argentina/Ushuaia</id>
+   <id notafter="1096171200000" repl="America/Argentina/Mendoza">America/Argentina/Salta</id>
+   <id notafter="1090728000000" repl="America/Argentina/Salta">America/Argentina/San_Juan</id>
+   <id notafter="687931200000" repl="America/Argentina/Salta" alts="America/Jujuy">America/Argentina/Jujuy</id>
+   <id notafter="1087704000000" repl="America/Argentina/Salta" alts="America/Argentina/ComodRivadavia,America/Catamarca">America/Argentina/Catamarca</id>
+   <id notafter="687931200000" repl="America/Argentina/Catamarca">America/Argentina/La_Rioja</id>
+   <id notafter="673588800000" repl="America/Argentina/La_Rioja">America/Argentina/Rio_Gallegos</id>
+   <id notafter="1087704000000" repl="America/Argentina/Salta">America/Argentina/Ushuaia</id>
    <id>America/Argentina/San_Luis</id>
   </country>
   <country code="as" default="Pacific/Pago_Pago" everutc="n">
@@ -64,7 +64,7 @@
    <id alts="Australia/ACT,Australia/Canberra,Australia/NSW">Australia/Sydney</id>
    <id notafter="796147200000" repl="Australia/Sydney" alts="Australia/Victoria">Australia/Melbourne</id>
    <id notafter="1193500800000" repl="Australia/Sydney" alts="Australia/Tasmania">Australia/Hobart</id>
-   <id notafter="37728000000" repl="Australia/Sydney">Australia/Currie</id>
+   <id notafter="37728000000" repl="Australia/Hobart">Australia/Currie</id>
    <id alts="Australia/Queensland">Australia/Brisbane</id>
    <id notafter="762883200000" repl="Australia/Brisbane">Australia/Lindeman</id>
    <id notafter="1286035200000" repl="Australia/Sydney">Antarctica/Macquarie</id>
@@ -130,15 +130,15 @@
    <id alts="Brazil/DeNoronha">America/Noronha</id>
    <id alts="Brazil/East">America/Sao_Paulo</id>
    <id notafter="1550368800000" repl="America/Sao_Paulo">America/Bahia</id>
-   <id notafter="1214280000000" repl="America/Sao_Paulo">America/Santarem</id>
-   <id notafter="1330221600000" repl="America/Sao_Paulo">America/Recife</id>
-   <id notafter="972180000000" repl="America/Sao_Paulo">America/Fortaleza</id>
-   <id notafter="1013911200000" repl="America/Sao_Paulo">America/Belem</id>
-   <id notafter="824004000000" repl="America/Sao_Paulo">America/Maceio</id>
-   <id notafter="1361066400000" repl="America/Sao_Paulo">America/Araguaina</id>
+   <id notafter="1214280000000" repl="America/Recife">America/Santarem</id>
+   <id notafter="1330221600000" repl="America/Bahia">America/Recife</id>
+   <id notafter="972180000000" repl="America/Recife">America/Fortaleza</id>
+   <id notafter="1013911200000" repl="America/Recife">America/Belem</id>
+   <id notafter="824004000000" repl="America/Fortaleza">America/Maceio</id>
+   <id notafter="1361066400000" repl="America/Bahia">America/Araguaina</id>
    <id alts="Brazil/West">America/Manaus</id>
    <id notafter="1550372400000" repl="America/Manaus">America/Cuiaba</id>
-   <id notafter="1076814000000" repl="America/Manaus">America/Campo_Grande</id>
+   <id notafter="1076814000000" repl="America/Cuiaba">America/Campo_Grande</id>
    <id notafter="761713200000" repl="America/Manaus">America/Porto_Velho</id>
    <id notafter="971578800000" repl="America/Manaus">America/Boa_Vista</id>
    <id alts="America/Porto_Acre,Brazil/Acre">America/Rio_Branco</id>
@@ -172,21 +172,21 @@
    <id>America/Blanc-Sablon</id>
    <id notafter="120636000000" repl="America/Toronto">America/Thunder_Bay</id>
    <id notafter="972802800000" repl="America/Toronto">America/Iqaluit</id>
-   <id notafter="89186400000" repl="America/Toronto">America/Nipigon</id>
-   <id notafter="796806000000" repl="America/Toronto">America/Pangnirtung</id>
+   <id notafter="89186400000" repl="America/Thunder_Bay">America/Nipigon</id>
+   <id notafter="796806000000" repl="America/Iqaluit">America/Pangnirtung</id>
    <id alts="America/Coral_Harbour">America/Atikokan</id>
    <id alts="Canada/Saskatchewan">America/Regina</id>
-   <id notafter="73472400000" repl="America/Winnipeg">America/Swift_Current</id>
+   <id notafter="73472400000" repl="America/Regina">America/Swift_Current</id>
    <id notafter="1130659200000" repl="America/Winnipeg">America/Rankin_Inlet</id>
-   <id notafter="986112000000" repl="America/Winnipeg">America/Rainy_River</id>
+   <id notafter="986112000000" repl="America/Rankin_Inlet">America/Rainy_River</id>
    <id notafter="1173600000000" repl="America/Winnipeg">America/Resolute</id>
    <id notafter="309945600000" repl="America/Edmonton">America/Yellowknife</id>
-   <id notafter="1604214000000" repl="America/Edmonton">America/Dawson_Creek</id>
-   <id notafter="84013200000" repl="America/Edmonton">America/Creston</id>
-   <id notafter="1425808800000" repl="America/Edmonton">America/Fort_Nelson</id>
-   <id notafter="294228000000" repl="America/Edmonton">America/Inuvik</id>
+   <id notafter="1604214000000" repl="America/Whitehorse">America/Dawson_Creek</id>
+   <id notafter="84013200000" repl="America/Dawson_Creek">America/Creston</id>
+   <id notafter="1425808800000" repl="America/Dawson_Creek">America/Fort_Nelson</id>
+   <id notafter="294228000000" repl="America/Yellowknife">America/Inuvik</id>
    <id notafter="986115600000" repl="America/Edmonton">America/Cambridge_Bay</id>
-   <id notafter="120646800000" repl="America/Edmonton">America/Dawson</id>
+   <id notafter="120646800000" repl="America/Whitehorse">America/Dawson</id>
    <id alts="Canada/Yukon">America/Whitehorse</id>
   </country>
   <country code="cc" default="Indian/Cocos" everutc="n">
@@ -698,7 +698,7 @@
    <id notafter="1315828800000" repl="Asia/Vladivostok">Asia/Ust-Nera</id>
    <id>Asia/Chita</id>
    <id notafter="1459015200000" repl="Asia/Chita">Asia/Yakutsk</id>
-   <id notafter="1315832400000" repl="Asia/Chita">Asia/Khandyga</id>
+   <id notafter="1315832400000" repl="Asia/Yakutsk">Asia/Khandyga</id>
    <id>Asia/Irkutsk</id>
    <id>Asia/Krasnoyarsk</id>
    <id notafter="1459022400000" repl="Asia/Krasnoyarsk">Asia/Novokuznetsk</id>
@@ -710,7 +710,7 @@
    <id>Europe/Samara</id>
    <id>Europe/Saratov</id>
    <id notafter="1480806000000" repl="Europe/Saratov">Europe/Ulyanovsk</id>
-   <id notafter="701823600000" repl="Europe/Saratov">Europe/Astrakhan</id>
+   <id notafter="701823600000" repl="Europe/Ulyanovsk">Europe/Astrakhan</id>
    <id>Europe/Volgograd</id>
    <id alts="W-SU">Europe/Moscow</id>
    <id>Europe/Kirov</id>
@@ -833,7 +833,7 @@
   <country code="ua" default="Europe/Kiev" everutc="n">
    <id>Europe/Kiev</id>
    <id notafter="686102400000" repl="Europe/Kiev">Europe/Zaporozhye</id>
-   <id notafter="686091600000" repl="Europe/Kiev">Europe/Uzhgorod</id>
+   <id notafter="686091600000" repl="Europe/Zaporozhye">Europe/Uzhgorod</id>
    <id picker="n">Europe/Simferopol</id>
   </country>
   <country code="ug" default="Africa/Kampala" everutc="n">
@@ -850,27 +850,27 @@
    <id notafter="1130652000000" repl="America/New_York" alts="America/Fort_Wayne,America/Indianapolis,US/East-Indiana">America/Indiana/Indianapolis</id>
    <id notafter="1194159600000" repl="America/New_York">America/Indiana/Vincennes</id>
    <id notafter="972802800000" repl="America/New_York">America/Kentucky/Monticello</id>
-   <id notafter="247042800000" repl="America/New_York">America/Indiana/Petersburg</id>
+   <id notafter="247042800000" repl="America/Indiana/Vincennes">America/Indiana/Petersburg</id>
    <id notafter="1173600000000" repl="America/New_York">America/Indiana/Winamac</id>
-   <id notafter="89186400000" repl="America/New_York">America/Indiana/Vevay</id>
-   <id notafter="183535200000" repl="America/New_York">America/Indiana/Marengo</id>
+   <id notafter="89186400000" repl="America/Indiana/Indianapolis">America/Indiana/Vevay</id>
+   <id notafter="183535200000" repl="America/Indiana/Indianapolis">America/Indiana/Marengo</id>
    <id alts="US/Central">America/Chicago</id>
    <id notafter="104918400000" repl="America/Chicago">America/Menominee</id>
    <id notafter="1143964800000" repl="America/Chicago">America/Indiana/Tell_City</id>
-   <id notafter="688546800000" repl="America/Chicago" alts="America/Knox_IN,US/Indiana-Starke">America/Indiana/Knox</id>
+   <id notafter="688546800000" repl="America/Indiana/Tell_City" alts="America/Knox_IN,US/Indiana-Starke">America/Indiana/Knox</id>
    <id notafter="1289116800000" repl="America/Chicago">America/North_Dakota/Beulah</id>
    <id notafter="1067155200000" repl="America/Chicago">America/North_Dakota/New_Salem</id>
    <id notafter="720000000000" repl="America/Chicago">America/North_Dakota/Center</id>
    <id alts="America/Shiprock,Navajo,US/Mountain">America/Denver</id>
    <id alts="US/Arizona">America/Phoenix</id>
-   <id notafter="129114000000" repl="America/Phoenix">America/Boise</id>
+   <id notafter="129114000000" repl="America/Denver">America/Boise</id>
    <id alts="US/Pacific">America/Los_Angeles</id>
    <id alts="US/Alaska">America/Anchorage</id>
    <id notafter="436359600000" repl="America/Anchorage">America/Juneau</id>
-   <id notafter="341402400000" repl="America/Anchorage">America/Sitka</id>
+   <id notafter="341402400000" repl="America/Juneau">America/Sitka</id>
    <id notafter="436363200000" repl="America/Anchorage">America/Nome</id>
    <id notafter="1547978400000" repl="America/Anchorage">America/Metlakatla</id>
-   <id notafter="436356000000" repl="America/Anchorage">America/Yakutat</id>
+   <id notafter="436356000000" repl="America/Juneau">America/Yakutat</id>
    <id alts="Pacific/Johnston,US/Hawaii">Pacific/Honolulu</id>
    <id alts="America/Atka,US/Aleutian">America/Adak</id>
   </country>
diff --git a/testing/data/test2/output_data/distro/distro.zip b/testing/data/test2/output_data/distro/distro.zip
index c05baa4..fdc0f4c 100644
--- a/testing/data/test2/output_data/distro/distro.zip
+++ b/testing/data/test2/output_data/distro/distro.zip
Binary files differ
diff --git a/testing/data/test3/output_data/android/tzlookup.xml b/testing/data/test3/output_data/android/tzlookup.xml
index e70c285..328ff79 100644
--- a/testing/data/test3/output_data/android/tzlookup.xml
+++ b/testing/data/test3/output_data/android/tzlookup.xml
@@ -45,13 +45,13 @@
    <id notafter="687931200000" repl="America/Argentina/Buenos_Aires" alts="America/Cordoba,America/Rosario">America/Argentina/Cordoba</id>
    <id notafter="1237082400000" repl="America/Argentina/Buenos_Aires" alts="America/Mendoza">America/Argentina/Mendoza</id>
    <id notafter="1087099200000" repl="America/Argentina/Buenos_Aires">America/Argentina/Tucuman</id>
-   <id notafter="1096171200000" repl="America/Argentina/Buenos_Aires">America/Argentina/Salta</id>
-   <id notafter="1090728000000" repl="America/Argentina/Buenos_Aires">America/Argentina/San_Juan</id>
-   <id notafter="687931200000" repl="America/Argentina/Buenos_Aires" alts="America/Jujuy">America/Argentina/Jujuy</id>
-   <id notafter="1087704000000" repl="America/Argentina/Buenos_Aires" alts="America/Argentina/ComodRivadavia,America/Catamarca">America/Argentina/Catamarca</id>
-   <id notafter="687931200000" repl="America/Argentina/Buenos_Aires">America/Argentina/La_Rioja</id>
-   <id notafter="673588800000" repl="America/Argentina/Buenos_Aires">America/Argentina/Rio_Gallegos</id>
-   <id notafter="1087704000000" repl="America/Argentina/Buenos_Aires">America/Argentina/Ushuaia</id>
+   <id notafter="1096171200000" repl="America/Argentina/Mendoza">America/Argentina/Salta</id>
+   <id notafter="1090728000000" repl="America/Argentina/Salta">America/Argentina/San_Juan</id>
+   <id notafter="687931200000" repl="America/Argentina/Salta" alts="America/Jujuy">America/Argentina/Jujuy</id>
+   <id notafter="1087704000000" repl="America/Argentina/Salta" alts="America/Argentina/ComodRivadavia,America/Catamarca">America/Argentina/Catamarca</id>
+   <id notafter="687931200000" repl="America/Argentina/Catamarca">America/Argentina/La_Rioja</id>
+   <id notafter="673588800000" repl="America/Argentina/La_Rioja">America/Argentina/Rio_Gallegos</id>
+   <id notafter="1087704000000" repl="America/Argentina/Salta">America/Argentina/Ushuaia</id>
    <id>America/Argentina/San_Luis</id>
   </country>
   <country code="as" default="Pacific/Pago_Pago" everutc="n">
@@ -64,7 +64,7 @@
    <id alts="Australia/ACT,Australia/Canberra,Australia/NSW">Australia/Sydney</id>
    <id notafter="796147200000" repl="Australia/Sydney" alts="Australia/Victoria">Australia/Melbourne</id>
    <id notafter="1193500800000" repl="Australia/Sydney" alts="Australia/Tasmania">Australia/Hobart</id>
-   <id notafter="37728000000" repl="Australia/Sydney">Australia/Currie</id>
+   <id notafter="37728000000" repl="Australia/Hobart">Australia/Currie</id>
    <id alts="Australia/Queensland">Australia/Brisbane</id>
    <id notafter="762883200000" repl="Australia/Brisbane">Australia/Lindeman</id>
    <id notafter="1286035200000" repl="Australia/Sydney">Antarctica/Macquarie</id>
@@ -130,15 +130,15 @@
    <id alts="Brazil/DeNoronha">America/Noronha</id>
    <id alts="Brazil/East">America/Sao_Paulo</id>
    <id notafter="1550368800000" repl="America/Sao_Paulo">America/Bahia</id>
-   <id notafter="1214280000000" repl="America/Sao_Paulo">America/Santarem</id>
-   <id notafter="1330221600000" repl="America/Sao_Paulo">America/Recife</id>
-   <id notafter="972180000000" repl="America/Sao_Paulo">America/Fortaleza</id>
-   <id notafter="1013911200000" repl="America/Sao_Paulo">America/Belem</id>
-   <id notafter="824004000000" repl="America/Sao_Paulo">America/Maceio</id>
-   <id notafter="1361066400000" repl="America/Sao_Paulo">America/Araguaina</id>
+   <id notafter="1214280000000" repl="America/Recife">America/Santarem</id>
+   <id notafter="1330221600000" repl="America/Bahia">America/Recife</id>
+   <id notafter="972180000000" repl="America/Recife">America/Fortaleza</id>
+   <id notafter="1013911200000" repl="America/Recife">America/Belem</id>
+   <id notafter="824004000000" repl="America/Fortaleza">America/Maceio</id>
+   <id notafter="1361066400000" repl="America/Bahia">America/Araguaina</id>
    <id alts="Brazil/West">America/Manaus</id>
    <id notafter="1550372400000" repl="America/Manaus">America/Cuiaba</id>
-   <id notafter="1076814000000" repl="America/Manaus">America/Campo_Grande</id>
+   <id notafter="1076814000000" repl="America/Cuiaba">America/Campo_Grande</id>
    <id notafter="761713200000" repl="America/Manaus">America/Porto_Velho</id>
    <id notafter="971578800000" repl="America/Manaus">America/Boa_Vista</id>
    <id alts="America/Porto_Acre,Brazil/Acre">America/Rio_Branco</id>
@@ -172,21 +172,21 @@
    <id>America/Blanc-Sablon</id>
    <id notafter="120636000000" repl="America/Toronto">America/Thunder_Bay</id>
    <id notafter="972802800000" repl="America/Toronto">America/Iqaluit</id>
-   <id notafter="89186400000" repl="America/Toronto">America/Nipigon</id>
-   <id notafter="796806000000" repl="America/Toronto">America/Pangnirtung</id>
+   <id notafter="89186400000" repl="America/Thunder_Bay">America/Nipigon</id>
+   <id notafter="796806000000" repl="America/Iqaluit">America/Pangnirtung</id>
    <id alts="America/Coral_Harbour">America/Atikokan</id>
    <id alts="Canada/Saskatchewan">America/Regina</id>
-   <id notafter="73472400000" repl="America/Winnipeg">America/Swift_Current</id>
+   <id notafter="73472400000" repl="America/Regina">America/Swift_Current</id>
    <id notafter="1130659200000" repl="America/Winnipeg">America/Rankin_Inlet</id>
-   <id notafter="986112000000" repl="America/Winnipeg">America/Rainy_River</id>
+   <id notafter="986112000000" repl="America/Rankin_Inlet">America/Rainy_River</id>
    <id notafter="1173600000000" repl="America/Winnipeg">America/Resolute</id>
    <id notafter="309945600000" repl="America/Edmonton">America/Yellowknife</id>
-   <id notafter="1604214000000" repl="America/Edmonton">America/Dawson_Creek</id>
-   <id notafter="84013200000" repl="America/Edmonton">America/Creston</id>
-   <id notafter="1425808800000" repl="America/Edmonton">America/Fort_Nelson</id>
-   <id notafter="294228000000" repl="America/Edmonton">America/Inuvik</id>
+   <id notafter="1604214000000" repl="America/Whitehorse">America/Dawson_Creek</id>
+   <id notafter="84013200000" repl="America/Dawson_Creek">America/Creston</id>
+   <id notafter="1425808800000" repl="America/Dawson_Creek">America/Fort_Nelson</id>
+   <id notafter="294228000000" repl="America/Yellowknife">America/Inuvik</id>
    <id notafter="986115600000" repl="America/Edmonton">America/Cambridge_Bay</id>
-   <id notafter="120646800000" repl="America/Edmonton">America/Dawson</id>
+   <id notafter="120646800000" repl="America/Whitehorse">America/Dawson</id>
    <id alts="Canada/Yukon">America/Whitehorse</id>
   </country>
   <country code="cc" default="Indian/Cocos" everutc="n">
@@ -698,7 +698,7 @@
    <id notafter="1315828800000" repl="Asia/Vladivostok">Asia/Ust-Nera</id>
    <id>Asia/Chita</id>
    <id notafter="1459015200000" repl="Asia/Chita">Asia/Yakutsk</id>
-   <id notafter="1315832400000" repl="Asia/Chita">Asia/Khandyga</id>
+   <id notafter="1315832400000" repl="Asia/Yakutsk">Asia/Khandyga</id>
    <id>Asia/Irkutsk</id>
    <id>Asia/Krasnoyarsk</id>
    <id notafter="1459022400000" repl="Asia/Krasnoyarsk">Asia/Novokuznetsk</id>
@@ -710,7 +710,7 @@
    <id>Europe/Samara</id>
    <id>Europe/Saratov</id>
    <id notafter="1480806000000" repl="Europe/Saratov">Europe/Ulyanovsk</id>
-   <id notafter="701823600000" repl="Europe/Saratov">Europe/Astrakhan</id>
+   <id notafter="701823600000" repl="Europe/Ulyanovsk">Europe/Astrakhan</id>
    <id>Europe/Volgograd</id>
    <id alts="W-SU">Europe/Moscow</id>
    <id>Europe/Kirov</id>
@@ -833,7 +833,7 @@
   <country code="ua" default="Europe/Kiev" everutc="n">
    <id>Europe/Kiev</id>
    <id notafter="686102400000" repl="Europe/Kiev">Europe/Zaporozhye</id>
-   <id notafter="686091600000" repl="Europe/Kiev">Europe/Uzhgorod</id>
+   <id notafter="686091600000" repl="Europe/Zaporozhye">Europe/Uzhgorod</id>
    <id picker="n">Europe/Simferopol</id>
   </country>
   <country code="ug" default="Africa/Kampala" everutc="n">
@@ -850,27 +850,27 @@
    <id notafter="1130652000000" repl="America/New_York" alts="America/Fort_Wayne,America/Indianapolis,US/East-Indiana">America/Indiana/Indianapolis</id>
    <id notafter="1194159600000" repl="America/New_York">America/Indiana/Vincennes</id>
    <id notafter="972802800000" repl="America/New_York">America/Kentucky/Monticello</id>
-   <id notafter="247042800000" repl="America/New_York">America/Indiana/Petersburg</id>
+   <id notafter="247042800000" repl="America/Indiana/Vincennes">America/Indiana/Petersburg</id>
    <id notafter="1173600000000" repl="America/New_York">America/Indiana/Winamac</id>
-   <id notafter="89186400000" repl="America/New_York">America/Indiana/Vevay</id>
-   <id notafter="183535200000" repl="America/New_York">America/Indiana/Marengo</id>
+   <id notafter="89186400000" repl="America/Indiana/Indianapolis">America/Indiana/Vevay</id>
+   <id notafter="183535200000" repl="America/Indiana/Indianapolis">America/Indiana/Marengo</id>
    <id alts="US/Central">America/Chicago</id>
    <id notafter="104918400000" repl="America/Chicago">America/Menominee</id>
    <id notafter="1143964800000" repl="America/Chicago">America/Indiana/Tell_City</id>
-   <id notafter="688546800000" repl="America/Chicago" alts="America/Knox_IN,US/Indiana-Starke">America/Indiana/Knox</id>
+   <id notafter="688546800000" repl="America/Indiana/Tell_City" alts="America/Knox_IN,US/Indiana-Starke">America/Indiana/Knox</id>
    <id notafter="1289116800000" repl="America/Chicago">America/North_Dakota/Beulah</id>
    <id notafter="1067155200000" repl="America/Chicago">America/North_Dakota/New_Salem</id>
    <id notafter="720000000000" repl="America/Chicago">America/North_Dakota/Center</id>
    <id alts="America/Shiprock,Navajo,US/Mountain">America/Denver</id>
    <id alts="US/Arizona">America/Phoenix</id>
-   <id notafter="129114000000" repl="America/Phoenix">America/Boise</id>
+   <id notafter="129114000000" repl="America/Denver">America/Boise</id>
    <id alts="US/Pacific">America/Los_Angeles</id>
    <id alts="US/Alaska">America/Anchorage</id>
    <id notafter="436359600000" repl="America/Anchorage">America/Juneau</id>
-   <id notafter="341402400000" repl="America/Anchorage">America/Sitka</id>
+   <id notafter="341402400000" repl="America/Juneau">America/Sitka</id>
    <id notafter="436363200000" repl="America/Anchorage">America/Nome</id>
    <id notafter="1547978400000" repl="America/Anchorage">America/Metlakatla</id>
-   <id notafter="436356000000" repl="America/Anchorage">America/Yakutat</id>
+   <id notafter="436356000000" repl="America/Juneau">America/Yakutat</id>
    <id alts="Pacific/Johnston,US/Hawaii">Pacific/Honolulu</id>
    <id alts="America/Atka,US/Aleutian">America/Adak</id>
   </country>
diff --git a/testing/data/test3/output_data/distro/distro.zip b/testing/data/test3/output_data/distro/distro.zip
index af6fe34..ad5caad 100644
--- a/testing/data/test3/output_data/distro/distro.zip
+++ b/testing/data/test3/output_data/distro/distro.zip
Binary files differ