├── README.md
├── main.go
└── src
└── bot
├── client
└── cookies.go
├── log
├── color.go
└── log.go
├── stores
└── ambush
│ ├── ambush.go
│ ├── start.go
│ ├── task.go
│ └── webhooks.go
├── tasks
├── config.go
├── csv.go
├── proxies.go
└── sizes.go
├── utils
├── cookies.go
├── countries.go
├── form.go
├── profiles.go
├── states.go
└── utils.go
└── webhooks
└── webhooks.go
/README.md:
--------------------------------------------------------------------------------
1 | # AmbushOpenSource
2 |
3 | https://pastebin.com/Jb0YC3n4
4 |
5 | go get github.com/fatih/color
6 | go get github.com/jszwec/csvutil
7 | go get github.com/mcnijman/go-emailaddress
8 | go get github.com/Pallinder/go-randomdata
9 |
--------------------------------------------------------------------------------
/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bot/log"
5 | "bot/stores/ambush"
6 | "bot/tasks"
7 | "fmt"
8 | "os"
9 | "sync"
10 | )
11 |
12 | var (
13 | format = fmt.Sprintf
14 | )
15 |
16 | func main() {
17 |
18 | log.Infoln(format("TraianBOT"), "-")
19 | log.Infoln(format("Welcome user.."), "-")
20 |
21 | config, err := tasks.ReadConfig()
22 |
23 | if err != nil {
24 | log.Error("Error reading config file", "-")
25 | os.Exit(0)
26 | }
27 |
28 | proxies, err := tasks.ReadProxies()
29 |
30 | if err != nil {
31 | log.Error("Error reading proxies file", "-")
32 | os.Exit(0)
33 | }
34 |
35 | rows, err := tasks.ReadFile("tasks.csv")
36 |
37 | if err != nil {
38 | fmt.Println(err)
39 | log.Error("Error reading tasks file", "-")
40 | os.Exit(0)
41 | }
42 |
43 | if len(rows) > 500 {
44 | log.Error("Max 500 tasks", "-")
45 | os.Exit(0)
46 | }
47 |
48 | wg := sync.WaitGroup{}
49 |
50 | for id, row := range rows {
51 | wg.Add(1)
52 | go ambush.Start(row, config, proxies, id, &wg)
53 | }
54 |
55 | wg.Wait()
56 |
57 | }
58 |
--------------------------------------------------------------------------------
/src/bot/client/cookies.go:
--------------------------------------------------------------------------------
1 | package client
2 |
3 | import (
4 | "net/http"
5 | "net/http/cookiejar"
6 | "net/url"
7 | "sync"
8 | )
9 |
10 | type ExportableCookieJar struct {
11 | jar *cookiejar.Jar
12 | allCookies map[url.URL][]*http.Cookie
13 | sync.RWMutex
14 | }
15 |
16 | func NewExportableCookieJar() *ExportableCookieJar {
17 | realJar, _ := cookiejar.New(nil)
18 |
19 | e := &ExportableCookieJar{
20 | jar: realJar,
21 | allCookies: make(map[url.URL][]*http.Cookie),
22 | }
23 |
24 | return e
25 | }
26 |
27 | func (jar *ExportableCookieJar) SetCookies(u *url.URL, cookies []*http.Cookie) {
28 | jar.Lock()
29 | defer jar.Unlock()
30 | jar.allCookies[*u] = cookies
31 | jar.jar.SetCookies(u, cookies)
32 | }
33 |
34 | func (jar *ExportableCookieJar) Cookies(u *url.URL) []*http.Cookie {
35 | return jar.jar.Cookies(u)
36 | }
37 |
38 | func (jar *ExportableCookieJar) ExportAllCookies() map[url.URL][]*http.Cookie {
39 | jar.RLock()
40 | defer jar.RUnlock()
41 |
42 | copied := make(map[url.URL][]*http.Cookie)
43 |
44 | for u, c := range jar.allCookies {
45 | copied[u] = c
46 | }
47 |
48 | return copied
49 | }
50 |
--------------------------------------------------------------------------------
/src/bot/log/color.go:
--------------------------------------------------------------------------------
1 | package log
2 |
3 | import (
4 | "github.com/fatih/color"
5 | )
6 |
7 | var (
8 | whiteColor = color.WhiteString
9 |
10 | DebugColor = color.CyanString
11 | InfoColor = color.GreenString
12 | WarningColor = color.YellowString
13 | ErrorColor = color.RedString
14 | )
15 |
--------------------------------------------------------------------------------
/src/bot/log/log.go:
--------------------------------------------------------------------------------
1 | package log
2 |
3 | import (
4 | "fmt"
5 | "github.com/fatih/color"
6 | "sync"
7 | "time"
8 | )
9 |
10 | var (
11 | lock = sync.Mutex{}
12 | )
13 |
14 | func Print(s string) {
15 | lock.Lock()
16 | defer lock.Unlock()
17 |
18 | fmt.Fprint(color.Output, s)
19 | }
20 |
21 | func format(s, l, t string, c func(string, ...interface{}) string) string {
22 | f := c("[%v] [%v] %v", l, t, s)
23 | return fmt.Sprintf("[%v] %v", whiteColor(time.Now().Format("15:04:05.000")), f)
24 | }
25 |
26 | func formatln(s, l, t string, c func(string, ...interface{}) string) string {
27 | f := c("[%v] [%v] %v\n", l, t, s)
28 | return fmt.Sprintf("[%v] %v", whiteColor(time.Now().Format("15:04:05.000")), f)
29 | }
30 |
31 | func Debug(s, t string) {
32 | s = format(s, "DBG", t, DebugColor)
33 | Print(s)
34 | }
35 |
36 | func Info(s, t string) {
37 | s = format(s, "INF", t, InfoColor)
38 | Print(s)
39 | }
40 |
41 | func Warning(s, t string) {
42 | s = format(s, "WRN", t, WarningColor)
43 | Print(s)
44 | }
45 |
46 | func Warn(s, t string) {
47 | s = format(s, "WRN", t, WarningColor)
48 | Print(s)
49 | }
50 |
51 | func Error(s, t string) {
52 | s = format(s, "ERR", t, ErrorColor)
53 | Print(s)
54 | }
55 |
56 | func Debugln(s, t string) {
57 | s = formatln(s, "DBG", t, DebugColor)
58 | Print(s)
59 | }
60 |
61 | func Infoln(s, t string) {
62 | s = formatln(s, "INF", t, InfoColor)
63 | Print(s)
64 | }
65 |
66 | func Warningln(s, t string) {
67 | s = formatln(s, "WRN", t, WarningColor)
68 | Print(s)
69 | }
70 |
71 | func Warnln(s, t string) {
72 | s = formatln(s, "WRN", t, WarningColor)
73 | Print(s)
74 | }
75 |
76 | func Errorln(s, t string) {
77 | s = formatln(s, "ERR", t, ErrorColor)
78 | Print(s)
79 | }
80 |
--------------------------------------------------------------------------------
/src/bot/stores/ambush/ambush.go:
--------------------------------------------------------------------------------
1 | package ambush
2 |
3 | import (
4 | "bytes"
5 | "encoding/json"
6 | "fmt"
7 | "io/ioutil"
8 | "math/rand"
9 | "net/http"
10 | "strconv"
11 | "strings"
12 |
13 | "bot/utils"
14 | )
15 |
16 | type apiUsersMeResponse struct {
17 | BagID string `json:"bagId"`
18 | }
19 |
20 | type apiCommerceV1Products struct {
21 | BreadCrumbs []struct {
22 | Text string `json:"text"`
23 | Link string `json:"link"`
24 | } `json:"breadCrumbs"`
25 | ImageGroups []struct {
26 | Images []struct {
27 | URL string `json:"url"`
28 | } `json:"images"`
29 | } `json:"imageGroups"`
30 | Sizes []struct {
31 | SizeID string `json:"sizeId"`
32 | SizeDescription string `json:"sizeDescription"`
33 | Scale string `json:"scale"`
34 | Variants []struct {
35 | MerchantID int `json:"merchantId"`
36 | FormattedPrice string `json:"formattedPrice"`
37 | } `json:"variants"`
38 | } `json:"sizes"`
39 | }
40 |
41 | type apiCommerceV1BagsPayload struct {
42 | MerchantID int `json:"merchantId"`
43 | ProductID string `json:"productId"`
44 | Quantity int `json:"quantity"`
45 | Scale string `json:"scale"`
46 | Size string `json:"size"`
47 | CustomAttributes string `json:"customAttributes"`
48 | }
49 |
50 | type apiCommerceV1BagsResponse struct {
51 | BagSummary struct {
52 | GrandTotal float64 `json:"grandTotal"`
53 | } `json:"BagSummary"`
54 | }
55 |
56 | type apiCheckoutV1OrdersPayload struct {
57 | BagID string `json:"bagId"`
58 | GuestUserEmail string `json:"guestUserEmail"`
59 | UsePaymentIntent bool `json:"usePaymentIntent"`
60 | }
61 |
62 | type apiCheckoutV1OrdersResponse struct {
63 | ID int `json:"id"`
64 | }
65 |
66 | type apiCheckoutV1OrdersResponse2 struct {
67 | CheckoutOrder struct {
68 | GrandTotal float64 `json:"grandTotal"`
69 | PaymentIntentID string `json:"paymentIntentId"`
70 | }
71 | ShippingOptions []struct {
72 | Price float64 `json:"price"`
73 | FormattedPrice string `json:"formattedPrice"`
74 | ShippingCostType int `json:"shippingCostType"`
75 | ShippingService struct {
76 | Description string `json:"description"`
77 | ID int `json:"id"`
78 | Name string `json:"name"`
79 | Type string `json:"type"`
80 | MinEstimatedDeliveryHour float64 `json:"minEstimatedDeliveryHour"`
81 | MaxEstimatedDeliveryHour float64 `json:"maxEstimatedDeliveryHour"`
82 | } `json:"shippingService"`
83 | } `json:"shippingOptions"`
84 | }
85 |
86 | type apiCheckoutV1OrderChargesResponse struct {
87 | RedirectURL string `json:"redirectUrl"`
88 | }
89 |
90 | func (t *Task) Start() {
91 | var err error
92 |
93 | if err = utils.CheckProfile(t.Email, t.FirstName, t.LastName, t.PhoneNumber, t.Address1, t.City, t.Postcode, t.Country); err != nil {
94 | t.HandleError(err)
95 | return
96 | }
97 |
98 | t.Email, t.FirstName, t.LastName, t.PhoneNumber, t.Address1 = utils.WrapProfile(t.Email, t.FirstName, t.LastName, t.PhoneNumber, t.Address1)
99 |
100 | t.Client, err = t.NewClient()
101 |
102 | if t.HandleError(err) {
103 | return
104 | }
105 |
106 | t.SetupClient()
107 |
108 | t.CreateSession()
109 | }
110 |
111 | func (t *Task) CreateSession() {
112 |
113 | t.Warn("Creating session")
114 |
115 | for {
116 |
117 | u := "https://www.ambushdesign.com/en-it/api/users/me"
118 |
119 | req, err := http.NewRequest("GET", u, nil)
120 |
121 | if err != nil {
122 | t.Error("Error creating session - 0 - %v", err.Error())
123 | continue
124 | }
125 |
126 | req.Header.Set("Cache-Control", "max-age=0")
127 | req.Header.Set("Upgrade-Insecure-Requests", "1")
128 | req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36")
129 | req.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9")
130 | req.Header.Set("Sec-Fetch-Site", "none")
131 | req.Header.Set("Sec-Fetch-Mode", "navigate")
132 | req.Header.Set("Sec-Fetch-User", "?1")
133 | req.Header.Set("Sec-Fetch-Dest", "document")
134 | req.Header.Set("Accept-Language", "en-US,en-GB;q=0.9,en;q=0.8,it;q=0.7")
135 |
136 | resp, err := t.Client.Do(req)
137 |
138 | if err != nil {
139 | t.Error("Error creating session - 1 - %v", err.Error())
140 | t.Rotate()
141 | continue
142 | }
143 |
144 | b, err := ioutil.ReadAll(resp.Body)
145 | resp.Body.Close()
146 |
147 | if err != nil {
148 | t.Error("Error creating session - 2 - %v", err.Error())
149 | t.Sleep()
150 | continue
151 | }
152 |
153 | switch resp.StatusCode {
154 | case 200:
155 | body := new(apiUsersMeResponse)
156 |
157 | if err := json.Unmarshal(b, &body); err != nil {
158 | t.Error("Error creating session - 3 - %v", err.Error())
159 | t.SleepAndRotate()
160 | continue
161 | }
162 |
163 | t.BagID = body.BagID
164 |
165 | t.CheckStock()
166 | return
167 |
168 | case 400:
169 | t.Error("Error creating session - Site error [%v]", resp.StatusCode)
170 | t.Sleep()
171 | continue
172 | case 403:
173 | t.Error("Error creating session - Access Denied [%v]", resp.StatusCode)
174 | t.SleepAndRotate()
175 | continue
176 | case 429:
177 | t.Error("Error creating session - Rate limited [%v]", resp.StatusCode)
178 | t.SleepAndRotate()
179 | continue
180 | case 500, 501, 502, 503:
181 | t.Error("Error creating session - Site error [%v]", resp.StatusCode)
182 | t.Sleep()
183 | continue
184 | default:
185 | t.Error("Error creating session - Unhandled error [%v]", resp.StatusCode)
186 | t.SleepAndRotate()
187 | continue
188 | }
189 | }
190 | }
191 |
192 | func (t *Task) CheckStock() {
193 |
194 | t.Warn("Checking stock")
195 |
196 | for {
197 |
198 | u := fmt.Sprintf("https://www.ambushdesign.com/api/commerce/v1/products/%v", t.SKU)
199 |
200 | req, err := http.NewRequest("GET", u, nil)
201 |
202 | if err != nil {
203 | t.Error("Error checking stock - 0 - %v", err.Error())
204 | continue
205 | }
206 |
207 | req.Header.Set("Accept", "application/json, text/plain, */*")
208 | req.Header.Set("Accept-Encoding", "deflate, br")
209 | req.Header.Set("Accept-Language", "en-US")
210 | req.Header.Set("Cache-Control", "no-cache")
211 | req.Header.Set("FF-Country", t.Country)
212 | req.Header.Set("FF-Currency", t.Currency)
213 | req.Header.Set("Pragma", "no-cache")
214 | req.Header.Set("Referer", "https://www.ambushdesign.com/")
215 | req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36")
216 | req.Header.Set("X-Newrelic-ID", "VQUCV1ZUGwIFVlBRDgcA")
217 |
218 | resp, err := t.Client.Do(req)
219 |
220 | if err != nil {
221 | t.Error("Error checking stock - 1 - %v", err.Error())
222 | t.Rotate()
223 | continue
224 | }
225 |
226 | b, err := ioutil.ReadAll(resp.Body)
227 | resp.Body.Close()
228 |
229 | if err != nil {
230 | t.Error("Error checking stock - 2 - %v", err.Error())
231 | t.Sleep()
232 | continue
233 | }
234 |
235 | switch resp.StatusCode {
236 | case 200:
237 | body := new(apiCommerceV1Products)
238 |
239 | if err := json.Unmarshal(b, &body); err != nil {
240 | t.Error("Error checking stock - 3 - %v", err.Error())
241 | t.SleepAndRotate()
242 | continue
243 | }
244 |
245 | for _, product := range body.BreadCrumbs {
246 | if product.Link == "" {
247 | t.ProductName = product.Text
248 | break
249 | }
250 | }
251 |
252 | if len(body.ImageGroups) > 0 {
253 | if len(body.ImageGroups[0].Images) > 0 {
254 | t.ProductImage = body.ImageGroups[0].Images[0].URL
255 | }
256 | }
257 |
258 | sizes := make([]map[string]string, 0)
259 |
260 | for _, size := range body.Sizes {
261 | if len(size.Variants) > 0 {
262 | t.ProductPrice = size.Variants[0].FormattedPrice
263 | t.MerchantID = size.Variants[0].MerchantID
264 | }
265 |
266 | sizes = append(sizes, map[string]string{
267 | "size": size.SizeDescription,
268 | "sizeId": size.SizeID,
269 | "scale": size.Scale,
270 | })
271 | }
272 |
273 | if len(sizes) == 0 {
274 | t.Warn("Waiting for restock")
275 | t.Sleep()
276 | continue
277 | }
278 |
279 | size := sizes[rand.Intn(len(sizes))]
280 |
281 | t.ProductSize = size["size"]
282 | t.ProductVariant = size["sizeId"]
283 |
284 | t.Scale = size["scale"]
285 |
286 | t.Info("Stock found - %v - %v - %v", t.ProductName, t.ProductPrice, t.ProductSize)
287 |
288 | t.AddToCart()
289 | return
290 |
291 | case 400:
292 | t.Error("Error checking stock - Site error [%v]", resp.StatusCode)
293 | t.Sleep()
294 | continue
295 | case 403:
296 | t.Error("Error checking stock - Access Denied [%v]", resp.StatusCode)
297 | t.SleepAndRotate()
298 | continue
299 | case 429:
300 | t.Error("Error checking stock - Rate limited [%v]", resp.StatusCode)
301 | t.SleepAndRotate()
302 | continue
303 | case 500, 501, 502, 503:
304 | t.Error("Error checking stock - Site error [%v]", resp.StatusCode)
305 | t.Sleep()
306 | continue
307 | default:
308 | t.Error("Error checking stock - Unhandled error [%v]", resp.StatusCode)
309 | t.SleepAndRotate()
310 | continue
311 | }
312 | }
313 | }
314 |
315 | func (t *Task) AddToCart() {
316 |
317 | t.Warn("Carting %v", t.ProductName)
318 |
319 | for {
320 |
321 | u := fmt.Sprintf("https://www.ambushdesign.com/api/commerce/v1/bags/%v/items", t.BagID)
322 |
323 | p := apiCommerceV1BagsPayload{
324 | MerchantID: t.MerchantID,
325 | ProductID: t.SKU,
326 | Quantity: 1,
327 | Scale: t.Scale,
328 | Size: t.ProductVariant,
329 | }
330 |
331 | payload, err := json.Marshal(&p)
332 |
333 | if err != nil {
334 | t.Error("Error adding to cart - 0 - %v", err.Error())
335 | t.Sleep()
336 | continue
337 | }
338 |
339 | req, err := http.NewRequest("POST", u, bytes.NewReader(payload))
340 |
341 | if err != nil {
342 | t.Error("Error adding to cart - 1 - %v", err.Error())
343 | continue
344 | }
345 |
346 | req.Header.Set("Accept", "application/json, text/plain, */*")
347 | req.Header.Set("FF-Country", t.Country)
348 | req.Header.Set("FF-Currency", t.Currency)
349 | req.Header.Set("Accept-Language", "en-US")
350 | req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36")
351 | req.Header.Set("Content-Type", "application/json")
352 | req.Header.Set("Origin", "https://www.ambushdesign.com")
353 | req.Header.Set("Sec-Fetch-Site", "same-origin")
354 | req.Header.Set("Sec-Fetch-Mode", "cors")
355 | req.Header.Set("Sec-Fetch-Dest", "empty")
356 | req.Header.Set("Referer", "https://www.ambushdesign.com/")
357 |
358 | resp, err := t.Client.Do(req)
359 |
360 | if err != nil {
361 | t.Error("Error adding to cart - 2 - %v", err.Error())
362 | t.Rotate()
363 | continue
364 | }
365 |
366 | b, err := ioutil.ReadAll(resp.Body)
367 | resp.Body.Close()
368 |
369 | if err != nil {
370 | t.Error("Error adding to cart - 3 - %v", err.Error())
371 | t.Sleep()
372 | continue
373 | }
374 |
375 | switch resp.StatusCode {
376 | case 200:
377 | body := new(apiCommerceV1BagsResponse)
378 |
379 | if err := json.Unmarshal(b, &body); err != nil {
380 | t.Error("Error adding to cart - 4 - %v", err.Error())
381 | t.SleepAndRotate()
382 | continue
383 | }
384 |
385 | if body.BagSummary.GrandTotal > 0 {
386 | t.Info("%v added to cart", t.ProductName)
387 | t.SubmitGuest()
388 | return
389 | } else {
390 | t.Error("Product OOS")
391 | t.CheckStock()
392 | return
393 | }
394 |
395 | case 400:
396 | t.Error("Error adding to cart - Product OOS [%v]", resp.StatusCode)
397 | t.Sleep()
398 | continue
399 | case 403:
400 | t.Error("Error adding to cart - Access Denied [%v]", resp.StatusCode)
401 | t.SleepAndRotate()
402 | continue
403 | case 429:
404 | t.Error("Error adding to cart - Rate limited [%v]", resp.StatusCode)
405 | t.SleepAndRotate()
406 | continue
407 | case 500, 501, 502, 503:
408 | t.Error("Error adding to cart - Site error [%v]", resp.StatusCode)
409 | t.Sleep()
410 | continue
411 | default:
412 | t.Error("Error adding to cart - Unhandled error [%v]", resp.StatusCode)
413 | t.SleepAndRotate()
414 | continue
415 | }
416 | }
417 | }
418 |
419 | func (t *Task) SubmitGuest() {
420 |
421 | t.Warn("Submitting guest")
422 |
423 | for {
424 |
425 | u := "https://www.ambushdesign.com/api/checkout/v1/orders"
426 |
427 | p := apiCheckoutV1OrdersPayload{
428 | BagID: t.BagID,
429 | GuestUserEmail: t.Email,
430 | UsePaymentIntent: true,
431 | }
432 |
433 | payload, err := json.Marshal(&p)
434 |
435 | if err != nil {
436 | t.Error("Error submitting guest - 0 - %v", err.Error())
437 | t.Sleep()
438 | continue
439 | }
440 |
441 | req, err := http.NewRequest("POST", u, bytes.NewReader(payload))
442 |
443 | if err != nil {
444 | t.Error("Error submitting guest - 1 - %v", err.Error())
445 | continue
446 | }
447 |
448 | req.Header.Set("Accept", "application/json, text/plain, */*")
449 | req.Header.Set("FF-Country", t.Country)
450 | req.Header.Set("FF-Currency", t.Currency)
451 | req.Header.Set("Accept-Language", "en-US")
452 | req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36")
453 | req.Header.Set("Content-Type", "application/json")
454 | req.Header.Set("Origin", "https://www.ambushdesign.com")
455 | req.Header.Set("Sec-Fetch-Site", "same-origin")
456 | req.Header.Set("Sec-Fetch-Mode", "cors")
457 | req.Header.Set("Sec-Fetch-Dest", "empty")
458 | req.Header.Set("Referer", "https://www.ambushdesign.com/")
459 |
460 | resp, err := t.Client.Do(req)
461 |
462 | if err != nil {
463 | t.Error("Error submitting guest - 2 - %v", err.Error())
464 | t.Rotate()
465 | continue
466 | }
467 |
468 | b, err := ioutil.ReadAll(resp.Body)
469 | resp.Body.Close()
470 |
471 | if err != nil {
472 | t.Error("Error submitting guest - 3 - %v", err.Error())
473 | t.Sleep()
474 | continue
475 | }
476 |
477 | switch resp.StatusCode {
478 | case 201:
479 | body := new(apiCheckoutV1OrdersResponse)
480 |
481 | if err := json.Unmarshal(b, &body); err != nil {
482 | t.Error("Error submitting guest - 4 - %v", err.Error())
483 | t.SleepAndRotate()
484 | continue
485 | }
486 |
487 | t.OrderID = body.ID
488 | t.SubmitShipping()
489 | return
490 |
491 | case 400:
492 | t.Error("Error submitting guest - Site error [%v]", resp.StatusCode)
493 | t.Sleep()
494 | continue
495 | case 403:
496 | t.Error("Error submitting guest - Access Denied [%v]", resp.StatusCode)
497 | t.SleepAndRotate()
498 | continue
499 | case 429:
500 | t.Error("Error submitting guest - Rate limited [%v]", resp.StatusCode)
501 | t.SleepAndRotate()
502 | continue
503 | case 500, 501, 502, 503:
504 | t.Error("Error submitting guest - Site error [%v]", resp.StatusCode)
505 | t.Sleep()
506 | continue
507 | default:
508 | t.Error("Error submitting guest - Unhandled error [%v]", resp.StatusCode)
509 | t.SleepAndRotate()
510 | continue
511 | }
512 | }
513 | }
514 |
515 | func (t *Task) SubmitShipping() {
516 |
517 | t.Warn("Setting shipping")
518 |
519 | for {
520 |
521 | u := fmt.Sprintf("https://www.ambushdesign.com/api/checkout/v1/orders/%v", t.OrderID)
522 |
523 | p := map[string]interface{}{
524 | "shippingAddress": map[string]interface{}{
525 | "firstName": t.FirstName,
526 | "lastName": t.LastName,
527 | "country": map[string]string{
528 | "name": utils.GetFullCountry(t.Country),
529 | "id": t.CountryID,
530 | },
531 | "addressLine1": t.Address1,
532 | "addressLine2": t.Address2,
533 | "addressLine3": "",
534 | "city": map[string]string{
535 | "name": t.City,
536 | },
537 | "state": map[string]string{
538 | "name": t.State,
539 | },
540 | "zipCode": t.Postcode,
541 | "phone": t.PhoneNumber,
542 | "vatNumber": "",
543 | },
544 | "billingAddress": map[string]interface{}{
545 | "firstName": t.FirstName,
546 | "lastName": t.LastName,
547 | "country": map[string]string{
548 | "name": utils.GetFullCountry(t.Country),
549 | "id": t.CountryID,
550 | },
551 | "addressLine1": t.Address1,
552 | "addressLine2": t.Address2,
553 | "addressLine3": "",
554 | "city": map[string]string{
555 | "name": t.City,
556 | },
557 | "state": map[string]string{
558 | "name": t.State,
559 | },
560 | "zipCode": t.Postcode,
561 | "phone": t.PhoneNumber,
562 | "vatNumber": "",
563 | },
564 | }
565 |
566 | payload, err := json.Marshal(&p)
567 |
568 | if err != nil {
569 | t.Error("Error setting shipping - 0 - %v", err.Error())
570 | t.Sleep()
571 | continue
572 | }
573 |
574 | req, err := http.NewRequest("PATCH", u, bytes.NewReader(payload))
575 |
576 | if err != nil {
577 | t.Error("Error setting shipping - 1 - %v", err.Error())
578 | continue
579 | }
580 |
581 | req.Header.Set("Accept", "application/json, text/plain, */*")
582 | req.Header.Set("FF-Country", t.Country)
583 | req.Header.Set("FF-Currency", t.Currency)
584 | req.Header.Set("Accept-Language", "en-US")
585 | req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36")
586 | req.Header.Set("Content-Type", "application/json")
587 | req.Header.Set("Origin", "https://www.ambushdesign.com")
588 | req.Header.Set("Sec-Fetch-Site", "same-origin")
589 | req.Header.Set("Sec-Fetch-Mode", "cors")
590 | req.Header.Set("Sec-Fetch-Dest", "empty")
591 | req.Header.Set("Referer", "https://www.ambushdesign.com/")
592 |
593 | resp, err := t.Client.Do(req)
594 |
595 | if err != nil {
596 | t.Error("Error setting shipping - 2 - %v", err.Error())
597 | t.Rotate()
598 | continue
599 | }
600 |
601 | b, err := ioutil.ReadAll(resp.Body)
602 | resp.Body.Close()
603 |
604 | if err != nil {
605 | t.Error("Error setting shipping - 3 - %v", err.Error())
606 | t.Sleep()
607 | continue
608 | }
609 |
610 | switch resp.StatusCode {
611 | case 200:
612 | body := new(apiCheckoutV1OrdersResponse2)
613 |
614 | if err := json.Unmarshal(b, &body); err != nil {
615 | t.Error("Error setting shipping - 4 - %v", err.Error())
616 | t.SleepAndRotate()
617 | continue
618 | }
619 |
620 | t.ShippingPrice = int(body.ShippingOptions[0].Price)
621 | t.ShippingFormattedPrice = body.ShippingOptions[0].FormattedPrice
622 | t.ShippingCostType = body.ShippingOptions[0].ShippingCostType
623 | t.ShippingDescription = body.ShippingOptions[0].ShippingService.Description
624 | t.ShippingID = body.ShippingOptions[0].ShippingService.ID
625 | t.ShippingName = body.ShippingOptions[0].ShippingService.Name
626 | t.ShippingType = body.ShippingOptions[0].ShippingService.Type
627 | t.MinEstimatedDeliveryHour = int(body.ShippingOptions[0].ShippingService.MinEstimatedDeliveryHour)
628 | t.MaxEstimatedDeliveryHour = int(body.ShippingOptions[0].ShippingService.MaxEstimatedDeliveryHour)
629 | t.GrandTotal = int(body.CheckoutOrder.GrandTotal)
630 | t.PaymentIntentID = body.CheckoutOrder.PaymentIntentID
631 |
632 | t.Info("Shipping set")
633 | t.SubmitDelivery()
634 | return
635 |
636 | case 400:
637 | t.Error("Error setting shipping - Site error [%v]", resp.StatusCode)
638 | t.Sleep()
639 | continue
640 | case 403:
641 | t.Error("Error setting shipping - Access Denied [%v]", resp.StatusCode)
642 | t.SleepAndRotate()
643 | continue
644 | case 429:
645 | t.Error("Error setting shipping - Rate limited [%v]", resp.StatusCode)
646 | t.SleepAndRotate()
647 | continue
648 | case 500, 501, 502, 503:
649 | t.Error("Error setting shipping - Site error [%v]", resp.StatusCode)
650 | t.Sleep()
651 | continue
652 | default:
653 | t.Error("Error setting shipping - Unhandled error [%v]", resp.StatusCode)
654 | t.SleepAndRotate()
655 | continue
656 | }
657 | }
658 | }
659 |
660 | func (t *Task) SubmitDelivery() {
661 |
662 | t.Warn("Setting delivery")
663 |
664 | for {
665 |
666 | u := fmt.Sprintf("https://www.ambushdesign.com/api/checkout/v1/orders/%v", t.OrderID)
667 |
668 | p := map[string]interface{}{
669 | "shippingOption": map[string]interface{}{
670 | "discount": 0,
671 | "merchants": []int{t.MerchantID},
672 | "price": t.ShippingPrice,
673 | "formattedPrice": t.ShippingFormattedPrice,
674 | "shippingCostType": t.ShippingCostType,
675 | "shippingService": map[string]interface{}{
676 | "description": t.ShippingDescription,
677 | "id": t.ShippingID,
678 | "name": t.ShippingName,
679 | "type": t.ShippingType,
680 | "minEstimatedDeliveryHour": t.MinEstimatedDeliveryHour,
681 | "maxEstimatedDeliveryHour": t.MaxEstimatedDeliveryHour,
682 | "trackingCodes": []string{},
683 | },
684 | "shippingWithoutCapped": 0,
685 | "baseFlatRate": 0,
686 | },
687 | }
688 |
689 | payload, err := json.Marshal(&p)
690 |
691 | if err != nil {
692 | t.Error("Error setting delivery - 0 - %v", err.Error())
693 | t.Sleep()
694 | continue
695 | }
696 |
697 | req, err := http.NewRequest("PATCH", u, bytes.NewReader(payload))
698 |
699 | if err != nil {
700 | t.Error("Error setting delivery - 1 - %v", err.Error())
701 | continue
702 | }
703 |
704 | req.Header.Set("Accept", "application/json, text/plain, */*")
705 | req.Header.Set("FF-Country", t.Country)
706 | req.Header.Set("FF-Currency", t.Currency)
707 | req.Header.Set("Accept-Language", "en-US")
708 | req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36")
709 | req.Header.Set("Content-Type", "application/json")
710 | req.Header.Set("Origin", "https://www.ambushdesign.com")
711 | req.Header.Set("Sec-Fetch-Site", "same-origin")
712 | req.Header.Set("Sec-Fetch-Mode", "cors")
713 | req.Header.Set("Sec-Fetch-Dest", "empty")
714 | req.Header.Set("Referer", "https://www.ambushdesign.com/")
715 |
716 | resp, err := t.Client.Do(req)
717 |
718 | if err != nil {
719 | t.Error("Error setting delivery - 2 - %v", err.Error())
720 | t.Rotate()
721 | continue
722 | }
723 |
724 | resp.Body.Close()
725 |
726 | switch resp.StatusCode {
727 | case 200:
728 | t.Info("Delivery set")
729 | t.SubmitPayment()
730 | return
731 | case 400:
732 | t.Error("Error setting delivery - Site error [%v]", resp.StatusCode)
733 | t.Sleep()
734 | continue
735 | case 403:
736 | t.Error("Error setting delivery - Access Denied [%v]", resp.StatusCode)
737 | t.SleepAndRotate()
738 | continue
739 | case 429:
740 | t.Error("Error setting delivery - Rate limited [%v]", resp.StatusCode)
741 | t.SleepAndRotate()
742 | continue
743 | case 500, 501, 502, 503:
744 | t.Error("Error setting delivery - Site error [%v]", resp.StatusCode)
745 | t.Sleep()
746 | continue
747 | default:
748 | t.Error("Error setting delivery - Unhandled error [%v]", resp.StatusCode)
749 | t.SleepAndRotate()
750 | continue
751 | }
752 | }
753 | }
754 |
755 | func (t *Task) SubmitPayment() {
756 |
757 | t.Warn("Setting payment")
758 |
759 | ctx := utils.GetCookie(&t.CookieJar, "ctx")
760 | t.CTX, _ = utils.Extract(ctx, "%3a", "%2c")
761 | i, _ := strconv.Atoi(t.CTX)
762 |
763 | for {
764 |
765 | u := fmt.Sprintf("https://www.ambushdesign.com/api/payment/v1/intents/%v/instruments", t.PaymentIntentID)
766 |
767 | p := map[string]interface{}{
768 | "method": "PayPal",
769 | "option": "PayPalExp",
770 | "createToken": false,
771 | "payer": map[string]interface{}{
772 | "id": i,
773 | "firstName": t.FirstName,
774 | "lastName": t.LastName,
775 | "email": t.Email,
776 | "birthDate": nil,
777 | "address": map[string]interface{}{
778 | "city": map[string]interface{}{
779 | "countryId": t.CountryID,
780 | "id": 0,
781 | "name": t.City,
782 | },
783 | "country": map[string]interface{}{
784 | "alpha2Code": t.Country,
785 | "alpha3Code": t.Country,
786 | "culture": "it-IT",
787 | "id": t.CountryID,
788 | "name": utils.GetFullCountry(t.Country),
789 | "nativeName": utils.GetFullCountry(t.Country),
790 | "region": "Europe",
791 | "regionId": 0,
792 | "continentId": 3,
793 | },
794 | "id": "00000000-0000-0000-0000-000000000000",
795 | "lastName": t.LastName,
796 | "state": map[string]interface{}{
797 | "countryId": 0,
798 | "id": 0,
799 | "code": t.State,
800 | "name": t.State,
801 | },
802 | "userId": 0,
803 | "isDefaultBillingAddress": false,
804 | "isDefaultShippingAddress": false,
805 | "addressLine1": t.Address1,
806 | "addressLine2": t.Address2,
807 | "firstName": t.FirstName,
808 | "phone": t.PhoneNumber,
809 | "vatNumber": "",
810 | "zipCode": t.Postcode,
811 | },
812 | },
813 | "amounts": []map[string]interface{}{{
814 | "value": t.GrandTotal,
815 | }},
816 | "data": map[string]interface{}{},
817 | }
818 |
819 | payload, err := json.Marshal(&p)
820 |
821 | if err != nil {
822 | t.Error("Error setting payment - 0 - %v", err.Error())
823 | t.Sleep()
824 | continue
825 | }
826 |
827 | req, err := http.NewRequest("POST", u, bytes.NewReader(payload))
828 |
829 | if err != nil {
830 | t.Error("Error setting payment - 1 - %v", err.Error())
831 | continue
832 | }
833 |
834 | req.Header.Set("Accept", "application/json, text/plain, */*")
835 | req.Header.Set("FF-Country", t.Country)
836 | req.Header.Set("FF-Currency", t.Currency)
837 | req.Header.Set("Accept-Language", "en-US")
838 | req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36")
839 | req.Header.Set("Content-Type", "application/json")
840 | req.Header.Set("Origin", "https://www.ambushdesign.com")
841 | req.Header.Set("Sec-Fetch-Site", "same-origin")
842 | req.Header.Set("Sec-Fetch-Mode", "cors")
843 | req.Header.Set("Sec-Fetch-Dest", "empty")
844 | req.Header.Set("Referer", "https://www.ambushdesign.com/")
845 |
846 | resp, err := t.Client.Do(req)
847 |
848 | if err != nil {
849 | t.Error("Error setting payment - 2 - %v", err.Error())
850 | t.Rotate()
851 | continue
852 | }
853 |
854 | resp.Body.Close()
855 |
856 | switch resp.StatusCode {
857 | case 201:
858 | t.Info("Payment set")
859 | t.CheckCharge()
860 | return
861 | case 400:
862 | t.Error("Error setting payment - Site error [%v]", resp.StatusCode)
863 | t.Sleep()
864 | continue
865 | case 403:
866 | t.Error("Error setting payment - Access Denied [%v]", resp.StatusCode)
867 | t.SleepAndRotate()
868 | continue
869 | case 429:
870 | t.Error("Error setting payment - Rate limited [%v]", resp.StatusCode)
871 | t.SleepAndRotate()
872 | continue
873 | case 500, 501, 502, 503:
874 | t.Error("Error setting payment - Site error [%v]", resp.StatusCode)
875 | t.Sleep()
876 | continue
877 | default:
878 | t.Error("Error setting payment - Unhandled error [%v]", resp.StatusCode)
879 | t.SleepAndRotate()
880 | continue
881 | }
882 | }
883 | }
884 |
885 | func (t *Task) CheckCharge() {
886 |
887 | t.Warn("Checking order")
888 |
889 | for {
890 |
891 | u := fmt.Sprintf("https://www.ambushdesign.com/api/checkout/v1/orders/%v/charges", t.OrderID)
892 |
893 | p := map[string]string{
894 | "cancelUrl": "https://www.ambushdesign.com/en-it/commerce/checkout",
895 | "returnUrl": fmt.Sprintf("https://www.ambushdesign.com/en-it/checkoutdetails?orderid=%v", t.OrderID),
896 | }
897 |
898 | payload, err := json.Marshal(&p)
899 |
900 | if err != nil {
901 | t.Error("Error checking order - 0 - %v", err.Error())
902 | t.Sleep()
903 | continue
904 | }
905 |
906 | req, err := http.NewRequest("POST", u, bytes.NewReader(payload))
907 |
908 | if err != nil {
909 | t.Error("Error checking order - 1 - %v", err.Error())
910 | continue
911 | }
912 |
913 | req.Header.Set("Accept", "application/json, text/plain, */*")
914 | req.Header.Set("FF-Country", t.Country)
915 | req.Header.Set("FF-Currency", t.Currency)
916 | req.Header.Set("Accept-Language", "en-US")
917 | req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36")
918 | req.Header.Set("Content-Type", "application/json")
919 | req.Header.Set("Origin", "https://www.ambushdesign.com")
920 | req.Header.Set("Sec-Fetch-Site", "same-origin")
921 | req.Header.Set("Sec-Fetch-Mode", "cors")
922 | req.Header.Set("Sec-Fetch-Dest", "empty")
923 | req.Header.Set("Referer", "https://www.ambushdesign.com/")
924 |
925 | resp, err := t.Client.Do(req)
926 |
927 | if err != nil {
928 | t.Error("Error checking order - 2 - %v", err.Error())
929 | t.Rotate()
930 | continue
931 | }
932 |
933 | b, err := ioutil.ReadAll(resp.Body)
934 | resp.Body.Close()
935 |
936 | if err != nil {
937 | t.Error("Error checking order - 3 - %v", err.Error())
938 | t.Sleep()
939 | continue
940 | }
941 |
942 | switch resp.StatusCode {
943 | case 201:
944 |
945 | text := string(b)
946 |
947 | if strings.Contains(text, "Error") {
948 | t.Error("Payment declined")
949 | t.FailedWebhook()
950 | return
951 | } else if strings.Contains(text, "Processing") {
952 | body := new(apiCheckoutV1OrderChargesResponse)
953 |
954 | if err := json.Unmarshal(b, &body); err != nil {
955 | t.Error("Error checking order - 4 - %v", err.Error())
956 | t.Sleep()
957 | continue
958 | }
959 |
960 | t.RedirectURL = body.RedirectURL
961 | t.SubmitPayPal()
962 | return
963 |
964 | } else {
965 | t.Error("Error checking order - 5")
966 | t.SleepAndRotate()
967 | continue
968 | }
969 |
970 | case 400:
971 | t.Error("Error checking order - Site error [%v]", resp.StatusCode)
972 | t.Sleep()
973 | continue
974 | case 403:
975 | t.Error("Error checking order - Access Denied [%v]", resp.StatusCode)
976 | t.SleepAndRotate()
977 | continue
978 | case 429:
979 | t.Error("Error checking order - Rate limited [%v]", resp.StatusCode)
980 | t.SleepAndRotate()
981 | continue
982 | case 500, 501, 502, 503:
983 | t.Error("Error checking order - Site error [%v]", resp.StatusCode)
984 | t.Sleep()
985 | continue
986 | default:
987 | t.Error("Error checking order - Unhandled error [%v]", resp.StatusCode)
988 | t.SleepAndRotate()
989 | continue
990 | }
991 | }
992 | }
993 |
994 | func (t *Task) SubmitPayPal() {
995 |
996 | t.Warn("Submitting PayPal")
997 |
998 | for {
999 |
1000 | req, err := http.NewRequest("GET", t.RedirectURL, nil)
1001 |
1002 | if err != nil {
1003 | t.Error("Error submitting PayPal - 1 - %v", err.Error())
1004 | continue
1005 | }
1006 |
1007 | req.Header.Set("Accept", "application/json, text/plain, */*")
1008 | req.Header.Set("FF-Country", t.Country)
1009 | req.Header.Set("FF-Currency", t.Currency)
1010 | req.Header.Set("Accept-Language", "en-US")
1011 | req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36")
1012 | req.Header.Set("Content-Type", "application/json")
1013 | req.Header.Set("Origin", "https://www.ambushdesign.com")
1014 | req.Header.Set("Sec-Fetch-Site", "same-origin")
1015 | req.Header.Set("Sec-Fetch-Mode", "cors")
1016 | req.Header.Set("Sec-Fetch-Dest", "empty")
1017 | req.Header.Set("Referer", "https://www.ambushdesign.com/")
1018 |
1019 | t.SetAllowRedirects(false)
1020 |
1021 | resp, err := t.Client.Do(req)
1022 |
1023 | if err != nil {
1024 | t.Error("Error submitting PayPal - 2 - %v", err.Error())
1025 | t.Rotate()
1026 | continue
1027 | }
1028 |
1029 | switch resp.StatusCode {
1030 | case 302:
1031 |
1032 | if strings.Contains(resp.Header.Get("Location"), "paypal") {
1033 |
1034 | t.PayPalURL = resp.Header.Get("Location")
1035 | t.PaypalWebhook()
1036 | return
1037 | }
1038 |
1039 | return
1040 | case 400:
1041 | t.Error("Error submitting PayPal - Site error [%v]", resp.StatusCode)
1042 | t.Sleep()
1043 | continue
1044 | case 403:
1045 | t.Error("Error submitting PayPal - Access Denied [%v]", resp.StatusCode)
1046 | t.SleepAndRotate()
1047 | continue
1048 | case 429:
1049 | t.Error("Error submitting PayPal - Rate limited [%v]", resp.StatusCode)
1050 | t.SleepAndRotate()
1051 | continue
1052 | case 500, 501, 502, 503:
1053 | t.Error("Error submitting PayPal - Site error [%v]", resp.StatusCode)
1054 | t.Sleep()
1055 | continue
1056 | default:
1057 | t.Error("Error submitting PayPal - Unhandled error [%v]", resp.StatusCode)
1058 | t.SleepAndRotate()
1059 | continue
1060 | }
1061 | }
1062 | }
1063 |
--------------------------------------------------------------------------------
/src/bot/stores/ambush/start.go:
--------------------------------------------------------------------------------
1 | package ambush
2 |
3 | import (
4 | "fmt"
5 | "sync"
6 |
7 | "bot/tasks"
8 | )
9 |
10 | func Start(row tasks.Row, config tasks.Config, proxies []string, id int, wg *sync.WaitGroup) {
11 | defer wg.Done()
12 |
13 | task := &Task{
14 | ID: fmt.Sprint(id),
15 | SKU: row.SKU,
16 |
17 | Email: row.Email,
18 | FirstName: row.FirstName,
19 | LastName: row.LastName,
20 | PhoneNumber: row.PhoneNumber,
21 | Address1: row.Address1,
22 | Address2: row.Address2,
23 | State: row.State,
24 | City: row.City,
25 | Postcode: row.Postcode,
26 | Country: row.Country,
27 | CountryID: row.CountryID,
28 | Currency: row.Currency,
29 |
30 | Delay: config.Delay,
31 | Timeout: config.Timeout,
32 | Webhook: config.Webhook,
33 |
34 | Proxies: proxies,
35 | }
36 |
37 | sizes, err := tasks.ParseSizes(row.Sizes)
38 |
39 | if err != nil {
40 | task.Error("Invalid sizes %v", row.Sizes)
41 | }
42 |
43 | task.Sizes = sizes
44 |
45 | task.Start()
46 | }
47 |
--------------------------------------------------------------------------------
/src/bot/stores/ambush/task.go:
--------------------------------------------------------------------------------
1 | package ambush
2 |
3 | import (
4 | "fmt"
5 | "math/rand"
6 | "net/http"
7 | "net/url"
8 | "time"
9 |
10 | "bot/client"
11 | "bot/log"
12 | )
13 |
14 | type Task struct {
15 | ID string
16 |
17 | SKU string
18 | Sizes []string
19 |
20 | Email string
21 | FirstName string
22 | LastName string
23 | PhoneNumber string
24 | Address1 string
25 | Address2 string
26 | State string
27 | City string
28 | Postcode string
29 | Country string
30 | CountryID string
31 | Currency string
32 |
33 | Region string
34 |
35 | Delay int
36 | Timeout int
37 | Webhook string
38 |
39 | Proxies []string
40 |
41 | Client *http.Client
42 | CookieJar client.ExportableCookieJar
43 |
44 | BagID string
45 | MerchantID int
46 | Scale string
47 | OrderID int
48 | ShippingPrice int
49 | ShippingFormattedPrice string
50 | ShippingCostType int
51 | ShippingDescription string
52 | ShippingID int
53 | ShippingName string
54 | ShippingType string
55 | MinEstimatedDeliveryHour int
56 | MaxEstimatedDeliveryHour int
57 | GrandTotal int
58 | CTX string
59 | PaymentIntentID string
60 | RedirectURL string
61 | PayPalURL string
62 | CheckoutURL string
63 |
64 | ProductName string
65 | ProductImage string
66 | ProductPrice string
67 | ProductSize string
68 | ProductVariant string
69 | }
70 |
71 | func (t *Task) Debug(format string, a ...interface{}) {
72 | s := fmt.Sprintf(format, a...)
73 | log.Debugln(s, t.ID)
74 | }
75 |
76 | func (t *Task) Info(format string, a ...interface{}) {
77 | s := fmt.Sprintf(format, a...)
78 | log.Infoln(s, t.ID)
79 | }
80 |
81 | func (t *Task) Warn(format string, a ...interface{}) {
82 | s := fmt.Sprintf(format, a...)
83 | log.Warningln(s, t.ID)
84 | }
85 |
86 | func (t *Task) Error(format string, a ...interface{}) {
87 | s := fmt.Sprintf(format, a...)
88 | log.Errorln(s, t.ID)
89 | }
90 |
91 | func (t *Task) HandleError(err error) bool {
92 | if err != nil {
93 | t.Error(err.Error())
94 | return true
95 | }
96 | return false
97 | }
98 |
99 | func (t *Task) Sleep() {
100 | time.Sleep(time.Millisecond * time.Duration(t.Delay))
101 | }
102 |
103 | func (t *Task) NewClient() (*http.Client, error) {
104 | return &http.Client{}, nil
105 | }
106 |
107 | func (t *Task) SetupClient() {
108 | jar := client.NewExportableCookieJar()
109 | t.Client.Jar = jar
110 | t.CookieJar = *jar
111 |
112 | t.Client.Timeout = time.Millisecond * time.Duration(t.Timeout)
113 |
114 | t.Rotate()
115 | }
116 |
117 | func newRoundTripper(u string) (*http.Transport, error) {
118 | proxyURL, err := url.Parse(u)
119 |
120 | if err != nil {
121 | return nil, err
122 | }
123 |
124 | return &http.Transport{Proxy: http.ProxyURL(proxyURL)}, nil
125 | }
126 |
127 | func (t *Task) Rotate() {
128 | var roundTripper http.RoundTripper
129 | var err error
130 |
131 | if len(t.Proxies) > 0 {
132 | proxyURL := t.Proxies[rand.Intn(len(t.Proxies))]
133 | roundTripper, err = newRoundTripper(proxyURL)
134 | if err != nil {
135 | t.Error(err.Error())
136 | return
137 | }
138 | } else {
139 | roundTripper = &http.Transport{}
140 | }
141 |
142 | t.Client.Transport = roundTripper
143 | }
144 |
145 | func (task *Task) SetAllowRedirects(allow bool) {
146 | if allow {
147 | task.Client.CheckRedirect = func(req *http.Request, via []*http.Request) error {
148 | return nil
149 | }
150 | } else {
151 | task.Client.CheckRedirect = func(req *http.Request, via []*http.Request) error {
152 | return http.ErrUseLastResponse
153 | }
154 | }
155 | }
156 |
157 | func (t *Task) SleepAndRotate() {
158 | t.Sleep()
159 | t.Rotate()
160 | }
161 |
--------------------------------------------------------------------------------
/src/bot/stores/ambush/webhooks.go:
--------------------------------------------------------------------------------
1 | package ambush
2 |
3 | import (
4 | "bot/webhooks"
5 | "fmt"
6 | "time"
7 | )
8 |
9 | func (t *Task) FailedWebhook() {
10 | w := webhooks.Webhook{}
11 | e := webhooks.Embed{}
12 |
13 | e.SetTitle("Checkout failed :disappointed:")
14 | e.SetColor(0xed1c24)
15 | e.SetThumbnail(t.ProductImage)
16 | e.SetFooter(fmt.Sprintf("TraianBot - [%v]", time.Now().Format("2006-02-01 15:04:05.999999")), "https://i.pinimg.com/564x/17/6b/90/176b90a7cf4ca43e88de32369d053dab.jpg")
17 |
18 | e.AddField("Store", "Ambush", false)
19 | e.AddField("PID", t.SKU, true)
20 | e.AddField("Size", t.ProductSize, true)
21 | e.AddField("Email", fmt.Sprintf("||%v||", t.Email), true)
22 |
23 | w.AddEmbed(e)
24 |
25 | err := w.Send(t.Webhook)
26 |
27 | if err != nil {
28 | t.Error("Error sending webhook - %v", err.Error())
29 | } else {
30 | t.Info("Webhook sent")
31 | }
32 | }
33 |
34 | func (t *Task) PaypalWebhook() {
35 |
36 | w := webhooks.Webhook{}
37 | e := webhooks.Embed{}
38 |
39 | e.SetTitle("Succesful checkout :disappointed:")
40 | e.SetColor(0x00ff00)
41 | e.SetThumbnail(t.ProductImage)
42 | e.SetFooter(fmt.Sprintf("TraianBot - [%v]", time.Now().Format("2006-02-01 15:04:05.999999")), "https://i.pinimg.com/564x/17/6b/90/176b90a7cf4ca43e88de32369d053dab.jpg")
43 | e.SetDescription(fmt.Sprintf("[Click here](%v)", t.PaypalURL))
44 | e.AddField("Store", "Ambush", false)
45 | e.AddField("PID", t.SKU, true)
46 | e.AddField("Size", t.ProductSize, true)
47 | e.AddField("Email", fmt.Sprintf("||%v||", t.Email), true)
48 |
49 | w.AddEmbed(e)
50 |
51 | err := w.Send(t.Webhook)
52 |
53 | if err != nil {
54 | t.Error("Error sending webhook - %v", err.Error())
55 | } else {
56 | t.Info("Webhook sent")
57 | }
58 |
59 | }
60 |
--------------------------------------------------------------------------------
/src/bot/tasks/config.go:
--------------------------------------------------------------------------------
1 | package tasks
2 |
3 | import (
4 | "encoding/json"
5 | "io/ioutil"
6 | )
7 |
8 | type Config struct {
9 | Webhook string `json:"WEBHOOK"`
10 | Delay int `json:"DELAY"`
11 | Timeout int `json:"TIMEOUT"`
12 | }
13 |
14 | func ReadConfig() (Config, error) {
15 |
16 | fileContent, err := ioutil.ReadFile("config.json")
17 |
18 | if err != nil {
19 | return Config{}, err
20 | }
21 |
22 | var config Config
23 |
24 | if err := json.Unmarshal(fileContent, &config); err != nil {
25 | return config, err
26 | }
27 |
28 | return config, nil
29 |
30 | }
31 |
--------------------------------------------------------------------------------
/src/bot/tasks/csv.go:
--------------------------------------------------------------------------------
1 | package tasks
2 |
3 | import (
4 | "io/ioutil"
5 |
6 | "github.com/jszwec/csvutil"
7 | )
8 |
9 | type Row struct {
10 | SKU string `csv:"SKU"`
11 | URL string `csv:"URL"`
12 | Sizes string `csv:"SIZES"`
13 |
14 | Email string `csv:"EMAIL"`
15 | FirstName string `csv:"FIRST NAME"`
16 | LastName string `csv:"LAST NAME"`
17 | PhoneNumber string `csv:"PHONE NUMBER"`
18 | Address1 string `csv:"ADDRESS 1"`
19 | Address2 string `csv:"ADDRESS 2"`
20 | HouseNumber string `csv:"HOUSE NUMBER"`
21 | State string `csv:"STATE"`
22 | City string `csv:"CITY"`
23 | Postcode string `csv:"POSTCODE"`
24 | Country string `csv:"COUNTRY"`
25 | CountryID string `csv:"COUNTRY ID"`
26 | Currency string `csv:"CURRENCY"`
27 | }
28 |
29 | func ReadFile(filename string) ([]Row, error) {
30 |
31 | fileContent, err := ioutil.ReadFile(filename)
32 |
33 | if err != nil {
34 | return nil, err
35 | }
36 |
37 | var rows []Row
38 |
39 | if err := csvutil.Unmarshal(fileContent, &rows); err != nil {
40 | return nil, err
41 | }
42 |
43 | return rows, nil
44 | }
45 |
--------------------------------------------------------------------------------
/src/bot/tasks/proxies.go:
--------------------------------------------------------------------------------
1 | package tasks
2 |
3 | import (
4 | "fmt"
5 | "io/ioutil"
6 | "strings"
7 | )
8 |
9 | func ReadProxies() ([]string, error) {
10 |
11 | fileContent, err := ioutil.ReadFile("proxies.txt")
12 |
13 | if err != nil {
14 | return nil, err
15 | }
16 |
17 | raw := strings.Split(string(fileContent), "\r\n")
18 |
19 | proxies := make([]string, 0)
20 |
21 | for _, proxy := range raw {
22 |
23 | spl := strings.Split(proxy, ":")
24 |
25 | if len(spl) == 2 {
26 | proxies = append(proxies, fmt.Sprintf("http://%v:%v", spl[0], spl[1]))
27 | } else if len(spl) == 4 {
28 | proxies = append(proxies, fmt.Sprintf("http://%v:%v@%v:%v", spl[2], spl[3], spl[0], spl[1]))
29 | }
30 | }
31 |
32 | return proxies, nil
33 | }
34 |
--------------------------------------------------------------------------------
/src/bot/tasks/sizes.go:
--------------------------------------------------------------------------------
1 | package tasks
2 |
3 | import (
4 | "strings"
5 |
6 | "bot/utils"
7 | )
8 |
9 | func ParseSizes(sizes string) ([]string, error) {
10 | if sizes == "" || strings.ToLower(sizes) == "random" {
11 | return []string{"RANDOM"}, nil
12 | }
13 |
14 | rangeCheck := strings.Split(sizes, ":")
15 |
16 | if len(rangeCheck) > 1 {
17 | return utils.Frange(rangeCheck[0], rangeCheck[1])
18 | }
19 |
20 | return strings.Split(sizes, ";"), nil
21 | }
22 |
--------------------------------------------------------------------------------
/src/bot/utils/cookies.go:
--------------------------------------------------------------------------------
1 | package utils
2 |
3 | import (
4 | "fmt"
5 | "strings"
6 |
7 | "bot/client"
8 | "net/http"
9 | "net/url"
10 | )
11 |
12 | type Cookie struct {
13 | Name string `json:"name"`
14 | Value string `json:"value"`
15 | Domain string `json:"domain"`
16 | Path string `json:"path"`
17 | URL string `json:"url"`
18 | Secure bool `json:"secure"`
19 | }
20 |
21 | func GetCookie(jar *client.ExportableCookieJar, name string) string {
22 |
23 | for _, cookies := range jar.ExportAllCookies() {
24 | for _, cookie := range cookies {
25 | if name == cookie.Name {
26 | return cookie.Value
27 | }
28 | }
29 | }
30 |
31 | return ""
32 | }
33 |
34 | func SetCookie(jar *client.ExportableCookieJar, name, value, domain, URL string) (*client.ExportableCookieJar, error) {
35 |
36 | new := client.NewExportableCookieJar()
37 |
38 | for host, cookies := range jar.ExportAllCookies() {
39 |
40 | cks := make([]*http.Cookie, 0)
41 |
42 | for _, cookie := range cookies {
43 | if name != cookie.Name {
44 | cks = append(cks, cookie)
45 | }
46 | }
47 |
48 | new.SetCookies(&host, cks)
49 | }
50 |
51 | cookie := http.Cookie{
52 | Name: name,
53 | Value: value,
54 | Domain: domain,
55 | Path: "/",
56 | }
57 |
58 | u, err := url.Parse(URL)
59 |
60 | if err != nil {
61 | return nil, err
62 | }
63 |
64 | new.SetCookies(u, []*http.Cookie{&cookie})
65 |
66 | return new, nil
67 | }
68 |
69 | func PopCookie(jar *client.ExportableCookieJar, name string) *client.ExportableCookieJar {
70 |
71 | new := client.NewExportableCookieJar()
72 |
73 | for host, cookies := range jar.ExportAllCookies() {
74 |
75 | cks := make([]*http.Cookie, 0)
76 |
77 | for _, cookie := range cookies {
78 | if name != cookie.Name {
79 | cks = append(cks, cookie)
80 | }
81 | }
82 |
83 | new.SetCookies(&host, cks)
84 | }
85 |
86 | return new
87 | }
88 |
89 | func ExtractCookies(jar *client.ExportableCookieJar) []*Cookie {
90 |
91 | r := make([]*Cookie, 0)
92 |
93 | for u, cookies := range jar.ExportAllCookies() {
94 | for _, cookie := range cookies {
95 |
96 | c := &Cookie{
97 | Name: cookie.Name,
98 | Value: cookie.Value,
99 | Domain: cookie.Domain,
100 | Path: cookie.Path,
101 | Secure: true,
102 | }
103 |
104 | if strings.HasPrefix(u.Host, ".") {
105 | c.URL = fmt.Sprintf("https://%v", strings.Trim(u.Host, "."))
106 | } else {
107 | c.URL = fmt.Sprintf("https://%v", u.Host)
108 | }
109 |
110 | r = append(r, c)
111 | }
112 | }
113 |
114 | return r
115 | }
116 |
--------------------------------------------------------------------------------
/src/bot/utils/countries.go:
--------------------------------------------------------------------------------
1 | package utils
2 |
3 | var countries = map[string]string{
4 | "AF": "Afghanistan",
5 | "AX": "Åland Islands",
6 | "AL": "Albania",
7 | "DZ": "Algeria",
8 | "AS": "American Samoa",
9 | "AD": "Andorra",
10 | "AO": "Angola",
11 | "AI": "Anguilla",
12 | "AQ": "Antarctica",
13 | "AG": "Antigua and Barbuda",
14 | "AR": "Argentina",
15 | "AM": "Armenia",
16 | "AW": "Aruba",
17 | "AU": "Australia",
18 | "AT": "Austria",
19 | "AZ": "Azerbaijan",
20 | "BS": "The Bahamas",
21 | "BH": "Bahrain",
22 | "BD": "Bangladesh",
23 | "BB": "Barbados",
24 | "BY": "Belarus",
25 | "BE": "Belgium",
26 | "BZ": "Belize",
27 | "BJ": "Benin",
28 | "BM": "Bermuda",
29 | "BT": "Bhutan",
30 | "BO": "Bolivia",
31 | "BQ": "Bonaire",
32 | "BA": "Bosnia and Herzegovina",
33 | "BW": "Botswana",
34 | "BV": "Bouvet Island",
35 | "BR": "Brazil",
36 | "IO": "British Indian Ocean Territory",
37 | "UM": "United States Minor Outlying Islands",
38 | "VG": "Virgin Islands (British)",
39 | "VI": "Virgin Islands (U.S.)",
40 | "BN": "Brunei",
41 | "BG": "Bulgaria",
42 | "BF": "Burkina Faso",
43 | "BI": "Burundi",
44 | "KH": "Cambodia",
45 | "CM": "Cameroon",
46 | "CA": "Canada",
47 | "CV": "Cape Verde",
48 | "KY": "Cayman Islands",
49 | "CF": "Central African Republic",
50 | "TD": "Chad",
51 | "CL": "Chile",
52 | "CN": "China",
53 | "CX": "Christmas Island",
54 | "CC": "Cocos (Keeling) Islands",
55 | "CO": "Colombia",
56 | "KM": "Comoros",
57 | "CG": "Republic of the Congo",
58 | "CD": "Democratic Republic of the Congo",
59 | "CK": "Cook Islands",
60 | "CR": "Costa Rica",
61 | "HR": "Croatia",
62 | "CU": "Cuba",
63 | "CW": "Curaçao",
64 | "CY": "Cyprus",
65 | "CZ": "Czech Republic",
66 | "DK": "Denmark",
67 | "DJ": "Djibouti",
68 | "DM": "Dominica",
69 | "DO": "Dominican Republic",
70 | "EC": "Ecuador",
71 | "EG": "Egypt",
72 | "SV": "El Salvador",
73 | "GQ": "Equatorial Guinea",
74 | "ER": "Eritrea",
75 | "EE": "Estonia",
76 | "ET": "Ethiopia",
77 | "FK": "Falkland Islands",
78 | "FO": "Faroe Islands",
79 | "FJ": "Fiji",
80 | "FI": "Finland",
81 | "FR": "France",
82 | "GF": "French Guiana",
83 | "PF": "French Polynesia",
84 | "TF": "French Southern and Antarctic Lands",
85 | "GA": "Gabon",
86 | "GM": "The Gambia",
87 | "GE": "Georgia",
88 | "DE": "Germany",
89 | "GH": "Ghana",
90 | "GI": "Gibraltar",
91 | "GR": "Greece",
92 | "GL": "Greenland",
93 | "GD": "Grenada",
94 | "GP": "Guadeloupe",
95 | "GU": "Guam",
96 | "GT": "Guatemala",
97 | "GG": "Guernsey",
98 | "GN": "Guinea",
99 | "GW": "Guinea-Bissau",
100 | "GY": "Guyana",
101 | "HT": "Haiti",
102 | "HM": "Heard Island and McDonald Islands",
103 | "VA": "Holy See",
104 | "HN": "Honduras",
105 | "HK": "Hong Kong",
106 | "HU": "Hungary",
107 | "IS": "Iceland",
108 | "IN": "India",
109 | "ID": "Indonesia",
110 | "CI": "Ivory Coast",
111 | "IR": "Iran",
112 | "IQ": "Iraq",
113 | "IE": "Republic of Ireland",
114 | "IM": "Isle of Man",
115 | "IL": "Israel",
116 | "IT": "Italy",
117 | "JM": "Jamaica",
118 | "JP": "Japan",
119 | "JE": "Jersey",
120 | "JO": "Jordan",
121 | "KZ": "Kazakhstan",
122 | "KE": "Kenya",
123 | "KI": "Kiribati",
124 | "KW": "Kuwait",
125 | "KG": "Kyrgyzstan",
126 | "LA": "Laos",
127 | "LV": "Latvia",
128 | "LB": "Lebanon",
129 | "LS": "Lesotho",
130 | "LR": "Liberia",
131 | "LY": "Libya",
132 | "LI": "Liechtenstein",
133 | "LT": "Lithuania",
134 | "LU": "Luxembourg",
135 | "MO": "Macau",
136 | "MK": "Republic of Macedonia",
137 | "MG": "Madagascar",
138 | "MW": "Malawi",
139 | "MY": "Malaysia",
140 | "MV": "Maldives",
141 | "ML": "Mali",
142 | "MT": "Malta",
143 | "MH": "Marshall Islands",
144 | "MQ": "Martinique",
145 | "MR": "Mauritania",
146 | "MU": "Mauritius",
147 | "YT": "Mayotte",
148 | "MX": "Mexico",
149 | "FM": "Federated States of Micronesia",
150 | "MD": "Moldova",
151 | "MC": "Monaco",
152 | "MN": "Mongolia",
153 | "ME": "Montenegro",
154 | "MS": "Montserrat",
155 | "MA": "Morocco",
156 | "MZ": "Mozambique",
157 | "MM": "Myanmar",
158 | "NA": "Namibia",
159 | "NR": "Nauru",
160 | "NP": "Nepal",
161 | "NL": "Netherlands",
162 | "NC": "New Caledonia",
163 | "NZ": "New Zealand",
164 | "NI": "Nicaragua",
165 | "NE": "Niger",
166 | "NG": "Nigeria",
167 | "NU": "Niue",
168 | "NF": "Norfolk Island",
169 | "KP": "North Korea",
170 | "MP": "Northern Mariana Islands",
171 | "NO": "Norway",
172 | "OM": "Oman",
173 | "PK": "Pakistan",
174 | "PW": "Palau",
175 | "PS": "Palestine",
176 | "PA": "Panama",
177 | "PG": "Papua New Guinea",
178 | "PY": "Paraguay",
179 | "PE": "Peru",
180 | "PH": "Philippines",
181 | "PN": "Pitcairn Islands",
182 | "PL": "Poland",
183 | "PT": "Portugal",
184 | "PR": "Puerto Rico",
185 | "QA": "Qatar",
186 | "XK": "Republic of Kosovo",
187 | "RE": "Réunion",
188 | "RO": "Romania",
189 | "RU": "Russia",
190 | "RW": "Rwanda",
191 | "BL": "Saint Barthélemy",
192 | "SH": "Saint Helena",
193 | "KN": "Saint Kitts and Nevis",
194 | "LC": "Saint Lucia",
195 | "MF": "Saint Martin",
196 | "PM": "Saint Pierre and Miquelon",
197 | "VC": "Saint Vincent and the Grenadines",
198 | "WS": "Samoa",
199 | "SM": "San Marino",
200 | "ST": "São Tomé and Príncipe",
201 | "SA": "Saudi Arabia",
202 | "SN": "Senegal",
203 | "RS": "Serbia",
204 | "SC": "Seychelles",
205 | "SL": "Sierra Leone",
206 | "SG": "Singapore",
207 | "SX": "Sint Maarten",
208 | "SK": "Slovakia",
209 | "SI": "Slovenia",
210 | "SB": "Solomon Islands",
211 | "SO": "Somalia",
212 | "ZA": "South Africa",
213 | "GS": "South Georgia",
214 | "KR": "South Korea",
215 | "SS": "South Sudan",
216 | "ES": "Spain",
217 | "LK": "Sri Lanka",
218 | "SD": "Sudan",
219 | "SR": "Suriname",
220 | "SJ": "Svalbard and Jan Mayen",
221 | "SZ": "Swaziland",
222 | "SE": "Sweden",
223 | "CH": "Switzerland",
224 | "SY": "Syria",
225 | "TW": "Taiwan",
226 | "TJ": "Tajikistan",
227 | "TZ": "Tanzania",
228 | "TH": "Thailand",
229 | "TL": "East Timor",
230 | "TG": "Togo",
231 | "TK": "Tokelau",
232 | "TO": "Tonga",
233 | "TT": "Trinidad and Tobago",
234 | "TN": "Tunisia",
235 | "TR": "Turkey",
236 | "TM": "Turkmenistan",
237 | "TC": "Turks and Caicos Islands",
238 | "TV": "Tuvalu",
239 | "UG": "Uganda",
240 | "UA": "Ukraine",
241 | "AE": "United Arab Emirates",
242 | "GB": "United Kingdom",
243 | "US": "United States",
244 | "UY": "Uruguay",
245 | "UZ": "Uzbekistan",
246 | "VU": "Vanuatu",
247 | "VE": "Venezuela",
248 | "VN": "Vietnam",
249 | "WF": "Wallis and Futuna",
250 | "EH": "Western Sahara",
251 | "YE": "Yemen",
252 | "ZM": "Zambia",
253 | "ZW": "Zimbabwe",
254 | }
255 |
256 | func GetFullCountry(country string) string {
257 | return countries[country]
258 | }
259 |
--------------------------------------------------------------------------------
/src/bot/utils/form.go:
--------------------------------------------------------------------------------
1 | package utils
2 |
3 | import (
4 | "fmt"
5 | "net/url"
6 | "strings"
7 | )
8 |
9 | type Form struct {
10 | Values []map[string]string
11 | }
12 |
13 | func (form *Form) Set(key, value string) {
14 | form.Values = append(form.Values, map[string]string{key: value})
15 | }
16 |
17 | func (form *Form) Pop(keyToRemove string) {
18 | i := 0
19 | var elementToRemove string
20 | for _, y := range form.Values {
21 | for key, _ := range y {
22 | if keyToRemove == key {
23 | elementToRemove = fmt.Sprintf("%v", form.Values[i])
24 | }
25 | }
26 | i += 1
27 | }
28 | if elementToRemove == "" {
29 | return
30 | }
31 | for i := 0; i < len(form.Values); i++ {
32 | value := fmt.Sprintf("%v", form.Values[i])
33 | if value == elementToRemove {
34 | copy(form.Values[i:], form.Values[i+1:])
35 | form.Values[len(form.Values)-1] = nil
36 | form.Values = form.Values[:len(form.Values)-1]
37 | return
38 | }
39 | continue
40 | }
41 | }
42 |
43 | func (form *Form) Encode() string {
44 | var encoded string
45 | for _, pair := range form.Values {
46 | for key, value := range pair {
47 | encoded += fmt.Sprintf("%v=%v&", url.QueryEscape(key), url.QueryEscape(value))
48 | }
49 | }
50 |
51 | return strings.Trim(encoded, "&")
52 | }
53 |
--------------------------------------------------------------------------------
/src/bot/utils/profiles.go:
--------------------------------------------------------------------------------
1 | package utils
2 |
3 | import (
4 | "errors"
5 | "fmt"
6 | "strings"
7 |
8 | "github.com/Pallinder/go-randomdata"
9 | "github.com/mcnijman/go-emailaddress"
10 | )
11 |
12 | func CheckProfile(email, firstName, lastName, phoneNumber, address1, city, postcode, country string) error {
13 |
14 | if email == "" {
15 | return errors.New("Email can't be empty")
16 | }
17 |
18 | if _, err := emailaddress.Parse(email); err != nil {
19 | return errors.New("Invalid email")
20 | }
21 |
22 | if firstName == "" {
23 | return errors.New("First name can't be empty")
24 | }
25 |
26 | if lastName == "" {
27 | return errors.New("Last name can't be empty")
28 | }
29 |
30 | if phoneNumber == "" {
31 | return errors.New("Phone number can't be empty")
32 | }
33 |
34 | if address1 == "" {
35 | return errors.New("Address 1 can't be empty")
36 | }
37 |
38 | if city == "" {
39 | return errors.New("City can't be empty")
40 | }
41 |
42 | if postcode == "" {
43 | return errors.New("Postcode can't be empty")
44 | }
45 |
46 | if country == "" {
47 | return errors.New("Country can't be empty")
48 | }
49 |
50 | return nil
51 | }
52 |
53 | func WrapProfile(email, firstName, lastName, phoneNumber, address1 string) (string, string, string, string, string) {
54 |
55 | if strings.ToUpper(firstName) == "RANDOM" {
56 | firstName = randomdata.FirstName(randomdata.RandomGender)
57 | }
58 |
59 | if strings.ToUpper(lastName) == "RANDOM" {
60 | lastName = randomdata.LastName()
61 | }
62 |
63 | if strings.ToUpper(phoneNumber) == "RANDOM" {
64 | phoneNumber = fmt.Sprintf("%v", randomdata.Number(1000000000, 9999999999))
65 | }
66 |
67 | parsedEmail, _ := emailaddress.Parse(email)
68 |
69 | if strings.ToUpper(parsedEmail.LocalPart) == "RANDOM" {
70 | email = fmt.Sprintf("%v%v%v@%v", firstName, lastName, fmt.Sprintf("%v", randomdata.Number(100, 9999)), parsedEmail.Domain)
71 | }
72 |
73 | if strings.Contains(address1, "XXX") {
74 | address1 = strings.Replace(address1, "XXX", RandomString(3, "ABCDEFGHUJKLMNOPQRSTUVWXYZ"), 1)
75 | }
76 |
77 | return email, firstName, lastName, phoneNumber, address1
78 | }
79 |
--------------------------------------------------------------------------------
/src/bot/utils/states.go:
--------------------------------------------------------------------------------
1 | package utils
2 |
3 | var states = map[string]map[string]string{
4 | "AF": map[string]string{
5 | "Badakhshān": "BDS",
6 | "Baghlān": "BGL",
7 | "Balkh": "BAL",
8 | "Bādghīs": "BDG",
9 | "Bāmyān": "BAM",
10 | "Dāykundī": "DAY",
11 | "Farāh": "FRA",
12 | "Fāryāb": "FYB",
13 | "Ghaznī": "GHA",
14 | "Ghōr": "GHO",
15 | "Helmand": "HEL",
16 | "Herāt": "HER",
17 | "Jowzjān": "JOW",
18 | "Kandahār": "KAN",
19 | "Khōst": "KHO",
20 | "Kunar": "KNR",
21 | "Kunduz": "KDZ",
22 | "Kābul": "KAB",
23 | "Kāpīsā": "KAP",
24 | "Laghmān": "LAG",
25 | "Lōgar": "LOG",
26 | "Nangarhār": "NAN",
27 | "Nīmrōz": "NIM",
28 | "Nūristān": "NUR",
29 | "Paktiyā": "PIA",
30 | "Paktīkā": "PKA",
31 | "Panjshayr": "PAN",
32 | "Parwān": "PAR",
33 | "Samangān": "SAM",
34 | "Sar-e Pul": "SAR",
35 | "Takhār": "TAK",
36 | "Uruzgān": "URU",
37 | "Wardak": "WAR",
38 | "Zābul": "ZAB",
39 | },
40 | "AX": map[string]string{},
41 | "AL": map[string]string{
42 | "Berat": "01",
43 | "Dibër": "09",
44 | "Durrës": "02",
45 | "Elbasan": "03",
46 | "Fier": "04",
47 | "Gjirokastër": "05",
48 | "Korçë": "06",
49 | "Kukës": "07",
50 | "Lezhë": "08",
51 | "Shkodër": "10",
52 | "Tiranë": "11",
53 | "Vlorë": "12",
54 | },
55 | "DZ": map[string]string{
56 | "Adrar": "01",
57 | "Alger": "16",
58 | "Annaba": "23",
59 | "Aïn Defla": "44",
60 | "Aïn Témouchent": "46",
61 | "Batna": "05",
62 | "Biskra": "07",
63 | "Blida": "09",
64 | "Bordj Bou Arréridj": "34",
65 | "Bouira": "10",
66 | "Boumerdès": "35",
67 | "Béchar": "08",
68 | "Béjaïa": "06",
69 | "Chlef": "02",
70 | "Constantine": "25",
71 | "Djelfa": "17",
72 | "El Bayadh": "32",
73 | "El Oued": "39",
74 | "El Tarf": "36",
75 | "Ghardaïa": "47",
76 | "Guelma": "24",
77 | "Illizi": "33",
78 | "Jijel": "18",
79 | "Khenchela": "40",
80 | "Laghouat": "03",
81 | "Mascara": "29",
82 | "Mila": "43",
83 | "Mostaganem": "27",
84 | "Msila": "28",
85 | "Médéa": "26",
86 | "Naama": "45",
87 | "Oran": "31",
88 | "Ouargla": "30",
89 | "Oum el Bouaghi": "04",
90 | "Relizane": "48",
91 | "Saïda": "20",
92 | "Sidi Bel Abbès": "22",
93 | "Skikda": "21",
94 | "Souk Ahras": "41",
95 | "Sétif": "19",
96 | "Tamanghasset": "11",
97 | "Tiaret": "14",
98 | "Tindouf": "37",
99 | "Tipaza": "42",
100 | "Tissemsilt": "38",
101 | "Tizi Ouzou": "15",
102 | "Tlemcen": "13",
103 | "Tébessa": "12",
104 | },
105 | "AS": map[string]string{},
106 | "AD": map[string]string{
107 | "Andorra la Vella": "07",
108 | "Canillo": "02",
109 | "Encamp": "03",
110 | "Escaldes-Engordany": "08",
111 | "La Massana": "04",
112 | "Ordino": "05",
113 | "Sant Julià de Lòria": "06",
114 | },
115 | "AO": map[string]string{
116 | "Bengo": "BGO",
117 | "Benguela": "BGU",
118 | "Bié": "BIE",
119 | "Cabinda": "CAB",
120 | "Cunene": "CNN",
121 | "Huambo": "HUA",
122 | "Huíla": "HUI",
123 | "Kuando Kubango": "CCU",
124 | "Kwanza Norte": "CNO",
125 | "Kwanza Sul": "CUS",
126 | "Luanda": "LUA",
127 | "Lunda Norte": "LNO",
128 | "Lunda Sul": "LSU",
129 | "Malange": "MAL",
130 | "Moxico": "MOX",
131 | "Namibe": "NAM",
132 | "Uíge": "UIG",
133 | "Zaire": "ZAI",
134 | },
135 | "AI": map[string]string{},
136 | "AQ": map[string]string{},
137 | "AG": map[string]string{
138 | "Barbuda": "10",
139 | "Redonda": "11",
140 | "Saint George": "03",
141 | "Saint John": "04",
142 | "Saint Mary": "05",
143 | "Saint Paul": "06",
144 | "Saint Peter": "07",
145 | "Saint Philip": "08",
146 | },
147 | "AR": map[string]string{
148 | "Buenos Aires": "B",
149 | "Catamarca": "K",
150 | "Chaco": "H",
151 | "Chubut": "U",
152 | "Ciudad Autónoma de Buenos Aires": "C",
153 | "Corrientes": "W",
154 | "Córdoba": "X",
155 | "Entre Ríos": "E",
156 | "Formosa": "P",
157 | "Jujuy": "Y",
158 | "La Pampa": "L",
159 | "La Rioja": "F",
160 | "Mendoza": "M",
161 | "Misiones": "N",
162 | "Neuquén": "Q",
163 | "Río Negro": "R",
164 | "Salta": "A",
165 | "San Juan": "J",
166 | "San Luis": "D",
167 | "Santa Cruz": "Z",
168 | "Santa Fe": "S",
169 | "Santiago del Estero": "G",
170 | "Tierra del Fuego": "V",
171 | "Tucumán": "T",
172 | },
173 | "AM": map[string]string{
174 | "Aragac̣otn": "AG",
175 | "Ararat": "AR",
176 | "Armavir": "AV",
177 | "Erevan": "ER",
178 | "Geġark'unik'": "GR",
179 | "Kotayk'": "KT",
180 | "Loṙi": "LO",
181 | "Syunik'": "SU",
182 | "Tavuš": "TV",
183 | "Vayoć Jor": "VD",
184 | "Širak": "SH",
185 | },
186 | "AW": map[string]string{},
187 | "AU": map[string]string{
188 | "Australian Capital Territory": "ACT",
189 | "New South Wales": "NSW",
190 | "Northern Territory": "NT",
191 | "Queensland": "QLD",
192 | "South Australia": "SA",
193 | "Tasmania": "TAS",
194 | "Victoria": "VIC",
195 | "Western Australia": "WA",
196 | },
197 | "AT": map[string]string{
198 | "Burgenland": "B",
199 | "Kärnten": "K",
200 | "Niederösterreich": "NÖ",
201 | "Oberösterreich": "OÖ",
202 | "Salzburg": "S",
203 | "Steiermark": "ST",
204 | "Tirol": "T",
205 | "Vorarlberg": "V",
206 | "Wien": "W",
207 | },
208 | "AZ": map[string]string{
209 | "Naxçıvan": "NX",
210 | },
211 | "BS": map[string]string{
212 | "Acklins": "AK",
213 | "Berry Islands": "BY",
214 | "Bimini": "BI",
215 | "Black Point": "BP",
216 | "Cat Island": "CI",
217 | "Central Abaco": "CO",
218 | "Central Andros": "CS",
219 | "Central Eleuthera": "CE",
220 | "City of Freeport": "FP",
221 | "Crooked Island and Long Cay": "CK",
222 | "East Grand Bahama": "EG",
223 | "Exuma": "EX",
224 | "Grand Cay": "GC",
225 | "Harbour Island": "HI",
226 | "Hope Town": "HT",
227 | "Inagua": "IN",
228 | "Long Island": "LI",
229 | "Mangrove Cay": "MC",
230 | "Mayaguana": "MG",
231 | "Moores Island": "MI",
232 | "North Abaco": "NO",
233 | "North Andros": "NS",
234 | "North Eleuthera": "NE",
235 | "Ragged Island": "RI",
236 | "Rum Cay": "RC",
237 | "San Salvador": "SS",
238 | "South Abaco": "SO",
239 | "South Andros": "SA",
240 | "South Eleuthera": "SE",
241 | "Spanish Wells": "SW",
242 | "West Grand Bahama": "WG",
243 | },
244 | "BH": map[string]string{
245 | "Al Janūbīyah": "14",
246 | "Al Manāmah": "13",
247 | "Al Muḩarraq": "15",
248 | "Al Wusţá": "16",
249 | "Ash Shamālīyah": "17",
250 | },
251 | "BD": map[string]string{
252 | "Barisal": "A",
253 | "Chittagong": "B",
254 | "Dhaka": "C",
255 | "Khulna": "D",
256 | "Rajshahi": "E",
257 | "Rangpur": "F",
258 | "Sylhet": "G",
259 | },
260 | "BB": map[string]string{
261 | "Christ Church": "01",
262 | "Saint Andrew": "02",
263 | "Saint George": "03",
264 | "Saint James": "04",
265 | "Saint John": "05",
266 | "Saint Joseph": "06",
267 | "Saint Lucy": "07",
268 | "Saint Michael": "08",
269 | "Saint Peter": "09",
270 | "Saint Philip": "10",
271 | "Saint Thomas": "11",
272 | },
273 | "BY": map[string]string{
274 | "Brestskaya voblasts'": "BR",
275 | "Homyel'skaya voblasts'": "HO",
276 | "Horad Minsk": "HM",
277 | "Hrodzenskaya voblasts'": "HR",
278 | "Mahilyowskaya voblasts'": "MA",
279 | "Minskaya voblasts'": "MI",
280 | "Vitsyebskaya voblasts'": "VI",
281 | },
282 | "BE": map[string]string{
283 | "Brussels Hoofdstedelijk Gewest": "BRU",
284 | "Région Wallonne": "WAL",
285 | "Vlaams Gewest": "VLG",
286 | },
287 | "BZ": map[string]string{
288 | "Belize": "BZ",
289 | "Cayo": "CY",
290 | "Corozal": "CZL",
291 | "Orange Walk": "OW",
292 | "Stann Creek": "SC",
293 | "Toledo": "TOL",
294 | },
295 | "BJ": map[string]string{
296 | "Alibori": "AL",
297 | "Atakora": "AK",
298 | "Atlantique": "AQ",
299 | "Borgou": "BO",
300 | "Collines": "CO",
301 | "Donga": "DO",
302 | "Kouffo": "KO",
303 | "Littoral": "LI",
304 | "Mono": "MO",
305 | "Ouémé": "OU",
306 | "Plateau": "PL",
307 | "Zou": "ZO",
308 | },
309 | "BM": map[string]string{},
310 | "BT": map[string]string{
311 | "Bumthang": "33",
312 | "Chhukha": "12",
313 | "Dagana": "22",
314 | "Gasa": "GA",
315 | "Ha": "13",
316 | "Lhuentse": "44",
317 | "Monggar": "42",
318 | "Paro": "11",
319 | "Pemagatshel": "43",
320 | "Punakha": "23",
321 | "Samdrup Jongkha": "45",
322 | "Samtse": "14",
323 | "Sarpang": "31",
324 | "Thimphu": "15",
325 | "Trashi Yangtse": "TY",
326 | "Trashigang": "41",
327 | "Trongsa": "32",
328 | "Tsirang": "21",
329 | "Wangdue Phodrang": "24",
330 | "Zhemgang": "34",
331 | },
332 | "BO": map[string]string{
333 | "Chuquisaca": "H",
334 | "Cochabamba": "C",
335 | "El Beni": "B",
336 | "La Paz": "L",
337 | "Oruro": "O",
338 | "Pando": "N",
339 | "Potosí": "P",
340 | "Santa Cruz": "S",
341 | "Tarija": "T",
342 | },
343 | "BQ": map[string]string{},
344 | "BA": map[string]string{
345 | "Brčko distrikt": "BRC",
346 | "Federacija Bosna i Hercegovina": "BIH",
347 | "Republika Srpska": "SRP",
348 | },
349 | "BW": map[string]string{
350 | "Central": "CE",
351 | "Chobe": "CH",
352 | "Francistown": "FR",
353 | "Gaborone": "GA",
354 | "Ghanzi": "GH",
355 | "Jwaneng": "JW",
356 | "Kgalagadi": "KG",
357 | "Kgatleng": "KL",
358 | "Kweneng": "KW",
359 | "Lobatse": "LO",
360 | "North-East": "NE",
361 | "North-West": "NW",
362 | "Selibe Phikwe": "SP",
363 | "South-East": "SE",
364 | "Southern": "SO",
365 | "Sowa Town": "ST",
366 | },
367 | "BV": map[string]string{},
368 | "BR": map[string]string{
369 | "Acre": "AC",
370 | "Alagoas": "AL",
371 | "Amapá": "AP",
372 | "Amazonas": "AM",
373 | "Bahia": "BA",
374 | "Ceará": "CE",
375 | "Distrito Federal": "DF",
376 | "Espírito Santo": "ES",
377 | "Goiás": "GO",
378 | "Maranhão": "MA",
379 | "Mato Grosso": "MT",
380 | "Mato Grosso do Sul": "MS",
381 | "Minas Gerais": "MG",
382 | "Paraná": "PR",
383 | "Paraíba": "PB",
384 | "Pará": "PA",
385 | "Pernambuco": "PE",
386 | "Piauí": "PI",
387 | "Rio Grande do Norte": "RN",
388 | "Rio Grande do Sul": "RS",
389 | "Rio de Janeiro": "RJ",
390 | "Rondônia": "RO",
391 | "Roraima": "RR",
392 | "Santa Catarina": "SC",
393 | "Sergipe": "SE",
394 | "São Paulo": "SP",
395 | "Tocantins": "TO",
396 | },
397 | "IO": map[string]string{},
398 | "UM": map[string]string{
399 | "Baker Island": "81",
400 | "Howland Island": "84",
401 | "Jarvis Island": "86",
402 | "Johnston Atoll": "67",
403 | "Kingman Reef": "89",
404 | "Midway Islands": "71",
405 | "Navassa Island": "76",
406 | "Palmyra Atoll": "95",
407 | "Wake Island": "79",
408 | },
409 | "VG": map[string]string{},
410 | "VI": map[string]string{},
411 | "BN": map[string]string{
412 | "Belait": "BE",
413 | "Brunei-Muara": "BM",
414 | "Temburong": "TE",
415 | "Tutong": "TU",
416 | },
417 | "BG": map[string]string{
418 | "Blagoevgrad": "01",
419 | "Burgas": "02",
420 | "Dobrich": "08",
421 | "Gabrovo": "07",
422 | "Haskovo": "26",
423 | "Kardzhali": "09",
424 | "Kyustendil": "10",
425 | "Lovech": "11",
426 | "Montana": "12",
427 | "Pazardzhik": "13",
428 | "Pernik": "14",
429 | "Pleven": "15",
430 | "Plovdiv": "16",
431 | "Razgrad": "17",
432 | "Ruse": "18",
433 | "Shumen": "27",
434 | "Silistra": "19",
435 | "Sliven": "20",
436 | "Smolyan": "21",
437 | "Sofia": "23",
438 | "Sofia-Grad": "22",
439 | "Stara Zagora": "24",
440 | "Targovishte": "25",
441 | "Varna": "03",
442 | "Veliko Tarnovo": "04",
443 | "Vidin": "05",
444 | "Vratsa": "06",
445 | "Yambol": "28",
446 | },
447 | "BF": map[string]string{
448 | "Boucle du Mouhoun": "01",
449 | "Cascades": "02",
450 | "Centre": "03",
451 | "Centre-Est": "04",
452 | "Centre-Nord": "05",
453 | "Centre-Ouest": "06",
454 | "Centre-Sud": "07",
455 | "Est": "08",
456 | "Hauts-Bassins": "09",
457 | "Nord": "10",
458 | "Plateau-Central": "11",
459 | "Sahel": "12",
460 | "Sud-Ouest": "13",
461 | },
462 | "BI": map[string]string{
463 | "Bubanza": "BB",
464 | "Bujumbura Mairie": "BM",
465 | "Bujumbura Rural": "BL",
466 | "Bururi": "BR",
467 | "Cankuzo": "CA",
468 | "Cibitoke": "CI",
469 | "Gitega": "GI",
470 | "Karuzi": "KR",
471 | "Kayanza": "KY",
472 | "Kirundo": "KI",
473 | "Makamba": "MA",
474 | "Muramvya": "MU",
475 | "Muyinga": "MY",
476 | "Mwaro": "MW",
477 | "Ngozi": "NG",
478 | "Rutana": "RT",
479 | "Ruyigi": "RY",
480 | },
481 | "KH": map[string]string{
482 | "Baat Dambang": "2",
483 | "Banteay Mean Chey": "1",
484 | "Kampong Chaam": "3",
485 | "Kampong Chhnang": "4",
486 | "Kampong Spueu": "5",
487 | "Kampong Thum": "6",
488 | "Kampot": "7",
489 | "Kandaal": "8",
490 | "Kaoh Kong": "9",
491 | "Kracheh": "10",
492 | "Krong Kaeb": "23",
493 | "Krong Pailin": "24",
494 | "Krong Preah Sihanouk": "18",
495 | "Mondol Kiri": "11",
496 | "Otdar Mean Chey": "22",
497 | "Phnom Penh": "12",
498 | "Pousaat": "15",
499 | "Preah Vihear": "13",
500 | "Prey Veaeng": "14",
501 | "Rotanak Kiri": "16",
502 | "Siem Reab": "17",
503 | "Stueng Traeng": "19",
504 | "Svaay Rieng": "20",
505 | "Taakaev": "21",
506 | },
507 | "CM": map[string]string{
508 | "Adamaoua": "AD",
509 | "Centre": "CE",
510 | "East": "ES",
511 | "Far North": "EN",
512 | "Littoral": "LT",
513 | "North": "NO",
514 | "North-West": "NW",
515 | "South": "SU",
516 | "South-West": "SW",
517 | "West": "OU",
518 | },
519 | "CA": map[string]string{
520 | "Alberta": "AB",
521 | "British Columbia": "BC",
522 | "Manitoba": "MB",
523 | "New Brunswick": "NB",
524 | "Newfoundland and Labrador": "NL",
525 | "Nova Scotia": "NS",
526 | "Ontario": "ON",
527 | "Prince Edward Island": "PE",
528 | "Quebec": "QC",
529 | "Saskatchewan": "SK",
530 | "Northwest Territories": "NT",
531 | "Nunavut": "NU",
532 | "Yukon": "YT",
533 | },
534 | "CV": map[string]string{
535 | "Ilhas de Barlavento": "B",
536 | "Ilhas de Sotavento": "S",
537 | },
538 | "KY": map[string]string{},
539 | "CF": map[string]string{
540 | "Bamingui-Bangoran": "BB",
541 | "Bangui": "BGF",
542 | "Basse-Kotto": "BK",
543 | "Gribingui": "KB",
544 | "Haut-Mbomou": "HM",
545 | "Haute-Kotto": "HK",
546 | "Haute-Sangha / Mambéré-Kadéï": "HS",
547 | "Kémo-Gribingui": "KG",
548 | "Lobaye": "LB",
549 | "Mbomou": "MB",
550 | "Nana-Mambéré": "NM",
551 | "Ombella-Mpoko": "MP",
552 | "Ouaka": "UK",
553 | "Ouham": "AC",
554 | "Ouham-Pendé": "OP",
555 | "Sangha": "SE",
556 | "Vakaga": "VK",
557 | },
558 | "TD": map[string]string{
559 | "Al Baṭḩah": "BA",
560 | "Al Buḩayrah": "LC",
561 | "Baḩr al Ghazāl": "BG",
562 | "Būrkū": "BO",
563 | "Innīdī": "EN",
564 | "Kānim": "KA",
565 | "Lūqūn al Gharbī": "LO",
566 | "Lūqūn ash Sharqī": "LR",
567 | "Madīnat Injamīnā": "ND",
568 | "Māndūl": "MA",
569 | "Māyū Kībbī al Gharbī": "MO",
570 | "Māyū Kībbī ash Sharqī": "ME",
571 | "Qīrā": "GR",
572 | "Salāmāt": "SA",
573 | "Shārī Bāqirmī": "CB",
574 | "Shārī al Awsaṭ": "MC",
575 | "Sīlā": "SI",
576 | "Tibastī": "TI",
577 | "Tānjilī": "TA",
578 | "Waddāy": "OD",
579 | "Wādī Fīrā": "WF",
580 | "Ḥajjar Lamīs": "HL",
581 | },
582 | "CL": map[string]string{
583 | "Aisén del General Carlos Ibañez del Campo": "AI",
584 | "Antofagasta": "AN",
585 | "Araucanía": "AR",
586 | "Arica y Parinacota": "AP",
587 | "Atacama": "AT",
588 | "Bío-Bío": "BI",
589 | "Coquimbo": "CO",
590 | "Libertador General Bernardo O'Higgins": "LI",
591 | "Los Lagos": "LL",
592 | "Los Ríos": "LR",
593 | "Magallanes": "MA",
594 | "Maule": "ML",
595 | "Región Metropolitana de Santiago": "RM",
596 | "Tarapacá": "TA",
597 | "Valparaíso": "VS",
598 | },
599 | "CN": map[string]string{
600 | "Guangxi": "45",
601 | "Nei Mongol": "15",
602 | "Ningxia": "64",
603 | "Xinjiang": "65",
604 | "Xizang": "54",
605 | "Beijing": "11",
606 | "Chongqing": "50",
607 | "Shanghai": "31",
608 | "Tianjin": "12",
609 | "Anhui": "34",
610 | "Fujian": "35",
611 | "Gansu": "62",
612 | "Guangdong": "44",
613 | "Guizhou": "52",
614 | "Hainan": "46",
615 | "Hebei": "13",
616 | "Heilongjiang": "23",
617 | "Henan": "41",
618 | "Hubei": "42",
619 | "Hunan": "43",
620 | "Jiangsu": "32",
621 | "Jiangxi": "36",
622 | "Jilin": "22",
623 | "Liaoning": "21",
624 | "Qinghai": "63",
625 | "Shaanxi": "61",
626 | "Shandong": "37",
627 | "Shanxi": "14",
628 | "Sichuan": "51",
629 | "Taiwan": "71",
630 | "Yunnan": "53",
631 | "Zhejiang": "33",
632 | "Hong Kong": "91",
633 | "Macao": "92",
634 | "Hong Kong Island": "",
635 | "Kowloon": "KOWLOON",
636 | "New Territories": "NEW TERRITORIES",
637 | },
638 | "CX": map[string]string{},
639 | "CC": map[string]string{},
640 | "CO": map[string]string{
641 | "Amazonas": "AMA",
642 | "Antioquia": "ANT",
643 | "Arauca": "ARA",
644 | "Atlántico": "ATL",
645 | "Bolívar": "BOL",
646 | "Boyacá": "BOY",
647 | "Caldas": "CAL",
648 | "Caquetá": "CAQ",
649 | "Casanare": "CAS",
650 | "Cauca": "CAU",
651 | "Cesar": "CES",
652 | "Chocó": "CHO",
653 | "Cundinamarca": "CUN",
654 | "Córdoba": "COR",
655 | "Distrito Capital de Bogotá": "DC",
656 | "Guainía": "GUA",
657 | "Guaviare": "GUV",
658 | "Huila": "HUI",
659 | "La Guajira": "LAG",
660 | "Magdalena": "MAG",
661 | "Meta": "MET",
662 | "Nariño": "NAR",
663 | "Norte de Santander": "NSA",
664 | "Putumayo": "PUT",
665 | "Quindío": "QUI",
666 | "Risaralda": "RIS",
667 | "San Andrés, Providencia y Santa Catalina": "SAP",
668 | "Santander": "SAN",
669 | "Sucre": "SUC",
670 | "Tolima": "TOL",
671 | "Valle del Cauca": "VAC",
672 | "Vaupés": "VAU",
673 | "Vichada": "VID",
674 | },
675 | "KM": map[string]string{
676 | "Anjouan": "A",
677 | "Grande Comore": "G",
678 | "Mohéli": "M",
679 | },
680 | "CG": map[string]string{
681 | "Bouenza": "11",
682 | "Brazzaville": "BZV",
683 | "Cuvette": "8",
684 | "Cuvette-Ouest": "15",
685 | "Kouilou": "5",
686 | "Likouala": "7",
687 | "Lékoumou": "2",
688 | "Niari": "9",
689 | "Plateaux": "14",
690 | "Pointe-Noire": "16",
691 | "Pool": "12",
692 | "Sangha": "13",
693 | },
694 | "CD": map[string]string{
695 | "Bandundu": "BN",
696 | "Bas-Congo": "BC",
697 | "Kasai-Occidental": "KW",
698 | "Kasai-Oriental": "KE",
699 | "Katanga": "KA",
700 | "Kinshasa": "KN",
701 | "Maniema": "MA",
702 | "Nord-Kivu": "NK",
703 | "Orientale": "OR",
704 | "Sud-Kivu": "SK",
705 | "Équateur": "EQ",
706 | },
707 | "CK": map[string]string{},
708 | "CR": map[string]string{
709 | "Alajuela": "A",
710 | "Cartago": "C",
711 | "Guanacaste": "G",
712 | "Heredia": "H",
713 | "Limón": "L",
714 | "Puntarenas": "P",
715 | "San José": "SJ",
716 | },
717 | "HR": map[string]string{
718 | "Bjelovarsko-bilogorska županija": "07",
719 | "Brodsko-posavska županija": "12",
720 | "Dubrovačko-neretvanska županija": "19",
721 | "Grad Zagreb": "21",
722 | "Istarska županija": "18",
723 | "Karlovačka županija": "04",
724 | "Koprivničko-križevačka županija": "06",
725 | "Krapinsko-zagorska županija": "02",
726 | "Ličko-senjska županija": "09",
727 | "Međimurska županija": "20",
728 | "Osječko-baranjska županija": "14",
729 | "Požeško-slavonska županija": "11",
730 | "Primorsko-goranska županija": "08",
731 | "Sisačko-moslavačka županija": "03",
732 | "Splitsko-dalmatinska županija": "17",
733 | "Varaždinska županija": "05",
734 | "Virovitičko-podravska županija": "10",
735 | "Vukovarsko-srijemska županija": "16",
736 | "Zadarska županija": "13",
737 | "Zagrebačka županija": "01",
738 | "Šibensko-kninska županija": "15",
739 | },
740 | "CU": map[string]string{
741 | "Artemisa": "15",
742 | "Camagüey": "09",
743 | "Ciego de Ávila": "08",
744 | "Cienfuegos": "06",
745 | "Granma": "12",
746 | "Guantánamo": "14",
747 | "Holguín": "11",
748 | "Isla de la Juventud": "99",
749 | "La Habana": "03",
750 | "Las Tunas": "10",
751 | "Matanzas": "04",
752 | "Mayabeque": "16",
753 | "Pinar del Río": "01",
754 | "Sancti Spíritus": "07",
755 | "Santiago de Cuba": "13",
756 | "Villa Clara": "05",
757 | },
758 | "CW": map[string]string{},
759 | "CY": map[string]string{
760 | "Ammochostos": "04",
761 | "Keryneia": "06",
762 | "Larnaka": "03",
763 | "Lefkosia": "01",
764 | "Lemesos": "02",
765 | "Pafos": "05",
766 | },
767 | "CZ": map[string]string{
768 | "Jihomoravský kraj": "JM",
769 | "Jihočeský kraj": "JC",
770 | "Karlovarský kraj": "KA",
771 | "Královéhradecký kraj": "KR",
772 | "Liberecký kraj": "LI",
773 | "Moravskoslezský kraj": "MO",
774 | "Olomoucký kraj": "OL",
775 | "Pardubický kraj": "PA",
776 | "Plzeňský kraj": "PL",
777 | "Praha, hlavní město": "PR",
778 | "Středočeský kraj": "ST",
779 | "Vysočina": "VY",
780 | "Zlínský kraj": "ZL",
781 | "Ústecký kraj": "US",
782 | },
783 | "DK": map[string]string{
784 | "Hovedstaden": "84",
785 | "Midtjylland": "82",
786 | "Nordjylland": "81",
787 | "Sjælland": "85",
788 | "Syddanmark": "83",
789 | },
790 | "DJ": map[string]string{
791 | "Ali Sabieh": "AS",
792 | "Arta": "AR",
793 | "Dikhil": "DI",
794 | "Djibouti": "DJ",
795 | "Obock": "OB",
796 | "Tadjourah": "TA",
797 | },
798 | "DM": map[string]string{
799 | "Saint Andrew": "02",
800 | "Saint David": "03",
801 | "Saint George": "04",
802 | "Saint John": "05",
803 | "Saint Joseph": "06",
804 | "Saint Luke": "07",
805 | "Saint Mark": "08",
806 | "Saint Patrick": "09",
807 | "Saint Paul": "10",
808 | "Saint Peter": "11",
809 | },
810 | "DO": map[string]string{
811 | "Cibao Nordeste": "33",
812 | "Cibao Noroeste": "34",
813 | "Cibao Norte": "35",
814 | "Cibao Sur": "36",
815 | "El Valle": "37",
816 | "Enriquillo": "38",
817 | "Higuamo": "39",
818 | "Ozama": "40",
819 | "Valdesia": "41",
820 | "Yuma": "42",
821 | },
822 | "EC": map[string]string{
823 | "Azuay": "A",
824 | "Bolívar": "B",
825 | "Carchi": "C",
826 | "Cañar": "F",
827 | "Chimborazo": "H",
828 | "Cotopaxi": "X",
829 | "El Oro": "O",
830 | "Esmeraldas": "E",
831 | "Galápagos": "W",
832 | "Guayas": "G",
833 | "Imbabura": "I",
834 | "Loja": "L",
835 | "Los Ríos": "R",
836 | "Manabí": "M",
837 | "Morona-Santiago": "S",
838 | "Napo": "N",
839 | "Orellana": "D",
840 | "Pastaza": "Y",
841 | "Pichincha": "P",
842 | "Santa Elena": "SE",
843 | "Santo Domingo de los Tsáchilas": "SD",
844 | "Sucumbíos": "U",
845 | "Tungurahua": "T",
846 | "Zamora-Chinchipe": "Z",
847 | },
848 | "EG": map[string]string{
849 | "Ad Daqahlīyah": "DK",
850 | "Al Baḩr al Aḩmar": "BA",
851 | "Al Buḩayrah": "BH",
852 | "Al Fayyūm": "FYM",
853 | "Al Gharbīyah": "GH",
854 | "Al Iskandarīyah": "ALX",
855 | "Al Ismāٰīlīyah": "IS",
856 | "Al Jīzah": "GZ",
857 | "Al Minyā": "MN",
858 | "Al Minūfīyah": "MNF",
859 | "Al Qalyūbīyah": "KB",
860 | "Al Qāhirah": "C",
861 | "Al Uqşur": "LX",
862 | "Al Wādī al Jadīd": "WAD",
863 | "As Suways": "SUZ",
864 | "As Sādis min Uktūbar": "SU",
865 | "Ash Sharqīyah": "SHR",
866 | "Aswān": "ASN",
867 | "Asyūţ": "AST",
868 | "Banī Suwayf": "BNS",
869 | "Būr Saٰīd": "PTS",
870 | "Dumyāţ": "DT",
871 | "Janūb Sīnā'": "JS",
872 | "Kafr ash Shaykh": "KFS",
873 | "Maţrūḩ": "MT",
874 | "Qinā": "KN",
875 | "Shamāl Sīnā'": "SIN",
876 | "Sūhāj": "SHG",
877 | "Ḩulwān": "HU",
878 | },
879 | "SV": map[string]string{
880 | "Ahuachapán": "AH",
881 | "Cabañas": "CA",
882 | "Chalatenango": "CH",
883 | "Cuscatlán": "CU",
884 | "La Libertad": "LI",
885 | "La Paz": "PA",
886 | "La Unión": "UN",
887 | "Morazán": "MO",
888 | "San Miguel": "SM",
889 | "San Salvador": "SS",
890 | "San Vicente": "SV",
891 | "Santa Ana": "SA",
892 | "Sonsonate": "SO",
893 | "Usulután": "US",
894 | },
895 | "GQ": map[string]string{
896 | "Región Continental": "C",
897 | "Región Insular": "I",
898 | },
899 | "ER": map[string]string{
900 | "Al Awsaţ": "MA",
901 | "Al Janūbĩ": "DU",
902 | "Ansabā": "AN",
903 | "Janūbī al Baḩrī al Aḩmar": "DK",
904 | "Qāsh-Barkah": "GB",
905 | "Shimālī al Baḩrī al Aḩmar": "SK",
906 | },
907 | "EE": map[string]string{
908 | "Harjumaa": "37",
909 | "Hiiumaa": "39",
910 | "Ida-Virumaa": "44",
911 | "Järvamaa": "51",
912 | "Jõgevamaa": "49",
913 | "Lääne-Virumaa": "59",
914 | "Läänemaa": "57",
915 | "Pärnumaa": "67",
916 | "Põlvamaa": "65",
917 | "Raplamaa": "70",
918 | "Saaremaa": "74",
919 | "Tartumaa": "78",
920 | "Valgamaa": "82",
921 | "Viljandimaa": "84",
922 | "Võrumaa": "86",
923 | },
924 | "ET": map[string]string{
925 | "Bīnshangul Gumuz": "BE",
926 | "Dirē Dawa": "DD",
927 | "Gambēla Hizboch": "GA",
928 | "Hārerī Hizb": "HA",
929 | "Oromīya": "OR",
930 | "Sumalē": "SO",
931 | "Tigray": "TI",
932 | "YeDebub Bihēroch Bihēreseboch na Hizboch": "SN",
933 | "Ādīs Ābeba": "AA",
934 | "Āfar": "AF",
935 | "Āmara": "AM",
936 | },
937 | "FK": map[string]string{},
938 | "FO": map[string]string{},
939 | "FJ": map[string]string{
940 | "Central": "C",
941 | "Eastern": "E",
942 | "Northern": "N",
943 | "Rotuma": "R",
944 | "Western": "W",
945 | },
946 | "FI": map[string]string{
947 | "Ahvenanmaan maakunta": "01",
948 | "Etelä-Karjala": "02",
949 | "Etelä-Pohjanmaa": "03",
950 | "Etelä-Savo": "04",
951 | "Kainuu": "05",
952 | "Kanta-Häme": "06",
953 | "Keski-Pohjanmaa": "07",
954 | "Keski-Suomi": "08",
955 | "Kymenlaakso": "09",
956 | "Lappi": "10",
957 | "Pirkanmaa": "11",
958 | "Pohjanmaa": "12",
959 | "Pohjois-Karjala": "13",
960 | "Pohjois-Pohjanmaa": "14",
961 | "Pohjois-Savo": "15",
962 | "Päijät-Häme": "16",
963 | "Satakunta": "17",
964 | "Uusimaa": "18",
965 | "Varsinais-Suomi": "19",
966 | },
967 | "FR": map[string]string{
968 | "Alsace": "A",
969 | "Aquitaine": "B",
970 | "Auvergne": "C",
971 | "Brittany": "E",
972 | "Burgundy": "D",
973 | "Centre-Val de Loire": "F",
974 | "Champagne-Ardenne": "G",
975 | "Corsica": "H",
976 | "Franche-Comté": "I",
977 | "Languedoc-Roussillon": "K",
978 | "Limousin": "L",
979 | "Lorraine": "M",
980 | "Lower Normandy": "P",
981 | "Midi-Pyrénées": "N",
982 | "Nord-Pas-de-Calais": "O",
983 | "Pays de la Loire": "R",
984 | "Picardy": "S",
985 | "Poitou-Charentes": "T",
986 | "Provence-Alpes-Côte d'Azur": "U",
987 | "Rhône-Alpes": "V",
988 | "Upper Normandy": "Q",
989 | "Île-de-France": "J",
990 | },
991 | "GF": map[string]string{},
992 | "PF": map[string]string{},
993 | "TF": map[string]string{},
994 | "GA": map[string]string{
995 | "Estuaire": "1",
996 | "Haut-Ogooué": "2",
997 | "Moyen-Ogooué": "3",
998 | "Ngounié": "4",
999 | "Nyanga": "5",
1000 | "Ogooué-Ivindo": "6",
1001 | "Ogooué-Lolo": "7",
1002 | "Ogooué-Maritime": "8",
1003 | "Woleu-Ntem": "9",
1004 | },
1005 | "GM": map[string]string{
1006 | "Banjul": "B",
1007 | "Central River": "M",
1008 | "Lower River": "L",
1009 | "North Bank": "N",
1010 | "Upper River": "U",
1011 | "Western": "W",
1012 | },
1013 | "GE": map[string]string{
1014 | "Abkhazia": "AB",
1015 | "Ajaria": "AJ",
1016 | "Guria": "GU",
1017 | "Imereti": "IM",
1018 | "K'akheti": "KA",
1019 | "Kvemo Kartli": "KK",
1020 | "Mtskheta-Mtianeti": "MM",
1021 | "Rach'a-Lechkhumi-Kvemo Svaneti": "RL",
1022 | "Samegrelo-Zemo Svaneti": "SZ",
1023 | "Samtskhe-Javakheti": "SJ",
1024 | "Shida Kartli": "SK",
1025 | "Tbilisi": "TB",
1026 | },
1027 | "DE": map[string]string{
1028 | "Baden-Württemberg": "BW",
1029 | "Bayern": "BY",
1030 | "Berlin": "BE",
1031 | "Brandenburg": "BB",
1032 | "Bremen": "HB",
1033 | "Hamburg": "HH",
1034 | "Hessen": "HE",
1035 | "Mecklenburg-Vorpommern": "MV",
1036 | "Niedersachsen": "NI",
1037 | "Nordrhein-Westfalen": "NW",
1038 | "Rheinland-Pfalz": "RP",
1039 | "Saarland": "SL",
1040 | "Sachsen": "SN",
1041 | "Sachsen-Anhalt": "ST",
1042 | "Schleswig-Holstein": "SH",
1043 | "Thüringen": "TH",
1044 | },
1045 | "GH": map[string]string{
1046 | "Ashanti": "AH",
1047 | "Brong-Ahafo": "BA",
1048 | "Central": "CP",
1049 | "Eastern": "EP",
1050 | "Greater Accra": "AA",
1051 | "Northern": "NP",
1052 | "Upper East": "UE",
1053 | "Upper West": "UW",
1054 | "Volta": "TV",
1055 | "Western": "WP",
1056 | },
1057 | "GI": map[string]string{},
1058 | "GR": map[string]string{
1059 | "Anatoliki Makedonia kai Thraki": "A",
1060 | "Attiki": "I",
1061 | "Dytiki Ellada": "G",
1062 | "Dytiki Makedonia": "C",
1063 | "Ionia Nisia": "F",
1064 | "Ipeiros": "D",
1065 | "Kentriki Makedonia": "B",
1066 | "Kriti": "M",
1067 | "Notio Aigaio": "L",
1068 | "Peloponnisos": "J",
1069 | "Sterea Ellada": "H",
1070 | "Thessalia": "E",
1071 | "Voreio Aigaio": "K",
1072 | },
1073 | "GL": map[string]string{
1074 | "Kommune Kujalleq": "KU",
1075 | "Kommuneqarfik Sermersooq": "SM",
1076 | "Qaasuitsup Kommunia": "QA",
1077 | "Qeqqata Kommunia": "QE",
1078 | },
1079 | "GD": map[string]string{
1080 | "Saint Andrew": "01",
1081 | "Saint David": "02",
1082 | "Saint George": "03",
1083 | "Saint John": "04",
1084 | "Saint Mark": "05",
1085 | "Saint Patrick": "06",
1086 | "Southern Grenadine Islands": "10",
1087 | },
1088 | "GP": map[string]string{},
1089 | "GU": map[string]string{},
1090 | "GT": map[string]string{
1091 | "Alta Verapaz": "AV",
1092 | "Baja Verapaz": "BV",
1093 | "Chimaltenango": "CM",
1094 | "Chiquimula": "CQ",
1095 | "El Progreso": "PR",
1096 | "Escuintla": "ES",
1097 | "Guatemala": "GU",
1098 | "Huehuetenango": "HU",
1099 | "Izabal": "IZ",
1100 | "Jalapa": "JA",
1101 | "Jutiapa": "JU",
1102 | "Petén": "PE",
1103 | "Quetzaltenango": "QZ",
1104 | "Quiché": "QC",
1105 | "Retalhuleu": "RE",
1106 | "Sacatepéquez": "SA",
1107 | "San Marcos": "SM",
1108 | "Santa Rosa": "SR",
1109 | "Sololá": "SO",
1110 | "Suchitepéquez": "SU",
1111 | "Totonicapán": "TO",
1112 | "Zacapa": "ZA",
1113 | },
1114 | "GG": map[string]string{},
1115 | "GN": map[string]string{
1116 | "Boké": "B",
1117 | "Conakry": "C",
1118 | "Faranah": "F",
1119 | "Kankan": "K",
1120 | "Kindia": "D",
1121 | "Labé": "L",
1122 | "Mamou": "M",
1123 | "Nzérékoré": "N",
1124 | },
1125 | "GW": map[string]string{
1126 | "Leste": "L",
1127 | "Norte": "N",
1128 | "Sul": "S",
1129 | },
1130 | "GY": map[string]string{
1131 | "Barima-Waini": "BA",
1132 | "Cuyuni-Mazaruni": "CU",
1133 | "Demerara-Mahaica": "DE",
1134 | "East Berbice-Corentyne": "EB",
1135 | "Essequibo Islands-West Demerara": "ES",
1136 | "Mahaica-Berbice": "MA",
1137 | "Pomeroon-Supenaam": "PM",
1138 | "Potaro-Siparuni": "PT",
1139 | "Upper Demerara-Berbice": "UD",
1140 | "Upper Takutu-Upper Essequibo": "UT",
1141 | },
1142 | "HT": map[string]string{
1143 | "Artibonite": "AR",
1144 | "Centre": "CE",
1145 | "Grande-Anse": "GA",
1146 | "Nippes": "NI",
1147 | "Nord": "ND",
1148 | "Nord-Est": "NE",
1149 | "Nord-Ouest": "NO",
1150 | "Ouest": "OU",
1151 | "Sud": "SD",
1152 | "Sud-Est": "SE",
1153 | },
1154 | "HM": map[string]string{},
1155 | "VA": map[string]string{},
1156 | "HN": map[string]string{
1157 | "Atlántida": "AT",
1158 | "Choluteca": "CH",
1159 | "Colón": "CL",
1160 | "Comayagua": "CM",
1161 | "Copán": "CP",
1162 | "Cortés": "CR",
1163 | "El Paraíso": "EP",
1164 | "Francisco Morazán": "FM",
1165 | "Gracias a Dios": "GD",
1166 | "Intibucá": "IN",
1167 | "Islas de la Bahía": "IB",
1168 | "La Paz": "LP",
1169 | "Lempira": "LE",
1170 | "Ocotepeque": "OC",
1171 | "Olancho": "OL",
1172 | "Santa Bárbara": "SB",
1173 | "Valle": "VA",
1174 | "Yoro": "YO",
1175 | },
1176 | "HK": map[string]string{},
1177 | "HU": map[string]string{
1178 | "Baranya": "BA",
1179 | "Borsod-Abaúj-Zemplén": "BZ",
1180 | "Budapest": "BU",
1181 | "Bács-Kiskun": "BK",
1182 | "Békés": "BE",
1183 | "Békéscsaba": "BC",
1184 | "Csongrád": "CS",
1185 | "Debrecen": "DE",
1186 | "Dunaújváros": "DU",
1187 | "Eger": "EG",
1188 | "Fejér": "FE",
1189 | "Győr": "GY",
1190 | "Győr-Moson-Sopron": "GS",
1191 | "Hajdú-Bihar": "HB",
1192 | "Heves": "HE",
1193 | "Hódmezővásárhely": "HV",
1194 | "Jász-Nagykun-Szolnok": "JN",
1195 | "Kaposvár": "KV",
1196 | "Kecskemét": "KM",
1197 | "Komárom-Esztergom": "KE",
1198 | "Miskolc": "MI",
1199 | "Nagykanizsa": "NK",
1200 | "Nyíregyháza": "NY",
1201 | "Nógrád": "NO",
1202 | "Pest": "PE",
1203 | "Pécs": "PS",
1204 | "Salgótarján": "ST",
1205 | "Somogy": "SO",
1206 | "Sopron": "SN",
1207 | "Szabolcs-Szatmár-Bereg": "SZ",
1208 | "Szeged": "SD",
1209 | "Szekszárd": "SS",
1210 | "Szolnok": "SK",
1211 | "Szombathely": "SH",
1212 | "Székesfehérvár": "SF",
1213 | "Tatabánya": "TB",
1214 | "Tolna": "TO",
1215 | "Vas": "VA",
1216 | "Veszprém": "VM",
1217 | "Zala": "ZA",
1218 | "Zalaegerszeg": "ZE",
1219 | "Érd": "ER",
1220 | },
1221 | "IS": map[string]string{
1222 | "Austurland": "7",
1223 | "Höfuðborgarsvæði utan Reykjavíkur": "1",
1224 | "Norðurland eystra": "6",
1225 | "Norðurland vestra": "5",
1226 | "Reykjavík": "0",
1227 | "Suðurland": "8",
1228 | "Suðurnes": "2",
1229 | "Vestfirðir": "4",
1230 | "Vesturland": "3",
1231 | },
1232 | "IN": map[string]string{
1233 | "Andaman and Nicobar Islands": "AN",
1234 | "Chandigarh": "CH",
1235 | "Dadra and Nagar Haveli": "DN",
1236 | "Daman and Diu": "DD",
1237 | "Delhi": "DL",
1238 | "Lakshadweep": "LD",
1239 | "Puducherry": "PY",
1240 | "Andhra Pradesh": "AP",
1241 | "Arunachal Pradesh": "AR",
1242 | "Assam": "AS",
1243 | "Bihar": "BR",
1244 | "Chhattisgarh": "CT",
1245 | "Goa": "GA",
1246 | "Gujarat": "GJ",
1247 | "Haryana": "HR",
1248 | "Himachal Pradesh": "HP",
1249 | "Jammu and Kashmir": "JK",
1250 | "Jharkhand": "JH",
1251 | "Karnataka": "KA",
1252 | "Kerala": "KL",
1253 | "Madhya Pradesh": "MP",
1254 | "Maharashtra": "MH",
1255 | "Manipur": "MN",
1256 | "Meghalaya": "ML",
1257 | "Mizoram": "MZ",
1258 | "Nagaland": "NL",
1259 | "Odisha": "OR",
1260 | "Punjab": "PB",
1261 | "Rajasthan": "RJ",
1262 | "Sikkim": "SK",
1263 | "Tamil Nadu": "TN",
1264 | "Telangana": "TG",
1265 | "Tripura": "TR",
1266 | "Uttar Pradesh": "UP",
1267 | "Uttarakhand": "UT",
1268 | "West Bengal": "WB",
1269 | },
1270 | "ID": map[string]string{
1271 | "Jawa": "JW",
1272 | "Kalimantan": "KA",
1273 | "Maluku": "ML",
1274 | "Nusa Tenggara": "NU",
1275 | "Papua": "PP",
1276 | "Sulawesi": "SL",
1277 | "Sumatera": "SM",
1278 | },
1279 | "CI": map[string]string{
1280 | "18 Montagnes": "06",
1281 | "Agnébi": "16",
1282 | "Bafing": "17",
1283 | "Bas-Sassandra": "09",
1284 | "Denguélé": "10",
1285 | "Fromager": "18",
1286 | "Haut-Sassandra": "02",
1287 | "Lacs": "07",
1288 | "Lagunes": "01",
1289 | "Marahoué": "12",
1290 | "Moyen-Cavally": "19",
1291 | "Moyen-Comoé": "05",
1292 | "Nzi-Comoé": "11",
1293 | "Savanes": "03",
1294 | "Sud-Bandama": "15",
1295 | "Sud-Comoé": "13",
1296 | "Vallée du Bandama": "04",
1297 | "Worodougou": "14",
1298 | "Zanzan": "08",
1299 | },
1300 | "IR": map[string]string{
1301 | "Alborz": "32",
1302 | "Ardabīl": "03",
1303 | "Būshehr": "06",
1304 | "Chahār Maḩāll va Bakhtīārī": "08",
1305 | "Eşfahān": "04",
1306 | "Fārs": "14",
1307 | "Golestān": "27",
1308 | "Gīlān": "19",
1309 | "Hamadān": "24",
1310 | "Hormozgān": "23",
1311 | "Kermān": "15",
1312 | "Kermānshāh": "17",
1313 | "Khorāsān-e Janūbī": "29",
1314 | "Khorāsān-e Razavī": "30",
1315 | "Khorāsān-e Shemālī": "31",
1316 | "Khūzestān": "10",
1317 | "Kohgīlūyeh va Būyer Aḩmad": "18",
1318 | "Kordestān": "16",
1319 | "Lorestān": "20",
1320 | "Markazī": "22",
1321 | "Māzandarān": "21",
1322 | "Qazvīn": "28",
1323 | "Qom": "26",
1324 | "Semnān": "12",
1325 | "Sīstān va Balūchestān": "13",
1326 | "Tehrān": "07",
1327 | "Yazd": "25",
1328 | "Zanjān": "11",
1329 | "Āz̄arbāyjān-e Gharbī": "02",
1330 | "Āz̄arbāyjān-e Sharqī": "01",
1331 | "Īlām": "05",
1332 | },
1333 | "IQ": map[string]string{
1334 | "Al Anbār": "AN",
1335 | "Al Başrah": "BA",
1336 | "Al Muthanná": "MU",
1337 | "Al Qādisīyah": "QA",
1338 | "An Najaf": "NA",
1339 | "Arbīl": "AR",
1340 | "As Sulaymānīyah": "SU",
1341 | "At Ta'mīm": "TS",
1342 | "Baghdād": "BG",
1343 | "Bābil": "BB",
1344 | "Dahūk": "DA",
1345 | "Dhī Qār": "DQ",
1346 | "Diyālá": "DI",
1347 | "Karbalā'": "KA",
1348 | "Maysān": "MA",
1349 | "Nīnawá": "NI",
1350 | "Wāsiţ": "WA",
1351 | "Şalāḩ ad Dīn": "SD",
1352 | },
1353 | "IE": map[string]string{
1354 | "Connaught": "C",
1355 | "Leinster": "L",
1356 | "Munster": "M",
1357 | "Ulster": "U",
1358 | },
1359 | "IM": map[string]string{},
1360 | "IL": map[string]string{
1361 | "HaDarom": "D",
1362 | "HaMerkaz": "M",
1363 | "HaTsafon": "Z",
1364 | "H̱efa": "HA",
1365 | "Tel-Aviv": "TA",
1366 | "Yerushalayim": "JM",
1367 | },
1368 | "IT": map[string]string{
1369 | "Abruzzo": "65",
1370 | "Basilicata": "77",
1371 | "Calabria": "78",
1372 | "Campania": "72",
1373 | "Emilia-Romagna": "45",
1374 | "Friuli-Venezia Giulia": "36",
1375 | "Lazio": "62",
1376 | "Liguria": "42",
1377 | "Lombardia": "25",
1378 | "Marche": "57",
1379 | "Molise": "67",
1380 | "Piemonte": "21",
1381 | "Puglia": "75",
1382 | "Sardegna": "88",
1383 | "Sicilia": "82",
1384 | "Toscana": "52",
1385 | "Trentino-Alto Adige": "32",
1386 | "Umbria": "55",
1387 | "Valle d'Aosta": "23",
1388 | "Veneto": "34",
1389 | },
1390 | "JM": map[string]string{
1391 | "Clarendon": "13",
1392 | "Hanover": "09",
1393 | "Kingston": "01",
1394 | "Manchester": "12",
1395 | "Portland": "04",
1396 | "Saint Andrew": "02",
1397 | "Saint Ann": "06",
1398 | "Saint Catherine": "14",
1399 | "Saint Elizabeth": "11",
1400 | "Saint James": "08",
1401 | "Saint Mary": "05",
1402 | "Saint Thomas": "03",
1403 | "Trelawny": "07",
1404 | "Westmoreland": "10",
1405 | },
1406 | "JP": map[string]string{
1407 | "Aiti": "23",
1408 | "Akita": "05",
1409 | "Aomori": "02",
1410 | "Ehime": "38",
1411 | "Gihu": "21",
1412 | "Gunma": "10",
1413 | "Hirosima": "34",
1414 | "Hokkaidô": "01",
1415 | "Hukui": "18",
1416 | "Hukuoka": "40",
1417 | "Hukusima": "07",
1418 | "Hyôgo": "28",
1419 | "Ibaraki": "08",
1420 | "Isikawa": "17",
1421 | "Iwate": "03",
1422 | "Kagawa": "37",
1423 | "Kagosima": "46",
1424 | "Kanagawa": "14",
1425 | "Kumamoto": "43",
1426 | "Kyôto": "26",
1427 | "Kôti": "39",
1428 | "Mie": "24",
1429 | "Miyagi": "04",
1430 | "Miyazaki": "45",
1431 | "Nagano": "20",
1432 | "Nagasaki": "42",
1433 | "Nara": "29",
1434 | "Niigata": "15",
1435 | "Okayama": "33",
1436 | "Okinawa": "47",
1437 | "Saga": "41",
1438 | "Saitama": "11",
1439 | "Siga": "25",
1440 | "Simane": "32",
1441 | "Sizuoka": "22",
1442 | "Tiba": "12",
1443 | "Tokusima": "36",
1444 | "Totigi": "09",
1445 | "Tottori": "31",
1446 | "Toyama": "16",
1447 | "Tôkyô": "13",
1448 | "Wakayama": "30",
1449 | "Yamagata": "06",
1450 | "Yamaguti": "35",
1451 | "Yamanasi": "19",
1452 | "Ôita": "44",
1453 | "Ôsaka": "27",
1454 | },
1455 | "JE": map[string]string{},
1456 | "JO": map[string]string{
1457 | "Al Balqā'": "BA",
1458 | "Al ʽAqabah": "AQ",
1459 | "Az Zarqā'": "AZ",
1460 | "Aţ Ţafīlah": "AT",
1461 | "Irbid": "IR",
1462 | "Jerash": "JA",
1463 | "Karak": "KA",
1464 | "Ma'ān": "MN",
1465 | "Mafraq": "MA",
1466 | "Mādabā": "MD",
1467 | "ʽAjlūn": "AJ",
1468 | "‘Ammān": "AM",
1469 | },
1470 | "KZ": map[string]string{
1471 | "Almaty": "ALA",
1472 | "Almaty oblysy": "ALM",
1473 | "Aqmola oblysy": "AKM",
1474 | "Aqtöbe oblysy": "AKT",
1475 | "Astana": "AST",
1476 | "Atyraū oblysy": "ATY",
1477 | "Batys Qazaqstan oblysy": "ZAP",
1478 | "Mangghystaū oblysy": "MAN",
1479 | "Ongtüstik Qazaqstan oblysy": "YUZ",
1480 | "Pavlodar oblysy": "PAV",
1481 | "Qaraghandy oblysy": "KAR",
1482 | "Qostanay oblysy": "KUS",
1483 | "Qyzylorda oblysy": "KZY",
1484 | "Shyghys Qazaqstan oblysy": "VOS",
1485 | "Soltüstik Qazaqstan oblysy": "SEV",
1486 | "Zhambyl oblysy": "ZHA",
1487 | },
1488 | "KE": map[string]string{
1489 | "Central": "200",
1490 | "Coast": "300",
1491 | "Eastern": "400",
1492 | "Nairobi": "110",
1493 | "North-Eastern": "500",
1494 | "Nyanza": "600",
1495 | "Rift Valley": "700",
1496 | "Western": "800",
1497 | },
1498 | "KI": map[string]string{
1499 | "Gilbert Islands": "G",
1500 | "Line Islands": "L",
1501 | "Phoenix Islands": "P",
1502 | },
1503 | "KW": map[string]string{
1504 | "Al Aḩmadi": "AH",
1505 | "Al Farwānīyah": "FA",
1506 | "Al Jahrā’": "JA",
1507 | "Al Kuwayt": "KU",
1508 | "Mubārak al Kabīr": "MU",
1509 | "Ḩawallī": "HA",
1510 | },
1511 | "KG": map[string]string{
1512 | "Batken": "B",
1513 | "Bishkek": "GB",
1514 | "Chü": "C",
1515 | "Jalal-Abad": "J",
1516 | "Naryn": "N",
1517 | "Osh": "O",
1518 | "Talas": "T",
1519 | "Ysyk-Köl": "Y",
1520 | },
1521 | "LA": map[string]string{
1522 | "Attapu": "AT",
1523 | "Bokèo": "BK",
1524 | "Bolikhamxai": "BL",
1525 | "Champasak": "CH",
1526 | "Houaphan": "HO",
1527 | "Khammouan": "KH",
1528 | "Louang Namtha": "LM",
1529 | "Louangphabang": "LP",
1530 | "Oudômxai": "OU",
1531 | "Phôngsali": "PH",
1532 | "Salavan": "SL",
1533 | "Savannakhét": "SV",
1534 | "Vientiane": "VI",
1535 | "Xaignabouli": "XA",
1536 | "Xaisômboun": "XN",
1537 | "Xiangkhoang": "XI",
1538 | "Xékong": "XE",
1539 | },
1540 | "LV": map[string]string{
1541 | "Aglonas novads": "001",
1542 | "Aizkraukles novads": "002",
1543 | "Aizputes novads": "003",
1544 | "Aknīstes novads": "004",
1545 | "Alojas novads": "005",
1546 | "Alsungas novads": "006",
1547 | "Alūksnes novads": "007",
1548 | "Amatas novads": "008",
1549 | "Apes novads": "009",
1550 | "Auces novads": "010",
1551 | "Babītes novads": "012",
1552 | "Baldones novads": "013",
1553 | "Baltinavas novads": "014",
1554 | "Balvu novads": "015",
1555 | "Bauskas novads": "016",
1556 | "Beverīnas novads": "017",
1557 | "Brocēnu novads": "018",
1558 | "Burtnieku novads": "019",
1559 | "Carnikavas novads": "020",
1560 | "Cesvaines novads": "021",
1561 | "Ciblas novads": "023",
1562 | "Cēsu novads": "022",
1563 | "Dagdas novads": "024",
1564 | "Daugavpils": "DGV",
1565 | "Daugavpils novads": "025",
1566 | "Dobeles novads": "026",
1567 | "Dundagas novads": "027",
1568 | "Durbes novads": "028",
1569 | "Engures novads": "029",
1570 | "Garkalnes novads": "031",
1571 | "Grobiņas novads": "032",
1572 | "Gulbenes novads": "033",
1573 | "Iecavas novads": "034",
1574 | "Ikšķiles novads": "035",
1575 | "Ilūkstes novads": "036",
1576 | "Inčukalna novads": "037",
1577 | "Jaunjelgavas novads": "038",
1578 | "Jaunpiebalgas novads": "039",
1579 | "Jaunpils novads": "040",
1580 | "Jelgava": "JEL",
1581 | "Jelgavas novads": "041",
1582 | "Jēkabpils": "JKB",
1583 | "Jēkabpils novads": "042",
1584 | "Jūrmala": "JUR",
1585 | "Kandavas novads": "043",
1586 | "Kocēnu novads": "045",
1587 | "Kokneses novads": "046",
1588 | "Krimuldas novads": "048",
1589 | "Krustpils novads": "049",
1590 | "Krāslavas novads": "047",
1591 | "Kuldīgas novads": "050",
1592 | "Kārsavas novads": "044",
1593 | "Lielvārdes novads": "053",
1594 | "Liepāja": "LPX",
1595 | "Limbažu novads": "054",
1596 | "Lubānas novads": "057",
1597 | "Ludzas novads": "058",
1598 | "Līgatnes novads": "055",
1599 | "Līvānu novads": "056",
1600 | "Madonas novads": "059",
1601 | "Mazsalacas novads": "060",
1602 | "Mālpils novads": "061",
1603 | "Mārupes novads": "062",
1604 | "Mērsraga novads": "063",
1605 | "Naukšēnu novads": "064",
1606 | "Neretas novads": "065",
1607 | "Nīcas novads": "066",
1608 | "Ogres novads": "067",
1609 | "Olaines novads": "068",
1610 | "Ozolnieku novads": "069",
1611 | "Preiļu novads": "073",
1612 | "Priekules novads": "074",
1613 | "Priekuļu novads": "075",
1614 | "Pārgaujas novads": "070",
1615 | "Pāvilostas novads": "071",
1616 | "Pļaviņu novads": "072",
1617 | "Raunas novads": "076",
1618 | "Riebiņu novads": "078",
1619 | "Rojas novads": "079",
1620 | "Ropažu novads": "080",
1621 | "Rucavas novads": "081",
1622 | "Rugāju novads": "082",
1623 | "Rundāles novads": "083",
1624 | "Rēzekne": "REZ",
1625 | "Rēzeknes novads": "077",
1626 | "Rīga": "RIX",
1627 | "Rūjienas novads": "084",
1628 | "Salacgrīvas novads": "086",
1629 | "Salas novads": "085",
1630 | "Salaspils novads": "087",
1631 | "Saldus novads": "088",
1632 | "Saulkrastu novads": "089",
1633 | "Siguldas novads": "091",
1634 | "Skrundas novads": "093",
1635 | "Skrīveru novads": "092",
1636 | "Smiltenes novads": "094",
1637 | "Stopiņu novads": "095",
1638 | "Strenču novads": "096",
1639 | "Sējas novads": "090",
1640 | "Talsu novads": "097",
1641 | "Tukuma novads": "099",
1642 | "Tērvetes novads": "098",
1643 | "Vaiņodes novads": "100",
1644 | "Valkas novads": "101",
1645 | "Valmiera": "VMR",
1646 | "Varakļānu novads": "102",
1647 | "Vecpiebalgas novads": "104",
1648 | "Vecumnieku novads": "105",
1649 | "Ventspils": "VEN",
1650 | "Ventspils novads": "106",
1651 | "Viesītes novads": "107",
1652 | "Viļakas novads": "108",
1653 | "Viļānu novads": "109",
1654 | "Vārkavas novads": "103",
1655 | "Zilupes novads": "110",
1656 | "Ādažu novads": "011",
1657 | "Ērgļu novads": "030",
1658 | "Ķeguma novads": "051",
1659 | "Ķekavas novads": "052",
1660 | },
1661 | "LB": map[string]string{
1662 | "Aakkâr": "AK",
1663 | "Baalbek-Hermel": "BH",
1664 | "Beyrouth": "BA",
1665 | "Béqaa": "BI",
1666 | "Liban-Nord": "AS",
1667 | "Liban-Sud": "JA",
1668 | "Mont-Liban": "JL",
1669 | "Nabatîyé": "NA",
1670 | },
1671 | "LS": map[string]string{
1672 | "Berea": "D",
1673 | "Butha-Buthe": "B",
1674 | "Leribe": "C",
1675 | "Mafeteng": "E",
1676 | "Maseru": "A",
1677 | "Mohale's Hoek": "F",
1678 | "Mokhotlong": "J",
1679 | "Qacha's Nek": "H",
1680 | "Quthing": "G",
1681 | "Thaba-Tseka": "K",
1682 | },
1683 | "LR": map[string]string{
1684 | "Bomi": "BM",
1685 | "Bong": "BG",
1686 | "Gbarpolu": "GP",
1687 | "Grand Bassa": "GB",
1688 | "Grand Cape Mount": "CM",
1689 | "Grand Gedeh": "GG",
1690 | "Grand Kru": "GK",
1691 | "Lofa": "LO",
1692 | "Margibi": "MG",
1693 | "Maryland": "MY",
1694 | "Montserrado": "MO",
1695 | "Nimba": "NI",
1696 | "River Gee": "RG",
1697 | "Rivercess": "RI",
1698 | "Sinoe": "SI",
1699 | },
1700 | "LY": map[string]string{
1701 | "Al Buţnān": "BU",
1702 | "Al Jabal al Akhḑar": "JA",
1703 | "Al Jabal al Gharbī": "JG",
1704 | "Al Jifārah": "JI",
1705 | "Al Jufrah": "JU",
1706 | "Al Kufrah": "KF",
1707 | "Al Marj": "MJ",
1708 | "Al Marqab": "MB",
1709 | "Al Wāḩāt": "WA",
1710 | "An Nuqaţ al Khams": "NQ",
1711 | "Az Zāwiyah": "ZA",
1712 | "Banghāzī": "BA",
1713 | "Darnah": "DR",
1714 | "Ghāt": "GT",
1715 | "Mişrātah": "MI",
1716 | "Murzuq": "MQ",
1717 | "Nālūt": "NL",
1718 | "Sabhā": "SB",
1719 | "Surt": "SR",
1720 | "Wādī al Ḩayāt": "WD",
1721 | "Wādī ash Shāţiʾ": "WS",
1722 | "Ţarābulus": "TB",
1723 | },
1724 | "LI": map[string]string{
1725 | "Balzers": "01",
1726 | "Eschen": "02",
1727 | "Gamprin": "03",
1728 | "Mauren": "04",
1729 | "Planken": "05",
1730 | "Ruggell": "06",
1731 | "Schaan": "07",
1732 | "Schellenberg": "08",
1733 | "Triesen": "09",
1734 | "Triesenberg": "10",
1735 | "Vaduz": "11",
1736 | },
1737 | "LT": map[string]string{
1738 | "Alytaus Apskritis": "AL",
1739 | "Kauno Apskritis": "KU",
1740 | "Klaipėdos Apskritis": "KL",
1741 | "Marijampolės Apskritis": "MR",
1742 | "Panevėžio Apskritis": "PN",
1743 | "Tauragės Apskritis": "TA",
1744 | "Telšių Apskritis": "TE",
1745 | "Utenos Apskritis": "UT",
1746 | "Vilniaus Apskritis": "VL",
1747 | "Šiaulių Apskritis": "SA",
1748 | },
1749 | "LU": map[string]string{
1750 | "Diekirch": "D",
1751 | "Grevenmacher": "G",
1752 | "Luxembourg": "L",
1753 | },
1754 | "MO": map[string]string{},
1755 | "MK": map[string]string{
1756 | "Aerodrom": "01",
1757 | "Aračinovo": "02",
1758 | "Berovo": "03",
1759 | "Bitola": "04",
1760 | "Bogdanci": "05",
1761 | "Bogovinje": "06",
1762 | "Bosilovo": "07",
1763 | "Brvenica": "08",
1764 | "Butel": "09",
1765 | "Centar": "77",
1766 | "Centar Župa": "78",
1767 | "Debar": "21",
1768 | "Debarca": "22",
1769 | "Delčevo": "23",
1770 | "Demir Hisar": "25",
1771 | "Demir Kapija": "24",
1772 | "Dojran": "26",
1773 | "Dolneni": "27",
1774 | "Drugovo": "28",
1775 | "Gazi Baba": "17",
1776 | "Gevgelija": "18",
1777 | "Gjorče Petrov": "29",
1778 | "Gostivar": "19",
1779 | "Gradsko": "20",
1780 | "Ilinden": "34",
1781 | "Jegunovce": "35",
1782 | "Karbinci": "37",
1783 | "Karpoš": "38",
1784 | "Kavadarci": "36",
1785 | "Kisela Voda": "39",
1786 | "Kičevo": "40",
1787 | "Konče": "41",
1788 | "Kočani": "42",
1789 | "Kratovo": "43",
1790 | "Kriva Palanka": "44",
1791 | "Krivogaštani": "45",
1792 | "Kruševo": "46",
1793 | "Kumanovo": "47",
1794 | "Lipkovo": "48",
1795 | "Lozovo": "49",
1796 | "Makedonska Kamenica": "51",
1797 | "Makedonski Brod": "52",
1798 | "Mavrovo i Rostuša": "50",
1799 | "Mogila": "53",
1800 | "Negotino": "54",
1801 | "Novaci": "55",
1802 | "Novo Selo": "56",
1803 | "Ohrid": "58",
1804 | "Oslomej": "57",
1805 | "Pehčevo": "60",
1806 | "Petrovec": "59",
1807 | "Plasnica": "61",
1808 | "Prilep": "62",
1809 | "Probištip": "63",
1810 | "Radoviš": "64",
1811 | "Rankovce": "65",
1812 | "Resen": "66",
1813 | "Rosoman": "67",
1814 | "Saraj": "68",
1815 | "Sopište": "70",
1816 | "Staro Nagoričane": "71",
1817 | "Struga": "72",
1818 | "Strumica": "73",
1819 | "Studeničani": "74",
1820 | "Sveti Nikole": "69",
1821 | "Tearce": "75",
1822 | "Tetovo": "76",
1823 | "Valandovo": "10",
1824 | "Vasilevo": "11",
1825 | "Veles": "13",
1826 | "Vevčani": "12",
1827 | "Vinica": "14",
1828 | "Vraneštica": "15",
1829 | "Vrapčište": "16",
1830 | "Zajas": "31",
1831 | "Zelenikovo": "32",
1832 | "Zrnovci": "33",
1833 | "Čair": "79",
1834 | "Čaška": "80",
1835 | "Češinovo-Obleševo": "81",
1836 | "Čučer Sandevo": "82",
1837 | "Štip": "83",
1838 | "Šuto Orizari": "84",
1839 | "Želino": "30",
1840 | },
1841 | "MG": map[string]string{
1842 | "Antananarivo": "T",
1843 | "Antsiranana": "D",
1844 | "Fianarantsoa": "F",
1845 | "Mahajanga": "M",
1846 | "Toamasina": "A",
1847 | "Toliara": "U",
1848 | },
1849 | "MW": map[string]string{
1850 | "Central Region": "C",
1851 | "Northern Region": "N",
1852 | "Southern Region": "S",
1853 | },
1854 | "MY": map[string]string{
1855 | "Wilayah Persekutuan Kuala Lumpur": "14",
1856 | "Wilayah Persekutuan Labuan": "15",
1857 | "Wilayah Persekutuan Putrajaya": "16",
1858 | "Johor": "01",
1859 | "Kedah": "02",
1860 | "Kelantan": "03",
1861 | "Melaka": "04",
1862 | "Negeri Sembilan": "05",
1863 | "Pahang": "06",
1864 | "Perak": "08",
1865 | "Perlis": "09",
1866 | "Pulau Pinang": "07",
1867 | "Sabah": "12",
1868 | "Sarawak": "13",
1869 | "Selangor": "10",
1870 | "Terengganu": "11",
1871 | },
1872 | "MV": map[string]string{
1873 | "Central": "CE",
1874 | "Male": "MLE",
1875 | "North": "NO",
1876 | "North Central": "NC",
1877 | "South": "SU",
1878 | "South Central": "SC",
1879 | "Upper North": "UN",
1880 | "Upper South": "US",
1881 | },
1882 | "ML": map[string]string{
1883 | "Bamako": "BKO",
1884 | "Gao": "7",
1885 | "Kayes": "1",
1886 | "Kidal": "8",
1887 | "Koulikoro": "2",
1888 | "Mopti": "5",
1889 | "Sikasso": "3",
1890 | "Ségou": "4",
1891 | "Tombouctou": "6",
1892 | },
1893 | "MT": map[string]string{
1894 | "Attard": "01",
1895 | "Balzan": "02",
1896 | "Birgu": "03",
1897 | "Birkirkara": "04",
1898 | "Birżebbuġa": "05",
1899 | "Bormla": "06",
1900 | "Dingli": "07",
1901 | "Fgura": "08",
1902 | "Floriana": "09",
1903 | "Fontana": "10",
1904 | "Gudja": "11",
1905 | "Għajnsielem": "13",
1906 | "Għarb": "14",
1907 | "Għargħur": "15",
1908 | "Għasri": "16",
1909 | "Għaxaq": "17",
1910 | "Gżira": "12",
1911 | "Iklin": "19",
1912 | "Isla": "20",
1913 | "Kalkara": "21",
1914 | "Kerċem": "22",
1915 | "Kirkop": "23",
1916 | "Lija": "24",
1917 | "Luqa": "25",
1918 | "Marsa": "26",
1919 | "Marsaskala": "27",
1920 | "Marsaxlokk": "28",
1921 | "Mdina": "29",
1922 | "Mellieħa": "30",
1923 | "Mosta": "32",
1924 | "Mqabba": "33",
1925 | "Msida": "34",
1926 | "Mtarfa": "35",
1927 | "Munxar": "36",
1928 | "Mġarr": "31",
1929 | "Nadur": "37",
1930 | "Naxxar": "38",
1931 | "Paola": "39",
1932 | "Pembroke": "40",
1933 | "Pietà": "41",
1934 | "Qala": "42",
1935 | "Qormi": "43",
1936 | "Qrendi": "44",
1937 | "Rabat Għawdex": "45",
1938 | "Rabat Malta": "46",
1939 | "Safi": "47",
1940 | "San Lawrenz": "50",
1941 | "San Pawl il-Baħar": "51",
1942 | "San Ġiljan": "48",
1943 | "San Ġwann": "49",
1944 | "Sannat": "52",
1945 | "Santa Luċija": "53",
1946 | "Santa Venera": "54",
1947 | "Siġġiewi": "55",
1948 | "Sliema": "56",
1949 | "Swieqi": "57",
1950 | "Ta' Xbiex": "58",
1951 | "Tarxien": "59",
1952 | "Valletta": "60",
1953 | "Xagħra": "61",
1954 | "Xewkija": "62",
1955 | "Xgħajra": "63",
1956 | "Ħamrun": "18",
1957 | "Żabbar": "64",
1958 | "Żebbuġ Għawdex": "65",
1959 | "Żebbuġ Malta": "66",
1960 | "Żejtun": "67",
1961 | "Żurrieq": "68",
1962 | },
1963 | "MH": map[string]string{
1964 | "Ralik chain": "L",
1965 | "Ratak chain": "T",
1966 | },
1967 | "MQ": map[string]string{},
1968 | "MR": map[string]string{
1969 | "Adrar": "07",
1970 | "Assaba": "03",
1971 | "Brakna": "05",
1972 | "Dakhlet Nouâdhibou": "08",
1973 | "Gorgol": "04",
1974 | "Guidimaka": "10",
1975 | "Hodh ech Chargui": "01",
1976 | "Hodh el Gharbi": "02",
1977 | "Inchiri": "12",
1978 | "Nouakchott": "NKC",
1979 | "Tagant": "09",
1980 | "Tiris Zemmour": "11",
1981 | "Trarza": "06",
1982 | },
1983 | "MU": map[string]string{
1984 | "Agalega Islands": "AG",
1985 | "Beau Bassin-Rose Hill": "BR",
1986 | "Black River": "BL",
1987 | "Cargados Carajos Shoals": "CC",
1988 | "Curepipe": "CU",
1989 | "Flacq": "FL",
1990 | "Grand Port": "GP",
1991 | "Moka": "MO",
1992 | "Pamplemousses": "PA",
1993 | "Plaines Wilhems": "PW",
1994 | "Port Louis": "PU",
1995 | "Quatre Bornes": "QB",
1996 | "Rivière du Rempart": "RR",
1997 | "Rodrigues Island": "RO",
1998 | "Savanne": "SA",
1999 | "Vacoas-Phoenix": "VP",
2000 | },
2001 | "YT": map[string]string{},
2002 | "MX": map[string]string{
2003 | "Distrito Federal": "DIF",
2004 | "Aguascalientes": "AGU",
2005 | "Baja California": "BCN",
2006 | "Baja California Sur": "BCS",
2007 | "Campeche": "CAM",
2008 | "Chiapas": "CHP",
2009 | "Chihuahua": "CHH",
2010 | "Coahuila": "COA",
2011 | "Colima": "COL",
2012 | "Durango": "DUR",
2013 | "Guanajuato": "GUA",
2014 | "Guerrero": "GRO",
2015 | "Hidalgo": "HID",
2016 | "Jalisco": "JAL",
2017 | "Michoacán": "MIC",
2018 | "Morelos": "MOR",
2019 | "México": "MEX",
2020 | "Nayarit": "NAY",
2021 | "Nuevo León": "NLE",
2022 | "Oaxaca": "OAX",
2023 | "Puebla": "PUE",
2024 | "Querétaro": "QUE",
2025 | "Quintana Roo": "ROO",
2026 | "San Luis Potosí": "SLP",
2027 | "Sinaloa": "SIN",
2028 | "Sonora": "SON",
2029 | "Tabasco": "TAB",
2030 | "Tamaulipas": "TAM",
2031 | "Tlaxcala": "TLA",
2032 | "Veracruz": "VER",
2033 | "Yucatán": "YUC",
2034 | "Zacatecas": "ZAC",
2035 | },
2036 | "FM": map[string]string{
2037 | "Chuuk": "TRK",
2038 | "Kosrae": "KSA",
2039 | "Pohnpei": "PNI",
2040 | "Yap": "YAP",
2041 | },
2042 | "MD": map[string]string{
2043 | "Anenii Noi": "AN",
2044 | "Basarabeasca": "BS",
2045 | "Briceni": "BR",
2046 | "Bălţi": "BA",
2047 | "Cahul": "CA",
2048 | "Cantemir": "CT",
2049 | "Chişinău": "CU",
2050 | "Cimişlia": "CM",
2051 | "Criuleni": "CR",
2052 | "Călăraşi": "CL",
2053 | "Căuşeni": "CS",
2054 | "Donduşeni": "DO",
2055 | "Drochia": "DR",
2056 | "Dubăsari": "DU",
2057 | "Edineţ": "ED",
2058 | "Floreşti": "FL",
2059 | "Făleşti": "FA",
2060 | "Glodeni": "GL",
2061 | "Găgăuzia, Unitatea teritorială autonomă": "GA",
2062 | "Hînceşti": "HI",
2063 | "Ialoveni": "IA",
2064 | "Leova": "LE",
2065 | "Nisporeni": "NI",
2066 | "Ocniţa": "OC",
2067 | "Orhei": "OR",
2068 | "Rezina": "RE",
2069 | "Rîşcani": "RI",
2070 | "Soroca": "SO",
2071 | "Străşeni": "ST",
2072 | "Stînga Nistrului, unitatea teritorială din": "SN",
2073 | "Sîngerei": "SI",
2074 | "Taraclia": "TA",
2075 | "Teleneşti": "TE",
2076 | "Tighina": "BD",
2077 | "Ungheni": "UN",
2078 | "Şoldăneşti": "SD",
2079 | "Ştefan Vodă": "SV",
2080 | },
2081 | "MC": map[string]string{
2082 | "Fontvieille": "FO",
2083 | "Jardin Exotique": "JE",
2084 | "La Colle": "CL",
2085 | "La Condamine": "CO",
2086 | "La Gare": "GA",
2087 | "La Source": "SO",
2088 | "Larvotto": "LA",
2089 | "Malbousquet": "MA",
2090 | "Monaco-Ville": "MO",
2091 | "Moneghetti": "MG",
2092 | "Monte-Carlo": "MC",
2093 | "Moulins": "MU",
2094 | "Port-Hercule": "PH",
2095 | "Saint-Roman": "SR",
2096 | "Sainte-Dévote": "SD",
2097 | "Spélugues": "SP",
2098 | "Vallon de la Rousse": "VR",
2099 | },
2100 | "MN": map[string]string{
2101 | "Arhangay": "073",
2102 | "Bayan-Ölgiy": "071",
2103 | "Bayanhongor": "069",
2104 | "Bulgan": "067",
2105 | "Darhan uul": "037",
2106 | "Dornod": "061",
2107 | "Dornogovĭ": "063",
2108 | "Dundgovĭ": "059",
2109 | "Dzavhan": "057",
2110 | "Govĭ-Altay": "065",
2111 | "Govĭ-Sümber": "064",
2112 | "Hentiy": "039",
2113 | "Hovd": "043",
2114 | "Hövsgöl": "041",
2115 | "Orhon": "035",
2116 | "Selenge": "049",
2117 | "Sühbaatar": "051",
2118 | "Töv": "047",
2119 | "Ulaanbaatar": "1",
2120 | "Uvs": "046",
2121 | "Ömnögovĭ": "053",
2122 | "Övörhangay": "055",
2123 | },
2124 | "ME": map[string]string{
2125 | "Andrijevica": "01",
2126 | "Bar": "02",
2127 | "Berane": "03",
2128 | "Bijelo Polje": "04",
2129 | "Budva": "05",
2130 | "Cetinje": "06",
2131 | "Danilovgrad": "07",
2132 | "Gusinje": "22",
2133 | "Herceg-Novi": "08",
2134 | "Kolašin": "09",
2135 | "Kotor": "10",
2136 | "Mojkovac": "11",
2137 | "Nikšić": "12",
2138 | "Petnjica": "23",
2139 | "Plav": "13",
2140 | "Pljevlja": "14",
2141 | "Plužine": "15",
2142 | "Podgorica": "16",
2143 | "Rožaje": "17",
2144 | "Tivat": "19",
2145 | "Ulcinj": "20",
2146 | "Šavnik": "18",
2147 | "Žabljak": "21",
2148 | },
2149 | "MS": map[string]string{},
2150 | "MA": map[string]string{
2151 | "Chaouia-Ouardigha": "09",
2152 | "Doukhala-Abda": "10",
2153 | "Fès-Boulemane": "05",
2154 | "Gharb-Chrarda-Beni Hssen": "02",
2155 | "Grand Casablanca": "08",
2156 | "Guelmim-Es Smara": "14",
2157 | "L'Oriental": "04",
2158 | "Laâyoune-Boujdour-Sakia el Hamra": "15",
2159 | "Marrakech-Tensift-Al Haouz": "11",
2160 | "Meknès-Tafilalet": "06",
2161 | "Oued ed Dahab-Lagouira": "16",
2162 | "Rabat-Salé-Zemmour-Zaer": "07",
2163 | "Souss-Massa-Drâa": "13",
2164 | "Tadla-Azilal": "12",
2165 | "Tanger-Tétouan": "01",
2166 | "Taza-Al Hoceima-Taounate": "03",
2167 | },
2168 | "MZ": map[string]string{
2169 | "Cabo Delgado": "P",
2170 | "Gaza": "G",
2171 | "Inhambane": "I",
2172 | "Manica": "B",
2173 | "Maputo": "L",
2174 | "Nampula": "N",
2175 | "Niassa": "A",
2176 | "Sofala": "S",
2177 | "Tete": "T",
2178 | "Zambézia": "Q",
2179 | },
2180 | "MM": map[string]string{
2181 | "Ayeyarwady": "07",
2182 | "Bago": "02",
2183 | "Chin": "14",
2184 | "Kachin": "11",
2185 | "Kayah": "12",
2186 | "Kayin": "13",
2187 | "Magway": "03",
2188 | "Mandalay": "04",
2189 | "Mon": "15",
2190 | "Rakhine": "16",
2191 | "Sagaing": "01",
2192 | "Shan": "17",
2193 | "Tanintharyi": "05",
2194 | "Yangon": "06",
2195 | },
2196 | "NA": map[string]string{
2197 | "Erongo": "ER",
2198 | "Hardap": "HA",
2199 | "Karas": "KA",
2200 | "Kavango East": "KE",
2201 | "Kavango West": "KW",
2202 | "Khomas": "KH",
2203 | "Kunene": "KU",
2204 | "Ohangwena": "OW",
2205 | "Omaheke": "OH",
2206 | "Omusati": "OS",
2207 | "Oshana": "ON",
2208 | "Oshikoto": "OT",
2209 | "Otjozondjupa": "OD",
2210 | "Zambezi": "CA",
2211 | },
2212 | "NR": map[string]string{
2213 | "Aiwo": "01",
2214 | "Anabar": "02",
2215 | "Anetan": "03",
2216 | "Anibare": "04",
2217 | "Baiti": "05",
2218 | "Boe": "06",
2219 | "Buada": "07",
2220 | "Denigomodu": "08",
2221 | "Ewa": "09",
2222 | "Ijuw": "10",
2223 | "Meneng": "11",
2224 | "Nibok": "12",
2225 | "Uaboe": "13",
2226 | "Yaren": "14",
2227 | },
2228 | "NP": map[string]string{
2229 | "Madhya Pashchimanchal": "2",
2230 | "Madhyamanchal": "1",
2231 | "Pashchimanchal": "3",
2232 | "Purwanchal": "4",
2233 | "Sudur Pashchimanchal": "5",
2234 | },
2235 | "NL": map[string]string{
2236 | "Drenthe": "DR",
2237 | "Flevoland": "FL",
2238 | "Fryslân": "FR",
2239 | "Gelderland": "GE",
2240 | "Groningen": "GR",
2241 | "Limburg": "LI",
2242 | "Noord-Brabant": "NB",
2243 | "Noord-Holland": "NH",
2244 | "Overijssel": "OV",
2245 | "Utrecht": "UT",
2246 | "Zeeland": "ZE",
2247 | "Zuid-Holland": "ZH",
2248 | "Aruba": "AW",
2249 | "Curaçao": "CW",
2250 | "Sint Maarten": "SX",
2251 | "Bonaire": "BQ1",
2252 | "Saba": "BQ2",
2253 | "Sint Eustatius": "BQ3",
2254 | },
2255 | "NC": map[string]string{},
2256 | "NZ": map[string]string{
2257 | "North Island": "N",
2258 | "South Island": "S",
2259 | "Auckland": "AUK",
2260 | "Bay of Plenty": "BOP",
2261 | "Canterbury": "CAN",
2262 | "Hawke's Bay": "HKB",
2263 | "Manawatu-Wanganui": "MWT",
2264 | "Northland": "NTL",
2265 | "Otago": "OTA",
2266 | "Southland": "STL",
2267 | "Taranaki": "TKI",
2268 | "Waikato": "WKO",
2269 | "Wellington": "WGN",
2270 | "West Coast": "WTC",
2271 | "Chatham Islands Territory": "CIT",
2272 | "Gisborne District": "GIS",
2273 | "Marlborough District": "MBH",
2274 | "Nelson City": "NSN",
2275 | "Tasman District": "TAS",
2276 | },
2277 | "NI": map[string]string{
2278 | "Atlántico Norte": "AN",
2279 | "Atlántico Sur": "AS",
2280 | "Boaco": "BO",
2281 | "Carazo": "CA",
2282 | "Chinandega": "CI",
2283 | "Chontales": "CO",
2284 | "Estelí": "ES",
2285 | "Granada": "GR",
2286 | "Jinotega": "JI",
2287 | "León": "LE",
2288 | "Madriz": "MD",
2289 | "Managua": "MN",
2290 | "Masaya": "MS",
2291 | "Matagalpa": "MT",
2292 | "Nueva Segovia": "NS",
2293 | "Rivas": "RI",
2294 | "Río San Juan": "SJ",
2295 | },
2296 | "NE": map[string]string{
2297 | "Agadez": "1",
2298 | "Diffa": "2",
2299 | "Dosso": "3",
2300 | "Maradi": "4",
2301 | "Niamey": "8",
2302 | "Tahoua": "5",
2303 | "Tillabéri": "6",
2304 | "Zinder": "7",
2305 | },
2306 | "NG": map[string]string{
2307 | "Abia": "AB",
2308 | "Abuja Federal Capital Territory": "FC",
2309 | "Adamawa": "AD",
2310 | "Akwa Ibom": "AK",
2311 | "Anambra": "AN",
2312 | "Bauchi": "BA",
2313 | "Bayelsa": "BY",
2314 | "Benue": "BE",
2315 | "Borno": "BO",
2316 | "Cross River": "CR",
2317 | "Delta": "DE",
2318 | "Ebonyi": "EB",
2319 | "Edo": "ED",
2320 | "Ekiti": "EK",
2321 | "Enugu": "EN",
2322 | "Gombe": "GO",
2323 | "Imo": "IM",
2324 | "Jigawa": "JI",
2325 | "Kaduna": "KD",
2326 | "Kano": "KN",
2327 | "Katsina": "KT",
2328 | "Kebbi": "KE",
2329 | "Kogi": "KO",
2330 | "Kwara": "KW",
2331 | "Lagos": "LA",
2332 | "Nassarawa": "NA",
2333 | "Niger": "NI",
2334 | "Ogun": "OG",
2335 | "Ondo": "ON",
2336 | "Osun": "OS",
2337 | "Oyo": "OY",
2338 | "Plateau": "PL",
2339 | "Rivers": "RI",
2340 | "Sokoto": "SO",
2341 | "Taraba": "TA",
2342 | "Yobe": "YO",
2343 | "Zamfara": "ZA",
2344 | },
2345 | "NU": map[string]string{},
2346 | "NF": map[string]string{},
2347 | "KP": map[string]string{
2348 | "Chagang": "04",
2349 | "Kangwon": "07",
2350 | "North Hamgyong": "09",
2351 | "North Hwanghae": "06",
2352 | "North Pyongan": "03",
2353 | "Pyongyang": "01",
2354 | "Rason": "13",
2355 | "Ryanggang": "10",
2356 | "South Hamgyong": "08",
2357 | "South Hwanghae": "05",
2358 | "South Pyongan": "02",
2359 | },
2360 | "MP": map[string]string{},
2361 | "NO": map[string]string{
2362 | "Akershus": "02",
2363 | "Aust-Agder": "09",
2364 | "Buskerud": "06",
2365 | "Finnmark": "20",
2366 | "Hedmark": "04",
2367 | "Hordaland": "12",
2368 | "Jan Mayen": "22",
2369 | "Møre og Romsdal": "15",
2370 | "Nord-Trøndelag": "17",
2371 | "Nordland": "18",
2372 | "Oppland": "05",
2373 | "Oslo": "03",
2374 | "Rogaland": "11",
2375 | "Sogn og Fjordane": "14",
2376 | "Svalbard": "21",
2377 | "Sør-Trøndelag": "16",
2378 | "Telemark": "08",
2379 | "Troms": "19",
2380 | "Vest-Agder": "10",
2381 | "Vestfold": "07",
2382 | "Østfold": "01",
2383 | },
2384 | "OM": map[string]string{
2385 | "Ad Dākhilīyah": "DA",
2386 | "Al Buraymī": "BU",
2387 | "Al Bāţinah": "BA",
2388 | "Al Wusţá": "WU",
2389 | "Ash Sharqīyah": "SH",
2390 | "Az̧ Z̧āhirah": "ZA",
2391 | "Masqaţ": "MA",
2392 | "Musandam": "MU",
2393 | "Z̧ufār": "ZU",
2394 | },
2395 | "PK": map[string]string{
2396 | "Azad Kashmir": "JK",
2397 | "Balochistan": "BA",
2398 | "Federally Administered Tribal Areas": "TA",
2399 | "Gilgit-Baltistan": "GB",
2400 | "Islamabad": "IS",
2401 | "Khyber Pakhtunkhwa": "KP",
2402 | "Punjab": "PB",
2403 | "Sindh": "SD",
2404 | },
2405 | "PW": map[string]string{
2406 | "Aimeliik": "002",
2407 | "Airai": "004",
2408 | "Angaur": "010",
2409 | "Hatobohei": "050",
2410 | "Kayangel": "100",
2411 | "Koror": "150",
2412 | "Melekeok": "212",
2413 | "Ngaraard": "214",
2414 | "Ngarchelong": "218",
2415 | "Ngardmau": "222",
2416 | "Ngatpang": "224",
2417 | "Ngchesar": "226",
2418 | "Ngeremlengui": "227",
2419 | "Ngiwal": "228",
2420 | "Peleliu": "350",
2421 | "Sonsorol": "370",
2422 | },
2423 | "PS": map[string]string{
2424 | "Bethlehem": "BTH",
2425 | "Deir El Balah": "DEB",
2426 | "Gaza": "GZA",
2427 | "Hebron": "HBN",
2428 | "Jenin": "JEN",
2429 | "Jericho – Al Aghwar": "JRH",
2430 | "Jerusalem": "JEM",
2431 | "Khan Yunis": "KYS",
2432 | "Nablus": "NBS",
2433 | "North Gaza": "NGZ",
2434 | "Qalqilya": "QQA",
2435 | "Rafah": "RFH",
2436 | "Ramallah": "RBH",
2437 | "Salfit": "SLT",
2438 | "Tubas": "TBS",
2439 | "Tulkarm": "TKM",
2440 | },
2441 | "PA": map[string]string{
2442 | "Bocas del Toro": "1",
2443 | "Chiriquí": "4",
2444 | "Coclé": "2",
2445 | "Colón": "3",
2446 | "Darién": "5",
2447 | "Emberá": "EM",
2448 | "Herrera": "6",
2449 | "Kuna Yala": "KY",
2450 | "Los Santos": "7",
2451 | "Ngöbe-Buglé": "NB",
2452 | "Panamá": "8",
2453 | "Panamá Oeste": "10",
2454 | "Veraguas": "9",
2455 | },
2456 | "PG": map[string]string{
2457 | "Bougainville": "NSB",
2458 | "Central": "CPM",
2459 | "Chimbu": "CPK",
2460 | "East New Britain": "EBR",
2461 | "East Sepik": "ESW",
2462 | "Eastern Highlands": "EHG",
2463 | "Enga": "EPW",
2464 | "Gulf": "GPK",
2465 | "Madang": "MPM",
2466 | "Manus": "MRL",
2467 | "Milne Bay": "MBA",
2468 | "Morobe": "MPL",
2469 | "National Capital District": "NCD",
2470 | "New Ireland": "NIK",
2471 | "Northern": "NPP",
2472 | "Sandaun": "SAN",
2473 | "Southern Highlands": "SHM",
2474 | "West New Britain": "WBK",
2475 | "Western": "WPD",
2476 | "Western Highlands": "WHM",
2477 | },
2478 | "PY": map[string]string{
2479 | "Alto Paraguay": "16",
2480 | "Alto Paraná": "10",
2481 | "Amambay": "13",
2482 | "Asunción": "ASU",
2483 | "Boquerón": "19",
2484 | "Caaguazú": "5",
2485 | "Caazapá": "6",
2486 | "Canindeyú": "14",
2487 | "Central": "11",
2488 | "Concepción": "1",
2489 | "Cordillera": "3",
2490 | "Guairá": "4",
2491 | "Itapúa": "7",
2492 | "Misiones": "8",
2493 | "Paraguarí": "9",
2494 | "Presidente Hayes": "15",
2495 | "San Pedro": "2",
2496 | "Ñeembucú": "12",
2497 | },
2498 | "PE": map[string]string{
2499 | "Amazonas": "AMA",
2500 | "Ancash": "ANC",
2501 | "Apurímac": "APU",
2502 | "Arequipa": "ARE",
2503 | "Ayacucho": "AYA",
2504 | "Cajamarca": "CAJ",
2505 | "Cusco": "CUS",
2506 | "El Callao": "CAL",
2507 | "Huancavelica": "HUV",
2508 | "Huánuco": "HUC",
2509 | "Ica": "ICA",
2510 | "Junín": "JUN",
2511 | "La Libertad": "LAL",
2512 | "Lambayeque": "LAM",
2513 | "Lima": "LIM",
2514 | "Loreto": "LOR",
2515 | "Madre de Dios": "MDD",
2516 | "Moquegua": "MOQ",
2517 | "Municipalidad Metropolitana de Lima": "LMA",
2518 | "Pasco": "PAS",
2519 | "Piura": "PIU",
2520 | "Puno": "PUN",
2521 | "San Martín": "SAM",
2522 | "Tacna": "TAC",
2523 | "Tumbes": "TUM",
2524 | "Ucayali": "UCA",
2525 | },
2526 | "PH": map[string]string{
2527 | "Autonomous Region in Muslim Mindanao": "14",
2528 | "Bicol": "05",
2529 | "Cagayan Valley": "02",
2530 | "Calabarzon": "40",
2531 | "Caraga": "13",
2532 | "Central Luzon": "03",
2533 | "Central Visayas": "07",
2534 | "Cordillera Administrative Region": "15",
2535 | "Davao": "11",
2536 | "Eastern Visayas": "08",
2537 | "Ilocos": "01",
2538 | "Mimaropa": "41",
2539 | "National Capital Region": "00",
2540 | "Northern Mindanao": "10",
2541 | "Soccsksargen": "12",
2542 | "Western Visayas": "06",
2543 | "Zamboanga Peninsula": "09",
2544 | },
2545 | "PN": map[string]string{},
2546 | "PL": map[string]string{
2547 | "Dolnośląskie": "DS",
2548 | "Kujawsko-pomorskie": "KP",
2549 | "Lubelskie": "LU",
2550 | "Lubuskie": "LB",
2551 | "Mazowieckie": "MZ",
2552 | "Małopolskie": "MA",
2553 | "Opolskie": "OP",
2554 | "Podkarpackie": "PK",
2555 | "Podlaskie": "PD",
2556 | "Pomorskie": "PM",
2557 | "Warmińsko-mazurskie": "WN",
2558 | "Wielkopolskie": "WP",
2559 | "Zachodniopomorskie": "ZP",
2560 | "Łódzkie": "LD",
2561 | "Śląskie": "SL",
2562 | "Świętokrzyskie": "SK",
2563 | },
2564 | "PT": map[string]string{
2565 | "Aveiro": "01",
2566 | "Beja": "02",
2567 | "Braga": "03",
2568 | "Bragança": "04",
2569 | "Castelo Branco": "05",
2570 | "Coimbra": "06",
2571 | "Faro": "08",
2572 | "Guarda": "09",
2573 | "Leiria": "10",
2574 | "Lisboa": "11",
2575 | "Portalegre": "12",
2576 | "Porto": "13",
2577 | "Região Autónoma da Madeira": "30",
2578 | "Região Autónoma dos Açores": "20",
2579 | "Santarém": "14",
2580 | "Setúbal": "15",
2581 | "Viana do Castelo": "16",
2582 | "Vila Real": "17",
2583 | "Viseu": "18",
2584 | "Évora": "07",
2585 | },
2586 | "PR": map[string]string{},
2587 | "QA": map[string]string{
2588 | "Ad Dawḩah": "DA",
2589 | "Al Khawr wa adh Dhakhīrah": "KH",
2590 | "Al Wakrah": "WA",
2591 | "Ar Rayyān": "RA",
2592 | "Ash Shamāl": "MS",
2593 | "Az̧ Za̧`āyin": "ZA",
2594 | "Umm Şalāl": "US",
2595 | },
2596 | "XK": map[string]string{},
2597 | "RE": map[string]string{},
2598 | "RO": map[string]string{
2599 | "Alba": "AB",
2600 | "Arad": "AR",
2601 | "Argeș": "AG",
2602 | "Bacău": "BC",
2603 | "Bihor": "BH",
2604 | "Bistrița-Năsăud": "BN",
2605 | "Botoșani": "BT",
2606 | "Brașov": "BV",
2607 | "Brăila": "BR",
2608 | "București": "B",
2609 | "Buzău": "BZ",
2610 | "Caraș-Severin": "CS",
2611 | "Cluj": "CJ",
2612 | "Constanța": "CT",
2613 | "Covasna": "CV",
2614 | "Călărași": "CL",
2615 | "Dolj": "DJ",
2616 | "Dâmbovița": "DB",
2617 | "Galați": "GL",
2618 | "Giurgiu": "GR",
2619 | "Gorj": "GJ",
2620 | "Harghita": "HR",
2621 | "Hunedoara": "HD",
2622 | "Ialomița": "IL",
2623 | "Iași": "IS",
2624 | "Ilfov": "IF",
2625 | "Maramureș": "MM",
2626 | "Mehedinți": "MH",
2627 | "Mureș": "MS",
2628 | "Neamț": "NT",
2629 | "Olt": "OT",
2630 | "Prahova": "PH",
2631 | "Satu Mare": "SM",
2632 | "Sibiu": "SB",
2633 | "Suceava": "SV",
2634 | "Sălaj": "SJ",
2635 | "Teleorman": "TR",
2636 | "Timiș": "TM",
2637 | "Tulcea": "TL",
2638 | "Vaslui": "VS",
2639 | "Vrancea": "VN",
2640 | "Vâlcea": "VL",
2641 | },
2642 | "RU": map[string]string{
2643 | "Amurskaya oblast'": "AMU",
2644 | "Arkhangel'skaya oblast'": "ARK",
2645 | "Astrakhanskaya oblast'": "AST",
2646 | "Belgorodskaya oblast'": "BEL",
2647 | "Bryanskaya oblast'": "BRY",
2648 | "Chelyabinskaya oblast'": "CHE",
2649 | "Irkutskaya oblast'": "IRK",
2650 | "Ivanovskaya oblast'": "IVA",
2651 | "Kaliningradskaya oblast'": "KGD",
2652 | "Kaluzhskaya oblast'": "KLU",
2653 | "Kemerovskaya oblast'": "KEM",
2654 | "Kirovskaya oblast'": "KIR",
2655 | "Kostromskaya oblast'": "KOS",
2656 | "Kurganskaya oblast'": "KGN",
2657 | "Kurskaya oblast'": "KRS",
2658 | "Leningradskaya oblast'": "LEN",
2659 | "Lipetskaya oblast'": "LIP",
2660 | "Magadanskaya oblast'": "MAG",
2661 | "Moskovskaya oblast'": "MOS",
2662 | "Murmanskaya oblast'": "MUR",
2663 | "Nizhegorodskaya oblast'": "NIZ",
2664 | "Novgorodskaya oblast'": "NGR",
2665 | "Novosibirskaya oblast'": "NVS",
2666 | "Omskaya oblast'": "OMS",
2667 | "Orenburgskaya oblast'": "ORE",
2668 | "Orlovskaya oblast'": "ORL",
2669 | "Penzenskaya oblast'": "PNZ",
2670 | "Pskovskaya oblast'": "PSK",
2671 | "Rostovskaya oblast'": "ROS",
2672 | "Ryazanskaya oblast'": "RYA",
2673 | "Sakhalinskaya oblast'": "SAK",
2674 | "Samarskaya oblast'": "SAM",
2675 | "Saratovskaya oblast'": "SAR",
2676 | "Smolenskaya oblast'": "SMO",
2677 | "Sverdlovskaya oblast'": "SVE",
2678 | "Tambovskaya oblast'": "TAM",
2679 | "Tomskaya oblast'": "TOM",
2680 | "Tul'skaya oblast'": "TUL",
2681 | "Tverskaya oblast'": "TVE",
2682 | "Tyumenskaya oblast'": "TYU",
2683 | "Ul'yanovskaya oblast'": "ULY",
2684 | "Vladimirskaya oblast'": "VLA",
2685 | "Volgogradskaya oblast'": "VGG",
2686 | "Vologodskaya oblast'": "VLG",
2687 | "Voronezhskaya oblast'": "VOR",
2688 | "Yaroslavskaya oblast'": "YAR",
2689 | "Altayskiy kray": "ALT",
2690 | "Kamchatskiy kray": "KAM",
2691 | "Khabarovskiy kray": "KHA",
2692 | "Krasnodarskiy kray": "KDA",
2693 | "Krasnoyarskiy kray": "KYA",
2694 | "Permskiy kray": "PER",
2695 | "Primorskiy kray": "PRI",
2696 | "Stavropol'skiy kray": "STA",
2697 | "Zabaykal'skiy kray": "ZAB",
2698 | "Moskva": "MOW",
2699 | "Sankt-Peterburg": "SPE",
2700 | "Chukotskiy avtonomnyy okrug": "CHU",
2701 | "Khanty-Mansiyskiy avtonomnyy okrug-Yugra": "KHM",
2702 | "Nenetskiy avtonomnyy okrug": "NEN",
2703 | "Yamalo-Nenetskiy avtonomnyy okrug": "YAN",
2704 | "Yevreyskaya avtonomnaya oblast'": "YEV",
2705 | "Adygeya, Respublika": "AD",
2706 | "Altay, Respublika": "AL",
2707 | "Bashkortostan, Respublika": "BA",
2708 | "Buryatiya, Respublika": "BU",
2709 | "Chechenskaya Respublika": "CE",
2710 | "Chuvashskaya Respublika": "CU",
2711 | "Dagestan, Respublika": "DA",
2712 | "Ingushetiya, Respublika": "IN",
2713 | "Kabardino-Balkarskaya Respublika": "KB",
2714 | "Kalmykiya, Respublika": "KL",
2715 | "Karachayevo-Cherkesskaya Respublika": "KC",
2716 | "Kareliya, Respublika": "KR",
2717 | "Khakasiya, Respublika": "KK",
2718 | "Komi, Respublika": "KO",
2719 | "Mariy El, Respublika": "ME",
2720 | "Mordoviya, Respublika": "MO",
2721 | "Sakha, Respublika": "SA",
2722 | "Severnaya Osetiya-Alaniya, Respublika": "SE",
2723 | "Tatarstan, Respublika": "TA",
2724 | "Tyva, Respublika": "TY",
2725 | "Udmurtskaya Respublika": "UD",
2726 | },
2727 | "RW": map[string]string{
2728 | "Est": "02",
2729 | "Nord": "03",
2730 | "Ouest": "04",
2731 | "Sud": "05",
2732 | "Ville de Kigali": "01",
2733 | },
2734 | "BL": map[string]string{},
2735 | "SH": map[string]string{
2736 | "Ascension": "AC",
2737 | "Saint Helena": "HL",
2738 | "Tristan da Cunha": "TA",
2739 | },
2740 | "KN": map[string]string{
2741 | "Nevis": "N",
2742 | "Saint Kitts": "K",
2743 | },
2744 | "LC": map[string]string{
2745 | "Anse la Raye": "01",
2746 | "Castries": "02",
2747 | "Choiseul": "03",
2748 | "Dauphin": "04",
2749 | "Dennery": "05",
2750 | "Gros Islet": "06",
2751 | "Laborie": "07",
2752 | "Micoud": "08",
2753 | "Praslin": "09",
2754 | "Soufrière": "10",
2755 | "Vieux Fort": "11",
2756 | },
2757 | "MF": map[string]string{},
2758 | "PM": map[string]string{},
2759 | "VC": map[string]string{
2760 | "Charlotte": "01",
2761 | "Grenadines": "06",
2762 | "Saint Andrew": "02",
2763 | "Saint David": "03",
2764 | "Saint George": "04",
2765 | "Saint Patrick": "05",
2766 | },
2767 | "WS": map[string]string{
2768 | "A'ana": "AA",
2769 | "Aiga-i-le-Tai": "AL",
2770 | "Atua": "AT",
2771 | "Fa'asaleleaga": "FA",
2772 | "Gaga'emauga": "GE",
2773 | "Gagaifomauga": "GI",
2774 | "Palauli": "PA",
2775 | "Satupa'itea": "SA",
2776 | "Tuamasaga": "TU",
2777 | "Va'a-o-Fonoti": "VF",
2778 | "Vaisigano": "VS",
2779 | },
2780 | "SM": map[string]string{
2781 | "Acquaviva": "01",
2782 | "Borgo Maggiore": "06",
2783 | "Chiesanuova": "02",
2784 | "Domagnano": "03",
2785 | "Faetano": "04",
2786 | "Fiorentino": "05",
2787 | "Montegiardino": "08",
2788 | "San Marino": "07",
2789 | "Serravalle": "09",
2790 | },
2791 | "ST": map[string]string{
2792 | "Príncipe": "P",
2793 | "São Tomé": "S",
2794 | },
2795 | "SA": map[string]string{
2796 | "Al Bāḩah": "11",
2797 | "Al Jawf": "12",
2798 | "Al Madīnah": "03",
2799 | "Al Qaşīm": "05",
2800 | "Al Ḩudūd ash Shamālīyah": "08",
2801 | "Ar Riyāḑ": "01",
2802 | "Ash Sharqīyah": "04",
2803 | "Jīzān": "09",
2804 | "Makkah": "02",
2805 | "Najrān": "10",
2806 | "Tabūk": "07",
2807 | "ٰĀsīr": "14",
2808 | "Ḩā'il": "06",
2809 | },
2810 | "SN": map[string]string{
2811 | "Dakar": "DK",
2812 | "Diourbel": "DB",
2813 | "Fatick": "FK",
2814 | "Kaffrine": "KA",
2815 | "Kaolack": "KL",
2816 | "Kolda": "KD",
2817 | "Kédougou": "KE",
2818 | "Louga": "LG",
2819 | "Matam": "MT",
2820 | "Saint-Louis": "SL",
2821 | "Sédhiou": "SE",
2822 | "Tambacounda": "TC",
2823 | "Thiès": "TH",
2824 | "Ziguinchor": "ZG",
2825 | },
2826 | "RS": map[string]string{
2827 | "Kosovo-Metohija": "KM",
2828 | "Vojvodina": "VO",
2829 | },
2830 | "SC": map[string]string{
2831 | "Anse Boileau": "02",
2832 | "Anse Etoile": "03",
2833 | "Anse Royale": "05",
2834 | "Anse aux Pins": "01",
2835 | "Au Cap": "04",
2836 | "Baie Lazare": "06",
2837 | "Baie Sainte Anne": "07",
2838 | "Beau Vallon": "08",
2839 | "Bel Air": "09",
2840 | "Bel Ombre": "10",
2841 | "Cascade": "11",
2842 | "English River": "16",
2843 | "Glacis": "12",
2844 | "Grand Anse Mahe": "13",
2845 | "Grand Anse Praslin": "14",
2846 | "La Digue": "15",
2847 | "Les Mamelles": "24",
2848 | "Mont Buxton": "17",
2849 | "Mont Fleuri": "18",
2850 | "Plaisance": "19",
2851 | "Pointe Larue": "20",
2852 | "Port Glaud": "21",
2853 | "Roche Caiman": "25",
2854 | "Saint Louis": "22",
2855 | "Takamaka": "23",
2856 | },
2857 | "SL": map[string]string{
2858 | "Eastern": "E",
2859 | "Northern": "N",
2860 | "Southern": "S",
2861 | "Western Area": "W",
2862 | },
2863 | "SG": map[string]string{
2864 | "Central Singapore": "01",
2865 | "North East": "02",
2866 | "North West": "03",
2867 | "South East": "04",
2868 | "South West": "05",
2869 | },
2870 | "SX": map[string]string{},
2871 | "SK": map[string]string{
2872 | "Banskobystrický kraj": "BC",
2873 | "Bratislavský kraj": "BL",
2874 | "Košický kraj": "KI",
2875 | "Nitriansky kraj": "NI",
2876 | "Prešovský kraj": "PV",
2877 | "Trenčiansky kraj": "TC",
2878 | "Trnavský kraj": "TA",
2879 | "Žilinský kraj": "ZI",
2880 | },
2881 | "SI": map[string]string{
2882 | "Ajdovščina": "001",
2883 | "Apače": "195",
2884 | "Beltinci": "002",
2885 | "Benedikt": "148",
2886 | "Bistrica ob Sotli": "149",
2887 | "Bled": "003",
2888 | "Bloke": "150",
2889 | "Bohinj": "004",
2890 | "Borovnica": "005",
2891 | "Bovec": "006",
2892 | "Braslovče": "151",
2893 | "Brda": "007",
2894 | "Brezovica": "008",
2895 | "Brežice": "009",
2896 | "Cankova": "152",
2897 | "Celje": "011",
2898 | "Cerklje na Gorenjskem": "012",
2899 | "Cerknica": "013",
2900 | "Cerkno": "014",
2901 | "Cerkvenjak": "153",
2902 | "Cirkulane": "196",
2903 | "Destrnik": "018",
2904 | "Divača": "019",
2905 | "Dobje": "154",
2906 | "Dobrepolje": "020",
2907 | "Dobrna": "155",
2908 | "Dobrova–Polhov Gradec": "021",
2909 | "Dobrovnik": "156",
2910 | "Dol pri Ljubljani": "022",
2911 | "Dolenjske Toplice": "157",
2912 | "Domžale": "023",
2913 | "Dornava": "024",
2914 | "Dravograd": "025",
2915 | "Duplek": "026",
2916 | "Gorenja vas–Poljane": "027",
2917 | "Gorišnica": "028",
2918 | "Gorje": "207",
2919 | "Gornja Radgona": "029",
2920 | "Gornji Grad": "030",
2921 | "Gornji Petrovci": "031",
2922 | "Grad": "158",
2923 | "Grosuplje": "032",
2924 | "Hajdina": "159",
2925 | "Hodoš": "161",
2926 | "Horjul": "162",
2927 | "Hoče–Slivnica": "160",
2928 | "Hrastnik": "034",
2929 | "Hrpelje-Kozina": "035",
2930 | "Idrija": "036",
2931 | "Ig": "037",
2932 | "Ilirska Bistrica": "038",
2933 | "Ivančna Gorica": "039",
2934 | "Izola": "040",
2935 | "Jesenice": "041",
2936 | "Jezersko": "163",
2937 | "Juršinci": "042",
2938 | "Kamnik": "043",
2939 | "Kanal": "044",
2940 | "Kidričevo": "045",
2941 | "Kobarid": "046",
2942 | "Kobilje": "047",
2943 | "Komen": "049",
2944 | "Komenda": "164",
2945 | "Koper": "050",
2946 | "Kosanjevica na Krki": "197",
2947 | "Kostel": "165",
2948 | "Kozje": "051",
2949 | "Kočevje": "048",
2950 | "Kranj": "052",
2951 | "Kranjska Gora": "053",
2952 | "Križevci": "166",
2953 | "Krško": "054",
2954 | "Kungota": "055",
2955 | "Kuzma": "056",
2956 | "Laško": "057",
2957 | "Lenart": "058",
2958 | "Lendava": "059",
2959 | "Litija": "060",
2960 | "Ljubljana": "061",
2961 | "Ljubno": "062",
2962 | "Ljutomer": "063",
2963 | "Log-Dragomer": "208",
2964 | "Logatec": "064",
2965 | "Lovrenc na Pohorju": "167",
2966 | "Loška Dolina": "065",
2967 | "Loški Potok": "066",
2968 | "Lukovica": "068",
2969 | "Luče": "067",
2970 | "Majšperk": "069",
2971 | "Makole": "198",
2972 | "Maribor": "070",
2973 | "Markovci": "168",
2974 | "Medvode": "071",
2975 | "Mengeš": "072",
2976 | "Metlika": "073",
2977 | "Mežica": "074",
2978 | "Miklavž na Dravskem Polju": "169",
2979 | "Miren–Kostanjevica": "075",
2980 | "Mirna Peč": "170",
2981 | "Mislinja": "076",
2982 | "Mokronog–Trebelno": "199",
2983 | "Moravske Toplice": "078",
2984 | "Moravče": "077",
2985 | "Mozirje": "079",
2986 | "Murska Sobota": "080",
2987 | "Muta": "081",
2988 | "Naklo": "082",
2989 | "Nazarje": "083",
2990 | "Nova Gorica": "084",
2991 | "Novo Mesto": "085",
2992 | "Odranci": "086",
2993 | "Oplotnica": "171",
2994 | "Ormož": "087",
2995 | "Osilnica": "088",
2996 | "Pesnica": "089",
2997 | "Piran": "090",
2998 | "Pivka": "091",
2999 | "Podlehnik": "172",
3000 | "Podvelka": "093",
3001 | "Podčetrtek": "092",
3002 | "Poljčane": "200",
3003 | "Polzela": "173",
3004 | "Postojna": "094",
3005 | "Prebold": "174",
3006 | "Preddvor": "095",
3007 | "Prevalje": "175",
3008 | "Ptuj": "096",
3009 | "Puconci": "097",
3010 | "Radenci": "100",
3011 | "Radeče": "099",
3012 | "Radlje ob Dravi": "101",
3013 | "Radovljica": "102",
3014 | "Ravne na Koroškem": "103",
3015 | "Razkrižje": "176",
3016 | "Rače–Fram": "098",
3017 | "Renče-Vogrsko": "201",
3018 | "Rečica ob Savinji": "209",
3019 | "Ribnica": "104",
3020 | "Ribnica na Pohorju": "177",
3021 | "Rogatec": "107",
3022 | "Rogaška Slatina": "106",
3023 | "Rogašovci": "105",
3024 | "Ruše": "108",
3025 | "Selnica ob Dravi": "178",
3026 | "Semič": "109",
3027 | "Sevnica": "110",
3028 | "Sežana": "111",
3029 | "Slovenj Gradec": "112",
3030 | "Slovenska Bistrica": "113",
3031 | "Slovenske Konjice": "114",
3032 | "Sodražica": "179",
3033 | "Solčava": "180",
3034 | "Središče ob Dravi": "202",
3035 | "Starše": "115",
3036 | "Straža": "203",
3037 | "Sveta Ana": "181",
3038 | "Sveta Trojica v Slovenskih Goricah": "204",
3039 | "Sveti Andraž v Slovenskih Goricah": "182",
3040 | "Sveti Jurij": "116",
3041 | "Sveti Jurij v Slovenskih Goricah": "210",
3042 | "Sveti Tomaž": "205",
3043 | "Tabor": "184",
3044 | "Tišina": "010",
3045 | "Tolmin": "128",
3046 | "Trbovlje": "129",
3047 | "Trebnje": "130",
3048 | "Trnovska Vas": "185",
3049 | "Trzin": "186",
3050 | "Tržič": "131",
3051 | "Turnišče": "132",
3052 | "Velenje": "133",
3053 | "Velika Polana": "187",
3054 | "Velike Lašče": "134",
3055 | "Veržej": "188",
3056 | "Videm": "135",
3057 | "Vipava": "136",
3058 | "Vitanje": "137",
3059 | "Vodice": "138",
3060 | "Vojnik": "139",
3061 | "Vransko": "189",
3062 | "Vrhnika": "140",
3063 | "Vuzenica": "141",
3064 | "Zagorje ob Savi": "142",
3065 | "Zavrč": "143",
3066 | "Zreče": "144",
3067 | "Črenšovci": "015",
3068 | "Črna na Koroškem": "016",
3069 | "Črnomelj": "017",
3070 | "Šalovci": "033",
3071 | "Šempeter–Vrtojba": "183",
3072 | "Šentilj": "118",
3073 | "Šentjernej": "119",
3074 | "Šentjur": "120",
3075 | "Šentrupert": "211",
3076 | "Šenčur": "117",
3077 | "Škocjan": "121",
3078 | "Škofja Loka": "122",
3079 | "Škofljica": "123",
3080 | "Šmarje pri Jelšah": "124",
3081 | "Šmarješke Toplice": "206",
3082 | "Šmartno ob Paki": "125",
3083 | "Šmartno pri Litiji": "194",
3084 | "Šoštanj": "126",
3085 | "Štore": "127",
3086 | "Žalec": "190",
3087 | "Železniki": "146",
3088 | "Žetale": "191",
3089 | "Žiri": "147",
3090 | "Žirovnica": "192",
3091 | "Žužemberk": "193",
3092 | },
3093 | "SB": map[string]string{
3094 | "Capital Territory": "CT",
3095 | "Central": "CE",
3096 | "Choiseul": "CH",
3097 | "Guadalcanal": "GU",
3098 | "Isabel": "IS",
3099 | "Makira-Ulawa": "MK",
3100 | "Malaita": "ML",
3101 | "Rennell and Bellona": "RB",
3102 | "Temotu": "TE",
3103 | "Western": "WE",
3104 | },
3105 | "SO": map[string]string{
3106 | "Awdal": "AW",
3107 | "Bakool": "BK",
3108 | "Banaadir": "BN",
3109 | "Bari": "BR",
3110 | "Bay": "BY",
3111 | "Galguduud": "GA",
3112 | "Gedo": "GE",
3113 | "Hiiraan": "HI",
3114 | "Jubbada Dhexe": "JD",
3115 | "Jubbada Hoose": "JH",
3116 | "Mudug": "MU",
3117 | "Nugaal": "NU",
3118 | "Sanaag": "SA",
3119 | "Shabeellaha Dhexe": "SD",
3120 | "Shabeellaha Hoose": "SH",
3121 | "Sool": "SO",
3122 | "Togdheer": "TO",
3123 | "Woqooyi Galbeed": "WO",
3124 | },
3125 | "ZA": map[string]string{
3126 | "Eastern Cape": "EC",
3127 | "Free State": "FS",
3128 | "Gauteng": "GT",
3129 | "KwaZulu-Natal": "NL",
3130 | "Limpopo": "LP",
3131 | "Mpumalanga": "MP",
3132 | "North West": "NW",
3133 | "Northern Cape": "NC",
3134 | "Western Cape": "WC",
3135 | },
3136 | "GS": map[string]string{},
3137 | "KR": map[string]string{
3138 | "Busan-gwangyeoksi": "26",
3139 | "Chungcheongbuk-do": "43",
3140 | "Chungcheongnam-do": "44",
3141 | "Daegu-gwangyeoksi": "27",
3142 | "Daejeon-gwangyeoksi": "30",
3143 | "Gangwon-do": "42",
3144 | "Gwangju-gwangyeoksi": "29",
3145 | "Gyeonggi-do": "41",
3146 | "Gyeongsangbuk-do": "47",
3147 | "Gyeongsangnam-do": "48",
3148 | "Incheon-gwangyeoksi": "28",
3149 | "Jeju-teukbyeoljachido": "49",
3150 | "Jeollabuk-do": "45",
3151 | "Jeollanam-do": "46",
3152 | "Sejong": "50",
3153 | "Seoul-teukbyeolsi": "11",
3154 | "Ulsan-gwangyeoksi": "31",
3155 | },
3156 | "SS": map[string]string{
3157 | "Central Equatoria": "EC",
3158 | "Eastern Equatoria": "EE",
3159 | "Jonglei": "JG",
3160 | "Lakes": "LK",
3161 | "Northern Bahr el Ghazal": "BN",
3162 | "Unity": "UY",
3163 | "Upper Nile": "NU",
3164 | "Warrap": "WR",
3165 | "Western Bahr el Ghazal": "BW",
3166 | "Western Equatoria": "EW",
3167 | },
3168 | "ES": map[string]string{
3169 | "A Coruña": "C",
3170 | "Albacete": "AB",
3171 | "Alicante": "A",
3172 | "Almería": "AL",
3173 | "Asturias": "O",
3174 | "Badajoz": "BA",
3175 | "Balears": "PM",
3176 | "Barcelona": "B",
3177 | "Burgos": "BU",
3178 | "Cantabria": "CB",
3179 | "Castellón": "CS",
3180 | "Ciudad Real": "CR",
3181 | "Cuenca": "CU",
3182 | "Cáceres": "CC",
3183 | "Cádiz": "CA",
3184 | "Córdoba": "CO",
3185 | "Girona": "GI",
3186 | "Granada": "GR",
3187 | "Guadalajara": "GU",
3188 | "Guipúzcoa": "SS",
3189 | "Huelva": "H",
3190 | "Huesca": "HU",
3191 | "Jaén": "J",
3192 | "La Rioja": "RI",
3193 | "Las Palmas": "GC",
3194 | "León": "LE",
3195 | "Lleida": "L",
3196 | "Lugo": "LU",
3197 | "Madrid": "M",
3198 | "Murcia": "MU",
3199 | "Málaga": "MA",
3200 | "Navarra": "NA",
3201 | "Ourense": "OR",
3202 | "Palencia": "P",
3203 | "Pontevedra": "PO",
3204 | "Salamanca": "SA",
3205 | "Santa Cruz de Tenerife": "TF",
3206 | "Segovia": "SG",
3207 | "Sevilla": "SE",
3208 | "Soria": "SO",
3209 | "Tarragona": "T",
3210 | "Teruel": "TE",
3211 | "Toledo": "TO",
3212 | "Valencia": "V",
3213 | "Valladolid": "VA",
3214 | "Vizcaya": "BI",
3215 | "Zamora": "ZA",
3216 | "Zaragoza": "Z",
3217 | "Álava": "VI",
3218 | "Ávila": "AV",
3219 | "Ceuta": "CE",
3220 | "Melilla": "ML",
3221 | "Andalucía": "AN",
3222 | "Aragón": "AR",
3223 | "Asturias, Principado de": "AS",
3224 | "Canarias": "CN",
3225 | "Castilla y León": "CL",
3226 | "Castilla-La Mancha": "CM",
3227 | "Catalunya": "CT",
3228 | "Extremadura": "EX",
3229 | "Galicia": "GA",
3230 | "Illes Balears": "IB",
3231 | "Madrid, Comunidad de": "MD",
3232 | "Murcia, Región de": "MC",
3233 | "Navarra, Comunidad Foral de": "NC",
3234 | "País Vasco": "PV",
3235 | "Valenciana, Comunidad": "VC",
3236 | },
3237 | "LK": map[string]string{
3238 | "Central Province": "2",
3239 | "Eastern Province": "5",
3240 | "North Central Province": "7",
3241 | "North Western Province": "6",
3242 | "Northern Province": "4",
3243 | "Sabaragamuwa Province": "9",
3244 | "Southern Province": "3",
3245 | "Uva Province": "8",
3246 | "Western Province": "1",
3247 | },
3248 | "SD": map[string]string{
3249 | "Al Baḩr al Aḩmar": "RS",
3250 | "Al Jazīrah": "GZ",
3251 | "Al Kharţūm": "KH",
3252 | "Al Qaḑārif": "GD",
3253 | "An Nīl": "NR",
3254 | "An Nīl al Abyaḑ": "NW",
3255 | "An Nīl al Azraq": "NB",
3256 | "Ash Shamālīyah": "NO",
3257 | "Gharb Dārfūr": "DW",
3258 | "Janūb Dārfūr": "DS",
3259 | "Janūb Kurdufān": "KS",
3260 | "Kassalā": "KA",
3261 | "Shamāl Dārfūr": "DN",
3262 | "Shamāl Kurdufān": "KN",
3263 | "Sharq Dārfūr": "DE",
3264 | "Sinnār": "SI",
3265 | "Zalingei": "DC",
3266 | },
3267 | "SR": map[string]string{
3268 | "Brokopondo": "BR",
3269 | "Commewijne": "CM",
3270 | "Coronie": "CR",
3271 | "Marowijne": "MA",
3272 | "Nickerie": "NI",
3273 | "Para": "PR",
3274 | "Paramaribo": "PM",
3275 | "Saramacca": "SA",
3276 | "Sipaliwini": "SI",
3277 | "Wanica": "WA",
3278 | },
3279 | "SJ": map[string]string{},
3280 | "SZ": map[string]string{
3281 | "Hhohho": "HH",
3282 | "Lubombo": "LU",
3283 | "Manzini": "MA",
3284 | "Shiselweni": "SH",
3285 | },
3286 | "SE": map[string]string{
3287 | "Blekinge län": "K",
3288 | "Dalarnas län": "W",
3289 | "Gotlands län": "I",
3290 | "Gävleborgs län": "X",
3291 | "Hallands län": "N",
3292 | "Jämtlands län": "Z",
3293 | "Jönköpings län": "F",
3294 | "Kalmar län": "H",
3295 | "Kronobergs län": "G",
3296 | "Norrbottens län": "BD",
3297 | "Skåne län": "M",
3298 | "Stockholms län": "AB",
3299 | "Södermanlands län": "D",
3300 | "Uppsala län": "C",
3301 | "Värmlands län": "S",
3302 | "Västerbottens län": "AC",
3303 | "Västernorrlands län": "Y",
3304 | "Västmanlands län": "U",
3305 | "Västra Götalands län": "O",
3306 | "Örebro län": "T",
3307 | "Östergötlands län": "E",
3308 | },
3309 | "CH": map[string]string{
3310 | "Aargau": "AG",
3311 | "Appenzell Ausserrhoden": "AR",
3312 | "Appenzell Innerrhoden": "AI",
3313 | "Basel-Landschaft": "BL",
3314 | "Basel-Stadt": "BS",
3315 | "Bern": "BE",
3316 | "Fribourg": "FR",
3317 | "Genève": "GE",
3318 | "Glarus": "GL",
3319 | "Graubünden": "GR",
3320 | "Jura": "JU",
3321 | "Luzern": "LU",
3322 | "Neuchâtel": "NE",
3323 | "Nidwalden": "NW",
3324 | "Obwalden": "OW",
3325 | "Sankt Gallen": "SG",
3326 | "Schaffhausen": "SH",
3327 | "Schwyz": "SZ",
3328 | "Solothurn": "SO",
3329 | "Thurgau": "TG",
3330 | "Ticino": "TI",
3331 | "Uri": "UR",
3332 | "Valais": "VS",
3333 | "Vaud": "VD",
3334 | "Zug": "ZG",
3335 | "Zürich": "ZH",
3336 | },
3337 | "SY": map[string]string{
3338 | "Al Lādhiqīyah": "LA",
3339 | "Al Qunayţirah": "QU",
3340 | "Al Ḩasakah": "HA",
3341 | "Ar Raqqah": "RA",
3342 | "As Suwaydā'": "SU",
3343 | "Darٰā": "DR",
3344 | "Dayr az Zawr": "DY",
3345 | "Dimashq": "DI",
3346 | "Idlib": "ID",
3347 | "Rīf Dimashq": "RD",
3348 | "Ţarţūs": "TA",
3349 | "Ḩalab": "HL",
3350 | "Ḩamāh": "HM",
3351 | "Ḩimş": "HI",
3352 | },
3353 | "TW": map[string]string{
3354 | "Changhua": "CHA",
3355 | "Chiayi": "CYI",
3356 | "Hsinchu": "HSQ",
3357 | "Hualien": "HUA",
3358 | "Ilan": "ILA",
3359 | "Kaohsiung": "KHH",
3360 | "Keelung": "KEE",
3361 | "Miaoli": "MIA",
3362 | "Nantou": "NAN",
3363 | "Penghu": "PEN",
3364 | "Pingtung": "PIF",
3365 | "Taichung": "TXQ",
3366 | "Tainan": "TNQ",
3367 | "Taipei": "TPQ",
3368 | "Taitung": "TTT",
3369 | "Taoyuan": "TAO",
3370 | "Yunlin": "YUN",
3371 | },
3372 | "TJ": map[string]string{
3373 | "Dushanbe": "DU",
3374 | "Khatlon": "KT",
3375 | "Kŭhistoni Badakhshon": "GB",
3376 | "Sughd": "SU",
3377 | },
3378 | "TZ": map[string]string{
3379 | "Arusha": "01",
3380 | "Dar es Salaam": "02",
3381 | "Dodoma": "03",
3382 | "Iringa": "04",
3383 | "Kagera": "05",
3384 | "Kaskazini Pemba": "06",
3385 | "Kaskazini Unguja": "07",
3386 | "Kigoma": "08",
3387 | "Kilimanjaro": "09",
3388 | "Kusini Pemba": "10",
3389 | "Kusini Unguja": "11",
3390 | "Lindi": "12",
3391 | "Manyara": "26",
3392 | "Mara": "13",
3393 | "Mbeya": "14",
3394 | "Mjini Magharibi": "15",
3395 | "Morogoro": "16",
3396 | "Mtwara": "17",
3397 | "Mwanza": "18",
3398 | "Pwani": "19",
3399 | "Rukwa": "20",
3400 | "Ruvuma": "21",
3401 | "Shinyanga": "22",
3402 | "Singida": "23",
3403 | "Tabora": "24",
3404 | "Tanga": "25",
3405 | },
3406 | "TH": map[string]string{
3407 | "Amnat Charoen": "37",
3408 | "Ang Thong": "15",
3409 | "Bueng Kan": "38",
3410 | "Buri Ram": "31",
3411 | "Chachoengsao": "24",
3412 | "Chai Nat": "18",
3413 | "Chaiyaphum": "36",
3414 | "Chanthaburi": "22",
3415 | "Chiang Mai": "50",
3416 | "Chiang Rai": "57",
3417 | "Chon Buri": "20",
3418 | "Chumphon": "86",
3419 | "Kalasin": "46",
3420 | "Kamphaeng Phet": "62",
3421 | "Kanchanaburi": "71",
3422 | "Khon Kaen": "40",
3423 | "Krabi": "81",
3424 | "Krung Thep Maha Nakhon": "10",
3425 | "Lampang": "52",
3426 | "Lamphun": "51",
3427 | "Loei": "42",
3428 | "Lop Buri": "16",
3429 | "Mae Hong Son": "58",
3430 | "Maha Sarakham": "44",
3431 | "Mukdahan": "49",
3432 | "Nakhon Nayok": "26",
3433 | "Nakhon Pathom": "73",
3434 | "Nakhon Phanom": "48",
3435 | "Nakhon Ratchasima": "30",
3436 | "Nakhon Sawan": "60",
3437 | "Nakhon Si Thammarat": "80",
3438 | "Nan": "55",
3439 | "Narathiwat": "96",
3440 | "Nong Bua Lam Phu": "39",
3441 | "Nong Khai": "43",
3442 | "Nonthaburi": "12",
3443 | "Pathum Thani": "13",
3444 | "Pattani": "94",
3445 | "Phangnga": "82",
3446 | "Phatthalung": "93",
3447 | "Phatthaya": "S",
3448 | "Phayao": "56",
3449 | "Phetchabun": "67",
3450 | "Phetchaburi": "76",
3451 | "Phichit": "66",
3452 | "Phitsanulok": "65",
3453 | "Phra Nakhon Si Ayutthaya": "14",
3454 | "Phrae": "54",
3455 | "Phuket": "83",
3456 | "Prachin Buri": "25",
3457 | "Prachuap Khiri Khan": "77",
3458 | "Ranong": "85",
3459 | "Ratchaburi": "70",
3460 | "Rayong": "21",
3461 | "Roi Et": "45",
3462 | "Sa Kaeo": "27",
3463 | "Sakon Nakhon": "47",
3464 | "Samut Prakan": "11",
3465 | "Samut Sakhon": "74",
3466 | "Samut Songkhram": "75",
3467 | "Saraburi": "19",
3468 | "Satun": "91",
3469 | "Si Sa Ket": "33",
3470 | "Sing Buri": "17",
3471 | "Songkhla": "90",
3472 | "Sukhothai": "64",
3473 | "Suphan Buri": "72",
3474 | "Surat Thani": "84",
3475 | "Surin": "32",
3476 | "Tak": "63",
3477 | "Trang": "92",
3478 | "Trat": "23",
3479 | "Ubon Ratchathani": "34",
3480 | "Udon Thani": "41",
3481 | "Uthai Thani": "61",
3482 | "Uttaradit": "53",
3483 | "Yala": "95",
3484 | "Yasothon": "35",
3485 | },
3486 | "TL": map[string]string{
3487 | "Aileu": "AL",
3488 | "Ainaro": "AN",
3489 | "Baucau": "BA",
3490 | "Bobonaro": "BO",
3491 | "Cova Lima": "CO",
3492 | "Díli": "DI",
3493 | "Ermera": "ER",
3494 | "Lautem": "LA",
3495 | "Liquiça": "LI",
3496 | "Manatuto": "MT",
3497 | "Manufahi": "MF",
3498 | "Oecussi": "OE",
3499 | "Viqueque": "VI",
3500 | },
3501 | "TG": map[string]string{
3502 | "Centre": "C",
3503 | "Kara": "K",
3504 | "Maritime": "M",
3505 | "Plateaux": "P",
3506 | "Savannes": "S",
3507 | },
3508 | "TK": map[string]string{},
3509 | "TO": map[string]string{
3510 | "'Eua": "01",
3511 | "Ha'apai": "02",
3512 | "Niuas": "03",
3513 | "Tongatapu": "04",
3514 | "Vava'u": "05",
3515 | },
3516 | "TT": map[string]string{
3517 | "Arima": "ARI",
3518 | "Chaguanas": "CHA",
3519 | "Couva-Tabaquite-Talparo": "CTT",
3520 | "Diego Martin": "DMN",
3521 | "Eastern Tobago": "ETO",
3522 | "Penal-Debe": "PED",
3523 | "Point Fortin": "PTF",
3524 | "Port of Spain": "POS",
3525 | "Princes Town": "PRT",
3526 | "Rio Claro-Mayaro": "RCM",
3527 | "San Fernando": "SFO",
3528 | "San Juan-Laventille": "SJL",
3529 | "Sangre Grande": "SGE",
3530 | "Siparia": "SIP",
3531 | "Tunapuna-Piarco": "TUP",
3532 | "Western Tobago": "WTO",
3533 | },
3534 | "TN": map[string]string{
3535 | "Ariana": "12",
3536 | "Ben Arous": "13",
3537 | "Bizerte": "23",
3538 | "Béja": "31",
3539 | "Gabès": "81",
3540 | "Gafsa": "71",
3541 | "Jendouba": "32",
3542 | "Kairouan": "41",
3543 | "Kasserine": "42",
3544 | "Kebili": "73",
3545 | "La Manouba": "14",
3546 | "Le Kef": "33",
3547 | "Mahdia": "53",
3548 | "Medenine": "82",
3549 | "Monastir": "52",
3550 | "Nabeul": "21",
3551 | "Sfax": "61",
3552 | "Sidi Bouzid": "43",
3553 | "Siliana": "34",
3554 | "Sousse": "51",
3555 | "Tataouine": "83",
3556 | "Tozeur": "72",
3557 | "Tunis": "11",
3558 | "Zaghouan": "22",
3559 | },
3560 | "TR": map[string]string{
3561 | "Adana": "01",
3562 | "Adıyaman": "02",
3563 | "Afyonkarahisar": "03",
3564 | "Aksaray": "68",
3565 | "Amasya": "05",
3566 | "Ankara": "06",
3567 | "Antalya": "07",
3568 | "Ardahan": "75",
3569 | "Artvin": "08",
3570 | "Aydın": "09",
3571 | "Ağrı": "04",
3572 | "Balıkesir": "10",
3573 | "Bartın": "74",
3574 | "Batman": "72",
3575 | "Bayburt": "69",
3576 | "Bilecik": "11",
3577 | "Bingöl": "12",
3578 | "Bitlis": "13",
3579 | "Bolu": "14",
3580 | "Burdur": "15",
3581 | "Bursa": "16",
3582 | "Denizli": "20",
3583 | "Diyarbakır": "21",
3584 | "Düzce": "81",
3585 | "Edirne": "22",
3586 | "Elazığ": "23",
3587 | "Erzincan": "24",
3588 | "Erzurum": "25",
3589 | "Eskişehir": "26",
3590 | "Gaziantep": "27",
3591 | "Giresun": "28",
3592 | "Gümüşhane": "29",
3593 | "Hakkâri": "30",
3594 | "Hatay": "31",
3595 | "Isparta": "32",
3596 | "Iğdır": "76",
3597 | "Kahramanmaraş": "46",
3598 | "Karabük": "78",
3599 | "Karaman": "70",
3600 | "Kars": "36",
3601 | "Kastamonu": "37",
3602 | "Kayseri": "38",
3603 | "Kilis": "79",
3604 | "Kocaeli": "41",
3605 | "Konya": "42",
3606 | "Kütahya": "43",
3607 | "Kırklareli": "39",
3608 | "Kırıkkale": "71",
3609 | "Kırşehir": "40",
3610 | "Malatya": "44",
3611 | "Manisa": "45",
3612 | "Mardin": "47",
3613 | "Mersin": "33",
3614 | "Muğla": "48",
3615 | "Muş": "49",
3616 | "Nevşehir": "50",
3617 | "Niğde": "51",
3618 | "Ordu": "52",
3619 | "Osmaniye": "80",
3620 | "Rize": "53",
3621 | "Sakarya": "54",
3622 | "Samsun": "55",
3623 | "Siirt": "56",
3624 | "Sinop": "57",
3625 | "Sivas": "58",
3626 | "Tekirdağ": "59",
3627 | "Tokat": "60",
3628 | "Trabzon": "61",
3629 | "Tunceli": "62",
3630 | "Uşak": "64",
3631 | "Van": "65",
3632 | "Yalova": "77",
3633 | "Yozgat": "66",
3634 | "Zonguldak": "67",
3635 | "Çanakkale": "17",
3636 | "Çankırı": "18",
3637 | "Çorum": "19",
3638 | "İstanbul": "34",
3639 | "İzmir": "35",
3640 | "Şanlıurfa": "63",
3641 | "Şırnak": "73",
3642 | },
3643 | "TM": map[string]string{
3644 | "Ahal": "A",
3645 | "Aşgabat": "S",
3646 | "Balkan": "B",
3647 | "Daşoguz": "D",
3648 | "Lebap": "L",
3649 | "Mary": "M",
3650 | },
3651 | "TC": map[string]string{},
3652 | "TV": map[string]string{
3653 | "Funafuti": "FUN",
3654 | "Nanumanga": "NMG",
3655 | "Nanumea": "NMA",
3656 | "Niutao": "NIT",
3657 | "Nui": "NUI",
3658 | "Nukufetau": "NKF",
3659 | "Nukulaelae": "NKL",
3660 | "Vaitupu": "VAI",
3661 | },
3662 | "UG": map[string]string{
3663 | "Central": "C",
3664 | "Eastern": "E",
3665 | "Northern": "N",
3666 | "Western": "W",
3667 | },
3668 | "UA": map[string]string{
3669 | "Avtonomna Respublika Krym": "43",
3670 | "Cherkas'ka Oblast'": "71",
3671 | "Chernihivs'ka Oblast'": "74",
3672 | "Chernivets'ka Oblast'": "77",
3673 | "Dnipropetrovs'ka Oblast'": "12",
3674 | "Donets'ka Oblast'": "14",
3675 | "Ivano-Frankivs'ka Oblast'": "26",
3676 | "Kharkivs'ka Oblast'": "63",
3677 | "Khersons'ka Oblast'": "65",
3678 | "Khmel'nyts'ka Oblast'": "68",
3679 | "Kirovohrads'ka Oblast'": "35",
3680 | "Kyïv": "30",
3681 | "Kyïvs'ka Oblast'": "32",
3682 | "L'vivs'ka Oblast'": "46",
3683 | "Luhans'ka Oblast'": "09",
3684 | "Mykolaïvs'ka Oblast'": "48",
3685 | "Odes'ka Oblast'": "51",
3686 | "Poltavs'ka Oblast'": "53",
3687 | "Rivnens'ka Oblast'": "56",
3688 | "Sevastopol'": "40",
3689 | "Sums'ka Oblast'": "59",
3690 | "Ternopil's'ka Oblast'": "61",
3691 | "Vinnyts'ka Oblast'": "05",
3692 | "Volyns'ka Oblast'": "07",
3693 | "Zakarpats'ka Oblast'": "21",
3694 | "Zaporiz'ka Oblast'": "23",
3695 | "Zhytomyrs'ka Oblast'": "18",
3696 | },
3697 | "AE": map[string]string{
3698 | "'Ajmān": "AJ",
3699 | "Abū Z̧aby": "AZ",
3700 | "Al Fujayrah": "FU",
3701 | "Ash Shāriqah": "SH",
3702 | "Dubayy": "DU",
3703 | "Ra's al Khaymah": "RK",
3704 | "Umm al Qaywayn": "UQ",
3705 | },
3706 | "GB": map[string]string{
3707 | "Barking and Dagenham": "BDG",
3708 | "Barnet": "BNE",
3709 | "Bexley": "BEX",
3710 | "Brent": "BEN",
3711 | "Bromley": "BRY",
3712 | "Camden": "CMD",
3713 | "Croydon": "CRY",
3714 | "Ealing": "EAL",
3715 | "Enfield": "ENF",
3716 | "Greenwich": "GRE",
3717 | "Hackney": "HCK",
3718 | "Hammersmith and Fulham": "HMF",
3719 | "Haringey": "HRY",
3720 | "Harrow": "HRW",
3721 | "Havering": "HAV",
3722 | "Hillingdon": "HIL",
3723 | "Hounslow": "HNS",
3724 | "Islington": "ISL",
3725 | "Kensington and Chelsea": "KEC",
3726 | "Kingston upon Thames": "KTT",
3727 | "Lambeth": "LBH",
3728 | "Lewisham": "LEW",
3729 | "Merton": "MRT",
3730 | "Newham": "NWM",
3731 | "Redbridge": "RDB",
3732 | "Richmond upon Thames": "RIC",
3733 | "Southwark": "SWK",
3734 | "Sutton": "STN",
3735 | "Tower Hamlets": "TWH",
3736 | "Waltham Forest": "WFT",
3737 | "Wandsworth": "WND",
3738 | "Westminster": "WSM",
3739 | "England and Wales": "EAW",
3740 | "Great Britain": "GBN",
3741 | "United Kingdom": "UKM",
3742 | "London, City of": "LND",
3743 | "Aberdeen City": "ABE",
3744 | "Aberdeenshire": "ABD",
3745 | "Angus": "ANS",
3746 | "Argyll and Bute": "AGB",
3747 | "Clackmannanshire": "CLK",
3748 | "Dumfries and Galloway": "DGY",
3749 | "Dundee City": "DND",
3750 | "East Ayrshire": "EAY",
3751 | "East Dunbartonshire": "EDU",
3752 | "East Lothian": "ELN",
3753 | "East Renfrewshire": "ERW",
3754 | "Edinburgh, City of": "EDH",
3755 | "Eilean Siar": "ELS",
3756 | "Falkirk": "FAL",
3757 | "Fife": "FIF",
3758 | "Glasgow City": "GLG",
3759 | "Highland": "HLD",
3760 | "Inverclyde": "IVC",
3761 | "Midlothian": "MLN",
3762 | "Moray": "MRY",
3763 | "North Ayrshire": "NAY",
3764 | "North Lanarkshire": "NLK",
3765 | "Orkney Islands": "ORK",
3766 | "Perth and Kinross": "PKN",
3767 | "Renfrewshire": "RFW",
3768 | "Scottish Borders, The": "SCB",
3769 | "Shetland Islands": "ZET",
3770 | "South Ayrshire": "SAY",
3771 | "South Lanarkshire": "SLK",
3772 | "Stirling": "STG",
3773 | "West Dunbartonshire": "WDU",
3774 | "West Lothian": "WLN",
3775 | "England": "ENG",
3776 | "Scotland": "SCT",
3777 | "Wales": "WLS",
3778 | "Antrim": "ANT",
3779 | "Ards": "ARD",
3780 | "Armagh": "ARM",
3781 | "Ballymena": "BLA",
3782 | "Ballymoney": "BLY",
3783 | "Banbridge": "BNB",
3784 | "Belfast": "BFS",
3785 | "Carrickfergus": "CKF",
3786 | "Castlereagh": "CSR",
3787 | "Coleraine": "CLR",
3788 | "Cookstown": "CKT",
3789 | "Craigavon": "CGV",
3790 | "Derry": "DRY",
3791 | "Down": "DOW",
3792 | "Dungannon and South Tyrone": "DGN",
3793 | "Fermanagh": "FER",
3794 | "Larne": "LRN",
3795 | "Limavady": "LMV",
3796 | "Lisburn": "LSB",
3797 | "Magherafelt": "MFT",
3798 | "Moyle": "MYL",
3799 | "Newry and Mourne District": "NYM",
3800 | "Newtownabbey": "NTA",
3801 | "North Down": "NDN",
3802 | "Omagh": "OMH",
3803 | "Strabane": "STB",
3804 | "Barnsley": "BNS",
3805 | "Birmingham": "BIR",
3806 | "Bolton": "BOL",
3807 | "Bradford": "BRD",
3808 | "Bury": "BUR",
3809 | "Calderdale": "CLD",
3810 | "Coventry": "COV",
3811 | "Doncaster": "DNC",
3812 | "Dudley": "DUD",
3813 | "Gateshead": "GAT",
3814 | "Kirklees": "KIR",
3815 | "Knowsley": "KWL",
3816 | "Leeds": "LDS",
3817 | "Liverpool": "LIV",
3818 | "Manchester": "MAN",
3819 | "Newcastle upon Tyne": "NET",
3820 | "North Tyneside": "NTY",
3821 | "Oldham": "OLD",
3822 | "Rochdale": "RCH",
3823 | "Rotherham": "ROT",
3824 | "Salford": "SLF",
3825 | "Sandwell": "SAW",
3826 | "Sefton": "SFT",
3827 | "Sheffield": "SHF",
3828 | "Solihull": "SOL",
3829 | "South Tyneside": "STY",
3830 | "St. Helens": "SHN",
3831 | "Stockport": "SKP",
3832 | "Sunderland": "SND",
3833 | "Tameside": "TAM",
3834 | "Trafford": "TRF",
3835 | "Wakefield": "WKF",
3836 | "Walsall": "WLL",
3837 | "Wigan": "WGN",
3838 | "Wirral": "WRL",
3839 | "Wolverhampton": "WLV",
3840 | "Northern Ireland": "NIR",
3841 | "Buckinghamshire": "BKM",
3842 | "Cambridgeshire": "CAM",
3843 | "Cumbria": "CMA",
3844 | "Derbyshire": "DBY",
3845 | "Devon": "DEV",
3846 | "Dorset": "DOR",
3847 | "East Sussex": "ESX",
3848 | "Essex": "ESS",
3849 | "Gloucestershire": "GLS",
3850 | "Hampshire": "HAM",
3851 | "Hertfordshire": "HRT",
3852 | "Kent": "KEN",
3853 | "Lancashire": "LAN",
3854 | "Leicestershire": "LEC",
3855 | "Lincolnshire": "LIN",
3856 | "Norfolk": "NFK",
3857 | "North Yorkshire": "NYK",
3858 | "Northamptonshire": "NTH",
3859 | "Nottinghamshire": "NTT",
3860 | "Oxfordshire": "OXF",
3861 | "Somerset": "SOM",
3862 | "Staffordshire": "STS",
3863 | "Suffolk": "SFK",
3864 | "Surrey": "SRY",
3865 | "Warwickshire": "WAR",
3866 | "West Sussex": "WSX",
3867 | "Worcestershire": "WOR",
3868 | "Bath and North East Somerset": "BAS",
3869 | "Bedford": "BDF",
3870 | "Blackburn with Darwen": "BBD",
3871 | "Blackpool": "BPL",
3872 | "Blaenau Gwent": "BGW",
3873 | "Bournemouth": "BMH",
3874 | "Bracknell Forest": "BRC",
3875 | "Bridgend": "BGE",
3876 | "Brighton and Hove": "BNH",
3877 | "Bristol, City of": "BST",
3878 | "Caerphilly": "CAY",
3879 | "Cardiff": "CRF",
3880 | "Carmarthenshire": "CMN",
3881 | "Central Bedfordshire": "CBF",
3882 | "Ceredigion": "CGN",
3883 | "Cheshire East": "CHE",
3884 | "Cheshire West and Chester": "CHW",
3885 | "Conwy": "CWY",
3886 | "Cornwall": "CON",
3887 | "Darlington": "DAL",
3888 | "Denbighshire": "DEN",
3889 | "Derby": "DER",
3890 | "Durham, County": "DUR",
3891 | "East Riding of Yorkshire": "ERY",
3892 | "Flintshire": "FLN",
3893 | "Gwynedd": "GWN",
3894 | "Halton": "HAL",
3895 | "Hartlepool": "HPL",
3896 | "Herefordshire": "HEF",
3897 | "Isle of Anglesey": "AGY",
3898 | "Isle of Wight": "IOW",
3899 | "Isles of Scilly": "IOS",
3900 | "Kingston upon Hull": "KHL",
3901 | "Leicester": "LCE",
3902 | "Luton": "LUT",
3903 | "Medway": "MDW",
3904 | "Merthyr Tydfil": "MTY",
3905 | "Middlesbrough": "MDB",
3906 | "Milton Keynes": "MIK",
3907 | "Monmouthshire": "MON",
3908 | "Neath Port Talbot": "NTL",
3909 | "Newport": "NWP",
3910 | "North East Lincolnshire": "NEL",
3911 | "North Lincolnshire": "NLN",
3912 | "North Somerset": "NSM",
3913 | "Northumberland": "NBL",
3914 | "Nottingham": "NGM",
3915 | "Pembrokeshire": "PEM",
3916 | "Peterborough": "PTE",
3917 | "Plymouth": "PLY",
3918 | "Poole": "POL",
3919 | "Portsmouth": "POR",
3920 | "Powys": "POW",
3921 | "Reading": "RDG",
3922 | "Redcar and Cleveland": "RCC",
3923 | "Rhondda, Cynon, Taff": "RCT",
3924 | "Rutland": "RUT",
3925 | "Shropshire": "SHR",
3926 | "Slough": "SLG",
3927 | "South Gloucestershire": "SGC",
3928 | "Southampton": "STH",
3929 | "Southend-on-Sea": "SOS",
3930 | "Stockton-on-Tees": "STT",
3931 | "Stoke-on-Trent": "STE",
3932 | "Swansea": "SWA",
3933 | "Swindon": "SWD",
3934 | "Telford and Wrekin": "TFW",
3935 | "Thurrock": "THR",
3936 | "Torbay": "TOB",
3937 | "Torfaen": "TOF",
3938 | "Vale of Glamorgan, The": "VGL",
3939 | "Warrington": "WRT",
3940 | "West Berkshire": "WBK",
3941 | "Wiltshire": "WIL",
3942 | "Windsor and Maidenhead": "WNM",
3943 | "Wokingham": "WOK",
3944 | "Wrexham": "WRX",
3945 | "York": "YOR",
3946 | },
3947 | "US": map[string]string{
3948 | "AL": "Alabama",
3949 | "AK": "Alaska",
3950 | "AS": "American Samoa",
3951 | "AZ": "Arizona",
3952 | "AR": "Arkansas",
3953 | "CA": "California",
3954 | "CO": "Colorado",
3955 | "CT": "Connecticut",
3956 | "DE": "Delaware",
3957 | "DC": "District Of Columbia",
3958 | "FM": "Federated States Of Micronesia",
3959 | "FL": "Florida",
3960 | "GA": "Georgia",
3961 | "GU": "Guam",
3962 | "HI": "Hawaii",
3963 | "ID": "Idaho",
3964 | "IL": "Illinois",
3965 | "IN": "Indiana",
3966 | "IA": "Iowa",
3967 | "KS": "Kansas",
3968 | "KY": "Kentucky",
3969 | "LA": "Louisiana",
3970 | "ME": "Maine",
3971 | "MH": "Marshall Islands",
3972 | "MD": "Maryland",
3973 | "MA": "Massachusetts",
3974 | "MI": "Michigan",
3975 | "MN": "Minnesota",
3976 | "MS": "Mississippi",
3977 | "MO": "Missouri",
3978 | "MT": "Montana",
3979 | "NE": "Nebraska",
3980 | "NV": "Nevada",
3981 | "NH": "New Hampshire",
3982 | "NJ": "New Jersey",
3983 | "NM": "New Mexico",
3984 | "NY": "New York",
3985 | "NC": "North Carolina",
3986 | "ND": "North Dakota",
3987 | "MP": "Northern Mariana Islands",
3988 | "OH": "Ohio",
3989 | "OK": "Oklahoma",
3990 | "OR": "Oregon",
3991 | "PW": "Palau",
3992 | "PA": "Pennsylvania",
3993 | "PR": "Puerto Rico",
3994 | "RI": "Rhode Island",
3995 | "SC": "South Carolina",
3996 | "SD": "South Dakota",
3997 | "TN": "Tennessee",
3998 | "TX": "Texas",
3999 | "UT": "Utah",
4000 | "VT": "Vermont",
4001 | "VI": "Virgin Islands",
4002 | "VA": "Virginia",
4003 | "WA": "Washington",
4004 | "WV": "West Virginia",
4005 | "WI": "Wisconsin",
4006 | "WY": "Wyoming",
4007 | },
4008 | "UY": map[string]string{
4009 | "Artigas": "AR",
4010 | "Canelones": "CA",
4011 | "Cerro Largo": "CL",
4012 | "Colonia": "CO",
4013 | "Durazno": "DU",
4014 | "Flores": "FS",
4015 | "Florida": "FD",
4016 | "Lavalleja": "LA",
4017 | "Maldonado": "MA",
4018 | "Montevideo": "MO",
4019 | "Paysandú": "PA",
4020 | "Rivera": "RV",
4021 | "Rocha": "RO",
4022 | "Río Negro": "RN",
4023 | "Salto": "SA",
4024 | "San José": "SJ",
4025 | "Soriano": "SO",
4026 | "Tacuarembó": "TA",
4027 | "Treinta y Tres": "TT",
4028 | },
4029 | "UZ": map[string]string{
4030 | "Andijon": "AN",
4031 | "Buxoro": "BU",
4032 | "Farg‘ona": "FA",
4033 | "Jizzax": "JI",
4034 | "Namangan": "NG",
4035 | "Navoiy": "NW",
4036 | "Qashqadaryo": "QA",
4037 | "Qoraqalpog‘iston Respublikasi": "QR",
4038 | "Samarqand": "SA",
4039 | "Sirdaryo": "SI",
4040 | "Surxondaryo": "SU",
4041 | "Toshkent": "TK",
4042 | "Xorazm": "XO",
4043 | },
4044 | "VU": map[string]string{
4045 | "Malampa": "MAP",
4046 | "Pénama": "PAM",
4047 | "Sanma": "SAM",
4048 | "Shéfa": "SEE",
4049 | "Taféa": "TAE",
4050 | "Torba": "TOB",
4051 | },
4052 | "VE": map[string]string{
4053 | "Amazonas": "Z",
4054 | "Anzoátegui": "B",
4055 | "Apure": "C",
4056 | "Aragua": "D",
4057 | "Barinas": "E",
4058 | "Bolívar": "F",
4059 | "Carabobo": "G",
4060 | "Cojedes": "H",
4061 | "Delta Amacuro": "Y",
4062 | "Dependencias Federales": "W",
4063 | "Distrito Capital": "A",
4064 | "Falcón": "I",
4065 | "Guárico": "J",
4066 | "Lara": "K",
4067 | "Miranda": "M",
4068 | "Monagas": "N",
4069 | "Mérida": "L",
4070 | "Nueva Esparta": "O",
4071 | "Portuguesa": "P",
4072 | "Sucre": "R",
4073 | "Trujillo": "T",
4074 | "Táchira": "S",
4075 | "Vargas": "X",
4076 | "Yaracuy": "U",
4077 | "Zulia": "V",
4078 | },
4079 | "VN": map[string]string{
4080 | "An Giang": "44",
4081 | "Bà Rịa–Vũng Tàu": "43",
4082 | "Bình Dương": "57",
4083 | "Bình Phước": "58",
4084 | "Bình Thuận": "40",
4085 | "Bình Định": "31",
4086 | "Bạc Liêu": "55",
4087 | "Bắc Giang": "54",
4088 | "Bắc Kạn": "53",
4089 | "Bắc Ninh": "56",
4090 | "Bến Tre": "50",
4091 | "Cao Bằng": "04",
4092 | "Cà Mau": "59",
4093 | "Cần Thơ": "CT",
4094 | "Gia Lai": "30",
4095 | "Hà Giang": "03",
4096 | "Hà Nam": "63",
4097 | "Hà Nội": "HN",
4098 | "Hà Tây": "15",
4099 | "Hà Tĩnh": "23",
4100 | "Hòa Bình": "14",
4101 | "Hưng Yên": "66",
4102 | "Hải Dương": "61",
4103 | "Hải Phòng": "HP",
4104 | "Hậu Giang": "73",
4105 | "Hồ Chí Minh": "SG",
4106 | "Khánh Hòa": "34",
4107 | "Kiên Giang": "47",
4108 | "Kon Tum": "28",
4109 | "Lai Châu": "01",
4110 | "Long An": "41",
4111 | "Lào Cai": "02",
4112 | "Lâm Đồng": "35",
4113 | "Lạng Sơn": "09",
4114 | "Nam Định": "67",
4115 | "Nghệ An": "22",
4116 | "Ninh Bình": "18",
4117 | "Ninh Thuận": "36",
4118 | "Phú Thọ": "68",
4119 | "Phú Yên": "32",
4120 | "Quảng Bình": "24",
4121 | "Quảng Nam": "27",
4122 | "Quảng Ngãi": "29",
4123 | "Quảng Ninh": "13",
4124 | "Quảng Trị": "25",
4125 | "Sóc Trăng": "52",
4126 | "Sơn La": "05",
4127 | "Thanh Hóa": "21",
4128 | "Thái Bình": "20",
4129 | "Thái Nguyên": "69",
4130 | "Thừa Thiên–Huế": "26",
4131 | "Tiền Giang": "46",
4132 | "Trà Vinh": "51",
4133 | "Tuyên Quang": "07",
4134 | "Tây Ninh": "37",
4135 | "Vĩnh Long": "49",
4136 | "Vĩnh Phúc": "70",
4137 | "Yên Bái": "06",
4138 | "Điện Biên": "71",
4139 | "Đà Nẵng": "DN",
4140 | "Đắk Lắk": "33",
4141 | "Đắk Nông": "72",
4142 | "Đồng Nai": "39",
4143 | "Đồng Tháp": "45",
4144 | },
4145 | "WF": map[string]string{},
4146 | "EH": map[string]string{},
4147 | "YE": map[string]string{
4148 | "'Adan": "AD",
4149 | "'Amrān": "AM",
4150 | "Abyān": "AB",
4151 | "Al Bayḑā'": "BA",
4152 | "Al Jawf": "JA",
4153 | "Al Mahrah": "MR",
4154 | "Al Maḩwīt": "MW",
4155 | "Al Ḩudaydah": "HU",
4156 | "Aḑ Ḑāli'": "DA",
4157 | "Dhamār": "DH",
4158 | "Ibb": "IB",
4159 | "Laḩij": "LA",
4160 | "Ma'rib": "MA",
4161 | "Raymah": "RA",
4162 | "Shabwah": "SH",
4163 | "Tā‘izz": "TA",
4164 | "Şan‘ā'": "SN",
4165 | "Şā‘dah": "SD",
4166 | "Ḩajjah": "HJ",
4167 | "Ḩaḑramawt": "HD",
4168 | },
4169 | "ZM": map[string]string{
4170 | "Central": "02",
4171 | "Copperbelt": "08",
4172 | "Eastern": "03",
4173 | "Luapula": "04",
4174 | "Lusaka": "09",
4175 | "North-Western": "06",
4176 | "Northern": "05",
4177 | "Southern": "07",
4178 | "Western": "01",
4179 | },
4180 | "ZW": map[string]string{
4181 | "Bulawayo": "BU",
4182 | "Harare": "HA",
4183 | "Manicaland": "MA",
4184 | "Mashonaland Central": "MC",
4185 | "Mashonaland East": "ME",
4186 | "Mashonaland West": "MW",
4187 | "Masvingo": "MV",
4188 | "Matabeleland North": "MN",
4189 | "Matabeleland South": "MS",
4190 | "Midlands": "MI",
4191 | },
4192 | }
4193 |
4194 | func GetStateCode(country, state string) string {
4195 | if c, ok := states[country]; ok {
4196 | if s, ok := c[state]; ok {
4197 | return s
4198 | }
4199 | }
4200 |
4201 | return ""
4202 | }
4203 |
--------------------------------------------------------------------------------
/src/bot/utils/utils.go:
--------------------------------------------------------------------------------
1 | package utils
2 |
3 | import (
4 | "errors"
5 | "fmt"
6 | "math/rand"
7 | "strconv"
8 | "strings"
9 | )
10 |
11 | func RandomString(length int, charset string) string {
12 | temp := make([]byte, length)
13 |
14 | for i := range temp {
15 | temp[i] = charset[rand.Intn(len(charset))]
16 | }
17 |
18 | return string(temp)
19 | }
20 |
21 | func Frange(r1, r2 string) ([]string, error) {
22 |
23 | start, err := strconv.ParseFloat(r1, 64)
24 |
25 | if err != nil {
26 | return []string{}, nil
27 | }
28 |
29 | stop, err := strconv.ParseFloat(r2, 64)
30 |
31 | if err != nil {
32 | return []string{}, nil
33 | }
34 |
35 | sizes := []string{}
36 |
37 | for {
38 | if start > stop {
39 | return sizes, nil
40 | }
41 |
42 | sizes = append(sizes, fmt.Sprintf("%g", start))
43 | start += .5
44 | }
45 | }
46 |
47 | func Extract(target, before, after string) (string, error) {
48 | temp := strings.Split(target, before)
49 |
50 | if len(temp) < 2 {
51 | return "", errors.New("index1 doesn't exist in target")
52 | }
53 |
54 | temp = strings.Split(temp[1], after)
55 |
56 | if len(temp) < 2 {
57 | return "", errors.New("index2 doesn't exist in target")
58 | }
59 |
60 | return temp[0], nil
61 | }
62 |
--------------------------------------------------------------------------------
/src/bot/webhooks/webhooks.go:
--------------------------------------------------------------------------------
1 | package webhooks
2 |
3 | import (
4 | "bytes"
5 | "encoding/json"
6 | "net/http"
7 | "time"
8 | )
9 |
10 | type Footer struct {
11 | Text string `json:"text"`
12 | IconURL string `json:"icon_url"`
13 | }
14 |
15 | type Field struct {
16 | Name string `json:"name"`
17 | Value string `json:"value"`
18 | Inline bool `json:"inline"`
19 | }
20 |
21 | type Thumbnail struct {
22 | URL string `json:"url"`
23 | }
24 |
25 | type Embed struct {
26 | Title string `json:"title"`
27 | Color int `json:"color"`
28 | Thumbnail Thumbnail `json:"thumbnail"`
29 | Description string `json:"description"`
30 | Footer Footer `json:"footer"`
31 | Fields []Field `json:"fields"`
32 | }
33 |
34 | type Webhook struct {
35 | Content string `json:"content"`
36 | Embeds []Embed `json:"embeds"`
37 | }
38 |
39 | func (e *Embed) SetTitle(title string) {
40 | e.Title = title
41 | }
42 |
43 | func (e *Embed) SetColor(color int) {
44 | e.Color = color
45 | }
46 |
47 | func (e *Embed) SetThumbnail(u string) {
48 | e.Thumbnail = Thumbnail{URL: u}
49 | }
50 |
51 | func (e *Embed) SetDescription(description string) {
52 | e.Description = description
53 | }
54 |
55 | func (e *Embed) SetFooter(text, icon string) {
56 | e.Footer = Footer{Text: text, IconURL: icon}
57 | }
58 |
59 | func (e *Embed) AddField(name, value string, inline bool) {
60 | e.Fields = append(e.Fields, Field{Name: name, Value: value, Inline: inline})
61 | }
62 |
63 | func (w *Webhook) SetContent(content string) {
64 | w.Content = content
65 | }
66 |
67 | func (w *Webhook) AddEmbed(e Embed) {
68 | w.Embeds = append(w.Embeds, e)
69 | }
70 |
71 | func (w *Webhook) Encode() ([]byte, error) {
72 | encoded, err := json.Marshal(w)
73 |
74 | if err != nil {
75 | return nil, err
76 | }
77 |
78 | return encoded, nil
79 | }
80 |
81 | func (w *Webhook) Send(u string) error {
82 |
83 | payload, err := w.Encode()
84 |
85 | if err != nil {
86 | return err
87 | }
88 |
89 | for {
90 | req, err := http.NewRequest("POST", u, bytes.NewReader(payload))
91 |
92 | if err != nil {
93 | return err
94 | }
95 |
96 | req.Header.Set("Content-Type", "application/json")
97 |
98 | resp, err := http.DefaultClient.Do(req)
99 |
100 | if err != nil {
101 | return err
102 | }
103 |
104 | resp.Body.Close()
105 |
106 | if resp.StatusCode != 429 {
107 | return nil
108 | }
109 |
110 | time.Sleep(time.Second * 5)
111 | }
112 | }
113 |
--------------------------------------------------------------------------------