backpack-backbone 0.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1543 @@
1
+ """Timezone data, world map rendering, and the timezone_select widget."""
2
+ from __future__ import annotations
3
+ import re
4
+ import sys
5
+
6
+ # Runs on its own too: `python3 -m backbone.prompt.timezone`.
7
+ from backbone import prompt as _prompt # shared widget chrome (hints/transport)
8
+ from backbone.prompt.core import (
9
+ _Widget, _read_key, _wait_for_keypress,
10
+ _set_raw, _restore_term_attrs, _get_term_attrs,
11
+ _visible_rows, _cols, C,
12
+ )
13
+ from backbone import keys, ui
14
+ from backbone.nav import QuitToTerminal
15
+
16
+ _TIMEZONES = [
17
+ # UTC-12
18
+ (-12, 0, 0.2, -176.5, "Etc/GMT+12", "IDLW", "International Date Line West", False),
19
+ # UTC-11
20
+ (-11, 0, -14.3, -170.7, "Pacific/Pago_Pago", "SST", "Pago Pago", True),
21
+ (-11, 0, -13.3, -176.2, "Pacific/Niue", "NUT", "Alofi", True),
22
+ # UTC-10
23
+ (-10, 0, 21.3, -157.8, "Pacific/Honolulu", "HST", "Honolulu", False),
24
+ (-10, 0, 20.9, -156.5, "Pacific/Honolulu", "HST", "Maui", False),
25
+ (-10, 0, -17.5, -149.6, "Pacific/Tahiti", "TAHT", "Papeete", True),
26
+ (-10, 0, -21.2, -159.8, "Pacific/Rarotonga", "CKT", "Avarua", True),
27
+ # UTC-9:30
28
+ ( -9, 30, -9.4, -139.0, "Pacific/Marquesas", "MART", "Nuku Hiva", False),
29
+ # UTC-9
30
+ ( -9, 0, 61.2, -149.9, "America/Anchorage", "AKST/AKDT", "Anchorage", False),
31
+ ( -9, 0, 64.8, -147.7, "America/Anchorage", "AKST/AKDT", "Fairbanks", False),
32
+ ( -9, 0, 57.0, -135.3, "America/Sitka", "AKST/AKDT", "Sitka", False),
33
+ # UTC-8
34
+ ( -8, 0, 34.0, -118.2, "America/Los_Angeles", "PST/PDT", "Los Angeles", False),
35
+ ( -8, 0, 37.8, -122.4, "America/Los_Angeles", "PST/PDT", "San Francisco", False),
36
+ ( -8, 0, 47.6, -122.3, "America/Los_Angeles", "PST/PDT", "Seattle", False),
37
+ ( -8, 0, 45.5, -122.7, "America/Los_Angeles", "PST/PDT", "Portland", False),
38
+ ( -8, 0, 49.2, -123.1, "America/Vancouver", "PST/PDT", "Vancouver", False),
39
+ ( -8, 0, 32.7, -117.2, "America/Los_Angeles", "PST/PDT", "San Diego", False),
40
+ ( -8, 0, 36.7, -119.8, "America/Los_Angeles", "PST/PDT", "Fresno", False),
41
+ ( -8, 0, 38.6, -121.5, "America/Los_Angeles", "PST/PDT", "Sacramento", False),
42
+ # UTC-7
43
+ ( -7, 0, 51.1, -114.1, "America/Edmonton", "MST/MDT", "Calgary", False),
44
+ ( -7, 0, 39.7, -104.9, "America/Denver", "MST/MDT", "Denver", False),
45
+ ( -7, 0, 40.8, -111.9, "America/Denver", "MST/MDT", "Salt Lake City", False),
46
+ ( -7, 0, 35.1, -106.7, "America/Denver", "MST/MDT", "Albuquerque", False),
47
+ ( -7, 0, 32.3, -110.9, "America/Phoenix", "MST", "Tucson", False),
48
+ ( -7, 0, 33.4, -112.1, "America/Phoenix", "MST", "Phoenix", False),
49
+ ( -7, 0, 51.0, -114.1, "America/Edmonton", "MST/MDT", "Edmonton", False),
50
+ ( -7, 0, 19.0, -103.3, "America/Mazatlan", "MST/MDT", "Guadalajara", False),
51
+ ( -7, 0, 23.2, -106.4, "America/Mazatlan", "MST/MDT", "Mazatlán", False),
52
+ ( -7, 0, 29.1, -110.9, "America/Hermosillo", "MST", "Hermosillo", False),
53
+ # UTC-6
54
+ ( -6, 0, 41.8, -87.6, "America/Chicago", "CST/CDT", "Chicago", False),
55
+ ( -6, 0, 29.8, -95.4, "America/Chicago", "CST/CDT", "Houston", False),
56
+ ( -6, 0, 32.8, -96.8, "America/Chicago", "CST/CDT", "Dallas", False),
57
+ ( -6, 0, 44.9, -93.1, "America/Chicago", "CST/CDT", "Minneapolis", False),
58
+ ( -6, 0, 38.6, -90.2, "America/Chicago", "CST/CDT", "St. Louis", False),
59
+ ( -6, 0, 29.9, -90.1, "America/Chicago", "CST/CDT", "New Orleans", False),
60
+ ( -6, 0, 49.9, -97.1, "America/Winnipeg", "CST/CDT", "Winnipeg", False),
61
+ ( -6, 0, 19.4, -99.1, "America/Mexico_City", "CST/CDT", "Mexico City", True),
62
+ ( -6, 0, 20.9, -89.6, "America/Merida", "CST/CDT", "Mérida", False),
63
+ ( -6, 0, 25.7, -100.3, "America/Monterrey", "CST/CDT", "Monterrey", False),
64
+ ( -6, 0, 22.2, -97.8, "America/Monterrey", "CST/CDT", "Tampico", False),
65
+ ( -6, 0, 52.1, -106.7, "America/Regina", "CST", "Regina", False),
66
+ ( -6, 0, 13.7, -89.2, "America/El_Salvador", "CST", "San Salvador", True),
67
+ ( -6, 0, 14.6, -90.5, "America/Guatemala", "CST", "Guatemala City", True),
68
+ ( -6, 0, 14.1, -87.2, "America/Tegucigalpa", "CST", "Tegucigalpa", True),
69
+ ( -6, 0, 12.1, -86.3, "America/Managua", "CST", "Managua", True),
70
+ ( -6, 0, 9.9, -84.1, "America/Costa_Rica", "CST", "San José", True),
71
+ ( -6, 0, 17.3, -89.9, "America/Belize", "CST", "Belmopan", True),
72
+ ( -6, 0, 36.2, -86.8, "America/Chicago", "CST/CDT", "Nashville", False),
73
+ # UTC-5
74
+ ( -5, 0, 40.7, -74.0, "America/New_York", "EST/EDT", "New York", False),
75
+ ( -5, 0, 42.4, -71.1, "America/New_York", "EST/EDT", "Boston", False),
76
+ ( -5, 0, 25.8, -80.2, "America/New_York", "EST/EDT", "Miami", False),
77
+ ( -5, 0, 39.9, -75.2, "America/New_York", "EST/EDT", "Philadelphia", False),
78
+ ( -5, 0, 38.9, -77.0, "America/New_York", "EST/EDT", "Washington DC", True),
79
+ ( -5, 0, 43.7, -79.4, "America/Toronto", "EST/EDT", "Toronto", False),
80
+ ( -5, 0, 45.4, -75.7, "America/Toronto", "EST/EDT", "Ottawa", False),
81
+ ( -5, 0, 45.5, -73.6, "America/Toronto", "EST/EDT", "Montreal", False),
82
+ ( -5, 0, 30.3, -81.7, "America/New_York", "EST/EDT", "Jacksonville", False),
83
+ ( -5, 0, 4.7, -74.1, "America/Bogota", "COT", "Bogotá", True),
84
+ ( -5, 0, 6.3, -75.6, "America/Bogota", "COT", "Medellín", False),
85
+ ( -5, 0, 3.4, -76.5, "America/Bogota", "COT", "Cali", False),
86
+ ( -5, 0, -12.0, -77.0, "America/Lima", "PET", "Lima", True),
87
+ ( -5, 0, -8.1, -79.0, "America/Lima", "PET", "Trujillo", False),
88
+ ( -5, 0, 9.0, -79.5, "America/Panama", "EST", "Panama City", True),
89
+ ( -5, 0, -0.2, -78.5, "America/Guayaquil", "ECT", "Quito", True),
90
+ ( -5, 0, -2.2, -79.9, "America/Guayaquil", "ECT", "Guayaquil", False),
91
+ ( -5, 0, 18.0, -76.8, "America/Jamaica", "EST", "Kingston", True),
92
+ ( -5, 0, 18.5, -72.3, "America/Port-au-Prince", "EST/EDT", "Port-au-Prince", True),
93
+ # UTC-4:30
94
+ ( -4, 0, 10.5, -66.9, "America/Caracas", "VET", "Caracas", True),
95
+ # UTC-4
96
+ ( -4, 0, 44.6, -63.6, "America/Halifax", "AST/ADT", "Halifax", False),
97
+ ( -4, 0, 17.1, -61.8, "America/Antigua", "AST", "St. John's (Antigua)", True),
98
+ ( -4, 0, 13.1, -59.6, "America/Barbados", "AST", "Bridgetown", True),
99
+ ( -4, 0, 10.7, -61.5, "America/Port_of_Spain", "AST", "Port of Spain", True),
100
+ ( -4, 0, 18.5, -69.9, "America/Santo_Domingo", "AST", "Santo Domingo", True),
101
+ ( -4, 0, 32.3, -64.8, "Atlantic/Bermuda", "AST/ADT", "Hamilton", True),
102
+ ( -4, 0, -33.5, -70.7, "America/Santiago", "CLT/CLST", "Santiago", True),
103
+ ( -4, 0, -16.5, -68.1, "America/La_Paz", "BOT", "La Paz", True),
104
+ ( -4, 0, -3.1, -60.0, "America/Manaus", "AMT", "Manaus", False),
105
+ ( -4, 0, -33.0, -71.6, "America/Santiago", "CLT/CLST", "Valparaíso", False),
106
+ ( -4, 0, 6.8, -58.2, "America/Guyana", "GYT", "Georgetown", True),
107
+ # UTC-3:30
108
+ ( -3, 30, 47.6, -52.7, "America/St_Johns", "NST/NDT", "St. John's (NL)", False),
109
+ # UTC-3
110
+ ( -3, 0, -23.0, -43.2, "America/Sao_Paulo", "BRT/BRST", "Rio de Janeiro", False),
111
+ ( -3, 0, -1.5, -48.5, "America/Belem", "BRT", "Belém", False),
112
+ ( -3, 0, -2.5, -44.3, "America/Fortaleza", "BRT", "São Luís", False),
113
+ ( -3, 0, -34.9, -56.2, "America/Montevideo", "UYT", "Montevideo", True),
114
+ ( -3, 0, -34.6, -58.4, "America/Argentina/Buenos_Aires", "ART", "Buenos Aires", True),
115
+ ( -3, 0, -31.4, -64.2, "America/Argentina/Cordoba", "ART", "Córdoba", False),
116
+ ( -3, 0, -15.8, -47.9, "America/Sao_Paulo", "BRT/BRST", "Brasília", True),
117
+ ( -3, 0, -23.5, -46.6, "America/Sao_Paulo", "BRT/BRST", "São Paulo", False),
118
+ ( -3, 0, -3.7, -38.5, "America/Fortaleza", "BRT", "Fortaleza", False),
119
+ ( -3, 0, -12.9, -38.4, "America/Bahia", "BRT", "Salvador", False),
120
+ ( -3, 0, -8.0, -34.9, "America/Recife", "BRT", "Recife", False),
121
+ ( -3, 0, 5.8, -55.2, "America/Paramaribo", "SRT", "Paramaribo", True),
122
+ ( -3, 0, 4.9, -52.3, "America/Cayenne", "GFT", "Cayenne", False),
123
+ # UTC-2
124
+ ( -2, 0, -54.3, -36.5, "Atlantic/South_Georgia", "GST", "South Georgia", False),
125
+ ( -2, 0, -3.8, -32.4, "America/Noronha", "FNT", "Fernando de Noronha", False),
126
+ # UTC-1
127
+ ( -1, 0, 37.7, -25.7, "Atlantic/Azores", "AZOT/AZOST","Ponta Delgada", False),
128
+ ( -1, 0, 14.9, -23.5, "Atlantic/Cape_Verde", "CVT", "Praia", True),
129
+ # UTC+0
130
+ ( 0, 0, 11.8, -15.6, "Africa/Bissau", "GMT", "Bissau", True),
131
+ ( 0, 0, 51.5, -0.1, "Europe/London", "GMT/BST", "London", True),
132
+ ( 0, 0, 53.3, -6.3, "Europe/Dublin", "GMT/IST", "Dublin", True),
133
+ ( 0, 0, 51.5, -3.2, "Europe/London", "GMT/BST", "Cardiff", False),
134
+ ( 0, 0, 55.9, -3.2, "Europe/London", "GMT/BST", "Edinburgh", False),
135
+ ( 0, 0, 53.8, -1.5, "Europe/London", "GMT/BST", "Leeds", False),
136
+ ( 0, 0, 53.5, -2.2, "Europe/London", "GMT/BST", "Manchester", False),
137
+ ( 0, 0, 52.5, -1.9, "Europe/London", "GMT/BST", "Birmingham", False),
138
+ ( 0, 0, 64.1, -21.9, "Atlantic/Reykjavik", "GMT", "Reykjavik", True),
139
+ ( 0, 0, 5.6, -0.2, "Africa/Accra", "GMT", "Accra", True),
140
+ ( 0, 0, 12.4, -1.5, "Africa/Ouagadougou", "GMT", "Ouagadougou", True),
141
+ ( 0, 0, 12.7, -8.0, "Africa/Bamako", "GMT", "Bamako", True),
142
+ ( 0, 0, 15.6, -32.4, "Africa/Dakar", "GMT", "Dakar", True),
143
+ ( 0, 0, 11.9, -15.6, "Africa/Bissau", "GMT", "Conakry", True),
144
+ ( 0, 0, 8.5, -13.2, "Africa/Freetown", "GMT", "Freetown", True),
145
+ ( 0, 0, 6.3, -10.8, "Africa/Monrovia", "GMT", "Monrovia", True),
146
+ ( 0, 0, 5.3, -4.0, "Africa/Abidjan", "GMT", "Yamoussoukro", True),
147
+ ( 0, 0, 5.4, -3.9, "Africa/Abidjan", "GMT", "Abidjan", False),
148
+ ( 0, 0, 38.7, -9.1, "Europe/Lisbon", "WET/WEST", "Lisbon", True),
149
+ ( 0, 0, 41.2, -8.6, "Europe/Lisbon", "WET/WEST", "Porto", False),
150
+ ( 0, 0, 0.3, 6.7, "Africa/Sao_Tome", "GMT", "São Tomé", True),
151
+ # UTC+1
152
+ ( 1, 0, 33.6, -7.6, "Africa/Casablanca", "WET/WEST", "Casablanca", False),
153
+ ( 1, 0, 34.0, -6.8, "Africa/Casablanca", "WET/WEST", "Rabat", True),
154
+ ( 1, 0, 6.4, 2.3, "Africa/Porto-Novo", "WAT", "Porto-Novo", True),
155
+ ( 1, 0, 6.4, 2.4, "Africa/Lagos", "WAT", "Cotonou", False),
156
+ ( 1, 0, 13.5, 2.1, "Africa/Niamey", "WAT", "Niamey", True),
157
+ ( 1, 0, 48.9, 2.3, "Europe/Paris", "CET/CEST", "Paris", True),
158
+ ( 1, 0, 43.3, 5.4, "Europe/Paris", "CET/CEST", "Marseille", False),
159
+ ( 1, 0, 45.7, 4.8, "Europe/Paris", "CET/CEST", "Lyon", False),
160
+ ( 1, 0, 43.6, 1.4, "Europe/Paris", "CET/CEST", "Toulouse", False),
161
+ ( 1, 0, 52.5, 13.4, "Europe/Berlin", "CET/CEST", "Berlin", True),
162
+ ( 1, 0, 53.6, 10.0, "Europe/Berlin", "CET/CEST", "Hamburg", False),
163
+ ( 1, 0, 48.1, 11.6, "Europe/Berlin", "CET/CEST", "Munich", False),
164
+ ( 1, 0, 50.9, 6.9, "Europe/Berlin", "CET/CEST", "Cologne", False),
165
+ ( 1, 0, 50.1, 8.7, "Europe/Berlin", "CET/CEST", "Frankfurt", False),
166
+ ( 1, 0, 53.1, 8.8, "Europe/Berlin", "CET/CEST", "Bremen", False),
167
+ ( 1, 0, 51.5, 7.5, "Europe/Berlin", "CET/CEST", "Dortmund", False),
168
+ ( 1, 0, 41.9, 12.5, "Europe/Rome", "CET/CEST", "Rome", True),
169
+ ( 1, 0, 45.5, 9.2, "Europe/Rome", "CET/CEST", "Milan", False),
170
+ ( 1, 0, 40.8, 14.3, "Europe/Rome", "CET/CEST", "Naples", False),
171
+ ( 1, 0, 45.4, 12.3, "Europe/Rome", "CET/CEST", "Venice", False),
172
+ ( 1, 0, 43.8, 11.2, "Europe/Rome", "CET/CEST", "Florence", False),
173
+ ( 1, 0, 40.4, -3.7, "Europe/Madrid", "CET/CEST", "Madrid", True),
174
+ ( 1, 0, 41.4, 2.2, "Europe/Madrid", "CET/CEST", "Barcelona", False),
175
+ ( 1, 0, 39.5, -0.4, "Europe/Madrid", "CET/CEST", "Valencia", False),
176
+ ( 1, 0, 37.4, -5.9, "Europe/Madrid", "CET/CEST", "Seville", False),
177
+ ( 1, 0, 36.7, -4.4, "Europe/Madrid", "CET/CEST", "Málaga", False),
178
+ ( 1, 0, 47.4, 8.5, "Europe/Zurich", "CET/CEST", "Zurich", False),
179
+ ( 1, 0, 46.9, 7.5, "Europe/Zurich", "CET/CEST", "Bern", True),
180
+ ( 1, 0, 46.2, 6.1, "Europe/Zurich", "CET/CEST", "Geneva", False),
181
+ ( 1, 0, 50.8, 4.4, "Europe/Brussels", "CET/CEST", "Brussels", True),
182
+ ( 1, 0, 51.2, 4.4, "Europe/Brussels", "CET/CEST", "Antwerp", False),
183
+ ( 1, 0, 52.4, 4.9, "Europe/Amsterdam", "CET/CEST", "Amsterdam", True),
184
+ ( 1, 0, 51.9, 4.5, "Europe/Amsterdam", "CET/CEST", "Rotterdam", False),
185
+ ( 1, 0, 52.1, 5.1, "Europe/Amsterdam", "CET/CEST", "Utrecht", False),
186
+ ( 1, 0, 59.9, 10.7, "Europe/Oslo", "CET/CEST", "Oslo", True),
187
+ ( 1, 0, 60.4, 5.3, "Europe/Oslo", "CET/CEST", "Bergen", False),
188
+ ( 1, 0, 57.7, 12.0, "Europe/Stockholm", "CET/CEST", "Gothenburg", False),
189
+ ( 1, 0, 59.3, 18.1, "Europe/Stockholm", "CET/CEST", "Stockholm", True),
190
+ ( 1, 0, 55.7, 12.6, "Europe/Copenhagen", "CET/CEST", "Copenhagen", True),
191
+ ( 1, 0, 56.2, 10.2, "Europe/Copenhagen", "CET/CEST", "Aarhus", False),
192
+ ( 1, 0, 52.2, 21.0, "Europe/Warsaw", "CET/CEST", "Warsaw", True),
193
+ ( 1, 0, 50.1, 19.9, "Europe/Warsaw", "CET/CEST", "Kraków", False),
194
+ ( 1, 0, 50.0, 14.4, "Europe/Prague", "CET/CEST", "Prague", True),
195
+ ( 1, 0, 47.5, 19.0, "Europe/Budapest", "CET/CEST", "Budapest", True),
196
+ ( 1, 0, 48.1, 17.1, "Europe/Bratislava", "CET/CEST", "Bratislava", True),
197
+ ( 1, 0, 46.1, 14.5, "Europe/Ljubljana", "CET/CEST", "Ljubljana", True),
198
+ ( 1, 0, 45.8, 16.0, "Europe/Zagreb", "CET/CEST", "Zagreb", True),
199
+ ( 1, 0, 43.8, 18.4, "Europe/Sarajevo", "CET/CEST", "Sarajevo", True),
200
+ ( 1, 0, 42.4, 19.3, "Europe/Podgorica", "CET/CEST", "Podgorica", True),
201
+ ( 1, 0, 42.0, 21.4, "Europe/Skopje", "CET/CEST", "Skopje", True),
202
+ ( 1, 0, 41.3, 19.8, "Europe/Tirane", "CET/CEST", "Tirana", True),
203
+ ( 1, 0, 6.5, 3.4, "Africa/Lagos", "WAT", "Lagos", False),
204
+ ( 1, 0, 9.1, 7.5, "Africa/Lagos", "WAT", "Abuja", True),
205
+ ( 1, 0, 3.9, 11.5, "Africa/Douala", "WAT", "Yaoundé", True),
206
+ ( 1, 0, 4.4, 9.7, "Africa/Douala", "WAT", "Douala", False),
207
+ ( 1, 0, 4.4, 18.6, "Africa/Bangui", "WAT", "Bangui", True),
208
+ ( 1, 0, 12.1, 15.1, "Africa/Ndjamena", "WAT", "N'Djamena", True),
209
+ ( 1, 0, 0.4, 9.5, "Africa/Libreville", "WAT", "Libreville", True),
210
+ ( 1, 0, 3.8, 8.8, "Africa/Malabo", "WAT", "Malabo", True),
211
+ ( 1, 0, 36.8, 10.2, "Africa/Tunis", "CET", "Tunis", True),
212
+ ( 1, 0, 44.8, 20.5, "Europe/Belgrade", "CET/CEST", "Belgrade", True),
213
+ ( 1, 0, 43.9, 17.7, "Europe/Sarajevo", "CET/CEST", "Mostar", False),
214
+ ( 1, 0, 42.7, 21.2, "Europe/Belgrade", "CET/CEST", "Pristina", True),
215
+ ( 1, 0, -4.3, 15.3, "Africa/Kinshasa", "WAT", "Kinshasa", True),
216
+ # UTC+2
217
+ ( 2, 0, 32.9, 13.2, "Africa/Tripoli", "EET", "Tripoli", True),
218
+ ( 2, 0, 37.9, 23.7, "Europe/Athens", "EET/EEST", "Athens", True),
219
+ ( 2, 0, 40.6, 22.9, "Europe/Athens", "EET/EEST", "Thessaloniki", False),
220
+ ( 2, 0, 30.0, 31.2, "Africa/Cairo", "EET", "Cairo", True),
221
+ ( 2, 0, 31.2, 29.9, "Africa/Cairo", "EET", "Alexandria", False),
222
+ ( 2, 0, -26.2, 28.0, "Africa/Johannesburg", "SAST", "Johannesburg", False),
223
+ ( 2, 0, -33.9, 18.4, "Africa/Johannesburg", "SAST", "Cape Town", False),
224
+ ( 2, 0, -29.9, 30.9, "Africa/Johannesburg", "SAST", "Durban", False),
225
+ ( 2, 0, -25.7, 28.2, "Africa/Johannesburg", "SAST", "Pretoria", True),
226
+ ( 2, 0, -25.9, 32.6, "Africa/Maputo", "CAT", "Maputo", True),
227
+ ( 2, 0, -18.9, 32.7, "Africa/Harare", "CAT", "Harare", True),
228
+ ( 2, 0, -15.4, 28.3, "Africa/Lusaka", "CAT", "Lusaka", True),
229
+ ( 2, 0, -24.7, 25.9, "Africa/Gaborone", "CAT", "Gaborone", True),
230
+ ( 2, 0, -22.6, 17.1, "Africa/Windhoek", "WAT/WAST", "Windhoek", True),
231
+ ( 2, 0, -29.4, 27.5, "Africa/Maseru", "SAST", "Maseru", True),
232
+ ( 2, 0, -26.3, 31.1, "Africa/Mbabane", "SAST", "Mbabane", True),
233
+ ( 2, 0, 50.5, 30.5, "Europe/Kiev", "EET/EEST", "Kyiv", True),
234
+ ( 2, 0, 49.8, 24.0, "Europe/Kiev", "EET/EEST", "Lviv", False),
235
+ ( 2, 0, 46.5, 30.7, "Europe/Kiev", "EET/EEST", "Odessa", False),
236
+ ( 2, 0, 56.9, 24.1, "Europe/Riga", "EET/EEST", "Riga", True),
237
+ ( 2, 0, 54.7, 25.3, "Europe/Vilnius", "EET/EEST", "Vilnius", True),
238
+ ( 2, 0, 59.4, 24.7, "Europe/Tallinn", "EET/EEST", "Tallinn", True),
239
+ ( 2, 0, 60.2, 25.0, "Europe/Helsinki", "EET/EEST", "Helsinki", True),
240
+ ( 2, 0, 60.4, 25.7, "Europe/Helsinki", "EET/EEST", "Tampere", False),
241
+ ( 2, 0, 44.4, 26.1, "Europe/Bucharest", "EET/EEST", "Bucharest", True),
242
+ ( 2, 0, 44.2, 28.6, "Europe/Bucharest", "EET/EEST", "Constanța", False),
243
+ ( 2, 0, 42.7, 23.3, "Europe/Sofia", "EET/EEST", "Sofia", True),
244
+ ( 2, 0, 42.1, 24.7, "Europe/Sofia", "EET/EEST", "Plovdiv", False),
245
+ ( 2, 0, 31.8, 35.2, "Asia/Jerusalem", "IST/IDT", "Jerusalem", True),
246
+ ( 2, 0, 32.1, 34.8, "Asia/Jerusalem", "IST/IDT", "Tel Aviv", False),
247
+ ( 2, 0, 33.9, 35.5, "Asia/Beirut", "EET/EEST", "Beirut", True),
248
+ ( 2, 0, 15.6, 32.5, "Africa/Khartoum", "EAT", "Khartoum", True),
249
+ ( 2, 0, 4.9, 31.6, "Africa/Juba", "EAT", "Juba", True),
250
+ ( 2, 0, -13.0, 27.8, "Africa/Lusaka", "CAT", "Lilongwe", True),
251
+ ( 2, 0, -1.7, 29.2, "Africa/Kigali", "CAT", "Kigali", True),
252
+ ( 2, 0, -3.4, 29.4, "Africa/Bujumbura", "CAT", "Bujumbura", True),
253
+ # UTC+3
254
+ ( 3, 0, 33.5, 36.3, "Asia/Damascus", "EET/EEST", "Damascus", True),
255
+ ( 3, 0, 32.0, 36.0, "Asia/Amman", "EET/EEST", "Amman", True),
256
+ ( 3, 0, 2.0, 45.3, "Africa/Mogadishu", "EAT", "Mogadishu", True),
257
+ ( 3, 0, 55.7, 37.6, "Europe/Moscow", "MSK", "Moscow", True),
258
+ ( 3, 0, 59.9, 30.3, "Europe/Moscow", "MSK", "St. Petersburg", False),
259
+ ( 3, 0, 53.9, 27.6, "Europe/Minsk", "FET", "Minsk", True),
260
+ ( 3, 0, 24.7, 46.7, "Asia/Riyadh", "AST", "Riyadh", True),
261
+ ( 3, 0, 21.5, 39.2, "Asia/Riyadh", "AST", "Jeddah", False),
262
+ ( 3, 0, 25.3, 51.5, "Asia/Qatar", "AST", "Doha", True),
263
+ ( 3, 0, 26.2, 50.6, "Asia/Bahrain", "AST", "Manama", True),
264
+ ( 3, 0, 15.3, 38.9, "Africa/Asmara", "EAT", "Asmara", True),
265
+ ( 3, 0, 11.6, 43.1, "Africa/Djibouti", "EAT", "Djibouti", True),
266
+ ( 3, 0, -1.3, 36.8, "Africa/Nairobi", "EAT", "Nairobi", True),
267
+ ( 3, 0, -4.0, 39.7, "Africa/Nairobi", "EAT", "Mombasa", False),
268
+ ( 3, 0, 41.0, 28.9, "Europe/Istanbul", "TRT", "Istanbul", False),
269
+ ( 3, 0, 39.9, 32.9, "Europe/Istanbul", "TRT", "Ankara", True),
270
+ ( 3, 0, 38.4, 27.1, "Europe/Istanbul", "TRT", "Izmir", False),
271
+ ( 3, 0, 9.0, 38.7, "Africa/Addis_Ababa", "EAT", "Addis Ababa", True),
272
+ ( 3, 0, -6.2, 35.7, "Africa/Dar_es_Salaam", "EAT", "Dodoma", True),
273
+ ( 3, 0, -6.8, 39.3, "Africa/Dar_es_Salaam", "EAT", "Dar es Salaam", False),
274
+ ( 3, 0, 0.3, 32.6, "Africa/Kampala", "EAT", "Kampala", True),
275
+ # UTC+3:30
276
+ ( 3, 30, 35.7, 51.4, "Asia/Tehran", "IRST/IRDT", "Tehran", True),
277
+ ( 3, 30, 32.7, 51.7, "Asia/Tehran", "IRST/IRDT", "Isfahan", False),
278
+ ( 3, 30, 36.3, 59.6, "Asia/Tehran", "IRST/IRDT", "Mashhad", False),
279
+ # UTC+4
280
+ ( 4, 0, 24.5, 54.4, "Asia/Dubai", "GST", "Abu Dhabi", True),
281
+ ( 4, 0, 23.6, 58.6, "Asia/Muscat", "GST", "Muscat", True),
282
+ ( 4, 0, 25.2, 55.3, "Asia/Dubai", "GST", "Dubai", False),
283
+ ( 4, 0, 25.3, 55.5, "Asia/Dubai", "GST", "Sharjah", False),
284
+ ( 4, 0, 40.4, 49.8, "Asia/Baku", "AZT", "Baku", True),
285
+ ( 4, 0, 41.7, 44.8, "Asia/Tbilisi", "GET", "Tbilisi", True),
286
+ ( 4, 0, 40.2, 44.5, "Asia/Yerevan", "AMT", "Yerevan", True),
287
+ ( 4, 0, 53.2, 50.2, "Europe/Samara", "SAMT", "Samara", False),
288
+ ( 4, 0, -20.2, 57.5, "Indian/Mauritius", "MUT", "Port Louis", True),
289
+ ( 4, 0, -4.6, 55.5, "Indian/Mahe", "SCT", "Victoria", True),
290
+ # UTC+4:30
291
+ ( 4, 30, 34.5, 69.2, "Asia/Kabul", "AFT", "Kabul", True),
292
+ ( 4, 30, 31.6, 65.7, "Asia/Kabul", "AFT", "Kandahar", False),
293
+ # UTC+5
294
+ ( 5, 0, 56.8, 60.6, "Asia/Yekaterinburg", "YEKT", "Yekaterinburg", False),
295
+ ( 5, 0, 37.9, 58.4, "Asia/Ashgabat", "TMT", "Ashgabat", True),
296
+ ( 5, 0, 24.9, 67.0, "Asia/Karachi", "PKT", "Karachi", False),
297
+ ( 5, 0, 33.7, 73.1, "Asia/Karachi", "PKT", "Islamabad", True),
298
+ ( 5, 0, 31.5, 74.3, "Asia/Karachi", "PKT", "Lahore", False),
299
+ ( 5, 0, 34.0, 71.6, "Asia/Karachi", "PKT", "Peshawar", False),
300
+ ( 5, 0, 41.3, 69.3, "Asia/Tashkent", "UZT", "Tashkent", True),
301
+ ( 5, 0, 39.7, 66.9, "Asia/Samarkand", "UZT", "Samarkand", False),
302
+ ( 5, 0, 37.6, 61.8, "Asia/Ashgabat", "TMT", "Mary", False),
303
+ ( 5, 0, 43.3, 76.9, "Asia/Almaty", "ALMT", "Almaty", False),
304
+ ( 5, 0, 51.2, 71.4, "Asia/Almaty", "ALMT", "Astana", True),
305
+ ( 5, 0, 54.7, 56.0, "Asia/Yekaterinburg", "YEKT", "Ufa", False),
306
+ ( 5, 0, 54.8, 56.0, "Asia/Yekaterinburg", "YEKT", "Chelyabinsk", False),
307
+ # UTC+5:30
308
+ ( 5, 30, 19.1, 72.9, "Asia/Kolkata", "IST", "Mumbai", False),
309
+ ( 5, 30, 28.6, 77.2, "Asia/Kolkata", "IST", "Delhi", True),
310
+ ( 5, 30, 22.6, 88.4, "Asia/Kolkata", "IST", "Kolkata", False),
311
+ ( 5, 30, 12.9, 77.6, "Asia/Kolkata", "IST", "Bangalore", False),
312
+ ( 5, 30, 13.1, 80.3, "Asia/Kolkata", "IST", "Chennai", False),
313
+ ( 5, 30, 17.4, 78.5, "Asia/Kolkata", "IST", "Hyderabad", False),
314
+ ( 5, 30, 23.0, 72.6, "Asia/Kolkata", "IST", "Ahmedabad", False),
315
+ ( 5, 30, 18.5, 73.9, "Asia/Kolkata", "IST", "Pune", False),
316
+ ( 5, 30, 6.9, 79.9, "Asia/Colombo", "IST", "Colombo", False),
317
+ ( 5, 30, 7.0, 80.0, "Asia/Colombo", "IST", "Sri Jayawardenepura Kotte", True),
318
+ # UTC+5:45
319
+ ( 5, 45, 27.7, 85.3, "Asia/Kathmandu", "NPT", "Kathmandu", True),
320
+ # UTC+6
321
+ ( 6, 0, 42.9, 74.6, "Asia/Bishkek", "KGT", "Bishkek", True),
322
+ ( 6, 0, 55.0, 73.4, "Asia/Omsk", "OMST", "Omsk", False),
323
+ ( 6, 0, 23.7, 90.4, "Asia/Dhaka", "BST", "Dhaka", True),
324
+ ( 6, 0, 22.3, 91.8, "Asia/Dhaka", "BST", "Chittagong", False),
325
+ ( 6, 0, 27.5, 90.4, "Asia/Thimphu", "BTT", "Thimphu", True),
326
+ ( 6, 0, 43.8, 87.6, "Asia/Urumqi", "CST", "Urumqi", False),
327
+ # UTC+6:30
328
+ ( 6, 30, 16.8, 96.2, "Asia/Rangoon", "MMT", "Yangon", False),
329
+ ( 6, 30, 21.9, 96.1, "Asia/Rangoon", "MMT", "Naypyidaw", True),
330
+ # UTC+7
331
+ ( 7, 0, 55.0, 82.9, "Asia/Novosibirsk", "NOVT", "Novosibirsk", False),
332
+ ( 7, 0, 13.7, 100.5, "Asia/Bangkok", "ICT", "Bangkok", True),
333
+ ( 7, 0, 18.8, 102.6, "Asia/Vientiane", "ICT", "Vientiane", True),
334
+ ( 7, 0, 11.6, 104.9, "Asia/Phnom_Penh", "ICT", "Phnom Penh", True),
335
+ ( 7, 0, 21.0, 105.8, "Asia/Ho_Chi_Minh", "ICT", "Hanoi", True),
336
+ ( 7, 0, 10.8, 106.7, "Asia/Ho_Chi_Minh", "ICT", "Ho Chi Minh City", False),
337
+ ( 7, 0, 16.1, 108.2, "Asia/Ho_Chi_Minh", "ICT", "Da Nang", False),
338
+ ( 7, 0, -6.2, 106.8, "Asia/Jakarta", "WIB", "Jakarta", True),
339
+ ( 7, 0, -7.2, 112.7, "Asia/Jakarta", "WIB", "Surabaya", False),
340
+ ( 7, 0, -6.9, 107.6, "Asia/Jakarta", "WIB", "Bandung", False),
341
+ ( 7, 0, 56.0, 92.8, "Asia/Krasnoyarsk", "KRAT", "Krasnoyarsk", False),
342
+ # UTC+8
343
+ ( 8, 0, 39.9, 116.4, "Asia/Shanghai", "CST", "Beijing", True),
344
+ ( 8, 0, 31.2, 121.5, "Asia/Shanghai", "CST", "Shanghai", False),
345
+ ( 8, 0, 23.1, 113.3, "Asia/Shanghai", "CST", "Guangzhou", False),
346
+ ( 8, 0, 22.3, 114.2, "Asia/Hong_Kong", "HKT", "Hong Kong", False),
347
+ ( 8, 0, 22.2, 113.5, "Asia/Macau", "CST", "Macau", False),
348
+ ( 8, 0, 22.6, 120.3, "Asia/Taipei", "CST", "Kaohsiung", False),
349
+ ( 8, 0, 25.0, 121.5, "Asia/Taipei", "CST", "Taipei", True),
350
+ ( 8, 0, 30.6, 104.1, "Asia/Shanghai", "CST", "Chengdu", False),
351
+ ( 8, 0, 36.1, 103.8, "Asia/Shanghai", "CST", "Lanzhou", False),
352
+ ( 8, 0, 34.3, 108.9, "Asia/Shanghai", "CST", "Xi'an", False),
353
+ ( 8, 0, 29.6, 106.6, "Asia/Shanghai", "CST", "Chongqing", False),
354
+ ( 8, 0, 3.1, 101.7, "Asia/Kuala_Lumpur", "MYT", "Kuala Lumpur", True),
355
+ ( 8, 0, 5.4, 100.3, "Asia/Kuala_Lumpur", "MYT", "Penang", False),
356
+ ( 8, 0, 1.3, 103.8, "Asia/Singapore", "SGT", "Singapore", True),
357
+ ( 8, 0, 14.6, 121.0, "Asia/Manila", "PHT", "Manila", True),
358
+ ( 8, 0, 10.3, 123.9, "Asia/Manila", "PHT", "Cebu", False),
359
+ ( 8, 0, -8.6, 115.2, "Asia/Makassar", "WITA", "Denpasar", False),
360
+ ( 8, 0, -5.1, 119.4, "Asia/Makassar", "WITA", "Makassar", False),
361
+ ( 8, 0, -31.9, 115.9, "Australia/Perth", "AWST", "Perth", False),
362
+ ( 8, 0, 47.9, 106.9, "Asia/Ulaanbaatar", "ULAT", "Ulaanbaatar", True),
363
+ ( 8, 0, 52.3, 104.3, "Asia/Irkutsk", "IRKT", "Irkutsk", False),
364
+ ( 8, 0, 1.5, 110.3, "Asia/Kuching", "MYT", "Kuching", False),
365
+ ( 8, 0, 5.8, 116.1, "Asia/Kuching", "MYT", "Kota Kinabalu", False),
366
+ ( 8, 0, 4.9, 115.0, "Asia/Brunei", "BNT", "Bandar Seri Begawan", True),
367
+ # UTC+9
368
+ ( 9, 0, -8.5, 125.6, "Asia/Dili", "TLT", "Dili", True),
369
+ ( 9, 0, 35.7, 139.7, "Asia/Tokyo", "JST", "Tokyo", True),
370
+ ( 9, 0, 34.7, 135.5, "Asia/Tokyo", "JST", "Osaka", False),
371
+ ( 9, 0, 35.2, 136.9, "Asia/Tokyo", "JST", "Nagoya", False),
372
+ ( 9, 0, 43.1, 141.3, "Asia/Tokyo", "JST", "Sapporo", False),
373
+ ( 9, 0, 33.6, 130.4, "Asia/Tokyo", "JST", "Fukuoka", False),
374
+ ( 9, 0, 37.6, 127.0, "Asia/Seoul", "KST", "Seoul", True),
375
+ ( 9, 0, 35.1, 129.0, "Asia/Seoul", "KST", "Busan", False),
376
+ ( 9, 0, 39.0, 125.8, "Asia/Pyongyang", "KST", "Pyongyang", True),
377
+ ( 9, 0, 62.0, 129.7, "Asia/Yakutsk", "YAKT", "Yakutsk", False),
378
+ ( 9, 0, -8.6, 125.6, "Asia/Dili", "TLT", "Kupang", False),
379
+ ( 9, 0, -0.9, 134.1, "Asia/Jayapura", "WIT", "Jayapura", False),
380
+ ( 9, 0, 7.4, 134.5, "Pacific/Palau", "PWT", "Ngerulmud", True),
381
+ # UTC+9:30
382
+ ( 9, 30, -34.9, 138.6, "Australia/Adelaide", "ACST/ACDT", "Adelaide", False),
383
+ ( 9, 30, -12.4, 130.8, "Australia/Darwin", "ACST", "Darwin", False),
384
+ # UTC+10
385
+ ( 10, 0, -33.9, 151.2, "Australia/Sydney", "AEST/AEDT", "Sydney", False),
386
+ ( 10, 0, -37.8, 145.0, "Australia/Melbourne", "AEST/AEDT", "Melbourne", False),
387
+ ( 10, 0, -27.5, 153.0, "Australia/Brisbane", "AEST", "Brisbane", False),
388
+ ( 10, 0, -35.3, 149.1, "Australia/Sydney", "AEST/AEDT", "Canberra", True),
389
+ ( 10, 0, 43.1, 131.9, "Asia/Vladivostok", "VLAT", "Vladivostok", False),
390
+ ( 10, 0, 13.5, 144.8, "Pacific/Guam", "ChST", "Hagåtña", True),
391
+ # UTC+10:30
392
+ ( 10, 30, -31.5, 159.1, "Australia/Lord_Howe", "LHST/LHDT", "Lord Howe Island", False),
393
+ # UTC+11
394
+ ( 11, 0, 6.9, 158.2, "Pacific/Pohnpei", "PONT", "Palikir", True),
395
+ ( 11, 0, -9.4, 160.0, "Pacific/Guadalcanal", "SBT", "Honiara", True),
396
+ ( 11, 0, -17.7, 168.3, "Pacific/Efate", "VUT", "Port Vila", True),
397
+ ( 11, 0, -22.3, 166.5, "Pacific/Noumea", "NCT", "Nouméa", False),
398
+ ( 11, 0, 59.6, 150.8, "Asia/Magadan", "MAGT", "Magadan", False),
399
+ ( 11, 0, 47.0, 142.7, "Asia/Sakhalin", "SAKT", "Yuzhno-Sakhalinsk", False),
400
+ # UTC+12
401
+ ( 12, 0, -36.9, 174.8, "Pacific/Auckland", "NZST/NZDT", "Auckland", False),
402
+ ( 12, 0, -41.3, 174.8, "Pacific/Auckland", "NZST/NZDT", "Wellington", True),
403
+ ( 12, 0, -43.5, 172.6, "Pacific/Auckland", "NZST/NZDT", "Christchurch", False),
404
+ ( 12, 0, -18.1, 178.4, "Pacific/Fiji", "FJT", "Suva", True),
405
+ ( 12, 0, 53.0, 158.7, "Asia/Kamchatka", "PETT", "Petropavlovsk-Kamchatsky", False),
406
+ ( 12, 0, 64.7, 177.5, "Asia/Anadyr", "ANAT", "Anadyr", False),
407
+ ( 12, 0, -8.5, 179.2, "Pacific/Funafuti", "TVT", "Funafuti", True),
408
+ ( 12, 0, 7.1, 171.4, "Pacific/Majuro", "MHT", "Majuro", True),
409
+ ( 12, 0, 7.3, 168.7, "Pacific/Kwajalein", "MHT", "Kwajalein", False),
410
+ # UTC+12:45
411
+ ( 12, 45, -43.9, -176.6, "Pacific/Chatham", "CHAST/CHADT","Waitangi", False),
412
+ # UTC+13
413
+ ( 13, 0, -21.1, -175.2, "Pacific/Tongatapu", "TOT", "Nuku'alofa", True),
414
+ ( 13, 0, -13.8, -172.0, "Pacific/Apia", "WST", "Apia", True),
415
+ ( 13, 0, -9.4, -171.2, "Pacific/Fakaofo", "TKT", "Fakaofo", False),
416
+ # UTC+14
417
+ ( 14, 0, 1.9, 157.5, "Pacific/Kiritimati", "LINT", "Kiritimati", False),
418
+ ]
419
+
420
+
421
+ # Pre-computed 2880×1440 land/sea bitmap (0.125°/pixel, zlib+base64), built from
422
+ # Natural Earth 110m coastlines. Each bit = 1 land, 0 sea. Row-major, top = 90°N,
423
+ # left = 180°W: column c → lon = −180 + (c+0.5)×(360/2880), row r → lat =
424
+ # 90 − (r+0.5)×(180/1440). Decoded lazily by `_get_world_bitmap`.
425
+ _WORLD_MAP_DATA = (
426
+ "eNrtvc3KLjcW71dqNa0TaKyGDLIDZqsvoTM6HjgtX4ohN2DI4HjgY5VpSA99Cb6NDA6xnB54csDT"
427
+ "jGJtfKAnAcsYjsu4XJWnvlXfJZWkUj2PBO22937f+vjV0lr/tfSVJLHFFltsscUWW2yxxRZbbLHF"
428
+ "FltsscUWW2yxxRZbbLHFFltsscUWW2yxxRZbbLHFFltsscUWW2yxxRZbbLHFFltsscUWW2yxxRZb"
429
+ "bLHFFltsscUWW2yxxRbbLRss28YjC4cNlErLIg9XDZcR9PlGynzzb8uMlRG0NTNd/hlULrQIWqex"
430
+ "Kb58xzMPTUZ6hta8YtO0jKBPtiWExYFvseVlYpv5jLnbWNDHbA2ziAiPtEd0e7fILx1+5j9scC4i"
431
+ "QrMQuMCv8sEsQraV3s3dBqrdL6n+i216ldh2fEa5oSKa8CjqikY6+VkJGvEHIvAzmPOhYFQ0lpzT"
432
+ "RbcRZd2RLHtDQ8w+wm9LP0ibjAZEV62ZnvRSY/0jzEMhiQLPxG9k23nJ9IdhTAx3mpbfWPtRGEtK"
433
+ "po6jSI5z/iaK6Z2aRrGqnsVGml1uK25fT89vZMvpCs3iuHe+qG7HNscjQvPNYkVUiI00cVN3+BSk"
434
+ "NzFoUicjcCVHofqc07MPdPxDgZWRiGDLR3ylwo/0MZ8Szw9wP2k4HmLlw/qsH9XloYmXlht6bytP"
435
+ "32/547Mu/w0sf9HwBDeqe6OxRhjLBjfm/LiqZCs0oY594hvJdTwSY3jsNogLrUG2hrmwThglNxov"
436
+ "6wOdePwPTDwAcyGc0ZaLgVpyhd2nBN5bl2RzD0BcpChg08dQA6eX3clvzMrKaWIg63ZuVgl1SW0p"
437
+ "wE6N3iHP74VzQZbSDWozR0EP961k+eeFL7D1wbzpukdDSwFNM+3Odnp5XrlUAazl5+UNHbRYAkYs"
438
+ "qjrcGz2zZYU3CoSD48AL8YxaDINI6SvUjhij5X0ywv79v5jTQjbDILQ/Qay9ZApDHcLBCszWKCSc"
439
+ "ZRvIaqkOOJjD2zx7ykJNvrFitZ2Roam9QcvFDXs1vcm3S4LVdlhxD52NsQlnbcx7dspcDAVUl4MB"
440
+ "VpPo8HhpU+ttpQKbhDNovYhEtYp6hzVH3vTE0PRy0bveKjvLOjNDE14GmPc4I1cjLji88ihunSOp"
441
+ "uzmpzKB+ypyM+78J5r1XdZa+0fA4k/Z5Grsi/Rig6jbMxgUPvCrr3T+y+lIs5GSlGkDBNZvKoFM8"
442
+ "KiFBJ5xx5zaIVZsGQScrsNL3Chu8NEfULmfYXh7Ytb4Q5QYZxBcpufrCQJV1yAnnZBhAsJnAofAq"
443
+ "0EDtYOAhOHo0g34WBoWNg5xxG2WJVYN+P8xaxuTNs7bvCaLKAeCEc/35mnH0555UiqbqFQ1c/zlS"
444
+ "t8gJZ1xfHzrQ0H8LB3JRq4xZDOFj+83nabK90W7WJOfYugrDoeiN1pIh3yvyiKWChKVJMsCVw4DB"
445
+ "zP+iO0/C5qz0DfpI1ccJZxYKZ1ge5CwWypj2phUQN0oXBpOnkBXOnZKlM7dhIjjkAcchPL6d/7bm"
446
+ "PtvIT2YTa00ywkPuyyAC8gNuI4zKKFopw4PWguecDbyzONTDtfs33e8mwQzHEsV7soHHmy4TJnPR"
447
+ "oD3pK3dmItm+N6rf7/qqHVOHo7L+DYq2eqRC5aOij71RqxMer9jtJHX77vI5YLAtR6qZdv0GbZcT"
448
+ "zaP+OqLFHLhns56Y7VgzDGW3lXbYtS3FNR2c/Ngab/t/iNds02ReKL1uoRU7wI6Gs3tQk6SgtoRf"
449
+ "DP63jYHpYpng8pVWh+aDwoC2w2rqkK3KbD95zxmtReo3oyhzwQJNtmehj0fn9Gg4ph40Nu07WLUm"
450
+ "858d9Zoz2Ls/uYgz3pVri7tUbF3Ny4BA263axY0953qu7AF56psz2L0o0FnASHx5FdA6O7zAOetw"
451
+ "rmc5rtcOrsQ3sV+SOcaZ+prD2wYMDhW+PEGiG5Zn66/FLuCMdkQ50JSXzNfk/9n8ZlbdtJljvxNF"
452
+ "yAWc2U6OSTQ5939NHZOe1TBYs3vXWICe4SytW0Wib87FNudqNUHmzZ77fJBMlVFqztmqatrrIES3"
453
+ "U7HuIZ2PCWDZeb2i5/xgLMguZ+zdnNGOOetn//0qZeSjWK1ORQNFo+nwrjYD3u0ZbQdBqB8jhlVe"
454
+ "zH0VBE8tFrUCZMccqO+8G25LA2TwrWlHF7ovgsw/ZbXyCe4WN48p6NQuZxOxsSGPkcfKx0qs3V0K"
455
+ "BX3ng8goRbl8ot2n/fOtJ19yPwf2FwjJdoXTQ48yc8ryvMPxOqKy88jM69CZVqHgXIylXinvuY01"
456
+ "/3zt5EiyKQfYIZ1A/MoNuuMDUBkgaLQlLeExQthvGNwbgFqNyxxe56Lhivd6rzdUefhb+XEcWynb"
457
+ "IyT/sPEQbOtrE7dV0RXRRjOcN463un3VT//+8CLcWNjZ67Rg/avtPgjvlkg+3mb2+ZwGSjDLSWkF"
458
+ "FQx7YbQ5Ei4TdiLzFlb9szB0YO/6WMFKUU6vyj34Z3WOYltSKkD7VNV+OlUOztYMyev8DbDu7Xc5"
459
+ "/6Jwnnwtx4lM92j5Hwb1IJo/zkDrWKt/dLt+pUbCrrBsGScCcvvbbPpUjjn3C3xo60E/R5W11ONX"
460
+ "zWLYeo/E2imSNT9LPBbrqpvldjj7nHDXVbhR+3Vx+Wvnn1PQPMvj6bNa4a1GeuzPa2wa3tFZUt02"
461
+ "hx4rHl0grjalfpMk/MH785Y/B91C4OoztJv35EbCznKxTozhanP2n4qDYZ+p7PHAsNqg579W6pm0"
462
+ "TjmtvW+zDxVnqWElSdgNKHzSI3kzAVCbs+qgqVPOcNg37cdqlKrSGFn3wGmz83rVxb5qNbDUK5E5"
463
+ "KG/MinXNeJM4yRm4te6Wc7cLIqt8Q949sGwq0opVIqMhld9tvsI0DIK6/zd1eu31oxPX7q4Cgroo"
464
+ "2GdM/ezRstrtU4z3ViVGAloSu5yzOWeYHU1MV+KG410FW8MdhJloSnSs/WOuPrwAKyEN7Hlnu5zl"
465
+ "vNYFqzt8CMztmbmdIt0AVmZpVHvH9N2oDuUK5zVXu2dHyR+tZt1y2iNrztXMHnP/TN0ObzWXV3c1"
466
+ "ozXnJkXBxQJEA12X2XV0M86POJihcmGf6uPPRdyKvXaimnJrNuzuLBadgtDPDwq7HTCb3lsmJKvf"
467
+ "hBpzxm4XV9QPliko825FSm3P+QLn3KC+wa0GlGx6b5FUR37ot+pVPp5xdjEYUDuFDC1QKetJX2LO"
468
+ "uVhN3n1Un2ec6wdGpTTaTChpNsQYuz7uKhBmeMEz0H725D5ncsRw3HBu5iYRQ84PpFV5gSclPBpN"
469
+ "DINNMzpB5pxx1RvLYoEznHkwwOlhAWWhAxbT0JBM9tjTWA0NquRssl/7zv0X7f3DAwadTnp+08s/"
470
+ "r9+JLyUhXDsS2hUcfBIaUqqcoKAXCKFmNWZl8wqw22Vxg5UteFO8sJB+5UG2MoRf7cbwcaLSPA8u"
471
+ "zVq+KEmL7e6fLruznfCJZns/9B6om6vEDujhDXPKmUEMX7ePUYGjMUeJDDmXHOvJI7QS0/en89Zz"
472
+ "GtBi1GpjDjjywTcsKse6nMnWy46mD7cLgoAp55yshO2VB4DlavXipwNpAlr8nrhUinebOg3lG29a"
473
+ "QF2txLZ672jaV7fwqnTRFowDZBtltOKQ6pj7hSaWL7owPv2gOd1wgpqcwU44wlPOudkWkbZGJ/Dx"
474
+ "DOfxrGAmD3Dzu2BfQJDtJIUKbUlxMFuHLjlnWmaxLqwm+9WBqV/AreXS3QyPWh0cJMcTM9CvR3PQ"
475
+ "DpZldjMymK+mzwNnsWyu+WHO+kUkdtycAuC8W8/8aDQKRebmOozlkB3HQS0Od+v9VgukvI7zTCbk"
476
+ "aPSLVFYzYt4sk3r8JErx0Hmbvy7oSiTcc49S32kcjJ1NYRe45vx2t/etvS+utKPsFqegubmSRpWm"
477
+ "ylfL8UowpqUtg4aaH6e+cw6dcM7V24hD7nluI63Af4RqvpQ319sh0f6bkmrLiFy9qJy8bWGnXKdY"
478
+ "R755MhVR7Rm55sxWzQVsV9zbNcYob7fqmXNu0tlcrTap5jYttgsr02RGT705TE77MrkzzsXUaAuN"
479
+ "MWje+Oa2p39VuTY57/myPnkR9NfuiwrLNkrq2qSFah067G/az+eSc3N8Wlp1nXVFDTdeGqpzWBqU"
480
+ "M7lBO7nUC46xJy7GH1UCK8Ow9HD8ZM0TufQbyuemqz0TbcR+Ov8jNCVDmrquwlmM5cDobu9vVUa5"
481
+ "gajbdezdgCxbGHizn4CT1a5JN7zOwoVgysY/A7uqoUSJsrkvWuvTwEYUhMeVCmr/tuYM3XLOBpEs"
482
+ "jhfeOVwUXlAZYminJAlYz0riCme85gyghSi4VBrMtj5J2zcz4JZzMbxdnh6fuvLlstfuq5G4QQrq"
483
+ "nXtKyaTCma0ZGrKRd1ONINpeuyneOgatnDwldSYILV6L9r60rbK+bWb/dN66UC0uO1zo18gFwZHu"
484
+ "UO18k+DWwnjz/4ljxyFWvrvJeFk1yFYHRD6+zs/NkqvJ6ejicDxIjVXdcn9o5Bzvt1ZrJ3B4a0Jn"
485
+ "QsVSuELtPKQubn3Sf6/GXeRbkh1aEHUrj11/9zfDp0/r0+tJ9xXPDRCeyhLNyt7JSCjX6z6Iynl8"
486
+ "DD0/aM4GBdGlL4X7jamLJli0P9vo9gz746x2UBN7LvpXTdtrdPNnWiUoRk40PyZvDMarFl8MtjfE"
487
+ "k70Li2bmGvHIWR6bTrHdwfuEpM6l23JoMlTuiFw86B3YqPHjjRcDw/6943t9692ei3OBkPd+NqPt"
488
+ "JchIPvJ2XgVacLzQxogV3XqxBveK3fr0zyOXCc2+EuRJb0ED5xataF63v7bcUwq6sxc3QzxbnkrS"
489
+ "/gAsr3EchgeqMZH0bhX307aLYQTr8aLDy/Kd/qM5GxduPlr92dbcsADlRY7DMDB0lYJm2nb3sdrp"
490
+ "6Em7RcQCR3KyfrTt6/L6AxcbO8V45ay+mKHDKpbnm7HODcBO5E08ND2rNbZNoz3ZZV08evXPqoFZ"
491
+ "dVjvyoFzMbxuse2mdCcU0C3JCrvUb7kjk/Iqx2Hzuj/3nMGofL3NWTcMMmPOuZv5G4dSFft3bjhz"
492
+ "5dJ886tqhkGw+V5gi7O8kDNx55UWSir0XN15z9Ol9boQsK77/GIuvxo6q31FyWeGl21qBU25gbY5"
493
+ "040iM/fN+cvRvl2OnD9aYInOyw28zZlUq6rW5Abwzzk7U4M+5DbwgqNCbuRGRvtPRrYsgPjn3JoR"
494
+ "EbYlZbrk+dP1jyotyA2R9BF4o3tmvs253p+tGXmynIp+q6g0tuAb8JEiEt5kv1xDbIdbN2eS+60i"
495
+ "jeyIWo7B6WwOVDOgsa5u8pGUSJsPJHVlXbvsB22uwxT4Cs554y65VU2ZzoDUAIp1zmLkemWCqpqa"
496
+ "1JUb9WqCarwhL0NpXyt92bpsnxve+DQCsqk2WL2ChGxKarzaOYskKcNpwx4fqX3tXMzzifGGfXhT"
497
+ "1JXdTlfiUBVJTr0PDIgzZ8OjURe+aNLBx2tA4VYuCMp2eGmLM1VuRiYfGAfEuQ8U0oFqz7KpPRfj"
498
+ "s2OXFyDOPoI8Ije48guFo1rNCb9Bh9Bh/yOWM/+cVoa9on6LNYb5EbmhXq0wHVV21jI8nkVr1ymV"
499
+ "M+sU/VD/PJvjqznIgSpSMZtlHZJ7rgDDjrN13f5F+eE0Wj1cA8tW5MI6xXRfbmQzzkHZs2ieRzp5"
500
+ "MNCyAyPfgMWy/C3WOYt9uSHns9lD4pwqnG0HjmrSj5h+wDQBK+OR+bq1in25IUbPX28dG1IcbL+7"
501
+ "dFETrTjnU08pV6v0ct1Y0yNyQ71YveMFDYwz7t7RciDMYYto3TvANfE8epzigNwQ4037cHuqeChy"
502
+ "IxkmR3U7Ddi7OGzvsH665iZnsKvr4Oi3Ffut1WNAfoO3hiN7d2dxcUxTy24N87tF97DJuf8+8kAV"
503
+ "SYziXnXhX8IRdZ93b9u/CZD2stW0m19X0fxmMenb5pysCeuF6oYYeaewRF3fH8/NZVz1/agzRnWa"
504
+ "TK7NuTgymMJH7lgEJTZKvfmX2l8RqZ0eLQU1sMkZ7ai68Z5BI7JBiedlvWSvs4w4J2u1z3XOZMec"
505
+ "kXo3MCmtBJYNak2k0uwrD07ZAJoucWYb5Y2WszhUfJ5uphcUZ+mOczvYLGjvkNFSJ2KbnQtvmvO6"
506
+ "ew6tDbH/gzeW/UYzybuapVJsqQe6HSzQ5vykUe+ht+A8nA6NrLmkapH9A4ZUotZvU86k3E76YH5o"
507
+ "al0eVtVoVdhVBxjanY9UX45m7U6kHZZq/Z5YDmX6m2pjtfeAkDkXqmFxq7WkhjOfqjA84XxocGrf"
508
+ "baQJugnnZoE20D3jYpvz21kR85uJ3wAbcuP4TNEirEHXTQH9ud2K3Xh5dd/PBZ0AZZs508EZjFkS"
509
+ "tNyYGxF18QVV283g5G+oqXuepJI0aM7STY6izghNx/vVJTTVq8kdmYkU2CSCfc7WHT9ROcO6krbs"
510
+ "ZbXdMxvfrbwTZ2viqPcCrJg4Cb4ignU5w/LGnKH16zapEHs40I+S5fMAyp2i3IGJonlwfoOPwnI6"
511
+ "fTtr4kgo2+WAauJ8ihrg841imBlnMklrA+NMx4/30eE1vIZqg1WpMxhc9lxXMLM4OHmRwPRGSjel"
512
+ "l7WHHfXwdouRZmVGsXLPzDwZXNrp9OI22sDXWel5XBNC7YKbxmL/sOIAMnP1vLWVyVV5drlVV7c4"
513
+ "ZKUGV5lsZSLkvD2LkDnnDocGx9BkspVZYzP/POUcTH2jOhImB5tldWvyeTn94VsC7QxnHhDnelmB"
514
+ "st2ydMlZLEKRW5zFSc4kFMzVF1f2vOUOh2BnF9/iDJ6Kc1ZzVhK+I3vgfG+rWMe2Qh0zyrsDjYOi"
515
+ "6qDZkK3mB1Y9FsY+b62fyPWPy0/q50A419ODlY3M5QHOman2L7Q447V69eH18wHlg+1yabZRhp9x"
516
+ "rvaRyk7L513Obb30BOc8GM6VhQFlblRxZLX0l6Z7VORr+bxcdwJnOBfB+I2syRfQciKxwhlvbrJ3"
517
+ "OE05wJnqH8/GZr01mDozHzoXP7CpU0FqS2EWOJMdzuQkZ97+QXZ1eZSPdCxb6aXDau+695Ny7fxR"
518
+ "zXRwzPkvS/0oP8W5FRz55e4jVc01XTkBCpeCTOVGYrq36/pg66dLuco5zu0imPRq91Gor/tQ0dlK"
519
+ "ZjbaykbSzvN9eTLtHnNeQvr5mdkbzfuhxl1dnXV33ffXhw8BK36SSTCs16mdSG6Uj29yhvonku5y"
520
+ "rvcwza5fbCwHXKJ6zU9WSpRp8jFUxwQKs/HZTc7IAecssTzb9VT9DFRpR/rXgwlttcspNxs4XF1x"
521
+ "2fhR+5yl/RHOE5zhoSrv8OyqLDnHmSqcif6J0buc2xsSfp2uqw9/65e7anDmow0c6CnObMSZ2+BM"
522
+ "5je81Jbr5CTvWO1XecEgBVlqOLNDrH27puAjrHH+Uk0PrguB35Ttwo1+vyANzjz5m+lMJbG1UJsZ"
523
+ "zChf4VyMlhZdVUkq2qSglcH12/LjnKX5EK1YS+fz+kKZDc71wXZQrXdfxFkqrlV0b5se4PzvxSIF"
524
+ "Nbn1VGwVzdE8tjh3w53Fle45HQiJ/smODFTA7+tlUfmJqXfZWszqj920wpmPBtLJdV6jbh8Ob3vE"
525
+ "knLw5b//UZ6bSlqslVuLo1/70HzR5nS7/lD26yrO055/zDPC+vxDcWYOzeo3qv2PsYAGv6vLHAvl"
526
+ "0NTLZnDIJWF8LNKDtlOemEu6+o2+MBlzVT5YoVyzO4KmuDLl5ktCQmiIplOTaNK1IPpdWZbmAlqt"
527
+ "U5P+TJb2z8D3Fw28Ljm0w5yLU9OV0s2+IM2D3+D56hXJRB2OJJeGQTVAa3DOTs0L41vjjuYCmkw/"
528
+ "0YgzDSUMHuZMq7OA0xPzSfmmWDEW0HRxoceVnJdLwBqcR1Ukbc5isyMYC2g2/YBYtSkaQBiEpU6g"
529
+ "p9WhF2fm+29zLs05fzFyHG/QwPmDSzgvzxgoDnPmeOmHD3PeWf9pKqCnv5sNnEF+Bed8ZWbGMYMG"
530
+ "9QEE2U5xXYcz2xGdGpzVl2o2NawfFBVX1PizU5xRPStd7M7bPX5/uhM9zDjjZoVRcyL6JftcipUZ"
531
+ "Xcc44/rskfQE55xkDgQ0mHAmDed2M3Z+Aed0ZcSZH3TPMiHF7vw7jUcgVgQ0KCdb4DQrjLqjjNj1"
532
+ "YbDruPxgWBePPrk3/07HdTji3GxvKQ2mmDgKg91jHOJcn04M+dYgra5B2+EMx69WZS207E9iDyEb"
533
+ "BDqCCq9z0LEa6cQ/Z+NuRzvjuYSzOMWZHtoIWKtTEWt6Qyajyii5lHO65ljTQ1ZzaOdUraewxHk8"
534
+ "Yl+2x7+ll3FOznCGG5y1Rq+4df1MRxfthsEu45yf4rw16VuLs1z165k551Tl3GwxnVzFWa729/Rc"
535
+ "GNTjnK3qlMKc88hb8+Q/dXcJIgx2nI+Z84YcAGbuC+yOqh0efxjFwRT/0v1BEGFQh/Pmj+lxzla7"
536
+ "gTTmPJrDmpS/Xcl5eVbJsbov3BzuAGYfHO1HkEPt7cgIykIZW2YhhEENztunOCdmDoyUdhz0+0x1"
537
+ "OdV2Ir93/81CCIO7JwqooSbdUbAGX5wecG1H2puRgGZ5Uv7aXSmEoqgO5x3NhY082KFnPND+MvpN"
538
+ "midMmhmAozDYcs6PuA2+XwLW/ejwyHi8fuJNi4RK7aEea61ITtgzK/ffVNt14NKKQVM5LiSRcjgz"
539
+ "EgURBg/HQbBraNTgaY72ur1PnCej18PlUL0NIwx2nNOzbkN/clW+ZmvaBg2abQ5HnJP6jd5estxY"
540
+ "nLBnuvsjBpzZsRr5gUQ1Hc1S71ci2jzMz4bf2H+1/YRYl3O25mq0UxVSNhsP8eGl0vb/80vm5OZr"
541
+ "deN9l/hJ4oAzORyu94uiWLGWB9/6pAVl4dXVggOdSHZPc0Z2ONflJ6S8RrVRHLtySXeTo844Cxuc"
542
+ "kT5naIVzs1xMLb+g6oRwceEOVCl6oP7MAWf4HYf6TgwcrXbtfuD6WoVCng1rCC9ovIoQf5/V5y1w"
543
+ "7peS+edMuvMOipHxFBdu4CqqtepvZ5y5Fc7UFudUOwy250oY1loctGoN9XuOOBNtzsnusNZxewZK"
544
+ "cYqW17csIQ44A/2D0TbONjHlnJpVtBxpaDYrs4XGWc9x1Atpybvu98LYF7BSPOmUc3pe1ZlxXiny"
545
+ "cH3OtP89EgjnfzrhTFNtQ7LFGfWcr5u3uNC+nXO2kQ3qd9h0lbM4wTmY4zP/PTYXK+653nnNgDO1"
546
+ "wbku1dGu8IuD5WxlFxfEtTlze5y7JVU8ZM5WdiWCQtszCkucUTcNN4T9WlXOYjzuZ4VztWMm0eZM"
547
+ "bHCud4XDL8I5ybQDobRkz/WJ1Gh77OB5OH+oPeZpi3M9nAI7zqwMpvExZyvV57o6pV2AtqLraCVM"
548
+ "SXCcfxxztrQLosEUjtxSnlIdxQn6LhKMNX8XCufSUh2p+i6w7wjhcuZXcV4bGtAcrqwqJd3G94EU"
549
+ "65r6Bh9HkfQqzgKsBkit9re+FsqDqdaVJRo7ClIkV3Fem8TyjUGG2uWDwZQ3CjjhnNvjrBnr1yax"
550
+ "IBOlSRr/HEyaUoAxZyztcdbNEZZ/XlJp2pdkOLIuB2P/h8R1nFfq/8zgkZquIYJxGw+tOeFsLwza"
551
+ "6bQ8MVFAza1TFhLnUZj5QxIY5xSYKKC6KxXhmHN1olaWOGrIittApWkIzvFLcMY2um2eYAOlCcru"
552
+ "ROGAOOeuONuYbSyNOMOyoElQZ88/OBfO3AY/rziEkaLHTbL+Kpy1D3BbCIMJMfBr5JcsPM6lI86P"
553
+ "NPqHMw/WDjqYpCmU2xPwwXN+BKOfzjjmTjr8oq+fiVHi75pz6gg0LTN2wjGjoW5v3KGCadIhZ9Ac"
554
+ "HWvqmNsdCM1nOpDAOHNHnJMzGVkzibr2PmYlF5GUgXEWrjiz0ng8o56mK89w/hSFxbl0x/nE3rT1"
555
+ "yXhFO42Lmtz8cxoSZ2FrpteygpamPpLXiNMTK8BY+TKczR10UU+hrmQwMhkiDJLzP50V7KrzCEzd"
556
+ "mXp6nBHnoNxGyUGZfuCQs6GDrsa+5YDrOTg7w1ztcG3Gmffrs5mZf2YiOM7uMD8imeHrprRdz9oI"
557
+ "w3cGKcrXL8Q5odKMc9JKuzZ3/v7OqWA7/Fa45Iy40RsX/WHioMsOI+et9r7ZG9d1Ea5Makrvzjlx"
558
+ "y5kKozeu63zpE3EuqvOeHDZith2D7H0FfA7OuWvOpRHndz1nrfOJ1AHCsFpWr9hx17DZEOE/znJO"
559
+ "AuMsw+SMx5x/109UAjPox/M79RuoObhYN2qQkU8uM4OEMCzO3LHeQOW3JlGDjjjjdyaJd1jyOXGb"
560
+ "D8LyR1NZp3D+xmBoLSzF0Wz94pKzsdwY2JIvDDgfdtC5B8uvNxLiwXH+15jz5ybPCA8j8MA5qzgL"
561
+ "h5zNxmG/amg/Otpfqovk0KDPHb2z8DHLo+Ysg+PctH/z6hDopBsodCQ4vIwHyCM7k1/J+dNWPDgb"
562
+ "H/SzI3TQnH8Rp5KoPTutZ2fnfiaHPd4E/Boq559LCE48GznCWfhZmVxxlp8GylmWBTzBGR/xGKmf"
563
+ "hKaSS/IDh5zPpL85yeGJogDa9Zloa9M8y+lgkog3gXIuYYZOJKtwPzbVpzn4SQeTxGWacu4txIHj"
564
+ "Q8w5i/oAGy/+2WkJ6TznHJUO7Zk3m2D40Bt52JzPWQJcyjHHPrPU327WVD4HzjmzxXm+PX/9E9zL"
565
+ "gIAInrOwxVmieU95IP4p81E/rYIMSEPmfOLhxmBnW0RkjcL+yQPm+i1AoHqjPu/kTACZcv5+oYRW"
566
+ "JZ2eZB2UYXI+vUXylPM3c8//8BlfeMBcB3OYBcoZntRDY84SfjHXAJU891PlfzxOHibnFJ+M0xN7"
567
+ "BmBuY1We4qH8XHsM5DRZObGujZ5MoyackyXOfjYuFs3jBMlZnl6fNOWczDlT4WVxMm8eJw2RM4dn"
568
+ "DwqYcWazVLjedMu9g06bMq0IkXO1JUxiiXNezneXzj3OEGtvkyUfB8c5e3DObXGu1shkS/Z8YuqD"
569
+ "dhXp8TmBCI5ztQPrSWE/2Gm7eIuslNC8yLrqcX6QoXEuut0KrHBOK1OeOIhMd2D8bLWOOK3bGXZK"
570
+ "YThnY3kctkY5qYBmxwds7VTrguRc/aZxGARyPK+gCYFi/CxZ4i0Q8mA514jfPxEAc9Ud8JpzNvZh"
571
+ "MvEWCFMPnNGJCH3GYUgm1fecCw5uZ+7DYVlXP1UWGOdzzzOKa7zeno/MtsFME1+CIx+8WGicpTWJ"
572
+ "065zIv1ZpmMjS8ae3EH7qn0ZVpalwxnQ+ESEtvFp077TTs7rPG8MxyINbh+BuR2OxScitD3Of8MN"
573
+ "Wbo8ju7QQeddOfTkINxxEeuNM5xzls0Z9cpXL9Y9ut0cpZ2Jaeuc0oA4gxlnKGFzUbCiaNxlKlx5"
574
+ "KJeF/gv8RjLjjCRonT7zzXnoZL86nZV0NefGY2dJOTkttrDwlHqcJXM5EItC8Bs46+YoQM+cC4Uz"
575
+ "kcFxFtY5t8IOLOo6d5zFwFkgl+MpZrWDH6xzboVdsszZmYBOh4cSTidAm3H+ObXKGcnmOdRAmDZ6"
576
+ "TrrlrDyUS8qmnH+1xjlpOYOWLVE593vkIdfuOVDOpS3OLcZ2sDtVPHHapoepS/+cKw+VBsj5nNKc"
577
+ "Ff6qQ9tpY9xEjVB9pHLP2XWDFzzevPAnGpRc4dydL567LNgFzvlkF2NLQhw21NVBQ9x78NI9ZyCD"
578
+ "43zWk7FZHPqoiXWFyvmz1oqlw4ErhTMNjnP+d2uc2y9Wz09pVr/2HqLofyphxANnJp/Xb3Tm/L+1"
579
+ "5yk0awRa91x6aCpnt9PMTZRplljm3Lxj/d600Ril20M/fpi/SRke58QW586caN6PXdHmj6vtmB22"
580
+ "L2ZhGDjWHvqcz1fD2bRj1OeD1I9Sbd9d3aF0OpkgT2YOMDzO50d3ZsPmDed6TIU2r/+5U3POuk+d"
581
+ "eOOMvUdBhXNXiCTtDvQFro5z+f3RnT9lLjl3zr9QORfPa898wjmHElezzkXyN6cyIwWzMOiaM7yS"
582
+ "czrinNAMVAPfOeOOp9R11pWOiltOOQP/nMEaZ5IlH4NGhTjdpCBvvWWR+OOc+Ncb87Gp9iRfLJO/"
583
+ "guYG2G0YJPUBA5lPziwcztWK1JYzcclZVvunoEm+FRzn3FroLaac24GrxPEi2OYobBo459P5KV7j"
584
+ "XK94Ye73UuP1iauhc5bWOOcrnLlje04TXA/gyJD9cyYc2PN/HcboaJ2+YKeYE8K9c9a1nJxb49y/"
585
+ "Ge76bjPgzd3quseNPqsNrBjlEUVgnE/fkcw4/0HhjGuDc5inVDx5H3AHzo7HCjUV1C+lxTtOKiX1"
586
+ "VGTk2p6zwWGmqghyW3/W9YQWOOM1zvXOOdC1f1Y4C5Wz4z3skIF7s+2fO87t8JV0yjkfEmGpPpQI"
587
+ "ivNvpb075kuck/mSeidzvcCUM3fLWTPi/HY+LIO1jAeJhnPhgzMsJ2vIU7ecNQt2v1uQP2wl42G8"
588
+ "j0/Ura5rOecq58Rx08wGc0ec8U/lLwNnx3lKy7lQn8k1Zz3TyT9wxbks//ugt1zmKXlvX4W/8oau"
589
+ "K8w/scdZTB5DtN/9e8ebPieous+nquCBr8j5m9Tt0vkEVw7qr2qigoLjLOxxTid+g7ecReKYM81a"
590
+ "h5kqEFxz1gs558tIPedsqnt4+8oycVuAflxcJF3Fqg9SYXH+3R5nJQy+X78qVwZlXQq7d/2aUKGI"
591
+ "LteckUmwtsFZ8UAV4i7zxc45/9ZwRv0jIPCcnH8ezZJhEjWhr+VcGpQRTQaFBs74nx4460koG9Xw"
592
+ "nwVRwiCsTpv9th3k6EZjXXNuK4Ot68LfeeCsmXin1mJCS7X+94dkTpDK2fFeau0t5CC5imflXIxG"
593
+ "J5P+IIJmJV/LOXM1s6C5txxSYvdHAukOyluJCZOtAtW3ZGmDO4PNLtOuShxjzvlzcubjrqS+Zeun"
594
+ "WcVYAGduQ+HMvHBm/jnDciLdFwbniHw8GXdS6Cg6K1Y4Z845U/+cQTG588Jb4noCqRPO+YRz6cWe"
595
+ "iX/OST7pSZmlKK0zFEs6zsAPZ3wB5ynDzFL00JAbr8OZHEl/mCu5MehnWHrRdcjAFk5rnOl91b/8"
596
+ "o2N7LpIR579DP/YM/XMGoy1NppzR8K+fAGdhsONMyl9KL3oDXKA3qs9F1zjj/h7QybLYTB3BQSuD"
597
+ "71cnKqmlLlQkq7Oc8DCXJXXBeahq8CFIeOCsFWqsuaof1suAXa+BbpYfC5UztRp3rCUqhZvQWyyl"
598
+ "5dXx3W45rw1WXs/ZTljGO5zTxCVn3l1dDk7Tx05JwXHuBXbm1p7TQQSIwDjbSVPIigSYfg6RuNQb"
599
+ "hSJqPbgNnQJH4eiO0md9o+h7S92zitL1nFz9hDBz1IOEnSRKS5uS5kmKxI81a1U4LKlMdtgdOeHM"
600
+ "VQn5r9RDbUP3Zbhvzk4mjgrlzQuU+duW0W82uHA/bqeYqM0ZlRnOPdQ2dN/GVf8RXjlLhfO/ytxH"
601
+ "zq33NtLV7YSdwR7t18ApKgvGk8ActKUHosc7imPOROAyJ2kSmINOnd3NRg5loE6ZJA8P7Q3z0ddx"
602
+ "13vSSzjDMqO/Sn+YD3bPwl00SD0ODyobf5QFFcIjZ+yTM9UYDnPNuaTcI+aD6YAlPc80Lu1k2leh"
603
+ "mFeInKWzMLgqZZxwLhXOHsXGYWFn59Mvl+B+6z7i+67LdQrnh3iGAXJOnd6rlwDuOadDeSNJguNc"
604
+ "uPVRovtb95x5f3nPnIGW7HTDOe8kQOq4LKo4QJYHyFm65dzPsufOOfcqknjmnGg9nSOtLtoHyZxz"
605
+ "7i2GZAFy5p44F47L/MqX9M6ZeZMb65y7U1QUg3bEufcWNETOrmspsncUbsv8So+h0jNnWn7vSdat"
606
+ "c856zqljzuWFnL/1xZlucZ6cUOCaM/PNmTRHxHioIq1zzhWB+bBol/vY9ZyFf87YE2e2FWhB76vr"
607
+ "nJi69hupZ854f0lk5pxzpiRMVY3nE2fbyvTmlbwi59pbdGL64TIKZ6cvdc/yR9+cURCc5cA5Lx22"
608
+ "IrmqQX+c6db7uz0IyParmHDe3RrAA+eSIy+cxWWcQRicJY6cfXDOyZNz3jiRtUg+h744l8wLZxki"
609
+ "5257RFt5irnJFuz+nJlcE1wysbuDkDnn/K0l0Pl1nGm21qGzuh5OA+D8xlp+GCpn/EjPCh/+eWeg"
610
+ "wVa9I72MM8mXDC1tOaMUW+N83CZ/fEbOxUKxN0ve4FZnIGucz0wHILfnjJYKo6L68+7QOktOTaM2"
611
+ "9MuMM749Z7CU86bDlB3ocpb5Qc72zqG4Lg4mTKDFxyn/3JlhaqnjHG6/lb9P7BndnzOVcLN8aIsz"
612
+ "1uFcPh9nMuecj2UC9y3rfp+QFtbKphdyxhnYTE+ZrS3VAuBcXMgZFclmWYva2lJNIz2ecQb35wyL"
613
+ "WQYx6e9Wqi86FlmUP68Na92aM92qtljirBXJ2C9PyLlMyVb10BJncoJzZmudW34tZ7w16sDscNaq"
614
+ "UHz97ylnOwUOeWUcnCWE3AFnvYTu+39PzdBOgSO9kPN8psy0zGZj4Eqv33/HmRPOybWcx29RuOCs"
615
+ "x+MHTidPhO7OGVT+2DlnTf37bv5Ed5cbSRUdyEZQtjJwBXXjFZ76VXxzuVHbK3bNGZ3jLOw4jks5"
616
+ "Vxy3OFsZINSklE1+QdhZ6ZZdyZn44Ix1gcCZ7r25fK4XVqMNzvgCzvkkcGaNMvz2zpyrQj7Y6F31"
617
+ "AvdPTneaU5yLxr+drdqJ5NpAyJMdziw7HQR0BdhM+JLzh7jxSzn/x8d3Zuucq4HY8v/1zplNCYGJ"
618
+ "OdyOM5wI6HyB85de08HKfumMEDkdC9PkWgctR4Ewn6VyCUde08Flzsnp6ujFnFm2xTmp3vokZ6RP"
619
+ "hCxw/ttJztdirjZJcMwZ2+H8yTnOxcWc8TjxLmZ6JEn+5FXWzWd68Y+ry0h6a84od82ZnuX8Rb1H"
620
+ "x0nO+cWc4TZnct4OtPmIiUv/pt47QtyeM9rgjM9z1varclLg+Fc9GVucKyZlV3MeL0edfnZ0Ceex"
621
+ "FPyhWVxwrmonr+ZcjjKAfO6+vXPOJjnJL/ViGXFu3Ftcznm0MCGbuxXvnPMJ59+qh6KiyywFuStn"
622
+ "vM4ZZAm8gDObca43gWn2ITUaxeLjvWIv4DyaYLwQLiD3zHlWSKoeanT+iVHa/fnlnOFmuEAnOZc2"
623
+ "OEPlyYziYXPc8pWcRxNflzgLz5zLKWdZ2bA0L0zV3w5cyxm45gxM+jidcsaqRzPiDC/OvKsAsxmW"
624
+ "sXfOfM6ZqIrToKKU28gEzpV5hPrgC0zhOYmPTDQYmXKmJznLyzlX5kq2OINznLEJFDKfAl2cqJhU"
625
+ "74UvrnBUCSHelPPnOBMj41sYmT3FOfW/u/bMf6bKa9nnbABlmngXk4EnYiJhruacPF4AOuRsFLSW"
626
+ "fkuc4JxfsOvzzOC4Yj5LnM/NkzGrYdKtERFodMWrOY8Eh7DvloxqmGSzFGRQaj0/3ee04JCK+QTB"
627
+ "OVtWKfmZobDk8go0yhTzCZlzYa4VkwA4Q5Uzt351M85ocwqGbu5TJBfsrr3EGa9w/uNVnOHmlCKo"
628
+ "f8EAOEvFQPhU/J6NHsgiZ24qYkQInIFQXotPc+biAs75ilvnpoKj+kV/B0kfiVZ8lstx/5zLFc7C"
629
+ "VHAkoXBOljlbGJA3HGRKtucGLGaEGdmawuj99IPjnGG1ZWB2AWe+zDnfFnYZ3poiQ4LgzJY4o/LR"
630
+ "ffNzHtpocHplz41i++tly9/096YbkBAw9w5vxBk3i2/8c872OBMNzlnj1m0fQP+hRc5ZbeenAojR"
631
+ "pJZ8z28sxkEJt2Z8vWeZ82f2OFehg57MxY3mahV7nBd1nQRbM5H+ZJnzm1NmN2JaNv3+lOIwmw23"
632
+ "/HvZ5td7u3LYQBJSW+T8pklx8/A4k+Oi21k5FKQnwpVc6PhFKJzlVnRNF272S+lw3aDRPC20+vX/"
633
+ "RM/0PMPVwmmynQ+i5b+bXYY5dBvQCmfWV8foGZNwxBkue+FZOEUOlw1CcYJzPvw3732huIAz26qL"
634
+ "LriVpT/N3U72Qul5zkzlXHrnzBc5j/LXb/c5SxvLESx/mzFnoAQQfEZBG3PeHPCunBlasHU29TNu"
635
+ "ORukhHjMGSmc0SkFbeo3yDZnkh3gnDrmTM05F8N/pkPMOeGgmaGuI1vpYBWEljjT6VWQ08kExCrn"
636
+ "6unNozY15Iy3Oc8kx8LNctecz5TVhv9Ufbe5QRNDv4H2Mju44FNm00xhaJzpjHOhxrLs/Ac8z/kv"
637
+ "u5zxNH2EMlTOaffAufpGhXfOcK8gBBd8CppyBtwpNWHevXn3n5nqN8w5I0PO8wBabHHOFv5MOLfO"
638
+ "3JyzmHMmZ0p2xpypFmexoNYrk3G7WKIw796yQzt4NvrzCb1hzJlsy40J53RBradWtlvYTMLMOWdz"
639
+ "zjWunAq/nLEO52JJRSbNtkMuOafGOFY4Y1PfYcaZL/ziFuds4W6FxfO51jhrh1k4fmI65QxKw0c2"
640
+ "5gx1OPMFdVNYPG9urajA9T/N6G3oTDIzw5EJY85Ah3O6zBk53n7K4CuO34Ytcf6//XEWmpyX1Ho+"
641
+ "nFcZjq7rI0jRUZczzoVXzomGriuW7lZzdpt3G2SbRDUNcDPO+Spnt3n3X0/wSNv/kPPvYOKgzTaP"
642
+ "kgsVVb4+gpCtwEdlaPWN8QxoOs9aseEUXXuc03XOcukPiyA596/VTaYXc3vPruRcJOucxeLwTfXQ"
643
+ "IjjOdDI2N3pCXG+ylXvjnM1HCLINznyRc1Vc5eFyFrU4+r1/wmpsvtFLGTyRAGkvRNvhnCy6FDYp"
644
+ "riodUn4cBOdecMiJjVSdr+L8VSKhfj803ERxPhKzxXnBWpo3+Eyt0IThQ+BaVb0SofDnX8o3zaZV"
645
+ "fjjzWSFpg/PKFihiEsgD8dVsJeyAyi/zevs3b36jYoLXJjHOOOfLnGWYnMFaeG/+/e92uslxwYHK"
646
+ "7dGRRVMnG5xDiYlshXMzTeFDr5yz5YGp5ccVy5yzSfwJhTPdqNokpttzmnMGO4N9bClTJKuvEA5n"
647
+ "spUW2Aqvx1cCjfvXFuf0GOdQchYUGGd6kHOxYitFoJyBC86GRzQW+5zpkt3i1QkfNJxaB9vyzxdz"
648
+ "5uuc5RrnNFDOJBzOZTIfvF4tFKzFmAnnYObaIQeccWkl8U43C18rnHmg9pyExRlvR4t9ziJUzsQ+"
649
+ "Z2LIOR11L7l1ZT6iWdDl3wqJcxIo5yI5zjmnywkhDanmT60v1z3BGW4/DFkKkY9oR5ZtJSjOeLOn"
650
+ "+vTPPNnZXbbnPKVJFkUKCIoz3NCroXKW4xQgxYsqBXx99Ymak1SlXTAWFGe+deV0/PzqHcUo2Q0I"
651
+ "cz1IxZqnB+/4hf5ZHOU8qRaNjvmTKuewlsZ2h2r8P4WdyWmmnOUuZ7TkU2C2IgdD4/yB0tVt1JKo"
652
+ "IefRXq5bnPlGVpupnENb4qY8aHod53z3OeA+5zxozlZFBzPkXCjPUWyVcbc4F0FzBjZFdFkaFzjg"
653
+ "9mOAFVu/DefEYvINjDnz1U2px4+5xbkMmzOzFwjNOQ+nHhebj3mQcxIgZ2qPs/nZuVn/u0KPM7wN"
654
+ "Z2LPb2BjznnfF7bN4ShnFh5nbI8zKc0DIdipHJJ9zspf0jw4zigEey5TsCN69Dj/z+FxBiH455KD"
655
+ "HRFPlv8aLHP+H8LjnISgNx7hbycpxVqcUfFecJxZAPr54S+2w+ARznzkDNPQOBN7g4TlCWG306e0"
656
+ "OYtQA2F2Jee87lbF3lPyrVuOOYen7JA1zsyYc1H/bm6RcxkcZxAA57L+XXmKs+opJAuPc4vHQr2O"
657
+ "nhDQrNz0qWh3YvR0RlJ4nKEtzifsme+s3Ud7E3ZHf0mTtwFyTsrvL+cs2Lbggaucv1hauSLeKwLk"
658
+ "TL68nPPDoWYmnMkiZyz/yALknPxPl3POdqYernHGy5yzQI4SW/By13LOd04G0LNnJBPCQ3Qcl+u6"
659
+ "kmxnynBF15HyHwucoTQ7icN1w3Y4n9B15VfygMjX4AxD9Bvoes78SDKVLnBOF4a8quNZQ+QMr+e8"
660
+ "V/dZ55wsXOHx74Z7dzpW0OPHzAPlnCxypvMe8fHjb2SAnNm42xmKfOKQM1vj3I+XTTwPDpEzHYeR"
661
+ "wuh8sjMDhIc4F8uclyc5oixAzmQsPwujc7OM12kqlHC64ZO0OMPwOeMceefcPQjf8EkLnHGxOJn0"
662
+ "0R+D5Dw+b4nmRueTnRnw7jfPTu1wFgkIkfP4HKDSkDM4bc/rZ9vhZc4oX5xMCsoUBDi3oHpUrj4k"
663
+ "NBsvpmf9M129L1rmDAfOYxmY/q8hck5UzqjkhptInhAcsv1Ompzrw8OmY+VvKs40SM5s4PzwIdxw"
664
+ "gfSJQJgl2xvWwxXOWcc5m3D+6r+EyFkpSz6e+Z1hGg7Pcab6nHHW5TCKYXzw+GLgq/8jTL8hxsEs"
665
+ "N7yM+QyO5s7pRoxd40wncuPBufgfv0rD9BtybJPFTt6wkR2bcsYmnGXHWfnFzxLw+8//SMP0G1KJ"
666
+ "ZT+274TKr1PNy5gLaFwacK6rRVNt/eD86y//4GFyzhTO/348NyirIxyoL87l3kzGFc6i/QbZqNwI"
667
+ "3pVhch6Gm0nDuTKth7rzx7k05zwpGyT1RpowUM75jDPH2pzJWczFlutf0JpYtH1QoQpkyJwLBVVz"
668
+ "XrZ8OG0WEueF3AnzVrcrz1kRfnBOwvTPpYKqH9vMNOUddsqZr3Eeb7hRnR2PgswG1Yy3crHAdHEQ"
669
+ "PMs53+KcrnFORt8Hd7o6wIa+7qxlxFk3LQTuOFeW8NEqZ/X3qj2sSaCcYb91U8X5C+NV3045L5yF"
670
+ "S1q/oWJ92+jqNyFyBqSK5rTl/I8DOst2QniEs1zlLEdpSp0nvg3ToCuTYLzh/K/SdPuTswI625Iy"
671
+ "C/MdOs4T+Zwg0W6BH14lKa/DSe1h/3V4npBtYbfJOZ2rEcobI0nH8rnmHKSATlhRy1B4jjN2yfmL"
672
+ "cqH/NJzVnikaDR0oZ1pUr8Kx3ry3mW45yVlufMEcrHEeTeypx+pB2qbkwbVHIGQ/jXaSPDR/xSNn"
673
+ "sXC2c8s5m8jnxOg8I0+cq1Uikp7jDJ1xRiVfOKKINejlRNYlYZ6T1ykFQTJ2LWexceUNzuqvNbr5"
674
+ "Lyhge+ZEo1DpmXM920HMOc/Q/63+5wc4UM5VAEwX5ELqlfNG2D3K+eP6nzkJlDOskjGoP5HTG2e2"
675
+ "dAQsW3k+UJSlDJJz8q8yW5ILmVfOG73n70uc/9MKZ1QGyzmh2VKaoTfnHLjj/P7SUej/+wpnGjLn"
676
+ "fDGdC4Xz4pHz/8sNOZNiMc3QC4SuhmEbzrNC0l9XaLKAOeNlznqZN3PIGS6UTdkK55/D5ZyUi2FM"
677
+ "T3CcK4wWO5wXCnbLNMufAuZcLHLWe1zimfPK8rVCsDILlXO26F71HvdcYTTX5rw84AryJGDOy+5V"
678
+ "73GRU87zv8eLvwLks3M+J+wyfc6LrgaIpPxVBsyZnuV8TnDoc0bLEoWDsDmTswnhuUAoDThPdGe7"
679
+ "9BGUMmTO+HSigtxxXjp/ZsYetzq0lOJmnPUSlVOVJKHNGUz7WzcT6X6c9Z73VCDc+aRL/nuaQ5K8"
680
+ "+9mPb8ZZ08855LyUZLOJX+vWDbLso5txPiM4uF5c3AkFjC/dbvyHrOccMObFKKYpOOj4E2GLnD9c"
681
+ "vJ1c5Ezyu3EuUyYMu0SqqT+MFH+2GBfR7ey5LLRMenKGGrRWRlrjnE/kTtMpQNCcseG2OsuCQ2rq"
682
+ "DzPOxeQrt37kk5A5E6MCz5rgSDX1h4lLZWNvg+0cWXmVPeskhXSMzR1n2nJOJ4aS3pgzN+gTUrew"
683
+ "lOm6jDlnVto7v/kKztLgGlyXs9TlnNW9h0+c1p05a5gaqj0A6eyMOuScz7beK+/hN5AF1wmbV+0S"
684
+ "YGqrjLTgoIrZ1nsBzyc4xFkniDdfBYltCXO6Mlh1vvofctwfb81ZT3DII67obKW7etgpZ1KWQY8L"
685
+ "7nPmOnaWji9J3HCuc78xZ3YTztgGZ5iPP93/id2UN0B7UvJTcRaml4TF0RqHdiLXnpQsx7JO3Jrz"
686
+ "/3fiqtBR2l0hHnEGhkW/gDifKecCJ+lgs9vQiDMs71He2IiDhXvO2oKsSlRGnNFdOEMnnA/m3tqc"
687
+ "q7X1o61+UWnlYNArOZ9ye8RFOtjsiwTU38M3kRtbo0xu3P6JdLDZcjZR+8Fd0pQtIO4569d/Kltm"
688
+ "Cmd6k7R7q4OnbrrJqS9ZCQ6VM7uJfL6Us0GkrQSHWk25S5qyVcQ8wxk6SVOaQViFMyzv4jeYxSjl"
689
+ "gXMl7BTOZtnOE3FGTtLBZtMk0nNGpxNXb628kLOBY8X1Hgv5yOndgTO2i0GPMze6LkfDITfnE9fr"
690
+ "5YZ7zqnRdQXsBSE9L/SvlxvuOZsVqGQy5Zzem7N05I9OFV7LOlFJR0E8crYtN+oHzsmE86AmI2db"
691
+ "138ElKId9n1vxhndMg4Wjjlz0wu3262RdOrn8R3l8ym/R9zIjSbAftNynl0ocrbWXSrOouFMxx0D"
692
+ "8DCP4r2as1kaVxVOZLM5MRsLUMiD3aTfHWfqKAw2J7w3OxBProR5uEuu4IWczdIgMPQEpWdUa+lJ"
693
+ "Gi5nfKHfSK1xLmqHQQNeQkht58UanM09XTH1eUm1t2gRMGcHguAo5+LEI08ePq3tJQ+XM3AgCI5y"
694
+ "zs5yBsoXY3fmnDlzSGeyeta5dvWsqG5p+S05S6ecxQnOYsIZtI8bOdsbFes3EgVDv6uOoq/WcOL/"
695
+ "ckfOwinn9MSV8wnn7ohHnIbJGTqzZ+ZK1iln8A7PGTpn5CwOMleyrk6t1jijW3I+I6CZmypSos54"
696
+ "Hjh3fEOt82NH2uvAngXZGV+3yjmNnG1deji7e/hkHV9Y/f+HL8QZOJPPNd5s5JuyPv6Byk8HuHvB"
697
+ "XnYsswA5s+k+H1lVegbVBat/gADnNe5x/qk84UTdpCk13myk0bNqi1Fafzgx29bnBmXRsvzZ1HNA"
698
+ "Z2lK/dDF6OlFQmR/uBUOcd6Mq8HSA5zPGUeq9kaekIzmHw+y74acDZ/ZJWfSBWjcX4rk3aaMNWd+"
699
+ "Q85mjgM4SweVnU1wfyla9MEPhsiZuXIcXjjDPrOkgz2Am3I2dBzO0m51R6Q+s1S3psI35cydXDk7"
700
+ "xzmbcU6VrnRLzsLJlc3TlGamzJgzU/pHs/w7rM2gmbNASJ2lKbNCUpaMj6ipOIOwkpUjnDMnnE88"
701
+ "NNjhXJ1sCsNyHqUzzsSZ3Kg5F4qZTPxGzRmHtUrWHWfsTG4oM5J6zuMPh0S9uiIgzn8/4p/fmooC"
702
+ "V5xZd4GOMxg7IiiGSR5htPcPOOifjDwdciY3djnDeuWbauLwcuSHtjEyMT7oTG40MbYYnl52+8j2"
703
+ "oUGC8U2QuIODNqICHHImnWAZOP/aXVHWe9yBcWSB2T04m3BxyBl35YCB87vWE1X8H+IDTkTNZxdj"
704
+ "Pnw0hLDskU5xRn3Zpd3mBCica62BJnchF3M+fNRJZuREHXGGCuevm+zvXSWXQflFPYhVlt9NUlnM"
705
+ "b8K5MHOiTrYEanphfQWQYYVzUn5TT7Yryx8nTw0vDoTHj0hKjZyoky3bFM4JbzZnbP3Go5uAXDWe"
706
+ "zozBxckhKZ05aOSOc6J++HoAFjecq9PdPlM59+7uYsFBD3OWVl3SyR1gmPKlcGW0WNQPWIW7twn8"
707
+ "dd4NL56jxA5zzo06tyPOVOGMsppzfyDknxIo5+bx9lrOhzEbkHFW3mjc3RDiKs6SDp4BSDq70bXC"
708
+ "TudkNat9xSbn2nlIZaUV4HhmHtdOQNc5KTA16dyOOOPpd8dydEo9mj42/vY2nLlNzifDP5r6MSRx"
709
+ "udxPm8fG/76Us84Jo8Kkc7tY+dJw3OScTB8b/5vfhbM06dxOys/JdPyk9s+/pIug2y0jfrjUnnVO"
710
+ "Js5sfsSz1kVnnPF3fNFpNY+NfkjuYs9FSJzxjPOfxqUiPH5sLG7DWVtwQFdlpPrBp5wTwhcVaztT"
711
+ "+lrOOnpD20EDh5zBhDORCeXL6r0W1Iwnf74LZ13QLjknu5zJiHN5LWegxVk3Ejor11XmuscZqZy/"
712
+ "eXzY927DOQ+IM51xJiuvVnXbf1WnFt6jjmSgOJyV6yqwkzxFjOz1jXJ3ntDvK5d36VJZp5yZQ854"
713
+ "8xIfJupi2WayP+J38RshcUa7nJmyF1iVfyJxF86lNc42phhuPc1n6t0FqvXNlUOx0Cln6tCeHyYi"
714
+ "tzkPmXcjtqGMnI0efaNT5KqAzpN6rAVcORR7kd+wwnkj2flM5Vy0rvnK+dC0dFjhcGrPaCs//XTM"
715
+ "ed+hu27EJWfiME+pCnLZqlb7ZIkzu1BAI5ecsbu6aI3xwXnF536s3r3TGfTCCgd0yRk5G7dqzVXg"
716
+ "lUcace5+hFxY4dAT0Dwgzq33z/Z7U/8prsy8XXKGHjjnGpzhhZk3uy1nsqNc0OypwYUZoZawE9Y4"
717
+ "iys41zLkDpw17Rk45Qx3FCJZuNen9xDQQXFuTWQ/8ig+6u+vxtlGRALZViBsb/7rSJJcN5sRO+Sc"
718
+ "uOXcuuBskzMfzahBInI2VaXFlvsuqm+h/OFltVGnM2WccybrTwWHrQzSccE0/MQ7OM6gian1Mnk0"
719
+ "NaAvmxg4utllgRC45Mxcc263pELfJm9rhMq+BKisbi+qh1Bu9l7kbEz6wbkEJS+qlxET4Seqfyp/"
720
+ "iC6bxeFwPMUL52ptZlmtN65OtxpbAmk5q8HvslrSNZwt6qu3VZ/8og15Uy0l6t04QuDMHHIufXCu"
721
+ "YnnWbKM20dLN0BYZ/ellNTuHnIHTep3Cruh4i6mWqo5iGqWMl3HWKCQV9jg7GeOfjq40G2CiEefL"
722
+ "aqManPPAObPZA7LGqlW2V3EmT8MZzL3+n5Nuu9HOZV9Wg9bgnNnjbDv/rQpxYEXfjzjLq0rQGoUk"
723
+ "7eDljTOoHDEs1yL98OAo+zB8zsIe58LyW1S7QqxN1aXqkHf+JvyCnbYkYt44k40zS9W1hqBIwuec"
724
+ "2uNse64bejDG2eobJtc36C4d3NKMtrVGsc45jK2gobM0ZZOz7TLDZw/fIVYfI4A95IEz+bzJ2UG6"
725
+ "sF5bVhcbvgmes75REK+cN/qsYiKXbZTkTj5vaUavA6JA4XzZDpju5LPjCaMH2oKTuGyHCOZMPl/P"
726
+ "+YOFZ5Khc07vx/nqbZ8PioKzkjdyNuBc3IbzUJL7PCDO5Nk4KzWM4oac89vY87CALSTO+Ok4Dwn4"
727
+ "HTlnt+GM5dyDXN/Q83HO+5rCDTnL+3B+SP03Dec0HM7QHecj9Y2PnHhClDevxu/HWbjhbL/c8NEj"
728
+ "w/2+CI4zcFbe2JKMnbd3cODGkL2i252paTYCQg9wzhz1z9tytlui6k+Pt84ZD9kr9DucYKdg54hz"
729
+ "7pRzSGfEUlfljeSAGofWUwkyZK+wzG7H2cDuwCWclf0iUFCciStZBy/hzIbrh8UZu+KMjnAu3XCW"
730
+ "zZvdjzN3wxmVbvxGGh5n5IozPsAZWy9BsEEdvQhncoAzsc0ZlPe259QJZ0Btc4bBcsZXci5fhzO6"
731
+ "oLzhiDMS3du0FpRHzi44M9n1zgA5w2s52yypsVwtb1QrJv7DC3Bm+2m83bn2iBVqeaM6nenDcDiD"
732
+ "5+HcHHrQX/5hz0Xk3JKxyPnhM1KiuCVsf2HXmXYF56InY5Hz44btEbyyV6yLz/3HSziz6+yZ2N1a"
733
+ "pt4SeuCM1vJYdAln6ojzgXI2s7pSZTqcjtbqjNfsKoMv4Jz1P2JvaAlML7/OmV/BGV3GGVjlDKfu"
734
+ "PzDO0A1nsM8ZWuWMpqPGOCzOyQWcBwcqnfg/HiJn5oQz3OeMrXIm02G20DgT/5xFd+PcHmc69Utk"
735
+ "dVzz42Ardi44Vz+RCyecy23O4VaSLHPu/Wf+kRvOvOUs9+3ZnxPxvUqzvRy1u7MMnXYYusr5k2s4"
736
+ "00s4Q7s7+EA6FY7rnNVdvzxu0Uh8cy76u9rjjGaJ/TpntSzt8XCEA4HQ7kVz+5zBl7MvSVeXL71V"
737
+ "naa/QAh8c856b+WKc9UB2SrnN2q4DipTsctZ2ucMv5spGnZkOR72OVZLPHPm9jmjb2dd5tB8YuRT"
738
+ "YSPPnAeVY82a8A+zUHvowb3W/HcdtN3dCvLBWVmbMUR+mCok4GKnPMcO2i5nMWRH1sobsxyAh8iZ"
739
+ "eOWceuScBsUZ++RcKL7KHWeJjnDGn9ydM9wpPrvmXOAjnEn+vJyFF87HJshTv5z3hF1ukzN/Xc7A"
740
+ "J+c08REHD3L2PBWdWd9NBu7lPH44p2FxptZ3OQF7vt50XaKeoezFQc9LwLE/zrkTzhYn+FwYCKXF"
741
+ "N89ccAYWF+TdjDPbuZZVDPA5OJuY3Z4CYDYxIJtPfi/OZKfEapUzfl3OeCe1ZDbDFL5ip7ygOecj"
742
+ "v2KLM7Go/F02aJ8z2nlxP5yLV+UsR2jc51npi3IWTjiz8h4OGlrffmPtktwJZ6ulmafgPHKphfvH"
743
+ "L+7E2cTJgZ3XtsmZ2N3h8DLOiSPOlqrswHZfjJy1MYeVEULbw4NrsSkfSTEfnKeBMAuXc+6CM7Mm"
744
+ "BrDWwxfhcjbDwXxx1hurZ+Fyli44WxO3UI8zvTIwAgec6eZbA1vJGvxRjzMRwXIW9jiX1jnvTt6e"
745
+ "enMZLGduEYB1zkyTM8pegnOq3lG4fvKFZBYVT8YZb14LWuK8v5qXT1/1yTijzWsRS5z313xMb3Jl"
746
+ "SfoizhYkFtbmzESonFOLPVpY5ry/aHoabOmFggN650ztcD6wxnSKlWTPxRnscz7vKb/V54zy5+Kc"
747
+ "bL61Jc7f7XOemu+V52xC+2XRlQzCLmdgwPlKwQHtl+tWQlSm/uV59/z9Pudfp1GABspZhMv50OZ7"
748
+ "0+fHgfoNfnPO/y0JpqFn5lzchLOpOyN7nIvIOXJ+Es4kcrY1QW2Xcx4525jYSrbyFBw525pvGQrn"
749
+ "gKbYYRfT0zY5Iyuc0dNwTh1yzjxxTsPnfMa3bcZBO5ydnbrqm3P2DJxF+JxTl5zPDyCRQ5xl8Jxz"
750
+ "6xDkBZyz4DnLp+AcznmPxEUEwXvzZIQnzmXwnFPrnNMrOKeBcy6sO6NCzeS4M38XqrAjLhwb3gpJ"
751
+ "wMrrH8tTwhF2xIUgwluW5ZWzDJyzsA5h+FsrbvMg52CEHXXh19CmI2I25Naxel04wo66iNNoswMT"
752
+ "P7Ofw6pAUxe6E21+OGhDbYHIedHY1L+20ZkPci7D5lzY5jy64N9sPPhTcM5tc7Ye99+weyWE1IUc"
753
+ "Au45v/cUnGXwnPHNODM/nK3r2IP1jWAKHE44J+711X+MnBfFgKd6QeQcOTsoJ7r3G9Ge/XCOcXDx"
754
+ "qtY5o8jZC2cYOS9dNb+Kc9h5ytn0jTrnDCJnL5yTm3F2M3xJ3I/T3cw/Pztn8dScceT8YpwDmcAB"
755
+ "3Dwdcs+ZPQPns70Nun/dg5wDmSgD3XAG7jnTyHnBe9rnTG7FGTlSncw5Zxw5L/Rq8eKcsaNslThP"
756
+ "y9AzcLbuPdPI2cnsP+x8+tUzcLa+XNXBtE14qzwFO3o45NyqnoGzsE3BwduCyHnO2UXV7Fb1Ouyo"
757
+ "OA7cV9ufgHNqm3MaOTsaVHM/q/5W41bY1WKDyPmA2rdwYeZ81dP97bl4Is5pwJxtTLagzlelRs6z"
758
+ "QlL28pyJq9qLe87s9pyl7Y4iX54zdcUZOU8W6O05C9uceeTsSnNC5y9Lbs/ZxrOByHn3YRPLnN1s"
759
+ "gnFswDsJl7MdLM43z7k9ZztYmOux0ElpJiV345zZ5iw9cObLJbEiYM7CNmfhnnO+MmAYMmdum7MT"
760
+ "+TxWjmIlQQxlXzXsTAox19oKzsz2XpwtdTXmOhbBWaWA3opzbptz4ZzzsgIJad9LH5wz15zzpRw0"
761
+ "eM6WHs35lCA0vwELdTrSkt6wwxk4n0KB5nqGBbscljibkeb8XdHc/4e7vNsH58QxZ5Gs2nMw27gS"
762
+ "ZzOlmGtpheb9hYQq65Ykp23OmT/Oj6j+2204c8ucuWvOqfpHPwcp65Y4p5Y5O5ekqSqpfwiTM3NW"
763
+ "4WKuX5XOP+RDTH4TpHxe4JxbvrKzR18yjLL8x104Z3avXDjnnI/+DAa5y4lDzrQ2p7d/cMtZwlH/"
764
+ "YzkKk7O7BUrUdTa21FuYxEGm3WPOv9o0AexavS4FEyZIkGn3uJKY2eSMXPdauuDkbsL5P1t8NOg6"
765
+ "GVs6l5NxEuKsgslyyvwRFu3pAyqdP/vsYSknX+9yRunFnMuEWEwriOsgtKCNcErpPmf/0XE6pwd9"
766
+ "ac+n/tl9zWDWY+CY83LnhOJqzo8HCCVyHOkwS7Ltc7LLGcirOcvkVg0sGEV+gLP/aikOtCxujn4k"
767
+ "OFbex7/cw4EO85yU1Ts1BP/pOHk2ex5XbFY4Mxk5W+Usr1H2L8EZ7ZfriHfO9Pk4H5h4jbPI2eo7"
768
+ "rSR+KLvw2z+L3lB94QpneDXn8hk4413O/hMVFuh0NEuBcO11vHMO9XQGx5w/v5ozfwLOcJ8z/Zvf"
769
+ "RwKvyvmDyNkL5/8rcrb5UqvSr7js0z+P3jjAGXvmTMon1M9HOJeRsw/O6GLOT5F3J+Fzfoo60pDk"
770
+ "FqFyzp6CM919HVQKKCNnS28lNlLzDF3JWT4FZ7wrUlFZfn8lZ/EUnGEzxXgj2CDPNkWeMB1sAuG7"
771
+ "TZC+OeMnlM8Nxm82Oyfy3HfxM4bBup9+sVlDuJgzfxbOsJphnITKuUiepn2eoGLnvX0aFXpG79xW"
772
+ "OfIwOefJk7VPdjLGNHJ23nyX2uFTOudDr+015qPX5ZxGzl44e70hfk3OwDdn8pqcK70ROfvxl6nn"
773
+ "7/qSug54tufIOXJ2m6gUkbOPxvy+LnvROBg5+2h/erx4Fjm7z84e/llexTl7LpZIJn9cjUoPvSGu"
774
+ "4fzlk0zdGDgXCVtjyb7wzbm3ZvAUM59HGd+3qyzLf/7D81Docw5ZtZn1OufvvvVsVs/LGW5xfth6"
775
+ "EjnbyqzXOD/+iueRsxfOn0TO9l5NrLpu/pH3j/6snNn67hveJ16Bp1rPdpQz8f66CuePn40zDYlz"
776
+ "f9jIO/GEnPnq3/gWmVnH+Tf5hJzTNY9SeOdMn2tlyiHvwLyPaUDJnrRcV3NeVXzZdZz5y3AG/jvv"
777
+ "wPn5qvx4jTP0v6wMSfasbmOdM7qAs3jaMPjA+Uso8lnh/HTu+eEe3oUin5NEPG/eDdZs55Jg9Lx1"
778
+ "pLWROHgFZ/DEkwroahiMnP3o6jJydt/YFdHo9TiDS8QVfLnJovgKo0Kvx5ldkfviH16O8yW5L365"
779
+ "Sebgks2JXo8zupZz9iqcceTsLUvhl9z1Scuia8n4pZxfBnNyTW2SPNX2gEfz3+s4py/F+Rpv9ZzV"
780
+ "5606w2WcXycbRNfUzF6Sc34Z55dRz3XCcAHn8hU5+39b8JKc/YtY+HJpCrokHUQvx7kyrWt60Wv5"
781
+ "jUdIuiAMkhfc4oTK6+y5TGJz2tir1TeuTPdfqV53ocx5tUB4lWx/0unPYQXfMjoOn3EwcnYs2qPf"
782
+ "8Ck3IufI+ZlkXUxUIuenks+xwOGHcx5ZuGyvN73uYs7RPXvhHEqdH6SRsxc9L56bcyhhEGaRs5/8"
783
+ "NHtqzqG8HXpyzjJyfjHO8qk5i2A4i8g5cj7NmceUzQvnmHZ74RyrdY4bjtU6n5yje/bDObpn5zoq"
784
+ "cvbRYBwcjJyfqIHI2U+LnH3a8xAHP4hMPHAG/PPIxGEc7Dij36PE88GZxNTQKecOLoucfXAGMTV0"
785
+ "Gwdl91+0iEwccu4GmXMS3YbLPKWr83/650jETavXtcn3IgjHjcS1g15aXYDGkYOPQJjTOD7ow0G/"
786
+ "i7sVOG/vPxz0t5Gz84a/rTjH+RvOE++fyvLLMmaBzuNgXnGOAyruE0JafhU5e9Ab31Wc0wjCdUL4"
787
+ "a/l1rDp7EBwlidV9L4m3jBNGPSXecQK0n8Q7zpTxEQjjtmqeHHTc99Kfg46Kw5ODjh7aj4OOpSQ/"
788
+ "DjoqO+etwkxjIPQRCQsSObtvNHoNLw3HNMWT5IgIYosttthiiy222GKLLbbYYosttthiiy222GKL"
789
+ "LbbYYosttthiiy222GKLLbbYYosttthiiy222GKLLbbYYosttthiiy222GKLLbbYYosttthiiy22"
790
+ "2GKLLbbYYosttthiiy222GKLLbbYYguqAREZ+Ghx/3g/Le5s7qXBeDCQl4bjCXleGovnL3mJgtE9"
791
+ "exF18Xw8P95ZojRS8OA2ImUvLTpnP945Omc/2jky8OKdo9vw0mLK7aXBmHJ7aehJOIeuTZ/lEMLQ"
792
+ "34I8CefQozm7h9/A8t6cYXkPzmTnoHEQ+EHkuLxE19Gy1O12vPvXt3fkTC85Kv3xdfU+Lxi63XKd"
793
+ "AIad1YLqsPQLciPd28LeHFY6YOCcYXmF38A1Z75tAXz6G30HLJaygDJoAV09v/8HZAc4QzFxb+3P"
794
+ "l/MnRgcud7179v98tbPauzGS09+QPdP2E7QVMNhcLug04BLvfAgMzqYWm3eGXf5atA9fVHbS9I6g"
795
+ "y2HwErUBj4DB+cyhd5hbz9FepmsN+zAnsKFLzAC3ZLY9WjFxz1UHYB1UqVymaz+XwRo2vsStdWD4"
796
+ "tg8X898YWpoM0Mslww4rm71AbQzdPdv5mS/KDNVAf1iCCcq1Fp7CoxeEQTIAWX+qoWW01G08QM7+"
797
+ "wyAbWx7g6wZv2EK05+w6t9FIO5RvGPzzcPZdFGXfqUTyimq2YfBGLTy/QXxzRjPTY7N4eBZzgAV1"
798
+ "74NW06Am0SwiotOcwxN2vufxr4Y4m24jQIPGnuMg2Q9d5835kprNHuc8CHNWQhezwTm01Jv49WXr"
799
+ "YISSb9toPDTOHsRmX7FnBzwqKu2B/mtIeTf34Jz2EUprSYoCOpwpHcxH/Zm2fYYecajUFucyhYEk"
800
+ "hm8XB9tcfEy+63lzq2EwKH33+NzAy8O0t6D+OQfhOFDJkY+HqT4m4DtCIrcrN0KqKD1ybuxD1MOm"
801
+ "08BDnKFdziHoaFpK7OOj44YjPAQE2eUcgod+cCY+NH3jl1N8hLNltxFETYmWGfEwwaS1UHmog5f2"
802
+ "m7iec+6BM9IIWNQB5us9By0LYvFJ/qTEvVy3aJ85iIGhhMKH9WCLnAn/tMJagFEfwRqdGznhfLm2"
803
+ "e3D+0uIXZ1XIwd23y/TSjlTjm9zNoB+cv7WXNcFaiD+u+bUa5pmOKCBuOJfXc/6XPenTTFBm45ej"
804
+ "WuKLOuJ8seJ4MPnB2gfHjaNXXo5omxwrn9JxPF7rJ1uDD41UyIwjGU7diOcQDJr1yYOw4jXOigJQ"
805
+ "Om2Xca4MkJ3h/FFibxDEndy4esgQDHMxpeEFuL2xJodh8NpKR209bYEjM/TJj34AMiuGWDgMg5dm"
806
+ "4I0zzI0547zeuOMR+CS0IwlA6bylF5lzmWNTzqwudP5r6BOnTQ2653yBwKOqEMtMugNv3UVuSXkh"
807
+ "95zLi9xGmUFDztXv/WhXC2APnLkjmHxL1JW9b9XnjOwbGrktZ7Th+k9yxvYBsBvb83oS0rpFaFiw"
808
+ "s2180mHW7V5wbKhGWr5rpkaZKXjrxufFbbiKg2zdKaDKlNPWzxaGYfRurXCpKvJV7z2Iqavds6fm"
809
+ "Qz//YcvPXu42/DQ3ifeHY/NNN4AZVZvv19zUockowBK+4WfTlzBnR7KOjCyVyg15pvcA6KaYHck6"
810
+ "PHJJrNwIZ/wFxIYzWYcHKfNho6VrnH9aGGwS2v3kFWXdZ1vdO61tmQ8z9ztHDUwDxF2989l5KvW4"
811
+ "BhYrnLlit82GWRLyZDK6zF/CbZyVz6yoJ+cjvqS+5Mj+sn6JFTblDG/L+ax8hg9OZO7mF4FkoOEK"
812
+ "jAXPbdWGBbmR95Nh1d0iF2/2Y/NlifET4LtitlUzqgmT7EjAypl5IL6r37BVRPp7Jd+AGlQPCzC9"
813
+ "QHxTXWeviERLyUafDToJEDd1HMbFDaTmHANVAwkmXsCezc25cTqox9S+P//TTiQ8G4jpa4mNtdeV"
814
+ "jOshKQy+7+uoDXSki2AHPeqe+jk/4zV266yHAqFMXsBtZJa9xhjdIc56xeebljfM1Abc90a0ujay"
815
+ "HyFumnabhMHDJiWPSDDNMHjPqqh+MkiFZQ8pX8GcM32PkVnOE15B1Om7Z+v29BI5t/5It+0XzV9B"
816
+ "bBiEQXwl5ptqZ5NsEF15/9uW+Av7ytmh27rvyGB+LeeXkHRmWbfVSJS+gmu+nnPx/LrZlDO+5u7g"
817
+ "3pj1Z27ELNALZ+zfYdxbaGhxRtbtKnkR3azJWdh+3xeZv6/LuZrWJW1Go+JVhLNWngLbH2W+b/ws"
818
+ "5nzQrpowZDfo81cy54OOEl7Wk57EnC/kXL6O2DjcfcFld34Sr3Fw3MozZ6z2MvgUmA8KO68RmI6c"
819
+ "ynNgPljKsV6T5EhsflT+VM75gLBDpYu3lXtOKnP2hQO1aFz3YdsOOt2Ne8+k6Y4IWdqESuKPMx5F"
820
+ "yefhXOzZc24/HKW7seD5OJe7KUpq/X3TXW0jno6z2JXO9h1HuqvV5XPJuv30lzWREvm6KXxOzrv1"
821
+ "DdIpEuCHMxqroKfwG/mx8oL9o/nk7uLATImK/O4qOjtWlSzsFxt2U8+Bc3b/bEUcK0s6WIrK90op"
822
+ "+fPMRTLa5svRF/5g2mPyZ1g5f1RruKsGTzkXU6L5M5X6zbbZcBAZwCz/y5+o1m+08QZ18YlRp0Do"
823
+ "siIBr8fZkquUk4uKMebimYZijTjbcpViCHzVgkQxNlvxFFtu6Mhnd0MrIwXDR5zlU81jNNpOzXo2"
824
+ "qtRB4Vqe+gJpisNR/ky5YqrwzJ9sZgG/TNaNiliKE8FLmJ++JOp8blA+6LaBqUyeKeU2kBuV/Xv3"
825
+ "XM9QFxWadpzbN670BTBrGXT9wt95fgRQPkfTCITOFGz+tGt/zISdu6dIn3D9q3miQj13qycyZ61F"
826
+ "Ii6ThXR6n+x5JjBqK2iHL17MQ9/dh1BOZIQONVb2bArjTCXJpZYVT41Zz3FQ9w/yrJhDURzdCTZP"
827
+ "y7kMxG/U0gc9L2Ydg3b9wUH5zO3wzgGOMfBnSgC3JNXFe41IVD53C2RdakafnHMZBuffnx3z0TI0"
828
+ "LmPzUU6KnP1oDhI5eQmFkbOtKs6T74kYZlLIxJOOPgel7ZZlSHQd1lwH5AmWjVYWT7qFztXarj6u"
829
+ "GJXV6cV0RVdHx3Hec9Ba39Wu4d2q246x0JKQpgcychpBnbbqQ4Ivcjpd6ziSkkfnYb9lkfNloKO8"
830
+ "c+JKWhPOY7biPDq2NVEeNbSfxqPW8NO+iAhiiy222GKLLbbYYosttthiiy222GKLLbbYYosttthi"
831
+ "iy222GKLLbbYYosttthiiy222GKLLbbYYosttthi22r/P4wOyqU="
832
+ )
833
+ _WORLD_BITMAP: list[list[int]] | None = None
834
+
835
+
836
+ keys.define("timezone", "Time zone picker", [
837
+ ("earlier", ("LEFT",), "previous UTC offset"),
838
+ ("later", ("RIGHT",), "next UTC offset"),
839
+ ("up", ("UP",), "previous zone"),
840
+ ("down", ("DOWN",), "next zone"),
841
+ ("choose", ("ENTER",), "choose"),
842
+ ("back", ("ESC",), "clear the search, or cancel"),
843
+ ], within=("search", "global"))
844
+
845
+
846
+ def _get_world_bitmap() -> list[list[int]]:
847
+ """Decode and cache the 2880x1440 world coastline bitmap (built lazily, once)."""
848
+ global _WORLD_BITMAP
849
+ if _WORLD_BITMAP is None:
850
+ import zlib, base64 as _b64
851
+ raw = zlib.decompress(_b64.b64decode(_WORLD_MAP_DATA))
852
+ bm = []
853
+ bit = 0
854
+ for _ in range(1440):
855
+ row = []
856
+ for _ in range(2880):
857
+ row.append((raw[bit >> 3] >> (7 - (bit & 7))) & 1)
858
+ bit += 1
859
+ bm.append(row)
860
+ _WORLD_BITMAP = bm
861
+ return _WORLD_BITMAP
862
+
863
+
864
+ _WORLD_TZ_DATA = (
865
+ "eNrt3T1ro0mzxnEHE4iDgwkcOBCDWBQ4cKBAgQIxmEF4hXEgWDGYgzkomGC+/yc4frdkSbfufqnu"
866
+ "qur/xbO7nvGs9ST7o6iurj4768q3hAzic56S7wm5iM9lQoYJGSVknJKrhFzHZ5KSaUpm8Zmn5CY+"
867
+ "i5Qs43OfklV81il5iM9jQjadOcNnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZn"
868
+ "fMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZn"
869
+ "fMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfG7S5w0+4zM+4zM+4zM+4zM+4zM+"
870
+ "4zM+4zM+4zM+4zM+4zM+4zM+4zM+4zM+4zM+4zM+4zM+4zM+4zM+4zM+4zM+4zM+4zM+4zM+Cwef"
871
+ "8Rmf8Rmfdfq8bzU+4zM+43MDPqc4Pa4TfMZnfDbs86Apn4cS0ezzR5rxeXZTJ/iMz/gc6/NQPMp9"
872
+ "jjEan/EZn/HZhc+fRI9VhvoZn/EZnxv1eWwo+IzP+IzPbfg8dhN8zpJl0eAzPuOze5sPKY3P+IzP"
873
+ "+GzU57HT4LMan1d6g8/4rNdn7zTjs6TPKwfBZ3xW6fO4CZvr+hwD+o2W4DM+43MFn8ft0IzP+IzP"
874
+ "+Fzq+iA4Rwzb4TP9Z3zGZ9GFG3l8HjWHMz7jMz7jswmfNV8MlLulgs/4fCwPtYLP+Ny5W8MYw5NJ"
875
+ "9B1CfMZnVTbjMz6fWHtkrkw+rOc1PuOzPZzxWZ/PlzmSbyWdC577EY3P+KzKZnzG55PrQn347K9+"
876
+ "5v6gf5zxuYjPF2WbG8E+61/lnOrzNT7jszmb8bmAzyVfs4ryWf1bKKk+698vis+KfH5QFXyW87n4"
877
+ "a4MxPo/wGZ/xWaPN+Czpc4XXYGP7z36ATjgexOdmfH6wE3zO7vNFUqqcD7oBmvNBuz63XCbjs7jP"
878
+ "F3lS3ueRoxbHJKHBgc81fW67jYHPsj5fZIu2+TpbQCeMb+BzPZ+bbzPjs6DPFzlT636KD6Dx2aDP"
879
+ "HAPis5jPF5lT7/5gt9HMb+CziM+MaQjx3LzPFxKp6XOn0PiMz9l9ZoxOTOfmfb5w6HMX0ZwP4nNe"
880
+ "nxlzluSZ/oZLn093o405Tf2s0meuocjqjM8iSuvw2c1ajuv+weeCPnNNUFpnfBYR2orPpq4VKvd5"
881
+ "lhCTPnONW15nfG7cZ29C43MZn1mBVETnUz5vmH/27rMdoamftfAMzaV4PuVzp9DMb7jw2YTQ6vvP"
882
+ "dn22pPNDI8eC/X3uENqyzxeSwedaB4T4LMwzOJfUuZfPR4U2XT/jsxWfr6/xWQnPNDbK6tzT543H"
883
+ "/gY+WxD6Oiz4LMMzr6JU0bmvz4eFNt5/xmcDROOzjuIZnqvw3NvnQ0JTP3vyeeSAZ3yW6m1gcw2d"
884
+ "Q3zeF5rzQUmoi/s8Mq8zPjvlWSHREhgn+rzx4/NF0VA/F8EZn8VOBn3y/Kg/m0280PgsqXTr/Wd8"
885
+ "ZqxOGGh/Pu8Ibdfni4qhv3Gc5FSe8VnoUorP8Y1ccGryeePA54v6wedjJXOCzvgstxDJ44RdTivV"
886
+ "+PwptFWfLy4sAN2qz0nBZ9l9/A37fAJFRT5vmH8uAHSD54P4zDp+pT73UFGPz29Cp/j8AWbV/Uia"
887
+ "hS5fP4/wOYvPU90+W8U5P9D5ndTi84vQGXT+QDoEavX767IAXcHnykpfX9cFOtHn+MrazFuwzoSW"
888
+ "cPLoH37/RiGfN+E+9/ETnyv7bLp81vu+lQ+fve2vk1cytdJO+Yj8OvfDOpLmVxM1+dwpdBWfjbc3"
889
+ "dL8/iM/aLg9W07m30BtxoM+zJMXnFwnffd4VWvEcx7AG0NaPCHW/D0t/Q9nV7go6l+o/9xX6vGoO"
890
+ "kqhmxq4T6OFw2OARodn7KX1yc2PZZ6ebNwoXz6c/KutnKtT5pVg+QvM70Bft+GxyB4f5+vl9lGMb"
891
+ "5/eY9NnrZqQqBfQhr4W6KJtaPH82KU6UywaCz5l6HEp83sZ33+cbo/0Npxvr6nWgy6S6zx9CXxiO"
892
+ "nM+2bhFeXV358/mYlcb6zx6XiT5WPSOsCbRwG+P715x/x2fjh4RXLzHm84HJ5x2eT3hZ1udlnngR"
893
+ "2r3N+0KXajN/3w8+57mhUofoq/eY8/mr0Fqe5pbzuSmgN46ALncMiM+CRNfD2WJ/Y/tW99cpupsb"
894
+ "l0T7aXE0BHTRMQ18dtLhuPoam/1nfW9z43MOnzdOUnqWzpnPF6I+hyFdC2bTPpsR2gbPK4rnzMFn"
895
+ "5T73FrqazC59VlhDLw1c8uZ0EJ9b87mf0JVYNu+zGaAtlM+r+jhvfKW+z9/xOQfSlXk2PP/cCM8O"
896
+ "+hvN6YzPdnzuJro2z+7qZ44HtRXPjw3yrMFnEw+jlHy/O0roujq7q5+ZgLbosz+hNfn8HZ91Ad3X"
897
+ "5lcp85mrob/hjuY2fPZGNPWzk/p5VFnnHaEnEzs+6z4eXGaOf5+pn6mf9emc3edwnetk6hno5dKS"
898
+ "zzqAxmcxn6sarb61UW6CI6DtPLHvs2Kgl7aAZvbZv8/VhFbP87DQCPSVJZ7lfHZoszjRta+nvPwJ"
899
+ "dBb12Wb9XJnmfEBfXbXms8rqeSkZy0AfMnlb54e3GtpBHV3hGSu3/Q0VPo+K2qyDaJ/3B03yXGU1"
900
+ "Uve3N4/oTP0syfMobJNdaZ+t188zdTwvC8TF01b92x/onLP//N2ez9UL52o+G5/fmHXFLc8iRpd+"
901
+ "3CqkQ43OOX2uQ7TO5oZ6n2szLcczPqvucQQeIcJzTp9NAa2i9VzVZ5v18+xkPAPt4qHYkBkPdM7o"
902
+ "c3mhjR8N4jM819d5/fS/5yj0GZ3z+lxaaIMrN/T0N14ud0+uDfk8g2cBnhXgfMRndG7TZwX3UjT0"
903
+ "n8sv3kjgedY7dDcifK6MtN3q+fwcn/FZ0uey+0XlSudqQJv2ea3AZ7uXvs/P8Tm7z7p0bsvnAjwX"
904
+ "F9qNz2t8Dsrg3JzPZYXWWj0P8TnruaBqnl30n+v2N0z6PBiY9Pk7PuNz6aE6/w1oscE6DQW0xQsq"
905
+ "A6s+f2/dZyv3U4pWz9NSPnO7O55nTT7r19mqz+WIdtF+bqJ+nhby2e18XQmdtR0QqlV6MDDu8/e2"
906
+ "+xv4XMlnbncn+bzWxrNKoAcD+z6XIZr62Uz/uYTPHlGWA3p9INp01ujzAJ/pPzvzeVqgfkbndJ+L"
907
+ "E23u5avBwIvPz0C//PWd+pn+hrTPsh7XEfkl989Zyrc24DlUZ+s+y1fS9J9b8Ll+7VwO4i/Z+s0y"
908
+ "PtPc6K+zG5/FhKZ+bqH/rKG1UYfnnZQA+hChonCb5lmHzzmcpv+Mz/Y38rvi+ZDQR3WWEvrRToNj"
909
+ "cCjnboSOA/tSINp4xuckoVvxWUDqHj4L9z4eH40IPTiSWhQf/ux3XdO1xmd8tlZCL5X4nEnoHu0N"
910
+ "2d70Y79o5nlQR+bjn/3Jc5GGh0Wf6W9UGLGzzfN9aKTL55evpSY8HoOiunwuDHSPj/7QOQ1ozz5z"
911
+ "PpidZx0VtBqeE4h+ArYT6I8v15l5foyMap1LAh3xyfiMzwoKaOMN6JI8v6LcNQB9MmV5ftStczGg"
912
+ "Yz8Yn5l/bsVnLzy/CL3G5yw8lwA65XPxGZ9r3yG0BPTzrZNUne/z3hnsT3Ms0I+PRn0eDOr7nPi5"
913
+ "+Nxcf6P4y91+fP7k+T4lNXQu3nqu7vOgX2rgHPCx+NxU/Vz+7W49l1TqNDNSkX5tOK+r+fxg1OfB"
914
+ "oDLQmT4Vn1t6v3uSGrPlc44CuqzPH7Tis5zOUkDn+9BAmvHZev+5tM9aVotq4rlER6Ph/sagrs9Z"
915
+ "P7QXyzGLOKz6PMJnlz7fVBvYUMBz8dGNij4PAlNe56DPlFqQhM/4rOP2YM4Ju8Z8Nlg/DwYVgZb4"
916
+ "SCGgG+hutDNfF+2zmrdT9Ojc83Cwbl/Dqs+DmJTWOfwTLfg8xGePPs/aOyBcFSyg6+lcwedBZMri"
917
+ "HPWB2n0eDvHZns+KHh9cahrgKNjfqMfzoxWeB4V1jvrA3EAb9XmIz/l87qHz/DVN6XwSaA2TG+Z8"
918
+ "HiSkKM7Zff7eks9DfC5VP8+/pJn555Kng6n9DSv7NwaDKkAX+7jcZ4RmfR569rnw/ZQgnkWBbrS7"
919
+ "UWHrcxWfB6kpZ7OIz+FCW/L5SVruDwr5/EbvAZ5nxXxeLjWNb9xbGa5L7XIY4nlQEOfc54NxQtvx"
920
+ "+Qnn0YvQL0o77j9Pyt/v3jH4RPUsWT/js+P73YMcKWZzuM8iL3kbqp9H0cHnEwniWRBoVRW0GZ9t"
921
+ "nA8OBgWBLvlZLw8SiixHsuTzaNSAz5M8iV8y+uzz9KTPIkAvLTU4nLQ2ygE9yJYyNEfs5z+XENqK"
922
+ "z6MWfJ5U93nnwHB+PKqfTnnZAL1LbRzapYCuqnMRoMugOcicIJ/PLfgsh3SIx//807LP0wyZn4qN"
923
+ "p60+dI6rqsu0N2re7S4EtDyaA4mE+ByxZbSWz7WB/uc5Lfo8zZb5vLDQcjrH9z1KDNg95IhyoIXR"
924
+ "HIgl5GAweA20vxVJATrvAt2Ez9OcmZcGelkk+hZwdMO7/Uk9gE7Q2gzPgzI0h79vFfGQSiWg63ag"
925
+ "DfucIvR0WhDoGxP1c7LQJZ4d7GVzH6MTq2kjOn+gOSiQ83Cg8wvtq3r+BNrmfJ0Rn29s6hwIdIl3"
926
+ "YUN47iW0rhbH42N+NAelEjb7HPfUlav73SFANzZfV9TnOT7X4flUl0MZ0K8/eGA15/WBxmcf/efC"
927
+ "3WezPAcALV899+499xRa2yHhx0/27/MLy8GvxXrpPe8DPQxpcBjxWU/13GO+Lude6KVGoFcrSaB7"
928
+ "9JFDgdY2xbHzo/37fP7p87nW+rnY3rrOgro5n6fT/D4fvUGYfXH/snTy6hxDdILOx3x+1DYH/fVn"
929
+ "u/c5YhfHaaCNvp7S2fGw6vO1Gp6neztGn52eHfI5mefFU5bPf6kCehWRnDPPqxCf+/K7XhcD+tCP"
930
+ "xudwoY0uf/bp84fQIVRPp/I+C757tdiJIqDjjF51qBxwG6XzI2J9fv5/UQjoIz+5GZ+zAX3pD2jT"
931
+ "83WBpfRUKrOQ5NL5gNC7v5EL8J4rOfIW0SE3AkN8fnwM8LkI0B0/uA2fv2ebgrb7fsoxn//5x3D9"
932
+ "HObzVDAlgF4cyYvEB8TOV2K/Xvv+vACeD2h5nr8CnZXnHEB3/1x8DgHar8/+6+epaZ8XAVmKt0C6"
933
+ "gQ7hOoPPJz9DrnxOB/r0j6X/3LDPezh79VmPzu9E93Z6sQj0Wb5H3eFzcE39BvIu1zl5XkW3n9fi"
934
+ "Uxy9fir9575AO/XZa/08LZNZbPqXztqAPkz0KkvT4zjPhw/8BIEWHrPr/UO9+5zrhNC8z8MjPL8C"
935
+ "/Y8nn6dT7Tz3QvoV2XieF9VvFkYQ3aNQ7mtzrM+96+fjQOecrcbnJs4Hh8d43lLahc9WdD5J9CIt"
936
+ "GlZzrLIAfejPRP247D4fFjr3M7T4XLh+HtYesPvnUOz7PC2a2UxWaLU+y10v/CrqKlfEfH48xHP2"
937
+ "Z8LxueD887BSnPs8LR7dBbT87ZWVzPVCkQTyvI72NPkSeaH10Cbr55AXvaPZru7zP0d4xufy5fNM"
938
+ "qnwWF/rAyIZin5/yKFE+fwX1Qchn1ULjc06f/zkafNbT3cjg80Lc55UFl8N8Xgf7/PhVZxmfFQvt"
939
+ "y+eSRI+2ttid5Jn62VH7WZTobfas8PwF6FWnz3FAP8j6vMHnQj5flm1o7Pz6H6f1s02gb2Qr6AI+"
940
+ "r6z4vEXz8Xp6HePz467OYj4/CX3WmW/xMeJzKaAvi1xC2QX6pM//2J7f4HywFNBf6bNUP3f1Oz5v"
941
+ "mYej+lDC503zPpuuoDt9Hnn3eWIL5+zbN7ZMFu5AH8DPgM8n+9HRPL8+aIjPCn2OhLrwq4OHNyTt"
942
+ "Ye3gfooVnkX2I22pLHo+eMrne5M8J/j8gM+lfC4jdOGXYQ9+51nVt8k6D/3nokBr9llO5Q6fV/e2"
943
+ "hO7SORTorI9o4bMU0Ip9PpSxT5+LEF2O51CglyWLZsNA5+M58yOH+CwmtC2fX4He6kqP8Nk6z+ID"
944
+ "z32Bbqd8fsBnIz4Hd6AFmB6NwoR2uv/ZxdlguNDwnKV8TtQZnzX6rGOOY5QSR/v5DY89xxO91OLz"
945
+ "ynb5nMozPgvtFy3ZgZYBGp9NAG3P55Vvn6O6G0dfdsFn2fr5wqzPQ3wW73Bo5XlB+ZyF555Id7y8"
946
+ "hc+l9z/b6XHgs/ICWu6JWC39DWs8H36oNp5nfPblsxag8bmE0IIveNdpbOwJrVrmfZ/XET53v1yL"
947
+ "z6Xft2rijJD+RpEKWs7n7ESvXKVzY10Q0A/4rOv9FEvbRvFZ+R0VSZ8ROtDndUfidMbn/D5fXGTw"
948
+ "+cL4iB0+q2xyVL3g7d3ndXfe/kiQzvgs4fOFi+Yz54Nm7njbqKB9+7zumSCd8Rmf8fk5r1C+cmzu"
949
+ "jvdMeIMdPmfzOUxnfMZnfP7g+UBMrEjqLXTsWv5XpVO19uxzWPn80Dv4jM+t30+Z1k4xoOs+ouK4"
950
+ "gF73T4jO+IzPzfs8nboAupDQ+LzPc4DO64ew4LNCny/wuSmfZ5mivIR2IfMTsV98FtQZn/GZ/oYX"
951
+ "nnsJXc3nlRee16u3Sbl1EM4PUcFnjfdT8Lno+aAfn2d6OxxedH6ROTwP+IzP+EwBLQ70nrz9zHbk"
952
+ "8xqf3ezn/47PBnx+G6ObAHSw0K3ovE7KAz678fkyIficdnXQus9Fhjh2dV54x/n1SHBVHmd89uYz"
953
+ "9XPizW77HegeTGfz+fM3OpRuvHLGZ3zWtp7flM/Vdc7PszTQb0j3OjdsXmd89tZ/xueCPleunmdC"
954
+ "Efd5sTx5ctj4kSA+Uz9rXP5syudJVZ9nM7s+dzamVz54Xq/xGZ/xuZbPxVeJluK5gs+7dfMSnPEZ"
955
+ "nxvy+Tp//PJcoAH9eTS429nwsmNjjc/4rPVwsAmfK6ziL8XzCaNzFs3PnWiPS5DwGZ/xuaLPNXGe"
956
+ "FcjPn58g/9z+RV6fnS6pW+MzPtPfqOdz3eq5BM+fJv/8uQu0SPf5ZaKD+hmf8Rmf8/PsDehPk39+"
957
+ "5VlugsORz/mIxmd8xuf052CnrvrPP3ez0+v4+ROfy1XQ+OzJZ/rPBXxWwPN0Vhbo7VpaEGg/RNPf"
958
+ "wGfFJ4SefZ74L5/3ff6SfCD/8ik0PuOz3vVInn2eHElTPu8BHWv2r1+/PPrM+SA+K14v6thnDTpX"
959
+ "6G90CJ1SVf/6tQc0PuMz88+N7X+WLp7d+dwf6KTWh1ef6W/gc3afMxrt1OeJGp/FjJ739vnnIZ07"
960
+ "gf51AOdPnn+9/cUMBz7js6zQPn2euPd5/panL35Gp6NU/hD5+W87Pr9+zQQ0Pvv0+TJb8Dmc5ypC"
961
+ "y/H8nJ8/swr963i+HhMCND7jM/VzVp49LICez3MBvW/0r1/dQnucgsZnfKZ+LrT/eTJRB3Reoudf"
962
+ "U8pnt7dU8BmfqZ/L+DxR6fNUkOecPgfpjM/4bMHn8meD1M8JPFu/SJgZ6J6tjSNAMwaNz/gsNmDn"
963
+ "zefJRCnQoj7nAfpXhM9Oamh8xmd8lvd5EpRpQahFeU4C+p3eX78igV7c3t7S38BnfPZ/PyXN50lk"
964
+ "mve5X47qjM9Kff4mFXwuc8Xblc+TiV6g9bY3cvB82zjO+Kx6fgOfFfg8meBzIZ5fTX7/p22g1/jM"
965
+ "fB39DXGfJ434rKF8vj0U6md8pn7G56v8PBcAWrL5PC/RfPbqM/Uz/Wd8lvZ50oTP8/m8yungkaaz"
966
+ "k/rZ8XwdPuOzBp8nLfg8Px7pAtqzzx9F9Aqf8RmfBXyeNODzvDOFgXbm8xqf8Zn7KVI+T2r5POv/"
967
+ "B7X6nK+/YVnoF57xmfNBfM7v86SWz1t61joZTAY6cu751luHI/moEJ+1+nxB/Wze5yihdwGtcm8w"
968
+ "WejYeyn4jM/4zH5ROz4fEno2K+dzpNApWze2bbbPMz7jM/WzPp+n0yif9wWt7fNcpoDu5bN9nfG5"
969
+ "bZ8v8waf615NmfXwuSjOkUAnrd3AZ3z2Mr+Bz/p8zjwuJ+PzvH8y+7w4nluHQOMzPuOzY5/3kNbP"
970
+ "cyfRQT7Tf8Zny/N1+KywvyFz3aTMrW7RIbvFiTC/gc++9tddagS6bZ/l7gMaanAc9DmG57bX9OMz"
971
+ "PuNzTp9lr2vnPB8U9jm8fL699Qg0Pnv1+Tv9DWs+a3nttX79/CvY59uO4DM+6/O5PND4XM3n2Uyt"
972
+ "z/MSPHf6/AT0v//isw6f30lMRzVj8BmfRdfVqcX5BehAo4MnN7p1vv33NfiMz5p8Lg70s66X+Bzs"
973
+ "83SiYFmoHM/hZfSTuFnOBnd4Nik0Pjv2uUILOkMV3ZrP2h57FeI5qIRehKUnzzFAV+5e47Nnn6sM"
974
+ "cVzi83WFLfyKZZb2+ba3zwFE6zhdxOfmfdZWQjfl89SQz/PUCAF9G+Tzv6E+VxUan137XKfDgc8V"
975
+ "3rAy4LMM0LcnEwy0nvE8fHbl8xu5QUDjMz7r87m30Ld9Eij03r9/d4fP+JzN5y2hzfGMz359DhyF"
976
+ "zsbzfpNjj+jl8rjOzz5XEhqfffpc4fEUfPbt83w+0+Tzk5r9eT5I9CvSrx2M5VsO+3yHz/jsx2f6"
977
+ "Gy7r5+IldI7C+YTQ//774vM7z8uD/97dW/A5o8+qgs/4bH18IxfQ8yw+38Zn3+flVvAZn737fInP"
978
+ "ToGeFwX6pwTPu0DffvH5mM34jM9VfL7A5/w+H4i00B4L6J8iPO8K/QH07SGf7/AZn2v4/ISoWPWM"
979
+ "z9cBBbUtn3MAfbOL8E3Z9sYXo7v+yN2XmNIZnw37fCkbfA7pd7Sxf2PL56e827z1ddh03W2BVOV5"
980
+ "nRx8xmd8Tvc5g9Azaz4/q3xzc3PU51yDz6dzbGqjhs/rrMFnqz5f4nNJnwucE1r0uQvooj4fIfoO"
981
+ "n/G5hs+X+KzM53Shzfm8FdGrg/2A1tHewGd8LsAzPsdM2zVTQN8cSEWfj7U4KnSf8Rmf8Vmpz5NW"
982
+ "WtA3XTns89M3xIDeuZ2yPOazNZy1+nzWHXymv6HV5zShnfj8ivSLyLsp4vMSn/GZ88GmfC70TKwV"
983
+ "n2+iI+Pz8ojP5nnGZ3zG55M+e3zHu4bOX4G+vZUA+haf8VnD/W58LuPzJDiugc7gc/ZrKD14fvL5"
984
+ "bnWHz/hc6n0rfC7i82TiEug6BbTQvcFTvY0yNTQ+4zM+W/A5SWjXDY4beZ+Xx32+43wQn4u9D4vP"
985
+ "BXyeTIoDvUu0ENjzah1oSZ+XVX1uY38dPvdtSGvEGZ8z3Sd811mopJ7Pq3U4hAvoLp+PCH3/FHzG"
986
+ "58w+K3x70JvPk0lFoCWbHuIT0EU70F8nOO7CfRYyGp/xWRfP+CzxOuFUl8/RTosPcLwA3cvn+73g"
987
+ "Mz5n9Tm70EN8zsdzXqCnGn2eK6yfl33aG/eHgs/4rNrnIT7n5Lm+0HNpn+cq6uddoO/wGZ+V+Hyh"
988
+ "jmd8lgN6KoytE5870+GzgND4jM9ZgWZ+I6/PJYS25nN+oQN8fr5JeHcU6NxE43PjPl8wXyfl82Si"
989
+ "EeipKp9jN3Dkg/mrz3c9cn+c5/vn7+WbvcNn6mfup+j2WVxogz7L7K7r6fP9qazuc83d4XPDPnN/"
990
+ "sE2fvwpt0ecPoJOoXkYBjc/4zP4N+s+CQE91+JyyYfRN59w+p+v8bvK9E583WYPP+Ozkfooo0FPr"
991
+ "PudodcTUz719XuEzPpv3eZQzbn0WraFt+5yZ526g7+/78/wBND7js9n9dfhctQ9taLYuu8/LZSjQ"
992
+ "QTrjMz5r3F8X2N/A55pdDks45/V5uQzy+b5/VviMz/jsf/9GAaAt4Zyx/7zsTpLPK3zGZz/zddTP"
993
+ "jdXP2V6Ijfd5WcRnzgfxWdf+OnyWrqAn5n2+qe/zMtzniPYG83X4bP/+4Aif8bmsz8tlkfoZn/FZ"
994
+ "4/4N5z5fhwSf9fU3lr0SXT5/Ga7DZ3xO8fmC/gY+t+TzMsbnMKDvd/fb4TM+x/ssQTT1Mz4X83kh"
995
+ "wXOaz9lWjuIzPsssgsZnfM4PdLLPy2V5oPEZn5N9vsBnfHbv8zLa5zt8xueaPucUGp/xWQToRRLQ"
996
+ "ywSeE4DGZ3zO4XM+ofFZimd8jvd5mebznUqfH0SCzyp9zkU0PuNzsfvd+IzP7fichWh8xmd19fMy"
997
+ "1udlItD4jM85fU4XGp+N8OzifLCXz4tFJM9bv8JnfFbhc6rQ+IzPBX1e9NA50OflNs9L+hv4rMvn"
998
+ "NKHx2cT0xtxY9zna50W4z28oL/EZn935fInPBtY/z934vDiJc4TPe8U0PuMzPrvxWfXeZ3wOBVrp"
999
+ "/RRfPn+LDz7T3wjxWbfN9p626vR5gc/4jM/Uz358nuNzWIMDn/EZn+lvFALal8+LXD4fnpOm/4zP"
1000
+ "+Mz5YBMFtHKfb3MfEOIzPtN/9jpf5658lvF5kc/nA0InXVDBZ3zGZ7/zz/hc2ue9C+H4jM/47Ox9"
1001
+ "WN3zdXMdkff5Fp/xGZ/xWcpnxzpn9HmBz/iMz/hcvn6e4HOCz0H9jVt8xmd8FhJal8+6bxDic7jP"
1002
+ "d/iMz635PMTnGkK78HmHYXzGZ3zO7/Pwx0teif2x/Qt8xudUnxc5fb7DZ3xuzecfP7ZQ/rEXuz5n"
1003
+ "Fdop0Bl9Xkj5nPjGlQWfH48Hnxv2+UfP2PR5whFhSZ8XXTyn1M937vsb+FzF5wS2dfncT2ivPk/9"
1004
+ "TkBL+5y3v4HP+NySzz9+ZAXaaX9jis/9fF4I+3yPz/jckM8/GvD5mg12Xny+x2d8bsjn3Dzr8zlL"
1005
+ "Ee1tg13G/RtFfb7HZ3zGZ3c+X2v1eerO5wX1Mz7jcwWfR4Z9vqaA9uAz9TM+43OK0Vp9ThXaF9CS"
1006
+ "Pi/k7g/e4zM+t+Tzj/CY9fkan2v5fJvH53t8xmcfPovxjM/4HO7zbbrP9ynBZ3w26HOM0HZ9vmYC"
1007
+ "uprPt/iMz/gsez3Fus/XjECX8Hlx8EIhPuMzPsv7fEJofLYgtKzPi4MXvtN8vsdnfPazH2lYC2h8"
1008
+ "xmcJn6mf8Rmf8bmCzxWIFvZ5cWhfEj7jMz7L+2y4/3yt1eepM5+ff3vv+/gc63NerPHZ0v7nls4H"
1009
+ "9fo8NevzqWz7jc/4jM+yBTQ+4zM+4zM+6/TZdH8jgejp1JHQ+IzP+Gzofdj+To+M+xwr9NQT0PiM"
1010
+ "z/hsy+eh8/1IiUBPPQFdxWfOB/EZn+N9Hrbic5zQ+Bzl8yLB5+UBn1/QxGd8bs/nJ6BPQX1A43eS"
1011
+ "Lfl8Heezm6veNXxe5PF5C+hVieAzPmvxeRjI81eN7fis9K6KR58X0fuRXlHe72+8+bzCZ3zG51P1"
1012
+ "c8aU9LlpoIv6vIh8P+UD5QM+lws+47Mun/s3oMeWfW55m50Fn4+eCq7wGZ/xuQfQtn3WdVtlNps9"
1013
+ "/x2fd3rP99WBxufO/D0UfNbg83hs3OcUoTPT/Bl83j4a7OmzIOP4HO7zX3xW0N9w4PN1ZZ+faubZ"
1014
+ "1+Dz9uRGP3nxGZ/x+Yfo4WAVnyvf954dypOfs7ms03Z8XuKzQZ//4nOp+Y1RodmNWj4nXfhOdHrW"
1015
+ "mYZ9XnZfHMRnfMbnD5WPXBxs3Oc8dXQdoDX7vJce9Fb1ORPd+IzPUR2OF6HxWajPUQVoUz4v8dmc"
1016
+ "z3/xuaTPArs28Plkg0MOaFs+HxC6mM9rfMZn3fcHpbYh4XO1FrQhn1+vD57AF5/xudn5DXyW85n6"
1017
+ "uU/pXM/nNT7H+fwXn6v3N/AZn4v4fBJoKZ/X+IzP+nzuX0Lj89TiAaGl/nOvnc46y+eWff6Lz2I+"
1018
+ "j3p3OPBZtP8sJbT1+Y09gHWWz/iMz7l9Ho2Go1EVnZnfKFZAG5vfOFlCy7Q31viMz3p83pa3j8/M"
1019
+ "P09E7w/S3zj9+KBo+xmfywGNz7E+F9OZ+pn7KaE+33e8RrhTXD//ozjPLfj8DZ8r+jwqqDM+s38j"
1020
+ "HOiTr8LGVtRrfC44Ao3PgUQXvjrIfB0+5/Y5qeGxxueSQONzUP18Kvgs7vMcn/P6fL8KQRqfi26B"
1021
+ "xuecPOMzPhf1OZPQhXluxud0oPEZn03NP8/xWcDne7U8G38fFp/xuan9ovgs4vO9Wp/7cq30/W58"
1022
+ "pv9M/YzPRXyuz7MLn//ic875DXxWtH8Dn+v5rIBnfMZndR0O7T5PBUL9jM+afD7DZ7Xzz/hc3mfq"
1023
+ "57I+9xBaA88+fP6Lz7V8bnH/xnRaTugnRbnfjc/4jM+RPo/wWbjHwX6kKv0NDTw78fkvPlfqP7f4"
1024
+ "fkphnfHZrs8P+IzP1X0e4bPkelF8rnI/BZ/x2YnPeYVurX6esV9U4/1uDTz3vk4YT/ifrElckoTP"
1025
+ "Mj5TPwuVzqIjHPiMz/iMz/iMz5p8XuEzPrdwvxuf5Xmm/1xpAzQ+Z/T5Lz5X9JnzQUmfqZ/xGZ/x"
1026
+ "GZ9V+kx/I6/PK0s+p0ityue/+FzNZ+af8Rmf8RmfpX0e4XPB/XWVecZnaaDxGZ8z+jwa1T8cbMjn"
1027
+ "2jy36fMKn6v4/BefU3wexUfRhiRLPtfWGZ/xGZ+N+KyK52eh45DGZ3x25rOT+Q18TvB5NNLmc2Qd"
1028
+ "jc/4nItnHT4/uvH5Lz7X8HmMz/hscP9ziQ3QzD/jMz479pn3U5r2+fFRhc8vm+kGYcHnfD5r5Tkc"
1029
+ "aCF98RmfNT2eUtbnb5l87gH0+f8cDD7jc2Gfa9/txmf1Pj9a9nmAz/iMz/js1udHdz7/xecYn/Xy"
1030
+ "HAy0of4GPqv3eVXT50ctPn/D56o+j/BZr8/c727U50frPkc1OP4Hn7PyLA604/NB9iPhs6DOuXz+"
1031
+ "ltHnv/iMz3Z87oc0Pjfn8yM+43Men0f4jM8u3x+s5/NjSZ83/XjGZ3zGZ95P0fP+YAagq/Lc1+eN"
1032
+ "TPkcBTQ+GwMan1N8vhFLA+9b4XNS+YzP+NyGzzN8bsrnwv2NTqBz+/wXn4vOPytbwOHT52ih8bnu"
1033
+ "C1dGfN7gs9v7g7oWjHr1eYbPxX2u+P5gaZ83J3mO8XmAz86BvsLnJKHxOdrnJ13bmH8u7PNffC7d"
1034
+ "4JAD2vn7sEE+xxCNz/H1cxafq1bQm2Sgv+Gzivo5A9ESVF/hc5rR+Fz7Be+aQxybZKCV+HyOz69A"
1035
+ "52M6B9dXTfgcCvQMnwsMblR/46q0zxsBnwf4nO8B77xldAafr/A5FWh8TvXZ8h1vfMZnOZ+vWvF5"
1036
+ "WtDnbGS347NdoDfJQOOzc5/H+FzM50Pf+Kpztpq6IZ8Thdb+fkoH0N/wGZ8z6my5vzFN9fnwN95V"
1037
+ "zt3zaMrnI0L//q17B/QmFehknwf4nNfn3EgX5tlm/RxaRR/RecZ+JDGft4H+/SLz7+d88dq6zxt8"
1038
+ "xmdJni37HAv07BVn9z7fvaa6z793svP7yt642uQsoPFZjc9DfFZdP+9oXOn6Cj5vC/17faierv1G"
1039
+ "7CZnAT0oEny24PMVPscEn2v4/AqzDM/Ffd7kbnDgs4DPQ3zGZ3w+fkD4+0js+7zBZ3wW47mR/jM+"
1040
+ "V/X59+/+Pj881AMan/EZn/XUzzN8LjK/8btY+YzP+KyvAY3P+Kx3vu53oz4XOyM8EHymfjayvw6f"
1041
+ "8Rmf8Rmf8Rmf930O4xmfCwLNfJ328Q18xud6Pvs+H8Rnf/UzPuOzL59/4zM+4zM+47Mqn1f4XNPn"
1042
+ "AT7jMz7j8wmgu2x25/O3b/jsuv88xueiPs/wWc7nV6KDDgdN+/ztmyafB/is5q1YfMZnlT6vAoc3"
1043
+ "zPjc/XQKPrv0ufRufnymv1HP59/4XBtofMZnfMZnf+eD+Nyez2N8Luwz76fU9vl3bp7xOQBofFb8"
1044
+ "Miw+z/EZn/GZ+Q1hnvEZn636/FVofMZnjfPPY3wuDfQcnzX4/PvNZXwuDjT1Mz6r9XmOzzp8/v1k"
1045
+ "88Obzw9mff6Gz377z+MxPuve/IzPkj4/ZCufqZ8DgG7E5xE+F97PX4lnfJbz+SEPz/iMz/hc//2U"
1046
+ "CjjjMz4b83mAz/hc7X3YOKfnc3zW6HOm4DM+qxqua9rnsjzjMz7b8nmAz/hc43wwuseBz/iMz+34"
1047
+ "XPvuYFs+fzob24LGZ3zG52Z8rr0aqVmfyx8O4jM+m/N5gM/1icZnfMZnfMZnQZ/ZL4rP+IzPBYGm"
1048
+ "/8z7KfiMz/iMzy585n1YfMZnfC4END5TP+MzPuMzPuMzPuMzPuNzf6DxucwBIT7jMz4X9PkPPjfo"
1049
+ "M/Mb+IzP+IzP+IzP+IzPkT7/seXzAJ95vxuf8Rmf8Rmf8Rmf8bmiz3+s+TzAZ+534zM+4zM+K/d5"
1050
+ "PC6/IQmf8RmfS/n8p7/PWrz+nj92fX7J+xf4nM3nes924zM+47MHnz/N/PiS/aL4jM9+fP6Dz2b3"
1051
+ "1x3Uk/38+IzP+IzPRn0ej/EZn/HZhM9/8NmQz72kxWd8xmd8xmedPo+FecZnfMbnMj7/wWd/PncK"
1052
+ "PcZnfMZnfMZn6f5zl6H4jM/4bN3nP/hs1+dTjErxjM/4jM/4jM9dPPeBFJ/xGZ/t+vwHn4363FNS"
1053
+ "fMZnfMZnfE7xWXR9Bj7jMz6b9PlPqs+11Jby+bJ8YnfSjSOFxmd8xmd8xmcl9fMu0GN8xmd8NuHz"
1054
+ "H3zGZ3zGZ3zGZ3xW0d/AZ3zGZ2vvwx6KZp+l9vO79HmEz/iMz0JW4zM+KzsexGd8xmd8xmed7Q18"
1055
+ "xmd8xmd8zgF0fp7xGZ/xuXWfz8PTjs/1ZjfwGZ/xGZ/xOd8O57w64zM+4zM+47PkjlB8xmd8xmd8"
1056
+ "xmd8xmd8xudWfB7jMz7jsyGf/+8z+Ozd5zE+S/k8w2d8xmd8xmeFPj9xmptnfMZnfG7K5zE+y/n8"
1057
+ "QfQMn/EZnzOonNFnE/v58VmsvzHLH3zGZ3xuyOcxPgv2n/EZn/EZn6mf8Rmf8Rmf8Rmf8Rmf8Rmf"
1058
+ "8dn6/DM+4zP3U/CZ/jM+4zM+47Mzn8f4LHp/EJ/xGZ/xGZ/xGZ/xGZ9d+TzGZ+H9G/iMz4E+/+9z"
1059
+ "8Bmf8Rmf8flo/vvvP3zGZ3x2vb8On236/N9/ET4nC43P+Ez/ueh+UXw26POLzv+tP4PP+IzP+IzP"
1060
+ "anxe7+b3mvNBfGb+GZ/xub7P64PR7PMGn/EZn+k/t+Dz+ljwGZ/xmfkNfNbp81qrzxt8xmd8pn7G"
1061
+ "Z40+b/CZ/Uj4TP+5dZ/X+IzP+IzP+IzPxXjGZ88+j/AZn1vxea3Q5w0+4/NxnvEZn9vxeS3HMz7j"
1062
+ "s0D5jM/9hU4TG5/xWYJnfHbrc/JPce/zm8g5Kmp8VuDzWpnPG3zmfvexdvMIn3sJnafjgc8afD4m"
1063
+ "ND7js4b9G8//3uu/nKMKb8LnKT578nmtyOcNPuPzfk8jW5cEn/HZnM9rfMZnfMZnfNbp81qLzxt8"
1064
+ "xuduntX6PJEKPuPzW7a+ruHzBp/x+ZTQ+IzPrfn8qvIO1viMz0ret8JnfG7d571quoLPG3x263Pq"
1065
+ "1DM+4zM+V/V5g8/4jM/4jM89mtH4jM86fKb/jM/4XL1+3uAzPuMzPuOzRp83+GzQ5+4InA7iMz63"
1066
+ "7vMan/FZi8/MP+MzPu8DXdjnDT7jcx+e8Rmfm/d5jc/4nOyzxO1BfMZnfH5OUZ83+Oy7fh5l0hmf"
1067
+ "8Rmfsyhdi2d81uLzMAVVkS3/+IzP+IzP+Jzgs+ArLPiMz/gc6vMGn/G5B834jM/4XNznDT479zkj"
1068
+ "z/iMz/iMz/ic8XwQn/EZn436vMFn5z7n5Bmf8RmfC/q8wWf388/4jM/4jM/4rNLnMf0NfMZnkz5v"
1069
+ "8BmfqZ/xGZ/xGZ8L+tyT1FEYz/iMz/hczOcNPjdeP48Cg8/4jM+FfN7gc/P9DXzGZ3zGZ3xW2d/w"
1070
+ "4rOY3fiMz5V83uBzAz5nOxrEZ3zG53I+b/AZn/EZn/EZn/EZn/EZn/G5r88bfHbs8wif8Rmf7fq8"
1071
+ "wec2fB7lwxmf8Rmf8RmfU33uTyrzG/iMz+p83uCzY5/7mzrCZ3zGZ20+b/AZn/EZn/EZn/G5sM8B"
1072
+ "pOIzPuMzPuMzPuMzPuMzPuNzb1VH+IzP+IzP+FzL56zlMz7jMz5b9vkbPtf2WbB8xmedPn+BEp/x"
1073
+ "+XDO8NmIz6Oo4DM+47NVn8/O8Fmdzxl1xmd8xmezPp/hswKf+5g6wmd8xue2fD7DZ40+5+QZn/EZ"
1074
+ "n236fIbPVnymfsZnfG7K57MzfLbT36D/jM/43JDPZ/hsqX6ONhqfy/g8x2d8FuAZn+34PMZnLz5z"
1075
+ "PwWfe/GMz9p8znp9EJ+5P4jPxnw+O8NntT6P8Rmf8blhn8/wWa/PmXnGZ3zGZ1M+n+Gz1foZn/EZ"
1076
+ "n337fIbPRn1mvg6f8dm3z2dn+Gy0v8H8Mz7js2+fz/DZqM/cT8FnfHbu8xk+6/Y5t874jM/4bMXn"
1077
+ "M3zW7fMYn/EZn9v0+ewMn3X7PMZnfMbnNn0+w2d8xmd8xmeNPp/hs/r3UwR4xmd8xmf9Pp/hs9X+"
1078
+ "8ygp+IzP+Kzc57MzfDY6vzEa4TM+47Nnn8/w2c77sPiMz/jcks9n+Kzb5yE+4zM+4zM+m6ufx/iM"
1079
+ "z/iMz/iMz/iMz/iMz/gcsMEOn/EZn/EZn5X4/NVWSZ+vpILP+IzP+OzC52EnsPiMz/iMz/hczeeh"
1080
+ "FM/4jM/4jM/4LFQ/pzY48Bmf8Rmf8Tmpfh7iMz7jMz7jMz7jMz7jMz7jc3+fjwktvF8Un/EZn/EZ"
1081
+ "n4dxQKfO2Ln2eZo7+IzP+IzP/YFOvaaCz/iMz/iMz+k+HyI69SIhPuMzPuMzPmfxeU/o1JX9+IzP"
1082
+ "+Czuc4re+GzJ5yE+4zM+4zM+6/S5qxHNfiR8xmd8xueqPndv5MBn5uvwGZ/xuaLPuYzGZ3zGZ3zG"
1083
+ "5/w+50Aan/EZn/EZn4V8TjQan/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZ"
1084
+ "n/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZ"
1085
+ "n/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZ"
1086
+ "n/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/EZn/E5l8/jMT7jMz7jMz7jMz7jMz7j"
1087
+ "Mz7jMz7jMz7jM/1nfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMbn6j6/oIrP+IzP+IzP+IzP+IzP+IzP"
1088
+ "vX2mv4HP+IzP+Ez9jM/4jM/4jM/4jM/4jM/4zPwGPuMzPuMzPuMzPuMzPuMzPuMzPuMzPuMzPuMz"
1089
+ "PuMzPuMzPuMzPuMzPuMzPuNzos+r9OAzPuMzPuNzdp9XK3zGZ3zGZ3xW6PMKn/HZm89bWuIzPlM/"
1090
+ "R5q8fsBnfM7t846W+IzP+FyyZsZnfO7NMz7jMz7jMz5r8XmMz/i8JfEHxszX4TM+4zM+q/I5e/AZ"
1091
+ "n/GZ/gY+4zP3U/DZ53wdPuNzFp+fYMRnfMbnzPPP+IzPGXy+x2d8xmd8xmeNPt/jMz7jM/cH8Vmh"
1092
+ "z28w4jM+4zM+4zM+4zM+4zM+4zPzG/iMz/iMz9wfxGd8xmd8TvL55Z/vvw5AG5/xGZ/xGZ/FfE4q"
1093
+ "qvEZn/EZn/EZn/EZn/EZn635/PTfPj7jMz7jMz5r8vnpP/qXv+EzPuMzPuOzOp/fgs/4jM/4jM/4"
1094
+ "jM/4jM/4jM/4jM/4jM/43LLPO97iMz7jMz7jM/cH8Rmf8Rmf8Rmf8Rmf8Rmf8Rmf8Rmf8Rmf8Rmf"
1095
+ "8Rmf8Rmf8Rmf8Rmf8Rmf8dmnz/vQ4jM+4zM+4zM+4zM+4zM+V/P5q4/4jM/4jM/4jM9xPtN/xmd8"
1096
+ "xmd8xmd8xmd8xmd8pr+Bz/iMz/hs2Gfm6/AZn/EZn9X5zPwzPuMzPuMzPuMzPif5PJngMz631d/A"
1097
+ "Z3xW7/MHj/iMz/iMz/isxucdHvEZn5u6P0h/A5/xGZ/xmfoZn/EZn/EZn134/A2f8Rmf8Rmfuxse"
1098
+ "1M/4LO3zca/xGZ+b3l936Jf4jM/lfA6ft8NnfG5nv+hhg/EZn0v4HDMPjc8t+3zqD/vzeRMffMbn"
1099
+ "eJ8j76vgMz6343NS8BmfY32Ovk+Iz/iMz/iMz4I+J9z3xmd8xmd8xmd8xmd8xmd8xmd8xmd8xmd8"
1100
+ "xmd8xmd8xmd8xmd8xmd8xmd8xmfup+AzPuMz76fgMz7L+RwQfMZnfMZnfMZnfMZnfMZnfMZnfMZn"
1101
+ "fMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZn"
1102
+ "fMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZn"
1103
+ "fMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZn"
1104
+ "fMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZn"
1105
+ "fMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZn"
1106
+ "fMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfMZnfJb2+f8BrZeVTg=="
1107
+ )
1108
+ # 1440×720 timezone raster. Byte = round((utc_offset+12)*4); 255=ocean.
1109
+ # Derived from Natural Earth ne_10m_time_zones.
1110
+
1111
+ _WORLD_TZMAP: bytearray | None = None
1112
+
1113
+
1114
+ def _get_tzmap() -> bytearray:
1115
+ """Decode and cache the 1440x720 timezone raster (built lazily, once)."""
1116
+ global _WORLD_TZMAP
1117
+ if _WORLD_TZMAP is None:
1118
+ import zlib, base64 as _b64
1119
+ _WORLD_TZMAP = bytearray(zlib.decompress(_b64.b64decode(_WORLD_TZ_DATA)))
1120
+ return _WORLD_TZMAP
1121
+
1122
+ # Braille dot bit indices per sub-pixel position within a 2-col × 4-row cell.
1123
+ # dc=0 (left column), dc=1 (right column); dr=0..3 (top-to-bottom rows).
1124
+ _BRAILLE_BIT = [
1125
+ [0, 1, 2, 6], # left column: rows 0-3 → braille bits 0,1,2,6
1126
+ [3, 4, 5, 7], # right column: rows 0-3 → braille bits 3,4,5,7
1127
+ ]
1128
+
1129
+
1130
+ def _render_world_map(selected_offset_h: int, selected_offset_m: int,
1131
+ highlighted_tz_indices: list[int],
1132
+ map_cols: int, map_rows: int,
1133
+ current_tz_idx: int = -1) -> list[str]:
1134
+ """Render a sub-pixel braille world map.
1135
+
1136
+ Each terminal character cell samples 2×4 = 8 geographic points (braille
1137
+ dots), giving smooth continental coastlines instead of blocky filled tiles.
1138
+ """
1139
+ bitmap = _get_world_bitmap()
1140
+ src_h = len(bitmap)
1141
+ src_w = len(bitmap[0])
1142
+
1143
+ # Equirectangular projection, aspect-ratio corrected for terminal cells.
1144
+ # CHAR_ASPECT ≈ 2: each terminal cell is ~2× taller than wide, so we
1145
+ # need to show twice as many latitude degrees per row as longitude per col.
1146
+ CHAR_ASPECT = 2.0
1147
+ lat_range = min(180.0, 360.0 * map_rows * CHAR_ASPECT / map_cols)
1148
+ lat_range = max(lat_range, 160.0) # always reach at least ±80° so Antarctica shows
1149
+ lat_top = lat_range / 2.0
1150
+
1151
+ # Pixel grid: each char = 2 px wide × 4 px tall
1152
+ px_w = map_cols * 2
1153
+ px_h = map_rows * 4
1154
+
1155
+ def _px_to_lonlat(px_col: int, px_row: int):
1156
+ """Map a sub-pixel (2x4 per char cell) coordinate to (lon, lat)."""
1157
+ lon = -180.0 + (px_col + 0.5) * 360.0 / px_w
1158
+ lat = lat_top - (px_row + 0.5) * lat_range / px_h
1159
+ return lon, lat
1160
+
1161
+ def _sample_px(px_col: int, px_row: int) -> int:
1162
+ """Coastline bitmap bit at this sub-pixel; 0 outside ±90° latitude."""
1163
+ lon, lat = _px_to_lonlat(px_col, px_row)
1164
+ if lat < -90 or lat > 90:
1165
+ return 0
1166
+ sc = int((lon + 180.0) / 360.0 * src_w)
1167
+ sr = int((90.0 - lat) / 180.0 * src_h)
1168
+ return bitmap[min(max(sr, 0), src_h - 1)][min(sc, src_w - 1)]
1169
+
1170
+ def _char_lon(char_col: int) -> float:
1171
+ """Longitude at the center of a map character column."""
1172
+ return -180.0 + (char_col + 0.5) * 360.0 / map_cols
1173
+
1174
+ def _char_lat(char_row: int) -> float:
1175
+ """Latitude at the center of a map character row."""
1176
+ return lat_top - (char_row + 0.5) * lat_range / map_rows
1177
+
1178
+ # Timezone raster lookup (1440×720, byte = round((utc_offset+12)*4), 255=ocean)
1179
+ tzmap = _get_tzmap()
1180
+ TZ_W, TZ_H = 1440, 720
1181
+ selected_zone = selected_offset_h + selected_offset_m / 60.0
1182
+ selected_code = int(round((selected_zone + 12) * 4))
1183
+ def _is_hl_ll(lat: float, lon: float) -> bool:
1184
+ """Whether (lat, lon) falls in the currently selected UTC offset's timezone."""
1185
+ tc = min(TZ_W - 1, max(0, int((lon + 180.0) / 360.0 * TZ_W)))
1186
+ tr = min(TZ_H - 1, max(0, int((90.0 - lat) / 180.0 * TZ_H)))
1187
+ code = tzmap[tr * TZ_W + tc]
1188
+ return code != 255 and code == selected_code
1189
+
1190
+ def _is_hl(char_col: int, char_row: int) -> bool:
1191
+ """Whether a map character cell falls in the currently selected offset's timezone."""
1192
+ return _is_hl_ll(_char_lat(char_row), _char_lon(char_col))
1193
+
1194
+ def _lat_to_crow(lat: float) -> int:
1195
+ """Latitude to map character row."""
1196
+ return int((lat_top - lat) / lat_range * map_rows)
1197
+
1198
+ def _lon_to_ccol(lon: float) -> int:
1199
+ """Longitude to map character column."""
1200
+ return int((lon + 180.0) / 360.0 * map_cols)
1201
+
1202
+ # Build dot maps
1203
+ # all_cap_cells: cell → True if also a highlighted tz, False if global capital only
1204
+ cur_tz_cell: tuple[int, int] | None = None
1205
+ if current_tz_idx >= 0:
1206
+ _, _, clat, clon, _, _, _, _ = _TIMEZONES[current_tz_idx]
1207
+ cr, cc = _lat_to_crow(clat), _lon_to_ccol(clon)
1208
+ if 0 <= cr < map_rows and 0 <= cc < map_cols:
1209
+ cur_tz_cell = (cr, cc)
1210
+
1211
+ # Capitals in the current offset (bright dots)
1212
+ hl_cap_cells: set[tuple[int, int]] = set()
1213
+ for idx in highlighted_tz_indices:
1214
+ entry = _TIMEZONES[idx]
1215
+ if not entry[7]:
1216
+ continue
1217
+ dr = _lat_to_crow(entry[2])
1218
+ dc = _lon_to_ccol(entry[3])
1219
+ if 0 <= dr < map_rows and 0 <= dc < map_cols:
1220
+ hl_cap_cells.add((dr, dc))
1221
+
1222
+ eq_row = _lat_to_crow(0.0)
1223
+ pm_col = _lon_to_ccol(0.0)
1224
+
1225
+ LAND_FG = "\033[38;2;80;160;80m"
1226
+ HL_LAND = "\033[38;2;160;255;160m"
1227
+ RESET = "\033[0m"
1228
+ DOT_FG = "\033[38;2;200;190;80m" # same-offset capital: bright yellow
1229
+ DOT_CUR_FG = "\033[1;97m" # selected city: bright white bold
1230
+ DIM_FG = "\033[38;2;45;75;45m"
1231
+
1232
+ lines = []
1233
+ for char_row in range(map_rows):
1234
+ line = ""
1235
+ base_py = char_row * 4
1236
+ for char_col in range(map_cols):
1237
+ hl = _is_hl(char_col, char_row)
1238
+ cell = (char_row, char_col)
1239
+ is_eq = (char_row == eq_row)
1240
+ is_pm = (char_col == pm_col)
1241
+
1242
+ if cell == cur_tz_cell:
1243
+ line += DOT_CUR_FG + "◉" + RESET
1244
+ continue
1245
+ if cell in hl_cap_cells:
1246
+ line += DOT_FG + "•" + RESET
1247
+ continue
1248
+
1249
+ # Sample the 8 braille sub-pixels (2 cols × 4 rows)
1250
+ base_px = char_col * 2
1251
+ bits = 0
1252
+ any_land = False
1253
+ for dc in range(2):
1254
+ for dr in range(4):
1255
+ if _sample_px(base_px + dc, base_py + dr):
1256
+ bits |= (1 << _BRAILLE_BIT[dc][dr])
1257
+ any_land = True
1258
+
1259
+ if any_land:
1260
+ ch = chr(0x2800 + bits)
1261
+ line += (HL_LAND if hl else LAND_FG) + ch + RESET
1262
+ elif is_eq or is_pm:
1263
+ marker = "┼" if (is_eq and is_pm) else ("─" if is_eq else "│")
1264
+ line += DIM_FG + marker + RESET
1265
+ else:
1266
+ line += " "
1267
+
1268
+ lines.append(line)
1269
+
1270
+ return lines
1271
+
1272
+
1273
+ def timezone_select(initial_offset: str = "") -> str | None:
1274
+ """
1275
+ Full-screen interactive timezone picker.
1276
+
1277
+ Navigation:
1278
+ ←/→: cycle UTC offsets
1279
+ ↑/↓: cycle timezones within current offset
1280
+ Type: search filter
1281
+ ESC (search empty): cancel, return None
1282
+ ESC (search non-empty): clear search
1283
+ BACKSPACE (search non-empty): clear search
1284
+ ENTER: confirm, return offset string
1285
+ printable keys: typed into the search box (so 'q' searches, it does not quit)
1286
+
1287
+ Returns:
1288
+ "Z" for UTC+0, "+05:30" for UTC+5:30, "-08:00" for UTC-8, or None on cancel.
1289
+ """
1290
+ def _parse_initial(s: str) -> tuple[int, int]:
1291
+ """Parse an offset string like "+05:30" or "Z" into (hour, minute); default (0, 0)."""
1292
+ if not s or s == "Z":
1293
+ return (0, 0)
1294
+ m = re.match(r'^([+-])(\d{1,2}):(\d{2})$', s)
1295
+ if m:
1296
+ sign = 1 if m.group(1) == '+' else -1
1297
+ return (sign * int(m.group(2)), int(m.group(3)))
1298
+ return (0, 0)
1299
+
1300
+ init_h, init_m = _parse_initial(initial_offset)
1301
+
1302
+ unique_offsets = sorted(set((tz[0], tz[1]) for tz in _TIMEZONES))
1303
+
1304
+ try:
1305
+ off_idx = unique_offsets.index((init_h, init_m))
1306
+ except ValueError:
1307
+ off_idx = unique_offsets.index((0, 0)) if (0, 0) in unique_offsets else 0
1308
+
1309
+ cur_offset = unique_offsets[off_idx]
1310
+
1311
+ def _tzs_for_offset(oh: int, om: int) -> list[int]:
1312
+ """Indices into _TIMEZONES sharing this UTC offset."""
1313
+ return [i for i, tz in enumerate(_TIMEZONES) if tz[0] == oh and tz[1] == om]
1314
+
1315
+ tz_idx_in_offset = 0
1316
+ zone_viewport = 0 # top visible zone index in the list
1317
+ search_str = ""
1318
+
1319
+ MAX_ZONE_ROWS = 4 # max zone list rows shown at once
1320
+
1321
+ def _offset_str(oh: int, om: int) -> str:
1322
+ """Format (hour, minute) as the widget's return value: "Z" or "±HH:MM"."""
1323
+ if oh == 0 and om == 0:
1324
+ return "Z"
1325
+ sign = "+" if oh >= 0 else "-"
1326
+ return f"{sign}{abs(oh):02d}:{om:02d}"
1327
+
1328
+ def _offset_display(oh: int, om: int) -> str:
1329
+ """Format (hour, minute) as a human-readable "UTC±HH:MM" label."""
1330
+ if oh == 0 and om == 0:
1331
+ return "UTC+00:00"
1332
+ sign = "+" if oh >= 0 else "-"
1333
+ return f"UTC{sign}{abs(oh):02d}:{om:02d}"
1334
+
1335
+ def _tz_desc(idx: int) -> str:
1336
+ """Display label for a timezone entry: "City (ABBR)"."""
1337
+ tz = _TIMEZONES[idx]
1338
+ return f"{tz[6]} ({tz[5]})"
1339
+
1340
+ fd = sys.stdin.fileno()
1341
+ old = _get_term_attrs(fd)
1342
+ w = _Widget(fd)
1343
+
1344
+ def _render():
1345
+ nonlocal zone_viewport
1346
+ cols = _cols()
1347
+ rows = _visible_rows()
1348
+ lines = []
1349
+
1350
+ oh, om = cur_offset
1351
+ tzs = _tzs_for_offset(oh, om)
1352
+ cur_tz_idx = tzs[tz_idx_in_offset] if tzs else -1
1353
+ n_zones = len(tzs)
1354
+
1355
+ # Keep viewport tracking the selection
1356
+ vis = min(MAX_ZONE_ROWS, n_zones)
1357
+ if tz_idx_in_offset < zone_viewport:
1358
+ zone_viewport = tz_idx_in_offset
1359
+ elif tz_idx_in_offset >= zone_viewport + vis:
1360
+ zone_viewport = tz_idx_in_offset - vis + 1
1361
+
1362
+ # ── Offset navigator strip ──────────────────────────────────────────
1363
+ # Show up to 2 neighbours each side: ‹ UTC-5 · UTC-4:30 · [UTC-4] · UTC-3:30 · UTC-3 ›
1364
+ NEIGHBORS = 2
1365
+ strip_parts = []
1366
+ lo = max(0, off_idx - NEIGHBORS)
1367
+ hi = min(len(unique_offsets) - 1, off_idx + NEIGHBORS)
1368
+ if lo > 0:
1369
+ strip_parts.append(f"{C.DIM}‹{C.RESET}")
1370
+ for i in range(lo, hi + 1):
1371
+ label = _offset_display(*unique_offsets[i])
1372
+ if i == off_idx:
1373
+ strip_parts.append(f"{C.BOLD}{C.PRIMARY}{label}{C.RESET}")
1374
+ else:
1375
+ strip_parts.append(f"{C.DIM}{label}{C.RESET}")
1376
+ if hi < len(unique_offsets) - 1:
1377
+ strip_parts.append(f"{C.DIM}›{C.RESET}")
1378
+ strip = f" {(' · ').join(strip_parts)}"
1379
+
1380
+ lines.append(strip)
1381
+
1382
+ if search_str:
1383
+ lines.append(f" {C.DIM}search:{C.RESET} {search_str}{C.DIM}█{C.RESET}")
1384
+
1385
+ # ── Zone list ───────────────────────────────────────────────────────
1386
+ zone_rows_emitted = 0
1387
+ if n_zones == 0:
1388
+ lines.append(f" {C.DIM}(no zones for this offset){C.RESET}")
1389
+ lines.append("")
1390
+ zone_rows_emitted = 2
1391
+ else:
1392
+ for rank in range(zone_viewport, min(zone_viewport + vis, n_zones)):
1393
+ tidx = tzs[rank]
1394
+ selected = (rank == tz_idx_in_offset)
1395
+ pointer = f"{C.ACCENT}›{C.RESET}" if selected else " "
1396
+ name = _tz_desc(tidx)
1397
+ if selected:
1398
+ name_s = f"{C.BOLD}{name}{C.RESET}"
1399
+ else:
1400
+ name_s = f"{C.DIM}{name}{C.RESET}"
1401
+ count_s = ""
1402
+ if selected and n_zones > 1:
1403
+ count_s = f" {C.DIM}{tz_idx_in_offset + 1}/{n_zones}{C.RESET}"
1404
+ lines.append(f" {pointer} {name_s}{count_s}")
1405
+ zone_rows_emitted += 1
1406
+ # Pad to MAX_ZONE_ROWS so map never shifts
1407
+ while zone_rows_emitted < MAX_ZONE_ROWS:
1408
+ lines.append("")
1409
+ zone_rows_emitted += 1
1410
+
1411
+ # Hint bar, via the shared chrome, so it carries the transport keys
1412
+ # while background audio is playing and its keys are clickable.
1413
+ L = keys.label
1414
+ _tz_pairs = [(L("timezone.earlier", "timezone.later"), "offset"), (L("timezone.up", "timezone.down"), "zone"),
1415
+ (L("timezone.choose"), "confirm"), (L("timezone.back"), "cancel/clear")]
1416
+ hint_line_count = len(_prompt.chrome_hint_lines(_tz_pairs))
1417
+
1418
+ # Map fills remaining rows; search line is always 1 slot (blank when empty)
1419
+ fixed_rows = 1 + 1 + MAX_ZONE_ROWS + hint_line_count # strip + search + zones + hints
1420
+ if not search_str:
1421
+ lines.insert(1, "") # blank placeholder keeps map stable
1422
+ map_rows = max(4, rows - fixed_rows)
1423
+ map_cols = cols
1424
+
1425
+ map_lines = _render_world_map(oh, om, tzs, map_cols, map_rows, cur_tz_idx)
1426
+ lines.extend(map_lines)
1427
+
1428
+ _prompt.append_chrome(lines, _tz_pairs, _hint_cells)
1429
+ w.render(lines)
1430
+
1431
+ _hint_cells: dict = {} # clickable hint keys, filled by append_chrome
1432
+ result = None
1433
+ try:
1434
+ _set_raw(fd)
1435
+ _prompt.enable_mouse()
1436
+ ui.clear_screen() # through ui, so the painter forgets the old rows
1437
+ _render()
1438
+
1439
+ while True:
1440
+ if ui.consume_resize():
1441
+ sys.stdout.write("\033[H\033[3J\033[J")
1442
+ sys.stdout.flush()
1443
+ w.anchor_reset()
1444
+ _render()
1445
+ continue
1446
+
1447
+ if not _wait_for_keypress(0.05):
1448
+ continue
1449
+
1450
+ key = _read_key(fd)
1451
+
1452
+ _ch = _prompt.consume_chrome(key, _hint_cells)
1453
+ if _ch is _prompt.CHROME_HANDLED:
1454
+ continue
1455
+ if _ch is _prompt.CHROME_REDRAW:
1456
+ w.anchor_reset(); _render(); continue
1457
+ if _ch is not None:
1458
+ key = _ch
1459
+
1460
+ act = keys.action(key, "timezone")
1461
+ if key == 'CTRL_C':
1462
+ break
1463
+
1464
+ if act == 'timezone.back':
1465
+ if search_str:
1466
+ search_str = ""
1467
+ _render()
1468
+ else:
1469
+ break
1470
+
1471
+ elif key == 'BACKSPACE':
1472
+ if search_str:
1473
+ search_str = search_str[:-1]
1474
+ _render()
1475
+
1476
+ elif act == 'timezone.choose':
1477
+ oh, om = cur_offset
1478
+ result = _offset_str(oh, om)
1479
+ break
1480
+
1481
+ elif act == 'timezone.later':
1482
+ off_idx = (off_idx + 1) % len(unique_offsets)
1483
+ cur_offset = unique_offsets[off_idx]
1484
+ tz_idx_in_offset = 0
1485
+ zone_viewport = 0
1486
+ search_str = ""
1487
+ _render()
1488
+
1489
+ elif act == 'timezone.earlier':
1490
+ off_idx = (off_idx - 1) % len(unique_offsets)
1491
+ cur_offset = unique_offsets[off_idx]
1492
+ tz_idx_in_offset = 0
1493
+ zone_viewport = 0
1494
+ search_str = ""
1495
+ _render()
1496
+
1497
+ elif act == 'timezone.down':
1498
+ tzs = _tzs_for_offset(*cur_offset)
1499
+ if tzs:
1500
+ tz_idx_in_offset = (tz_idx_in_offset + 1) % len(tzs)
1501
+ _render()
1502
+
1503
+ elif act == 'timezone.up':
1504
+ tzs = _tzs_for_offset(*cur_offset)
1505
+ if tzs:
1506
+ tz_idx_in_offset = (tz_idx_in_offset - 1) % len(tzs)
1507
+ _render()
1508
+
1509
+ elif key == 'SPACE' or (len(key) == 1 and (key.isalpha() or key.isdigit() or key in '+-_/')):
1510
+ search_str += ' ' if key == 'SPACE' else key
1511
+ q = search_str.lower()
1512
+ for i, tz in enumerate(_TIMEZONES):
1513
+ if (q in tz[4].lower() or q in tz[5].lower() or
1514
+ q in tz[6].lower()):
1515
+ oh2, om2 = tz[0], tz[1]
1516
+ if (oh2, om2) in unique_offsets:
1517
+ idx2 = unique_offsets.index((oh2, om2))
1518
+ off_idx = idx2
1519
+ cur_offset = unique_offsets[off_idx]
1520
+ tzs2 = _tzs_for_offset(oh2, om2)
1521
+ tz_idx_in_offset = tzs2.index(i) if i in tzs2 else 0
1522
+ zone_viewport = 0
1523
+ break
1524
+ _render()
1525
+
1526
+ finally:
1527
+ _prompt.disable_mouse()
1528
+ _restore_term_attrs(fd, old)
1529
+ w.clear()
1530
+
1531
+ return result
1532
+
1533
+
1534
+ if __name__ == '__main__':
1535
+ # Standalone demo: `python3 -m backbone.prompt.timezone [+05:30]`
1536
+ _initial = sys.argv[1] if len(sys.argv) > 1 else ""
1537
+ try:
1538
+ _picked = timezone_select(_initial)
1539
+ except QuitToTerminal:
1540
+ _picked = None
1541
+ print(f"Selected offset: {_picked}" if _picked is not None else "Cancelled.")
1542
+
1543
+