vendor packages
authorKali Kaneko (leap communications) <kali@leap.se>
Thu, 13 Dec 2018 18:45:48 +0000 (19:45 +0100)
committerKali Kaneko (leap communications) <kali@leap.se>
Thu, 13 Dec 2018 18:47:11 +0000 (19:47 +0100)
274 files changed:
docs/govendor.txt [new file with mode: 0644]
vendor/github.com/StefanSchroeder/Golang-Ellipsoid/LICENSE [new file with mode: 0755]
vendor/github.com/StefanSchroeder/Golang-Ellipsoid/ellipsoid/ellipsoid.go [new file with mode: 0755]
vendor/github.com/dropbox/godropbox/errors/errors.go [new file with mode: 0644]
vendor/github.com/dropbox/godropbox/license.txt [new file with mode: 0644]
vendor/github.com/hongshibao/go-algo/LICENSE [new file with mode: 0644]
vendor/github.com/hongshibao/go-algo/README.md [new file with mode: 0644]
vendor/github.com/hongshibao/go-algo/selection.go [new file with mode: 0644]
vendor/github.com/hongshibao/go-kdtree/LICENSE.md [new file with mode: 0644]
vendor/github.com/hongshibao/go-kdtree/README.md [new file with mode: 0644]
vendor/github.com/hongshibao/go-kdtree/kdtree.go [new file with mode: 0644]
vendor/github.com/oschwald/geoip2-golang/LICENSE [new file with mode: 0644]
vendor/github.com/oschwald/geoip2-golang/README.md [new file with mode: 0644]
vendor/github.com/oschwald/geoip2-golang/reader.go [new file with mode: 0644]
vendor/github.com/oschwald/maxminddb-golang/LICENSE [new file with mode: 0644]
vendor/github.com/oschwald/maxminddb-golang/README.md [new file with mode: 0644]
vendor/github.com/oschwald/maxminddb-golang/appveyor.yml [new file with mode: 0644]
vendor/github.com/oschwald/maxminddb-golang/decoder.go [new file with mode: 0644]
vendor/github.com/oschwald/maxminddb-golang/errors.go [new file with mode: 0644]
vendor/github.com/oschwald/maxminddb-golang/mmap_unix.go [new file with mode: 0644]
vendor/github.com/oschwald/maxminddb-golang/mmap_windows.go [new file with mode: 0644]
vendor/github.com/oschwald/maxminddb-golang/reader.go [new file with mode: 0644]
vendor/github.com/oschwald/maxminddb-golang/reader_appengine.go [new file with mode: 0644]
vendor/github.com/oschwald/maxminddb-golang/reader_other.go [new file with mode: 0644]
vendor/github.com/oschwald/maxminddb-golang/traverse.go [new file with mode: 0644]
vendor/github.com/oschwald/maxminddb-golang/verifier.go [new file with mode: 0644]
vendor/github.com/tidwall/cities/LICENSE [new file with mode: 0644]
vendor/github.com/tidwall/cities/README.md [new file with mode: 0644]
vendor/github.com/tidwall/cities/cities.go [new file with mode: 0644]
vendor/golang.org/x/sys/LICENSE [new file with mode: 0644]
vendor/golang.org/x/sys/PATENTS [new file with mode: 0644]
vendor/golang.org/x/sys/unix/README.md [new file with mode: 0644]
vendor/golang.org/x/sys/unix/affinity_linux.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/asm_darwin_386.s [new file with mode: 0644]
vendor/golang.org/x/sys/unix/asm_darwin_amd64.s [new file with mode: 0644]
vendor/golang.org/x/sys/unix/asm_darwin_arm.s [new file with mode: 0644]
vendor/golang.org/x/sys/unix/asm_darwin_arm64.s [new file with mode: 0644]
vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s [new file with mode: 0644]
vendor/golang.org/x/sys/unix/asm_freebsd_386.s [new file with mode: 0644]
vendor/golang.org/x/sys/unix/asm_freebsd_amd64.s [new file with mode: 0644]
vendor/golang.org/x/sys/unix/asm_freebsd_arm.s [new file with mode: 0644]
vendor/golang.org/x/sys/unix/asm_linux_386.s [new file with mode: 0644]
vendor/golang.org/x/sys/unix/asm_linux_amd64.s [new file with mode: 0644]
vendor/golang.org/x/sys/unix/asm_linux_arm.s [new file with mode: 0644]
vendor/golang.org/x/sys/unix/asm_linux_arm64.s [new file with mode: 0644]
vendor/golang.org/x/sys/unix/asm_linux_mips64x.s [new file with mode: 0644]
vendor/golang.org/x/sys/unix/asm_linux_mipsx.s [new file with mode: 0644]
vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s [new file with mode: 0644]
vendor/golang.org/x/sys/unix/asm_linux_s390x.s [new file with mode: 0644]
vendor/golang.org/x/sys/unix/asm_netbsd_386.s [new file with mode: 0644]
vendor/golang.org/x/sys/unix/asm_netbsd_amd64.s [new file with mode: 0644]
vendor/golang.org/x/sys/unix/asm_netbsd_arm.s [new file with mode: 0644]
vendor/golang.org/x/sys/unix/asm_openbsd_386.s [new file with mode: 0644]
vendor/golang.org/x/sys/unix/asm_openbsd_amd64.s [new file with mode: 0644]
vendor/golang.org/x/sys/unix/asm_openbsd_arm.s [new file with mode: 0644]
vendor/golang.org/x/sys/unix/asm_solaris_amd64.s [new file with mode: 0644]
vendor/golang.org/x/sys/unix/bluetooth_linux.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/cap_freebsd.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/constants.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/dev_darwin.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/dev_dragonfly.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/dev_freebsd.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/dev_linux.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/dev_netbsd.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/dev_openbsd.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/dirent.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/endian_big.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/endian_little.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/env_unix.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/errors_freebsd_386.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/errors_freebsd_arm.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/flock.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/flock_linux_32bit.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/gccgo.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/gccgo_c.c [new file with mode: 0644]
vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/mkall.sh [new file with mode: 0755]
vendor/golang.org/x/sys/unix/mkerrors.sh [new file with mode: 0755]
vendor/golang.org/x/sys/unix/mkpost.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/mksyscall.pl [new file with mode: 0755]
vendor/golang.org/x/sys/unix/mksyscall_solaris.pl [new file with mode: 0755]
vendor/golang.org/x/sys/unix/mksysctl_openbsd.pl [new file with mode: 0755]
vendor/golang.org/x/sys/unix/mksysnum_darwin.pl [new file with mode: 0755]
vendor/golang.org/x/sys/unix/mksysnum_dragonfly.pl [new file with mode: 0755]
vendor/golang.org/x/sys/unix/mksysnum_freebsd.pl [new file with mode: 0755]
vendor/golang.org/x/sys/unix/mksysnum_netbsd.pl [new file with mode: 0755]
vendor/golang.org/x/sys/unix/mksysnum_openbsd.pl [new file with mode: 0755]
vendor/golang.org/x/sys/unix/openbsd_pledge.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/pagesize_unix.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/race.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/race0.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/sockcmsg_linux.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/sockcmsg_unix.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/str.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_bsd.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_darwin.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_darwin_386.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_darwin_arm.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_dragonfly.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_freebsd.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_freebsd_386.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_linux.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_linux_386.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_linux_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_linux_arm.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_linux_arm64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_linux_gc.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_linux_gccgo.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_linux_s390x.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_netbsd.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_netbsd_386.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_openbsd.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_openbsd_386.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_solaris.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_unix.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/syscall_unix_gc.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/timestruct.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/types_darwin.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/types_dragonfly.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/types_freebsd.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/types_netbsd.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/types_openbsd.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/types_solaris.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zerrors_darwin_386.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zerrors_linux_386.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zerrors_linux_arm.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zerrors_linux_mips.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zptrace386_linux.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zptracearm_linux.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zptracemips_linux.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zptracemipsle_linux.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_linux_386.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsysnum_linux_386.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/ztypes_darwin_386.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/ztypes_linux_386.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/ztypes_linux_arm.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/ztypes_linux_mips.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go [new file with mode: 0644]
vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/asm_windows_386.s [new file with mode: 0644]
vendor/golang.org/x/sys/windows/asm_windows_amd64.s [new file with mode: 0644]
vendor/golang.org/x/sys/windows/dll_windows.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/env_windows.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/eventlog.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/exec_windows.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/memory_windows.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/mksyscall.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/race.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/race0.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/security_windows.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/service.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/str.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/syscall.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/syscall_windows.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/types_windows.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/types_windows_386.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/types_windows_amd64.go [new file with mode: 0644]
vendor/golang.org/x/sys/windows/zsyscall_windows.go [new file with mode: 0644]
vendor/vendor.json [new file with mode: 0644]

diff --git a/docs/govendor.txt b/docs/govendor.txt
new file mode 100644 (file)
index 0000000..0cb89d0
--- /dev/null
@@ -0,0 +1,8 @@
+Get status
+-------------------------
+govendor status
+
+Get updates
+-------------------------
+govendor update +external
+
diff --git a/vendor/github.com/StefanSchroeder/Golang-Ellipsoid/LICENSE b/vendor/github.com/StefanSchroeder/Golang-Ellipsoid/LICENSE
new file mode 100755 (executable)
index 0000000..f7f56d0
--- /dev/null
@@ -0,0 +1,7 @@
+Copyright (c) 2011 Stefan Schroeder
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS INTHE SOFTWARE. 
diff --git a/vendor/github.com/StefanSchroeder/Golang-Ellipsoid/ellipsoid/ellipsoid.go b/vendor/github.com/StefanSchroeder/Golang-Ellipsoid/ellipsoid/ellipsoid.go
new file mode 100755 (executable)
index 0000000..91874ef
--- /dev/null
@@ -0,0 +1,713 @@
+package ellipsoid
+
+// Written in Go by Stefan Schroeder, New York, 2013
+// Version 1.0 based on Geo::Ellipsoid Version 1.12.
+// Version 1.1 Added ECEF functions.
+// Version 1.2 Replaced Fabs with Abs.
+// Version 1.3 Added Displacement function
+
+/*
+
+SYNOPSIS
+
+See hello-world.go example.
+
+DESCRIPTION
+
+ellipsoid performs geometrical calculations on the surface of
+an ellipsoid. An ellipsoid is a three-dimension object formed from
+the rotation of an ellipse about one of its axes. The approximate
+shape of the earth is an ellipsoid, so ellipsoid can accurately
+calculate distance and bearing between two widely-separated locations
+on the earth's surface.
+
+The shape of an ellipsoid is defined by the lengths of its
+semi-major and semi-minor axes. The shape may also be specifed by
+the flattening ratio f as:
+
+    f = ( semi-major - semi-minor ) / semi-major
+
+which, since f is a small number, is normally given as the reciprocal
+of the flattening 1/f.
+
+The shape of the earth has been surveyed and estimated differently
+at different times over the years. The two most common sets of values
+used to describe the size and shape of the earth in the United States
+are 'NAD27', dating from 1927, and 'WGS84', from 1984. United States
+Geological Survey topographical maps, for example, use one or the
+other of these values, and commonly-available Global Positioning
+System (GPS) units can be set to use one or the other.
+See "DEFINED ELLIPSOIDS" below for the ellipsoid survey values
+that may be selected for use by ellipsoid.
+
+*/
+
+import "math"
+import "fmt"
+
+const (
+       pi           = math.Pi
+       twopi        = math.Pi * 2.0
+       maxLoopCount = 20
+       eps          = 1.0e-23
+       debug        = false
+       // Meter is one of the output/input units.
+       Meter = 0 //    1.0    meter
+       // Foot is one of the output/input units.
+       Foot = 1 //    0.3048 meter are a foot
+       // Kilometer is one of the output/input units.
+       Kilometer = 2 // 1000.0    meter are a kilometer
+       // Mile is one of the output/input units.
+       Mile = 3 // 1609.344  meter are a mile
+       // Nm (nautical mile) is one of the output/input units.
+       Nm = 4 // 1852.0    meter are a nautical mile,
+       // Degrees is one of the possible angle units for input/output.
+       Degrees = iota
+       // Radians is one of the possible angle units for input/output.
+       Radians = iota
+       // LongitudeIsSymmetric determines that the output longitude shall be symmetric.
+       LongitudeIsSymmetric = true
+       // LongitudeNotSymmetric determines that the output longitude shall not be symmetric.
+       LongitudeNotSymmetric = false
+       // BearingIsSymmetric determines that the output bearing shall be symmetric.
+       BearingIsSymmetric = true
+       // BearingNotSymmetric determines that the output bearing shall not be symmetric.
+       BearingNotSymmetric = false
+)
+
+// Ellipsoid is the main object to store information about one ellispoid.
+type Ellipsoid struct {
+       Ellipse            ellipse
+       Units              int
+       DistanceUnits      int
+       LongitudeSymmetric bool
+       BearingSymmetry    bool
+       DistanceFactor     float64
+       // Having the DistanceFactor AND the DistanceUnits in this struct is redundant
+       // but it looks nicer in the code.
+}
+
+type ellipse struct {
+       Equatorial    float64
+       InvFlattening float64
+}
+
+// Location is one coordinate in LLA.
+type Location struct {
+       Lat float64
+       Lon float64
+       Ele float64
+}
+
+func deg2rad(d float64) (r float64) {
+       return d * pi / 180.0
+}
+func rad2deg(d float64) (r float64) {
+       return d * 180.0 / pi
+}
+
+/* Init
+
+The Init constructor must be called with a list of parameters to set
+the value of the ellipsoid to be used, the value of the units to be
+used for angles and distances, and whether or not the output range
+of longitudes and bearing angles should be symmetric around zero
+or always greater than zero. There is no default constructor, all
+arguments are required; they may not be abbreviated.
+
+Example:
+
+       geo := ellipsoid.Init(
+               "WGS84",  // for possible values see below.
+               ellipsoid.Degrees, // possible values: Degrees or Radians
+               ellipsoid.Meter,   // possible values: Meter, Kilometer,
+                                  // Foot, Nm, Mile
+               ellipsoid.LongitudeIsSymmetric, // possible values
+                                                 // LongitudeIsSymmetric or
+                                                 // LongitudeNotSymmetric
+               ellipsoid.BearingIsSymmetric    // possible
+                                                 // values BearingIsSymmetric or
+                                                 // BearingNotSymmetric
+       )
+
+*/
+func Init(name string, units int, distUnits int, longSym bool, bearSym bool) (e Ellipsoid) {
+       m := map[string]ellipse{
+               "AIRY":                  {6377563.396, 299.3249646},
+               "AIRY-MODIFIED":         {6377340.189, 299.3249646},
+               "AUSTRALIAN":            {6378160.0, 298.25},
+               "BESSEL-1841":           {6377397.155, 299.1528128},
+               "BESSEL-1841-NAMIBIA":   {6377483.865, 299.152813},
+               "CLARKE-1866":           {6378206.400, 294.978698},
+               "CLARKE-1880":           {6378249.145, 293.465},
+               "EVEREST-1830":          {6377276.345, 300.8017},
+               "EVEREST-1948":          {6377304.063, 300.8017},
+               "EVEREST-SABAH-SARAWAK": {6377298.556, 300.801700},
+               "EVEREST-1956":          {6377301.243, 300.801700},
+               "EVEREST-1969":          {6377295.664, 300.801700},
+               "FISHER-1960":           {6378166.0, 298.3},
+               "FISCHER-1960-MODIFIED": {6378155.000, 298.300000},
+               "FISHER-1968":           {6378150.0, 298.3},
+               "GRS80":                 {6378137.0, 298.25722210088},
+               "HELMERT-1906":          {6378200.000, 298.300000},
+               "HOUGH-1956":            {6378270.0, 297.0},
+               "HAYFORD":               {6378388.0, 297.0},
+               "IAU76":                 {6378140.0, 298.257},
+               "INTERNATIONAL":         {6378388.000, 297.000000},
+               "KRASSOVSKY-1938":       {6378245.0, 298.3},
+               "NAD27":                 {6378206.4, 294.9786982138},
+               "NWL-9D":                {6378145.0, 298.25},
+               "SGS85":                 {6378136.000, 298.257000},
+               "SOUTHAMERICAN-1969":    {6378160.0, 298.25},
+               "SOVIET-1985":           {6378136.0, 298.257},
+               "WGS60":                 {6378165.000, 298.300000},
+               "WGS66":                 {6378145.000, 298.250000},
+               "WGS72":                 {6378135.0, 298.26},
+               "WGS84":                 {6378137.0, 298.257223563},
+       }
+
+       e2, ok := m[name]
+       if !ok {
+               fmt.Printf("ellipsoid.go: Warning: Invalid ellipse type '%v'\n", name)
+       }
+
+       //                      m    ft      km      mi        nm
+       conversion := []float64{1.0, 0.3048, 1000.0, 1609.344, 1852.0}
+       ellipsoid := Ellipsoid{e2, units, distUnits, longSym, bearSym, conversion[distUnits]}
+       return ellipsoid
+}
+
+/* Intermediate
+
+Takes two coordinates with longitude and latitude; and a step count and
+returns range and bearing and an array with the lons and lats of intermediate
+points on a straight line (whatever that is on an ellipsoid), INCLUDING the
+start and the endpoint.
+
+So if you put in point1 and point2 with step count 4, the output will be
+(you make 4 hops, right?)
+
+       point1
+       i1
+       i2
+       i3
+       point2
+
+Each point is two float64 values, lat and lon, thus you have an array
+with 4*2 + 2 = 5*2 cells.
+
+steps shall not be 0.
+
+I havent tested the upper limit for steps.
+
+*/
+func (ellipsoid Ellipsoid) Intermediate(lat1, lon1, lat2, lon2 float64, steps int) (distance, bearing float64, arr []float64) {
+       if steps == 0 {
+               return
+       }
+       r, phi := ellipsoid.To(lat1, lon1, lat2, lon2)
+       v := make([]float64, steps*2+2)
+       for i := 0; i <= steps; i++ {
+               a, b := ellipsoid.At(lat1, lon1, r*float64(i)/float64(steps), phi)
+               v[i*2], v[i*2+1] = a, b
+       }
+       arr = v
+       return r, phi, arr
+
+}
+
+/* To returns range, bearing between two specified locations.
+
+   dist, theta  = geo.To( lat1, lon1, lat2, lon2 )
+
+*/
+func (ellipsoid Ellipsoid) To(lat1, lon1, lat2, lon2 float64) (distance, bearing float64) {
+
+       if ellipsoid.Units == Degrees {
+               lat1 = deg2rad(lat1)
+               lon1 = deg2rad(lon1)
+               lat2 = deg2rad(lat2)
+               lon2 = deg2rad(lon2)
+       }
+
+       distance, bearing = ellipsoid.calculateBearing(lat1, lon1, lat2, lon2)
+       if ellipsoid.Units == Degrees {
+               bearing = rad2deg(bearing)
+       }
+
+       distance /= ellipsoid.DistanceFactor
+
+       return
+}
+
+/* At returns the list latitude,longitude in degrees or radians that is a
+specified range and bearing from a given location.
+
+    lat2, lon2  = geo.At( lat1, lon1, range, bearing )
+
+*/
+func (ellipsoid Ellipsoid) At(lat1, lon1, distance, bearing float64) (lat2, lon2 float64) {
+
+       if ellipsoid.Units == Degrees {
+               lat1 = deg2rad(lat1)
+               lon1 = deg2rad(lon1)
+               bearing = deg2rad(bearing)
+       }
+
+       lat2, lon2 = ellipsoid.calculateTargetlocation(lat1, lon1, distance, bearing)
+
+       if ellipsoid.LongitudeSymmetric == LongitudeIsSymmetric {
+               if lon2 > pi {
+                       lon2 -= twopi
+               }
+       }
+       if ellipsoid.LongitudeSymmetric == LongitudeNotSymmetric {
+               if lon2 < 0.0 {
+                       lon2 += twopi
+               }
+       }
+
+       if ellipsoid.Units == Degrees {
+               lat2 = rad2deg(lat2)
+               lon2 = rad2deg(lon2)
+       }
+
+       return
+}
+
+/* Displacement returns the (x,y) displacement in distance units between the two specified
+locations.
+
+    x, y  = geo.Displacement( lat1, lon1, lat2, lon2 )
+
+NOTE: The x and y displacements are only approximations and only valid
+between two locations that are fairly near to each other. Beyond 10 kilometers
+or more, the concept of X and Y on a curved surface loses its meaning.
+
+*/
+func (ellipsoid Ellipsoid) Displacement(lat1, lon1, lat2, lon2 float64) (x, y float64) {
+       // FIXME: Normalize!!! before use.
+       r, bearing := ellipsoid.To(lat1, lon1, lat2, lon2)
+
+       if ellipsoid.Units == Degrees {
+               bearing = deg2rad(bearing)
+       }
+
+       x = r * math.Sin(bearing)
+       y = r * math.Cos(bearing)
+       return x, y
+}
+
+/* Location returns the list (latitude,longitude) of a location at a given (x,y)
+displacement from a given location.
+
+       lat2, lon2 = geo.Location( lat1, lon1, x, y )
+
+The note from Displacement applies.
+
+*/
+func (ellipsoid Ellipsoid) Location(lat1, lon1, x, y float64) (lat, lon float64) {
+       degreesPerRadian := 180.0 / math.Pi
+
+       range1 := math.Sqrt(x*x + y*y)
+       bearing1 := math.Atan2(x, y)
+
+       if ellipsoid.Units == Degrees {
+               bearing1 *= degreesPerRadian
+       }
+
+       return ellipsoid.At(lat1, lon1, range1, bearing1)
+}
+
+func (ellipsoid Ellipsoid) calculateTargetlocation(lat1, lon1, distance, bearing float64) (lat2, lon2 float64) {
+
+       if debug == true {
+               fmt.Printf("_forward(lat1=%v,lon1=%v,range=%v,bearing=%v)\n", lat1, lon1, distance, bearing)
+       }
+
+       eps := 0.5e-13
+
+       a := ellipsoid.Ellipse.Equatorial
+       f := 1.0 / ellipsoid.Ellipse.InvFlattening
+       r := 1.0 - f
+
+       clat1 := math.Cos(lat1)
+       if clat1 == 0 {
+               fmt.Printf("WARNING: Division by Zero in ellipsoid.go.\n")
+               return 0.0, 0.0
+       }
+       tu := r * math.Sin(lat1) / clat1
+       faz := bearing
+
+       s := ellipsoid.DistanceFactor * distance
+
+       sf := math.Sin(faz)
+       cf := math.Cos(faz)
+
+       baz := 0.0
+       if cf != 0.0 {
+               baz = 2.0 * math.Atan2(tu, cf)
+       }
+
+       cu := 1.0 / math.Sqrt(1.0+tu*tu)
+       su := tu * cu
+       sa := cu * sf
+       c2a := 1.0 - (sa * sa)
+       x := 1.0 + math.Sqrt((((1.0/(r*r))-1.0)*c2a)+1.0)
+       x = (x - 2.0) / x
+       c := 1.0 - x
+       c = (((x * x) / 4.0) + 1.0) / c
+       d := x * ((0.375 * x * x) - 1.0)
+       tu = ((s / r) / a) / c
+       y := tu
+
+       if debug == true {
+               fmt.Printf("r=%.8f, tu=%.8f, faz=%.8f\n", r, tu, faz)
+               fmt.Printf("baz=%.8f, sf=%.8f, cf=%.8f\n", baz, sf, cf)
+               fmt.Printf("cu=%.8f, su=%.8f, sa=%.8f\n", cu, su, sa)
+               fmt.Printf("x=%.8f, c=%.8f, y=%.8f\n", x, c, y)
+       }
+
+       var cy, cz, e, sy float64
+       for true {
+               sy = math.Sin(y)
+               cy = math.Cos(y)
+               cz = math.Cos(baz + y)
+               e = (2.0 * cz * cz) - 1.0
+               c = y
+               x = e * cy
+               y = (2.0 * e) - 1.0
+               y = (((((((((sy * sy * 4.0) - 3.0) * y * cz * d) / 6.0) + x) * d) / 4.0) - cz) * sy * d) + tu
+
+               if math.Abs(y-c) <= eps {
+                       break
+               }
+       }
+       baz = (cu * cy * cf) - (su * sy)
+       c = r * math.Sqrt((sa*sa)+(baz*baz))
+       d = su*cy + cu*sy*cf
+       lat2 = math.Atan2(d, c)
+       c = cu*cy - su*sy*cf
+       x = math.Atan2(sy*sf, c)
+       c = (((((-3.0 * c2a) + 4.0) * f) + 4.0) * c2a * f) / 16.0
+       d = ((((e * cy * c) + cz) * sy * c) + y) * sa
+       lon2 = lon1 + x - (1.0-c)*d*f
+
+       if debug == true {
+               fmt.Printf("returns(lat2=%v,lon2=%v)\n", lat2, lon2)
+       }
+       return lat2, lon2
+}
+
+func (ellipsoid Ellipsoid) calculateBearing(lat1, lon1, lat2, lon2 float64) (distance, bearing float64) {
+       a := ellipsoid.Ellipse.Equatorial
+       f := 1 / ellipsoid.Ellipse.InvFlattening
+
+       if lon1 < 0 {
+               lon1 += twopi
+       }
+       if lon2 < 0 {
+               lon2 += twopi
+       }
+
+       r := 1.0 - f
+       clat1 := math.Cos(lat1)
+       if clat1 == 0 {
+               fmt.Printf("WARNING: Division by Zero in ellipsoid.go.\n")
+               return 0.0, 0.0
+       }
+       clat2 := math.Cos(lat2)
+       if clat2 == 0 {
+               fmt.Printf("WARNING: Division by Zero in ellipsoid.go.\n")
+               return 0.0, 0.0
+       }
+       tu1 := r * math.Sin(lat1) / clat1
+       tu2 := r * math.Sin(lat2) / clat2
+       cu1 := 1.0 / (math.Sqrt((tu1 * tu1) + 1.0))
+       su1 := cu1 * tu1
+       cu2 := 1.0 / (math.Sqrt((tu2 * tu2) + 1.0))
+       s := cu1 * cu2
+       baz := s * tu2
+       faz := baz * tu1
+       dlon := lon2 - lon1
+
+       if debug == true {
+               fmt.Printf("a=%v, f=%v\n", a, f)
+               fmt.Printf("lat1=%v, lon1=%v\n", lat1, lon1)
+               fmt.Printf("lat2=%v, lon2=%v\n", lat2, lon2)
+
+               fmt.Printf("r=%v, tu1=%v, tu2=%v\n", r, tu1, tu2)
+               fmt.Printf("faz=%.8f, dlon=%.8f, su1=%v\n", faz, dlon, su1)
+       }
+
+       x := dlon
+       cnt := 0
+
+       var c2a, c, cx, cy, cz, d, del, e, sx, sy, y float64
+       // This originally was a do-while loop. Exit condition is at end of loop.
+       for true {
+               if debug == true {
+                       fmt.Printf("  x=%.8f\n", x)
+               }
+               sx = math.Sin(x)
+               cx = math.Cos(x)
+               tu1 = cu2 * sx
+               tu2 = baz - (su1 * cu2 * cx)
+
+               if debug == true {
+                       fmt.Printf("    sx=%.8f, cx=%.8f, tu1=%.8f, tu2=%.8f\n", sx, cx, tu1, tu2)
+               }
+
+               sy = math.Sqrt(tu1*tu1 + tu2*tu2)
+               cy = s*cx + faz
+               y = math.Atan2(sy, cy)
+               var sa float64
+               if sy == 0.0 {
+                       sa = 1.0
+               } else {
+                       sa = (s * sx) / sy
+               }
+
+               if debug == true {
+                       fmt.Printf("    sy=%.8f, cy=%.8f, y=%.8f, sa=%.8f\n", sy, cy, y, sa)
+               }
+
+               c2a = 1.0 - (sa * sa)
+               cz = faz + faz
+               if c2a > 0.0 {
+                       cz = ((-cz) / c2a) + cy
+               }
+               e = (2.0 * cz * cz) - 1.0
+               c = (((((-3.0 * c2a) + 4.0) * f) + 4.0) * c2a * f) / 16.0
+               d = x
+               x = ((e*cy*c+cz)*sy*c + y) * sa
+               x = (1.0-c)*x*f + dlon
+               del = d - x
+
+               if debug == true {
+                       fmt.Printf("    c2a=%.8f, cz=%.8f\n", c2a, cz)
+                       fmt.Printf("    e=%.8f, d=%.8f\n", e, d)
+                       fmt.Printf("    (d-x)=%.8g\n", del)
+               }
+               if math.Abs(del) <= eps {
+                       break
+               }
+               cnt++
+               if cnt > maxLoopCount {
+                       break
+               }
+
+       }
+
+       faz = math.Atan2(tu1, tu2)
+       baz = math.Atan2(cu1*sx, (baz*cx-su1*cu2)) + pi
+       x = math.Sqrt(((1.0/(r*r))-1.0)*c2a+1.0) + 1.0
+       x = (x - 2.0) / x
+       c = 1.0 - x
+       c = ((x*x)/4.0 + 1.0) / c
+       d = ((0.375 * x * x) - 1.0) * x
+       x = e * cy
+
+       if debug == true {
+               fmt.Printf("e=%.8f, cy=%.8f, x=%.8f\n", e, cy, x)
+               fmt.Printf("sy=%.8f, c=%.8f, d=%.8f\n", sy, c, d)
+               fmt.Printf("cz=%.8f, a=%.8f, r=%.8f\n", cz, a, r)
+       }
+
+       s = 1.0 - e - e
+       s = ((((((((sy * sy * 4.0) - 3.0) * s * cz * d / 6.0) - x) * d / 4.0) + cz) * sy * d) + y) * c * a * r
+
+       if debug == true {
+               fmt.Printf("s=%.8f\n", s)
+       }
+
+       // adjust azimuth to (0,360) or (-180,180) as specified
+       if ellipsoid.BearingSymmetry == BearingIsSymmetric {
+               if faz < -(pi) {
+                       faz += twopi
+               }
+               if faz >= pi {
+                       faz -= twopi
+               }
+       } else {
+               if faz < 0 {
+                       faz += twopi
+               }
+               if faz >= twopi {
+                       faz -= twopi
+               }
+       }
+
+       distance, bearing = s, faz
+       return
+}
+
+/* ToLLA takes three cartesian coordinates x, y, z and returns
+the latitude, longitude, elevation list.
+
+FIXME: This algorithm cannot handle x==0, although this is a valid value.
+WARNING: I put in an if condition to catch this. Is it still necessary?
+
+*/
+func (ellipsoid Ellipsoid) ToLLA(x, y, z float64) (lat1, lon1, alt1 float64) {
+
+       if x == 0 {
+               fmt.Printf("FATAL: Caught x==0 (div by zero).\n")
+               return
+       }
+
+       a := ellipsoid.Ellipse.Equatorial
+       f := 1 / ellipsoid.Ellipse.InvFlattening
+
+       b := a * (1.0 - f)
+       e := math.Sqrt((a*a - b*b) / (a * a))
+       e2 := math.Sqrt((a*a - b*b) / (b * b)) // e'
+       esq := e * e                           // e squared
+       e2sq := e2 * e2                        // e' squared
+       p := math.Sqrt(x*x + y*y)
+
+       theta := math.Atan2(z*a, p*b)
+       stheta3 := math.Sin(theta) * math.Sin(theta) * math.Sin(theta)
+       ctheta3 := math.Cos(theta) * math.Cos(theta) * math.Cos(theta)
+
+       lon1 = math.Atan2(y, x)
+       phi := math.Atan2(z+e2sq*b*stheta3, p-esq*a*ctheta3)
+       lat1 = phi
+
+       sphisq := math.Sin(phi) * math.Sin(phi)
+       N := a / (math.Sqrt(1 - esq*sphisq))
+       alt1 = p/math.Cos(phi) - N
+
+       if ellipsoid.LongitudeSymmetric == LongitudeIsSymmetric {
+               if lon1 > pi {
+                       lon1 -= twopi
+               }
+       }
+       if ellipsoid.LongitudeSymmetric == LongitudeNotSymmetric {
+               if lon1 < 0.0 {
+                       lon1 += twopi
+               }
+       }
+
+       if ellipsoid.Units == Degrees {
+               lat1 = rad2deg(lat1)
+               lon1 = rad2deg(lon1)
+       }
+       return lat1, lon1, alt1
+}
+
+/* ToECEF takes the latitude, longitude, elevation list and
+   returns three cartesian coordinates x, y, z */
+func (ellipsoid Ellipsoid) ToECEF(lat1, lon1, alt1 float64) (x, y, z float64) {
+       a := ellipsoid.Ellipse.Equatorial
+       f := 1 / ellipsoid.Ellipse.InvFlattening
+
+       b := a * (1.0 - f)
+       e := math.Sqrt((a*a - b*b) / (a * a))
+       esq := e * e // e squared
+
+       if ellipsoid.Units == Degrees {
+               lat1 = deg2rad(lat1)
+               lon1 = deg2rad(lon1)
+       }
+
+       h := alt1 // renamed for convenience
+       phi := lat1
+       lambda := lon1
+
+       cphi := math.Cos(phi)
+       sphi := math.Sin(phi)
+       sphisq := sphi * sphi
+       clam := math.Cos(lambda)
+       slam := math.Sin(lambda)
+       N := a / (math.Sqrt(1 - esq*sphisq))
+       x = (N + h) * cphi * clam
+       y = (N + h) * cphi * slam
+       z = ((b*b*N)/(a*a) + h) * sphi
+
+       return x, y, z
+}
+
+/*
+ DEFINED ELLIPSOIDS
+
+The following ellipsoids are defined in Geo::Ellipsoid, with the
+semi-major axis in meters and the reciprocal flattening as shown.
+
+
+    Ellipsoid        Semi-Major Axis (m.)     1/Flattening
+    ---------        -------------------     ---------------
+    AIRY                 6377563.396         299.3249646
+    AIRY-MODIFIED        6377340.189         299.3249646
+    AUSTRALIAN           6378160.0           298.25
+    BESSEL-1841          6377397.155         299.1528128
+    CLARKE-1880          6378249.145         293.465
+    EVEREST-1830         6377276.345         290.8017
+    EVEREST-MODIFIED     6377304.063         290.8017
+    FISHER-1960          6378166.0           298.3
+    FISHER-1968          6378150.0           298.3
+    GRS80                6378137.0           298.25722210088
+    HOUGH-1956           6378270.0           297.0
+    HAYFORD              6378388.0           297.0
+    IAU76                6378140.0           298.257
+    KRASSOVSKY-1938      6378245.0           298.3
+    NAD27                6378206.4           294.9786982138
+    NWL-9D               6378145.0           298.25
+    SOUTHAMERICAN-1969   6378160.0           298.25
+    SOVIET-1985          6378136.0           298.257
+    WGS72                6378135.0           298.26
+    WGS84                6378137.0           298.257223563
+
+plus a few more ...
+
+ LIMITATIONS
+
+The methods should not be used on points which are too near the poles
+(above or below 89 degrees), and should not be used on points which
+are antipodal, i.e., exactly on opposite sides of the ellipsoid. The
+methods will not return valid results in these cases.
+
+The Go-version does not support all features of the Perl module. If you
+need advanced features, like defining your own ellipses at runtime,
+calculating x,y dislocations, etc, please refer to the package on CPAN
+
+Geo::Ellipsoid
+
+http://search.cpan.org/~jgibson/Geo-Ellipsoid-1.12/lib/Geo/Ellipsoid.pm
+
+FIXME: Add more checks for div by 0.
+
+ ACKNOWLEDGEMENTS
+
+The conversion algorithms used here are Perl translations of Fortran
+routines written by LCDR L. Pfeifer NGS Rockville MD that implement
+T. Vincenty's Modified Rainsford's method with Helmert's elliptical
+terms as published in "Direct and Inverse Solutions of Ellipsoid on
+the Ellipsoid with Application of Nested Equations", T. Vincenty,
+Survey Review, April 1975.
+
+The Fortran source code files inverse.for and forward.for
+may be obtained from
+
+    ftp://ftp.ngs.noaa.gov/pub/pcsoft/for_inv.3d/source/
+
+ AUTHOR
+
+Jim Gibson, <Jim@Gibson.org> (Perl version)
+Stefan Schroeder <ondekoza@gmail.com> (Port from Perl to Golang)
+
+ BUGS
+
+See LIMITATIONS, above.
+
+Please report any bugs or feature requests to
+the author.
+
+COPYRIGHT & LICENSE
+
+Copyright 2005-2008 Jim Gibson, all rights reserved.
+
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Perl.
+
+*/
diff --git a/vendor/github.com/dropbox/godropbox/errors/errors.go b/vendor/github.com/dropbox/godropbox/errors/errors.go
new file mode 100644 (file)
index 0000000..8090784
--- /dev/null
@@ -0,0 +1,260 @@
+// This module implements functions which manipulate errors and provide stack
+// trace information.
+//
+// NOTE: This package intentionally mirrors the standard "errors" module.
+// All dropbox code should use this.
+package errors
+
+import (
+       "bytes"
+       "fmt"
+       "reflect"
+       "runtime"
+       "sync"
+)
+
+// This interface exposes additional information about the error.
+type DropboxError interface {
+       // This returns the error message without the stack trace.
+       GetMessage() string
+
+       // This returns the wrapped error.  This returns nil if this does not wrap
+       // another error.
+       GetInner() error
+
+       // Implements the built-in error interface.
+       Error() string
+
+       // Returns stack addresses as a string that can be supplied to
+       // a helper tool to get the actual stack trace. This function doesn't result
+       // in resolving full stack frames thus is a lot more efficient.
+       StackAddrs() string
+
+       // Returns stack frames.
+       StackFrames() []StackFrame
+
+       // Returns string representation of stack frames.
+       // Stack frame formatting looks generally something like this:
+       // dropbox/rpc.(*clientV4).Do
+       //   /srv/server/go/src/dropbox/rpc/client.go:87 +0xbf9
+       // dropbox/exclog.Report
+       //   /srv/server/go/src/dropbox/exclog/client.go:129 +0x9e5
+       // main.main
+       //   /home/cdo/tmp/report_exception.go:13 +0x84
+       // It is discouraged to parse stack frames using string parsing since it can change at any time.
+       // Use StackFrames() function instead to get actual stack frame metadata.
+       GetStack() string
+}
+
+// Represents a single stack frame.
+type StackFrame struct {
+       PC         uintptr
+       Func       *runtime.Func
+       FuncName   string
+       File       string
+       LineNumber int
+}
+
+// Standard struct for general types of errors.
+//
+// For an example of custom error type, look at databaseError/newDatabaseError
+// in errors_test.go.
+type baseError struct {
+       msg   string
+       inner error
+
+       stack       []uintptr
+       framesOnce  sync.Once
+       stackFrames []StackFrame
+}
+
+// This returns the error string without stack trace information.
+func GetMessage(err interface{}) string {
+       switch e := err.(type) {
+       case DropboxError:
+               return extractFullErrorMessage(e, false)
+       case runtime.Error:
+               return runtime.Error(e).Error()
+       case error:
+               return e.Error()
+       default:
+               return "Passed a non-error to GetMessage"
+       }
+}
+
+// This returns a string with all available error information, including inner
+// errors that are wrapped by this errors.
+func (e *baseError) Error() string {
+       return extractFullErrorMessage(e, true)
+}
+
+// Implements DropboxError interface.
+func (e *baseError) GetMessage() string {
+       return e.msg
+}
+
+// Implements DropboxError interface.
+func (e *baseError) GetInner() error {
+       return e.inner
+}
+
+// Implements DropboxError interface.
+func (e *baseError) StackAddrs() string {
+       buf := bytes.NewBuffer(make([]byte, 0, len(e.stack)*8))
+       for _, pc := range e.stack {
+               fmt.Fprintf(buf, "0x%x ", pc)
+       }
+       bufBytes := buf.Bytes()
+       return string(bufBytes[:len(bufBytes)-1])
+}
+
+// Implements DropboxError interface.
+func (e *baseError) StackFrames() []StackFrame {
+       e.framesOnce.Do(func() {
+               e.stackFrames = make([]StackFrame, len(e.stack))
+               for i, pc := range e.stack {
+                       frame := &e.stackFrames[i]
+                       frame.PC = pc
+                       frame.Func = runtime.FuncForPC(pc)
+                       if frame.Func != nil {
+                               frame.FuncName = frame.Func.Name()
+                               frame.File, frame.LineNumber = frame.Func.FileLine(frame.PC - 1)
+                       }
+               }
+       })
+       return e.stackFrames
+}
+
+// Implements DropboxError interface.
+func (e *baseError) GetStack() string {
+       stackFrames := e.StackFrames()
+       buf := bytes.NewBuffer(make([]byte, 0, 256))
+       for _, frame := range stackFrames {
+               _, _ = buf.WriteString(frame.FuncName)
+               _, _ = buf.WriteString("\n")
+               fmt.Fprintf(buf, "\t%s:%d +0x%x\n",
+                       frame.File, frame.LineNumber, frame.PC)
+       }
+       return buf.String()
+}
+
+// This returns a new baseError initialized with the given message and
+// the current stack trace.
+func New(msg string) DropboxError {
+       return new(nil, msg)
+}
+
+// Same as New, but with fmt.Printf-style parameters.
+func Newf(format string, args ...interface{}) DropboxError {
+       return new(nil, fmt.Sprintf(format, args...))
+}
+
+// Wraps another error in a new baseError.
+func Wrap(err error, msg string) DropboxError {
+       return new(err, msg)
+}
+
+// Same as Wrap, but with fmt.Printf-style parameters.
+func Wrapf(err error, format string, args ...interface{}) DropboxError {
+       return new(err, fmt.Sprintf(format, args...))
+}
+
+// Internal helper function to create new baseError objects,
+// note that if there is more than one level of redirection to call this function,
+// stack frame information will include that level too.
+func new(err error, msg string) *baseError {
+       stack := make([]uintptr, 200)
+       stackLength := runtime.Callers(3, stack)
+       return &baseError{
+               msg:   msg,
+               stack: stack[:stackLength],
+               inner: err,
+       }
+}
+
+// Constructs full error message for a given DropboxError by traversing
+// all of its inner errors. If includeStack is True it will also include
+// stack trace from deepest DropboxError in the chain.
+func extractFullErrorMessage(e DropboxError, includeStack bool) string {
+       var ok bool
+       var lastDbxErr DropboxError
+       errMsg := bytes.NewBuffer(make([]byte, 0, 1024))
+
+       dbxErr := e
+       for {
+               lastDbxErr = dbxErr
+               errMsg.WriteString(dbxErr.GetMessage())
+
+               innerErr := dbxErr.GetInner()
+               if innerErr == nil {
+                       break
+               }
+               dbxErr, ok = innerErr.(DropboxError)
+               if !ok {
+                       // We have reached the end and traveresed all inner errors.
+                       // Add last message and exit loop.
+                       errMsg.WriteString(innerErr.Error())
+                       break
+               }
+               errMsg.WriteString("\n")
+       }
+       if includeStack {
+               errMsg.WriteString("\nORIGINAL STACK TRACE:\n")
+               errMsg.WriteString(lastDbxErr.GetStack())
+       }
+       return errMsg.String()
+}
+
+// Return a wrapped error or nil if there is none.
+func unwrapError(ierr error) (nerr error) {
+       // Internal errors have a well defined bit of context.
+       if dbxErr, ok := ierr.(DropboxError); ok {
+               return dbxErr.GetInner()
+       }
+
+       // At this point, if anything goes wrong, just return nil.
+       defer func() {
+               if x := recover(); x != nil {
+                       nerr = nil
+               }
+       }()
+
+       // Go system errors have a convention but paradoxically no
+       // interface.  All of these panic on error.
+       errV := reflect.ValueOf(ierr).Elem()
+       errV = errV.FieldByName("Err")
+       return errV.Interface().(error)
+}
+
+// Keep peeling away layers or context until a primitive error is revealed.
+func RootError(ierr error) (nerr error) {
+       nerr = ierr
+       for i := 0; i < 20; i++ {
+               terr := unwrapError(nerr)
+               if terr == nil {
+                       return nerr
+               }
+               nerr = terr
+       }
+       return fmt.Errorf("too many iterations: %T", nerr)
+}
+
+// Perform a deep check, unwrapping errors as much as possilbe and
+// comparing the string version of the error.
+func IsError(err, errConst error) bool {
+       if err == errConst {
+               return true
+       }
+       // Must rely on string equivalence, otherwise a value is not equal
+       // to its pointer value.
+       rootErrStr := ""
+       rootErr := RootError(err)
+       if rootErr != nil {
+               rootErrStr = rootErr.Error()
+       }
+       errConstStr := ""
+       if errConst != nil {
+               errConstStr = errConst.Error()
+       }
+       return rootErrStr == errConstStr
+}
diff --git a/vendor/github.com/dropbox/godropbox/license.txt b/vendor/github.com/dropbox/godropbox/license.txt
new file mode 100644 (file)
index 0000000..04d4210
--- /dev/null
@@ -0,0 +1,27 @@
+Copyright (c) 2014 Dropbox, Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its contributors
+may be used to endorse or promote products derived from this software without
+specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/github.com/hongshibao/go-algo/LICENSE b/vendor/github.com/hongshibao/go-algo/LICENSE
new file mode 100644 (file)
index 0000000..8dada3e
--- /dev/null
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright {yyyy} {name of copyright owner}
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/vendor/github.com/hongshibao/go-algo/README.md b/vendor/github.com/hongshibao/go-algo/README.md
new file mode 100644 (file)
index 0000000..b4e1005
--- /dev/null
@@ -0,0 +1 @@
+# go-algo
\ No newline at end of file
diff --git a/vendor/github.com/hongshibao/go-algo/selection.go b/vendor/github.com/hongshibao/go-algo/selection.go
new file mode 100644 (file)
index 0000000..b17fe70
--- /dev/null
@@ -0,0 +1,57 @@
+package algo
+
+import (
+       "math/rand"
+       "sort"
+
+       "github.com/dropbox/godropbox/errors"
+)
+
+// [left, right]
+func Partition(array sort.Interface, left int, right int,
+       pivotIndex int) (int, error) {
+       if pivotIndex < left || pivotIndex > right {
+               return -1, errors.New("Pivot index out of range")
+       }
+       if left < 0 || right >= array.Len() {
+               return -1, errors.New("Array index out of range")
+       }
+       lastIndex := right
+       array.Swap(pivotIndex, lastIndex)
+       leftIndex := left
+       for i := left; i < lastIndex; i++ {
+               if array.Less(i, lastIndex) {
+                       array.Swap(leftIndex, i)
+                       leftIndex++
+               }
+       }
+       array.Swap(leftIndex, lastIndex)
+       return leftIndex, nil
+}
+
+// k is started from 1
+func QuickSelect(array sort.Interface, k int) error {
+       if k <= 0 || k > array.Len() {
+               return errors.New("Parameter k is invalid")
+       }
+       k--
+       left := 0
+       right := array.Len() - 1
+       for {
+               if left == right {
+                       return nil
+               }
+               pivotIndex := left + rand.Intn(right-left+1)
+               pivotIndex, err := Partition(array, left, right, pivotIndex)
+               if err != nil {
+                       return errors.Wrap(err, "Partition returns error")
+               }
+               if k == pivotIndex {
+                       return nil
+               } else if k < pivotIndex {
+                       right = pivotIndex - 1
+               } else {
+                       left = pivotIndex + 1
+               }
+       }
+}
diff --git a/vendor/github.com/hongshibao/go-kdtree/LICENSE.md b/vendor/github.com/hongshibao/go-kdtree/LICENSE.md
new file mode 100644 (file)
index 0000000..bd12e68
--- /dev/null
@@ -0,0 +1,202 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright 2015 thinkpoet (shibaohong@outlook.com)
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
diff --git a/vendor/github.com/hongshibao/go-kdtree/README.md b/vendor/github.com/hongshibao/go-kdtree/README.md
new file mode 100644 (file)
index 0000000..85d4550
--- /dev/null
@@ -0,0 +1,92 @@
+# KDTree
+Golang implementation of KD tree (https://en.wikipedia.org/wiki/K-d_tree) data structure
+
+## Getting started
+
+Use go tool to install the package in your packages tree:
+```
+go get github.com/hongshibao/go-kdtree
+```
+Then you can use it in import section of your Go programs:
+```go
+import "github.com/hongshibao/go-kdtree"
+```
+The package name is ```kdtree```.
+
+## Basic example
+
+First you need to implement the ```Point``` interface:
+```go
+type Point interface {
+       // Return the total number of dimensions
+       Dim() int
+       // Return the value X_{dim}, dim is started from 0
+       GetValue(dim int) float64
+       // Return the distance between two points
+       Distance(p Point) float64
+       // Return the distance between the point and the plane X_{dim}=val
+       PlaneDistance(val float64, dim int) float64
+}
+```
+Here is an example of implementing ```Point``` interface with square of Euclidean distance as the ```Distance``` definition:
+```go
+type EuclideanPoint struct {
+       Point
+       Vec []float64
+}
+
+func (p *EuclideanPoint) Dim() int {
+       return len(p.Vec)
+}
+
+func (p *EuclideanPoint) GetValue(dim int) float64 {
+       return p.Vec[dim]
+}
+
+func (p *EuclideanPoint) Distance(other Point) float64 {
+       var ret float64
+       for i := 0; i < p.Dim(); i++ {
+               tmp := p.GetValue(i) - other.GetValue(i)
+               ret += tmp * tmp
+       }
+       return ret
+}
+
+func (p *EuclideanPoint) PlaneDistance(val float64, dim int) float64 {
+       tmp := p.GetValue(dim) - val
+       return tmp * tmp
+}
+```
+Now you can create KD-tree from a list of points and get a list of k nearest neighbours for a target point:
+```go
+func NewEuclideanPoint(vals ...float64) *EuclideanPoint {
+       ret := &EuclideanPoint{}
+       for _, val := range vals {
+               ret.Vec = append(ret.Vec, val)
+       }
+       return ret
+}
+
+func main() {
+       p1 := NewEuclideanPoint(0.0, 0.0, 0.0)
+       p2 := NewEuclideanPoint(0.0, 0.0, 1.0)
+       p3 := NewEuclideanPoint(0.0, 1.0, 0.0)
+       p4 := NewEuclideanPoint(1.0, 0.0, 0.0)
+       points := make([]Point, 0)
+       points = append(points, p1)
+       points = append(points, p2)
+       points = append(points, p3)
+       points = append(points, p4)
+       tree := NewKDTree(points)
+       targetPoint := NewEuclideanPoint(0.0, 0.0, 0.1)
+       neighbours := tree.KNN(targetPoint, 2)
+       for idx, p := range neighbours {
+               fmt.Printf("Point %d: (%f", idx, p.GetValue(0))
+               for i := 1; i < p.Dim(); i++ {
+                       fmt.Printf(", %f", p.GetValue(i))
+               }
+               fmt.Println(")")
+       }
+}
+```
+The returned k nearest neighbours are sorted by their distance with the target point.
diff --git a/vendor/github.com/hongshibao/go-kdtree/kdtree.go b/vendor/github.com/hongshibao/go-kdtree/kdtree.go
new file mode 100644 (file)
index 0000000..64ecd60
--- /dev/null
@@ -0,0 +1,200 @@
+package kdtree
+
+import (
+       "container/heap"
+
+       "github.com/hongshibao/go-algo"
+)
+
+type Point interface {
+       // Return the total number of dimensions
+       Dim() int
+       // Return the value X_{dim}, dim is started from 0
+       GetValue(dim int) float64
+       // Return the distance between two points
+       Distance(p Point) float64
+       // Return the distance between the point and the plane X_{dim}=val
+       PlaneDistance(val float64, dim int) float64
+}
+
+type PointBase struct {
+       Point
+       Vec []float64
+}
+
+func (b PointBase) Dim() int {
+       return len(b.Vec)
+}
+
+func (b PointBase) GetValue(dim int) float64 {
+       return b.Vec[dim]
+}
+
+func NewPointBase(vals []float64) PointBase {
+       ret := PointBase{}
+       for _, val := range vals {
+               ret.Vec = append(ret.Vec, val)
+       }
+       return ret
+}
+
+type kdTreeNode struct {
+       axis           int
+       splittingPoint Point
+       leftChild      *kdTreeNode
+       rightChild     *kdTreeNode
+}
+
+type KDTree struct {
+       root *kdTreeNode
+       dim  int
+}
+
+func (t *KDTree) Dim() int {
+       return t.dim
+}
+
+func (t *KDTree) KNN(target Point, k int) []Point {
+       hp := &kNNHeapHelper{}
+       t.search(t.root, hp, target, k)
+       ret := make([]Point, 0, hp.Len())
+       for hp.Len() > 0 {
+               item := heap.Pop(hp).(*kNNHeapNode)
+               ret = append(ret, item.point)
+       }
+       for i := len(ret)/2 - 1; i >= 0; i-- {
+               opp := len(ret) - 1 - i
+               ret[i], ret[opp] = ret[opp], ret[i]
+       }
+       return ret
+}
+
+func (t *KDTree) search(p *kdTreeNode,
+       hp *kNNHeapHelper, target Point, k int) {
+       stk := make([]*kdTreeNode, 0)
+       for p != nil {
+               stk = append(stk, p)
+               if target.GetValue(p.axis) < p.splittingPoint.GetValue(p.axis) {
+                       p = p.leftChild
+               } else {
+                       p = p.rightChild
+               }
+       }
+       for i := len(stk) - 1; i >= 0; i-- {
+               cur := stk[i]
+               dist := target.Distance(cur.splittingPoint)
+               if hp.Len() < k || (*hp)[0].distance >= dist {
+                       heap.Push(hp, &kNNHeapNode{
+                               point:    cur.splittingPoint,
+                               distance: dist,
+                       })
+                       if hp.Len() > k {
+                               heap.Pop(hp)
+                       }
+               }
+               if hp.Len() < k || target.PlaneDistance(
+                       cur.splittingPoint.GetValue(cur.axis), cur.axis) <=
+                       (*hp)[0].distance {
+                       if target.GetValue(cur.axis) < cur.splittingPoint.GetValue(cur.axis) {
+                               t.search(cur.rightChild, hp, target, k)
+                       } else {
+                               t.search(cur.leftChild, hp, target, k)
+                       }
+               }
+       }
+}
+
+func NewKDTree(points []Point) *KDTree {
+       if len(points) == 0 {
+               return nil
+       }
+       ret := &KDTree{
+               dim:  points[0].Dim(),
+               root: createKDTree(points, 0),
+       }
+       return ret
+}
+
+func createKDTree(points []Point, depth int) *kdTreeNode {
+       if len(points) == 0 {
+               return nil
+       }
+       dim := points[0].Dim()
+       ret := &kdTreeNode{
+               axis: depth % dim,
+       }
+       if len(points) == 1 {
+               ret.splittingPoint = points[0]
+               return ret
+       }
+       idx := selectSplittingPoint(points, ret.axis)
+       if idx == -1 {
+               return nil
+       }
+       ret.splittingPoint = points[idx]
+       ret.leftChild = createKDTree(points[0:idx], depth+1)
+       ret.rightChild = createKDTree(points[idx+1:len(points)], depth+1)
+       return ret
+}
+
+type selectionHelper struct {
+       axis   int
+       points []Point
+}
+
+func (h *selectionHelper) Len() int {
+       return len(h.points)
+}
+
+func (h *selectionHelper) Less(i, j int) bool {
+       return h.points[i].GetValue(h.axis) < h.points[j].GetValue(h.axis)
+}
+
+func (h *selectionHelper) Swap(i, j int) {
+       h.points[i], h.points[j] = h.points[j], h.points[i]
+}
+
+func selectSplittingPoint(points []Point, axis int) int {
+       helper := &selectionHelper{
+               axis:   axis,
+               points: points,
+       }
+       mid := len(points)/2 + 1
+       err := algo.QuickSelect(helper, mid)
+       if err != nil {
+               return -1
+       }
+       return mid - 1
+}
+
+type kNNHeapNode struct {
+       point    Point
+       distance float64
+}
+
+type kNNHeapHelper []*kNNHeapNode
+
+func (h kNNHeapHelper) Len() int {
+       return len(h)
+}
+
+func (h kNNHeapHelper) Less(i, j int) bool {
+       return h[i].distance > h[j].distance
+}
+
+func (h kNNHeapHelper) Swap(i, j int) {
+       h[i], h[j] = h[j], h[i]
+}
+
+func (h *kNNHeapHelper) Push(x interface{}) {
+       item := x.(*kNNHeapNode)
+       *h = append(*h, item)
+}
+
+func (h *kNNHeapHelper) Pop() interface{} {
+       old := *h
+       n := len(old)
+       item := old[n-1]
+       *h = old[0 : n-1]
+       return item
+}
diff --git a/vendor/github.com/oschwald/geoip2-golang/LICENSE b/vendor/github.com/oschwald/geoip2-golang/LICENSE
new file mode 100644 (file)
index 0000000..2969677
--- /dev/null
@@ -0,0 +1,15 @@
+ISC License
+
+Copyright (c) 2015, Gregory J. Oschwald <oschwald@gmail.com>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
diff --git a/vendor/github.com/oschwald/geoip2-golang/README.md b/vendor/github.com/oschwald/geoip2-golang/README.md
new file mode 100644 (file)
index 0000000..7a3c22a
--- /dev/null
@@ -0,0 +1,90 @@
+# GeoIP2 Reader for Go #
+
+[![Build Status](https://travis-ci.org/oschwald/geoip2-golang.png?branch=master)](https://travis-ci.org/oschwald/geoip2-golang)
+[![GoDoc](https://godoc.org/github.com/oschwald/geoip2-golang?status.png)](https://godoc.org/github.com/oschwald/geoip2-golang)
+
+This library reads MaxMind [GeoLite2](http://dev.maxmind.com/geoip/geoip2/geolite2/)
+and [GeoIP2](http://www.maxmind.com/en/geolocation_landing) databases.
+
+This library is built using
+[the Go maxminddb reader](https://github.com/oschwald/maxminddb-golang).
+All data for the database record is decoded using this library. If you only
+need several fields, you may get superior performance by using maxminddb's
+`Lookup` directly with a result struct that only contains the required fields.
+(See [example_test.go](https://github.com/oschwald/maxminddb-golang/blob/master/example_test.go)
+in the maxminddb repository for an example of this.)
+
+## Installation ##
+
+```
+go get github.com/oschwald/geoip2-golang
+```
+
+## Usage ##
+
+[See GoDoc](http://godoc.org/github.com/oschwald/geoip2-golang) for
+documentation and examples.
+
+## Example ##
+
+```go
+package main
+
+import (
+    "fmt"
+    "github.com/oschwald/geoip2-golang"
+    "log"
+    "net"
+)
+
+func main() {
+    db, err := geoip2.Open("GeoIP2-City.mmdb")
+    if err != nil {
+            log.Fatal(err)
+    }
+    defer db.Close()
+    // If you are using strings that may be invalid, check that ip is not nil
+    ip := net.ParseIP("81.2.69.142")
+    record, err := db.City(ip)
+    if err != nil {
+            log.Fatal(err)
+    }
+    fmt.Printf("Portuguese (BR) city name: %v\n", record.City.Names["pt-BR"])
+    fmt.Printf("English subdivision name: %v\n", record.Subdivisions[0].Names["en"])
+    fmt.Printf("Russian country name: %v\n", record.Country.Names["ru"])
+    fmt.Printf("ISO country code: %v\n", record.Country.IsoCode)
+    fmt.Printf("Time zone: %v\n", record.Location.TimeZone)
+    fmt.Printf("Coordinates: %v, %v\n", record.Location.Latitude, record.Location.Longitude)
+    // Output:
+    // Portuguese (BR) city name: Londres
+    // English subdivision name: England
+    // Russian country name: Великобритания
+    // ISO country code: GB
+    // Time zone: Europe/London
+    // Coordinates: 51.5142, -0.0931
+}
+```
+
+## Testing ##
+
+Make sure you checked out test data submodule:
+
+```
+git submodule init
+git submodule update
+```
+
+Execute test suite:
+
+```
+go test
+```
+
+## Contributing ##
+
+Contributions welcome! Please fork the repository and open a pull request
+with your changes.
+
+## License ##
+
+This is free software, licensed under the ISC license.
diff --git a/vendor/github.com/oschwald/geoip2-golang/reader.go b/vendor/github.com/oschwald/geoip2-golang/reader.go
new file mode 100644 (file)
index 0000000..ac5108f
--- /dev/null
@@ -0,0 +1,327 @@
+// Package geoip2 provides an easy-to-use API for the MaxMind GeoIP2 and
+// GeoLite2 databases; this package does not support GeoIP Legacy databases.
+//
+// The structs provided by this package match the internal structure of
+// the data in the MaxMind databases.
+//
+// See github.com/oschwald/maxminddb-golang for more advanced used cases.
+package geoip2
+
+import (
+       "fmt"
+       "net"
+
+       "github.com/oschwald/maxminddb-golang"
+)
+
+// The City struct corresponds to the data in the GeoIP2/GeoLite2 City
+// databases.
+type City struct {
+       City struct {
+               GeoNameID uint              `maxminddb:"geoname_id"`
+               Names     map[string]string `maxminddb:"names"`
+       } `maxminddb:"city"`
+       Continent struct {
+               Code      string            `maxminddb:"code"`
+               GeoNameID uint              `maxminddb:"geoname_id"`
+               Names     map[string]string `maxminddb:"names"`
+       } `maxminddb:"continent"`
+       Country struct {
+               GeoNameID         uint              `maxminddb:"geoname_id"`
+               IsInEuropeanUnion bool              `maxminddb:"is_in_european_union"`
+               IsoCode           string            `maxminddb:"iso_code"`
+               Names             map[string]string `maxminddb:"names"`
+       } `maxminddb:"country"`
+       Location struct {
+               AccuracyRadius uint16  `maxminddb:"accuracy_radius"`
+               Latitude       float64 `maxminddb:"latitude"`
+               Longitude      float64 `maxminddb:"longitude"`
+               MetroCode      uint    `maxminddb:"metro_code"`
+               TimeZone       string  `maxminddb:"time_zone"`
+       } `maxminddb:"location"`
+       Postal struct {
+               Code string `maxminddb:"code"`
+       } `maxminddb:"postal"`
+       RegisteredCountry struct {
+               GeoNameID         uint              `maxminddb:"geoname_id"`
+               IsInEuropeanUnion bool              `maxminddb:"is_in_european_union"`
+               IsoCode           string            `maxminddb:"iso_code"`
+               Names             map[string]string `maxminddb:"names"`
+       } `maxminddb:"registered_country"`
+       RepresentedCountry struct {
+               GeoNameID         uint              `maxminddb:"geoname_id"`
+               IsInEuropeanUnion bool              `maxminddb:"is_in_european_union"`
+               IsoCode           string            `maxminddb:"iso_code"`
+               Names             map[string]string `maxminddb:"names"`
+               Type              string            `maxminddb:"type"`
+       } `maxminddb:"represented_country"`
+       Subdivisions []struct {
+               GeoNameID uint              `maxminddb:"geoname_id"`
+               IsoCode   string            `maxminddb:"iso_code"`
+               Names     map[string]string `maxminddb:"names"`
+       } `maxminddb:"subdivisions"`
+       Traits struct {
+               IsAnonymousProxy    bool `maxminddb:"is_anonymous_proxy"`
+               IsSatelliteProvider bool `maxminddb:"is_satellite_provider"`
+       } `maxminddb:"traits"`
+}
+
+// The Country struct corresponds to the data in the GeoIP2/GeoLite2
+// Country databases.
+type Country struct {
+       Continent struct {
+               Code      string            `maxminddb:"code"`
+               GeoNameID uint              `maxminddb:"geoname_id"`
+               Names     map[string]string `maxminddb:"names"`
+       } `maxminddb:"continent"`
+       Country struct {
+               GeoNameID         uint              `maxminddb:"geoname_id"`
+               IsInEuropeanUnion bool              `maxminddb:"is_in_european_union"`
+               IsoCode           string            `maxminddb:"iso_code"`
+               Names             map[string]string `maxminddb:"names"`
+       } `maxminddb:"country"`
+       RegisteredCountry struct {
+               GeoNameID         uint              `maxminddb:"geoname_id"`
+               IsInEuropeanUnion bool              `maxminddb:"is_in_european_union"`
+               IsoCode           string            `maxminddb:"iso_code"`
+               Names             map[string]string `maxminddb:"names"`
+       } `maxminddb:"registered_country"`
+       RepresentedCountry struct {
+               GeoNameID         uint              `maxminddb:"geoname_id"`
+               IsInEuropeanUnion bool              `maxminddb:"is_in_european_union"`
+               IsoCode           string            `maxminddb:"iso_code"`
+               Names             map[string]string `maxminddb:"names"`
+               Type              string            `maxminddb:"type"`
+       } `maxminddb:"represented_country"`
+       Traits struct {
+               IsAnonymousProxy    bool `maxminddb:"is_anonymous_proxy"`
+               IsSatelliteProvider bool `maxminddb:"is_satellite_provider"`
+       } `maxminddb:"traits"`
+}
+
+// The AnonymousIP struct corresponds to the data in the GeoIP2
+// Anonymous IP database.
+type AnonymousIP struct {
+       IsAnonymous       bool `maxminddb:"is_anonymous"`
+       IsAnonymousVPN    bool `maxminddb:"is_anonymous_vpn"`
+       IsHostingProvider bool `maxminddb:"is_hosting_provider"`
+       IsPublicProxy     bool `maxminddb:"is_public_proxy"`
+       IsTorExitNode     bool `maxminddb:"is_tor_exit_node"`
+}
+
+// The ASN struct corresponds to the data in the GeoLite2 ASN database.
+type ASN struct {
+       AutonomousSystemNumber       uint   `maxminddb:"autonomous_system_number"`
+       AutonomousSystemOrganization string `maxminddb:"autonomous_system_organization"`
+}
+
+// The ConnectionType struct corresponds to the data in the GeoIP2
+// Connection-Type database.
+type ConnectionType struct {
+       ConnectionType string `maxminddb:"connection_type"`
+}
+
+// The Domain struct corresponds to the data in the GeoIP2 Domain database.
+type Domain struct {
+       Domain string `maxminddb:"domain"`
+}
+
+// The ISP struct corresponds to the data in the GeoIP2 ISP database.
+type ISP struct {
+       AutonomousSystemNumber       uint   `maxminddb:"autonomous_system_number"`
+       AutonomousSystemOrganization string `maxminddb:"autonomous_system_organization"`
+       ISP                          string `maxminddb:"isp"`
+       Organization                 string `maxminddb:"organization"`
+}
+
+type databaseType int
+
+const (
+       isAnonymousIP = 1 << iota
+       isASN
+       isCity
+       isConnectionType
+       isCountry
+       isDomain
+       isEnterprise
+       isISP
+)
+
+// Reader holds the maxminddb.Reader struct. It can be created using the
+// Open and FromBytes functions.
+type Reader struct {
+       mmdbReader   *maxminddb.Reader
+       databaseType databaseType
+}
+
+// InvalidMethodError is returned when a lookup method is called on a
+// database that it does not support. For instance, calling the ISP method
+// on a City database.
+type InvalidMethodError struct {
+       Method       string
+       DatabaseType string
+}
+
+func (e InvalidMethodError) Error() string {
+       return fmt.Sprintf(`geoip2: the %s method does not support the %s database`,
+               e.Method, e.DatabaseType)
+}
+
+// UnknownDatabaseTypeError is returned when an unknown database type is
+// opened.
+type UnknownDatabaseTypeError struct {
+       DatabaseType string
+}
+
+func (e UnknownDatabaseTypeError) Error() string {
+       return fmt.Sprintf(`geoip2: reader does not support the "%s" database type`,
+               e.DatabaseType)
+}
+
+// Open takes a string path to a file and returns a Reader struct or an error.
+// The database file is opened using a memory map. Use the Close method on the
+// Reader object to return the resources to the system.
+func Open(file string) (*Reader, error) {
+       reader, err := maxminddb.Open(file)
+       if err != nil {
+               return nil, err
+       }
+       dbType, err := getDBType(reader)
+       return &Reader{reader, dbType}, err
+}
+
+// FromBytes takes a byte slice corresponding to a GeoIP2/GeoLite2 database
+// file and returns a Reader struct or an error. Note that the byte slice is
+// use directly; any modification of it after opening the database will result
+// in errors while reading from the database.
+func FromBytes(bytes []byte) (*Reader, error) {
+       reader, err := maxminddb.FromBytes(bytes)
+       if err != nil {
+               return nil, err
+       }
+       dbType, err := getDBType(reader)
+       return &Reader{reader, dbType}, err
+}
+
+func getDBType(reader *maxminddb.Reader) (databaseType, error) {
+       switch reader.Metadata.DatabaseType {
+       case "GeoIP2-Anonymous-IP":
+               return isAnonymousIP, nil
+       case "GeoLite2-ASN":
+               return isASN, nil
+       // We allow City lookups on Country for back compat
+       case "GeoLite2-City",
+               "GeoIP2-City",
+               "GeoIP2-City-Africa",
+               "GeoIP2-City-Asia-Pacific",
+               "GeoIP2-City-Europe",
+               "GeoIP2-City-North-America",
+               "GeoIP2-City-South-America",
+               "GeoIP2-Precision-City",
+               "GeoLite2-Country",
+               "GeoIP2-Country":
+               return isCity | isCountry, nil
+       case "GeoIP2-Connection-Type":
+               return isConnectionType, nil
+       case "GeoIP2-Domain":
+               return isDomain, nil
+       case "GeoIP2-Enterprise":
+               return isEnterprise | isCity | isCountry, nil
+       case "GeoIP2-ISP", "GeoIP2-Precision-ISP":
+               return isISP, nil
+       default:
+               return 0, UnknownDatabaseTypeError{reader.Metadata.DatabaseType}
+       }
+}
+
+// City takes an IP address as a net.IP struct and returns a City struct
+// and/or an error. Although this can be used with other databases, this
+// method generally should be used with the GeoIP2 or GeoLite2 City databases.
+func (r *Reader) City(ipAddress net.IP) (*City, error) {
+       if isCity&r.databaseType == 0 {
+               return nil, InvalidMethodError{"City", r.Metadata().DatabaseType}
+       }
+       var city City
+       err := r.mmdbReader.Lookup(ipAddress, &city)
+       return &city, err
+}
+
+// Country takes an IP address as a net.IP struct and returns a Country struct
+// and/or an error. Although this can be used with other databases, this
+// method generally should be used with the GeoIP2 or GeoLite2 Country
+// databases.
+func (r *Reader) Country(ipAddress net.IP) (*Country, error) {
+       if isCountry&r.databaseType == 0 {
+               return nil, InvalidMethodError{"Country", r.Metadata().DatabaseType}
+       }
+       var country Country
+       err := r.mmdbReader.Lookup(ipAddress, &country)
+       return &country, err
+}
+
+// AnonymousIP takes an IP address as a net.IP struct and returns a
+// AnonymousIP struct and/or an error.
+func (r *Reader) AnonymousIP(ipAddress net.IP) (*AnonymousIP, error) {
+       if isAnonymousIP&r.databaseType == 0 {
+               return nil, InvalidMethodError{"AnonymousIP", r.Metadata().DatabaseType}
+       }
+       var anonIP AnonymousIP
+       err := r.mmdbReader.Lookup(ipAddress, &anonIP)
+       return &anonIP, err
+}
+
+// ASN takes an IP address as a net.IP struct and returns a ASN struct and/or
+// an error
+func (r *Reader) ASN(ipAddress net.IP) (*ASN, error) {
+       if isASN&r.databaseType == 0 {
+               return nil, InvalidMethodError{"ASN", r.Metadata().DatabaseType}
+       }
+       var val ASN
+       err := r.mmdbReader.Lookup(ipAddress, &val)
+       return &val, err
+}
+
+// ConnectionType takes an IP address as a net.IP struct and returns a
+// ConnectionType struct and/or an error
+func (r *Reader) ConnectionType(ipAddress net.IP) (*ConnectionType, error) {
+       if isConnectionType&r.databaseType == 0 {
+               return nil, InvalidMethodError{"ConnectionType", r.Metadata().DatabaseType}
+       }
+       var val ConnectionType
+       err := r.mmdbReader.Lookup(ipAddress, &val)
+       return &val, err
+}
+
+// Domain takes an IP address as a net.IP struct and returns a
+// Domain struct and/or an error
+func (r *Reader) Domain(ipAddress net.IP) (*Domain, error) {
+       if isDomain&r.databaseType == 0 {
+               return nil, InvalidMethodError{"Domain", r.Metadata().DatabaseType}
+       }
+       var val Domain
+       err := r.mmdbReader.Lookup(ipAddress, &val)
+       return &val, err
+}
+
+// ISP takes an IP address as a net.IP struct and returns a ISP struct and/or
+// an error
+func (r *Reader) ISP(ipAddress net.IP) (*ISP, error) {
+       if isISP&r.databaseType == 0 {
+               return nil, InvalidMethodError{"ISP", r.Metadata().DatabaseType}
+       }
+       var val ISP
+       err := r.mmdbReader.Lookup(ipAddress, &val)
+       return &val, err
+}
+
+// Metadata takes no arguments and returns a struct containing metadata about
+// the MaxMind database in use by the Reader.
+func (r *Reader) Metadata() maxminddb.Metadata {
+       return r.mmdbReader.Metadata
+}
+
+// Close unmaps the database file from virtual memory and returns the
+// resources to the system.
+func (r *Reader) Close() error {
+       return r.mmdbReader.Close()
+}
diff --git a/vendor/github.com/oschwald/maxminddb-golang/LICENSE b/vendor/github.com/oschwald/maxminddb-golang/LICENSE
new file mode 100644 (file)
index 0000000..2969677
--- /dev/null
@@ -0,0 +1,15 @@
+ISC License
+
+Copyright (c) 2015, Gregory J. Oschwald <oschwald@gmail.com>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
diff --git a/vendor/github.com/oschwald/maxminddb-golang/README.md b/vendor/github.com/oschwald/maxminddb-golang/README.md
new file mode 100644 (file)
index 0000000..cdd6bd1
--- /dev/null
@@ -0,0 +1,38 @@
+# MaxMind DB Reader for Go #
+
+[![Build Status](https://travis-ci.org/oschwald/maxminddb-golang.png?branch=master)](https://travis-ci.org/oschwald/maxminddb-golang)
+[![Windows Build Status](https://ci.appveyor.com/api/projects/status/4j2f9oep8nnfrmov/branch/master?svg=true)](https://ci.appveyor.com/project/oschwald/maxminddb-golang/branch/master)
+[![GoDoc](https://godoc.org/github.com/oschwald/maxminddb-golang?status.png)](https://godoc.org/github.com/oschwald/maxminddb-golang)
+
+This is a Go reader for the MaxMind DB format. Although this can be used to
+read [GeoLite2](http://dev.maxmind.com/geoip/geoip2/geolite2/) and
+[GeoIP2](https://www.maxmind.com/en/geoip2-databases) databases,
+[geoip2](https://github.com/oschwald/geoip2-golang) provides a higher-level
+API for doing so.
+
+This is not an official MaxMind API.
+
+## Installation ##
+
+```
+go get github.com/oschwald/maxminddb-golang
+```
+
+## Usage ##
+
+[See GoDoc](http://godoc.org/github.com/oschwald/maxminddb-golang) for
+documentation and examples.
+
+## Examples ##
+
+See [GoDoc](http://godoc.org/github.com/oschwald/maxminddb-golang) or
+`example_test.go` for examples.
+
+## Contributing ##
+
+Contributions welcome! Please fork the repository and open a pull request
+with your changes.
+
+## License ##
+
+This is free software, licensed under the ISC License.
diff --git a/vendor/github.com/oschwald/maxminddb-golang/appveyor.yml b/vendor/github.com/oschwald/maxminddb-golang/appveyor.yml
new file mode 100644 (file)
index 0000000..e2bb9dd
--- /dev/null
@@ -0,0 +1,19 @@
+version: "{build}"
+
+os: Windows Server 2012 R2
+
+clone_folder: c:\gopath\src\github.com\oschwald\maxminddb-golang
+
+environment:
+  GOPATH: c:\gopath
+
+install:
+  - echo %PATH%
+  - echo %GOPATH%
+  - git submodule update --init --recursive
+  - go version
+  - go env
+  - go get -v -t ./...
+
+build_script:
+  - go test -v ./...
diff --git a/vendor/github.com/oschwald/maxminddb-golang/decoder.go b/vendor/github.com/oschwald/maxminddb-golang/decoder.go
new file mode 100644 (file)
index 0000000..6e4d7e5
--- /dev/null
@@ -0,0 +1,721 @@
+package maxminddb
+
+import (
+       "encoding/binary"
+       "math"
+       "math/big"
+       "reflect"
+       "sync"
+)
+
+type decoder struct {
+       buffer []byte
+}
+
+type dataType int
+
+const (
+       _Extended dataType = iota
+       _Pointer
+       _String
+       _Float64
+       _Bytes
+       _Uint16
+       _Uint32
+       _Map
+       _Int32
+       _Uint64
+       _Uint128
+       _Slice
+       _Container
+       _Marker
+       _Bool
+       _Float32
+)
+
+const (
+       // This is the value used in libmaxminddb
+       maximumDataStructureDepth = 512
+)
+
+func (d *decoder) decode(offset uint, result reflect.Value, depth int) (uint, error) {
+       if depth > maximumDataStructureDepth {
+               return 0, newInvalidDatabaseError("exceeded maximum data structure depth; database is likely corrupt")
+       }
+       typeNum, size, newOffset, err := d.decodeCtrlData(offset)
+       if err != nil {
+               return 0, err
+       }
+
+       if typeNum != _Pointer && result.Kind() == reflect.Uintptr {
+               result.Set(reflect.ValueOf(uintptr(offset)))
+               return d.nextValueOffset(offset, 1)
+       }
+       return d.decodeFromType(typeNum, size, newOffset, result, depth+1)
+}
+
+func (d *decoder) decodeCtrlData(offset uint) (dataType, uint, uint, error) {
+       newOffset := offset + 1
+       if offset >= uint(len(d.buffer)) {
+               return 0, 0, 0, newOffsetError()
+       }
+       ctrlByte := d.buffer[offset]
+
+       typeNum := dataType(ctrlByte >> 5)
+       if typeNum == _Extended {
+               if newOffset >= uint(len(d.buffer)) {
+                       return 0, 0, 0, newOffsetError()
+               }
+               typeNum = dataType(d.buffer[newOffset] + 7)
+               newOffset++
+       }
+
+       var size uint
+       size, newOffset, err := d.sizeFromCtrlByte(ctrlByte, newOffset, typeNum)
+       return typeNum, size, newOffset, err
+}
+
+func (d *decoder) sizeFromCtrlByte(ctrlByte byte, offset uint, typeNum dataType) (uint, uint, error) {
+       size := uint(ctrlByte & 0x1f)
+       if typeNum == _Extended {
+               return size, offset, nil
+       }
+
+       var bytesToRead uint
+       if size < 29 {
+               return size, offset, nil
+       }
+
+       bytesToRead = size - 28
+       newOffset := offset + bytesToRead
+       if newOffset > uint(len(d.buffer)) {
+               return 0, 0, newOffsetError()
+       }
+       if size == 29 {
+               return 29 + uint(d.buffer[offset]), offset + 1, nil
+       }
+
+       sizeBytes := d.buffer[offset:newOffset]
+
+       switch {
+       case size == 30:
+               size = 285 + uintFromBytes(0, sizeBytes)
+       case size > 30:
+               size = uintFromBytes(0, sizeBytes) + 65821
+       }
+       return size, newOffset, nil
+}
+
+func (d *decoder) decodeFromType(
+       dtype dataType,
+       size uint,
+       offset uint,
+       result reflect.Value,
+       depth int,
+) (uint, error) {
+       result = d.indirect(result)
+
+       // For these types, size has a special meaning
+       switch dtype {
+       case _Bool:
+               return d.unmarshalBool(size, offset, result)
+       case _Map:
+               return d.unmarshalMap(size, offset, result, depth)
+       case _Pointer:
+               return d.unmarshalPointer(size, offset, result, depth)
+       case _Slice:
+               return d.unmarshalSlice(size, offset, result, depth)
+       }
+
+       // For the remaining types, size is the byte size
+       if offset+size > uint(len(d.buffer)) {
+               return 0, newOffsetError()
+       }
+       switch dtype {
+       case _Bytes:
+               return d.unmarshalBytes(size, offset, result)
+       case _Float32:
+               return d.unmarshalFloat32(size, offset, result)
+       case _Float64:
+               return d.unmarshalFloat64(size, offset, result)
+       case _Int32:
+               return d.unmarshalInt32(size, offset, result)
+       case _String:
+               return d.unmarshalString(size, offset, result)
+       case _Uint16:
+               return d.unmarshalUint(size, offset, result, 16)
+       case _Uint32:
+               return d.unmarshalUint(size, offset, result, 32)
+       case _Uint64:
+               return d.unmarshalUint(size, offset, result, 64)
+       case _Uint128:
+               return d.unmarshalUint128(size, offset, result)
+       default:
+               return 0, newInvalidDatabaseError("unknown type: %d", dtype)
+       }
+}
+
+func (d *decoder) unmarshalBool(size uint, offset uint, result reflect.Value) (uint, error) {
+       if size > 1 {
+               return 0, newInvalidDatabaseError("the MaxMind DB file's data section contains bad data (bool size of %v)", size)
+       }
+       value, newOffset, err := d.decodeBool(size, offset)
+       if err != nil {
+               return 0, err
+       }
+       switch result.Kind() {
+       case reflect.Bool:
+               result.SetBool(value)
+               return newOffset, nil
+       case reflect.Interface:
+               if result.NumMethod() == 0 {
+                       result.Set(reflect.ValueOf(value))
+                       return newOffset, nil
+               }
+       }
+       return newOffset, newUnmarshalTypeError(value, result.Type())
+}
+
+// indirect follows pointers and create values as necessary. This is
+// heavily based on encoding/json as my original version had a subtle
+// bug. This method should be considered to be licensed under
+// https://golang.org/LICENSE
+func (d *decoder) indirect(result reflect.Value) reflect.Value {
+       for {
+               // Load value from interface, but only if the result will be
+               // usefully addressable.
+               if result.Kind() == reflect.Interface && !result.IsNil() {
+                       e := result.Elem()
+                       if e.Kind() == reflect.Ptr && !e.IsNil() {
+                               result = e
+                               continue
+                       }
+               }
+
+               if result.Kind() != reflect.Ptr {
+                       break
+               }
+
+               if result.IsNil() {
+                       result.Set(reflect.New(result.Type().Elem()))
+               }
+               result = result.Elem()
+       }
+       return result
+}
+
+var sliceType = reflect.TypeOf([]byte{})
+
+func (d *decoder) unmarshalBytes(size uint, offset uint, result reflect.Value) (uint, error) {
+       value, newOffset, err := d.decodeBytes(size, offset)
+       if err != nil {
+               return 0, err
+       }
+       switch result.Kind() {
+       case reflect.Slice:
+               if result.Type() == sliceType {
+                       result.SetBytes(value)
+                       return newOffset, nil
+               }
+       case reflect.Interface:
+               if result.NumMethod() == 0 {
+                       result.Set(reflect.ValueOf(value))
+                       return newOffset, nil
+               }
+       }
+       return newOffset, newUnmarshalTypeError(value, result.Type())
+}
+
+func (d *decoder) unmarshalFloat32(size uint, offset uint, result reflect.Value) (uint, error) {
+       if size != 4 {
+               return 0, newInvalidDatabaseError("the MaxMind DB file's data section contains bad data (float32 size of %v)", size)
+       }
+       value, newOffset, err := d.decodeFloat32(size, offset)
+       if err != nil {
+               return 0, err
+       }
+
+       switch result.Kind() {
+       case reflect.Float32, reflect.Float64:
+               result.SetFloat(float64(value))
+               return newOffset, nil
+       case reflect.Interface:
+               if result.NumMethod() == 0 {
+                       result.Set(reflect.ValueOf(value))
+                       return newOffset, nil
+               }
+       }
+       return newOffset, newUnmarshalTypeError(value, result.Type())
+}
+
+func (d *decoder) unmarshalFloat64(size uint, offset uint, result reflect.Value) (uint, error) {
+
+       if size != 8 {
+               return 0, newInvalidDatabaseError("the MaxMind DB file's data section contains bad data (float 64 size of %v)", size)
+       }
+       value, newOffset, err := d.decodeFloat64(size, offset)
+       if err != nil {
+               return 0, err
+       }
+       switch result.Kind() {
+       case reflect.Float32, reflect.Float64:
+               if result.OverflowFloat(value) {
+                       return 0, newUnmarshalTypeError(value, result.Type())
+               }
+               result.SetFloat(value)
+               return newOffset, nil
+       case reflect.Interface:
+               if result.NumMethod() == 0 {
+                       result.Set(reflect.ValueOf(value))
+                       return newOffset, nil
+               }
+       }
+       return newOffset, newUnmarshalTypeError(value, result.Type())
+}
+
+func (d *decoder) unmarshalInt32(size uint, offset uint, result reflect.Value) (uint, error) {
+       if size > 4 {
+               return 0, newInvalidDatabaseError("the MaxMind DB file's data section contains bad data (int32 size of %v)", size)
+       }
+       value, newOffset, err := d.decodeInt(size, offset)
+       if err != nil {
+               return 0, err
+       }
+
+       switch result.Kind() {
+       case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+               n := int64(value)
+               if !result.OverflowInt(n) {
+                       result.SetInt(n)
+                       return newOffset, nil
+               }
+       case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+               n := uint64(value)
+               if !result.OverflowUint(n) {
+                       result.SetUint(n)
+                       return newOffset, nil
+               }
+       case reflect.Interface:
+               if result.NumMethod() == 0 {
+                       result.Set(reflect.ValueOf(value))
+                       return newOffset, nil
+               }
+       }
+       return newOffset, newUnmarshalTypeError(value, result.Type())
+}
+
+func (d *decoder) unmarshalMap(
+       size uint,
+       offset uint,
+       result reflect.Value,
+       depth int,
+) (uint, error) {
+       result = d.indirect(result)
+       switch result.Kind() {
+       default:
+               return 0, newUnmarshalTypeError("map", result.Type())
+       case reflect.Struct:
+               return d.decodeStruct(size, offset, result, depth)
+       case reflect.Map:
+               return d.decodeMap(size, offset, result, depth)
+       case reflect.Interface:
+               if result.NumMethod() == 0 {
+                       rv := reflect.ValueOf(make(map[string]interface{}, size))
+                       newOffset, err := d.decodeMap(size, offset, rv, depth)
+                       result.Set(rv)
+                       return newOffset, err
+               }
+               return 0, newUnmarshalTypeError("map", result.Type())
+       }
+}
+
+func (d *decoder) unmarshalPointer(size uint, offset uint, result reflect.Value, depth int) (uint, error) {
+       pointer, newOffset, err := d.decodePointer(size, offset)
+       if err != nil {
+               return 0, err
+       }
+       _, err = d.decode(pointer, result, depth)
+       return newOffset, err
+}
+
+func (d *decoder) unmarshalSlice(
+       size uint,
+       offset uint,
+       result reflect.Value,
+       depth int,
+) (uint, error) {
+       switch result.Kind() {
+       case reflect.Slice:
+               return d.decodeSlice(size, offset, result, depth)
+       case reflect.Interface:
+               if result.NumMethod() == 0 {
+                       a := []interface{}{}
+                       rv := reflect.ValueOf(&a).Elem()
+                       newOffset, err := d.decodeSlice(size, offset, rv, depth)
+                       result.Set(rv)
+                       return newOffset, err
+               }
+       }
+       return 0, newUnmarshalTypeError("array", result.Type())
+}
+
+func (d *decoder) unmarshalString(size uint, offset uint, result reflect.Value) (uint, error) {
+       value, newOffset, err := d.decodeString(size, offset)
+
+       if err != nil {
+               return 0, err
+       }
+       switch result.Kind() {
+       case reflect.String:
+               result.SetString(value)
+               return newOffset, nil
+       case reflect.Interface:
+               if result.NumMethod() == 0 {
+                       result.Set(reflect.ValueOf(value))
+                       return newOffset, nil
+               }
+       }
+       return newOffset, newUnmarshalTypeError(value, result.Type())
+
+}
+
+func (d *decoder) unmarshalUint(size uint, offset uint, result reflect.Value, uintType uint) (uint, error) {
+       if size > uintType/8 {
+               return 0, newInvalidDatabaseError("the MaxMind DB file's data section contains bad data (uint%v size of %v)", uintType, size)
+       }
+
+       value, newOffset, err := d.decodeUint(size, offset)
+       if err != nil {
+               return 0, err
+       }
+
+       switch result.Kind() {
+       case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+               n := int64(value)
+               if !result.OverflowInt(n) {
+                       result.SetInt(n)
+                       return newOffset, nil
+               }
+       case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+               if !result.OverflowUint(value) {
+                       result.SetUint(value)
+                       return newOffset, nil
+               }
+       case reflect.Interface:
+               if result.NumMethod() == 0 {
+                       result.Set(reflect.ValueOf(value))
+                       return newOffset, nil
+               }
+       }
+       return newOffset, newUnmarshalTypeError(value, result.Type())
+}
+
+var bigIntType = reflect.TypeOf(big.Int{})
+
+func (d *decoder) unmarshalUint128(size uint, offset uint, result reflect.Value) (uint, error) {
+       if size > 16 {
+               return 0, newInvalidDatabaseError("the MaxMind DB file's data section contains bad data (uint128 size of %v)", size)
+       }
+       value, newOffset, err := d.decodeUint128(size, offset)
+       if err != nil {
+               return 0, err
+       }
+
+       switch result.Kind() {
+       case reflect.Struct:
+               if result.Type() == bigIntType {
+                       result.Set(reflect.ValueOf(*value))
+                       return newOffset, nil
+               }
+       case reflect.Interface:
+               if result.NumMethod() == 0 {
+                       result.Set(reflect.ValueOf(value))
+                       return newOffset, nil
+               }
+       }
+       return newOffset, newUnmarshalTypeError(value, result.Type())
+}
+
+func (d *decoder) decodeBool(size uint, offset uint) (bool, uint, error) {
+       return size != 0, offset, nil
+}
+
+func (d *decoder) decodeBytes(size uint, offset uint) ([]byte, uint, error) {
+       newOffset := offset + size
+       bytes := make([]byte, size)
+       copy(bytes, d.buffer[offset:newOffset])
+       return bytes, newOffset, nil
+}
+
+func (d *decoder) decodeFloat64(size uint, offset uint) (float64, uint, error) {
+       newOffset := offset + size
+       bits := binary.BigEndian.Uint64(d.buffer[offset:newOffset])
+       return math.Float64frombits(bits), newOffset, nil
+}
+
+func (d *decoder) decodeFloat32(size uint, offset uint) (float32, uint, error) {
+       newOffset := offset + size
+       bits := binary.BigEndian.Uint32(d.buffer[offset:newOffset])
+       return math.Float32frombits(bits), newOffset, nil
+}
+
+func (d *decoder) decodeInt(size uint, offset uint) (int, uint, error) {
+       newOffset := offset + size
+       var val int32
+       for _, b := range d.buffer[offset:newOffset] {
+               val = (val << 8) | int32(b)
+       }
+       return int(val), newOffset, nil
+}
+
+func (d *decoder) decodeMap(
+       size uint,
+       offset uint,
+       result reflect.Value,
+       depth int,
+) (uint, error) {
+       if result.IsNil() {
+               result.Set(reflect.MakeMap(result.Type()))
+       }
+
+       for i := uint(0); i < size; i++ {
+               var key []byte
+               var err error
+               key, offset, err = d.decodeKey(offset)
+
+               if err != nil {
+                       return 0, err
+               }
+
+               value := reflect.New(result.Type().Elem())
+               offset, err = d.decode(offset, value, depth)
+               if err != nil {
+                       return 0, err
+               }
+               result.SetMapIndex(reflect.ValueOf(string(key)), value.Elem())
+       }
+       return offset, nil
+}
+
+func (d *decoder) decodePointer(
+       size uint,
+       offset uint,
+) (uint, uint, error) {
+       pointerSize := ((size >> 3) & 0x3) + 1
+       newOffset := offset + pointerSize
+       if newOffset > uint(len(d.buffer)) {
+               return 0, 0, newOffsetError()
+       }
+       pointerBytes := d.buffer[offset:newOffset]
+       var prefix uint
+       if pointerSize == 4 {
+               prefix = 0
+       } else {
+               prefix = uint(size & 0x7)
+       }
+       unpacked := uintFromBytes(prefix, pointerBytes)
+
+       var pointerValueOffset uint
+       switch pointerSize {
+       case 1:
+               pointerValueOffset = 0
+       case 2:
+               pointerValueOffset = 2048
+       case 3:
+               pointerValueOffset = 526336
+       case 4:
+               pointerValueOffset = 0
+       }
+
+       pointer := unpacked + pointerValueOffset
+
+       return pointer, newOffset, nil
+}
+
+func (d *decoder) decodeSlice(
+       size uint,
+       offset uint,
+       result reflect.Value,
+       depth int,
+) (uint, error) {
+       result.Set(reflect.MakeSlice(result.Type(), int(size), int(size)))
+       for i := 0; i < int(size); i++ {
+               var err error
+               offset, err = d.decode(offset, result.Index(i), depth)
+               if err != nil {
+                       return 0, err
+               }
+       }
+       return offset, nil
+}
+
+func (d *decoder) decodeString(size uint, offset uint) (string, uint, error) {
+       newOffset := offset + size
+       return string(d.buffer[offset:newOffset]), newOffset, nil
+}
+
+type fieldsType struct {
+       namedFields     map[string]int
+       anonymousFields []int
+}
+
+var (
+       fieldMap   = map[reflect.Type]*fieldsType{}
+       fieldMapMu sync.RWMutex
+)
+
+func (d *decoder) decodeStruct(
+       size uint,
+       offset uint,
+       result reflect.Value,
+       depth int,
+) (uint, error) {
+       resultType := result.Type()
+
+       fieldMapMu.RLock()
+       fields, ok := fieldMap[resultType]
+       fieldMapMu.RUnlock()
+       if !ok {
+               numFields := resultType.NumField()
+               namedFields := make(map[string]int, numFields)
+               var anonymous []int
+               for i := 0; i < numFields; i++ {
+                       field := resultType.Field(i)
+
+                       fieldName := field.Name
+                       if tag := field.Tag.Get("maxminddb"); tag != "" {
+                               if tag == "-" {
+                                       continue
+                               }
+                               fieldName = tag
+                       }
+                       if field.Anonymous {
+                               anonymous = append(anonymous, i)
+                               continue
+                       }
+                       namedFields[fieldName] = i
+               }
+               fieldMapMu.Lock()
+               fields = &fieldsType{namedFields, anonymous}
+               fieldMap[resultType] = fields
+               fieldMapMu.Unlock()
+       }
+
+       // This fills in embedded structs
+       for _, i := range fields.anonymousFields {
+               _, err := d.unmarshalMap(size, offset, result.Field(i), depth)
+               if err != nil {
+                       return 0, err
+               }
+       }
+
+       // This handles named fields
+       for i := uint(0); i < size; i++ {
+               var (
+                       err error
+                       key []byte
+               )
+               key, offset, err = d.decodeKey(offset)
+               if err != nil {
+                       return 0, err
+               }
+               // The string() does not create a copy due to this compiler
+               // optimization: https://github.com/golang/go/issues/3512
+               j, ok := fields.namedFields[string(key)]
+               if !ok {
+                       offset, err = d.nextValueOffset(offset, 1)
+                       if err != nil {
+                               return 0, err
+                       }
+                       continue
+               }
+
+               offset, err = d.decode(offset, result.Field(j), depth)
+               if err != nil {
+                       return 0, err
+               }
+       }
+       return offset, nil
+}
+
+func (d *decoder) decodeUint(size uint, offset uint) (uint64, uint, error) {
+       newOffset := offset + size
+       bytes := d.buffer[offset:newOffset]
+
+       var val uint64
+       for _, b := range bytes {
+               val = (val << 8) | uint64(b)
+       }
+       return val, newOffset, nil
+}
+
+func (d *decoder) decodeUint128(size uint, offset uint) (*big.Int, uint, error) {
+       newOffset := offset + size
+       val := new(big.Int)
+       val.SetBytes(d.buffer[offset:newOffset])
+
+       return val, newOffset, nil
+}
+
+func uintFromBytes(prefix uint, uintBytes []byte) uint {
+       val := prefix
+       for _, b := range uintBytes {
+               val = (val << 8) | uint(b)
+       }
+       return val
+}
+
+// decodeKey decodes a map key into []byte slice. We use a []byte so that we
+// can take advantage of https://github.com/golang/go/issues/3512 to avoid
+// copying the bytes when decoding a struct. Previously, we achieved this by
+// using unsafe.
+func (d *decoder) decodeKey(offset uint) ([]byte, uint, error) {
+       typeNum, size, dataOffset, err := d.decodeCtrlData(offset)
+       if err != nil {
+               return nil, 0, err
+       }
+       if typeNum == _Pointer {
+               pointer, ptrOffset, err := d.decodePointer(size, dataOffset)
+               if err != nil {
+                       return nil, 0, err
+               }
+               key, _, err := d.decodeKey(pointer)
+               return key, ptrOffset, err
+       }
+       if typeNum != _String {
+               return nil, 0, newInvalidDatabaseError("unexpected type when decoding string: %v", typeNum)
+       }
+       newOffset := dataOffset + size
+       if newOffset > uint(len(d.buffer)) {
+               return nil, 0, newOffsetError()
+       }
+       return d.buffer[dataOffset:newOffset], newOffset, nil
+}
+
+// This function is used to skip ahead to the next value without decoding
+// the one at the offset passed in. The size bits have different meanings for
+// different data types
+func (d *decoder) nextValueOffset(offset uint, numberToSkip uint) (uint, error) {
+       if numberToSkip == 0 {
+               return offset, nil
+       }
+       typeNum, size, offset, err := d.decodeCtrlData(offset)
+       if err != nil {
+               return 0, err
+       }
+       switch typeNum {
+       case _Pointer:
+               _, offset, err = d.decodePointer(size, offset)
+               if err != nil {
+                       return 0, err
+               }
+       case _Map:
+               numberToSkip += 2 * size
+       case _Slice:
+               numberToSkip += size
+       case _Bool:
+       default:
+               offset += size
+       }
+       return d.nextValueOffset(offset, numberToSkip-1)
+}
diff --git a/vendor/github.com/oschwald/maxminddb-golang/errors.go b/vendor/github.com/oschwald/maxminddb-golang/errors.go
new file mode 100644 (file)
index 0000000..1327800
--- /dev/null
@@ -0,0 +1,42 @@
+package maxminddb
+
+import (
+       "fmt"
+       "reflect"
+)
+
+// InvalidDatabaseError is returned when the database contains invalid data
+// and cannot be parsed.
+type InvalidDatabaseError struct {
+       message string
+}
+
+func newOffsetError() InvalidDatabaseError {
+       return InvalidDatabaseError{"unexpected end of database"}
+}
+
+func newInvalidDatabaseError(format string, args ...interface{}) InvalidDatabaseError {
+       return InvalidDatabaseError{fmt.Sprintf(format, args...)}
+}
+
+func (e InvalidDatabaseError) Error() string {
+       return e.message
+}
+
+// UnmarshalTypeError is returned when the value in the database cannot be
+// assigned to the specified data type.
+type UnmarshalTypeError struct {
+       Value string       // stringified copy of the database value that caused the error
+       Type  reflect.Type // type of the value that could not be assign to
+}
+
+func newUnmarshalTypeError(value interface{}, rType reflect.Type) UnmarshalTypeError {
+       return UnmarshalTypeError{
+               Value: fmt.Sprintf("%v", value),
+               Type:  rType,
+       }
+}
+
+func (e UnmarshalTypeError) Error() string {
+       return fmt.Sprintf("maxminddb: cannot unmarshal %s into type %s", e.Value, e.Type.String())
+}
diff --git a/vendor/github.com/oschwald/maxminddb-golang/mmap_unix.go b/vendor/github.com/oschwald/maxminddb-golang/mmap_unix.go
new file mode 100644 (file)
index 0000000..d898d25
--- /dev/null
@@ -0,0 +1,15 @@
+// +build !windows,!appengine
+
+package maxminddb
+
+import (
+       "golang.org/x/sys/unix"
+)
+
+func mmap(fd int, length int) (data []byte, err error) {
+       return unix.Mmap(fd, 0, length, unix.PROT_READ, unix.MAP_SHARED)
+}
+
+func munmap(b []byte) (err error) {
+       return unix.Munmap(b)
+}
diff --git a/vendor/github.com/oschwald/maxminddb-golang/mmap_windows.go b/vendor/github.com/oschwald/maxminddb-golang/mmap_windows.go
new file mode 100644 (file)
index 0000000..661250e
--- /dev/null
@@ -0,0 +1,85 @@
+// +build windows,!appengine
+
+package maxminddb
+
+// Windows support largely borrowed from mmap-go.
+//
+// Copyright 2011 Evan Shaw. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+import (
+       "errors"
+       "os"
+       "reflect"
+       "sync"
+       "unsafe"
+
+       "golang.org/x/sys/windows"
+)
+
+type memoryMap []byte
+
+// Windows
+var handleLock sync.Mutex
+var handleMap = map[uintptr]windows.Handle{}
+
+func mmap(fd int, length int) (data []byte, err error) {
+       h, errno := windows.CreateFileMapping(windows.Handle(fd), nil,
+               uint32(windows.PAGE_READONLY), 0, uint32(length), nil)
+       if h == 0 {
+               return nil, os.NewSyscallError("CreateFileMapping", errno)
+       }
+
+       addr, errno := windows.MapViewOfFile(h, uint32(windows.FILE_MAP_READ), 0,
+               0, uintptr(length))
+       if addr == 0 {
+               return nil, os.NewSyscallError("MapViewOfFile", errno)
+       }
+       handleLock.Lock()
+       handleMap[addr] = h
+       handleLock.Unlock()
+
+       m := memoryMap{}
+       dh := m.header()
+       dh.Data = addr
+       dh.Len = length
+       dh.Cap = dh.Len
+
+       return m, nil
+}
+
+func (m *memoryMap) header() *reflect.SliceHeader {
+       return (*reflect.SliceHeader)(unsafe.Pointer(m))
+}
+
+func flush(addr, len uintptr) error {
+       errno := windows.FlushViewOfFile(addr, len)
+       return os.NewSyscallError("FlushViewOfFile", errno)
+}
+
+func munmap(b []byte) (err error) {
+       m := memoryMap(b)
+       dh := m.header()
+
+       addr := dh.Data
+       length := uintptr(dh.Len)
+
+       flush(addr, length)
+       err = windows.UnmapViewOfFile(addr)
+       if err != nil {
+               return err
+       }
+
+       handleLock.Lock()
+       defer handleLock.Unlock()
+       handle, ok := handleMap[addr]
+       if !ok {
+               // should be impossible; we would've errored above
+               return errors.New("unknown base address")
+       }
+       delete(handleMap, addr)
+
+       e := windows.CloseHandle(windows.Handle(handle))
+       return os.NewSyscallError("CloseHandle", e)
+}
diff --git a/vendor/github.com/oschwald/maxminddb-golang/reader.go b/vendor/github.com/oschwald/maxminddb-golang/reader.go
new file mode 100644 (file)
index 0000000..97b9607
--- /dev/null
@@ -0,0 +1,259 @@
+package maxminddb
+
+import (
+       "bytes"
+       "errors"
+       "fmt"
+       "net"
+       "reflect"
+)
+
+const (
+       // NotFound is returned by LookupOffset when a matched root record offset
+       // cannot be found.
+       NotFound = ^uintptr(0)
+
+       dataSectionSeparatorSize = 16
+)
+
+var metadataStartMarker = []byte("\xAB\xCD\xEFMaxMind.com")
+
+// Reader holds the data corresponding to the MaxMind DB file. Its only public
+// field is Metadata, which contains the metadata from the MaxMind DB file.
+type Reader struct {
+       hasMappedFile bool
+       buffer        []byte
+       decoder       decoder
+       Metadata      Metadata
+       ipv4Start     uint
+}
+
+// Metadata holds the metadata decoded from the MaxMind DB file. In particular
+// in has the format version, the build time as Unix epoch time, the database
+// type and description, the IP version supported, and a slice of the natural
+// languages included.
+type Metadata struct {
+       BinaryFormatMajorVersion uint              `maxminddb:"binary_format_major_version"`
+       BinaryFormatMinorVersion uint              `maxminddb:"binary_format_minor_version"`
+       BuildEpoch               uint              `maxminddb:"build_epoch"`
+       DatabaseType             string            `maxminddb:"database_type"`
+       Description              map[string]string `maxminddb:"description"`
+       IPVersion                uint              `maxminddb:"ip_version"`
+       Languages                []string          `maxminddb:"languages"`
+       NodeCount                uint              `maxminddb:"node_count"`
+       RecordSize               uint              `maxminddb:"record_size"`
+}
+
+// FromBytes takes a byte slice corresponding to a MaxMind DB file and returns
+// a Reader structure or an error.
+func FromBytes(buffer []byte) (*Reader, error) {
+       metadataStart := bytes.LastIndex(buffer, metadataStartMarker)
+
+       if metadataStart == -1 {
+               return nil, newInvalidDatabaseError("error opening database: invalid MaxMind DB file")
+       }
+
+       metadataStart += len(metadataStartMarker)
+       metadataDecoder := decoder{buffer[metadataStart:]}
+
+       var metadata Metadata
+
+       rvMetdata := reflect.ValueOf(&metadata)
+       _, err := metadataDecoder.decode(0, rvMetdata, 0)
+       if err != nil {
+               return nil, err
+       }
+
+       searchTreeSize := metadata.NodeCount * metadata.RecordSize / 4
+       dataSectionStart := searchTreeSize + dataSectionSeparatorSize
+       dataSectionEnd := uint(metadataStart - len(metadataStartMarker))
+       if dataSectionStart > dataSectionEnd {
+               return nil, newInvalidDatabaseError("the MaxMind DB contains invalid metadata")
+       }
+       d := decoder{
+               buffer[searchTreeSize+dataSectionSeparatorSize : metadataStart-len(metadataStartMarker)],
+       }
+
+       reader := &Reader{
+               buffer:    buffer,
+               decoder:   d,
+               Metadata:  metadata,
+               ipv4Start: 0,
+       }
+
+       reader.ipv4Start, err = reader.startNode()
+
+       return reader, err
+}
+
+func (r *Reader) startNode() (uint, error) {
+       if r.Metadata.IPVersion != 6 {
+               return 0, nil
+       }
+
+       nodeCount := r.Metadata.NodeCount
+
+       node := uint(0)
+       var err error
+       for i := 0; i < 96 && node < nodeCount; i++ {
+               node, err = r.readNode(node, 0)
+               if err != nil {
+                       return 0, err
+               }
+       }
+       return node, err
+}
+
+// Lookup takes an IP address as a net.IP structure and a pointer to the
+// result value to Decode into.
+func (r *Reader) Lookup(ipAddress net.IP, result interface{}) error {
+       if r.buffer == nil {
+               return errors.New("cannot call Lookup on a closed database")
+       }
+       pointer, err := r.lookupPointer(ipAddress)
+       if pointer == 0 || err != nil {
+               return err
+       }
+       return r.retrieveData(pointer, result)
+}
+
+// LookupOffset maps an argument net.IP to a corresponding record offset in the
+// database. NotFound is returned if no such record is found, and a record may
+// otherwise be extracted by passing the returned offset to Decode. LookupOffset
+// is an advanced API, which exists to provide clients with a means to cache
+// previously-decoded records.
+func (r *Reader) LookupOffset(ipAddress net.IP) (uintptr, error) {
+       if r.buffer == nil {
+               return 0, errors.New("cannot call LookupOffset on a closed database")
+       }
+       pointer, err := r.lookupPointer(ipAddress)
+       if pointer == 0 || err != nil {
+               return NotFound, err
+       }
+       return r.resolveDataPointer(pointer)
+}
+
+// Decode the record at |offset| into |result|. The result value pointed to
+// must be a data value that corresponds to a record in the database. This may
+// include a struct representation of the data, a map capable of holding the
+// data or an empty interface{} value.
+//
+// If result is a pointer to a struct, the struct need not include a field
+// for every value that may be in the database. If a field is not present in
+// the structure, the decoder will not decode that field, reducing the time
+// required to decode the record.
+//
+// As a special case, a struct field of type uintptr will be used to capture
+// the offset of the value. Decode may later be used to extract the stored
+// value from the offset. MaxMind DBs are highly normalized: for example in
+// the City database, all records of the same country will reference a
+// single representative record for that country. This uintptr behavior allows
+// clients to leverage this normalization in their own sub-record caching.
+func (r *Reader) Decode(offset uintptr, result interface{}) error {
+       if r.buffer == nil {
+               return errors.New("cannot call Decode on a closed database")
+       }
+       return r.decode(offset, result)
+}
+
+func (r *Reader) decode(offset uintptr, result interface{}) error {
+       rv := reflect.ValueOf(result)
+       if rv.Kind() != reflect.Ptr || rv.IsNil() {
+               return errors.New("result param must be a pointer")
+       }
+
+       _, err := r.decoder.decode(uint(offset), reflect.ValueOf(result), 0)
+       return err
+}
+
+func (r *Reader) lookupPointer(ipAddress net.IP) (uint, error) {
+       if ipAddress == nil {
+               return 0, errors.New("ipAddress passed to Lookup cannot be nil")
+       }
+
+       ipV4Address := ipAddress.To4()
+       if ipV4Address != nil {
+               ipAddress = ipV4Address
+       }
+       if len(ipAddress) == 16 && r.Metadata.IPVersion == 4 {
+               return 0, fmt.Errorf("error looking up '%s': you attempted to look up an IPv6 address in an IPv4-only database", ipAddress.String())
+       }
+
+       return r.findAddressInTree(ipAddress)
+}
+
+func (r *Reader) findAddressInTree(ipAddress net.IP) (uint, error) {
+
+       bitCount := uint(len(ipAddress) * 8)
+
+       var node uint
+       if bitCount == 32 {
+               node = r.ipv4Start
+       }
+
+       nodeCount := r.Metadata.NodeCount
+
+       for i := uint(0); i < bitCount && node < nodeCount; i++ {
+               bit := uint(1) & (uint(ipAddress[i>>3]) >> (7 - (i % 8)))
+
+               var err error
+               node, err = r.readNode(node, bit)
+               if err != nil {
+                       return 0, err
+               }
+       }
+       if node == nodeCount {
+               // Record is empty
+               return 0, nil
+       } else if node > nodeCount {
+               return node, nil
+       }
+
+       return 0, newInvalidDatabaseError("invalid node in search tree")
+}
+
+func (r *Reader) readNode(nodeNumber uint, index uint) (uint, error) {
+       RecordSize := r.Metadata.RecordSize
+
+       baseOffset := nodeNumber * RecordSize / 4
+
+       var nodeBytes []byte
+       var prefix uint
+       switch RecordSize {
+       case 24:
+               offset := baseOffset + index*3
+               nodeBytes = r.buffer[offset : offset+3]
+       case 28:
+               prefix = uint(r.buffer[baseOffset+3])
+               if index != 0 {
+                       prefix &= 0x0F
+               } else {
+                       prefix = (0xF0 & prefix) >> 4
+               }
+               offset := baseOffset + index*4
+               nodeBytes = r.buffer[offset : offset+3]
+       case 32:
+               offset := baseOffset + index*4
+               nodeBytes = r.buffer[offset : offset+4]
+       default:
+               return 0, newInvalidDatabaseError("unknown record size: %d", RecordSize)
+       }
+       return uintFromBytes(prefix, nodeBytes), nil
+}
+
+func (r *Reader) retrieveData(pointer uint, result interface{}) error {
+       offset, err := r.resolveDataPointer(pointer)
+       if err != nil {
+               return err
+       }
+       return r.decode(offset, result)
+}
+
+func (r *Reader) resolveDataPointer(pointer uint) (uintptr, error) {
+       var resolved = uintptr(pointer - r.Metadata.NodeCount - dataSectionSeparatorSize)
+
+       if resolved > uintptr(len(r.buffer)) {
+               return 0, newInvalidDatabaseError("the MaxMind DB file's search tree is corrupt")
+       }
+       return resolved, nil
+}
diff --git a/vendor/github.com/oschwald/maxminddb-golang/reader_appengine.go b/vendor/github.com/oschwald/maxminddb-golang/reader_appengine.go
new file mode 100644 (file)
index 0000000..d200f9f
--- /dev/null
@@ -0,0 +1,28 @@
+// +build appengine
+
+package maxminddb
+
+import "io/ioutil"
+
+// Open takes a string path to a MaxMind DB file and returns a Reader
+// structure or an error. The database file is opened using a memory map,
+// except on Google App Engine where mmap is not supported; there the database
+// is loaded into memory. Use the Close method on the Reader object to return
+// the resources to the system.
+func Open(file string) (*Reader, error) {
+       bytes, err := ioutil.ReadFile(file)
+       if err != nil {
+               return nil, err
+       }
+
+       return FromBytes(bytes)
+}
+
+// Close unmaps the database file from virtual memory and returns the
+// resources to the system. If called on a Reader opened using FromBytes
+// or Open on Google App Engine, this method sets the underlying buffer
+// to nil, returning the resources to the system.
+func (r *Reader) Close() error {
+       r.buffer = nil
+       return nil
+}
diff --git a/vendor/github.com/oschwald/maxminddb-golang/reader_other.go b/vendor/github.com/oschwald/maxminddb-golang/reader_other.go
new file mode 100644 (file)
index 0000000..2a89fa6
--- /dev/null
@@ -0,0 +1,63 @@
+// +build !appengine
+
+package maxminddb
+
+import (
+       "os"
+       "runtime"
+)
+
+// Open takes a string path to a MaxMind DB file and returns a Reader
+// structure or an error. The database file is opened using a memory map,
+// except on Google App Engine where mmap is not supported; there the database
+// is loaded into memory. Use the Close method on the Reader object to return
+// the resources to the system.
+func Open(file string) (*Reader, error) {
+       mapFile, err := os.Open(file)
+       if err != nil {
+               return nil, err
+       }
+       defer func() {
+               if rerr := mapFile.Close(); rerr != nil {
+                       err = rerr
+               }
+       }()
+
+       stats, err := mapFile.Stat()
+       if err != nil {
+               return nil, err
+       }
+
+       fileSize := int(stats.Size())
+       mmap, err := mmap(int(mapFile.Fd()), fileSize)
+       if err != nil {
+               return nil, err
+       }
+
+       reader, err := FromBytes(mmap)
+       if err != nil {
+               if err2 := munmap(mmap); err2 != nil {
+                       // failing to unmap the file is probably the more severe error
+                       return nil, err2
+               }
+               return nil, err
+       }
+
+       reader.hasMappedFile = true
+       runtime.SetFinalizer(reader, (*Reader).Close)
+       return reader, err
+}
+
+// Close unmaps the database file from virtual memory and returns the
+// resources to the system. If called on a Reader opened using FromBytes
+// or Open on Google App Engine, this method does nothing.
+func (r *Reader) Close() error {
+       var err error
+       if r.hasMappedFile {
+               runtime.SetFinalizer(r, nil)
+               r.hasMappedFile = false
+               err = munmap(r.buffer)
+       }
+       r.buffer = nil
+       return err
+}
diff --git a/vendor/github.com/oschwald/maxminddb-golang/traverse.go b/vendor/github.com/oschwald/maxminddb-golang/traverse.go
new file mode 100644 (file)
index 0000000..f9b443c
--- /dev/null
@@ -0,0 +1,108 @@
+package maxminddb
+
+import "net"
+
+// Internal structure used to keep track of nodes we still need to visit.
+type netNode struct {
+       ip      net.IP
+       bit     uint
+       pointer uint
+}
+
+// Networks represents a set of subnets that we are iterating over.
+type Networks struct {
+       reader   *Reader
+       nodes    []netNode // Nodes we still have to visit.
+       lastNode netNode
+       err      error
+}
+
+// Networks returns an iterator that can be used to traverse all networks in
+// the database.
+//
+// Please note that a MaxMind DB may map IPv4 networks into several locations
+// in in an IPv6 database. This iterator will iterate over all of these
+// locations separately.
+func (r *Reader) Networks() *Networks {
+       s := 4
+       if r.Metadata.IPVersion == 6 {
+               s = 16
+       }
+       return &Networks{
+               reader: r,
+               nodes: []netNode{
+                       {
+                               ip: make(net.IP, s),
+                       },
+               },
+       }
+}
+
+// Next prepares the next network for reading with the Network method. It
+// returns true if there is another network to be processed and false if there
+// are no more networks or if there is an error.
+func (n *Networks) Next() bool {
+       for len(n.nodes) > 0 {
+               node := n.nodes[len(n.nodes)-1]
+               n.nodes = n.nodes[:len(n.nodes)-1]
+
+               for {
+                       if node.pointer < n.reader.Metadata.NodeCount {
+                               ipRight := make(net.IP, len(node.ip))
+                               copy(ipRight, node.ip)
+                               if len(ipRight) <= int(node.bit>>3) {
+                                       n.err = newInvalidDatabaseError(
+                                               "invalid search tree at %v/%v", ipRight, node.bit)
+                                       return false
+                               }
+                               ipRight[node.bit>>3] |= 1 << (7 - (node.bit % 8))
+
+                               rightPointer, err := n.reader.readNode(node.pointer, 1)
+                               if err != nil {
+                                       n.err = err
+                                       return false
+                               }
+
+                               node.bit++
+                               n.nodes = append(n.nodes, netNode{
+                                       pointer: rightPointer,
+                                       ip:      ipRight,
+                                       bit:     node.bit,
+                               })
+
+                               node.pointer, err = n.reader.readNode(node.pointer, 0)
+                               if err != nil {
+                                       n.err = err
+                                       return false
+                               }
+
+                       } else if node.pointer > n.reader.Metadata.NodeCount {
+                               n.lastNode = node
+                               return true
+                       } else {
+                               break
+                       }
+               }
+       }
+
+       return false
+}
+
+// Network returns the current network or an error if there is a problem
+// decoding the data for the network. It takes a pointer to a result value to
+// decode the network's data into.
+func (n *Networks) Network(result interface{}) (*net.IPNet, error) {
+       if err := n.reader.retrieveData(n.lastNode.pointer, result); err != nil {
+               return nil, err
+       }
+
+       return &net.IPNet{
+               IP:   n.lastNode.ip,
+               Mask: net.CIDRMask(int(n.lastNode.bit), len(n.lastNode.ip)*8),
+       }, nil
+}
+
+// Err returns an error, if any, that was encountered during iteration.
+func (n *Networks) Err() error {
+       return n.err
+}
diff --git a/vendor/github.com/oschwald/maxminddb-golang/verifier.go b/vendor/github.com/oschwald/maxminddb-golang/verifier.go
new file mode 100644 (file)
index 0000000..ace9d35
--- /dev/null
@@ -0,0 +1,185 @@
+package maxminddb
+
+import "reflect"
+
+type verifier struct {
+       reader *Reader
+}
+
+// Verify checks that the database is valid. It validates the search tree,
+// the data section, and the metadata section. This verifier is stricter than
+// the specification and may return errors on databases that are readable.
+func (r *Reader) Verify() error {
+       v := verifier{r}
+       if err := v.verifyMetadata(); err != nil {
+               return err
+       }
+
+       return v.verifyDatabase()
+}
+
+func (v *verifier) verifyMetadata() error {
+       metadata := v.reader.Metadata
+
+       if metadata.BinaryFormatMajorVersion != 2 {
+               return testError(
+                       "binary_format_major_version",
+                       2,
+                       metadata.BinaryFormatMajorVersion,
+               )
+       }
+
+       if metadata.BinaryFormatMinorVersion != 0 {
+               return testError(
+                       "binary_format_minor_version",
+                       0,
+                       metadata.BinaryFormatMinorVersion,
+               )
+       }
+
+       if metadata.DatabaseType == "" {
+               return testError(
+                       "database_type",
+                       "non-empty string",
+                       metadata.DatabaseType,
+               )
+       }
+
+       if len(metadata.Description) == 0 {
+               return testError(
+                       "description",
+                       "non-empty slice",
+                       metadata.Description,
+               )
+       }
+
+       if metadata.IPVersion != 4 && metadata.IPVersion != 6 {
+               return testError(
+                       "ip_version",
+                       "4 or 6",
+                       metadata.IPVersion,
+               )
+       }
+
+       if metadata.RecordSize != 24 &&
+               metadata.RecordSize != 28 &&
+               metadata.RecordSize != 32 {
+               return testError(
+                       "record_size",
+                       "24, 28, or 32",
+                       metadata.RecordSize,
+               )
+       }
+
+       if metadata.NodeCount == 0 {
+               return testError(
+                       "node_count",
+                       "positive integer",
+                       metadata.NodeCount,
+               )
+       }
+       return nil
+}
+
+func (v *verifier) verifyDatabase() error {
+       offsets, err := v.verifySearchTree()
+       if err != nil {
+               return err
+       }
+
+       if err := v.verifyDataSectionSeparator(); err != nil {
+               return err
+       }
+
+       return v.verifyDataSection(offsets)
+}
+
+func (v *verifier) verifySearchTree() (map[uint]bool, error) {
+       offsets := make(map[uint]bool)
+
+       it := v.reader.Networks()
+       for it.Next() {
+               offset, err := v.reader.resolveDataPointer(it.lastNode.pointer)
+               if err != nil {
+                       return nil, err
+               }
+               offsets[uint(offset)] = true
+       }
+       if err := it.Err(); err != nil {
+               return nil, err
+       }
+       return offsets, nil
+}
+
+func (v *verifier) verifyDataSectionSeparator() error {
+       separatorStart := v.reader.Metadata.NodeCount * v.reader.Metadata.RecordSize / 4
+
+       separator := v.reader.buffer[separatorStart : separatorStart+dataSectionSeparatorSize]
+
+       for _, b := range separator {
+               if b != 0 {
+                       return newInvalidDatabaseError("unexpected byte in data separator: %v", separator)
+               }
+       }
+       return nil
+}
+
+func (v *verifier) verifyDataSection(offsets map[uint]bool) error {
+       pointerCount := len(offsets)
+
+       decoder := v.reader.decoder
+
+       var offset uint
+       bufferLen := uint(len(decoder.buffer))
+       for offset < bufferLen {
+               var data interface{}
+               rv := reflect.ValueOf(&data)
+               newOffset, err := decoder.decode(offset, rv, 0)
+               if err != nil {
+                       return newInvalidDatabaseError("received decoding error (%v) at offset of %v", err, offset)
+               }
+               if newOffset <= offset {
+                       return newInvalidDatabaseError("data section offset unexpectedly went from %v to %v", offset, newOffset)
+               }
+
+               pointer := offset
+
+               if _, ok := offsets[pointer]; ok {
+                       delete(offsets, pointer)
+               } else {
+                       return newInvalidDatabaseError("found data (%v) at %v that the search tree does not point to", data, pointer)
+               }
+
+               offset = newOffset
+       }
+
+       if offset != bufferLen {
+               return newInvalidDatabaseError(
+                       "unexpected data at the end of the data section (last offset: %v, end: %v)",
+                       offset,
+                       bufferLen,
+               )
+       }
+
+       if len(offsets) != 0 {
+               return newInvalidDatabaseError(
+                       "found %v pointers (of %v) in the search tree that we did not see in the data section",
+                       len(offsets),
+                       pointerCount,
+               )
+       }
+       return nil
+}
+
+func testError(
+       field string,
+       expected interface{},
+       actual interface{},
+) error {
+       return newInvalidDatabaseError(
+               "%v - Expected: %v Actual: %v",
+               field,
+               expected,
+               actual,
+       )
+}
diff --git a/vendor/github.com/tidwall/cities/LICENSE b/vendor/github.com/tidwall/cities/LICENSE
new file mode 100644 (file)
index 0000000..cf1ab25
--- /dev/null
@@ -0,0 +1,24 @@
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <http://unlicense.org>
diff --git a/vendor/github.com/tidwall/cities/README.md b/vendor/github.com/tidwall/cities/README.md
new file mode 100644 (file)
index 0000000..ebf0e82
--- /dev/null
@@ -0,0 +1,6 @@
+# 10,000 Cities with Latitude, Longitude, and Elevation
+
+
+<img src="http://i.imgur.com/i9hcVJ5.gif">
+
+Animation created using [pinhole](https://github.com/tidwall/pinhole). 
diff --git a/vendor/github.com/tidwall/cities/cities.go b/vendor/github.com/tidwall/cities/cities.go
new file mode 100644 (file)
index 0000000..913d36c
--- /dev/null
@@ -0,0 +1,10608 @@
+package cities
+
+type City struct {
+       ID        int
+       Country   string
+       City      string
+       Latitude  float64
+       Longitude float64
+       Altitude  float64
+}
+
+var Cities = []City{
+       {1, "Afghanistan", "Kabul", 34.5166667, 69.1833344, 1808.0},
+       {2, "Afghanistan", "Kandahar", 31.6100000, 65.6999969, 1015.0},
+       {3, "Afghanistan", "Mazar-e Sharif", 36.7069444, 67.1122208, 369.0},
+       {4, "Afghanistan", "Herat", 34.3400000, 62.1899986, 927.0},
+       {5, "Afghanistan", "Jalalabad", 34.4200000, 70.4499969, 573.0},
+       {6, "Afghanistan", "Konduz", 36.7200000, 68.8600006, 394.0},
+       {7, "Afghanistan", "Ghazni", 33.5535554, 68.4268875, 2175.0},
+       {8, "Afghanistan", "Balkh", 36.7586111, 66.8961105, 328.0},
+       {9, "Afghanistan", "Baghlan", 36.1200000, 68.6999969, 565.0},
+       {10, "Afghanistan", "Gardez", 33.5900000, 69.2200012, 2279.0},
+       {11, "Afghanistan", "Khost", 33.3380556, 69.9202805, 1178.0},
+       {12, "Afghanistan", "Khanabad", 36.6800000, 69.1100006, 490.0},
+       {13, "Afghanistan", "Tashqorghan", 36.6952778, 67.6980591, 460.0},
+       {14, "Afghanistan", "Taloqan", 36.7360511, 69.5345078, 788.0},
+       {15, "Afghanistan", "Cool urhajo", 34.2654452, 67.3451614, 2733.0},
+       {16, "Afghanistan", "Pol-e Khomri", 35.9425000, 68.7191696, 832.0},
+       {17, "Afghanistan", "Sheberghan", 36.6672222, 65.7536087, 362.0},
+       {18, "Afghanistan", "Charikar", 35.0136110, 69.1713867, 1534.0},
+       {19, "Afghanistan", "Sar-e Pol", 36.2155556, 65.9363861, 629.0},
+       {20, "Afghanistan", "Paghman", 34.5875000, 68.9533310, 2276.0},
+       {21, "Afghanistan", "Samangan", 36.2652778, 68.0166702, 960.0},
+       {22, "Afghanistan", "Nawab City", 31.5800000, 64.3600006, 775.0},
+       {23, "Afghanistan", "Gereshk", 31.8188889, 64.5647202, 844.0},
+       {24, "Afghanistan", "Farakh", 32.3700000, 62.1100006, 653.0},
+       {25, "Afghanistan", "Feyzabad", 37.1175000, 70.5797195, 1235.0},
+       {26, "Afghanistan", "Sindand", 33.3000000, 62.1399994, 1071.0},
+       {27, "Afghanistan", "Andkhvoy", 36.9525000, 65.1236115, 319.0},
+       {28, "Afghanistan", "Rostaq", 37.1275000, 69.8305588, 1323.0},
+       {29, "Afghanistan", "Qaravol", 37.2211111, 68.7799988, 327.0},
+       {30, "Afghanistan", "Nahrin", 36.0652778, 69.1338882, 1156.0},
+       {31, "Afghanistan", "Baraki Barak", 33.9675000, 68.9486084, 1937.0},
+       {32, "Afghanistan", "At Khvajeh", 37.0841667, 69.4805527, 474.0},
+       {33, "Afghanistan", "Eslam Qal`eh", 34.6666667, 61.0666656, 721.0},
+       {34, "Afghanistan", "Karokh", 34.4791667, 62.5869446, 1309.0},
+       {35, "Afghanistan", "Mehtar Lam", 34.6713889, 70.2094421, 768.0},
+       {36, "Afghanistan", "Kushk", 33.2961111, 61.9527779, 1126.0},
+       {37, "Afghanistan", "Shahrag", 34.1083333, 64.3033371, 2393.0},
+       {38, "Afghanistan", "Asmar", 35.0300000, 71.3499985, 934.0},
+       {39, "Afghanistan", "Sang-e Charak", 35.8497222, 66.4369431, 1547.0},
+       {40, "Afghanistan", "Khash", 31.5291667, 62.7924995, 578.0},
+       {41, "Afghanistan", "Achin", 34.1200000, 70.6999969, 997.0},
+       {42, "Afghanistan", "Jabal os Saraj", 35.1183330, 69.2377777, 1575.0},
+       {43, "Afghanistan", "Qarqin", 37.4127778, 66.0472260, 250.0},
+       {44, "Afghanistan", "Mirabad", 30.4352778, 61.8347206, 499.0},
+       {45, "Afghanistan", "Zarghun Shahr", 32.8472222, 68.4458313, 2114.0},
+       {46, "Afghanistan", "Sangin", 32.0733333, 64.8338852, 892.0},
+       {47, "Afghanistan", "Panjab", 34.3875000, 67.0233307, 2707.0},
+       {48, "Afghanistan", "Uruzgan", 32.9200000, 66.6299973, 2010.0},
+       {49, "Afghanistan", "Pul-i-Alam", 33.9800000, 69.0299988, 1916.0},
+       {50, "Afghanistan", "Chiras", 35.4166667, 65.9833298, 2828.0},
+       {51, "Afghanistan", "Hokumati Azraw", 34.1700000, 69.6399994, 2278.0},
+       {52, "Afghanistan", "Qareh Bagh", 34.9405556, 61.7775002, 950.0},
+       {53, "Afghanistan", "Kalat-i-Ghilzai", 32.1000000, 66.9100037, 1535.0},
+       {54, "Afghanistan", "Ashkasham", 36.6833333, 71.5333328, 3037.0},
+       {55, "Afghanistan", "Jorm", 36.8666667, 70.8344421, 1508.0},
+       {56, "Afghanistan", "Kuhestan", 34.6538889, 61.1977768, 734.0},
+       {57, "Afghanistan", "Tokzar", 35.9488889, 66.4199982, 1253.0},
+       {58, "Afghanistan", "Char Burj", 34.2400000, 62.1899986, 967.0},
+       {59, "Afghanistan", "Lar Gerd", 35.4897222, 66.6636124, 1867.0},
+       {60, "Afghanistan", "Rudbar", 30.1500000, 62.5999985, 573.0},
+       {61, "Afghanistan", "Farkhar", 36.5722222, 69.8580551, 1135.0},
+       {62, "Afghanistan", "Zendeh Jan", 34.3455556, 61.7316666, 844.0},
+       {63, "Afghanistan", "Anar Darreh", 32.7622222, 61.6525002, 801.0},
+       {64, "Afghanistan", "Emam Saheb", 37.1822222, 68.9124985, 340.0},
+       {65, "Afghanistan", "Darzab", 35.9783333, 65.3791656, 1224.0},
+       {66, "Afghanistan", "`Alaqehdari Deh-e Shu", 30.4347222, 63.3072205, 584.0},
+       {67, "Afghanistan", "Tagow Bay", 35.7016667, 66.0613861, 1845.0},
+       {68, "Afghanistan", "Darvishan", 31.1333333, 64.1924973, 719.0},
+       {69, "Afghanistan", "Qarchi Gak", 37.0355556, 66.7888870, 298.0},
+       {70, "Afghanistan", "Dasht-e Archi", 37.1333333, 69.1666641, 372.0},
+       {71, "Afghanistan", "Qal`eh Shahr", 35.5483333, 65.5677795, 2159.0},
+       {72, "Afghanistan", "Zareh Sharan", 33.1466667, 68.7916641, 2141.0},
+       {73, "Afghanistan", "Tir Pol", 34.5952778, 61.2669449, 768.0},
+       {74, "Afghanistan", "Mohmand Darrah", 34.2400000, 70.8700027, 481.0},
+       {75, "Afghanistan", "Yengi Qal`eh", 37.4672222, 69.6091690, 481.0},
+       {76, "Afghanistan", "Tagao", 34.8500000, 69.6399994, 1453.0},
+       {77, "Afghanistan", "Khandud", 36.9488889, 72.3169479, 2918.0},
+       {78, "Afghanistan", "Mir Bachcheh Kowt", 34.7488889, 69.1191635, 1691.0},
+       {79, "Afghanistan", "Dorufchah", 36.4397222, 70.0838852, 4290.0},
+       {80, "Afghanistan", "Dahaneh-ye Ghowri", 35.9075000, 68.4938889, 758.0},
+       {81, "Afghanistan", "Lab-Sar", 36.0261111, 66.8386078, 1043.0},
+       {82, "Afghanistan", "Darwazkay", 35.0200000, 71.0400009, 2508.0},
+       {83, "Afghanistan", "Munay", 34.9800000, 71.2500000, 995.0},
+       {84, "Afghanistan", "Mulkanah", 34.9400000, 71.0599976, 1181.0},
+       {85, "Albania", "Tirana", 41.3275000, 19.8188896, 103.0},
+       {86, "Albania", "Durres", 41.3230556, 19.4413891, -9999.0},
+       {87, "Albania", "Elbasan", 41.1125000, 20.0822220, 126.0},
+       {88, "Albania", "Vlore", 40.4666667, 19.4897213, 58.0},
+       {89, "Albania", "Shkoder", 42.0682829, 19.5125771, 17.0},
+       {90, "Albania", "Fier-Cifci", 40.7166667, 19.5666676, 7.0},
+       {91, "Albania", "Korce", 40.6186111, 20.7808342, 876.0},
+       {92, "Albania", "Berat", 40.7058333, 19.9522228, 69.0},
+       {93, "Albania", "Lushnje", 40.9419444, 19.7049999, 81.0},
+       {94, "Albania", "Kavaje", 41.1855556, 19.5569439, 10.0},
+       {95, "Albania", "Lac", 41.6355556, 19.7130547, 89.0},
+       {96, "Albania", "Gjirokaster", 40.0758333, 20.1388893, 213.0},
+       {97, "Albania", "Patos Fshat", 40.6427778, 19.6508331, 118.0},
+       {98, "Albania", "Kruje", 41.5091667, 19.7927780, 870.0},
+       {99, "Albania", "Lezhe", 41.7836111, 19.6436119, 82.0},
+       {100, "Albania", "Kucove", 40.8002778, 19.9166660, 95.0},
+       {101, "Albania", "Kukes", 42.0769444, 20.4219437, 339.0},
+       {102, "Albania", "Burrel", 41.6102778, 20.0088882, 196.0},
+       {103, "Albania", "Sarande", 39.8755556, 20.0052776, 170.0},
+       {104, "Albania", "Peshkopi", 41.6850000, 20.4288883, 718.0},
+       {105, "Albania", "Cerrik", 41.0316667, 19.9758339, 70.0},
+       {106, "Albania", "Shijak", 41.3455556, 19.5672226, 57.0},
+       {107, "Albania", "Corovode", 40.5041667, 20.2272224, 539.0},
+       {108, "Albania", "Librazhd-Qender", 41.1969444, 20.3355560, 436.0},
+       {109, "Albania", "Tepelene", 40.2958333, 20.0191669, 112.0},
+       {110, "Albania", "Gramsh", 40.8697222, 20.1844444, 342.0},
+       {111, "Albania", "Bulqize", 41.4916667, 20.2219448, 729.0},
+       {112, "Albania", "Kamez", 41.3816667, 19.7602787, 73.0},
+       {113, "Albania", "Permet", 40.2336111, 20.3516674, 281.0},
+       {114, "Albania", "Polican", 40.6122222, 20.0980549, 407.0},
+       {115, "Albania", "Fushe-Kruje", 41.4783333, 19.7177773, 41.0},
+       {116, "Albania", "Ballsh", 40.5988889, 19.7347221, 232.0},
+       {117, "Albania", "Rreshen", 41.7675000, 19.8755550, 129.0},
+       {118, "Albania", "Mamurras", 41.5775000, 19.6922226, 79.0},
+       {119, "Albania", "Bajram Curri", 42.3572222, 20.0730553, 313.0},
+       {120, "Albania", "Erseke", 40.3377778, 20.6788883, 1024.0},
+       {121, "Albania", "Peqin", 41.0461111, 19.7511120, 37.0},
+       {122, "Albania", "Bilisht", 40.6275000, 20.9899998, 946.0},
+       {123, "Albania", "Selenice", 40.5305556, 19.6358337, 113.0},
+       {124, "Albania", "Roskovec", 40.7375000, 19.7022228, 24.0},
+       {125, "Albania", "Puke", 42.0444444, 19.8997231, 795.0},
+       {126, "Albania", "Rrogozhine", 41.0763889, 19.6652775, 48.0},
+       {127, "Albania", "Vore", 41.3908333, 19.6550007, 74.0},
+       {128, "Albania", "Memaliaj", 40.3516667, 19.9802780, 141.0},
+       {129, "Albania", "Ura Vajgurore", 40.7688889, 19.8777771, 30.0},
+       {130, "Albania", "Himare", 40.1016667, 19.7447224, 60.0},
+       {131, "Albania", "Koplik", 42.2136111, 19.4363880, 71.0},
+       {132, "Albania", "Perrenjas-Fshat", 41.0666667, 20.5352783, 562.0},
+       {133, "Albania", "Delvine", 39.9511111, 20.0977783, 255.0},
+       {134, "Albania", "Maliq", 40.7058333, 20.6997223, 824.0},
+       {135, "Albania", "Libohove", 40.0311111, 20.2630558, 536.0},
+       {136, "Albania", "Shengjin", 41.8136111, 19.5938892, -9999.0},
+       {137, "Albania", "Leskovik", 40.1513889, 20.5972214, 908.0},
+       {138, "Albania", "Orikum", 40.3252778, 19.4713898, 8.0},
+       {139, "Albania", "Kelcyre", 40.3130556, 20.1894436, 171.0},
+       {140, "Albania", "Fushe-Arrez", 42.0622222, 20.0166664, 590.0},
+       {141, "Albania", "Rubik", 41.7744444, 19.7861118, 262.0},
+       {142, "Albania", "Milot", 41.6838889, 19.7155552, 49.0},
+       {143, "Albania", "Kurbnesh", 41.7797222, 20.0836105, 833.0},
+       {144, "Albania", "Konispol", 39.6588889, 20.1813889, 478.0},
+       {145, "Albania", "Krrabe", 41.2155556, 19.9713898, 542.0},
+       {146, "Albania", "Fierze", 42.2647222, 20.0269451, 474.0},
+       {147, "Albania", "Klos", 41.5069444, 20.0866661, 275.0},
+       {148, "Albania", "Kutreq", 41.3966667, 19.9616661, 524.0},
+       {149, "Albania", "Collak", 41.3152778, 19.8661118, 217.0},
+       {150, "Albania", "Ballaj", 41.3222222, 19.8802776, 276.0},
+       {151, "Albania", "Kubes", 41.4166667, 19.8511105, 573.0},
+       {152, "Albania", "Kurte", 41.4930556, 19.9972229, 1328.0},
+       {153, "Albania", "Melcize", 41.3952778, 19.8222218, 130.0},
+       {154, "Albania", "Livadhet", 41.4080556, 19.9047222, 395.0},
+       {155, "Albania", "Gurra e Vogel", 41.2863889, 19.8883324, 240.0},
+       {156, "Albania", "Celiku", 41.2761111, 19.8522224, 157.0},
+       {157, "Albania", "Kamere", 41.4719444, 19.9708328, 1286.0},
+       {158, "Albania", "Mal Pjec", 41.4786111, 19.9547215, 1155.0},
+       {159, "Albania", "Dallashi", 41.2830556, 19.8763885, 241.0},
+       {160, "Albania", "Shejleret", 41.3072222, 19.8858337, 253.0},
+       {161, "Albania", "Kokli", 41.3091667, 19.9286118, 665.0},
+       {162, "Albania", "Shugyrk", 41.4400000, 19.9302769, 429.0},
+       {163, "Albania", "Metaj", 41.4933333, 19.9052773, 695.0},
+       {164, "Albania", "Marice", 41.4216667, 19.9591675, 585.0},
+       {165, "Albania", "Panec", 41.2847222, 20.0063896, 516.0},
+       {166, "Albania", "Balajt e Poshtem", 41.4205556, 20.1397228, 1080.0},
+       {167, "Albania", "Blishte", 41.4430556, 20.1466675, 613.0},
+       {168, "Albania", "Shengjun", 41.4891667, 20.1375008, 577.0},
+       {169, "Albania", "Rucaj", 41.4661111, 20.1555557, 815.0},
+       {170, "Albania", "Kotaj", 41.4333333, 20.2008324, 1102.0},
+       {171, "Albania", "Peshk", 41.4055556, 20.1980553, 829.0},
+       {172, "Albania", "Bize", 41.3408333, 20.1980553, 1314.0},
+       {173, "Albania", "Berberaj", 41.3144444, 20.2027779, 1087.0},
+       {174, "Albania", "Panjet", 41.3208333, 20.1561108, 1323.0},
+       {175, "Albania", "Ruc", 41.3219444, 20.1105556, 912.0},
+       {176, "Albania", "Marice", 41.4380556, 20.0222225, 1096.0},
+       {177, "Albania", "Xhyre", 41.2869444, 20.0283337, 862.0},
+       {178, "Albania", "Vakumona i Siperme", 41.2816667, 20.0697231, 1060.0},
+       {179, "Albania", "Varros", 41.3025000, 20.0933342, 973.0},
+       {180, "Albania", "Tejlumaj", 41.4783333, 20.0258331, 686.0},
+       {181, "Albania", "Bic", 41.2825000, 20.1458340, 1011.0},
+       {182, "Albania", "Gjorkaj", 41.2780556, 20.1705551, 784.0},
+       {183, "Albania", "Rinas", 41.2861111, 20.1661110, 760.0},
+       {184, "Albania", "Ballgjin", 41.3086111, 20.1933327, 967.0},
+       {185, "Algeria", "Algiers", 36.7630556, 3.0505557, 1.0},
+       {186, "Algeria", "Oran", 35.6911111, -0.6416667, 101.0},
+       {187, "Algeria", "Constantine", 36.3650000, 6.6147223, 501.0},
+       {188, "Algeria", "Batna", 35.5559710, 6.1741447, 1035.0},
+       {189, "Algeria", "Bab Ezzouar", 36.7166667, 3.1833334, 32.0},
+       {190, "Algeria", "Annaba", 36.9000000, 7.7666669, 1.0},
+       {191, "Algeria", "Sidi Bel Abbes", 35.1938889, -0.6413889, 476.0},
+       {192, "Algeria", "Ech Chettia", 36.1956637, 1.2584496, 168.0},
+       {193, "Algeria", "Bejaia", 36.7500000, 5.0833335, 1.0},
+       {194, "Algeria", "Skikda", 36.8791667, 6.9066668, 94.0},
+       {195, "Algeria", "El Achir", 36.0666667, 4.6305556, 1003.0},
+       {196, "Algeria", "Medea", 36.2675000, 2.7500000, 1005.0},
+       {197, "Algeria", "Bechar", 31.6166667, -2.2166667, 785.0},
+       {198, "Algeria", "Tlemcen", 34.8783333, -1.3150001, 843.0},
+       {199, "Algeria", "Mostaganem", 35.9333333, 0.0902778, 85.0},
+       {200, "Algeria", "El Eulma", 36.1500000, 5.6833334, 941.0},
+       {201, "Algeria", "Saida", 34.8333333, 0.1500000, 869.0},
+       {202, "Algeria", "Guelma", 36.4661111, 7.4338889, 257.0},
+       {203, "Algeria", "Bordj el Kiffan", 36.7475000, 3.1930556, 33.0},
+       {204, "Algeria", "Ain Oussera", 35.4513889, 2.9058332, 694.0},
+       {205, "Algeria", "Laghouat", 33.8000000, 2.8833332, 776.0},
+       {206, "Algeria", "Ain Beida", 35.7963889, 7.3927779, 1021.0},
+       {207, "Algeria", "Baraki", 36.6691667, 3.0952778, 30.0},
+       {208, "Algeria", "Oum el Bouaghi", 35.8775000, 7.1136112, 955.0},
+       {209, "Algeria", "Messaad", 34.1666667, 3.5000000, 768.0},
+       {210, "Algeria", "Barika", 35.3897222, 5.3766665, 451.0},
+       {211, "Algeria", "Beni Mered", 36.5230556, 2.8625000, 149.0},
+       {212, "Algeria", "Aflou", 34.1088889, 2.1019444, 1372.0},
+       {213, "Algeria", "El Khroub", 36.2633333, 6.6936111, 597.0},
+       {214, "Algeria", "Rouissat", 31.9272222, 5.3497224, 151.0},
+       {215, "Algeria", "Berrouaghia", 36.1366667, 2.9130557, 913.0},
+       {216, "Algeria", "Ksar el Boukhari", 35.8855556, 2.7508333, 728.0},
+       {217, "Algeria", "Khemis Miliana", 36.2622222, 2.2180555, 365.0},
+       {218, "Algeria", "Azzaba", 36.7394444, 7.1052780, 105.0},
+       {219, "Algeria", "Tamanrasset", 22.7850000, 5.5227780, 1319.0},
+       {220, "Algeria", "Ain Touta", 35.3766667, 5.8961110, 894.0},
+       {221, "Algeria", "Cheria", 35.2730556, 7.7519445, 1093.0},
+       {222, "Algeria", "Birkhadem", 36.7127778, 3.0616667, 134.0},
+       {223, "Algeria", "Chelghoum el Aid", 36.1594444, 6.1650000, 773.0},
+       {224, "Algeria", "Sidi Aissa", 35.8913889, 3.7711110, 672.0},
+       {225, "Algeria", "Larba", 36.5666667, 3.1500001, 109.0},
+       {226, "Algeria", "Mila", 36.4502778, 6.2644444, 488.0},
+       {227, "Algeria", "Bir el Ater", 34.7333333, 8.0500002, 844.0},
+       {228, "Algeria", "Sougueur", 35.1913889, 1.4983333, 1101.0},
+       {229, "Algeria", "Ain Fakroun", 35.9763889, 6.8755555, 933.0},
+       {230, "Algeria", "Tolga", 34.7166667, 5.3833332, 249.0},
+       {231, "Algeria", "Es Senia", 35.6511111, -0.6341667, 91.0},
+       {232, "Algeria", "Bir el Djir", 35.7200000, -0.5450000, 178.0},
+       {233, "Algeria", "Akbou", 36.4611111, 4.5333333, 278.0},
+       {234, "Algeria", "Besbes", 36.7022222, 7.8472223, 10.0},
+       {235, "Algeria", "Sidi Khaled", 34.3833333, 5.0000000, 251.0},
+       {236, "Algeria", "Ain Sefra", 32.7500000, -0.5833333, 1082.0},
+       {237, "Algeria", "Frenda", 35.0619444, 1.0422221, 1083.0},
+       {238, "Algeria", "Bougara", 36.5405556, 3.0852778, 142.0},
+       {239, "Algeria", "Hamma Bouziane", 36.4130556, 6.5974998, 410.0},
+       {240, "Algeria", "Reguiba", 33.5666667, 6.7166667, 32.0},
+       {241, "Algeria", "Meftah", 36.6194444, 3.2252779, 120.0},
+       {242, "Algeria", "Oued Rhiou", 35.9633333, 0.9136111, 99.0},
+       {243, "Algeria", "Boufarik", 36.5705556, 2.9108334, 65.0},
+       {244, "Algeria", "Sig", 35.5277778, -0.1952778, 32.0},
+       {245, "Algeria", "Ksar Chellala", 35.2122222, 2.3188889, 839.0},
+       {246, "Algeria", "Sidi Moussa", 36.6044444, 3.0902779, 57.0},
+       {247, "Algeria", "Ras el Oued", 35.9461111, 5.0327778, 1070.0},
+       {248, "Algeria", "Lakhdaria", 36.5622222, 3.5944445, 203.0},
+       {249, "Algeria", "Drean", 36.6838889, 7.7463889, 35.0},
+       {250, "Algeria", "Reghaia", 36.7422222, 3.3413889, 16.0},
+       {251, "Algeria", "Boghni", 36.5422222, 3.9530556, 344.0},
+       {252, "Algeria", "Dar Chioukh", 34.9000000, 3.4833333, 1114.0},
+       {253, "Algeria", "Sedrata", 36.1288889, 7.5280557, 821.0},
+       {254, "Algeria", "Djamaa", 33.5333333, 6.0000000, 121.0},
+       {255, "Algeria", "Mansoura", 34.8650000, -1.3466667, 835.0},
+       {256, "Algeria", "Telerghma", 36.1152778, 6.3641667, 753.0},
+       {257, "Algeria", "Remchi", 35.0611111, -1.4261111, 217.0},
+       {258, "Algeria", "Birine", 35.6350000, 3.2249999, 766.0},
+       {259, "Algeria", "Sour el Ghozlane", 36.1502778, 3.6891668, 899.0},
+       {260, "Algeria", "Metlili Chaamba", 32.2666667, 3.6333332, 489.0},
+       {261, "Algeria", "Khemis el Khechna", 36.6486111, 3.3305557, 60.0},
+       {262, "Algeria", "Timimoun", 29.2500000, 0.2500000, 323.0},
+       {263, "Algeria", "I-n-Salah", 27.2166667, 2.4666667, 282.0},
+       {264, "Algeria", "Touggourt", 33.1000000, 6.0666666, 167.0},
+       {265, "Algeria", "Merouana", 35.6286111, 5.9116669, 996.0},
+       {266, "Algeria", "Kerkera", 36.9291667, 6.5855556, 12.0},
+       {267, "Algeria", "El Hadjar", 36.8047222, 7.7383332, 3.0},
+       {268, "Algeria", "Beni Saf", 35.3036111, -1.3808333, 1.0},
+       {269, "Algeria", "Boudouaou", 36.7305556, 3.4102778, 1.0},
+       {270, "Algeria", "Berriane", 32.8333333, 3.7666667, 515.0},
+       {271, "Algeria", "Oued Fodda", 36.1841667, 1.5327778, 186.0},
+       {272, "Algeria", "Bou Arfa", 36.4666667, 2.8166666, 239.0},
+       {273, "Algeria", "El Attaf", 36.2247222, 1.6727778, 141.0},
+       {274, "Algeria", "El Affroun", 36.4669444, 2.6252778, 89.0},
+       {275, "Algeria", "`Ain el Hadjel", 35.6758333, 3.8822222, 533.0},
+       {276, "Algeria", "Hennaya", 34.9513889, -1.3680556, 440.0},
+       {277, "Algeria", "Tazoult-Lambese", 35.4863889, 6.2552776, 1184.0},
+       {278, "Algeria", "Draa el Mizan", 36.5350000, 3.8336110, 444.0},
+       {279, "Algeria", "Timizart", 36.8000000, 4.2666669, 372.0},
+       {280, "Algeria", "Sebdou", 34.6425000, -1.3330556, 886.0},
+       {281, "Algeria", "Tebesbest", 33.1166667, 6.0833335, 170.0},
+       {282, "Algeria", "Souma", 36.5183333, 2.9052777, 135.0},
+       {283, "United States", "New York City", 40.7142691, -74.0059738, 2.0},
+       {284, "United States", "Los Angeles", 34.0522342, -118.2436829, 115.0},
+       {285, "United States", "Chicago", 41.8500330, -87.6500549, 181.0},
+       {286, "United States", "Houston", 29.7632836, -95.3632736, 15.0},
+       {287, "United States", "Philadelphia", 39.9523350, -75.1637878, 8.0},
+       {288, "United States", "Phoenix", 33.4483771, -112.0740356, 0.0},
+       {289, "United States", "San Antonio", 29.4241219, -98.4936295, 196.0},
+       {290, "United States", "San Diego", 32.7153292, -117.1572571, 26.0},
+       {291, "United States", "Dallas", 32.7830556, -96.8066635, 137.0},
+       {292, "United States", "Detroit", 42.3314270, -83.0457535, 181.0},
+       {293, "United States", "San Jose", 37.3393857, -121.8949585, 24.0},
+       {294, "United States", "Jacksonville", 30.3321838, -81.6556473, 7.0},
+       {295, "United States", "Indianapolis", 39.7683765, -86.1580429, 222.0},
+       {296, "United States", "Columbus", 39.9611755, -82.9987946, 237.0},
+       {297, "United States", "San Francisco", 37.7749295, -122.4194183, 60.0},
+       {298, "United States", "Austin", 30.2671530, -97.7430573, 163.0},
+       {299, "United States", "Memphis", 35.1495343, -90.0489807, 75.0},
+       {300, "United States", "New South Memphis", 35.0867579, -90.0567551, 74.0},
+       {301, "United States", "Fort Worth", 32.7254090, -97.3208466, 199.0},
+       {302, "United States", "Baltimore", 39.2903848, -76.6121902, 2.0},
+       {303, "United States", "Charlotte", 35.2270869, -80.8431244, 229.0},
+       {304, "United States", "Boston", 42.3584308, -71.0597763, 11.0},
+       {305, "United States", "Milwaukee", 43.0389025, -87.9064713, 195.0},
+       {306, "United States", "South Boston", 42.3334312, -71.0494919, 10.0},
+       {307, "United States", "Seattle", 47.6062095, -122.3320694, 60.0},
+       {308, "United States", "El Paso", 31.7587198, -106.4869308, 1147.0},
+       {309, "United States", "Denver", 39.7391536, -104.9847031, 1598.0},
+       {310, "United States", "Washington", 38.8951118, -77.0363693, 11.0},
+       {311, "United States", "Portland", 45.5234515, -122.6762085, 61.0},
+       {312, "United States", "Oklahoma City", 35.4675602, -97.5164261, 364.0},
+       {313, "United States", "Nashville", 36.1658899, -86.7844467, 151.0},
+       {314, "United States", "Tucson", 32.2217429, -110.9264755, 751.0},
+       {315, "United States", "Albuquerque", 35.0844909, -106.6511383, 1510.0},
+       {316, "United States", "New Orleans", 29.9546482, -90.0750732, 0.0},
+       {317, "United States", "Long Beach", 33.7669623, -118.1892319, 1.0},
+       {318, "United States", "Las Vegas", 36.1749705, -115.1372223, 609.0},
+       {319, "United States", "Sacramento", 38.5815719, -121.4944000, 5.0},
+       {320, "United States", "Fresno", 36.7477272, -119.7723694, 91.0},
+       {321, "United States", "Cleveland", 41.4994954, -81.6954117, 185.0},
+       {322, "United States", "North Kansas City", 39.1300040, -94.5621796, 223.0},
+       {323, "United States", "Kansas City", 39.0997266, -94.5785675, 271.0},
+       {324, "United States", "Virginia Beach", 36.8529263, -75.9779816, 3.0},
+       {325, "United States", "Atlanta", 33.7489954, -84.3879852, 305.0},
+       {326, "United States", "Oakland", 37.8043722, -122.2708054, 0.0},
+       {327, "United States", "Mesa", 33.4222685, -111.8226395, 386.0},
+       {328, "United States", "Tulsa", 36.1539816, -95.9927750, 213.0},
+       {329, "United States", "Omaha", 41.2586096, -95.9377899, 0.0},
+       {330, "United States", "Miami", 25.7742658, -80.1936569, 2.0},
+       {331, "United States", "Honolulu", 21.3069444, -157.8583374, 0.0},
+       {332, "United States", "Minneapolis", 44.9799654, -93.2638397, 259.0},
+       {333, "United States", "Colorado Springs", 38.8338816, -104.8213654, 1829.0},
+       {334, "United States", "Wichita", 37.6922361, -97.3375473, 402.0},
+       {335, "United States", "Santa Ana", 33.7455731, -117.8678360, 30.0},
+       {336, "United States", "West Raleigh", 35.7868182, -78.6638947, 122.0},
+       {337, "United States", "Arlington", 32.7356870, -97.1080627, 184.0},
+       {338, "United States", "Anaheim", 33.8352932, -117.9145050, 40.0},
+       {339, "United States", "Tampa", 27.9475216, -82.4584274, 1.0},
+       {340, "United States", "Saint Louis", 38.6272733, -90.1978912, 135.0},
+       {341, "United States", "Pittsburgh", 40.4406248, -79.9958878, 235.0},
+       {342, "United States", "Toledo", 41.6639383, -83.5552139, 191.0},
+       {343, "United States", "Cincinnati", 39.1620036, -84.4568863, 203.0},
+       {344, "United States", "Riverside", 33.9533487, -117.3961563, 262.0},
+       {345, "United States", "Bakersfield", 35.3732921, -119.0187149, 122.0},
+       {346, "United States", "Stockton", 37.9577016, -121.2907791, 4.0},
+       {347, "United States", "Newark", 40.7356570, -74.1723633, 16.0},
+       {348, "United States", "Buffalo", 42.8864468, -78.8783722, 183.0},
+       {349, "United States", "Corpus Christi", 27.8005828, -97.3963776, 6.0},
+       {350, "United States", "Aurora", 39.7294319, -104.8319168, 1647.0},
+       {351, "United States", "Raleigh", 35.7720960, -78.6386108, 91.0},
+       {352, "United States", "Saint Paul", 44.9444101, -93.0932770, 235.0},
+       {353, "United States", "Lexington-Fayette", 38.0497996, -84.4585495, 312.0},
+       {354, "United States", "Anchorage", 61.2180556, -149.9002838, 0.0},
+       {355, "United States", "Plano", 33.0198431, -96.6988831, 200.0},
+       {356, "United States", "Saint Petersburg", 27.7708606, -82.6792679, 14.0},
+       {357, "United States", "Louisville", 38.2542376, -85.7594070, 128.0},
+       {358, "United States", "Lincoln", 40.8000011, -96.6669617, 382.0},
+       {359, "United States", "Glendale", 33.5386523, -112.1859894, 336.0},
+       {360, "United States", "Henderson", 36.0396988, -114.9819336, 580.0},
+       {361, "United States", "Jersey City", 40.7281575, -74.0776443, 14.0},
+       {362, "United States", "Norfolk", 36.8468146, -76.2852173, 3.0},
+       {363, "United States", "Chandler", 33.3061605, -111.8412476, 380.0},
+       {364, "United States", "Greensboro", 36.0726355, -79.7919769, 244.0},
+       {365, "United States", "Birmingham", 33.5206608, -86.8024902, 173.0},
+       {366, "United States", "Fort Wayne", 41.1306041, -85.1288605, 243.0},
+       {367, "United States", "Lexington", 37.9886892, -84.4777145, 298.0},
+       {368, "United States", "Hialeah", 25.8575963, -80.2781067, 2.0},
+       {369, "United States", "Madison", 43.0730517, -89.4012299, 270.0},
+       {370, "United States", "Baton Rouge", 30.4507462, -91.1545486, 0.0},
+       {371, "United States", "Garland", 32.9126240, -96.6388855, 165.0},
+       {372, "United States", "Modesto", 37.6390972, -120.9968796, 12.0},
+       {373, "United States", "Paradise", 36.0971945, -115.1466675, 626.0},
+       {374, "United States", "Chula Vista", 32.6400541, -117.0841980, 23.0},
+       {375, "United States", "Lubbock", 33.5778631, -101.8551636, 976.0},
+       {376, "United States", "Rochester", 43.1547845, -77.6155548, 155.0},
+       {377, "United States", "Laredo", 27.5064070, -99.5075455, 115.0},
+       {378, "United States", "Akron", 41.0814447, -81.5190048, 290.0},
+       {379, "United States", "Orlando", 28.5383355, -81.3792343, 34.0},
+       {380, "United States", "Durham", 35.9940329, -78.8986206, 122.0},
+       {381, "United States", "North Glendale", 34.1605626, -118.2645187, 174.0},
+       {382, "United States", "Scottsdale", 33.5092103, -111.8990326, 386.0},
+       {383, "Andorra", "Andorra la Vella", 42.5051514, 1.5150619, 1011.0},
+       {384, "Andorra", "les Escaldes", 42.5072870, 1.5341377, 1350.0},
+       {385, "Andorra", "Encamp", 42.5333333, 1.5833333, 1571.0},
+       {386, "Andorra", "Sant Julia de Loria", 42.4637237, 1.4912868, 1045.0},
+       {387, "Andorra", "la Massana", 42.5449867, 1.5148258, 1257.0},
+       {388, "Andorra", "Canillo", 42.5666667, 1.6000000, 1655.0},
+       {389, "Andorra", "Pas de la Casa", 42.5427734, 1.7336082, 2230.0},
+       {390, "Angola", "Luanda", -8.8383333, 13.2344446, 6.0},
+       {391, "Angola", "Huambo", -12.7761111, 15.7391663, 1723.0},
+       {392, "Angola", "Lobito", -12.3480556, 13.5455561, 14.0},
+       {393, "Angola", "Benguela", -12.5783333, 13.4072218, 30.0},
+       {394, "Angola", "Kuito", -12.3833333, 16.9333324, 1631.0},
+       {395, "Angola", "Lubango", -14.9166667, 13.5000000, 1719.0},
+       {396, "Angola", "Malanje", -9.5447222, 16.3452778, 1156.0},
+       {397, "Angola", "Namibe", -15.1961111, 12.1522226, 9.0},
+       {398, "Angola", "Soyo", -6.1333333, 12.3666668, 6.0},
+       {399, "Angola", "Cabinda", -5.5500000, 12.1999998, 1.0},
+       {400, "Angola", "Uige", -7.6166667, 15.0500002, 859.0},
+       {401, "Angola", "Saurimo", -9.6500000, 20.3999996, 1041.0},
+       {402, "Angola", "Sumbe", -11.2000000, 13.8333330, -9999.0},
+       {403, "Angola", "Caluquembe", -13.7833333, 14.6833334, 1769.0},
+       {404, "Angola", "Caxito", -8.5800000, 13.6641665, 84.0},
+       {405, "Angola", "Longonjo", -12.9066667, 15.2533331, 1402.0},
+       {406, "Angola", "Caala", -12.8525000, 15.5605555, 1747.0},
+       {407, "Angola", "Luena", -11.7833333, 19.9166660, 1330.0},
+       {408, "Angola", "Lucapa", -8.4166667, 20.7500000, 929.0},
+       {409, "Angola", "Camacupa", -12.0166667, 17.4833336, 1475.0},
+       {410, "Angola", "Catabola", -12.1500000, 17.2833328, 1524.0},
+       {411, "Angola", "Luau", -10.7000000, 22.2333336, 1109.0},
+       {412, "Angola", "Catumbela", -12.4313889, 13.5472221, 31.0},
+       {413, "Angola", "Camabatela", -8.1833333, 15.3666668, 1195.0},
+       {414, "Angola", "Waku Kungo", -11.3500000, 15.1166668, 1476.0},
+       {415, "Angola", "Caconda", -13.7333333, 15.0666666, 1724.0},
+       {416, "Angola", "Ondjiva", -17.0666667, 15.7333336, 1099.0},
+       {417, "Angola", "Quibala", -10.7333333, 14.9833336, 1375.0},
+       {418, "Angola", "Chissamba", -12.1666667, 17.3333340, 1373.0},
+       {419, "Angola", "Leua", -11.6500000, 20.4500008, 1214.0},
+       {420, "Angola", "Lumeje", -11.5500000, 20.7833328, 1121.0},
+       {421, "Angola", "Cazage", -11.0666667, 20.7000008, 1143.0},
+       {422, "Argentina", "Buenos Aires", -34.5761256, -58.4088135, 13.0},
+       {423, "Argentina", "Cordoba", -31.4000000, -64.1833344, 384.0},
+       {424, "Argentina", "Rosario", -32.9511111, -60.6663895, 11.0},
+       {425, "Argentina", "Mendoza", -32.8833333, -68.8166656, 824.0},
+       {426, "Argentina", "San Miguel de Tucuman", -26.8166667, -65.2166672, 437.0},
+       {427, "Argentina", "La Plata", -34.9313889, -57.9488907, 29.0},
+       {428, "Argentina", "Mar del Plata", -38.0000000, -57.5499992, 39.0},
+       {429, "Argentina", "Quilmes", -34.7202778, -58.2694435, 19.0},
+       {430, "Argentina", "Salta", -24.7833333, -65.4166641, 1171.0},
+       {431, "Argentina", "Santa Fe", -31.6333333, -60.7000008, 20.0},
+       {432, "Argentina", "San Juan", -31.5375000, -68.5363922, 650.0},
+       {433, "Argentina", "Resistencia", -27.4500000, -58.9833336, 48.0},
+       {434, "Argentina", "Santiago del Estero", -27.7833333, -64.2666702, 180.0},
+       {435, "Argentina", "Corrientes", -27.4666667, -58.8333321, 52.0},
+       {436, "Argentina", "Posadas", -27.3833333, -55.8833351, 54.0},
+       {437, "Argentina", "San Salvador de Jujuy", -24.1833333, -65.3000031, 1206.0},
+       {438, "Argentina", "Bahia Blanca", -38.7166667, -62.2833328, 21.0},
+       {439, "Argentina", "Parana", -31.7333333, -60.5333328, 68.0},
+       {440, "Argentina", "Neuquen", -38.9500000, -68.0666656, 255.0},
+       {441, "Argentina", "Formosa", -26.1833333, -58.1833344, 55.0},
+       {442, "Argentina", "San Fernando del Valle de Catamarca", -28.4666667, -65.7833328, 520.0},
+       {443, "Argentina", "San Luis", -33.3000000, -66.3499985, 709.0},
+       {444, "Argentina", "La Rioja", -29.4333333, -66.8499985, 465.0},
+       {445, "Argentina", "Rio Cuarto", -33.1333333, -64.3499985, 422.0},
+       {446, "Argentina", "Concordia", -31.4000000, -58.0333328, 22.0},
+       {447, "Argentina", "Comodoro Rivadavia", -45.8666667, -67.5000000, 18.0},
+       {448, "Argentina", "San Nicolas de los Arroyos", -33.3302778, -60.2269440, 6.0},
+       {449, "Argentina", "Santa Rosa", -36.6166667, -64.2833328, 176.0},
+       {450, "Argentina", "San Rafael", -34.6000000, -68.3333359, 691.0},
+       {451, "Argentina", "Tandil", -37.3166667, -59.1500015, 189.0},
+       {452, "Argentina", "San Carlos de Bariloche", -41.1500000, -71.3000031, 894.0},
+       {453, "Argentina", "Trelew", -43.2489539, -65.3050537, 10.0},
+       {454, "Argentina", "Villa Maria", -32.4166667, -63.2500000, 187.0},
+       {455, "Argentina", "Reconquista", -29.1500000, -59.6500015, 32.0},
+       {456, "Argentina", "Zarate", -34.0922222, -59.0349998, 27.0},
+       {457, "Argentina", "Rafaela", -31.2666667, -61.4833336, 91.0},
+       {458, "Argentina", "Pergamino", -33.8925000, -60.5724983, 57.0},
+       {459, "Argentina", "Olavarria", -36.9000000, -60.2833328, 163.0},
+       {460, "Argentina", "Rio Gallegos", -51.6333333, -69.2166672, 13.0},
+       {461, "Argentina", "Junin", -34.5850000, -60.9588890, 77.0},
+       {462, "Argentina", "San Martin", -33.0666667, -68.4666672, 656.0},
+       {463, "Argentina", "Presidencia Roque Saenz Pena", -26.7833333, -60.4500008, 87.0},
+       {464, "Argentina", "Lujan", -34.5702778, -59.1049995, 22.0},
+       {465, "Argentina", "Campana", -34.1769444, -58.9208336, 3.0},
+       {466, "Argentina", "Necochea", -38.5500000, -58.7500000, 31.0},
+       {467, "Argentina", "Gualeguaychu", -33.0102778, -58.5141678, 15.0},
+       {468, "Argentina", "San Ramon de la Nueva Oran", -23.1322304, -64.3259811, 357.0},
+       {469, "Argentina", "General Roca", -39.0333333, -67.5833359, 232.0},
+       {470, "Argentina", "Venado Tuerto", -33.7497222, -61.9669456, 109.0},
+       {471, "Argentina", "Goya", -29.1333333, -59.2666664, 23.0},
+       {472, "Argentina", "Villa Carlos Paz", -31.4000000, -64.5166702, 686.0},
+       {473, "Argentina", "Concepcion del Uruguay", -32.4833333, -58.2283325, 3.0},
+       {474, "Argentina", "Puerto Madryn", -42.7666667, -65.0500031, 18.0},
+       {475, "Argentina", "Tartagal", -22.5333333, -63.8166656, 468.0},
+       {476, "Argentina", "San Francisco", -31.4333333, -62.0833321, 123.0},
+       {477, "Argentina", "San Pedro", -24.2333333, -64.8666687, 563.0},
+       {478, "Argentina", "Ushuaia", -54.8000000, -68.3000031, -9999.0},
+       {479, "Argentina", "Punta Alta", -38.8833333, -62.0833321, 3.0},
+       {480, "Argentina", "General Pico", -35.6666667, -63.7333336, 103.0},
+       {481, "Argentina", "Colegiales", -34.5833333, -58.4500008, 21.0},
+       {482, "Argentina", "Obera", -27.4833333, -55.1333351, 302.0},
+       {483, "Argentina", "Chivilcoy", -34.9083333, -60.0305557, 34.0},
+       {484, "Argentina", "Azul", -36.7833333, -59.8499985, 137.0},
+       {485, "Argentina", "Rio Tercero", -32.1833333, -64.0999985, 365.0},
+       {486, "Argentina", "Mercedes", -34.6544444, -59.4344444, 40.0},
+       {487, "Argentina", "Libertador General San Martin", -23.8000000, -64.8000031, 473.0},
+       {488, "Argentina", "Viedma", -40.8000000, -63.0000000, 12.0},
+       {489, "Argentina", "San Lorenzo", -28.1333333, -58.7666664, 70.0},
+       {490, "Argentina", "Cutral-Co", -38.9333333, -69.2333298, 612.0},
+       {491, "Argentina", "Tres Arroyos", -38.3833333, -60.2833328, 100.0},
+       {492, "Argentina", "Villa Constitucion", -33.2333333, -60.3333321, 50.0},
+       {493, "Argentina", "Alta Gracia", -31.6666667, -64.4333344, 516.0},
+       {494, "Argentina", "Canada de Gomez", -32.8169444, -61.4008331, 70.0},
+       {495, "Argentina", "Bell Ville", -32.6166667, -62.7000008, 123.0},
+       {496, "Argentina", "Nueve de Julio", -35.4541667, -60.8913879, 83.0},
+       {497, "Argentina", "Chacabuco", -34.6416667, -60.4738884, 66.0},
+       {498, "Argentina", "Villa Santa Rita", -34.6147735, -58.4797096, 21.0},
+       {499, "Argentina", "Gualeguay", -33.1444444, -59.3291664, 15.0},
+       {500, "Argentina", "Puerto Iguazu", -25.5991157, -54.5735550, 183.0},
+       {501, "Argentina", "Mercedes", -29.2000000, -58.0833321, 85.0},
+       {502, "Argentina", "Coronel Suarez", -37.4666667, -61.9166679, 228.0},
+       {503, "Argentina", "Rawson", -43.3000000, -65.0999985, 4.0},
+       {504, "Argentina", "Dolores", -36.3333333, -57.6666679, 9.0},
+       {505, "Argentina", "Victoria", -32.6184122, -60.1547813, 36.0},
+       {506, "Argentina", "Lincoln", -34.8650000, -61.5319443, 78.0},
+       {507, "Argentina", "Veinticinco de Mayo", -35.4280556, -60.1741676, 59.0},
+       {508, "Argentina", "Clorinda", -25.2833333, -57.7166672, 63.0},
+       {509, "Argentina", "Cafayate", -26.0833333, -65.9666672, 1590.0},
+       {510, "Argentina", "El Calafate", -50.3407497, -72.2768173, 200.0},
+       {511, "Argentina", "Larroque", -33.0333333, -59.0166664, 58.0},
+       {512, "Argentina", "Campo Quijano", -24.9166667, -65.6500015, 1665.0},
+       {513, "Argentina", "San Antonio de los Cobres", -24.1833333, -66.3499985, 3932.0},
+       {514, "Argentina", "Santa Rosa de Tastil", -24.4333333, -65.9499969, 3346.0},
+       {515, "Argentina", "Purmamarca", -23.7333333, -65.4833298, 2222.0},
+       {516, "Argentina", "Villa Catedral", -41.1673478, -71.4387741, 1021.0},
+       {517, "Armenia", "Yerevan", 40.1811111, 44.5136108, 1002.0},
+       {518, "Armenia", "Gyumri", 40.7894444, 43.8474998, 1545.0},
+       {519, "Armenia", "Vanadzor", 40.8127778, 44.4883347, 1320.0},
+       {520, "Armenia", "Ejmiatsin", 40.1727778, 44.2924995, 879.0},
+       {521, "Armenia", "Hrazdan", 40.5016667, 44.7547226, 1735.0},
+       {522, "Armenia", "Abovyan", 40.2691667, 44.6244431, 1408.0},
+       {523, "Armenia", "Kapan", 39.2011111, 46.4150009, 822.0},
+       {524, "Armenia", "Ararat", 39.8302778, 44.7024994, 813.0},
+       {525, "Armenia", "Armavir", 40.1522222, 44.0308342, 878.0},
+       {526, "Armenia", "Gavarr", 40.3588889, 45.1266670, 1982.0},
+       {527, "Armenia", "Artashat", 39.9538889, 44.5505562, 837.0},
+       {528, "Armenia", "Goris", 39.5077778, 46.3386116, 1363.0},
+       {529, "Armenia", "Masis", 40.0672222, 44.4361115, 843.0},
+       {530, "Armenia", "Ashtarak", 40.3016667, 44.3591652, 1190.0},
+       {531, "Armenia", "Sevan", 40.5550000, 44.9536095, 1905.0},
+       {532, "Armenia", "Spitak", 40.8372222, 44.2675018, 1543.0},
+       {533, "Armenia", "Ijevan", 40.8755556, 45.1491661, 755.0},
+       {534, "Armenia", "Dilijan", 40.7408333, 44.8630562, 1345.0},
+       {535, "Armenia", "Alaverdi", 41.1305556, 44.6519432, 1296.0},
+       {536, "Armenia", "Vedi", 39.9105556, 44.7277794, 919.0},
+       {537, "Armenia", "Vardenis", 40.1805556, 45.7283325, 1944.0},
+       {538, "Armenia", "Martuni", 40.1447222, 45.3063889, 1915.0},
+       {539, "Armenia", "Yeghvard", 40.3216667, 44.4813881, 1335.0},
+       {540, "Armenia", "Metsamor", 40.0713889, 44.2891655, 842.0},
+       {541, "Armenia", "Berd", 40.8808333, 45.3916664, 978.0},
+       {542, "Armenia", "Vardenik", 40.1350000, 45.4363899, 2031.0},
+       {543, "Armenia", "Akhuryan", 40.7813889, 43.8963890, 1544.0},
+       {544, "Armenia", "Tashir", 41.1244444, 44.2819443, 1522.0},
+       {545, "Armenia", "Byureghavan", 40.3147222, 44.5936127, 1411.0},
+       {546, "Armenia", "Garrni", 40.1194444, 44.7230568, 1410.0},
+       {547, "Armenia", "Sarukhan", 40.2891667, 45.1341667, 1972.0},
+       {548, "Armenia", "Chambarak", 40.5952778, 45.3474998, 1852.0},
+       {549, "Armenia", "Aparan", 40.5961111, 44.3536110, 1899.0},
+       {550, "Armenia", "Noratus", 40.3822222, 45.1783333, 1935.0},
+       {551, "Armenia", "Hoktember", 40.1361111, 44.0138893, 869.0},
+       {552, "Armenia", "Noyemberyan", 41.1725000, 44.9936104, 857.0},
+       {553, "Armenia", "Karanlukh", 40.1044444, 45.2897224, 2167.0},
+       {554, "Armenia", "Mrgashat", 40.1297222, 44.0705566, 856.0},
+       {555, "Armenia", "Maralik", 40.5722222, 43.8669434, 1717.0},
+       {556, "Armenia", "Nor Geghi", 40.3211111, 44.5797234, 1300.0},
+       {557, "Armenia", "Oshakan", 40.2705556, 44.2691650, 1011.0},
+       {558, "Armenia", "Metsavan", 41.2016667, 44.2288895, 1560.0},
+       {559, "Armenia", "Agarak", 39.2038889, 46.5472221, 892.0},
+       {560, "Armenia", "Jermuk", 39.8416667, 45.6722221, 2135.0},
+       {561, "Armenia", "Meghri", 38.9022222, 46.2383347, 684.0},
+       {562, "Armenia", "Odzun", 41.0538889, 44.6113892, 1100.0},
+       {563, "Armenia", "Zovuni", 40.5108333, 44.4288902, 1852.0},
+       {564, "Armenia", "Azatan", 40.7238889, 43.8205566, 1483.0},
+       {565, "Armenia", "Prroshyan", 40.2480556, 44.4150009, 1185.0},
+       {566, "Armenia", "Kasakh", 40.5333333, 44.4166679, 1811.0},
+       {567, "Armenia", "Yeranos", 40.2080556, 45.1861115, 1963.0},
+       {568, "Armenia", "Avshar", 39.8405556, 44.6836128, 840.0},
+       {569, "Armenia", "Lchashen", 40.5202778, 44.9308319, 1893.0},
+       {570, "Armenia", "Malishka", 39.7369444, 45.3875008, 1187.0},
+       {571, "Armenia", "Verin Getashen", 40.1327778, 45.2486115, 1968.0},
+       {572, "Armenia", "Nalbandyan", 40.0677778, 43.9855537, 870.0},
+       {573, "Armenia", "Tsovinar", 40.1608333, 45.4538879, 1916.0},
+       {574, "Armenia", "Verin Artashat", 40.0005556, 44.5849991, 921.0},
+       {575, "Armenia", "Shahumyan", 39.9308333, 44.5783348, 835.0},
+       {576, "Armenia", "Byurakan", 40.3413889, 44.2736130, 1462.0},
+       {577, "Armenia", "Tsovagyugh", 40.6330556, 44.9522209, 1981.0},
+       {578, "Armenia", "Gandzak", 40.3147222, 45.1113892, 1985.0},
+       {579, "Armenia", "Arshaluys", 40.1688889, 44.2141685, 872.0},
+       {580, "Armenia", "Voskevaz", 40.2797222, 44.2949982, 1035.0},
+       {581, "Armenia", "Aygavan", 39.8647222, 44.6702766, 848.0},
+       {582, "Armenia", "Dzoragyugh", 40.1752778, 45.1749992, 2096.0},
+       {583, "Armenia", "Karbi", 40.3338889, 44.3777771, 1298.0},
+       {584, "Armenia", "Astghadzor", 40.1238889, 45.3566666, 2042.0},
+       {585, "Armenia", "Hovtashat", 40.1019444, 44.3427773, 835.0},
+       {586, "Armenia", "Myasnikyan", 40.1775000, 43.9063873, 913.0},
+       {587, "Armenia", "Haghartsin", 40.7780556, 44.9625015, 1075.0},
+       {588, "Armenia", "Gay", 40.0838889, 44.3055573, 839.0},
+       {589, "Armenia", "Margahovit", 40.7380556, 44.6875000, 1833.0},
+       {590, "Armenia", "Vaghashen", 40.1377778, 45.3291664, 1950.0},
+       {591, "Armenia", "Aramus", 40.2511111, 44.6630554, 1443.0},
+       {592, "Armenia", "Artsvaberd", 40.8336111, 45.4711113, 1167.0},
+       {593, "Armenia", "Aygezard", 39.9458333, 44.6088905, 879.0},
+       {594, "Armenia", "Berdavan", 41.2027778, 45.0033340, 671.0},
+       {595, "Armenia", "Bambakashat", 40.1144444, 44.0122223, 870.0},
+       {596, "Armenia", "Arteni", 40.2983333, 43.7541656, 1225.0},
+       {597, "Armenia", "Dalarik", 40.2183333, 43.8602791, 1020.0},
+       {598, "Armenia", "Jrashen", 40.7875000, 44.1972237, 1737.0},
+       {599, "Armenia", "Norashen", 40.0041667, 44.5947227, 935.0},
+       {600, "Armenia", "Bagratashen", 41.2458333, 44.8211098, 479.0},
+       {601, "Armenia", "Janfida", 40.0455556, 44.0208321, 877.0},
+       {602, "Armenia", "Balahovit", 40.2536111, 44.6038895, 1412.0},
+       {603, "Armenia", "Marmarashen", 40.0575000, 44.4711113, 853.0},
+       {604, "Armenia", "Vostan", 39.9588889, 44.5591660, 849.0},
+       {605, "Armenia", "Aghavnatun", 40.2336111, 44.2513885, 939.0},
+       {606, "Armenia", "Aygehovit", 40.9744444, 45.2519455, 815.0},
+       {607, "Armenia", "Shnogh", 41.1477778, 44.8377762, 684.0},
+       {608, "Australia", "Sydney", -33.8678500, 151.2073212, 1.0},
+       {609, "Australia", "Melbourne", -37.8139966, 144.9633179, 58.0},
+       {610, "Australia", "Perth", -31.9333333, 115.8333359, 32.0},
+       {611, "Australia", "Adelaide", -34.9333333, 138.6000061, 65.0},
+       {612, "Australia", "Brisbane", -27.4679357, 153.0280914, 15.0},
+       {613, "Australia", "Gold Coast", -28.0000000, 153.4333344, 1.0},
+       {614, "Australia", "Newcastle", -32.9271484, 151.7764740, 1.0},
+       {615, "Australia", "Canberra", -35.2834625, 149.1280670, 609.0},
+       {616, "Australia", "Wollongong", -34.4333333, 150.8833313, 26.0},
+       {617, "Australia", "Geelong", -38.1471126, 144.3607025, -9999.0},
+       {618, "Australia", "Cairns", -16.9166667, 145.7666626, 1.0},
+       {619, "Australia", "Geelong West", -38.1333333, 144.3500061, -9999.0},
+       {620, "Australia", "Townsville", -19.2500000, 146.8000031, 1.0},
+       {621, "Australia", "Albury", -36.0833333, 146.9166718, 170.0},
+       {622, "Australia", "Nowra", -34.8833333, 150.6000061, 1.0},
+       {623, "Australia", "Darwin", -12.4611337, 130.8418427, -9999.0},
+       {624, "Australia", "Toowoomba", -27.5500000, 151.9666595, 560.0},
+       {625, "Australia", "Ballarat", -37.5666667, 143.8500061, 465.0},
+       {626, "Australia", "Bendigo", -36.7666667, 144.2833405, 234.0},
+       {627, "Australia", "Mackay", -21.1500000, 149.1999969, -9999.0},
+       {628, "Australia", "Mandurah", -32.5500000, 115.6999969, 1.0},
+       {629, "Australia", "Launceston", -41.4500000, 147.1666718, 105.0},
+       {630, "Australia", "Rockhampton", -23.3833333, 150.5000000, 2.0},
+       {631, "Australia", "Coffs Harbour", -30.3000000, 153.1333313, 8.0},
+       {632, "Australia", "South Brisbane", -27.4833333, 153.0166626, 17.0},
+       {633, "Australia", "Wagga Wagga", -35.1166667, 147.3666687, 148.0},
+       {634, "Australia", "Bundaberg", -24.8500000, 152.3500061, 7.0},
+       {635, "Australia", "Port Macquarie", -31.4333333, 152.9166718, -9999.0},
+       {636, "Australia", "Mildura", -34.2000000, 142.1499939, 60.0},
+       {637, "Australia", "Hobart", -42.9166667, 147.3333282, 151.0},
+       {638, "Australia", "Torquay", -25.2833333, 152.8666687, -9999.0},
+       {639, "Australia", "Mooloolaba", -26.6833333, 153.1166687, -9999.0},
+       {640, "Australia", "Taree", -31.9000000, 152.4666595, 56.0},
+       {641, "Australia", "Cranbourne", -38.1000000, 145.2833405, 1.0},
+       {642, "Australia", "Caloundra", -26.8000000, 153.1333313, 1.0},
+       {643, "Australia", "Tamworth", -31.1000000, 150.9333344, 545.0},
+       {644, "Australia", "Kalgoorlie", -30.7500000, 121.4666672, 469.0},
+       {645, "Australia", "Shepparton", -36.3833333, 145.3999939, 132.0},
+       {646, "Australia", "Melton", -37.6833333, 144.5833282, 128.0},
+       {647, "Australia", "Queanbeyan", -35.3500000, 149.2333374, 609.0},
+       {648, "Australia", "Wodonga", -36.1166667, 146.8833313, 153.0},
+       {649, "Australia", "Lismore", -28.8135438, 153.2772980, 130.0},
+       {650, "Australia", "Gladstone", -23.8500000, 151.2500000, 1.0},
+       {651, "Australia", "Orange", -33.2833333, 149.1000061, 652.0},
+       {652, "Australia", "Warrnambool", -38.3833333, 142.4833374, 1.0},
+       {653, "Australia", "Sunbury", -37.5833333, 144.7333374, 197.0},
+       {654, "Australia", "Dubbo", -32.2500000, 148.6166687, 304.0},
+       {655, "Australia", "Geraldton", -28.7666667, 114.5999985, 2.0},
+       {656, "Australia", "Bunbury", -33.3333333, 115.6333313, 1.0},
+       {657, "Australia", "Alice Springs", -23.7000000, 133.8833313, 609.0},
+       {658, "Australia", "Palmerston", -12.4860237, 130.9832916, 6.0},
+       {659, "Australia", "Albany", -35.0169444, 117.8916702, 85.0},
+       {660, "Australia", "Mount Gambier", -37.8333333, 140.7666626, 82.0},
+       {661, "Australia", "Armidale", -30.5166667, 151.6499939, 1014.0},
+       {662, "Australia", "Mount Isa", -20.7333333, 139.5000000, 438.0},
+       {663, "Australia", "Caboolture", -27.0833333, 152.9499969, 66.0},
+       {664, "Australia", "Goulburn", -34.7500000, 149.7166595, 563.0},
+       {665, "Australia", "Mornington", -38.2166667, 145.0333405, 1.0},
+       {666, "Australia", "Maryborough", -25.5333333, 152.6999969, 4.0},
+       {667, "Australia", "Kwinana", -32.2500000, 115.7666702, 24.0},
+       {668, "Australia", "Burnie", -41.0666667, 145.9166718, 1.0},
+       {669, "Australia", "Brunswick", -37.7666667, 144.9666595, 129.0},
+       {670, "Australia", "Craigieburn", -37.6000000, 144.9499969, 156.0},
+       {671, "Australia", "Whyalla", -33.0333333, 137.5833282, 1.0},
+       {672, "Australia", "Echuca", -36.1333333, 144.7500000, 73.0},
+       {673, "Australia", "Devonport", -41.1666667, 146.3500061, 1.0},
+       {674, "Australia", "Roebourne", -20.7833333, 117.1333313, 11.0},
+       {675, "Australia", "Hornsby", -33.7000000, 151.1000061, 163.0},
+       {676, "Australia", "Katoomba", -33.7000000, 150.3000031, 720.0},
+       {677, "Australia", "Surfers Paradise", -28.0027378, 153.4299927, 1.0},
+       {678, "Australia", "Traralgon", -38.1833333, 146.5333405, 119.0},
+       {679, "Australia", "Murray Bridge", -35.1166667, 139.2666626, 10.0},
+       {680, "Australia", "Nerang", -27.9833333, 153.3333282, 49.0},
+       {681, "Australia", "Forster", -32.1666667, 152.5166626, -9999.0},
+       {682, "Australia", "Broken Hill", -31.9500000, 141.4333344, 305.0},
+       {683, "Australia", "Karratha", -20.7291441, 116.8547058, 1.0},
+       {684, "Australia", "South Grafton", -29.7000000, 152.9499969, 78.0},
+       {685, "Australia", "Cessnock", -32.8333333, 151.3500061, 152.0},
+       {686, "Australia", "Gawler", -34.6000000, 138.7333374, 72.0},
+       {687, "Australia", "Deception Bay", -27.2000000, 153.0333405, 3.0},
+       {688, "Australia", "Griffith", -34.2833333, 146.0333405, 117.0},
+       {689, "Australia", "Buderim", -26.6833333, 153.0500031, 43.0},
+       {690, "Australia", "Nambour", -26.6333333, 152.9499969, 139.0},
+       {691, "Australia", "Crafers", -35.0000000, 138.6999969, 303.0},
+       {692, "Australia", "Sawtell", -30.3833333, 153.1000061, -9999.0},
+       {693, "Australia", "Kingston", -42.9666667, 147.3166656, 23.0},
+       {694, "Australia", "Port Hedland", -20.3166667, 118.5666656, -9999.0},
+       {695, "Australia", "Ballina", -28.8666667, 153.5666656, 1.0},
+       {696, "Australia", "Wangaratta", -36.3666667, 146.3333282, 148.0},
+       {697, "Australia", "Port Augusta", -32.5000000, 137.7666626, 7.0},
+       {698, "Australia", "Singleton", -32.5666667, 151.1833344, 154.0},
+       {699, "Australia", "Cleveland", -27.5333333, 153.2666626, 1.0},
+       {700, "Australia", "Bongaree", -27.0797222, 153.1586151, 1.0},
+       {701, "Australia", "Raymond Terrace", -32.7500000, 151.7500000, 7.0},
+       {702, "Australia", "Bacchus Marsh", -37.6833333, 144.4499969, 129.0},
+       {703, "Australia", "Broome", -17.9666667, 122.2333298, -9999.0},
+       {704, "Australia", "Moe", -38.1666667, 146.2666626, 150.0},
+       {705, "Australia", "Sale", -38.1000000, 147.0666656, 37.0},
+       {706, "Australia", "Horsham", -36.7166667, 142.1999969, 116.0},
+       {707, "Australia", "Warwick", -28.2333333, 152.0166626, 555.0},
+       {708, "Austria", "Wien", 48.2084878, 16.3720760, 164.0},
+       {709, "Austria", "Graz", 47.0666667, 15.4499998, 365.0},
+       {710, "Austria", "Linz", 48.3063889, 14.2861109, 263.0},
+       {711, "Austria", "Salzburg", 47.8000000, 13.0333328, 447.0},
+       {712, "Austria", "Innsbruck", 47.2666667, 11.3999996, 566.0},
+       {713, "Austria", "Klagenfurt", 46.6247222, 14.3052778, 443.0},
+       {714, "Austria", "Villach", 46.6102778, 13.8558331, 473.0},
+       {715, "Austria", "Wels", 48.1666667, 14.0333328, 315.0},
+       {716, "Austria", "Sankt Polten", 48.2000000, 15.6333332, 262.0},
+       {717, "Austria", "Dornbirn", 47.4166667, 9.7330561, 415.0},
+       {718, "Austria", "Steyr", 48.0427423, 14.4212723, 290.0},
+       {719, "Austria", "Wiener Neustadt", 47.8000000, 16.2500000, 262.0},
+       {720, "Austria", "Feldkirch", 47.2330556, 9.6000004, 464.0},
+       {721, "Austria", "Bregenz", 47.5031127, 9.7471046, 433.0},
+       {722, "Austria", "Wolfsberg", 46.8405556, 14.8441668, 555.0},
+       {723, "Austria", "Baden", 48.0166667, 16.2333336, 289.0},
+       {724, "Austria", "Klosterneuburg", 48.3052064, 16.3252220, 153.0},
+       {725, "Austria", "Leoben", 47.3833333, 15.1000004, 552.0},
+       {726, "Austria", "Weinzierl bei Krems", 48.4000000, 15.6000004, 189.0},
+       {727, "Austria", "Traun", 48.2166667, 14.2333336, 271.0},
+       {728, "Austria", "Krems an der Donau", 48.4092063, 15.6141472, 192.0},
+       {729, "Austria", "Amstetten", 48.1229032, 14.8720551, 268.0},
+       {730, "Austria", "Leonding", 48.2666667, 14.2500000, 275.0},
+       {731, "Austria", "Kapfenberg", 47.4333333, 15.3000002, 711.0},
+       {732, "Austria", "Modling", 48.0833333, 16.2833328, 222.0},
+       {733, "Austria", "Lustenau", 47.4330556, 9.6499996, 398.0},
+       {734, "Austria", "Hallein", 47.6833333, 13.1000004, 450.0},
+       {735, "Austria", "Braunau am Inn", 48.2666667, 13.0333328, 360.0},
+       {736, "Austria", "Spittal an der Drau", 46.8000000, 13.5000000, 564.0},
+       {737, "Austria", "Traiskirchen", 48.0166667, 16.2833328, 202.0},
+       {738, "Austria", "Saalfelden am Steinernen Meer", 47.4166667, 12.8500004, 755.0},
+       {739, "Austria", "Kufstein", 47.5833333, 12.1666670, 590.0},
+       {740, "Austria", "Schwechat", 48.1333333, 16.4666672, 167.0},
+       {741, "Austria", "Ternitz", 47.7166667, 16.0333328, 386.0},
+       {742, "Austria", "Ansfelden", 48.2000000, 14.2833328, 342.0},
+       {743, "Austria", "Stockerau", 48.3833333, 16.2166672, 171.0},
+       {744, "Austria", "Feldkirchen in Karnten", 46.7166667, 14.1000004, 594.0},
+       {745, "Austria", "Bad Ischl", 47.7166667, 13.6166668, 638.0},
+       {746, "Austria", "Tulln", 48.3333333, 16.0499992, 171.0},
+       {747, "Austria", "Hohenems", 47.3666667, 9.6830559, 404.0},
+       {748, "Austria", "Perchtoldsdorf", 48.1166667, 16.2666664, 226.0},
+       {749, "Austria", "Telfs", 47.3000000, 11.0666666, 684.0},
+       {750, "Austria", "Bludenz", 47.1497222, 9.8166666, 554.0},
+       {751, "Austria", "Gmunden", 47.9166667, 13.8000002, 479.0},
+       {752, "Austria", "Bruck an der Mur", 47.4166667, 15.2833328, 629.0},
+       {753, "Austria", "Sankt Veit an der Glan", 46.7680556, 14.3602781, 466.0},
+       {754, "Austria", "Knittelfeld", 47.2166667, 14.8166666, 658.0},
+       {755, "Austria", "Schwaz", 47.3349837, 11.7002678, 696.0},
+       {756, "Austria", "Lienz", 46.8311111, 12.7597218, 661.0},
+       {757, "Austria", "Vocklabruck", 48.0166667, 13.6499996, 482.0},
+       {758, "Austria", "Waidhofen an der Ybbs", 47.9666667, 14.7666664, 474.0},
+       {759, "Austria", "Hard", 47.4830556, 9.6830559, 400.0},
+       {760, "Austria", "Zwettl Stift", 48.6166667, 15.1999998, 552.0},
+       {761, "Austria", "Marchtrenk", 48.1833333, 14.1166668, 293.0},
+       {762, "Austria", "Volkermarkt", 46.6622222, 14.6344442, 444.0},
+       {763, "Austria", "Ried im Innkreis", 48.2166667, 13.5000000, 413.0},
+       {764, "Austria", "Korneuburg", 48.3500000, 16.3333340, 162.0},
+       {765, "Austria", "Rankweil", 47.2830556, 9.6499996, 531.0},
+       {766, "Austria", "Neunkirchen", 47.7166667, 16.0833340, 337.0},
+       {767, "Austria", "Worgl", 47.4833333, 12.0666666, 718.0},
+       {768, "Austria", "Bad Voslau", 47.9666667, 16.2000008, 251.0},
+       {769, "Austria", "Hollabrunn", 48.5500000, 16.0833340, 251.0},
+       {770, "Austria", "Sankt Johann im Pongau", 47.3500000, 13.1999998, 712.0},
+       {771, "Austria", "Sankt Andra", 46.7661111, 14.8236113, 397.0},
+       {772, "Austria", "Mistelbach", 48.5700000, 16.5766659, 216.0},
+       {773, "Austria", "Enns", 48.2000000, 14.4666672, 250.0},
+       {774, "Austria", "Koflach", 47.0666667, 15.0833330, 478.0},
+       {775, "Austria", "Gotzis", 47.3330556, 9.6330557, 416.0},
+       {776, "Austria", "Bischofshofen", 47.4166667, 13.2166672, 691.0},
+       {777, "Austria", "Zell am See", 47.3166667, 12.7833328, 946.0},
+       {778, "Austria", "Judenburg", 47.1666667, 14.6666670, 712.0},
+       {779, "Austria", "Voitsberg", 47.0333333, 15.1499996, 544.0},
+       {780, "Austria", "Seekirchen Markt", 47.9000000, 13.1333332, 508.0},
+       {781, "Austria", "Altmunster", 47.9021890, 13.7641525, 436.0},
+       {782, "Austria", "Laakirchen", 47.9818790, 13.8216591, 441.0},
+       {783, "Austria", "Ebreichsdorf", 47.9500000, 16.3999996, 194.0},
+       {784, "Austria", "Murzzuschlag", 47.6000000, 15.6833334, 811.0},
+       {785, "Austria", "Imst", 47.2450371, 10.7397366, 781.0},
+       {786, "Austria", "Lauterach", 47.4830556, 9.7330561, 410.0},
+       {787, "Austria", "Weiz", 47.2166667, 15.6166668, 460.0},
+       {788, "Austria", "Neu-Guntramsdorf", 48.0666667, 16.3166676, 185.0},
+       {789, "Austria", "Sankt Valentin", 48.1666667, 14.5166664, 261.0},
+       {790, "Austria", "Gerasdorf bei Wien", 48.2944721, 16.4676476, 151.0},
+       {791, "Austria", "Kitzbuhel", 47.4463748, 12.3921490, 812.0},
+       {792, "Austria", "Velden am Worthersee", 46.6161111, 14.0458336, 425.0},
+       {793, "Austria", "Berndorf", 47.9500000, 16.1000004, 336.0},
+       {794, "Austria", "Gross-Enzersdorf", 48.2027778, 16.5508327, 148.0},
+       {795, "Austria", "Sierning", 48.0434309, 14.3093491, 361.0},
+       {796, "Austria", "Ganserndorf", 48.3392500, 16.7201614, 153.0},
+       {797, "Austria", "Wiener Neudorf", 48.0666667, 16.3166676, 185.0},
+       {798, "Austria", "Engerwitzdorf", 48.3500000, 14.4499998, 330.0},
+       {799, "Austria", "Rum", 47.2833333, 11.4499998, 556.0},
+       {800, "Austria", "Finkenstein am Faaker See", 46.5655556, 13.8652782, 564.0},
+       {801, "Austria", "Ebensee", 47.8000000, 13.7666664, 485.0},
+       {802, "Austria", "Purkersdorf", 48.2000000, 16.1666660, 372.0},
+       {803, "Austria", "Trofaiach", 47.4166667, 15.0000000, 643.0},
+       {804, "Austria", "Fohnsdorf", 47.2000000, 14.6833334, 723.0},
+       {805, "Austria", "Wolfurt", 47.4666667, 9.7500000, 529.0},
+       {806, "Austria", "Maria Enzersdorf", 48.1000000, 16.2833328, 214.0},
+       {807, "Austria", "Deutschlandsberg", 46.8152778, 15.2222223, 372.0},
+       {808, "Azerbaijan", "Baku", 40.3952778, 49.8822212, 30.0},
+       {809, "Azerbaijan", "Ganca", 40.6827778, 46.3605537, 409.0},
+       {810, "Azerbaijan", "Sumqayit", 40.5897222, 49.6686096, 24.0},
+       {811, "Azerbaijan", "Mingacevir", 40.7700000, 47.0488892, 32.0},
+       {812, "Azerbaijan", "Qaracuxur", 40.3966667, 49.9736099, 61.0},
+       {813, "Azerbaijan", "Ali Bayramli", 39.9319444, 48.9202766, 13.0},
+       {814, "Azerbaijan", "Bakixanov", 40.4216667, 49.9644432, 43.0},
+       {815, "Azerbaijan", "Naxcivan", 39.2088889, 45.4122238, 890.0},
+       {816, "Azerbaijan", "Saki", 41.1919444, 47.1705551, 606.0},
+       {817, "Azerbaijan", "Yevlax", 40.6172222, 47.1500015, 15.0},
+       {818, "Azerbaijan", "Bilacari", 40.4313889, 49.8080559, 73.0},
+       {819, "Azerbaijan", "Mastaga", 40.5327778, 50.0038872, 31.0},
+       {820, "Azerbaijan", "Agdam", 39.9930556, 46.9305573, 363.0},
+       {821, "Azerbaijan", "Barda", 40.3744444, 47.1266670, 82.0},
+       {822, "Azerbaijan", "Xacmaz", 41.4708333, 48.8097229, 25.0},
+       {823, "Azerbaijan", "Salyan", 39.5950000, 48.9791679, -4.0},
+       {824, "Azerbaijan", "Hovsan", 40.3744444, 50.0852776, -18.0},
+       {825, "Azerbaijan", "Calilabad", 39.2088889, 48.4972229, 31.0},
+       {826, "Azerbaijan", "Samkir", 40.8297222, 46.0188904, 433.0},
+       {827, "Azerbaijan", "Goycay", 40.6530556, 47.7405548, 111.0},
+       {828, "Azerbaijan", "Agcabadi", 40.0527778, 47.4613876, 24.0},
+       {829, "Azerbaijan", "Imisli", 39.8697222, 48.0600014, 15.0},
+       {830, "Azerbaijan", "Lokbatan", 40.3272222, 49.7299995, 32.0},
+       {831, "Azerbaijan", "Samaxi", 40.6302778, 48.6413879, 637.0},
+       {832, "Azerbaijan", "Sabirabad", 40.0127778, 48.4788895, -15.0},
+       {833, "Azerbaijan", "Amircan", 40.4263889, 49.9836121, 56.0},
+       {834, "Azerbaijan", "Buzovna", 40.5161111, 50.1163902, -11.0},
+       {835, "Azerbaijan", "Bina", 40.4538889, 50.0763893, 14.0},
+       {836, "Azerbaijan", "Agdas", 40.6500000, 47.4761124, 42.0},
+       {837, "Azerbaijan", "Qazimammad", 40.0433333, 48.9355545, -3.0},
+       {838, "Azerbaijan", "Quba", 41.3597222, 48.5125008, 587.0},
+       {839, "Azerbaijan", "Zabrat", 40.4872222, 49.9524994, 43.0},
+       {840, "Azerbaijan", "Sabuncu", 40.4425000, 49.9480553, 34.0},
+       {841, "Azerbaijan", "Haci Zeynalabdin", 40.6233333, 49.5586128, -10.0},
+       {842, "Azerbaijan", "Qazax", 41.0933333, 45.3661118, 384.0},
+       {843, "Azerbaijan", "Susa", 39.7563889, 46.7511101, 1172.0},
+       {844, "Azerbaijan", "Neftcala", 39.3586111, 49.2469444, -7.0},
+       {845, "Azerbaijan", "Zaqatala", 41.6336111, 46.6433334, 545.0},
+       {846, "Azerbaijan", "Tartar", 40.3450000, 46.9288902, 226.0},
+       {847, "Azerbaijan", "Bilasuvar", 39.4583333, 48.5449982, 15.0},
+       {848, "Azerbaijan", "Xanlar", 40.5869444, 46.3158340, 691.0},
+       {849, "Azerbaijan", "Agsu", 40.5691667, 48.4008331, 114.0},
+       {850, "Azerbaijan", "Qusar", 41.4263889, 48.4355545, 618.0},
+       {851, "Azerbaijan", "Ucar", 40.5183333, 47.6541672, 13.0},
+       {852, "Azerbaijan", "Mardakan", 40.4922222, 50.1388893, -4.0},
+       {853, "Azerbaijan", "Astara", 38.4561111, 48.8786125, -24.0},
+       {854, "Azerbaijan", "Binaqadi", 40.4758333, 49.8222237, 47.0},
+       {855, "Azerbaijan", "Xudat", 41.6280556, 48.6827774, 54.0},
+       {856, "Azerbaijan", "Ismayilli", 40.7900000, 48.1519432, 616.0},
+       {857, "Azerbaijan", "Artyom", 40.4708333, 50.3216667, -3.0},
+       {858, "Azerbaijan", "Qobustan", 40.0841667, 49.4158325, -15.0},
+       {859, "Azerbaijan", "Goytapa", 39.1166667, 48.5952797, 3.0},
+       {860, "Azerbaijan", "Tovuz", 40.9922222, 45.6288872, 413.0},
+       {861, "Azerbaijan", "Agstafa", 41.1188889, 45.4538879, 338.0},
+       {862, "Azerbaijan", "Qax", 41.4225000, 46.9241676, 616.0},
+       {863, "Azerbaijan", "Qabala", 40.9813889, 47.8458328, 789.0},
+       {864, "Azerbaijan", "Badamdar", 40.3394444, 49.8038902, 130.0},
+       {865, "Azerbaijan", "Balaxani", 40.4616667, 49.9199982, 61.0},
+       {866, "Azerbaijan", "Culfa", 38.9500000, 45.6319427, 707.0},
+       {867, "Azerbaijan", "Zardab", 40.2183333, 47.7083321, 7.0},
+       {868, "Azerbaijan", "Saray", 40.5322222, 49.7163887, 68.0},
+       {869, "Azerbaijan", "Agdara", 40.2152778, 46.8127785, 452.0},
+       {870, "Azerbaijan", "Zira", 40.3636111, 50.2902794, -21.0},
+       {871, "Azerbaijan", "Ordubad", 38.9080556, 46.0277786, 907.0},
+       {872, "Azerbaijan", "Turkan", 40.3638889, 50.2150002, -20.0},
+       {873, "Azerbaijan", "Masalli", 39.0341667, 48.6655540, 1.0},
+       {874, "Azerbaijan", "Balakan", 41.7258333, 46.4083328, 388.0},
+       {875, "Azerbaijan", "Aliabad", 41.4783333, 46.6175003, 254.0},
+       {876, "Azerbaijan", "Bilgah", 40.5680556, 50.0377769, 35.0},
+       {877, "Azerbaijan", "Ramana", 40.4422222, 49.9805565, 52.0},
+       {878, "Azerbaijan", "Gadabay", 40.5655556, 45.8161125, 1473.0},
+       {879, "Azerbaijan", "Corat", 40.5725000, 49.7063904, -1.0},
+       {880, "Azerbaijan", "Cabrayil", 39.4000000, 47.0261116, 570.0},
+       {881, "Azerbaijan", "Nardaran", 40.5561111, 50.0055542, 41.0},
+       {882, "Azerbaijan", "Icari", 39.0822222, 46.6549988, 478.0},
+       {883, "Azerbaijan", "Zayam", 40.8994444, 45.8858337, 375.0},
+       {884, "Azerbaijan", "Qobu", 40.4047222, 49.7130547, 74.0},
+       {885, "Azerbaijan", "Goranboy", 40.6102778, 46.7897224, 149.0},
+       {886, "Azerbaijan", "Lerik", 38.7752778, 48.4152794, 1108.0},
+       {887, "Azerbaijan", "Banka", 39.4200000, 49.2475014, -7.0},
+       {888, "Azerbaijan", "Naftalan", 40.5066667, 46.8250008, 199.0},
+       {889, "Azerbaijan", "Qubadli", 39.3438889, 46.5797234, 540.0},
+       {890, "Azerbaijan", "Aran", 40.6252778, 46.9755554, 44.0},
+       {891, "Azerbaijan", "Cinarli", 41.4725000, 46.9111099, 903.0},
+       {892, "Azerbaijan", "Mincivan", 39.0300000, 46.7186127, 335.0},
+       {893, "Azerbaijan", "Qizilhacili", 40.5808333, 46.8502769, 122.0},
+       {894, "Azerbaijan", "Boradigah", 38.9277778, 48.7086105, -9.0},
+       {895, "Azerbaijan", "Xocali", 39.9111111, 46.7891655, 584.0},
+       {896, "Azerbaijan", "Ceyranbatan", 40.5408333, 49.6597214, 45.0},
+       {897, "Azerbaijan", "Qarayeri", 40.7916667, 46.3213882, 239.0},
+       {898, "Azerbaijan", "Xocasan", 40.4122222, 49.7716675, 36.0},
+       {899, "Azerbaijan", "Xocavand", 39.7952778, 47.1130562, 336.0},
+       {900, "Azerbaijan", "Kijoba", 38.5327778, 48.8166656, -11.0},
+       {901, "Azerbaijan", "Mugan", 40.0986111, 48.8188896, -12.0},
+       {902, "Azerbaijan", "Dalilar", 40.8627778, 46.0366669, 333.0},
+       {903, "Azerbaijan", "Hasanabad", 39.3213889, 49.2091675, -8.0},
+       {904, "Azerbaijan", "Qaracala", 39.8077778, 48.9338875, -7.0},
+       {905, "Azerbaijan", "Yardimli", 38.9205556, 48.2372208, 979.0},
+       {906, "Azerbaijan", "Xilli", 39.4266667, 49.1063881, -7.0},
+       {907, "Bahrain", "Manama", 26.2361111, 50.5830574, -9999.0},
+       {908, "Bahrain", "Al Muharraq", 26.2572222, 50.6119461, 13.0},
+       {909, "Bahrain", "Dar Kulayb", 26.0686111, 50.5038872, 2.0},
+       {910, "Bahrain", "Madinat `Isa", 26.1736110, 50.5477791, 5.0},
+       {911, "Bahrain", "Sitrah", 26.1547222, 50.6205559, 6.0},
+       {912, "Bahrain", "Jidd Hafs", 26.2186111, 50.5477791, 1.0},
+       {913, "Bahrain", "Al Hadd", 26.2455556, 50.6541672, 3.0},
+       {914, "Bangladesh", "Dhaka", 23.7230556, 90.4086075, 4.0},
+       {915, "Bangladesh", "Chittagong", 22.3330556, 91.8363876, 7.0},
+       {916, "Bangladesh", "Khulna", 22.8000000, 89.5500031, 9.0},
+       {917, "Bangladesh", "Rajshahi", 24.3666667, 88.5999985, 31.0},
+       {918, "Bangladesh", "Comilla", 23.4577778, 91.2044449, 12.0},
+       {919, "Bangladesh", "Tungi", 23.8900000, 90.4058304, 4.0},
+       {920, "Bangladesh", "Mymensingh", 24.7500000, 90.4000015, 17.0},
+       {921, "Bangladesh", "Rangpur", 25.7500000, 89.2500000, 36.0},
+       {922, "Bangladesh", "Narsingdi", 23.9208333, 90.7180557, 4.0},
+       {923, "Bangladesh", "Jessore", 23.1666667, 89.2166672, 15.0},
+       {924, "Bangladesh", "Sylhet", 24.8966667, 91.8716660, 9.0},
+       {925, "Bangladesh", "Narayanganj", 23.6233333, 90.5011139, 4.0},
+       {926, "Bangladesh", "Dinajpur", 25.6333333, 88.6333313, 35.0},
+       {927, "Bangladesh", "Barisal", 22.7019444, 90.3711090, 2.0},
+       {928, "Bangladesh", "Saidpur", 25.7776918, 88.8916931, 36.0},
+       {929, "Bangladesh", "Par Naogaon", 24.8000000, 88.9499969, 14.0},
+       {930, "Bangladesh", "Tangail", 24.2500000, 89.9166641, 13.0},
+       {931, "Bangladesh", "Jamalpur", 24.9166667, 89.9333344, 12.0},
+       {932, "Bangladesh", "Sirajganj", 24.4500000, 89.7166672, 13.0},
+       {933, "Bangladesh", "Nawabganj", 24.6000000, 88.2833328, 21.0},
+       {934, "Bangladesh", "Pabna", 24.0000000, 89.2500000, 8.0},
+       {935, "Bangladesh", "Kushtia", 23.9166667, 89.1166687, 26.0},
+       {936, "Bangladesh", "Satkhira", 22.7166667, 89.0999985, 14.0},
+       {937, "Bangladesh", "Faridpur", 23.6000000, 89.8333359, 11.0},
+       {938, "Bangladesh", "Sherpur", 25.0166667, 90.0166702, 14.0},
+       {939, "Bangladesh", "Bhairab Bazar", 24.0666667, 90.9666672, 16.0},
+       {940, "Bangladesh", "Shahzadpur", 24.1666667, 89.5999985, 17.0},
+       {941, "Bangladesh", "Bhola", 22.6833333, 90.6500015, 1.0},
+       {942, "Bangladesh", "Kishorganj", 24.4333333, 90.7666702, 10.0},
+       {943, "Bangladesh", "Habiganj", 24.3833333, 91.4166641, 6.0},
+       {944, "Bangladesh", "Madaripur", 23.1752778, 90.2072220, -9999.0},
+       {945, "Bangladesh", "Feni", 23.0186111, 91.4100037, 5.0},
+       {946, "Bangladesh", "Laksham", 23.2472222, 91.1425018, 10.0},
+       {947, "Bangladesh", "Ishurdi", 24.1333333, 89.0833359, 30.0},
+       {948, "Bangladesh", "Sarishabari", 24.7333333, 89.8333359, 9.0},
+       {949, "Bangladesh", "Netrakona", 24.8833333, 90.7166672, 2.0},
+       {950, "Bangladesh", "Jaipur Hat", 25.1000000, 89.0166702, 29.0},
+       {951, "Bangladesh", "Thakurgaon", 26.0333333, 88.4666672, 37.0},
+       {952, "Bangladesh", "Palang", 23.2166667, 90.3499985, 5.0},
+       {953, "Bangladesh", "Lalmanir Hat", 25.9000000, 89.4499969, 32.0},
+       {954, "Bangladesh", "Raipur", 23.0500000, 90.7666702, 3.0},
+       {955, "Bangladesh", "Tungipara", 22.9000000, 89.9166641, 6.0},
+       {956, "Bangladesh", "Lakshmipur", 22.9500000, 90.8333359, 2.0},
+       {957, "Bangladesh", "Kaptaimukh", 22.4713889, 92.2322235, 18.0},
+       {958, "Bangladesh", "Moulvi Bazar", 24.4833333, 91.7833328, 13.0},
+       {959, "Bangladesh", "Ramganj", 23.1000000, 90.8499985, 3.0},
+       {960, "Bangladesh", "Narail", 23.1666667, 89.5000000, 14.0},
+       {961, "Bangladesh", "Pirojpur", 22.5666667, 89.9833298, 3.0},
+       {962, "Bangladesh", "Sandwip", 22.4677778, 91.4561081, 6.0},
+       {963, "Bangladesh", "Satkania", 22.0755556, 92.0513916, 6.0},
+       {964, "Bangladesh", "Patiya", 22.2947222, 91.9791641, 7.0},
+       {965, "Bangladesh", "Khagrachari", 23.1000000, 91.9666672, 48.0},
+       {966, "Bangladesh", "Chilmari", 25.5500000, 89.7166672, 18.0},
+       {967, "Bangladesh", "Nageswari", 25.9666667, 89.7166672, 40.0},
+       {968, "Bangladesh", "Panchagarh", 26.3333333, 88.5666656, 59.0},
+       {969, "Bangladesh", "Dakshin Char Fasson", 22.2166667, 90.7333298, 2.0},
+       {970, "Bangladesh", "Parbatipur", 25.6500000, 88.9166641, 30.0},
+       {971, "Bangladesh", "Barahanuddin", 22.5000000, 90.7166672, 2.0},
+       {972, "Bangladesh", "Kaliganj", 23.4166667, 89.1333313, 24.0},
+       {973, "Bangladesh", "Dohar", 23.5883333, 90.1469421, 4.0},
+       {974, "Bangladesh", "Hajiganj", 23.2511111, 90.8591690, 4.0},
+       {975, "Bangladesh", "Abhaynagar", 23.0166667, 89.4666672, 16.0},
+       {976, "Bangladesh", "Lalmohan", 22.3166667, 90.7166672, 1.0},
+       {977, "Bangladesh", "Jhikergacha", 23.1166667, 89.1166687, 11.0},
+       {978, "Bangladesh", "Mirzapur", 24.1000000, 90.0999985, 16.0},
+       {979, "Bangladesh", "Sakhipur", 24.3000000, 90.1833344, 19.0},
+       {980, "Bangladesh", "Teknaf", 20.8666667, 92.3000031, -9999.0},
+       {981, "Bangladesh", "Gaurnadi", 22.9666667, 90.2333298, 2.0},
+       {982, "Bangladesh", "Kalia", 23.0500000, 89.6333313, 14.0},
+       {983, "Bangladesh", "Bera", 24.0833333, 89.6166687, 20.0},
+       {984, "Bangladesh", "Mehendiganj", 22.8166667, 90.5333328, 2.0},
+       {985, "Bangladesh", "Chhagalnaiya", 23.0300000, 91.5069427, 8.0},
+       {986, "Bangladesh", "Chhatak", 25.0333333, 91.6666641, 6.0},
+       {987, "Bangladesh", "Nalchiti", 22.6333333, 90.2833328, 2.0},
+       {988, "Bangladesh", "Bheramara", 24.0333333, 88.9666672, 8.0},
+       {989, "Bangladesh", "Phultala", 22.7000000, 89.5166702, 9.0},
+       {990, "Bangladesh", "Baniachang", 24.5166667, 91.3666687, 4.0},
+       {991, "Bangladesh", "Sarankhola", 22.3000000, 89.7833328, 1.0},
+       {992, "Bangladesh", "Shibganj", 24.6833333, 88.1666641, 17.0},
+       {993, "Bangladesh", "Pirganj", 25.8666667, 88.3666687, 35.0},
+       {994, "Bangladesh", "Bajitpur", 24.2166667, 90.9499969, 10.0},
+       {995, "Bangladesh", "Char Bhadrasan", 23.3166667, 90.2166672, 4.0},
+       {996, "Bangladesh", "Gafargaon", 24.4333333, 90.5666656, 13.0},
+       {997, "Bangladesh", "Fatikchari", 22.6883333, 91.7908325, 9.0},
+       {998, "Bangladesh", "Badarganj", 25.6666667, 89.0500031, 32.0},
+       {999, "Bangladesh", "Bandarban", 22.1980556, 92.2197189, 10.0},
+       {1000, "Bangladesh", "Nabinagar", 23.8916667, 90.9733353, 3.0},
+       {1001, "Bangladesh", "Morrelganj", 22.4666667, 89.8499985, 1.0},
+       {1002, "Bangladesh", "Kesabpur", 22.9166667, 89.2166672, 14.0},
+       {1003, "Bangladesh", "Bhandaria", 22.4833333, 90.0666656, 2.0},
+       {1004, "Bangladesh", "Mathbaria", 22.3000000, 89.9499969, 7.0},
+       {1005, "Bangladesh", "Raojan", 22.5383333, 91.9147186, 7.0},
+       {1006, "Bangladesh", "Manikchhari", 22.8625000, 91.8450012, 42.0},
+       {1007, "Bangladesh", "Muktagacha", 24.7666667, 90.2333298, 23.0},
+       {1008, "Barbados", "Bridgetown", 13.1000000, -59.6166649, 1.0},
+       {1009, "Barbados", "Speightstown", 13.2500000, -59.6500015, 1.0},
+       {1010, "Barbados", "Oistins", 13.0666667, -59.5333328, 53.0},
+       {1011, "Barbados", "Bathsheba", 13.2166667, -59.5166664, -9999.0},
+       {1012, "Barbados", "Holetown", 13.1833333, -59.6500015, 1.0},
+       {1013, "Barbados", "The Crane", 13.1000000, -59.4500008, -9999.0},
+       {1014, "Barbados", "Crab Hill", 13.3166667, -59.6333351, 39.0},
+       {1015, "Barbados", "Blackmans", 13.1833333, -59.5333328, 219.0},
+       {1016, "Barbados", "Greenland", 13.2500000, -59.5666656, 45.0},
+       {1017, "Barbados", "Hillaby", 13.2166667, -59.5833321, 143.0},
+       {1018, "Belarus", "Minsk", 53.9000000, 27.5666676, 199.0},
+       {1019, "Belarus", "Mahilyow", 53.9138889, 30.3363895, 187.0},
+       {1020, "Belarus", "Vitsyebsk", 55.1925000, 30.1944447, 146.0},
+       {1021, "Belarus", "Hrodna", 53.6813889, 23.8147221, 128.0},
+       {1022, "Belarus", "Brest", 52.1000000, 23.7000008, 148.0},
+       {1023, "Belarus", "Babruysk", 53.1500000, 29.2333336, 134.0},
+       {1024, "Belarus", "Baranavichy", 53.1333333, 26.0333328, 196.0},
+       {1025, "Belarus", "Pinsk", 52.1213889, 26.0727787, 148.0},
+       {1026, "Belarus", "Orsha", 54.5152778, 30.4052773, 174.0},
+       {1027, "Belarus", "Mazyr", 52.0500000, 29.2666664, 119.0},
+       {1028, "Belarus", "Salihorsk", 52.8000000, 27.5333328, 134.0},
+       {1029, "Belarus", "Maladzyechna", 54.3166667, 26.8497219, 164.0},
+       {1030, "Belarus", "Navapolatsk", 55.5333333, 28.6499996, 133.0},
+       {1031, "Belarus", "Barysaw", 54.2255556, 28.4913883, 179.0},
+       {1032, "Belarus", "Lida", 53.8833333, 25.2997227, 145.0},
+       {1033, "Belarus", "Polatsk", 55.4855556, 28.8041668, 118.0},
+       {1034, "Belarus", "Zhlobin", 52.8922222, 30.0280552, 133.0},
+       {1035, "Belarus", "Svyetlahorsk", 52.6291667, 29.7338886, 136.0},
+       {1036, "Belarus", "Slutsk", 53.0272222, 27.5619450, 142.0},
+       {1037, "Belarus", "Zhodzina", 54.0983333, 28.3325005, 181.0},
+       {1038, "Belarus", "Slonim", 53.0866667, 25.3219452, 122.0},
+       {1039, "Belarus", "Kobryn", 52.2161111, 24.3663883, 147.0},
+       {1040, "Belarus", "Vawkavysk", 53.1519444, 24.4555550, 171.0},
+       {1041, "Belarus", "Kalinkavichy", 52.1333333, 29.3288898, 126.0},
+       {1042, "Belarus", "Asipovichy", 53.2933333, 28.6422215, 142.0},
+       {1043, "Belarus", "Horki", 54.2833333, 30.9911118, 185.0},
+       {1044, "Belarus", "Navahrudak", 53.6000000, 25.8333340, 292.0},
+       {1045, "Belarus", "Vilyeyka", 54.4975000, 26.9211102, 149.0},
+       {1046, "Belarus", "Byaroza", 52.5336111, 24.9838886, 153.0},
+       {1047, "Belarus", "Krychaw", 53.6988889, 31.7141666, 154.0},
+       {1048, "Belarus", "Dzyarzhynsk", 53.6850000, 27.1419449, 206.0},
+       {1049, "Belarus", "Hlybokaye", 55.1333333, 27.6833324, 164.0},
+       {1050, "Belarus", "Pastavy", 55.1167595, 26.8326263, 144.0},
+       {1051, "Belarus", "Mar'ina Horka", 53.5166667, 28.1499996, 150.0},
+       {1052, "Belarus", "Pruzhany", 52.5566667, 24.4644451, 161.0},
+       {1053, "Belarus", "Dobrush", 52.4094444, 31.3227787, 116.0},
+       {1054, "Belarus", "Bykhaw", 53.5183333, 30.2461109, 158.0},
+       {1055, "Belarus", "Masty", 53.4077778, 24.5327778, 118.0},
+       {1056, "Belarus", "Klimavichy", 53.6094444, 31.9519444, 173.0},
+       {1057, "Belarus", "Ashmyany", 54.4169444, 25.9327774, 207.0},
+       {1058, "Belarus", "Zhytkavichy", 52.2286111, 27.8636112, 129.0},
+       {1059, "Belarus", "Ivanava", 52.1325000, 25.5461102, 142.0},
+       {1060, "Belarus", "Zaslawye", 54.0000000, 27.2833328, 211.0},
+       {1061, "Belarus", "Shklow", 54.2108333, 30.2919445, 141.0},
+       {1062, "Belarus", "Drahichyn", 52.1897222, 25.1502781, 143.0},
+       {1063, "Belarus", "Haradok", 55.4602778, 30.0000000, 179.0},
+       {1064, "Belarus", "Fanipol", 53.7627166, 27.2962189, 235.0},
+       {1065, "Belarus", "Nyasvizh", 53.2180556, 26.6725006, 179.0},
+       {1066, "Belarus", "Smalyavichy", 54.0333333, 28.0841675, 189.0},
+       {1067, "Belarus", "Braslaw", 55.6338889, 27.0538883, 131.0},
+       {1068, "Belarus", "Kastsyukovichy", 53.3388889, 32.0461121, 170.0},
+       {1069, "Belarus", "Chashniki", 54.8588889, 29.1558342, 154.0},
+       {1070, "Belarus", "Talachyn", 54.4108333, 29.7033329, 197.0},
+       {1071, "Belarus", "Chavusi", 53.8127778, 30.9836102, 153.0},
+       {1072, "Belarus", "Zhabinka", 52.2005556, 24.0233326, 141.0},
+       {1073, "Belarus", "Beloozersk", 52.4711111, 25.1733341, 167.0},
+       {1074, "Belarus", "Miyory", 55.6155556, 27.6286106, 151.0},
+       {1075, "Belarus", "Kostyukovka", 52.5386111, 30.9158325, 144.0},
+       {1076, "Belarus", "Pyetrykaw", 52.1280556, 28.4944439, 125.0},
+       {1077, "Belarus", "Stolin", 51.8833333, 26.8500004, 109.0},
+       {1078, "Belarus", "Staryya Darohi", 53.0391667, 28.2724991, 138.0},
+       {1079, "Belarus", "Myadzyel", 54.8686111, 26.9372215, 172.0},
+       {1080, "Belarus", "Syanno", 54.8041667, 29.7044449, 167.0},
+       {1081, "Belarus", "Valozhyn", 54.0830556, 26.5324993, 211.0},
+       {1082, "Belarus", "Malaryta", 51.7833333, 24.0833340, 163.0},
+       {1083, "Belarus", "Klyetsk", 53.0652778, 26.6416664, 184.0},
+       {1084, "Belarus", "Vyetka", 52.5591667, 31.1808338, 135.0},
+       {1085, "Belarus", "Dzyatlava", 53.4880556, 25.4133339, 152.0},
+       {1086, "Belarus", "Dokshytsy", 54.8961111, 27.7583332, 197.0},
+       {1087, "Belarus", "Cherykaw", 53.5722222, 31.3805561, 154.0},
+       {1088, "Belarus", "Karelichy", 53.5652778, 26.1377773, 156.0},
+       {1089, "Belarus", "David-Gorodok", 52.0500000, 27.2166672, 126.0},
+       {1090, "Belarus", "Sharkowshchyna", 55.3666667, 27.4666672, 136.0},
+       {1091, "Belarus", "Slawharad", 53.4452778, 30.9963894, 169.0},
+       {1092, "Belarus", "Vishnevo", 54.7166667, 26.5333328, 156.0},
+       {1093, "Belarus", "Rakov", 53.9666667, 27.0499992, 200.0},
+       {1094, "Belarus", "Starobin", 52.7333333, 27.4666672, 121.0},
+       {1095, "Belarus", "Ivenets", 53.8833333, 26.7500000, 212.0},
+       {1096, "Belarus", "Vasilevichi", 52.2500000, 29.8333340, 124.0},
+       {1097, "Belarus", "Vysokoye", 52.3730556, 23.3675003, 160.0},
+       {1098, "Belarus", "Konstantinovo", 54.6666667, 29.2666664, 190.0},
+       {1099, "Belarus", "Krevo", 54.3166667, 26.2833328, 272.0},
+       {1100, "Belarus", "Disna", 55.5666667, 28.2166672, 107.0},
+       {1101, "Belarus", "Kossovo", 52.7500000, 25.1499996, 178.0},
+       {1102, "Belarus", "Boruny", 54.3166667, 26.1333332, 251.0},
+       {1103, "Belarus", "Mir", 53.4500000, 26.4666672, 171.0},
+       {1104, "Belarus", "Zhirovichi", 53.0166667, 25.3500004, 121.0},
+       {1105, "Belarus", "Druya", 55.7833333, 27.4500008, 109.0},
+       {1106, "Belarus", "Ratomka", 53.9333333, 27.3500004, 237.0},
+       {1107, "Belarus", "Shelkovo", 55.4333333, 28.8833332, 117.0},
+       {1108, "Belgium", "Brussels", 50.8465975, 4.3527746, 48.0},
+       {1109, "Belgium", "Antwerp", 51.2166667, 4.4166665, 3.0},
+       {1110, "Belgium", "Gent", 51.0500000, 3.7166667, 4.0},
+       {1111, "Belgium", "Charleroi", 50.4166667, 4.4333334, 121.0},
+       {1112, "Belgium", "Liege", 50.6411876, 5.5717850, 63.0},
+       {1113, "Belgium", "Brugge", 51.2097871, 3.2250023, 3.0},
+       {1114, "Belgium", "Namur", 50.4666667, 4.8666668, 120.0},
+       {1115, "Belgium", "Leuven", 50.8795896, 4.7009254, 35.0},
+       {1116, "Belgium", "Mons", 50.4541296, 3.9522886, 35.0},
+       {1117, "Belgium", "Aalst", 50.9333333, 4.0333333, 17.0},
+       {1118, "Belgium", "Mechelen", 51.0333333, 4.4666667, 4.0},
+       {1119, "Belgium", "La Louviere", 50.4865658, 4.1878510, 125.0},
+       {1120, "Belgium", "Kortrijk", 50.8280326, 3.2648706, 13.0},
+       {1121, "Belgium", "Hasselt", 50.9333333, 5.3333335, 37.0},
+       {1122, "Belgium", "Oostende", 51.2166667, 2.9166667, 2.0},
+       {1123, "Belgium", "Sint-Niklaas", 51.1666667, 4.1333332, 13.0},
+       {1124, "Belgium", "Tournai", 50.6000000, 3.3833332, 41.0},
+       {1125, "Belgium", "Genk", 50.9666667, 5.5000000, 81.0},
+       {1126, "Belgium", "Seraing", 50.6000000, 5.4833331, 96.0},
+       {1127, "Belgium", "Roeselare", 50.9465313, 3.1226921, 19.0},
+       {1128, "Belgium", "Verviers", 50.5833333, 5.8666668, 250.0},
+       {1129, "Belgium", "Mouscron", 50.7333333, 3.2166667, 40.0},
+       {1130, "Belgium", "Beveren", 51.2166667, 4.2500000, 5.0},
+       {1131, "Belgium", "Dendermonde", 51.0333333, 4.1166668, 3.0},
+       {1132, "Belgium", "Beringen", 51.0500000, 5.2166667, 30.0},
+       {1133, "Belgium", "Turnhout", 51.3166667, 4.9499998, 23.0},
+       {1134, "Belgium", "Dilbeek", 50.8500000, 4.2666669, 68.0},
+       {1135, "Belgium", "Heist-op-den-Berg", 51.0833333, 4.7166667, 24.0},
+       {1136, "Belgium", "Sint-Truiden", 50.8000000, 5.1999998, 61.0},
+       {1137, "Belgium", "Lokeren", 51.1000000, 3.9833333, 3.0},
+       {1138, "Belgium", "Brasschaat", 51.2833333, 4.4499998, 4.0},
+       {1139, "Belgium", "Vilvoorde", 50.9333333, 4.4333334, 16.0},
+       {1140, "Belgium", "Herstal", 50.6666667, 5.6333332, 59.0},
+       {1141, "Belgium", "Maasmechelen", 50.8166667, 5.6666665, 93.0},
+       {1142, "Belgium", "Waregem", 50.8833333, 3.4166667, 11.0},
+       {1143, "Belgium", "Chatelet", 50.4000000, 4.5166669, 135.0},
+       {1144, "Belgium", "Ieper", 50.8500000, 2.8833332, 19.0},
+       {1145, "Belgium", "Ninove", 50.8333333, 4.0166669, 19.0},
+       {1146, "Belgium", "Geel", 51.1666667, 5.0000000, 19.0},
+       {1147, "Belgium", "Halle", 50.7410179, 4.2324829, 33.0},
+       {1148, "Belgium", "Hoboken", 51.1666667, 4.3499999, 8.0},
+       {1149, "Belgium", "Knokke-Heist", 51.3500000, 3.2666667, 5.0},
+       {1150, "Belgium", "Schoten", 51.2500000, 4.5000000, 4.0},
+       {1151, "Belgium", "Grimbergen", 50.9333333, 4.3833332, 42.0},
+       {1152, "Belgium", "Mol", 51.1833333, 5.0999999, 23.0},
+       {1153, "Belgium", "Wavre", 50.7166667, 4.6166668, 54.0},
+       {1154, "Belgium", "Binche", 50.4000000, 4.1666665, 148.0},
+       {1155, "Belgium", "Lommel", 51.2333333, 5.3000002, 48.0},
+       {1156, "Belgium", "Menen", 50.8000000, 3.1166668, 15.0},
+       {1157, "Belgium", "Tienen", 50.8000000, 4.9499998, 57.0},
+       {1158, "Belgium", "Evergem", 51.1166667, 3.7000000, 3.0},
+       {1159, "Belgium", "Wevelgem", 50.8000000, 3.1666667, 24.0},
+       {1160, "Belgium", "Geraardsbergen", 50.7666667, 3.8666668, 19.0},
+       {1161, "Belgium", "Sint-Pieters-Leeuw", 50.7833333, 4.2333331, 39.0},
+       {1162, "Belgium", "Tongeren", 50.7833333, 5.4666667, 88.0},
+       {1163, "Belgium", "Bilzen", 50.8666667, 5.5166669, 67.0},
+       {1164, "Belgium", "Louvain-la-Neuve", 50.6695923, 4.6119189, 131.0},
+       {1165, "Belgium", "Courcelles", 50.4666667, 4.3666668, 163.0},
+       {1166, "Belgium", "Asse", 50.9166667, 4.1999998, 53.0},
+       {1167, "Belgium", "Waterloo", 50.7166667, 4.3833332, 117.0},
+       {1168, "Belgium", "Zaventem", 50.8833333, 4.4666667, 51.0},
+       {1169, "Belgium", "Oudenaarde", 50.8500000, 3.5999999, 10.0},
+       {1170, "Belgium", "Deinze", 50.9833333, 3.5333333, 10.0},
+       {1171, "Belgium", "Aarschot", 50.9833333, 4.8333335, 50.0},
+       {1172, "Belgium", "Ans", 50.6500000, 5.5333333, 168.0},
+       {1173, "Belgium", "Ath", 50.6293744, 3.7780094, 32.0},
+       {1174, "Belgium", "Kapellen", 51.3166667, 4.4333334, 8.0},
+       {1175, "Belgium", "Izegem", 50.9166667, 3.2000000, 15.0},
+       {1176, "Belgium", "Arlon", 49.6833333, 5.8166666, 385.0},
+       {1177, "Belgium", "Temse", 51.1333333, 4.2166667, 12.0},
+       {1178, "Belgium", "Harelbeke", 50.8500000, 3.3000000, 14.0},
+       {1179, "Belgium", "Herentals", 51.1833333, 4.8333335, 13.0},
+       {1180, "Belgium", "Brecht", 51.3500000, 4.6333332, 23.0},
+       {1181, "Belgium", "Flemalle-Haute", 50.6000000, 5.4666667, 69.0},
+       {1182, "Belgium", "Soignies", 50.5790400, 4.0712929, 90.0},
+       {1183, "Belgium", "Lanaken", 50.8833333, 5.6500001, 60.0},
+       {1184, "Belgium", "Mortsel", 51.1666667, 4.4666667, 13.0},
+       {1185, "Belgium", "Zottegem", 50.8666667, 3.8000000, 60.0},
+       {1186, "Belgium", "Ronse", 50.7500000, 3.5999999, 40.0},
+       {1187, "Belgium", "Nivelles", 50.6000000, 4.3333335, 119.0},
+       {1188, "Belgium", "Andenne", 50.4833333, 5.0999999, 140.0},
+       {1189, "Belgium", "Maaseik", 51.1000000, 5.8000002, 28.0},
+       {1190, "Belgium", "Oupeye", 50.7000000, 5.6500001, 57.0},
+       {1191, "Belgium", "Overijse", 50.7666667, 4.5333333, 69.0},
+       {1192, "Belgium", "Zwevegem", 50.8000000, 3.3333333, 30.0},
+       {1193, "Belgium", "Beersel", 50.7666667, 4.3000002, 80.0},
+       {1194, "Belgium", "Wetteren", 51.0000000, 3.8833332, 13.0},
+       {1195, "Belgium", "Hamme", 51.1000000, 4.1333332, 3.0},
+       {1196, "Belgium", "Willebroek", 51.0666667, 4.3666668, 3.0},
+       {1197, "Belgium", "Saint-Nicolas", 50.6333333, 5.5333333, 140.0},
+       {1198, "Belgium", "Westerlo", 51.0833333, 4.9166665, 13.0},
+       {1199, "Belgium", "Diest", 50.9834243, 5.0501490, 20.0},
+       {1200, "Belgium", "Saint-Ghislain", 50.4481589, 3.8188648, 29.0},
+       {1201, "Belgium", "Manage", 50.5000000, 4.2166667, 150.0},
+       {1202, "Belgium", "Maldegem", 51.2166667, 3.4500000, 3.0},
+       {1203, "Belgium", "Fleurus", 50.4813775, 4.5487690, 160.0},
+       {1204, "Belgium", "Merelbeke", 51.0000000, 3.7500000, 12.0},
+       {1205, "Belgium", "Zedelgem", 51.1500000, 3.1333332, 9.0},
+       {1206, "Belgium", "Tubize", 50.6833333, 4.1999998, 70.0},
+       {1207, "Belgium", "Edegem", 51.1500000, 4.4499998, 18.0},
+       {1208, "Belize", "Belize City", 17.4995177, -88.1975555, 4.0},
+       {1209, "Belize", "San Ignacio", 17.1561111, -89.0713882, 127.0},
+       {1210, "Belize", "Orange Walk", 18.0666667, -88.5500031, 32.0},
+       {1211, "Belize", "Belmopan", 17.2500000, -88.7666702, 63.0},
+       {1212, "Belize", "Dangriga", 16.9666667, -88.2166672, 1.0},
+       {1213, "Belize", "Corozal", 18.3833333, -88.3833313, -9999.0},
+       {1214, "Belize", "San Pedro", 17.9166667, -87.9499969, -9999.0},
+       {1215, "Belize", "Benque Viejo del Carmen", 17.0750000, -89.1391678, 130.0},
+       {1216, "Belize", "Punta Gorda", 16.1000000, -88.8000031, -9999.0},
+       {1217, "Belize", "Valley of Peace", 17.3347222, -88.8347244, 57.0},
+       {1218, "Benin", "Cotonou", 6.3500000, 2.4333334, 53.0},
+       {1219, "Benin", "Abomey-Calavi", 6.4500000, 2.3499999, 55.0},
+       {1220, "Benin", "Porto-Novo", 6.4833333, 2.6166668, 39.0},
+       {1221, "Benin", "Djougou", 9.7050000, 1.6669444, 431.0},
+       {1222, "Benin", "Parakou", 9.3500000, 2.6166668, 325.0},
+       {1223, "Benin", "Bohicon", 7.2000000, 2.0666666, 180.0},
+       {1224, "Benin", "Kandi", 11.1341667, 2.9386110, 304.0},
+       {1225, "Benin", "Lokossa", 6.6333333, 1.7166667, 65.0},
+       {1226, "Benin", "Ouidah", 6.3666667, 2.0833333, 66.0},
+       {1227, "Benin", "Abomey", 7.1833333, 1.9833333, 220.0},
+       {1228, "Benin", "Natitingou", 10.3066667, 1.3750000, 427.0},
+       {1229, "Benin", "Save", 8.0333333, 2.4833333, 152.0},
+       {1230, "Benin", "Nikki", 9.9338889, 3.2044444, 411.0},
+       {1231, "Benin", "Dogbo", 6.8166667, 1.7833333, 71.0},
+       {1232, "Benin", "Cove", 7.2333333, 2.3000000, 71.0},
+       {1233, "Benin", "Malanville", 11.8613889, 3.3858333, 143.0},
+       {1234, "Benin", "Pobe", 6.9666667, 2.6833334, 41.0},
+       {1235, "Benin", "Savalou", 7.9333333, 1.9666667, 228.0},
+       {1236, "Benin", "Sakete", 6.7166667, 2.6666667, 37.0},
+       {1237, "Benin", "Come", 6.4000000, 1.8833333, 64.0},
+       {1238, "Benin", "Bembereke", 10.2288889, 2.6652777, 465.0},
+       {1239, "Benin", "Bassila", 9.0166667, 1.6666667, 300.0},
+       {1240, "Benin", "Banikoara", 11.3000000, 2.4333334, 304.0},
+       {1241, "Benin", "Ketou", 7.3666667, 2.5999999, 117.0},
+       {1242, "Benin", "Dassa-Zoume", 7.7500000, 2.1833334, 163.0},
+       {1243, "Benin", "Tchaourou", 8.8833333, 2.5999999, 304.0},
+       {1244, "Benin", "Allada", 6.6500000, 2.1500001, 78.0},
+       {1245, "Benin", "Aplahoue", 6.9333333, 1.6833333, 131.0},
+       {1246, "Benin", "Tanguieta", 10.6197222, 1.2644444, 274.0},
+       {1247, "Benin", "Beterou", 9.2000000, 2.2666667, 258.0},
+       {1248, "Benin", "Grand-Popo", 6.2833333, 1.8333333, 64.0},
+       {1249, "Bhutan", "Thimphu", 27.4833333, 89.5999985, 2737.0},
+       {1250, "Bhutan", "Phuntsholing", 26.8500000, 89.3833313, 289.0},
+       {1251, "Bhutan", "Pajo", 27.5333333, 89.8833313, 1258.0},
+       {1252, "Bhutan", "Tashi Yangtse", 27.5833333, 91.4666672, 1941.0},
+       {1253, "Bhutan", "Mongar", 27.2500000, 91.1999969, 913.0},
+       {1254, "Bhutan", "Tongsa", 27.5166667, 90.5000000, 2623.0},
+       {1255, "Bhutan", "Daga", 27.0666667, 89.8833313, 1464.0},
+       {1256, "Bhutan", "Paro", 27.4333333, 89.4166641, 2281.0},
+       {1257, "Bhutan", "Ha", 27.3666667, 89.2833328, 3056.0},
+       {1258, "Bhutan", "Panbang", 26.8666667, 90.9833298, 344.0},
+       {1259, "Bhutan", "Tashigang", 27.3166667, 91.5666656, 2020.0},
+       {1260, "Bhutan", "Shemgang", 27.2333333, 90.6500015, 1334.0},
+       {1261, "Bhutan", "Nganglam", 26.7833333, 91.2500000, 133.0},
+       {1262, "Bhutan", "Daifam", 26.9000000, 92.0999985, 288.0},
+       {1263, "Bhutan", "Bhangtar", 26.8166667, 91.7166672, 349.0},
+       {1264, "Bhutan", "Wamrong", 27.0666667, 91.5666656, 1427.0},
+       {1265, "Bolivia", "Santa Cruz de la Sierra", -17.8000000, -63.1666679, 439.0},
+       {1266, "Bolivia", "Cochabamba", -17.3833333, -66.1500015, 2574.0},
+       {1267, "Bolivia", "La Paz", -16.5000000, -68.1500015, 3829.0},
+       {1268, "Bolivia", "Sucre", -19.0430556, -65.2591629, 2759.0},
+       {1269, "Bolivia", "Oruro", -17.9833333, -67.1500015, 3972.0},
+       {1270, "Bolivia", "Tarija", -21.5354857, -64.7295532, 2135.0},
+       {1271, "Bolivia", "Potosi", -19.5836111, -65.7530594, 3975.0},
+       {1272, "Bolivia", "Montero", -17.3333333, -63.2500000, 291.0},
+       {1273, "Bolivia", "Trinidad", -14.8333333, -64.9000015, 155.0},
+       {1274, "Bolivia", "Yacuiba", -22.0333333, -63.6833344, 858.0},
+       {1275, "Bolivia", "Riberalta", -10.9833333, -66.0999985, 134.0},
+       {1276, "Bolivia", "Guayaramerin", -10.8000000, -65.3833313, 120.0},
+       {1277, "Bolivia", "Villazon", -22.1000000, -65.5999985, 3408.0},
+       {1278, "Bolivia", "Llallagua", -18.4166667, -66.6333313, 3877.0},
+       {1279, "Bolivia", "Camiri", -20.0500000, -63.5166664, 740.0},
+       {1280, "Bolivia", "Cobija", -11.0333333, -68.7333298, 274.0},
+       {1281, "Bolivia", "San Ignacio de Velasco", -16.3666667, -60.9500008, 563.0},
+       {1282, "Bolivia", "Tupiza", -21.4500000, -65.7166672, 3097.0},
+       {1283, "Bolivia", "Warnes", -17.5000000, -63.1666679, 331.0},
+       {1284, "Bolivia", "San Borja", -14.8166667, -66.8499985, 229.0},
+       {1285, "Bolivia", "Villamontes", -21.2500000, -63.5000000, 440.0},
+       {1286, "Bolivia", "Cotoca", -17.8166667, -63.0499992, 400.0},
+       {1287, "Bolivia", "Villa Yapacani", -17.4000000, -63.8333321, 286.0},
+       {1288, "Bolivia", "Santiago del Torno", -17.9833333, -63.3833351, 556.0},
+       {1289, "Bolivia", "Huanuni", -18.2666667, -66.8499985, 4180.0},
+       {1290, "Bolivia", "Punata", -17.5500000, -65.8333359, 2553.0},
+       {1291, "Bolivia", "Ascension", -15.7000000, -63.0833321, 259.0},
+       {1292, "Bolivia", "Mineros", -17.1166667, -63.2333336, 254.0},
+       {1293, "Bolivia", "Patacamaya", -17.2333333, -67.9166641, 3884.0},
+       {1294, "Bolivia", "Colchani", -20.3000000, -66.9333344, 3654.0},
+       {1295, "Bolivia", "Rurrenabaque", -14.4412467, -67.5278091, 251.0},
+       {1296, "Bolivia", "Portachuelo", -17.3500000, -63.4000015, 298.0},
+       {1297, "Bolivia", "Puerto Quijarro", -17.7833333, -57.7666664, 94.0},
+       {1298, "Bolivia", "Uyuni", -20.4666667, -66.8333359, 3650.0},
+       {1299, "Bolivia", "Robore", -18.3333333, -59.7500000, 311.0},
+       {1300, "Bolivia", "Pailon", -17.6500000, -62.7500000, 248.0},
+       {1301, "Bolivia", "Cliza", -17.6000000, -65.9333344, 2594.0},
+       {1302, "Bolivia", "Achacachi", -16.0500000, -68.6833344, 3855.0},
+       {1303, "Bolivia", "Vallegrande", -18.4897222, -64.1069412, 1985.0},
+       {1304, "Bolivia", "Monteagudo", -19.8166667, -63.9833336, 1120.0},
+       {1305, "Bolivia", "Aiquile", -18.1666667, -65.1666641, 2186.0},
+       {1306, "Bolivia", "Tarata", -17.6166667, -66.0166702, 2775.0},
+       {1307, "Bolivia", "Challapata", -18.9000000, -66.7666702, 3711.0},
+       {1308, "Bolivia", "San Julian", -17.7833333, -62.8666649, 302.0},
+       {1309, "Bolivia", "Reyes", -14.3166667, -67.3833313, 293.0},
+       {1310, "Bolivia", "Concepcion", -16.4333333, -60.9000015, 582.0},
+       {1311, "Bolivia", "San Ramon", -14.4833333, -63.1500015, 235.0},
+       {1312, "Bolivia", "San Matias", -16.3666667, -58.4000015, 172.0},
+       {1313, "Bolivia", "La Belgica", -17.5500000, -63.2166672, 347.0},
+       {1314, "Bolivia", "Capinota", -17.7166667, -66.2333298, 2409.0},
+       {1315, "Bolivia", "Chimore", -16.9833333, -65.1333313, 255.0},
+       {1316, "Bolivia", "San Pedro", -16.2333333, -68.8499985, 3823.0},
+       {1317, "Bolivia", "Okinawa Numero Uno", -17.2333333, -62.8166656, 234.0},
+       {1318, "Bolivia", "Betanzos", -19.5505556, -65.4533310, 3325.0},
+       {1319, "Bolivia", "Camargo", -20.6500000, -65.2166672, 2698.0},
+       {1320, "Bolivia", "Copacabana", -16.1500000, -69.0833359, 3949.0},
+       {1321, "Bolivia", "Santa Rosa", -14.1666667, -66.8833313, 208.0},
+       {1322, "Bolivia", "Comarapa", -17.9000000, -64.4833298, 1887.0},
+       {1323, "Bolivia", "San Ramon", -13.2833333, -64.7166672, 198.0},
+       {1324, "Bolivia", "Mairana", -18.1166667, -63.9333344, 1533.0},
+       {1325, "Bolivia", "Buena Vista", -17.4500000, -63.6666679, 357.0},
+       {1326, "Bolivia", "San Carlos", -17.4000000, -63.7500000, 311.0},
+       {1327, "Bolivia", "Jorochito", -18.0500000, -63.4333344, 601.0},
+       {1328, "Bolivia", "Colquiri", -17.4166667, -67.1333313, 4330.0},
+       {1329, "Bolivia", "Colomi", -17.3500000, -65.8666687, 3443.0},
+       {1330, "Bolivia", "Arani", -17.5666667, -65.7666702, 2760.0},
+       {1331, "Bolivia", "Sipe Sipe", -17.4500000, -66.3833313, 2686.0},
+       {1332, "Bolivia", "San Juan del Surutu", -17.4833333, -63.7000008, 355.0},
+       {1333, "Bolivia", "Huatajata", -16.2000000, -68.6833344, 3955.0},
+       {1334, "Bolivia", "Limoncito", -18.0166667, -63.4000015, 589.0},
+       {1335, "Bolivia", "Samaipata", -18.1500000, -63.8666649, 1870.0},
+       {1336, "Bolivia", "Urubicha", -15.3833333, -62.9500008, 245.0},
+       {1337, "Bolivia", "San Pablo", -16.2166667, -68.8333359, 3823.0},
+       {1338, "Bolivia", "Lahuachaca", -17.3666667, -67.6666641, 3906.0},
+       {1339, "Bolivia", "Boyuibe", -20.4166667, -63.2833328, 898.0},
+       {1340, "Bolivia", "Los Negros", -17.7333333, -63.4333344, 477.0},
+       {1341, "Bolivia", "Tiahuanaco", -16.5500000, -68.6999969, 3846.0},
+       {1342, "Bolivia", "Charagua", -19.8000000, -63.2166672, 808.0},
+       {1343, "Bolivia", "San Pedro", -18.2833333, -59.8166656, 307.0},
+       {1344, "Bolivia", "Irpa Irpa", -17.7166667, -66.2666702, 2417.0},
+       {1345, "Bolivia", "Chulumani", -16.4096164, -67.5262680, 1691.0},
+       {1346, "Bolivia", "Padilla", -19.3000000, -64.3000031, 2116.0},
+       {1347, "Bolivia", "Mizque", -17.9333333, -65.3166656, 2012.0},
+       {1348, "Bolivia", "Entre Rios", -21.5333333, -64.1999969, 1392.0},
+       {1349, "Bolivia", "Puesto de Pailas", -17.6500000, -62.7999992, 253.0},
+       {1350, "Bolivia", "Mapiri", -15.2500000, -68.1666641, 534.0},
+       {1351, "Bolivia", "Isla del Sol", -16.0166667, -69.1500015, 3827.0},
+       {1352, "Bolivia", "Santa Rita", -17.9666667, -63.3499985, 600.0},
+       {1353, "Bolivia", "Santa Barbara", -20.9166667, -66.0500031, 4824.0},
+       {1354, "Bolivia", "Tarabuco", -19.1666667, -64.9166641, 3294.0},
+       {1355, "Bolivia", "Abapo", -18.8333333, -63.4666672, 910.0},
+       {1356, "Bolivia", "Quime", -16.9833333, -67.2166672, 3335.0},
+       {1357, "Bolivia", "Tomas Barron", -17.5833333, -67.5166702, 3770.0},
+       {1358, "Bolivia", "Coroico", -16.1888920, -67.7271347, 1471.0},
+       {1359, "Bolivia", "Sorata", -15.7666667, -68.6333313, 4391.0},
+       {1360, "Bolivia", "Coripata", -16.3000000, -67.5999985, 1624.0},
+       {1361, "Bolivia", "Machacamarca", -18.1666667, -67.0333328, 3690.0},
+       {1362, "Bolivia", "Viloco", -16.9500000, -67.5500031, 3991.0},
+       {1363, "Bolivia", "Atocha", -20.9333333, -66.2333298, 3733.0},
+       {1364, "Bolivia", "Poopo", -18.3666667, -66.9666672, 3724.0},
+       {1365, "Bosnia and Herzegovina", "Sarajevo", 43.8500000, 18.3833332, 545.0},
+       {1366, "Bosnia and Herzegovina", "Banja Luka", 44.7758333, 17.1855564, 158.0},
+       {1367, "Bosnia and Herzegovina", "Zenica", 44.2013889, 17.9063892, 317.0},
+       {1368, "Bosnia and Herzegovina", "Tuzla", 44.5427778, 18.6694450, 274.0},
+       {1369, "Bosnia and Herzegovina", "Mostar", 43.3433333, 17.8080559, 55.0},
+       {1370, "Bosnia and Herzegovina", "Bihac", 44.8169444, 15.8708334, 218.0},
+       {1371, "Bosnia and Herzegovina", "Bugojno", 44.0572222, 17.4508324, 549.0},
+       {1372, "Bosnia and Herzegovina", "Brcko", 44.8727778, 18.8083324, 93.0},
+       {1373, "Bosnia and Herzegovina", "Bijeljina", 44.7569444, 19.2161102, 91.0},
+       {1374, "Bosnia and Herzegovina", "Prijedor", 44.9813889, 16.7130547, 134.0},
+       {1375, "Bosnia and Herzegovina", "Trebinje", 42.7119444, 18.3441658, 283.0},
+       {1376, "Bosnia and Herzegovina", "Travnik", 44.2266667, 17.6705551, 575.0},
+       {1377, "Bosnia and Herzegovina", "Doboj", 44.7347222, 18.0877781, 140.0},
+       {1378, "Bosnia and Herzegovina", "Cazin", 44.9669444, 15.9430552, 424.0},
+       {1379, "Bosnia and Herzegovina", "Velika Kladusa", 45.1894444, 15.8116665, 141.0},
+       {1380, "Bosnia and Herzegovina", "Visoko", 43.9888889, 18.1780548, 417.0},
+       {1381, "Bosnia and Herzegovina", "Gorazde", 43.6669444, 18.9763889, 343.0},
+       {1382, "Bosnia and Herzegovina", "Konjic", 43.6519444, 17.9613895, 408.0},
+       {1383, "Bosnia and Herzegovina", "Gracanica", 44.7033333, 18.3097229, 277.0},
+       {1384, "Bosnia and Herzegovina", "Gradacac", 44.8808333, 18.4269447, 165.0},
+       {1385, "Bosnia and Herzegovina", "Bosanska Krupa", 44.8825000, 16.1513882, 151.0},
+       {1386, "Bosnia and Herzegovina", "Mrkonjic Grad", 44.4158333, 17.0861111, 573.0},
+       {1387, "Bosnia and Herzegovina", "Foca", 43.5050000, 18.7786102, 443.0},
+       {1388, "Bosnia and Herzegovina", "Zavidovici", 44.4458333, 18.1497231, 217.0},
+       {1389, "Bosnia and Herzegovina", "Zivinice", 44.4494444, 18.6497231, 210.0},
+       {1390, "Bosnia and Herzegovina", "Sanski Most", 44.7652778, 16.6655560, 161.0},
+       {1391, "Bosnia and Herzegovina", "Bosanska Gradiska", 45.1411111, 17.2500000, 94.0},
+       {1392, "Bosnia and Herzegovina", "Bileca", 42.8719444, 18.4297218, 522.0},
+       {1393, "Bosnia and Herzegovina", "Kakanj", 44.1272222, 18.1180553, 461.0},
+       {1394, "Bosnia and Herzegovina", "Livno", 43.8269444, 17.0077782, 815.0},
+       {1395, "Bosnia and Herzegovina", "Odzak", 45.0111111, 18.3266659, 94.0},
+       {1396, "Bosnia and Herzegovina", "Stijena", 44.9352778, 16.0172215, 416.0},
+       {1397, "Bosnia and Herzegovina", "Sipovo", 44.2813889, 17.0838890, 447.0},
+       {1398, "Bosnia and Herzegovina", "Prozor", 43.8222222, 17.6091671, 746.0},
+       {1399, "Bosnia and Herzegovina", "Novi Travnik", 44.1711111, 17.6574993, 518.0},
+       {1400, "Bosnia and Herzegovina", "Ljubuski", 43.1969444, 17.5450001, 111.0},
+       {1401, "Bosnia and Herzegovina", "Bosanska Dubica", 45.1766667, 16.8094444, 104.0},
+       {1402, "Bosnia and Herzegovina", "Derventa", 44.9772222, 17.9102783, 122.0},
+       {1403, "Bosnia and Herzegovina", "Jajce", 44.3422222, 17.2655563, 420.0},
+       {1404, "Bosnia and Herzegovina", "Todorovo", 45.0883333, 15.9308329, 301.0},
+       {1405, "Bosnia and Herzegovina", "Siroki Brijeg", 43.3833333, 17.5927773, 313.0},
+       {1406, "Bosnia and Herzegovina", "Bosanski Brod", 45.1375000, 17.9897213, 82.0},
+       {1407, "Bosnia and Herzegovina", "Bosanski Novi", 45.0458333, 16.3802776, 179.0},
+       {1408, "Bosnia and Herzegovina", "Sokolac", 43.9397222, 18.8016663, 891.0},
+       {1409, "Bosnia and Herzegovina", "Mionica", 44.8672222, 18.4630547, 167.0},
+       {1410, "Bosnia and Herzegovina", "Zepce", 44.4266667, 18.0377769, 232.0},
+       {1411, "Bosnia and Herzegovina", "Kiseljak", 43.9425000, 18.0766659, 509.0},
+       {1412, "Bosnia and Herzegovina", "Potoci", 43.4086111, 17.8786106, 111.0},
+       {1413, "Bosnia and Herzegovina", "Fojnica", 43.9625000, 17.8983326, 583.0},
+       {1414, "Bosnia and Herzegovina", "Milici", 44.1711111, 19.0902786, 390.0},
+       {1415, "Bosnia and Herzegovina", "Vogosca", 43.9019444, 18.3480549, 549.0},
+       {1416, "Bosnia and Herzegovina", "Vitez", 44.1544444, 17.7902775, 406.0},
+       {1417, "Bosnia and Herzegovina", "Zvornik", 44.3869444, 19.1013889, 239.0},
+       {1418, "Bosnia and Herzegovina", "Donji Vakuf", 44.1436111, 17.3999996, 563.0},
+       {1419, "Bosnia and Herzegovina", "Capljina", 43.1213889, 17.6844444, 118.0},
+       {1420, "Bosnia and Herzegovina", "Tomislavgrad", 43.7180556, 17.2266674, 884.0},
+       {1421, "Bosnia and Herzegovina", "Stolac", 43.0844444, 17.9575005, 137.0},
+       {1422, "Bosnia and Herzegovina", "Trn", 44.8597222, 17.2363892, 136.0},
+       {1423, "Bosnia and Herzegovina", "Tesanj", 44.6116667, 17.9872227, 271.0},
+       {1424, "Bosnia and Herzegovina", "Pale", 43.8161111, 18.5694447, 845.0},
+       {1425, "Bosnia and Herzegovina", "Maglaj", 44.5491667, 18.0966663, 216.0},
+       {1426, "Bosnia and Herzegovina", "Srbac", 45.0977778, 17.5249996, 132.0},
+       {1427, "Bosnia and Herzegovina", "Nevesinje", 43.2586111, 18.1133327, 871.0},
+       {1428, "Bosnia and Herzegovina", "Divicani", 44.3666667, 17.3261108, 558.0},
+       {1429, "Bosnia and Herzegovina", "Kljuc", 44.5350000, 16.7722225, 314.0},
+       {1430, "Bosnia and Herzegovina", "Buzim", 45.0547222, 16.0319443, 274.0},
+       {1431, "Bosnia and Herzegovina", "Banovici", 44.4052778, 18.5241661, 368.0},
+       {1432, "Bosnia and Herzegovina", "Vares", 44.1644444, 18.3283329, 1019.0},
+       {1433, "Bosnia and Herzegovina", "Hadzici", 43.8222222, 18.2066669, 584.0},
+       {1434, "Bosnia and Herzegovina", "Prnjavor", 44.8702778, 17.6627769, 174.0},
+       {1435, "Bosnia and Herzegovina", "Gornji Vakuf", 43.9380556, 17.5883331, 694.0},
+       {1436, "Bosnia and Herzegovina", "Skender Vakuf", 44.4908333, 17.3775005, 881.0},
+       {1437, "Bosnia and Herzegovina", "Vrnograc", 45.1636111, 15.9536114, 191.0},
+       {1438, "Bosnia and Herzegovina", "Kladanj", 44.2263889, 18.6913891, 567.0},
+       {1439, "Bosnia and Herzegovina", "Srebrenik", 44.7077778, 18.4880562, 196.0},
+       {1440, "Bosnia and Herzegovina", "Celinac", 44.7227778, 17.3277779, 237.0},
+       {1441, "Bosnia and Herzegovina", "Podzvizd", 45.1741667, 15.8736115, 226.0},
+       {1442, "Bosnia and Herzegovina", "Trzacka Rastela", 44.9733333, 15.7902775, 268.0},
+       {1443, "Bosnia and Herzegovina", "Otoka", 44.9600000, 16.1791668, 138.0},
+       {1444, "Bosnia and Herzegovina", "Tojsici", 44.5011111, 18.7855549, 386.0},
+       {1445, "Bosnia and Herzegovina", "Varoska Rijeka", 45.0847222, 16.0141659, 213.0},
+       {1446, "Bosnia and Herzegovina", "Pecigrad", 45.0544444, 15.8969440, 316.0},
+       {1447, "Bosnia and Herzegovina", "Omarska", 44.8900000, 16.8991661, 156.0},
+       {1448, "Bosnia and Herzegovina", "Laktasi", 44.9080556, 17.3008327, 121.0},
+       {1449, "Bosnia and Herzegovina", "Gromiljak", 43.9666667, 18.0530548, 503.0},
+       {1450, "Bosnia and Herzegovina", "Kovaci", 44.4491667, 18.2049999, 273.0},
+       {1451, "Bosnia and Herzegovina", "Teslic", 44.6063889, 17.8597221, 213.0},
+       {1452, "Bosnia and Herzegovina", "Sekovici", 44.2986111, 18.8527775, 328.0},
+       {1453, "Bosnia and Herzegovina", "Jablanica", 43.6602778, 17.7616673, 279.0},
+       {1454, "Bosnia and Herzegovina", "Visegrad", 43.7847222, 19.2991676, 389.0},
+       {1455, "Bosnia and Herzegovina", "Mala Kladusa", 45.1341667, 15.8586111, 206.0},
+       {1456, "Bosnia and Herzegovina", "Kalenderovci Donji", 44.9450000, 17.8338890, 148.0},
+       {1457, "Bosnia and Herzegovina", "Ilijas", 43.9508333, 18.2708340, 467.0},
+       {1458, "Bosnia and Herzegovina", "Gostovici", 44.4150000, 18.1583328, 305.0},
+       {1459, "Bosnia and Herzegovina", "Podhum", 43.7230556, 17.0011120, 774.0},
+       {1460, "Bosnia and Herzegovina", "Crnici", 43.1288889, 17.8666668, 211.0},
+       {1461, "Bosnia and Herzegovina", "Zeljezno Polje", 44.4083333, 17.9319439, 518.0},
+       {1462, "Bosnia and Herzegovina", "Citluk", 43.2286111, 17.7008324, 242.0},
+       {1463, "Bosnia and Herzegovina", "Blatnica", 44.4863889, 17.8233337, 446.0},
+       {1464, "Bosnia and Herzegovina", "Tesanjka", 44.6730556, 18.0127773, 193.0},
+       {1465, "Brazil", "Sao Paulo", -23.5475000, -46.6361122, 631.0},
+       {1466, "Brazil", "Rio de Janeiro", -22.9027778, -43.2075005, 19.0},
+       {1467, "Brazil", "Salvador", -12.9711111, -38.5108337, 1.0},
+       {1468, "Brazil", "Fortaleza", -3.7172222, -38.5430565, 1.0},
+       {1469, "Brazil", "Belo Horizonte", -19.9208333, -43.9377785, 877.0},
+       {1470, "Brazil", "Brasilia", -15.7797200, -47.9297218, 1092.0},
+       {1471, "Brazil", "Curitiba", -25.4277778, -49.2730560, 913.0},
+       {1472, "Brazil", "Manaus", -3.1019444, -60.0250015, 37.0},
+       {1473, "Brazil", "Recife", -8.0538889, -34.8811111, 1.0},
+       {1474, "Brazil", "Belem", -1.4558333, -48.5044441, 1.0},
+       {1475, "Brazil", "Porto Alegre", -30.0330556, -51.2299995, 1.0},
+       {1476, "Brazil", "Goiania", -16.6786111, -49.2538872, 790.0},
+       {1477, "Brazil", "Guarulhos", -23.4627778, -46.5333328, 704.0},
+       {1478, "Brazil", "Campinas", -22.9055556, -47.0608330, 670.0},
+       {1479, "Brazil", "Nova Iguacu", -22.7591667, -43.4511108, 154.0},
+       {1480, "Brazil", "Maceio", -9.6658333, -35.7352791, 1.0},
+       {1481, "Brazil", "Sao Luis", -2.5297222, -44.3027763, 1.0},
+       {1482, "Brazil", "Duque de Caxias", -22.7855556, -43.3116684, 7.0},
+       {1483, "Brazil", "Natal", -5.7950000, -35.2094460, 2.0},
+       {1484, "Brazil", "Teresina", -5.0891667, -42.8019447, 58.0},
+       {1485, "Brazil", "Sao Bernardo do Campo", -23.6938889, -46.5649986, 760.0},
+       {1486, "Brazil", "Campo Grande", -20.4427778, -54.6463890, 602.0},
+       {1487, "Brazil", "Jaboatao", -8.1802778, -35.0013885, 62.0},
+       {1488, "Brazil", "Osasco", -23.5325000, -46.7916679, 633.0},
+       {1489, "Brazil", "Santo Andre", -23.6638889, -46.5383339, 765.0},
+       {1490, "Brazil", "Joao Pessoa", -7.1150000, -34.8630562, 3.0},
+       {1491, "Brazil", "Jaboatao dos Guararapes", -8.1127778, -35.0147209, 12.0},
+       {1492, "Brazil", "Contagem", -19.9316667, -44.0536118, 878.0},
+       {1493, "Brazil", "Sao Jose dos Campos", -23.1794444, -45.8869438, 572.0},
+       {1494, "Brazil", "Uberlandia", -18.9186111, -48.2772217, 690.0},
+       {1495, "Brazil", "Sorocaba", -23.5016667, -47.4580574, 601.0},
+       {1496, "Brazil", "Ribeirao Preto", -21.1775000, -47.8102760, 593.0},
+       {1497, "Brazil", "Cuiaba", -15.5961111, -56.0966682, 173.0},
+       {1498, "Brazil", "Aracaju", -10.9111111, -37.0716667, 5.0},
+       {1499, "Brazil", "Feira de Santana", -12.2666667, -38.9666672, 166.0},
+       {1500, "Brazil", "Londrina", -23.3102778, -51.1627769, 563.0},
+       {1501, "Brazil", "Juiz de Fora", -21.7641667, -43.3502769, 678.0},
+       {1502, "Brazil", "Belford Roxo", -22.7641667, -43.3994446, 26.0},
+       {1503, "Brazil", "Joinville", -26.3044444, -48.8455544, 167.0},
+       {1504, "Brazil", "Niteroi", -22.8833333, -43.1036110, 8.0},
+       {1505, "Brazil", "Sao Joao de Meriti", -22.8038889, -43.3722229, 27.0},
+       {1506, "Brazil", "Ananindeua", -1.3655556, -48.3722229, 12.0},
+       {1507, "Brazil", "Florianopolis", -27.5966667, -48.5491676, 149.0},
+       {1508, "Brazil", "Santos", -23.9608333, -46.3336105, 2.0},
+       {1509, "Brazil", "Ribeirao das Neves", -19.7669444, -44.0866661, 905.0},
+       {1510, "Brazil", "Vila Velha", -20.3297222, -40.2924995, 1.0},
+       {1511, "Brazil", "Serra", -20.1286111, -40.3077774, 70.0},
+       {1512, "Brazil", "Diadema", -23.6861111, -46.6227760, 723.0},
+       {1513, "Brazil", "Campos", -21.7500000, -41.2999992, 1.0},
+       {1514, "Brazil", "Maua", -23.6677778, -46.4613876, 763.0},
+       {1515, "Brazil", "Betim", -19.9677778, -44.1983337, 800.0},
+       {1516, "Brazil", "Caxias do Sul", -29.1680556, -51.1794434, 737.0},
+       {1517, "Brazil", "Sao Jose do Rio Preto", -20.8197222, -49.3794441, 457.0},
+       {1518, "Brazil", "Olinda", -8.0088889, -34.8552780, 2.0},
+       {1519, "Brazil", "Carapicuiba", -23.5225000, -46.8355560, 630.0},
+       {1520, "Brazil", "Campina Grande", -7.2305556, -35.8811111, 445.0},
+       {1521, "Brazil", "Piracicaba", -22.7252778, -47.6491661, 532.0},
+       {1522, "Brazil", "Macapa", 0.0388889, -51.0663872, 1.0},
+       {1523, "Brazil", "Itaquaquecetuba", -23.4861111, -46.3483315, 674.0},
+       {1524, "Brazil", "Bauru", -22.3147222, -49.0605545, 534.0},
+       {1525, "Brazil", "Montes Claros", -16.7350000, -43.8616676, 750.0},
+       {1526, "Brazil", "Canoas", -29.9177778, -51.1836128, 19.0},
+       {1527, "Brazil", "Moji das Cruzes", -23.5227778, -46.1883316, 710.0},
+       {1528, "Brazil", "Sao Vicente", -23.9630556, -46.3919449, 1.0},
+       {1529, "Brazil", "Jundiai", -23.1863889, -46.8841667, 1006.0},
+       {1530, "Brazil", "Pelotas", -31.7719444, -52.3424988, 7.0},
+       {1531, "Brazil", "Anapolis", -16.3266667, -48.9527779, 917.0},
+       {1532, "Brazil", "Vitoria", -20.3194444, -40.3377762, 12.0},
+       {1533, "Brazil", "Maringa", -23.4252778, -51.9386101, 444.0},
+       {1534, "Brazil", "Guaruja", -23.9930556, -46.2563896, 1.0},
+       {1535, "Brazil", "Porto Velho", -8.7619444, -63.9038887, 86.0},
+       {1536, "Brazil", "Franca", -20.5386111, -47.4008331, 920.0},
+       {1537, "Brazil", "Blumenau", -26.9194444, -49.0661125, 136.0},
+       {1538, "Brazil", "Foz do Iguacu", -25.5477778, -54.5880547, 174.0},
+       {1539, "Brazil", "Ponta Grossa", -25.0950000, -50.1619453, 913.0},
+       {1540, "Brazil", "Paulista", -7.9408333, -34.8730545, 23.0},
+       {1541, "Brazil", "Limeira", -22.5647222, -47.4016685, 610.0},
+       {1542, "Brazil", "Viamao", -30.0811111, -51.0233345, 51.0},
+       {1543, "Brazil", "Suzano", -23.5425000, -46.3108330, 704.0},
+       {1544, "Brazil", "Caucaia", -3.7361111, -38.6530571, 20.0},
+       {1545, "Brazil", "Petropolis", -22.5050000, -43.1786118, 883.0},
+       {1546, "Brazil", "Uberaba", -19.7483333, -47.9319458, 750.0},
+       {1547, "Brazil", "Rio Branco", -9.9747222, -67.8099976, 157.0},
+       {1548, "Brazil", "Cascavel", -24.9558333, -53.4552765, 647.0},
+       {1549, "Brazil", "Novo Hamburgo", -29.6783333, -51.1305542, 97.0},
+       {1550, "Brazil", "Vitoria da Conquista", -14.8661111, -40.8394432, 947.0},
+       {1551, "Brazil", "Barueri", -23.5105556, -46.8761101, 647.0},
+       {1552, "Brazil", "Taubate", -23.0263889, -45.5552788, 578.0},
+       {1553, "Brazil", "Governador Valadares", -18.8511111, -41.9494438, 132.0},
+       {1554, "Brazil", "Praia Grande", -24.0058333, -46.4027786, 8.0},
+       {1555, "Brazil", "Varzea Grande", -15.6466667, -56.1324997, 142.0},
+       {1556, "Brazil", "Volta Redonda", -22.5230556, -44.1041679, 279.0},
+       {1557, "Brazil", "Santa Maria", -29.6841667, -53.8069458, 136.0},
+       {1558, "Brazil", "Santa Luzia", -19.7697222, -43.8513870, 807.0},
+       {1559, "Brazil", "Gravatai", -29.9444444, -50.9919434, 75.0},
+       {1560, "Brazil", "Caruaru", -8.2833333, -35.9761124, 494.0},
+       {1561, "Brazil", "Boa Vista", 2.8197222, -60.6733322, 76.0},
+       {1562, "Brazil", "Ipatinga", -19.4683333, -42.5366669, 213.0},
+       {1563, "Brazil", "Sumare", -22.8219444, -47.2669449, 610.0},
+       {1564, "Brazil", "Juazeiro do Norte", -7.2130556, -39.3152771, 590.0},
+       {1565, "United Kingdom", "London", 51.5084153, -0.1255327, 21.0},
+       {1566, "United Kingdom", "Birmingham", 52.4666667, -1.9166667, 140.0},
+       {1567, "United Kingdom", "Glasgow", 55.8333333, -4.2500000, 66.0},
+       {1568, "United Kingdom", "Liverpool", 53.4166667, -3.0000000, 6.0},
+       {1569, "United Kingdom", "Leeds", 53.7964813, -1.5478492, 67.0},
+       {1570, "United Kingdom", "Sheffield", 53.3829700, -1.4659023, 76.0},
+       {1571, "United Kingdom", "Edinburgh", 55.9500000, -3.2000000, 32.0},
+       {1572, "United Kingdom", "Bristol", 51.4500000, -2.5833333, 47.0},
+       {1573, "United Kingdom", "Manchester", 53.4809464, -2.2374344, 60.0},
+       {1574, "United Kingdom", "Leicester", 52.6333333, -1.1333333, 76.0},
+       {1575, "United Kingdom", "Coventry", 52.4065556, -1.5121651, 76.0},
+       {1576, "United Kingdom", "Kingston upon Hull", 53.7445995, -0.3352547, 1.0},
+       {1577, "United Kingdom", "Cardiff", 51.4800000, -3.1800001, 6.0},
+       {1578, "United Kingdom", "Bradford", 53.7833333, -1.7500000, 152.0},
+       {1579, "United Kingdom", "Belfast", 54.5833333, -5.9333334, 9.0},
+       {1580, "United Kingdom", "Stoke-on-Trent", 53.0000000, -2.1833334, 132.0},
+       {1581, "United Kingdom", "Wolverhampton", 52.5833333, -2.1333332, 152.0},
+       {1582, "United Kingdom", "Plymouth", 50.3715254, -4.1430473, 10.0},
+       {1583, "United Kingdom", "Nottingham", 52.9536023, -1.1504745, 61.0},
+       {1584, "United Kingdom", "Southampton", 50.9000000, -1.4000000, -9999.0},
+       {1585, "United Kingdom", "Reading", 51.4333333, -1.0000000, 51.0},
+       {1586, "United Kingdom", "Derby", 52.9333333, -1.5000000, 67.0},
+       {1587, "United Kingdom", "Dudley", 52.5000000, -2.0833333, 152.0},
+       {1588, "United Kingdom", "Northampton", 52.2500000, -0.8833333, 80.0},
+       {1589, "United Kingdom", "Portsmouth", 50.8090806, -1.0714245, 1.0},
+       {1590, "United Kingdom", "Luton", 51.8833333, -0.4166667, 130.0},
+       {1591, "United Kingdom", "Newcastle upon Tyne", 54.9732787, -1.6139603, 20.0},
+       {1592, "United Kingdom", "Preston", 53.7666667, -2.7166667, 26.0},
+       {1593, "United Kingdom", "Milton Keynes", 52.0417219, -0.7558250, 78.0},
+       {1594, "United Kingdom", "Aberdeen", 57.1333333, -2.0999999, 36.0},
+       {1595, "United Kingdom", "Sunderland", 54.9046457, -1.3822174, 9.0},
+       {1596, "United Kingdom", "Norwich", 52.6278273, 1.2983394, 9.0},
+       {1597, "United Kingdom", "Walsall", 52.6000000, -2.0000000, 142.0},
+       {1598, "United Kingdom", "Swansea", 51.6207877, -3.9432335, 1.0},
+       {1599, "United Kingdom", "Bournemouth", 50.7166667, -1.8833333, 1.0},
+       {1600, "United Kingdom", "Southend-on-Sea", 51.5378207, 0.7143259, 1.0},
+       {1601, "United Kingdom", "Swindon", 51.5166667, -1.7833333, 153.0},
+       {1602, "United Kingdom", "Oxford", 51.7522210, -1.2559605, 66.0},
+       {1603, "United Kingdom", "Dundee", 56.5000000, -2.9666667, 76.0},
+       {1604, "United Kingdom", "Poole", 50.7166667, -2.0000000, 1.0},
+       {1605, "United Kingdom", "Huddersfield", 53.6500000, -1.7833333, 84.0},
+       {1606, "United Kingdom", "York", 53.9666667, -1.0833333, 14.0},
+       {1607, "United Kingdom", "Ipswich", 52.0546544, 1.1569977, 6.0},
+       {1608, "United Kingdom", "Blackpool", 53.8166667, -3.0500000, 1.0},
+       {1609, "United Kingdom", "Middlesbrough", 54.5727778, -1.1627778, 32.0},
+       {1610, "United Kingdom", "Bolton", 53.5833333, -2.4333334, 75.0},
+       {1611, "United Kingdom", "Peterborough", 52.5833333, -0.2500000, 28.0},
+       {1612, "United Kingdom", "Stockport", 53.4097877, -2.1576118, 72.0},
+       {1613, "United Kingdom", "Brighton", 50.8283849, -0.1394749, 22.0},
+       {1614, "United Kingdom", "West Bromwich", 52.5166667, -2.0000000, 154.0},
+       {1615, "United Kingdom", "Slough", 51.5000000, -0.5833333, 34.0},
+       {1616, "United Kingdom", "Gloucester", 51.8656801, -2.2430992, 72.0},
+       {1617, "United Kingdom", "Cambridge", 52.2000000, 0.1166667, 38.0},
+       {1618, "United Kingdom", "Watford", 51.6553059, -0.3960228, 70.0},
+       {1619, "United Kingdom", "Rotherham", 53.4333333, -1.3500000, 71.0},
+       {1620, "United Kingdom", "Newport", 51.5877364, -2.9983504, 1.0},
+       {1621, "United Kingdom", "Exeter", 50.7235979, -3.5275073, 43.0},
+       {1622, "United Kingdom", "Eastbourne", 50.7687108, 0.2845287, 1.0},
+       {1623, "United Kingdom", "Colchester", 51.8833333, 0.9000000, 5.0},
+       {1624, "United Kingdom", "Crawley", 51.1166667, -0.1833333, 75.0},
+       {1625, "United Kingdom", "Sutton Coldfield", 52.5651864, -1.8223572, 128.0},
+       {1626, "United Kingdom", "Blackburn", 53.7500000, -2.4833333, 149.0},
+       {1627, "United Kingdom", "Oldham", 53.5405114, -2.1183014, 184.0},
+       {1628, "United Kingdom", "Woking", 51.3190263, -0.5589294, 40.0},
+       {1629, "United Kingdom", "Cheltenham", 51.9000000, -2.0833333, 72.0},
+       {1630, "United Kingdom", "Chelmsford", 51.7333333, 0.4833333, 38.0},
+       {1631, "United Kingdom", "Saint Helens", 53.4500000, -2.7333333, 22.0},
+       {1632, "United Kingdom", "Basildon", 51.5666667, 0.4666667, 66.0},
+       {1633, "United Kingdom", "Gillingham", 51.3891373, 0.5486298, 24.0},
+       {1634, "United Kingdom", "Worcester", 52.1893517, -2.2200108, 71.0},
+       {1635, "United Kingdom", "Worthing", 50.8114669, -0.3716469, -9999.0},
+       {1636, "United Kingdom", "Rochdale", 53.6166667, -2.1500001, 140.0},
+       {1637, "United Kingdom", "Basingstoke", 51.2666667, -1.0833333, 78.0},
+       {1638, "United Kingdom", "Solihull", 52.4166667, -1.7833333, 109.0},
+       {1639, "United Kingdom", "Harlow", 51.7833333, 0.1666667, 77.0},
+       {1640, "United Kingdom", "Bath", 51.3794444, -2.3655555, 74.0},
+       {1641, "United Kingdom", "Southport", 53.6666667, -3.0000000, 1.0},
+       {1642, "United Kingdom", "Maidstone", 51.2666667, 0.5166667, 56.0},
+       {1643, "United Kingdom", "Lincoln", 53.2333333, -0.5333333, 31.0},
+       {1644, "United Kingdom", "Hastings", 50.8529919, 0.5645943, 2.0},
+       {1645, "United Kingdom", "Darlington", 54.5333333, -1.5666667, 63.0},
+       {1646, "United Kingdom", "Londonderry County Borough", 54.9972135, -7.3091698, 28.0},
+       {1647, "United Kingdom", "Harrogate", 53.9833333, -1.5333333, 97.0},
+       {1648, "United Kingdom", "Hartlepool", 54.6861111, -1.2125000, 1.0},
+       {1649, "United Kingdom", "Bedford", 52.1345944, -0.4663181, 53.0},
+       {1650, "United Kingdom", "Hemel Hempstead", 51.7500000, -0.4666667, 99.0},
+       {1651, "United Kingdom", "Stevenage", 51.9166667, -0.2166667, 79.0},
+       {1652, "United Kingdom", "Saint Albans", 51.7500000, -0.3333333, 77.0},
+       {1653, "United Kingdom", "South Shields", 54.9877778, -1.4213889, 1.0},
+       {1654, "United Kingdom", "Weston-super-Mare", 51.3458333, -2.9677777, 70.0},
+       {1655, "United Kingdom", "Halifax", 53.7166667, -1.8500000, 188.0},
+       {1656, "United Kingdom", "Birkenhead", 53.4000000, -3.0333333, 15.0},
+       {1657, "United Kingdom", "Chester", 53.2000000, -2.9166667, 12.0},
+       {1658, "United Kingdom", "Warrington", 53.3833333, -2.5999999, 18.0},
+       {1659, "United Kingdom", "Wigan", 53.5333333, -2.6166668, 64.0},
+       {1660, "United Kingdom", "High Wycombe", 51.6333333, -0.7666667, 73.0},
+       {1661, "United Kingdom", "Stockton-on-Tees", 54.5833333, -1.4166667, 46.0},
+       {1662, "United Kingdom", "Wakefield", 53.6833141, -1.4976811, 53.0},
+       {1663, "United Kingdom", "Gateshead", 54.9450000, -1.6174999, 43.0},
+       {1664, "United Kingdom", "Lisburn", 54.5233730, -6.0352707, 27.0},
+       {1665, "Brunei", "Bandar Seri Begawan", 4.8833333, 114.9333344, 1.0},
+       {1666, "Brunei", "Kuala Belait", 4.5833333, 114.1833344, 1.0},
+       {1667, "Brunei", "Seria", 4.6166667, 114.3166656, 1.0},
+       {1668, "Brunei", "Tutong", 4.8000000, 114.6500015, 1.0},
+       {1669, "Brunei", "Bangar", 4.7166667, 115.0666656, 45.0},
+       {1670, "Bulgaria", "Sofia", 42.6975135, 23.3241463, 558.0},
+       {1671, "Bulgaria", "Plovdiv", 42.1500000, 24.7500000, 165.0},
+       {1672, "Bulgaria", "Varna", 43.2166667, 27.9166660, 95.0},
+       {1673, "Bulgaria", "Burgas", 42.5000000, 27.4666672, 31.0},
+       {1674, "Bulgaria", "Ruse", 43.8563889, 25.9708328, 30.0},
+       {1675, "Bulgaria", "Stara Zagora", 42.4327778, 25.6419449, 197.0},
+       {1676, "Bulgaria", "Pleven", 43.4166667, 24.6166668, 97.0},
+       {1677, "Bulgaria", "Sliven", 42.6858333, 26.3291664, 281.0},
+       {1678, "Bulgaria", "Dobrich", 43.5666667, 27.8333340, 210.0},
+       {1679, "Bulgaria", "Shumen", 43.2706437, 26.9228554, 228.0},
+       {1680, "Bulgaria", "Pernik", 42.6000000, 23.0333328, 751.0},
+       {1681, "Bulgaria", "Yambol", 42.4833333, 26.5000000, 115.0},
+       {1682, "Bulgaria", "Khaskovo", 41.9402778, 25.5694447, 197.0},
+       {1683, "Bulgaria", "Pazardzhik", 42.2000000, 24.3333340, 219.0},
+       {1684, "Bulgaria", "Gabrovo", 41.8927778, 22.9349995, 812.0},
+       {1685, "Bulgaria", "Blagoevgrad", 42.0166667, 23.1000004, 523.0},
+       {1686, "Bulgaria", "Veliko Turnovo", 43.0812389, 25.6290436, 162.0},
+       {1687, "Bulgaria", "Gabrovo", 42.8747222, 25.3341675, 604.0},
+       {1688, "Bulgaria", "Vratsa", 43.2100000, 23.5625000, 341.0},
+       {1689, "Bulgaria", "Tonchevtsi", 42.9000000, 25.3166676, 441.0},
+       {1690, "Bulgaria", "Kazanluk", 42.6166667, 25.3999996, 388.0},
+       {1691, "Bulgaria", "Vidin", 43.9900000, 22.8724995, 35.0},
+       {1692, "Bulgaria", "Asenovgrad", 42.0166667, 24.8666668, 253.0},
+       {1693, "Bulgaria", "Kyustendil", 42.2838889, 22.6911106, 482.0},
+       {1694, "Bulgaria", "Montana", 43.4125000, 23.2250004, 139.0},
+       {1695, "Bulgaria", "Dimitrovgrad", 42.0500000, 25.6000004, 126.0},
+       {1696, "Bulgaria", "Lovech", 43.1333333, 24.7166672, 201.0},
+       {1697, "Bulgaria", "Silistra", 44.1166667, 27.2666664, 1.0},
+       {1698, "Bulgaria", "Razgrad", 43.5333333, 26.5166664, 190.0},
+       {1699, "Bulgaria", "Turgovishte", 43.2591667, 26.5891666, 140.0},
+       {1700, "Bulgaria", "Dupnitsa", 42.2666667, 23.1166668, 522.0},
+       {1701, "Bulgaria", "Svishtov", 43.6230556, 25.3538895, 1.0},
+       {1702, "Bulgaria", "Smolyan", 41.5852778, 24.6919441, 1131.0},
+       {1703, "Bulgaria", "Petrich", 41.4000000, 23.2166672, 168.0},
+       {1704, "Bulgaria", "Samokov", 42.3333333, 23.5499992, 961.0},
+       {1705, "Bulgaria", "Lom", 43.8138889, 23.2361107, 21.0},
+       {1706, "Bulgaria", "Sandanski", 41.5666667, 23.2833328, 257.0},
+       {1707, "Bulgaria", "Sevlievo", 43.0258333, 25.1136112, 213.0},
+       {1708, "Bulgaria", "Nova Zagora", 42.4833333, 26.0166664, 127.0},
+       {1709, "Bulgaria", "Velingrad", 42.0166667, 24.0000000, 755.0},
+       {1710, "Bulgaria", "Cherven Bryag", 43.2666667, 24.1000004, 166.0},
+       {1711, "Bulgaria", "Troyan", 42.8942650, 24.7158909, 398.0},
+       {1712, "Bulgaria", "Aytos", 42.7000000, 27.2500000, 96.0},
+       {1713, "Bulgaria", "Botevgrad", 42.9000000, 23.7833328, 410.0},
+       {1714, "Bulgaria", "Gotse Delchev", 41.5666667, 23.7333336, 532.0},
+       {1715, "Bulgaria", "Karlovo", 42.6333333, 24.7999992, 387.0},
+       {1716, "Bulgaria", "Karnobat", 42.6500000, 26.9833336, 219.0},
+       {1717, "Bulgaria", "Panagyurishte", 42.5000000, 24.1833324, 535.0},
+       {1718, "Bulgaria", "Svilengrad", 41.7666667, 26.2000008, 51.0},
+       {1719, "Bulgaria", "Kharmanli", 41.9333333, 25.8999996, 61.0},
+       {1720, "Bulgaria", "Peshtera", 42.0333333, 24.2999992, 433.0},
+       {1721, "Bulgaria", "Chirpan", 42.2000000, 25.3333340, 183.0},
+       {1722, "Bulgaria", "Popovo", 43.3500000, 26.2333336, 207.0},
+       {1723, "Bulgaria", "Rakovski", 42.3000000, 24.9666672, 181.0},
+       {1724, "Bulgaria", "Berkovitsa", 43.2361111, 23.1258335, 369.0},
+       {1725, "Bulgaria", "Radomir", 42.5444444, 22.9577770, 661.0},
+       {1726, "Bulgaria", "Kozloduy", 43.7833333, 23.7333336, 31.0},
+       {1727, "Bulgaria", "Radnevo", 42.3000000, 25.9333324, 106.0},
+       {1728, "Bulgaria", "Ikhtiman", 42.4333333, 23.8166676, 659.0},
+       {1729, "Bulgaria", "Tryavna", 42.8666667, 25.5000000, 504.0},
+       {1730, "Bulgaria", "Provadiya", 43.1833333, 27.4333324, 89.0},
+       {1731, "Bulgaria", "Pomorie", 42.5500000, 27.6499996, -9999.0},
+       {1732, "Bulgaria", "Byala Slatina", 43.4666667, 23.9333324, 112.0},
+       {1733, "Bulgaria", "Novi Pazar", 43.3500000, 27.2000008, 157.0},
+       {1734, "Bulgaria", "Balchik", 43.4166667, 28.1666660, 185.0},
+       {1735, "Bulgaria", "Razlog", 41.8863044, 23.4671402, 812.0},
+       {1736, "Bulgaria", "Pavlikeni", 43.2427778, 25.3219452, 179.0},
+       {1737, "Bulgaria", "Kostinbrod", 42.8166667, 23.2166672, 556.0},
+       {1738, "Bulgaria", "Stamboliyski", 42.1333333, 24.5333328, 185.0},
+       {1739, "Bulgaria", "Mezdra", 43.1500000, 23.7000008, 215.0},
+       {1740, "Bulgaria", "Levski", 43.3666667, 25.1333332, 55.0},
+       {1741, "Bulgaria", "Kavarna", 43.4333333, 28.3333340, 140.0},
+       {1742, "Bulgaria", "Elkhovo", 42.1666667, 26.5666676, 107.0},
+       {1743, "Bulgaria", "Etropole", 42.8333333, 24.0000000, 619.0},
+       {1744, "Bulgaria", "Teteven", 42.9166667, 24.2666664, 637.0},
+       {1745, "Bulgaria", "Tutrakan", 44.0500000, 26.6166668, 108.0},
+       {1746, "Bulgaria", "Lukovit", 43.2000000, 24.1666660, 172.0},
+       {1747, "Bulgaria", "Belene", 43.6500000, 25.1166668, 28.0},
+       {1748, "Bulgaria", "Isperikh", 43.7166667, 26.8333340, 253.0},
+       {1749, "Bulgaria", "Sredets", 42.3488889, 27.1941662, 47.0},
+       {1750, "Bulgaria", "Veliki Preslav", 43.1666667, 26.8166676, 102.0},
+       {1751, "Bulgaria", "Bansko", 41.8382986, 23.4885120, 916.0},
+       {1752, "Bulgaria", "Omurtag", 43.1000000, 26.4166660, 526.0},
+       {1753, "Bulgaria", "Kubrat", 43.8000000, 26.5000000, 202.0},
+       {1754, "Bulgaria", "Svoge", 42.9666667, 23.3500004, 669.0},
+       {1755, "Bulgaria", "Septemvri", 42.2166667, 24.1000004, 238.0},
+       {1756, "Bulgaria", "Krichim", 42.0500000, 24.4666672, 254.0},
+       {1757, "Bulgaria", "Lyaskovets", 43.1111111, 25.7283325, 138.0},
+       {1758, "Bulgaria", "Rakitovo", 41.9833333, 24.0833340, 849.0},
+       {1759, "Bulgaria", "Dryanovo", 42.9789697, 25.4784966, 285.0},
+       {1760, "Bulgaria", "Devnya", 43.2222222, 27.5694447, 49.0},
+       {1761, "Bulgaria", "Pirdop", 42.7000000, 24.1833324, 693.0},
+       {1762, "Bulgaria", "Lyubimets", 41.8333333, 26.0833340, 63.0},
+       {1763, "Bulgaria", "Beloslav", 43.1833333, 27.7000008, 75.0},
+       {1764, "Bulgaria", "Khisarya", 42.5000000, 24.7000008, 347.0},
+       {1765, "Bulgaria", "General-Toshevo", 43.7000000, 28.0333328, 235.0},
+       {1766, "Bulgaria", "Slivnitsa", 42.8500000, 23.0333328, 613.0},
+       {1767, "Bulgaria", "Vurshets", 43.1952778, 23.2861118, 408.0},
+       {1768, "Bulgaria", "Devin", 41.7432677, 24.4000340, 884.0},
+       {1769, "Bulgaria", "Simeonovgrad", 42.0333333, 25.8333340, 80.0},
+       {1770, "Myanmar", "Rangoon", 16.8052778, 96.1561127, 13.0},
+       {1771, "Myanmar", "Mandalay", 22.0000000, 96.0833359, 75.0},
+       {1772, "Myanmar", "Mawlamyine", 16.4913889, 97.6255569, 30.0},
+       {1773, "Myanmar", "Bago", 17.3366667, 96.4797211, 3.0},
+       {1774, "Myanmar", "Pathein", 16.7833333, 94.7333298, 12.0},
+       {1775, "Myanmar", "Monywa", 22.1166667, 95.1333313, 81.0},
+       {1776, "Myanmar", "Akyab", 20.1500000, 92.9000015, 1.0},
+       {1777, "Myanmar", "Meiktila", 20.8666667, 95.8666687, 225.0},
+       {1778, "Myanmar", "Myeik", 12.4333333, 98.5999985, 11.0},
+       {1779, "Myanmar", "Taunggyi", 20.7833333, 97.0333328, 1420.0},
+       {1780, "Myanmar", "Myingyan", 21.4666667, 95.3833313, 46.0},
+       {1781, "Myanmar", "Dawei", 14.0833333, 98.1999969, 5.0},
+       {1782, "Myanmar", "Prome", 18.8166667, 95.2166672, 21.0},
+       {1783, "Myanmar", "Hinthada", 17.6333333, 95.4666672, 8.0},
+       {1784, "Myanmar", "Lashio", 22.9333333, 97.7500000, 837.0},
+       {1785, "Myanmar", "Pakokku", 21.3333333, 95.0999985, 40.0},
+       {1786, "Myanmar", "Thaton", 16.9205556, 97.3713913, 20.0},
+       {1787, "Myanmar", "Maymyo", 22.0333333, 96.4666672, 1090.0},
+       {1788, "Myanmar", "Yenangyaung", 20.4666667, 94.8833313, 65.0},
+       {1789, "Myanmar", "Taungoo", 18.9333333, 96.4333344, 28.0},
+       {1790, "Myanmar", "Thayetmyo", 19.3166667, 95.1833344, 52.0},
+       {1791, "Myanmar", "Pyinmana", 19.7333333, 96.2166672, 78.0},
+       {1792, "Myanmar", "Magway", 20.1500000, 94.9166641, 50.0},
+       {1793, "Myanmar", "Myitkyina", 25.3833333, 97.4000015, 158.0},
+       {1794, "Myanmar", "Chauk", 20.8833333, 94.8166656, 62.0},
+       {1795, "Myanmar", "Mogok", 22.9166667, 96.5000000, 1079.0},
+       {1796, "Myanmar", "Nyaunglebin", 17.9500000, 96.7333298, 11.0},
+       {1797, "Myanmar", "Mudon", 16.2577778, 97.7163925, 19.0},
+       {1798, "Myanmar", "Shwebo", 22.5666667, 95.6999969, 89.0},
+       {1799, "Myanmar", "Sagaing", 21.8787039, 95.9796524, 60.0},
+       {1800, "Myanmar", "Taungdwingyi", 20.0166667, 95.5500031, 138.0},
+       {1801, "Myanmar", "Syriam", 16.7722222, 96.2377777, -9999.0},
+       {1802, "Myanmar", "Bogale", 16.2833333, 95.4000015, 21.0},
+       {1803, "Myanmar", "Pyapon", 16.2833333, 95.6833344, 17.0},
+       {1804, "Myanmar", "Yamethin", 20.4333333, 96.1500015, 178.0},
+       {1805, "Myanmar", "Kanbe", 16.7052778, 96.0016632, 17.0},
+       {1806, "Myanmar", "Myaydo", 19.3666667, 95.2166672, 56.0},
+       {1807, "Myanmar", "Minbu", 20.1833333, 94.8833313, 39.0},
+       {1808, "Myanmar", "Tharyarwady", 17.6500000, 95.8000031, 21.0},
+       {1809, "Myanmar", "Thongwa", 16.7619444, 96.5277786, 5.0},
+       {1810, "Myanmar", "Kyaiklat", 16.4333333, 95.7333298, 8.0},
+       {1811, "Myanmar", "Maubin", 16.7333333, 95.6500015, 13.0},
+       {1812, "Myanmar", "Kyaukse", 21.6000000, 96.1333313, 77.0},
+       {1813, "Myanmar", "Kyaikto", 17.3000000, 97.0166702, 11.0},
+       {1814, "Myanmar", "Martaban", 16.5313889, 97.6111145, 43.0},
+       {1815, "Myanmar", "Kyaikkami", 16.0800000, 97.5674973, 24.0},
+       {1816, "Myanmar", "Bhamo", 24.2666667, 97.2333298, 110.0},
+       {1817, "Myanmar", "Twante", 16.7166667, 95.9333344, 13.0},
+       {1818, "Myanmar", "Mawlaik", 23.6333333, 94.4166641, 84.0},
+       {1819, "Myanmar", "Wakema", 16.6000000, 95.1833344, 5.0},
+       {1820, "Myanmar", "Myanaung", 18.2833333, 95.3166656, 27.0},
+       {1821, "Myanmar", "Pyu", 18.4833333, 96.4333344, 40.0},
+       {1822, "Myanmar", "Kayan", 16.9055556, 96.5630569, 5.0},
+       {1823, "Myanmar", "Nyaungdon", 17.0333333, 95.6500015, 16.0},
+       {1824, "Myanmar", "Mawlamyinegyunn", 16.3833333, 95.2666702, 7.0},
+       {1825, "Myanmar", "Thanatpin", 17.3000000, 96.5833359, 6.0},
+       {1826, "Myanmar", "Letpandan", 17.7833333, 95.7500000, 6.0},
+       {1827, "Myanmar", "Paungde", 18.4833333, 95.5000000, 26.0},
+       {1828, "Myanmar", "Loikaw", 19.6741667, 97.2094421, 872.0},
+       {1829, "Myanmar", "Falam", 22.9166667, 93.6833344, 1570.0},
+       {1830, "Myanmar", "Pagan", 21.1666667, 94.8666687, 53.0},
+       {1831, "Cambodia", "Phnom Penh", 11.5500000, 104.9166641, 16.0},
+       {1832, "Cambodia", "Kampong Saom", 10.6333333, 103.5000000, 20.0},
+       {1833, "Cambodia", "Batdambang", 13.1000000, 103.1999969, 40.0},
+       {1834, "Cambodia", "Siemreab", 13.3666667, 103.8499985, 15.0},
+       {1835, "Cambodia", "Kampong Chhnang", 12.2500000, 104.6666641, 17.0},
+       {1836, "Cambodia", "Kampong Cham", 12.0000000, 105.4499969, 21.0},
+       {1837, "Cambodia", "Pouthisat", 12.5333333, 103.9166641, 18.0},
+       {1838, "Cambodia", "Ta Khmau", 11.4833333, 104.9499969, 1.0},
+       {1839, "Cambodia", "Phumi Veal Sre", 10.9833333, 104.7833328, 8.0},
+       {1840, "Cambodia", "Kampong Spoe", 11.4500000, 104.5333328, 38.0},
+       {1841, "Cambodia", "Krong Kaoh Kong", 11.6175000, 102.9805527, 1.0},
+       {1842, "Cambodia", "Phnum Tbeng Meanchey", 13.8166667, 104.9666672, 47.0},
+       {1843, "Cambodia", "Sisophon", 13.5833333, 102.9833298, 17.0},
+       {1844, "Cambodia", "Kampot", 10.6166667, 104.1833344, 7.0},
+       {1845, "Cambodia", "Kracheh", 12.4833333, 106.0166702, 18.0},
+       {1846, "Cambodia", "Kampong Thum", 12.7000000, 104.9000015, 11.0},
+       {1847, "Cambodia", "Lumphat", 13.5000000, 106.9833298, 113.0},
+       {1848, "Cambodia", "Pailin", 12.8505556, 102.6097260, 170.0},
+       {1849, "Cambodia", "Krong Keb", 10.4833333, 104.3166656, -9999.0},
+       {1850, "Cambodia", "Senmonourom", 12.4500000, 107.1999969, 734.0},
+       {1851, "Cameroon", "Douala", 4.0502778, 9.6999998, 1.0},
+       {1852, "Cameroon", "Yaounde", 3.8666667, 11.5166664, 733.0},
+       {1853, "Cameroon", "Garoua", 9.3000000, 13.3999996, 166.0},
+       {1854, "Cameroon", "Kousseri", 12.0783333, 15.0308332, 276.0},
+       {1855, "Cameroon", "Bamenda", 5.9333333, 10.1666670, 1615.0},
+       {1856, "Cameroon", "Maroua", 10.5955556, 14.3247223, 383.0},
+       {1857, "Cameroon", "Bafoussam", 5.4666667, 10.4166670, 1498.0},
+       {1858, "Cameroon", "Mokolo", 10.7402778, 13.8027782, 761.0},
+       {1859, "Cameroon", "Ngaoundere", 7.3166667, 13.5833330, 1205.0},
+       {1860, "Cameroon", "Bertoua", 4.5833333, 13.6833334, 716.0},
+       {1861, "Cameroon", "Edea", 3.8000000, 10.1333332, 22.0},
+       {1862, "Cameroon", "Loum", 4.7161111, 9.7463884, 295.0},
+       {1863, "Cameroon", "Kumba", 4.6438889, 9.4386110, 280.0},
+       {1864, "Cameroon", "Nkongsamba", 4.9533333, 9.9324999, 855.0},
+       {1865, "Cameroon", "Mbouda", 5.6333333, 10.2500000, 1433.0},
+       {1866, "Cameroon", "Dschang", 5.4500000, 10.0666666, 1450.0},
+       {1867, "Cameroon", "Foumban", 5.7166667, 10.9166670, 1123.0},
+       {1868, "Cameroon", "Ebolowa", 2.9000000, 11.1499996, 637.0},
+       {1869, "Cameroon", "Guider", 9.9341667, 13.9486113, 375.0},
+       {1870, "Cameroon", "Foumbot", 5.5000000, 10.6333332, 1135.0},
+       {1871, "Cameroon", "Bafang", 5.1500000, 10.1833334, 1214.0},
+       {1872, "Cameroon", "Yagoua", 10.3427778, 15.2405558, 312.0},
+       {1873, "Cameroon", "Mbalmayo", 3.5166667, 11.5000000, 360.0},
+       {1874, "Cameroon", "Meiganga", 6.5166667, 14.3000002, 987.0},
+       {1875, "Cameroon", "Bali", 5.8833333, 10.0166664, 1416.0},
+       {1876, "Cameroon", "Limbe", 4.0127778, 9.2202778, 137.0},
+       {1877, "Cameroon", "Bafia", 4.7500000, 11.2333336, 473.0},
+       {1878, "Cameroon", "Wum", 6.3833333, 10.0666666, 1110.0},
+       {1879, "Cameroon", "Bangangte", 5.1500000, 10.5166664, 1338.0},
+       {1880, "Cameroon", "Tiko", 4.0786111, 9.3680553, 79.0},
+       {1881, "Cameroon", "Kribi", 2.9500000, 9.9166670, 14.0},
+       {1882, "Cameroon", "Mora", 11.0425000, 14.1447220, 456.0},
+       {1883, "Cameroon", "Sangmelima", 2.9333333, 11.9833336, 542.0},
+       {1884, "Cameroon", "Kumbo", 6.2000000, 10.6666670, 1771.0},
+       {1885, "Cameroon", "Nkoteng", 4.5166667, 12.0333328, 565.0},
+       {1886, "Cameroon", "Mutengene", 4.0994444, 9.3080559, 283.0},
+       {1887, "Cameroon", "Garoua Boulai", 5.8833333, 14.5500002, 997.0},
+       {1888, "Cameroon", "Batouri", 4.4333333, 14.3666668, 618.0},
+       {1889, "Cameroon", "Fundong", 6.2500000, 10.2666664, 1538.0},
+       {1890, "Cameroon", "Fontem", 5.4666667, 9.8833332, 1342.0},
+       {1891, "Cameroon", "Mbanga", 4.5091667, 9.5680552, 154.0},
+       {1892, "Cameroon", "Banyo", 6.7500000, 11.8166666, 1260.0},
+       {1893, "Cameroon", "Manjo", 4.8452778, 9.8247223, 579.0},
+       {1894, "Cameroon", "Melong", 5.1166667, 9.9499998, 762.0},
+       {1895, "Cameroon", "Tibati", 6.4666667, 12.6333332, 840.0},
+       {1896, "Cameroon", "Muyuka", 4.2972222, 9.4055557, 54.0},
+       {1897, "Cameroon", "Obala", 4.1666667, 11.5333328, 528.0},
+       {1898, "Cameroon", "Nanga Eboko", 4.6833333, 12.3666668, 632.0},
+       {1899, "Cameroon", "Penja", 4.6363889, 9.6819448, 151.0},
+       {1900, "Cameroon", "Mbandjok", 4.4500000, 11.8999996, 517.0},
+       {1901, "Cameroon", "Kaele", 10.1091667, 14.4508333, 371.0},
+       {1902, "Cameroon", "Bamusso", 4.4333333, 8.8999996, 1.0},
+       {1903, "Cameroon", "Lagdo", 9.0500000, 13.7333336, 188.0},
+       {1904, "Cameroon", "Tchollire", 8.4000000, 14.1666670, 376.0},
+       {1905, "Cameroon", "Belabo", 4.9333333, 13.3000002, 611.0},
+       {1906, "Cameroon", "Lolodorf", 3.2333333, 10.7333336, 406.0},
+       {1907, "Cameroon", "Eseka", 3.6500000, 10.7666664, 246.0},
+       {1908, "Cameroon", "Mamfe", 5.7666667, 9.2833328, 444.0},
+       {1909, "Cameroon", "Dizangue", 3.7666667, 9.9833336, 1.0},
+       {1910, "Cameroon", "Idenao", 4.2475000, 9.0047226, 127.0},
+       {1911, "Cameroon", "Akonolinga", 3.7666667, 12.2500000, 521.0},
+       {1912, "Cameroon", "Bogo", 10.7361111, 14.6108332, 341.0},
+       {1913, "Cameroon", "Tonga", 4.9666667, 10.6999998, 788.0},
+       {1914, "Cameroon", "Abong Mbang", 3.9833333, 13.1833334, 708.0},
+       {1915, "Cameroon", "Yokadouma", 3.5166667, 15.0500002, 562.0},
+       {1916, "Cameroon", "Bazou", 5.0666667, 10.4666672, 1218.0},
+       {1917, "Cameroon", "Mundemba", 4.9500000, 8.8666668, 322.0},
+       {1918, "Cameroon", "Betare Oya", 5.6000000, 14.0833330, 779.0},
+       {1919, "Cameroon", "Pitoa", 9.3833333, 13.5333328, 201.0},
+       {1920, "Cameroon", "Rey Bouba", 8.6666667, 14.1833334, 224.0},
+       {1921, "Cameroon", "Mindif", 10.4027778, 14.4399996, 531.0},
+       {1922, "Cameroon", "Babanki", 6.1166667, 10.2500000, 1177.0},
+       {1923, "Cameroon", "Mbengwi", 6.0166667, 10.0000000, 1260.0},
+       {1924, "Cameroon", "Akom II", 2.7833333, 10.5666666, 462.0},
+       {1925, "Cameroon", "Batibo", 5.8333333, 9.8666668, 1431.0},
+       {1926, "Cameroon", "Belo", 6.1333333, 10.2500000, 1166.0},
+       {1927, "Cameroon", "Dimako", 4.3833333, 13.5666666, 681.0},
+       {1928, "Cameroon", "Ambam", 2.3833333, 11.2833328, 347.0},
+       {1929, "Cameroon", "Njinikom", 6.2333333, 10.2833328, 1254.0},
+       {1930, "Cameroon", "Ndikinimeki", 4.7666667, 10.8333330, 525.0},
+       {1931, "Cameroon", "Bonaberi", 4.0844444, 9.6661110, 1.0},
+       {1932, "Cameroon", "Kontcha", 7.9666667, 12.2333336, 388.0},
+       {1933, "Cameroon", "Bangou", 5.2000000, 10.3833332, 1489.0},
+       {1934, "Cameroon", "Yabassi", 4.4544444, 9.9655552, 21.0},
+       {1935, "Cameroon", "Bansoa", 5.4500000, 10.3166666, 1532.0},
+       {1936, "Cameroon", "Makari", 12.5744444, 14.4519444, 299.0},
+       {1937, "Cameroon", "Bekondo", 4.6838889, 9.3213892, 411.0},
+       {1938, "Cameroon", "Bandjoun", 5.3500000, 10.3999996, 1563.0},
+       {1939, "Cameroon", "Belel", 7.0500000, 14.4333334, 1373.0},
+       {1940, "Cameroon", "Bamendjou", 5.4000000, 10.3166666, 1533.0},
+       {1941, "Cameroon", "Ngambe", 4.2333333, 10.6166668, 205.0},
+       {1942, "Cameroon", "Ntui", 4.4500000, 11.6333332, 544.0},
+       {1943, "Cameroon", "Mme-Bafumen", 6.3333333, 10.2333336, 1314.0},
+       {1944, "Cameroon", "Bana", 5.1500000, 10.2666664, 1487.0},
+       {1945, "Cameroon", "Saa", 4.3666667, 11.4499998, 575.0},
+       {1946, "Cameroon", "Poli", 8.4833333, 13.2500000, 781.0},
+       {1947, "Cameroon", "Bankim", 6.0830337, 11.4904976, 762.0},
+       {1948, "Cameroon", "Doume", 4.2333333, 13.4499998, 658.0},
+       {1949, "Cameroon", "Ndom", 4.5025000, 9.5616665, 148.0},
+       {1950, "Cameroon", "Nguti", 5.3000000, 9.4333334, 1353.0},
+       {1951, "Canada", "Toronto", 43.7001138, -79.4163055, 173.0},
+       {1952, "Canada", "Montreal", 45.5167792, -73.6491776, 47.0},
+       {1953, "Canada", "Vancouver", 49.2496574, -123.1193390, 63.0},
+       {1954, "Canada", "Calgary", 51.0501123, -114.0852890, 1052.0},
+       {1955, "Canada", "Ottawa", 45.4209405, -75.6902847, 61.0},
+       {1956, "Canada", "Edmonton", 53.5501359, -113.4687119, 640.0},
+       {1957, "Canada", "Winnipeg", 49.8843986, -97.1470413, 230.0},
+       {1958, "Canada", "Quebec", 46.8122791, -71.2145386, 47.0},
+       {1959, "Canada", "Hamilton", 43.2334084, -79.9496384, 208.0},
+       {1960, "Canada", "Kitchener", 43.4500956, -80.4829865, 334.0},
+       {1961, "Canada", "Halifax", 44.6519862, -63.5968475, 45.0},
+       {1962, "Canada", "London", 42.9833893, -81.2330399, 251.0},
+       {1963, "Canada", "Victoria", 48.4329357, -123.3693008, 1.0},
+       {1964, "Canada", "Windsor", 42.3000836, -83.0165405, 183.0},
+       {1965, "Canada", "Oshawa", 43.9001204, -78.8495712, 106.0},
+       {1966, "Canada", "Saskatoon", 52.1167863, -106.6345215, 468.0},
+       {1967, "Canada", "Barrie", 44.4001075, -79.6663361, 252.0},
+       {1968, "Canada", "Richmond", 49.1700323, -123.1368256, 3.0},
+       {1969, "Canada", "Regina", 50.4500801, -104.6177979, 573.0},
+       {1970, "Canada", "Grand Sudbury", 46.4900017, -80.9900055, 274.0},
+       {1971, "Canada", "Abbotsford", 49.0579767, -122.2525711, 128.0},
+       {1972, "Canada", "Sherbrooke", 45.4000830, -71.8990784, 153.0},
+       {1973, "Canada", "Levis", 46.8032615, -71.1779327, 85.0},
+       {1974, "Canada", "Kelowna", 49.8830737, -119.4856720, 352.0},
+       {1975, "Canada", "Trois-Rivieres", 46.3500609, -72.5491180, 25.0},
+       {1976, "Canada", "Guelph", 43.5500968, -80.2496719, 334.0},
+       {1977, "Canada", "Kingston", 44.2297641, -76.4809799, 77.0},
+       {1978, "Canada", "Thunder Bay", 48.4000957, -89.3168259, 215.0},
+       {1979, "Canada", "Waterloo", 43.4667956, -80.5163879, 331.0},
+       {1980, "Canada", "Saint John", 45.2593501, -66.0377426, -9999.0},
+       {1981, "Canada", "Brantford", 43.1334015, -80.2663651, 200.0},
+       {1982, "Canada", "Moncton", 46.1159434, -64.8018646, 15.0},
+       {1983, "Canada", "Nanaimo", 49.1663374, -123.9360123, 19.0},
+       {1984, "Canada", "Sarnia", 42.9667758, -82.3831253, 186.0},
+       {1985, "Canada", "Saint-Laurent", 45.5000795, -73.6658478, 43.0},
+       {1986, "Canada", "Peterborough", 44.3001213, -78.3162308, 199.0},
+       {1987, "Canada", "Red Deer", 52.2668171, -113.8019943, 856.0},
+       {1988, "Canada", "Saint-Jean-sur-Richelieu", 45.3167807, -73.2658539, 29.0},
+       {1989, "Canada", "Lethbridge", 49.6999934, -112.8185577, 907.0},
+       {1990, "Canada", "Brossard", 45.4500795, -73.4658356, 20.0},
+       {1991, "Canada", "Kamloops", 50.6664769, -120.3191986, 457.0},
+       {1992, "Canada", "White Rock", 49.0163644, -122.8026047, -9999.0},
+       {1993, "Canada", "Prince George", 53.9166032, -122.7530136, 568.0},
+       {1994, "Canada", "Medicine Hat", 50.0500596, -110.6683426, 708.0},
+       {1995, "Canada", "Drummondville", 45.8833647, -72.4824142, 82.0},
+       {1996, "Canada", "New Westminster", 49.2067756, -122.9109192, 40.0},
+       {1997, "Canada", "Sherwood Park", 53.5168360, -113.3187027, 718.0},
+       {1998, "Canada", "Saint-Jerome", 45.7803642, -74.0036469, 92.0},
+       {1999, "Canada", "Granby", 45.4000791, -72.7324295, 116.0},
+       {2000, "Canada", "Fredericton", 45.9454148, -66.6655807, 93.0},
+       {2001, "Canada", "Chilliwack", 49.1746816, -121.9442673, 9.0},
+       {2002, "Canada", "Saint-Hyacinthe", 45.6167758, -72.9491348, 26.0},
+       {2003, "Canada", "North Bay", 46.3168021, -79.4663315, 221.0},
+       {2004, "Canada", "Shawinigan", 46.5667534, -72.7491302, 137.0},
+       {2005, "Canada", "Cornwall", 45.0333933, -74.7325821, 60.0},
+       {2006, "Canada", "North Vancouver", 49.3163619, -123.0693436, 46.0},
+       {2007, "Canada", "Vernon", 50.2580886, -119.2690506, 388.0},
+       {2008, "Canada", "Chatham-Kent", 42.4167869, -82.1664963, 180.0},
+       {2009, "Canada", "Charlottetown", 46.2352496, -63.1267128, 6.0},
+       {2010, "Canada", "Grande Prairie", 55.1666735, -118.8027115, 664.0},
+       {2011, "Canada", "Salaberry-de-Valleyfield", 45.2500834, -74.1325378, 43.0},
+       {2012, "Canada", "Penticton", 49.4997646, -119.5856934, 358.0},
+       {2013, "Canada", "Joliette", 46.0167719, -73.4491577, 46.0},
+       {2014, "Canada", "Prince Albert", 53.2000820, -105.7677231, 420.0},
+       {2015, "Canada", "Victoriaville", 46.0500670, -71.9657898, 124.0},
+       {2016, "Canada", "Woodstock", 43.1333947, -80.7497025, 304.0},
+       {2017, "Canada", "Sorel-Tracy", 46.0333622, -73.1158447, 7.0},
+       {2018, "Canada", "Campbell River", 50.0163393, -125.2445908, 72.0},
+       {2019, "Canada", "Timmins", 48.4668636, -81.3331223, 322.0},
+       {2020, "Canada", "Courtenay", 49.6829411, -124.9861298, 5.0},
+       {2021, "Canada", "Orangeville", 43.9168031, -80.0996704, 426.0},
+       {2022, "Canada", "North Cowichan", 48.8413317, -123.6859665, 61.0},
+       {2023, "Canada", "Moose Jaw", 50.4000528, -105.5344467, 553.0},
+       {2024, "Canada", "Midland", 44.7501042, -79.8829651, 202.0},
+       {2025, "Canada", "Leamington", 42.0833864, -82.5665131, 191.0},
+       {2026, "Canada", "Stratford", 43.3667928, -80.9497223, 358.0},
+       {2027, "Canada", "Orillia", 44.6168093, -79.4163208, 219.0},
+       {2028, "Canada", "Alma", 48.5500931, -71.6491013, 93.0},
+       {2029, "Canada", "Brandon", 49.8469210, -99.9530640, 378.0},
+       {2030, "Canada", "Airdrie", 51.3001121, -114.0352859, 1081.0},
+       {2031, "Canada", "Rouyn-Noranda", 48.2398521, -79.0287781, 304.0},
+       {2032, "Canada", "Brockville", 44.5834124, -75.6826401, 75.0},
+       {2033, "Canada", "Whitehorse", 60.7161148, -135.0537415, 630.0},
+       {2034, "Canada", "Lloydminster", 53.2834618, -110.0015717, 646.0},
+       {2035, "Canada", "Owen Sound", 44.5667903, -80.9330215, 226.0},
+       {2036, "Canada", "Sept-Iles", 50.2001125, -66.3820801, 2.0},
+       {2037, "Canada", "Duncan", 48.7829312, -123.7026596, 61.0},
+       {2038, "Canada", "Port Alberni", 49.2413251, -124.8028030, 19.0},
+       {2039, "Canada", "Parksville", 49.3163258, -124.3194504, 46.0},
+       {2040, "Canada", "Truro", 45.3668480, -63.2653770, 30.0},
+       {2041, "Canada", "New Glasgow", 45.5834447, -62.6486359, 12.0},
+       {2042, "Canada", "Glace Bay", 46.1969500, -59.9569817, 1.0},
+       {2043, "Canada", "Terrace", 54.5163400, -128.6034546, 68.0},
+       {2044, "Canada", "North Battleford", 52.7834372, -108.2846527, 539.0},
+       {2045, "Canada", "Bradford West Gwillimbury", 44.1168100, -79.6163254, 267.0},
+       {2046, "Canada", "Corner Brook", 48.9667069, -57.9484024, -9999.0},
+       {2047, "Canada", "Cranbrook", 49.4999124, -115.7687912, 984.0},
+       {2048, "Canada", "Cobourg", 43.9668223, -78.1662216, 91.0},
+       {2049, "Canada", "Spruce Grove", 53.5334352, -113.9187469, 703.0},
+       {2050, "Cape Verde", "Praia", 14.9166667, -23.5166664, -9999.0},
+       {2051, "Cape Verde", "Mindelo", 16.8833333, -25.0000000, 62.0},
+       {2052, "Cape Verde", "Santa Maria", 16.6000000, -22.8999996, 13.0},
+       {2053, "Cape Verde", "Santa Cruz", 15.1333333, -23.5666676, 57.0},
+       {2054, "Cape Verde", "Sao Filipe", 14.9000000, -24.5166664, -9999.0},
+       {2055, "Cape Verde", "Assomada", 15.1000000, -23.6833324, 338.0},
+       {2056, "Cape Verde", "Tarrafal", 15.2833333, -23.7666664, 251.0},
+       {2057, "Cape Verde", "Porto Novo", 17.0196919, -25.0647068, -9999.0},
+       {2058, "Cape Verde", "Vila da Ribeira Brava", 16.6166667, -24.2999992, 208.0},
+       {2059, "Cape Verde", "Ponta do Sol", 17.2000000, -25.1000004, 50.0},
+       {2060, "Cape Verde", "Vila do Maio", 15.1333333, -23.2166672, 2.0},
+       {2061, "Cape Verde", "Sal Rei", 16.1833333, -22.9166660, 1.0},
+       {2062, "Cape Verde", "Pombas", 17.1500000, -25.0166664, 13.0},
+       {2063, "Cape Verde", "Porto dos Mosteiros", 15.0333333, -24.3333340, 1.0},
+       {2064, "Central African Republic", "Bangui", 4.3666667, 18.5833340, 373.0},
+       {2065, "Central African Republic", "Bimbo", 4.3000000, 18.5499992, 339.0},
+       {2066, "Central African Republic", "Mbaiki", 3.8833333, 18.0000000, 515.0},
+       {2067, "Central African Republic", "Berberati", 4.2666667, 15.7833328, 577.0},
+       {2068, "Central African Republic", "Kaga Bandoro", 6.9833333, 19.1833324, 412.0},
+       {2069, "Central African Republic", "Bozoum", 6.3166667, 16.3833332, 702.0},
+       {2070, "Central African Republic", "Carnot", 4.9333333, 15.8666668, 486.0},
+       {2071, "Central African Republic", "Sibut", 5.7333333, 19.0833340, 400.0},
+       {2072, "Central African Republic", "Bambari", 5.7619444, 20.6672230, 465.0},
+       {2073, "Central African Republic", "Bria", 6.5333333, 21.9833336, 558.0},
+       {2074, "Central African Republic", "Bouar", 5.9500000, 15.6000004, 1047.0},
+       {2075, "Central African Republic", "Bossangoa", 6.4833333, 17.4500008, 466.0},
+       {2076, "Central African Republic", "Nola", 3.5333333, 16.0666676, 443.0},
+       {2077, "Central African Republic", "Bangassou", 4.7333333, 22.8166676, 458.0},
+       {2078, "Central African Republic", "Damara", 4.9666667, 18.7000008, 404.0},
+       {2079, "Central African Republic", "Mobaye", 4.3166667, 21.1833324, 434.0},
+       {2080, "Central African Republic", "Paoua", 7.2500000, 16.4333324, 604.0},
+       {2081, "Central African Republic", "Boda", 4.3166667, 17.4666672, 565.0},
+       {2082, "Central African Republic", "Ippy", 6.2500000, 21.2000008, 556.0},
+       {2083, "Central African Republic", "Batangafo", 7.3000000, 18.2999992, 432.0},
+       {2084, "Central African Republic", "Alindao", 5.0333333, 21.2166672, 482.0},
+       {2085, "Central African Republic", "Kabo", 7.6500000, 18.6166668, 398.0},
+       {2086, "Central African Republic", "Rafai", 4.9500000, 23.9166660, 526.0},
+       {2087, "Central African Republic", "Bouca", 6.5000000, 18.2833328, 420.0},
+       {2088, "Central African Republic", "Obo", 5.4000000, 26.5000000, 615.0},
+       {2089, "Central African Republic", "Ndele", 8.4091667, 20.6530552, 587.0},
+       {2090, "Central African Republic", "Kembe", 4.6000000, 21.8999996, 457.0},
+       {2091, "Central African Republic", "Mongoumba", 3.6333333, 18.6000004, 338.0},
+       {2092, "Central African Republic", "Birao", 10.2833333, 22.7833328, 472.0},
+       {2093, "Central African Republic", "Gamboula", 4.1333333, 15.1499996, 609.0},
+       {2094, "Central African Republic", "Kouango", 4.9666667, 19.9833336, 415.0},
+       {2095, "Central African Republic", "Baoro", 5.6666667, 15.9666672, 729.0},
+       {2096, "Central African Republic", "Boali", 4.8000000, 18.1166668, 450.0},
+       {2097, "Central African Republic", "Ouadda", 8.0666667, 22.3999996, 682.0},
+       {2098, "Central African Republic", "Gambo", 4.6500000, 22.2666664, 500.0},
+       {2099, "Central African Republic", "Ouango", 4.3166667, 22.5499992, 454.0},
+       {2100, "Chad", "Moundou", 8.5666667, 16.0833340, 415.0},
+       {2101, "Chad", "Sarh", 9.1500000, 18.3833332, 342.0},
+       {2102, "Chad", "Abeche", 13.8291624, 20.8323956, 542.0},
+       {2103, "Chad", "Kelo", 9.3166667, 15.8000002, 429.0},
+       {2104, "Chad", "Koumra", 8.9166667, 17.5499992, 419.0},
+       {2105, "Chad", "Pala", 9.3666667, 14.8999996, 446.0},
+       {2106, "Chad", "Am Timan", 11.0333333, 20.2833328, 416.0},
+       {2107, "Chad", "Bongor", 10.2805556, 15.3722219, 316.0},
+       {2108, "Chad", "Mongo", 12.1833333, 18.7000008, 395.0},
+       {2109, "Chad", "Doba", 8.6500000, 16.8500004, 398.0},
+       {2110, "Chad", "Ati", 13.2166667, 18.3333340, 297.0},
+       {2111, "Chad", "Lai", 9.4000000, 16.2999992, 362.0},
+       {2112, "Chad", "Oum Hadjer", 13.3000000, 19.6833324, 358.0},
+       {2113, "Chad", "Bitkine", 11.9816667, 18.2127781, 682.0},
+       {2114, "Chad", "Mao", 14.1194444, 15.3133335, 352.0},
+       {2115, "Chad", "Massaguet", 12.4741667, 15.4427776, 289.0},
+       {2116, "Chad", "Dourbali", 11.8094444, 15.8611107, 305.0},
+       {2117, "Chad", "Mboursou Lere", 9.7666667, 14.1499996, 304.0},
+       {2118, "Chad", "Kyabe", 9.4500000, 18.9500008, 367.0},
+       {2119, "Chad", "Benoy", 8.9833333, 16.3166676, 448.0},
+       {2120, "Chad", "Massakory", 12.9980556, 15.7375002, 259.0},
+       {2121, "Chad", "Moussoro", 13.6425000, 16.4888897, 293.0},
+       {2122, "Chad", "Bokoro", 12.3766667, 17.0580559, 300.0},
+       {2123, "Chad", "Bere", 9.3333333, 16.1499996, 383.0},
+       {2124, "Chad", "Bousso", 10.4825000, 16.7161102, 284.0},
+       {2125, "Chad", "Faya", 17.9166667, 19.1166668, 259.0},
+       {2126, "Chad", "Bebedjia", 8.6833333, 16.5666676, 398.0},
+       {2127, "Chad", "Ngama", 11.7833333, 17.1666660, 309.0},
+       {2128, "Chad", "Adre", 13.4666667, 22.2000008, 762.0},
+       {2129, "Chad", "Guelengdeng", 10.9333333, 15.5333328, 295.0},
+       {2130, "Chad", "Moissala", 8.3500000, 17.7666664, 345.0},
+       {2131, "Chad", "Biltine", 14.5333333, 20.9166660, 503.0},
+       {2132, "Chad", "Goundi", 9.3666667, 17.3666668, 486.0},
+       {2133, "Chad", "Gounou-Gaya", 9.6272222, 15.5138893, 461.0},
+       {2134, "Chad", "Beinamar", 8.6666667, 15.3833332, 457.0},
+       {2135, "Chad", "Melfi", 11.0597222, 17.9330559, 409.0},
+       {2136, "Chad", "Beboto", 8.2666667, 16.9333324, 448.0},
+       {2137, "Chad", "Aozou", 21.8375000, 17.4274998, 1075.0},
+       {2138, "Chad", "Goz Beida", 12.2166667, 21.4166660, 594.0},
+       {2139, "Chad", "Iriba", 15.1166667, 22.2500000, 923.0},
+       {2140, "Chile", "Santiago", -33.4500000, -70.6666641, 513.0},
+       {2141, "Chile", "vina causino", -33.6166667, -70.5833359, 673.0},
+       {2142, "Chile", "Antofagasta", -23.6500000, -70.4000015, 276.0},
+       {2143, "Chile", "Vina del Mar", -33.0229137, -71.5525360, 33.0},
+       {2144, "Chile", "Valparaiso", -33.0393202, -71.6272583, 24.0},
+       {2145, "Chile", "Talcahuano", -36.7166667, -73.1166687, 1.0},
+       {2146, "Chile", "San Bernardo", -33.6000000, -70.7166672, 629.0},
+       {2147, "Chile", "Temuco", -38.7333333, -72.5999985, 128.0},
+       {2148, "Chile", "Iquique", -20.2166667, -70.1666641, -9999.0},
+       {2149, "Chile", "Concepcion", -36.8269950, -73.0497665, 136.0},
+       {2150, "Chile", "Rancagua", -34.1666667, -70.7500000, 518.0},
+       {2151, "Chile", "Talca", -35.4333333, -71.6666641, 102.0},
+       {2152, "Chile", "Arica", -18.4833333, -70.3333359, 12.0},
+       {2153, "Chile", "Coquimbo", -29.9533333, -71.3436127, 87.0},
+       {2154, "Chile", "Puerto Montt", -41.4716667, -72.9369431, 20.0},
+       {2155, "Chile", "La Serena", -29.9077778, -71.2541656, 30.0},
+       {2156, "Chile", "Chillan", -36.6000000, -72.1166687, 127.0},
+       {2157, "Chile", "Calama", -22.4666667, -68.9333344, 2248.0},
+       {2158, "Chile", "Osorno", -40.5666667, -73.1500015, 87.0},
+       {2159, "Chile", "Valdivia", -39.8142226, -73.2458954, 10.0},
+       {2160, "Chile", "Quilpue", -33.0450000, -71.4494476, 129.0},
+       {2161, "Chile", "Copiapo", -27.3666667, -70.3333359, 381.0},
+       {2162, "Chile", "Los Angeles", -37.4666667, -72.3499985, 137.0},
+       {2163, "Chile", "Punta Arenas", -53.1500000, -70.9166641, 54.0},
+       {2164, "Chile", "Curico", -34.9833333, -71.2333298, 218.0},
+       {2165, "Chile", "Villa Alemana", -33.0422222, -71.3733368, 155.0},
+       {2166, "Chile", "Coronel", -37.0166667, -73.1333313, 84.0},
+       {2167, "Chile", "San Antonio", -33.5933333, -71.6216660, 5.0},
+       {2168, "Chile", "Chiguayante", -36.9166667, -73.0166702, 184.0},
+       {2169, "Chile", "Ovalle", -30.5983333, -71.2002792, 269.0},
+       {2170, "Chile", "Linares", -35.8500000, -71.5999985, 165.0},
+       {2171, "Chile", "Quillota", -32.8833333, -71.2666702, 133.0},
+       {2172, "Chile", "Penaflor", -33.6166667, -70.9166641, 342.0},
+       {2173, "Chile", "Melipilla", -33.7000000, -71.2166672, 237.0},
+       {2174, "Chile", "San Felipe", -32.7500000, -70.7333298, 637.0},
+       {2175, "Chile", "Los Andes", -32.8336862, -70.5982742, 834.0},
+       {2176, "Chile", "Buin", -33.7333333, -70.7500000, 457.0},
+       {2177, "Chile", "Talagante", -33.6666667, -70.9333344, 313.0},
+       {2178, "Chile", "Lota", -37.0833333, -73.1666641, 71.0},
+       {2179, "Chile", "Hacienda La Calera", -32.7833333, -71.2166672, 202.0},
+       {2180, "Chile", "Tome", -36.6166667, -72.9499969, 120.0},
+       {2181, "Chile", "Penco", -36.7333333, -72.9833298, 84.0},
+       {2182, "Chile", "Coihaique", -45.5752397, -72.0661926, 355.0},
+       {2183, "Chile", "Vallenar", -28.5708333, -70.7580566, 442.0},
+       {2184, "Chile", "Angol", -37.8000000, -72.7166672, 79.0},
+       {2185, "Chile", "Rengo", -34.4166667, -70.8666687, 288.0},
+       {2186, "Chile", "Constitucion", -35.3333333, -72.4166641, 57.0},
+       {2187, "Chile", "Limache", -33.0166667, -71.2666702, 146.0},
+       {2188, "Chile", "Santa Cruz", -34.6333333, -71.3666687, 165.0},
+       {2189, "Chile", "Paine", -33.8166667, -70.7500000, 354.0},
+       {2190, "Chile", "Villarrica", -39.2856855, -72.2278976, 224.0},
+       {2191, "Chile", "San Carlos", -36.4166667, -71.9666672, 160.0},
+       {2192, "Chile", "Cauquenes", -35.9666667, -72.3499985, 136.0},
+       {2193, "Chile", "Curanilahue", -37.4666667, -73.3499985, 195.0},
+       {2194, "Chile", "Las Animas", -39.8086679, -73.2182083, 8.0},
+       {2195, "Chile", "Castro", -42.4720969, -73.7731934, 14.0},
+       {2196, "Chile", "Lampa", -33.2833333, -70.9000015, 623.0},
+       {2197, "Chile", "Molina", -35.1166667, -71.2833328, 274.0},
+       {2198, "Chile", "Ancud", -41.8697222, -73.8202744, 1.0},
+       {2199, "Chile", "Machali", -34.1833333, -70.6666641, 555.0},
+       {2200, "Chile", "Parral", -36.1500000, -71.8333359, 163.0},
+       {2201, "Chile", "La Union", -40.2833333, -73.0833359, 67.0},
+       {2202, "Chile", "Puerto Varas", -41.3166667, -72.9833298, 88.0},
+       {2203, "Chile", "La Ligua", -32.4524177, -71.2310562, 127.0},
+       {2204, "Chile", "Arauco", -37.2463010, -73.3175201, 2.0},
+       {2205, "Chile", "Victoria", -38.2166667, -72.3333359, 335.0},
+       {2206, "Chile", "Tocopilla", -22.0833333, -70.1999969, 67.0},
+       {2207, "Chile", "Graneros", -34.0666667, -70.7333298, 456.0},
+       {2208, "Chile", "El Monte", -33.6833333, -71.0166702, 232.0},
+       {2209, "Chile", "Illapel", -31.6308333, -71.1652756, 320.0},
+       {2210, "Chile", "San Vicente", -34.4333333, -71.0833359, 217.0},
+       {2211, "Chile", "San Javier", -35.6000000, -71.7500000, 53.0},
+       {2212, "Chile", "Lebu", -37.6166667, -73.6500015, 75.0},
+       {2213, "Chile", "Mulchen", -37.7166667, -72.2333298, 117.0},
+       {2214, "Chile", "Lautaro", -38.5166667, -72.4499969, 235.0},
+       {2215, "Chile", "Nacimiento", -37.5000000, -72.6666641, 90.0},
+       {2216, "Chile", "Canete", -37.8000000, -73.4000015, 144.0},
+       {2217, "Chile", "Puerto Natales", -51.7236255, -72.4874496, 41.0},
+       {2218, "Chile", "Nueva Imperial", -38.7333333, -72.9499969, 50.0},
+       {2219, "Chile", "Cabrero", -37.0333333, -72.4000015, 111.0},
+       {2220, "Chile", "Diego de Almagro", -26.3666667, -70.0500031, 923.0},
+       {2221, "Chile", "Chimbarongo", -34.7000000, -71.0500031, 305.0},
+       {2222, "Chile", "Llaillay", -32.8500000, -70.9666672, 365.0},
+       {2223, "Chile", "La Laja", -37.2666667, -72.6999969, 50.0},
+       {2224, "Chile", "Collipulli", -37.9500000, -72.4333344, 242.0},
+       {2225, "Chile", "Panguipulli", -39.6333333, -72.3333359, 268.0},
+       {2226, "Chile", "Loncoche", -39.3666667, -72.6333313, 136.0},
+       {2227, "Chile", "Rio Bueno", -40.3166667, -72.9666672, 40.0},
+       {2228, "Chile", "Traiguen", -38.2500000, -72.6833344, 179.0},
+       {2229, "Chile", "Monte Patria", -30.6919444, -70.9466629, 524.0},
+       {2230, "Chile", "Pitrufquen", -38.9833333, -72.6500015, 81.0},
+       {2231, "Chile", "San Clemente", -35.5500000, -71.4833298, 241.0},
+       {2232, "Chile", "Purranque", -40.9166667, -73.1666641, 236.0},
+       {2233, "Chile", "Vicuna", -30.0319444, -70.7080536, 769.0},
+       {2234, "Chile", "Salamanca", -31.7750000, -70.9722214, 467.0},
+       {2235, "Chile", "Bulnes", -36.7333333, -72.3000031, 92.0},
+       {2236, "Chile", "Calbuco", -41.7666667, -73.1333313, -9999.0},
+       {2237, "Chile", "Carahue", -38.7000000, -73.1666641, 3.0},
+       {2238, "Chile", "Yumbel", -37.0833333, -72.5666656, 94.0},
+       {2239, "Chile", "Taltal", -25.4000000, -70.4833298, 34.0},
+       {2240, "China", "Shanghai", 31.2222222, 121.4580536, 6.0},
+       {2241, "China", "Beijing", 39.9074977, 116.3972244, 63.0},
+       {2242, "China", "Nanchong", 30.8000000, 106.0666656, 280.0},
+       {2243, "China", "Kaifeng", 34.7911111, 114.3483353, 77.0},
+       {2244, "China", "Wuhan", 30.5833333, 114.2666702, 25.0},
+       {2245, "China", "Chongqing", 29.5627778, 106.5527802, 234.0},
+       {2246, "China", "Chengdu", 30.6666667, 104.0666656, 529.0},
+       {2247, "China", "Tianjin", 39.1422222, 117.1766663, 8.0},
+       {2248, "China", "Puyang", 29.4602778, 119.8861084, 63.0},
+       {2249, "China", "Shenyang", 41.7922222, 123.4327774, 48.0},
+       {2250, "China", "Shiyan", 32.6475000, 110.7780533, 247.0},
+       {2251, "China", "Harbin", 45.7500000, 126.6500015, 168.0},
+       {2252, "China", "Lanzhou", 36.0563889, 103.7922211, 1572.0},
+       {2253, "China", "