summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--AUTHORS4
-rw-r--r--COPYING346
-rw-r--r--COPYING-DOCS397
-rw-r--r--INSTALL176
-rw-r--r--Makefile.am.in6
-rw-r--r--Makefile.cvs14
-rw-r--r--README47
-rw-r--r--amor/AmorIface.h49
-rw-r--r--amor/Makefile.am38
-rw-r--r--amor/TODO15
-rw-r--r--amor/amor.cpp1024
-rw-r--r--amor/amor.desktop74
-rw-r--r--amor/amor.h164
-rw-r--r--amor/amoranim.cpp254
-rw-r--r--amor/amoranim.h117
-rw-r--r--amor/amorbubble.cpp250
-rw-r--r--amor/amorbubble.h81
-rw-r--r--amor/amorconfig.cpp83
-rw-r--r--amor/amorconfig.h58
-rw-r--r--amor/amordialog.cpp285
-rw-r--r--amor/amordialog.h107
-rw-r--r--amor/amorpm.cpp94
-rw-r--r--amor/amorpm.h64
-rw-r--r--amor/amortips.cpp181
-rw-r--r--amor/amortips.h60
-rw-r--r--amor/amorwidget.cpp125
-rw-r--r--amor/amorwidget.h67
-rw-r--r--amor/configure.in.in3
-rw-r--r--amor/data/Makefile.am14
-rw-r--r--amor/data/billyrc129
-rw-r--r--amor/data/blobrc312
-rw-r--r--amor/data/bonhommerc193
-rw-r--r--amor/data/bsdrc128
-rw-r--r--amor/data/eyesrc232
-rw-r--r--amor/data/ghostrc183
-rw-r--r--amor/data/nekorc202
-rw-r--r--amor/data/pics/Makefile.am1
-rw-r--r--amor/data/pics/animated/Makefile.am1
-rw-r--r--amor/data/pics/animated/blob/Makefile.am82
-rw-r--r--amor/data/pics/animated/blob/blob.pngbin0 -> 556 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_BeamDown1.pngbin0 -> 186 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_BeamDown2.pngbin0 -> 247 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_BeamDown3.pngbin0 -> 465 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_BeamDown4.pngbin0 -> 720 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_BeamDown5.pngbin0 -> 662 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_BeamDown6.pngbin0 -> 727 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_BeamDown7.pngbin0 -> 879 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_BeamDown8.pngbin0 -> 924 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_BeamDown9.pngbin0 -> 689 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_BeamUp1.pngbin0 -> 646 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_BeamUp10.pngbin0 -> 345 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_BeamUp2.pngbin0 -> 648 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_BeamUp3.pngbin0 -> 713 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_BeamUp4.pngbin0 -> 787 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_BeamUp5.pngbin0 -> 615 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_BeamUp6.pngbin0 -> 581 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_BeamUp7.pngbin0 -> 582 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_BeamUp8.pngbin0 -> 701 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_BeamUp9.pngbin0 -> 611 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_b1.pngbin0 -> 511 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_b2.pngbin0 -> 431 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_e1.pngbin0 -> 618 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_ex1.pngbin0 -> 580 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_f1.pngbin0 -> 478 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_f2.pngbin0 -> 388 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_f3.pngbin0 -> 272 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_fire10.pngbin0 -> 235 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_fire11.pngbin0 -> 166 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_fire2.pngbin0 -> 594 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_fire3.pngbin0 -> 651 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_fire4.pngbin0 -> 681 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_fire5.pngbin0 -> 600 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_fire6.pngbin0 -> 627 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_fire7.pngbin0 -> 574 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_fire8.pngbin0 -> 391 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_fire9.pngbin0 -> 243 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_g1.pngbin0 -> 593 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_g2.pngbin0 -> 573 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_gl1.pngbin0 -> 587 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_gl2.pngbin0 -> 587 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_gl3.pngbin0 -> 468 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_h1.pngbin0 -> 606 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_h2.pngbin0 -> 617 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_h3.pngbin0 -> 623 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_jet1.pngbin0 -> 559 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_jet2.pngbin0 -> 574 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_jet3.pngbin0 -> 608 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_jet4.pngbin0 -> 638 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_l_jet1.pngbin0 -> 556 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_l_jet2.pngbin0 -> 566 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_l_jet3.pngbin0 -> 603 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_l_jet4.pngbin0 -> 637 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_l_turn1.pngbin0 -> 605 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_l_turn2.pngbin0 -> 526 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_l_turn3.pngbin0 -> 482 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_l_turn4.pngbin0 -> 472 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_r135.pngbin0 -> 633 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_r180.pngbin0 -> 574 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_r225.pngbin0 -> 656 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_r270.pngbin0 -> 553 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_r315.pngbin0 -> 639 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_r45.pngbin0 -> 649 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_r90.pngbin0 -> 559 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_r_turn1.pngbin0 -> 594 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_r_turn2.pngbin0 -> 505 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_r_turn3.pngbin0 -> 475 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_r_turn4.pngbin0 -> 465 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_s1.pngbin0 -> 586 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_s2.pngbin0 -> 605 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_s3.pngbin0 -> 610 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_sl1.pngbin0 -> 511 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_sl2.pngbin0 -> 498 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_sl3.pngbin0 -> 487 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_sl4.pngbin0 -> 454 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_z1.pngbin0 -> 400 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_z2.pngbin0 -> 251 bytes
-rw-r--r--amor/data/pics/animated/blob/blob_z3.pngbin0 -> 222 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/Makefile.am46
-rw-r--r--amor/data/pics/animated/bonhomme/b-f.pngbin0 -> 276 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/b-f2.pngbin0 -> 285 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/b1-r.pngbin0 -> 325 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/b1.pngbin0 -> 322 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/b2-r.pngbin0 -> 301 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/b2.pngbin0 -> 295 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/b3-r.pngbin0 -> 238 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/b3.pngbin0 -> 236 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/b4-r.pngbin0 -> 216 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/b4.pngbin0 -> 209 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/bcol1.pngbin0 -> 321 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/bcol2.pngbin0 -> 318 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/bdrib1.pngbin0 -> 289 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/bdrib2.pngbin0 -> 304 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/bdrib3.pngbin0 -> 302 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/bdrib4.pngbin0 -> 305 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/bdrib5.pngbin0 -> 307 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/bdrib6.pngbin0 -> 304 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/bdrib7.pngbin0 -> 298 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/bdrop.pngbin0 -> 321 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/bgo1.pngbin0 -> 270 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/bgo2.pngbin0 -> 250 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/bgo3.pngbin0 -> 244 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/bgo4.pngbin0 -> 231 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/bgo5.pngbin0 -> 223 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/bgo6.pngbin0 -> 197 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/bgo7.pngbin0 -> 157 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/bh1.pngbin0 -> 248 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/bpof1.pngbin0 -> 313 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/bpof2.pngbin0 -> 306 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/bpof3.pngbin0 -> 315 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/bpof4.pngbin0 -> 338 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/bpof5.pngbin0 -> 339 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/bpof6.pngbin0 -> 306 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/sa1.pngbin0 -> 310 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/sa2.pngbin0 -> 377 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/sa2a.pngbin0 -> 389 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/sa2b.pngbin0 -> 394 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/sa2c.pngbin0 -> 375 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/salut.pngbin0 -> 303 bytes
-rw-r--r--amor/data/pics/animated/bonhomme/salut1.pngbin0 -> 269 bytes
-rw-r--r--amor/data/pics/animated/eyes/Makefile.am31
-rw-r--r--amor/data/pics/animated/eyes/eye_1.pngbin0 -> 241 bytes
-rw-r--r--amor/data/pics/animated/eyes/eye_2.pngbin0 -> 202 bytes
-rw-r--r--amor/data/pics/animated/eyes/eye_b.pngbin0 -> 254 bytes
-rw-r--r--amor/data/pics/animated/eyes/eye_d.pngbin0 -> 231 bytes
-rw-r--r--amor/data/pics/animated/eyes/eye_e.pngbin0 -> 241 bytes
-rw-r--r--amor/data/pics/animated/eyes/eye_h1.pngbin0 -> 242 bytes
-rw-r--r--amor/data/pics/animated/eyes/eye_h2.pngbin0 -> 251 bytes
-rw-r--r--amor/data/pics/animated/eyes/eye_h3.pngbin0 -> 258 bytes
-rw-r--r--amor/data/pics/animated/eyes/eye_h4.pngbin0 -> 252 bytes
-rw-r--r--amor/data/pics/animated/eyes/eye_l.pngbin0 -> 244 bytes
-rw-r--r--amor/data/pics/animated/eyes/eye_m1.pngbin0 -> 508 bytes
-rw-r--r--amor/data/pics/animated/eyes/eye_m2.pngbin0 -> 525 bytes
-rw-r--r--amor/data/pics/animated/eyes/eye_m3.pngbin0 -> 548 bytes
-rw-r--r--amor/data/pics/animated/eyes/eye_m4.pngbin0 -> 430 bytes
-rw-r--r--amor/data/pics/animated/eyes/eye_m5.pngbin0 -> 326 bytes
-rw-r--r--amor/data/pics/animated/eyes/eye_m6.pngbin0 -> 220 bytes
-rw-r--r--amor/data/pics/animated/eyes/eye_m7.pngbin0 -> 166 bytes
-rw-r--r--amor/data/pics/animated/eyes/eye_s1.pngbin0 -> 285 bytes
-rw-r--r--amor/data/pics/animated/eyes/eye_s2.pngbin0 -> 271 bytes
-rw-r--r--amor/data/pics/animated/eyes/eye_s3.pngbin0 -> 274 bytes
-rw-r--r--amor/data/pics/animated/eyes/eye_s4.pngbin0 -> 274 bytes
-rw-r--r--amor/data/pics/animated/eyes/eye_u.pngbin0 -> 228 bytes
-rw-r--r--amor/data/pics/animated/eyes/eye_z1.pngbin0 -> 273 bytes
-rw-r--r--amor/data/pics/animated/eyes/eye_z2.pngbin0 -> 231 bytes
-rw-r--r--amor/data/pics/animated/eyes/eye_z3.pngbin0 -> 269 bytes
-rw-r--r--amor/data/pics/animated/eyes/eye_z4.pngbin0 -> 241 bytes
-rw-r--r--amor/data/pics/animated/eyes/eye_z5.pngbin0 -> 202 bytes
-rw-r--r--amor/data/pics/animated/ghost/Makefile.am19
-rw-r--r--amor/data/pics/animated/ghost/ghost_1.pngbin0 -> 425 bytes
-rw-r--r--amor/data/pics/animated/ghost/ghost_2.pngbin0 -> 407 bytes
-rw-r--r--amor/data/pics/animated/ghost/ghost_e.pngbin0 -> 185 bytes
-rw-r--r--amor/data/pics/animated/ghost/ghost_m1.pngbin0 -> 394 bytes
-rw-r--r--amor/data/pics/animated/ghost/ghost_m2.pngbin0 -> 347 bytes
-rw-r--r--amor/data/pics/animated/ghost/ghost_m3.pngbin0 -> 312 bytes
-rw-r--r--amor/data/pics/animated/ghost/ghost_m4.pngbin0 -> 290 bytes
-rw-r--r--amor/data/pics/animated/ghost/ghost_m5.pngbin0 -> 254 bytes
-rw-r--r--amor/data/pics/animated/ghost/ghost_m6.pngbin0 -> 240 bytes
-rw-r--r--amor/data/pics/animated/ghost/ghost_m7.pngbin0 -> 224 bytes
-rw-r--r--amor/data/pics/animated/ghost/ghost_z1.pngbin0 -> 198 bytes
-rw-r--r--amor/data/pics/animated/ghost/ghost_z2.pngbin0 -> 237 bytes
-rw-r--r--amor/data/pics/animated/ghost/ghost_z3.pngbin0 -> 300 bytes
-rw-r--r--amor/data/pics/animated/ghost/ghost_z4.pngbin0 -> 310 bytes
-rw-r--r--amor/data/pics/animated/ghost/ghost_z5.pngbin0 -> 378 bytes
-rw-r--r--amor/data/pics/animated/neko/Makefile.am31
-rw-r--r--amor/data/pics/animated/neko/claw1.pngbin0 -> 327 bytes
-rw-r--r--amor/data/pics/animated/neko/claw2.pngbin0 -> 322 bytes
-rw-r--r--amor/data/pics/animated/neko/jump1.pngbin0 -> 351 bytes
-rw-r--r--amor/data/pics/animated/neko/jump2.pngbin0 -> 359 bytes
-rw-r--r--amor/data/pics/animated/neko/jump3.pngbin0 -> 355 bytes
-rw-r--r--amor/data/pics/animated/neko/jump4.pngbin0 -> 341 bytes
-rw-r--r--amor/data/pics/animated/neko/jumpl1.pngbin0 -> 336 bytes
-rw-r--r--amor/data/pics/animated/neko/jumpl2.pngbin0 -> 363 bytes
-rw-r--r--amor/data/pics/animated/neko/jumpl3.pngbin0 -> 361 bytes
-rw-r--r--amor/data/pics/animated/neko/jumpl4.pngbin0 -> 344 bytes
-rw-r--r--amor/data/pics/animated/neko/lick.pngbin0 -> 339 bytes
-rw-r--r--amor/data/pics/animated/neko/lick2.pngbin0 -> 339 bytes
-rw-r--r--amor/data/pics/animated/neko/run1.pngbin0 -> 351 bytes
-rw-r--r--amor/data/pics/animated/neko/run2.pngbin0 -> 338 bytes
-rw-r--r--amor/data/pics/animated/neko/run3.pngbin0 -> 351 bytes
-rw-r--r--amor/data/pics/animated/neko/run4.pngbin0 -> 337 bytes
-rw-r--r--amor/data/pics/animated/neko/scratch1.pngbin0 -> 343 bytes
-rw-r--r--amor/data/pics/animated/neko/scratch2.pngbin0 -> 316 bytes
-rw-r--r--amor/data/pics/animated/neko/scratch3.pngbin0 -> 331 bytes
-rw-r--r--amor/data/pics/animated/neko/scratch4.pngbin0 -> 318 bytes
-rw-r--r--amor/data/pics/animated/neko/sit.pngbin0 -> 315 bytes
-rw-r--r--amor/data/pics/animated/neko/sitleft.pngbin0 -> 316 bytes
-rw-r--r--amor/data/pics/animated/neko/sleep1.pngbin0 -> 323 bytes
-rw-r--r--amor/data/pics/animated/neko/sleep2.pngbin0 -> 321 bytes
-rw-r--r--amor/data/pics/animated/neko/surprise.pngbin0 -> 355 bytes
-rw-r--r--amor/data/pics/animated/neko/tail.pngbin0 -> 321 bytes
-rw-r--r--amor/data/pics/animated/neko/yawn.pngbin0 -> 338 bytes
-rw-r--r--amor/data/pics/animated/pingu/Makefile.am104
-rw-r--r--amor/data/pics/animated/pingu/bash_l1.pngbin0 -> 967 bytes
-rw-r--r--amor/data/pics/animated/pingu/bash_l10.pngbin0 -> 1014 bytes
-rw-r--r--amor/data/pics/animated/pingu/bash_l11.pngbin0 -> 1002 bytes
-rw-r--r--amor/data/pics/animated/pingu/bash_l12.pngbin0 -> 1026 bytes
-rw-r--r--amor/data/pics/animated/pingu/bash_l2.pngbin0 -> 894 bytes
-rw-r--r--amor/data/pics/animated/pingu/bash_l3.pngbin0 -> 797 bytes
-rw-r--r--amor/data/pics/animated/pingu/bash_l4.pngbin0 -> 638 bytes
-rw-r--r--amor/data/pics/animated/pingu/bash_l5.pngbin0 -> 677 bytes
-rw-r--r--amor/data/pics/animated/pingu/bash_l6.pngbin0 -> 745 bytes
-rw-r--r--amor/data/pics/animated/pingu/bash_l7.pngbin0 -> 703 bytes
-rw-r--r--amor/data/pics/animated/pingu/bash_l8.pngbin0 -> 862 bytes
-rw-r--r--amor/data/pics/animated/pingu/bash_l9.pngbin0 -> 893 bytes
-rw-r--r--amor/data/pics/animated/pingu/bash_r1.pngbin0 -> 954 bytes
-rw-r--r--amor/data/pics/animated/pingu/bash_r10.pngbin0 -> 977 bytes
-rw-r--r--amor/data/pics/animated/pingu/bash_r11.pngbin0 -> 981 bytes
-rw-r--r--amor/data/pics/animated/pingu/bash_r12.pngbin0 -> 1029 bytes
-rw-r--r--amor/data/pics/animated/pingu/bash_r2.pngbin0 -> 898 bytes
-rw-r--r--amor/data/pics/animated/pingu/bash_r3.pngbin0 -> 797 bytes
-rw-r--r--amor/data/pics/animated/pingu/bash_r4.pngbin0 -> 628 bytes
-rw-r--r--amor/data/pics/animated/pingu/bash_r5.pngbin0 -> 679 bytes
-rw-r--r--amor/data/pics/animated/pingu/bash_r6.pngbin0 -> 747 bytes
-rw-r--r--amor/data/pics/animated/pingu/bash_r7.pngbin0 -> 694 bytes
-rw-r--r--amor/data/pics/animated/pingu/bash_r8.pngbin0 -> 865 bytes
-rw-r--r--amor/data/pics/animated/pingu/bash_r9.pngbin0 -> 907 bytes
-rw-r--r--amor/data/pics/animated/pingu/blocker1.pngbin0 -> 1485 bytes
-rw-r--r--amor/data/pics/animated/pingu/blocker2.pngbin0 -> 1450 bytes
-rw-r--r--amor/data/pics/animated/pingu/blocker3.pngbin0 -> 1411 bytes
-rw-r--r--amor/data/pics/animated/pingu/blocker4.pngbin0 -> 1477 bytes
-rw-r--r--amor/data/pics/animated/pingu/blocker5.pngbin0 -> 1456 bytes
-rw-r--r--amor/data/pics/animated/pingu/blocker6.pngbin0 -> 1421 bytes
-rw-r--r--amor/data/pics/animated/pingu/bomber1.pngbin0 -> 964 bytes
-rw-r--r--amor/data/pics/animated/pingu/bomber10.pngbin0 -> 952 bytes
-rw-r--r--amor/data/pics/animated/pingu/bomber11.pngbin0 -> 852 bytes
-rw-r--r--amor/data/pics/animated/pingu/bomber12.pngbin0 -> 753 bytes
-rw-r--r--amor/data/pics/animated/pingu/bomber13.pngbin0 -> 756 bytes
-rw-r--r--amor/data/pics/animated/pingu/bomber14.pngbin0 -> 324 bytes
-rw-r--r--amor/data/pics/animated/pingu/bomber15.pngbin0 -> 262 bytes
-rw-r--r--amor/data/pics/animated/pingu/bomber16.pngbin0 -> 162 bytes
-rw-r--r--amor/data/pics/animated/pingu/bomber2.pngbin0 -> 964 bytes
-rw-r--r--amor/data/pics/animated/pingu/bomber3.pngbin0 -> 964 bytes
-rw-r--r--amor/data/pics/animated/pingu/bomber4.pngbin0 -> 1001 bytes
-rw-r--r--amor/data/pics/animated/pingu/bomber5.pngbin0 -> 998 bytes
-rw-r--r--amor/data/pics/animated/pingu/bomber6.pngbin0 -> 987 bytes
-rw-r--r--amor/data/pics/animated/pingu/bomber7.pngbin0 -> 986 bytes
-rw-r--r--amor/data/pics/animated/pingu/bomber8.pngbin0 -> 960 bytes
-rw-r--r--amor/data/pics/animated/pingu/bomber9.pngbin0 -> 1101 bytes
-rw-r--r--amor/data/pics/animated/pingu/digger1.pngbin0 -> 1332 bytes
-rw-r--r--amor/data/pics/animated/pingu/digger10.pngbin0 -> 1298 bytes
-rw-r--r--amor/data/pics/animated/pingu/digger11.pngbin0 -> 1394 bytes
-rw-r--r--amor/data/pics/animated/pingu/digger12.pngbin0 -> 1324 bytes
-rw-r--r--amor/data/pics/animated/pingu/digger13.pngbin0 -> 1364 bytes
-rw-r--r--amor/data/pics/animated/pingu/digger14.pngbin0 -> 1324 bytes
-rw-r--r--amor/data/pics/animated/pingu/digger2.pngbin0 -> 1310 bytes
-rw-r--r--amor/data/pics/animated/pingu/digger3.pngbin0 -> 1324 bytes
-rw-r--r--amor/data/pics/animated/pingu/digger4.pngbin0 -> 1319 bytes
-rw-r--r--amor/data/pics/animated/pingu/digger5.pngbin0 -> 1351 bytes
-rw-r--r--amor/data/pics/animated/pingu/digger6.pngbin0 -> 1320 bytes
-rw-r--r--amor/data/pics/animated/pingu/digger7.pngbin0 -> 1314 bytes
-rw-r--r--amor/data/pics/animated/pingu/digger8.pngbin0 -> 1297 bytes
-rw-r--r--amor/data/pics/animated/pingu/digger9.pngbin0 -> 1390 bytes
-rw-r--r--amor/data/pics/animated/pingu/faller1.pngbin0 -> 1032 bytes
-rw-r--r--amor/data/pics/animated/pingu/faller2.pngbin0 -> 1002 bytes
-rw-r--r--amor/data/pics/animated/pingu/faller3.pngbin0 -> 990 bytes
-rw-r--r--amor/data/pics/animated/pingu/faller4.pngbin0 -> 926 bytes
-rw-r--r--amor/data/pics/animated/pingu/faller5.pngbin0 -> 973 bytes
-rw-r--r--amor/data/pics/animated/pingu/faller6.pngbin0 -> 1002 bytes
-rw-r--r--amor/data/pics/animated/pingu/faller7.pngbin0 -> 1032 bytes
-rw-r--r--amor/data/pics/animated/pingu/faller8.pngbin0 -> 1076 bytes
-rw-r--r--amor/data/pics/animated/pingu/floater1.pngbin0 -> 960 bytes
-rw-r--r--amor/data/pics/animated/pingu/floater2.pngbin0 -> 960 bytes
-rw-r--r--amor/data/pics/animated/pingu/floater3.pngbin0 -> 961 bytes
-rw-r--r--amor/data/pics/animated/pingu/floater4.pngbin0 -> 967 bytes
-rw-r--r--amor/data/pics/animated/pingu/floater5.pngbin0 -> 960 bytes
-rw-r--r--amor/data/pics/animated/pingu/floater6.pngbin0 -> 965 bytes
-rw-r--r--amor/data/pics/animated/pingu/floater7.pngbin0 -> 959 bytes
-rw-r--r--amor/data/pics/animated/pingu/floater8.pngbin0 -> 965 bytes
-rw-r--r--amor/data/pics/animated/pingu/tumble1.pngbin0 -> 1319 bytes
-rw-r--r--amor/data/pics/animated/pingu/tumble2.pngbin0 -> 873 bytes
-rw-r--r--amor/data/pics/animated/pingu/tumble3.pngbin0 -> 847 bytes
-rw-r--r--amor/data/pics/animated/pingu/tumble4.pngbin0 -> 587 bytes
-rw-r--r--amor/data/pics/animated/pingu/tumble5.pngbin0 -> 764 bytes
-rw-r--r--amor/data/pics/animated/pingu/tumble6.pngbin0 -> 693 bytes
-rw-r--r--amor/data/pics/animated/pingu/tumble7.pngbin0 -> 725 bytes
-rw-r--r--amor/data/pics/animated/pingu/tumble8.pngbin0 -> 1066 bytes
-rw-r--r--amor/data/pics/animated/pingu/walk_l1.pngbin0 -> 869 bytes
-rw-r--r--amor/data/pics/animated/pingu/walk_l2.pngbin0 -> 859 bytes
-rw-r--r--amor/data/pics/animated/pingu/walk_l3.pngbin0 -> 927 bytes
-rw-r--r--amor/data/pics/animated/pingu/walk_l4.pngbin0 -> 858 bytes
-rw-r--r--amor/data/pics/animated/pingu/walk_l5.pngbin0 -> 842 bytes
-rw-r--r--amor/data/pics/animated/pingu/walk_l6.pngbin0 -> 744 bytes
-rw-r--r--amor/data/pics/animated/pingu/walk_l7.pngbin0 -> 909 bytes
-rw-r--r--amor/data/pics/animated/pingu/walk_l8.pngbin0 -> 958 bytes
-rw-r--r--amor/data/pics/animated/pingu/walk_r1.pngbin0 -> 1008 bytes
-rw-r--r--amor/data/pics/animated/pingu/walk_r2.pngbin0 -> 868 bytes
-rw-r--r--amor/data/pics/animated/pingu/walk_r3.pngbin0 -> 753 bytes
-rw-r--r--amor/data/pics/animated/pingu/walk_r4.pngbin0 -> 844 bytes
-rw-r--r--amor/data/pics/animated/pingu/walk_r5.pngbin0 -> 896 bytes
-rw-r--r--amor/data/pics/animated/pingu/walk_r6.pngbin0 -> 959 bytes
-rw-r--r--amor/data/pics/animated/pingu/walk_r7.pngbin0 -> 845 bytes
-rw-r--r--amor/data/pics/animated/pingu/walk_r8.pngbin0 -> 848 bytes
-rw-r--r--amor/data/pics/animated/tao/Makefile.am50
-rw-r--r--amor/data/pics/animated/tao/yy-1.pngbin0 -> 1140 bytes
-rw-r--r--amor/data/pics/animated/tao/yy-2.pngbin0 -> 1116 bytes
-rw-r--r--amor/data/pics/animated/tao/yy-3.pngbin0 -> 1098 bytes
-rw-r--r--amor/data/pics/animated/tao/yy-4.pngbin0 -> 1070 bytes
-rw-r--r--amor/data/pics/animated/tao/yy-5.pngbin0 -> 985 bytes
-rw-r--r--amor/data/pics/animated/tao/yy-6.pngbin0 -> 985 bytes
-rw-r--r--amor/data/pics/animated/tao/yy-7.pngbin0 -> 953 bytes
-rw-r--r--amor/data/pics/animated/tao/yy-8.pngbin0 -> 924 bytes
-rw-r--r--amor/data/pics/animated/tao/yy-9.pngbin0 -> 887 bytes
-rw-r--r--amor/data/pics/animated/tao/yy.pngbin0 -> 1156 bytes
-rw-r--r--amor/data/pics/animated/tao/yy105.pngbin0 -> 1190 bytes
-rw-r--r--amor/data/pics/animated/tao/yy120.pngbin0 -> 1283 bytes
-rw-r--r--amor/data/pics/animated/tao/yy135.pngbin0 -> 1237 bytes
-rw-r--r--amor/data/pics/animated/tao/yy15.pngbin0 -> 1114 bytes
-rw-r--r--amor/data/pics/animated/tao/yy150.pngbin0 -> 1272 bytes
-rw-r--r--amor/data/pics/animated/tao/yy165.pngbin0 -> 1218 bytes
-rw-r--r--amor/data/pics/animated/tao/yy180.pngbin0 -> 1171 bytes
-rw-r--r--amor/data/pics/animated/tao/yy195.pngbin0 -> 1122 bytes
-rw-r--r--amor/data/pics/animated/tao/yy210.pngbin0 -> 1131 bytes
-rw-r--r--amor/data/pics/animated/tao/yy225.pngbin0 -> 1205 bytes
-rw-r--r--amor/data/pics/animated/tao/yy240.pngbin0 -> 1272 bytes
-rw-r--r--amor/data/pics/animated/tao/yy255.pngbin0 -> 1241 bytes
-rw-r--r--amor/data/pics/animated/tao/yy270.pngbin0 -> 1188 bytes
-rw-r--r--amor/data/pics/animated/tao/yy285.pngbin0 -> 1196 bytes
-rw-r--r--amor/data/pics/animated/tao/yy30.pngbin0 -> 1146 bytes
-rw-r--r--amor/data/pics/animated/tao/yy300.pngbin0 -> 1206 bytes
-rw-r--r--amor/data/pics/animated/tao/yy315.pngbin0 -> 1240 bytes
-rw-r--r--amor/data/pics/animated/tao/yy330.pngbin0 -> 1239 bytes
-rw-r--r--amor/data/pics/animated/tao/yy345.pngbin0 -> 1197 bytes
-rw-r--r--amor/data/pics/animated/tao/yy45.pngbin0 -> 1188 bytes
-rw-r--r--amor/data/pics/animated/tao/yy60.pngbin0 -> 1303 bytes
-rw-r--r--amor/data/pics/animated/tao/yy75.pngbin0 -> 1266 bytes
-rw-r--r--amor/data/pics/animated/tao/yy90.pngbin0 -> 1171 bytes
-rw-r--r--amor/data/pics/animated/tao/yyx10.pngbin0 -> 332 bytes
-rw-r--r--amor/data/pics/animated/tao/yyx12.pngbin0 -> 365 bytes
-rw-r--r--amor/data/pics/animated/tao/yyx14.pngbin0 -> 485 bytes
-rw-r--r--amor/data/pics/animated/tao/yyx16.pngbin0 -> 495 bytes
-rw-r--r--amor/data/pics/animated/tao/yyx18.pngbin0 -> 647 bytes
-rw-r--r--amor/data/pics/animated/tao/yyx20.pngbin0 -> 716 bytes
-rw-r--r--amor/data/pics/animated/tao/yyx22.pngbin0 -> 743 bytes
-rw-r--r--amor/data/pics/animated/tao/yyx24.pngbin0 -> 817 bytes
-rw-r--r--amor/data/pics/animated/tao/yyx26.pngbin0 -> 913 bytes
-rw-r--r--amor/data/pics/animated/tao/yyx28.pngbin0 -> 947 bytes
-rw-r--r--amor/data/pics/animated/tao/yyx30.pngbin0 -> 1062 bytes
-rw-r--r--amor/data/pics/animated/tao/yyx6.pngbin0 -> 206 bytes
-rw-r--r--amor/data/pics/animated/tao/yyx8.pngbin0 -> 267 bytes
-rw-r--r--amor/data/pics/animated/worm/Makefile.am40
-rw-r--r--amor/data/pics/animated/worm/w-a1.pngbin0 -> 332 bytes
-rw-r--r--amor/data/pics/animated/worm/w-a2.pngbin0 -> 339 bytes
-rw-r--r--amor/data/pics/animated/worm/w-b1.pngbin0 -> 306 bytes
-rw-r--r--amor/data/pics/animated/worm/w-b2.pngbin0 -> 304 bytes
-rw-r--r--amor/data/pics/animated/worm/w-be1.pngbin0 -> 310 bytes
-rw-r--r--amor/data/pics/animated/worm/w-be2.pngbin0 -> 305 bytes
-rw-r--r--amor/data/pics/animated/worm/w-be3.pngbin0 -> 312 bytes
-rw-r--r--amor/data/pics/animated/worm/w-be4.pngbin0 -> 325 bytes
-rw-r--r--amor/data/pics/animated/worm/w-d1.pngbin0 -> 290 bytes
-rw-r--r--amor/data/pics/animated/worm/w-d2.pngbin0 -> 259 bytes
-rw-r--r--amor/data/pics/animated/worm/w-d3.pngbin0 -> 259 bytes
-rw-r--r--amor/data/pics/animated/worm/w-d4.pngbin0 -> 241 bytes
-rw-r--r--amor/data/pics/animated/worm/w-d5.pngbin0 -> 180 bytes
-rw-r--r--amor/data/pics/animated/worm/w-dr1.pngbin0 -> 321 bytes
-rw-r--r--amor/data/pics/animated/worm/w-e1.pngbin0 -> 293 bytes
-rw-r--r--amor/data/pics/animated/worm/w-l1.pngbin0 -> 333 bytes
-rw-r--r--amor/data/pics/animated/worm/w-l2.pngbin0 -> 335 bytes
-rw-r--r--amor/data/pics/animated/worm/w-l3.pngbin0 -> 344 bytes
-rw-r--r--amor/data/pics/animated/worm/w-ml0.pngbin0 -> 315 bytes
-rw-r--r--amor/data/pics/animated/worm/w-ml1.pngbin0 -> 330 bytes
-rw-r--r--amor/data/pics/animated/worm/w-ml2.pngbin0 -> 322 bytes
-rw-r--r--amor/data/pics/animated/worm/w-ml3.pngbin0 -> 319 bytes
-rw-r--r--amor/data/pics/animated/worm/w-mr0.pngbin0 -> 311 bytes
-rw-r--r--amor/data/pics/animated/worm/w-mr1.pngbin0 -> 326 bytes
-rw-r--r--amor/data/pics/animated/worm/w-mr2.pngbin0 -> 318 bytes
-rw-r--r--amor/data/pics/animated/worm/w-mr3.pngbin0 -> 327 bytes
-rw-r--r--amor/data/pics/animated/worm/w-s1.pngbin0 -> 235 bytes
-rw-r--r--amor/data/pics/animated/worm/w-s2.pngbin0 -> 257 bytes
-rw-r--r--amor/data/pics/animated/worm/w-s3.pngbin0 -> 251 bytes
-rw-r--r--amor/data/pics/animated/worm/w-u1.pngbin0 -> 218 bytes
-rw-r--r--amor/data/pics/animated/worm/w-u2.pngbin0 -> 260 bytes
-rw-r--r--amor/data/pics/animated/worm/w-u3.pngbin0 -> 276 bytes
-rw-r--r--amor/data/pics/animated/worm/w-wl1.pngbin0 -> 322 bytes
-rw-r--r--amor/data/pics/animated/worm/w-wl2.pngbin0 -> 329 bytes
-rw-r--r--amor/data/pics/animated/worm/w-wr1.pngbin0 -> 317 bytes
-rw-r--r--amor/data/pics/animated/worm/w-wr2.pngbin0 -> 327 bytes
-rw-r--r--amor/data/pics/preview/Makefile.am5
-rw-r--r--amor/data/pics/preview/billy.pngbin0 -> 547 bytes
-rw-r--r--amor/data/pics/preview/blob.pngbin0 -> 556 bytes
-rw-r--r--amor/data/pics/preview/bonhomme.pngbin0 -> 296 bytes
-rw-r--r--amor/data/pics/preview/bsd.pngbin0 -> 1329 bytes
-rw-r--r--amor/data/pics/preview/eyes.pngbin0 -> 241 bytes
-rw-r--r--amor/data/pics/preview/ghost.pngbin0 -> 425 bytes
-rw-r--r--amor/data/pics/preview/neko.pngbin0 -> 315 bytes
-rw-r--r--amor/data/pics/preview/tao.pngbin0 -> 1776 bytes
-rw-r--r--amor/data/pics/preview/tux.pngbin0 -> 605 bytes
-rw-r--r--amor/data/pics/preview/worm.pngbin0 -> 311 bytes
-rw-r--r--amor/data/pics/static/Makefile.am5
-rw-r--r--amor/data/pics/static/billy.pngbin0 -> 824 bytes
-rw-r--r--amor/data/pics/static/bsd.pngbin0 -> 2321 bytes
-rw-r--r--amor/data/pics/static/tux.pngbin0 -> 1694 bytes
-rw-r--r--amor/data/pingurc167
-rw-r--r--amor/data/taorc148
-rw-r--r--amor/data/tips-en39
-rw-r--r--amor/data/tuxrc127
-rw-r--r--amor/data/wormrc225
-rw-r--r--amor/hi16-app-amor.pngbin0 -> 1012 bytes
-rw-r--r--amor/hi22-app-amor.pngbin0 -> 1515 bytes
-rw-r--r--amor/hi32-app-amor.pngbin0 -> 2680 bytes
-rw-r--r--amor/hi48-app-amor.pngbin0 -> 4595 bytes
-rw-r--r--amor/main.cpp70
-rw-r--r--amor/preparetips45
-rw-r--r--amor/version.h1
-rw-r--r--configure.in.in6
-rw-r--r--doc/Makefile.am5
-rw-r--r--doc/amor/Makefile.am5
-rw-r--r--doc/amor/billy.pngbin0 -> 824 bytes
-rw-r--r--doc/amor/bonhomme.pngbin0 -> 271 bytes
-rw-r--r--doc/amor/bsd.pngbin0 -> 2321 bytes
-rw-r--r--doc/amor/eyes.pngbin0 -> 198 bytes
-rw-r--r--doc/amor/ghost.pngbin0 -> 421 bytes
-rw-r--r--doc/amor/index.docbook318
-rw-r--r--doc/amor/man-amor.6.docbook72
-rw-r--r--doc/amor/neko.pngbin0 -> 284 bytes
-rw-r--r--doc/amor/pingus.pngbin0 -> 956 bytes
-rw-r--r--doc/amor/spot.pngbin0 -> 575 bytes
-rw-r--r--doc/amor/tao.pngbin0 -> 672 bytes
-rw-r--r--doc/amor/tux.pngbin0 -> 1694 bytes
-rw-r--r--doc/amor/worm.pngbin0 -> 316 bytes
-rw-r--r--doc/kmoon/Makefile.am4
-rw-r--r--doc/kmoon/carlosmail74
-rw-r--r--doc/kmoon/index.docbook131
-rw-r--r--doc/kodo/Makefile.am4
-rw-r--r--doc/kodo/guide.pngbin0 -> 3141 bytes
-rw-r--r--doc/kodo/index.docbook225
-rw-r--r--doc/kteatime/Makefile.am4
-rw-r--r--doc/kteatime/config.pngbin0 -> 19936 bytes
-rw-r--r--doc/kteatime/index.docbook148
-rw-r--r--doc/kweather/Makefile.am4
-rw-r--r--doc/kweather/index.docbook260
-rw-r--r--doc/kworldclock/Makefile.am4
-rw-r--r--doc/kworldclock/index.docbook503
-rw-r--r--doc/kworldclock/man-kworldclock.1.docbook92
-rw-r--r--doc/kworldclock/screenshot-clock-dialog.pngbin0 -> 7734 bytes
-rw-r--r--doc/kworldclock/screenshot-mlb.pngbin0 -> 73041 bytes
-rw-r--r--doc/kworldclock/screenshot-quairading-clock.pngbin0 -> 78700 bytes
-rw-r--r--doc/kworldclock/screenshot-quairading-dialog.pngbin0 -> 7885 bytes
-rw-r--r--doc/kworldclock/screenshot-rmb-cities.pngbin0 -> 3560 bytes
-rw-r--r--doc/kworldclock/screenshot-rmb-clock.pngbin0 -> 3432 bytes
-rw-r--r--doc/kworldclock/screenshot-rmb-daylight.pngbin0 -> 3585 bytes
-rw-r--r--doc/kworldclock/screenshot-rmb-flags.pngbin0 -> 3537 bytes
-rw-r--r--doc/kworldclock/screenshot-withclocks.pngbin0 -> 79472 bytes
-rw-r--r--doc/kworldclock/screenshot-withflags.pngbin0 -> 74907 bytes
-rw-r--r--doc/kworldclock/screenshot.pngbin0 -> 20153 bytes
-rw-r--r--eyesapplet/Makefile.am20
-rw-r--r--eyesapplet/configure.in.in3
-rw-r--r--eyesapplet/eyes.cpp202
-rw-r--r--eyesapplet/eyes.h48
-rw-r--r--eyesapplet/eyesapplet.desktop120
-rw-r--r--fifteenapplet/Makefile.am19
-rw-r--r--fifteenapplet/fifteenapplet.cpp321
-rw-r--r--fifteenapplet/fifteenapplet.h84
-rw-r--r--fifteenapplet/kfifteenapplet.desktop118
-rw-r--r--fifteenapplet/qttableview.cpp2274
-rw-r--r--fifteenapplet/qttableview.h251
-rw-r--r--kdetoys.lsm11
-rw-r--r--kmoon/AUTHORS10
-rw-r--r--kmoon/Makefile.am20
-rw-r--r--kmoon/hi16-app-kmoon.pngbin0 -> 332 bytes
-rw-r--r--kmoon/hi32-app-kmoon.pngbin0 -> 2111 bytes
-rw-r--r--kmoon/hi48-app-kmoon.pngbin0 -> 4120 bytes
-rw-r--r--kmoon/kmoonapplet.cpp165
-rw-r--r--kmoon/kmoonapplet.desktop109
-rw-r--r--kmoon/kmoonapplet.h67
-rw-r--r--kmoon/kmoondlg.cpp114
-rw-r--r--kmoon/kmoondlg.h55
-rw-r--r--kmoon/kmoonwidget.cpp369
-rw-r--r--kmoon/kmoonwidget.h68
-rw-r--r--kmoon/phases.cpp383
-rw-r--r--kmoon/pics/Makefile.am13
-rw-r--r--kmoon/pics/moon1.pngbin0 -> 3186 bytes
-rw-r--r--kmoon/pics/moon10.pngbin0 -> 4770 bytes
-rw-r--r--kmoon/pics/moon11.pngbin0 -> 4814 bytes
-rw-r--r--kmoon/pics/moon12.pngbin0 -> 4809 bytes
-rw-r--r--kmoon/pics/moon13.pngbin0 -> 4794 bytes
-rw-r--r--kmoon/pics/moon14.pngbin0 -> 5496 bytes
-rw-r--r--kmoon/pics/moon15.pngbin0 -> 4806 bytes
-rw-r--r--kmoon/pics/moon16.pngbin0 -> 4818 bytes
-rw-r--r--kmoon/pics/moon17.pngbin0 -> 4803 bytes
-rw-r--r--kmoon/pics/moon18.pngbin0 -> 4836 bytes
-rw-r--r--kmoon/pics/moon19.pngbin0 -> 4858 bytes
-rw-r--r--kmoon/pics/moon2.pngbin0 -> 3186 bytes
-rw-r--r--kmoon/pics/moon20.pngbin0 -> 4868 bytes
-rw-r--r--kmoon/pics/moon21.pngbin0 -> 4786 bytes
-rw-r--r--kmoon/pics/moon22.pngbin0 -> 4613 bytes
-rw-r--r--kmoon/pics/moon23.pngbin0 -> 4317 bytes
-rw-r--r--kmoon/pics/moon24.pngbin0 -> 4049 bytes
-rw-r--r--kmoon/pics/moon25.pngbin0 -> 3768 bytes
-rw-r--r--kmoon/pics/moon26.pngbin0 -> 3543 bytes
-rw-r--r--kmoon/pics/moon27.pngbin0 -> 3341 bytes
-rw-r--r--kmoon/pics/moon28.pngbin0 -> 3207 bytes
-rw-r--r--kmoon/pics/moon29.pngbin0 -> 3186 bytes
-rw-r--r--kmoon/pics/moon3.pngbin0 -> 3187 bytes
-rw-r--r--kmoon/pics/moon4.pngbin0 -> 3349 bytes
-rw-r--r--kmoon/pics/moon5.pngbin0 -> 3611 bytes
-rw-r--r--kmoon/pics/moon6.pngbin0 -> 3859 bytes
-rw-r--r--kmoon/pics/moon7.pngbin0 -> 4228 bytes
-rw-r--r--kmoon/pics/moon8.pngbin0 -> 4497 bytes
-rw-r--r--kmoon/pics/moon9.pngbin0 -> 4678 bytes
-rw-r--r--kmoon/version.h1
-rw-r--r--kodo/ChangeLog42
-rw-r--r--kodo/Makefile.am22
-rw-r--r--kodo/configure.in.in3
-rw-r--r--kodo/hi16-app-kodo.pngbin0 -> 226 bytes
-rw-r--r--kodo/hi32-app-kodo.pngbin0 -> 1698 bytes
-rw-r--r--kodo/hi48-app-kodo.pngbin0 -> 2865 bytes
-rw-r--r--kodo/kimagenumber.cpp79
-rw-r--r--kodo/kimagenumber.h53
-rw-r--r--kodo/kodo.desktop69
-rw-r--r--kodo/kodometer.cpp600
-rw-r--r--kodo/kodometer.h163
-rw-r--r--kodo/main.cpp100
-rw-r--r--kodo/numbers.pngbin0 -> 2372 bytes
-rw-r--r--kteatime/ChangeLog105
-rw-r--r--kteatime/Makefile.am27
-rw-r--r--kteatime/TODO58
-rw-r--r--kteatime/cr22-action-mug.pngbin0 -> 310 bytes
-rw-r--r--kteatime/cr22-action-tea_anim1.pngbin0 -> 310 bytes
-rw-r--r--kteatime/cr22-action-tea_anim2.pngbin0 -> 362 bytes
-rw-r--r--kteatime/cr22-action-tea_not_ready.pngbin0 -> 441 bytes
-rw-r--r--kteatime/eventsrc183
-rw-r--r--kteatime/hi16-app-kteatime.pngbin0 -> 815 bytes
-rw-r--r--kteatime/hi32-app-kteatime.pngbin0 -> 2287 bytes
-rw-r--r--kteatime/hi48-app-kteatime.pngbin0 -> 4001 bytes
-rw-r--r--kteatime/kteatime.desktop72
-rw-r--r--kteatime/main.cpp60
-rw-r--r--kteatime/tealist.cpp64
-rw-r--r--kteatime/tealist.h37
-rw-r--r--kteatime/timeedit.cpp146
-rw-r--r--kteatime/timeedit.h72
-rw-r--r--kteatime/toplevel.cpp856
-rw-r--r--kteatime/toplevel.h124
-rw-r--r--ktux/AUTHORS2
-rw-r--r--ktux/Makefile.am38
-rw-r--r--ktux/hi16-app-ktux.pngbin0 -> 628 bytes
-rw-r--r--ktux/hi32-app-ktux.pngbin0 -> 1335 bytes
-rw-r--r--ktux/ktux.desktop212
-rw-r--r--ktux/sprite.cpp254
-rw-r--r--ktux/sprite.h72
-rw-r--r--ktux/spriteanim.cpp161
-rw-r--r--ktux/spriteanim.h96
-rw-r--r--ktux/spritemisc.cpp69
-rw-r--r--ktux/spritemisc.h41
-rw-r--r--ktux/spritepm.cpp176
-rw-r--r--ktux/spritepm.h85
-rw-r--r--ktux/sprites/Makefile.am8
-rw-r--r--ktux/sprites/anim0001.pngbin0 -> 23517 bytes
-rw-r--r--ktux/sprites/anim0002.pngbin0 -> 23245 bytes
-rw-r--r--ktux/sprites/anim0003.pngbin0 -> 23646 bytes
-rw-r--r--ktux/sprites/anim0004.pngbin0 -> 23725 bytes
-rw-r--r--ktux/sprites/anim0005.pngbin0 -> 23541 bytes
-rw-r--r--ktux/sprites/anim0006.pngbin0 -> 23573 bytes
-rw-r--r--ktux/sprites/anim0007.pngbin0 -> 23537 bytes
-rw-r--r--ktux/sprites/anim0008.pngbin0 -> 23680 bytes
-rw-r--r--ktux/sprites/anim0009.pngbin0 -> 23642 bytes
-rw-r--r--ktux/sprites/anim0010.pngbin0 -> 23257 bytes
-rw-r--r--ktux/sprites/bg.pngbin0 -> 7799 bytes
-rw-r--r--ktux/sprites/flare0001.pngbin0 -> 210 bytes
-rw-r--r--ktux/sprites/flare0002.pngbin0 -> 325 bytes
-rw-r--r--ktux/sprites/spriterc62
-rw-r--r--ktux/sprites/star0001.pngbin0 -> 194 bytes
-rw-r--r--ktux/sprites/star0002.pngbin0 -> 219 bytes
-rw-r--r--kweather/AUTHORS2
-rw-r--r--kweather/Makefile.am81
-rw-r--r--kweather/configure.in.in1
-rw-r--r--kweather/dockwidget.cpp467
-rw-r--r--kweather/dockwidget.h74
-rw-r--r--kweather/graphics/Makefile.am2
-rw-r--r--kweather/graphics/cloudy1.pngbin0 -> 25863 bytes
-rw-r--r--kweather/graphics/cloudy1_night.pngbin0 -> 12158 bytes
-rw-r--r--kweather/graphics/cloudy2.pngbin0 -> 30104 bytes
-rw-r--r--kweather/graphics/cloudy2_night.pngbin0 -> 15873 bytes
-rw-r--r--kweather/graphics/cloudy3.pngbin0 -> 34246 bytes
-rw-r--r--kweather/graphics/cloudy3_night.pngbin0 -> 23591 bytes
-rw-r--r--kweather/graphics/cloudy4.pngbin0 -> 36185 bytes
-rw-r--r--kweather/graphics/cloudy4_night.pngbin0 -> 22352 bytes
-rw-r--r--kweather/graphics/cloudy5.pngbin0 -> 32965 bytes
-rw-r--r--kweather/graphics/dunno.pngbin0 -> 30291 bytes
-rw-r--r--kweather/graphics/fog.pngbin0 -> 24326 bytes
-rw-r--r--kweather/graphics/fog_night.pngbin0 -> 10668 bytes
-rw-r--r--kweather/graphics/hail.pngbin0 -> 16727 bytes
-rw-r--r--kweather/graphics/light_rain.pngbin0 -> 15829 bytes
-rw-r--r--kweather/graphics/mist.pngbin0 -> 20351 bytes
-rw-r--r--kweather/graphics/mist_night.pngbin0 -> 10610 bytes
-rw-r--r--kweather/graphics/overcast.pngbin0 -> 32965 bytes
-rw-r--r--kweather/graphics/shower1.pngbin0 -> 24250 bytes
-rw-r--r--kweather/graphics/shower1_night.pngbin0 -> 18561 bytes
-rw-r--r--kweather/graphics/shower2.pngbin0 -> 20264 bytes
-rw-r--r--kweather/graphics/shower2_night.pngbin0 -> 18310 bytes
-rw-r--r--kweather/graphics/shower3.pngbin0 -> 16586 bytes
-rw-r--r--kweather/graphics/sleet.pngbin0 -> 23754 bytes
-rw-r--r--kweather/graphics/snow1.pngbin0 -> 24645 bytes
-rw-r--r--kweather/graphics/snow1_night.pngbin0 -> 20625 bytes
-rw-r--r--kweather/graphics/snow2.pngbin0 -> 21863 bytes
-rw-r--r--kweather/graphics/snow2_night.pngbin0 -> 21216 bytes
-rw-r--r--kweather/graphics/snow3.pngbin0 -> 22085 bytes
-rw-r--r--kweather/graphics/snow3_night.pngbin0 -> 23235 bytes
-rw-r--r--kweather/graphics/snow4.pngbin0 -> 21647 bytes
-rw-r--r--kweather/graphics/snow5.pngbin0 -> 23920 bytes
-rw-r--r--kweather/graphics/sunny.pngbin0 -> 20311 bytes
-rw-r--r--kweather/graphics/sunny_night.pngbin0 -> 7803 bytes
-rw-r--r--kweather/graphics/tstorm1.pngbin0 -> 24349 bytes
-rw-r--r--kweather/graphics/tstorm1_night.pngbin0 -> 20512 bytes
-rw-r--r--kweather/graphics/tstorm2.pngbin0 -> 21822 bytes
-rw-r--r--kweather/graphics/tstorm2_night.pngbin0 -> 21538 bytes
-rw-r--r--kweather/graphics/tstorm3.pngbin0 -> 20220 bytes
-rw-r--r--kweather/hi16-app-kweather.pngbin0 -> 945 bytes
-rw-r--r--kweather/hi32-app-kweather.pngbin0 -> 2603 bytes
-rw-r--r--kweather/hi48-app-kweather.pngbin0 -> 4987 bytes
-rw-r--r--kweather/kcmweather.cpp222
-rw-r--r--kweather/kcmweather.desktop178
-rw-r--r--kweather/kcmweather.h58
-rw-r--r--kweather/kcmweatherservice.cpp72
-rw-r--r--kweather/kcmweatherservice.desktop181
-rw-r--r--kweather/kcmweatherservice.h46
-rw-r--r--kweather/kweather.cpp425
-rw-r--r--kweather/kweather.desktop113
-rw-r--r--kweather/kweather.h90
-rw-r--r--kweather/kweather.kdevprj296
-rw-r--r--kweather/kweatherreport.desktop9
-rw-r--r--kweather/kweatherservice.desktop88
-rw-r--r--kweather/main.cpp35
-rw-r--r--kweather/metar_parser.cpp871
-rw-r--r--kweather/metar_parser.h123
-rw-r--r--kweather/metar_parser_test.cpp218
-rw-r--r--kweather/prefdialogdata.ui360
-rw-r--r--kweather/reportmain.cpp63
-rw-r--r--kweather/reportview.cpp185
-rw-r--r--kweather/reportview.h47
-rw-r--r--kweather/serviceconfigdata.ui258
-rw-r--r--kweather/serviceconfigwidget.cpp239
-rw-r--r--kweather/serviceconfigwidget.h58
-rw-r--r--kweather/sidebarwidget.cpp49
-rw-r--r--kweather/sidebarwidget.h43
-rw-r--r--kweather/sidebarwidgetbase.ui112
-rw-r--r--kweather/stationdatabase.cpp170
-rw-r--r--kweather/stationdatabase.h54
-rw-r--r--kweather/stationdatabase_test.cpp226
-rw-r--r--kweather/stations.dat6615
-rw-r--r--kweather/sun.cpp462
-rw-r--r--kweather/sun.h57
-rw-r--r--kweather/sun_test.cpp84
-rwxr-xr-xkweather/test.sh28
-rw-r--r--kweather/weatherIface.h15
-rw-r--r--kweather/weather_stations.desktop3112
-rw-r--r--kweather/weatherbar.cpp172
-rw-r--r--kweather/weatherbar.desktop61
-rw-r--r--kweather/weatherbar.h68
-rw-r--r--kweather/weatherbar_add.desktop61
-rw-r--r--kweather/weatherbutton.cpp161
-rw-r--r--kweather/weatherbutton.h57
-rw-r--r--kweather/weatherlib.cpp355
-rw-r--r--kweather/weatherlib.h84
-rwxr-xr-xkweather/weatherlog.sh8
-rw-r--r--kweather/weatherservice.cpp343
-rw-r--r--kweather/weatherservice.h107
-rw-r--r--kweather/weathersig.sh14
-rw-r--r--kworldwatch/Makefile.am42
-rw-r--r--kworldwatch/about.ui217
-rw-r--r--kworldwatch/applet.cpp122
-rw-r--r--kworldwatch/applet.h70
-rw-r--r--kworldwatch/astro.c166
-rw-r--r--kworldwatch/astro.h42
-rw-r--r--kworldwatch/cities.cpp208
-rw-r--r--kworldwatch/cities.h87
-rw-r--r--kworldwatch/clock.ui259
-rw-r--r--kworldwatch/flags.cpp145
-rw-r--r--kworldwatch/flags.h100
-rw-r--r--kworldwatch/flow.cpp135
-rw-r--r--kworldwatch/flow.h55
-rw-r--r--kworldwatch/hi16-app-kworldclock.pngbin0 -> 933 bytes
-rw-r--r--kworldwatch/hi22-app-kworldclock.pngbin0 -> 1544 bytes
-rw-r--r--kworldwatch/hi32-app-kworldclock.pngbin0 -> 2651 bytes
-rw-r--r--kworldwatch/hi48-app-kworldclock.pngbin0 -> 4825 bytes
-rw-r--r--kworldwatch/kdeworld.desktop69
-rw-r--r--kworldwatch/kworldclock.desktop80
-rw-r--r--kworldwatch/kwwapplet.desktop107
-rw-r--r--kworldwatch/main.cpp202
-rw-r--r--kworldwatch/main.h85
-rw-r--r--kworldwatch/maploader.cpp172
-rw-r--r--kworldwatch/maploader.h81
-rw-r--r--kworldwatch/maps/Makefile.am1
-rw-r--r--kworldwatch/maps/README.maps10
-rw-r--r--kworldwatch/maps/depths/400.jpgbin0 -> 28526 bytes
-rw-r--r--kworldwatch/maps/depths/800.jpgbin0 -> 105465 bytes
-rw-r--r--kworldwatch/maps/depths/Makefile.am2
-rw-r--r--kworldwatch/maps/depths/depths.desktop64
-rw-r--r--kworldwatch/maps/flatworld/1200.jpgbin0 -> 89701 bytes
-rw-r--r--kworldwatch/maps/flatworld/1600.jpgbin0 -> 124709 bytes
-rw-r--r--kworldwatch/maps/flatworld/200.jpgbin0 -> 9330 bytes
-rw-r--r--kworldwatch/maps/flatworld/400.jpgbin0 -> 22751 bytes
-rw-r--r--kworldwatch/maps/flatworld/800.jpgbin0 -> 51623 bytes
-rw-r--r--kworldwatch/maps/flatworld/Makefile.am2
-rw-r--r--kworldwatch/maps/flatworld/flatworld.desktop53
-rw-r--r--kworldwatch/mapwidget.cpp576
-rw-r--r--kworldwatch/mapwidget.h161
-rw-r--r--kworldwatch/pics/Makefile.am2
-rw-r--r--kworldwatch/pics/flag-blue.pngbin0 -> 316 bytes
-rw-r--r--kworldwatch/pics/flag-green.pngbin0 -> 314 bytes
-rw-r--r--kworldwatch/pics/flag-mask.xpm21
-rw-r--r--kworldwatch/pics/flag-red.pngbin0 -> 313 bytes
-rw-r--r--kworldwatch/pics/flag.pngbin0 -> 289 bytes
-rw-r--r--kworldwatch/pics/world2.pngbin0 -> 5132 bytes
-rw-r--r--kworldwatch/sunclock.c164
-rw-r--r--kworldwatch/sunclock.h98
-rw-r--r--kworldwatch/zone.tab409
-rw-r--r--kworldwatch/zoneclock.cpp287
-rw-r--r--kworldwatch/zoneclock.h134
748 files changed, 39536 insertions, 0 deletions
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..5b67f26
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,4 @@
+
+Look in the subdirs to get infos about the authors.
+
+The package is maintained by Stephan Kulow <coolo@kde.org>
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..5185fd3
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,346 @@
+NOTE! The GPL below is copyrighted by the Free Software Foundation, but
+the instance of code that it refers to (the kde programs) are copyrighted
+by the authors who actually wrote it.
+
+---------------------------------------------------------------------------
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/COPYING-DOCS b/COPYING-DOCS
new file mode 100644
index 0000000..4a0fe1c
--- /dev/null
+++ b/COPYING-DOCS
@@ -0,0 +1,397 @@
+ GNU Free Documentation License
+ Version 1.2, November 2002
+
+
+ Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+0. PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document "free" in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+
+
+1. APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The "Document", below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as "you". You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A "Modified Version" of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A "Secondary Section" is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall subject
+(or to related matters) and contains nothing that could fall directly
+within that overall subject. (Thus, if the Document is in part a
+textbook of mathematics, a Secondary Section may not explain any
+mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The "Invariant Sections" are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License. If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
+
+The "Cover Texts" are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not "Transparent" is called "Opaque".
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML, PostScript or PDF designed for human modification. Examples of
+transparent image formats include PNG, XCF and JPG. Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+
+The "Title Page" means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+A section "Entitled XYZ" means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for a
+specific section name mentioned below, such as "Acknowledgements",
+"Dedications", "Endorsements", or "History".) To "Preserve the Title"
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+
+2. VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+
+3. COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+
+4. MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+
+A. Use in the Title Page (and on the covers, if any) a title distinct
+ from that of the Document, and from those of previous versions
+ (which should, if there were any, be listed in the History section
+ of the Document). You may use the same title as a previous version
+ if the original publisher of that version gives permission.
+B. List on the Title Page, as authors, one or more persons or entities
+ responsible for authorship of the modifications in the Modified
+ Version, together with at least five of the principal authors of the
+ Document (all of its principal authors, if it has fewer than five),
+ unless they release you from this requirement.
+C. State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+D. Preserve all the copyright notices of the Document.
+E. Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+F. Include, immediately after the copyright notices, a license notice
+ giving the public permission to use the Modified Version under the
+ terms of this License, in the form shown in the Addendum below.
+G. Preserve in that license notice the full lists of Invariant Sections
+ and required Cover Texts given in the Document's license notice.
+H. Include an unaltered copy of this License.
+I. Preserve the section Entitled "History", Preserve its Title, and add
+ to it an item stating at least the title, year, new authors, and
+ publisher of the Modified Version as given on the Title Page. If
+ there is no section Entitled "History" in the Document, create one
+ stating the title, year, authors, and publisher of the Document as
+ given on its Title Page, then add an item describing the Modified
+ Version as stated in the previous sentence.
+J. Preserve the network location, if any, given in the Document for
+ public access to a Transparent copy of the Document, and likewise
+ the network locations given in the Document for previous versions
+ it was based on. These may be placed in the "History" section.
+ You may omit a network location for a work that was published at
+ least four years before the Document itself, or if the original
+ publisher of the version it refers to gives permission.
+K. For any section Entitled "Acknowledgements" or "Dedications",
+ Preserve the Title of the section, and preserve in the section all
+ the substance and tone of each of the contributor acknowledgements
+ and/or dedications given therein.
+L. Preserve all the Invariant Sections of the Document,
+ unaltered in their text and in their titles. Section numbers
+ or the equivalent are not considered part of the section titles.
+M. Delete any section Entitled "Endorsements". Such a section
+ may not be included in the Modified Version.
+N. Do not retitle any existing section to be Entitled "Endorsements"
+ or to conflict in title with any Invariant Section.
+O. Preserve any Warranty Disclaimers.
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+
+5. COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications". You must delete all sections
+Entitled "Endorsements".
+
+
+6. COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+
+7. AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+
+8. TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+
+9. TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License. Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License. However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+
+10. FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns. See
+http://www.gnu.org/copyleft/.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+
+
+ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+ Copyright (c) YEAR YOUR NAME.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.2
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+ A copy of the license is included in the section entitled "GNU
+ Free Documentation License".
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+
+ with the Invariant Sections being LIST THEIR TITLES, with the
+ Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..f8bad0c
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,176 @@
+Basic Installation
+==================
+
+ These are generic installation instructions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+ The file `configure.in' is used to create `configure' by a program
+called `autoconf'. You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes a while. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 5. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. You can give `configure'
+initial values for variables by setting them in the environment. Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+ CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+ env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+ If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory. After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+ By default, `make install' will install the package's files in
+`/usr/local/kde/bin', `/usr/local/kde/lib', etc. You can specify an
+installation prefix other than `/usr/local/kde' by giving `configure'
+the option `--prefix=PATH'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on. Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+ CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+ If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+ Use and save the results of the tests in FILE instead of
+ `./config.cache'. Set FILE to `/dev/null' to disable caching, for
+ debugging `configure'.
+
+`--help'
+ Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made.
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`--version'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
+
diff --git a/Makefile.am.in b/Makefile.am.in
new file mode 100644
index 0000000..df56ae0
--- /dev/null
+++ b/Makefile.am.in
@@ -0,0 +1,6 @@
+AUTOMAKE_OPTIONS = foreign 1.6.1
+DISTCLEANFILES = inst-apps
+
+MAINTAINERCLEANFILES = subdirs configure.in acinclude.m4 SUBDIRS
+include admin/deps.am
+
diff --git a/Makefile.cvs b/Makefile.cvs
new file mode 100644
index 0000000..be59a86
--- /dev/null
+++ b/Makefile.cvs
@@ -0,0 +1,14 @@
+all:
+ @echo "This Makefile is only for the CVS repository"
+ @echo "This will be deleted before making the distribution"
+ @echo ""
+ @if test ! -d admin; then \
+ echo "Please recheckout this module!" ;\
+ echo "for cvs: use checkout once and after that update again" ;\
+ echo "for cvsup: checkout kde-common from cvsup and" ;\
+ echo " link kde-common/admin to ./admin" ;\
+ exit 1 ;\
+ fi
+ $(MAKE) -f admin/Makefile.common cvs
+
+.SILENT:
diff --git a/README b/README
new file mode 100644
index 0000000..0f3eb1b
--- /dev/null
+++ b/README
@@ -0,0 +1,47 @@
+In this file:
+
+* What it is
+* Common Mistakes
+* Debugging
+* More Info
+
+What it is
+----------
+
+* amor: Amusing Misuse Of Resources put's comic figures above your windows
+* eyesapplet: a kicker applet similar to XEyes
+* fifteenapplet: kicker applet, order 15 pieces in a 4x4 square by moving them
+* kaphorism: displays aphorisms
+* kmoon: system tray applet showing the moon phase
+* kodo: mouse movement meter
+* kscore: kicker applet with a sports ticker
+* kteatime: system tray applet that makes sure your tea doesn't get too strong
+* ktux: Tux-in-a-Spaceship screen saver
+* kweather: kicker applet that will display the current weather outside
+* kworldwatch: application and kicker applet showing daylight area on the world
+ globe
+
+Common Mistakes
+---------------
+
+If configure claims Qt cannot be found, have a look at http://www.trolltech.com
+to get the latest copy of Qt 3.3.x version.
+
+Debugging
+---------
+
+You can use --enable-debug with the configure script, if you want to have
+debug code in your KDE apps and libs. I recommend to do this, since this
+is alpha software and this makes debugging things a whole lot easier.
+
+More Info
+---------
+
+Have a look at the individual subdirectories, if you want to know, what
+versions of apps are included.
+
+Please direct any bug reports to our bug list by visiting
+http://bugs.kde.org.
+
+General KDE discussions should go to the KDE mailing list (kde@kde.org).
+
diff --git a/amor/AmorIface.h b/amor/AmorIface.h
new file mode 100644
index 0000000..575d18d
--- /dev/null
+++ b/amor/AmorIface.h
@@ -0,0 +1,49 @@
+/* AmorIface.h
+**
+** Copyright (c) 1999 Martin R. Jones <mjones@kde.org>
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+
+#ifndef __AmorIface_h__
+#define __AmorIface_h__
+
+#include <dcopobject.h>
+
+class AmorIface : virtual public DCOPObject
+{
+ K_DCOP
+public:
+
+k_dcop:
+ virtual void showTip(QString tip) = 0;
+ virtual void showMessage(QString message ) = 0;
+ virtual void showMessage(QString message, int msec ) = 0;
+
+ virtual void screenSaverStopped() = 0;
+ virtual void screenSaverStarted() = 0;
+
+};
+
+#endif
+
diff --git a/amor/Makefile.am b/amor/Makefile.am
new file mode 100644
index 0000000..413c24e
--- /dev/null
+++ b/amor/Makefile.am
@@ -0,0 +1,38 @@
+
+# set the include path for X, qt and KDE
+INCLUDES= $(all_includes)
+# claim, which subdirectories you want to install
+SUBDIRS = data
+
+####### This part is very amor specific
+# you can add here more. This one gets installed
+bin_PROGRAMS = amor
+
+# Which sources should be compiled for amor.
+amor_SOURCES = amordialog.cpp amor.cpp amorwidget.cpp main.cpp amoranim.cpp amorpm.cpp\
+ amorbubble.cpp amorconfig.cpp amortips.cpp AmorIface.skel
+
+include_HEADERS = AmorIface.h
+
+# the library search path
+amor_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+
+# the libraries to link against. Be aware of the order. First the libraries,
+# that depend on the following ones.
+amor_LDADD = $(LIB_KDEUI)
+
+# this option you can leave out. Just, if you use "make dist", you need it
+noinst_HEADERS = amor.h amorwidget.h amoranim.h amorpm.h amordialog.h\
+ amorbubble.h amorconfig.h amortips.h
+
+METASOURCES = AUTO
+
+messages:
+ perl ./preparetips > tips.cpp
+ $(XGETTEXT) tips.cpp *.cpp -o $(podir)/amor.pot
+ rm -f tips.cpp
+
+xdg_apps_DATA = amor.desktop
+
+KDE_ICON = amor
+
diff --git a/amor/TODO b/amor/TODO
new file mode 100644
index 0000000..bc9c9f4
--- /dev/null
+++ b/amor/TODO
@@ -0,0 +1,15 @@
+As of 04/14/04...
+
+ - find a way to use round bubbles without using Painter.drawRoundRect,
+because you can only specify the relative roundness of the corners. The corners
+should have a fixed radius.
+
+ - What should be done about messages that arrive while the screensaver
+is on?.
+
+ - Clean up the messages queue. Why is the default timing for messages
+and tips calculated in class queueItem instead of in class Amor?
+
+ - Reduce the delay between a showMessage is received and the bubble is
+actually shown.
+
diff --git a/amor/amor.cpp b/amor/amor.cpp
new file mode 100644
index 0000000..9f98bb3
--- /dev/null
+++ b/amor/amor.cpp
@@ -0,0 +1,1024 @@
+/* amor.cpp
+**
+** Copyright (c) 1999 Martin R. Jones <mjones@kde.org>
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+#include <stdlib.h>
+#include <unistd.h>
+#include <time.h>
+
+#include <kdebug.h>
+
+#include <kpopupmenu.h>
+#include <qtimer.h>
+#include <qcursor.h>
+#include <qvaluelist.h>
+
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kstartupinfo.h>
+#include <kwin.h>
+#include <kwinmodule.h>
+#include <kstandarddirs.h>
+#include <khelpmenu.h>
+#include <kiconloader.h>
+
+#include "amor.h"
+#include "amor.moc"
+#include "amorpm.h"
+#include "amorbubble.h"
+#include "amorwidget.h"
+#include "amordialog.h"
+#include "version.h"
+#include <X11/Xlib.h>
+#include <kdebug.h>
+
+// #define DEBUG_AMOR
+
+#define SLEEP_TIMEOUT 180 // Animation sleeps after SLEEP_TIMEOUT seconds
+ // of mouse inactivity.
+#define TIPS_FILE "tips" // Display tips in TIP_FILE-LANG, e.g "tips-en"
+#define TIP_FREQUENCY 20 // Frequency tips are displayed small == more
+ // often.
+
+#define BUBBLE_TIME_STEP 250
+
+// Standard animation groups
+#define ANIM_BASE "Base"
+#define ANIM_NORMAL "Sequences"
+#define ANIM_FOCUS "Focus"
+#define ANIM_BLUR "Blur"
+#define ANIM_DESTROY "Destroy"
+#define ANIM_SLEEP "Sleep"
+#define ANIM_WAKE "Wake"
+
+//---------------------------------------------------------------------------
+// QueueItem
+// Constructor
+//
+
+QueueItem::QueueItem(itemType ty, QString te, int ti)
+{
+ // if the time field was not given, calculate one based on the type
+ // and length of the item
+ int effectiveLength = 0, nesting = 0;
+
+ // discard html code from the lenght count
+ for (unsigned int i = 0; i < te.length(); i++)
+ {
+ if (te[i] == '<') nesting++;
+ else if (te[i] == '>') nesting--;
+ else if (!nesting) effectiveLength++;
+ }
+ if (nesting) // malformed html
+ {
+#ifdef DEBUG_AMOR
+ kdDebug(10000) << "QueueItem::QueueItem(): Malformed HTML!" << endl;
+#endif
+ effectiveLength = te.length();
+ }
+
+ if (ti == -1)
+ {
+ switch (ty) {
+ case Talk : // shorter times
+ ti = 1500 + 45 * effectiveLength;
+ break;
+ case Tip : // longer times
+ ti = 4000 + 30 * effectiveLength;
+ break;
+ }
+ }
+
+ iType = ty;
+ iText = te;
+ iTime = ti;
+}
+
+//---------------------------------------------------------------------------
+// AMOR
+// Constructor
+//
+Amor::Amor() : DCOPObject( "AmorIface" ), QObject()
+{
+ mAmor = 0;
+ mBubble = 0;
+ mForceHideAmorWidget = false;
+ if (readConfig())
+ {
+ mTargetWin = 0;
+ mNextTarget = 0;
+ mAmorDialog = 0;
+ mMenu = 0;
+ mCurrAnim = mBaseAnim;
+ mPosition = mCurrAnim->hotspot().x();
+ mState = Normal;
+
+ mWin = new KWinModule;
+ connect(mWin, SIGNAL(activeWindowChanged(WId)),
+ this, SLOT(slotWindowActivate(WId)));
+ connect(mWin, SIGNAL(windowRemoved(WId)),
+ this, SLOT(slotWindowRemove(WId)));
+ connect(mWin, SIGNAL(stackingOrderChanged()),
+ this, SLOT(slotStackingChanged()));
+ connect(mWin, SIGNAL(windowChanged(WId, const unsigned long *)),
+ this, SLOT(slotWindowChange(WId, const unsigned long *)));
+ connect(mWin, SIGNAL(currentDesktopChanged(int)),
+ this, SLOT(slotDesktopChange(int)));
+
+ mAmor = new AmorWidget();
+ connect(mAmor, SIGNAL(mouseClicked(const QPoint &)),
+ SLOT(slotMouseClicked(const QPoint &)));
+ connect(mAmor, SIGNAL(dragged(const QPoint &, bool)),
+ SLOT(slotWidgetDragged(const QPoint &, bool)));
+ mAmor->resize(mTheme.maximumSize());
+
+ mTimer = new QTimer(this);
+ connect(mTimer, SIGNAL(timeout()), SLOT(slotTimeout()));
+
+ mStackTimer = new QTimer(this);
+ connect(mStackTimer, SIGNAL(timeout()), SLOT(restack()));
+
+ mBubbleTimer = new QTimer(this);
+ connect(mBubbleTimer, SIGNAL(timeout()), SLOT(slotBubbleTimeout()));
+
+ time(&mActiveTime);
+ mCursPos = QCursor::pos();
+ mCursorTimer = new QTimer(this);
+ connect(mCursorTimer, SIGNAL(timeout()), SLOT(slotCursorTimeout()));
+ mCursorTimer->start( 500 );
+
+ if (mWin->activeWindow())
+ {
+ mNextTarget = mWin->activeWindow();
+ selectAnimation(Focus);
+ mTimer->start(0, true);
+ }
+ if (!connectDCOPSignal(0,0, "KDE_stop_screensaver()", "screenSaverStopped()",false))
+ kdDebug(10000) << "Could not attach signal...KDE_stop_screensaver()" << endl;
+ else
+ kdDebug(10000) << "attached dcop signals..." << endl;
+
+ if (!connectDCOPSignal(0,0, "KDE_start_screensaver()", "screenSaverStarted()",false))
+ kdDebug(10000) << "Could not attach signal...KDE_start_screensaver()" << endl;
+ else
+ kdDebug(10000) << "attached dcop signals..." << endl;
+
+ mTipsQueue.setAutoDelete(true);
+
+ KStartupInfo::appStarted();
+ }
+ else
+ {
+ kapp->quit();
+ }
+}
+
+//---------------------------------------------------------------------------
+//
+// Destructor
+//
+Amor::~Amor()
+{
+ delete mWin;
+ delete mAmor;
+ delete mBubble;
+}
+
+void Amor::screenSaverStopped()
+{
+#ifdef DEBUG_AMOR
+ kdDebug(10000)<<"void Amor::screenSaverStopped() \n";
+#endif
+
+ mAmor->show();
+ mForceHideAmorWidget = false;
+
+ mTimer->start(0, true);
+}
+
+void Amor::screenSaverStarted()
+{
+#ifdef DEBUG_AMOR
+ kdDebug(10000)<<"void Amor::screenSaverStarted() \n";
+#endif
+
+ mAmor->hide();
+ mTimer->stop();
+ mForceHideAmorWidget = true;
+
+ // GP: hide the bubble (if there's any) leaving any current message in the queue
+ hideBubble();
+}
+
+//---------------------------------------------------------------------------
+//
+void Amor::showTip( QString tip )
+{
+ if (mTipsQueue.count() < 5 && !mForceHideAmorWidget) // start dropping tips if the queue is too long
+ mTipsQueue.enqueue(new QueueItem(QueueItem::Tip, tip));
+
+ if (mState == Sleeping)
+ {
+ selectAnimation(Waking); // Set waking immediatedly
+ mTimer->start(0, true);
+ }
+}
+
+
+void Amor::showMessage( QString message )
+{
+ showMessage(message, -1);
+}
+
+void Amor::showMessage( QString message , int msec )
+{
+ // FIXME: What should be done about messages and tips while the screensaver is on?
+ if (mForceHideAmorWidget) return; // do not show messages sent while in the screensaver
+
+ mTipsQueue.enqueue(new QueueItem(QueueItem::Talk, message, msec));
+
+ if (mState == Sleeping)
+ {
+ selectAnimation(Waking); // Set waking immediatedly
+ mTimer->start(0, true);
+ }
+}
+
+
+//---------------------------------------------------------------------------
+//
+// Clear existing theme and reload configuration
+//
+void Amor::reset()
+{
+ hideBubble();
+
+ mAmor->setPixmap(0L); // get rid of your old copy of the pixmap
+
+ AmorPixmapManager::manager()->reset();
+ mTips.reset();
+
+// mTipsQueue.clear(); Why had I chosen to clean the tips queue? insane!
+
+ readConfig();
+
+ mCurrAnim = mBaseAnim;
+ mPosition = mCurrAnim->hotspot().x();
+ mState = Normal;
+
+ mAmor->resize(mTheme.maximumSize());
+ mCurrAnim->reset();
+
+ mTimer->start(0, true);
+}
+
+//---------------------------------------------------------------------------
+//
+// Read the selected theme.
+//
+bool Amor::readConfig()
+{
+ // Read user preferences
+ mConfig.read();
+
+ if (mConfig.mTips)
+ {
+ mTips.setFile(TIPS_FILE);
+ }
+
+ // Select a random theme if user requested it
+ if (mConfig.mRandomTheme)
+ {
+ QStringList files;
+
+ // Store relative paths into files to avoid storing absolute pathnames.
+ KGlobal::dirs()->findAllResources("appdata", "*rc", false, false, files);
+ int randomTheme = kapp->random() % files.count();
+ mConfig.mTheme = (QString)*files.at(randomTheme);
+ }
+
+ // read selected theme
+ if (!mTheme.setTheme(mConfig.mTheme))
+ {
+ KMessageBox::error(0, i18n("Error reading theme: ") + mConfig.mTheme);
+ return false;
+ }
+
+ if ( !mTheme.isStatic() )
+ {
+ const char *groups[] = { ANIM_BASE, ANIM_NORMAL, ANIM_FOCUS, ANIM_BLUR,
+ ANIM_DESTROY, ANIM_SLEEP, ANIM_WAKE, 0 };
+
+ // Read all the standard animation groups
+ for (int i = 0; groups[i]; i++)
+ {
+ if (mTheme.readGroup(groups[i]) == false)
+ {
+ KMessageBox::error(0, i18n("Error reading group: ") + groups[i]);
+ return false;
+ }
+ }
+ }
+ else
+ {
+ if ( mTheme.readGroup( ANIM_BASE ) == false )
+ {
+ KMessageBox::error(0, i18n("Error reading group: ") + ANIM_BASE);
+ return false;
+ }
+ }
+
+ // Get the base animation
+ mBaseAnim = mTheme.random(ANIM_BASE);
+
+ return true;
+}
+
+//---------------------------------------------------------------------------
+//
+// Show the bubble text
+//
+void Amor::showBubble()
+{
+ if (!mTipsQueue.isEmpty())
+ {
+#ifdef DEBUG_AMOR
+ kdDebug(10000) << "Amor::showBubble(): Displaying tips bubble." << endl;
+#endif
+
+ if (!mBubble)
+ {
+ mBubble = new AmorBubble;
+ }
+
+ mBubble->setOrigin(mAmor->x()+mAmor->width()/2,
+ mAmor->y()+mAmor->height()/2);
+ mBubble->setMessage(mTipsQueue.head()->text());
+
+// mBubbleTimer->start(mTipsQueue.head()->time(), true);
+ mBubbleTimer->start(BUBBLE_TIME_STEP, true);
+ }
+}
+
+//---------------------------------------------------------------------------
+//
+// Hide the bubble text if visible
+//
+void Amor::hideBubble(bool forceDequeue)
+{
+ if (mBubble)
+ {
+#ifdef DEBUG_AMOR
+ kdDebug(10000) << "Amor::hideBubble(): Hiding tips bubble" << endl;
+#endif
+
+ // GP: stop mBubbleTimer to avoid deleting the first element, just in case we are changing windows
+ // or something before the tip was shown long enough
+ mBubbleTimer->stop();
+
+ // GP: the first message on the queue should be taken off for a
+ // number of reasons: a) forceDequeue == true, only when called
+ // from slotBubbleTimeout; b) the bubble is not visible ; c)
+ // the bubble is visible, but there's Tip being displayed. The
+ // latter is to keep backwards compatibility and because
+ // carrying around a tip bubble when switching windows quickly is really
+ // annoyying
+ if (forceDequeue || !mBubble->isVisible() ||
+ (mTipsQueue.head()->type() == QueueItem::Tip)) /* there's always an item in the queue here */
+ mTipsQueue.dequeue();
+
+ delete mBubble;
+ mBubble = 0;
+ }
+}
+
+//---------------------------------------------------------------------------
+//
+// Select a new animation appropriate for the current state.
+//
+void Amor::selectAnimation(State state)
+{
+ switch (state)
+ {
+ case Blur:
+ hideBubble();
+ mCurrAnim = mTheme.random(ANIM_BLUR);
+ mState = Focus;
+ break;
+
+ case Focus:
+ hideBubble();
+ mCurrAnim = mTheme.random(ANIM_FOCUS);
+ mCurrAnim->reset();
+ mTargetWin = mNextTarget;
+ if (mTargetWin != None)
+ {
+ mTargetRect = KWin::windowInfo(mTargetWin).frameGeometry();
+
+ // if the animation falls outside of the working area,
+ // then relocate it so that is inside the desktop again
+ QRect desktopArea = mWin->workArea();
+ mInDesktopBottom = false;
+
+ if (mTargetRect.y() - mCurrAnim->hotspot().y() + mConfig.mOffset <
+ desktopArea.y())
+ {
+ // relocate the animation at the bottom of the screen
+ mTargetRect = QRect(desktopArea.x(),
+ desktopArea.y() + desktopArea.height(),
+ desktopArea.width(), 0);
+
+ // we'll relocate the animation in the desktop
+ // frame, so do not add the offset to its vertical position
+ mInDesktopBottom = true;
+ }
+
+ if ( mTheme.isStatic() )
+ {
+ if ( mConfig.mStaticPos < 0 )
+ mPosition = mTargetRect.width() + mConfig.mStaticPos;
+ else
+ mPosition = mConfig.mStaticPos;
+ if ( mPosition >= mTargetRect.width() )
+ mPosition = mTargetRect.width()-1;
+ else if ( mPosition < 0 )
+ mPosition = 0;
+ }
+ else
+ {
+ if (mCurrAnim->frame())
+ {
+ if (mTargetRect.width() == mCurrAnim->frame()->width())
+ mPosition = mCurrAnim->hotspot().x();
+ else
+ mPosition = ( kapp->random() %
+ (mTargetRect.width() - mCurrAnim->frame()->width()) )
+ + mCurrAnim->hotspot().x();
+ }
+ else
+ {
+ mPosition = mTargetRect.width()/2;
+ }
+ }
+ }
+ else
+ {
+ // We don't want to do anything until a window comes into
+ // focus.
+ mTimer->stop();
+ }
+ mAmor->hide();
+
+ restack();
+ mState = Normal;
+ break;
+
+ case Destroy:
+ hideBubble();
+ mCurrAnim = mTheme.random(ANIM_DESTROY);
+ mState = Focus;
+ break;
+
+ case Sleeping:
+ mCurrAnim = mTheme.random(ANIM_SLEEP);
+ break;
+
+ case Waking:
+ mCurrAnim = mTheme.random(ANIM_WAKE);
+ mState = Normal;
+ break;
+
+ default:
+ // Select a random normal animation if the current animation
+ // is not the base, otherwise select the base. This makes us
+ // alternate between the base animation and a random
+ // animination.
+ if (mCurrAnim == mBaseAnim && !mBubble)
+ {
+ mCurrAnim = mTheme.random(ANIM_NORMAL);
+ }
+ else
+ {
+ mCurrAnim = mBaseAnim;
+ }
+ break;
+ }
+
+ if (mCurrAnim->totalMovement() + mPosition > mTargetRect.width() ||
+ mCurrAnim->totalMovement() + mPosition < 0)
+ {
+ // The selected animation would end outside of this window's width
+ // We could randomly select a different one, but I prefer to just
+ // use the default animation.
+ mCurrAnim = mBaseAnim;
+ }
+
+ mCurrAnim->reset();
+}
+
+//---------------------------------------------------------------------------
+//
+// Set the animation's stacking order to be just above the target window's
+// window decoration, or on top.
+//
+void Amor::restack()
+{
+ if (mTargetWin == None)
+ {
+ return;
+ }
+
+ if (mConfig.mOnTop)
+ {
+ // simply raise the widget to the top
+ mAmor->raise();
+ return;
+ }
+
+#ifdef DEBUG_AMOR
+ kdDebug(10000) << "restacking" << endl;
+#endif
+
+ Window sibling = mTargetWin;
+ Window dw, parent = None, *wins;
+
+ do {
+ unsigned int nwins = 0;
+
+ // We must use the target window's parent as our sibling.
+ // Is there a faster way to get parent window than XQueryTree?
+ if (XQueryTree(qt_xdisplay(), sibling, &dw, &parent, &wins, &nwins))
+ {
+ if (nwins)
+ {
+ XFree(wins);
+ }
+ }
+
+ if (parent != None && parent != dw )
+ sibling = parent;
+ } while ( parent != None && parent != dw );
+
+ // Set animation's stacking order to be above the window manager's
+ // decoration of target window.
+ XWindowChanges values;
+ values.sibling = sibling;
+ values.stack_mode = Above;
+ XConfigureWindow(qt_xdisplay(), mAmor->winId(), CWSibling | CWStackMode,
+ &values);
+}
+
+//---------------------------------------------------------------------------
+//
+// The user clicked on our animation.
+//
+void Amor::slotMouseClicked(const QPoint &pos)
+{
+ bool restartTimer = mTimer->isActive();
+
+ // Stop the animation while the menu is open.
+ if (restartTimer)
+ {
+ mTimer->stop();
+ }
+
+ if (!mMenu)
+ {
+ KHelpMenu* help = new KHelpMenu(0, KGlobal::instance()->aboutData(), false);
+ KPopupMenu* helpMnu = help->menu();
+ mMenu = new KPopupMenu();
+ mMenu->insertTitle("Amor"); // I really don't want this i18n'ed
+ mMenu->insertItem(SmallIcon("configure"), i18n("&Configure..."), this, SLOT(slotConfigure()));
+ mMenu->insertSeparator();
+ mMenu->insertItem(SmallIcon("help"), i18n("&Help"), helpMnu);
+ mMenu->insertItem(SmallIcon("exit"), i18n("&Quit"), kapp, SLOT(quit()));
+ }
+
+ mMenu->exec(pos);
+
+ if (restartTimer)
+ {
+ mTimer->start(1000, true);
+ }
+}
+
+//---------------------------------------------------------------------------
+//
+// Check cursor position
+//
+void Amor::slotCursorTimeout()
+{
+ QPoint currPos = QCursor::pos();
+ QPoint diff = currPos - mCursPos;
+ time_t now = time(0);
+
+ if (mForceHideAmorWidget) return; // we're hidden, do nothing
+
+ if (abs(diff.x()) > 1 || abs(diff.y()) > 1)
+ {
+ if (mState == Sleeping)
+ {
+ // Set waking immediatedly
+ selectAnimation(Waking);
+ }
+ mActiveTime = now;
+ mCursPos = currPos;
+ }
+ else if (mState != Sleeping && now - mActiveTime > SLEEP_TIMEOUT)
+ {
+ // GP: can't go to sleep if there are tips in the queue
+ if (mTipsQueue.isEmpty())
+ mState = Sleeping; // The next animation will become sleeping
+ }
+}
+
+//---------------------------------------------------------------------------
+//
+// Display the next frame or a new animation
+//
+void Amor::slotTimeout()
+{
+ if ( mForceHideAmorWidget )
+ return;
+
+ if (!mTheme.isStatic())
+ mPosition += mCurrAnim->movement();
+ mAmor->setPixmap(mCurrAnim->frame());
+ mAmor->move(mTargetRect.x() + mPosition - mCurrAnim->hotspot().x(),
+ mTargetRect.y() - mCurrAnim->hotspot().y() + (!mInDesktopBottom?mConfig.mOffset:0));
+ if (!mAmor->isVisible())
+ {
+ mAmor->show();
+ restack();
+ }
+
+ if (mCurrAnim == mBaseAnim && mCurrAnim->validFrame())
+ {
+ // GP: Application tips/messages can be shown in any frame number; amor tips are
+ // only displayed on the first frame of mBaseAnim (the old way of doing this).
+ if ( !mTipsQueue.isEmpty() && !mBubble && mConfig.mAppTips)
+ showBubble();
+ else if (kapp->random()%TIP_FREQUENCY == 1 && mConfig.mTips && !mBubble && !mCurrAnim->frameNum())
+ {
+ mTipsQueue.enqueue(new QueueItem(QueueItem::Tip, mTips.tip()));
+ showBubble();
+ }
+ }
+
+ if (mTheme.isStatic())
+ mTimer->start((mState == Normal) || (mState == Sleeping) ? 1000 : 100, true);
+ else
+ mTimer->start(mCurrAnim->delay(), true);
+
+ if (!mCurrAnim->next())
+ {
+ if ( mBubble )
+ mCurrAnim->reset();
+ else
+ selectAnimation(mState);
+ }
+}
+
+//---------------------------------------------------------------------------
+//
+// Display configuration dialog
+//
+void Amor::slotConfigure()
+{
+ if (!mAmorDialog)
+ {
+ mAmorDialog = new AmorDialog();
+ connect(mAmorDialog, SIGNAL(changed()), SLOT(slotConfigChanged()));
+ connect(mAmorDialog, SIGNAL(offsetChanged(int)),
+ SLOT(slotOffsetChanged(int)));
+ }
+
+ mAmorDialog->show();
+}
+
+//--------------------------------------------------------------------------
+//
+// Configuration changed.
+//
+void Amor::slotConfigChanged()
+{
+ reset();
+}
+
+//---------------------------------------------------------------------------
+//
+// Offset changed
+//
+void Amor::slotOffsetChanged(int off)
+{
+ mConfig.mOffset = off;
+
+ if (mCurrAnim->frame())
+ {
+ mAmor->move(mPosition + mTargetRect.x() - mCurrAnim->hotspot().x(),
+ mTargetRect.y() - mCurrAnim->hotspot().y() + (!mInDesktopBottom?mConfig.mOffset:0));
+ }
+}
+
+//---------------------------------------------------------------------------
+//
+// Display About box
+//
+void Amor::slotAbout()
+{
+ QString about = i18n("Amor Version %1\n\n").arg(AMOR_VERSION) +
+ i18n("Amusing Misuse Of Resources\n\n") +
+ i18n("Copyright (c) 1999 Martin R. Jones <mjones@kde.org>\n\n") +
+ i18n("Original Author: Martin R. Jones <mjones@kde.org>\n") +
+ i18n("Current Maintainer: Gerardo Puga <gpuga@gioia.ing.unlp.edu.ar>\n" ) +
+ "\nhttp://www.powerup.com.au/~mjones/amor/";
+ KMessageBox::about(0, about, i18n("About Amor"));
+}
+
+//---------------------------------------------------------------------------
+//
+// Widget dragged
+//
+void Amor::slotWidgetDragged( const QPoint &delta, bool release )
+{
+ if (mCurrAnim->frame())
+ {
+ int newPosition = mPosition + delta.x();
+ if (mCurrAnim->totalMovement() + newPosition > mTargetRect.width())
+ newPosition = mTargetRect.width() - mCurrAnim->totalMovement();
+ else if (mCurrAnim->totalMovement() + newPosition < 0)
+ newPosition = -mCurrAnim->totalMovement();
+ mPosition = newPosition;
+ mAmor->move(mTargetRect.x() + mPosition - mCurrAnim->hotspot().x(),
+ mAmor->y());
+
+ if ( mTheme.isStatic() && release ) {
+ // static animations save the new position as preferred.
+ int savePos = mPosition;
+ if ( savePos > mTargetRect.width()/2 )
+ savePos -= (mTargetRect.width()+1);
+
+ mConfig.mStaticPos = savePos;
+ mConfig.write();
+ }
+ }
+}
+
+//---------------------------------------------------------------------------
+//
+// Focus changed to a different window
+//
+void Amor::slotWindowActivate(WId win)
+{
+#ifdef DEBUG_AMOR
+ kdDebug(10000) << "Window activated:" << win << endl;
+#endif
+
+ mTimer->stop();
+ mNextTarget = win;
+
+ // This is an active event that affects the target window
+ time(&mActiveTime);
+
+ // A window gaining focus implies that the current window has lost
+ // focus. Initiate a blur event if there is a current active window.
+ if (mTargetWin)
+ {
+ // We are losing focus from the current window
+ selectAnimation(Blur);
+ mTimer->start(0, true);
+ }
+ else if (mNextTarget)
+ {
+ // We are setting focus to a new window
+ if (mState != Focus )
+ selectAnimation(Focus);
+ mTimer->start(0, true);
+ }
+ else
+ {
+ // No action - We can get this when we switch between two empty
+ // desktops
+ mAmor->hide();
+ }
+}
+
+//---------------------------------------------------------------------------
+//
+// Window removed
+//
+void Amor::slotWindowRemove(WId win)
+{
+#ifdef DEBUG_AMOR
+ kdDebug(10000) << "Window removed" << endl;
+#endif
+
+ if (win == mTargetWin)
+ {
+ // This is an active event that affects the target window
+ time(&mActiveTime);
+
+ selectAnimation(Destroy);
+ mTimer->stop();
+ mTimer->start(0, true);
+ }
+}
+
+//---------------------------------------------------------------------------
+//
+// Window stacking changed
+//
+void Amor::slotStackingChanged()
+{
+#ifdef DEBUG_AMOR
+ kdDebug(10000) << "Stacking changed" << endl;
+#endif
+
+ // This is an active event that affects the target window
+ time(&mActiveTime);
+
+ // We seem to get this signal before the window has been restacked,
+ // so we just schedule a restack.
+ mStackTimer->start( 20, TRUE );
+}
+
+//---------------------------------------------------------------------------
+//
+// Properties of a window changed
+//
+void Amor::slotWindowChange(WId win, const unsigned long * properties)
+{
+
+ if (win != mTargetWin)
+ {
+ return;
+ }
+
+ // This is an active event that affects the target window
+ time(&mActiveTime);
+
+ KWin::Info info = KWin::info( mTargetWin );
+
+ if (info.isIconified() ||
+ info.mappingState == NET::Withdrawn)
+ {
+#ifdef DEBUG_AMOR
+ kdDebug(10000) << "Target window iconified" << endl;
+#endif
+
+ // The target window has been iconified
+ selectAnimation(Destroy);
+ mTargetWin = None;
+ mTimer->stop();
+ mTimer->start(0, true);
+
+ return;
+ }
+
+ if (properties[0] & NET::WMGeometry)
+ {
+#ifdef DEBUG_AMOR
+ kdDebug(10000) << "Target window moved or resized" << endl;
+#endif
+
+ QRect newTargetRect = KWin::windowInfo(mTargetWin).frameGeometry();
+
+ // if the change in the window caused the animation to fall
+ // out of the working area of the desktop, or if the animation
+ // didn't fall in the working area before but it does now, then
+ // refocus on the current window so that the animation is
+ // relocated.
+ QRect desktopArea = mWin->workArea();
+
+ bool fitsInWorkArea = !(newTargetRect.y() - mCurrAnim->hotspot().y() + mConfig.mOffset < desktopArea.y());
+ if ((!fitsInWorkArea && !mInDesktopBottom) || (fitsInWorkArea && mInDesktopBottom))
+ {
+ mNextTarget = mTargetWin;
+ selectAnimation(Blur);
+ mTimer->start(0, true);
+
+ return;
+ }
+
+ if (!mInDesktopBottom)
+ mTargetRect = newTargetRect;
+
+ // make sure the animation is still on the window.
+ if (mCurrAnim->frame())
+ {
+ hideBubble();
+ if (mTheme.isStatic())
+ {
+ if ( mConfig.mStaticPos < 0 )
+ mPosition = mTargetRect.width() + mConfig.mStaticPos;
+ else
+ mPosition = mConfig.mStaticPos;
+ if ( mPosition >= mTargetRect.width() )
+ mPosition = mTargetRect.width()-1;
+ else if ( mPosition < 0 )
+ mPosition = 0;
+ }
+ else if (mPosition > mTargetRect.width() -
+ (mCurrAnim->frame()->width() - mCurrAnim->hotspot().x()))
+ {
+ mPosition = mTargetRect.width() - (mCurrAnim->frame()->width() - mCurrAnim->hotspot().x());
+ }
+ mAmor->move(mTargetRect.x() + mPosition - mCurrAnim->hotspot().x(),
+ mTargetRect.y() - mCurrAnim->hotspot().y() + (!mInDesktopBottom?mConfig.mOffset:0));
+ }
+
+ return;
+ }
+}
+
+//---------------------------------------------------------------------------
+//
+// Changed to a different desktop
+//
+void Amor::slotDesktopChange(int desktop)
+{
+ // GP: signal currentDesktopChanged seems to be emitted even if you
+ // change to the very same desktop you are in.
+ if (mWin->currentDesktop() == desktop)
+ return;
+
+#ifdef DEBUG_AMOR
+ kdDebug(10000) << "Desktop change" << endl;
+#endif
+
+ mNextTarget = None;
+ mTargetWin = None;
+ selectAnimation( Normal );
+ mTimer->stop();
+ mAmor->hide();
+}
+
+// GP ===========================================================================
+
+void Amor::slotBubbleTimeout()
+{
+ // has the queue item been displayed for long enough?
+ QueueItem *first = mTipsQueue.head();
+#ifdef DEBUG_AMOR
+ if (!first) kdDebug(10000) << "Amor::slotBubbleTimeout(): empty queue!" << endl;
+#endif
+ if ((first->time() > BUBBLE_TIME_STEP) && (mBubble->isVisible()))
+ {
+ first->setTime(first->time() - BUBBLE_TIME_STEP);
+ mBubbleTimer->start(BUBBLE_TIME_STEP, true);
+ return;
+ }
+
+ // do not do anything if the mouse pointer is in the bubble
+ if (mBubble->mouseWithin())
+ {
+ first->setTime(500); // show this item for another 500ms
+ mBubbleTimer->start(BUBBLE_TIME_STEP, true);
+ return;
+ }
+
+ // are there any other tips pending?
+ if (mTipsQueue.count() > 1)
+ {
+ mTipsQueue.dequeue();
+ showBubble(); // shows the next item in the queue
+ } else
+ hideBubble(true); // hideBubble calls dequeue() for itself.
+}
+
+//===========================================================================
+
+AmorSessionWidget::AmorSessionWidget()
+{
+ // the only function of this widget is to catch & forward the
+ // saveYourself() signal from the session manager
+ connect(kapp, SIGNAL(saveYourself()), SLOT(wm_saveyourself()));
+}
+
+void AmorSessionWidget::wm_saveyourself()
+{
+ // no action required currently.
+}
+
diff --git a/amor/amor.desktop b/amor/amor.desktop
new file mode 100644
index 0000000..c8dfcea
--- /dev/null
+++ b/amor/amor.desktop
@@ -0,0 +1,74 @@
+[Desktop Entry]
+Name=AMOR
+Name[af]=Amor
+Name[ar]=برنامج AMOR
+Name[bg]=Amor
+Name[bn]=আমোর
+Name[fi]=Amor
+Name[fo]=Amor
+Name[fr]=Amor
+Name[hi]=à¤à¤®à¥‹à¤°
+Name[pa]=ਅਮੋਰ
+Name[sv]=Amor
+Name[ta]= AMOR
+Name[tr]=Amor
+Name[zh_CN]=阿莫(AMOR)
+Exec=amor
+Icon=amor
+Type=Application
+DocPath=amor/index.html
+GenericName=On-Screen Creature
+GenericName[be]=Ð­ÐºÑ€Ð°Ð½Ð½Ð°Ñ Ð¶Ñ‹Ð²Ñ‘Ð»Ð°
+GenericName[bg]=УÑмивка за работното мÑÑто
+GenericName[bn]=পরà§à¦¦à¦¾à§Ÿ বসবাসকারী জনà§à¦¤à§
+GenericName[ca]=Criatura a la pantalla
+GenericName[cs]=Příšerka na obrazovce
+GenericName[cy]=Creadur Ar-Sgrin
+GenericName[da]=Skabning på skærmen
+GenericName[de]=Maskottchen für die Arbeitsfläche
+GenericName[el]=Πλάσμα στην οθόνη
+GenericName[eo]=Surekrana kreaĵo
+GenericName[es]=Criatura de la pantalla
+GenericName[et]=Elajas töölaual
+GenericName[eu]=Pantailako gizakia
+GenericName[fa]=ایجاد‌کنندۀ روی پرده
+GenericName[fi]=Näytönolento
+GenericName[fr]=Créature sur l'écran
+GenericName[ga]=Créatúr ar do scáileán
+GenericName[gl]=Criatura no Escritório
+GenericName[he]=יצור מסכי
+GenericName[hr]=Kretura na zaslonu
+GenericName[hu]=Animált figurák
+GenericName[is]=Skjámyndataka
+GenericName[it]=Creatura sullo schermo
+GenericName[ja]=ç”»é¢ä¸Šã®ç”Ÿç‰©
+GenericName[km]=ការច្នៃ​ប្រឌិážâ€‹áž›áž¾â€‹áž¢áŸáž€áŸ’រង់
+GenericName[ko]=화면 위 ìƒëª…ì²´
+GenericName[lv]=EkrÄna dzÄ«vnieks
+GenericName[mk]=Креатура на екранот
+GenericName[mt]=Annimal ta' fuq l-iskrin
+GenericName[nb]=Vesen på skjermen
+GenericName[nds]=Schriefdisch-Maskottje
+GenericName[ne]=परà¥à¤¦à¤¾ कà¥à¤°à¤¿à¤à¤šà¤°
+GenericName[nl]=Schermvermaak
+GenericName[nn]=Skjermvesen
+GenericName[pa]=ਆਨ-ਸਕਰੀਨ ਲਵੋ
+GenericName[pl]=Stworzenie ekranowe
+GenericName[pt]=Criatura no Ecrã
+GenericName[pt_BR]=Criatura na Tela
+GenericName[ro]=Creatură pe ecran
+GenericName[ru]=Экранные зверушки
+GenericName[sk]=Stvorenie na obrazovke
+GenericName[sl]=Zaslonska živalca
+GenericName[sr]=Створење на екрану
+GenericName[sr@Latn]=Stvorenje na ekranu
+GenericName[sv]=Varelse på skärmen
+GenericName[ta]=திரையில௠உரà¯à®µà®¾à®•à¯à®•à®¿
+GenericName[tg]=Махлуқ дар Ñкран
+GenericName[tr]=Ekranda Gezinen Yaratık
+GenericName[uk]=Екранна Ñ–Ñтота
+GenericName[zh_CN]=å±å¹•æ¶‚鸦
+GenericName[zh_TW]=ç•«é¢æ“·å–程å¼
+Terminal=false
+X-DCOP-ServiceType=Unique
+Categories=Qt;KDE;Utility;Amusement;
diff --git a/amor/amor.h b/amor/amor.h
new file mode 100644
index 0000000..a64486b
--- /dev/null
+++ b/amor/amor.h
@@ -0,0 +1,164 @@
+/* amor.h
+**
+** Copyright (c) 1999 Martin R. Jones <mjones@kde.org>
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+#ifndef AMOR_H
+#define AMOR_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <qwidget.h>
+#include <qptrqueue.h>
+
+#include "amoranim.h"
+#include "amortips.h"
+#include "amorconfig.h"
+#include "AmorIface.h"
+
+class AmorDialog;
+class AmorBubble;
+class AmorWidget;
+
+class QTimer;
+class KWinModule;
+class KPopupMenu;
+
+class QueueItem {
+public:
+
+ enum itemType { Talk , Tip };
+
+ QueueItem(itemType ty, QString te, int ti = -1);
+
+ itemType type() { return iType; }
+ QString text() { return iText; };
+ int time() { return iTime; };
+
+ void setTime(int newTime) { if (iTime > 0) iTime = newTime; };
+
+private:
+ itemType iType;
+ QString iText;
+ int iTime;
+};
+
+//---------------------------------------------------------------------------
+//
+// Amor handles window manager input and animation selection and updates.
+//
+class Amor : public QObject, virtual public AmorIface
+{
+ Q_OBJECT
+public:
+ Amor();
+ virtual ~Amor();
+
+ virtual void showTip(QString tip);
+ virtual void showMessage(QString message);
+ virtual void showMessage(QString message, int msec);
+ virtual void screenSaverStopped();
+ virtual void screenSaverStarted();
+
+ void reset();
+
+public slots:
+ void slotWindowActivate(WId);
+ void slotWindowRemove(WId);
+ void slotStackingChanged();
+ void slotWindowChange(WId, const unsigned long * properties);
+ void slotDesktopChange(int);
+
+protected slots:
+ void slotMouseClicked(const QPoint &pos);
+ void slotTimeout();
+ void slotCursorTimeout();
+ void slotConfigure();
+ void slotConfigChanged();
+ void slotOffsetChanged(int);
+ void slotAbout();
+ void slotWidgetDragged( const QPoint &delta, bool release );
+ void restack();
+ void hideBubble(bool forceDequeue = false);
+
+ void slotBubbleTimeout();
+
+protected:
+ enum State { Focus, Blur, Normal, Sleeping, Waking, Destroy };
+
+ bool readConfig();
+ void readGroupConfig(KConfigBase &config, QPtrList<AmorAnim> &animList,
+ const char *seq);
+ void showBubble();
+ AmorAnim *randomAnimation(QPtrList<AmorAnim> &animList);
+ void selectAnimation(State state=Normal);
+ void active();
+
+private:
+ KWinModule *mWin;
+ WId mTargetWin; // The window that the animations sits on
+ QRect mTargetRect; // The goemetry of the target window
+ WId mNextTarget; // The window that will become the target
+ AmorWidget *mAmor; // The widget displaying the animation
+ AmorThemeManager mTheme; // Animations used by current theme
+ AmorAnim *mBaseAnim; // The base animation
+ AmorAnim *mCurrAnim; // The currently running animation
+ int mPosition; // The position of the animation
+ State mState; // The current state of the animation
+ QTimer *mTimer; // Frame timer
+ QTimer *mCursorTimer;// Cursor timer
+ QTimer *mStackTimer; // Restacking timer
+ QTimer *mBubbleTimer;// Bubble tip timer (GP: I didn't create this one, it had no use when I found it)
+ AmorDialog *mAmorDialog; // Setup dialog
+ KPopupMenu *mMenu; // Our menu
+ time_t mActiveTime; // The time an active event occurred
+ QPoint mCursPos; // The last recorded position of the pointer
+ QString mTipText; // Text to display in a bubble when possible
+ AmorBubble *mBubble; // Text bubble
+ AmorTips mTips; // Tips to display in the bubble
+ bool mInDesktopBottom; // the animation is not on top of the
+ // title bar, but at the bottom of the desktop
+
+ AmorConfig mConfig; // Configuration parameters
+ bool mForceHideAmorWidget;
+
+ QPtrQueue<QueueItem> mTipsQueue; // GP: tips queue
+};
+
+//---------------------------------------------------------------------------
+
+class AmorSessionWidget : public QWidget
+{
+ Q_OBJECT
+public:
+ AmorSessionWidget();
+ ~AmorSessionWidget() {};
+public slots:
+ void wm_saveyourself();
+};
+
+#endif // AMOR_H
+
diff --git a/amor/amoranim.cpp b/amor/amoranim.cpp
new file mode 100644
index 0000000..61447f1
--- /dev/null
+++ b/amor/amoranim.cpp
@@ -0,0 +1,254 @@
+/* amoranim.cpp
+**
+** Copyright (c) 1999 Martin R. Jones <mjones@kde.org>
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+#include <stdlib.h>
+#include <kapplication.h>
+#include <kstandarddirs.h>
+#include "amoranim.h"
+#include "amorpm.h"
+
+//---------------------------------------------------------------------------
+//
+// Constructor
+//
+AmorAnim::AmorAnim(KConfigBase &config)
+ : mMaximumSize(0, 0)
+{
+ mCurrent = 0;
+ mTotalMovement = 0;
+ readConfig(config);
+}
+
+//---------------------------------------------------------------------------
+//
+// Destructor
+//
+AmorAnim::~AmorAnim()
+{
+}
+
+//---------------------------------------------------------------------------
+//
+// Get the Pixmap for the current frame.
+//
+const QPixmap *AmorAnim::frame()
+{
+ const QPixmap *pixmap = 0;
+
+ if (validFrame())
+ pixmap = AmorPixmapManager::manager()->pixmap(*mSequence.at(mCurrent));
+
+ return pixmap;
+}
+
+//---------------------------------------------------------------------------
+//
+// Read a single animation's parameters. The config class should already
+// have its group set to the animation that is to be read.
+//
+void AmorAnim::readConfig(KConfigBase &config)
+{
+ // Read the list of frames to display and load them into the pixmap
+ // manager.
+ mSequence = config.readListEntry("Sequence");
+ int frames = mSequence.count();
+ for ( QStringList::Iterator it = mSequence.begin();
+ it != mSequence.end();
+ ++it )
+ {
+ const QPixmap *pixmap =
+ AmorPixmapManager::manager()->load(*it);
+ if (pixmap)
+ mMaximumSize = mMaximumSize.expandedTo(pixmap->size());
+ }
+
+ // Read the delays between frames.
+ QStrList list;
+ int entries = config.readListEntry("Delay",list);
+ mDelay.resize(frames);
+ for (int i = 0; i < entries && i < frames; i++)
+ mDelay[i] = atoi(list.at(i));
+
+ // Read the distance to move between frames and calculate the total
+ // distance that this aniamtion moves from its starting position.
+ entries = config.readListEntry("Movement",list);
+ mMovement.resize(frames);
+ for (int i = 0; i < entries && i < frames; i++)
+ {
+ mMovement[i] = atoi(list.at(i));
+ mTotalMovement += mMovement[i];
+ }
+
+ // Read the hotspot for each frame.
+ entries = config.readListEntry("HotspotX",list);
+ mHotspot.resize(frames);
+ for (int i = 0; i < entries && i < frames; i++)
+ mHotspot[i].setX(atoi(list.at(i)));
+
+ entries = config.readListEntry("HotspotY",list);
+ for (int i = 0; i < entries && i < frames; i++)
+ mHotspot[i].setY(atoi(list.at(i)));
+
+ // Add the overlap of the last frame to the total movement.
+ const QPoint &lastHotspot = mHotspot[mHotspot.size()-1];
+ if (mTotalMovement > 0)
+ {
+ const QPixmap *lastFrame =
+ AmorPixmapManager::manager()->pixmap(mSequence.last());
+ if (lastFrame)
+ {
+ mTotalMovement += (lastFrame->width() - lastHotspot.x());
+ }
+ }
+ else if (mTotalMovement < 0)
+ {
+ mTotalMovement -= lastHotspot.x();
+ }
+}
+
+//===========================================================================
+
+AmorThemeManager::AmorThemeManager()
+ : mMaximumSize(0, 0)
+{
+ mConfig = 0;
+ mAnimations.setAutoDelete(true);
+}
+
+//---------------------------------------------------------------------------
+//
+AmorThemeManager::~AmorThemeManager()
+{
+ delete mConfig;
+}
+
+//---------------------------------------------------------------------------
+//
+bool AmorThemeManager::setTheme(const QString & file)
+{
+ mPath = locate("appdata", file);
+
+ delete mConfig;
+
+ mConfig = new KSimpleConfig(mPath, true);
+ mConfig->setGroup("Config");
+
+ // Get the directory where the pixmaps are stored and tell the
+ // pixmap manager.
+ QString pixmapPath = mConfig->readPathEntry("PixmapPath");
+ if (pixmapPath.isEmpty())
+ return false;
+
+ if (pixmapPath[0] == '/')
+ {
+ // absolute path to pixmaps
+ mPath = pixmapPath;
+ }
+ else
+ {
+ // relative to config file.
+ mPath.truncate(mPath.findRev('/')+1);
+ mPath += pixmapPath;
+ }
+
+ mStatic = mConfig->readBoolEntry("Static", false);
+
+ mMaximumSize.setWidth(0);
+ mMaximumSize.setHeight(0);
+
+ mAnimations.clear();
+
+ return true;
+}
+
+//---------------------------------------------------------------------------
+//
+// Select an animimation randomly from a group
+//
+AmorAnim *AmorThemeManager::random(const QString & group)
+{
+ QString grp( group );
+
+ if (mStatic)
+ grp = "Base";
+
+ AmorAnimationGroup *animGroup = mAnimations.find(grp);
+
+ if (animGroup) {
+ int idx = kapp->random()%animGroup->count();
+ return animGroup->at( idx );
+ }
+
+ return 0;
+}
+
+//---------------------------------------------------------------------------
+//
+// Read an animation group.
+//
+bool AmorThemeManager::readGroup(const QString & seq)
+{
+ AmorPixmapManager::manager()->setPixmapDir(mPath);
+
+ AmorAnimationGroup *animList = new AmorAnimationGroup;
+ animList->setAutoDelete(true);
+
+ // Read the list of available animations.
+ mConfig->setGroup("Config");
+ QStrList list;
+ int entries = mConfig->readListEntry(seq, list);
+
+ // Read each individual animation
+ for (int i = 0; i < entries; i++)
+ {
+ mConfig->setGroup(list.at(i));
+ AmorAnim *anim = new AmorAnim(*mConfig);
+ animList->append(anim);
+ mMaximumSize = mMaximumSize.expandedTo(anim->maximumSize());
+ }
+
+ // If no animations were available for this group, just add the base anim
+ if (entries == 0)
+ {
+ mConfig->setGroup("Base");
+ AmorAnim *anim = new AmorAnim(*mConfig);
+ if (anim)
+ {
+ animList->append(anim);
+ mMaximumSize = mMaximumSize.expandedTo(anim->maximumSize());
+ entries++;
+ }
+ }
+
+ // Couldn't read any entries at all
+ if (entries == 0)
+ return false;
+
+ mAnimations.insert(seq, animList);
+
+ return true;
+}
+
diff --git a/amor/amoranim.h b/amor/amoranim.h
new file mode 100644
index 0000000..75341a1
--- /dev/null
+++ b/amor/amoranim.h
@@ -0,0 +1,117 @@
+/* amoranim.h
+**
+** Copyright (c) 1999 Martin R. Jones <mjones@kde.org>
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+#ifndef AMORANIM_H
+#define AMORANIM_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <qmemarray.h>
+#include <qdict.h>
+#include <qstringlist.h>
+#include <kconfigbase.h>
+#include <ksimpleconfig.h>
+
+//---------------------------------------------------------------------------
+//
+// AmorAnim contains the properties of a single animation
+//
+class AmorAnim
+{
+public:
+ AmorAnim(KConfigBase &config);
+ virtual ~AmorAnim();
+
+ void reset()
+ { mCurrent = 0; }
+ bool next()
+ { return (++mCurrent < mSequence.count()); }
+ int frameNum() const
+ { return mCurrent; }
+ bool validFrame() const
+ { return (mCurrent < mSequence.count()); }
+ int totalMovement() const
+ { return mTotalMovement; }
+ QSize maximumSize() const
+ { return mMaximumSize; }
+
+ int delay() const
+ { return (validFrame() ? mDelay[mCurrent] : 100); }
+ QPoint hotspot() const
+ { return (validFrame() ? mHotspot[mCurrent] : QPoint(16,16)); }
+ int movement() const
+ { return (validFrame() ? mMovement[mCurrent] : 0); }
+ const QPixmap *frame();
+
+protected:
+ void readConfig(KConfigBase &config);
+
+protected:
+ unsigned int mCurrent; // current frame in sequence
+ QStringList mSequence; // sequence of images to display
+ QMemArray<int> mDelay; // delay between frames
+ QMemArray<QPoint> mHotspot; // the hotspot in a frame
+ QMemArray<int> mMovement; // the distance to move between frames
+ int mTotalMovement; // the total distance this animation moves
+ QSize mMaximumSize; // the maximum size of any frame
+};
+
+//---------------------------------------------------------------------------
+typedef QPtrList<AmorAnim> AmorAnimationGroup;
+
+//---------------------------------------------------------------------------
+//
+// AmorThemeManager maintains an animation theme
+//
+class AmorThemeManager
+{
+public:
+ AmorThemeManager();
+ virtual ~AmorThemeManager();
+
+ bool setTheme(const QString & file);
+ bool readGroup(const QString & seq);
+ bool isStatic() const
+ { return mStatic; }
+
+ AmorAnim *random(const QString & group);
+
+ QSize maximumSize() const { return mMaximumSize; }
+
+protected:
+ QString mPath;
+ KSimpleConfig *mConfig;
+ QSize mMaximumSize; // The largest pixmap used
+ QDict<AmorAnimationGroup> mAnimations; // list of animation groups
+ bool mStatic; // static image
+};
+
+#endif // AMORANIM_H
+
diff --git a/amor/amorbubble.cpp b/amor/amorbubble.cpp
new file mode 100644
index 0000000..a0c9f6b
--- /dev/null
+++ b/amor/amorbubble.cpp
@@ -0,0 +1,250 @@
+/* amorbubble.cpp
+**
+** Copyright (c) 1999 Martin R. Jones <mjones@kde.org>
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+#include "amorbubble.h"
+#include "amorbubble.moc"
+#include <qpainter.h>
+#include <ktextbrowser.h>
+#include <qtooltip.h>
+#include <kstandarddirs.h>
+#include <X11/Xlib.h>
+#include <X11/extensions/shape.h>
+#include <qtimer.h>
+
+#define ARROW_WIDTH 10
+#define ARROW_HEIGHT 12
+#define BORDER_SIZE 4
+#define BUBBLE_OFFSET 16
+#define BUBBLE_TIMEOUT 4000 // Minimum milliseconds to display a tip
+
+//---------------------------------------------------------------------------
+//
+// Constructor
+//
+AmorBubble::AmorBubble()
+ : QWidget(0, 0, WStyle_Customize | WStyle_NoBorder | WX11BypassWM )
+{
+ mOriginX = 0;
+ mOriginY = 0;
+ mBrowser = new KTextBrowser( this );
+ mBrowser->setFrameStyle( QFrame::NoFrame | QFrame::Plain );
+ mBrowser->setMargin( 0 );
+
+ mBrowser->setWrapPolicy(QTextEdit::AtWordOrDocumentBoundary); // too long to fit in one line?
+
+ QColorGroup clgrp = mBrowser->colorGroup();
+ clgrp.setColor(QColorGroup::Text, Qt::black);
+ //Laurent QTextBrowser didn't have this function FIX me
+ //mBrowser->setPaperColorGroup( clgrp );
+ mBrowser->setPaper( QToolTip::palette().active().brush( QColorGroup::Background ) );
+ mBrowser->setVScrollBarMode( QTextBrowser::AlwaysOff );
+ mBrowser->setHScrollBarMode( QTextBrowser::AlwaysOff );
+ mBrowser->viewport()->installEventFilter( this );
+
+ mBrowser->mimeSourceFactory()->addFilePath(KGlobal::dirs()->findResourceDir("data", "kdewizard/pics")+"kdewizard/pics/");
+ QStringList icons = KGlobal::dirs()->resourceDirs("icon");
+ QStringList::Iterator it;
+ for (it = icons.begin(); it != icons.end(); ++it)
+ mBrowser->mimeSourceFactory()->addFilePath(*it);
+
+ mMouseWithin = false;
+}
+
+//---------------------------------------------------------------------------
+//
+// Destructor
+//
+AmorBubble::~AmorBubble()
+{
+}
+
+//---------------------------------------------------------------------------
+//
+// Set the message to display in the bubble. Causes the geometry of the
+// widget to be recalculated.
+//
+void AmorBubble::setMessage(const QString& message)
+{
+ mMessage = QString( "<html>%1</html>" ).arg( message );
+ // hacks because heightForWidth() doesn't work.
+ setGeometry( -1000, 0, 300, 1000 );
+ show();
+ mBrowser->setGeometry( 0, 0, 250, 1000 );
+ mBrowser->setText( mMessage );
+ calcGeometry();
+}
+
+//---------------------------------------------------------------------------
+//
+// Calculates the size, position and mask of the bubble
+//
+void AmorBubble::calcGeometry()
+{
+ mBound = QRect( 0, 0, 250, 0 );
+// mBound.setHeight( mBrowser->heightForWidth( mBound.width() ) );
+ mBound.setHeight( mBrowser->contentsHeight() );
+ mBound.moveBy(ARROW_WIDTH+BORDER_SIZE, BORDER_SIZE);
+
+ // initialise the default geometry of the bubble
+ int w = mBound.width() + BORDER_SIZE * 2 + ARROW_WIDTH;
+ int h = mBound.height() + BORDER_SIZE * 2;
+ int xpos = mOriginX + BUBBLE_OFFSET;
+ int ypos = mOriginY - BORDER_SIZE - ARROW_HEIGHT / 2;
+
+ mArrowVert = Top;
+ mArrowHorz = Left;
+
+ // The actual position of the bubble may change if it is too close to
+ // the desktop boundary.
+ if (mOriginX + w > kapp->desktop()->width())
+ {
+ // source on right
+ xpos = mOriginX - w - BUBBLE_OFFSET;
+ mArrowHorz = Right;
+ mBound.moveBy( -ARROW_WIDTH, 0 );
+ }
+
+ if (mOriginY + h > kapp->desktop()->height())
+ {
+ // source at bottom
+ ypos = mOriginY - h + BORDER_SIZE + ARROW_HEIGHT / 2;
+ mArrowVert = Bottom;
+ }
+
+ // Check for negative vertical bubble position (top of the screen)
+ if ( ypos < 0 )
+ ypos = 0;
+
+ setGeometry(xpos, ypos, w, h);
+ mBrowser->setGeometry( mBound );
+
+ // create and apply the shape mask
+ mMask.resize(w, h);
+ mMask.fill(color0);
+ QPainter maskPainter(&mMask);
+ maskPainter.setPen(color1);
+ maskPainter.setBrush(color1);
+ drawBubble(maskPainter);
+ XShapeCombineMask( x11Display(), winId(), ShapeBounding, 0, 0,
+ mMask.handle(), ShapeSet );
+}
+
+//---------------------------------------------------------------------------
+//
+// Draw the bubble that text will be draw into using the current pen
+// as the outline and the current brush as the fill.
+//
+void AmorBubble::drawBubble(QPainter &p)
+{
+ QPointArray pointArray(3);
+
+ int left = ARROW_WIDTH;
+
+ if (mArrowHorz == Left)
+ {
+ pointArray.setPoint(0, ARROW_WIDTH+1, 0);
+ pointArray.setPoint(1, 0, -3);
+ pointArray.setPoint(2, ARROW_WIDTH+1, ARROW_HEIGHT);
+ }
+ else
+ {
+ pointArray.setPoint(0, 0, 0);
+ pointArray.setPoint(1, ARROW_WIDTH+1, -3);
+ pointArray.setPoint(2, 0, ARROW_HEIGHT);
+ pointArray.translate(width() - ARROW_WIDTH - 1, 0);
+ left = 0;
+ }
+
+ if (mArrowVert == Top)
+ {
+ pointArray.translate(0, BORDER_SIZE + ARROW_HEIGHT / 2);
+ }
+ else
+ {
+ pointArray.translate(0, height() - BORDER_SIZE - ARROW_HEIGHT / 2);
+ }
+
+// p.drawRoundRect(left, 0, width() - ARROW_WIDTH, height(), 10, 20);
+ p.drawRect(left, 0, width() - ARROW_WIDTH, height());
+
+ QPen pen(p.pen());
+ p.setPen(NoPen);
+ p.drawPolygon(pointArray);
+
+ p.setPen(pen);
+ p.drawPolyline(pointArray, 0, 3);
+}
+
+//---------------------------------------------------------------------------
+//
+// Draw the message in a bubble
+//
+void AmorBubble::paintEvent(QPaintEvent *)
+{
+ QPainter painter(this);
+ painter.setPen(black);
+ painter.setBrush( QToolTip::palette().active().brush( QColorGroup::Background ) );
+ drawBubble(painter);
+}
+
+//---------------------------------------------------------------------------
+//
+// The user clicked on the widget
+//
+void AmorBubble::mouseReleaseEvent(QMouseEvent *)
+{
+ hide();
+}
+
+//---------------------------------------------------------------------------
+//
+bool AmorBubble::eventFilter( QObject *, QEvent *e )
+{
+ switch ( e->type() )
+ {
+
+// GP case QEvent::Enter:
+// GP mBubbleTimer->stop();
+// GP break;
+// GP case QEvent::Leave:
+// GP if ( isVisible() )
+// GP mBubbleTimer->start( 1000, true );
+// GP break;
+ case QEvent::Enter:
+ mMouseWithin = true;
+ break;
+ case QEvent::Leave:
+ mMouseWithin = false;
+ break;
+ case QEvent::MouseButtonRelease:
+ hide(); // GP This is the only reason a bubble might posibly be created but hidden
+ break;
+ default:
+ break;
+ }
+
+ return false;
+}
diff --git a/amor/amorbubble.h b/amor/amorbubble.h
new file mode 100644
index 0000000..722ec91
--- /dev/null
+++ b/amor/amorbubble.h
@@ -0,0 +1,81 @@
+/* amorbubble.h
+**
+** Copyright (c) 1999 Martin R. Jones <mjones@kde.org>
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+#ifndef AMORBUBBLE_H
+#define AMORBUBBLE_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <kapplication.h>
+#include <qwidget.h>
+#include <qbitmap.h>
+
+class QTextBrowser;
+class QTimer;
+
+//---------------------------------------------------------------------------
+//
+// AmorBubble displays a message in a shaped window
+//
+class AmorBubble : public QWidget
+{
+ Q_OBJECT
+public:
+ AmorBubble();
+ virtual ~AmorBubble();
+
+ void setOrigin(int x, int y) { mOriginX = x; mOriginY = y; }
+ void setMessage(const QString& message);
+
+ bool mouseWithin() { return mMouseWithin; }
+
+protected:
+ enum VertPos { Top, Bottom };
+ enum HorzPos { Left, Right };
+
+ void calcGeometry();
+ void drawBubble(QPainter &p);
+ virtual void paintEvent(QPaintEvent *);
+ virtual void mouseReleaseEvent(QMouseEvent *);
+ virtual bool eventFilter( QObject *, QEvent * );
+
+protected:
+ QString mMessage; // message to display
+ int mOriginX; // X origin of bubble arrow
+ int mOriginY; // Y origin of bubble arrow
+ QRect mBound; // bounds of the text
+ QBitmap mMask; // shape mask
+ VertPos mArrowVert; // vertical position of the arrow
+ HorzPos mArrowHorz; // horizontal position of the arrow
+ QTextBrowser *mBrowser; // displays the message
+
+ bool mMouseWithin; // the mouse pointer is inside the bubble
+};
+
+#endif // AMORBUBBLE_H
+
diff --git a/amor/amorconfig.cpp b/amor/amorconfig.cpp
new file mode 100644
index 0000000..3a0c209
--- /dev/null
+++ b/amor/amorconfig.cpp
@@ -0,0 +1,83 @@
+/* amorconfig.cpp
+**
+** Copyright (c) 1999 Martin R. Jones <mjones@kde.org>
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+#include <kapplication.h>
+#include "amorconfig.h"
+#include <kconfig.h>
+
+//---------------------------------------------------------------------------
+//
+// Constructor
+//
+AmorConfig::AmorConfig()
+{
+ mOnTop = false;
+ mOffset = 0;
+ mTheme = "blobrc";
+ mTips = false;
+ mAppTips = true;
+ mStaticPos = 20;
+}
+
+//---------------------------------------------------------------------------
+//
+// Read the configuration
+//
+void AmorConfig::read()
+{
+ KConfig *config = kapp->config();
+ KConfigGroupSaver cs(config, "General");
+
+ mOnTop = config->readBoolEntry("OnTop", false);
+ mOffset = config->readNumEntry("Offset", 0);
+ mTheme = config->readEntry("Theme", "blobrc");
+ mTips = config->readBoolEntry("Tips", false);
+ mRandomTheme = config->readBoolEntry("RandomTheme", false);
+ mAppTips = config->readBoolEntry("ApplicationTips", true);
+ mStaticPos = config->readNumEntry("StaticPosition", 20);
+}
+
+//---------------------------------------------------------------------------
+//
+// Write the configuration
+//
+void AmorConfig::write()
+{
+ KConfig *config = kapp->config();
+ KConfigGroupSaver cs(config, "General");
+
+ config->writeEntry("OnTop", mOnTop);
+ config->writeEntry("Offset", mOffset);
+ config->writeEntry("Theme", mTheme);
+ config->writeEntry("Tips", mTips);
+ config->writeEntry("RandomTheme", mRandomTheme);
+ config->writeEntry("ApplicationTips", mAppTips);
+ config->writeEntry("StaticPosition", mStaticPos);
+
+ config->sync();
+}
+
+
diff --git a/amor/amorconfig.h b/amor/amorconfig.h
new file mode 100644
index 0000000..9a93069
--- /dev/null
+++ b/amor/amorconfig.h
@@ -0,0 +1,58 @@
+/* amorconfig.h
+**
+** Copyright (c) 1999 Martin R. Jones <mjones@kde.org>
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+#ifndef AMORCONFIG_H
+#define AMORCONFIG_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <qstring.h>
+
+//---------------------------------------------------------------------------
+//
+// AmorConfig contains amor configuration parameters
+//
+class AmorConfig
+{
+public:
+ AmorConfig();
+
+ void read();
+ void write();
+
+ QString mTheme;
+ bool mOnTop;
+ int mOffset;
+ bool mTips;
+ bool mRandomTheme;
+ bool mAppTips;
+ int mStaticPos;
+};
+
+#endif // AMORCONFIG_H
+
diff --git a/amor/amordialog.cpp b/amor/amordialog.cpp
new file mode 100644
index 0000000..36f2be3
--- /dev/null
+++ b/amor/amordialog.cpp
@@ -0,0 +1,285 @@
+/* amordialog.cpp
+**
+** Copyright (c) 1999 Martin R. Jones <mjones@kde.org>
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+
+#include <qcheckbox.h>
+#include <qlabel.h>
+#include <qslider.h>
+#include <qpainter.h>
+#include <kapplication.h>
+#include <ksimpleconfig.h>
+#include "amordialog.h"
+#include "amordialog.moc"
+#include "version.h"
+#include <klocale.h>
+#include <qvbox.h>
+#include <kstandarddirs.h>
+
+//---------------------------------------------------------------------------
+//
+// Constructor
+//
+AmorDialog::AmorDialog()
+ : KDialogBase(0, "amordlg", false, i18n("Options"), Ok|Apply|Cancel, Ok )
+{
+ mConfig.read();
+ QVBox *mainwidget = makeVBoxMainWidget();
+
+ QHBox *hb = new QHBox(mainwidget);
+
+ // Theme list
+ QVBox *themeBox = new QVBox(hb);
+ themeBox->setSpacing(spacingHint());
+
+ QLabel *label = new QLabel(i18n("Theme:"), themeBox);
+
+ mThemeListBox = new QListBox(themeBox);
+ connect(mThemeListBox,SIGNAL(highlighted(int)),SLOT(slotHighlighted(int)));
+ mThemeListBox->setMinimumSize( fontMetrics().maxWidth()*20,
+ fontMetrics().lineSpacing()*6 );
+
+ mAboutEdit = new QMultiLineEdit(themeBox);
+ mAboutEdit->setReadOnly(true);
+ mAboutEdit->setMinimumHeight( fontMetrics().lineSpacing()*4 );
+
+ themeBox->setStretchFactor(mThemeListBox, 4);
+ themeBox->setStretchFactor(mAboutEdit, 1);
+
+ // Animation offset
+ QVBox *offsetBox = new QVBox(hb);
+ offsetBox->setSpacing(spacingHint());
+ label = new QLabel(i18n("Offset:"), offsetBox);
+
+ QSlider *slider = new QSlider(-40, 40, 5, mConfig.mOffset,
+ QSlider::Vertical, offsetBox);
+ connect(slider, SIGNAL(valueChanged(int)), SLOT(slotOffset(int)));
+
+ // Always on top
+ QCheckBox *checkBox = new QCheckBox(i18n("Always on top"), mainwidget);
+ connect(checkBox, SIGNAL(toggled(bool)), SLOT(slotOnTop(bool)));
+ checkBox->setChecked(mConfig.mOnTop);
+
+ checkBox = new QCheckBox(i18n("Show random tips"), mainwidget);
+ connect(checkBox, SIGNAL(toggled(bool)), SLOT(slotRandomTips(bool)));
+ checkBox->setChecked(mConfig.mTips); // always keep this one after the connect, or the QList would not be grayed when it should
+
+ checkBox = new QCheckBox(i18n("Use a random character"), mainwidget);
+ connect(checkBox, SIGNAL(toggled(bool)), SLOT(slotRandomTheme(bool)));
+ checkBox->setChecked(mConfig.mRandomTheme);
+
+ checkBox = new QCheckBox(i18n("Allow application tips"), mainwidget);
+ connect(checkBox, SIGNAL(toggled(bool)), SLOT(slotApplicationTips(bool)));
+ checkBox->setChecked(mConfig.mAppTips);
+
+ readThemes();
+}
+
+//---------------------------------------------------------------------------
+//
+// Destructor
+//
+AmorDialog::~AmorDialog()
+{
+}
+
+//---------------------------------------------------------------------------
+//
+// Get list of all themes
+//
+void AmorDialog::readThemes()
+{
+ QStringList files;
+
+ // Non-recursive search for theme files, with the relative paths stored
+ // in files so that absolute paths are not used.
+ KGlobal::dirs()->findAllResources("appdata", "*rc", false, false, files);
+
+ for (QStringList::ConstIterator it = files.begin();
+ it != files.end();
+ it++)
+ addTheme(*it);
+}
+
+//---------------------------------------------------------------------------
+//
+// Add a single theme to the list
+//
+void AmorDialog::addTheme(const QString& file)
+{
+ KSimpleConfig config(locate("appdata", file), true);
+
+ config.setGroup("Config");
+
+ QString pixmapPath = config.readPathEntry("PixmapPath");
+ if (pixmapPath.isEmpty())
+ {
+ return;
+ }
+
+ pixmapPath += "/";
+
+ if (pixmapPath[0] != '/')
+ {
+ // relative to config file. We add a / to indicate the dir
+ pixmapPath = locate("appdata", pixmapPath);
+ }
+
+ QString description = config.readEntry("Description");
+ QString about = config.readEntry("About", " ");
+ QString pixmapName = config.readEntry("Icon");
+
+ pixmapPath += pixmapName;
+
+ QPixmap pixmap(pixmapPath);
+
+ AmorListBoxItem *item = new AmorListBoxItem(description, pixmap);
+ mThemeListBox->insertItem(item);
+ mThemes.append(file);
+ mThemeAbout.append(about);
+
+ if (mConfig.mTheme == file)
+ {
+ mThemeListBox->setSelected(mThemeListBox->count()-1, true);
+ }
+}
+
+//---------------------------------------------------------------------------
+//
+// User highlighted a theme
+//
+void AmorDialog::slotHighlighted(int index)
+{
+ mConfig.mTheme = *mThemes.at(index);
+ mAboutEdit->setText(*mThemeAbout.at(index));
+}
+
+//---------------------------------------------------------------------------
+//
+// User changed offset
+//
+void AmorDialog::slotOffset(int off)
+{
+ mConfig.mOffset = off;
+ emit offsetChanged(mConfig.mOffset);
+}
+
+//---------------------------------------------------------------------------
+//
+// User toggled always on top
+//
+void AmorDialog::slotOnTop(bool onTop)
+{
+ mConfig.mOnTop = onTop;
+}
+
+//---------------------------------------------------------------------------
+//
+// User toggled random tips
+//
+void AmorDialog::slotRandomTips(bool tips)
+{
+ mConfig.mTips = tips;
+}
+
+//---------------------------------------------------------------------------
+//
+// User toggled random character
+//
+void AmorDialog::slotRandomTheme(bool randomTheme)
+{
+ mThemeListBox->setEnabled(!randomTheme);
+ mConfig.mRandomTheme = randomTheme;
+}
+
+//---------------------------------------------------------------------------
+//
+// User toggled application tips
+//
+void AmorDialog::slotApplicationTips(bool tips)
+{
+ mConfig.mAppTips = tips;
+}
+
+//---------------------------------------------------------------------------
+//
+// User clicked Ok
+//
+void AmorDialog::slotOk()
+{
+ mConfig.write();
+ emit changed();
+ accept();
+}
+
+//---------------------------------------------------------------------------
+//
+// User clicked Ok
+//
+void AmorDialog::slotApply()
+{
+ mConfig.write();
+ emit changed();
+}
+
+//---------------------------------------------------------------------------
+//
+// User clicked Cancel
+//
+void AmorDialog::slotCancel()
+{
+ // restore offset
+ KConfig *config = kapp->config();
+ KConfigGroupSaver cs(config, "General");
+ emit offsetChanged(config->readNumEntry("Offset"));
+ reject();
+}
+
+//===========================================================================
+//
+// AmorListBoxItem implements a list box items for selection of themes
+//
+void AmorListBoxItem::paint( QPainter *p )
+{
+ p->drawPixmap( 3, 0, mPixmap );
+ QFontMetrics fm = p->fontMetrics();
+ int yPos; // vertical text position
+ if ( mPixmap.height() < fm.height() )
+ yPos = fm.ascent() + fm.leading()/2;
+ else
+ yPos = mPixmap.height()/2 - fm.height()/2 + fm.ascent();
+ p->drawText( mPixmap.width() + 5, yPos, text() );
+}
+
+int AmorListBoxItem::height(const QListBox *lb ) const
+{
+ return QMAX( mPixmap.height(), lb->fontMetrics().lineSpacing() + 1 );
+}
+
+int AmorListBoxItem::width(const QListBox *lb ) const
+{
+ return mPixmap.width() + lb->fontMetrics().width( text() ) + 6;
+}
+
diff --git a/amor/amordialog.h b/amor/amordialog.h
new file mode 100644
index 0000000..59e639d
--- /dev/null
+++ b/amor/amordialog.h
@@ -0,0 +1,107 @@
+/* amordialog.h
+**
+** Copyright (c) 1999 Martin R. Jones <mjones@kde.org>
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+#ifndef AMORDIALOG_H
+#define AMORDIALOG_H
+
+#include <qdialog.h>
+#include <qlistbox.h>
+#include <qptrlist.h>
+#include <qmultilineedit.h>
+#include "amorconfig.h"
+#include <kdialogbase.h>
+
+//---------------------------------------------------------------------------
+//
+// AmorDialog provides a setup dialog.
+//
+class AmorDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ AmorDialog();
+ virtual ~AmorDialog();
+
+signals:
+ //-----------------------------------------------------------------------
+ //
+ // The configuration has changed in some way.
+ //
+ void changed();
+
+ //-----------------------------------------------------------------------
+ //
+ // The animation offset has been changed.
+ //
+ void offsetChanged(int);
+
+protected slots:
+ void slotHighlighted(int);
+ void slotOnTop(bool);
+ void slotRandomTips(bool);
+ void slotRandomTheme(bool);
+ void slotApplicationTips(bool);
+ void slotOffset(int);
+ void slotOk();
+ void slotApply();
+ void slotCancel();
+
+protected:
+ void readThemes();
+ void addTheme(const QString& file);
+
+protected:
+ QListBox *mThemeListBox;
+ QMultiLineEdit *mAboutEdit;
+ QStringList mThemes;
+ QStringList mThemeAbout;
+ AmorConfig mConfig;
+};
+
+//---------------------------------------------------------------------------
+//
+// AmorListBoxItem implements a list box items for selection of themes
+//
+class AmorListBoxItem : public QListBoxItem
+{
+public:
+ AmorListBoxItem(const QString & s, const QPixmap& p)
+ : QListBoxItem(), mPixmap(p)
+ { setText(s); }
+
+protected:
+ virtual void paint(QPainter *);
+ virtual int height(const QListBox *) const;
+ virtual int width(const QListBox *) const;
+ virtual const QPixmap *pixmap() const { return &mPixmap; }
+
+private:
+ QPixmap mPixmap;
+};
+
+#endif // AMORDIALOG_H
+
diff --git a/amor/amorpm.cpp b/amor/amorpm.cpp
new file mode 100644
index 0000000..2a34495
--- /dev/null
+++ b/amor/amorpm.cpp
@@ -0,0 +1,94 @@
+/* amorpm.cpp
+**
+** Copyright (c) 1999 Martin R. Jones <mjones@kde.org>
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+#include "amorpm.h"
+
+// static
+AmorPixmapManager *AmorPixmapManager::mManager = 0;
+
+//---------------------------------------------------------------------------
+//
+// Constructor
+//
+AmorPixmapManager::AmorPixmapManager()
+ : mPixmapDir(".")
+{
+ mPixmaps.setAutoDelete(true);
+}
+
+//---------------------------------------------------------------------------
+//
+// Destructor
+//
+AmorPixmapManager::~AmorPixmapManager()
+{
+}
+
+//---------------------------------------------------------------------------
+//
+// Load an image into the image manager
+//
+// Returns:
+// pointer to pixmap if loaded successfully, 0 otherwise.
+//
+const QPixmap *AmorPixmapManager::load(const QString & img)
+{
+ QPixmap *pixmap = mPixmaps.find(img);
+
+ if (!pixmap)
+ {
+ // pixmap has not yet been loaded.
+ QString path = mPixmapDir + QString("/") + img;
+ pixmap = new QPixmap(path);
+
+ if (!pixmap->isNull())
+ {
+ mPixmaps.insert(img,pixmap);
+ }
+ else
+ {
+ delete pixmap;
+ pixmap = 0;
+ }
+ }
+
+ return pixmap;
+}
+
+//---------------------------------------------------------------------------
+//
+// returns a pointer to the pixmap manager.
+//
+AmorPixmapManager *AmorPixmapManager::manager()
+{
+ if (!mManager)
+ {
+ mManager = new AmorPixmapManager();
+ }
+
+ return mManager;
+}
+
diff --git a/amor/amorpm.h b/amor/amorpm.h
new file mode 100644
index 0000000..f67850b
--- /dev/null
+++ b/amor/amorpm.h
@@ -0,0 +1,64 @@
+/* amorpm.h
+**
+** Copyright (c) 1999 Martin R. Jones <mjones@kde.org>
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+#ifndef AMORPM_H
+#define AMORPM_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <qdict.h>
+#include <qpixmap.h>
+
+//---------------------------------------------------------------------------
+//
+// AmorPixmapManager stores the frames used in animations.
+//
+class AmorPixmapManager
+{
+public:
+ AmorPixmapManager();
+ virtual ~AmorPixmapManager();
+
+ void setPixmapDir(const QString &dir)
+ { mPixmapDir = dir; }
+ void reset()
+ { mPixmapDir = "."; mPixmaps.clear(); }
+ const QPixmap *load(const QString & img);
+ const QPixmap *pixmap(const QString & img) const
+ { return mPixmaps.find(img); }
+
+ static AmorPixmapManager *manager();
+
+public:
+ QString mPixmapDir; // get pixmaps from here
+ QDict<QPixmap> mPixmaps; // list of pixmaps
+ static AmorPixmapManager *mManager; // static pointer to instance
+};
+
+#endif // AMORPM_H
+
diff --git a/amor/amortips.cpp b/amor/amortips.cpp
new file mode 100644
index 0000000..1ef7c8f
--- /dev/null
+++ b/amor/amortips.cpp
@@ -0,0 +1,181 @@
+/* amortips.cpp
+**
+** Copyright (c) 1999 Martin R. Jones <mjones@kde.org>
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+#include <stdlib.h>
+#include <kapplication.h>
+#include "amortips.h"
+#include <kstandarddirs.h>
+#include <klocale.h>
+#include <qfile.h>
+#include <qregexp.h>
+#include <kdebug.h>
+
+//---------------------------------------------------------------------------
+//
+AmorTips::AmorTips()
+{
+ KGlobal::locale()->insertCatalogue("ktip"); // For ktip tip translations
+}
+
+//---------------------------------------------------------------------------
+//
+// Set the file containing tips. This reads all tips into memory at the
+// moment - need to make more efficient.
+//
+bool AmorTips::setFile(const QString& file)
+{
+ bool rv = false;
+
+ QString path( locate("appdata", file) );
+ if(path.length() && read(path))
+ rv = true;
+
+ rv |= readKTips();
+
+ return rv;
+}
+
+//---------------------------------------------------------------------------
+//
+// Clear all tips from memory
+//
+void AmorTips::reset()
+{
+ mTips.clear();
+}
+
+//---------------------------------------------------------------------------
+//
+// Get a tip randomly from the list
+//
+QString AmorTips::tip()
+{
+ if (mTips.count())
+ {
+ QString tip = *mTips.at(kapp->random() % mTips.count());
+ return i18n(tip.utf8());
+ }
+
+ return i18n("No tip");
+}
+
+//---------------------------------------------------------------------------
+//
+// Read the tips from ktip's file
+//
+bool AmorTips::readKTips()
+{
+ QString fname;
+
+ fname = locate("data", QString("kdewizard/tips"));
+
+ if (fname.isEmpty())
+ return false;
+
+ QFile f(fname);
+ if (f.open(IO_ReadOnly))
+ {
+ // Reading of tips must be exactly as in KTipDatabase::loadTips for translation
+ QString content = f.readAll();
+ const QRegExp rx("\\n+");
+
+ int pos = -1;
+ while ((pos = content.find("<html>", pos + 1, false)) != -1)
+ {
+ QString tip = content
+ .mid(pos + 6, content.find("</html>", pos, false) - pos - 6)
+ .replace(rx, "\n");
+ if (!tip.endsWith("\n"))
+ tip += "\n";
+ if (tip.startsWith("\n"))
+ tip = tip.mid(1);
+ if (tip.isEmpty())
+ {
+ kdDebug() << "Empty tip found! Skipping! " << pos << endl;
+ continue;
+ }
+ mTips.append(tip);
+ }
+
+ f.close();
+ }
+
+ return true;
+}
+
+//---------------------------------------------------------------------------
+//
+// Read all tips from the specified file.
+//
+bool AmorTips::read(const QString& path)
+{
+ QFile file(path);
+
+ if (file.open(IO_ReadOnly))
+ {
+ while (!file.atEnd())
+ {
+ readTip(file);
+ }
+
+ return true;
+ }
+
+ return false;
+}
+
+//---------------------------------------------------------------------------
+//
+// Read a single tip.
+//
+bool AmorTips::readTip(QFile &file)
+{
+ char buffer[1024] = "";
+ QString tip;
+
+ while (!file.atEnd() && buffer[0] != '%')
+ {
+ file.readLine(buffer, 1024);
+ if (buffer[0] != '%')
+ {
+ tip += QString::fromUtf8(buffer);
+ }
+ }
+
+ if (!tip.isEmpty())
+ {
+ if (tip[tip.length()-1] == '\n')
+ {
+ tip.truncate(tip.length()-1);
+ }
+ mTips.append(tip);
+ return true;
+ }
+
+ return false;
+}
+
+
diff --git a/amor/amortips.h b/amor/amortips.h
new file mode 100644
index 0000000..7b0ddff
--- /dev/null
+++ b/amor/amortips.h
@@ -0,0 +1,60 @@
+/* amortips.h
+**
+** Copyright (c) 1999 Martin R. Jones <mjones@kde.org>
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+#ifndef AMORTIPS_H
+#define AMORTIPS_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <qstrlist.h>
+class QFile;
+
+//---------------------------------------------------------------------------
+//
+// AmorTips selects random tips from a data file
+//
+class AmorTips
+{
+public:
+ AmorTips();
+
+ bool setFile(const QString& file);
+ void reset();
+ QString tip();
+
+protected:
+ bool readKTips();
+ bool read(const QString& file);
+ bool readTip(QFile &file);
+
+protected:
+ QStringList mTips;
+};
+
+#endif // AMORTIPS_H
+
diff --git a/amor/amorwidget.cpp b/amor/amorwidget.cpp
new file mode 100644
index 0000000..e343524
--- /dev/null
+++ b/amor/amorwidget.cpp
@@ -0,0 +1,125 @@
+/* amorwidget.cpp
+**
+** Copyright (c) 1999 Martin R. Jones <mjones@kde.org>
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+#include "amorwidget.h"
+#include "amorwidget.moc"
+#include <qbitmap.h>
+#include <X11/Xlib.h>
+#include <X11/extensions/shape.h>
+
+//---------------------------------------------------------------------------
+//
+// Constructor
+//
+AmorWidget::AmorWidget()
+ : QWidget(0, 0, WStyle_Customize | WStyle_NoBorder | WX11BypassWM ),
+ mPixmap(0)
+{
+ setBackgroundMode( NoBackground );
+ dragging = false;
+}
+
+//---------------------------------------------------------------------------
+//
+// Destructor
+//
+AmorWidget::~AmorWidget()
+{
+}
+
+//---------------------------------------------------------------------------
+//
+// Set the pixmap to display
+//
+void AmorWidget::setPixmap(const QPixmap *pixmap)
+{
+ mPixmap = pixmap;
+
+ if (mPixmap)
+ {
+ if (mPixmap->mask())
+ {
+ XShapeCombineMask( x11Display(), winId(), ShapeBounding, 0, 0,
+ mPixmap->mask()->handle(), ShapeSet );
+ repaint(false);
+ }
+
+ update();
+ }
+}
+
+//---------------------------------------------------------------------------
+//
+// Draw the pixmap
+//
+void AmorWidget::paintEvent(QPaintEvent *)
+{
+ if (mPixmap)
+ bitBlt( this, 0, 0, mPixmap );
+ else
+ erase();
+}
+
+//---------------------------------------------------------------------------
+//
+// The user clicked on the widget
+//
+void AmorWidget::mousePressEvent(QMouseEvent *me)
+{
+ clickPos = me->globalPos();
+}
+
+//---------------------------------------------------------------------------
+//
+// The user moved the mouse
+//
+void AmorWidget::mouseMoveEvent(QMouseEvent *me)
+{
+ if ( me->state() == LeftButton ) {
+ if ( !dragging && (clickPos-me->globalPos()).manhattanLength() > 3 )
+ dragging = true;
+ if ( dragging ) {
+ emit dragged( me->globalPos() - clickPos, false );
+ clickPos = me->globalPos();
+ }
+ }
+}
+
+//---------------------------------------------------------------------------
+//
+// The user clicked on the widget
+//
+void AmorWidget::mouseReleaseEvent(QMouseEvent *me)
+{
+ if ( dragging )
+ emit dragged( me->globalPos() - clickPos, true );
+ else if ( me->state() == RightButton )
+ emit mouseClicked(clickPos);
+
+ clickPos = QPoint();
+ dragging = false;
+}
+
diff --git a/amor/amorwidget.h b/amor/amorwidget.h
new file mode 100644
index 0000000..5aaac82
--- /dev/null
+++ b/amor/amorwidget.h
@@ -0,0 +1,67 @@
+/* amorwidget.h
+**
+** Copyright (c) 1999 Martin R. Jones <mjones@kde.org>
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+#ifndef AMORWIDGET_H
+#define AMORWIDGET_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <kapplication.h>
+#include <qwidget.h>
+
+//---------------------------------------------------------------------------
+//
+// AmorWidget displays a shaped pixmap
+//
+class AmorWidget : public QWidget
+{
+ Q_OBJECT
+public:
+ AmorWidget();
+ virtual ~AmorWidget();
+
+ void setPixmap(const QPixmap *pixmap);
+
+signals:
+ void mouseClicked(const QPoint &pos);
+ void dragged( const QPoint &delta, bool release );
+
+protected:
+ void paintEvent(QPaintEvent *);
+ void mousePressEvent(QMouseEvent *);
+ void mouseMoveEvent(QMouseEvent *);
+ void mouseReleaseEvent(QMouseEvent *);
+
+protected:
+ const QPixmap *mPixmap;
+ QPoint clickPos;
+ bool dragging;
+};
+
+#endif // AMORWIDGET_H
+
diff --git a/amor/configure.in.in b/amor/configure.in.in
new file mode 100644
index 0000000..1fe61bd
--- /dev/null
+++ b/amor/configure.in.in
@@ -0,0 +1,3 @@
+if test "x$kde_use_qt_mac" = "xyes"; then
+ DO_NOT_COMPILE="$DO_NOT_COMPILE amor"
+fi
diff --git a/amor/data/Makefile.am b/amor/data/Makefile.am
new file mode 100644
index 0000000..35a9c97
--- /dev/null
+++ b/amor/data/Makefile.am
@@ -0,0 +1,14 @@
+SUBDIRS = pics
+
+amor_DATA = blobrc ghostrc eyesrc bonhommerc nekorc pingurc wormrc tips-en \
+ billyrc bsdrc tuxrc taorc
+
+# This is where it will all be installed
+amordir = $(kde_datadir)/amor
+
+install-data-local:
+ -rm -f $(DESTDIR)$(amordir)/tips
+ $(LN_S) $(amordir)/tips-en $(DESTDIR)$(amordir)/tips
+
+uninstall-local:
+ -rm -f $(DESTDIR)$(amordir)/tips
diff --git a/amor/data/billyrc b/amor/data/billyrc
new file mode 100644
index 0000000..c0b7a4b
--- /dev/null
+++ b/amor/data/billyrc
@@ -0,0 +1,129 @@
+# KDE Config File
+[Config]
+PixmapPath=pics/static
+Static=true
+Description=Little Billy
+Description[af]=Klein Billy
+Description[ar]=بيل الصغير
+Description[be]=Маленькі Біллі
+Description[bg]=МалкиÑÑ‚ Били
+Description[bn]=ছোটà§à¦Ÿ বিলি
+Description[br]=Billy Bihan
+Description[bs]=Mali Billy
+Description[ca]=Petit Guillem
+Description[cs]=Malý Billy
+Description[cy]=Bili Bach
+Description[da]=Lille Billy
+Description[de]=Klein Billy
+Description[el]=ΜικÏός Billy
+Description[eo]=Malgranda Bilĉjo
+Description[es]=Pequeño Billy
+Description[et]=Pisi-Villu
+Description[eu]=Billy Txikia
+Description[fa]=چوب‌دستی کوچک
+Description[fi]=Pikku-Billy
+Description[gl]=O Pequeno Billy
+Description[he]=בילי הקטן
+Description[hi]=ननà¥à¤¹à¤¾ बिलà¥à¤²à¥‚
+Description[hr]=Mali Billy
+Description[hu]=Billy fiú
+Description[is]=Billi litli
+Description[it]=Piccolo Bill
+Description[ja]=リトルビル
+Description[km]=កូនប៊ីលីážáž¼áž…
+Description[ko]=ìž‘ì€ ë¹Œë¦¬
+Description[lt]=Mažasis Bilas
+Description[lv]=Mazais Billijs
+Description[mk]=Малиот Били
+Description[mt]=IÄ‹-ÄŠkejken Billy
+Description[nb]=Lille Billy
+Description[nds]=Lütt Willi
+Description[ne]=सानो बिलà¥à¤²à¥€
+Description[nl]=Kleine Billy
+Description[nn]=Litlebill
+Description[pa]=ਛੋਟੀ ਬਿੱਲੀ
+Description[pl]=Mały Billy
+Description[pt]=Pequeno Bill
+Description[pt_BR]=Pequeno Billy
+Description[ro]=Micuţul Billy
+Description[ru]=Маленький Билли
+Description[sk]=Malý Billy
+Description[sl]=Mali Billy
+Description[sr]=Мали Били
+Description[sr@Latn]=Mali Bili
+Description[sv]=Lilla Billy
+Description[ta]= லிடà¯à®Ÿà®¿à®²à¯ பிலà¯à®¯à®¿
+Description[tg]=Билли ПаÑтқад
+Description[th]=บิลลี่ตัวจ้อย
+Description[tr]=Küçük Billy
+Description[uk]=Маленький Біллі
+Description[uz]=Kichik Billi
+Description[uz@cyrillic]=Кичик Билли
+Description[ven]=Billy Mutuku
+Description[zh_CN]=å°å°æ¯”利
+Description[zh_TW]=å°æ¯”利
+About=Static window sitter\nGraphic from http://www.xbill.org/
+About[af]=Statiese venster sitter\nGraphic van http://www.xbill.org/
+About[ar]=قاعدة النواÙØ° الساكنة \nالرسوم من http://www.xbill.org
+About[az]=Statik pəncərə mürəbbiyəsi\nQrafikalar http://www.xbill.org/
+About[be]=Статычны наглÑдчык вокнаў\nГрафіка з http://www.xbill.org/
+About[bg]=Ðеанимирано човече\nГрафиката е взета от http://www.xbill.org/
+About[bn]=উইনà§à¦¡à§‹à¦° à¦à¦• সà§à¦¥à¦¾à¦¨à§‡ সà§à¦¥à¦¿à¦° হয়ে বসে থাকে\nগà§à¦°à¦¾à¦«à¦¿à¦•à§à¦¸à§‡à¦° উৎস - http://www.xbill.org/
+About[bs]=StatiÄki window sitter\nGrafika iz http://www.xbill.org/
+About[ca]=Model de finestra estàtica\nGràfic de http://www.xbill.org/
+About[cs]=Statická ozdoba okna\nGrafika z http://www.xbill.org/
+About[cy]=Gwarchodydd ffenest sefydlog\nGraffeg oddiwrth http://www.xbill.org/
+About[da]=Statisk vinduessitter\nGrafik fra http://www.xbill.org/
+About[de]=Statischer Fenstersitzer\nGraphik von http://www.xbill.org/
+About[el]=Στατικό εικονίδιο\nΓÏαφικό από το http://www.xbill.org/
+About[eo]=MoviÄema fenestrosidulo\nGrafiko de http://www.xbill.org/
+About[es]=Cuidador estático de ventanas\nGraphic from http://www.xbill.org/
+About[et]=Liikumatu aknahoidja\nGraafika: http://www.xbill.org/
+About[eu]=Lehio modelo egonkorra\nIrudia http://www.xbill.org/'tik
+About[fa]=مدل پنجرۀ ایستا\nنگاره از http://www.xbill.org/
+About[fi]=Staattinen ikkunakoriste\nGrafiikat osoitteesta http://www.xbill.org/
+About[fr]=Surveillant statique de fenêtres\nDessin de http://www.xbill.org/
+About[ga]=Peata statach fuinneoige\nGrafaic ó http://www.xbill.org/
+About[gl]=Vixiante estático de fiestras\nImaxe sacada de http://www.xbill.org/
+About[he]=שומר חלון סטטי\nגרפיקה מתוך /http://www.xbill.org
+About[hi]=सà¥à¤¥à¤¿à¤° विंडो सिटर\nचितà¥à¤° http://www.xbill.org/ से
+About[hr]=StatiÄki sjedaÄ na prozoru\nSlika preuzeta sa http://www.xbill.org/
+About[hu]=Nem animált ablakdíszítés\nA grafika származási helye: http://www.xbill.org/
+About[is]=Static window sitter\nMynd frá http://www.xbill.org/
+About[it]=Immagine statica.\nGrafica presa da http://www.xbill.org/
+About[ja]=å‹•ã‹ãªã„ウィンドウ監視人\nグラフィック㯠http://www.xbill.org/ より
+About[km]=អ្នក​ážáŸ‚ទាំ​បង្អួចážáž·ážáž·ážœáž“្áž\nរចនា​ក្រាហ្វិក​ពី http://www.xbill.org/
+About[lt]=Nejudantis sėdėtojas ant lango\nGrafika iš http://www.xbill.org/
+About[lv]=Statisks uz loga sÄ“dÄ“tÄjs\nGrafika no http://www.xbill.org/
+About[mk]=Статичен Ñедач врз прозорец\nСликата е од http://www.xbill.org/
+About[mt]=Stampa statika\nGrafika minn http://www.xbill.org/
+About[nb]=Statisk vindusitter\n Bilde fra http://www.xbill.org/
+About[nds]=Fast Finstersitter\nGrafik vun http://www.xbill.org/
+About[ne]=http://www.xbill.org/ बाट सà¥à¤¥à¤¿à¤° सञà¥à¤à¥à¤¯à¤¾à¤² sitter\nGraphic
+About[nl]=Statische vensterzitter\nAfbeeldingen van from http://www.xbill.org/
+About[nn]=Statisk vindaugssitjar\nBilete frå http://www.xbill.org/
+About[pl]=Obrazek w tym samym miejscu ekranu\nGrafika ze strony http://www.xbill.org/
+About[pt]=Elemento estático sobre as janelas\nImagens de http://www.xbill.org/
+About[pt_BR]=Janela Estática\nGráfica de http://www.xbill.org/
+About[ro]=Imagine statică\nGrafică de la http://www.xbill.org/
+About[ru]=Статичный Ñторож окон\nГрафика от http://www.xbill.org/
+About[sk]=Statická ozdoba okna\nGrafika z http://www.xbill.org/
+About[sl]=StatiÄno okno\nGrafika z http://www.xbill.org/
+About[sr]=Статични Ñедач на прозору\nГрафика Ñа http://www.xbill.org/
+About[sr@Latn]=StatiÄni sedaÄ na prozoru\nGrafika sa http://www.xbill.org/
+About[sv]=Statisk fönstervakt\nGrafik från http://www.xbill.org/
+About[ta]= நிலையான சாளரம௠\nவரைகலையில௠இரà¯à®¨à¯à®¤à¯ http://www.தமிழà¯à®‡à®£à¯ˆà®¯à®®à¯.org/
+About[tg]=Ðигаҳбонии Ñтатикии тиреза\nГрафика аз http://www.xbill.org/
+About[th]=นั่งเล่นบนหน้าต่าง\nà¸à¸£à¸²à¸Ÿà¸´à¸à¸ˆà¸²à¸ http://www.xbill.org/
+About[tr]=Statik pencere bakıcısı\nGrafikler http://www.xbill.org/ 'tan
+About[uk]=Ðатурщик Ñтатичного вікна\nГрафіка з http://www.xbill.org/
+About[ven]=Tshidzuli tsha window isa tshimbili\nGirafu ubva http://www.xbill.org/
+About[xh]=Isibambo sewindow esingashukumi\nUmzobo http://www.xbill.org/
+About[zh_CN]=窗å£é™å者\n图形æ¥è‡ª http://www.xbill.org/
+Icon=../preview/billy.png
+
+[Base]
+Sequence=billy.png
+HotspotX=14
+HotspotY=40
+
diff --git a/amor/data/blobrc b/amor/data/blobrc
new file mode 100644
index 0000000..176ae07
--- /dev/null
+++ b/amor/data/blobrc
@@ -0,0 +1,312 @@
+# KDE Config File
+[Config]
+PixmapPath=pics/animated/blob
+Description=Multi-Talented Spot
+Description[ar]=نقطة متعددة المواهب
+Description[be]=Таленавіты калабок
+Description[bg]=Ð’Ñезнайко
+Description[bn]=বহà§à¦®à§à¦–ী পà§à¦°à¦¤à¦¿à¦­à¦¾à¦¸à¦®à§à¦ªà¦¨à§à¦¨ বিনà§à¦¦à§
+Description[bs]=ViÅ¡e-talentirana taÄka
+Description[ca]=Anunci multi-dotat
+Description[cs]=Talentovaný chlapík
+Description[cy]=Smotyn Aml-Dalentog
+Description[da]=Plet med multitalent
+Description[de]=Das Multitalent
+Description[el]=Πολυτάλαντη κουκκίδα
+Description[eo]=Multtalenta makulo
+Description[es]=Mancha multifacética
+Description[et]=Väga andekas plekk
+Description[eu]=Ahalmen Askodun Gunea
+Description[fa]=شکارچی استعدادها
+Description[fi]=Monitaitoinen piste
+Description[fr]=Point à talents multiples
+Description[ga]=Spota Ildánach
+Description[gl]=Ponto con moitas faculdades
+Description[he]=פרצוף כישרוני
+Description[hi]=लाल बà¥à¤à¤•à¥à¤•à¤¡à¤¼
+Description[hr]=ViÅ¡estruko nadarena toÄka
+Description[hu]=Spot
+Description[is]=Fjölhæfur Depill
+Description[it]=Macchia con molte abilità
+Description[ja]=マルãƒã‚¿ãƒ¬ãƒ³ãƒˆã‚¹ãƒãƒƒãƒˆ
+Description[km]=ក្បាល​មាន​ទáŸáž–កោសល្យ​ច្រើន
+Description[ko]=다재다능한 ì 
+Description[lv]=Multitalantīgs traips
+Description[mk]=Мултиталентирана точка
+Description[mt]=Ballun Bravu u Divertenti
+Description[nb]=Flekk med mange talenter
+Description[nds]=Dat Multitalent
+Description[ne]=बहà¥à¤à¤®à¥à¤–ी बिनà¥à¤¦à¥
+Description[nl]=Multi-getalenteerde stip
+Description[nn]=Talentfullt punkt
+Description[pl]=Bardzo zdolna plamka
+Description[pt]=Ponto Muito Talentoso
+Description[pt_BR]=Spot com Multi-talentos
+Description[ro]=Punct cu multiple talente
+Description[ru]=Талантливое пÑтнышко
+Description[sk]=Šikovný krúžok
+Description[sl]=Splošno nadarjena pika
+Description[sr]=Вишеталентована тачка
+Description[sr@Latn]=ViÅ¡etalentovana taÄka
+Description[sv]=Punkt med många talanger
+Description[tg]=Одами Оқил
+Description[th]=จุดอารมณ์ดี
+Description[tr]=Çok Yetenekli Benek
+Description[uk]=Здібна кулька
+Description[xh]=Indawo Eneziphiwo Ezininzi
+Description[zh_CN]=多æ‰å¤šè‰ºçš„脸
+About=By Martin R. Jones\nJet pack, beam and fire animations by Mark Grant
+About[af]=Deur Martin R. Jones\nJet pak, straal en vuur animasie Deur Merk Toegestaan
+About[ar]=من مارتن ر. جونز\nJet pack, الضوء, و النار من تصميم مارك غرانت
+About[az]=Martin R. Jones tərəfindən\nJet pack, beam and fire animations by Mark Grant
+About[be]=Ðўтары Martin R. Jones\nÐнімацыі агню, палёту Ñ– луча - Mark Grant
+About[bg]=Ðвтор Мартин Р. ДжоунÑ\nÐŸÐ¾Ð´Ð¾Ð±Ñ€ÐµÐ½Ð¸Ñ Ð¸ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ Марк Гранд
+About[bn]=তৈরি করেছেন মারà§à¦Ÿà¦¿à¦¨ আর. জোনà§à¦¸\nজেট পà§à¦¯à¦¾à¦•, রশà§à¦®à¦¿ ও আগà§à¦¨à§‡à¦° অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ তৈরি করেছেন মারà§à¦• গà§à¦°à§à¦¯à¦¾à¦¨à§à¦Ÿ
+About[bs]=Autor: Martin R. Jones\nAnimacije mlaznog ranca, zrake i pucanja napravio Mark Grant
+About[ca]=Per Martin R. Jones\nPaquet jet, nau i animacions de foc per Mark Grant
+About[cs]=Autor Martin R. Jones\nAnimace: Mark Grant
+About[cy]=Gan Martin R. Jones\nAnimeiddiadau pecyn jet, pelydryn a tân gan Mark Grant
+About[da]=Af Martin R. Jones\nJetpack, stråle- og brandanimationer af Mark Grant
+About[de]=Von Martin R. Jones\nRaketenrucksack, Strahl- und Feueranimationen von Mark Grant
+About[el]=Από τον Martin R. Jones\nJet pack, εφέ κίνησης ακτίνας και φωτιάς από τον Mark Grant
+About[eo]=De Martin R. Jones\nÄ´etpako, radiado kaj fajrospektakleto de Mark Grant
+About[es]=Por Martin R. Jones\nAnimaciones de la mochila a chorro, rayos y fuego por Mark Grant
+About[et]=Autor: Martin R. Jones\nJet pack, beam and fire animatsioonid: Mark Grant
+About[eu]=Martin R. Jonesek egina\nJet bilduma, tximista eta su animazioak Mark Grantek eginak
+About[fa]=توسط مارتین آر. جونز \nØŒ پویانماییهای Ùوران، پرتو Ùˆ آتش توسط مارک گرانت
+About[fi]=Tehnyt Martin R. Jones\nAnimaatiot Mark Grant
+About[fr]=Par Martin R. Jones\nAnimations du jet et du feu par Mark Grant
+About[ga]=Le Martin R. Jones\nÃomhánna beo den scairdphaca, léas, agus tine le Mark Grant
+About[gl]=Por Martin R. Jones\nAs animacións do propulsor, do raio e do fogo son de Mark Grant
+About[he]=מ×ת מרטין ר. ×’'ונס\n×נימציות תעופה, שיגור והתלקחות מ×ת מ×רק גרנט
+About[hi]=मारà¥à¤Ÿà¤¿à¤¨ आर. जोनà¥à¤¸ दà¥à¤µà¤¾à¤°à¤¾\nजेट पैक, शहतीर तथा अगà¥à¤¨à¤¿ à¤à¤¨à¤¿à¤®à¥‡à¤¶à¤¨à¥à¤¸- मारà¥à¤• गà¥à¤°à¤¾à¤¨à¥à¤Ÿ दà¥à¤µà¤¾à¤°à¤¾
+About[hr]=Autor: Martin R. Jones\nAnimacije malznog paketa, zrake i vatre: Mark Grant
+About[hu]=Készítette: Martin R. Jones\nA jet pack, a sugár és a tűz animációja Mark Grant munkája
+About[is]=Eftir Martin R. Jones\nÞotuhreyfill, leysir og teikningar af skotum eftir Mark Grant
+About[it]=Di Martin R. Jones.\nLe animazioni dello zaino-razzo, del fascio e del fuoco sono state realizzate da Mark Grant.
+About[ja]=By Martin R. Jones\nジェットパックã€ãƒ“ームã€ãƒ•ã‚¡ã‚¤ã‚¢ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ by Mark Grant
+About[km]=ដោយ Martin R. Jones\nJet pack, ចលនា​ភ្លើង និង​បាច់​ពន្លឺ​ដោយ Mark Grant
+About[lt]=Darė Martin R. Jones\nJet pack, spindulių ir ugnies animacijos Mark Grant
+About[lv]=Autors - Martin R. Jones\nAnimÄcija - Mark Grant
+About[mk]=Од Мартин Р. ÐонÑ\nÐнимации Ñо ракетен погон, зрак и оган од Марк Грант
+About[mt]=Ta' Martin R. Jones\nUħud mill-animazzjonijiet ta' Mark Grant
+About[nb]=Av Martin R. Jones\nJet-pakke, stråle og flamme-animasjoner av Mark Grant
+About[nds]=Vun Martin R. Jones\nRaketendrift, Strahl un Füeranimatschonen vun Mark Grant
+About[nl]=Door Martin R. Jones\nJet pack, beam en fire animaties door Mark Grant
+About[nn]=Av Martin R. Jones\nJetmotor, stråle- og flammeanimasjon av Mark Grant
+About[pl]=Autorstwa Martina Jonesa\nPromienie i animacje ognia autorstwa Marka Granta
+About[pt]=De Martin R. Jones\nJactos e animações de raios e fogo de Mark Grant
+About[pt_BR]=Por Martin R. Jones\nAnimações por Mark Grant
+About[ro]=De Martin R. Jones\nAnimaţie motor rachetă, rază şi foc de Mark Grant
+About[ru]=Ðвтор - Martin R. Jones\nÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ Mark Grant
+About[sk]=Vytvoril Martin R. Jones\nJet pack, laser a oheň vytvoril Mark Grant
+About[sl]=Od Martina R. Jonesa\nAnimacije izdelal Mark Grant
+About[sr]=Од Мартина Р. ÐонÑа (Martin R. Jones)\nМлазни ранац, анимација зракова и ватре од Марка Гранта (Mark Grant)
+About[sr@Latn]=Od Martina R. Džonsa (Martin R. Jones)\nMlazni ranac, animacija zrakova i vatre od Marka Granta (Mark Grant)
+About[sv]=Av Martin R. Jones\nJetpack, stråle och eldanimeringar av Mark Grant
+About[ta]=மாரà¯à®Ÿà¯€à®©à¯ ரா.ஜோனà¯à®¸à¯\nஜெட௠பகà¯, பீம௠மறà¯à®±à¯à®®à¯ நெரà¯à®ªà¯à®ªà¯ அசைவூடà¯à®Ÿà®®à¯ மாரà¯à®•à¯ கிரனà¯à®Ÿà¯
+About[tg]=Мартин Р.ҶонеÑ\nÐниматÑиÑҳо аз Марк Грант
+About[th]=โดย Martin R. Jones\nJet pack, beam à¹à¸¥à¸°à¸ªà¸£à¹‰à¸²à¸‡à¸à¸²à¸£à¸žà¹ˆà¸™à¹„ฟโดย Mark Grant
+About[tr]=Martin R. Jones\nMark Grant Jet pack, ışın ve ateş animasyonlarının sahibi.
+About[uk]=Ðвтор: Martin R. Jones\nСтрумінь, промені та Ð¾Ð¶Ð¸Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ð¾Ð³Ð½ÑŽ: Mark Grant
+About[ven]=Nga Martin R. Jones\nJet pack, beam na zwa zwipuka zwamulilo nga Mark Grant
+About[xh]=Ngu Martin R. Jones\nJet pack, umqadi nomlilo wophiliso ngu Mark Grant
+About[zh_CN]=作者:Martin R. Jones\nJet packã€å…‰æŸå’Œç«ç„°åŠ¨ç”»ä½œè€…为:Mark Grant
+Icon=../../preview/blob.png
+Base=Base
+Sequences=Blink,BounceLeft,BounceRight,Hair,Ears,Girl,ShuffleLeft,ShuffleRight,Glasses,RollLeft,RollRight,UpsideDown,FadeLeft,FadeRight,JetRight,JetLeft,Fire
+Focus=ZoomIn,DropIn,FadeIn,BeamDown
+Blur=ZoomOut,FadeOut,BeamUp
+Destroy=DropOut
+Sleep=Snooze
+Wake=Blink
+
+[Base]
+Sequence=blob.png
+Movement=0
+Delay=4000
+HotspotX=16
+HotspotY=28
+
+[ZoomIn]
+Sequence=blob_z3.png,blob_z2.png,blob_z1.png
+Movement=0,0,0
+Delay=100,100,100
+HotspotX=16,16,16
+HotspotY=28,28,28
+
+[ZoomOut]
+Sequence=blob_z1.png,blob_z2.png,blob_z3.png
+Movement=0,0,0
+Delay=100,100,100
+HotspotX=16,16,16
+HotspotY=28,28,28
+
+[DropIn]
+Sequence=blob_ex1.png,blob_ex1.png,blob_ex1.png,blob_ex1.png,blob_ex1.png
+Movement=0,0,0,0,0
+Delay=150,100,100,100,100
+HotspotX=16,16,16,16,16
+HotspotY=750,500,250,100,50
+
+[DropOut]
+Sequence=blob_ex1.png,blob_ex1.png,blob_ex1.png,blob_ex1.png,blob_ex1.png,blob_ex1.png,blob_ex1.png,blob_ex1.png
+Movement=0,0,0,0,0,0,0,0
+Delay=150,100,100,100,100,100,100,100
+HotspotX=16,16,16,16,16,16,16,16
+HotspotY=0,-25,-50,-100,-250,-500,-750,-1000
+
+[Snooze]
+Sequence=blob_sl4.png,blob_sl1.png,blob_sl2.png,blob_sl3.png
+Movement=0,0,0,0
+Delay=1000,500,500,500
+HotspotX=16,16,16,16
+HotspotY=28,28,28,28
+
+[Blink]
+Sequence=blob_b1.png,blob_b2.png,blob_b1.png
+Movement=0,0,0
+Delay=100,100,100
+HotspotX=16,16,16
+HotspotY=28,28,28
+
+[BounceLeft]
+Sequence=blob_b1.png,blob.png,blob.png,blob.png,blob_b1.png
+Movement=0,-8,-8,-8,-8
+Delay=100,100,100,100,100
+HotspotX=16,16,16,16,16
+HotspotY=28,36,38,36,28
+
+[BounceRight]
+Sequence=blob_b1.png,blob.png,blob.png,blob.png,blob_b1.png
+Movement=0,8,8,8,8
+Delay=100,100,100,100,100
+HotspotX=16,16,16,16,16
+HotspotY=28,36,38,36,28
+
+[Hair]
+Sequence=blob_h1.png,blob_h2.png,blob_h3.png,blob_h2.png,blob_h1.png
+Movement=0,0,0,0,0
+Delay=200,200,2000,200,200
+HotspotX=16,16,16,16,16
+HotspotY=28,28,28,28,28
+
+[Ears]
+Sequence=blob_e1.png
+Movement=0
+Delay=3000
+HotspotX=16
+HotspotY=28
+
+[Girl]
+Sequence=blob_g1.png,blob_g2.png,blob_g1.png
+Movement=0,0,0
+Delay=800,200,800
+HotspotX=16,16,16
+HotspotY=28,28,28
+
+[ShuffleLeft]
+Sequence=blob_s1.png,blob_s2.png,blob_s3.png,blob_s2.png,blob_s3.png,blob_s2.png,blob_s3.png,blob_s2.png,blob_s1.png
+Movement=0,-4,-4,-4,-4,-4,-4,-4,0
+Delay=200,200,200,200,200,200,200,200,200
+HotspotX=16,16,16,16,16,16,16,16,16
+HotspotY=29,32,32,32,32,32,32,32,29
+
+[ShuffleRight]
+Sequence=blob_s1.png,blob_s2.png,blob_s3.png,blob_s2.png,blob_s3.png,blob_s2.png,blob_s3.png,blob_s2.png,blob_s1.png
+Movement=0,4,4,4,4,4,4,4,0
+Delay=200,200,200,200,200,200,200,200,200
+HotspotX=16,16,16,16,16,16,16,16,16
+HotspotY=29,32,32,32,32,32,32,32,29
+
+[Glasses]
+Sequence=blob_gl1.png,blob_gl2.png,blob_gl3.png,blob_gl2.png,blob_gl1.png
+Movement=0,0,0,0,0
+Delay=150,150,3000,150,150
+HotspotX=16,16,16,16,16
+HotspotY=28,28,28,28,28
+
+[RollLeft]
+Sequence=blob_r315.png,blob_r270.png,blob_r225.png,blob_r180.png,blob_r135.png,blob_r90.png,blob_r45.png,blob.png
+Movement=-4,-4,-4,-4,-4,-4,-4,-4
+Delay=100,100,100,100,100,100,100,100
+HotspotX=16,16,16,16,16,16,16,16
+HotspotY=28,28,28,28,28,28,28,28
+
+[RollRight]
+Sequence=blob_r45.png,blob_r90.png,blob_r135.png,blob_r180.png,blob_r225.png,blob_r270.png,blob_r315.png,blob.png
+Movement=4,4,4,4,4,4,4,4
+Delay=100,100,100,100,100,100,100,100
+HotspotX=16,16,16,16,16,16,16,16
+HotspotY=28,28,28,28,28,28,28,28
+
+[UpsideDown]
+Sequence=blob_r45.png,blob_r90.png,blob_r135.png,blob_r180.png,blob_r225.png,blob_r270.png,blob_r315.png,blob.png
+Movement=0,0,0,0,0,0,0,0
+Delay=100,100,100,3000,100,100,100,100
+HotspotX=10,6,10,16,22,28,22,16
+HotspotY=26,18,10,6,10,18,26,28
+
+[FadeIn]
+Sequence=blob_f3.png,blob_f2.png,blob_f1.png
+Movement=0,0,0
+Delay=100,100,100
+HotspotX=16,16,16
+HotspotY=28,28,28
+
+[FadeOut]
+Sequence=blob_f1.png,blob_f2.png,blob_f3.png
+Movement=0,0,0
+Delay=100,100,100
+HotspotX=16,16,16
+HotspotY=28,28,28
+
+[FadeLeft]
+Sequence=blob_f1.png,blob_f2.png,blob_f3.png,blob.png,blob_f3.png,blob_f2.png,blob_f1.png
+Movement=0,0,0,-100,0,0,0
+Delay=100,100,100,500,100,100,100
+HotspotX=16,16,16,2000,16,16,16
+HotspotY=28,28,28,28,28,28,28
+
+[FadeRight]
+Sequence=blob_f1.png,blob_f2.png,blob_f3.png,blob.png,blob_f3.png,blob_f2.png,blob_f1.png
+Movement=0,0,0,100,0,0,0
+Delay=100,100,100,500,100,100,100
+HotspotX=16,16,16,2000,16,16,16
+HotspotY=28,28,28,28,28,28,28
+
+[Fire]
+Sequence=blob_fire2.png,blob_fire3.png,blob_fire4.png,blob_fire5.png,blob_fire6.png,blob_fire5.png,blob_fire6.png,blob_fire5.png,blob_fire6.png,blob_fire5.png,blob_fire6.png,blob_fire7.png,blob_fire8.png,blob_fire9.png,blob_fire10.png,blob_fire11.png
+Movement=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+Delay=600,400,300,200,200,200,200,200,200,200,200,200,200,200,200,3000
+HotspotX=16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+HotspotY=30,30,30,30,30,30,30,30,30,30,30,30,30,30,26,26
+
+[JetRight]
+Sequence=blob_r_turn1.png,blob_r_turn2.png,blob_r_turn3.png,blob_r_turn4.png,blob_jet1.png,blob_jet2.png,blob_jet3.png,blob_jet4.png,blob_jet3.png,blob_jet4.png,blob_jet3.png,blob_jet2.png,blob_r_turn4.png,blob_r_turn3.png,blob_r_turn2.png,blob_r_turn1.png
+Movement=0,0,0,0,0,8,16,20,20,20,16,16,8,0,0,0
+Delay=100,100,100,200,200,200,200,200,200,200,200,200,200,100,100,100,100
+HotspotX=16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+HotspotY=28,28,28,28,28,32,38,44,44,44,44,38,32,28,28,28,28
+
+[JetLeft]
+Sequence=blob_l_turn1.png,blob_l_turn2.png,blob_l_turn3.png,blob_l_turn4.png,blob_l_jet1.png,blob_l_jet2.png,blob_l_jet3.png,blob_l_jet4.png,blob_l_jet3.png,blob_l_jet4.png,blob_l_jet3.png,blob_l_jet2.png,blob_l_turn4.png,blob_l_turn3.png,blob_l_turn2.png,blob_l_turn1.png
+Movement=0,0,0,0,0,-8,-16,-20,-20,-20,-16,-16,-8,0,0,0
+Delay=100,100,100,200,200,200,200,200,200,200,200,200,200,100,100,100,100
+HotspotX=16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+HotspotY=28,28,28,28,28,32,38,44,44,44,44,38,32,28,28,28,28
+
+[BeamDown]
+Sequence=blob_BeamDown1.png,blob_BeamDown2.png,blob_BeamDown3.png,blob_BeamDown4.png,blob_BeamDown5.png,blob_BeamDown6.png,blob_BeamDown7.png,blob_BeamDown8.png,blob_BeamDown9.png
+Movement=0,0,0,0,0,0,0,0,0
+Delay=100,100,100,100,100,100,100,100,100
+HotspotX=16,16,16,16,16,16,16,16,16
+HotspotY=28,28,28,28,28,28,28,28,28
+
+[BeamUp]
+Sequence=blob_BeamUp1.png,blob_BeamUp2.png,blob_BeamUp3.png,blob_BeamUp4.png,blob_BeamUp5.png,blob_BeamUp6.png,blob_BeamUp7.png,blob_BeamUp8.png,blob_BeamUp9.png,blob_BeamUp10.png
+Movement=0,0,0,0,0,0,0,0,0,0
+Delay=100,100,100,100,100,100,100,100,100,100
+HotspotX=16,16,16,16,16,16,16,16,16,16
+HotspotY=28,28,28,28,28,28,28,28,28,28
+
diff --git a/amor/data/bonhommerc b/amor/data/bonhommerc
new file mode 100644
index 0000000..2ee5eda
--- /dev/null
+++ b/amor/data/bonhommerc
@@ -0,0 +1,193 @@
+# KDE Config File
+#
+# This guy seems to be waiting or is bored or something.
+# jead@iname.com
+#
+[Config]
+PixmapPath=pics/animated/bonhomme
+Description=Bonhomme
+Description[be]=ПлÑÑˆÑƒÑ‡Ñ‹Ñ Ñ‡Ð°Ð»Ð°Ð²ÐµÑ‡ÐºÑ–
+Description[bg]=Тао
+Description[bn]=বনমি
+Description[cs]=MužíÄek
+Description[et]=Kriipsu-Juku
+Description[hi]=बॉनहॉम
+Description[km]=មនុស្ស​ឆ្អឹង
+Description[lv]=KauluVÄ«rs
+Description[ne]=बोनà¥à¤¹à¥‹à¤®
+Description[pl]=Dobry człowiek
+Description[ru]=ДобрÑчок
+Description[sr]=КоÑтурко
+Description[sr@Latn]=Kosturko
+Description[ta]= பானà¯à®¸à®¾à®®à®¿
+Description[tg]=Бонхомме
+Description[th]=มนุษย์ลายเส้น
+Description[tr]=Yıldırım Adam
+Description[uk]=Іграшковий чоловічок
+Description[wa]=Boulome
+Description[zh_CN]=Bonhomme线æ¡äºº
+About=By Jean-Claude Dumas
+About[af]=Deur Jean-Claude Dumas
+About[ar]=من جان كلود دوماس
+About[az]=Jean-Claude Dumas tərəfindən
+About[be]=Ðўтар Jean-Claude Dumas
+About[bg]=Ðвтор Жан Клод Дюма
+About[bn]=তৈরি করেছেন জাà¦-কà§à¦² ডà§à¦®à¦¾à¦¸
+About[br]=Gant Jean-Claude Dumas
+About[bs]=Autor: Jean-Claude Dumas
+About[ca]=Per Jean-Claude Dumas
+About[cs]=Autor Jean-Claude Dumas
+About[cy]=Gan Jean-Claude Dumas
+About[da]=Af Jean-Claude Dumas
+About[de]=Von Jean-Claude Dumas
+About[el]=Από τον Jean-Claude Dumas
+About[eo]=De Jean-Claude Dumas
+About[es]=Por Jean-Claude Dumas
+About[et]=Autor: Jean-Claude Dumas
+About[eu]=Jean-Claude Dumasek Egina
+About[fa]=توسط جین کلود داموس
+About[fi]=Tehnyt Jean-Claude Dumas
+About[fo]=Av Jean-Claude Dumas
+About[fr]=Par Jean-Claude Dumas
+About[ga]=Le Jean-Claude Dumas
+About[gl]=Por Jean-Claude Dumas
+About[he]=מ×ת ×–'×ן-קלוד דומ×
+About[hi]=जीन-कà¥à¤²à¤¾à¤‰à¤¡ डूमा दà¥à¤µà¤¾à¤°à¤¾
+About[hr]=Autor: Jean-Claude Dumas
+About[hu]=Készítette: Jean-Claude Dumas
+About[is]=Eftir Jean-Claude Dumas
+About[it]=Di Jean-Claude Dumas
+About[km]=ដោយ Jean-Claude Dumas
+About[lt]=DarÄ— Jean-Claude Dumas
+About[lv]=Autors - Jean-Claude Dumas
+About[mk]=Од Жан Клод Дима
+About[mt]=Ta' Jean-Claude Dumas
+About[nb]=Av Jean-Claude Dumas
+About[nds]=Vun Jean-Claude Dumas
+About[ne]=जिन-कà¥à¤²à¤¾à¤‰à¤¡ डà¥à¤®à¤¾à¤¸à¤¦à¥à¤µà¤¾à¤°à¤¾
+About[nl]=Door Jean-Claude Dumas
+About[nn]=Av Jean-Claude Dumas
+About[pl]=Autorstwa Jean-Claude'a Dumasa
+About[pt]=De Jean-Claude Dumas
+About[pt_BR]=Por Jean-Claude Dumas
+About[ro]=De Jean-Claude Dumas
+About[ru]=Ðвтор - Jean-Claude Dumas
+About[sk]=Vytvoril Jean-Claude Dumas
+About[sl]=Od Jean-Claudea Dumasa
+About[sr]=Од Жана-Клода Диме (Jean-Claude Dumas)
+About[sr@Latn]=Od Žana-Kloda Dime (Jean-Claude Dumas)
+About[sv]=Av Jean-Claude Dumas
+About[tg]=Ҷан-Клауде ДумаÑ
+About[th]=โดย Jean-Claude Dumas
+About[tr]=Jean-Claude Dumas
+About[uk]=Ðвтор: Jean-Claude Dumas
+About[uz]=Jean-Klaude Dumas (Jean-Claude Dumas) yaratgan
+About[uz@cyrillic]=Жеан-Клауде Ð”ÑƒÐ¼Ð°Ñ (Jean-Claude Dumas) Ñратган
+About[ven]=Nga Jean-Claude Dumas
+About[wa]=Sicrît pa Jean-Claude Dumas
+About[xh]=Ngu Jean-Claude Dumas
+About[zh_CN]=作者:Jean-Claude Dumas
+Icon=../../preview/bonhomme.png
+Base=Base
+Sequences=WalkRight,WalkLeft,Pof,Drib,Col,ColRight,ColLeft,Hop,Sa,Hi
+Focus=Go,Col
+Blur=UnGo,Col
+Destroy=DropOut
+
+[Base]
+Sequence=b-f.png,b-f2.png,b-f.png,b-f2.png,b-f.png,b-f2.png,b-f.png,b-f1.png,b-f.png,b-f2.png,b-f.png,b-f2.png,b-f.png,b-f2.png
+Movement=0,0,0,0,0,0,0,0,0,0,0,0,0,0
+Delay=300,300,300,300,300,300,300,300,300,300,300,300,300,300
+HotspotX=16,16,16,16,16,16,16,16,16,16,16,16,16,16
+HotspotY=30,30,30,30,30,30,30,30,30,30,30,30,30,30
+
+[Go]
+Sequence=bgo7.png,bgo6.png,bgo5.png,bgo4.png,bgo3.png,bgo2.png,bgo1.png,b-f.png
+Movement=0,0,0,0,0,0,0,0
+Delay=200,200,200,200,200,200,200,200
+HotspotX=16,16,16,16,16,16,16,16
+HotspotY=30,30,30,30,30,30,30,30
+
+[UnGo]
+Sequence=b-f.png,bgo1.png,bgo2.png,bgo3.png,bgo4.png,bgo5.png,bgo6.png,bgo7.png,
+Movement=0,0,0,0,0,0,0,0
+Delay=150,150,150,150,150,150,150,150
+HotspotX=16,16,16,16,16,16,16,16
+HotspotY=30,30,30,30,30,30,30,30
+
+[Pof]
+Sequence=bpof1.png,bpof1.png,bpof1.png,bpof2.png,bpof3.png,bpof4.png,bpof5.png,bpof6.png,bpof6.png,bpof1.png,bpof1.png,bpof1.png,bpof2.png,bpof3.png,bpof4.png,bpof5.png,bpof6.png,bpof6.png
+Movement=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+Delay=200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200
+HotspotX=16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+HotspotY=30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30
+
+[Drib]
+Sequence=bdrib1.png,bdrib2.png,bdrib3.png,bdrib4.png,bdrib5.png,bdrib6.png,bdrib7.png,bdrib6.png,bdrib5.png,bdrib4.png,bdrib3.png,bdrib4.png,bdrib5.png,bdrib6.png,bdrib7.png,bdrib6.png,bdrib5.png,bdrib4.png,bdrib3.png,bdrib4.png,bdrib5.png,bdrib6.png,bdrib7.png,bdrib6.png,bdrib5.png,bdrib4.png,bdrib3.png,bdrib2.png,bdrib1
+Movement=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+Delay=300,300,100,100,100,100,50,100,100,100,100,100,100,100,100,50,100,100,100,100,100,100,100,100,50,100,100,300,300
+HotspotX=16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+HotspotY=30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30
+
+[WalkLeft]
+Sequence=b4-r.png,b3-r.png,b2-r.png,b1-r.png,b2-r.png,b3-r.png,b4-r.png,b3-r.png,b2-r.png,b1-r.png,b2-r.png,b3-r.png,b4-r.png,b3-r.png,b2-r.png,b1-r.png,b2-r.png,b3-r.png,b4-r.png
+Movement=-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4
+Delay=200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200
+HotspotX=16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+HotspotY=30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30
+
+[WalkRight]
+Sequence=b4.png,b3.png,b2.png,b1.png,b2.png,b3.png,b4.png,b3.png,b2.png,b1.png,b2.png,b3.png,b4.png,b3.png,b2.png,b1.png,b2.png,b3.png,b4.png
+Movement=4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4
+Delay=200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200
+HotspotX=16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+HotspotY=30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30
+
+[DropOut]
+Sequence=bdrop.png,bdrop.png,bdrop.png,bdrop.png,bdrop.png,bdrop.png,bdrop.png,bdrop.png
+Movement=0,0,0,0,0,0,0,0
+Delay=150,100,100,100,100,100,100,100
+HotspotX=16,16,16,16,16,16,16,16
+HotspotY=0,-25,-50,-100,-250,-500,-750,-1000
+
+[Col]
+Sequence=bcol1.png,bcol2.png,bcol1.png,bcol2.png,bcol1.png,bcol2.png,bcol1.png,bcol2.png,bcol1.png,bcol2.png,bcol1.png,bcol2.png,bcol1.png,bcol2.png,bcol1.png,bcol2.png
+Movement=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+Delay=50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50
+HotspotX=16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+HotspotY=30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30
+
+[ColLeft]
+Sequence=bcol1.png,bcol2.png,bcol1.png,bcol2.png,bcol1.png,bcol2.png,bcol1.png,bcol2.png,bcol1.png,bcol2.png,bcol1.png,bcol2.png,bcol1.png,bcol2.png,bcol1.png,bcol2.png
+Movement=0,0,0,0,0,0,0,0,-150,0,0,0,0,0,0,0
+Delay=50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50
+HotspotX=16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+HotspotY=30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30
+
+[ColRight]
+Sequence=bcol1.png,bcol2.png,bcol1.png,bcol2.png,bcol1.png,bcol2.png,bcol1.png,bcol2.png,bcol1.png,bcol2.png,bcol1.png,bcol2.png,bcol1.png,bcol2.png,bcol1.png,bcol2.png
+Movement=0,0,0,0,0,0,0,0,-150,0,0,0,0,0,0,0
+Delay=50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50
+HotspotX=16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+HotspotY=30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30
+
+[Hop]
+Sequence=b-f.png,bh1.png,bdrop.png,bh1.png,b-f.png,bh1.png,bdrop.png,bh1.png,b-f.png,bh1.png,bdrop.png,bh1.png
+Movement=0,0,0,0,0,0,0,0,0,0,0,0
+Delay=150,150,150,150,150,150,150,150,150,150,150,150
+HotspotX=16,16,16,16,16,16,16,16,16,16,16,16
+HotspotY=30,40,60,40,30,40,60,40,30,40,60,40
+
+[Sa]
+Sequence=sa1.png,sa2.png,sa2a.png,sa2b.png,sa2c.png,sa2a.png,sa2b.png,sa2c.png,sa2a.png,sa2b.png,sa2c.png,sa2.png,sa1.png
+Movement=0,0,0,0,0,0,0,0,0,0,0,0,0
+Delay=300,300,200,200,200,200,200,200,200,200,200,300,300
+HotspotX=16,16,16,16,16,16,16,16,16,16,16,16,16
+HotspotY=30,30,30,30,30,30,30,30,30,30,30,30,30
+
+[Hi]
+Sequence=salut.png,salut1.png
+Movement=0,0
+Delay=4000,300
+HotspotX=16,16
+HotspotY=30,30
diff --git a/amor/data/bsdrc b/amor/data/bsdrc
new file mode 100644
index 0000000..8b88bbc
--- /dev/null
+++ b/amor/data/bsdrc
@@ -0,0 +1,128 @@
+# KDE Config File
+[Config]
+PixmapPath=pics/static
+Static=true
+Description=FreeBSD Mascot
+Description[af]=Freebsd Gelukbringer
+Description[az]=FreeBSD Gəlinciyi
+Description[be]=Сімвал FreeBSD
+Description[bg]=ТалиÑман на FreeBSD
+Description[bn]=FreeBSD মাসà§à¦•à¦Ÿ
+Description[bs]=FreeBSD maskota
+Description[ca]=Mascota de FreeBSD
+Description[cs]=Maskot FreeBSD
+Description[cy]=Masgot FreeBSD
+Description[da]=FreeBSD-maskot
+Description[de]=FreeBSD-Maskottchen
+Description[el]=Η μασκότ του FreeBSD
+Description[eo]=Simbolbesto de FreeBSD
+Description[es]=Mascota de FreeBSD
+Description[et]=FreeBSD maskott
+Description[eu]=FreeBSD Maskota
+Description[fa]=مایۀ خوش‌شانسی FreeBSD
+Description[fi]=FreeBSD-maskotti
+Description[fr]=Mascotte de FreeBSD
+Description[ga]=Sonóg FreeBSD
+Description[gl]=A mascota de FreeBSD
+Description[he]=הקמיע של BSD
+Description[hi]=फà¥à¤°à¥€-बीà¤à¤¸à¤¡à¥€ शà¥à¤­à¤‚कर
+Description[hr]=FreeBSD maskota
+Description[hu]=FreeBSD kabala
+Description[is]=BSD lukkudýrið
+Description[it]=Mascotte di FreeeBSD
+Description[ja]=FreeBSD マスコット
+Description[km]=សុភមង្គល​វážáŸ’ážáž» FreeBSD
+Description[ko]=FreeBSD 마스코트
+Description[lt]=FreeBSD talismanas
+Description[lv]=FreeBSD talismans
+Description[mk]=МаÑкотата на FreeBSD
+Description[ms]= Maskot FreeBSD
+Description[nb]=FreeBSD-maskott
+Description[nds]=FreeBSD-Maskottje
+Description[ne]=सà¥à¤µà¤¤à¤¨à¥à¤¤à¥à¤° बीà¤à¤¸à¤¡à¥€ मासकोट
+Description[nl]=FreeBSD-mascotte
+Description[nn]=FreeBSD-maskot
+Description[pl]=Maskotka FreeBSD
+Description[pt]=Mascote do FreeBSD
+Description[pt_BR]=Mascote do FreeBSD
+Description[ro]=Mascota FreeBSD
+Description[ru]=Чёртик FreeBSD
+Description[sk]=Maskot FreeBSD
+Description[sl]=Maskota FreeBSD
+Description[sr]=МаÑкота FreeBSD-а
+Description[sr@Latn]=Maskota FreeBSD-a
+Description[sv]=FreeBSD-maskot
+Description[ta]= இலவசம௠BSD Mascot
+Description[tg]=Ðджари FreeBSD
+Description[th]=สัà¸à¸¥à¸±à¸à¸©à¸“์ของ FreeBSD
+Description[tr]=FreeBSD Maskotu
+Description[uk]=ТаліÑман FreeBSD
+Description[uz]=FreeBSD tumori
+Description[uz@cyrillic]=FreeBSD тумори
+Description[ven]=Mascot ya BSD dza mahala
+Description[wa]=Mascote FreeBSD
+Description[zh_CN]=FreeBSD å‰ç¥¥ç‰©
+About=Static window sitter
+About[af]=Statiese venster sitter
+About[ar]=قاعد النواÙØ° الساكنة
+About[az]=Statik pəncərə mürəbbiyəsi
+About[be]=Статычны наглÑдчык вокнаў
+About[bg]=Ðеанимирано дÑволче
+About[bn]=উইনà§à¦¡à§‹à¦° à¦à¦• সà§à¦¥à¦¾à¦¨à§‡ সà§à¦¥à¦¿à¦° হয়ে বসে থাকে
+About[bs]=StatiÄki window sitter
+About[ca]=Model estàtic de finestra
+About[cs]=Statická ozdoba okna
+About[cy]=Gwarchodydd ffenest sefydlog
+About[da]=Statisk vinduessitter
+About[de]=Statischer Fenstersitzer
+About[el]=Στατικό εικονίδιο
+About[eo]=MoviÄema fenestrosidulo
+About[es]=Cuidador estático de ventanas
+About[et]=Liikumatu aknahoidja
+About[eu]=Lehio modelo egonkorra
+About[fa]=مدل پنجرۀ ایستا
+About[fi]=Staattinen ikkunallaistuja
+About[fr]=Surveillant statique de fenêtres
+About[ga]=Peata statach fuinneoige
+About[gl]=Vixiante estático de fiestras
+About[he]=שומר חלון סטטי
+About[hi]=सà¥à¤¥à¤¿à¤° विंडो सिटर
+About[hr]=StatiÄki sjedaÄ na prozoru
+About[hu]=Nem animált ablakdíszítés
+About[is]=Situr og passar glugga
+About[it]=Immagine statica
+About[ja]=å‹•ã‹ãªã„ウィンドウ監視人
+About[km]=អ្នក​ážáŸ‚ទាំ​បង្អួចឋិážáž·ážœáž“្áž
+About[lt]=Nejudantis sÄ—dÄ—tojas ant lango
+About[lv]=Statisks uz loga sÄ“dÄ“tÄjs
+About[mk]=Статичен Ñедач врз прозорци
+About[mt]=Stampa statika
+About[nb]=Statisk vindusitter
+About[nds]=Fast Finstersitter
+About[ne]=सà¥à¤¥à¤¿à¤° सञà¥à¤à¥à¤¯à¤¾à¤² सिटर
+About[nl]=Statische vensterzitter
+About[nn]=Statisk vindaugssitjar
+About[pl]=Stale w tym samym miejscu
+About[pt]=Elemento estático pousado sobre as janelas
+About[pt_BR]=Janela Estática
+About[ro]=Imagine statică
+About[ru]=Статичный Ñторож окон
+About[sk]=Statická ozdoba okna
+About[sl]=StatiÄno okno
+About[sr]=Статични Ñедач на прозору
+About[sr@Latn]=StatiÄni sedaÄ na prozoru
+About[sv]=Statisk fönstervakt
+About[ta]= நிலையான சாளரம௠அமரà¯à®¤à®²à¯
+About[tg]=Ðигаҳбонии Ñтатикии тиреза
+About[th]=นั่งเล่นบนหน้าต่าง
+About[tr]=Statik pencere bakıcı
+About[uk]=Статична прикраÑа Ð´Ð»Ñ Ð²Ñ–ÐºÐ½Ð°
+About[ven]=Tshidzuli tsha window yo imaho
+About[zh_CN]=窗å£é™å者
+Icon=../preview/bsd.png
+
+[Base]
+Sequence=bsd.png
+HotspotX=25
+HotspotY=54
+
diff --git a/amor/data/eyesrc b/amor/data/eyesrc
new file mode 100644
index 0000000..7adc974
--- /dev/null
+++ b/amor/data/eyesrc
@@ -0,0 +1,232 @@
+# KDE Config File
+#
+# This by jead@iname.com. Do whatever you want with it. C'est ca qui est ca. :)
+[Config]
+PixmapPath=pics/animated/eyes
+Description=Crazy Eyes
+Description[af]=Mal Oë
+Description[ar]=عيون مجنونة
+Description[be]=Вочы
+Description[bg]=Луди очички
+Description[bn]=পাগলা চোখ
+Description[br]=Daoulagad foll
+Description[bs]=Lude oÄi
+Description[ca]=Ulls bojos
+Description[cs]=VoÄi šílený
+Description[cy]=Llygaid Gwirion
+Description[de]=Verrückte Augen
+Description[el]=ΤÏελά μάτια
+Description[eo]=Frenezaj okuloj
+Description[es]=Ojos locos
+Description[et]=Hullud silmad
+Description[eu]=Begi Zoroak
+Description[fa]=چشمهای احمق
+Description[fi]=Hullut silmät
+Description[fr]=Yeux fous
+Description[ga]=Súile Craiceáilte
+Description[gl]=Ollos Tolos
+Description[he]=×¢×™× ×™×™× ×ž×•×˜×¨×¤×•×ª
+Description[hi]=नटखट नयन
+Description[hr]=Divlje oÄi
+Description[hu]=Izzó szemek
+Description[is]=Geðveik augu (Crazy Eyes)
+Description[it]=Occhi pazzi
+Description[ja]=クレイジーアイ
+Description[km]=ភ្នែក​ឆ្កួážáŸ—
+Description[ko]=미친 눈
+Description[lt]=Beprotiškos akys
+Description[lv]=TrakÄs acis
+Description[mk]=Забегани очи
+Description[nb]=Ville øyne
+Description[nds]=Mall Ogen
+Description[ne]=à¤à¤•à¥‹à¤¹à¥‹à¤°à¤¾ आà¤à¤–ा
+Description[nl]=Gekke ogen
+Description[nn]=Ville auge
+Description[pa]=ਭੈੜੀਆਂ ਅੱਖਾਂ
+Description[pl]=Szalone oczy
+Description[pt]=Olhos Loucos
+Description[pt_BR]=Olhos Malucos
+Description[ro]=OchiÅŸori nebunatici
+Description[ru]=Безумные глаза
+Description[sk]=Å ialené oÄi
+Description[sl]=Nore oÄi
+Description[sr]=БлеÑаве очи
+Description[sr@Latn]=Blesave oÄi
+Description[sv]=Galna ögon
+Description[ta]= நகைசà¯à®šà¯à®µà¯ˆ கணà¯à®•à®³à¯
+Description[tg]=Ðигоҳҳои Ҷиннибашара
+Description[th]=ดวงตาà¹à¸ªà¸™à¹‚ง่
+Description[tr]=Çılgın Gözler
+Description[uk]=Шалені очі
+Description[uz]=Jinninamo koʻzlar
+Description[uz@cyrillic]=Жиннинамо кўзлар
+Description[ven]=Mato a tshipengo
+Description[zh_CN]=疯狂åŒçœ¼
+Description[zh_TW]=瘋狂的眼ç›
+About=By Jean-Claude Dumas
+About[af]=Deur Jean-Claude Dumas
+About[ar]=من جان كلود دوماس
+About[az]=Jean-Claude Dumas tərəfindən
+About[be]=Ðўтар Jean-Claude Dumas
+About[bg]=Ðвтор Жан Клод Дюма
+About[bn]=তৈরি করেছেন জাà¦-কà§à¦² ডà§à¦®à¦¾à¦¸
+About[br]=Gant Jean-Claude Dumas
+About[bs]=Autor: Jean-Claude Dumas
+About[ca]=Per Jean-Claude Dumas
+About[cs]=Autor Jean-Claude Dumas
+About[cy]=Gan Jean-Claude Dumas
+About[da]=Af Jean-Claude Dumas
+About[de]=Von Jean-Claude Dumas
+About[el]=Από τον Jean-Claude Dumas
+About[eo]=De Jean-Claude Dumas
+About[es]=Por Jean-Claude Dumas
+About[et]=Autor: Jean-Claude Dumas
+About[eu]=Jean-Claude Dumasek Egina
+About[fa]=توسط جین کلود داموس
+About[fi]=Tehnyt Jean-Claude Dumas
+About[fo]=Av Jean-Claude Dumas
+About[fr]=Par Jean-Claude Dumas
+About[ga]=Le Jean-Claude Dumas
+About[gl]=Por Jean-Claude Dumas
+About[he]=מ×ת ×–'×ן-קלוד דומ×
+About[hi]=जीन-कà¥à¤²à¤¾à¤‰à¤¡ डूमा दà¥à¤µà¤¾à¤°à¤¾
+About[hr]=Autor: Jean-Claude Dumas
+About[hu]=Készítette: Jean-Claude Dumas
+About[is]=Eftir Jean-Claude Dumas
+About[it]=Di Jean-Claude Dumas
+About[km]=ដោយ Jean-Claude Dumas
+About[lt]=DarÄ— Jean-Claude Dumas
+About[lv]=Autors - Jean-Claude Dumas
+About[mk]=Од Жан Клод Дима
+About[mt]=Ta' Jean-Claude Dumas
+About[nb]=Av Jean-Claude Dumas
+About[nds]=Vun Jean-Claude Dumas
+About[ne]=जिन-कà¥à¤²à¤¾à¤‰à¤¡ डà¥à¤®à¤¾à¤¸à¤¦à¥à¤µà¤¾à¤°à¤¾
+About[nl]=Door Jean-Claude Dumas
+About[nn]=Av Jean-Claude Dumas
+About[pl]=Autorstwa Jean-Claude'a Dumasa
+About[pt]=De Jean-Claude Dumas
+About[pt_BR]=Por Jean-Claude Dumas
+About[ro]=De Jean-Claude Dumas
+About[ru]=Ðвтор - Jean-Claude Dumas
+About[sk]=Vytvoril Jean-Claude Dumas
+About[sl]=Od Jean-Claudea Dumasa
+About[sr]=Од Жана-Клода Диме (Jean-Claude Dumas)
+About[sr@Latn]=Od Žana-Kloda Dime (Jean-Claude Dumas)
+About[sv]=Av Jean-Claude Dumas
+About[tg]=Ҷан-Клауде ДумаÑ
+About[th]=โดย Jean-Claude Dumas
+About[tr]=Jean-Claude Dumas
+About[uk]=Ðвтор: Jean-Claude Dumas
+About[uz]=Jean-Klaude Dumas (Jean-Claude Dumas) yaratgan
+About[uz@cyrillic]=Жеан-Клауде Ð”ÑƒÐ¼Ð°Ñ (Jean-Claude Dumas) Ñратган
+About[ven]=Nga Jean-Claude Dumas
+About[wa]=Sicrît pa Jean-Claude Dumas
+About[xh]=Ngu Jean-Claude Dumas
+About[zh_CN]=作者:Jean-Claude Dumas
+Icon=../../preview/eyes.png
+Sequences=Base,GlideLeft,GlideRight,EyesLeft,EyesRight,Blink,Sourcils,Hyp
+Focus=Rotr,UnMelt
+Blur=Rotl,Melt
+Destroy=Flyaway
+Sleep=Sleep
+Wake=Blink
+
+[Base]
+Sequence=eye_2.png,eye_1.png
+Movement=0,0
+Delay=300,5000
+HotspotX=16,16
+HotspotY=30,30
+
+[Blink]
+Sequence=eye_b.png,eye_1.png
+Movement=0,0
+Delay=300,3000
+HotspotX=16,16
+HotspotY=30,30
+
+[Sleep]
+Sequence=eye_2.png
+Movement=0
+Delay=200
+HotspotX=16
+HotspotY=30
+
+[Sourcils]
+Sequence=eye_1.png,eye_s1.png,eye_s2.png,eye_s3.png,eye_s4.png,eye_s3.png,eye_s4.png,eye_s3.png,eye_s2.png,eye_s1.png
+Movement=0,0,0,0,0,0,0,0,0,0
+Delay=200,200,200,200,200,200,200,200,200,200
+HotspotX=16,16,16,16,16,16,16,16,16,16
+HotspotY=30,30,30,30,30,30,30,30,30,30
+
+[Hyp]
+Sequence=eye_1.png,eye_h1.png,eye_h2.png,eye_h3.png,eye_h4.png,eye_h3.png,eye_h4.png,eye_h3.png,eye_h4.png,eye_h3.png,eye_h2.png,eye_h1.png,eye_1.png
+Movement=0,0,0,0,0,0,0,0,0,0,0,0,0
+Delay=200,200,200,200,100,100,100,100,100,200,200,200,200
+HotspotX=16,16,16,16,16,16,16,16,16,16,16,16,16
+HotspotY=30,30,30,30,30,30,30,30,30,30,30,30,30
+
+[Rotr]
+Sequence=eye_z1.png,eye_z2.png,eye_z3.png,eye_z4.png,eye_z5.png,eye_2.png
+Movement=0,0,0,0,0,0
+Delay=100,100,100,100,100,100
+HotspotX=16,16,16,16,16,16
+HotspotY=30,30,30,30,30,30
+
+[Rotl]
+Sequence=eye_1.png,eye_z5.png,eye_z4.png,eye_z3.png,eye_z2.png,eye_z1.png
+Movement=0,0,0,0,0,0
+Delay=100,100,100,100,100,100
+HotspotX=16,16,16,16,16,16
+HotspotY=30,30,30,30,30,30
+
+[Melt]
+Sequence=eye_m1.png,eye_m2.png,eye_m3.png,eye_m4.png,eye_m5.png,eye_m6.png,eye_m7.png
+Movement=0,0,0,0,0,0,0
+Delay=100,100,100,100,100,100,100
+HotspotX=16,16,16,16,16,16,16
+HotspotY=30,30,30,30,30,30,30
+
+[UnMelt]
+Sequence=eye_m7.png,eye_m6.png,eye_m5.png,eye_m4.png,eye_m3.png,eye_m2.png,eye_m1.png
+Movement=0,0,0,0,0,0,0
+Delay=100,100,100,100,100,100,100
+HotspotX=16,16,16,16,16,16,16
+HotspotY=30,30,30,30,30,30,30
+
+[EyesRight]
+Sequence=eye_1.png,eye_d.png,eye_d.png,eye_e.png,eye_e.png,eye_e.png,eye_e.png,eye_e.png,eye_u.png,eye_u.png,eye_1.png
+Movement=0,0,0,0,12,12,12,12,0,0,0
+Delay=100,100,100,300,100,100,100,300,100,100,100
+HotspotX=16,16,16,16,16,16,16,16,16,16,16
+HotspotY=25,17,9,3,3,3,3,3,9,17,25
+
+[EyesLeft]
+Sequence=eye_1.png,eye_d.png,eye_d.png,eye_l.png,eye_l.png,eye_l.png,eye_l.png,eye_l.png,eye_u.png,eye_u.png,eye_1.png
+Movement=0,0,0,0,-12,-12,-12,-12,0,0,0
+Delay=100,100,100,300,100,100,100,300,100,100,100
+HotspotX=16,16,16,16,16,16,16,16,16,16,16
+HotspotY=25,17,9,3,3,3,3,3,9,17,25
+
+[GlideLeft]
+Sequence=eye_1.png,eye_1.png,eye_1.png,eye_1.png,eye_1.png,eye_1.png,eye_1.png,eye_1.png,eye_1.png,eye_1.png,eye_1.png,eye_1.png
+Movement=-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4
+Delay=300,300,300,300,300,300,300,300,300,300,300,300
+HotspotX=16,16,16,16,16,16,16,16,16,16,16,16
+HotspotY=30,31,30,31,30,31,30,31,30,31,30,31
+
+[GlideRight]
+Sequence=eye_1.png,eye_1.png,eye_1.png,eye_1.png,eye_1.png,eye_1.png,eye_1.png,eye_1.png,eye_1.png,eye_1.png,eye_1.png,eye_1.png
+Movement=4,4,4,4,4,4,4,4,4,4,4,4
+Delay=300,300,300,300,300,300,300,300,300,300,300,300
+HotspotX=16,16,16,16,16,16,16,16,16,16,16,16
+HotspotY=31,30,31,30,31,30,31,30,31,30,31,30
+
+[Flyaway]
+Sequence=eye_m1.png,eye_m2.png,eye_m3.png,eye_m4.png,eye_m5.png,eye_m6.png,eye_m.png7,eye_m7.png
+Movement=0,0,0,0,0,0,0,0
+Delay=150,100,100,100,100,100,100,100
+HotspotX=16,16,16,16,16,16,16,16
+HotspotY=0,25,50,100,250,500,750,1000
+
diff --git a/amor/data/ghostrc b/amor/data/ghostrc
new file mode 100644
index 0000000..35c1529
--- /dev/null
+++ b/amor/data/ghostrc
@@ -0,0 +1,183 @@
+# KDE Config File
+[Config]
+PixmapPath=pics/animated/ghost
+Description=Spooky Ghost
+Description[af]=Onheilspellende Spook
+Description[be]=Страшны прывід
+Description[bg]=Призрачен Дух
+Description[bn]=ভূতà§à§œà§‡ ভূত
+Description[br]=Tasmant
+Description[bs]=Strašni duh
+Description[ca]=Fantasma misteriós
+Description[cs]=Strašidelný duch
+Description[cy]=Bwgan Arwsydus
+Description[de]=Kleines Gespenst
+Description[el]=Στοιχειωμένο φάντασμα
+Description[eo]=Hantema spirito
+Description[es]=Fantasma misterioso
+Description[et]=Jube tont
+Description[eu]=Mamu Izugarria
+Description[fa]=روح شبح‌وار
+Description[fi]=Pelottava aave
+Description[fr]=Fantôme
+Description[ga]=Taibhse
+Description[gl]=Horripilante Pantasma
+Description[he]=רוח רפ××™×
+Description[hi]=ननà¥à¤¹à¤¾ पà¥à¤°à¥‡à¤¤
+Description[hr]=Jezivi duh
+Description[hu]=Kísértet
+Description[is]=Voðaleg vofa
+Description[it]=Fantasma spettrale
+Description[ja]=ゆã†ã‚Œã„
+Description[km]=ážáŸ’មោច​ដែល​គួរ​ឲ្យ​ព្រឺ​ក្បាល
+Description[ko]=귀신
+Description[lt]=Kraupus vaiduoklis
+Description[lv]=Spokainais spoks
+Description[mk]=Откачен дух
+Description[nb]=Skummelt spøkelse
+Description[nds]=Lütt Spöker
+Description[ne]=सà¥à¤ªà¥‹à¤•à¥€ घोसà¥à¤Ÿ
+Description[nl]=Het spookje
+Description[nn]=Skremmande skrømt
+Description[pl]=Duszek
+Description[pt]=Fantasma Assustador
+Description[pt_BR]=Ghost
+Description[ro]=Fantomă înfiorătoare
+Description[ru]=Призрак
+Description[sk]=Strašidelný duch
+Description[sl]=Strašljivi duh
+Description[sr]=СаблаÑни дух
+Description[sr@Latn]=Sablasni duh
+Description[sv]=Skrämmande spöke
+Description[ta]= பயமà¯à®±à¯à®¤à¯à®¤à¯à®®à¯ பேயà¯
+Description[tg]=Хаёлот
+Description[th]=ผีน้อยสปุ๊คà¸à¸µà¹‰
+Description[tr]=Åžirin Hayalet
+Description[uk]=Ðевловимий привид
+Description[uz]=Arvoh Spuki
+Description[uz@cyrillic]=Ðрвоҳ Спуки
+Description[ven]=Tshipuku
+Description[zh_CN]=è’™é¢å¹½çµ
+About=By Martin R. Jones\nBased on an icon by the KDE artist team.
+About[af]=Deur Martin R. Jones\nBased op 'n ikoon Deur die Kde kunstenaar span.
+About[ar]=من مارتن ر. جونز\nمبنية على أيقونة من Ùريق رسامي KDE
+About[az]=Martin R. Jones tərəfindən\nBased on an icon by the KDE artist team.
+About[be]=Ðўтар Martin R. Jones\nЗроблена на базе значак ад каманды художнікаў KDE.
+About[bg]=Ðвтор Мартин Р. ДжоунÑ\nБазирано на икона от KDE
+About[bn]=তৈরি করেছেন মারà§à¦Ÿà¦¿à¦¨ আর. জোনà§à¦¸\nকে.ডি.ই. শিলà§à¦ªà§€ দলের বানানো à¦à¦•à¦Ÿà¦¿ আইকনের ওপর ভিতà§à¦¤à¦¿ করে।
+About[br]=Gant Martin R. Jones\nDiazezet war un arlun skipail arzour KDE.
+About[bs]=Autor Martin R. Jones\nBazirano na ikoni koju je napravio KDE tim umjetnika.
+About[ca]=Per Martin R. Jones\nBasat en una icona del equip artístic de KDE.
+About[cs]=Autor Martin R. Jones\nNa základě ikony z KDE
+About[cy]=Gan Martin R. Jones\nSeiliedig ar eicon gan y tîm arlunio KDE.
+About[da]=Af Martin R. Jones\nBaseret på en ikon af KDE's kunstnerhold.
+About[de]=Von Martin R. Jones\nNach einem Symbol des KDE-Artist-Teams
+About[el]=Από τον Martin R. Jones\n Βασισμένο σε ένα εικονίδιο της καλλιτεχνικής ομάδας του KDE.
+About[eo]=De Martin R. Jones\nbazita sur piktogramo de la KDE-artistaro.
+About[es]=Por Martin R. Jones\nBasado en un ícono proveniente del equipo de artistas de KDE.
+About[et]=Autor: Martin R. Jones\nAluseks KDE kunstnike loodud ikoon.
+About[eu]=Martin R. Jonesek Eginak\nKDE artista taldeak egindako ikono batetan oinarritua.
+About[fa]=توسط مارتین آر.جونز \nبر اساس یک شمایل توسط تیم هنرمندان KDE
+About[fi]=Tehnyt Martin R. Jones\nPerustuu KDE-taiteilijaryhmän kuvakkeeseen.
+About[fr]=Par Martin R. Jones\nBasé sur une icône de l'équipe artistique de KDE.
+About[ga]=Le Martin R. Jones\nBunaithe ar dheilbhín ó fhoireann ealaíontóirí KDE.
+About[gl]=Por Martin R. Jones\nBaseado nun ícone do equipo artístico de KDE.
+About[he]=מ×ת מרטין ר. ×’'ונס\nמבוסס על סמל מ×ת צוות ×”××ž× ×™× ×©×œ KDE.
+About[hi]=मारà¥à¤Ÿà¤¿à¤¨ आर. जोनà¥à¤¸ दà¥à¤µà¤¾à¤°à¤¾\nकेडीई कलाकारों की टोली दà¥à¤µà¤¾à¤°à¤¾ बनाठà¤à¤• पà¥à¤°à¤¤à¥€à¤• के आधार पर
+About[hr]=Autor: Martin R. Jones\nZasnovano na ikoni KDE tima.
+About[hu]=Készítette: Martin R. Jones\nA KDE grafikus csapatának egy ikonján alapul.
+About[is]=By Martin R. Jones\nByggt á táknmynd eftir KDE listamannahópinn
+About[it]=Di Martin R. Jones.\nBasato su un'icona della squadra di artisti di KDE.
+About[ja]=By Martin R. Jones\nアイコン by KDE アーティストãƒãƒ¼ãƒ 
+About[km]=ដោយ Martin R. Jones\nផ្អែកលើ​រូបážáŸ†ážŽáž¶áž„​រចនាដោយ​ក្រុម​វិចិážáŸ’រករ KDE ។
+About[lt]=Darė Martin R. Jones\nPagal KDE menininkų komandos piktogramą.
+About[lv]=Autors - Martin R. Jones\nBÄzÄ“ts uz KDE ikonas.
+About[mk]=Од Мартин Р. ÐонÑ\nБазирано врз икона од уметничкиот тим на KDE.
+About[mt]=Ta' Martin R. Jones\nIbbażat fuq ġabra ta' ikoni tal-grupp ta' artisti KDE.
+About[nb]=Av Martin R. Jones\nBasert på et ikon fra kunstnerlaget til KDE.
+About[nds]=Vun Martin R. Jones\nBuut op'n Lüttbild vun den KDE-Krink.
+About[ne]= मारà¥à¤Ÿà¤¿à¤¨ आर.जोनà¥à¤¸à¤¦à¥à¤µà¤¾à¤°à¤¾\n केडीई कलाकार समूहदà¥à¤µà¤¾à¤°à¤¾ à¤à¤‰à¤Ÿà¤¾ पà¥à¤°à¤¤à¤¿à¤®à¤¾à¤®à¤¾ आधारित
+About[nl]=Door Martin R. Jones\nGebaseerd op een pictogram van het KDE Artist Team.
+About[nn]=Av Martin R. Jones\nBasert på eit ikon frå kunstnarlaget til KDE.
+About[pl]=Autorstwa Martina R. Jonesa\nNa podstawie ikony zespołu artystów KDE.
+About[pt]=De Martin R. Jones\nBaseado num ícone da equipa artística do KDE.
+About[pt_BR]=Por Martin R. Jones\nBaseado no ícone feito pelo time de designers do KDE.
+About[ro]=De Martin R. Jones\nBazat pe o iconiţă a echipei artiştilor KDE.
+About[ru]=Ðвтор - Martin R. Jones\nÐа оÑнове пиктограммы команды художников KDE.
+About[sk]=Vytvoril Martin R. Jones\nZaložené na ikone od KDE artist tímu.
+About[sl]=Od Martina R. Jonesa\nTemelji na ikoni ekipe umetnikov KDE.
+About[sr]=Од Мартина Р. ÐонÑа (Martin R. Jones)\nЗаÑновано на иконици коју је направио уметнички тим KDE-а.
+About[sr@Latn]=Od Martina R. Džonsa (Martin R. Jones)\nZasnovano na ikonici koju je napravio umetniÄki tim KDE-a.
+About[sv]=Av Martin R. Jones\nBaserad på en ikon av KDE:s artistgrupp
+About[ta]= மாரà¯à®Ÿà¯€à®©à¯ ரா.ஜோனà¯à®¸à¯ \nKDE கலைஞர௠கà¯à®´à¯ சினà¯à®©à®¤à¯à®¤à®¿à®±à¯à®•à¯ à®à®±à¯à®±à®µà®¾à®±à¯.
+About[tg]=Мартин Р.ҶонеÑ\nТаÑвирҳо аз командаи бадеи KDE.
+About[th]=โดย Martin R. Jones\nโดยใช้พื้นà¸à¸²à¸™à¸ˆà¸²à¸à¹„อคอนของà¸à¸¥à¸¸à¹ˆà¸¡à¸¨à¸´à¸¥à¸›à¸´à¸™ KDE
+About[tr]=Martin R. Jones\nKDE sanatçı ekibinin bir simgesine dayanır.
+About[uk]=Ðвтор: Martin R. Jones\nЗроблено з піктограми від команди миÑтецтв KDE.
+About[uz]=Martin R. Jouns (Martin R. Jones) yaratgan\nKDE tasvirchilar jamoasi yaratgan nishonchada asoslangan.
+About[uz@cyrillic]=Мартин Р. Ð–Ð¾ÑƒÐ½Ñ (Martin R. Jones) Ñратган\nKDE таÑвирчилар жамоаÑи Ñратган нишончада аÑоÑланган.
+About[ven]=Nga Martin R. Jones\nZwo di sendeka nga aikhonu nga tshigwada tsha vhamvumvusi vha KDE.
+About[xh]= Martin R. Jones\nYamelene kwiqhosa leqela labazobi be KDE.
+About[zh_CN]=作者:Martin R. Jones\n基于 KDE 艺术组制作的一个图标。
+Icon=../../preview/ghost.png
+Sequences=Base,GlideLeft,GlideRight,EyesLeft,EyesRight
+Focus=ZoomIn
+Blur=ZoomOut,Melt
+Destroy=ZoomOut
+
+[Base]
+Sequence=ghost_1.png,ghost_2.png,ghost_1.png,ghost_2.png,ghost_1.png,ghost_2.png,ghost_1.png,ghost_2.png,ghost_1.png,ghost_2.png
+Movement=0,0,0,0,0,0,0,0,0,0
+Delay=300,300,300,300,300,300,300,300,300,300
+HotspotX=16,16,16,16,16,16,16,16,16,16
+HotspotY=30,30,30,30,30,30,30,30,30,30
+
+[ZoomIn]
+Sequence=ghost_z1.png,ghost_z2.png,ghost_z3.png,ghost_z4.png,ghost_z5.png,ghost_2.png
+Movement=0,0,0,0,0,0
+Delay=100,100,100,100,100,100
+HotspotX=16,16,16,16,16,16
+HotspotY=30,30,30,30,30,30
+
+[ZoomOut]
+Sequence=ghost_1.png,ghost_z5.png,ghost_z4.png,ghost_z3.png,ghost_z2.png,ghost_z1.png
+Movement=0,0,0,0,0,0
+Delay=100,100,100,100,100,100
+HotspotX=16,16,16,16,16,16
+HotspotY=30,30,30,30,30,30
+
+[Melt]
+Sequence=ghost_m1.png,ghost_m2.png,ghost_m3.png,ghost_m4.png,ghost_m5.png,ghost_m6.png,ghost_m7.png,ghost_d3.png
+Movement=0,0,0,0,0,0,0,0
+Delay=100,100,100,100,100,100,100,100
+HotspotX=16,16,16,16,16,16,16,16
+HotspotY=30,30,30,30,30,30,30,30
+
+[EyesRight]
+Sequence=ghost_e.png,ghost_e.png,ghost_e.png,ghost_e.png,ghost_e.png,ghost_e.png,ghost_e.png,ghost_e.png,ghost_e.png,ghost_e.png,ghost_e.png
+Movement=0,0,0,0,12,12,12,12,0,0,0
+Delay=100,100,100,300,100,100,100,300,100,100,100
+HotspotX=16,16,16,16,16,16,16,16,16,16,16
+HotspotY=25,20,15,10,10,10,10,10,15,20,25
+
+[EyesLeft]
+Sequence=ghost_e.png,ghost_e.png,ghost_e.png,ghost_e.png,ghost_e.png,ghost_e.png,ghost_e.png,ghost_e.png,ghost_e.png,ghost_e.png,ghost_e.png
+Movement=0,0,0,0,-12,-12,-12,-12,0,0,0
+Delay=100,100,100,300,100,100,100,300,100,100,100
+HotspotX=16,16,16,16,16,16,16,16,16,16,16
+HotspotY=25,20,15,10,10,10,10,10,15,20,25
+
+[GlideLeft]
+Sequence=ghost_1.png,ghost_2.png,ghost_1.png,ghost_2.png,ghost_1.png,ghost_2.png
+Movement=-4,-4,-4,-4,-4,-4
+Delay=300,300,300,300,300,300
+HotspotX=16,16,16,16,16,16
+HotspotY=30,31,30,31,30,31
+
+[GlideRight]
+Sequence=ghost_1.png,ghost_2.png,ghost_1.png,ghost_2.png,ghost_1.png,ghost_2.png
+Movement=4,4,4,4,4,4
+Delay=300,300,300,300,300,300
+HotspotX=16,16,16,16,16,16
+HotspotY=30,31,30,31,30,31
+
diff --git a/amor/data/nekorc b/amor/data/nekorc
new file mode 100644
index 0000000..a158270
--- /dev/null
+++ b/amor/data/nekorc
@@ -0,0 +1,202 @@
+# KDE Config File
+# An AMOR version of Oneko (a cat who follows your pointer around)
+# Chris Spiegel (matrix@xirtam.org)
+
+[Config]
+PixmapPath=pics/animated/neko
+Description=Neko
+Description[bg]=Ðеко
+Description[bn]=নেকো
+Description[et]=Hiirepüüdja
+Description[hi]=नेको
+Description[km]=áž“áŸáž€áž¼
+Description[ne]=नेको
+Description[ru]=Ðеко
+Description[ta]= Neko
+Description[tg]=Пишак
+Description[th]=เน็คโà¸à¹‰
+Description[tr]=Mırnav
+Description[uz@cyrillic]=Ðеко
+Description[zh_CN]=Nekoå°çŒ«å’ª
+About=Artwork from oneko by Masayuki Koba\nAMOR'd by Chris Spiegel
+About[af]=Kunswerk van oneko deur Masayuki Koba\Namor'd deur Chris Spiegel
+About[ar]=عمل Ùني من أونيكو Ùˆ من تصميم ماياسوكي كوبا\n نقلت الى Amor عن طريق كريس شبيغل
+About[az]=Masayuki Kobanın sənət abidəsi\nAMOR'd by Chris Spiegel
+About[be]=Малюнкі з oneko (аўтар Masayuki Koba)\n Ð¿ÐµÑ€Ð°Ð½Ð¾Ñ Ñž AMOR - Chris Spiegel
+About[bg]=Ðвтор МаÑиÑки Коба\nÐÐ´Ð°Ð¿Ñ‚Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ ÐšÑ€Ð¸Ñ Ð¨Ð¿Ð¸Ð³ÐµÐ»
+About[bn]=শিলà§à¦ªà¦•à¦°à§à¦® নেওয়া হয়েছে মাসায়à§à¦•à¦¿ কোবা'র তৈরি ওনেকো থেকে\nআমর-à¦à¦° জনà§à¦¯ পà§à¦°à¦¸à§à¦¤à§à¦¤ করেছেন কà§à¦°à¦¿à¦¸ সà§à¦ªà¦¾à¦‡à¦œà§‡à¦²
+About[bs]=Artwork iz oneko-a koji je napravio Masayuki Koba\nAMORovao Chris Spiegel
+About[ca]=Treball gràfic de oneko per Masayuki Koba\nAMOR per Chris Spiegel
+About[cs]=Grafika z programu oneko, Masayuki Koba\nPřevod: Chris Spiegel
+About[cy]=Gwaith arlunio oddiwrth oneko gan Masayuki Koba\nWedi ei AMORio gan Chris Spiegel
+About[da]=Billedmateriale fra oneko af Masayuki Koba\nAMOR'et af Chris Spiegel
+About[de]=Zeichnungen der Katze (oneko) von Masayuki Koba\nAuf AMOR portiert von Chris Spiegel
+About[el]=Καλλιτεχνική εÏγασία από το oneko από τον Masayuki Koba\n ΠÏοσαÏμογή στο AMOR από τον Chris Spiegel
+About[eo]=Artaĵo de Masayuki Koba\nAMOR-ita de Chris Spiegel
+About[es]=Arte de oneko por Masayuki Koba\nAMORizado por Chris Spiegel
+About[et]=Hiirepüüdja graafika: Masayuki Koba\nAMORile kohandas: Chris Spiegel
+About[eu]=Artelana onekotik Masayuki Kobak egina\nChris Spiegel'ek AMOR'tua
+About[fa]=کارهنری از oneko توسط ماسایوکی کوبا \nAMOR'd توسط کریس اسپیگل
+About[fi]=Kuvat oneko ohjelmasta, tehnyt Masayuki Koba\nMuokannut Amorille sopivaksi Chris Spiegel
+About[fr]=Travail basé sur « oneko » de Masayuki Koba\nAMORé par Chris Spiegel
+About[ga]=Maisiúchán ó oneko le Masayuki Koba\nCurtha i AMOR ag Chris Spiegel
+About[gl]=Imaxes de oneko por Masayuki Koba\nAdaptadas a AMOR por Chris Spiegel
+About[he]=עבודות ×”×מנות מתוך oneko מ×ת מ×ס×יוקי קובה\nהות×× ×œÖ¾AMOR על ידי כריס שפיגל
+About[hi]=कलाकृति ओनेको से, मसायà¥à¤•à¥€ कोबा दà¥à¤µà¤¾à¤°à¤¾\nअमोरà¥à¤¡- कà¥à¤°à¤¿à¤¸ सà¥à¤ªà¥€à¤œà¥‡à¤² दà¥à¤µà¤¾à¤°à¤¾
+About[hr]=Slike preuzete iz: oneko, autor Masayuki Koba\nZa AMOR prilagodi: Chris Spiegel
+About[hu]=A grafika Masuyaki Koba Onekojából származik\nAMOR-átirat: Chris Spiegel
+About[is]=Artwork from oneko by Masayuki Koba\nAMOR-erað af Chris Spiegel
+About[it]=I disegni provengono da Oneko, di Masayuki Koba.\nConvertito ad AMOR da Chris Spiegel.
+About[ja]=oneko ã®ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ by Masayuki Koba\nAMOR化 by Chris Spiegel
+About[km]=សិល្បៈកម្ម​ពី អូនáŸáž€áž¼(oneko) ដោយ មាសាយូគី កូបា (Masayuki Koba)\nAMOR'd ដោយ Chris Spiegel
+About[lt]=Meninė dalis iš oneko, daryto Masayuki Koba\nAMOR'ui pritaikė Chris Spiegel
+About[lv]=Grafika - Masayuki Koba\nAMOR'd - Chris Spiegel
+About[mk]=Сликите Ñе од oneko на Masayuki Koba\nПриÑпоÑобено за AMOR од ÐšÑ€Ð¸Ñ Ð¡Ð¿Ð¸Ð³ÐµÐ»
+About[mt]=Artwork minn oneko ta' Masayuki Koba\nMaqlub għal AMOR minn Chris Spiegel
+About[nb]=Kunstnerisk arbeide fra oneko av Masayuki Koba\nTilpasset AMOR av Chris Spiegel
+About[nds]=oneko-Biller vun Masayuki Koba\nFör AMOR ümsett vun Chris Spiegel
+About[ne]=Masayuki Koba दà¥à¤µà¤¾à¤°à¤¾ वानकोबाट कलाकारà¥à¤¯\nAMOR'd by Chris Spiegel
+About[nl]=Illustraties van oneko door Masayuki Koba\nOvergezet naar AMOR door Chris Spiegel
+About[nn]=Bilete frå oneko av Masayuki Koba\nTilpassa AMOR av Chris Spiegel
+About[pl]=Pochodzi z oneko, autorstwa Masayuki Koba\ndostosowane do AMOR przez Chrisa Spiegela
+About[pt]=Criação do oneko de Masayuki Koba\nAMORado por Chris Spiegel
+About[pt_BR]=Arte por Masayuki Koba\nAMOR por Chris Spiegel
+About[ro]=Grafică din oneko de Masayuki Koba\nPortat la AMOR de Chris Spiegel
+About[ru]=РиÑунки от oneko - Masayuki Koba\nÐдаптировано Ð´Ð»Ñ AMOR - Chris Spiegel
+About[sk]=Obrázok z programu oneko od Masayuki Koba\nAMORoval Chris Spiegel
+About[sl]=Umetniško delo iz oneko izdelal Masayuki Koba\niz AMOR pa Chris Spiegel
+About[sr]=Графика из Oneko-а од МаÑајукија Кобе (Masayuki Koba)\nУ AMOR претворио ÐšÑ€Ð¸Ñ Ð¨Ð¿Ð¸Ð³ÐµÐ» (Chris Spiegel)
+About[sr@Latn]=Grafika iz Oneko-a od Masajukija Kobe (Masayuki Koba)\nU AMOR pretvorio Kris Å pigel (Chris Spiegel)
+About[sv]=Grafik från oneko av Masayuki Koba\nTill Amor av Chris Spiegel
+About[tg]=МаÑаюки Коба\nИШҚ - ÐšÑ€Ð¸Ñ Ð¡Ð¿Ð¸Ð³ÐµÐ»
+About[th]=งานศิลป์จาภoneko โดย Masayuki Koba\nAMOR'd โดย Chris Spiegel
+About[tr]=Çizimler Masayuki Koba\nArmor'a geçiş Chris Spiegel
+About[uk]=ÐŸÑ€Ð°Ñ†Ñ Ð²Ñ–Ð´ oneko, автор: Masayuki Koba\nÐдаптовано до AMOR - Chris Spiegel
+About[ven]=Mushumo wa zwanda ubva kha oneko nga Masayuki Koba\nAMOR'd nga Chris Spiegel
+About[xh]=Artwork esuka oneko ngu Masayuki Koba\nAMOR'd ngo Chris Spiegel
+About[zh_CN]=艺术作者为 oneko å°ç»„çš„ Masayuki Koba\nAMOR'd 作者为 Chris Spiegel
+About[zu]=Umsebenzi wezandla osuka ku Masayuki Koba\nAMOR'd ngu Chris Spiegel
+Icon=../../preview/neko.png
+Base=Base
+Sequences=RightScratch,LeftScratch,RunRight,RunLeft,Yawn,RightLick,LeftLick,Claw,JumpRight,JumpLeft
+Focus=Start
+Blur=End
+Destroy=DropOut
+Sleep=Snooze
+Wake=Surprise
+
+[Base]
+Sequence=tail.png,sit.png,tail.png,sit.png,tail.png,sit.png,tail.png,sit.png,tail.png,sit.png,tail.png,sit.png
+Movement=0,0,0,0,0,0,0,0,0,0,0,0
+Delay=200,200,200,200,200,200,200,200,200,200,200,200
+HotspotX=16,16,16,16,16,16,16,16,16,16,16,16
+HotspotY=29,29,29,29,29,29,29,29,29,29,29,29
+
+[JumpRight]
+Sequence=jump1.png,jump2.png,run2.png,jump3.png,jump4.png
+Movement=10,10,10,10,10
+Delay=200,200,200,200,200
+HotspotX=16,16,16,16,16
+HotspotY=34,40,44,34,29
+
+[JumpLeft]
+Sequence=jumpl1.png,jumpl2.png,run4.png,jumpl3.png,jumpl4.png
+Movement=-10,-10,-10,-10,-10
+Delay=200,200,200,200,200
+HotspotX=16,16,16,16,16
+HotspotY=34,40,44,34,29
+
+[Claw]
+Sequence=claw1.png,claw2.png,claw1.png,claw2.png,claw1.png,claw2.png,claw1.png,claw2.png
+Movement=0,0,0,0,0,0,0,0
+Delay=200,200,200,200,200,200,200,200
+HotspotX=16,16,16,16,16,16,16,16
+HotspotY=17,17,17,17,17,17,17,17
+
+[Snooze]
+Sequence=sleep1.png,sleep2.png
+Movement=0,0
+Delay=450,450
+HotspotX=16,16
+HotspotY=29,29
+
+[Surprise]
+Sequence=surprise.png
+Movement=0
+Delay=600
+HotspotX=16
+HotspotY=29
+
+[RightScratch]
+Sequence=scratch1.png,scratch2.png,scratch1.png,scratch2.png,scratch1.png,scratch2.png,scratch1.png,scratch2.png,scratch1.png,scratch2.png,scratch1.png,scratch2.png
+Movement=0,0,0,0,0,0,0,0,0,0,0,0,
+Delay=100,100,100,100,100,100,100,100,100,100,100,100
+HotspotX=16,16,16,16,16,16,16,16,16,16,16,16
+HotspotY=29,29,29,29,29,29,29,29,29,29,29,29
+
+[LeftScratch]
+Sequence=scratch3.png,scratch4.png,scratch3.png,scratch4.png,scratch3.png,scratch4.png,scratch3.png,scratch4.png,scratch3.png,scratch4.png,scratch3.png,scratch4.png
+Movement=0,0,0,0,0,0,0,0,0,0,0,0,
+Delay=100,100,100,100,100,100,100,100,100,100,100,100
+HotspotX=16,16,16,16,16,16,16,16,16,16,16,16
+HotspotY=29,29,29,29,29,29,29,29,29,29,29,29
+
+[RunRight]
+Sequence=run2.png,run1.png,run2.png,run1.png,run2.png,run1.png,run2.png,run1.png,run2.png,run1.png,run2.png,run1.png
+Movement=10,10,10,10,10,10,10,10,10,10,10,10
+Delay=100,100,100,100,100,100,100,100,100,100,100,100
+HotspotX=16,16,16,16,16,16,16,16,16,16,16,16
+HotspotY=29,29,29,29,29,29,29,29,29,29,29,29
+
+[RunLeft]
+Sequence=run4.png,run3.png,run4.png,run3.png,run4.png,run3.png,run4.png,run3.png,run4.png,run3.png,run4.png,run3.png
+Movement=-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10
+Delay=100,100,100,100,100,100,100,100,100,100,100,100
+HotspotX=16,16,16,16,16,16,16,16,16,16,16,16
+HotspotY=29,29,29,29,29,29,29,29,29,29,29,29
+
+# It seems, for me, that if Start and End are only one pixmap,
+# they don't stay on for the desired delay .. ?? Anyway, this
+# seems to work OK
+[End]
+Sequence=surprise.png,surprise.png,surprise.png,surprise.png
+Movement=0,0,0,0
+Delay=400,400,400,400
+HotspotX=16,16,16,16
+HotspotY=29,29,29,29
+
+[Start]
+Sequence=yawn.png,yawn.png,yawn.png,yawn.png
+Movement=0,0,0,0
+Delay=400,400,400,400
+HotspotX=16,16,16,16
+HotspotY=29,29,29,29
+
+[Yawn]
+Sequence=yawn.png
+Movement=0
+Delay=1600
+HotspotX=16
+HotspotY=29
+
+[RightLick]
+Sequence=lick.png,sit.png,lick.png,sit.png,lick.png,sit.png,lick.png,sit.png,lick.png,sit.png,lick.png
+Movement=0,0,0,0,0,0,0,0,0,0,0
+Delay=100,100,100,100,100,100,100,100,100,100,100
+HotspotX=16,16,16,16,16,16,16,16,16,16,16
+HotspotY=29,29,29,29,29,29,29,29,29,29,29
+
+[LeftLick]
+Sequence=lick2.png,sit.png,lick2.png,sit.png,lick2.png,sit.png,lick2.png,sit.png,lick2.png,sit.png,lick2.png
+Movement=0,0,0,0,0,0,0,0,0,0,0
+Delay=100,100,100,100,100,100,100,100,100,100,100
+HotspotX=16,16,16,16,16,16,16,16,16,16,16
+HotspotY=29,29,29,29,29,29,29,29,29,29,29
+
+# Values shamelessly stolen from Bonhomme, by Jean-Claude Dumas .. :)
+[DropOut]
+Sequence=surprise.png,surprise.png,surprise.png,surprise.png,surprise.png,surprise.png,surprise.png,surprise.png
+Movement=0,0,0,0,0,0,0,0
+Delay=150,100,100,100,100,100,100,100
+HotspotX=16,16,16,16,16,16,16,16
+HotspotY=0,-25,-50,-100,-250,-500,-750,-1000
diff --git a/amor/data/pics/Makefile.am b/amor/data/pics/Makefile.am
new file mode 100644
index 0000000..0c1d96c
--- /dev/null
+++ b/amor/data/pics/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = animated preview static
diff --git a/amor/data/pics/animated/Makefile.am b/amor/data/pics/animated/Makefile.am
new file mode 100644
index 0000000..e3207b2
--- /dev/null
+++ b/amor/data/pics/animated/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = blob bonhomme eyes ghost neko pingu tao worm
diff --git a/amor/data/pics/animated/blob/Makefile.am b/amor/data/pics/animated/blob/Makefile.am
new file mode 100644
index 0000000..192d34a
--- /dev/null
+++ b/amor/data/pics/animated/blob/Makefile.am
@@ -0,0 +1,82 @@
+# Add all your pic files here
+amor_DATA = blob_b1.png \
+ blob_b2.png \
+ blob_BeamDown1.png \
+ blob_BeamDown2.png \
+ blob_BeamDown3.png \
+ blob_BeamDown4.png \
+ blob_BeamDown5.png \
+ blob_BeamDown6.png \
+ blob_BeamDown7.png \
+ blob_BeamDown8.png \
+ blob_BeamDown9.png \
+ blob_BeamUp10.png \
+ blob_BeamUp1.png \
+ blob_BeamUp2.png \
+ blob_BeamUp3.png \
+ blob_BeamUp4.png \
+ blob_BeamUp5.png \
+ blob_BeamUp6.png \
+ blob_BeamUp7.png \
+ blob_BeamUp8.png \
+ blob_BeamUp9.png \
+ blob_e1.png \
+ blob_ex1.png \
+ blob_f1.png \
+ blob_f2.png \
+ blob_f3.png \
+ blob_fire10.png \
+ blob_fire11.png \
+ blob_fire2.png \
+ blob_fire3.png \
+ blob_fire4.png \
+ blob_fire5.png \
+ blob_fire6.png \
+ blob_fire7.png \
+ blob_fire8.png \
+ blob_fire9.png \
+ blob_g1.png \
+ blob_g2.png \
+ blob_gl1.png \
+ blob_gl2.png \
+ blob_gl3.png \
+ blob_h1.png \
+ blob_h2.png \
+ blob_h3.png \
+ blob_jet1.png \
+ blob_jet2.png \
+ blob_jet3.png \
+ blob_jet4.png \
+ blob_l_jet1.png \
+ blob_l_jet2.png \
+ blob_l_jet3.png \
+ blob_l_jet4.png \
+ blob_l_turn1.png \
+ blob_l_turn2.png \
+ blob_l_turn3.png \
+ blob_l_turn4.png \
+ blob.png \
+ blob_r135.png \
+ blob_r180.png \
+ blob_r225.png \
+ blob_r270.png \
+ blob_r315.png \
+ blob_r45.png \
+ blob_r90.png \
+ blob_r_turn1.png \
+ blob_r_turn2.png \
+ blob_r_turn3.png \
+ blob_r_turn4.png \
+ blob_s1.png \
+ blob_s2.png \
+ blob_s3.png \
+ blob_sl1.png \
+ blob_sl2.png \
+ blob_sl3.png \
+ blob_sl4.png \
+ blob_z1.png \
+ blob_z2.png \
+ blob_z3.png
+
+# This is where it will all be installed
+amordir = $(kde_datadir)/amor/pics/animated/blob
diff --git a/amor/data/pics/animated/blob/blob.png b/amor/data/pics/animated/blob/blob.png
new file mode 100644
index 0000000..85a0db7
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_BeamDown1.png b/amor/data/pics/animated/blob/blob_BeamDown1.png
new file mode 100644
index 0000000..1103bba
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_BeamDown1.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_BeamDown2.png b/amor/data/pics/animated/blob/blob_BeamDown2.png
new file mode 100644
index 0000000..e569f7c
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_BeamDown2.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_BeamDown3.png b/amor/data/pics/animated/blob/blob_BeamDown3.png
new file mode 100644
index 0000000..c578f38
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_BeamDown3.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_BeamDown4.png b/amor/data/pics/animated/blob/blob_BeamDown4.png
new file mode 100644
index 0000000..e68d750
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_BeamDown4.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_BeamDown5.png b/amor/data/pics/animated/blob/blob_BeamDown5.png
new file mode 100644
index 0000000..91baa2a
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_BeamDown5.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_BeamDown6.png b/amor/data/pics/animated/blob/blob_BeamDown6.png
new file mode 100644
index 0000000..91ab229
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_BeamDown6.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_BeamDown7.png b/amor/data/pics/animated/blob/blob_BeamDown7.png
new file mode 100644
index 0000000..8b7143c
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_BeamDown7.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_BeamDown8.png b/amor/data/pics/animated/blob/blob_BeamDown8.png
new file mode 100644
index 0000000..b6a813b
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_BeamDown8.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_BeamDown9.png b/amor/data/pics/animated/blob/blob_BeamDown9.png
new file mode 100644
index 0000000..65c00c9
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_BeamDown9.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_BeamUp1.png b/amor/data/pics/animated/blob/blob_BeamUp1.png
new file mode 100644
index 0000000..1343658
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_BeamUp1.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_BeamUp10.png b/amor/data/pics/animated/blob/blob_BeamUp10.png
new file mode 100644
index 0000000..c330a8c
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_BeamUp10.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_BeamUp2.png b/amor/data/pics/animated/blob/blob_BeamUp2.png
new file mode 100644
index 0000000..cee9aec
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_BeamUp2.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_BeamUp3.png b/amor/data/pics/animated/blob/blob_BeamUp3.png
new file mode 100644
index 0000000..d1a6825
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_BeamUp3.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_BeamUp4.png b/amor/data/pics/animated/blob/blob_BeamUp4.png
new file mode 100644
index 0000000..decb861
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_BeamUp4.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_BeamUp5.png b/amor/data/pics/animated/blob/blob_BeamUp5.png
new file mode 100644
index 0000000..6fbcc72
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_BeamUp5.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_BeamUp6.png b/amor/data/pics/animated/blob/blob_BeamUp6.png
new file mode 100644
index 0000000..d4175c8
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_BeamUp6.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_BeamUp7.png b/amor/data/pics/animated/blob/blob_BeamUp7.png
new file mode 100644
index 0000000..56a1747
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_BeamUp7.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_BeamUp8.png b/amor/data/pics/animated/blob/blob_BeamUp8.png
new file mode 100644
index 0000000..d8c7f2c
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_BeamUp8.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_BeamUp9.png b/amor/data/pics/animated/blob/blob_BeamUp9.png
new file mode 100644
index 0000000..72db7c7
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_BeamUp9.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_b1.png b/amor/data/pics/animated/blob/blob_b1.png
new file mode 100644
index 0000000..bc97918
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_b1.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_b2.png b/amor/data/pics/animated/blob/blob_b2.png
new file mode 100644
index 0000000..444a3b6
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_b2.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_e1.png b/amor/data/pics/animated/blob/blob_e1.png
new file mode 100644
index 0000000..65da0b6
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_e1.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_ex1.png b/amor/data/pics/animated/blob/blob_ex1.png
new file mode 100644
index 0000000..f917960
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_ex1.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_f1.png b/amor/data/pics/animated/blob/blob_f1.png
new file mode 100644
index 0000000..e41ae0b
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_f1.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_f2.png b/amor/data/pics/animated/blob/blob_f2.png
new file mode 100644
index 0000000..34a0b50
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_f2.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_f3.png b/amor/data/pics/animated/blob/blob_f3.png
new file mode 100644
index 0000000..72deac2
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_f3.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_fire10.png b/amor/data/pics/animated/blob/blob_fire10.png
new file mode 100644
index 0000000..cd25bf2
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_fire10.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_fire11.png b/amor/data/pics/animated/blob/blob_fire11.png
new file mode 100644
index 0000000..5ddb229
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_fire11.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_fire2.png b/amor/data/pics/animated/blob/blob_fire2.png
new file mode 100644
index 0000000..a9c11b1
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_fire2.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_fire3.png b/amor/data/pics/animated/blob/blob_fire3.png
new file mode 100644
index 0000000..6e56e2a
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_fire3.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_fire4.png b/amor/data/pics/animated/blob/blob_fire4.png
new file mode 100644
index 0000000..1f60daa
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_fire4.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_fire5.png b/amor/data/pics/animated/blob/blob_fire5.png
new file mode 100644
index 0000000..6008bbc
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_fire5.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_fire6.png b/amor/data/pics/animated/blob/blob_fire6.png
new file mode 100644
index 0000000..8e50a9b
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_fire6.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_fire7.png b/amor/data/pics/animated/blob/blob_fire7.png
new file mode 100644
index 0000000..1301f0e
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_fire7.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_fire8.png b/amor/data/pics/animated/blob/blob_fire8.png
new file mode 100644
index 0000000..af004b5
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_fire8.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_fire9.png b/amor/data/pics/animated/blob/blob_fire9.png
new file mode 100644
index 0000000..701ca74
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_fire9.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_g1.png b/amor/data/pics/animated/blob/blob_g1.png
new file mode 100644
index 0000000..25011dd
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_g1.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_g2.png b/amor/data/pics/animated/blob/blob_g2.png
new file mode 100644
index 0000000..5abd3b3
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_g2.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_gl1.png b/amor/data/pics/animated/blob/blob_gl1.png
new file mode 100644
index 0000000..9c1ed8c
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_gl1.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_gl2.png b/amor/data/pics/animated/blob/blob_gl2.png
new file mode 100644
index 0000000..c621f22
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_gl2.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_gl3.png b/amor/data/pics/animated/blob/blob_gl3.png
new file mode 100644
index 0000000..5d7ac0a
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_gl3.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_h1.png b/amor/data/pics/animated/blob/blob_h1.png
new file mode 100644
index 0000000..e7c89ac
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_h1.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_h2.png b/amor/data/pics/animated/blob/blob_h2.png
new file mode 100644
index 0000000..6983286
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_h2.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_h3.png b/amor/data/pics/animated/blob/blob_h3.png
new file mode 100644
index 0000000..02302ed
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_h3.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_jet1.png b/amor/data/pics/animated/blob/blob_jet1.png
new file mode 100644
index 0000000..2d32bea
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_jet1.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_jet2.png b/amor/data/pics/animated/blob/blob_jet2.png
new file mode 100644
index 0000000..6284686
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_jet2.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_jet3.png b/amor/data/pics/animated/blob/blob_jet3.png
new file mode 100644
index 0000000..05f3864
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_jet3.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_jet4.png b/amor/data/pics/animated/blob/blob_jet4.png
new file mode 100644
index 0000000..fa74fac
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_jet4.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_l_jet1.png b/amor/data/pics/animated/blob/blob_l_jet1.png
new file mode 100644
index 0000000..a35760b
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_l_jet1.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_l_jet2.png b/amor/data/pics/animated/blob/blob_l_jet2.png
new file mode 100644
index 0000000..2a28db6
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_l_jet2.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_l_jet3.png b/amor/data/pics/animated/blob/blob_l_jet3.png
new file mode 100644
index 0000000..80f4148
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_l_jet3.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_l_jet4.png b/amor/data/pics/animated/blob/blob_l_jet4.png
new file mode 100644
index 0000000..150b6e7
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_l_jet4.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_l_turn1.png b/amor/data/pics/animated/blob/blob_l_turn1.png
new file mode 100644
index 0000000..1ad2ac2
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_l_turn1.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_l_turn2.png b/amor/data/pics/animated/blob/blob_l_turn2.png
new file mode 100644
index 0000000..b664999
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_l_turn2.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_l_turn3.png b/amor/data/pics/animated/blob/blob_l_turn3.png
new file mode 100644
index 0000000..d99b0a0
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_l_turn3.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_l_turn4.png b/amor/data/pics/animated/blob/blob_l_turn4.png
new file mode 100644
index 0000000..92fa5f2
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_l_turn4.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_r135.png b/amor/data/pics/animated/blob/blob_r135.png
new file mode 100644
index 0000000..691d53a
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_r135.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_r180.png b/amor/data/pics/animated/blob/blob_r180.png
new file mode 100644
index 0000000..3657c66
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_r180.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_r225.png b/amor/data/pics/animated/blob/blob_r225.png
new file mode 100644
index 0000000..f957f93
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_r225.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_r270.png b/amor/data/pics/animated/blob/blob_r270.png
new file mode 100644
index 0000000..8851572
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_r270.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_r315.png b/amor/data/pics/animated/blob/blob_r315.png
new file mode 100644
index 0000000..6ddfe12
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_r315.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_r45.png b/amor/data/pics/animated/blob/blob_r45.png
new file mode 100644
index 0000000..7a752d7
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_r45.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_r90.png b/amor/data/pics/animated/blob/blob_r90.png
new file mode 100644
index 0000000..525dbba
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_r90.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_r_turn1.png b/amor/data/pics/animated/blob/blob_r_turn1.png
new file mode 100644
index 0000000..6b9d054
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_r_turn1.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_r_turn2.png b/amor/data/pics/animated/blob/blob_r_turn2.png
new file mode 100644
index 0000000..9f4cc9f
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_r_turn2.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_r_turn3.png b/amor/data/pics/animated/blob/blob_r_turn3.png
new file mode 100644
index 0000000..cc27fe3
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_r_turn3.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_r_turn4.png b/amor/data/pics/animated/blob/blob_r_turn4.png
new file mode 100644
index 0000000..c704d3d
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_r_turn4.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_s1.png b/amor/data/pics/animated/blob/blob_s1.png
new file mode 100644
index 0000000..c88bf4b
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_s1.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_s2.png b/amor/data/pics/animated/blob/blob_s2.png
new file mode 100644
index 0000000..4c05c8a
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_s2.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_s3.png b/amor/data/pics/animated/blob/blob_s3.png
new file mode 100644
index 0000000..93fcb53
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_s3.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_sl1.png b/amor/data/pics/animated/blob/blob_sl1.png
new file mode 100644
index 0000000..166b89b
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_sl1.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_sl2.png b/amor/data/pics/animated/blob/blob_sl2.png
new file mode 100644
index 0000000..c10d456
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_sl2.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_sl3.png b/amor/data/pics/animated/blob/blob_sl3.png
new file mode 100644
index 0000000..425d664
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_sl3.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_sl4.png b/amor/data/pics/animated/blob/blob_sl4.png
new file mode 100644
index 0000000..5369223
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_sl4.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_z1.png b/amor/data/pics/animated/blob/blob_z1.png
new file mode 100644
index 0000000..e222d1a
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_z1.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_z2.png b/amor/data/pics/animated/blob/blob_z2.png
new file mode 100644
index 0000000..a56703c
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_z2.png
Binary files differ
diff --git a/amor/data/pics/animated/blob/blob_z3.png b/amor/data/pics/animated/blob/blob_z3.png
new file mode 100644
index 0000000..bb6060b
--- /dev/null
+++ b/amor/data/pics/animated/blob/blob_z3.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/Makefile.am b/amor/data/pics/animated/bonhomme/Makefile.am
new file mode 100644
index 0000000..1d6f12c
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/Makefile.am
@@ -0,0 +1,46 @@
+# Add all your pic files here
+amor_DATA = b1.png \
+ b1-r.png \
+ b2.png \
+ b2-r.png \
+ b3.png \
+ b3-r.png \
+ b4.png \
+ b4-r.png \
+ bcol1.png \
+ bcol2.png \
+ bdrib1.png \
+ bdrib2.png \
+ bdrib3.png \
+ bdrib4.png \
+ bdrib5.png \
+ bdrib6.png \
+ bdrib7.png \
+ bdrop.png \
+ b-f2.png \
+ b-f.png \
+ bgo1.png \
+ bgo2.png \
+ bgo3.png \
+ bgo4.png \
+ bgo5.png \
+ bgo6.png \
+ bgo7.png \
+ bh1.png \
+ bpof1.png \
+ bpof2.png \
+ bpof3.png \
+ bpof4.png \
+ bpof5.png \
+ bpof6.png \
+ sa1.png \
+ sa2a.png \
+ sa2b.png \
+ sa2c.png \
+ sa2.png \
+ salut1.png \
+ salut.png
+
+
+# This is where it will all be installed
+amordir = $(kde_datadir)/amor/pics/animated/bonhomme
diff --git a/amor/data/pics/animated/bonhomme/b-f.png b/amor/data/pics/animated/bonhomme/b-f.png
new file mode 100644
index 0000000..8ebe1a9
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/b-f.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/b-f2.png b/amor/data/pics/animated/bonhomme/b-f2.png
new file mode 100644
index 0000000..d54612f
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/b-f2.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/b1-r.png b/amor/data/pics/animated/bonhomme/b1-r.png
new file mode 100644
index 0000000..ea85a03
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/b1-r.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/b1.png b/amor/data/pics/animated/bonhomme/b1.png
new file mode 100644
index 0000000..5063099
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/b1.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/b2-r.png b/amor/data/pics/animated/bonhomme/b2-r.png
new file mode 100644
index 0000000..8692ddc
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/b2-r.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/b2.png b/amor/data/pics/animated/bonhomme/b2.png
new file mode 100644
index 0000000..d4aecf7
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/b2.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/b3-r.png b/amor/data/pics/animated/bonhomme/b3-r.png
new file mode 100644
index 0000000..2562b53
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/b3-r.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/b3.png b/amor/data/pics/animated/bonhomme/b3.png
new file mode 100644
index 0000000..913950f
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/b3.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/b4-r.png b/amor/data/pics/animated/bonhomme/b4-r.png
new file mode 100644
index 0000000..377a272
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/b4-r.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/b4.png b/amor/data/pics/animated/bonhomme/b4.png
new file mode 100644
index 0000000..fdfc19c
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/b4.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/bcol1.png b/amor/data/pics/animated/bonhomme/bcol1.png
new file mode 100644
index 0000000..7d89330
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/bcol1.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/bcol2.png b/amor/data/pics/animated/bonhomme/bcol2.png
new file mode 100644
index 0000000..006250d
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/bcol2.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/bdrib1.png b/amor/data/pics/animated/bonhomme/bdrib1.png
new file mode 100644
index 0000000..006b17e
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/bdrib1.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/bdrib2.png b/amor/data/pics/animated/bonhomme/bdrib2.png
new file mode 100644
index 0000000..11a20f2
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/bdrib2.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/bdrib3.png b/amor/data/pics/animated/bonhomme/bdrib3.png
new file mode 100644
index 0000000..52b734f
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/bdrib3.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/bdrib4.png b/amor/data/pics/animated/bonhomme/bdrib4.png
new file mode 100644
index 0000000..0cae0e1
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/bdrib4.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/bdrib5.png b/amor/data/pics/animated/bonhomme/bdrib5.png
new file mode 100644
index 0000000..cab174b
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/bdrib5.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/bdrib6.png b/amor/data/pics/animated/bonhomme/bdrib6.png
new file mode 100644
index 0000000..08e233f
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/bdrib6.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/bdrib7.png b/amor/data/pics/animated/bonhomme/bdrib7.png
new file mode 100644
index 0000000..363d4d8
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/bdrib7.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/bdrop.png b/amor/data/pics/animated/bonhomme/bdrop.png
new file mode 100644
index 0000000..7d89330
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/bdrop.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/bgo1.png b/amor/data/pics/animated/bonhomme/bgo1.png
new file mode 100644
index 0000000..c680f56
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/bgo1.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/bgo2.png b/amor/data/pics/animated/bonhomme/bgo2.png
new file mode 100644
index 0000000..06b0b96
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/bgo2.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/bgo3.png b/amor/data/pics/animated/bonhomme/bgo3.png
new file mode 100644
index 0000000..ed09446
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/bgo3.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/bgo4.png b/amor/data/pics/animated/bonhomme/bgo4.png
new file mode 100644
index 0000000..9e6cede
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/bgo4.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/bgo5.png b/amor/data/pics/animated/bonhomme/bgo5.png
new file mode 100644
index 0000000..8d216d8
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/bgo5.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/bgo6.png b/amor/data/pics/animated/bonhomme/bgo6.png
new file mode 100644
index 0000000..df4478a
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/bgo6.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/bgo7.png b/amor/data/pics/animated/bonhomme/bgo7.png
new file mode 100644
index 0000000..4d3b2f2
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/bgo7.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/bh1.png b/amor/data/pics/animated/bonhomme/bh1.png
new file mode 100644
index 0000000..6357f40
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/bh1.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/bpof1.png b/amor/data/pics/animated/bonhomme/bpof1.png
new file mode 100644
index 0000000..6993821
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/bpof1.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/bpof2.png b/amor/data/pics/animated/bonhomme/bpof2.png
new file mode 100644
index 0000000..c1756fa
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/bpof2.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/bpof3.png b/amor/data/pics/animated/bonhomme/bpof3.png
new file mode 100644
index 0000000..9711a4d
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/bpof3.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/bpof4.png b/amor/data/pics/animated/bonhomme/bpof4.png
new file mode 100644
index 0000000..cb2ef3d
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/bpof4.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/bpof5.png b/amor/data/pics/animated/bonhomme/bpof5.png
new file mode 100644
index 0000000..0541a75
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/bpof5.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/bpof6.png b/amor/data/pics/animated/bonhomme/bpof6.png
new file mode 100644
index 0000000..c1756fa
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/bpof6.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/sa1.png b/amor/data/pics/animated/bonhomme/sa1.png
new file mode 100644
index 0000000..9cb3380
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/sa1.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/sa2.png b/amor/data/pics/animated/bonhomme/sa2.png
new file mode 100644
index 0000000..9878562
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/sa2.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/sa2a.png b/amor/data/pics/animated/bonhomme/sa2a.png
new file mode 100644
index 0000000..433c262
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/sa2a.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/sa2b.png b/amor/data/pics/animated/bonhomme/sa2b.png
new file mode 100644
index 0000000..4e5fe79
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/sa2b.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/sa2c.png b/amor/data/pics/animated/bonhomme/sa2c.png
new file mode 100644
index 0000000..f0781b7
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/sa2c.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/salut.png b/amor/data/pics/animated/bonhomme/salut.png
new file mode 100644
index 0000000..5ae1e16
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/salut.png
Binary files differ
diff --git a/amor/data/pics/animated/bonhomme/salut1.png b/amor/data/pics/animated/bonhomme/salut1.png
new file mode 100644
index 0000000..212be97
--- /dev/null
+++ b/amor/data/pics/animated/bonhomme/salut1.png
Binary files differ
diff --git a/amor/data/pics/animated/eyes/Makefile.am b/amor/data/pics/animated/eyes/Makefile.am
new file mode 100644
index 0000000..8f357eb
--- /dev/null
+++ b/amor/data/pics/animated/eyes/Makefile.am
@@ -0,0 +1,31 @@
+# Add all your pic files here
+amor_DATA = eye_1.png \
+ eye_2.png \
+ eye_b.png \
+ eye_d.png \
+ eye_e.png \
+ eye_h1.png \
+ eye_h2.png \
+ eye_h3.png \
+ eye_h4.png \
+ eye_l.png \
+ eye_m1.png \
+ eye_m2.png \
+ eye_m3.png \
+ eye_m4.png \
+ eye_m5.png \
+ eye_m6.png \
+ eye_m7.png \
+ eye_s1.png \
+ eye_s2.png \
+ eye_s3.png \
+ eye_s4.png \
+ eye_u.png \
+ eye_z1.png \
+ eye_z2.png \
+ eye_z3.png \
+ eye_z4.png \
+ eye_z5.png
+
+# This is where it will all be installed
+amordir = $(kde_datadir)/amor/pics/animated/eyes
diff --git a/amor/data/pics/animated/eyes/eye_1.png b/amor/data/pics/animated/eyes/eye_1.png
new file mode 100644
index 0000000..6309988
--- /dev/null
+++ b/amor/data/pics/animated/eyes/eye_1.png
Binary files differ
diff --git a/amor/data/pics/animated/eyes/eye_2.png b/amor/data/pics/animated/eyes/eye_2.png
new file mode 100644
index 0000000..592c9e0
--- /dev/null
+++ b/amor/data/pics/animated/eyes/eye_2.png
Binary files differ
diff --git a/amor/data/pics/animated/eyes/eye_b.png b/amor/data/pics/animated/eyes/eye_b.png
new file mode 100644
index 0000000..0920f6d
--- /dev/null
+++ b/amor/data/pics/animated/eyes/eye_b.png
Binary files differ
diff --git a/amor/data/pics/animated/eyes/eye_d.png b/amor/data/pics/animated/eyes/eye_d.png
new file mode 100644
index 0000000..55a8b14
--- /dev/null
+++ b/amor/data/pics/animated/eyes/eye_d.png
Binary files differ
diff --git a/amor/data/pics/animated/eyes/eye_e.png b/amor/data/pics/animated/eyes/eye_e.png
new file mode 100644
index 0000000..dc01f75
--- /dev/null
+++ b/amor/data/pics/animated/eyes/eye_e.png
Binary files differ
diff --git a/amor/data/pics/animated/eyes/eye_h1.png b/amor/data/pics/animated/eyes/eye_h1.png
new file mode 100644
index 0000000..dce2977
--- /dev/null
+++ b/amor/data/pics/animated/eyes/eye_h1.png
Binary files differ
diff --git a/amor/data/pics/animated/eyes/eye_h2.png b/amor/data/pics/animated/eyes/eye_h2.png
new file mode 100644
index 0000000..bdfc826
--- /dev/null
+++ b/amor/data/pics/animated/eyes/eye_h2.png
Binary files differ
diff --git a/amor/data/pics/animated/eyes/eye_h3.png b/amor/data/pics/animated/eyes/eye_h3.png
new file mode 100644
index 0000000..e7e5eda
--- /dev/null
+++ b/amor/data/pics/animated/eyes/eye_h3.png
Binary files differ
diff --git a/amor/data/pics/animated/eyes/eye_h4.png b/amor/data/pics/animated/eyes/eye_h4.png
new file mode 100644
index 0000000..ba51a66
--- /dev/null
+++ b/amor/data/pics/animated/eyes/eye_h4.png
Binary files differ
diff --git a/amor/data/pics/animated/eyes/eye_l.png b/amor/data/pics/animated/eyes/eye_l.png
new file mode 100644
index 0000000..4451596
--- /dev/null
+++ b/amor/data/pics/animated/eyes/eye_l.png
Binary files differ
diff --git a/amor/data/pics/animated/eyes/eye_m1.png b/amor/data/pics/animated/eyes/eye_m1.png
new file mode 100644
index 0000000..e5896e1
--- /dev/null
+++ b/amor/data/pics/animated/eyes/eye_m1.png
Binary files differ
diff --git a/amor/data/pics/animated/eyes/eye_m2.png b/amor/data/pics/animated/eyes/eye_m2.png
new file mode 100644
index 0000000..1200fad
--- /dev/null
+++ b/amor/data/pics/animated/eyes/eye_m2.png
Binary files differ
diff --git a/amor/data/pics/animated/eyes/eye_m3.png b/amor/data/pics/animated/eyes/eye_m3.png
new file mode 100644
index 0000000..18ce925
--- /dev/null
+++ b/amor/data/pics/animated/eyes/eye_m3.png
Binary files differ
diff --git a/amor/data/pics/animated/eyes/eye_m4.png b/amor/data/pics/animated/eyes/eye_m4.png
new file mode 100644
index 0000000..b09edb8
--- /dev/null
+++ b/amor/data/pics/animated/eyes/eye_m4.png
Binary files differ
diff --git a/amor/data/pics/animated/eyes/eye_m5.png b/amor/data/pics/animated/eyes/eye_m5.png
new file mode 100644
index 0000000..d4cb7ef
--- /dev/null
+++ b/amor/data/pics/animated/eyes/eye_m5.png
Binary files differ
diff --git a/amor/data/pics/animated/eyes/eye_m6.png b/amor/data/pics/animated/eyes/eye_m6.png
new file mode 100644
index 0000000..0e74fa1
--- /dev/null
+++ b/amor/data/pics/animated/eyes/eye_m6.png
Binary files differ
diff --git a/amor/data/pics/animated/eyes/eye_m7.png b/amor/data/pics/animated/eyes/eye_m7.png
new file mode 100644
index 0000000..c5d0816
--- /dev/null
+++ b/amor/data/pics/animated/eyes/eye_m7.png
Binary files differ
diff --git a/amor/data/pics/animated/eyes/eye_s1.png b/amor/data/pics/animated/eyes/eye_s1.png
new file mode 100644
index 0000000..c0bf047
--- /dev/null
+++ b/amor/data/pics/animated/eyes/eye_s1.png
Binary files differ
diff --git a/amor/data/pics/animated/eyes/eye_s2.png b/amor/data/pics/animated/eyes/eye_s2.png
new file mode 100644
index 0000000..1011e68
--- /dev/null
+++ b/amor/data/pics/animated/eyes/eye_s2.png
Binary files differ
diff --git a/amor/data/pics/animated/eyes/eye_s3.png b/amor/data/pics/animated/eyes/eye_s3.png
new file mode 100644
index 0000000..02eadb7
--- /dev/null
+++ b/amor/data/pics/animated/eyes/eye_s3.png
Binary files differ
diff --git a/amor/data/pics/animated/eyes/eye_s4.png b/amor/data/pics/animated/eyes/eye_s4.png
new file mode 100644
index 0000000..dd406ad
--- /dev/null
+++ b/amor/data/pics/animated/eyes/eye_s4.png
Binary files differ
diff --git a/amor/data/pics/animated/eyes/eye_u.png b/amor/data/pics/animated/eyes/eye_u.png
new file mode 100644
index 0000000..bb10be3
--- /dev/null
+++ b/amor/data/pics/animated/eyes/eye_u.png
Binary files differ
diff --git a/amor/data/pics/animated/eyes/eye_z1.png b/amor/data/pics/animated/eyes/eye_z1.png
new file mode 100644
index 0000000..2e6f459
--- /dev/null
+++ b/amor/data/pics/animated/eyes/eye_z1.png
Binary files differ
diff --git a/amor/data/pics/animated/eyes/eye_z2.png b/amor/data/pics/animated/eyes/eye_z2.png
new file mode 100644
index 0000000..88b705c
--- /dev/null
+++ b/amor/data/pics/animated/eyes/eye_z2.png
Binary files differ
diff --git a/amor/data/pics/animated/eyes/eye_z3.png b/amor/data/pics/animated/eyes/eye_z3.png
new file mode 100644
index 0000000..578f05c
--- /dev/null
+++ b/amor/data/pics/animated/eyes/eye_z3.png
Binary files differ
diff --git a/amor/data/pics/animated/eyes/eye_z4.png b/amor/data/pics/animated/eyes/eye_z4.png
new file mode 100644
index 0000000..6309988
--- /dev/null
+++ b/amor/data/pics/animated/eyes/eye_z4.png
Binary files differ
diff --git a/amor/data/pics/animated/eyes/eye_z5.png b/amor/data/pics/animated/eyes/eye_z5.png
new file mode 100644
index 0000000..592c9e0
--- /dev/null
+++ b/amor/data/pics/animated/eyes/eye_z5.png
Binary files differ
diff --git a/amor/data/pics/animated/ghost/Makefile.am b/amor/data/pics/animated/ghost/Makefile.am
new file mode 100644
index 0000000..122495f
--- /dev/null
+++ b/amor/data/pics/animated/ghost/Makefile.am
@@ -0,0 +1,19 @@
+# Add all your pic files here
+amor_DATA = ghost_1.png \
+ ghost_2.png \
+ ghost_e.png \
+ ghost_m1.png \
+ ghost_m2.png \
+ ghost_m3.png \
+ ghost_m4.png \
+ ghost_m5.png \
+ ghost_m6.png \
+ ghost_m7.png \
+ ghost_z1.png \
+ ghost_z2.png \
+ ghost_z3.png \
+ ghost_z4.png \
+ ghost_z5.png
+
+# This is where it will all be installed
+amordir = $(kde_datadir)/amor/pics/animated/ghost
diff --git a/amor/data/pics/animated/ghost/ghost_1.png b/amor/data/pics/animated/ghost/ghost_1.png
new file mode 100644
index 0000000..7042e08
--- /dev/null
+++ b/amor/data/pics/animated/ghost/ghost_1.png
Binary files differ
diff --git a/amor/data/pics/animated/ghost/ghost_2.png b/amor/data/pics/animated/ghost/ghost_2.png
new file mode 100644
index 0000000..f45e82a
--- /dev/null
+++ b/amor/data/pics/animated/ghost/ghost_2.png
Binary files differ
diff --git a/amor/data/pics/animated/ghost/ghost_e.png b/amor/data/pics/animated/ghost/ghost_e.png
new file mode 100644
index 0000000..0eb184a
--- /dev/null
+++ b/amor/data/pics/animated/ghost/ghost_e.png
Binary files differ
diff --git a/amor/data/pics/animated/ghost/ghost_m1.png b/amor/data/pics/animated/ghost/ghost_m1.png
new file mode 100644
index 0000000..d06461b
--- /dev/null
+++ b/amor/data/pics/animated/ghost/ghost_m1.png
Binary files differ
diff --git a/amor/data/pics/animated/ghost/ghost_m2.png b/amor/data/pics/animated/ghost/ghost_m2.png
new file mode 100644
index 0000000..48ee585
--- /dev/null
+++ b/amor/data/pics/animated/ghost/ghost_m2.png
Binary files differ
diff --git a/amor/data/pics/animated/ghost/ghost_m3.png b/amor/data/pics/animated/ghost/ghost_m3.png
new file mode 100644
index 0000000..9c54126
--- /dev/null
+++ b/amor/data/pics/animated/ghost/ghost_m3.png
Binary files differ
diff --git a/amor/data/pics/animated/ghost/ghost_m4.png b/amor/data/pics/animated/ghost/ghost_m4.png
new file mode 100644
index 0000000..7bc2fa2
--- /dev/null
+++ b/amor/data/pics/animated/ghost/ghost_m4.png
Binary files differ
diff --git a/amor/data/pics/animated/ghost/ghost_m5.png b/amor/data/pics/animated/ghost/ghost_m5.png
new file mode 100644
index 0000000..2eff65b
--- /dev/null
+++ b/amor/data/pics/animated/ghost/ghost_m5.png
Binary files differ
diff --git a/amor/data/pics/animated/ghost/ghost_m6.png b/amor/data/pics/animated/ghost/ghost_m6.png
new file mode 100644
index 0000000..1961ff3
--- /dev/null
+++ b/amor/data/pics/animated/ghost/ghost_m6.png
Binary files differ
diff --git a/amor/data/pics/animated/ghost/ghost_m7.png b/amor/data/pics/animated/ghost/ghost_m7.png
new file mode 100644
index 0000000..5664128
--- /dev/null
+++ b/amor/data/pics/animated/ghost/ghost_m7.png
Binary files differ
diff --git a/amor/data/pics/animated/ghost/ghost_z1.png b/amor/data/pics/animated/ghost/ghost_z1.png
new file mode 100644
index 0000000..a092d04
--- /dev/null
+++ b/amor/data/pics/animated/ghost/ghost_z1.png
Binary files differ
diff --git a/amor/data/pics/animated/ghost/ghost_z2.png b/amor/data/pics/animated/ghost/ghost_z2.png
new file mode 100644
index 0000000..9ee97dd
--- /dev/null
+++ b/amor/data/pics/animated/ghost/ghost_z2.png
Binary files differ
diff --git a/amor/data/pics/animated/ghost/ghost_z3.png b/amor/data/pics/animated/ghost/ghost_z3.png
new file mode 100644
index 0000000..48fcccb
--- /dev/null
+++ b/amor/data/pics/animated/ghost/ghost_z3.png
Binary files differ
diff --git a/amor/data/pics/animated/ghost/ghost_z4.png b/amor/data/pics/animated/ghost/ghost_z4.png
new file mode 100644
index 0000000..6ac3d64
--- /dev/null
+++ b/amor/data/pics/animated/ghost/ghost_z4.png
Binary files differ
diff --git a/amor/data/pics/animated/ghost/ghost_z5.png b/amor/data/pics/animated/ghost/ghost_z5.png
new file mode 100644
index 0000000..af66260
--- /dev/null
+++ b/amor/data/pics/animated/ghost/ghost_z5.png
Binary files differ
diff --git a/amor/data/pics/animated/neko/Makefile.am b/amor/data/pics/animated/neko/Makefile.am
new file mode 100644
index 0000000..1d97869
--- /dev/null
+++ b/amor/data/pics/animated/neko/Makefile.am
@@ -0,0 +1,31 @@
+# Add all your pic files here
+amor_DATA = claw1.png \
+ claw2.png \
+ jump1.png \
+ jump2.png \
+ jump3.png \
+ jump4.png \
+ jumpl1.png \
+ jumpl2.png \
+ jumpl3.png \
+ jumpl4.png \
+ lick2.png \
+ lick.png \
+ run1.png \
+ run2.png \
+ run3.png \
+ run4.png \
+ scratch1.png \
+ scratch2.png \
+ scratch3.png \
+ scratch4.png \
+ sitleft.png \
+ sit.png \
+ sleep1.png \
+ sleep2.png \
+ surprise.png \
+ tail.png \
+ yawn.png
+
+# This is where it will all be installed
+amordir = $(kde_datadir)/amor/pics/animated/neko
diff --git a/amor/data/pics/animated/neko/claw1.png b/amor/data/pics/animated/neko/claw1.png
new file mode 100644
index 0000000..3fd1823
--- /dev/null
+++ b/amor/data/pics/animated/neko/claw1.png
Binary files differ
diff --git a/amor/data/pics/animated/neko/claw2.png b/amor/data/pics/animated/neko/claw2.png
new file mode 100644
index 0000000..47fd671
--- /dev/null
+++ b/amor/data/pics/animated/neko/claw2.png
Binary files differ
diff --git a/amor/data/pics/animated/neko/jump1.png b/amor/data/pics/animated/neko/jump1.png
new file mode 100644
index 0000000..0c215d7
--- /dev/null
+++ b/amor/data/pics/animated/neko/jump1.png
Binary files differ
diff --git a/amor/data/pics/animated/neko/jump2.png b/amor/data/pics/animated/neko/jump2.png
new file mode 100644
index 0000000..fdea8cf
--- /dev/null
+++ b/amor/data/pics/animated/neko/jump2.png
Binary files differ
diff --git a/amor/data/pics/animated/neko/jump3.png b/amor/data/pics/animated/neko/jump3.png
new file mode 100644
index 0000000..ec9d854
--- /dev/null
+++ b/amor/data/pics/animated/neko/jump3.png
Binary files differ
diff --git a/amor/data/pics/animated/neko/jump4.png b/amor/data/pics/animated/neko/jump4.png
new file mode 100644
index 0000000..56820c8
--- /dev/null
+++ b/amor/data/pics/animated/neko/jump4.png
Binary files differ
diff --git a/amor/data/pics/animated/neko/jumpl1.png b/amor/data/pics/animated/neko/jumpl1.png
new file mode 100644
index 0000000..8769232
--- /dev/null
+++ b/amor/data/pics/animated/neko/jumpl1.png
Binary files differ
diff --git a/amor/data/pics/animated/neko/jumpl2.png b/amor/data/pics/animated/neko/jumpl2.png
new file mode 100644
index 0000000..ce05929
--- /dev/null
+++ b/amor/data/pics/animated/neko/jumpl2.png
Binary files differ
diff --git a/amor/data/pics/animated/neko/jumpl3.png b/amor/data/pics/animated/neko/jumpl3.png
new file mode 100644
index 0000000..80e309d
--- /dev/null
+++ b/amor/data/pics/animated/neko/jumpl3.png
Binary files differ
diff --git a/amor/data/pics/animated/neko/jumpl4.png b/amor/data/pics/animated/neko/jumpl4.png
new file mode 100644
index 0000000..146e54b
--- /dev/null
+++ b/amor/data/pics/animated/neko/jumpl4.png
Binary files differ
diff --git a/amor/data/pics/animated/neko/lick.png b/amor/data/pics/animated/neko/lick.png
new file mode 100644
index 0000000..91460f2
--- /dev/null
+++ b/amor/data/pics/animated/neko/lick.png
Binary files differ
diff --git a/amor/data/pics/animated/neko/lick2.png b/amor/data/pics/animated/neko/lick2.png
new file mode 100644
index 0000000..5500c30
--- /dev/null
+++ b/amor/data/pics/animated/neko/lick2.png
Binary files differ
diff --git a/amor/data/pics/animated/neko/run1.png b/amor/data/pics/animated/neko/run1.png
new file mode 100644
index 0000000..3fce7ca
--- /dev/null
+++ b/amor/data/pics/animated/neko/run1.png
Binary files differ
diff --git a/amor/data/pics/animated/neko/run2.png b/amor/data/pics/animated/neko/run2.png
new file mode 100644
index 0000000..327763b
--- /dev/null
+++ b/amor/data/pics/animated/neko/run2.png
Binary files differ
diff --git a/amor/data/pics/animated/neko/run3.png b/amor/data/pics/animated/neko/run3.png
new file mode 100644
index 0000000..b9e6686
--- /dev/null
+++ b/amor/data/pics/animated/neko/run3.png
Binary files differ
diff --git a/amor/data/pics/animated/neko/run4.png b/amor/data/pics/animated/neko/run4.png
new file mode 100644
index 0000000..8fa6886
--- /dev/null
+++ b/amor/data/pics/animated/neko/run4.png
Binary files differ
diff --git a/amor/data/pics/animated/neko/scratch1.png b/amor/data/pics/animated/neko/scratch1.png
new file mode 100644
index 0000000..295655a
--- /dev/null
+++ b/amor/data/pics/animated/neko/scratch1.png
Binary files differ
diff --git a/amor/data/pics/animated/neko/scratch2.png b/amor/data/pics/animated/neko/scratch2.png
new file mode 100644
index 0000000..b78a4da
--- /dev/null
+++ b/amor/data/pics/animated/neko/scratch2.png
Binary files differ
diff --git a/amor/data/pics/animated/neko/scratch3.png b/amor/data/pics/animated/neko/scratch3.png
new file mode 100644
index 0000000..9beb423
--- /dev/null
+++ b/amor/data/pics/animated/neko/scratch3.png
Binary files differ
diff --git a/amor/data/pics/animated/neko/scratch4.png b/amor/data/pics/animated/neko/scratch4.png
new file mode 100644
index 0000000..2b19c63
--- /dev/null
+++ b/amor/data/pics/animated/neko/scratch4.png
Binary files differ
diff --git a/amor/data/pics/animated/neko/sit.png b/amor/data/pics/animated/neko/sit.png
new file mode 100644
index 0000000..bee476c
--- /dev/null
+++ b/amor/data/pics/animated/neko/sit.png
Binary files differ
diff --git a/amor/data/pics/animated/neko/sitleft.png b/amor/data/pics/animated/neko/sitleft.png
new file mode 100644
index 0000000..f711d48
--- /dev/null
+++ b/amor/data/pics/animated/neko/sitleft.png
Binary files differ
diff --git a/amor/data/pics/animated/neko/sleep1.png b/amor/data/pics/animated/neko/sleep1.png
new file mode 100644
index 0000000..f8f1c51
--- /dev/null
+++ b/amor/data/pics/animated/neko/sleep1.png
Binary files differ
diff --git a/amor/data/pics/animated/neko/sleep2.png b/amor/data/pics/animated/neko/sleep2.png
new file mode 100644
index 0000000..c7194fa
--- /dev/null
+++ b/amor/data/pics/animated/neko/sleep2.png
Binary files differ
diff --git a/amor/data/pics/animated/neko/surprise.png b/amor/data/pics/animated/neko/surprise.png
new file mode 100644
index 0000000..2d06199
--- /dev/null
+++ b/amor/data/pics/animated/neko/surprise.png
Binary files differ
diff --git a/amor/data/pics/animated/neko/tail.png b/amor/data/pics/animated/neko/tail.png
new file mode 100644
index 0000000..e5b47a6
--- /dev/null
+++ b/amor/data/pics/animated/neko/tail.png
Binary files differ
diff --git a/amor/data/pics/animated/neko/yawn.png b/amor/data/pics/animated/neko/yawn.png
new file mode 100644
index 0000000..b16cf59
--- /dev/null
+++ b/amor/data/pics/animated/neko/yawn.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/Makefile.am b/amor/data/pics/animated/pingu/Makefile.am
new file mode 100644
index 0000000..a52245e
--- /dev/null
+++ b/amor/data/pics/animated/pingu/Makefile.am
@@ -0,0 +1,104 @@
+# Add all your pic files here
+amor_DATA = bash_l10.png \
+ bash_l11.png \
+ bash_l12.png \
+ bash_l1.png \
+ bash_l2.png \
+ bash_l3.png \
+ bash_l4.png \
+ bash_l5.png \
+ bash_l6.png \
+ bash_l7.png \
+ bash_l8.png \
+ bash_l9.png \
+ bash_r10.png \
+ bash_r11.png \
+ bash_r12.png \
+ bash_r1.png \
+ bash_r2.png \
+ bash_r3.png \
+ bash_r4.png \
+ bash_r5.png \
+ bash_r6.png \
+ bash_r7.png \
+ bash_r8.png \
+ bash_r9.png \
+ blocker1.png \
+ blocker2.png \
+ blocker3.png \
+ blocker4.png \
+ blocker5.png \
+ blocker6.png \
+ bomber10.png \
+ bomber11.png \
+ bomber12.png \
+ bomber13.png \
+ bomber14.png \
+ bomber15.png \
+ bomber16.png \
+ bomber1.png \
+ bomber2.png \
+ bomber3.png \
+ bomber4.png \
+ bomber5.png \
+ bomber6.png \
+ bomber7.png \
+ bomber8.png \
+ bomber9.png \
+ digger10.png \
+ digger11.png \
+ digger12.png \
+ digger13.png \
+ digger14.png \
+ digger1.png \
+ digger2.png \
+ digger3.png \
+ digger4.png \
+ digger5.png \
+ digger6.png \
+ digger7.png \
+ digger8.png \
+ digger9.png \
+ faller1.png \
+ faller2.png \
+ faller3.png \
+ faller4.png \
+ faller5.png \
+ faller6.png \
+ faller7.png \
+ faller8.png \
+ floater1.png \
+ floater2.png \
+ floater3.png \
+ floater4.png \
+ floater5.png \
+ floater6.png \
+ floater7.png \
+ floater8.png \
+ tumble1.png \
+ tumble2.png \
+ tumble3.png \
+ tumble4.png \
+ tumble5.png \
+ tumble6.png \
+ tumble7.png \
+ tumble8.png \
+ walk_l1.png \
+ walk_l2.png \
+ walk_l3.png \
+ walk_l4.png \
+ walk_l5.png \
+ walk_l6.png \
+ walk_l7.png \
+ walk_l8.png \
+ walk_r1.png \
+ walk_r2.png \
+ walk_r3.png \
+ walk_r4.png \
+ walk_r5.png \
+ walk_r6.png \
+ walk_r7.png \
+ walk_r8.png
+
+# This is where it will all be installed
+amordir = $(kde_datadir)/amor/pics/animated/pingu
diff --git a/amor/data/pics/animated/pingu/bash_l1.png b/amor/data/pics/animated/pingu/bash_l1.png
new file mode 100644
index 0000000..3aecb50
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bash_l1.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bash_l10.png b/amor/data/pics/animated/pingu/bash_l10.png
new file mode 100644
index 0000000..a47eefe
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bash_l10.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bash_l11.png b/amor/data/pics/animated/pingu/bash_l11.png
new file mode 100644
index 0000000..3682b7e
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bash_l11.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bash_l12.png b/amor/data/pics/animated/pingu/bash_l12.png
new file mode 100644
index 0000000..23bd7d3
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bash_l12.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bash_l2.png b/amor/data/pics/animated/pingu/bash_l2.png
new file mode 100644
index 0000000..70d2641
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bash_l2.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bash_l3.png b/amor/data/pics/animated/pingu/bash_l3.png
new file mode 100644
index 0000000..47ec510
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bash_l3.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bash_l4.png b/amor/data/pics/animated/pingu/bash_l4.png
new file mode 100644
index 0000000..5904d76
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bash_l4.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bash_l5.png b/amor/data/pics/animated/pingu/bash_l5.png
new file mode 100644
index 0000000..39e99c3
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bash_l5.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bash_l6.png b/amor/data/pics/animated/pingu/bash_l6.png
new file mode 100644
index 0000000..6d328ee
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bash_l6.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bash_l7.png b/amor/data/pics/animated/pingu/bash_l7.png
new file mode 100644
index 0000000..78b1a6b
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bash_l7.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bash_l8.png b/amor/data/pics/animated/pingu/bash_l8.png
new file mode 100644
index 0000000..6406967
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bash_l8.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bash_l9.png b/amor/data/pics/animated/pingu/bash_l9.png
new file mode 100644
index 0000000..bb97ee6
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bash_l9.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bash_r1.png b/amor/data/pics/animated/pingu/bash_r1.png
new file mode 100644
index 0000000..a219626
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bash_r1.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bash_r10.png b/amor/data/pics/animated/pingu/bash_r10.png
new file mode 100644
index 0000000..ba0b0a1
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bash_r10.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bash_r11.png b/amor/data/pics/animated/pingu/bash_r11.png
new file mode 100644
index 0000000..d00679b
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bash_r11.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bash_r12.png b/amor/data/pics/animated/pingu/bash_r12.png
new file mode 100644
index 0000000..7586dd3
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bash_r12.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bash_r2.png b/amor/data/pics/animated/pingu/bash_r2.png
new file mode 100644
index 0000000..3708ac8
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bash_r2.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bash_r3.png b/amor/data/pics/animated/pingu/bash_r3.png
new file mode 100644
index 0000000..6115600
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bash_r3.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bash_r4.png b/amor/data/pics/animated/pingu/bash_r4.png
new file mode 100644
index 0000000..b3f0cf2
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bash_r4.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bash_r5.png b/amor/data/pics/animated/pingu/bash_r5.png
new file mode 100644
index 0000000..2cd3ab3
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bash_r5.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bash_r6.png b/amor/data/pics/animated/pingu/bash_r6.png
new file mode 100644
index 0000000..d926f7b
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bash_r6.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bash_r7.png b/amor/data/pics/animated/pingu/bash_r7.png
new file mode 100644
index 0000000..40e1a1f
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bash_r7.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bash_r8.png b/amor/data/pics/animated/pingu/bash_r8.png
new file mode 100644
index 0000000..a3adeb0
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bash_r8.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bash_r9.png b/amor/data/pics/animated/pingu/bash_r9.png
new file mode 100644
index 0000000..0f300ec
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bash_r9.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/blocker1.png b/amor/data/pics/animated/pingu/blocker1.png
new file mode 100644
index 0000000..ec80d84
--- /dev/null
+++ b/amor/data/pics/animated/pingu/blocker1.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/blocker2.png b/amor/data/pics/animated/pingu/blocker2.png
new file mode 100644
index 0000000..1266601
--- /dev/null
+++ b/amor/data/pics/animated/pingu/blocker2.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/blocker3.png b/amor/data/pics/animated/pingu/blocker3.png
new file mode 100644
index 0000000..8bafa3e
--- /dev/null
+++ b/amor/data/pics/animated/pingu/blocker3.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/blocker4.png b/amor/data/pics/animated/pingu/blocker4.png
new file mode 100644
index 0000000..1bf012e
--- /dev/null
+++ b/amor/data/pics/animated/pingu/blocker4.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/blocker5.png b/amor/data/pics/animated/pingu/blocker5.png
new file mode 100644
index 0000000..b97b7be
--- /dev/null
+++ b/amor/data/pics/animated/pingu/blocker5.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/blocker6.png b/amor/data/pics/animated/pingu/blocker6.png
new file mode 100644
index 0000000..9af87c5
--- /dev/null
+++ b/amor/data/pics/animated/pingu/blocker6.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bomber1.png b/amor/data/pics/animated/pingu/bomber1.png
new file mode 100644
index 0000000..f1cfc39
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bomber1.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bomber10.png b/amor/data/pics/animated/pingu/bomber10.png
new file mode 100644
index 0000000..9cf05a3
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bomber10.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bomber11.png b/amor/data/pics/animated/pingu/bomber11.png
new file mode 100644
index 0000000..fea710a
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bomber11.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bomber12.png b/amor/data/pics/animated/pingu/bomber12.png
new file mode 100644
index 0000000..710cdf5
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bomber12.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bomber13.png b/amor/data/pics/animated/pingu/bomber13.png
new file mode 100644
index 0000000..432de42
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bomber13.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bomber14.png b/amor/data/pics/animated/pingu/bomber14.png
new file mode 100644
index 0000000..b1d939e
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bomber14.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bomber15.png b/amor/data/pics/animated/pingu/bomber15.png
new file mode 100644
index 0000000..b61d38a
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bomber15.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bomber16.png b/amor/data/pics/animated/pingu/bomber16.png
new file mode 100644
index 0000000..fe0e574
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bomber16.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bomber2.png b/amor/data/pics/animated/pingu/bomber2.png
new file mode 100644
index 0000000..f1cfc39
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bomber2.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bomber3.png b/amor/data/pics/animated/pingu/bomber3.png
new file mode 100644
index 0000000..f1cfc39
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bomber3.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bomber4.png b/amor/data/pics/animated/pingu/bomber4.png
new file mode 100644
index 0000000..f995ddc
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bomber4.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bomber5.png b/amor/data/pics/animated/pingu/bomber5.png
new file mode 100644
index 0000000..461bbfb
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bomber5.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bomber6.png b/amor/data/pics/animated/pingu/bomber6.png
new file mode 100644
index 0000000..0f86ea1
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bomber6.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bomber7.png b/amor/data/pics/animated/pingu/bomber7.png
new file mode 100644
index 0000000..a6581f2
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bomber7.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bomber8.png b/amor/data/pics/animated/pingu/bomber8.png
new file mode 100644
index 0000000..db27d89
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bomber8.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/bomber9.png b/amor/data/pics/animated/pingu/bomber9.png
new file mode 100644
index 0000000..cff81fa
--- /dev/null
+++ b/amor/data/pics/animated/pingu/bomber9.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/digger1.png b/amor/data/pics/animated/pingu/digger1.png
new file mode 100644
index 0000000..085ca98
--- /dev/null
+++ b/amor/data/pics/animated/pingu/digger1.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/digger10.png b/amor/data/pics/animated/pingu/digger10.png
new file mode 100644
index 0000000..6b24822
--- /dev/null
+++ b/amor/data/pics/animated/pingu/digger10.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/digger11.png b/amor/data/pics/animated/pingu/digger11.png
new file mode 100644
index 0000000..a8ac44a
--- /dev/null
+++ b/amor/data/pics/animated/pingu/digger11.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/digger12.png b/amor/data/pics/animated/pingu/digger12.png
new file mode 100644
index 0000000..b4dc655
--- /dev/null
+++ b/amor/data/pics/animated/pingu/digger12.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/digger13.png b/amor/data/pics/animated/pingu/digger13.png
new file mode 100644
index 0000000..6008733
--- /dev/null
+++ b/amor/data/pics/animated/pingu/digger13.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/digger14.png b/amor/data/pics/animated/pingu/digger14.png
new file mode 100644
index 0000000..e07e4fd
--- /dev/null
+++ b/amor/data/pics/animated/pingu/digger14.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/digger2.png b/amor/data/pics/animated/pingu/digger2.png
new file mode 100644
index 0000000..e45c7ab
--- /dev/null
+++ b/amor/data/pics/animated/pingu/digger2.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/digger3.png b/amor/data/pics/animated/pingu/digger3.png
new file mode 100644
index 0000000..325fa18
--- /dev/null
+++ b/amor/data/pics/animated/pingu/digger3.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/digger4.png b/amor/data/pics/animated/pingu/digger4.png
new file mode 100644
index 0000000..b802f14
--- /dev/null
+++ b/amor/data/pics/animated/pingu/digger4.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/digger5.png b/amor/data/pics/animated/pingu/digger5.png
new file mode 100644
index 0000000..8e38e07
--- /dev/null
+++ b/amor/data/pics/animated/pingu/digger5.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/digger6.png b/amor/data/pics/animated/pingu/digger6.png
new file mode 100644
index 0000000..52f9a7f
--- /dev/null
+++ b/amor/data/pics/animated/pingu/digger6.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/digger7.png b/amor/data/pics/animated/pingu/digger7.png
new file mode 100644
index 0000000..f55c6d5
--- /dev/null
+++ b/amor/data/pics/animated/pingu/digger7.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/digger8.png b/amor/data/pics/animated/pingu/digger8.png
new file mode 100644
index 0000000..1d8858f
--- /dev/null
+++ b/amor/data/pics/animated/pingu/digger8.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/digger9.png b/amor/data/pics/animated/pingu/digger9.png
new file mode 100644
index 0000000..dbc37ae
--- /dev/null
+++ b/amor/data/pics/animated/pingu/digger9.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/faller1.png b/amor/data/pics/animated/pingu/faller1.png
new file mode 100644
index 0000000..654d31f
--- /dev/null
+++ b/amor/data/pics/animated/pingu/faller1.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/faller2.png b/amor/data/pics/animated/pingu/faller2.png
new file mode 100644
index 0000000..5621e7c
--- /dev/null
+++ b/amor/data/pics/animated/pingu/faller2.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/faller3.png b/amor/data/pics/animated/pingu/faller3.png
new file mode 100644
index 0000000..066ed4a
--- /dev/null
+++ b/amor/data/pics/animated/pingu/faller3.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/faller4.png b/amor/data/pics/animated/pingu/faller4.png
new file mode 100644
index 0000000..d8ea7cb
--- /dev/null
+++ b/amor/data/pics/animated/pingu/faller4.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/faller5.png b/amor/data/pics/animated/pingu/faller5.png
new file mode 100644
index 0000000..9d86830
--- /dev/null
+++ b/amor/data/pics/animated/pingu/faller5.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/faller6.png b/amor/data/pics/animated/pingu/faller6.png
new file mode 100644
index 0000000..5621e7c
--- /dev/null
+++ b/amor/data/pics/animated/pingu/faller6.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/faller7.png b/amor/data/pics/animated/pingu/faller7.png
new file mode 100644
index 0000000..654d31f
--- /dev/null
+++ b/amor/data/pics/animated/pingu/faller7.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/faller8.png b/amor/data/pics/animated/pingu/faller8.png
new file mode 100644
index 0000000..7f3ad41
--- /dev/null
+++ b/amor/data/pics/animated/pingu/faller8.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/floater1.png b/amor/data/pics/animated/pingu/floater1.png
new file mode 100644
index 0000000..ebc4344
--- /dev/null
+++ b/amor/data/pics/animated/pingu/floater1.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/floater2.png b/amor/data/pics/animated/pingu/floater2.png
new file mode 100644
index 0000000..3fbadf6
--- /dev/null
+++ b/amor/data/pics/animated/pingu/floater2.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/floater3.png b/amor/data/pics/animated/pingu/floater3.png
new file mode 100644
index 0000000..f7d3884
--- /dev/null
+++ b/amor/data/pics/animated/pingu/floater3.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/floater4.png b/amor/data/pics/animated/pingu/floater4.png
new file mode 100644
index 0000000..4255147
--- /dev/null
+++ b/amor/data/pics/animated/pingu/floater4.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/floater5.png b/amor/data/pics/animated/pingu/floater5.png
new file mode 100644
index 0000000..1c2de68
--- /dev/null
+++ b/amor/data/pics/animated/pingu/floater5.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/floater6.png b/amor/data/pics/animated/pingu/floater6.png
new file mode 100644
index 0000000..44730d6
--- /dev/null
+++ b/amor/data/pics/animated/pingu/floater6.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/floater7.png b/amor/data/pics/animated/pingu/floater7.png
new file mode 100644
index 0000000..62aa90e
--- /dev/null
+++ b/amor/data/pics/animated/pingu/floater7.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/floater8.png b/amor/data/pics/animated/pingu/floater8.png
new file mode 100644
index 0000000..3418665
--- /dev/null
+++ b/amor/data/pics/animated/pingu/floater8.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/tumble1.png b/amor/data/pics/animated/pingu/tumble1.png
new file mode 100644
index 0000000..1321877
--- /dev/null
+++ b/amor/data/pics/animated/pingu/tumble1.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/tumble2.png b/amor/data/pics/animated/pingu/tumble2.png
new file mode 100644
index 0000000..717862d
--- /dev/null
+++ b/amor/data/pics/animated/pingu/tumble2.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/tumble3.png b/amor/data/pics/animated/pingu/tumble3.png
new file mode 100644
index 0000000..ae093e5
--- /dev/null
+++ b/amor/data/pics/animated/pingu/tumble3.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/tumble4.png b/amor/data/pics/animated/pingu/tumble4.png
new file mode 100644
index 0000000..8ac7e6e
--- /dev/null
+++ b/amor/data/pics/animated/pingu/tumble4.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/tumble5.png b/amor/data/pics/animated/pingu/tumble5.png
new file mode 100644
index 0000000..683872c
--- /dev/null
+++ b/amor/data/pics/animated/pingu/tumble5.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/tumble6.png b/amor/data/pics/animated/pingu/tumble6.png
new file mode 100644
index 0000000..19adfd4
--- /dev/null
+++ b/amor/data/pics/animated/pingu/tumble6.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/tumble7.png b/amor/data/pics/animated/pingu/tumble7.png
new file mode 100644
index 0000000..4e01cb9
--- /dev/null
+++ b/amor/data/pics/animated/pingu/tumble7.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/tumble8.png b/amor/data/pics/animated/pingu/tumble8.png
new file mode 100644
index 0000000..3b8766d
--- /dev/null
+++ b/amor/data/pics/animated/pingu/tumble8.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/walk_l1.png b/amor/data/pics/animated/pingu/walk_l1.png
new file mode 100644
index 0000000..15df071
--- /dev/null
+++ b/amor/data/pics/animated/pingu/walk_l1.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/walk_l2.png b/amor/data/pics/animated/pingu/walk_l2.png
new file mode 100644
index 0000000..9e8c032
--- /dev/null
+++ b/amor/data/pics/animated/pingu/walk_l2.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/walk_l3.png b/amor/data/pics/animated/pingu/walk_l3.png
new file mode 100644
index 0000000..ee92b68
--- /dev/null
+++ b/amor/data/pics/animated/pingu/walk_l3.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/walk_l4.png b/amor/data/pics/animated/pingu/walk_l4.png
new file mode 100644
index 0000000..b8f9b6b
--- /dev/null
+++ b/amor/data/pics/animated/pingu/walk_l4.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/walk_l5.png b/amor/data/pics/animated/pingu/walk_l5.png
new file mode 100644
index 0000000..62358f9
--- /dev/null
+++ b/amor/data/pics/animated/pingu/walk_l5.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/walk_l6.png b/amor/data/pics/animated/pingu/walk_l6.png
new file mode 100644
index 0000000..12838bb
--- /dev/null
+++ b/amor/data/pics/animated/pingu/walk_l6.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/walk_l7.png b/amor/data/pics/animated/pingu/walk_l7.png
new file mode 100644
index 0000000..25f5cdd
--- /dev/null
+++ b/amor/data/pics/animated/pingu/walk_l7.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/walk_l8.png b/amor/data/pics/animated/pingu/walk_l8.png
new file mode 100644
index 0000000..316f46a
--- /dev/null
+++ b/amor/data/pics/animated/pingu/walk_l8.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/walk_r1.png b/amor/data/pics/animated/pingu/walk_r1.png
new file mode 100644
index 0000000..3dd16ca
--- /dev/null
+++ b/amor/data/pics/animated/pingu/walk_r1.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/walk_r2.png b/amor/data/pics/animated/pingu/walk_r2.png
new file mode 100644
index 0000000..ba8f615
--- /dev/null
+++ b/amor/data/pics/animated/pingu/walk_r2.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/walk_r3.png b/amor/data/pics/animated/pingu/walk_r3.png
new file mode 100644
index 0000000..f0fe5a9
--- /dev/null
+++ b/amor/data/pics/animated/pingu/walk_r3.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/walk_r4.png b/amor/data/pics/animated/pingu/walk_r4.png
new file mode 100644
index 0000000..c01875e
--- /dev/null
+++ b/amor/data/pics/animated/pingu/walk_r4.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/walk_r5.png b/amor/data/pics/animated/pingu/walk_r5.png
new file mode 100644
index 0000000..f33fdfd
--- /dev/null
+++ b/amor/data/pics/animated/pingu/walk_r5.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/walk_r6.png b/amor/data/pics/animated/pingu/walk_r6.png
new file mode 100644
index 0000000..dac872b
--- /dev/null
+++ b/amor/data/pics/animated/pingu/walk_r6.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/walk_r7.png b/amor/data/pics/animated/pingu/walk_r7.png
new file mode 100644
index 0000000..5414b6b
--- /dev/null
+++ b/amor/data/pics/animated/pingu/walk_r7.png
Binary files differ
diff --git a/amor/data/pics/animated/pingu/walk_r8.png b/amor/data/pics/animated/pingu/walk_r8.png
new file mode 100644
index 0000000..0ea1009
--- /dev/null
+++ b/amor/data/pics/animated/pingu/walk_r8.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/Makefile.am b/amor/data/pics/animated/tao/Makefile.am
new file mode 100644
index 0000000..babc50e
--- /dev/null
+++ b/amor/data/pics/animated/tao/Makefile.am
@@ -0,0 +1,50 @@
+# Add all your pic files here
+amor_DATA = yy105.png \
+ yy120.png \
+ yy135.png \
+ yy150.png \
+ yy15.png \
+ yy165.png \
+ yy180.png \
+ yy195.png \
+ yy-1.png \
+ yy210.png \
+ yy225.png \
+ yy240.png \
+ yy255.png \
+ yy270.png \
+ yy285.png \
+ yy-2.png \
+ yy300.png \
+ yy30.png \
+ yy315.png \
+ yy330.png \
+ yy345.png \
+ yy-3.png \
+ yy45.png \
+ yy-4.png \
+ yy-5.png \
+ yy60.png \
+ yy-6.png \
+ yy75.png \
+ yy-7.png \
+ yy-8.png \
+ yy90.png \
+ yy-9.png \
+ yy.png \
+ yyx10.png \
+ yyx12.png \
+ yyx14.png \
+ yyx16.png \
+ yyx18.png \
+ yyx20.png \
+ yyx22.png \
+ yyx24.png \
+ yyx26.png \
+ yyx28.png \
+ yyx30.png \
+ yyx6.png \
+ yyx8.png
+
+# This is where it will all be installed
+amordir = $(kde_datadir)/amor/pics/animated/tao
diff --git a/amor/data/pics/animated/tao/yy-1.png b/amor/data/pics/animated/tao/yy-1.png
new file mode 100644
index 0000000..05139a5
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy-1.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy-2.png b/amor/data/pics/animated/tao/yy-2.png
new file mode 100644
index 0000000..491d257
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy-2.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy-3.png b/amor/data/pics/animated/tao/yy-3.png
new file mode 100644
index 0000000..f4fc26e
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy-3.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy-4.png b/amor/data/pics/animated/tao/yy-4.png
new file mode 100644
index 0000000..b7c027d
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy-4.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy-5.png b/amor/data/pics/animated/tao/yy-5.png
new file mode 100644
index 0000000..27881bf
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy-5.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy-6.png b/amor/data/pics/animated/tao/yy-6.png
new file mode 100644
index 0000000..27881bf
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy-6.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy-7.png b/amor/data/pics/animated/tao/yy-7.png
new file mode 100644
index 0000000..c016f9a
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy-7.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy-8.png b/amor/data/pics/animated/tao/yy-8.png
new file mode 100644
index 0000000..38183ed
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy-8.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy-9.png b/amor/data/pics/animated/tao/yy-9.png
new file mode 100644
index 0000000..3ac3d7e
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy-9.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy.png b/amor/data/pics/animated/tao/yy.png
new file mode 100644
index 0000000..e45fb61
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy105.png b/amor/data/pics/animated/tao/yy105.png
new file mode 100644
index 0000000..71b0afe
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy105.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy120.png b/amor/data/pics/animated/tao/yy120.png
new file mode 100644
index 0000000..bd09790
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy120.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy135.png b/amor/data/pics/animated/tao/yy135.png
new file mode 100644
index 0000000..e7e7ddf
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy135.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy15.png b/amor/data/pics/animated/tao/yy15.png
new file mode 100644
index 0000000..2ea9002
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy15.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy150.png b/amor/data/pics/animated/tao/yy150.png
new file mode 100644
index 0000000..adfff96
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy150.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy165.png b/amor/data/pics/animated/tao/yy165.png
new file mode 100644
index 0000000..5d72512
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy165.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy180.png b/amor/data/pics/animated/tao/yy180.png
new file mode 100644
index 0000000..88e3de7
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy180.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy195.png b/amor/data/pics/animated/tao/yy195.png
new file mode 100644
index 0000000..35f0435
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy195.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy210.png b/amor/data/pics/animated/tao/yy210.png
new file mode 100644
index 0000000..c8f2c15
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy210.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy225.png b/amor/data/pics/animated/tao/yy225.png
new file mode 100644
index 0000000..aee2e9d
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy225.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy240.png b/amor/data/pics/animated/tao/yy240.png
new file mode 100644
index 0000000..2f64c2b
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy240.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy255.png b/amor/data/pics/animated/tao/yy255.png
new file mode 100644
index 0000000..bb429c6
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy255.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy270.png b/amor/data/pics/animated/tao/yy270.png
new file mode 100644
index 0000000..c3d9374
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy270.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy285.png b/amor/data/pics/animated/tao/yy285.png
new file mode 100644
index 0000000..cef1f8a
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy285.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy30.png b/amor/data/pics/animated/tao/yy30.png
new file mode 100644
index 0000000..d5ddd3d
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy30.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy300.png b/amor/data/pics/animated/tao/yy300.png
new file mode 100644
index 0000000..649606e
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy300.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy315.png b/amor/data/pics/animated/tao/yy315.png
new file mode 100644
index 0000000..b8136e8
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy315.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy330.png b/amor/data/pics/animated/tao/yy330.png
new file mode 100644
index 0000000..389af9d
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy330.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy345.png b/amor/data/pics/animated/tao/yy345.png
new file mode 100644
index 0000000..7bd415a
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy345.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy45.png b/amor/data/pics/animated/tao/yy45.png
new file mode 100644
index 0000000..aaa845c
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy45.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy60.png b/amor/data/pics/animated/tao/yy60.png
new file mode 100644
index 0000000..ac9925e
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy60.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy75.png b/amor/data/pics/animated/tao/yy75.png
new file mode 100644
index 0000000..92c3387
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy75.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yy90.png b/amor/data/pics/animated/tao/yy90.png
new file mode 100644
index 0000000..483d685
--- /dev/null
+++ b/amor/data/pics/animated/tao/yy90.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yyx10.png b/amor/data/pics/animated/tao/yyx10.png
new file mode 100644
index 0000000..98cf1ab
--- /dev/null
+++ b/amor/data/pics/animated/tao/yyx10.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yyx12.png b/amor/data/pics/animated/tao/yyx12.png
new file mode 100644
index 0000000..49270c5
--- /dev/null
+++ b/amor/data/pics/animated/tao/yyx12.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yyx14.png b/amor/data/pics/animated/tao/yyx14.png
new file mode 100644
index 0000000..2e973f3
--- /dev/null
+++ b/amor/data/pics/animated/tao/yyx14.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yyx16.png b/amor/data/pics/animated/tao/yyx16.png
new file mode 100644
index 0000000..ba025e6
--- /dev/null
+++ b/amor/data/pics/animated/tao/yyx16.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yyx18.png b/amor/data/pics/animated/tao/yyx18.png
new file mode 100644
index 0000000..8983376
--- /dev/null
+++ b/amor/data/pics/animated/tao/yyx18.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yyx20.png b/amor/data/pics/animated/tao/yyx20.png
new file mode 100644
index 0000000..9b1ab5f
--- /dev/null
+++ b/amor/data/pics/animated/tao/yyx20.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yyx22.png b/amor/data/pics/animated/tao/yyx22.png
new file mode 100644
index 0000000..edd897d
--- /dev/null
+++ b/amor/data/pics/animated/tao/yyx22.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yyx24.png b/amor/data/pics/animated/tao/yyx24.png
new file mode 100644
index 0000000..1c618f7
--- /dev/null
+++ b/amor/data/pics/animated/tao/yyx24.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yyx26.png b/amor/data/pics/animated/tao/yyx26.png
new file mode 100644
index 0000000..8d0d045
--- /dev/null
+++ b/amor/data/pics/animated/tao/yyx26.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yyx28.png b/amor/data/pics/animated/tao/yyx28.png
new file mode 100644
index 0000000..037eba8
--- /dev/null
+++ b/amor/data/pics/animated/tao/yyx28.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yyx30.png b/amor/data/pics/animated/tao/yyx30.png
new file mode 100644
index 0000000..337ac30
--- /dev/null
+++ b/amor/data/pics/animated/tao/yyx30.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yyx6.png b/amor/data/pics/animated/tao/yyx6.png
new file mode 100644
index 0000000..5599878
--- /dev/null
+++ b/amor/data/pics/animated/tao/yyx6.png
Binary files differ
diff --git a/amor/data/pics/animated/tao/yyx8.png b/amor/data/pics/animated/tao/yyx8.png
new file mode 100644
index 0000000..9cdf2dc
--- /dev/null
+++ b/amor/data/pics/animated/tao/yyx8.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/Makefile.am b/amor/data/pics/animated/worm/Makefile.am
new file mode 100644
index 0000000..4562e8a
--- /dev/null
+++ b/amor/data/pics/animated/worm/Makefile.am
@@ -0,0 +1,40 @@
+# Add all your pic files here
+amor_DATA = w-a1.png \
+ w-a2.png \
+ w-b1.png \
+ w-b2.png \
+ w-be1.png \
+ w-be2.png \
+ w-be3.png \
+ w-be4.png \
+ w-d1.png \
+ w-d2.png \
+ w-d3.png \
+ w-d4.png \
+ w-d5.png \
+ w-dr1.png \
+ w-e1.png \
+ w-l1.png \
+ w-l2.png \
+ w-l3.png \
+ w-ml0.png \
+ w-ml1.png \
+ w-ml2.png \
+ w-ml3.png \
+ w-mr0.png \
+ w-mr1.png \
+ w-mr2.png \
+ w-mr3.png \
+ w-s1.png \
+ w-s2.png \
+ w-s3.png \
+ w-u1.png \
+ w-u2.png \
+ w-u3.png \
+ w-wl1.png \
+ w-wl2.png \
+ w-wr1.png \
+ w-wr2.png
+
+# This is where it will all be installed
+amordir = $(kde_datadir)/amor/pics/animated/worm
diff --git a/amor/data/pics/animated/worm/w-a1.png b/amor/data/pics/animated/worm/w-a1.png
new file mode 100644
index 0000000..1219075
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-a1.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-a2.png b/amor/data/pics/animated/worm/w-a2.png
new file mode 100644
index 0000000..622a9d5
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-a2.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-b1.png b/amor/data/pics/animated/worm/w-b1.png
new file mode 100644
index 0000000..73f94d9
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-b1.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-b2.png b/amor/data/pics/animated/worm/w-b2.png
new file mode 100644
index 0000000..dea3c97
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-b2.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-be1.png b/amor/data/pics/animated/worm/w-be1.png
new file mode 100644
index 0000000..8cf8940
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-be1.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-be2.png b/amor/data/pics/animated/worm/w-be2.png
new file mode 100644
index 0000000..4d59132
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-be2.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-be3.png b/amor/data/pics/animated/worm/w-be3.png
new file mode 100644
index 0000000..1d85e77
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-be3.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-be4.png b/amor/data/pics/animated/worm/w-be4.png
new file mode 100644
index 0000000..68d225d
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-be4.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-d1.png b/amor/data/pics/animated/worm/w-d1.png
new file mode 100644
index 0000000..b06d547
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-d1.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-d2.png b/amor/data/pics/animated/worm/w-d2.png
new file mode 100644
index 0000000..cea1149
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-d2.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-d3.png b/amor/data/pics/animated/worm/w-d3.png
new file mode 100644
index 0000000..cc70e76
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-d3.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-d4.png b/amor/data/pics/animated/worm/w-d4.png
new file mode 100644
index 0000000..fb98926
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-d4.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-d5.png b/amor/data/pics/animated/worm/w-d5.png
new file mode 100644
index 0000000..368bb09
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-d5.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-dr1.png b/amor/data/pics/animated/worm/w-dr1.png
new file mode 100644
index 0000000..3c80f1f
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-dr1.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-e1.png b/amor/data/pics/animated/worm/w-e1.png
new file mode 100644
index 0000000..529f4b7
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-e1.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-l1.png b/amor/data/pics/animated/worm/w-l1.png
new file mode 100644
index 0000000..cfe128a
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-l1.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-l2.png b/amor/data/pics/animated/worm/w-l2.png
new file mode 100644
index 0000000..bcfb63a
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-l2.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-l3.png b/amor/data/pics/animated/worm/w-l3.png
new file mode 100644
index 0000000..a32d7b6
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-l3.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-ml0.png b/amor/data/pics/animated/worm/w-ml0.png
new file mode 100644
index 0000000..5966eda
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-ml0.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-ml1.png b/amor/data/pics/animated/worm/w-ml1.png
new file mode 100644
index 0000000..19f12d2
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-ml1.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-ml2.png b/amor/data/pics/animated/worm/w-ml2.png
new file mode 100644
index 0000000..6d5cbf9
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-ml2.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-ml3.png b/amor/data/pics/animated/worm/w-ml3.png
new file mode 100644
index 0000000..d476391
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-ml3.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-mr0.png b/amor/data/pics/animated/worm/w-mr0.png
new file mode 100644
index 0000000..196431a
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-mr0.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-mr1.png b/amor/data/pics/animated/worm/w-mr1.png
new file mode 100644
index 0000000..ee9e738
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-mr1.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-mr2.png b/amor/data/pics/animated/worm/w-mr2.png
new file mode 100644
index 0000000..1f1a45e
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-mr2.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-mr3.png b/amor/data/pics/animated/worm/w-mr3.png
new file mode 100644
index 0000000..adbf28e
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-mr3.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-s1.png b/amor/data/pics/animated/worm/w-s1.png
new file mode 100644
index 0000000..4d092fe
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-s1.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-s2.png b/amor/data/pics/animated/worm/w-s2.png
new file mode 100644
index 0000000..49a7915
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-s2.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-s3.png b/amor/data/pics/animated/worm/w-s3.png
new file mode 100644
index 0000000..583e70b
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-s3.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-u1.png b/amor/data/pics/animated/worm/w-u1.png
new file mode 100644
index 0000000..d3d77c2
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-u1.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-u2.png b/amor/data/pics/animated/worm/w-u2.png
new file mode 100644
index 0000000..580bb45
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-u2.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-u3.png b/amor/data/pics/animated/worm/w-u3.png
new file mode 100644
index 0000000..b762397
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-u3.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-wl1.png b/amor/data/pics/animated/worm/w-wl1.png
new file mode 100644
index 0000000..8de3fde
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-wl1.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-wl2.png b/amor/data/pics/animated/worm/w-wl2.png
new file mode 100644
index 0000000..4850cf3
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-wl2.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-wr1.png b/amor/data/pics/animated/worm/w-wr1.png
new file mode 100644
index 0000000..5f1af84
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-wr1.png
Binary files differ
diff --git a/amor/data/pics/animated/worm/w-wr2.png b/amor/data/pics/animated/worm/w-wr2.png
new file mode 100644
index 0000000..5fb349c
--- /dev/null
+++ b/amor/data/pics/animated/worm/w-wr2.png
Binary files differ
diff --git a/amor/data/pics/preview/Makefile.am b/amor/data/pics/preview/Makefile.am
new file mode 100644
index 0000000..fca491d
--- /dev/null
+++ b/amor/data/pics/preview/Makefile.am
@@ -0,0 +1,5 @@
+# Add all your pic files here
+amor_DATA = billy.png bonhomme.png ghost.png neko.png tux.png blob.png bsd.png eyes.png tao.png worm.png
+
+# This is where it will all be installed
+amordir = $(kde_datadir)/amor/pics/preview
diff --git a/amor/data/pics/preview/billy.png b/amor/data/pics/preview/billy.png
new file mode 100644
index 0000000..4bc7035
--- /dev/null
+++ b/amor/data/pics/preview/billy.png
Binary files differ
diff --git a/amor/data/pics/preview/blob.png b/amor/data/pics/preview/blob.png
new file mode 100644
index 0000000..85a0db7
--- /dev/null
+++ b/amor/data/pics/preview/blob.png
Binary files differ
diff --git a/amor/data/pics/preview/bonhomme.png b/amor/data/pics/preview/bonhomme.png
new file mode 100644
index 0000000..db98040
--- /dev/null
+++ b/amor/data/pics/preview/bonhomme.png
Binary files differ
diff --git a/amor/data/pics/preview/bsd.png b/amor/data/pics/preview/bsd.png
new file mode 100644
index 0000000..9cc2086
--- /dev/null
+++ b/amor/data/pics/preview/bsd.png
Binary files differ
diff --git a/amor/data/pics/preview/eyes.png b/amor/data/pics/preview/eyes.png
new file mode 100644
index 0000000..6309988
--- /dev/null
+++ b/amor/data/pics/preview/eyes.png
Binary files differ
diff --git a/amor/data/pics/preview/ghost.png b/amor/data/pics/preview/ghost.png
new file mode 100644
index 0000000..7042e08
--- /dev/null
+++ b/amor/data/pics/preview/ghost.png
Binary files differ
diff --git a/amor/data/pics/preview/neko.png b/amor/data/pics/preview/neko.png
new file mode 100644
index 0000000..bee476c
--- /dev/null
+++ b/amor/data/pics/preview/neko.png
Binary files differ
diff --git a/amor/data/pics/preview/tao.png b/amor/data/pics/preview/tao.png
new file mode 100644
index 0000000..b2d2d3e
--- /dev/null
+++ b/amor/data/pics/preview/tao.png
Binary files differ
diff --git a/amor/data/pics/preview/tux.png b/amor/data/pics/preview/tux.png
new file mode 100644
index 0000000..a196145
--- /dev/null
+++ b/amor/data/pics/preview/tux.png
Binary files differ
diff --git a/amor/data/pics/preview/worm.png b/amor/data/pics/preview/worm.png
new file mode 100644
index 0000000..196431a
--- /dev/null
+++ b/amor/data/pics/preview/worm.png
Binary files differ
diff --git a/amor/data/pics/static/Makefile.am b/amor/data/pics/static/Makefile.am
new file mode 100644
index 0000000..27d7e60
--- /dev/null
+++ b/amor/data/pics/static/Makefile.am
@@ -0,0 +1,5 @@
+# Add all your pic files here
+amor_DATA = billy.png bsd.png tux.png
+
+# This is where it will all be installed
+amordir = $(kde_datadir)/amor/pics/static
diff --git a/amor/data/pics/static/billy.png b/amor/data/pics/static/billy.png
new file mode 100644
index 0000000..89d5d28
--- /dev/null
+++ b/amor/data/pics/static/billy.png
Binary files differ
diff --git a/amor/data/pics/static/bsd.png b/amor/data/pics/static/bsd.png
new file mode 100644
index 0000000..77d3b2a
--- /dev/null
+++ b/amor/data/pics/static/bsd.png
Binary files differ
diff --git a/amor/data/pics/static/tux.png b/amor/data/pics/static/tux.png
new file mode 100644
index 0000000..924c569
--- /dev/null
+++ b/amor/data/pics/static/tux.png
Binary files differ
diff --git a/amor/data/pingurc b/amor/data/pingurc
new file mode 100644
index 0000000..31b8b0e
--- /dev/null
+++ b/amor/data/pingurc
@@ -0,0 +1,167 @@
+# KDE Config File
+[Config]
+PixmapPath=pics/animated/pingu
+Description=Tux
+Description[be]=TукÑ
+Description[bg]=ТъкÑ
+Description[bn]=টাকà§à¦¸
+Description[eo]=Tuĉjo
+Description[he]=טקס
+Description[hi]=टकà¥à¤¸
+Description[lv]=Tuksis
+Description[mk]=Пингвин
+Description[ne]=टकà¥à¤¸
+Description[ru]=ТукÑ
+Description[ta]= Tux
+Description[tg]=ТукÑ
+Description[th]=ตุ๊à¸à¸‹à¹Œ
+Description[tr]=Penguen (Hareketli)
+Description[uz]=Taks
+Description[uz@cyrillic]=ТакÑ
+Description[zh_CN]=Tuxå°ä¼é¹…
+About=By Frank Pieczynski\nBased on graphics of the game "pingus".
+About[af]=Deur Frank Pieczynski\nBased op grafieka van die speletjie "pingus".
+About[ar]=من Ùرانك بيسزينسكي\nمبنية على رسومات لعبة "pingus".
+About[az]=Frank Pieczynski tərəfindən\n"Pingus" oyunu qrafikaları əsasında.
+About[be]=Ðўтар Frank Pieczynski\nЗаÑнавана на графіцы з гульні "pingus".
+About[bg]=Ðвтор Франк ПижинÑки\nБазирано на графика от играта pingus
+About[bn]=তৈরি করেছেন পিসজিনসà§à¦•à¦¿\n"পিঙà§à¦—াস" দলের গà§à¦°à¦¾à¦«à¦¿à¦•à§à¦¸à§‡à¦° ওপর ভিতà§à¦¤à¦¿ করে।
+About[br]=Gant Frank Pieczynski\nDiazezet war ur skeudenn c'hoari « pingus ».
+About[bs]=Autor Frank Pieczynski\nBazirano na slikama iz igre "pingus".
+About[ca]=Per Frank Pieczynski\nBasat en els gràfics del joc "pingus".
+About[cs]=Autor Frank Pieczynski\nNa základě grafiky hry "pingus".
+About[cy]=Gan Frank Pieczynski\nSeiliedig ar raffegau y gêm "pingus".
+About[da]=Af Frank Pieczynski\nBaseret på grafik fra spillet "pingus".
+About[de]=Von Frank Pieczynski\nNach den Graphiken des Spiels "Pingus"
+About[el]=Από τον Frank Pieczynski\n Βασισμένο σε γÏαφικά από το παιχνίδι "pingus".
+About[eo]=De Frank Pieczynski\nbazita sur grafikoj de la ludo "pingus".
+About[es]=Por Frank Pieczynski\nBasado en gráficos del juego «pingus».
+About[et]=Autor: Frank Pieczynski\nAluseks mängu "pingus" graafika.
+About[eu]=Frank Pieczynskik egina\n"pingus" jokoaren irudietan oinarritua.
+About[fa]=وسط Ùرانک پیزینسکی \nبر اساس نگاره‌های بازی «pingus».
+About[fi]=Tehnyt Frank Pieczynski\nPerustuu "pingus" pelin grafiikoihin.
+About[fr]=Par Frank Pieczynski\nBasé sur les graphismes du jeu « pingus ».
+About[ga]=Le Frank Pieczynski\nBunaithe ar ghrafaic an chluiche "pingus".
+About[gl]=Por Frank Pieczynski\nBaseado nos gráficos do xogo "pingus".
+About[he]=מ×ת פרנק פיצינקסי\nמבוסס על הגרפיקה של המשחק "pingus".
+About[hi]=फà¥à¤°à¥‡à¤‚क पाईजेंसà¥à¤•à¥€ दà¥à¤µà¤¾à¤°à¤¾\nखेल "pingus" के चितà¥à¤°à¥‹à¤‚ पर आधारित.
+About[hr]=Autor: Frank Pieczynski\nZasnovano na grafici iz igre "pingus".
+About[hu]=Készítette: Frank Pieczynski\nA grafika a "Pingus" nevű játékból származik.
+About[is]=By Frank Pieczynski\nByggt á myndefni úr leiknum "pingus".
+About[it]=Di Frank Pieczynski.\nBasato sulla grafica del gioco "pingus".
+About[ja]=By Frank Pieczynski\nゲーム "pingus" ã®ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã«åŸºã¥ã
+About[km]=ដោយ Frank Pieczynski\nផ្អែកលើ​ក្រាហ្វិក​ល្បែង "pingus" ។
+About[lt]=Darė Frank Pieczynski\nPagal „pingus“ žaidimo grafiką.
+About[lv]=Autors - Frank Pieczynski\nBÄzÄ“ts uz spÄ“les "pingus" grafiskÄs idejas.
+About[mk]=Од Frank Pieczynski\nБазирано на графиката од играта „pingus“.
+About[mt]=Ta' Frank Pieczynski\nIbażat fuq grafika tal-logħba "pingus".
+About[nb]=Av Frank Pieczynski\nBasert på bilde fra spillet «pingus».
+About[nds]=Vun Frank Pieczynski\nBuut op Biller vun dat Speel "pingus".
+About[ne]=फà¥à¤°à¥â€Œà¤¯à¤¾à¤™à¥à¤• पाइसà¥à¤œà¤¿à¤¨à¥à¤•à¤¿à¤¦à¥à¤µà¤¾à¤°à¤¾\nखेल "pingus"को गà¥à¤°à¤¾à¤«à¤¿à¤•à¤¹à¤°à¥‚मा आधारित
+About[nl]=Door Frank Pieczynski\nGebaseerd op illustraties uit het spel "pingus".
+About[nn]=Av Frank Pieczynski\nBasert på grafikk frå spelet "pingus".
+About[pl]=Autorstwa Franka Pieczynskiego\nNa podstawie grafiki z gry "pingus".
+About[pt]=De Frank Pieczynski\nBaseado numa imagem do jogo "pingus".
+About[pt_BR]=Por Frank Pieczynski\nBaseado nos gráficos do jogo "pingus".
+About[ro]=De Frank Pieczynski\nBazat pe grafica jocului "pingus".
+About[ru]=Ðвтор - Frank Pieczynski\nÐа оÑнове графики игры "pingus".
+About[sk]=Vytvoril Frank Pieczynski\nZaložené na grafike z hry "pingus".
+About[sl]=Od Franka Pieczynskega\nTemelji na grafiki igre "pingus".
+About[sr]=Од Френка ПјечинÑког (Frank Pieczynski)\нБазирано на графици игре Pingus.
+About[sr@Latn]=Od Frenka PjeÄinskog (Frank Pieczynski)\nBazirano na grafici igre Pingus.
+About[sv]=Av Frank Pieczynski\nBaserad på grafik från spelet "Pingus"
+About[ta]=பிரானà¯à®•à¯ பிஸà¯à®šà®¿à®•à®¿ \nஅசைவà¯à®Ÿà¯à®Ÿ விளையாடà¯à®Ÿà¯ " பினà¯à®•à®¸à¯" லை பறà¯à®±à®¿à®¯à®¤à¯.
+About[tg]=Франки ПикзунÑкий\nТаÑвирҳои бозии "pingus".
+About[th]=โดย Frank Pieczynski\nโดยใช้พื้นà¸à¸²à¸™à¸à¸£à¸²à¸Ÿà¸´à¸à¸ˆà¸²à¸à¹€à¸à¸¡ "pingus"
+About[tr]=Frank Pieczynski\nPingus oyunundan esinlenilmiÅŸtir.
+About[uk]=Ðвтор: Frank Pieczynski\nПобудовано з графіки Ð´Ð»Ñ Ð³Ñ€Ð¸ "pingus".
+About[uz]=Frank Pissinski (Frank Pieczynski) yaratgan\nPingus oʻyinining grafikasida asoslangan.
+About[uz@cyrillic]=Франк ПиÑцинÑки (Frank Pieczynski) Ñратган\nPingus ўйинининг графикаÑида аÑоÑланган.
+About[ven]=Nga Frank Pieczynski\nZwo di sendeka nga girafu ya mutambo "pingus".
+About[xh]=Ngu Frank Pieczynski\nyamelene nemizobo yomdlalo "pingus".
+About[zh_CN]=作者:Frank Pieczynski\n基于“pingusâ€æ¸¸æˆä¸­çš„图形。
+About[zu]=Ngu Frank Pieczynski\nIsekelwe emidwebeni yomdlalo "pingus".
+Icon=../../preview/tux.png
+Base=Base
+Sequences=WalkLeft,WalkRight,Float,Tumble,Dig,BashLeft,BashRight
+Focus=FallUp
+Blur=FallDown
+Destroy=Bomb
+
+[Base]
+Sequence=blocker1.png,blocker2.png,blocker3.png,blocker4.png,blocker5.png,blocker6.png,blocker1.png,blocker2.png,blocker3.png,blocker4.png,blocker5.png,blocker6.png
+Movement=0,0,0,0,0,0,0,0,0,0,0,0
+Delay=200,200,1000,200,200,200,200,200,1000,200,200,200
+HotspotX=16,16,16,16,16,16,16,16,16,16,16,16
+HotspotY=32,32,32,32,32,32,32,32,32,32,32,32
+
+[Float]
+Sequence=floater1.png,floater2.png,floater3.png,floater4.png,floater5.png,floater6.png,floater7.png,floater8.png
+Movement=2,2,2,2,2,2,2,2
+Delay=200,200,200,200,200,200,200,200
+HotspotX=16,16,16,16,16,16,16,16
+HotspotY=32,40,50,60,60,50,40,32
+
+[FallDown]
+Sequence=faller1.png,faller2.png,faller3.png,faller4.png,faller5.png,faller6.png,faller7.png,faller8.png
+Movement=0,0,0,0,0,0,0,0
+Delay=200,200,200,200,200,200,200,200
+HotspotX=16,16,16,16,16,16,16,16
+HotspotY=20,10,-10,-50,-130,-300,-500,-750
+#HotspotY=32,20,0,-20,-50,-80,-120,-160
+
+[FallUp]
+Sequence=faller1.png,faller2.png,faller3.png,faller4.png,faller5.png,faller6.png,faller7.png,faller8.png
+Movement=0,0,0,0,0,0,0,0
+Delay=100,100,100,100,100,100,100,100
+HotspotX=16,16,16,16,16,16,16,16
+HotspotY=750,500,250,150,100,75,50,40
+
+[Tumble]
+Sequence=tumble1.png,tumble2.png,tumble3.png,tumble4.png,tumble5.png,tumble6.png,tumble7.png,tumble8.png
+Movement=0,0,0,0,0,0,0,0
+Delay=200,200,200,200,200,200,200,200
+HotspotX=16,16,16,16,16,16,16,16
+HotspotY=32,32,32,32,32,32,32,32
+
+[WalkLeft]
+Sequence=walk_l1.png,walk_l2.png,walk_l3.png,walk_l4.png,walk_l5.png,walk_l6.png,walk_l7.png,walk_l8.png
+Movement=-4,-4,-4,-4,-4,-4,-4,-4
+Delay=300,300,300,300,300,300,300,300
+HotspotX=16,16,16,16,16,16,16,16
+HotspotY=32,32,32,32,32,32,32,32
+
+[WalkRight]
+Sequence=walk_r1.png,walk_r2.png,walk_r3.png,walk_r4.png,walk_r5.png,walk_r6.png,walk_r7.png,walk_r8.png
+Movement=4,4,4,4,4,4,4,4
+Delay=300,300,300,300,300,300,300,300
+HotspotX=16,16,16,16,16,16,16,16
+HotspotY=32,32,32,32,32,32,32,32
+
+[BashLeft]
+Sequence=bash_l1.png,bash_l2.png,bash_l3.png,bash_l4.png,bash_l5.png,bash_l6.png,bash_l7.png,bash_l8.png,bash_l9.png,bash_l10.png,bash_l11.png,bash_l12.png
+Movement=-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8
+Delay=200,200,200,200,200,200,200,200,200,200,200,200
+HotspotX=16,16,16,16,16,16,16,16,16,16,16,16
+HotspotY=32,32,32,32,32,32,32,32,32,32,32,32
+
+[BashRight]
+Sequence=bash_r1.png,bash_r2.png,bash_r3.png,bash_r4.png,bash_r5.png,bash_r6.png,bash_r7.png,bash_r8.png,bash_r9.png,bash_r10.png,bash_r11.png,bash_r12.png
+Movement=8,8,8,8,8,8,8,8,8,8,8,8
+Delay=200,200,200,200,200,200,200,200,200,200,200,200
+HotspotX=16,16,16,16,16,16,16,16,16,16,16,16
+HotspotY=32,32,32,32,32,32,32,32,32,32,32,32
+
+[Bomb]
+Sequence=bomber1.png,bomber2.png,bomber3.png,bomber4.png,bomber5.png,bomber6.png,bomber7.png,bomber8.png,bomber9.png,bomber10.png,bomber11.png,bomber12.png,bomber13.png,bomber14.png,bomber15.png,bomber16.png
+Movement=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+Delay=100,100,100,100,100,100,100,100,100,100,100,200,200,200,200,200
+HotspotX=16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+HotspotY=32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32
+
+[Dig]
+Sequence=digger1.png,digger2.png,digger3.png,digger4.png,digger5.png,digger6.png,digger7.png,digger8.png,digger9.png,digger10.png,digger11.png,digger12.png,digger13.png,digger14.png
+Movement=0,0,0,0,0,0,0,0,0,0,0,0,0,0
+Delay=200,200,200,200,200,200,200,200,200,200,200,200,200,200
+HotspotX=16,16,16,16,16,16,16,16,16,16,16,16,16,16
+HotspotY=32,32,32,32,32,32,32,32,32,32,32,32,32,32
diff --git a/amor/data/taorc b/amor/data/taorc
new file mode 100644
index 0000000..5e6b13a
--- /dev/null
+++ b/amor/data/taorc
@@ -0,0 +1,148 @@
+# KDE Config File
+[Config]
+PixmapPath=pics/animated/tao
+Description=Tao
+Description[be]=Дао
+Description[bg]=Тао
+Description[bn]=তাও
+Description[he]=ט×ו
+Description[hi]=ताओ
+Description[mk]=Тао
+Description[ne]=टाओ
+Description[ru]=Дао
+Description[sr]=Тао
+Description[ta]= Tao
+Description[th]=เต๋า
+Description[uz@cyrillic]=Тао
+Description[zh_CN]=é“
+About=By Daniel Pfeiffer <occitan@esperanto.org>\nYin Yang symbol inspired by my Tai Chi practice.
+About[af]=Deur Daniel Pfeiffer <occitan@esperanto.org>\nYin Yang simbool geïnspireer Deur my Tai Chi oefening.
+About[ar]=تألي٠Daniel Pfeiffer <occitan@esperanto.org>\nرموز الين و اليان من ممارستي للتاي شي.
+About[az]=Daniel Pfeiffer <occitan@esperanto.org> tərəfindən\nYin Yang symbol inspired by my Tai Chi practice.
+About[be]=Ðўтар Daniel Pfeiffer <occitan@esperanto.org>\nYin Yang symbol inspired by my Tai Chi practice.
+About[bg]=Ðвтор Даниел Пфайфар <occitan@esperanto.org>\nИдеÑта за Ñимвола идва от хобито на автора
+About[bn]=তৈরি করেছেন ডà§à¦¯à¦¾à¦¨à¦¿à§Ÿà§‡à¦² ফেইফার <occitan@esperanto.org>\nইন ইয়াং পà§à¦°à¦¤à§€à¦•à§‡à¦° অনà§à¦ªà§à¦°à§‡à¦°à¦£à¦¾ পেয়েছি আমার তাই চি অনà§à¦¶à§€à¦²à¦¨ থেকে।
+About[br]=Gant Daniel Pfeiffer <occitan@esperanto.org>\nArouez Yin Yang a zo awenet gant pleustr Tai Chi.
+About[bs]=Autor Daniel Pfeiffer <occitan@esperanto.org>\nYin Yang simbol inspirisan mojim prakticiranjem Tai Chi.
+About[ca]=Per Daniel Pfeiffer <occitan@esperanto.org>\nEl símbol del Yin Yang s'ha inspirat en la meva pràctica del Tai Chi.
+About[cs]=Autor Daniel Pfeiffer <occitan@esperanto.org>\nYin Yang symbol inspirován mým cviÄením TaiÄi
+About[cy]=Gan Daniel Pfeiffer <occitan@esperanto.org>\n Ysbrydolwyd y symbol Yin Yang gan fy ymarfer Tai Chi.
+About[da]=Af Daniel Pfeiffer <occitan@esperanto.org>\nYin Yang-symbol inspireret fra mine Tai Chi-øvelser.
+About[de]=Von Daniel Pfeiffer <occitan@esperanto.org>\nYin-Yang-Symbol inspiriert durch meine Tai-Chi-Ãœbungen
+About[el]=Από τον Daniel Pfeiffer <occitan@esperanto.org>\n Το σÏμβολο Yin Yang εμπνευσμένο από την Ï€Ïακτική μου στο Tai Chi.
+About[eo]=De Daniel Pfeiffer <occitan@esperanto.org>\nJinjan-simbolo inspirita de mia TajÄi-praktikado.
+About[es]=Por Daniel Pfeiffer <occitan@esperanto.org>\nSímbolo del Yin Yang, inspirado en mi práctica de Tai Chi.
+About[et]=Autor: Daniel Pfeiffer <occitan@esperanto.org>\nYin-yangi sümbol jäi mulle külge taiji harrastusest.
+About[eu]=Daniel Pfeiffer egina <occitan@esperanto.org>\nYin Yang simboloa nire Tai Chi praktikan oinarritua.
+About[fa]=توسط دنیل ÙÛŒÙر <occitan@esperanto.org>\n نماد الهام گرÙته توسط یینیانگ تمرین تای Ú†ÛŒ من
+About[fi]=Tehnyt Daniel Pfeiffer <occitan@esperanto.org>\nYin Yang symbolin inspiroinut Tai Chi -harjoitukseni.
+About[fr]=Par Daniel Pfeiffer <occitan@esperanto.org>\nLe symbole Yin Yang est inspiré par ma pratique du Tai Chi.
+About[ga]=Le Daniel Pfeiffer <occitan@esperanto.org>\nSiombail Yin Yang spreagtha ag mo chleachtadh Tai Chi.
+About[gl]=Por Daniel Pfeiffer <occitan@esperanto.org>\nO símbolo do Yin-Yang inspirado na miña prática do Tai Chi.
+About[he]=מ×ת דני×ל פפר <occitan@esperanto.org>\nההשר××” לסמל היין-×™×× ×’ נלקחה מ×ימוני הט××™ צ'×™ שלי.
+About[hi]=डेनियल फीफ़र दà¥à¤µà¤¾à¤°à¤¾ <occitan@esperanto.org>\nयिन यांग चिहà¥à¤¨ मेरे ताई-ची अभà¥à¤¯à¤¾à¤¸ से पà¥à¤°à¥‡à¤°à¤¿à¤¤
+About[hr]=Daniel Pfeiffer <occitan@esperanto.org>\n"Znak 'Yin Yang' inspiriralo je moje vježbanje Tai Chia."
+About[hu]=Készítette: Daniel Pfeiffer (<occitan@esperanto.org>)\nA 'Yin Yang' szimbólumot saját Tai Chi gyakorlataimból merítettem.
+About[is]=By Daniel Pfeiffer <occitan@esperanto.org>\nYin Yang merkið kom til af áhuga mínum á Tai Chi.
+About[it]=Di Daniel Pfeiffer <occitan@esperanto.org>\nSimbolo Yin Yang ispirato alla mia pratica Tai Chi.
+About[ja]=By Daniel Pfeiffer <occitan@esperanto.org>\n太極拳ã®ç·´ç¿’ã‹ã‚‰ç™ºæƒ³ã‚’å¾—ãŸé™°é™½ã‚·ãƒ³ãƒœãƒ«
+About[km]=ដោយ Daniel Pfeiffer <occitan@esperanto.org>\nនិមិážáŸ’ážâ€‹ážŸáž‰áŸ’ញាយីងយ៉ាង(Yin Yang) ដែលបង្កើážâ€‹áž¡áž¾áž„ដោយការអនុវážáŸ’ážážáž¶áž™ážˆáž¸ (Tai Chi) របស់​ážáŸ’ញុំ ។
+About[lt]=Darė Daniel Pfeiffer <occitan@esperanto.org>\nYin Yang simbolį įkvėpė mano Tai Chi praktika.
+About[lv]=Autors - Daniel Pfeiffer <occitan@esperanto.org>\nIņ Jaņ motÄ«vu inspirÄcija no personÄ«gÄs Tai Chi praktizÄ“Å¡anas.
+About[mk]=Од Даниел Фајфер <occitan@esperanto.org>\nСимболот Јин-Јанг е инÑпириран од моето вежбање на Тај Чи.
+About[mt]=Ta' Daniel Pfeiffer <occitan@esperanto.org>\nSimbolu Yin Yang ispirat mil-prattika tiegħi tat-Tai Chi.
+About[nb]=Av Daniel Pfeiffer <occitan@esperanto.org>\nYin Yang symbolet er inspirert av mine Tai Chi-øvelser.
+About[nds]=Vun Daniel Pfeiffer <occitan@esperanto.org>\n"Yin un Yang"-Symbool, anreegt dör mien Tai-Chi-Öven.
+About[ne]=डानियल फेइफरदà¥à¤µà¤¾à¤°à¤¾ <occitan@esperanto.org>\nमेरो टाइ चि अभà¥à¤¯à¤¾à¤¸à¤¦à¥à¤µà¤¾à¤°à¤¾ यिङॠयाङॠपà¥à¤°à¥‡à¤°à¤£à¤¾ गरीà¤à¤•à¥‹ पà¥à¤°à¤¤à¤¿à¤•à¥¤
+About[nl]=Door Daniel Pfeiffer <occitan@esperanto.org>\nYin Yang-symbool geïnspireerd door mijn Tai Chi-ervaring.
+About[nn]=Av Daniel Pfeiffer <occitan@esperanto.org>\nYin Yang-symbolet er inspirert av Tai Chi-erfaringa mi.
+About[pl]=Autorstwa Daniela Pfeiffera <occitan@esperanto.org>\nYin Symbol Yang inspirowany przez mojÄ… praktykÄ™ Tai Chi.
+About[pt]=De Daniel Pfeiffer <occitan@esperanto.org>\nSímbolo do Yin Yang inspirado na minha prática de Tai Chi.
+About[pt_BR]=Por Daniel Pfeiffer <occitan@esperanto.org>\nSímbolo Yin Yang inspirado em minha prática de Tai Chi.
+About[ro]=De Daniel Pfeiffer <occitan@esperanto.org>\nSimbol Yin Yang inspirat de practica Tai Chi.
+About[ru]=Ðвтор - Daniel Pfeiffer <occitan@esperanto.org>\nСимвол инь-Ñн взÑÑ‚ из моей практики тайцзи.
+About[sk]=Vytvoril Daniel Pfeiffer <occitan@esperanto.org>\nSymbol Yin Yang inšpirovaný mojou skúsenosťou s Tai Chi.
+About[sl]=Od Daniela Pfeifferja <occitan@esperanto.org>\nZa simbol jin-jang sem dobil navdih pri vadbi tai chija.
+About[sr]=Од Данијела Фајфера (Daniel Pfeiffer) <occitan@esperanto.org>\nСимбол Јинга и Јанга инÑпириÑан мојом тај-чи вежбом.
+About[sr@Latn]=Od Danijela Fajfera (Daniel Pfeiffer) <occitan@esperanto.org>\nSimbol Jinga i Janga inspirisan mojom taj-Äi vežbom.
+About[sv]=Av Daniel Pfeiffer <occitan@esperanto.org>\nYin Yang symbol inspirerad av att utöva Tai Chi
+About[tg]=Даниел Пфейфиффер <occitan@esperanto.org>\ТаÑвирҳо аз машқи Tai Chi
+About[th]=โดย Daniel Pfeiffer <occitan@esperanto.org>\nสัà¸à¸¥à¸±à¸à¸©à¸“์ หยิน-หยาง จาà¸à¹à¸šà¸šà¸à¸¶à¸ Tai Chi ของผม
+About[tr]=Daniel Pfeiffer <occitan@esperanto.org>\nYin Yang sembolü Tai Chi'den esinlenilmiştir.
+About[uk]=Ðвтор: Daniel Pfeiffer <occitan@esperanto.org>\nСимвол Yin Yang від Ð½Ð°Ñ‚Ñ…Ð½ÐµÐ½Ð½Ñ Ð· моєї практики Tai Chi.
+About[ven]=Nga Daniel Pfeiffer <occitan@esperanto.org>\nYin Yang zwiga zwo tutuwedzhwa nga nga ndowendowe yanga ya Tai Chi.
+About[xh]=By Daniel Pfeiffer <occitan@esperanto.org>\nYin Yang iphawu ikhuthaziswe luqheliso lwam lwe Tai Chi.
+About[zh_CN]=作者:Daniel Pfeiffer <occitan@esperanto.org>\n我从太æžé”»ç‚¼ä¸­å¾—到çµæ„Ÿçš„阴阳符å·ã€‚
+About[zu]=Ngu Daniel Pfeiffer <occitan@esperanto.org>\nUphawu lwe-Yin Yang olugqugquzelwe ukwenza kwami i-Tai Chi.
+Icon=../../preview/tao.png
+Base=Base
+Sequences=Left,Right,Turn
+Focus=Grow
+Blur=Shrink
+Sleep=Hide
+Wake=Unhide
+Destroy=Fall
+
+[Base]
+Sequence=yy.png
+Movement=0
+Delay=2000
+HotspotX=0
+HotspotY=32
+
+[Left]
+Sequence=yy.png,yy.png,yy.png,yy.png,yy.png,yy.png,yy.png,yy.png,yy.png,yy.png,yy.png,yy.png,yy.png,yy.png,yy.png,yy.png,yy.png,yy.png,yy.png,yy.png,yy.png,yy.png,yy.png
+Movement=-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2
+Delay=200,190,180,170,160,150,150,150,150,150,150,150,150,150,150,150,150,150,150,160,170,180,190,200
+HotspotX=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+HotspotY=32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32
+
+[Right]
+Sequence=yy15.png,yy30.png,yy45.png,yy60.png,yy75.png,yy90.png,yy105.png,yy120.png,yy135.png,yy150.png,yy165.png,yy180.png,yy195.png,yy210.png,yy225.png,yy240.png,yy255.png,yy270.png,yy285.png,yy300.png,yy315.png,yy330.png,yy345.png,yy.png
+Movement=2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
+Delay=200,190,180,170,160,150,150,150,150,150,150,150,150,150,150,150,150,150,150,160,170,180,190,200
+HotspotX=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+HotspotY=32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32
+
+[Turn]
+Sequence=yy.png,yy15.png,yy30.png,yy45.png,yy60.png,yy75.png,yy90.png,yy105.png,yy120.png,yy135.png,yy150.png,yy165.png,yy180.png,yy195.png,yy210.png,yy225.png,yy240.png,yy255.png,yy270.png,yy285.png,yy300.png,yy315.png,yy330.png,yy345.png
+Movement=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+Delay=200,190,180,170,160,150,150,150,150,150,150,150,150,150,150,150,150,150,150,160,170,180,190,200
+HotspotX=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+HotspotY=32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32
+
+[Grow]
+Sequence=yyx6.png,yyx8.png,yyx10.png,yyx12.png,yyx14.png,yyx16.png,yyx18.png,yyx20.png,yyx22.png,yyx24.png,yyx26.png,yyx28.png,yyx30.png
+Movement=0,0,0,0,0,0,0,0,0,0,0,0,0
+Delay=150,150,150,150,150,150,150,150,150,150,150,150,150
+HotspotX=-13,-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1
+HotspotY=6,8,10,12,14,16,18,20,22,24,26,28,30
+
+[Shrink]
+Sequence=yyx30.png,yyx28.png,yyx26.png,yyx24.png,yyx22.png,yyx20.png,yyx18.png,yyx16.png,yyx14.png,yyx12.png,yyx10.png,yyx8.png,yyx6.png
+Movement=0,0,0,0,0,0,0,0,0,0,0,0,0
+Delay=150,150,150,150,150,150,150,150,150,150,150,150,150
+HotspotX=-1,-2,-3,-4,-5,-6,-7,-8,-9,-10,-11,-12,-13
+HotspotY=30,28,26,24,22,20,18,16,14,12,10,8,6
+
+[Hide]
+Sequence=yy-1.png,yy-2.png,yy-3.png,yy-4.png,yy-5.png,yy-6.png,yy-7.png,yy-8.png,yy-9.png
+Movement=0,0,0,0,0,0,0,0,0
+Delay=150,150,150,150,150,150,150,150,60000
+HotspotX=0,0,0,0,0,0,0,0,0
+HotspotY=31,30,29,28,27,26,25,24,23
+
+[Unhide]
+Sequence=yy-9.png,yy-8.png,yy-7.png,yy-6.png,yy-5.png,yy-4.png,yy-3.png,yy-2.png,yy-1.png
+Movement=0,0,0,0,0,0,0,0,0
+Delay=150,150,150,150,150,150,150,150,150
+HotspotX=0,0,0,0,0,0,0,0,0
+HotspotY=23,24,25,26,27,28,29,30,31
+
+[Fall]
+Sequence=yy15.png,yy30.png,yy45.png,yy60.png,yy75.png,yy90.png,yy105.png,yy120.png,yy135.png,yy150.png,yy165.png,yy180.png,yy195.png,yy210.png,yy225.png,yy240.png,yy255.png,yy270.png,yy285.png,yy300.png,yy315.png,yy330.png,yy345.png,yy.png,yy15.png,yy30.png
+Movement=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+Delay=100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100
+HotspotX=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+HotspotY=31,29,27,25,22,19,15,10,4,-3,-11,-21,-33,-47,-64,-85,-110,-140,-176,-219,-271,-333,-407,-496,-603,-731
+
diff --git a/amor/data/tips-en b/amor/data/tips-en
new file mode 100644
index 0000000..6f7fb5f
--- /dev/null
+++ b/amor/data/tips-en
@@ -0,0 +1,39 @@
+Don't run with scissors.
+%
+Never trust car salesmen or politicians.
+%
+Real programmers don't comment their code. It was hard to write, it should be hard to understand.
+%
+It is much easier to suggest solutions when you know nothing about the problem.
+%
+You can never have too much memory or disk space.
+%
+The answer is 42.
+%
+It's not a bug. It's a misfeature.
+%
+Help stamp out and abolish redundancy.
+%
+To maximize a window vertically, click the maximize button with the middle mouse button.
+%
+You can use Alt+Tab to switch between applications.
+%
+Press Ctrl+Esc to show the applications running in your current session.
+%
+Alt+F2 displays a small window that you can type a command into.
+%
+Ctrl+F1 to Ctrl+F8 can be used to switch virtual desktops.
+%
+You can move buttons on the panel using the middle mouse button.
+%
+Alt+F1 pops-up the system menu.
+%
+Ctrl+Alt+Esc can be used to kill an application that has stopped responding.
+%
+If you leave KDE applications open when you logout, they will be restarted automatically when you log back in.
+%
+The KDE file manager is also a web browser and an FTP client.
+%
+Applications can display messages and tips in an Amor bubble using the showMessage() and
+showTip() DCOP calls
+% \ No newline at end of file
diff --git a/amor/data/tuxrc b/amor/data/tuxrc
new file mode 100644
index 0000000..e9854ed
--- /dev/null
+++ b/amor/data/tuxrc
@@ -0,0 +1,127 @@
+# KDE Config File
+[Config]
+PixmapPath=pics/static
+Static=true
+Description=Unanimated Tux
+Description[af]=Ongeanimeerde Tux
+Description[ar]=Tux غير متحرك
+Description[be]=Ðеанімаваны ТукÑ
+Description[bg]=Ðеанимиран ТъкÑ
+Description[bn]=অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à¦¬à¦¿à¦¹à§€à¦¨ টাকà§à¦¸
+Description[bs]=Neanimirani Tux
+Description[ca]=Tux sense animació
+Description[cs]=Neanimovaný Tux
+Description[cy]=Tux heb ei animeddio
+Description[da]=Uanimeret Tux
+Description[de]=Tux (nicht animiert)
+Description[el]=Μη κινοÏμενος Tux
+Description[eo]=NemoviÄema Tuĉjo
+Description[es]=Tux inanimado
+Description[et]=Liikumatu Tux
+Description[eu]=Tux animabakoa
+Description[fa]=Tux غیر پویا
+Description[fi]=Animoimaton Tux
+Description[fr]=Tux (in)animé
+Description[ga]=Tux neamhbheoite
+Description[gl]=Tux Inanimado
+Description[he]=טקס ×œ×œ× ×”× ×¤×©×”
+Description[hi]=सà¥à¤¥à¤¿à¤° टकà¥à¤¸
+Description[hr]=StatiÄki Tux
+Description[hu]=nem animált Tux
+Description[is]=Hreyfingalaus Tux
+Description[it]=Tux immobile
+Description[ja]=å‹•ã‹ãªã„ Tux
+Description[km]=Tux គ្មាន​ចលនា
+Description[ko]=움ì§ì´ì§€ 않는 턱스
+Description[lt]=Nejudantis Tux
+Description[lv]=Neanimēts Tuksis
+Description[mk]=Ðеанимиран пингвин
+Description[nb]=Stillestående Tux
+Description[nds]=Tux (nich animeert)
+Description[ne]=à¤à¤¨à¤¿à¤®à¥‡à¤Ÿ नगरिà¤à¤•à¥‹ टकà¥à¤¸
+Description[nl]=Statische Tux
+Description[nn]=Stilleståande Tux
+Description[pl]=Nieanimowany Tux
+Description[pt]=Tux não-animado
+Description[pt_BR]=Tux Inanimado
+Description[ro]=Tux neanimat
+Description[ru]=Статичный ТукÑ
+Description[sk]=Neanimovaný Tux
+Description[sl]=Neanimiran Tux
+Description[sr]=Ðеанимирани Tux
+Description[sr@Latn]=Neanimirani Tux
+Description[sv]=Tux utan animering
+Description[tg]=ТукÑи оддӣ
+Description[th]=ตุ๊à¸à¸‹à¹Œà¸—ี่เคลื่อนไหวไม่ได้
+Description[tr]=Haraketsiz Penguen
+Description[uk]=Ðеоживлений Tux
+Description[uz]=Animatsiyasiz Taks
+Description[uz@cyrillic]=ÐнимациÑÑиз ТакÑ
+Description[ven]=Tux i songo itwaho zwazwipuka
+Description[xh]=Okungaphiliswanga Tux
+Description[zh_CN]=没有动画的 Tux å°ä¼é¹…
+Description[zh_TW]=ä¸å‹•çš„ Tux
+About=Static window sitter
+About[af]=Statiese venster sitter
+About[ar]=قاعد النواÙØ° الساكنة
+About[az]=Statik pəncərə mürəbbiyəsi
+About[be]=Статычны наглÑдчык вокнаў
+About[bg]=Ðеанимирано дÑволче
+About[bn]=উইনà§à¦¡à§‹à¦° à¦à¦• সà§à¦¥à¦¾à¦¨à§‡ সà§à¦¥à¦¿à¦° হয়ে বসে থাকে
+About[bs]=StatiÄki window sitter
+About[ca]=Model estàtic de finestra
+About[cs]=Statická ozdoba okna
+About[cy]=Gwarchodydd ffenest sefydlog
+About[da]=Statisk vinduessitter
+About[de]=Statischer Fenstersitzer
+About[el]=Στατικό εικονίδιο
+About[eo]=MoviÄema fenestrosidulo
+About[es]=Cuidador estático de ventanas
+About[et]=Liikumatu aknahoidja
+About[eu]=Lehio modelo egonkorra
+About[fa]=مدل پنجرۀ ایستا
+About[fi]=Staattinen ikkunallaistuja
+About[fr]=Surveillant statique de fenêtres
+About[ga]=Peata statach fuinneoige
+About[gl]=Vixiante estático de fiestras
+About[he]=שומר חלון סטטי
+About[hi]=सà¥à¤¥à¤¿à¤° विंडो सिटर
+About[hr]=StatiÄki sjedaÄ na prozoru
+About[hu]=Nem animált ablakdíszítés
+About[is]=Situr og passar glugga
+About[it]=Immagine statica
+About[ja]=å‹•ã‹ãªã„ウィンドウ監視人
+About[km]=អ្នក​ážáŸ‚ទាំ​បង្អួចឋិážáž·ážœáž“្áž
+About[lt]=Nejudantis sÄ—dÄ—tojas ant lango
+About[lv]=Statisks uz loga sÄ“dÄ“tÄjs
+About[mk]=Статичен Ñедач врз прозорци
+About[mt]=Stampa statika
+About[nb]=Statisk vindusitter
+About[nds]=Fast Finstersitter
+About[ne]=सà¥à¤¥à¤¿à¤° सञà¥à¤à¥à¤¯à¤¾à¤² सिटर
+About[nl]=Statische vensterzitter
+About[nn]=Statisk vindaugssitjar
+About[pl]=Stale w tym samym miejscu
+About[pt]=Elemento estático pousado sobre as janelas
+About[pt_BR]=Janela Estática
+About[ro]=Imagine statică
+About[ru]=Статичный Ñторож окон
+About[sk]=Statická ozdoba okna
+About[sl]=StatiÄno okno
+About[sr]=Статични Ñедач на прозору
+About[sr@Latn]=StatiÄni sedaÄ na prozoru
+About[sv]=Statisk fönstervakt
+About[ta]= நிலையான சாளரம௠அமரà¯à®¤à®²à¯
+About[tg]=Ðигаҳбонии Ñтатикии тиреза
+About[th]=นั่งเล่นบนหน้าต่าง
+About[tr]=Statik pencere bakıcı
+About[uk]=Статична прикраÑа Ð´Ð»Ñ Ð²Ñ–ÐºÐ½Ð°
+About[ven]=Tshidzuli tsha window yo imaho
+About[zh_CN]=窗å£é™å者
+Icon=../preview/tux.png
+
+[Base]
+Sequence=tux.png
+HotspotX=25
+HotspotY=54
+
diff --git a/amor/data/wormrc b/amor/data/wormrc
new file mode 100644
index 0000000..c662675
--- /dev/null
+++ b/amor/data/wormrc
@@ -0,0 +1,225 @@
+# KDE Config File
+[Config]
+PixmapPath=pics/animated/worm
+Description=Little Worm
+Description[af]=Klein Wurm
+Description[ar]=دودة صغيرة
+Description[be]=Маленькі чарвÑчок
+Description[bg]=Малкото Червейче
+Description[bn]=ছোটà§à¦Ÿ কেà¦à¦šà§‹
+Description[br]=Buzugig
+Description[bs]=Mali crv
+Description[ca]=Cuquet
+Description[cs]=Červík
+Description[cy]=Pry' Genwair Bach
+Description[da]=Lille orm
+Description[de]=Kleiner Wurm
+Description[el]=ΜικÏÏŒ σκουλήκι
+Description[eo]=Vermeto
+Description[es]=Gusanito
+Description[et]=Ussike
+Description[eu]=Hartxoa
+Description[fa]=کرم کوچک
+Description[fi]=Pieni mato
+Description[fr]=Petit ver de terre
+Description[ga]=Péistín
+Description[gl]=Pequeno Verme
+Description[he]=תולעת קטנה
+Description[hi]=ननà¥à¤¹à¥€ इलà¥à¤²à¥€
+Description[hr]=Mali crv
+Description[hu]=kukac
+Description[is]=Lítill ormur
+Description[it]=Vermiciattolo
+Description[ja]=å°ã•ã„ã‚€ã—
+Description[km]=កូន​ដង្កូវ​ážáž¼áž…
+Description[ko]=ìž‘ì€ ë²Œë ˆ
+Description[lv]=Mazais tÄrps
+Description[mk]=Мало црвче
+Description[nb]=Liten orm
+Description[nds]=Lütt Worm
+Description[ne]=सानो वोरà¥à¤®
+Description[nl]=Kleine worm
+Description[nn]=Liten orm
+Description[pa]=ਛੋਟਾ ਕੀੜਾ
+Description[pl]=Robaczek
+Description[pt]=Pequeno Verme
+Description[pt_BR]=Pequeno Verme
+Description[ro]=Micul vierme
+Description[ru]=Маленький червÑчок
+Description[sk]=Malý Äervík
+Description[sl]=Mali Ärv
+Description[sr]=Мали црв
+Description[sr@Latn]=Mali crv
+Description[sv]=Lilla masken
+Description[ta]= சிற௠பà¯à®´à¯
+Description[tg]=Кирми МайдаÑк
+Description[th]=หนอนตัวจิ๋ว
+Description[tr]=Küçük Kurtçuk
+Description[uk]=Хробачок
+Description[uz]=Kichkina chuvalchang
+Description[uz@cyrillic]=Кичкина чувалчанг
+Description[xh]=Umbungu Omncinci
+Description[zh_CN]=å°è™«è™«
+Description[zh_TW]=å°èŸ²
+About=By Bartosz Trudnowski\nMade for my wife
+About[af]=Deur Bartosz Trudnowski\nMade vir my vrou
+About[ar]=من Bartosz Trudnowski\nصنعته لزوجتي
+About[az]=Bartosz Trudnowski tərəfindən\nHəyat yoldaşıma
+About[be]=Ðўтар Bartosz Trudnowski\nЗрабіў Ð´Ð»Ñ Ð¶Ð¾Ð½ÐºÑ–
+About[bg]=Ðвтор Бартоз ТрудновÑки\nПоÑвещава Ñе на Ñъпругата на автора
+About[bn]=তৈরি করেছেন বারà§à¦Ÿà§‹à¦œ টà§à¦°à§à¦¡à¦¨à§‹à¦¸à§à¦•à¦¿\nআমার সà§à¦¤à§à¦°à§€'র জনà§à¦¯ বানিয়েছি
+About[br]=Gant Bartosz Trudnowski\nGraet evit ma wreg
+About[bs]=Autor Bartosz Trudnowski\nNapravljeno za moju ženu
+About[ca]=Per Bartosz Trudnowski\nFet per a la meva dona
+About[cs]=Autor Bartosz Trudnowski\nPro mou manželku
+About[cy]=Gan Bartosz Trudnowski\nGwnaethwyd i fy ngwraig
+About[da]=Af Bartosz Trudnowski\nLavet til min kone
+About[de]=Von Bartosz Trudnowski\nFür meine Frau
+About[el]=Από τον Bartosz Trudnowski\n Φτιάχτηκε για τη σÏζυγό μου
+About[eo]=De Bartosz Trudnowski\nFarita por mia edzino
+About[es]=Por Bartosz Trudnowski\nHecho para mi esposa
+About[et]=Autor: Bartosz Trudnowski\nTehtud minu abikaasale
+About[eu]=Bartosz Trudnowski'k egina\nEmaztearentzat egina
+About[fa]=توسط بارتز ترودنوسکی \nساخته شده برای همسرم
+About[fi]=Tehnyt Bartosz Trudnowski\nTehty vaimolleni
+About[fr]=Par Bartosz Trudnowski\nDéveloppé pour ma femme
+About[ga]=Le Bartosz Trudnowski\nDéanta do mo bhean chéile
+About[gl]=Por Bartosz Trudnowski\nFeito para a miña muller
+About[he]=מ×ת ברטוש טרודנובסקי\nנעשה עבור ×ישתי
+About[hi]=बारà¥à¤¤à¥‹à¤œà¤¼ तà¥à¤°à¥à¤¦à¤¨à¥‹à¤µà¥à¤¸à¥à¤•à¥€ दà¥à¤µà¤¾à¤°à¤¾\nमेरी पतà¥à¤¨à¤¿ दà¥à¤µà¤¾à¤°à¤¾ बनाया हà¥à¤†
+About[hr]=Autor Bartosz Trudnowski\n"Za moju suprugu."
+About[hu]=Készítette: Bartosz Trudnowski\nA feleségemnek ajánlom
+About[is]=By Bartosz Trudnowski\nGert fyrir elskuna mína (já, eiginkonuna)
+About[it]=Di Bartosz Trudnowski\nFatto per mia moglie.
+About[ja]=By Bartosz Trudnowski\n妻ã®ãŸã‚ã«
+About[km]=ដោយ Bartosz Trudnowski\nសម្រាប់​ភរិយា​ážáŸ’ញុំ
+About[lt]=Darė Bartosz Trudnowski\nPadarytas mano žmonai
+About[lv]=Autors - Bartosz Trudnowski\nIzgatavots manai sievai.
+About[mk]=Од Bartosz Trudnowski\nÐаправено за жена ми
+About[mt]=Ta' Bartosz Trudnowski\nDedikat għall-mara tiegħi
+About[nb]=Av Bartosz Trudnowski\nLaget til min kone
+About[nds]=Vun Bartosz Trudnowski\nMaakt för mien Fru
+About[ne]=बारटोसà¥à¤œ टà¥à¤°à¥à¤¡à¤¨à¥‹à¤¸à¥à¤•à¥€à¤¦à¥à¤µà¤¾à¤°à¤¾\nमेरी पतà¥à¤¨à¥€à¤•à¥‹ लागि बनाइयो
+About[nl]=Door Bartosz Trudnowski\nGemaakt voor mijn vrouw
+About[nn]=Av Bartosz Trudnowski\nLaga til kona mi
+About[pl]=Autorstwa Bartosza Trudnowskiego\nWykonane dla mojej żony
+About[pt]=De Bartosz Trudnowski\nFeito para a minha mulher
+About[pt_BR]=Por Bartosz Trudnowski\nFeito para minha esposa
+About[ro]=De Bartosz Trudnowski\nFăcut pentru soţia mea
+About[ru]=Ðвтор - Bartosz Trudnowski\nСделано Ð´Ð»Ñ Ð¼Ð¾ÐµÐ¹ жены
+About[sk]=Vytvoril Bartosz Trudnowski\nPre svoju ženu
+About[sl]=Od Bartosza Trudnowskega\nNaredil za svojo ženo
+About[sr]=Од Бартоша ТрудновÑког (Bartosz Trudnowski)\нÐаправљено за моју жену
+About[sr@Latn]=Od Bartoša Trudnovskog (Bartosz Trudnowski)\nNapravljeno za moju ženu
+About[sv]=Av Bartosz Trudnowski\nGjord för min fru
+About[tg]=Бартоз ТрудновÑкй\Барои зани ман
+About[th]=โดย Bartosz Trudnowski\nสร้างจาà¸à¸ à¸£à¸£à¸¢à¸²à¸œà¸¡à¹€à¸­à¸‡
+About[tr]=Bartosz Trudnowski\nEşim için yaptım
+About[uk]=Ðвтор: Bartosz Trudnowski\nЗроблено моєю жінкою
+About[uz]=Bartosz Trudnovski (Bartosz Trudnowski) yaratgan\nTurmush oʻrtogʻim uchun yaratilgan.
+About[uz@cyrillic]=БартоÑз ТрудновÑки (Bartosz Trudnowski) Ñратган\nТурмуш ўртоғим учун Ñратилган.
+About[ven]=Nga Bartosz Trudnowski\nZwo itelwa musadzi wanga
+About[xh]=Ngu Bartosz Trudnowski\nYenzelwe inkosikazi yam
+About[zh_CN]=作者:Bartosz Trudnowski\n为我妻å­è€Œä½œ
+About[zu]=Ngu Bartosz Trudnowski\nYenzelwe unkosikazi wami
+Icon=../../preview/worm.png
+Base=Base
+Sequences=MoveLeft,MoveRight,Eyes,Eye,BigEyes,Angry,Wobble,Love
+#Sequences=MoveLeft,MoveRight
+Blur=Dig
+Focus=Up
+Destroy=DropOut
+Sleep=Zzz
+
+[Base]
+Sequence=w-b1.png
+Movement=0
+Delay=2000
+HotspotX=16
+HotspotY=29
+
+[Eyes]
+Sequence=w-b1.png,w-b1.png,w-b1.png,w-b1.png,w-b2.png,w-b1.png,w-b2.png,w-b1.png,w-b1.png,w-b1.png,w-b1.png,w-b2.png,w-b1.png,w-b1.png,w-b1.png,w-b1.png
+Movement=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+Delay=300,300,300,300,150,150,150,300,300,300,300,100,300,300,300,300
+HotspotX=16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+HotspotY=29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29
+
+[Dig]
+Sequence=w-d1.png,w-d2.png,w-d3.png,w-d4.png,w-d5.png
+Movement=0,0,0,0,0
+Delay=100,100,100,100,200
+HotspotX=16,16,16,16,16
+HotspotY=29,29,29,29,29
+
+[Up]
+Sequence=w-d5.png,w-u1.png,w-u2.png,w-u3.png,w-b1.png
+Movement=0,0,0,0,0
+Delay=100,100,100,100,300
+HotspotX=16,16,16,16,16
+HotspotY=29,29,29,29,29
+
+[DropOut]
+Sequence=w-b1.png,w-dr1.png,w-dr1.png,w-dr1.png,w-dr1.png,w-dr1.png,w-dr1.png,w-dr1.png
+Movement=0,0,0,0,0,0,0,0
+Delay=150,100,100,100,100,100,100,100
+HotspotX=16,16,16,16,16,16,16,16
+HotspotY=29,-25,-50,-100,-250,-500,-750,-1000
+
+[Zzz]
+Sequence=w-s1.png,w-s2.png,w-s3.png,w-s2.png,w-s3.png,w-s1.png
+Movement=0,0,0,0,0,0
+Delay=300,200,200,200,200,300
+HotspotX=16,16,16,16,16,16
+HotspotY=29,29,29,29,29,29
+
+[Eye]
+Sequence=w-b1.png,w-e1.png,w=b1.png
+Movement=0,0,0
+Delay=300,300,300
+HotspotX=16,16,16
+HotspotY=29,29,29
+
+[MoveLeft]
+Sequence=w-ml0.png,w-ml1.png,w-ml2.png,w-ml3.png,w-ml2.png,w-ml1.png,w-ml2.png,w-ml3.png,w-ml2.png,w-ml1.png,w-ml0.png
+Movement=0,0,0,0,-4,-3,0,0,-4,-3,0
+Delay=100,200,200,200,200,200,200,200,200,200,100
+HotspotX=16,26,26,26,26,26,26,26,26,26,16
+HotspotY=29,29,29,29,29,29,29,29,29,29,29
+
+[MoveRight]
+Sequence=w-mr0.png,w-mr1.png,w-mr2.png,w-mr3.png,w-mr2.png,w-mr1.png,w-mr2.png,w-mr3.png,w-mr2.png,w-mr1.png,w-mr0.png
+Movement=0,0,0,0,4,3,0,0,4,3,0
+Delay=100,200,200,200,200,200,200,200,200,200,100
+HotspotX=16,6,6,6,6,6,6,6,6,6,16
+HotspotY=29,29,29,29,29,29,29,29,29,29,29
+
+[BigEyes]
+Sequence=w-b1.png,w-be1.png,w-be2.png,w-be3.png,w-be4.png,w-be3.png,w-be2.png,w-be1.png,w-b1.png
+Movement=0,0,0,0,0,0,0,0,0
+Delay=300,150,150,200,300,200,150,150,300
+HotspotX=16,16,16,16,16,16,16,16,16
+HotspotY=29,29,29,29,29,29,29,29,29
+
+[Angry]
+Sequence=w-a1.png,w-a2.png,w-a1.png,w-a2.png,w-a1.png,w-a2.png
+Movement=0,0,0,0,0,0
+Delay=150,150,150,150,150,150
+HotspotX=16,16,16,16,16,16
+HotspotY=29,29,29,29,29,29
+
+[Wobble]
+Sequence=w-b1.png,w-wl1.png,w-wl2.png,w-wl1.png,w-b1.png,w-wl1.png,w-wl2.png,w-wl1.png,w-b1.png,w-wr1.png,w-wr2.png,w-wr1.png,w-b1.png,w-wr1.png,w-wr2.png,w-wr1.png,w-b1.png
+Movement=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+Delay=300,150,150,150,150,150,150,150,300,150,150,150,150,150,150,150,300
+HotspotX=16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+HotspotY=29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29
+
+[Love]
+Sequence=w-l1.png,w-l2.png,w-l3.png,w-l1.png,w-l2.png,w-l3.png
+Movement=0,0,0,0,0,0
+Delay=200,200,200,200,200,200
+HotspotX=16,16,16,16,16,16
+HotspotY=29,29,29,29,29,29
+
+
diff --git a/amor/hi16-app-amor.png b/amor/hi16-app-amor.png
new file mode 100644
index 0000000..f113266
--- /dev/null
+++ b/amor/hi16-app-amor.png
Binary files differ
diff --git a/amor/hi22-app-amor.png b/amor/hi22-app-amor.png
new file mode 100644
index 0000000..610b896
--- /dev/null
+++ b/amor/hi22-app-amor.png
Binary files differ
diff --git a/amor/hi32-app-amor.png b/amor/hi32-app-amor.png
new file mode 100644
index 0000000..42aa5cd
--- /dev/null
+++ b/amor/hi32-app-amor.png
Binary files differ
diff --git a/amor/hi48-app-amor.png b/amor/hi48-app-amor.png
new file mode 100644
index 0000000..6cea2c9
--- /dev/null
+++ b/amor/hi48-app-amor.png
Binary files differ
diff --git a/amor/main.cpp b/amor/main.cpp
new file mode 100644
index 0000000..16e89c8
--- /dev/null
+++ b/amor/main.cpp
@@ -0,0 +1,70 @@
+/* main.cpp
+**
+** Copyright (c) 1999 Martin R. Jones <mjones@kde.org>
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+
+#include <kuniqueapplication.h>
+#include <klocale.h>
+#include <kcmdlineargs.h>
+#include <kaboutdata.h>
+#include <dcopclient.h>
+
+#include "version.h"
+#include "amor.h"
+
+
+static const char description[] = I18N_NOOP("KDE creature for your desktop");
+
+int main(int argc, char *argv[])
+{
+ KAboutData aboutData( "amor", I18N_NOOP("amor"),
+ AMOR_VERSION, description, KAboutData::License_GPL,
+ "(c) 1999, Martin R. Jones");
+ aboutData.addAuthor("Martin R. Jones",0, "mjones@kde.org");
+ aboutData.addAuthor("Gerardo Puga", I18N_NOOP("Current maintainer"), "gpuga@gioia.ing.unlp.edu.ar");
+ KCmdLineArgs::init( argc, argv, &aboutData );
+
+ if (!KUniqueApplication::start()) {
+ fprintf(stderr, "%s is already running!\n", aboutData.appName());
+ exit(0);
+ }
+ KUniqueApplication app;
+
+ // session management
+ AmorSessionWidget *sessionWidget = new AmorSessionWidget;
+ app.setTopWidget(sessionWidget);
+
+ new Amor();
+
+ app.dcopClient()->setDefaultObject( "AmorIface" );
+
+ return app.exec();
+}
+
diff --git a/amor/preparetips b/amor/preparetips
new file mode 100644
index 0000000..03bcf67
--- /dev/null
+++ b/amor/preparetips
@@ -0,0 +1,45 @@
+# little script to extract the text from the tips file
+# and output it, so xgettext can add the tips to the po file
+#
+# 2000 by Matthias Kiefer <matthias.kiefer@gmx.de>
+
+open(FILE,"<data/tips-en") || die "unable to open tips file";
+
+$inTip=0;
+$tip="";
+
+while(<FILE>)
+{
+ chomp;
+
+ # tip ends with %
+ if(!/^%/)
+ {
+ # replace \ with \\
+ s/\\/\\\\/g;
+
+ # replace " with \"
+ s/"/\\"/g;
+
+ if($inTip != 0)
+ {
+ $tip=$tip."\n\"$_\\n\"";
+ }
+ else
+ {
+ $inTip=1;
+ $tip="\"$_\\n\"";
+ }
+
+ next;
+ }
+ elsif($inTip != 0)
+ {
+ # remove last newline
+ $tip =~ s/\\n\"$/\"/g;
+ print "i18n(\n", $tip, "\n);\n";
+ $inTip=0;
+ }
+}
+
+close(FILE);
diff --git a/amor/version.h b/amor/version.h
new file mode 100644
index 0000000..c12084b
--- /dev/null
+++ b/amor/version.h
@@ -0,0 +1 @@
+#define AMOR_VERSION "2.3"
diff --git a/configure.in.in b/configure.in.in
new file mode 100644
index 0000000..7290cca
--- /dev/null
+++ b/configure.in.in
@@ -0,0 +1,6 @@
+#MIN_CONFIG
+KDE_ENABLE_HIDDEN_VISIBILITY
+CXXFLAGS="$CXXFLAGS $KDE_DEFAULT_CXXFLAGS"
+AC_CHECK_SETENV
+AC_CHECK_UNSETENV
+AC_CHECK_INITGROUPS
diff --git a/doc/Makefile.am b/doc/Makefile.am
new file mode 100644
index 0000000..6812bd2
--- /dev/null
+++ b/doc/Makefile.am
@@ -0,0 +1,5 @@
+
+KDE_LANG = en
+KDE_DOCS = AUTO
+SUBDIRS = $(AUTODIRS)
+
diff --git a/doc/amor/Makefile.am b/doc/amor/Makefile.am
new file mode 100644
index 0000000..3f20a1e
--- /dev/null
+++ b/doc/amor/Makefile.am
@@ -0,0 +1,5 @@
+
+KDE_LANG = en
+KDE_DOCS = AUTO
+
+KDE_MANS = AUTO
diff --git a/doc/amor/billy.png b/doc/amor/billy.png
new file mode 100644
index 0000000..89d5d28
--- /dev/null
+++ b/doc/amor/billy.png
Binary files differ
diff --git a/doc/amor/bonhomme.png b/doc/amor/bonhomme.png
new file mode 100644
index 0000000..d9a031b
--- /dev/null
+++ b/doc/amor/bonhomme.png
Binary files differ
diff --git a/doc/amor/bsd.png b/doc/amor/bsd.png
new file mode 100644
index 0000000..77d3b2a
--- /dev/null
+++ b/doc/amor/bsd.png
Binary files differ
diff --git a/doc/amor/eyes.png b/doc/amor/eyes.png
new file mode 100644
index 0000000..0c843e2
--- /dev/null
+++ b/doc/amor/eyes.png
Binary files differ
diff --git a/doc/amor/ghost.png b/doc/amor/ghost.png
new file mode 100644
index 0000000..59ab8d3
--- /dev/null
+++ b/doc/amor/ghost.png
Binary files differ
diff --git a/doc/amor/index.docbook b/doc/amor/index.docbook
new file mode 100644
index 0000000..8b72736
--- /dev/null
+++ b/doc/amor/index.docbook
@@ -0,0 +1,318 @@
+<?xml version="1.0" ?>
+<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [
+ <!ENTITY kappname "&amor;">
+ <!ENTITY package "kdetoys">
+ <!ENTITY % addindex "IGNORE">
+ <!ENTITY % English "INCLUDE">
+]>
+
+<book lang="&language;">
+<bookinfo>
+<title>The &amor; Handbook</title>
+
+<authorgroup>
+<author>
+&Karl.Garrison; &Karl.Garrison.mail;
+</author>
+</authorgroup>
+
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+
+<copyright>
+<year>2001</year>
+<holder>&Karl.Garrison;</holder>
+</copyright>
+
+<legalnotice>&FDLNotice;</legalnotice>
+
+<date>2003-09-16</date>
+<releaseinfo>2.2</releaseinfo>
+
+<abstract>
+<para>
+&amor; is a small animation which sits on top of your active window.
+</para>
+</abstract>
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>kdetoys</keyword>
+<keyword>amor</keyword>
+<keyword>helper</keyword>
+<keyword>assistant</keyword>
+</keywordset>
+
+</bookinfo>
+
+<chapter id="introduction">
+<title>Introduction</title>
+
+<sect1 id="whats-amor">
+<title>What's &amor;?</title>
+<para>
+&amor; is an acronym which stands for Amusing Misuse of Resources. It is
+actually an animation which sits on top of your active window. In its default
+configuration, &amor; takes the form of a yellow spot which performs many
+tricks. &amor; also has many different themes which change the appearance
+and behavior of the animation.
+</para>
+
+<note><para>Since &amor; works with the &kde; window manager &kwin;, the
+application will only work from within &kde;. It is possible that &amor;
+would work from within another &kde;-compliant window manager, but none are
+known to work at the time of this writing.</para></note>
+</sect1>
+</chapter>
+
+<chapter id="configuration">
+<title>Configuration</title>
+<sect1 id="configuring-amor">
+<title>Configuring &amor;</title>
+<para>To configure &amor;, click on the animation using your &RMB;. A menu
+will appear containing three items:
+<guimenuitem>Options...</guimenuitem>,
+<guimenuitem>About...</guimenuitem>, and
+<guimenuitem>Quit</guimenuitem>. Choose
+<guimenuitem>Options...</guimenuitem> to configure &amor;
+</para>
+</sect1>
+
+<sect1 id="general-options">
+<title>General Options</title>
+<para>The following settings for &amor; can be changed from the Options
+dialog:</para>
+<variablelist>
+<varlistentry><term><guilabel>Theme</guilabel></term>
+<listitem><para>This determines the appearance and behavior of &amor;.
+Themes are described in the next section.</para></listitem>
+</varlistentry>
+<varlistentry><term><guilabel>Offset</guilabel></term>
+<listitem><para>This slider controls where the animation appears in
+relation to the top of the active window. The default middle setting will
+place the animation right above the window title bar, whereas setting the
+slider all the way to the top or bottom will result in the animation
+appearing a fair distance above or below the title bar, respectively.</para>
+<tip><para>Setting this slider to a lower setting will allow the
+animation to be visible even when the active window is maximized.</para>
+</tip></listitem>
+</varlistentry>
+<varlistentry><term><guilabel>Always on top</guilabel></term>
+<listitem><para>Checking this option will cause the animation to always
+appear in front of any existing windows on the screen, including the
+panel.</para></listitem>
+</varlistentry>
+<varlistentry><term><guilabel>Show random tips</guilabel></term>
+<listitem><para>If checked, the animation will display various
+&kde;-related tips at random intervals.</para></listitem>
+</varlistentry>
+<varlistentry><term><guilabel>Allow application tips</guilabel></term>
+<listitem><para>Any &kde; application can be designed to display helpful
+tips via &amor;. If this option is checked, and an appropriate
+application is the active window, the animation will display tips for that
+application.</para>
+<note><para>At the time of this writing, no &kde; applications make use of
+this functionality.</para></note></listitem>
+</varlistentry>
+</variablelist>
+</sect1>
+
+<sect1 id="amor-themes">
+<title>&amor; Themes</title>
+<para>&amor; comes with many built-in themes, which change the appearance and
+behavior of the animation. In addition, it is possible to create new
+&amor; themes. The built-in themes for &amor; are described in the table
+below</para>
+
+<table>
+<title>Available &amor; Themes</title>
+<tgroup cols="2">
+<thead>
+<row>
+<entry>Theme</entry>
+<entry>Description</entry>
+</row>
+</thead>
+<tbody>
+
+<row>
+<entry><mediaobject>
+<imageobject>
+<imagedata format="PNG" fileref="spot.png"/>
+</imageobject>
+<textobject><para>Multi-talented Spot</para></textobject>
+<caption><para>Multi-talented Spot</para></caption>
+</mediaobject></entry>
+<entry><para>This is the default theme for &amor;, and also the one with
+the most <quote>tricks</quote>. This theme was created by &Martin.R.Jones;. The jet-pack, beaming, and fire animations were contributed by
+<personname><firstname>Mark</firstname><surname>Grant</surname></personname>.</para></entry>
+</row>
+
+<row>
+<entry><mediaobject>
+<imageobject>
+<imagedata format="PNG" fileref="ghost.png"/>
+</imageobject>
+<textobject><para>Spooky Ghost</para></textobject>
+<caption><para>Spooky Ghost</para></caption>
+</mediaobject></entry>
+<entry><para>A ghost theme based-on the &kde;
+<application>ghostview</application> icon. Spooky Ghost was created by
+&Martin.R.Jones;.</para></entry>
+</row>
+
+<row>
+<entry><mediaobject>
+<imageobject>
+<imagedata format="PNG" fileref="eyes.png"/>
+</imageobject>
+<textobject><para>Crazy Eyes</para></textobject>
+<caption><para>Crazy Eyes</para></caption>
+</mediaobject></entry>
+<entry><para>This theme consists of a moving pair of eyes, and was created
+by <personname><firstname>Jean-Claude</firstname><surname>Dumas</surname></personname>.</para></entry>
+</row>
+
+<row>
+<entry><mediaobject>
+<imageobject>
+<imagedata format="PNG" fileref="bonhomme.png"/>
+</imageobject>
+<textobject><para>Bonhomme</para></textobject>
+<caption><para>Bonhomme</para></caption>
+</mediaobject></entry>
+<entry><para>A stick-figure animation, created by <personname><firstname>Jean-Claude</firstname><surname>Dumas</surname></personname>.</para></entry>
+</row>
+
+<row>
+<entry><mediaobject>
+<imageobject>
+<imagedata format="PNG" fileref="neko.png"/>
+</imageobject>
+<textobject><para>Neko</para></textobject>
+<caption><para>Neko</para></caption>
+</mediaobject></entry>
+<entry><para>Neko is a cat theme by <personname><firstname>Chris</firstname><surname>Spiegel</surname></personname>. The graphics are
+originally from <application>Oneko</application>, which was written by
+<personname><firstname>Masayuki</firstname><surname>Koba</surname></personname>.</para>
+<note><para><application>Oneko</application> is a small application which
+features a cat chasing the mouse cursor. The application appears to no
+longer be maintained, but the
+<ulink url="ftp://sunsite.unc.edu/pub/Linux/X11/demos/oneko-1.1b.tar.gz">
+source code</ulink> from the last version is still
+available.</para></note></entry>
+</row>
+
+<row>
+<entry><mediaobject>
+<imageobject>
+<imagedata format="PNG" fileref="pingus.png"/>
+</imageobject>
+<textobject><para>Tux</para></textobject>
+<caption><para>Tux</para></caption>
+</mediaobject></entry>
+<entry><para>This theme features Tux, the &Linux; mascot. The actual
+graphics come from a <application>Lemmings</application>-style game
+called <ulink url="http://pingus.seul.org/">
+<application>Pingus</application></ulink>. The Tux theme was created by
+<personname><firstname>Frank</firstname><surname>Pieczynski</surname></personname>.</para></entry>
+</row>
+
+<row>
+<entry><mediaobject>
+<imageobject>
+<imagedata format="PNG" fileref="worm.png"/>
+</imageobject>
+<textobject><para>Little Worm</para></textobject>
+<caption><para>Little Worm</para></caption>
+</mediaobject></entry>
+<entry><para>A small inchworm theme. Created by <personname><firstname>Bartosz</firstname><surname>Trudnowski</surname></personname> for
+his wife.</para></entry>
+</row>
+
+<row>
+<entry><mediaobject>
+<imageobject>
+<imagedata format="PNG" fileref="billy.png"/>
+</imageobject>
+<textobject><para>Little Billy</para></textobject>
+<caption><para>Little Billy</para></caption>
+</mediaobject></entry>
+<entry><para>A static image taken from the game
+<ulink url="http://www.xbill.org/"><application>XBill</application>
+</ulink>.</para></entry>
+</row>
+
+<row>
+<entry><mediaobject>
+<imageobject>
+<imagedata format="PNG" fileref="bsd.png"/>
+</imageobject>
+<textobject><para>BSD Mascot</para></textobject>
+<caption><para>BSD Mascot</para></caption>
+</mediaobject></entry>
+<entry><para>A static image of Beastie, the FreeBSD daemon.</para></entry>
+</row>
+
+<row>
+<entry><mediaobject>
+<imageobject>
+<imagedata format="PNG" fileref="tux.png"/>
+</imageobject>
+<textobject><para>Unanimated Tux</para></textobject>
+<caption><para>Unanimated Tux</para></caption>
+</mediaobject></entry>
+<entry><para>An unanimated version of the Tux theme.</para></entry>
+</row>
+
+<row>
+<entry><mediaobject>
+<imageobject>
+<imagedata format="PNG" fileref="tao.png"/>
+</imageobject>
+<textobject><para>Tao</para></textobject>
+<caption><para>Tao</para></caption>
+</mediaobject></entry>
+<entry><para>The Tao theme is an animated Yin Yang symbol. This theme was
+created by <personname><firstname>Daniel</firstname><surname>Pfeiffer</surname></personname> <email>occitan@esperanto.org</email>, and was
+inspired by his Tai Chi practice.</para></entry>
+</row>
+
+</tbody>
+</tgroup>
+</table>
+
+</sect1>
+</chapter>
+
+<chapter id="credits">
+<title>Credits and License</title>
+
+<para>&amor;</para>
+
+<para>Program Copyright &copy; 1999-2001 &Martin.R.Jones;
+&Martin.R.Jones.mail;</para>
+
+<para>Documentation Copyright &copy; 2001 &Karl.Garrison;
+&Karl.Garrison.mail;</para>
+
+<!-- TRANS:CREDIT_FOR_TRANSLATORS -->
+
+&underFDL;
+&underGPL;
+</chapter>
+
+&documentation.index;
+
+</book>
+
+<!--
+Local Variables:
+mode: sgml
+sgml-minimize-attributes:nil
+sgml-general-insert-case:lower
+sgml-indent-step:0
+sgml-indent-data:nil
+End:
+
+// vim:ts=0:sw=2:tw=78:noet
+-->
diff --git a/doc/amor/man-amor.6.docbook b/doc/amor/man-amor.6.docbook
new file mode 100644
index 0000000..17dca2f
--- /dev/null
+++ b/doc/amor/man-amor.6.docbook
@@ -0,0 +1,72 @@
+<?xml version="1.0" ?>
+<!DOCTYPE refentry PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [
+<!-- <!ENTITY kdeoptions SYSTEM "kdeoptions.docbook"> -->
+<!-- <!ENTITY qtoptions SYSTEM "qtoptions.docbook"> -->
+<!ENTITY % English "INCLUDE">
+]>
+
+<refentry lang="&language;">
+<refentryinfo>
+<date>March 7, 2003</date>
+</refentryinfo>
+
+<refmeta>
+<refentrytitle><command>amor</command></refentrytitle>
+<manvolnum>6</manvolnum>
+</refmeta>
+
+<refnamediv>
+<refname><command>amor</command></refname>
+<refpurpose>A &kde; creature for your desktop</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<cmdsynopsis>
+<command>amor</command>
+<group><option>KDE Generic Options</option></group>
+<group><option>Qt Generic Options</option></group>
+</cmdsynopsis>
+</refsynopsisdiv>
+
+<refsect1>
+<title>Description</title>
+
+<para><acronym>AMOR</acronym> stands for <quote>Amusing Misuse Of
+Resources</quote>. It provides several different characters who
+prance around your X screen doing tricks and giving you tips.</para>
+
+<para>&amor; is part of the &kde; toys package.</para>
+
+</refsect1>
+
+<refsect1>
+<title>Options</title>
+
+<para>&amor; is configured graphically, and does not have any
+commandline options other than the standard &kde; and &Qt;
+options.</para>
+
+</refsect1>
+
+<refsect1>
+<title>See Also</title>
+
+<para>Within &kde; you can enter
+<userinput>help:/amor</userinput> in &konqueror; to see the
+comprehensive user manual.</para>
+
+</refsect1>
+
+<refsect1>
+<title>Bugs</title>
+
+<para>&amor; currently only works with the &kwin; window manager.</para>
+</refsect1>
+
+<refsect1>
+<title>Authors</title>
+<para>&amor; was written by <personname><firstname>Martin</firstname><othername>R.</othername><surname>Jones</surname></personname> <email>mjones@kde.org</email>.
+ This manual page was prepared by <personname><firstname>Ben</firstname><surname>Burton</surname></personname> <email>bab@debian.org</email> for the Debian GNU/Linux system (but may be used by others).</para>
+</refsect1>
+
+</refentry>
diff --git a/doc/amor/neko.png b/doc/amor/neko.png
new file mode 100644
index 0000000..25e9ea6
--- /dev/null
+++ b/doc/amor/neko.png
Binary files differ
diff --git a/doc/amor/pingus.png b/doc/amor/pingus.png
new file mode 100644
index 0000000..368d6a9
--- /dev/null
+++ b/doc/amor/pingus.png
Binary files differ
diff --git a/doc/amor/spot.png b/doc/amor/spot.png
new file mode 100644
index 0000000..e9a6c06
--- /dev/null
+++ b/doc/amor/spot.png
Binary files differ
diff --git a/doc/amor/tao.png b/doc/amor/tao.png
new file mode 100644
index 0000000..3813ce8
--- /dev/null
+++ b/doc/amor/tao.png
Binary files differ
diff --git a/doc/amor/tux.png b/doc/amor/tux.png
new file mode 100644
index 0000000..924c569
--- /dev/null
+++ b/doc/amor/tux.png
Binary files differ
diff --git a/doc/amor/worm.png b/doc/amor/worm.png
new file mode 100644
index 0000000..42d5ed5
--- /dev/null
+++ b/doc/amor/worm.png
Binary files differ
diff --git a/doc/kmoon/Makefile.am b/doc/kmoon/Makefile.am
new file mode 100644
index 0000000..085981d
--- /dev/null
+++ b/doc/kmoon/Makefile.am
@@ -0,0 +1,4 @@
+
+KDE_LANG = en
+KDE_DOCS = AUTO
+
diff --git a/doc/kmoon/carlosmail b/doc/kmoon/carlosmail
new file mode 100644
index 0000000..760845b
--- /dev/null
+++ b/doc/kmoon/carlosmail
@@ -0,0 +1,74 @@
+From rabaca@nova.ov.ufrj.br Fri Oct 20 23:12:11 2000
+Return-Path: <rabaca@nova.ov.ufrj.br>
+Delivered-To: coolo@master.kde.org
+Received: (qmail 22568 invoked by uid 1055); 20 Oct 2000 21:12:11 -0000
+Delivered-To: kde.org-coolo@kde.org
+Received: (qmail 22489 invoked from network); 20 Oct 2000 21:12:07 -0000
+Received: from nova.ov.ufrj.br (root@146.164.112.17)
+ by max.tat.physik.uni-tuebingen.de with SMTP; 20 Oct 2000 21:12:07 -0000
+Received: from localhost (localhost [[UNIX: localhost]])
+ by nova.ov.ufrj.br (8.9.3/8.9.3) id TAA09140
+ for coolo@kde.org; Fri, 20 Oct 2000 19:14:00 -0200
+From: Carlos Roberto Raba<E7>a <rabaca@nova.ov.ufrj.br>
+Reply-To: rabaca@nova.ov.ufrj.br
+Organization: Observatorio do Valongo - UFRJ
+To: Stephan Kulow <coolo@kde.org>
+Subject: Re: Moon tool
+Date: Fri, 20 Oct 2000 17:10:39 -0200
+X-Mailer: KMail [version 1.0.29]
+Content-Type: text/plain
+References: <00102016004500.08951@nova.ov.ufrj.br> <39F09247.5715C35D@kde.org>
+In-Reply-To: <39F09247.5715C35D@kde.org>
+MIME-Version: 1.0
+Message-Id: <00102019130700.09050@nova.ov.ufrj.br>
+Content-Transfer-Encoding: 8bit
+Status: O
+X-Status:
+
+Stephan,
+
+> In KDE2 I implemented free choice view angle, so I could also slide
+> it some degrees off to see it like I see it here :)
+
+It is nice to hear that! Unfortunately, I still use KDE 1.1.2.... By the way,
+when is the final release o 2.0?
+
+> But if you're an expert, I would like your advise on the correct
+> terms. Where on the earth you see the moon in the the default view
+> you can see on web pages etc.?
+
+As you know, the moon keeps always the same face turned to earth (the so called
+near side). This is a composition of its period of orbital motion and rotation:
+they are approximately the same. The moon's orbit is inclined with respect to
+the equator by (only) 5 degrees, and for our purposes, keeps the polar
+orientation in the sky unchanged. This means that the angle that you
+see the moon in the sky changes by a composition of two factors only: 1)
+latitude of the observer, and 2) time of the day that you look at the moon. If
+you look at the moon over many hours, the change of orientation in the sky is
+moon's orbital plane is close to the equator (as I said before) the discussion
+of orientation looses any meaning. At these positions, the passage by the
+meridian happens very close to the top of your head. So, I can be facing east
+and move my head up to see the moon, or I can be facing west and move my head
+up. Which rotation should I addopt? That is why I told you to use 0 or 180
+degrees. Otherwise, you would need to incorporate in your code many otherif he
+relations, including the latitude of the observer.he will see the first quarter
+moon as a C and the last quater moon as a D (see
+> The current kmoon uses the pictures of this site:l) when the moon is over
+> http://timbeauchamp.tripod.com/moon/, but a (german) colleague ofes over his
+> yours pointed out that the images are mirrored horizontally, son is reversed.
+> we corrected that (the larger craters appear on the left ontor. Since the
+> the moon I see in the sky, while they are right on the web).
+
+My colleague is correct. The east-west sides in the pictures are wrong, so you
+should flip them sideways. For an observer in the northern hemisthere this is
+all you need to do. For an observer in the southern hemisphere, you need to
+rotate this new set of images by 180 degrees. Keep in mind that in the sky if
+north is up east is to the left, if south is up east is to the right. You can
+easily see this if you lay down ;-/ on the floor with you head/legs pointing to
+the north/south line. Now, try to point your left arm to the geographic
+east while facing up.
+
+I hope this helps you. If you like more info, it will be a pleasure to
+help. Best wishes,
+
+Carlos
diff --git a/doc/kmoon/index.docbook b/doc/kmoon/index.docbook
new file mode 100644
index 0000000..5debf5c
--- /dev/null
+++ b/doc/kmoon/index.docbook
@@ -0,0 +1,131 @@
+<?xml version="1.0" ?>
+<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [
+ <!ENTITY kappname "&kmoon;">
+ <!ENTITY package "kdetoys">
+ <!ENTITY % English "INCLUDE">
+ <!ENTITY % addindex "IGNORE">
+]>
+
+<book lang="&language;">
+
+<bookinfo>
+<title>The &kmoon; Handbook</title>
+
+<authorgroup>
+<author>
+<personname>
+<firstname>Pam</firstname>
+<othername></othername>
+<surname>Roberts</surname>
+</personname>
+<email>pamroberts@blueyonde.co.uk</email>
+</author>
+</authorgroup>
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+
+<copyright>
+<year>2003</year>
+<holder>Pam Roberts</holder>
+</copyright>
+<!-- Translators: put here the copyright notice of the translation -->
+<legalnotice>&FDLNotice;</legalnotice>
+
+<date>2003-09-16</date>
+<releaseinfo>1.0</releaseinfo>
+
+<abstract>
+<para>
+&kmoon; is an applet that shows the current phase of the moon.
+</para>
+</abstract>
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>kdetoys</keyword>
+<keyword>kmoon</keyword>
+<keyword>moon phase</keyword>
+</keywordset>
+
+</bookinfo>
+
+<chapter id="using">
+<title>Using &kmoon;</title>
+<para>&kmoon; is a little applet that docks into the System Tray and shows an
+image of the current phase of the moon. Hovering the mouse cursor over the
+image brings up a tooltip to display more information.</para>
+
+<para>&kmoon; can be added to the panel by &RMB; clicking on an empty space
+on the panel and choosing <menuchoice><guimenu>Add to
+Panel</guimenu><guisubmenu>Applet</guisubmenu><guimenuitem>Moon Phase
+Display</guimenuitem></menuchoice>. If you can't find an empty space, you
+can access the panel menu from an &RMB; click on any existing applet or
+icon.</para>
+
+<para>To close &kmoon; <mousebutton>right</mousebutton> click on the applet
+handle beside the image and choose <guimenuitem>Quit</guimenuitem>.</para>
+
+<sect1 id="settings">
+<title>Settings</title>
+<para>If you <mousebutton>right</mousebutton> click on the image and choose
+<guimenuitem>Settings...</guimenuitem> a small dialog box will appear that
+lets you adjust the image to suit the latitude and hemisphere you are living
+in.</para>
+</sect1>
+
+</chapter>
+
+<chapter id="credits">
+
+<title>Credits and License</title>
+
+<para>
+&kmoon;
+</para>
+<para>
+Program copyright 1998,2000 &Stephan.Kulow; &Stephan.Kulow.mail;
+</para>
+<para>
+Contributors:
+<itemizedlist>
+<listitem><para>Lunar code by Chris Osburn <email>chris@speakeasy.org</email></para>
+</listitem>
+<listitem><para>Moon graphics by Tom Beauchamp <email>timb@googol.com</email></para>
+</listitem>
+</itemizedlist>
+</para>
+
+<para>
+Documentation copyright 2003 Pam Roberts <email>pamroberts@blueyonder.co.uk</email>
+</para>
+
+<!-- TRANS:CREDIT_FOR_TRANSLATORS -->
+
+&underFDL;
+&underGPL;
+
+</chapter>
+<appendix id="installation">
+<title>Installation</title>
+
+<para>&kmoon; is part of &kde;'s &package; package.</para>
+<para>Most &Linux; / &UNIX; distributions that include &kde; will include &package; as an option to be installed if the user wishes.</para>
+<para>&kmoon; and the &package; package may also be compiled from source code.
+Visit <ulink url="http://www.kde.org"> http://www.kde.org</ulink> for instructions on how to download, compile and install &kde; programs.</para>
+
+</appendix>
+
+&documentation.index;
+</book>
+
+<!--
+Local Variables:
+mode: xml
+sgml-minimize-attributes:nil
+sgml-general-insert-case:lower
+sgml-indent-step:0
+sgml-indent-data:nil
+End:
+
+vim:tabstop=2:shiftwidth=2:expandtab
+-->
+
diff --git a/doc/kodo/Makefile.am b/doc/kodo/Makefile.am
new file mode 100644
index 0000000..085981d
--- /dev/null
+++ b/doc/kodo/Makefile.am
@@ -0,0 +1,4 @@
+
+KDE_LANG = en
+KDE_DOCS = AUTO
+
diff --git a/doc/kodo/guide.png b/doc/kodo/guide.png
new file mode 100644
index 0000000..18b820e
--- /dev/null
+++ b/doc/kodo/guide.png
Binary files differ
diff --git a/doc/kodo/index.docbook b/doc/kodo/index.docbook
new file mode 100644
index 0000000..20cd0be
--- /dev/null
+++ b/doc/kodo/index.docbook
@@ -0,0 +1,225 @@
+<?xml version="1.0" ?>
+<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [
+ <!ENTITY kappname "&kodometer;">
+ <!ENTITY package "kdetoys">
+ <!ENTITY % addindex "IGNORE">
+ <!ENTITY % English "INCLUDE">
+]>
+
+<book lang="&language;">
+<bookinfo>
+<title>The &kodometer; Handbook</title>
+<authorgroup>
+<author>
+&Armen.Nakashian; &Armen.Nakashian.mail;
+</author>
+
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+
+</authorgroup>
+
+<copyright>
+<year>1999</year><year>2001</year>
+<holder>&Armen.Nakashian;</holder>
+</copyright>
+
+<legalnotice>&FDLNotice;</legalnotice>
+
+<date>2003-09-17</date>
+<releaseinfo>3.2</releaseinfo>
+
+<abstract>
+<para>&kodometer; is a little gadget to measure your desktop mileage</para>
+</abstract>
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>KOdometer</keyword>
+<keyword>odometer</keyword>
+<keyword>mouse</keyword>
+<keyword>mileage</keyword>
+</keywordset>
+</bookinfo>
+
+<chapter id="introduction">
+<title>Introduction</title>
+
+<sect1 id="whats-kodo">
+<title>What is &kodometer;?</title>
+
+<para>
+&kodometer; <emphasis>measures your desktop mileage</emphasis>. It tracks the
+movement of your mouse pointer across your desktop, and renders it in
+inches/feet/miles! It can do cm/meters/km too. The most exciting
+feature is the tripometer, and its utter uselessness.</para>
+
+<note>
+<para>The next version will be USEFUL!</para>
+</note>
+
+</sect1>
+
+</chapter>
+
+<chapter id="onscreen-operation">
+<title>On screen operation</title>
+
+<screenshot>
+<screeninfo>A labeled screen-shot of &kodometer; in action</screeninfo>
+<mediaobject>
+<imageobject>
+<imagedata fileref="guide.png" format="PNG"/>
+</imageobject>
+<textobject>
+<phrase>A labeled screen-shot of &kodometer; in action</phrase></textobject>
+<caption><para>A screen shot. Note the fashionable lack of a
+titlebar.</para></caption>
+</mediaobject>
+</screenshot>
+
+<para>
+The <guilabel>Odometer</guilabel> is the total distance traveled by the
+mouse since the last odometer reset. The
+<guilabel>Tripometer</guilabel> is the distance traveled by the mouse
+since it last stopped moving.
+</para>
+
+<sect1 id="menu-options">
+<title>Menu Options</title>
+
+<para>
+If you've gotten this far, you probably already know that there is a
+&RMB; mouse button context menu on &kodometer;, which contains a number of
+choices.
+</para>
+
+<variablelist>
+<varlistentry>
+<term><guimenuitem>Enable</guimenuitem></term>
+<listitem>
+<para>
+Toggle mileage tracking. This is good if you want to cheat on your
+mileage. <emphasis>Note: This is illegal in most countries</emphasis>
+</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Metric Display</guimenuitem></term>
+<listitem>
+<para>
+Because &kodometer; was written by an American, it obnoxiously assumes you
+want to use Inches/Feet/Miles for measurement. If you come from some
+more modern country in Europe, to use metric measurements, turn on this
+option.
+</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Auto Reset Trip</guimenuitem></term>
+<listitem>
+<para>
+This option will cause &kodometer; to set the Tripometer back to zero every
+time it starts up. </para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Reset Trip</guimenuitem></term>
+<listitem>
+<para>
+Set the tripometer to zero.
+</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Reset Odometer</guimenuitem></term>
+<listitem>
+<para>
+Set the odometer back to zero. <emphasis>You might get in trouble for
+this!</emphasis></para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>About Mousepedometa</guimenuitem></term>
+<listitem>
+<para>
+Pops up a little dialog box with information on who to blame for the
+program.
+</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Help</guimenuitem></term>
+<listitem>
+<para>
+This menu entry opens up the &kodometer; help - this very document.
+</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Quit</guimenuitem></term>
+<listitem>
+<para>
+Quit &kodometer;
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+
+</sect1>
+
+</chapter>
+
+<chapter id="how-it-works">
+<title>How It Works</title>
+
+<para>&X-Window; displays are usually configured with a screen-size
+variable. That is, how big your screen is in real-world measurements,
+not pixels. &kodometer; grabs this value and uses it come up with a
+&dpi; (dots per inch) value for your display, and thus
+can relate the number of pixels you've traversed to the number of inches
+the pointer appears to have moved on the screen.</para>
+
+<para>But lets be real! Its horribly <emphasis>inaccurate!</emphasis>
+&kodometer; makes no pretense of being even remotely accurate. In fact,
+someone has measured the movement of their mouse across the screen with
+a ruler, and found that the distance algorithm is almost 25&percnt; off!
+The original author's response to this complaint was <quote>who
+cares?</quote>.</para>
+</chapter>
+
+<chapter id="license-and-credits">
+<title>Credits and Licenses</title>
+
+<para>&kodometer; Copyright &copy; 1998-2001, &Armen.Nakashian;.</para>
+
+<para>Documentation copyright 1998 &Armen.Nakashian;, with small updates
+and markup cleanup for &kde; 2.2, &Lauri.Watts; &Lauri.Watts.mail;
+</para>
+
+&underFDL;
+&underGPL;
+
+</chapter>
+
+&documentation.index;
+
+</book>
+
+<!--
+Local Variables:
+mode: sgml
+sgml-minimize-attributes:nil
+sgml-general-insert-case:lower
+sgml-indent-step:0
+sgml-indent-data:nil
+End:
+
+// vim:ts=0:sw=2:tw=78:noet
+-->
diff --git a/doc/kteatime/Makefile.am b/doc/kteatime/Makefile.am
new file mode 100644
index 0000000..085981d
--- /dev/null
+++ b/doc/kteatime/Makefile.am
@@ -0,0 +1,4 @@
+
+KDE_LANG = en
+KDE_DOCS = AUTO
+
diff --git a/doc/kteatime/config.png b/doc/kteatime/config.png
new file mode 100644
index 0000000..9c875e5
--- /dev/null
+++ b/doc/kteatime/config.png
Binary files differ
diff --git a/doc/kteatime/index.docbook b/doc/kteatime/index.docbook
new file mode 100644
index 0000000..a1a4664
--- /dev/null
+++ b/doc/kteatime/index.docbook
@@ -0,0 +1,148 @@
+<?xml version="1.0" ?>
+<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [
+ <!ENTITY kappname "&kteatime;">
+ <!ENTITY package "kdetoys">
+ <!ENTITY % addindex "IGNORE">
+ <!ENTITY % English "INCLUDE">
+]>
+
+<book lang="&language;">
+<bookinfo>
+<title>The &kteatime; Handbook</title>
+<authorgroup>
+<author>
+&Michael.Korman; &Michael.Korman.mail;
+</author>
+
+<othercredit role="developer">
+&Matthias.Hoelzer-Kluepfel; &Matthias.Hoelzer-Kluepfel.mail;
+<!-- <contrib>Developer</contrib> -->
+</othercredit>
+
+<othercredit role="reviewer">
+&Lauri.Watts; &Lauri.Watts.mail;
+<!-- <contrib>Reviewer</contrib> -->
+</othercredit>
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+</authorgroup>
+
+<copyright>
+<year>2000</year>
+<holder>&Michael.Korman;</holder>
+</copyright>
+
+<legalnotice>&FDLNotice;</legalnotice>
+
+<date>2006-10-25</date>
+<releaseinfo>1.1.0</releaseinfo>
+
+<abstract>
+<para>This Handbook describes &kteatime;, the &kde; Tea Cooker.</para>
+</abstract>
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>kdetoys</keyword>
+<keyword>kteatime</keyword>
+<keyword>tea</keyword>
+<keyword>cooker</keyword>
+<keyword>timer</keyword>
+</keywordset>
+</bookinfo>
+
+<chapter id="introduction">
+<title>Introduction</title>
+
+<sect1 id="whats-kteatime">
+<title>What's &kteatime;?</title>
+
+<para>&kteatime; is a handy timer for steeping tea. No longer will you have to guess at how long it takes for your tea to be ready. Simply select the type of tea you have, and it will alert you when the tea is ready to drink.</para>
+</sect1>
+
+</chapter>
+
+<chapter id="how-to-use">
+<title>How to Use &kteatime;</title>
+
+<para>When you start up &kteatime;, it will automatically dock itself in your panel. To access the menu, right click on the docked icon. This will present a list of options which are covered in more detail in the next chapter.</para>
+
+<sect1 id="timing-your-tea">
+<title>Timing Your Tea</title>
+
+<para>Upon starting, the panel icon will be that of an empty tea mug. If you click on the mug and select your tea, the icon will change to a filled mug. After the specified time, the tea will be finished, and a suitable message box will be shown. At this point, you can close the message box by clicking on it and reset the timer by clicking on the icon. The mug will be shown as empty again.</para>
+
+<note><para>The timer should only be reset by those who really enjoy tea.</para></note>
+
+</sect1>
+</chapter>
+
+<chapter id="menu-options">
+<title>Menu Options</title>
+
+<para>The following section describes the menu options that are available in &kteatime;.</para>
+
+<sect1 id="select-your-tea">
+<title>Select Your Tea</title>
+
+<para>Clicking on the icon with the &RMB; will bring up a menu. At the top of the menu there are three menu items. Here, you can select what kind of tea you are preparing to drink. There are: <guimenuitem>Black Tea</guimenuitem>, <guimenuitem>Earl Grey</guimenuitem>, and <guimenuitem>Fruit Tea</guimenuitem>. These teas are preconfigured with a default time. Many people have complained that the times are not correct. Please be aware that the amount of time it takes to steep a cup of tea is based on personal preference. The times chosen are approximations. If you read on, you will learn how to change or delete these predefined times and to set your own time. A quick-and-easy way to set a custom time is to choose <guimenuitem>Anonymous...</guimenuitem> from the menu.</para>
+</sect1>
+
+<sect1 id="start">
+<title>Start</title>
+
+<para>This menu item will start the tea timer for the tea marked above. As confirmation that you have indeed selected <guimenuitem>Start</guimenuitem>, the panel icon will change into a filled mug.</para></sect1>
+
+<sect1 id="configure">
+<title><guimenuitem>Configure</guimenuitem></title>
+
+<para>This menu item opens up the configuration dialog box. A screenshot is shown below:</para>
+
+<screenshot>
+<screeninfo>The &kteatime; configuration dialog box.</screeninfo>
+<mediaobject>
+<imageobject><imagedata fileref="config.png" format="PNG"/></imageobject>
+<textobject><phrase>The &kteatime; configuration dialog
+box.</phrase></textobject>
+</mediaobject>
+</screenshot>
+
+<para>As shown in the picture, you may add new entries for other tea or change names, times and the order of existing entries. This is useful if you are brewing a cup of tea that is not on the list or if you do not agree with the predefined times. To edit one entry, mark it in the <guilabel>Tea List</guilabel> on the left and change the values in the <guilabel>Tea Properties</guilabel> on the right.</para>
+
+<para>The box below is the <guilabel>Action</guilabel> field. Here you can define an action that will be executed when the time is up. The button <guibutton>Configure Events...</guibutton> brings up the &kde; Notification Settings for &kteatime;. The <guilabel>Event</guilabel> check box below enables the event selected in the &kde; Notification Settings. If <guilabel>Popup</guilabel> is selected, a message box will appear alerting you to the fact that your tea is ready. The third check box can hold any valid system command. Probably, you will want to leave it blank.</para>
+
+<para>If you enable the check box labeled <guilabel>Visualize progress in icon tray</guilabel>, the progress will be shown as a little animated pie chart inside the icon.</para>
+
+</sect1>
+</chapter>
+
+<chapter id="credits">
+<title>Credits</title>
+
+<para>&kteatime; Copyright &copy; 1998-1999 by
+&Matthias.Hoelzer-Kluepfel; &Matthias.Hoelzer-Kluepfel.mail;
+</para>
+
+<para>Documentation by &Michael.Korman; &Michael.Korman.mail;</para>
+
+<!-- TRANS:CREDIT_FOR_TRANSLATORS -->
+&underFDL; <!-- FDL: do not remove -->
+&underGPL; <!-- GPL License -->
+
+</chapter>
+
+&documentation.index;
+
+</book>
+
+<!--
+Local Variables:
+mode: sgml
+sgml-minimize-attributes:nil
+sgml-general-insert-case:lower
+sgml-indent-step:0
+sgml-indent-data:nil
+End:
+
+// vim:ts=2:sw=2:tw=78:noet
+-->
+
+
diff --git a/doc/kweather/Makefile.am b/doc/kweather/Makefile.am
new file mode 100644
index 0000000..085981d
--- /dev/null
+++ b/doc/kweather/Makefile.am
@@ -0,0 +1,4 @@
+
+KDE_LANG = en
+KDE_DOCS = AUTO
+
diff --git a/doc/kweather/index.docbook b/doc/kweather/index.docbook
new file mode 100644
index 0000000..e545a5a
--- /dev/null
+++ b/doc/kweather/index.docbook
@@ -0,0 +1,260 @@
+<?xml version="1.0" ?>
+<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [
+ <!ENTITY kweather "<application>kweather</application>">
+ <!ENTITY package "kdetoys">
+ <!ENTITY % English "INCLUDE">
+ <!ENTITY % addindex "IGNORE">
+]>
+
+<book lang="&language;">
+
+<bookinfo>
+<title>The KWeather Handbook</title>
+
+<authorgroup>
+<author>
+<firstname></firstname>
+<othername></othername>
+<surname></surname>
+<affiliation>
+<address><email></email></address>
+</affiliation>
+</author>
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+</authorgroup>
+
+<legalnotice>&GPLNotice;</legalnotice>
+
+<date>2004-05-31</date>
+<releaseinfo>3.00.00</releaseinfo>
+
+<abstract>
+<para>
+KWeather is part of the kdetoys package.
+</para>
+</abstract>
+
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>KWeather</keyword>
+</keywordset>
+
+</bookinfo>
+
+<chapter id="introduction">
+<title>Introduction</title>
+
+<para>KWeather is an application that provides both a panel icon,
+allowing you to watch the weather as reported by a local weather
+station, and providing a weather service that can track multiple
+weather stations and provide this information to other
+applications including &konqueror;'s sidebar and &kontact;'s
+summary page.</para>
+
+</chapter>
+
+<chapter id="adding-applet">
+<title>Using KWeather as a Panel Applet</title>
+
+<para>&RMB; click on an empty space in the panel and choose
+<menuchoice><guimenu>Add</guimenu><guisubmenu>Applet</guisubmenu>
+<guimenuitem>KWeather</guimenuitem></menuchoice></para>
+
+<para>A configuration dialog will open up. Initially the only
+configuration required to make KWeather work is the <guilabel>ICAO
+location code:</guilabel>.</para>
+
+<para>This is a four character code used by the weather reporting
+service to uniquely identify weather stations around the world.</para>
+
+<para>As it's unlikely that most people will happen to know this
+directly, there is a link to a search engine where you can look it
+up.</para>
+
+<note><para>While the weather stations available are fairly
+comprehensive, not every town in every country will be represented,
+simply because not every town has an appropriate weather station. If
+your own town is not represented, you should choose the one nearest
+you. Since flying planes safely requires accurate weather data, most
+towns with an airport will be in the list, so a good bet
+is to look for the nearest airport to you.</para></note>
+
+<para>At this point, you can press the <guibutton>OK</guibutton> button
+and the dialog will close. You will now have an icon displaying the
+current weather graphically on your panel. Clicking it once will open
+a window that shows the weather in detail.</para>
+
+<para>Further configuration is described in the next chapter.</para>
+
+</chapter>
+
+<chapter id="configuring-kweather">
+<title>Configuring KWeather</title>
+
+<sect1 id="display">
+<title>Display</title>
+
+<variablelist>
+<varlistentry>
+<term><guilabel>Weather Station Options</guilabel></term>
+<listitem>
+ <variablelist>
+ <varlistentry>
+ <term><guilabel>ICAO location code:</guilabel></term>
+ <listitem><para>ICAO stands for the International Civil Aviation
+Organization. The ICAO location code is a four character
+alphanumeric code that uniquely identifies airports worldwide. The first
+two letters of the ICAO code ususally identify the coutry. However, codes for
+airports in the United States usually start with "K", followed by a three
+character IATA (International Air Transport Assocation) code. For example,
+KORD is the ICAO code for Ohare International Airport in Chicago, Illinois.
+If you don't know the ICAO code for the airport nearest to you, you can click
+on the link labeled <guilabel>Lookup Your ICAO Code</guilabel> to use a web based
+search engine to find it.</para></listitem>
+ </varlistentry>
+ </variablelist>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><guilabel>Panel Display Options</guilabel></term>
+<listitem>
+ <variablelist>
+ <varlistentry>
+ <term><guilabel>Show icon only</guilabel></term>
+ <term><guilabel>Show icon and temperature</guilabel></term>
+ <term><guilabel>Show icon, temperature, wind and pressure information</guilabel></term>
+ <listitem><para>You can choose here if the temperature should be
+displayed beside the icon, or if the current wind speed, direction, and
+air pressure are also displayed.</para>
+ <para>The icon is always shown.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><guilabel>Logging Options</guilabel></term>
+<listitem>
+<variablelist>
+<varlistentry>
+<term><guilabel>Enable logging</guilabel></term>
+<listitem><para>By default KWeather does not retain old weather
+information, and each time it updates the weather the old information
+is discarded. If you wish instead to keep a record of the weather,
+enable this option. Then, each time the weather is checked, KWeather
+will append a new line to the log file containing the current weather
+conditions in comma separated value form. The information written
+will be the date, wind speed and direction, temperature, pressure, cover,
+visibility, and "current weather".</para></listitem>
+</varlistentry>
+<varlistentry>
+<term><guilabel>Log file</guilabel></term>
+<listitem><para>If you have enabled the <guilabel>Enable
+logging</guilabel> check box, this option will become available. Enter
+or browse to the location you would like KWeather to keep it's log
+file.</para>
+</listitem>
+</varlistentry>
+</variablelist>
+</listitem>
+</varlistentry>
+</variablelist>
+
+</sect1>
+
+<sect1 id="weather-service">
+<title><guilabel>Weather Service</guilabel></title>
+
+<variablelist>
+<varlistentry>
+<term><guilabel>Station Manager</guilabel></term>
+<listitem><para></para></listitem>
+</varlistentry>
+<varlistentry>
+<term><guibutton>Update All Stations</guibutton></term>
+<listitem><para>Update all the listed stations
+immediately.</para></listitem>
+</varlistentry>
+<varlistentry>
+<term><guibutton>Exit Weather Service</guibutton></term>
+<listitem><para>Stop fetching weather updates for all
+listed stations, and stop providing weather
+information to the &konqueror; sidebar and &kontact;</para></listitem>
+</varlistentry> </variablelist> </sect1>
+
+</chapter>
+
+<chapter id="kweather-interfaces">
+<title>KWeather Interfaces</title>
+
+<para>While the most obvious KWeather interface is the panel icon,
+there are several other places where you can access KWeather's
+information. These are particularly useful if you need to watch
+multiple weather stations. While &kweather; allows you to track
+multiple weather stations, the panel icon displays only one at a
+time.</para>
+
+<para>These additional services are plug-ins to their respective
+applications, and not provided with KWeather itself.</para>
+
+<!-- FIXME: write some stuff and show some screenies of the konq and
+kontact plugins -->
+
+</chapter>
+
+<chapter id="credits-and-licenses">
+<title>Credits and Licenses</title>
+
+<para>KWeather copyright &copy; Ian Reinhart Geiser
+<email>geiseri@users.sourceforge.net</email></para>
+
+<variablelist>
+<title>Contributors</title>
+<varlistentry><term>Will Andrews
+<email>wca@users.sourceforge.net</email></term>
+<listitem><para>Fixes for BSD port</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>Ben Burton <email>benb@acm.org</email></term>
+<listitem><para>Debian fixes</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>Otto Bruggeman <email>bruggie@home.nl</email></term>
+<listitem><para>Fixed the i18n stuff and source style
+cleanups</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>Nadeem Hasan <email>nhasan@nadmm.com</email></term>
+<listitem><para>Lots of bug fixes, improvements and
+cleanups.</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>Carles Carbonell Bernado <email>mail@carlitus.net</email></term>
+<listitem><para>Great new weather icons</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>John Ratke <email>jratke@comcast.net</email></term>
+<listitem><para>Improvements and more code cleanups</para></listitem>
+</varlistentry>
+</variablelist>
+
+&underGPL;
+&underFDL;
+
+</chapter>
+
+&documentation.index;
+</book>
+
+<!--
+Local Variables:
+mode: sgml
+sgml-minimize-attributes:nil
+sgml-general-insert-case:lower
+sgml-indent-step:0
+sgml-indent-data:nil
+End:
+
+// vim:ts=2:sw=2:tw=78:noet
+-->
diff --git a/doc/kworldclock/Makefile.am b/doc/kworldclock/Makefile.am
new file mode 100644
index 0000000..da8216a
--- /dev/null
+++ b/doc/kworldclock/Makefile.am
@@ -0,0 +1,4 @@
+
+KDE_LANG = en
+KDE_DOCS = AUTO
+KDE_MANS = AUTO
diff --git a/doc/kworldclock/index.docbook b/doc/kworldclock/index.docbook
new file mode 100644
index 0000000..33b5e8a
--- /dev/null
+++ b/doc/kworldclock/index.docbook
@@ -0,0 +1,503 @@
+<?xml version="1.0" ?>
+<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [
+ <!ENTITY kappname "&kworldclock;">
+ <!ENTITY package "kdetoys">
+ <!ENTITY % addindex "IGNORE">
+ <!ENTITY % English "INCLUDE">
+]>
+
+<book lang="&language;">
+
+<bookinfo>
+<title>The &kworldclock; Handbook</title>
+
+<authorgroup>
+<author>
+&Brad.Hards;
+&Brad.Hards.mail;
+</author>
+</authorgroup>
+
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+
+<copyright>
+<year>2004</year>
+<holder>Brad Hards</holder>
+</copyright>
+<legalnotice>&FDLNotice;</legalnotice>
+
+
+<date>2004-01-22</date>
+<releaseinfo>0.00.00</releaseinfo>
+
+<abstract>
+<para>
+&kworldclock; is an application that shows which parts of the world
+are currently experiencing daylight, and which parts are currently in
+night. It also shows the current time in a range of cities around the
+world.
+</para>
+</abstract>
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>kdetoys</keyword>
+<keyword>kworldwatch</keyword>
+<keyword>World Clock</keyword>
+<keyword>day / night clock</keyword>
+</keywordset>
+
+</bookinfo>
+
+<chapter id="introduction">
+<title>Introduction</title>
+
+
+<para>
+&kworldclock; is an application that shows which parts of the world
+are currently experiencing daylight, and which parts are currently in
+night. It also shows the current time in a range of cities around the
+world.
+</para>
+
+<para>
+Please report any problems or feature requests to the &kde; mailing lists.
+</para>
+</chapter>
+
+<chapter id="using-kapp">
+<title>Using &kworldclock;</title>
+
+<sect1><title>The main display</title>
+<para>
+When you start &kworldclock;, you will see a small window appear, as
+shown below.
+</para>
+
+<para>
+<screenshot>
+<screeninfo>Here's a screenshot of &kworldclock;</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="screenshot.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>Screenshot</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+</para>
+
+<para>
+The light section (which in the screenshot above covers Antartica,
+Australia, eastern and southern Africa and most of Asia; plus the
+Indian Ocean and the western part of the Pacific Ocean) shows the area
+that is currently experiencing daylight, while the darker section
+(which in the screenshot above covers western Europe, North and South
+America, and the Arctic zone) shows the area that is currently
+experiencing night. The border between the dark and light section
+is the area that is experiencing morning or evening twilight.
+</para>
+
+<para>
+Each small black square indicates a city or population centre. If you
+locate the mouse over (or near) one of the black squares, you will see
+the date and time that is current for that location. In the
+screenshot above, the tiny island of Pitcairn is shown.
+</para>
+
+<para>
+You may find it more convenient to expand the window, so that there is
+more space between the various squares. Remember that you can expand the window by
+either clicking on the maximise button (second button from the right in the
+top right hand corner) or by using the mouse to drag the corner of the
+main window. An expanded window, with Melbourne (Australia) now
+selected, is shown below.
+</para>
+
+<para>
+<screenshot>
+<screeninfo>Screenshot of &kworldclock; with expanded window</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="screenshot-mlb.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>Screenshot showing expanded window, with Melbourne
+selected.</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+</para>
+
+</sect1>
+
+<sect1 id="kworldclock-clocks"><title>Configuring &kworldclock; with timezone clocks</title>
+
+<para>
+If you need to know the time in a number of areas around the world, it
+may be useful to have &kworldclock; show the applicable times. An
+example of how this can look is shown below.
+</para>
+
+<para>
+<screenshot>
+<screeninfo>Screenshot of &kworldclock; with clocks</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="screenshot-withclocks.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>Screenshot showing expanded window, with three clocks.</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+</para>
+
+<para>
+Note the clocks for Perth, Sydney and Berlin at the bottom of the main
+&kworldclock; window.
+</para>
+
+<para>
+These clocks are added by using the right mouse button, and selecting
+the <guilabel>Clock</guilabel> entry, as shown below.
+</para>
+
+<para>
+<screenshot>
+<screeninfo>Screenshot of &kworldclock; &RMB; clock</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="screenshot-rmb-clock.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>Screenshot showing &RMB; menu, with
+<guilabel>Clock</guilabel> selected.</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+</para>
+
+<para>
+This will allow access to the <guilabel>Add...</guilabel> selection,
+which will bring up a dialog box as shown below. The contents of the
+dialog box are determined from the closest city to the mouse cursor
+when you make the selection.
+</para>
+
+<para>
+<screenshot>
+<screeninfo>Screenshot of &kworldclock; <guilabel>Edit Clock
+Settings</guilabel> dialog</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="screenshot-clock-dialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>Screenshot showing<guilabel>Edit Clock
+Settings</guilabel> dialog.</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+</para>
+
+
+<para>
+You can now make an appropriate selection for the clock label and the
+timezone. Note that you can change the label to whatever is
+appropriate, and the timezone as required. An example, for the small
+Australian town of Quairading, is shown below.
+</para>
+
+<para>
+<screenshot>
+<screeninfo>Screenshot of &kworldclock; <guilabel>Edit Clock
+Settings</guilabel> dialog changed to Quairading</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="screenshot-quairading-dialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>Screenshot showing <guilabel>Edit Clock
+Settings</guilabel> dialog for Quairading.</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+</para>
+
+<para>
+When you select OK, the clock entry is added to those at the bottom of
+the main window. A screenshot, with the extra entry for Quairading, is
+shown below.
+</para>
+
+<para>
+<screenshot>
+<screeninfo>Screenshot of &kworldclock; with Quairading clock</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="screenshot-quairading-clock.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>Screenshot showing Quairading clock.</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+</para>
+
+<para>
+You might notice that Perth and Quairading are now showing the same
+information (since they are in the same timezone). In this case, the
+Perth entry is no longer required, so it can be removed. This can be
+done by again using the right mouse button on the clock display, and selecting
+the <guilabel>Remove</guilabel> item.
+</para>
+
+<para>
+You can also edit entries by using the <guilabel>Edit...</guilabel>
+entry on right mouse button menu, which may be useful for making
+minor changes.
+</para>
+
+</sect1>
+
+<sect1 id="kworldclock-flags"><title>Adding Flags to the &kworldclock; display</title>
+
+<para>
+As shown in the screenshot below, you can add flags to places on the
+map (in this case, Fremantle near Perth, Western Australia; near
+Moscow in Russia; and the Azores in the mid-Atlantic). These flags
+don't affect any other functionality - they just allows you to quickly
+locate places of interest.
+</para>
+
+<para>
+<screenshot>
+<screeninfo>Screenshot of &kworldclock; with flags</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="screenshot-withflags.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>Screenshot showing expanded window, with three flags.</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+</para>
+
+<para>
+You add flags by locating the mouse at the point where you want to
+appear, and using the right mouse button to select the the
+<guilabel>Flags...</guilabel> entry. You can select one of the three
+pre-defined flag colours (that is, <guilabel>Add Red</guilabel>,
+<guilabel>Add Green</guilabel> or <guilabel>Add Blue</guilabel>), or
+you can select a custom colour.
+</para>
+
+<para>
+You use the same menu action to remove just one flag (whichever one is
+closest to the mouse when you make the <guilabel>Remove
+Flag</guilabel> selection; or to remove all the flags, using the
+<guilabel>Remove All Flags</guilabel>.
+</para>
+
+</sect1>
+
+<sect1 id="kworldclock-display"><title>Changing the &kworldclock; display</title>
+
+<para>
+In addition to the additional clocks and flags, there are other minor
+variations you can make to the main &kworldclock; display, such as not
+showing the flags, not showing the small black city squares, and not
+showing the day/night areas. Each of these is selected using the right
+mouse button menu.
+</para>
+
+<para>
+To enable and disable the display of the day / night sections, you use
+the right mouse button, and select the <guilabel>Show
+Daylight</guilabel> item from the menu. Each time you select it, the
+selection will be toggled. When showing day and night is enabled
+(normal mode on first startup), there will be a small check mark
+(tick symbol) next to the <guilabel>Show Daylight</guilabel>. An
+example of the menu item (with day / night not enabled, hence no check
+mark) is shown below.
+</para>
+
+<para>
+<screenshot>
+<screeninfo>Screenshot of &kworldclock; &RMB; daylight</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="screenshot-rmb-daylight.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>Screenshot showing &RMB; menu, with
+<guilabel>Show Daylight</guilabel> selected.</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+</para>
+
+
+<para>
+To enable and disable the display of the small black city squares, you use
+the right mouse button, and select the <guilabel>Show
+Cities</guilabel> item from the menu. Each time you select it, the
+selection will be toggled. When showing cities is enabled
+(normal mode on first startup), there will be a small check mark
+(tick symbol) next to the <guilabel>Show Cities</guilabel>. An
+example of the menu item (with city display enabled, hence a check
+mark) is shown below.
+</para>
+
+<para>
+<screenshot>
+<screeninfo>Screenshot of &kworldclock; &RMB; show cities</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="screenshot-rmb-cities.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>Screenshot showing &RMB; menu, with
+<guilabel>Show Cities</guilabel> selected.</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+</para>
+
+<para>
+To enable and disable the display of the flags, you use
+the right mouse button, and select the <guilabel>Show
+Flags</guilabel> item from the menu. Each time you select it, the
+selection will be toggled. When showing flags is enabled
+(normal mode on first startup), there will be a small check mark
+(tick symbol) next to the <guilabel>Show Flags</guilabel>. An
+example of the menu item (with flags enabled, hence a check
+mark) is shown below.
+</para>
+
+<para>
+<screenshot>
+<screeninfo>Screenshot of &kworldclock; &RMB; show flags</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="screenshot-rmb-flags.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>Screenshot showing &RMB; menu, with
+<guilabel>Show Flags</guilabel> selected.</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+</para>
+
+<para>
+After reconfiguring &kworldclock;, you may wish to save your
+settings. This is done using the right mouse button, and selecting the
+<guilabel>Save Settings</guilabel> option.
+</para>
+
+</sect1>
+
+<sect1 id="kworldclock-maps"><title>Selecting alternative maps</title>
+<para>
+In addition to the normal surface depth map, you can add additional
+maps, which can be selected using the <guilabel>Map Theme</guilabel>
+item from the right mouse button menu. &kworldclock; comes with a
+single map, which provides surface depth (relief). Additional maps can be obtained from
+<ulink url="http://www.radcyberzine.com/xglobe">http://www.radcyberzine.com/xglobe</ulink>.
+Maps need to be appropriately installed - typically into
+<filename>share/apps/kworldclock/maps</filename> under the main &kde;
+directory. Consult your system administrator for assistance in doing
+this, if required.
+</para>
+
+<para>
+If you want to use your own map, you should make sure
+that Greenwich is exactly in the middle of the map, and provide an
+appropriate desktop file.
+</para>
+
+</sect1>
+
+</chapter>
+
+<chapter id="developers">
+<title>Developer's Guide to &kworldclock;</title>
+
+<para>
+The most common requirement for development of &kworldclock; is to add
+additional cities to the map. The cities are determined by a file
+named <filename>zone.tab</filename>, which is located under
+<filename>share/apps/kworldclock</filename> under the main &kde;
+directory.
+</para>
+
+<para>
+To add an additional city, you need to know the latitude and
+longitude, and also the applicable time zone information. There is
+additional information on the exact format required in the
+<filename>zone.tab</filename> file.
+</para>
+
+</chapter>
+
+<chapter id="credits">
+<title>Credits and License</title>
+
+<para>
+&kworldclock;
+</para>
+<para>
+Program copyright 2000 Matthias Hoelzer-Kluepfel.
+</para>
+
+<para>
+Documentation Copyright &copy; 2004 &Brad.Hards; &Brad.Hards.mail;.
+</para>
+
+<!-- TRANS:CREDIT_FOR_TRANSLATORS -->
+
+&underFDL; <!-- FDL: do not remove -->
+
+
+&underGPL; <!-- GPL License -->
+</chapter>
+
+<appendix id="installation">
+<title>Installation</title>
+
+<sect1 id="getting-kapp">
+<title>How to obtain &kworldclock;</title>
+
+
+
+&install.intro.documentation;
+
+</sect1>
+
+<sect1 id="compilation">
+<title>Compilation and Installation</title>
+
+
+&install.compile.documentation;
+
+</sect1>
+
+</appendix>
+
+&documentation.index;
+</book>
+
+<!--
+Local Variables:
+mode: xml
+sgml-minimize-attributes:nil
+sgml-general-insert-case:lower
+sgml-indent-step:0
+sgml-indent-data:nil
+End:
+
+-->
diff --git a/doc/kworldclock/man-kworldclock.1.docbook b/doc/kworldclock/man-kworldclock.1.docbook
new file mode 100644
index 0000000..a002159
--- /dev/null
+++ b/doc/kworldclock/man-kworldclock.1.docbook
@@ -0,0 +1,92 @@
+<?xml version="1.0" ?>
+<!DOCTYPE refentry PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [
+<!ENTITY % English "INCLUDE">
+]>
+
+<refentry lang="&language;">
+<refentryinfo>
+ <author><personname><firstname>Ben</firstname><surname>Burton</surname></personname> <email>bab@debian.org</email></author>
+<date>April 8, 2003</date>
+</refentryinfo>
+
+<refmeta>
+<refentrytitle><command>kworldclock</command></refentrytitle>
+<manvolnum>1</manvolnum>
+</refmeta>
+
+<refnamediv>
+<refname><command>kworldclock</command></refname>
+<refpurpose>Earth watcher for &kde;</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<cmdsynopsis>
+<command>kworldclock</command>
+
+<group><option>--dump</option></group>
+<group><option>--theme</option>
+<replaceable>file</replaceable></group>
+<group><option>-o</option> <replaceable>file</replaceable></group>
+<group><option>--size</option>
+<arg>WxH</arg></group>
+<group><option>KDE Generic Options</option></group>
+<group><option>Qt Generic Options</option></group>
+
+</cmdsynopsis>
+</refsynopsisdiv>
+
+<refsect1>
+<title>Description</title>
+
+<para>&kworldclock; displays where in the world it is light and dark
+depending on time, as well as offering the time in all of the major
+cities of the world. This can be run standalone, as an applet in the
+&kde; panel, or configured to draw the desktop background.</para>
+
+<para>&kworldclock; is part of the official &kde; kdetoys
+package.</para>
+
+</refsect1>
+
+<refsect1>
+<title>Options</title>
+
+<variablelist>
+<varlistentry>
+<term><option>--dump</option></term>
+<listitem><para>Write out a file containing the actual
+map</para></listitem>
+</varlistentry>
+<varlistentry>
+<term><option>--theme</option> <replaceable>file</replaceable></term>
+<listitem><para>The name of the theme to use for a map dump (default:
+earth).</para></listitem>
+</varlistentry>
+<varlistentry>
+<term><option>-o</option> <replaceable>file</replaceable></term>
+<listitem><para>The name of the file to write to for a map dump
+(default: dump.ppm).</para></listitem>
+</varlistentry>
+<varlistentry>
+<term><option>--size</option> <replaceable>WxH</replaceable></term>
+<listitem><para>The size of the map to dump.</para></listitem>
+</varlistentry>
+</variablelist>
+
+</refsect1>
+
+<refsect1>
+<title>See Also</title>
+
+<para>More detailed user documentation is available from <ulink
+url="help:/kworldclock">help:/kworldclock</ulink> (either enter this
+<acronym>URL</acronym> into &konqueror;, or run
+<userinput><command>khelpcenter</command>
+<parameter>help:/kworldclock</parameter></userinput>).</para>
+
+</refsect1>
+<refsect1><title>Authors</title><para>&kworldclock; was written by
+&Matthias.Hoelzer-Kluepfel;
+&Matthias.Hoelzer-Kluepfel.mail;</para><para>This manual page was
+prepared by <personname><firstname>Ben</firstname><surname>Burton</surname></personname> <email>bab@debian.org</email></para></refsect1>
+</refentry>
diff --git a/doc/kworldclock/screenshot-clock-dialog.png b/doc/kworldclock/screenshot-clock-dialog.png
new file mode 100644
index 0000000..7477ef6
--- /dev/null
+++ b/doc/kworldclock/screenshot-clock-dialog.png
Binary files differ
diff --git a/doc/kworldclock/screenshot-mlb.png b/doc/kworldclock/screenshot-mlb.png
new file mode 100644
index 0000000..8d3c54c
--- /dev/null
+++ b/doc/kworldclock/screenshot-mlb.png
Binary files differ
diff --git a/doc/kworldclock/screenshot-quairading-clock.png b/doc/kworldclock/screenshot-quairading-clock.png
new file mode 100644
index 0000000..8ab7d23
--- /dev/null
+++ b/doc/kworldclock/screenshot-quairading-clock.png
Binary files differ
diff --git a/doc/kworldclock/screenshot-quairading-dialog.png b/doc/kworldclock/screenshot-quairading-dialog.png
new file mode 100644
index 0000000..17bda5e
--- /dev/null
+++ b/doc/kworldclock/screenshot-quairading-dialog.png
Binary files differ
diff --git a/doc/kworldclock/screenshot-rmb-cities.png b/doc/kworldclock/screenshot-rmb-cities.png
new file mode 100644
index 0000000..14c6048
--- /dev/null
+++ b/doc/kworldclock/screenshot-rmb-cities.png
Binary files differ
diff --git a/doc/kworldclock/screenshot-rmb-clock.png b/doc/kworldclock/screenshot-rmb-clock.png
new file mode 100644
index 0000000..4f35d24
--- /dev/null
+++ b/doc/kworldclock/screenshot-rmb-clock.png
Binary files differ
diff --git a/doc/kworldclock/screenshot-rmb-daylight.png b/doc/kworldclock/screenshot-rmb-daylight.png
new file mode 100644
index 0000000..6371b88
--- /dev/null
+++ b/doc/kworldclock/screenshot-rmb-daylight.png
Binary files differ
diff --git a/doc/kworldclock/screenshot-rmb-flags.png b/doc/kworldclock/screenshot-rmb-flags.png
new file mode 100644
index 0000000..17eec15
--- /dev/null
+++ b/doc/kworldclock/screenshot-rmb-flags.png
Binary files differ
diff --git a/doc/kworldclock/screenshot-withclocks.png b/doc/kworldclock/screenshot-withclocks.png
new file mode 100644
index 0000000..73f71a1
--- /dev/null
+++ b/doc/kworldclock/screenshot-withclocks.png
Binary files differ
diff --git a/doc/kworldclock/screenshot-withflags.png b/doc/kworldclock/screenshot-withflags.png
new file mode 100644
index 0000000..d1efbec
--- /dev/null
+++ b/doc/kworldclock/screenshot-withflags.png
Binary files differ
diff --git a/doc/kworldclock/screenshot.png b/doc/kworldclock/screenshot.png
new file mode 100644
index 0000000..3b342ff
--- /dev/null
+++ b/doc/kworldclock/screenshot.png
Binary files differ
diff --git a/eyesapplet/Makefile.am b/eyesapplet/Makefile.am
new file mode 100644
index 0000000..964c446
--- /dev/null
+++ b/eyesapplet/Makefile.am
@@ -0,0 +1,20 @@
+INCLUDES = $(all_includes)
+
+kde_module_LTLIBRARIES = eyes_panelapplet.la
+
+eyes_panelapplet_la_SOURCES = eyes.cpp
+
+METASOURCES = AUTO
+noinst_HEADERS = eyes.h
+
+lnkdir = $(kde_datadir)/kicker/applets
+lnk_DATA = eyesapplet.desktop
+
+EXTRA_DIST = $(lnk_DATA)
+
+eyes_panelapplet_la_LDFLAGS = $(KDE_PLUGIN) -module $(all_libraries)
+eyes_panelapplet_la_LIBADD = $(LIB_KDEUI)
+
+messages:
+ $(XGETTEXT) *.cpp *.h -o $(podir)/keyesapplet.pot
+
diff --git a/eyesapplet/configure.in.in b/eyesapplet/configure.in.in
new file mode 100644
index 0000000..f9df512
--- /dev/null
+++ b/eyesapplet/configure.in.in
@@ -0,0 +1,3 @@
+if test "x$kde_use_qt_mac" = "xyes"; then
+ DO_NOT_COMPILE="$DO_NOT_COMPILE eyesapplet"
+fi
diff --git a/eyesapplet/eyes.cpp b/eyesapplet/eyes.cpp
new file mode 100644
index 0000000..99d8e55
--- /dev/null
+++ b/eyesapplet/eyes.cpp
@@ -0,0 +1,202 @@
+/*
+ * Copyright (c) 2000 Matthias Elter <elter@kde.org>
+ * based on keyes (C) 1999 by Jerome Tollet <tollet@magic.fr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+
+#include <math.h>
+
+#include <qpainter.h>
+#include <qcursor.h>
+#include <qimage.h>
+
+#include <klocale.h>
+#include <kglobal.h>
+#include <kapplication.h>
+
+#include "eyes.h"
+#include "eyes.moc"
+
+#define AAFACTOR 4
+
+extern "C"
+{
+ KDE_EXPORT KPanelApplet* init(QWidget *parent, const QString& configFile)
+ {
+ KGlobal::locale()->insertCatalogue("keyesapplet");
+ EyesApplet *applet = new EyesApplet(configFile, KPanelApplet::Normal, 0, parent, "keyesapplet");
+ return applet;
+ }
+}
+
+EyesApplet::EyesApplet(const QString& configFile, Type t, int actions,
+ QWidget *parent, const char *name)
+ : KPanelApplet( configFile, t, actions, parent, name )
+{
+ setWFlags(WNoAutoErase);
+ setBackgroundOrigin(AncestorOrigin);
+ startTimer(50);
+ oldleft = QPoint(-1, -1);
+ oldright = QPoint(-1, -1);
+ oldMouse = QPoint(-1, -1);
+}
+
+int EyesApplet::widthForHeight(int h) const
+{
+ return static_cast<int>(1.4 * h); // rectangular shape.
+}
+int EyesApplet::heightForWidth(int w) const
+{
+ return static_cast<int>(w / 1.4); // rectangular shape.
+}
+
+void EyesApplet::resizeEvent( QResizeEvent*e )
+{
+ QWidget::resizeEvent(e);
+}
+
+void EyesApplet::timerEvent(QTimerEvent*)
+{
+ QPoint mouse = mapFromGlobal(QCursor::pos());
+ if (mouse != oldMouse)
+ update();
+}
+
+void EyesApplet::paintEvent(QPaintEvent*)
+{
+ int spWidth = width() * AAFACTOR;
+ int spHeight = height() * AAFACTOR;
+
+ if (spWidth != _cache.width() || spHeight != _cache.height())
+ _cache.resize(spWidth, spHeight);
+
+ QPainter paint(&_cache);
+
+ if (paletteBackgroundPixmap())
+ {
+ QPixmap bg(width(), height());
+ QPainter p(&bg);
+ QPoint offset = backgroundOffset();
+ p.drawTiledPixmap(0, 0, width(), height(), *paletteBackgroundPixmap(), offset.x(), offset.y());
+ p.end();
+ QImage bgImage = bg.convertToImage().scale(spWidth, spHeight);
+ paint.drawImage(0, 0, bgImage);
+ }
+ else
+ {
+ _cache.fill(paletteBackgroundColor());
+ }
+
+ // draw eyes, no pupils
+ paint.setPen(QPen(black, 2 * AAFACTOR));
+ paint.setBrush(QBrush(white));
+
+ int w = spWidth; // - AAFACTOR * 2;
+ int h = spHeight; // - AAFACTOR * 2;
+
+ // left eye
+ paint.drawEllipse(AAFACTOR, AAFACTOR, w/2 - AAFACTOR, h - AAFACTOR * 2);
+
+ // right eye
+ paint.drawEllipse(w/2, AAFACTOR, w/2 - AAFACTOR, h - AAFACTOR * 2);
+
+ // draw pupils
+ drawPupils(&paint);
+ paint.end();
+
+ QPainter paintFinal(this);
+ QImage spImage = _cache.convertToImage();
+ QImage displayImage = spImage.smoothScale(size());
+ paintFinal.drawImage(0, 0, displayImage);
+ paintFinal.end();
+}
+
+void EyesApplet::drawPupils(QPainter* p)
+{
+ QPoint pos, mouse, vect;
+ double cos_alpha,sin_alpha;
+
+ int w = width() * AAFACTOR;
+ int h = height() * AAFACTOR;
+
+ oldMouse = mapFromGlobal(QCursor::pos());
+ mouse = oldMouse * AAFACTOR;
+ int tmp = QMIN(h, w)/6;
+
+ // left pupil
+ vect.setX(mouse.x() - h / 4);
+ vect.setY(mouse.y() - h / 2);
+
+ cos_alpha = vect.x() / sqrt(double(vect.x() * vect.x() + vect.y() * vect.y()));
+ sin_alpha = vect.y() / sqrt(double(vect.x() * vect.x() + vect.y() * vect.y()));
+
+ if(vect.x() * vect.x() + vect.y() * vect.y() > (w/4 - tmp) * (w/4 - tmp)*
+ cos_alpha * cos_alpha+ (h/2-tmp) * (h/2-tmp) * sin_alpha * sin_alpha) {
+ pos.setX(int((w/4-tmp) * cos_alpha+w/4));
+ pos.setY(int((h/2-tmp) * sin_alpha+h/2));
+ }
+ else
+ pos = mouse;
+
+ if(pos != oldleft) {
+
+ int sizeEye=QMIN(h,w)/6;
+
+// // draw over old pos
+// p->setPen(QPen(NoPen));
+// p->setBrush(QBrush(white));
+// p->drawEllipse(oldleft.x() - sizeEye/2, oldleft.y() - sizeEye/2, sizeEye, sizeEye);
+
+ // draw left pupil
+ p->setPen(QPen(NoPen));
+ p->setBrush(QBrush(black));
+ p->drawEllipse(pos.x() - sizeEye/2, pos.y() - sizeEye/2, sizeEye, sizeEye);
+
+ //oldleft = pos;
+ }
+
+ // right pupil
+ vect.setX(mouse.x() - 3*w/4);
+ vect.setY(mouse.y() - h/2);
+
+ cos_alpha = vect.x()/sqrt(double(vect.x()*vect.x()+vect.y()*vect.y()));
+ sin_alpha = vect.y()/sqrt(double(vect.x()*vect.x()+vect.y()*vect.y()));
+
+ if(vect.x()*vect.x() + vect.y()*vect.y() > (w/4-tmp)*(w/4-tmp)
+ *cos_alpha*cos_alpha+(h/2-tmp)*(h/2-tmp)*sin_alpha*sin_alpha)
+ {
+ pos.setX(int((w/4-tmp)*cos_alpha+3*w/4));
+ pos.setY(int((h/2-tmp)*sin_alpha+h/2));
+ }
+ else
+ pos = mouse;
+
+ if(pos != oldright) {
+
+ int sizeEye=QMIN(h,w)/6;
+
+// // draw over old pos
+// p->setPen(QPen(NoPen));
+// p->setBrush(QBrush(white));
+// p->drawEllipse(oldright.x() - sizeEye/2, oldright.y() - sizeEye/2, sizeEye, sizeEye);
+
+ // draw left pupil
+ p->setPen(QPen(NoPen));
+ p->setBrush(QBrush(black));
+ p->drawEllipse(pos.x() - sizeEye/2, pos.y() - sizeEye/2, sizeEye, sizeEye);
+
+ //oldright = pos;
+ }
+}
diff --git a/eyesapplet/eyes.h b/eyesapplet/eyes.h
new file mode 100644
index 0000000..2bb8d72
--- /dev/null
+++ b/eyesapplet/eyes.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2000 Matthias Elter <elter@kde.org>
+ * based on keyes (C) 1999 by Jerome Tollet <tollet@magic.fr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+
+#ifndef __eyes_h__
+#define __eyes_h__
+
+#include <qpixmap.h>
+#include <kpanelapplet.h>
+
+class EyesApplet : public KPanelApplet
+{
+ Q_OBJECT
+
+public:
+ EyesApplet(const QString& configFile, Type t = Normal, int actions = 0,
+ QWidget *parent = 0, const char *name = 0);
+
+ int widthForHeight(int height) const;
+ int heightForWidth(int width) const;
+
+protected:
+ void timerEvent(QTimerEvent*);
+ void resizeEvent(QResizeEvent*);
+ void paintEvent(QPaintEvent*);
+
+private:
+ void drawPupils(QPainter* p);
+
+ QPoint oldleft, oldright, oldMouse;
+ QPixmap _cache;
+};
+
+#endif // __eyes_h__
diff --git a/eyesapplet/eyesapplet.desktop b/eyesapplet/eyesapplet.desktop
new file mode 100644
index 0000000..7ffeda1
--- /dev/null
+++ b/eyesapplet/eyesapplet.desktop
@@ -0,0 +1,120 @@
+[Desktop Entry]
+Type=Plugin
+Name=Eyes
+Name[af]=Oë
+Name[ar]=عيون
+Name[az]=Gözlər
+Name[be]=Вочы
+Name[bg]=Очички
+Name[bn]=চোখ
+Name[br]=Daoulagad
+Name[bs]=OÄi
+Name[ca]=Ulls
+Name[cs]=OÄi
+Name[cy]=Llygaid
+Name[da]=Øjne
+Name[de]=Augen
+Name[el]=Μάτια
+Name[eo]=Okuloj
+Name[es]=Ojos
+Name[et]=Silmad
+Name[eu]=Begiak
+Name[fa]=چشمها
+Name[fi]=Silmät
+Name[fo]=Eygu
+Name[fr]=Yeux
+Name[gl]=Ollos
+Name[he]=×¢×™× ×™×™×
+Name[hi]=आà¤à¤–ें
+Name[hr]=OÄi
+Name[hu]=Szemek
+Name[is]=Augu
+Name[it]=Occhi
+Name[km]=ភ្នែក
+Name[ko]=눈
+Name[lt]=Akys
+Name[lv]=Acis
+Name[mk]=Очи
+Name[mt]=Għajnejn
+Name[nb]=Øyne
+Name[nds]=Ogen
+Name[ne]=आà¤à¤–ा
+Name[nl]=Ogen
+Name[nn]=Auge
+Name[pa]=ਅੱਖਾਂ
+Name[pl]=Oczy
+Name[pt]=Olhos
+Name[pt_BR]=Olhos
+Name[ro]=Ochi
+Name[ru]=Глаза
+Name[sk]=OÄi
+Name[sl]=OÄi
+Name[sr]=Очи
+Name[sr@Latn]=OÄi
+Name[sv]=Ögon
+Name[ta]= கணà¯à®•à®³à¯
+Name[tg]=Чашмҳо
+Name[th]=ดวงตา
+Name[tr]=Gözler
+Name[uk]=Очі
+Name[uz]=Koʻzlar
+Name[uz@cyrillic]=Кўзлар
+Name[ven]=Mato
+Name[wa]=Ouys
+Name[xh]=Amehlo
+Name[zh_CN]=眼ç›
+Name[zh_TW]=眼ç›
+Name[zu]=Amehlo
+
+Comment=Keeps an eye on your mouse pointer
+Comment[ar]=عين تلاحق دوماً مؤشر الÙأرة
+Comment[be]=Сочаць за мышшу
+Comment[bg]=Очички, които ÑледÑÑ‚ показалеца на мишката
+Comment[bn]=মাউস পয়েনà§à¦Ÿà¦¾à¦°à§‡à¦° ওপর চোখ রাখে
+Comment[ca]=Vigila el cursor del ratolí
+Comment[cs]=OÄi sledující ukazatel myÅ¡i
+Comment[cy]=Yn cadw llygad ar bwyntydd eich llygoden
+Comment[da]=Holder øje med din musemarkør
+Comment[de]=Beobachtet Ihren Mauszeiger
+Comment[el]=Ακολουθεί το δÏομέα του Ï€Î¿Î½Ï„Î¹ÎºÎ¹Î¿Ï ÏƒÎ±Ï‚
+Comment[eo]=Konservu okulon sur via musmontrilo
+Comment[es]=Echa una ojeada al puntero del ratón
+Comment[et]=Utiliit, mis hoiab su hiirekursoril silma peal
+Comment[eu]=Begi bat zure saguaren erakuslean mantentzen du
+Comment[fa]=به اشاره‌گر موشی چشم می‌دوزد
+Comment[fi]=Silmäilee hiiriosoitintasi
+Comment[fr]=Garde un Å“il sur le pointeur de votre souris
+Comment[ga]=Coinnigh súil ar do phointeoir luiche
+Comment[gl]=Non perde de vista o ponteiro do rato
+Comment[he]=עוקב ×חרי הסמן של העכבר שלך
+Comment[hr]=Drži oko na pokazivaÄu miÅ¡a
+Comment[hu]=Az egérmozgás figyelése
+Comment[is]=Fylgist með músarbendlinum
+Comment[it]=Fissa un occhio sul puntatore del mouse
+Comment[ja]=マウスãƒã‚¤ãƒ³ã‚¿ã‚’追ã„ã‹ã‘ã‚‹ç›®
+Comment[km]=ចាំ​យាម​មើលព្រួញ​កណ្ដុរ​របស់​អ្នក
+Comment[lv]=Pieskata jūsu peli
+Comment[mk]=Го Ñледи движењето на вашиот покажувач
+Comment[nb]=Holder et øye med musepekeren din
+Comment[nds]=Beluert Dien Muuswieser
+Comment[ne]=तपाईà¤à¤•à¥‹ माउस पोइनà¥à¤Ÿà¤°à¤®à¤¾ आà¤à¤–ा राखà¥à¤¦à¤›
+Comment[nl]=Houdt een oogje op uw muisaanwijzer
+Comment[nn]=Held auge med musepeikaren
+Comment[pl]=Trzyma oko na Twój kursor myszy
+Comment[pt]=Vigia o ponteiro do rato
+Comment[pt_BR]=Vigia o ponteiro do seu mouse
+Comment[ro]=Urmăreşte cursorul mouse-ului
+Comment[ru]=Ðе Ñводит глаз Ñ Ð¼Ñ‹ÑˆÐ¸
+Comment[sk]=Drží pohľad na kurzor myši
+Comment[sl]=Z oÄmi spremlja kazalec vaÅ¡e miÅ¡ke
+Comment[sr]=Прати погледом ваш показивач миша
+Comment[sr@Latn]=Prati pogledom vaÅ¡ pokazivaÄ miÅ¡a
+Comment[sv]=Håller ett öga på muspekaren
+Comment[tg]=Ðишонаи мушро нигоҳ дошта иÑтодааÑÑ‚
+Comment[tr]=Gözlerin fare imlecinizi takip etmesini sağlar
+Comment[uk]=СпоÑтерігає за Ñтрілкою мишки
+Comment[zh_CN]=盯ç€æ‚¨é¼ æ ‡æŒ‡é’ˆçš„眼ç›
+Comment[zh_TW]=讓眼ç›ç›¯è‘—滑鼠游標跑
+
+Icon=xeyes
+X-KDE-Library=eyes_panelapplet
diff --git a/fifteenapplet/Makefile.am b/fifteenapplet/Makefile.am
new file mode 100644
index 0000000..b2e4c3d
--- /dev/null
+++ b/fifteenapplet/Makefile.am
@@ -0,0 +1,19 @@
+INCLUDES = $(all_includes)
+
+kde_module_LTLIBRARIES = fifteen_panelapplet.la
+
+fifteen_panelapplet_la_SOURCES = fifteenapplet.cpp qttableview.cpp
+
+METASOURCES = AUTO
+noinst_HEADERS = fifteenapplet.h
+
+lnkdir = $(kde_datadir)/kicker/applets
+lnk_DATA = kfifteenapplet.desktop
+
+EXTRA_DIST = $(lnk_DATA)
+
+fifteen_panelapplet_la_LDFLAGS = $(KDE_PLUGIN) -module $(all_libraries)
+fifteen_panelapplet_la_LIBADD = $(LIB_KDEUI)
+
+messages:
+ $(XGETTEXT) *.cpp *.h -o $(podir)/kfifteenapplet.pot
diff --git a/fifteenapplet/fifteenapplet.cpp b/fifteenapplet/fifteenapplet.cpp
new file mode 100644
index 0000000..d55221a
--- /dev/null
+++ b/fifteenapplet/fifteenapplet.cpp
@@ -0,0 +1,321 @@
+/*****************************************************************
+
+Copyright (c) 2001 Matthias Elter <elter@kde.org>
+
+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 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.
+
+******************************************************************/
+
+#include <stdlib.h>
+#include <time.h>
+
+#include <qlayout.h>
+#include <qpainter.h>
+#include <qpopupmenu.h>
+
+#include <klocale.h>
+#include <kglobal.h>
+#include <kmessagebox.h>
+#include <kaboutapplication.h>
+
+#include "fifteenapplet.h"
+#include "fifteenapplet.moc"
+
+extern "C"
+{
+ KDE_EXPORT KPanelApplet* init(QWidget *parent, const QString& configFile)
+ {
+ KGlobal::locale()->insertCatalogue("kfifteenapplet");
+ return new FifteenApplet(configFile, KPanelApplet::Normal,
+ KPanelApplet::About, parent, "kfifteenapplet");
+ }
+}
+
+FifteenApplet::FifteenApplet(const QString& configFile, Type type, int actions,
+ QWidget *parent, const char *name)
+ : KPanelApplet(configFile, type, actions, parent, name), _aboutData(0)
+{
+ // setup table
+ _table = new PiecesTable(this);
+ setCustomMenu(_table->popup());
+
+ // setup layout
+ QHBoxLayout *_layout = new QHBoxLayout(this);
+ _layout->add(_table);
+
+ srand(time(0));
+}
+
+int FifteenApplet::widthForHeight(int h) const
+{
+ return h; // we want to be quadratic
+}
+
+int FifteenApplet::heightForWidth(int w) const
+{
+ return w; // we want to be quadratic
+}
+
+void FifteenApplet::about()
+{
+ if(!_aboutData) {
+ _aboutData = new KAboutData("kfifteenapplet", I18N_NOOP("KFifteenApplet"), "1.0",
+ I18N_NOOP("Fifteen pieces applet.\n\n"
+ "The goal is to put the sliding pieces into numerical order.\n"
+ "Select \"Randomize Pieces\" from the right mouse button menu\n"
+ "to start a game."),
+ KAboutData::License_BSD, "(c) 2001, Matthias Elter");
+ _aboutData->addAuthor("Matthias Elter", 0, "elter@kde.org");
+ }
+
+ KAboutApplication dialog(_aboutData);
+ dialog.exec();
+}
+
+PiecesTable::PiecesTable(QWidget* parent, const char* name )
+ : QtTableView(parent, name), _activeRow(-1), _activeCol(-1), _randomized(false)
+{
+ _menu = new QPopupMenu(this);
+ _menu->insertItem(i18n("R&andomize Pieces"), this, SLOT(randomizeMap()));
+ _menu->insertItem(i18n("&Reset Pieces"), this, SLOT(resetMap()));
+ _menu->adjustSize(); // setup table view
+
+ setFrameStyle(StyledPanel | Sunken);
+ setBackgroundMode(NoBackground);
+ setMouseTracking(true);
+
+ setNumRows(4);
+ setNumCols(4);
+
+ // init arrays
+ initMap();
+ initColors();
+}
+
+void PiecesTable::paintCell(QPainter *p, int row, int col)
+{
+ int w = cellWidth();
+ int h = cellHeight();
+ int x2 = w - 1;
+ int y2 = h - 1;
+
+ int number = _map[col + row * numCols()] + 1;
+
+ bool active = (row == _activeRow && col == _activeCol);
+
+ // draw cell background
+ if(number == 16)
+ p->setBrush(colorGroup().background());
+ else
+ p->setBrush(_colors[number-1]);
+ p->setPen(NoPen);
+ p->drawRect(0, 0, w, h);
+
+ // draw borders
+ if (height() > 40) {
+ p->setPen(colorGroup().text());
+ if(col < numCols()-1)
+ p->drawLine(x2, 0, x2, y2); // right border line
+
+ if(row < numRows()-1)
+ p->drawLine(0, y2, x2, y2); // bottom boder line
+ }
+
+ // draw number
+ if (number == 16) return;
+ if(active)
+ p->setPen(white);
+ else
+ p->setPen(black);
+ p->drawText(0, 0, x2, y2, AlignHCenter | AlignVCenter, QString::number(number));
+}
+
+void PiecesTable::resizeEvent(QResizeEvent *e)
+{
+ QtTableView::resizeEvent(e);
+
+ // set font
+ QFont f = font();
+ if (height() > 50)
+ f.setPixelSize(8);
+ else if (height() > 40)
+ f.setPixelSize(7);
+ else if (height() > 24)
+ f.setPixelSize(5);
+ else
+ f.setPixelSize(3);
+
+ setFont(f);
+
+ setCellWidth(contentsRect().width()/ numRows());
+ setCellHeight(contentsRect().height() / numCols());
+}
+
+void PiecesTable::initColors()
+{
+ _colors.resize(numRows() * numCols());
+ for (int r = 0; r < numRows(); r++)
+ for (int c = 0; c < numCols(); c++)
+ _colors[c + r *numCols()] = QColor(255 - 70 * c,255 - 70 * r, 150);
+}
+
+void PiecesTable::initMap()
+{
+ _map.resize(16);
+ for (unsigned int i = 0; i < 16; i++)
+ _map[i] = i;
+
+ _randomized = false;
+}
+
+void PiecesTable::randomizeMap()
+{
+ QMemArray<int> positions;
+ positions.fill(0, 16);
+
+ for (unsigned int i = 0; i < 16; i++) {
+ while(1) {
+ int r = (int) (((double)rand() / RAND_MAX) * 16);
+ if(positions[r] == 0) {
+ _map[i] = r;
+ positions[r] = 1;
+ break;
+ }
+ }
+ }
+ repaint();
+ _randomized = true;
+}
+
+void PiecesTable::resetMap()
+{
+ initMap();
+ repaint();
+}
+
+void PiecesTable::checkwin()
+{
+ if(!_randomized) return;
+
+ int i;
+ for (i = 0; i < 16; i++)
+ if(i != _map[i])
+ break;
+
+ if (i == 16)
+ KMessageBox::information(this, i18n("Congratulations!\nYou win the game!"), i18n("Fifteen Pieces"));
+}
+
+void PiecesTable::mousePressEvent(QMouseEvent* e)
+{
+ QtTableView::mousePressEvent(e);
+
+ if (e->button() == RightButton) {
+ // execute RMB popup and check result
+ _menu->exec(mapToGlobal(e->pos()));
+ e->accept();
+ return;
+ }
+ else {
+ // GAME LOGIC
+
+ // find the free position
+ int pos = _map.find(15);
+ if(pos < 0) return;
+
+ int frow = pos / numCols();
+ int fcol = pos - frow * numCols();
+
+ // find click position
+ int row = findRow(e->y());
+ int col = findCol(e->x());
+
+ // sanity check
+ if (row < 0 || row >= numRows()) return;
+ if (col < 0 || col >= numCols()) return;
+
+ // valid move?
+ if(row != frow && col != fcol) return;
+
+ // rows match -> shift pieces
+ if(row == frow) {
+
+ if (col < fcol) {
+ for(int c = fcol; c > col; c--) {
+ _map[c + row * numCols()] = _map[ c-1 + row *numCols()];
+ updateCell(row, c, false);
+ }
+ }
+ else if (col > fcol) {
+ for(int c = fcol; c < col; c++) {
+ _map[c + row * numCols()] = _map[ c+1 + row *numCols()];
+ updateCell(row, c, false);
+ }
+ }
+ }
+ // cols match -> shift pieces
+ else if (col == fcol) {
+
+ if (row < frow) {
+ for(int r = frow; r > row; r--) {
+ _map[col + r * numCols()] = _map[ col + (r-1) *numCols()];
+ updateCell(r, col, false);
+ }
+ }
+ else if (row > frow) {
+ for(int r = frow; r < row; r++) {
+ _map[col + r * numCols()] = _map[ col + (r+1) *numCols()];
+ updateCell(r, col, false);
+ }
+ }
+ }
+ // move free cell to click position
+ _map[col + row * numCols()] = 15;
+ updateCell(row, col, false);
+
+ // check if the player wins with this move
+ checkwin();
+ }
+}
+
+void PiecesTable::mouseMoveEvent(QMouseEvent* e)
+{
+ QtTableView::mouseMoveEvent(e);
+
+ // highlight on mouse over
+ int row = findRow(e->y());
+ int col = findCol(e->x());
+
+ int oldrow = _activeRow;
+ int oldcol = _activeCol;
+
+ if(row >= numRows()
+ || col >= numCols()
+ || row < 0
+ || col < 0) {
+ _activeRow = -1;
+ _activeCol = -1;
+ }
+ else {
+ _activeRow = row;
+ _activeCol = col;
+ }
+
+ updateCell(oldrow, oldcol, false);
+ updateCell(row, col, false);
+}
diff --git a/fifteenapplet/fifteenapplet.h b/fifteenapplet/fifteenapplet.h
new file mode 100644
index 0000000..21f431c
--- /dev/null
+++ b/fifteenapplet/fifteenapplet.h
@@ -0,0 +1,84 @@
+/*****************************************************************
+
+Copyright (c) 2001 Matthias Elter <elter@kde.org>
+
+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 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.
+
+******************************************************************/
+
+#ifndef __fifteenapplet_h__
+#define __fifteenapplet_h__
+
+#include "qttableview.h"
+#include <qmemarray.h>
+
+#include <kpanelapplet.h>
+
+class QPopupMenu;
+class KAboutData;
+
+class PiecesTable : public QtTableView
+{
+ Q_OBJECT
+
+public:
+ PiecesTable(QWidget* parent = 0, const char* name = 0);
+ QPopupMenu* popup() { return _menu; }
+
+protected:
+ void resizeEvent(QResizeEvent*);
+ void mousePressEvent(QMouseEvent*);
+ void mouseMoveEvent(QMouseEvent*);
+
+ void paintCell(QPainter *, int row, int col);
+
+ void initMap();
+ void initColors();
+ void checkwin();
+
+protected slots:
+ void randomizeMap();
+ void resetMap();
+
+private:
+ QMemArray<int> _map;
+ QMemArray<QColor> _colors;
+ QPopupMenu *_menu;
+ int _activeRow, _activeCol;
+ bool _randomized;
+};
+
+class FifteenApplet : public KPanelApplet
+{
+ Q_OBJECT
+
+public:
+ FifteenApplet(const QString& configFile, Type t = Stretch, int actions = 0,
+ QWidget *parent = 0, const char *name = 0);
+
+ int widthForHeight(int height) const;
+ int heightForWidth(int width) const;
+
+ void about();
+
+private:
+ PiecesTable *_table;
+ KAboutData *_aboutData;
+};
+
+#endif
diff --git a/fifteenapplet/kfifteenapplet.desktop b/fifteenapplet/kfifteenapplet.desktop
new file mode 100644
index 0000000..a8094e9
--- /dev/null
+++ b/fifteenapplet/kfifteenapplet.desktop
@@ -0,0 +1,118 @@
+[Desktop Entry]
+Type=Plugin
+Name=Fifteen Pieces
+Name[af]=Vyftien Dele
+Name[ar]=خمسة عشرة قطعة
+Name[az]=On beş Parça
+Name[be]=ПÑтнаццаць чарапкоў
+Name[bg]=Пъзел от 15 чаÑти
+Name[bn]=পনেরর ধাà¦à¦§à¦¾
+Name[ca]=Quinze peces
+Name[cs]=Patnáct
+Name[cy]=Pymtheg Darn
+Name[de]=Fünfzehn Steine
+Name[el]=Δεκαπέντε κομμάτια
+Name[eo]=Kvindek pecoj
+Name[es]=Quince piezas
+Name[et]=Viisteist tükki
+Name[eu]=Hamabost Zati
+Name[fa]=پانزده قطعه
+Name[fi]=Viisitoista palasta
+Name[fr]=Taquin
+Name[ga]=Cúig Phíosa Déag
+Name[gl]=Quince pezas
+Name[he]=חמישה עשר חלקי×
+Name[hi]=पनà¥à¤¦à¥à¤°à¤¹ टà¥à¤•à¤¡à¤¼à¥‡
+Name[hr]=Petnaest dijelova
+Name[hu]=Tizenötös játék
+Name[is]=Fimmtán hlutir
+Name[it]=Gioco del 15
+Name[ja]=15 ピース
+Name[km]=១៥ បំណែក
+Name[ko]=ì—´ 다섯 ì¡°ê°
+Name[lt]=Penkiolika dalių
+Name[lv]=Piecpadsmit gabali
+Name[mk]=ПетнаеÑет парчиња
+Name[nb]=Femten biter
+Name[nds]=Foffteihn Steen
+Name[ne]=पनà¥à¤§à¥à¤° टà¥à¤•à¥à¤°à¤¾
+Name[nl]=Vijftien stukken
+Name[nn]=Femten brikker
+Name[pa]=ਪੰਦਰਾਂ ਟà©à¨•à©œà©‡
+Name[pl]=Piętnaście kawałków
+Name[pt]=Quinze Peças
+Name[pt_BR]=Quinze peças
+Name[ro]=15 piese
+Name[ru]=ПÑтнашки
+Name[sk]=Hra Pätnásť
+Name[sl]=Petnajst kosov
+Name[sr]=ПетнаеÑÑ‚ парчића
+Name[sr@Latn]=Petnaest parÄića
+Name[sv]=Femtonspel
+Name[ta]= பதினைநà¯à®¤à¯ தà¯à®£à¯à®Ÿà¯à®•à®³à¯
+Name[tg]=Понздаҳ ҚиÑмҳо
+Name[th]=เà¸à¸¡à¸ªà¸´à¸šà¸«à¹‰à¸²à¸Šà¸´à¹‰à¸™
+Name[tr]=Onbeş Parça
+Name[uk]=П'Ñтнашки
+Name[uz]=Oʻn beshta tosh
+Name[uz@cyrillic]=Ўн бешта тош
+Name[ven]=Zwipida zwa fumi na zwitanu
+Name[wa]=Djeu des cwénze pîces
+Name[xh]=Amaceba alishumi elinesihlanu
+Name[zh_CN]=å五å—
+Name[zh_TW]=å五片
+Name[zu]=Izingcezu Ezingamashumi nanhlanu
+Comment=A little game with fifteen pieces
+Comment[ar]= لعبة صغيرة مع خمسة عشرة قطعة
+Comment[be]=ÐœÐ°Ð»ÐµÐ½ÑŒÐºÐ°Ñ Ð³ÑƒÐ»ÑŒÐ½Ñ Ð· пÑтнаццацю чарапкамі
+Comment[bg]=Малък пъзел от 15 чаÑти
+Comment[bn]=পনেরটি টà§à¦•à¦°à§‹à¦° à¦à¦•à¦Ÿà¦¿ ছোট খেলা
+Comment[ca]=Una joguina amb quinze peces
+Comment[cs]=Malá hra s patnácti kameny
+Comment[cy]=Gêm fach efo pymtheg darn
+Comment[da]=Et lille spil med femten brikker
+Comment[de]=Ein kleines Spiel mit fünfzehn Steinen
+Comment[el]=Ένα μικÏÏŒ παιχνίδι με 15 κομμάτια
+Comment[eo]=Ludeto kun dek kvin pecoj
+Comment[es]=Un pequeño juego con quince piezas
+Comment[et]=Väike mäng viieteistkümne klotsiga
+Comment[eu]=Hamabost piezadun joko txiki bat
+Comment[fa]=بازیی کوچک با پانزده قطعه
+Comment[fi]=Pieni 15 palan peli
+Comment[fr]=Un petit jeu de taquin avec 15 pièces
+Comment[ga]=Cluiche beag le cúig phíosa dhéag
+Comment[gl]=Un xogo con quince pezas
+Comment[he]=משחקון ×¢× 15 חלקי×
+Comment[hr]=Mala igra s petnaest dijelova
+Comment[hu]=A klasszikus kirakós játék
+Comment[is]=Lítill leikur með fimmtán hluti
+Comment[it]=Un piccolo gioco composto da quindici pezzi
+Comment[ja]=15 ピースã®ã¡ã‚‡ã£ã¨ã—ãŸã‚²ãƒ¼ãƒ 
+Comment[km]=កូន​ល្បែង​ážáž¼áž…​មួយ​ដែល​មាន​១៥ បំណែក
+Comment[ko]=ì—´ 다섯 ì¡°ê°ì´ 있는 ìž‘ì€ ê²Œìž„
+Comment[lv]=Neliela spēlīte ar piecapdsmit gabaliem
+Comment[mk]=Мала игра Ñо петнаеÑет парчиња
+Comment[nb]=Et lite spill med femten biter
+Comment[nds]=Lütt Speel mit foffteihn Steen
+Comment[ne]=पनà¥à¤§à¥à¤° टà¥à¤•à¥à¤°à¤¾ गरिà¤à¤•à¥‹ सानो खेल
+Comment[nl]=Een klein spel met vijftien stukken
+Comment[nn]=Eit lite spel med femten brikker
+Comment[pl]=Prosta gra w piętnaście kawałków
+Comment[pt]=Um pequeno jogo com quinze peças
+Comment[pt_BR]=Um pequeno jogo com quinze peças
+Comment[ro]=Un mic joc cu 15 piese
+Comment[ru]=Ð’Ñем извеÑÑ‚Ð½Ð°Ñ Ð¸Ð³Ñ€Ð° в пÑтнашки
+Comment[sk]=Malá hra s pätnástimi kúskami
+Comment[sl]=Igrica s petnajstimi delÄki
+Comment[sr]=Игрица Ñа петнаеÑÑ‚ делића
+Comment[sr@Latn]=Igrica sa petnaest delića
+Comment[sv]=Ett litet spel med femton delar
+Comment[tg]=Бозии хурд бо понздах қиÑмҳо
+Comment[tr]=Onbeş parçadan oluşan küçük bir oyun
+Comment[uk]=Маленька гра з 15-ти чаÑтин
+Comment[wa]=On ptit djeu avou cwénze pîces
+Comment[zh_CN]=有å五å—çš„å°æ¸¸æˆ
+Comment[zh_TW]=å五片的å°éŠæˆ²
+Icon=fifteenpieces
+X-KDE-Library=fifteen_panelapplet
+X-KDE-UniqueApplet=false
diff --git a/fifteenapplet/qttableview.cpp b/fifteenapplet/qttableview.cpp
new file mode 100644
index 0000000..7f044d2
--- /dev/null
+++ b/fifteenapplet/qttableview.cpp
@@ -0,0 +1,2274 @@
+/**********************************************************************
+** $Id$
+**
+** Implementation of QtTableView class
+**
+** Created : 941115
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file contains a class moved out of the Qt GUI Toolkit API. It
+** may be used, distributed and modified without limitation.
+**
+**********************************************************************/
+
+#include "qttableview.h"
+#include "qttableview.moc"
+#ifndef QT_NO_QTTABLEVIEW
+#include "qscrollbar.h"
+#include "qpainter.h"
+#include "qdrawutil.h"
+#include <limits.h>
+
+enum ScrollBarDirtyFlags {
+ verGeometry = 0x01,
+ verSteps = 0x02,
+ verRange = 0x04,
+ verValue = 0x08,
+ horGeometry = 0x10,
+ horSteps = 0x20,
+ horRange = 0x40,
+ horValue = 0x80,
+ verMask = 0x0F,
+ horMask = 0xF0
+};
+
+
+#define HSBEXT horizontalScrollBar()->sizeHint().height()
+#define VSBEXT verticalScrollBar()->sizeHint().width()
+
+
+class QCornerSquare : public QWidget // internal class
+{
+public:
+ QCornerSquare( QWidget *, const char* = 0 );
+ void paintEvent( QPaintEvent * );
+};
+
+QCornerSquare::QCornerSquare( QWidget *parent, const char *name )
+ : QWidget( parent, name )
+{
+}
+
+void QCornerSquare::paintEvent( QPaintEvent * )
+{
+}
+
+
+// NOT REVISED
+/*!
+ \class QtTableView qttableview.h
+ \brief The QtTableView class provides an abstract base for tables.
+
+ \obsolete
+
+ A table view consists of a number of abstract cells organized in rows
+ and columns, and a visible part called a view. The cells are identified
+ with a row index and a column index. The top-left cell is in row 0,
+ column 0.
+
+ The behavior of the widget can be finely tuned using
+ setTableFlags(); a typical subclass will consist of little more than a
+ call to setTableFlags(), some table content manipulation and an
+ implementation of paintCell(). Subclasses that need cells with
+ variable width or height must reimplement cellHeight() and/or
+ cellWidth(). Use updateTableSize() to tell QtTableView when the
+ width or height has changed.
+
+ When you read this documentation, it is important to understand the
+ distinctions among the four pixel coordinate systems involved.
+
+ \list 1
+ \i The \e cell coordinates. (0,0) is the top-left corner of a cell.
+ Cell coordinates are used by functions such as paintCell().
+
+ \i The \e table coordinates. (0,0) is the top-left corner of the cell at
+ row 0 and column 0. These coordinates are absolute; that is, they are
+ independent of what part of the table is visible at the moment. They are
+ used by functions such as setXOffset() or maxYOffset().
+
+ \i The \e widget coordinates. (0,0) is the top-left corner of the widget,
+ \e including the frame. They are used by functions such as repaint().
+
+ \i The \e view coordinates. (0,0) is the top-left corner of the view, \e
+ excluding the frame. This is the least-used coordinate system; it is used by
+ functions such as viewWidth(). \endlist
+
+ It is rather unfortunate that we have to use four different
+ coordinate systems, but there was no alternative to provide a flexible and
+ powerful base class.
+
+ Note: The row,column indices are always given in that order,
+ i.e., first the vertical (row), then the horizontal (column). This is
+ the opposite order of all pixel operations, which take first the
+ horizontal (x) and then the vertical (y).
+
+ <img src=qtablevw-m.png> <img src=qtablevw-w.png>
+
+ \warning the functions setNumRows(), setNumCols(), setCellHeight(),
+ setCellWidth(), setTableFlags() and clearTableFlags() may cause
+ virtual functions such as cellWidth() and cellHeight() to be called,
+ even if autoUpdate() is FALSE. This may cause errors if relevant
+ state variables are not initialized.
+
+ \warning Experience has shown that use of this widget tends to cause
+ more bugs than expected and our analysis indicates that the widget's
+ very flexibility is the problem. If QScrollView or QListBox can
+ easily be made to do the job you need, we recommend subclassing
+ those widgets rather than QtTableView. In addition, QScrollView makes
+ it easy to have child widgets inside tables, which QtTableView
+ doesn't support at all.
+
+ \sa QScrollView
+ \link guibooks.html#fowler GUI Design Handbook: Table\endlink
+*/
+
+
+/*!
+ Constructs a table view. The \a parent, \a name and \f arguments
+ are passed to the QFrame constructor.
+
+ The \link setTableFlags() table flags\endlink are all cleared (set to 0).
+ Set \c Tbl_autoVScrollBar or \c Tbl_autoHScrollBar to get automatic scroll
+ bars and \c Tbl_clipCellPainting to get safe clipping.
+
+ The \link setCellHeight() cell height\endlink and \link setCellWidth()
+ cell width\endlink are set to 0.
+
+ Frame line shapes (QFrame::HLink and QFrame::VLine) are disallowed;
+ see QFrame::setFrameStyle().
+
+ Note that the \a f argument is \e not \link setTableFlags() table
+ flags \endlink but rather \link QWidget::QWidget() widget
+ flags. \endlink
+
+*/
+
+QtTableView::QtTableView( QWidget *parent, const char *name, WFlags f )
+ : QFrame( parent, name, f )
+{
+ nRows = nCols = 0; // zero rows/cols
+ xCellOffs = yCellOffs = 0; // zero offset
+ xCellDelta = yCellDelta = 0; // zero cell offset
+ xOffs = yOffs = 0; // zero total pixel offset
+ cellH = cellW = 0; // user defined cell size
+ tFlags = 0;
+ vScrollBar = hScrollBar = 0; // no scroll bars
+ cornerSquare = 0;
+ sbDirty = 0;
+ eraseInPaint = FALSE;
+ verSliding = FALSE;
+ verSnappingOff = FALSE;
+ horSliding = FALSE;
+ horSnappingOff = FALSE;
+ coveringCornerSquare = FALSE;
+ inSbUpdate = FALSE;
+}
+
+/*!
+ Destroys the table view.
+*/
+
+QtTableView::~QtTableView()
+{
+ delete vScrollBar;
+ delete hScrollBar;
+ delete cornerSquare;
+}
+
+
+/*!
+ \internal
+ Reimplements QWidget::setBackgroundColor() for binary compatibility.
+ \sa setPalette()
+*/
+
+void QtTableView::setBackgroundColor( const QColor &c )
+{
+ QWidget::setBackgroundColor( c );
+}
+
+/*!\reimp
+*/
+
+void QtTableView::setPalette( const QPalette &p )
+{
+ QWidget::setPalette( p );
+}
+
+/*!\reimp
+*/
+
+void QtTableView::show()
+{
+ showOrHideScrollBars();
+ QWidget::show();
+}
+
+
+/*!
+ \overload void QtTableView::repaint( bool erase )
+ Repaints the entire view.
+*/
+
+/*!
+ Repaints the table view directly by calling paintEvent() directly
+ unless updates are disabled.
+
+ Erases the view area \a (x,y,w,h) if \a erase is TRUE. Parameters \a
+ (x,y) are in \e widget coordinates.
+
+ If \a w is negative, it is replaced with <code>width() - x</code>.
+ If \a h is negative, it is replaced with <code>height() - y</code>.
+
+ Doing a repaint() usually is faster than doing an update(), but
+ calling update() many times in a row will generate a single paint
+ event.
+
+ At present, QtTableView is the only widget that reimplements \link
+ QWidget::repaint() repaint()\endlink. It does this because by
+ clearing and then repainting one cell at at time, it can make the
+ screen flicker less than it would otherwise. */
+
+void QtTableView::repaint( int x, int y, int w, int h, bool erase )
+{
+ if ( !isVisible() || testWState(WState_BlockUpdates) )
+ return;
+ if ( w < 0 )
+ w = width() - x;
+ if ( h < 0 )
+ h = height() - y;
+ QRect r( x, y, w, h );
+ if ( r.isEmpty() )
+ return; // nothing to do
+ QPaintEvent e( r );
+ if ( erase && backgroundMode() != NoBackground )
+ eraseInPaint = TRUE; // erase when painting
+ paintEvent( &e );
+ eraseInPaint = FALSE;
+}
+
+/*!
+ \overload void QtTableView::repaint( const QRect &r, bool erase )
+ Replaints rectangle \a r. If \a erase is TRUE draws the background
+ using the palette's background.
+*/
+
+
+/*!
+ \fn int QtTableView::numRows() const
+ Returns the number of rows in the table.
+ \sa numCols(), setNumRows()
+*/
+
+/*!
+ Sets the number of rows of the table to \a rows (must be non-negative).
+ Does not change topCell().
+
+ The table repaints itself automatically if autoUpdate() is set.
+
+ \sa numCols(), setNumCols(), numRows()
+*/
+
+void QtTableView::setNumRows( int rows )
+{
+ if ( rows < 0 ) {
+#if defined(QT_CHECK_RANGE)
+ qWarning( "QtTableView::setNumRows: (%s) Negative argument %d.",
+ name( "unnamed" ), rows );
+#endif
+ return;
+ }
+ if ( nRows == rows )
+ return;
+
+ if ( autoUpdate() && isVisible() ) {
+ int oldLastVisible = lastRowVisible();
+ int oldTopCell = topCell();
+ nRows = rows;
+ if ( autoUpdate() && isVisible() &&
+ ( oldLastVisible != lastRowVisible() || oldTopCell != topCell() ) )
+ repaint( oldTopCell != topCell() );
+ } else {
+ // Be more careful - if destructing, bad things might happen.
+ nRows = rows;
+ }
+ updateScrollBars( verRange );
+ updateFrameSize();
+}
+
+/*!
+ \fn int QtTableView::numCols() const
+ Returns the number of columns in the table.
+ \sa numRows(), setNumCols()
+*/
+
+/*!
+ Sets the number of columns of the table to \a cols (must be non-negative).
+ Does not change leftCell().
+
+ The table repaints itself automatically if autoUpdate() is set.
+
+ \sa numCols(), numRows(), setNumRows()
+*/
+
+void QtTableView::setNumCols( int cols )
+{
+ if ( cols < 0 ) {
+#if defined(QT_CHECK_RANGE)
+ qWarning( "QtTableView::setNumCols: (%s) Negative argument %d.",
+ name( "unnamed" ), cols );
+#endif
+ return;
+ }
+ if ( nCols == cols )
+ return;
+ int oldCols = nCols;
+ nCols = cols;
+ if ( autoUpdate() && isVisible() ) {
+ int maxCol = lastColVisible();
+ if ( maxCol >= oldCols || maxCol >= nCols )
+ repaint();
+ }
+ updateScrollBars( horRange );
+ updateFrameSize();
+}
+
+
+/*!
+ \fn int QtTableView::topCell() const
+ Returns the index of the first row in the table that is visible in
+ the view. The index of the first row is 0.
+ \sa leftCell(), setTopCell()
+*/
+
+/*!
+ Scrolls the table so that \a row becomes the top row.
+ The index of the very first row is 0.
+ \sa setYOffset(), setTopLeftCell(), setLeftCell()
+*/
+
+void QtTableView::setTopCell( int row )
+{
+ setTopLeftCell( row, -1 );
+ return;
+}
+
+/*!
+ \fn int QtTableView::leftCell() const
+ Returns the index of the first column in the table that is visible in
+ the view. The index of the very leftmost column is 0.
+ \sa topCell(), setLeftCell()
+*/
+
+/*!
+ Scrolls the table so that \a col becomes the leftmost
+ column. The index of the leftmost column is 0.
+ \sa setXOffset(), setTopLeftCell(), setTopCell()
+*/
+
+void QtTableView::setLeftCell( int col )
+{
+ setTopLeftCell( -1, col );
+ return;
+}
+
+/*!
+ Scrolls the table so that the cell at row \a row and colum \a
+ col becomes the top-left cell in the view. The cell at the extreme
+ top left of the table is at position (0,0).
+ \sa setLeftCell(), setTopCell(), setOffset()
+*/
+
+void QtTableView::setTopLeftCell( int row, int col )
+{
+ int newX = xOffs;
+ int newY = yOffs;
+
+ if ( col >= 0 ) {
+ if ( cellW ) {
+ newX = col*cellW;
+ if ( newX > maxXOffset() )
+ newX = maxXOffset();
+ } else {
+ newX = 0;
+ while ( col )
+ newX += cellWidth( --col ); // optimize using current! ###
+ }
+ }
+ if ( row >= 0 ) {
+ if ( cellH ) {
+ newY = row*cellH;
+ if ( newY > maxYOffset() )
+ newY = maxYOffset();
+ } else {
+ newY = 0;
+ while ( row )
+ newY += cellHeight( --row ); // optimize using current! ###
+ }
+ }
+ setOffset( newX, newY );
+}
+
+
+/*!
+ \fn int QtTableView::xOffset() const
+
+ Returns the x coordinate in \e table coordinates of the pixel that is
+ currently on the left edge of the view.
+
+ \sa setXOffset(), yOffset(), leftCell() */
+
+/*!
+ Scrolls the table so that \a x becomes the leftmost pixel in the view.
+ The \a x parameter is in \e table coordinates.
+
+ The interaction with \link setTableFlags() Tbl_snapToHGrid
+ \endlink is tricky.
+
+ \sa xOffset(), setYOffset(), setOffset(), setLeftCell()
+*/
+
+void QtTableView::setXOffset( int x )
+{
+ setOffset( x, yOffset() );
+}
+
+/*!
+ \fn int QtTableView::yOffset() const
+
+ Returns the y coordinate in \e table coordinates of the pixel that is
+ currently on the top edge of the view.
+
+ \sa setYOffset(), xOffset(), topCell()
+*/
+
+
+/*!
+ Scrolls the table so that \a y becomes the top pixel in the view.
+ The \a y parameter is in \e table coordinates.
+
+ The interaction with \link setTableFlags() Tbl_snapToVGrid
+ \endlink is tricky.
+
+ \sa yOffset(), setXOffset(), setOffset(), setTopCell()
+*/
+
+void QtTableView::setYOffset( int y )
+{
+ setOffset( xOffset(), y );
+}
+
+/*!
+ Scrolls the table so that \a (x,y) becomes the top-left pixel
+ in the view. Parameters \a (x,y) are in \e table coordinates.
+
+ The interaction with \link setTableFlags() Tbl_snapTo*Grid \endlink
+ is tricky. If \a updateScrBars is TRUE, the scroll bars are
+ updated.
+
+ \sa xOffset(), yOffset(), setXOffset(), setYOffset(), setTopLeftCell()
+*/
+
+void QtTableView::setOffset( int x, int y, bool updateScrBars )
+{
+ if ( (!testTableFlags(Tbl_snapToHGrid) || xCellDelta == 0) &&
+ (!testTableFlags(Tbl_snapToVGrid) || yCellDelta == 0) &&
+ (x == xOffs && y == yOffs) )
+ return;
+
+ if ( x < 0 )
+ x = 0;
+ if ( y < 0 )
+ y = 0;
+
+ if ( cellW ) {
+ if ( x > maxXOffset() )
+ x = maxXOffset();
+ xCellOffs = x / cellW;
+ if ( !testTableFlags(Tbl_snapToHGrid) ) {
+ xCellDelta = (short)(x % cellW);
+ } else {
+ x = xCellOffs*cellW;
+ xCellDelta = 0;
+ }
+ } else {
+ int xn=0, xcd=0, col = 0;
+ while ( col < nCols-1 && x >= xn+(xcd=cellWidth(col)) ) {
+ xn += xcd;
+ col++;
+ }
+ xCellOffs = col;
+ if ( testTableFlags(Tbl_snapToHGrid) ) {
+ xCellDelta = 0;
+ x = xn;
+ } else {
+ xCellDelta = (short)(x-xn);
+ }
+ }
+ if ( cellH ) {
+ if ( y > maxYOffset() )
+ y = maxYOffset();
+ yCellOffs = y / cellH;
+ if ( !testTableFlags(Tbl_snapToVGrid) ) {
+ yCellDelta = (short)(y % cellH);
+ } else {
+ y = yCellOffs*cellH;
+ yCellDelta = 0;
+ }
+ } else {
+ int yn=0, yrd=0, row=0;
+ while ( row < nRows-1 && y >= yn+(yrd=cellHeight(row)) ) {
+ yn += yrd;
+ row++;
+ }
+ yCellOffs = row;
+ if ( testTableFlags(Tbl_snapToVGrid) ) {
+ yCellDelta = 0;
+ y = yn;
+ } else {
+ yCellDelta = (short)(y-yn);
+ }
+ }
+ int dx = (x - xOffs);
+ int dy = (y - yOffs);
+ xOffs = x;
+ yOffs = y;
+ if ( autoUpdate() && isVisible() )
+ scroll( dx, dy );
+ if ( updateScrBars )
+ updateScrollBars( verValue | horValue );
+}
+
+
+/*!
+ \overload int QtTableView::cellWidth() const
+
+ Returns the column width in pixels. Returns 0 if the columns have
+ variable widths.
+
+ \sa setCellWidth(), cellHeight()
+*/
+
+/*!
+ Returns the width of column \a col in pixels.
+
+ This function is virtual and must be reimplemented by subclasses that
+ have variable cell widths. Note that if the total table width
+ changes, updateTableSize() must be called.
+
+ \sa setCellWidth(), cellHeight(), totalWidth(), updateTableSize()
+*/
+
+int QtTableView::cellWidth( int )
+{
+ return cellW;
+}
+
+
+/*!
+ Sets the width in pixels of the table cells to \a cellWidth.
+
+ Setting it to 0 means that the column width is variable. When
+ set to 0 (this is the default) QtTableView calls the virtual function
+ cellWidth() to get the width.
+
+ \sa cellWidth(), setCellHeight(), totalWidth(), numCols()
+*/
+
+void QtTableView::setCellWidth( int cellWidth )
+{
+ if ( cellW == cellWidth )
+ return;
+#if defined(QT_CHECK_RANGE)
+ if ( cellWidth < 0 || cellWidth > SHRT_MAX ) {
+ qWarning( "QtTableView::setCellWidth: (%s) Argument out of range (%d)",
+ name( "unnamed" ), cellWidth );
+ return;
+ }
+#endif
+ cellW = (short)cellWidth;
+
+ updateScrollBars( horSteps | horRange );
+ if ( autoUpdate() && isVisible() )
+ repaint();
+
+}
+
+/*!
+ \overload int QtTableView::cellHeight() const
+
+ Returns the row height, in pixels. Returns 0 if the rows have
+ variable heights.
+
+ \sa setCellHeight(), cellWidth()
+*/
+
+
+/*!
+ Returns the height of row \a row in pixels.
+
+ This function is virtual and must be reimplemented by subclasses that
+ have variable cell heights. Note that if the total table height
+ changes, updateTableSize() must be called.
+
+ \sa setCellHeight(), cellWidth(), totalHeight()
+*/
+
+int QtTableView::cellHeight( int )
+{
+ return cellH;
+}
+
+/*!
+ Sets the height in pixels of the table cells to \a cellHeight.
+
+ Setting it to 0 means that the row height is variable. When set
+ to 0 (this is the default), QtTableView calls the virtual function
+ cellHeight() to get the height.
+
+ \sa cellHeight(), setCellWidth(), totalHeight(), numRows()
+*/
+
+void QtTableView::setCellHeight( int cellHeight )
+{
+ if ( cellH == cellHeight )
+ return;
+#if defined(QT_CHECK_RANGE)
+ if ( cellHeight < 0 || cellHeight > SHRT_MAX ) {
+ qWarning( "QtTableView::setCellHeight: (%s) Argument out of range (%d)",
+ name( "unnamed" ), cellHeight );
+ return;
+ }
+#endif
+ cellH = (short)cellHeight;
+ if ( autoUpdate() && isVisible() )
+ repaint();
+ updateScrollBars( verSteps | verRange );
+}
+
+
+/*!
+ Returns the total width of the table in pixels.
+
+ This function is virtual and should be reimplemented by subclasses that
+ have variable cell widths and a non-trivial cellWidth() function, or a
+ large number of columns in the table.
+
+ The default implementation may be slow for very wide tables.
+
+ \sa cellWidth(), totalHeight() */
+
+int QtTableView::totalWidth()
+{
+ if ( cellW ) {
+ return cellW*nCols;
+ } else {
+ int tw = 0;
+ for( int i = 0 ; i < nCols ; i++ )
+ tw += cellWidth( i );
+ return tw;
+ }
+}
+
+/*!
+ Returns the total height of the table in pixels.
+
+ This function is virtual and should be reimplemented by subclasses that
+ have variable cell heights and a non-trivial cellHeight() function, or a
+ large number of rows in the table.
+
+ The default implementation may be slow for very tall tables.
+
+ \sa cellHeight(), totalWidth()
+*/
+
+int QtTableView::totalHeight()
+{
+ if ( cellH ) {
+ return cellH*nRows;
+ } else {
+ int th = 0;
+ for( int i = 0 ; i < nRows ; i++ )
+ th += cellHeight( i );
+ return th;
+ }
+}
+
+
+/*!
+ \fn uint QtTableView::tableFlags() const
+
+ Returns the union of the table flags that are currently set.
+
+ \sa setTableFlags(), clearTableFlags(), testTableFlags()
+*/
+
+/*!
+ \fn bool QtTableView::testTableFlags( uint f ) const
+
+ Returns TRUE if any of the table flags in \a f are currently set,
+ otherwise FALSE.
+
+ \sa setTableFlags(), clearTableFlags(), tableFlags()
+*/
+
+/*!
+ Sets the table flags to \a f.
+
+ If a flag setting changes the appearance of the table, the table is
+ repainted if - and only if - autoUpdate() is TRUE.
+
+ The table flags are mostly single bits, though there are some multibit
+ flags for convenience. Here is a complete list:
+
+ <dl compact>
+ <dt> Tbl_vScrollBar <dd> - The table has a vertical scroll bar.
+ <dt> Tbl_hScrollBar <dd> - The table has a horizontal scroll bar.
+ <dt> Tbl_autoVScrollBar <dd> - The table has a vertical scroll bar if
+ - and only if - the table is taller than the view.
+ <dt> Tbl_autoHScrollBar <dd> The table has a horizontal scroll bar if
+ - and only if - the table is wider than the view.
+ <dt> Tbl_autoScrollBars <dd> - The union of the previous two flags.
+ <dt> Tbl_clipCellPainting <dd> - The table uses QPainter::setClipRect() to
+ make sure that paintCell() will not draw outside the cell
+ boundaries.
+ <dt> Tbl_cutCellsV <dd> - The table will never show part of a
+ cell at the bottom of the table; if there is not space for all of
+ a cell, the space is left blank.
+ <dt> Tbl_cutCellsH <dd> - The table will never show part of a
+ cell at the right side of the table; if there is not space for all of
+ a cell, the space is left blank.
+ <dt> Tbl_cutCells <dd> - The union of the previous two flags.
+ <dt> Tbl_scrollLastHCell <dd> - When the user scrolls horizontally,
+ let him/her scroll the last cell left until it is at the left
+ edge of the view. If this flag is not set, the user can only scroll
+ to the point where the last cell is completely visible.
+ <dt> Tbl_scrollLastVCell <dd> - When the user scrolls vertically, let
+ him/her scroll the last cell up until it is at the top edge of
+ the view. If this flag is not set, the user can only scroll to the
+ point where the last cell is completely visible.
+ <dt> Tbl_scrollLastCell <dd> - The union of the previous two flags.
+ <dt> Tbl_smoothHScrolling <dd> - The table scrolls as smoothly as
+ possible when the user scrolls horizontally. When this flag is not
+ set, scrolling is done one cell at a time.
+ <dt> Tbl_smoothVScrolling <dd> - The table scrolls as smoothly as
+ possible when scrolling vertically. When this flag is not set,
+ scrolling is done one cell at a time.
+ <dt> Tbl_smoothScrolling <dd> - The union of the previous two flags.
+ <dt> Tbl_snapToHGrid <dd> - Except when the user is actually scrolling,
+ the leftmost column shown snaps to the leftmost edge of the view.
+ <dt> Tbl_snapToVGrid <dd> - Except when the user is actually
+ scrolling, the top row snaps to the top edge of the view.
+ <dt> Tbl_snapToGrid <dd> - The union of the previous two flags.
+ </dl>
+
+ You can specify more than one flag at a time using bitwise OR.
+
+ Example:
+ \code
+ setTableFlags( Tbl_smoothScrolling | Tbl_autoScrollBars );
+ \endcode
+
+ \warning The cutCells options (\c Tbl_cutCells, \c Tbl_cutCellsH and
+ Tbl_cutCellsV) may cause painting problems when scrollbars are
+ enabled. Do not combine cutCells and scrollbars.
+
+
+ \sa clearTableFlags(), testTableFlags(), tableFlags()
+*/
+
+void QtTableView::setTableFlags( uint f )
+{
+ f = (f ^ tFlags) & f; // clear flags already set
+ tFlags |= f;
+
+ bool updateOn = autoUpdate();
+ setAutoUpdate( FALSE );
+
+ uint repaintMask = Tbl_cutCellsV | Tbl_cutCellsH;
+
+ if ( f & Tbl_vScrollBar ) {
+ setVerScrollBar( TRUE );
+ }
+ if ( f & Tbl_hScrollBar ) {
+ setHorScrollBar( TRUE );
+ }
+ if ( f & Tbl_autoVScrollBar ) {
+ updateScrollBars( verRange );
+ }
+ if ( f & Tbl_autoHScrollBar ) {
+ updateScrollBars( horRange );
+ }
+ if ( f & Tbl_scrollLastHCell ) {
+ updateScrollBars( horRange );
+ }
+ if ( f & Tbl_scrollLastVCell ) {
+ updateScrollBars( verRange );
+ }
+ if ( f & Tbl_snapToHGrid ) {
+ updateScrollBars( horRange );
+ }
+ if ( f & Tbl_snapToVGrid ) {
+ updateScrollBars( verRange );
+ }
+ if ( f & Tbl_snapToGrid ) { // Note: checks for 2 flags
+ if ( (f & Tbl_snapToHGrid) != 0 && xCellDelta != 0 || //have to scroll?
+ (f & Tbl_snapToVGrid) != 0 && yCellDelta != 0 ) {
+ snapToGrid( (f & Tbl_snapToHGrid) != 0, // do snapping
+ (f & Tbl_snapToVGrid) != 0 );
+ repaintMask |= Tbl_snapToGrid; // repaint table
+ }
+ }
+
+ if ( updateOn ) {
+ setAutoUpdate( TRUE );
+ updateScrollBars();
+ if ( isVisible() && (f & repaintMask) )
+ repaint();
+ }
+
+}
+
+/*!
+ Clears the \link setTableFlags() table flags\endlink that are set
+ in \a f.
+
+ Example (clears a single flag):
+ \code
+ clearTableFlags( Tbl_snapToGrid );
+ \endcode
+
+ The default argument clears all flags.
+
+ \sa setTableFlags(), testTableFlags(), tableFlags()
+*/
+
+void QtTableView::clearTableFlags( uint f )
+{
+ f = (f ^ ~tFlags) & f; // clear flags that are already 0
+ tFlags &= ~f;
+
+ bool updateOn = autoUpdate();
+ setAutoUpdate( FALSE );
+
+ uint repaintMask = Tbl_cutCellsV | Tbl_cutCellsH;
+
+ if ( f & Tbl_vScrollBar ) {
+ setVerScrollBar( FALSE );
+ }
+ if ( f & Tbl_hScrollBar ) {
+ setHorScrollBar( FALSE );
+ }
+ if ( f & Tbl_scrollLastHCell ) {
+ int maxX = maxXOffset();
+ if ( xOffs > maxX ) {
+ setOffset( maxX, yOffs );
+ repaintMask |= Tbl_scrollLastHCell;
+ }
+ updateScrollBars( horRange );
+ }
+ if ( f & Tbl_scrollLastVCell ) {
+ int maxY = maxYOffset();
+ if ( yOffs > maxY ) {
+ setOffset( xOffs, maxY );
+ repaintMask |= Tbl_scrollLastVCell;
+ }
+ updateScrollBars( verRange );
+ }
+ if ( f & Tbl_smoothScrolling ) { // Note: checks for 2 flags
+ if ((f & Tbl_smoothHScrolling) != 0 && xCellDelta != 0 ||//must scroll?
+ (f & Tbl_smoothVScrolling) != 0 && yCellDelta != 0 ) {
+ snapToGrid( (f & Tbl_smoothHScrolling) != 0, // do snapping
+ (f & Tbl_smoothVScrolling) != 0 );
+ repaintMask |= Tbl_smoothScrolling; // repaint table
+ }
+ }
+ if ( f & Tbl_snapToHGrid ) {
+ updateScrollBars( horRange );
+ }
+ if ( f & Tbl_snapToVGrid ) {
+ updateScrollBars( verRange );
+ }
+ if ( updateOn ) {
+ setAutoUpdate( TRUE );
+ updateScrollBars(); // returns immediately if nothing to do
+ if ( isVisible() && (f & repaintMask) )
+ repaint();
+ }
+
+}
+
+
+/*!
+ \fn bool QtTableView::autoUpdate() const
+
+ Returns TRUE if the view updates itself automatically whenever it
+ is changed in some way.
+
+ \sa setAutoUpdate()
+*/
+
+/*!
+ Sets the auto-update option of the table view to \a enable.
+
+ If \a enable is TRUE (this is the default), the view updates itself
+ automatically whenever it has changed in some way (for example, when a
+ \link setTableFlags() flag\endlink is changed).
+
+ If \a enable is FALSE, the view does NOT repaint itself or update
+ its internal state variables when it is changed. This can be
+ useful to avoid flicker during large changes and is singularly
+ useless otherwise. Disable auto-update, do the changes, re-enable
+ auto-update and call repaint().
+
+ \warning Do not leave the view in this state for a long time
+ (i.e., between events). If, for example, the user interacts with the
+ view when auto-update is off, strange things can happen.
+
+ Setting auto-update to TRUE does not repaint the view; you must call
+ repaint() to do this.
+
+ \sa autoUpdate(), repaint()
+*/
+
+void QtTableView::setAutoUpdate( bool enable )
+{
+ if ( isUpdatesEnabled() == enable )
+ return;
+ setUpdatesEnabled( enable );
+ if ( enable ) {
+ showOrHideScrollBars();
+ updateScrollBars();
+ }
+}
+
+
+/*!
+ Repaints the cell at row \a row, column \a col if it is inside the view.
+
+ If \a erase is TRUE, the relevant part of the view is cleared to the
+ background color/pixmap before the contents are repainted.
+
+ \sa isVisible()
+*/
+
+void QtTableView::updateCell( int row, int col, bool erase )
+{
+ int xPos, yPos;
+ if ( !colXPos( col, &xPos ) )
+ return;
+ if ( !rowYPos( row, &yPos ) )
+ return;
+ QRect uR = QRect( xPos, yPos,
+ cellW ? cellW : cellWidth(col),
+ cellH ? cellH : cellHeight(row) );
+ repaint( uR.intersect(viewRect()), erase );
+}
+
+
+/*!
+ \fn QRect QtTableView::cellUpdateRect() const
+
+ This function should be called only from the paintCell() function in
+ subclasses. It returns the portion of a cell that actually needs to be
+ updated in \e cell coordinates. This is useful only for non-trivial
+ paintCell().
+
+*/
+
+/*!
+ Returns the rectangle that is the actual table, excluding any
+ frame, in \e widget coordinates.
+*/
+
+QRect QtTableView::viewRect() const
+{
+ return QRect( frameWidth(), frameWidth(), viewWidth(), viewHeight() );
+}
+
+
+/*!
+ Returns the index of the last (bottom) row in the view.
+ The index of the first row is 0.
+
+ If no rows are visible it returns -1. This can happen if the
+ view is too small for the first row and Tbl_cutCellsV is set.
+
+ \sa lastColVisible()
+*/
+
+int QtTableView::lastRowVisible() const
+{
+ int cellMaxY;
+ int row = findRawRow( maxViewY(), &cellMaxY );
+ if ( row == -1 || row >= nRows ) { // maxViewY() past end?
+ row = nRows - 1; // yes: return last row
+ } else {
+ if ( testTableFlags(Tbl_cutCellsV) && cellMaxY > maxViewY() ) {
+ if ( row == yCellOffs ) // cut by right margin?
+ return -1; // yes, nothing in the view
+ else
+ row = row - 1; // cut by margin, one back
+ }
+ }
+ return row;
+}
+
+/*!
+ Returns the index of the last (right) column in the view.
+ The index of the first column is 0.
+
+ If no columns are visible it returns -1. This can happen if the
+ view is too narrow for the first column and Tbl_cutCellsH is set.
+
+ \sa lastRowVisible()
+*/
+
+int QtTableView::lastColVisible() const
+{
+ int cellMaxX;
+ int col = findRawCol( maxViewX(), &cellMaxX );
+ if ( col == -1 || col >= nCols ) { // maxViewX() past end?
+ col = nCols - 1; // yes: return last col
+ } else {
+ if ( testTableFlags(Tbl_cutCellsH) && cellMaxX > maxViewX() ) {
+ if ( col == xCellOffs ) // cut by bottom margin?
+ return -1; // yes, nothing in the view
+ else
+ col = col - 1; // cell by margin, one back
+ }
+ }
+ return col;
+}
+
+/*!
+ Returns TRUE if \a row is at least partially visible.
+ \sa colIsVisible()
+*/
+
+bool QtTableView::rowIsVisible( int row ) const
+{
+ return rowYPos( row, 0 );
+}
+
+/*!
+ Returns TRUE if \a col is at least partially visible.
+ \sa rowIsVisible()
+*/
+
+bool QtTableView::colIsVisible( int col ) const
+{
+ return colXPos( col, 0 );
+}
+
+
+/*!
+ \internal
+ Called when both scroll bars are active at the same time. Covers the
+ bottom left corner between the two scroll bars with an empty widget.
+*/
+
+void QtTableView::coverCornerSquare( bool enable )
+{
+ coveringCornerSquare = enable;
+ if ( !cornerSquare && enable ) {
+ cornerSquare = new QCornerSquare( this );
+ Q_CHECK_PTR( cornerSquare );
+ cornerSquare->setGeometry( maxViewX() + frameWidth() + 1,
+ maxViewY() + frameWidth() + 1,
+ VSBEXT,
+ HSBEXT);
+ }
+ if ( autoUpdate() && cornerSquare ) {
+ if ( enable )
+ cornerSquare->show();
+ else
+ cornerSquare->hide();
+ }
+}
+
+
+/*!
+ \internal
+ Scroll the view to a position such that:
+
+ If \a horizontal is TRUE, the leftmost column shown fits snugly
+ with the left edge of the view.
+
+ If \a vertical is TRUE, the top row shown fits snugly with the top
+ of the view.
+
+ You can achieve the same effect automatically by setting any of the
+ \link setTableFlags() Tbl_snapTo*Grid \endlink table flags.
+*/
+
+void QtTableView::snapToGrid( bool horizontal, bool vertical )
+{
+ int newXCell = -1;
+ int newYCell = -1;
+ if ( horizontal && xCellDelta != 0 ) {
+ int w = cellW ? cellW : cellWidth( xCellOffs );
+ if ( xCellDelta >= w/2 )
+ newXCell = xCellOffs + 1;
+ else
+ newXCell = xCellOffs;
+ }
+ if ( vertical && yCellDelta != 0 ) {
+ int h = cellH ? cellH : cellHeight( yCellOffs );
+ if ( yCellDelta >= h/2 )
+ newYCell = yCellOffs + 1;
+ else
+ newYCell = yCellOffs;
+ }
+ setTopLeftCell( newYCell, newXCell ); //row,column
+}
+
+/*!
+ \internal
+ This internal slot is connected to the horizontal scroll bar's
+ QScrollBar::valueChanged() signal.
+
+ Moves the table horizontally to offset \a val without updating the
+ scroll bar.
+*/
+
+void QtTableView::horSbValue( int val )
+{
+ if ( horSliding ) {
+ horSliding = FALSE;
+ if ( horSnappingOff ) {
+ horSnappingOff = FALSE;
+ tFlags |= Tbl_snapToHGrid;
+ }
+ }
+ setOffset( val, yOffs, FALSE );
+}
+
+/*!
+ \internal
+ This internal slot is connected to the horizontal scroll bar's
+ QScrollBar::sliderMoved() signal.
+
+ Scrolls the table smoothly horizontally even if \c Tbl_snapToHGrid is set.
+*/
+
+void QtTableView::horSbSliding( int val )
+{
+ if ( testTableFlags(Tbl_snapToHGrid) &&
+ testTableFlags(Tbl_smoothHScrolling) ) {
+ tFlags &= ~Tbl_snapToHGrid; // turn off snapping while sliding
+ setOffset( val, yOffs, FALSE );
+ tFlags |= Tbl_snapToHGrid; // turn on snapping again
+ } else {
+ setOffset( val, yOffs, FALSE );
+ }
+}
+
+/*!
+ \internal
+ This internal slot is connected to the horizontal scroll bar's
+ QScrollBar::sliderReleased() signal.
+*/
+
+void QtTableView::horSbSlidingDone( )
+{
+ if ( testTableFlags(Tbl_snapToHGrid) &&
+ testTableFlags(Tbl_smoothHScrolling) )
+ snapToGrid( TRUE, FALSE );
+}
+
+/*!
+ \internal
+ This internal slot is connected to the vertical scroll bar's
+ QScrollBar::valueChanged() signal.
+
+ Moves the table vertically to offset \a val without updating the
+ scroll bar.
+*/
+
+void QtTableView::verSbValue( int val )
+{
+ if ( verSliding ) {
+ verSliding = FALSE;
+ if ( verSnappingOff ) {
+ verSnappingOff = FALSE;
+ tFlags |= Tbl_snapToVGrid;
+ }
+ }
+ setOffset( xOffs, val, FALSE );
+}
+
+/*!
+ \internal
+ This internal slot is connected to the vertical scroll bar's
+ QScrollBar::sliderMoved() signal.
+
+ Scrolls the table smoothly vertically even if \c Tbl_snapToVGrid is set.
+*/
+
+void QtTableView::verSbSliding( int val )
+{
+ if ( testTableFlags(Tbl_snapToVGrid) &&
+ testTableFlags(Tbl_smoothVScrolling) ) {
+ tFlags &= ~Tbl_snapToVGrid; // turn off snapping while sliding
+ setOffset( xOffs, val, FALSE );
+ tFlags |= Tbl_snapToVGrid; // turn on snapping again
+ } else {
+ setOffset( xOffs, val, FALSE );
+ }
+}
+
+/*!
+ \internal
+ This internal slot is connected to the vertical scroll bar's
+ QScrollBar::sliderReleased() signal.
+*/
+
+void QtTableView::verSbSlidingDone( )
+{
+ if ( testTableFlags(Tbl_snapToVGrid) &&
+ testTableFlags(Tbl_smoothVScrolling) )
+ snapToGrid( FALSE, TRUE );
+}
+
+
+/*!
+ This virtual function is called before painting of table cells
+ is started. It can be reimplemented by subclasses that want to
+ to set up the painter in a special way and that do not want to
+ do so for each cell.
+*/
+
+void QtTableView::setupPainter( QPainter * )
+{
+}
+
+/*!
+ \fn void QtTableView::paintCell( QPainter *p, int row, int col )
+
+ This pure virtual function is called to paint the single cell at \a
+ (row,col) using \a p, which is open when paintCell() is called and
+ must remain open.
+
+ The coordinate system is \link QPainter::translate() translated \endlink
+ so that the origin is at the top-left corner of the cell to be
+ painted, i.e. \e cell coordinates. Do not scale or shear the coordinate
+ system (or if you do, restore the transformation matrix before you
+ return).
+
+ The painter is not clipped by default and for maximum efficiency. For safety,
+ call setTableFlags(Tbl_clipCellPainting) to enable clipping.
+
+ \sa paintEvent(), setTableFlags() */
+
+
+/*!
+ Handles paint events, \a e, for the table view.
+
+ Calls paintCell() for the cells that needs to be repainted.
+*/
+
+void QtTableView::paintEvent( QPaintEvent *e )
+{
+ QRect updateR = e->rect(); // update rectangle
+ if ( sbDirty ) {
+ bool e = eraseInPaint;
+ updateScrollBars();
+ eraseInPaint = e;
+ }
+
+ QPainter paint( this );
+
+ if ( !contentsRect().contains( updateR, TRUE ) ) {// update frame ?
+ drawFrame( &paint );
+ if ( updateR.left() < frameWidth() ) //###
+ updateR.setLeft( frameWidth() );
+ if ( updateR.top() < frameWidth() )
+ updateR.setTop( frameWidth() );
+ }
+
+ int maxWX = maxViewX();
+ int maxWY = maxViewY();
+ if ( updateR.right() > maxWX )
+ updateR.setRight( maxWX );
+ if ( updateR.bottom() > maxWY )
+ updateR.setBottom( maxWY );
+
+ setupPainter( &paint ); // prepare for painting table
+
+ int firstRow = findRow( updateR.y() );
+ int firstCol = findCol( updateR.x() );
+ int xStart, yStart;
+ if ( !colXPos( firstCol, &xStart ) || !rowYPos( firstRow, &yStart ) ) {
+ paint.eraseRect( updateR ); // erase area outside cells but in view
+ return;
+ }
+ int maxX = updateR.right();
+ int maxY = updateR.bottom();
+ int row = firstRow;
+ int col;
+ int yPos = yStart;
+ int xPos = maxX+1; // in case the while() is empty
+ int nextX;
+ int nextY;
+ QRect winR = viewRect();
+ QRect cellR;
+ QRect cellUR;
+#ifndef QT_NO_TRANSFORMATIONS
+ QWMatrix matrix;
+#endif
+
+ while ( yPos <= maxY && row < nRows ) {
+ nextY = yPos + (cellH ? cellH : cellHeight( row ));
+ if ( testTableFlags( Tbl_cutCellsV ) && nextY > ( maxWY + 1 ) )
+ break;
+ col = firstCol;
+ xPos = xStart;
+ while ( xPos <= maxX && col < nCols ) {
+ nextX = xPos + (cellW ? cellW : cellWidth( col ));
+ if ( testTableFlags( Tbl_cutCellsH ) && nextX > ( maxWX + 1 ) )
+ break;
+
+ cellR.setRect( xPos, yPos, cellW ? cellW : cellWidth(col),
+ cellH ? cellH : cellHeight(row) );
+ cellUR = cellR.intersect( updateR );
+ if ( cellUR.isValid() ) {
+ cellUpdateR = cellUR;
+ cellUpdateR.moveBy( -xPos, -yPos ); // cell coordinates
+ if ( eraseInPaint )
+ paint.eraseRect( cellUR );
+
+#ifndef QT_NO_TRANSFORMATIONS
+ matrix.translate( xPos, yPos );
+ paint.setWorldMatrix( matrix );
+ if ( testTableFlags(Tbl_clipCellPainting) ||
+ frameWidth() > 0 && !winR.contains( cellR ) ) { //##arnt
+ paint.setClipRect( cellUR );
+ paintCell( &paint, row, col );
+ paint.setClipping( FALSE );
+ } else {
+ paintCell( &paint, row, col );
+ }
+ matrix.reset();
+ paint.setWorldMatrix( matrix );
+#else
+ paint.translate( xPos, yPos );
+ if ( testTableFlags(Tbl_clipCellPainting) ||
+ frameWidth() > 0 && !winR.contains( cellR ) ) { //##arnt
+ paint.setClipRect( cellUR );
+ paintCell( &paint, row, col );
+ paint.setClipping( FALSE );
+ } else {
+ paintCell( &paint, row, col );
+ }
+ paint.translate( -xPos, -yPos );
+#endif
+ }
+ col++;
+ xPos = nextX;
+ }
+ row++;
+ yPos = nextY;
+ }
+
+ // while painting we have to erase any areas in the view that
+ // are not covered by cells but are covered by the paint event
+ // rectangle these must be erased. We know that xPos is the last
+ // x pixel updated + 1 and that yPos is the last y pixel updated + 1.
+
+ // Note that this needs to be done regardless whether we do
+ // eraseInPaint or not. Reason: a subclass may implement
+ // flicker-freeness and encourage the use of repaint(FALSE).
+ // The subclass, however, cannot draw all pixels, just those
+ // inside the cells. So QtTableView is reponsible for all pixels
+ // outside the cells.
+
+ QRect viewR = viewRect();
+ const QColorGroup g = colorGroup();
+
+ if ( xPos <= maxX ) {
+ QRect r = viewR;
+ r.setLeft( xPos );
+ r.setBottom( yPos<maxY?yPos:maxY );
+ if ( inherits( "QMultiLineEdit" ) )
+ paint.fillRect( r.intersect( updateR ), g.base() );
+ else
+ paint.eraseRect( r.intersect( updateR ) );
+ }
+ if ( yPos <= maxY ) {
+ QRect r = viewR;
+ r.setTop( yPos );
+ if ( inherits( "QMultiLineEdit" ) )
+ paint.fillRect( r.intersect( updateR ), g.base() );
+ else
+ paint.eraseRect( r.intersect( updateR ) );
+ }
+}
+
+/*!\reimp
+*/
+void QtTableView::resizeEvent( QResizeEvent * )
+{
+ updateScrollBars( horValue | verValue | horSteps | horGeometry | horRange |
+ verSteps | verGeometry | verRange );
+ showOrHideScrollBars();
+ updateFrameSize();
+ int maxX = QMIN( xOffs, maxXOffset() ); // ### can be slow
+ int maxY = QMIN( yOffs, maxYOffset() );
+ setOffset( maxX, maxY );
+}
+
+
+/*!
+ Redraws all visible cells in the table view.
+*/
+
+void QtTableView::updateView()
+{
+ repaint( viewRect() );
+}
+
+/*!
+ Returns a pointer to the vertical scroll bar mainly so you can
+ connect() to its signals. Note that the scroll bar works in pixel
+ values; use findRow() to translate to cell numbers.
+*/
+
+QScrollBar *QtTableView::verticalScrollBar() const
+{
+ QtTableView *that = (QtTableView*)this; // semantic const
+ if ( !vScrollBar ) {
+ QScrollBar *sb = new QScrollBar( QScrollBar::Vertical, that );
+#ifndef QT_NO_CURSOR
+ sb->setCursor( arrowCursor );
+#endif
+ sb->resize( sb->sizeHint() ); // height is irrelevant
+ Q_CHECK_PTR(sb);
+ sb->setTracking( FALSE );
+ sb->setFocusPolicy( NoFocus );
+ connect( sb, SIGNAL(valueChanged(int)),
+ SLOT(verSbValue(int)));
+ connect( sb, SIGNAL(sliderMoved(int)),
+ SLOT(verSbSliding(int)));
+ connect( sb, SIGNAL(sliderReleased()),
+ SLOT(verSbSlidingDone()));
+ sb->hide();
+ that->vScrollBar = sb;
+ return sb;
+ }
+ return vScrollBar;
+}
+
+/*!
+ Returns a pointer to the horizontal scroll bar mainly so you can
+ connect() to its signals. Note that the scroll bar works in pixel
+ values; use findCol() to translate to cell numbers.
+*/
+
+QScrollBar *QtTableView::horizontalScrollBar() const
+{
+ QtTableView *that = (QtTableView*)this; // semantic const
+ if ( !hScrollBar ) {
+ QScrollBar *sb = new QScrollBar( QScrollBar::Horizontal, that );
+#ifndef QT_NO_CURSOR
+ sb->setCursor( arrowCursor );
+#endif
+ sb->resize( sb->sizeHint() ); // width is irrelevant
+ sb->setFocusPolicy( NoFocus );
+ Q_CHECK_PTR(sb);
+ sb->setTracking( FALSE );
+ connect( sb, SIGNAL(valueChanged(int)),
+ SLOT(horSbValue(int)));
+ connect( sb, SIGNAL(sliderMoved(int)),
+ SLOT(horSbSliding(int)));
+ connect( sb, SIGNAL(sliderReleased()),
+ SLOT(horSbSlidingDone()));
+ sb->hide();
+ that->hScrollBar = sb;
+ return sb;
+ }
+ return hScrollBar;
+}
+
+/*!
+ Enables or disables the horizontal scroll bar, as required by
+ setAutoUpdate() and the \link setTableFlags() table flags\endlink.
+*/
+
+void QtTableView::setHorScrollBar( bool on, bool update )
+{
+ if ( on ) {
+ tFlags |= Tbl_hScrollBar;
+ horizontalScrollBar(); // created
+ if ( update )
+ updateScrollBars( horMask | verMask );
+ else
+ sbDirty = sbDirty | (horMask | verMask);
+ if ( testTableFlags( Tbl_vScrollBar ) )
+ coverCornerSquare( TRUE );
+ if ( autoUpdate() )
+ sbDirty = sbDirty | horMask;
+ } else {
+ tFlags &= ~Tbl_hScrollBar;
+ if ( !hScrollBar )
+ return;
+ coverCornerSquare( FALSE );
+ bool hideScrollBar = autoUpdate() && hScrollBar->isVisible();
+ if ( hideScrollBar )
+ hScrollBar->hide();
+ if ( update )
+ updateScrollBars( verMask );
+ else
+ sbDirty = sbDirty | verMask;
+ if ( hideScrollBar && isVisible() )
+ repaint( hScrollBar->x(), hScrollBar->y(),
+ width() - hScrollBar->x(), hScrollBar->height() );
+ }
+ if ( update )
+ updateFrameSize();
+}
+
+
+/*!
+ Enables or disables the vertical scroll bar, as required by
+ setAutoUpdate() and the \link setTableFlags() table flags\endlink.
+*/
+
+void QtTableView::setVerScrollBar( bool on, bool update )
+{
+ if ( on ) {
+ tFlags |= Tbl_vScrollBar;
+ verticalScrollBar(); // created
+ if ( update )
+ updateScrollBars( verMask | horMask );
+ else
+ sbDirty = sbDirty | (horMask | verMask);
+ if ( testTableFlags( Tbl_hScrollBar ) )
+ coverCornerSquare( TRUE );
+ if ( autoUpdate() )
+ sbDirty = sbDirty | verMask;
+ } else {
+ tFlags &= ~Tbl_vScrollBar;
+ if ( !vScrollBar )
+ return;
+ coverCornerSquare( FALSE );
+ bool hideScrollBar = autoUpdate() && vScrollBar->isVisible();
+ if ( hideScrollBar )
+ vScrollBar->hide();
+ if ( update )
+ updateScrollBars( horMask );
+ else
+ sbDirty = sbDirty | horMask;
+ if ( hideScrollBar && isVisible() )
+ repaint( vScrollBar->x(), vScrollBar->y(),
+ vScrollBar->width(), height() - vScrollBar->y() );
+ }
+ if ( update )
+ updateFrameSize();
+}
+
+
+
+
+int QtTableView::findRawRow( int yPos, int *cellMaxY, int *cellMinY,
+ bool goOutsideView ) const
+{
+ int r = -1;
+ if ( nRows == 0 )
+ return r;
+ if ( goOutsideView || yPos >= minViewY() && yPos <= maxViewY() ) {
+ if ( yPos < minViewY() ) {
+#if defined(QT_CHECK_RANGE)
+ qWarning( "QtTableView::findRawRow: (%s) internal error: "
+ "yPos < minViewY() && goOutsideView "
+ "not supported. (%d,%d)",
+ name( "unnamed" ), yPos, yOffs );
+#endif
+ return -1;
+ }
+ if ( cellH ) { // uniform cell height
+ r = (yPos - minViewY() + yCellDelta)/cellH; // cell offs from top
+ if ( cellMaxY )
+ *cellMaxY = (r + 1)*cellH + minViewY() - yCellDelta - 1;
+ if ( cellMinY )
+ *cellMinY = r*cellH + minViewY() - yCellDelta;
+ r += yCellOffs; // absolute cell index
+ } else { // variable cell height
+ QtTableView *tw = (QtTableView *)this;
+ r = yCellOffs;
+ int h = minViewY() - yCellDelta; //##arnt3
+ int oldH = h;
+ Q_ASSERT( r < nRows );
+ while ( r < nRows ) {
+ oldH = h;
+ h += tw->cellHeight( r ); // Start of next cell
+ if ( yPos < h )
+ break;
+ r++;
+ }
+ if ( cellMaxY )
+ *cellMaxY = h - 1;
+ if ( cellMinY )
+ *cellMinY = oldH;
+ }
+ }
+ return r;
+
+}
+
+
+int QtTableView::findRawCol( int xPos, int *cellMaxX, int *cellMinX ,
+ bool goOutsideView ) const
+{
+ int c = -1;
+ if ( nCols == 0 )
+ return c;
+ if ( goOutsideView || xPos >= minViewX() && xPos <= maxViewX() ) {
+ if ( xPos < minViewX() ) {
+#if defined(QT_CHECK_RANGE)
+ qWarning( "QtTableView::findRawCol: (%s) internal error: "
+ "xPos < minViewX() && goOutsideView "
+ "not supported. (%d,%d)",
+ name( "unnamed" ), xPos, xOffs );
+#endif
+ return -1;
+ }
+ if ( cellW ) { // uniform cell width
+ c = (xPos - minViewX() + xCellDelta)/cellW; //cell offs from left
+ if ( cellMaxX )
+ *cellMaxX = (c + 1)*cellW + minViewX() - xCellDelta - 1;
+ if ( cellMinX )
+ *cellMinX = c*cellW + minViewX() - xCellDelta;
+ c += xCellOffs; // absolute cell index
+ } else { // variable cell width
+ QtTableView *tw = (QtTableView *)this;
+ c = xCellOffs;
+ int w = minViewX() - xCellDelta; //##arnt3
+ int oldW = w;
+ Q_ASSERT( c < nCols );
+ while ( c < nCols ) {
+ oldW = w;
+ w += tw->cellWidth( c ); // Start of next cell
+ if ( xPos < w )
+ break;
+ c++;
+ }
+ if ( cellMaxX )
+ *cellMaxX = w - 1;
+ if ( cellMinX )
+ *cellMinX = oldW;
+ }
+ }
+ return c;
+}
+
+
+/*!
+ Returns the index of the row at position \a yPos, where \a yPos is in
+ \e widget coordinates. Returns -1 if \a yPos is outside the valid
+ range.
+
+ \sa findCol(), rowYPos()
+*/
+
+int QtTableView::findRow( int yPos ) const
+{
+ int cellMaxY;
+ int row = findRawRow( yPos, &cellMaxY );
+ if ( testTableFlags(Tbl_cutCellsV) && cellMaxY > maxViewY() )
+ row = - 1; // cell cut by bottom margin
+ if ( row >= nRows )
+ row = -1;
+ return row;
+}
+
+
+/*!
+ Returns the index of the column at position \a xPos, where \a xPos is
+ in \e widget coordinates. Returns -1 if \a xPos is outside the valid
+ range.
+
+ \sa findRow(), colXPos()
+*/
+
+int QtTableView::findCol( int xPos ) const
+{
+ int cellMaxX;
+ int col = findRawCol( xPos, &cellMaxX );
+ if ( testTableFlags(Tbl_cutCellsH) && cellMaxX > maxViewX() )
+ col = - 1; // cell cut by right margin
+ if ( col >= nCols )
+ col = -1;
+ return col;
+}
+
+
+/*!
+ Computes the position in the widget of row \a row.
+
+ Returns TRUE and stores the result in \a *yPos (in \e widget
+ coordinates) if the row is visible. Returns FALSE and does not modify
+ \a *yPos if \a row is invisible or invalid.
+
+ \sa colXPos(), findRow()
+*/
+
+bool QtTableView::rowYPos( int row, int *yPos ) const
+{
+ int y;
+ if ( row >= yCellOffs ) {
+ if ( cellH ) {
+ int lastVisible = lastRowVisible();
+ if ( row > lastVisible || lastVisible == -1 )
+ return FALSE;
+ y = (row - yCellOffs)*cellH + minViewY() - yCellDelta;
+ } else {
+ //##arnt3
+ y = minViewY() - yCellDelta; // y of leftmost cell in view
+ int r = yCellOffs;
+ QtTableView *tw = (QtTableView *)this;
+ int maxY = maxViewY();
+ while ( r < row && y <= maxY )
+ y += tw->cellHeight( r++ );
+ if ( y > maxY )
+ return FALSE;
+
+ }
+ } else {
+ return FALSE;
+ }
+ if ( yPos )
+ *yPos = y;
+ return TRUE;
+}
+
+
+/*!
+ Computes the position in the widget of column \a col.
+
+ Returns TRUE and stores the result in \a *xPos (in \e widget
+ coordinates) if the column is visible. Returns FALSE and does not
+ modify \a *xPos if \a col is invisible or invalid.
+
+ \sa rowYPos(), findCol()
+*/
+
+bool QtTableView::colXPos( int col, int *xPos ) const
+{
+ int x;
+ if ( col >= xCellOffs ) {
+ if ( cellW ) {
+ int lastVisible = lastColVisible();
+ if ( col > lastVisible || lastVisible == -1 )
+ return FALSE;
+ x = (col - xCellOffs)*cellW + minViewX() - xCellDelta;
+ } else {
+ //##arnt3
+ x = minViewX() - xCellDelta; // x of uppermost cell in view
+ int c = xCellOffs;
+ QtTableView *tw = (QtTableView *)this;
+ int maxX = maxViewX();
+ while ( c < col && x <= maxX )
+ x += tw->cellWidth( c++ );
+ if ( x > maxX )
+ return FALSE;
+ }
+ } else {
+ return FALSE;
+ }
+ if ( xPos )
+ *xPos = x;
+ return TRUE;
+}
+
+
+/*!
+ Moves the visible area of the table right by \a xPixels and
+ down by \a yPixels pixels. Both may be negative.
+
+ \warning You might find that QScrollView offers a higher-level of
+ functionality than using QtTableView and this function.
+
+ This function is \e not the same as QWidget::scroll(); in particular,
+ the signs of \a xPixels and \a yPixels have the reverse semantics.
+
+ \sa setXOffset(), setYOffset(), setOffset(), setTopCell(),
+ setLeftCell()
+*/
+
+void QtTableView::scroll( int xPixels, int yPixels )
+{
+ QWidget::scroll( -xPixels, -yPixels, contentsRect() );
+}
+
+
+/*!
+ Returns the leftmost pixel of the table view in \e view
+ coordinates. This excludes the frame and any header.
+
+ \sa maxViewY(), viewWidth(), contentsRect()
+*/
+
+int QtTableView::minViewX() const
+{
+ return frameWidth();
+}
+
+
+/*!
+ Returns the top pixel of the table view in \e view
+ coordinates. This excludes the frame and any header.
+
+ \sa maxViewX(), viewHeight(), contentsRect()
+*/
+
+int QtTableView::minViewY() const
+{
+ return frameWidth();
+}
+
+
+/*!
+ Returns the rightmost pixel of the table view in \e view
+ coordinates. This excludes the frame and any scroll bar, but
+ includes blank pixels to the right of the visible table data.
+
+ \sa maxViewY(), viewWidth(), contentsRect()
+*/
+
+int QtTableView::maxViewX() const
+{
+ return width() - 1 - frameWidth()
+ - (tFlags & Tbl_vScrollBar ? VSBEXT
+ : 0);
+}
+
+
+/*!
+ Returns the bottom pixel of the table view in \e view
+ coordinates. This excludes the frame and any scroll bar, but
+ includes blank pixels below the visible table data.
+
+ \sa maxViewX(), viewHeight(), contentsRect()
+*/
+
+int QtTableView::maxViewY() const
+{
+ return height() - 1 - frameWidth()
+ - (tFlags & Tbl_hScrollBar ? HSBEXT
+ : 0);
+}
+
+
+/*!
+ Returns the width of the table view, as such, in \e view
+ coordinates. This does not include any header, scroll bar or frame,
+ but it does include background pixels to the right of the table data.
+
+ \sa minViewX() maxViewX(), viewHeight(), contentsRect() viewRect()
+*/
+
+int QtTableView::viewWidth() const
+{
+ return maxViewX() - minViewX() + 1;
+}
+
+
+/*!
+ Returns the height of the table view, as such, in \e view
+ coordinates. This does not include any header, scroll bar or frame,
+ but it does include background pixels below the table data.
+
+ \sa minViewY() maxViewY() viewWidth() contentsRect() viewRect()
+*/
+
+int QtTableView::viewHeight() const
+{
+ return maxViewY() - minViewY() + 1;
+}
+
+
+void QtTableView::doAutoScrollBars()
+{
+ int viewW = width() - frameWidth() - minViewX();
+ int viewH = height() - frameWidth() - minViewY();
+ bool vScrollOn = testTableFlags(Tbl_vScrollBar);
+ bool hScrollOn = testTableFlags(Tbl_hScrollBar);
+ int w = 0;
+ int h = 0;
+ int i;
+
+ if ( testTableFlags(Tbl_autoHScrollBar) ) {
+ if ( cellW ) {
+ w = cellW*nCols;
+ } else {
+ i = 0;
+ while ( i < nCols && w <= viewW )
+ w += cellWidth( i++ );
+ }
+ if ( w > viewW )
+ hScrollOn = TRUE;
+ else
+ hScrollOn = FALSE;
+ }
+
+ if ( testTableFlags(Tbl_autoVScrollBar) ) {
+ if ( cellH ) {
+ h = cellH*nRows;
+ } else {
+ i = 0;
+ while ( i < nRows && h <= viewH )
+ h += cellHeight( i++ );
+ }
+
+ if ( h > viewH )
+ vScrollOn = TRUE;
+ else
+ vScrollOn = FALSE;
+ }
+
+ if ( testTableFlags(Tbl_autoHScrollBar) && vScrollOn && !hScrollOn )
+ if ( w > viewW - VSBEXT )
+ hScrollOn = TRUE;
+
+ if ( testTableFlags(Tbl_autoVScrollBar) && hScrollOn && !vScrollOn )
+ if ( h > viewH - HSBEXT )
+ vScrollOn = TRUE;
+
+ setHorScrollBar( hScrollOn, FALSE );
+ setVerScrollBar( vScrollOn, FALSE );
+ updateFrameSize();
+}
+
+
+/*!
+ \fn void QtTableView::updateScrollBars()
+
+ Updates the scroll bars' contents and presence to match the table's
+ state. Generally, you should not need to call this.
+
+ \sa setTableFlags()
+*/
+
+/*!
+ Updates the scroll bars' contents and presence to match the table's
+ state \c or \a f.
+
+ \sa setTableFlags()
+*/
+
+void QtTableView::updateScrollBars( uint f )
+{
+ sbDirty = sbDirty | f;
+ if ( inSbUpdate )
+ return;
+ inSbUpdate = TRUE;
+
+ if ( testTableFlags(Tbl_autoHScrollBar) && (sbDirty & horRange) ||
+ testTableFlags(Tbl_autoVScrollBar) && (sbDirty & verRange) )
+ // if range change and auto
+ doAutoScrollBars(); // turn scroll bars on/off if needed
+
+ if ( !autoUpdate() ) {
+ inSbUpdate = FALSE;
+ return;
+ }
+ if ( yOffset() > 0 && testTableFlags( Tbl_autoVScrollBar ) &&
+ !testTableFlags( Tbl_vScrollBar ) ) {
+ setYOffset( 0 );
+ }
+ if ( xOffset() > 0 && testTableFlags( Tbl_autoHScrollBar ) &&
+ !testTableFlags( Tbl_hScrollBar ) ) {
+ setXOffset( 0 );
+ }
+ if ( !isVisible() ) {
+ inSbUpdate = FALSE;
+ return;
+ }
+
+ if ( testTableFlags(Tbl_hScrollBar) && (sbDirty & horMask) != 0 ) {
+ if ( sbDirty & horGeometry )
+ hScrollBar->setGeometry( 0,height() - HSBEXT,
+ viewWidth() + frameWidth()*2,
+ HSBEXT);
+
+ if ( sbDirty & horSteps ) {
+ if ( cellW )
+ hScrollBar->setSteps( QMIN(cellW,viewWidth()/2), viewWidth() );
+ else
+ hScrollBar->setSteps( 16, viewWidth() );
+ }
+
+ if ( sbDirty & horRange )
+ hScrollBar->setRange( 0, maxXOffset() );
+
+ if ( sbDirty & horValue )
+ hScrollBar->setValue( xOffs );
+
+ // show scrollbar only when it has a sane geometry
+ if ( !hScrollBar->isVisible() )
+ hScrollBar->show();
+ }
+
+ if ( testTableFlags(Tbl_vScrollBar) && (sbDirty & verMask) != 0 ) {
+ if ( sbDirty & verGeometry )
+ vScrollBar->setGeometry( width() - VSBEXT, 0,
+ VSBEXT,
+ viewHeight() + frameWidth()*2 );
+
+ if ( sbDirty & verSteps ) {
+ if ( cellH )
+ vScrollBar->setSteps( QMIN(cellH,viewHeight()/2), viewHeight() );
+ else
+ vScrollBar->setSteps( 16, viewHeight() ); // fttb! ###
+ }
+
+ if ( sbDirty & verRange )
+ vScrollBar->setRange( 0, maxYOffset() );
+
+ if ( sbDirty & verValue )
+ vScrollBar->setValue( yOffs );
+
+ // show scrollbar only when it has a sane geometry
+ if ( !vScrollBar->isVisible() )
+ vScrollBar->show();
+ }
+ if ( coveringCornerSquare &&
+ ( (sbDirty & verGeometry ) || (sbDirty & horGeometry)) )
+ cornerSquare->move( maxViewX() + frameWidth() + 1,
+ maxViewY() + frameWidth() + 1 );
+
+ sbDirty = 0;
+ inSbUpdate = FALSE;
+}
+
+
+void QtTableView::updateFrameSize()
+{
+ int rw = width() - ( testTableFlags(Tbl_vScrollBar) ?
+ VSBEXT : 0 );
+ int rh = height() - ( testTableFlags(Tbl_hScrollBar) ?
+ HSBEXT : 0 );
+ if ( rw < 0 )
+ rw = 0;
+ if ( rh < 0 )
+ rh = 0;
+
+ if ( autoUpdate() ) {
+ int fh = frameRect().height();
+ int fw = frameRect().width();
+ setFrameRect( QRect(0,0,rw,rh) );
+
+ if ( rw != fw )
+ update( QMIN(fw,rw) - frameWidth() - 2, 0, frameWidth()+4, rh );
+ if ( rh != fh )
+ update( 0, QMIN(fh,rh) - frameWidth() - 2, rw, frameWidth()+4 );
+ }
+}
+
+
+/*!
+ Returns the maximum horizontal offset within the table of the
+ view's left edge in \e table coordinates.
+
+ This is used mainly to set the horizontal scroll bar's range.
+
+ \sa maxColOffset(), maxYOffset(), totalWidth()
+*/
+
+int QtTableView::maxXOffset()
+{
+ int tw = totalWidth();
+ int maxOffs;
+ if ( testTableFlags(Tbl_scrollLastHCell) ) {
+ if ( nCols != 1)
+ maxOffs = tw - ( cellW ? cellW : cellWidth( nCols - 1 ) );
+ else
+ maxOffs = tw - viewWidth();
+ } else {
+ if ( testTableFlags(Tbl_snapToHGrid) ) {
+ if ( cellW ) {
+ maxOffs = tw - (viewWidth()/cellW)*cellW;
+ } else {
+ int goal = tw - viewWidth();
+ int pos = tw;
+ int nextCol = nCols - 1;
+ int nextCellWidth = cellWidth( nextCol );
+ while( nextCol > 0 && pos > goal + nextCellWidth ) {
+ pos -= nextCellWidth;
+ nextCellWidth = cellWidth( --nextCol );
+ }
+ if ( goal + nextCellWidth == pos )
+ maxOffs = goal;
+ else if ( goal < pos )
+ maxOffs = pos;
+ else
+ maxOffs = 0;
+ }
+ } else {
+ maxOffs = tw - viewWidth();
+ }
+ }
+ return maxOffs > 0 ? maxOffs : 0;
+}
+
+
+/*!
+ Returns the maximum vertical offset within the table of the
+ view's top edge in \e table coordinates.
+
+ This is used mainly to set the vertical scroll bar's range.
+
+ \sa maxRowOffset(), maxXOffset(), totalHeight()
+*/
+
+int QtTableView::maxYOffset()
+{
+ int th = totalHeight();
+ int maxOffs;
+ if ( testTableFlags(Tbl_scrollLastVCell) ) {
+ if ( nRows != 1)
+ maxOffs = th - ( cellH ? cellH : cellHeight( nRows - 1 ) );
+ else
+ maxOffs = th - viewHeight();
+ } else {
+ if ( testTableFlags(Tbl_snapToVGrid) ) {
+ if ( cellH ) {
+ maxOffs = th - (viewHeight()/cellH)*cellH;
+ } else {
+ int goal = th - viewHeight();
+ int pos = th;
+ int nextRow = nRows - 1;
+ int nextCellHeight = cellHeight( nextRow );
+ while( nextRow > 0 && pos > goal + nextCellHeight ) {
+ pos -= nextCellHeight;
+ nextCellHeight = cellHeight( --nextRow );
+ }
+ if ( goal + nextCellHeight == pos )
+ maxOffs = goal;
+ else if ( goal < pos )
+ maxOffs = pos;
+ else
+ maxOffs = 0;
+ }
+ } else {
+ maxOffs = th - viewHeight();
+ }
+ }
+ return maxOffs > 0 ? maxOffs : 0;
+}
+
+
+/*!
+ Returns the index of the last column, which may be at the left edge
+ of the view.
+
+ Depending on the \link setTableFlags() Tbl_scrollLastHCell\endlink flag,
+ this may or may not be the last column.
+
+ \sa maxXOffset(), maxRowOffset()
+*/
+
+int QtTableView::maxColOffset()
+{
+ int mx = maxXOffset();
+ if ( cellW )
+ return mx/cellW;
+ else {
+ int xcd=0, col=0;
+ while ( col < nCols && mx > (xcd=cellWidth(col)) ) {
+ mx -= xcd;
+ col++;
+ }
+ return col;
+ }
+}
+
+
+/*!
+ Returns the index of the last row, which may be at the top edge of
+ the view.
+
+ Depending on the \link setTableFlags() Tbl_scrollLastVCell\endlink flag,
+ this may or may not be the last row.
+
+ \sa maxYOffset(), maxColOffset()
+*/
+
+int QtTableView::maxRowOffset()
+{
+ int my = maxYOffset();
+ if ( cellH )
+ return my/cellH;
+ else {
+ int ycd=0, row=0;
+ while ( row < nRows && my > (ycd=cellHeight(row)) ) {
+ my -= ycd;
+ row++;
+ }
+ return row;
+ }
+}
+
+
+void QtTableView::showOrHideScrollBars()
+{
+ if ( !autoUpdate() )
+ return;
+ if ( vScrollBar ) {
+ if ( testTableFlags(Tbl_vScrollBar) ) {
+ if ( !vScrollBar->isVisible() )
+ sbDirty = sbDirty | verMask;
+ } else {
+ if ( vScrollBar->isVisible() )
+ vScrollBar->hide();
+ }
+ }
+ if ( hScrollBar ) {
+ if ( testTableFlags(Tbl_hScrollBar) ) {
+ if ( !hScrollBar->isVisible() )
+ sbDirty = sbDirty | horMask;
+ } else {
+ if ( hScrollBar->isVisible() )
+ hScrollBar->hide();
+ }
+ }
+ if ( cornerSquare ) {
+ if ( testTableFlags(Tbl_hScrollBar) &&
+ testTableFlags(Tbl_vScrollBar) ) {
+ if ( !cornerSquare->isVisible() )
+ cornerSquare->show();
+ } else {
+ if ( cornerSquare->isVisible() )
+ cornerSquare->hide();
+ }
+ }
+}
+
+
+/*!
+ Updates the scroll bars and internal state.
+
+ Call this function when the table view's total size is changed;
+ typically because the result of cellHeight() or cellWidth() have changed.
+
+ This function does not repaint the widget.
+*/
+
+void QtTableView::updateTableSize()
+{
+ bool updateOn = autoUpdate();
+ setAutoUpdate( FALSE );
+ int xofs = xOffset();
+ xOffs++; //so that setOffset will not return immediately
+ setOffset(xofs,yOffset(),FALSE); //to calculate internal state correctly
+ setAutoUpdate(updateOn);
+
+ updateScrollBars( horSteps | horRange |
+ verSteps | verRange );
+ showOrHideScrollBars();
+}
+
+
+#endif
diff --git a/fifteenapplet/qttableview.h b/fifteenapplet/qttableview.h
new file mode 100644
index 0000000..c5a540d
--- /dev/null
+++ b/fifteenapplet/qttableview.h
@@ -0,0 +1,251 @@
+/**********************************************************************
+** $Id$
+**
+** Definition of QtTableView class
+**
+** Created : 941115
+**
+** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+**
+** This file contains a class moved out of the Qt GUI Toolkit API. It
+** may be used, distributed and modified without limitation.
+**
+**********************************************************************/
+
+#ifndef QTTABLEVIEW_H
+#define QTTABLEVIEW_H
+
+#ifndef QT_H
+#include "qframe.h"
+#endif // QT_H
+
+#ifndef QT_NO_QTTABLEVIEW
+
+class QScrollBar;
+class QCornerSquare;
+
+
+class QtTableView : public QFrame
+{
+ Q_OBJECT
+public:
+ virtual void setBackgroundColor( const QColor & );
+ virtual void setPalette( const QPalette & );
+ void show();
+
+ void repaint( bool erase=TRUE );
+ void repaint( int x, int y, int w, int h, bool erase=TRUE );
+ void repaint( const QRect &, bool erase=TRUE );
+
+protected:
+ QtTableView( QWidget *parent=0, const char *name=0, WFlags f=0 );
+ ~QtTableView();
+
+ int numRows() const;
+ virtual void setNumRows( int );
+ int numCols() const;
+ virtual void setNumCols( int );
+
+ int topCell() const;
+ virtual void setTopCell( int row );
+ int leftCell() const;
+ virtual void setLeftCell( int col );
+ virtual void setTopLeftCell( int row, int col );
+
+ int xOffset() const;
+ virtual void setXOffset( int );
+ int yOffset() const;
+ virtual void setYOffset( int );
+ virtual void setOffset( int x, int y, bool updateScrBars = TRUE );
+
+ virtual int cellWidth( int col );
+ virtual int cellHeight( int row );
+ int cellWidth() const;
+ int cellHeight() const;
+ virtual void setCellWidth( int );
+ virtual void setCellHeight( int );
+
+ virtual int totalWidth();
+ virtual int totalHeight();
+
+ uint tableFlags() const;
+ bool testTableFlags( uint f ) const;
+ virtual void setTableFlags( uint f );
+ void clearTableFlags( uint f = ~0 );
+
+ bool autoUpdate() const;
+ virtual void setAutoUpdate( bool );
+
+ void updateCell( int row, int column, bool erase=TRUE );
+
+ QRect cellUpdateRect() const;
+ QRect viewRect() const;
+
+ int lastRowVisible() const;
+ int lastColVisible() const;
+
+ bool rowIsVisible( int row ) const;
+ bool colIsVisible( int col ) const;
+
+ QScrollBar *verticalScrollBar() const;
+ QScrollBar *horizontalScrollBar() const;
+
+private slots:
+ void horSbValue( int );
+ void horSbSliding( int );
+ void horSbSlidingDone();
+ void verSbValue( int );
+ void verSbSliding( int );
+ void verSbSlidingDone();
+
+protected:
+ virtual void paintCell( QPainter *, int row, int col ) = 0;
+ virtual void setupPainter( QPainter * );
+
+ void paintEvent( QPaintEvent * );
+ void resizeEvent( QResizeEvent * );
+
+ int findRow( int yPos ) const;
+ int findCol( int xPos ) const;
+
+ bool rowYPos( int row, int *yPos ) const;
+ bool colXPos( int col, int *xPos ) const;
+
+ int maxXOffset();
+ int maxYOffset();
+ int maxColOffset();
+ int maxRowOffset();
+
+ int minViewX() const;
+ int minViewY() const;
+ int maxViewX() const;
+ int maxViewY() const;
+ int viewWidth() const;
+ int viewHeight() const;
+
+ void scroll( int xPixels, int yPixels );
+ void updateScrollBars();
+ void updateTableSize();
+
+private:
+ void coverCornerSquare( bool );
+ void snapToGrid( bool horizontal, bool vertical );
+ virtual void setHorScrollBar( bool on, bool update = TRUE );
+ virtual void setVerScrollBar( bool on, bool update = TRUE );
+ void updateView();
+ int findRawRow( int yPos, int *cellMaxY, int *cellMinY = 0,
+ bool goOutsideView = FALSE ) const;
+ int findRawCol( int xPos, int *cellMaxX, int *cellMinX = 0,
+ bool goOutsideView = FALSE ) const;
+ int maxColsVisible() const;
+
+ void updateScrollBars( uint );
+ void updateFrameSize();
+
+ void doAutoScrollBars();
+ void showOrHideScrollBars();
+
+ int nRows;
+ int nCols;
+ int xOffs, yOffs;
+ int xCellOffs, yCellOffs;
+ short xCellDelta, yCellDelta;
+ short cellH, cellW;
+
+ uint eraseInPaint : 1;
+ uint verSliding : 1;
+ uint verSnappingOff : 1;
+ uint horSliding : 1;
+ uint horSnappingOff : 1;
+ uint coveringCornerSquare : 1;
+ uint sbDirty : 8;
+ uint inSbUpdate : 1;
+
+ uint tFlags;
+ QRect cellUpdateR;
+
+ QScrollBar *vScrollBar;
+ QScrollBar *hScrollBar;
+ QCornerSquare *cornerSquare;
+
+private: // Disabled copy constructor and operator=
+#if defined(Q_DISABLE_COPY)
+ QtTableView( const QtTableView & );
+ QtTableView &operator=( const QtTableView & );
+#endif
+};
+
+
+const uint Tbl_vScrollBar = 0x00000001;
+const uint Tbl_hScrollBar = 0x00000002;
+const uint Tbl_autoVScrollBar = 0x00000004;
+const uint Tbl_autoHScrollBar = 0x00000008;
+const uint Tbl_autoScrollBars = 0x0000000C;
+
+const uint Tbl_clipCellPainting = 0x00000100;
+const uint Tbl_cutCellsV = 0x00000200;
+const uint Tbl_cutCellsH = 0x00000400;
+const uint Tbl_cutCells = 0x00000600;
+
+const uint Tbl_scrollLastHCell = 0x00000800;
+const uint Tbl_scrollLastVCell = 0x00001000;
+const uint Tbl_scrollLastCell = 0x00001800;
+
+const uint Tbl_smoothHScrolling = 0x00002000;
+const uint Tbl_smoothVScrolling = 0x00004000;
+const uint Tbl_smoothScrolling = 0x00006000;
+
+const uint Tbl_snapToHGrid = 0x00008000;
+const uint Tbl_snapToVGrid = 0x00010000;
+const uint Tbl_snapToGrid = 0x00018000;
+
+
+inline int QtTableView::numRows() const
+{ return nRows; }
+
+inline int QtTableView::numCols() const
+{ return nCols; }
+
+inline int QtTableView::topCell() const
+{ return yCellOffs; }
+
+inline int QtTableView::leftCell() const
+{ return xCellOffs; }
+
+inline int QtTableView::xOffset() const
+{ return xOffs; }
+
+inline int QtTableView::yOffset() const
+{ return yOffs; }
+
+inline int QtTableView::cellHeight() const
+{ return cellH; }
+
+inline int QtTableView::cellWidth() const
+{ return cellW; }
+
+inline uint QtTableView::tableFlags() const
+{ return tFlags; }
+
+inline bool QtTableView::testTableFlags( uint f ) const
+{ return (tFlags & f) != 0; }
+
+inline QRect QtTableView::cellUpdateRect() const
+{ return cellUpdateR; }
+
+inline bool QtTableView::autoUpdate() const
+{ return isUpdatesEnabled(); }
+
+inline void QtTableView::repaint( bool erase )
+{ repaint( 0, 0, width(), height(), erase ); }
+
+inline void QtTableView::repaint( const QRect &r, bool erase )
+{ repaint( r.x(), r.y(), r.width(), r.height(), erase ); }
+
+inline void QtTableView::updateScrollBars()
+{ updateScrollBars( 0 ); }
+
+
+#endif // QT_NO_QTTABLEVIEW
+
+#endif // QTTABLEVIEW_H
diff --git a/kdetoys.lsm b/kdetoys.lsm
new file mode 100644
index 0000000..b1bac67
--- /dev/null
+++ b/kdetoys.lsm
@@ -0,0 +1,11 @@
+Begin4
+Title: kdetoys
+Version: 3.5.10
+Entered-date: 2008-08-26
+Description: Toy applications for the K Desktop Environment (KDE)
+Keywords: KDE X11 desktop Qt
+Author: http://bugs.kde.org/ (KDE Bugtracking System)
+Primary-site: http://www.kde.org/download/
+Platforms: Unix, Qt
+Copying-policy: GPL, Artistic
+End
diff --git a/kmoon/AUTHORS b/kmoon/AUTHORS
new file mode 100644
index 0000000..3acac86
--- /dev/null
+++ b/kmoon/AUTHORS
@@ -0,0 +1,10 @@
+KDE interface:
+Stephan Kulow <coolo@kde.org>
+M G berberich <berberic@fmi.uni-passau.de>
+
+phase calculation code:
+Christopher Osburn <chris@speakeasy.org>
+
+Graphics by:
+Tim Beauchamp <timb@googol.com>
+
diff --git a/kmoon/Makefile.am b/kmoon/Makefile.am
new file mode 100644
index 0000000..c2875c1
--- /dev/null
+++ b/kmoon/Makefile.am
@@ -0,0 +1,20 @@
+
+kde_module_LTLIBRARIES = kmoon_panelapplet.la
+
+kmoon_panelapplet_la_SOURCES = kmoonapplet.cpp phases.cpp kmoondlg.cpp kmoonwidget.cpp
+kmoon_panelapplet_la_LDFLAGS = $(KDE_PLUGIN) -module $(all_libraries)
+kmoon_panelapplet_la_LIBADD = $(LIB_KSYCOCA)
+
+lnkdir = $(kde_datadir)/kicker/applets
+lnk_DATA = kmoonapplet.desktop
+
+INCLUDES = $(all_includes)
+
+METASOURCES = AUTO
+
+KDE_ICON = kmoon
+
+SUBDIRS = pics
+
+messages:
+ $(XGETTEXT) *.cpp -o $(podir)/kmoon.pot
diff --git a/kmoon/hi16-app-kmoon.png b/kmoon/hi16-app-kmoon.png
new file mode 100644
index 0000000..8913b34
--- /dev/null
+++ b/kmoon/hi16-app-kmoon.png
Binary files differ
diff --git a/kmoon/hi32-app-kmoon.png b/kmoon/hi32-app-kmoon.png
new file mode 100644
index 0000000..65deb09
--- /dev/null
+++ b/kmoon/hi32-app-kmoon.png
Binary files differ
diff --git a/kmoon/hi48-app-kmoon.png b/kmoon/hi48-app-kmoon.png
new file mode 100644
index 0000000..1ce020f
--- /dev/null
+++ b/kmoon/hi48-app-kmoon.png
Binary files differ
diff --git a/kmoon/kmoonapplet.cpp b/kmoon/kmoonapplet.cpp
new file mode 100644
index 0000000..9b3dd87
--- /dev/null
+++ b/kmoon/kmoonapplet.cpp
@@ -0,0 +1,165 @@
+/*
+ * kmoon - a moon phase indicator
+ * $Id$
+ * Copyright (C) 1998,2000 Stephan Kulow
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include <stdlib.h>
+#include <assert.h>
+#include <unistd.h>
+
+#include <qbitmap.h>
+#include <qtooltip.h>
+#include <qpainter.h>
+#include <qpopupmenu.h>
+#include <qlayout.h>
+
+#include <dcopclient.h>
+#include <kdebug.h>
+#include <kapplication.h>
+#include <kwin.h>
+#include <kstartupinfo.h>
+#include <kmessagebox.h>
+#include <kaboutdata.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <kcmdlineargs.h>
+#include <kiconloader.h>
+#include <kiconeffect.h>
+#include <kconfig.h>
+#include <kdialogbase.h>
+
+#include "version.h"
+#include "kmoondlg.h"
+#include "kmoonwidget.h"
+#include "kmoonapplet.h"
+
+const char *description = I18N_NOOP("Moon Phase Indicator for KDE");
+
+extern "C"
+{
+ KDE_EXPORT KPanelApplet *init(QWidget *parent, const QString& configFile)
+ {
+ KGlobal::locale()->insertCatalogue("kmoon");
+ return new MoonPAWidget(configFile, KPanelApplet::Normal,
+ KPanelApplet::About|KPanelApplet::Preferences,
+ parent, "kmoonapplet");
+ }
+}
+
+MoonPAWidget::MoonPAWidget(const QString& configFile, Type type, int actions,
+ QWidget *parent, const char *name)
+ : KPanelApplet(configFile, type, actions, parent, name)
+{
+ KConfig *config = KGlobal::config();
+ config->setGroup("General");
+
+ QVBoxLayout *vbox = new QVBoxLayout(this, 0,0);
+ moon = new MoonWidget(this);
+ moon->setAngle(config->readNumEntry("Rotation", 0));
+ moon->setNorthHemi(config->readBoolEntry("Northern", true));
+ moon->setMask(config->readBoolEntry("Mask", false));
+ vbox->addWidget(moon);
+ startTimer(1000 * 60 * 20);
+
+ popup = new QPopupMenu();
+ popup->insertItem(SmallIcon("kmoon"),
+ i18n("&About"), this,
+ SLOT(showAbout()));
+ popup->insertItem(SmallIcon("configure"), i18n("&Configure..."), this,
+ SLOT(settings()));
+
+ // missuse timerEvent for initialising
+ timerEvent(0);
+}
+
+MoonPAWidget::~MoonPAWidget()
+{
+ delete moon;
+ delete popup;
+}
+
+void MoonPAWidget::showAbout()
+{
+ KDialogBase *dialog = new KDialogBase(
+ i18n("About Moon Phase Indicator"),
+ KDialogBase::Yes,
+ KDialogBase::Yes, KDialogBase::Yes,
+ 0, "about", true, true,
+ KStdGuiItem::ok() );
+
+ QPixmap ret = DesktopIcon("kmoon");
+ QString text = i18n(description) + QString::fromLatin1("\n\n") +
+ i18n("Written by Stephan Kulow <coolo@kde.org>\n"
+ "\n"
+ "Made an applet by M G Berberich "
+ "<berberic@fmi.uni-passau.de>\n"
+ "\n"
+ "Lunar code by Chris Osburn "
+ "<chris@speakeasy.org>\n"
+ "\n"
+ "Moon graphics by Tim Beauchamp "
+ "<timb@googol.com>");
+
+ dialog->setIcon(ret);
+
+ KMessageBox::createKMessageBox(dialog, ret, text, QStringList(), QString::null, 0, KMessageBox::Notify);
+}
+
+void MoonPAWidget::settings()
+{
+ KMoonDlg dlg(moon->angle(), moon->northHemi(), moon->mask(),
+ this, "moondlg");
+ if (dlg.exec() == KMoonDlg::Accepted) {
+ moon->setAngle(dlg.getAngle());
+ moon->setNorthHemi(dlg.getNorthHemi());
+ moon->setMask(dlg.getMask());
+ KConfig *config = KGlobal::config();
+ config->setGroup("General");
+ config->writeEntry("Rotation", moon->angle());
+ config->writeEntry("Northern", moon->northHemi());
+ config->writeEntry("Mask", moon->mask());
+ config->sync();
+ }
+ repaint();
+}
+
+void MoonPAWidget::timerEvent( QTimerEvent * )
+{
+ time_t clock;
+ time(&clock);
+ struct tm *t = localtime(&clock);
+ moon->calcStatus(mktime(t));
+ moon->repaint();
+}
+
+void MoonPAWidget::mousePressEvent( QMouseEvent *e)
+{
+ if (!popup)
+ return;
+
+ if (e->button() == RightButton) {
+ popup->popup(mapToGlobal(e->pos()));
+ popup->exec();
+ }
+ if (e->button() == LeftButton) {
+ showAbout();
+ }
+}
+
+#include "kmoonapplet.moc"
diff --git a/kmoon/kmoonapplet.desktop b/kmoon/kmoonapplet.desktop
new file mode 100644
index 0000000..a89e167
--- /dev/null
+++ b/kmoon/kmoonapplet.desktop
@@ -0,0 +1,109 @@
+[Desktop Entry]
+Type=Plugin
+Icon=kmoon
+Name=Moon Phase
+Name[be]=Фаза луны
+Name[bg]=Фази на луната
+Name[bn]=চাà¦à¦¦à§‡à¦° কলা
+Name[br]=Prantadoù al loariad
+Name[ca]=Fase de la lluna
+Name[cs]=MÄ›síÄní fáze
+Name[cy]=Gweddau'r Lleuad
+Name[da]=MÃ¥nefase
+Name[de]=Mondphasen-Darstellung
+Name[el]=Δείκτης των φάσεων της Σελήνης
+Name[eo]=Lunfazo
+Name[es]=Fase lunar
+Name[et]=Kuu faasid
+Name[eu]=Ilargiaren fasea
+Name[fa]=هلال ماه
+Name[fi]=Kuunvaihenäyttäjä
+Name[fr]=Phase de la Lune
+Name[ga]=Céim na Gealaí
+Name[gl]=Fase da Lua
+Name[he]=מופע הירח
+Name[hr]=MjeseÄeva mjena
+Name[hu]=KMoon
+Name[is]=Tunglskiptabirtir
+Name[it]=Fasi lunari
+Name[ja]=月ã®æº€ã¡æ¬ ã‘
+Name[km]=ដំណើរ​ព្រះចន្ទ
+Name[ko]=달 모양 보기
+Name[lv]=MÄ“ness fÄzes
+Name[mk]=МеÑечеви мени
+Name[nb]=Se månefasene
+Name[nds]=Maandwieser
+Name[ne]=चनà¥à¤¦à¥à¤°à¤®à¤¾à¤•à¥‹ रूप
+Name[nl]=Maanstand
+Name[nn]=MÃ¥nefase
+Name[pa]=ਚੰਦ ਕਲਾਵਾਂ
+Name[pl]=Fazy księżyca
+Name[pt]=Fase Lunar
+Name[pt_BR]=Fase da Lua
+Name[ro]=Fazele Lunii
+Name[ru]=Фазы Луны
+Name[sk]=Fázy Mesiaca
+Name[sl]=Lunina mena
+Name[sr]=МеÑечеве мене
+Name[sr@Latn]=MeseÄeve mene
+Name[sv]=MÃ¥nfaser
+Name[tg]=Ðвзои Моҳ
+Name[tr]=Ay'ın Durumu
+Name[uk]=Фази міÑÑцÑ
+Name[wa]=Fazes del lune
+Name[zh_CN]=月相
+Name[zh_TW]=月亮圓缺
+Comment=Displays the current moon phase
+Comment[ar]=يعرض وجه القمر الحالي
+Comment[be]=Паказвае бÑгучаю фазу луны
+Comment[bg]=Показване на текущата фаза на луната
+Comment[bn]=চাà¦à¦¦à§‡à¦° বরà§à¦¤à¦®à¦¾à¦¨ কলা পà§à¦°à¦¦à¦°à§à¦¶à¦¨ করে
+Comment[br]=Diskouez ar prantad loariad red
+Comment[ca]=Mostra la fase actual de la lluna
+Comment[cs]=Zobrazuje aktuální fázi měsíce
+Comment[cy]=Dangos gwedd gyfredol y lleuad
+Comment[da]=Viser nuværende månefase
+Comment[de]=Zeigt die aktuelle Mondphase an
+Comment[el]=Εμφανίζει την Ï„Ïέχουσα φάση της Σελήνης
+Comment[eo]=Montru la nunan lunfazon
+Comment[es]=Indica la fase lunar actual
+Comment[et]=Kuu faaside näitaja
+Comment[eu]=Uneko ilargiaren fasea bistaratzen du
+Comment[fa]=هلال ماه جاری را نمایش می‌دهد
+Comment[fi]=Näyttää kuun nykyisen vaiheen
+Comment[fr]=Affiche la phase actuelle de la Lune
+Comment[ga]=Taispeáin céim reatha na gealaí
+Comment[gl]=Mostra a fase da lua
+Comment[he]=מציג ×ת מופע הירח הנוכחי
+Comment[hr]=Prikazivanje trenutnih mjeseÄevih mjena
+Comment[hu]=Megjeleníti a Hold aktuális állapotát
+Comment[is]=Sýnir núverandi stöðu tunglsins
+Comment[it]=Visualizza la fase lunare corrente
+Comment[ja]=月ã®æº€ã¡æ¬ ã‘ã®çŠ¶æ…‹ã‚’表示
+Comment[km]=បង្ហាញ​ដំណើរ​ព្រះចន្ទ​បច្ចុប្បន្ន
+Comment[lv]=RÄda paÅ¡reizÄ“jo mÄ“ness fÄzi
+Comment[mk]=Ја прикажува тековната меÑечева мена
+Comment[nb]=Vis vilken månefase vi er i
+Comment[nds]=Wiest den aktuellen Maand
+Comment[ne]=हालको चनà¥à¤¦à¥à¤°à¤®à¤¾à¤•à¥‹ रूप पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Toont de huidige maanstand
+Comment[nn]=Viser månefasen
+Comment[pl]=Pokazuje aktualną fazę księżyca
+Comment[pt]=Mostra a fase lunar actual
+Comment[pt_BR]=Mostra a atual fase da lua
+Comment[ro]=Afişează faza curentă a lunii
+Comment[ru]=Показывает текущую фазу Луны
+Comment[sk]=Zobrazí aktuálnu fázu Mesiaca
+Comment[sl]=Prikazuje trenutno Lunino meno
+Comment[sr]=Приказује тренутну фазу меÑеца
+Comment[sr@Latn]=Prikazuje trenutnu fazu meseca
+Comment[sv]=Visar den nuvarande månfasen
+Comment[tg]=Ðамоиши авзои Моҳи равон
+Comment[tr]=Ayın şimdiki durumunu gösterir
+Comment[uk]=Показує поточну фазу міÑÑцÑ
+Comment[wa]=Håynêye li faze del lune do moumint
+Comment[zh_CN]=显示当å‰çš„月相
+Comment[zh_TW]=顯示目å‰æœˆäº®çš„圓缺狀態
+X-KDE-Library=kmoon_panelapplet
+X-KDE-UniqueApplet=true
+DocPath=kmoon/index.html
diff --git a/kmoon/kmoonapplet.h b/kmoon/kmoonapplet.h
new file mode 100644
index 0000000..ac25d0f
--- /dev/null
+++ b/kmoon/kmoonapplet.h
@@ -0,0 +1,67 @@
+/*
+ * kmoon - a moon phase indicator
+ * Copyright (C) 1998,2000 Stephan Kulow
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef KMOONAPPLET
+#define KMOONAPPLET
+
+#include <qwidget.h>
+#include <qimage.h>
+#include <sys/types.h>
+#include <time.h>
+#include <ksystemtray.h>
+#include <kpanelapplet.h>
+
+// #include "kmoonwidget.h"
+
+class QPopupMenu;
+
+class MoonWidget;
+
+class MoonPAWidget : public KPanelApplet
+{
+ Q_OBJECT
+
+public:
+ MoonPAWidget(const QString& configFile, Type t = Normal, int actions = 0,
+ QWidget *parent = 0, const char *name = 0);
+ ~MoonPAWidget();
+
+ int widthForHeight(int height) const { return height; }
+ int heightForWidth(int width) const { return width; }
+
+protected:
+ QPopupMenu *popup;
+ MoonWidget *moon;
+ QString tooltip;
+
+ void about() { showAbout(); }
+ void preferences() { settings(); }
+
+protected slots:
+
+ void timerEvent( QTimerEvent *e);
+ void showAbout();
+ void settings();
+
+protected:
+ void mousePressEvent( QMouseEvent *e);
+};
+
+#endif
diff --git a/kmoon/kmoondlg.cpp b/kmoon/kmoondlg.cpp
new file mode 100644
index 0000000..14f6f5a
--- /dev/null
+++ b/kmoon/kmoondlg.cpp
@@ -0,0 +1,114 @@
+/*
+ * kmoon - a moon phase indicator
+ * Copyright (C) 1998 Stephan Kulow
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include <qslider.h>
+#include <qlayout.h>
+#include <klocale.h>
+#include <qwhatsthis.h>
+#include <qvbox.h>
+#include <kapplication.h>
+#include <qpushbutton.h>
+
+#include "kmoondlg.h"
+#include "kmoonwidget.h"
+
+KMoonDlg::KMoonDlg(int a, bool n, bool m, QWidget *parent, const char *name)
+ : KDialogBase(parent, name, true, i18n("Change View"),
+ Ok|Cancel|Help), angle(a), north(n), mask(m)
+{
+ QWidget *page = new QWidget( this );
+ setMainWidget(page);
+ QHBoxLayout *topLayout = new QHBoxLayout( page, 0, spacingHint() );
+
+ QVBox *vbox = new QVBox(page);
+ QHBox *hbox1 = new QHBox(vbox);
+ hbox1->setSpacing(15);
+
+ QLabel *label = new QLabel( i18n("View angle:"), hbox1, "caption" );
+ QString text = i18n("You can use this to rotate the moon to the correct\n"
+ "angle for your location.\n"
+ "\n"
+ "This angle is (almost) impossible to\n"
+ "calculate from any system-given data,\n"
+ "therefore you can configure how you\n"
+ "want KMoon to display your moon here.\n"
+ "The default value is 0, but it is very\n"
+ "unlikely that you would see the moon\n"
+ "at this angle.");
+ QWhatsThis::add(label, text);
+
+ slider = new QSlider( -90, 90, 2, angle, Qt::Horizontal, hbox1, "slider" );
+ slider->setTickmarks(QSlider::Above);
+ slider->setTickInterval(45);
+ slider->setEnabled(QPixmap::defaultDepth() > 8);
+ label->setEnabled(QPixmap::defaultDepth() > 8);
+ QWhatsThis::add(slider, text);
+ connect(slider, SIGNAL(valueChanged(int)), SLOT(angleChanged(int)));
+
+ QHBox *hbox2 = new QHBox(vbox);
+ hbox2->setSpacing(spacingHint());
+
+ hemitoggle = new QPushButton(hbox2);
+ hemitoggle->setText(north ? i18n("Switch to Southern Hemisphere") :
+ i18n("Switch to Northern Hemisphere"));
+
+ connect(hemitoggle, SIGNAL(clicked()), SLOT(toggleHemi()));
+
+ masktoggle = new QPushButton(hbox2);
+ masktoggle->setText(mask ? i18n("Switch Masking Off") :
+ i18n("Switch Masking On"));
+
+ connect(masktoggle, SIGNAL(clicked()), SLOT(toggleMask()));
+ topLayout->addWidget(vbox);
+
+ moon = new MoonWidget(page, "preview");
+ moon->setMinimumSize(50, 50);
+ moon->setMaximumSize(200,200);
+ QWhatsThis::add(moon, i18n("The moon as KMoon would display it\n"
+ "following your current setting and time."));
+ topLayout->addWidget(moon);
+ connect(this, SIGNAL(helpClicked()), SLOT(help()));
+ // disableResize();
+}
+
+void KMoonDlg::angleChanged(int value) {
+ angle = value;
+ moon->setAngle(value);
+}
+
+void KMoonDlg::help() {
+ kapp->invokeHelp(QString::fromLatin1("config"));
+}
+
+void KMoonDlg::toggleHemi() {
+ moon->setNorthHemi(!moon->northHemi());
+ north = moon->northHemi();
+ hemitoggle->setText(north ? i18n("Switch to Southern Hemisphere") :
+ i18n("Switch to Northern Hemisphere"));
+}
+
+void KMoonDlg::toggleMask() {
+ moon->setMask(!moon->mask());
+ mask = moon->mask();
+ masktoggle->setText(mask ? i18n("Switch Masking Off") :
+ i18n("Switch Masking On"));
+}
+
+#include "kmoondlg.moc"
diff --git a/kmoon/kmoondlg.h b/kmoon/kmoondlg.h
new file mode 100644
index 0000000..2533a2a
--- /dev/null
+++ b/kmoon/kmoondlg.h
@@ -0,0 +1,55 @@
+/*
+ * kmoon - a moon phase indicator
+ * Copyright (C) 1998,2000 Stephan Kulow
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef KMOONDLG
+#define KMOONDLG
+
+#include <kdialogbase.h>
+
+class QSlider;
+class MoonWidget;
+class QPushButton;
+
+class KMoonDlg : public KDialogBase {
+ Q_OBJECT
+
+ public:
+ KMoonDlg(int angle, bool north, bool mask, QWidget *parent, const char *name);
+ int getAngle() const { return angle; }
+ bool getNorthHemi() const { return north; }
+ bool getMask() const { return mask; }
+
+ private:
+ QSlider *slider;
+ MoonWidget *moon;
+ int angle;
+ bool north;
+ bool mask;
+ QPushButton *hemitoggle;
+ QPushButton *masktoggle;
+
+ private slots:
+ void help();
+ void angleChanged(int);
+ void toggleHemi();
+ void toggleMask();
+};
+
+#endif
diff --git a/kmoon/kmoonwidget.cpp b/kmoon/kmoonwidget.cpp
new file mode 100644
index 0000000..413b555
--- /dev/null
+++ b/kmoon/kmoonwidget.cpp
@@ -0,0 +1,369 @@
+/*
+ * kmoon - a moon phase indicator
+ * $Id$
+ * Copyright (C) 1998,2000 Stephan Kulow
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include <stdlib.h>
+#include <assert.h>
+#include <unistd.h>
+
+#include <qbitmap.h>
+#include <qtooltip.h>
+#include <qpainter.h>
+#include <qpopupmenu.h>
+#include <qcolor.h>
+
+#include <dcopclient.h>
+#include <kdebug.h>
+#include <kapplication.h>
+#include <kwin.h>
+#include <kstartupinfo.h>
+#include <kmessagebox.h>
+#include <kaboutdata.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <kcmdlineargs.h>
+#include <kiconloader.h>
+#include <kiconeffect.h>
+#include <kconfig.h>
+
+#include "kmoondlg.h"
+#include "kmoonwidget.h"
+#include <math.h>
+
+extern double moonphasebylunation(int lun, int phi);
+extern time_t JDtoDate(double jd, struct tm *event_date);
+
+MoonWidget::MoonWidget(QWidget *parent, const char *name)
+ : QWidget(parent, name)
+{
+ struct tm * t;
+ time_t clock;
+
+ counter = -1;
+ KConfig *config = KGlobal::config();
+ config->setGroup("General");
+ _angle = config->readNumEntry("Rotation", 0);
+ _north = config->readBoolEntry("Northern", true);
+ _mask = config->readBoolEntry("Mask", true);
+ old_angle = old_w = old_h = old_counter = -1;
+ old_north = false;
+ old_mask = false;
+ startTimer(1000 * 60 * 20);
+
+ time(&clock);
+ t = gmtime(&clock);
+ // kdDebug() << "time " << t->tm_isdst << " " << timezone << " " << daylight << endl ;
+ calcStatus(mktime(t));
+}
+
+MoonWidget::~MoonWidget()
+{
+}
+
+void MoonWidget::calcStatus( time_t time )
+{
+ uint lun = 0;
+ time_t last_new = 0;
+ time_t next_new = 0;
+
+ do {
+ double JDE = moonphasebylunation(lun, 0);
+ last_new = next_new;
+ next_new = JDtoDate(JDE, 0);
+ lun++;
+ } while (next_new < time);
+
+ lun -= 2;
+
+ QDateTime ln;
+ ln.setTime_t( last_new );
+ kdDebug() << KGlobal::locale()->formatDateTime( ln ) << endl;
+
+ time_t first_quarter = JDtoDate( moonphasebylunation( lun, 1 ), 0 );
+ QDateTime fq;
+ fq.setTime_t( first_quarter );
+ kdDebug() << KGlobal::locale()->formatDateTime( fq ) << endl;
+
+ time_t full_moon = JDtoDate( moonphasebylunation( lun, 2 ), 0 );
+ QDateTime fm;
+ fm.setTime_t( full_moon );
+ kdDebug() << KGlobal::locale()->formatDateTime( fm ) << endl;
+
+ time_t third_quarter = JDtoDate( moonphasebylunation( lun, 3 ), 0 );
+ QDateTime tq;
+ tq.setTime_t( third_quarter );
+ kdDebug() << KGlobal::locale()->formatDateTime( tq ) << endl;
+
+ QDateTime nn;
+ nn.setTime_t( next_new );
+ kdDebug() << KGlobal::locale()->formatDateTime( nn ) << endl;
+
+ QDateTime now;
+ now.setTime_t( time );
+ kdDebug() << KGlobal::locale()->formatDateTime( now ) << endl;
+
+ counter = ln.daysTo( now );
+ kdDebug() << "counter " << counter << " " << fm.daysTo( now ) << endl;
+
+ if ( fm.daysTo( now ) == 0 ) {
+ counter = 14;
+ tooltip = i18n( "Full Moon" );
+ return;
+ } else if ( counter <= 15 && counter >= 13 ) {
+ counter = 14 + fm.daysTo( now );
+ kdDebug() << "around full moon " << counter << endl;
+ }
+
+ int diff = fq.daysTo( now );
+ if ( diff == 0 )
+ counter = 7;
+ else if ( counter <= 8 && counter >= 6 ) {
+ counter = 7 + diff;
+ kdDebug() << "around first quarter " << counter << endl;
+ }
+
+ diff = ln.daysTo( now );
+ if ( diff == 0 )
+ counter = 0;
+ else if ( counter <= 1 || counter >= 28 )
+ {
+ counter = ( 29 + diff ) % 29;
+ diff = -nn.daysTo( now );
+ if ( diff == 0 )
+ counter = 0;
+ else if ( diff < 3 )
+ counter = 29 - diff;
+ kdDebug() << "around new " << counter << " " << diff << endl;
+ }
+
+ if ( tq.daysTo( now ) == 0 )
+ counter = 21;
+ else if ( counter <= 22 && counter >= 20 )
+ {
+ counter = 21 + tq.daysTo( now );
+ kdDebug() << "around third quarter " << counter << endl;
+ }
+
+ kdDebug() << "counter " << counter << endl;
+
+ assert (counter >= 0 && counter < 29);
+
+ switch (counter) {
+ case 0:
+ tooltip = i18n("New Moon");
+ return;
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ tooltip = i18n("Waxing Crescent (New Moon was yesterday)", "Waxing Crescent (%n days since New Moon)", counter );
+ break;
+ case 7:
+ tooltip = i18n("First Quarter");
+ break;
+ case 8:
+ case 9:
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ tooltip = i18n( "Waxing Gibbous (Tomorrow is Full Moon)", "Waxing Gibbous (%n days to Full Moon)", -fm.daysTo( now ) );
+ break;
+ case 14:
+ assert( false );
+ break;
+ case 15:
+ case 16:
+ case 17:
+ case 18:
+ case 19:
+ case 20:
+ tooltip = i18n("Waning Gibbous (Yesterday was Full Moon)", "Waning Gibbous (%n days since Full Moon)", fm.daysTo( now ) );
+ break;
+ case 21:
+ tooltip = i18n("Last Quarter");
+ break;
+ case 22:
+ case 23:
+ case 24:
+ case 25:
+ case 26:
+ case 27:
+ case 28:
+ kdDebug() << "nn.days " << ln.daysTo( now ) << " " << nn.daysTo( now ) << endl;
+ tooltip = i18n("Waning Crescent (Tomorrow is New Moon)", "Waning Crescent (%n days to New Moon)", -nn.daysTo( now ) );
+ break;
+ default:
+ kdFatal() << "coolo can't count\n";
+ }
+
+ renderGraphic();
+ repaint();
+}
+
+QImage MoonWidget::loadMoon(int index)
+{
+ if (index == 0) // the new moon has the wrong filename
+ index = 29;
+ QString filename = QString("kmoon/pics/moon%1.png").arg(index);
+ QString path = locate("data", filename);
+ if (path.isNull())
+ kdFatal() << "cound't find " << filename << ". Exiting.\n";
+ QImage image(path);
+ KIconEffect iconeffect;
+ image=iconeffect.apply(image, KIcon::Panel, KIcon::DefaultState);
+ return image;
+}
+
+void MoonWidget::setAngle(int value)
+{
+ _angle = value;
+ renderGraphic();
+ repaint();
+}
+
+void MoonWidget::setNorthHemi(bool n)
+{
+ _north = n;
+ renderGraphic();
+ repaint();
+}
+
+void MoonWidget::setMask(bool value)
+{
+ _mask = value;
+ renderGraphic();
+ repaint();
+}
+
+void MoonWidget::paintEvent(QPaintEvent *)
+{
+ bitBlt(this, 0, 0, &pixmap, 0, 0);
+}
+
+void MoonWidget::resizeEvent(QResizeEvent *)
+{
+ renderGraphic();
+ repaint();
+}
+
+void MoonWidget::renderGraphic()
+{
+ if (old_counter == counter && old_w == width() && old_h == height() &&
+ old_angle == _angle && old_north == _north)
+ return;
+ old_counter = counter;
+ old_w = width();
+ old_h = height();
+ old_north = _north;
+ QImage im = loadMoon(counter);
+ assert(!im.isNull());
+ im = im.convertDepth(32, 0);
+ assert(!im.isNull());
+
+ int mw = QMIN(width(), height());
+ QImage dest;
+
+ if (QPixmap::defaultDepth() > 8) {
+
+ if (fabs(_angle)!=0) { // nothing to rotate
+ //We expand the image 2x before rotating, rotate it, and then average out
+ //the pixel for better quality
+ int dmw = 2 * mw;
+ if (!pixmap.convertFromImage(im.smoothScale(dmw, dmw), 0)) {
+ return;
+ }
+ QWMatrix m;
+ m.rotate(_angle);
+ QPixmap rotated = pixmap.xForm(m);
+
+ //Copy the relevant part back to the pixmap
+ QRegion r(QRect(0, 0, dmw, dmw), QRegion::Ellipse);
+ QPainter p;
+ p.begin(&pixmap);
+ p.fillRect(0, 0, dmw, dmw, Qt::black);
+ p.setClipRegion(r);
+ p.drawPixmap(0, 0, rotated, (rotated.width() - dmw) / 2,
+ (rotated.height() - dmw) / 2,
+ dmw, dmw);
+ p.end();
+
+ //Shrink down to the proper size, averaging from the source
+ im = pixmap.convertToImage();
+ dest = im.copy(0, 0, mw, mw);
+ for (int y = 0; y < mw; y++) {
+ QRgb *destline = (QRgb*)dest.scanLine(y);
+ QRgb *sourceline1 = (QRgb*)im.scanLine(2*y);
+ QRgb *sourceline2 = (QRgb*)im.scanLine(2*y + 1);
+ for (int x = 0; x < mw; x++) {
+ int r = qRed(sourceline1[2*x]) + qRed(sourceline1[2*x+1]);
+ r = r + qRed(sourceline2[2*x]) + qRed(sourceline2[2*x+1]);
+ int g = qGreen(sourceline1[2*x]) + qGreen(sourceline1[2*x+1]);
+ g = g + qGreen(sourceline2[2*x]) + qGreen(sourceline2[2*x+1]);
+ int b = qBlue(sourceline1[2*x]) + qBlue(sourceline1[2*x+1]);
+ b = b + qBlue(sourceline2[2*x]) + qBlue(sourceline2[2*x+1]);
+ destline[x] = qRgb(qRound(r / 4), qRound(g / 4),
+ qRound(b / 4));
+ }
+ }
+ } else {
+ dest = im.smoothScale(mw, mw).convertDepth(32);
+ }
+ if (_mask) {
+ // generate alpha-channel
+ int dmw = mw*2;
+ QBitmap dMask(dmw, dmw);
+ QRegion r(QRect(0, 0, dmw, dmw), QRegion::Ellipse);
+ QPainter p;
+ p.begin(&dMask);
+ p.fillRect(0, 0, dmw, dmw, Qt::white);
+ p.setClipRegion(r);
+ p.fillRect(0, 0, dmw, dmw, Qt::black);
+ p.end();
+ QImage Mask2 = dMask.convertToImage().convertDepth(32).smoothScale(mw, mw);
+ dest.setAlphaBuffer(true);
+ for (int y = 0; y < mw; y++) {
+ QRgb *destline = (QRgb*)dest.scanLine(y);
+ QRgb *sourceline = (QRgb*)Mask2.scanLine(y);
+ for (int x = 0; x < mw; x++) {
+ destline[x] = (destline[x] & RGB_MASK)|(qRed(sourceline[x]) << 24);
+ }
+ }
+ }
+ } else {
+ dest = im.smoothScale(mw, mw);
+ }
+
+ if (!_north)
+ dest = dest.mirror(true, true);
+
+ if (!pixmap.convertFromImage(dest, 0)) {
+ return;
+ }
+
+ QToolTip::remove(this);
+
+ QToolTip::add(this, tooltip);
+}
+
+
+#include "kmoonwidget.moc"
diff --git a/kmoon/kmoonwidget.h b/kmoon/kmoonwidget.h
new file mode 100644
index 0000000..474349a
--- /dev/null
+++ b/kmoon/kmoonwidget.h
@@ -0,0 +1,68 @@
+/*
+ * kmoon - a moon phase indicator
+ * Copyright (C) 1998,2000 Stephan Kulow
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef KMOON
+#define KMOON
+
+#include <qwidget.h>
+#include <qimage.h>
+#include <sys/types.h>
+#include <time.h>
+#include <ksystemtray.h>
+class QPopupMenu;
+
+class MoonWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ MoonWidget(QWidget *parent = 0, const char *name = 0);
+ ~MoonWidget();
+
+ void calcStatus( time_t time );
+
+ int angle() const { return _angle; }
+ void setAngle(int angle);
+
+ bool northHemi() const { return _north; }
+ void setNorthHemi(bool b);
+
+ bool mask() const { return _mask; }
+ void setMask(bool b);
+
+protected:
+ int old_w, old_h;
+ int counter, old_counter;
+ int _angle, old_angle;
+ int _mask, old_mask;
+ bool old_north, _north;
+
+ QPixmap pixmap;
+ QString tooltip;
+
+ void paintEvent( QPaintEvent *e);
+ void resizeEvent( QResizeEvent *e);
+
+private:
+ QImage loadMoon(int index);
+ void renderGraphic();
+};
+
+#endif
diff --git a/kmoon/phases.cpp b/kmoon/phases.cpp
new file mode 100644
index 0000000..7fc0f4c
--- /dev/null
+++ b/kmoon/phases.cpp
@@ -0,0 +1,383 @@
+/* This file is part of the kmoon application with explicit permission by the author
+ Copyright (C) 1996 Christopher Osburn
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+/*
+** jd.c:
+** 1996/02/11
+**
+** Copyright 1996, Christopher Osburn, Lunar Outreach Services,
+** Non-commercial usage license granted to all.
+**
+** convert a Julian Day number to a struct tm
+**
+** Parameter:
+** double jd: Julian day number with fraction of day
+**
+** Returns:
+** struct tm *event_date: Date-time group holding year, month, day, hour,
+** and minute of the event
+*/
+
+#include <time.h>
+#include <stdlib.h>
+
+time_t JDtoDate(double jd, struct tm *event_date)
+/* convert a Julian Date to a date-time group */
+{
+ long a, a1, z, b, c, d, e;
+ double f, day;
+ struct tm dummy;
+ if ( !event_date )
+ event_date = &dummy;
+
+ jd += 0.5;
+ z = (long) jd;
+ f = jd - z;
+
+ if (z < 2299161)
+ {
+ a = z;
+ }
+ else
+ {
+ a1 = (long) ((z - 1867216.25) / 36524.25);
+ a = z + 1 + a1 - (long)(a1 / 4);
+ }
+
+ b = a + 1524;
+ c = (long)((b - 122.1) / 365.25);
+ d = (long)(365.25 * c);
+ e = (long)((b - d)/30.6001);
+
+ day = b - d - (long)(30.6001 * e) + f;
+
+ if (e < 14)
+ {
+ event_date->tm_mon = (e - 1) - 1;
+ }
+ else
+ {
+ event_date->tm_mon = (e - 13) - 1;
+ }
+
+ if (event_date->tm_mon > (2 - 1))
+ {
+ event_date->tm_year = c - 4716 - 1900;
+ }
+ else
+ {
+ event_date->tm_year = c - 4715 - 1900;
+ }
+ event_date->tm_mday = (int)day;
+ day -= event_date->tm_mday;
+ day *= 24;
+ event_date->tm_hour = (int)day;
+ day -= event_date->tm_hour;
+ day *= 60;
+ event_date->tm_min = (int)day;
+ day -= event_date->tm_min;
+ day *= 60;
+ event_date->tm_sec = (int)day;
+
+ event_date->tm_isdst = -1;
+
+ return mktime(event_date);
+}
+
+double DatetoJD(struct tm *event_date)
+/* convert a date-time group to a JD with fraction */
+{
+ int y, m;
+ double d;
+ int a, b;
+ double jd;
+
+ y = event_date->tm_year + 1900;
+ m = event_date->tm_mon + 1;
+ d = (double)(event_date->tm_mday) + (event_date->tm_hour / 24.0)
+ + (event_date->tm_min / 1440.0) + (event_date->tm_sec / 86400.0);
+
+ if (m == 1 || m == 2)
+ {
+ y--;
+ m += 12;
+ }
+
+ a = (int)(y / 100);
+ b = 2 - a + (int)(a / 4);
+
+ if (y < 1583)
+ if ((y < 1582) || (m < 10) || ((m == 10) && (d <= 15)))
+ b = 0;
+
+ jd = (long)(365.25 * (y + 4716)) + (long)(30.6001 * (m+1))
+ + d + b - 1524.5;
+
+ return jd;
+}
+
+/*
+** misc.h
+** 1996/02/11
+**
+** Copyright 1996, Christopher Osburn, Lunar Outreach Services,
+** Non-commercial usage license granted to all.
+**
+** Miscellaneous routines for moon phase programs
+**
+*/
+
+#include <math.h>
+
+double torad(double x)
+/* convert x to radians */
+{
+ x = fmod(x, 360.0); /* normalize the angle */
+ return ((x) * 0.01745329251994329576);
+ /* and return the result */
+}
+
+/*
+** moonphase.c
+** 1996/02/11
+**
+** Copyright 1996, Christopher Osburn, Lunar Outreach Services,
+** Non-commercial usage license granted to all.
+**
+** calculate phase of the moon per Meeus Ch. 47
+**
+** Parameters:
+** int lun: phase parameter. This is the number of lunations
+** since the New Moon of 2000 January 6.
+**
+** int phi: another phase parameter, selecting the phase of the
+** moon. 0 = New, 1 = First Qtr, 2 = Full, 3 = Last Qtr
+**
+** Return: Apparent JD of the needed phase
+*/
+
+#include <stdio.h>
+#include <math.h>
+
+double moonphase(double k, int phi)
+{
+ int i; /* iterator to be named later. Every
+ program needs an i */
+ double T; /* time parameter, Julian Centuries since
+ J2000 */
+ double JDE; /* Julian Ephemeris Day of phase event */
+ double E; /* Eccentricity anomaly */
+ double M; /* Sun's mean anomaly */
+ double M1; /* Moon's mean anomaly */
+ double F; /* Moon's argument of latitude */
+ double O; /* Moon's longitude of ascenfing node */
+ double A[15]; /* planetary arguments */
+ double W; /* added correction for quarter phases */
+
+ T = k / 1236.85; /* (47.3) */
+
+ /* this is the first approximation. all else is for style points! */
+ JDE = 2451550.09765 + (29.530588853 * k) /* (47.1) */
+ + T * T * (0.0001337 + T * (-0.000000150 + 0.00000000073 * T));
+
+ /* these are correction parameters used below */
+ E = 1.0 /* (45.6) */
+ + T * (-0.002516 + -0.0000074 * T);
+ M = 2.5534 + 29.10535669 * k /* (47.4) */
+ + T * T * (-0.0000218 + -0.00000011 * T);
+ M1 = 201.5643 + 385.81693528 * k /* (47.5) */
+ + T * T * (0.0107438 + T * (0.00001239 + -0.000000058 * T));
+ F = 160.7108 + 390.67050274 * k /* (47.6) */
+ + T * T * (-0.0016341 * T * (-0.00000227 + 0.000000011 * T));
+ O = 124.7746 - 1.56375580 * k /* (47.7) */
+ + T * T * (0.0020691 + 0.00000215 * T);
+
+ /* planetary arguments */
+ A[0] = 0; /* unused! */
+ A[1] = 299.77 + 0.107408 * k - 0.009173 * T * T;
+ A[2] = 251.88 + 0.016321 * k;
+ A[3] = 251.83 + 26.651886 * k;
+ A[4] = 349.42 + 36.412478 * k;
+ A[5] = 84.66 + 18.206239 * k;
+ A[6] = 141.74 + 53.303771 * k;
+ A[7] = 207.14 + 2.453732 * k;
+ A[8] = 154.84 + 7.306860 * k;
+ A[9] = 34.52 + 27.261239 * k;
+ A[10] = 207.19 + 0.121824 * k;
+ A[11] = 291.34 + 1.844379 * k;
+ A[12] = 161.72 + 24.198154 * k;
+ A[13] = 239.56 + 25.513099 * k;
+ A[14] = 331.55 + 3.592518 * k;
+
+ /* all of the above crap must be made into radians!!! */
+ /* except for E... */
+
+ M = torad(M);
+ M1 = torad(M1);
+ F = torad(F);
+ O = torad(O);
+
+ /* all those planetary arguments, too! */
+ for (i=1; i<=14; i++)
+ A[i] = torad(A[i]);
+
+ /* ok, we have all the parameters, let's apply them to the JDE.
+ (remember the JDE? this is a program about the JDE...) */
+
+ switch(phi)
+ {
+ /* a special case for each different phase. NOTE!,
+ I'm not treating these in a 0123 order!!! Pay
+ attention, there, you! */
+
+ case 0: /* New Moon */
+ JDE = JDE
+ - 0.40720 * sin (M1)
+ + 0.17241 * E * sin (M)
+ + 0.01608 * sin (2.0 * M1)
+ + 0.01039 * sin (2.0 * F)
+ + 0.00739 * E * sin (M1 - M)
+ - 0.00514 * E * sin (M1 + M)
+ + 0.00208 * E * E * sin (2.0 * M)
+ - 0.00111 * sin (M1 - 2.0 * F)
+ - 0.00057 * sin (M1 + 2.0 * F)
+ + 0.00056 * E * sin (2.0 * M1 + M)
+ - 0.00042 * sin (3.0 * M1)
+ + 0.00042 * E * sin (M + 2.0 * F)
+ + 0.00038 * E * sin (M - 2.0 * F)
+ - 0.00024 * E * sin (2.0 * M1 - M)
+ - 0.00017 * sin (O)
+ - 0.00007 * sin (M1 + 2.0 * M)
+ + 0.00004 * sin (2.0 * M1 - 2.0 * F)
+ + 0.00004 * sin (3.0 * M)
+ + 0.00003 * sin (M1 + M - 2.0 * F)
+ + 0.00003 * sin (2.0 * M1 + 2.0 * F)
+ - 0.00003 * sin (M1 + M + 2.0 * F)
+ + 0.00003 * sin (M1 - M + 2.0 * F)
+ - 0.00002 * sin (M1 - M - 2.0 * F)
+ - 0.00002 * sin (3.0 * M1 + M)
+ + 0.00002 * sin (4.0 * M1);
+
+ break;
+
+ case 2: /* Full Moon */
+ JDE = JDE
+ - 0.40614 * sin (M1)
+ + 0.17302 * E * sin (M)
+ + 0.01614 * sin (2.0 * M1)
+ + 0.01043 * sin (2.0 * F)
+ + 0.00734 * E * sin (M1 - M)
+ - 0.00515 * E * sin (M1 + M)
+ + 0.00209 * E * E * sin (2.0 * M)
+ - 0.00111 * sin (M1 - 2.0 * F)
+ - 0.00057 * sin (M1 + 2.0 * F)
+ + 0.00056 * E * sin (2.0 * M1 + M)
+ - 0.00042 * sin (3.0 * M1)
+ + 0.00042 * E * sin (M + 2.0 * F)
+ + 0.00038 * E * sin (M - 2.0 * F)
+ - 0.00024 * E * sin (2.0 * M1 - M)
+ - 0.00017 * sin (O)
+ - 0.00007 * sin (M1 + 2.0 * M)
+ + 0.00004 * sin (2.0 * M1 - 2.0 * F)
+ + 0.00004 * sin (3.0 * M)
+ + 0.00003 * sin (M1 + M - 2.0 * F)
+ + 0.00003 * sin (2.0 * M1 + 2.0 * F)
+ - 0.00003 * sin (M1 + M + 2.0 * F)
+ + 0.00003 * sin (M1 - M + 2.0 * F)
+ - 0.00002 * sin (M1 - M - 2.0 * F)
+ - 0.00002 * sin (3.0 * M1 + M)
+ + 0.00002 * sin (4.0 * M1);
+
+ break;
+
+ case 1: /* First Quarter */
+ case 3: /* Last Quarter */
+ JDE = JDE
+ - 0.62801 * sin (M1)
+ + 0.17172 * E * sin (M)
+ - 0.01183 * E * sin (M1 + M)
+ + 0.00862 * sin (2.0 * M1)
+ + 0.00804 * sin (2.0 * F)
+ + 0.00454 * E * sin (M1 - M)
+ + 0.00204 * E * E * sin (2.0 * M)
+ - 0.00180 * sin (M1 - 2.0 * F)
+ - 0.00070 * sin (M1 + 2.0 * F)
+ - 0.00040 * sin (3.0 * M1)
+ - 0.00034 * E * sin (2.0 * M1 - M)
+ + 0.00032 * E * sin (M + 2.0 * F)
+ + 0.00032 * E * sin (M - 2.0 * F)
+ - 0.00028 * E * E * sin (M1 + 2.0 * M)
+ + 0.00027 * E * sin (2.0 * M1 + M)
+ - 0.00017 * sin (O)
+ - 0.00005 * sin (M1 - M - 2.0 * F)
+ + 0.00004 * sin (2.0 * M1 + 2.0 * F)
+ - 0.00004 * sin (M1 + M + 2.0 * F)
+ + 0.00004 * sin (M1 - 2.0 * M)
+ + 0.00003 * sin (M1 + M - 2.0 * F)
+ + 0.00003 * sin (3.0 * M)
+ + 0.00002 * sin (2.0 * M1 - 2.0 * F)
+ + 0.00002 * sin (M1 - M + 2.0 * F)
+ - 0.00002 * sin (3.0 * M1 + M);
+
+ W = 0.00306
+ - 0.00038 * E * cos(M)
+ + 0.00026 * cos(M1)
+ - 0.00002 * cos(M1 - M)
+ + 0.00002 * cos(M1 + M)
+ + 0.00002 * cos(2.0 * F);
+ if (phi == 3)
+ W = -W;
+ JDE += W;
+
+ break;
+
+ default: /* oops! */
+ fprintf(stderr, "The Moon has exploded!\n");
+ exit(1);
+ break; /* unexecuted code */
+ }
+ /* now there are some final correction to everything */
+ JDE = JDE
+ + 0.000325 * sin(A[1])
+ + 0.000165 * sin(A[2])
+ + 0.000164 * sin(A[3])
+ + 0.000126 * sin(A[4])
+ + 0.000110 * sin(A[5])
+ + 0.000062 * sin(A[6])
+ + 0.000060 * sin(A[7])
+ + 0.000056 * sin(A[8])
+ + 0.000047 * sin(A[9])
+ + 0.000042 * sin(A[10])
+ + 0.000040 * sin(A[11])
+ + 0.000037 * sin(A[12])
+ + 0.000035 * sin(A[13])
+ + 0.000023 * sin(A[14]);
+
+ return JDE;
+}
+
+#define LUNATION_OFFSET 953
+
+double moonphasebylunation(int lun, int phi)
+{
+ double k;
+
+ k = lun - LUNATION_OFFSET + phi / 4.0;
+ return moonphase(k, phi);
+}
+
diff --git a/kmoon/pics/Makefile.am b/kmoon/pics/Makefile.am
new file mode 100644
index 0000000..1b498cc
--- /dev/null
+++ b/kmoon/pics/Makefile.am
@@ -0,0 +1,13 @@
+
+pics_DATA = \
+ moon1.png moon10.png moon11.png moon12.png moon13.png \
+ moon14.png moon15.png moon16.png moon17.png moon18.png \
+ moon19.png moon2.png moon20.png moon21.png moon22.png \
+ moon23.png moon24.png moon25.png moon26.png moon27.png \
+ moon28.png moon29.png moon3.png moon4.png moon5.png \
+ moon6.png moon7.png moon8.png moon9.png
+
+picsdir = $(kde_datadir)/kmoon/pics
+
+EXTRA_DIST = $(pics_DATA)
+
diff --git a/kmoon/pics/moon1.png b/kmoon/pics/moon1.png
new file mode 100644
index 0000000..7f2ac91
--- /dev/null
+++ b/kmoon/pics/moon1.png
Binary files differ
diff --git a/kmoon/pics/moon10.png b/kmoon/pics/moon10.png
new file mode 100644
index 0000000..07c8c65
--- /dev/null
+++ b/kmoon/pics/moon10.png
Binary files differ
diff --git a/kmoon/pics/moon11.png b/kmoon/pics/moon11.png
new file mode 100644
index 0000000..f03cb68
--- /dev/null
+++ b/kmoon/pics/moon11.png
Binary files differ
diff --git a/kmoon/pics/moon12.png b/kmoon/pics/moon12.png
new file mode 100644
index 0000000..32eee90
--- /dev/null
+++ b/kmoon/pics/moon12.png
Binary files differ
diff --git a/kmoon/pics/moon13.png b/kmoon/pics/moon13.png
new file mode 100644
index 0000000..e95e78a
--- /dev/null
+++ b/kmoon/pics/moon13.png
Binary files differ
diff --git a/kmoon/pics/moon14.png b/kmoon/pics/moon14.png
new file mode 100644
index 0000000..60b7980
--- /dev/null
+++ b/kmoon/pics/moon14.png
Binary files differ
diff --git a/kmoon/pics/moon15.png b/kmoon/pics/moon15.png
new file mode 100644
index 0000000..cb78092
--- /dev/null
+++ b/kmoon/pics/moon15.png
Binary files differ
diff --git a/kmoon/pics/moon16.png b/kmoon/pics/moon16.png
new file mode 100644
index 0000000..179a207
--- /dev/null
+++ b/kmoon/pics/moon16.png
Binary files differ
diff --git a/kmoon/pics/moon17.png b/kmoon/pics/moon17.png
new file mode 100644
index 0000000..7326135
--- /dev/null
+++ b/kmoon/pics/moon17.png
Binary files differ
diff --git a/kmoon/pics/moon18.png b/kmoon/pics/moon18.png
new file mode 100644
index 0000000..174befe
--- /dev/null
+++ b/kmoon/pics/moon18.png
Binary files differ
diff --git a/kmoon/pics/moon19.png b/kmoon/pics/moon19.png
new file mode 100644
index 0000000..38b2c80
--- /dev/null
+++ b/kmoon/pics/moon19.png
Binary files differ
diff --git a/kmoon/pics/moon2.png b/kmoon/pics/moon2.png
new file mode 100644
index 0000000..2274547
--- /dev/null
+++ b/kmoon/pics/moon2.png
Binary files differ
diff --git a/kmoon/pics/moon20.png b/kmoon/pics/moon20.png
new file mode 100644
index 0000000..7bc5e87
--- /dev/null
+++ b/kmoon/pics/moon20.png
Binary files differ
diff --git a/kmoon/pics/moon21.png b/kmoon/pics/moon21.png
new file mode 100644
index 0000000..f1e1f05
--- /dev/null
+++ b/kmoon/pics/moon21.png
Binary files differ
diff --git a/kmoon/pics/moon22.png b/kmoon/pics/moon22.png
new file mode 100644
index 0000000..a2a408f
--- /dev/null
+++ b/kmoon/pics/moon22.png
Binary files differ
diff --git a/kmoon/pics/moon23.png b/kmoon/pics/moon23.png
new file mode 100644
index 0000000..0c08690
--- /dev/null
+++ b/kmoon/pics/moon23.png
Binary files differ
diff --git a/kmoon/pics/moon24.png b/kmoon/pics/moon24.png
new file mode 100644
index 0000000..92b6637
--- /dev/null
+++ b/kmoon/pics/moon24.png
Binary files differ
diff --git a/kmoon/pics/moon25.png b/kmoon/pics/moon25.png
new file mode 100644
index 0000000..a950535
--- /dev/null
+++ b/kmoon/pics/moon25.png
Binary files differ
diff --git a/kmoon/pics/moon26.png b/kmoon/pics/moon26.png
new file mode 100644
index 0000000..34bd85a
--- /dev/null
+++ b/kmoon/pics/moon26.png
Binary files differ
diff --git a/kmoon/pics/moon27.png b/kmoon/pics/moon27.png
new file mode 100644
index 0000000..ea8f30c
--- /dev/null
+++ b/kmoon/pics/moon27.png
Binary files differ
diff --git a/kmoon/pics/moon28.png b/kmoon/pics/moon28.png
new file mode 100644
index 0000000..f40055c
--- /dev/null
+++ b/kmoon/pics/moon28.png
Binary files differ
diff --git a/kmoon/pics/moon29.png b/kmoon/pics/moon29.png
new file mode 100644
index 0000000..05c06a3
--- /dev/null
+++ b/kmoon/pics/moon29.png
Binary files differ
diff --git a/kmoon/pics/moon3.png b/kmoon/pics/moon3.png
new file mode 100644
index 0000000..853a007
--- /dev/null
+++ b/kmoon/pics/moon3.png
Binary files differ
diff --git a/kmoon/pics/moon4.png b/kmoon/pics/moon4.png
new file mode 100644
index 0000000..9d320f8
--- /dev/null
+++ b/kmoon/pics/moon4.png
Binary files differ
diff --git a/kmoon/pics/moon5.png b/kmoon/pics/moon5.png
new file mode 100644
index 0000000..9fc4623
--- /dev/null
+++ b/kmoon/pics/moon5.png
Binary files differ
diff --git a/kmoon/pics/moon6.png b/kmoon/pics/moon6.png
new file mode 100644
index 0000000..36c1446
--- /dev/null
+++ b/kmoon/pics/moon6.png
Binary files differ
diff --git a/kmoon/pics/moon7.png b/kmoon/pics/moon7.png
new file mode 100644
index 0000000..aa91df1
--- /dev/null
+++ b/kmoon/pics/moon7.png
Binary files differ
diff --git a/kmoon/pics/moon8.png b/kmoon/pics/moon8.png
new file mode 100644
index 0000000..235291d
--- /dev/null
+++ b/kmoon/pics/moon8.png
Binary files differ
diff --git a/kmoon/pics/moon9.png b/kmoon/pics/moon9.png
new file mode 100644
index 0000000..04e084a
--- /dev/null
+++ b/kmoon/pics/moon9.png
Binary files differ
diff --git a/kmoon/version.h b/kmoon/version.h
new file mode 100644
index 0000000..b71eb3b
--- /dev/null
+++ b/kmoon/version.h
@@ -0,0 +1 @@
+static const char version[] = "1.1";
diff --git a/kodo/ChangeLog b/kodo/ChangeLog
new file mode 100644
index 0000000..b7b93bc
--- /dev/null
+++ b/kodo/ChangeLog
@@ -0,0 +1,42 @@
+ Modification History
+ --------------------
+ 19 Mar 1993 mhg v1.0 Initial release.
+ 3 Aug 1993 mhg v1.2 Added automatic trip reset feature.
+ 5 Jan 1994 mhg v1.3 Ported to Alpha; moved mi/km button into popup
+ menu; removed 'Trip' fixed label; added font
+ resource.
+ 6 Jan 1994 mhg x1.4 Main window no longer grabs input focus when
+ realized.
+ 21 Nov 1994 mhg x1.4 Added saveFile resource to make location and
+ name of odometer save file customizable.
+ 6 Mar 1995 mhg x1.5 Added automatic html generation.
+ 9 Mar 1995 mhg x1.6 Converted file to format with verion info!
+ Changed .format resource to .units.
+ Improved measurement unit handling and update
+ accuracy. Removed unneccesary label updates.
+ 19 Apr 1995 mhg V2.0 Removed OpenVMS-specific AST code in favor of
+ XtAppAddTimeout. (Works a lot better now, too.)
+ 26 Apr 1995 mhg X2.1-1 Fix trip reset so units is also reset.
+ 27 Apr 1995 mhg X2.1-2 Changed AutoReset timer to be its own timeout
+ on a relative timer based on seconds until
+ midnight.
+ 28 Apr 1995 mhg X2.1-3 Added pollInterval and saveFrequency resources.
+ 1 May 1995 mhg X2.1-4 Make disk writing (data, html) deferred so as
+ to allow for "continuous" display update while
+ mouse is in motion.
+ 27 Oct 1995 mhg V2.1 Final cleanup for this version and public
+ release.
+
+ 18 May 1998 asn V3.0 Broke the code in all sorts of ways to turn
+ the mild-mannered Motif version into a
+ modern KDE program. Code turned into C++,
+ all Xm references were removed, and VMS
+ support was dumped!
+
+ 22 Aug 1998 asn V3.1 Minor updates to make it compile more
+ gracefully on modern C++ compilers,
+ and updated things to KDE 1.0 specs.
+ Added a proper About Box.
+
+ 16 May 2001 gb V3.2 Code cleanups, more KDE 2.0 compatible.
+
diff --git a/kodo/Makefile.am b/kodo/Makefile.am
new file mode 100644
index 0000000..38bfbd5
--- /dev/null
+++ b/kodo/Makefile.am
@@ -0,0 +1,22 @@
+
+# set the include path for X, qt and KDE
+INCLUDES= $(all_includes)
+
+bin_PROGRAMS = kodo
+kodo_SOURCES = main.cpp kodometer.cpp kimagenumber.cpp
+METASOURCES = AUTO
+
+# the library search path.
+kodo_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+kodo_LDADD = $(LIB_KDEUI)
+
+messages:
+ $(XGETTEXT) $(kodo_SOURCES) -o $(podir)/kodo.pot
+
+KDE_ICON = kodo
+
+xdg_apps_DATA = kodo.desktop
+
+pics_DATA = numbers.png
+picsdir = $(kde_datadir)/kodo
+
diff --git a/kodo/configure.in.in b/kodo/configure.in.in
new file mode 100644
index 0000000..0f2e0e3
--- /dev/null
+++ b/kodo/configure.in.in
@@ -0,0 +1,3 @@
+if test "x$kde_use_qt_mac" = "xyes"; then
+ DO_NOT_COMPILE="$DO_NOT_COMPILE kodo"
+fi
diff --git a/kodo/hi16-app-kodo.png b/kodo/hi16-app-kodo.png
new file mode 100644
index 0000000..cd7b929
--- /dev/null
+++ b/kodo/hi16-app-kodo.png
Binary files differ
diff --git a/kodo/hi32-app-kodo.png b/kodo/hi32-app-kodo.png
new file mode 100644
index 0000000..3bcf97a
--- /dev/null
+++ b/kodo/hi32-app-kodo.png
Binary files differ
diff --git a/kodo/hi48-app-kodo.png b/kodo/hi48-app-kodo.png
new file mode 100644
index 0000000..905c795
--- /dev/null
+++ b/kodo/hi48-app-kodo.png
Binary files differ
diff --git a/kodo/kimagenumber.cpp b/kodo/kimagenumber.cpp
new file mode 100644
index 0000000..391fb97
--- /dev/null
+++ b/kodo/kimagenumber.cpp
@@ -0,0 +1,79 @@
+/*
+ * Mouspedometa
+ * Based on the original Xodometer VMS/Motif sources.
+ *
+ * Written by Armen Nakashian
+ * Compaq Computer Corporation
+ * Houston TX
+ * 22 May 1998
+ *
+ * If you make improvements or enhancements to Mouspedometa, please send
+ * them back to the author at any of the following addresses:
+ *
+ * armen@nakashian.com
+ *
+ * Thanks to Mark Granoff for writing the original Xodometer, and
+ * the whole KDE team for making such a nice environment to write
+ * programs in.
+ *
+ *
+ * This software is provided as is with no warranty of any kind,
+ * expressed or implied. Neither Digital Equipment Corporation nor
+ * Armen Nakashian will be held accountable for your use of this
+ * software.
+ */
+
+#include "kimagenumber.h"
+
+KImageNumber::KImageNumber(const QString& font, QWidget* parent,const char* name) :
+ QFrame(parent,name),
+ m_value(0)
+{
+ fontPix = new QPixmap(font);
+ resize(sizeHint());
+}
+
+KImageNumber::~KImageNumber()
+{
+ delete fontPix;
+}
+
+void KImageNumber::paintEvent(QPaintEvent*)
+{
+ int w = fontPix->width();
+ int each = w/11;
+
+ QString data;
+ data.sprintf("%06.1f", m_value);
+
+ for(unsigned int i=0; i < data.length(); i++) {
+ int wl = data.at(i).latin1() - '0';
+ if(data.at(i) == '.')
+ wl = 10;
+ bitBlt(this, i*each, 0, fontPix, wl*each, 0, each, fontPix->height());
+ }
+}
+
+void KImageNumber::setValue(double v)
+{
+ m_value = v;
+ repaint(false);
+}
+
+double KImageNumber::value() const
+{
+ return m_value;
+}
+
+QSize KImageNumber::sizeHint() const
+{
+ int w = fontPix->width();
+ int each = w/11;
+
+ QString data;
+ data.sprintf("%06.1f", m_value);
+
+ return QSize(data.length()*each, fontPix->height());
+}
+
+#include "kimagenumber.moc"
diff --git a/kodo/kimagenumber.h b/kodo/kimagenumber.h
new file mode 100644
index 0000000..57f96e2
--- /dev/null
+++ b/kodo/kimagenumber.h
@@ -0,0 +1,53 @@
+/*
+ * Mouspedometa
+ * Based on the original Xodometer VMS/Motif sources.
+ *
+ * Written by Armen Nakashian
+ * Compaq Computer Corporation
+ * Houston TX
+ * 22 May 1998
+ *
+ * If you make improvements or enhancements to Mouspedometa, please send
+ * them back to the author at any of the following addresses:
+ *
+ * armen@nakashian.com
+ *
+ * Thanks to Mark Granoff for writing the original Xodometer, and
+ * the whole KDE team for making such a nice environment to write
+ * programs in.
+ *
+ *
+ * This software is provided as is with no warranty of any kind,
+ * expressed or implied. Neither Digital Equipment Corporation nor
+ * Armen Nakashian will be held accountable for your use of this
+ * software.
+ */
+
+#ifndef KIMGNUM_H
+#define KIMGNUM_H
+
+#include <qframe.h>
+#include <qpixmap.h>
+
+class KImageNumber : public QFrame
+{
+ Q_OBJECT
+ Q_PROPERTY( double m_value READ value WRITE setValue )
+public:
+ KImageNumber(const QString& font, QWidget* parent=0, const char* name=0);
+
+ virtual ~KImageNumber();
+
+ void paintEvent(QPaintEvent*);
+ virtual QSize sizeHint() const;
+ double value() const;
+
+public slots:
+ void setValue(double v);
+
+protected:
+ double m_value;
+ QPixmap* fontPix;
+};
+
+#endif
diff --git a/kodo/kodo.desktop b/kodo/kodo.desktop
new file mode 100644
index 0000000..d577c8d
--- /dev/null
+++ b/kodo/kodo.desktop
@@ -0,0 +1,69 @@
+[Desktop Entry]
+Type=Application
+Exec=kodo
+Icon=kodo
+DocPath=kodo/index.html
+GenericName=Mouse Odometer
+GenericName[be]=Мышыны адоматр
+GenericName[bg]=Одометър за мишката
+GenericName[bn]=মাউসের গতিমাপক যনà§à¦¤à§à¦°
+GenericName[ca]=Ratometratge
+GenericName[cs]=Rychlost myši
+GenericName[cy]=Camfesurydd Llygoden
+GenericName[da]=Musehastighedsmåler
+GenericName[de]=Entfernungsmesser für die Maus
+GenericName[el]=ΧιλιομετÏομετÏητής ποντικιοÏ
+GenericName[eo]=Musomezurilo
+GenericName[es]=Odómetro del ratón
+GenericName[et]=Hiire odomeeter
+GenericName[eu]=Mouspedometa
+GenericName[fa]=کیلومترشمار موشی
+GenericName[fi]=Hiirimittari
+GenericName[fr]=Odomètre pour souris
+GenericName[ga]=Odaiméadar Luiche
+GenericName[gl]=Odómetro
+GenericName[he]=מד־מרחק העכבר
+GenericName[hr]=BrojaÄ prijeÄ‘enog puta miÅ¡a
+GenericName[hu]=Egérmozgás-figyelő
+GenericName[is]=Músametrateljari
+GenericName[it]=Contachilometri mouse
+GenericName[ja]=マウス走行計
+GenericName[km]=Odometer កណ្ដុរ
+GenericName[ko]=마우스 거리 측정 ë„구
+GenericName[lv]=Peles odometrs
+GenericName[mk]=Километража на глушецот
+GenericName[mt]=Odometru tal-maws
+GenericName[nb]=Muselengdemåler
+GenericName[nds]=Muus-Wegmeter
+GenericName[ne]=माउस ओडोमिटर
+GenericName[nl]=Muismeter
+GenericName[nn]=Musefartsmålar
+GenericName[pa]=ਮਾਊਂਸ ਓਡੋਮੀਟਰ
+GenericName[pl]=Licznik przebiegu dla myszki
+GenericName[pt]=Ratómetro
+GenericName[pt_BR]=Odômetro Para o Mouse
+GenericName[ro]=Mouse-metru
+GenericName[ru]=МышеÑпидометр
+GenericName[sk]=MeraÄ myÅ¡i
+GenericName[sl]=Miškomer
+GenericName[sr]=Мишометар
+GenericName[sr@Latn]=Mišometar
+GenericName[sv]=Vägmätaren
+GenericName[ta]=சà¯à®Ÿà¯à®Ÿà®¿ ஓடà¯à®Ÿ அளவி
+GenericName[tg]=Спидометри Муш
+GenericName[tr]=Fare Mesafe Ölçer
+GenericName[uk]=Одометр Ð´Ð»Ñ Ð¼Ð¸ÑˆÐºÐ¸
+GenericName[zh_CN]=鼠标里程计
+GenericName[zh_TW]=滑鼠里程表
+Terminal=false
+Name=Kodo
+Name[bn]=কোডো
+Name[de]=KOdometer
+Name[km]=កូដូ (Kodo)
+Name[ne]=कोडो
+Name[pa]=ਕੋਡੋ
+Name[ta]=கேஓடà¯à®Ÿ அளவி
+Name[tg]=Кодо
+X-KDE-StartupNotify=true
+X-DCOP-ServiceType=Unique
+Categories=Qt;KDE;Utility;Amusement;
diff --git a/kodo/kodometer.cpp b/kodo/kodometer.cpp
new file mode 100644
index 0000000..aea6f47
--- /dev/null
+++ b/kodo/kodometer.cpp
@@ -0,0 +1,600 @@
+/*
+ * Mouspedometa
+ * Based on the original Xodometer VMS/Motif sources.
+ *
+ * Written by Armen Nakashian
+ * Compaq Computer Corporation
+ * Houston TX
+ * 22 May 1998
+ *
+ * If you make improvements or enhancements to Mouspedometa, please send
+ * them back to the author at any of the following addresses:
+ *
+ * armen@nakashian.com
+ *
+ * Thanks to Mark Granoff for writing the original Xodometer, and
+ * the whole KDE team for making such a nice environment to write
+ * programs in.
+ *
+ *
+ * This software is provided as is with no warranty of any kind,
+ * expressed or implied. Neither Digital Equipment Corporation nor
+ * Armen Nakashian will be held accountable for your use of this
+ * software.
+ */
+
+#include "kodometer.h"
+
+const double speedInterval = 500.0;
+const double distanceInterval = 10.0;
+const int speedSamples = 10;
+
+static struct conversionEntry ConversionTable[MAX_UNIT] = {
+ {inch, I18N_NOOP("inch"), I18N_NOOP("inches"), 12.0, 2.54,
+ I18N_NOOP("cm"), I18N_NOOP("cm"), 100.0, 3},
+ {foot, I18N_NOOP("foot"), I18N_NOOP("feet"), 5280.0, 0.3048,
+ I18N_NOOP("meter"), I18N_NOOP("meters"), 1000.0, 4},
+ {mile, I18N_NOOP("mile"), I18N_NOOP("miles"), -1.0, 1.609344,
+ I18N_NOOP("km"), I18N_NOOP("km"), -1.0, 5}};
+
+/*
+ * Set the program up, do lots of ugly initialization.
+ * Note that we use installEventFilter on the two KImageNumber's
+ * to make clicks on them bring up the context-menu.
+ */
+Kodometer::Kodometer(QWidget* parent, const char* name)
+ : QFrame(parent, name),
+ dontRefresh(false),
+ speed(0.0),
+ lastDistance(0.0),
+ XCoord(0), YCoord(0),
+ lastXCoord(0), lastYCoord(0),
+ pointerScreen(-1),
+ lastPointerScreen(-1),
+ Enabled(true),
+ cyclesSinceLastSave(0),
+ pollInterval(10),
+ saveFrequency(10)
+{
+ display = KApplication::kApplication()->getDisplay();
+ FindAllScreens();
+
+ root = RootWindow(display, DefaultScreen(display));
+
+ readSettings();
+ if(AutoReset) {
+ dontRefresh = true;
+ resetTrip();
+ dontRefresh = false;
+ }
+
+ lastDistance = Distance;
+
+ lastDUnit = distanceUnit;
+ lastTUnit = tripDistanceUnit;
+
+ totalLabel = new KImageNumber(locate("appdata", "numbers.png"), this);
+ tripLabel = new KImageNumber(locate("appdata", "numbers.png"), this);
+
+ totalLabel->installEventFilter(this);
+ tripLabel->installEventFilter(this);
+
+ // setup help menu
+ help = new KHelpMenu(this, KGlobal::instance()->aboutData(), false);
+ KPopupMenu* helpMnu = help->menu();
+
+ // Make the popup menu
+ menu = new KPopupMenu();
+
+ menu->insertTitle(kapp->miniIcon(), KGlobal::instance()->aboutData()->programName());
+
+ enabledID = menu->insertItem(i18n("&Enable"), this, SLOT(toggleEnabled()));
+ metricID = menu->insertItem(i18n("&Metric Display"), this,
+ SLOT(toggleUnits()));
+ autoResetID = menu->insertItem(i18n("Auto &Reset Trip"), this,
+ SLOT(toggleAutoReset()));
+ menu->insertItem(i18n("Reset &Trip"), this, SLOT(resetTrip()));
+ menu->insertItem(i18n("Reset &Odometer"), this, SLOT(resetTotal()));
+ menu->insertSeparator();
+
+ menu->insertItem(SmallIconSet("help"), i18n("&Help"), helpMnu);
+
+ menu->insertItem(SmallIconSet("exit"), i18n("&Quit"), this, SLOT(quit()));
+ menu->setCheckable(true);
+
+ menu->setItemChecked(enabledID, Enabled);
+ menu->setItemChecked(metricID, UseMetric);
+ menu->setItemChecked(autoResetID, AutoReset);
+
+ //start the timers that will rifresh the counter
+ distanceID = startTimer((int)distanceInterval);
+ speedID = startTimer((int)speedInterval);
+
+ tripLabel->move(0, totalLabel->height());
+ setFixedSize(tripLabel->width(),
+ totalLabel->height() + tripLabel->height());
+
+ UseMetric =! UseMetric;
+ toggleUnits();
+
+ refresh();
+}
+
+/*
+ * Now I'm not really sure what this does. I assume its here to find
+ * all the displays on your system, and measure them. During the mouse
+ * tracking phase, we use the information stored here to determine how
+ * far the mouse moved on a given screen.
+ *
+ * The point is, since you might have one 17" screen and on 21" screen,
+ * lets measure them differently. Surely this level of accurasy is
+ * only provide to prove that the original author was a man's man.
+ */
+void Kodometer::FindAllScreens(void)
+{
+ int Dh, DhMM, Dw, DwMM;
+ double vPixelsPerMM, hPixelsPerMM;
+
+ screenCount = ScreenCount(display);
+// kdDebug() << "Display has " << screenCount <<
+// " screen" << (screenCount == 1 ? "" : "s") << endl;
+
+ for(int i = 0; i < screenCount; i++) {
+// kdDebug() << "Screen " << i << endl;
+ screenInfo[i].root = RootWindow(display, i);
+ screenInfo[i].scr = XScreenOfDisplay(display, i);
+
+ screenInfo[i].height = Dh = HeightOfScreen(screenInfo[i].scr);
+ DhMM = HeightMMOfScreen(screenInfo[i].scr);
+ screenInfo[i].width = Dw = WidthOfScreen(screenInfo[i].scr);
+ DwMM = WidthMMOfScreen(screenInfo[i].scr);
+// kdDebug() << " Height is " << Dh << " pixels (" << DhMM <<
+// "mm)" << endl;
+// kdDebug() << " Width is " << Dw << " pixels (" << DwMM <<
+// "mm)" << endl;
+
+ vPixelsPerMM = (double)Dh / (double)DhMM;
+ hPixelsPerMM = (double)Dw / (double)DwMM;
+ screenInfo[i].PixelsPerMM = (vPixelsPerMM + hPixelsPerMM) / 2.0;
+// kdDebug() << " Vertical pixels/mm are " << vPixelsPerMM <<
+// "mm" << endl;
+// kdDebug() << " Horizontal pixels/mm are " << hPixelsPerMM <<
+// "mm" << endl;
+// kdDebug() << " Average pixels/mm are " <<
+// screenInfo[i].PixelsPerMM << "mm" << endl;
+ }
+}
+
+/*
+ * Here's where we override events to the KImgNum's to display
+ * the context menu
+ */
+bool Kodometer::eventFilter( QObject *, QEvent *e )
+{
+ if ( e->type() == QEvent::MouseButtonPress ) {
+ mousePressEvent((QMouseEvent*)e);
+ return true;
+ }
+ return false;
+}
+
+/*
+ * Show the context menu
+ */
+void Kodometer::mousePressEvent(QMouseEvent* e)
+{
+ //FIXME fix this!
+ //dontRefresh = true;
+ menu->popup(mapToGlobal(e->pos()));
+}
+
+/*
+ * Called when the timer expires to query the pointer position,
+ * compare it to the last known position, and then to calculate
+ * the distance moved.
+ */
+void Kodometer::timerEvent(QTimerEvent* e)
+{
+ if (Enabled) {
+ if(e->timerId() == distanceID) {
+ lastPointerScreen = pointerScreen;
+ lastXCoord = XCoord;
+ lastYCoord = YCoord;
+ XQueryPointer (display, root, &RootIDRet, &ChildIDRet, &XCoord,
+ &YCoord, &WinX, &WinY, &StateMask);
+ if (CalcDistance()) {
+// kdDebug() << "Mouse moved" << endl;
+ if (!dontRefresh) {
+ refresh();
+ cyclesSinceLastSave++;
+ }
+ }
+ }
+ }
+}
+
+// Guess!
+void Kodometer::toggleEnabled()
+{
+ Enabled = !Enabled;
+ menu->setItemChecked(enabledID,Enabled);
+ refresh();
+}
+
+// Try again!
+void Kodometer::toggleAutoReset()
+{
+ AutoReset = !AutoReset;
+ menu->setItemChecked(autoResetID,AutoReset);
+ refresh();
+}
+
+
+// You're getting warm!
+void Kodometer::toggleUnits()
+{
+ UseMetric =! UseMetric;
+
+ menu->setItemChecked(metricID, UseMetric);
+
+ QToolTip::remove(totalLabel);
+ QToolTip::remove(tripLabel);
+ if(!UseMetric) {
+ QToolTip::add(totalLabel,
+ i18n(ConversionTable[distanceUnit].fromUnitTagPlural));
+ QToolTip::add(tripLabel,
+ i18n(ConversionTable[tripDistanceUnit].fromUnitTagPlural));
+ } else {
+ QToolTip::add(totalLabel,
+ i18n(ConversionTable[distanceUnit].toUnitTagPlural));
+ QToolTip::add(tripLabel,
+ i18n(ConversionTable[tripDistanceUnit].toUnitTagPlural));
+ }
+ refresh();
+}
+
+
+// Were you dropped on your head as a child?
+void Kodometer::resetTrip()
+{
+ TripDistance = 0.0;
+ tripDistanceUnit = inch;
+ if (!dontRefresh)
+ refresh();
+}
+
+// I was!
+void Kodometer::resetTotal()
+{
+ resetTrip();
+
+ Distance = 0.0;
+ distanceUnit = inch;
+
+ TripDistance = 0.0;
+ tripDistanceUnit = inch;
+ refresh();
+}
+
+/*
+ * Set the values in all the KImgNums, do metric conversions,
+ * and make the screen look like reality.
+ */
+void Kodometer::refresh(void)
+{
+ if(distanceUnit != lastDUnit) {
+ lastDUnit = distanceUnit;
+ QToolTip::remove(totalLabel);
+ if(!UseMetric)
+ QToolTip::add(totalLabel,
+ i18n(ConversionTable[distanceUnit].fromUnitTagPlural));
+ else
+ QToolTip::add(totalLabel,
+ i18n(ConversionTable[distanceUnit].toUnitTagPlural));
+ }
+
+ if(tripDistanceUnit != lastTUnit) {
+ lastTUnit = tripDistanceUnit;
+ QToolTip::remove(tripLabel);
+ if(!UseMetric)
+ QToolTip::add(tripLabel,
+ i18n(ConversionTable[tripDistanceUnit].fromUnitTagPlural));
+ else
+ QToolTip::add(tripLabel,
+ i18n(ConversionTable[tripDistanceUnit].toUnitTagPlural));
+ }
+
+ //now draw everything
+ QString distance_s;
+ QString trip_s;
+ double distance_d = 0;
+ double trip_d = 0;
+
+ if (Enabled) {
+ distance_d = Distance;
+ distance_s = FormatDistance(distance_d, distanceUnit);
+ trip_d = TripDistance;
+ trip_s = FormatDistance(trip_d, tripDistanceUnit);
+ } else {
+ distance_s = "------";
+ trip_s = "------";
+ }
+
+ totalLabel->setValue(distance_d);
+ tripLabel->setValue(trip_d);
+}
+
+/*
+ * Not sure what this does, its from the original program.
+ */
+double Kodometer::multiplier(Units unit)
+{
+ double m = 10;
+
+ switch (unit) {
+ case mile : m *= 10.0;
+ case foot : m *= 10.0;
+ case inch : m *= 10.0; break;
+ }
+ return m;
+}
+
+/*
+ * This is the bitch function where the _real_ work is done. I
+ * could have re-invented the query_pointer code, but this one is a best.
+ *
+ * This is code from the original program, responsible for converting the
+ * number of pixels traveled into a real-world coordinates.
+ */
+int Kodometer::CalcDistance(void)
+{
+ double dist, sum;
+ int X, Y;
+ double distMM, distInches, finalNewDist;
+ double oldDistance, oldTripDistance;
+ double newDistance, newTripDistance;
+ int i, j, finalScreen, increment;
+ Units oldDistanceUnit, oldTripDistanceUnit, currentUnit;
+ int distanceChanged, tripDistanceChanged;
+
+ int screenOrientation = K_Left;
+
+ i = j = finalScreen = increment = 0;
+
+ if ((lastXCoord == 0) && (lastYCoord == 0))
+ return false;
+
+ if ((lastXCoord == XCoord) && (lastYCoord == YCoord))
+ return false;
+
+ //Figure out which screen the pointer is on
+ if (screenCount > 1) {
+ while (i < screenCount)
+ if (RootIDRet == screenInfo[i].root)
+ break;
+ else
+ i++;
+ }
+
+ pointerScreen = i;
+
+// kdDebug() << "CalcDistance: screen: " << pointerScreen <<
+// " x: " << XCoord << " y: " << YCoord << endl;
+
+ // Adjust XCoord or YCoord for the screen its on, relative to screen 0
+ // and screenOrientation.
+
+ if (lastPointerScreen != -1 && pointerScreen != lastPointerScreen) {
+ switch (screenOrientation) {
+ case K_Left:
+ case K_Top:
+ finalScreen = 0;
+ j = QMAX(pointerScreen,lastPointerScreen) - 1;
+ increment = -1;
+ break;
+ case K_Right:
+ case K_Bottom:
+ finalScreen = QMAX(pointerScreen,lastPointerScreen) - 1;
+ j = 0;
+ increment = 1;
+ break;
+ }
+ do {
+ switch (screenOrientation) {
+ case K_Left:
+ case K_Right:
+ if (pointerScreen > lastPointerScreen)
+ XCoord += screenInfo[j].width;
+ else
+ lastXCoord += screenInfo[j].width;
+ break;
+ case K_Top:
+ case K_Bottom:
+ if (pointerScreen > lastPointerScreen)
+ YCoord += screenInfo[j].height;
+ else
+ lastYCoord += screenInfo[j].height;
+ break;
+ }
+ if (j != finalScreen)
+ j += increment;
+ } while (j != finalScreen);
+// kdDebug() << " Adjusted for screen ch: x: " << XCoord <<
+// " y: " << YCoord << endl;
+ }
+
+// kdDebug() << "In: Distance: " << Distance <<
+// " Trip Distance: " << TripDistance << endl;
+
+ // Calculate distance in pixels first
+ // using Pitagora
+
+ X = XCoord - lastXCoord;
+ X = X*X;
+
+ Y = YCoord - lastYCoord;
+ Y = Y*Y;
+
+ sum = (double)X + (double)Y;
+ dist = sqrt(sum);
+
+ // Convert to millimeters
+ distMM = dist / screenInfo[pointerScreen].PixelsPerMM;
+
+ // Convert to inches
+ distInches = distMM * 0.04;
+
+ // Add an appropriate value to Distance, which may be
+ // in a unit other than inches
+ currentUnit = inch;
+ finalNewDist = distInches;
+
+ while (currentUnit < distanceUnit) {
+ finalNewDist =
+ finalNewDist / ConversionTable[currentUnit].maxFromBeforeNext;
+ currentUnit++;
+// kdDebug() << " New dist: " << dist << "p, " << distMM << "mm, " <<
+// distInches << "in, " << finalNewDist << " " <<
+// ConversionTable[currentUnit+1].fromUnitTagPlural << endl;
+ }
+
+// kdDebug() << " Next part" << endl;
+
+ oldDistance = Distance * multiplier(distanceUnit);
+
+ Distance += finalNewDist;
+ oldDistanceUnit = distanceUnit;
+
+ if (ConversionTable[distanceUnit].maxFromBeforeNext != -1.0 &&
+ Distance >= ConversionTable[distanceUnit].maxFromBeforeNext)
+ {
+ Distance = Distance / ConversionTable[distanceUnit].maxFromBeforeNext;
+ distanceUnit++;
+ }
+
+ newDistance = Distance * multiplier(distanceUnit);
+ distanceChanged = (distanceUnit != oldDistanceUnit ||
+ (unsigned int)oldDistance != (unsigned int)newDistance);
+
+ // Add an appropriate value to TripDistance, which may be
+ // in a unit other than inches
+ currentUnit = inch;
+ finalNewDist = distInches;
+
+ while (currentUnit < tripDistanceUnit) {
+ finalNewDist = finalNewDist /
+ ConversionTable[currentUnit].maxFromBeforeNext;
+ currentUnit++;
+ }
+
+ oldTripDistance = TripDistance * multiplier(tripDistanceUnit);
+ TripDistance += finalNewDist;
+ oldTripDistanceUnit = tripDistanceUnit;
+
+ if (ConversionTable[tripDistanceUnit].maxFromBeforeNext != -1.0 &&
+ TripDistance >= ConversionTable[tripDistanceUnit].maxFromBeforeNext)
+ {
+ TripDistance = TripDistance /
+ ConversionTable[tripDistanceUnit].maxFromBeforeNext;
+ tripDistanceUnit++;
+ }
+
+ newTripDistance = TripDistance * multiplier(tripDistanceUnit);
+ tripDistanceChanged = ((tripDistanceUnit != oldTripDistanceUnit) ||
+ ((unsigned int)oldTripDistance != (unsigned int)newTripDistance));
+
+
+// kdDebug() << "Out: Distance: " << Distance <<
+// "Trip Distance: " << TripDistance << endl;
+
+ if ((distanceChanged) || (tripDistanceChanged))
+ return true;
+ else
+ return false;
+}
+
+/*
+ * This code can probably go away. Its doing conversions from inches to
+ * other units. Its ugly C-style stuff, that should't be done in a
+ * pretty OO world.
+ */
+#define THERE_IS_A_NEXT (ConversionTable[unit].maxToBeforeNext != -1.0)
+QString Kodometer::FormatDistance(double &dist, Units unit)
+{
+ QString string;
+ const char *tag;
+ int precision;
+
+ if (UseMetric) {
+ dist = dist * ConversionTable[unit].conversionFactor;
+ if ((THERE_IS_A_NEXT) &&
+ (dist > ConversionTable[unit].maxToBeforeNext))
+ {
+ dist = dist / ConversionTable[unit].maxToBeforeNext;
+ unit++;
+ }
+ if (dist == 1.0)
+ tag = ConversionTable[unit].toUnitTag;
+ else
+ tag = ConversionTable[unit].toUnitTagPlural;
+ } else {
+ if (dist == 1.0)
+ tag = ConversionTable[unit].fromUnitTag;
+ else
+ tag = ConversionTable[unit].fromUnitTagPlural;
+ }
+ precision = ConversionTable[unit].printPrecision;
+
+ string.sprintf ("%.*f %s", precision, dist, tag);
+ return string;
+}
+
+/*
+ * Use KConfig to read all settings from disk. Note that whatever
+ * happens here overrides the defaults, but there's not much
+ * sanity-checking.
+ */
+void Kodometer::readSettings(void)
+{
+ KConfig* config = KGlobal::config();
+ config->setGroup("Settings");
+
+ UseMetric = config->readNumEntry("UseMetric", false);
+ AutoReset = config->readNumEntry("AutoReset", true);
+
+ TripDistance = config->readDoubleNumEntry("Trip", 0.0);
+ Distance = config->readDoubleNumEntry("Distance", 0.0);
+
+ distanceUnit = config->readNumEntry("DistanceUnit", inch);
+ tripDistanceUnit = config->readNumEntry("TripUnit", inch);
+}
+
+
+/*
+ * Save reality for use in the next session.
+ */
+void Kodometer::saveSettings(void)
+{
+ KConfig* config = KGlobal::config();
+ config->setGroup("Settings");
+
+ config->writeEntry("UseMetric", UseMetric);
+ config->writeEntry("AutoReset", AutoReset);
+
+ config->writeEntry("Trip", TripDistance);
+ config->writeEntry("Distance", Distance);
+
+ config->writeEntry("TripUnit", tripDistanceUnit);
+ config->writeEntry("DistanceUnit", distanceUnit);
+
+ config->sync();
+}
+
+// What in the world can this do?
+void Kodometer::quit()
+{
+ saveSettings();
+ kapp->quit();
+}
+
+#include "kodometer.moc"
diff --git a/kodo/kodometer.h b/kodo/kodometer.h
new file mode 100644
index 0000000..3d5544c
--- /dev/null
+++ b/kodo/kodometer.h
@@ -0,0 +1,163 @@
+/*
+ * Mouspedometa
+ * Based on the original Xodometer VMS/Motif sources.
+ *
+ * Written by Armen Nakashian
+ * Compaq Computer Corporation
+ * Houston TX
+ * 22 May 1998
+ *
+ * If you make improvements or enhancements to Mouspedometa, please send
+ * them back to the author at any of the following addresses:
+ *
+ * armen@nakashian.com
+ *
+ * Thanks to Mark Granoff for writing the original Xodometer, and
+ * the whole KDE team for making such a nice environment to write
+ * programs in.
+ *
+ *
+ * This software is provided as is with no warranty of any kind,
+ * expressed or implied. Neither Digital Equipment Corporation nor
+ * Armen Nakashian will be held accountable for your use of this
+ * software.
+ */
+
+// -*-C++-*-;
+
+#ifndef KODOMETER_H
+#define KODOMETER_H
+
+#include <math.h>
+
+#include <qlabel.h>
+#include <qptrlist.h>
+#include <qkeycode.h>
+#include <qtooltip.h>
+
+#include <kaboutdata.h>
+#include <kuniqueapplication.h>
+#include <kcmdlineargs.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <khelpmenu.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kpopupmenu.h>
+#include <kstandarddirs.h>
+#include <ktoolbar.h>
+#include <kwin.h>
+
+#include <X11/Xlib.h>
+
+#include "kimagenumber.h"
+
+#define MAXARGS 25
+#define K_Left 1
+#define K_Right 2
+#define K_Top 3
+#define K_Bottom 4
+#define MAX_SCREEN 16
+#define MAJOR_VERSION 3
+#define MINOR_VERSION 0
+
+const int inch = 0;
+const int foot = 1;
+const int mile = 2;
+const int MAX_UNIT = 3;
+typedef int Units;
+
+
+typedef struct {
+ Window root;
+ Screen *scr;
+ int height, width;
+ double PixelsPerMM;
+} _screenInfo;
+
+
+typedef struct conversionEntry {
+ Units fromUnit;
+ const char *fromUnitTag;
+ const char *fromUnitTagPlural;
+ double maxFromBeforeNext;
+ double conversionFactor;
+ const char *toUnitTag;
+ const char *toUnitTagPlural;
+ double maxToBeforeNext;
+ int printPrecision;
+} conversionEntry;
+
+class Kodometer : public QFrame
+{
+ Q_OBJECT
+
+public:
+ Kodometer(QWidget* = 0, const char* = 0);
+ ~Kodometer() {}
+ void refresh(void);
+ void readSettings(void);
+ void saveSettings(void);
+
+ void timerEvent(QTimerEvent*);
+ void mousePressEvent(QMouseEvent*);
+ bool eventFilter( QObject *, QEvent *e );
+
+public slots:
+ void toggleEnabled();
+ void toggleUnits();
+ void toggleAutoReset();
+ void resetTrip();
+ void resetTotal();
+ void quit();
+
+protected:
+ int dontRefresh;
+
+ double multiplier(Units);
+ int CalcDistance(void);
+ QString FormatDistance(double &dist, Units);
+ void FindAllScreens();
+
+ KImageNumber* tripLabel;
+ KImageNumber* totalLabel;
+ KImageNumber* speedLabel;
+
+ KPopupMenu* menu;
+ KHelpMenu* help;
+ int metricID;
+ int autoResetID;
+ int enabledID;
+
+ double speed;
+ QPtrList<double> speeds;
+ double lastDistance;
+ int distanceID;
+ int speedID;
+
+ Display *display;
+ Window root, RootIDRet, ChildIDRet;
+ int WinX, WinY;
+ unsigned int StateMask;
+ int XCoord, YCoord;
+ int lastXCoord, lastYCoord;
+
+ Units lastDUnit, lastTUnit;
+
+ int pointerScreen, lastPointerScreen;
+ int Enabled;
+ int UseMetric;
+ int AutoReset;
+ double Distance, TripDistance;
+ Units distanceUnit, tripDistanceUnit;
+ char startDate_s[128];
+ int cyclesSinceLastSave;
+ int pollInterval;
+ int saveFrequency;
+
+ _screenInfo screenInfo[MAX_SCREEN];
+ int screenCount;
+};
+
+#endif
diff --git a/kodo/main.cpp b/kodo/main.cpp
new file mode 100644
index 0000000..72f8802
--- /dev/null
+++ b/kodo/main.cpp
@@ -0,0 +1,100 @@
+/*
+ * Mouspedometa
+ * Based on the original Xodometer VMS/Motif sources.
+ *
+ * Written by Armen Nakashian
+ * Compaq Computer Corporation
+ * Houston TX
+ * 22 May 1998
+ *
+ * If you make improvements or enhancements to Mouspedometa, please send
+ * them back to the author at any of the following addresses:
+ *
+ * armen@nakashian.com
+ *
+ * Thanks to Mark Granoff for writing the original Xodometer, and
+ * the whole KDE team for making such a nice environment to write
+ * programs in.
+ *
+ *
+ * This software is provided as is with no warranty of any kind,
+ * expressed or implied. Neither Digital Equipment Corporation nor
+ * Armen Nakashian will be held accountable for your use of this
+ * software.
+ */
+
+/*
+** Xodometer
+** Written by Mark H. Granoff/mhg
+** Digital Equipment Corporation
+** Littleton, MA, USA
+** 17 March 1993
+**
+** If you make improvements or enhancements to Xodometer, please send them
+** back to the author at any of the following addresses:
+**
+** granoff@keptin.lkg.dec.com
+** granoff@UltraNet.com
+** 72301.1177@CompuServe.com
+**
+** Thanks to my friend and colleague Bob Harris for his suggestions and help.
+**
+** This software is provided as is with no warranty of any kind, expressed or
+** implied. Neither Digital Equipment Corporation nor Mark Granoff will be
+** held accountable for your use of this software.
+**
+** This software is released into the public domain and may be redistributed
+** freely provided that all source module headers remain intact in their
+** entirety, and that all components of this kit are redistributed together.
+**
+** Modification History
+** --------------------
+** See ChangeLog
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "kodometer.h"
+#include <stdlib.h>
+
+int main(int argc, char *argv[])
+{
+ /* Top level details */
+
+ KAboutData *aboutData = new KAboutData("kodo",
+ I18N_NOOP("KOdometer"), "3.2",
+ I18N_NOOP("KOdometer measures your desktop mileage"),
+ KAboutData::License_GPL,
+ "(c) 1998, Armen Nakashian",
+ I18N_NOOP("A mouse odometer"), 0,
+ "dev@gioelebarabucci.com");
+ aboutData->addAuthor("Armen Nakashian", 0,
+ "armen@tourismo.com",
+ "http://yawara.anime.net/kodo/");
+ aboutData->addCredit("Gioele Barabucci",
+ I18N_NOOP("KDE 2 porting and some code cleanups"),
+ "dev@gioelebarabucci.com", "http://www.gioelebarabucci.com");
+ KCmdLineArgs::init( argc, argv, aboutData );
+
+ if (!KUniqueApplication::start())
+ exit(0);
+
+ KUniqueApplication a;
+
+ Kodometer *o = new Kodometer();
+
+ // Get rid of the title bar.
+ KWin::setType(o->winId(), NET::Override );
+ KWin::setState(o->winId(), NET::Sticky);
+ // FIXME is this a hack?
+// o->setGeometry(0, 0, 0, 0);
+ a.setMainWidget(o);
+ // is the following this needed?
+ // a.setTopWidget(o);
+
+ o->show();
+
+ return a.exec();
+}
diff --git a/kodo/numbers.png b/kodo/numbers.png
new file mode 100644
index 0000000..27fd81f
--- /dev/null
+++ b/kodo/numbers.png
Binary files differ
diff --git a/kteatime/ChangeLog b/kteatime/ChangeLog
new file mode 100644
index 0000000..6baec9f
--- /dev/null
+++ b/kteatime/ChangeLog
@@ -0,0 +1,105 @@
+2003-11-02 Martin Willers <willers@xm-arts.de>
+ - bugfix: opening the configuration dialog was leaking memory
+ - workaround for Qt bug(?): deleting teas didn't update QListView properly (fixes #63840)
+ (the above two fixes based on patches by Daniel Teske)
+ - bugfix: when no tea was defined, one couldn't start an anonymous tea either
+ - bugfix: on some occasions, the tooltip wasn't updated properly
+
+2003-08-23 Martin Willers <willers@xm-arts.de>
+ - added option to visualize steeping progress in tray icon
+ - some work towards unified source headers
+ - bumped version number
+
+2003-08-22 Martin Willers <willers@xm-arts.de>
+ - fix ToolTip disappearing prematurely
+ (patch by "Ivan")
+
+2003-04-17 Martin Willers <willers@xm-arts.de>
+ - fixed bug with propagation of valueChanged() signals from TimeEdit
+ - fixed bug: removing all teas from list was leading to crash!
+ - changed default tea time of "anonymous" dialog to 3 minutes
+
+2003-04-10 Martin Willers <willers@xm-arts.de>
+ - have now proper wrapping time-edit widget
+ - added facility to start steeping an 'anonymous' tea
+ - using new KDE 3.1.1 method for positioning KNotifyClient
+ (based on patches provided by Daniel Teske)
+
+2003-03-14 Martin Willers <willers@xm-arts.de>
+ - added "Configure Events..." button for quick access to kcontrol
+ - some internal tidying and cleanups
+ - using convenience class TeaListItem instead of QListViewItem
+ - small optimization: don't use lastitem() of listbox (which traverses whole list),
+ work with itemBelow() instead
+ - using custom TimeEdit-widget for entering times with minutes and seconds
+ (patches provided by Daniel Teske)
+
+2003-03-07 (external)
+ - Implement place holder for tea sort like requested in #54551
+
+2003-02-23 Martin Willers <willers@xm-arts.de>
+ - "beep" option now uses KNotify::event()
+ (need own "steeping" sound now)
+ (patch provided by Daniel Teske <teske@bigfoot.com>)
+
+2003-02-22 Martin Willers <willers@xm-arts.de>
+ - don't display ticks in left-click menu
+
+2003-02-15 Martin Willers <willers@xm-arts.de>
+ - using KActions for start, stop, and configure entries
+ - display list of configured teas on left-click,
+ making one-click starting of a new tea possible
+ - some cleanups
+
+2003-02-07 Martin Willers <willers@xm-arts.de>
+ - fixed inserting of new items into listview
+ - simplified layout in config-window
+ - fixed sizing of labels in config-window
+ - using QValueVector instead of a QStringList for teas
+ (patches provided by Daniel Teske <teske@bigfoot.com>)
+
+2003-01-07 Martin Willers <willers@xm-arts.de>
+ - fixed destructor of class toplevel
+ - finally avoiding stretching of buttons in config-dialog
+ (patches provided by Daniel Teske <teske@bigfoot.com>)
+
+2003-01-02 Martin Willers <willers@xm-arts.de>
+ - configuration dialog now selects first tea available
+ - small optimization in TopLevel::teaSelected()
+ - when a tea is brewing, more menu entries are now disabled
+ (patches provided by Daniel Teske <teske@bigfoot.com>)
+
+2002-07-14 Martin Willers <willers@xm-arts.de>
+ - KPassivePopup now stays on-screen until acknowlegded by mouse-click
+ - now saving state of actionEnable to config
+
+2002-06-23 Matthias Hoelzer-Kluepfel <mhk@kde.org>
+ - added left-click menu while steeping
+ - gave focus to name edit when a new tea is added
+ - now unable to start steeping if no teas exist
+ - added a QCheckBox to enable/disable the action field
+ - made text in the name edit field right-justified
+ (patch provided by Jackson Dunstan <jdunstan@digipen.edu>)
+
+2002-06-20 Matthias Hoelzer-Kluepfel <mhk@kde.org>
+ - improved the display of times in the menu
+ (patch provided by -Jackson Dunstan <jdunstan@digipen.edu>)
+
+2002-04-20 Martin Willers <willers@xm-arts.de>
+ - also displaying name of current tea when finished
+
+2002-04-20 Martin Willers <willers@xm-arts.de>
+ - now displaying name of current tea in tooltip
+ - better removing of unused tea-entries from config
+ - some cleanups
+
+2002-04-18 Martin Willers <willers@xm-arts.de>
+ - when saving config, non-used old tea-entries are now deleted from config
+
+2002-04-10 Martin Willers <willers@xm-arts.de>
+ - Bugfix: when tea was finished, click on icon -> icon ok, but
+ tooltip was still "tea finished"
+ - added "Cancel"-button to menu, and can also cancel timer by clicking
+ on icon while running
+ - showing remaining time not as "x.y", but as "xx:yy"
+ - can configure arbitrary amount of teas, with custom name and time
diff --git a/kteatime/Makefile.am b/kteatime/Makefile.am
new file mode 100644
index 0000000..82ebf40
--- /dev/null
+++ b/kteatime/Makefile.am
@@ -0,0 +1,27 @@
+
+INCLUDES= $(all_includes)
+
+bin_PROGRAMS = kteatime
+
+kteatime_SOURCES = main.cpp toplevel.cpp tealist.cpp timeedit.cpp
+
+kteatime_METASOURCES = AUTO
+kteatime_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+
+# LIB_KIO needed for KNotifyDialog
+kteatime_LDADD = $(LIB_KDEUI) $(LIB_KIO)
+
+KDE_ICON = kteatime
+
+KDE_OPTIONS = nofinal
+
+appsdata_DATA = eventsrc
+appsdatadir = $(kde_datadir)/kteatime
+
+kteatimeicondir = $(kde_datadir)/kteatime/icons
+kteatimeicon_ICON = AUTO
+
+messages:
+ $(XGETTEXT) $(kteatime_SOURCES) -o $(podir)/kteatime.pot
+
+xdg_apps_DATA = kteatime.desktop
diff --git a/kteatime/TODO b/kteatime/TODO
new file mode 100644
index 0000000..3400b2b
--- /dev/null
+++ b/kteatime/TODO
@@ -0,0 +1,58 @@
+- create SVG icon(s) (or at least a 32x32 version for "About KTeaTime")
+- Rename "shooting"
+- Rename "Event" to "Notification"
+- nicer placement of "Configure events" button:
+ "Configure Events..." --> move to same line as "Event" and rename to "Configure..."?
+ (and/or have a look at KStdAction::configureNotifications()!)
+ (common is "Configure &Notifications..." btw.)
+ [which gets translated in kdelibs.ps to "&Benachrichtigungen festlegen..."]
+ [[more often, "einrichten" is used for "configure"]]
+- use "readPathEntry()" instead of "readEntry()" (expands/replaces $HOME)
+
+- have a look at memory consumption; seems too high for me..
+- adapt kteatime.docbook to new century...
+- save default time for "anonymous" to config
+- in configure-window: add "Execute: "-label in front of "action"-text edit
+- KNotifyClient: "Execute" not capable of %t substitution?
+ (--> hence no replacement for my own "Execute: " action)
+- KNotifyClient: passive popup cannot(?) have no timeout
+ (--> hence no replacement for my own "Popup" action)
+- when steeping, display "stop <teaname>" on left-click, not just "stop"
+ (not easy when using KAction in a simple way?)
+- use QMovie for tea-is-finished-icon instead of two alternating pixmaps?
+
+
+internals:
+- 'int2time()' somewhere into class-namespace? (ie. not as global function)
+- do kapp->closeAllWindows() on slotFileQuit() ?
+- when in "ready"-state, left-click -> auto-go to initial state
+ before opening left-click menu(?)
+- remember geometry of config-dialog (and its QListView!)
+ (or at least: x-maximize QListView's titles)
+- somehow make double-click with left button start 'current' tea
+ without displaying start_menu?
+- figure out how to use KAction for "quit"-entry of menu
+ (somehow doesn't work as expected..)
+- some more tidying of configure-dialog
+ (eg. initial position!, initial size)
+- DCOP interface?
+- have a closer look at i18n-dos and -donts
+- use XML-UI
+- check for memory leaks
+- make config-reading bullet-proof
+
+
+---- new approach:
+
+- make it a generalized timer-application (with better UI than KTimer)
+ (think: cooking spaghetti, watch TV-show, etc.)
+
+ - This needs another approach to entering timeouts, since they'll often be
+ needed just once -> eg. popup "Enter timeout:"-window on leftclick?
+ - Must be able to run arbitrary amounts of parallel timers!
+ (difficult to use 'useTrayVis' then..)
+ - Should be able to enter timeouts not just as seconds, but in any unit.
+ - option for "popup reminder every X minutes"
+ - Allow periodical timouts (eg. "Take this medication every 2 hours")
+ (if not clicked away, add count to window)
+--> better start new application and let people migrate to it from KTeaTime
diff --git a/kteatime/cr22-action-mug.png b/kteatime/cr22-action-mug.png
new file mode 100644
index 0000000..8c2cc54
--- /dev/null
+++ b/kteatime/cr22-action-mug.png
Binary files differ
diff --git a/kteatime/cr22-action-tea_anim1.png b/kteatime/cr22-action-tea_anim1.png
new file mode 100644
index 0000000..e6e0256
--- /dev/null
+++ b/kteatime/cr22-action-tea_anim1.png
Binary files differ
diff --git a/kteatime/cr22-action-tea_anim2.png b/kteatime/cr22-action-tea_anim2.png
new file mode 100644
index 0000000..db6cf91
--- /dev/null
+++ b/kteatime/cr22-action-tea_anim2.png
Binary files differ
diff --git a/kteatime/cr22-action-tea_not_ready.png b/kteatime/cr22-action-tea_not_ready.png
new file mode 100644
index 0000000..0ff40f3
--- /dev/null
+++ b/kteatime/cr22-action-tea_not_ready.png
Binary files differ
diff --git a/kteatime/eventsrc b/kteatime/eventsrc
new file mode 100644
index 0000000..aae92b2
--- /dev/null
+++ b/kteatime/eventsrc
@@ -0,0 +1,183 @@
+[!Global!]
+IconName=kteatime
+Comment=The KDE Tea Cooker
+Comment[ar]=طابخ شاي KDE
+Comment[be]=Прыгатаўленне гарбаты пры дапамозе KDE
+Comment[bg]=Програма за приготвÑне на чай
+Comment[bn]=কে.ডি.ই.'র চায়ের কেটলি
+Comment[br]=Pod te KDE
+Comment[bs]=KDE kuhaÄ Äaja
+Comment[ca]=El cuiner de te de KDE
+Comment[cs]=VaÅ™iÄ Äaje pro KDE
+Comment[cy]=Tegell Te KDE
+Comment[da]=KDE's tekoger
+Comment[de]=Der KDE-Teekocher
+Comment[el]=ΕÏγαλείο φτιαξίματος Ï„ÏƒÎ±Î³Î¹Î¿Ï Ï„Î¿Ï… KDE
+Comment[eo]=La KDE-Teinfuzilo
+Comment[es]=Tetera de Kde
+Comment[et]=KDE teekann
+Comment[eu]=KDE Te-Sukaldea
+Comment[fa]=چای‌ساز KDE
+Comment[fi]=Teenkeittäjä
+Comment[fr]=Le préparateur de thé de KDE
+Comment[ga]=Cócaire Tae KDE
+Comment[gl]=Quece chás
+Comment[he]=מבשל התה של KDE
+Comment[hi]=केडीई चाय केतली
+Comment[hr]=KDE Äajnik
+Comment[hu]=KDE teafőző
+Comment[is]=KDE te hitarinn
+Comment[it]=La teiera di KDE
+Comment[ja]=KDE ティーメーカー
+Comment[km]=ចង្ក្រាន​ážáŸ‚ KDE
+Comment[ko]=KDE ì°¨ ë“ì´ê¸° ë„구
+Comment[lv]=KDE tÄ“jas vÄrÄ«tÄjs
+Comment[mk]=Чајникот на KDE
+Comment[ms]=Penjerang Teh KDE
+Comment[mt]=Il-Kitla tat-Tè tal-KDE
+Comment[nb]=KDEs tekoker
+Comment[nds]=De KDE-Teekaker
+Comment[ne]=केडीई चिया बनाउने
+Comment[nl]=De KDE Theezetter
+Comment[nn]=KDE-tekokaren
+Comment[pl]=PrzyrzÄ…dzanie herbaty dla KDE
+Comment[pt]=Cozinheiro de chá do KDE
+Comment[pt_BR]=O cozinheiro do KDE
+Comment[ro]=Ceainicul KDE
+Comment[ru]=Приготовление чаÑ
+Comment[sk]=VariÄ Äaju pre KDE
+Comment[sl]=Kuhalnik Äaja za KDE
+Comment[sr]=KDE Чајник
+Comment[sr@Latn]=KDE ÄŒajnik
+Comment[sv]=KDE:s tekokare
+Comment[ta]=The KDE தேநீர௠கà¯à®•à¯à®•à®°à¯
+Comment[tg]=Пухтани Чойи KDE
+Comment[tr]=Çay Pişirici
+Comment[uk]=ÐŸÑ€Ð¸Ð³Ð¾Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‡Ð°ÑŽ KDE
+Comment[uz]=KDE choy damlovchi
+Comment[uz@cyrillic]=KDE чой дамловчи
+Comment[wa]=Li fjheu di té di KDE
+Comment[zh_CN]=KDE 煮茶器
+Comment[zh_TW]=KDE 煮茶器
+
+[tea]
+Name=Tea is ready
+Name[ar]=الشاي جاهز
+Name[be]=Гарбата гатова
+Name[bg]=ЧаÑÑ‚ е готов
+Name[bn]=চা পà§à¦°à¦¸à§à¦¤à§à¦¤
+Name[br]=Prest eo an te
+Name[bs]=ÄŒaj je gotov
+Name[ca]=El te està fet
+Name[cs]=Čaj je připraven
+Name[cy]=Mae'r te yn barod
+Name[da]=Teen er klar
+Name[de]=Tee ist fertig
+Name[el]=Το τσάι είναι έτοιμο
+Name[eo]=Teo estas preta
+Name[es]=El té está listo
+Name[et]=Tee on valmis
+Name[eu]=Tea prest dago
+Name[fa]=چای آماده است
+Name[fi]=Tee on valmista
+Name[fr]=Le thé est prêt
+Name[ga]=Tá an tae réidh
+Name[gl]=O chá está feito
+Name[he]= התה מוכן
+Name[hi]=चाय तैयार है
+Name[hr]=ÄŒaj je spreman
+Name[hu]=Kész a tea!
+Name[is]=Te hitarinn
+Name[it]=Il tè è pronto
+Name[ja]=ãŠèŒ¶ãŒå…¥ã‚Šã¾ã—ãŸ
+Name[km]=ážáŸ‚​ឆ្អិន​ហើយ
+Name[ko]=차가 준비ë˜ì—ˆìŠµë‹ˆë‹¤
+Name[lv]=TÄ“ja ir gatava
+Name[mk]=Чајот е готов
+Name[mt]=It-Tè lest
+Name[nb]=Tekokeren
+Name[nds]=Tee is fardig
+Name[ne]=चिया तयार छ
+Name[nl]=De thee is klaar
+Name[nn]=Teen er klar
+Name[pl]=Herbata jest gotowa
+Name[pt]=o chá está pronto
+Name[pt_BR]=O chá está pronto
+Name[ro]=Gata ceaiul
+Name[ru]=Чай готов
+Name[sk]=Čaj je pripravený
+Name[sl]=ÄŒaj je pripravljen
+Name[sr]=Чај је готов
+Name[sr@Latn]=ÄŒaj je gotov
+Name[sv]=Teet är klart
+Name[ta]= தேநீர௠தயாரà¯
+Name[tg]=Чой тайёр шуд
+Name[tr]=Çay hazır
+Name[uk]=Чай готовий
+Name[uz]=Choy tayyor
+Name[uz@cyrillic]=Чой тайёр
+Name[wa]=Li té est presse
+Name[zh_CN]=茶æ²å¥½äº†
+Name[zh_TW]=茶煮好了
+Comment=Tea is ready
+Comment[ar]=الشاي جاهز
+Comment[be]=Гарбата гатова
+Comment[bg]=ЧаÑÑ‚ е готов
+Comment[bn]=অই চা গরমমম!!!
+Comment[br]=Prest eo an te
+Comment[bs]=ÄŒaj je gotov
+Comment[ca]=El te està fet
+Comment[cs]=Čaj je připraven
+Comment[cy]=Mae'r te yn barod
+Comment[da]=Teen er klar
+Comment[de]=Tee ist fertig
+Comment[el]=Το τσάι είναι έτοιμο
+Comment[eo]=Teo estas preta
+Comment[es]=El té está listo
+Comment[et]=Tee on valmis
+Comment[eu]=Tea prest dago
+Comment[fa]=چای آماده است
+Comment[fi]=Tee on valmista
+Comment[fr]=Le thé est prêt
+Comment[ga]=Tá an tae réidh
+Comment[gl]=O té está feito
+Comment[he]=התה מוכן
+Comment[hi]=चाय तैयार है
+Comment[hr]=ÄŒaj je spreman
+Comment[hu]=Kész a tea!
+Comment[is]=Teið er tilbúið
+Comment[it]=Il tè è pronto
+Comment[ja]=ãŠèŒ¶ãŒå…¥ã‚Šã¾ã—ãŸ
+Comment[km]=ážáŸ‚​ឆ្អិន​ហើយ
+Comment[ko]=차가 준비ë˜ì—ˆìŠµë‹ˆë‹¤
+Comment[lv]=TÄ“ja ir gatava
+Comment[mk]=Чајот е готов
+Comment[ms]=Teh sudah siap
+Comment[mt]=It-Tè lest
+Comment[nb]=Teen er klar
+Comment[nds]=Tee is fardig
+Comment[ne]=चिया तयार छ
+Comment[nl]=De thee is klaar
+Comment[nn]=Teen er klar
+Comment[pl]=Herbata jest gotowa
+Comment[pt]=O chá está pronto
+Comment[pt_BR]=O chá está pronto
+Comment[ro]=Ceaiul este gata
+Comment[ru]=Чай готов
+Comment[sk]=Čaj je pripravený
+Comment[sl]=ÄŒaj je pripravljen
+Comment[sr]=Чај је готов
+Comment[sr@Latn]=ÄŒaj je gotov
+Comment[sv]=Teet är klart
+Comment[ta]= தேநீர௠தயாரà¯
+Comment[tg]=Чой тайёр шуд
+Comment[tr]=Çay hazır
+Comment[uk]=Чай готовий
+Comment[uz]=Choy tayyor
+Comment[uz@cyrillic]=Чой тайёр
+Comment[wa]=Li té est presse
+Comment[zh_CN]=茶æ²å¥½äº†
+Comment[zh_TW]=茶煮好了
+default_sound=KDE_Notify.wav
+default_presentation=1
+
diff --git a/kteatime/hi16-app-kteatime.png b/kteatime/hi16-app-kteatime.png
new file mode 100644
index 0000000..4952035
--- /dev/null
+++ b/kteatime/hi16-app-kteatime.png
Binary files differ
diff --git a/kteatime/hi32-app-kteatime.png b/kteatime/hi32-app-kteatime.png
new file mode 100644
index 0000000..78097e0
--- /dev/null
+++ b/kteatime/hi32-app-kteatime.png
Binary files differ
diff --git a/kteatime/hi48-app-kteatime.png b/kteatime/hi48-app-kteatime.png
new file mode 100644
index 0000000..f84a3e0
--- /dev/null
+++ b/kteatime/hi48-app-kteatime.png
Binary files differ
diff --git a/kteatime/kteatime.desktop b/kteatime/kteatime.desktop
new file mode 100644
index 0000000..3182834
--- /dev/null
+++ b/kteatime/kteatime.desktop
@@ -0,0 +1,72 @@
+[Desktop Entry]
+Name=KTeaTime
+Name[ar]=برنامج تحضير الشاي KTeaTime
+Name[bn]=কে-টী-টাইম
+Name[hr]=KVrijeme za Äaj
+Name[mk]=КЧајник
+Name[mt]=It-Tè lest
+Name[ne]=केडीई चिया समय
+Name[sv]=Teet är klart
+Name[ta]= கேதேநீர௠நேரமà¯
+Name[tg]=КВақтиЧой
+GenericName=Tea Cooker
+GenericName[be]=Прыгатаўленне гарбаты
+GenericName[bg]=ПриготвÑне на чай
+GenericName[bn]=চায়ের কেটলি
+GenericName[br]=Ar pod te
+GenericName[ca]=El cuiner de te
+GenericName[cs]=VaÅ™iÄ Äaje
+GenericName[cy]=Tegell Te
+GenericName[da]=Tekoger
+GenericName[de]=Teekocher
+GenericName[el]=ΕÏγαλείο φτιαξίματος τσαγιοÏ
+GenericName[eo]=Teinfuzilo
+GenericName[es]=Tetera
+GenericName[et]=Teekann
+GenericName[eu]=Te-Sukaldea
+GenericName[fa]=چای‌ساز
+GenericName[fi]=Teenkeittäjä
+GenericName[fr]=Préparateur de thé
+GenericName[ga]=Cócaire Tae
+GenericName[gl]=Quece Chá
+GenericName[he]=מבשל התה
+GenericName[hr]=ÄŒajnik
+GenericName[hu]=Teafőző
+GenericName[is]=Te hitarinn
+GenericName[it]=Teiera
+GenericName[ja]=ティーメーカー
+GenericName[km]=ចង្ក្រាន​ážáŸ‚
+GenericName[ko]=ì°¨ ë“ì´ê¸°
+GenericName[lv]=TÄ“jas vÄrÄ«tÄjs
+GenericName[mk]=Чајник
+GenericName[mt]=Il-Kitla tat-Tè
+GenericName[nb]=Tekoker
+GenericName[nds]=Teekaker
+GenericName[ne]=चिया बनाउने
+GenericName[nl]=Theezetter
+GenericName[nn]=Tekokaren
+GenericName[pl]=PrzyrzÄ…dzanie herbaty
+GenericName[pt]=Chá
+GenericName[pt_BR]=Hora do Chá
+GenericName[ro]=Ceainic
+GenericName[ru]=Приготовление чаÑ
+GenericName[sk]=VariÄ Äaju
+GenericName[sl]=Kuhalnik Äaja
+GenericName[sr]=Чајник
+GenericName[sr@Latn]=ÄŒajnik
+GenericName[sv]=Tekokaren
+GenericName[ta]= தேநீர௠தயாரிபà¯à®ªà®¾à®©à¯
+GenericName[tg]=ЧойДамКардан
+GenericName[tr]=Çaycı
+GenericName[uk]=ÐŸÑ€Ð¸Ð³Ð¾Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‡Ð°ÑŽ
+GenericName[wa]=Fijheu d' té
+GenericName[zh_CN]=煮茶器
+GenericName[zh_TW]=煮茶器
+Exec=kteatime
+Icon=kteatime
+Type=Application
+Terminal=false
+DocPath=kteatime/index.html
+X-KDE-StartupNotify=true
+X-DCOP-ServiceType=Multi
+Categories=Qt;KDE;Utility;Amusement;
diff --git a/kteatime/main.cpp b/kteatime/main.cpp
new file mode 100644
index 0000000..fb147a6
--- /dev/null
+++ b/kteatime/main.cpp
@@ -0,0 +1,60 @@
+/*
+ * KTeaTime - A tea timer.
+ *
+ * Copyright (C) 1998-1999 Matthias Hoelzer-Kluepfel (hoelzer@kde.org)
+ * Copyright (C) 2002-2003 Martin Willers (willers@xm-arts.de)
+ *
+ * With contributions from Daniel Teske <teske@bigfoot.com>, and
+ * Jackson Dunstan <jdunstan@digipen.edu>
+ * (and possibly others, as well)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include <kwin.h>
+#include <kstartupinfo.h>
+#include <kcmdlineargs.h>
+#include <kaboutdata.h>
+
+#include "toplevel.h"
+
+
+static const char description[] =
+ I18N_NOOP("KDE utility for making a fine cup of tea");
+
+static const char version[] = "v1.1.0";
+
+int main(int argc, char *argv[])
+{
+ KAboutData aboutData( "kteatime", I18N_NOOP("KTeaTime"),
+ version, description, KAboutData::License_GPL,
+ "(c) 1998-1999, Matthias Hoelzer-Kluepfel\n(c) 2002-2003, Martin Willers");
+ aboutData.addAuthor("Matthias Hoelzer-Kluepfel",0, "hoelzer@kde.org");
+ aboutData.addAuthor("Martin Willers", 0, "willers@xm-arts.de");
+ aboutData.addCredit("Daniel Teske", I18N_NOOP("Many patches"), "teske@bigfoot.com");
+ KCmdLineArgs::init( argc, argv, &aboutData );
+
+ KApplication app;
+
+ TopLevel toplevel;
+ KWin::setSystemTrayWindowFor(toplevel.winId(), 0);
+ toplevel.show();
+
+ app.setTopWidget(&toplevel);
+ KStartupInfo::appStarted();
+
+ return app.exec();
+}
diff --git a/kteatime/tealist.cpp b/kteatime/tealist.cpp
new file mode 100644
index 0000000..0f7aa26
--- /dev/null
+++ b/kteatime/tealist.cpp
@@ -0,0 +1,64 @@
+/* -------------------------------------------------------------
+
+ tealist.cpp
+
+ (C) 2003 by Daniel Teske (teske@bigfoot.com)
+
+ ------------------------------------------------------------- */
+
+#include <klocale.h>
+#include <qlistview.h>
+#include "tealist.h"
+
+
+QString int2time(int time)
+{
+ QString str;
+ if (time / 60)
+ str.append(i18n("%1 min").arg(time / 60));
+ if (time % 60)
+ if (str.isEmpty())
+ str.append(i18n("%1 s").arg(time % 60));
+ else
+ str.append(i18n(" %1 s").arg(time % 60));
+ return str;
+}
+
+
+TeaListItem::TeaListItem(QListView * parent)
+ :QListViewItem(parent)
+{
+
+}
+
+TeaListItem::TeaListItem(QListView * parent, QListViewItem *after)
+ :QListViewItem(parent, after)
+{
+
+}
+
+TeaListItem::~TeaListItem()
+{
+}
+
+void TeaListItem::setTime(int t)
+{
+ QListViewItem::setText(1, int2time(t));
+ tim = t;
+}
+
+void TeaListItem::setName(const QString &n)
+{
+ nam = n;
+ QListViewItem::setText(0, n);
+}
+
+QString TeaListItem::name()
+{
+ return nam;
+}
+
+int TeaListItem::time()
+{
+ return tim;
+}
diff --git a/kteatime/tealist.h b/kteatime/tealist.h
new file mode 100644
index 0000000..8d025c8
--- /dev/null
+++ b/kteatime/tealist.h
@@ -0,0 +1,37 @@
+/* -------------------------------------------------------------
+
+ tealist.h
+
+ (C) 2003 by Daniel Teske (teske@bigfoot.com)
+
+ ------------------------------------------------------------- */
+#ifndef TEALIST_H
+#define TEALIST_H
+
+#include <qstring.h>
+
+class QListView;
+class QListViewItem;
+
+
+class TeaListItem : public QListViewItem
+{
+
+public:
+ TeaListItem(QListView *parent);
+ TeaListItem(QListView *parent, QListViewItem *after);
+ ~TeaListItem();
+
+ int time();
+ QString name();
+ void setTime(int v);
+ void setName(const QString &n);
+
+private:
+ int tim;
+ QString nam;
+};
+
+
+QString int2time(int t);
+#endif
diff --git a/kteatime/timeedit.cpp b/kteatime/timeedit.cpp
new file mode 100644
index 0000000..c101de0
--- /dev/null
+++ b/kteatime/timeedit.cpp
@@ -0,0 +1,146 @@
+/* -------------------------------------------------------------
+
+ timeedit.cpp
+
+ (C) 2003 by Daniel Teske (teske@bigfoot.com)
+
+ ------------------------------------------------------------- */
+
+#include <klocale.h>
+#include <qlabel.h>
+#include <qlayout.h>
+
+#include "timeedit.h"
+#include "timeedit.moc"
+
+WrappingSpinBox::WrappingSpinBox(int minValue, int maxValue, int step, QWidget *parent, const char *name)
+ : QSpinBox(minValue, maxValue, step, parent, name)
+{
+}
+
+WrappingSpinBox::~WrappingSpinBox()
+{
+}
+
+
+/** Overloaded QSpinBox method */
+void WrappingSpinBox::stepUp()
+{
+ bool wrap = false;
+ if (value() == 59)
+ wrap = true;
+ if (wrap)
+ emit wrapUp(); // must wrap first (to avoid double-step-up)
+ QSpinBox::stepUp();
+}
+
+/** Overloaded QSpinBox method */
+void WrappingSpinBox::stepDown()
+{
+ bool wrap = false;
+ if (value() == 0)
+ wrap = true;
+ QSpinBox::stepDown();
+ if (wrap)
+ emit wrapDown();
+}
+
+
+// -------------------------------------------------------------------------
+
+
+TimeEdit::TimeEdit(QWidget* parent, const char* name)
+ : QWidget(parent, name)
+{
+ layout = new QHBoxLayout(this);
+ minuteBox = new QSpinBox(0, 300, 1, this);
+// minuteBox->setFixedSize(minuteBox->sizeHint());
+
+ QLabel* min = new QLabel(i18n(" min"), this);
+ min->setFixedSize(min->sizeHint());
+ secondBox = new WrappingSpinBox(0, 59, 1, this);
+ secondBox->setWrapping(true);
+// secondBox->setFixedSize(secondBox->sizeHint());
+
+ QLabel* sec = new QLabel(i18n(" sec"),this);
+ sec->setFixedSize(sec->sizeHint());
+
+ layout->addWidget(minuteBox);
+ layout->addWidget(min);
+
+ layout->addWidget(secondBox);
+ layout->addWidget(sec);
+
+ connect(minuteBox, SIGNAL(valueChanged(int)), SLOT(spinBoxValueChanged(int)) );
+ connect(secondBox, SIGNAL(valueChanged(int)), SLOT(spinBoxValueChanged(int)) );
+ connect(secondBox, SIGNAL(wrapUp()), SLOT(wrappedUp()));
+ connect(secondBox, SIGNAL(wrapDown()), SLOT(wrappedDown()));
+}
+
+TimeEdit::~TimeEdit()
+{
+}
+
+/** Set to specified number of seconds. */
+void TimeEdit::setValue(int val)
+{
+ if (val < 0)
+ return;
+
+ // block signals to avoid receiption of valueChanged()
+ // between changing of minutes and seconds
+ secondBox->blockSignals(true);
+ minuteBox->blockSignals(true);
+
+ secondBox->setValue(val % 60);
+ minuteBox->setValue(val / 60);
+
+ secondBox->blockSignals(false);
+ minuteBox->blockSignals(false);
+
+ emit valueChanged(value());
+}
+
+/** Return current value in seconds. */
+int TimeEdit::value()
+{
+ return minuteBox->value()*60 + secondBox->value();
+}
+
+/** SLOT: Handle wrap-up of seconds-box */
+void TimeEdit::wrappedUp()
+{
+ if (minuteBox->value() != minuteBox->maxValue()) {
+ minuteBox->stepUp();
+ } else {
+ secondBox->setValue(58); // ugly: must cater for wrapping-first
+ }
+}
+
+/** SLOT: Handle wrap-down of seconds-box */
+void TimeEdit::wrappedDown()
+{
+ // well, the "if" should always be true
+ if (minuteBox->value() != minuteBox->minValue()) {
+ minuteBox->stepDown();
+ } else {
+ secondBox->setValue(0);
+ }
+}
+
+/** SLOT: Handle any change in minutes of seconds */
+void TimeEdit::spinBoxValueChanged(int)
+{
+ if (value() == 0) {
+ secondBox->stepUp(); // this will give another spinBoxValueChanged() invocation
+ return;
+ }
+
+ emit valueChanged(value());
+}
+
+/** SLOT (overloading QSpinBox): set focus */
+void TimeEdit::setFocus()
+{
+ minuteBox->setFocus();
+}
diff --git a/kteatime/timeedit.h b/kteatime/timeedit.h
new file mode 100644
index 0000000..cc03f58
--- /dev/null
+++ b/kteatime/timeedit.h
@@ -0,0 +1,72 @@
+/* -------------------------------------------------------------
+
+ timeedit.h
+
+ (C) 2003 by Daniel Teske (teske@bigfoot.com)
+
+ ------------------------------------------------------------- */
+#ifndef TIMEEDIT_H
+#define TIMEEDIT_H
+
+#include <qspinbox.h>
+#include <qwidget.h>
+
+class QBoxLayout;
+
+
+/**
+ * @short A spinbox that wraps around after reaching minValue resp. maxValue.
+ * @author Daniel Teske
+ */
+class WrappingSpinBox : public QSpinBox
+{
+ Q_OBJECT
+
+public:
+ WrappingSpinBox(int minValue, int maxValue, int step = 1, QWidget *parent=0, const char *name=0);
+ ~WrappingSpinBox();
+
+ void stepUp();
+ void stepDown();
+
+signals:
+ void wrapUp();
+ void wrapDown();
+};
+
+
+/**
+ * @short A widget for entering a timeout in minutes and seconds.
+ * @author Daniel Teske
+ */
+class TimeEdit : public QWidget
+{
+ Q_OBJECT
+
+public:
+ TimeEdit(QWidget* parent = 0, const char* name = 0);
+ ~TimeEdit();
+
+ void setValue(int value);
+ int value();
+
+public slots:
+ void setFocus();
+
+private slots:
+ void spinBoxValueChanged(int);
+ void wrappedUp();
+ void wrappedDown();
+
+signals:
+ void valueChanged(int);
+
+
+protected:
+ QSpinBox *minuteBox;
+ WrappingSpinBox *secondBox;
+ QBoxLayout* layout;
+};
+
+#endif
+
diff --git a/kteatime/toplevel.cpp b/kteatime/toplevel.cpp
new file mode 100644
index 0000000..1cf0c96
--- /dev/null
+++ b/kteatime/toplevel.cpp
@@ -0,0 +1,856 @@
+/*
+ * This file is part of the KTeaTime application.
+ *
+ * Copyright (C) 1998-1999 Matthias Hoelzer-Kluepfel (hoelzer@kde.org)
+ * Copyright (C) 2002-2003 Martin Willers (willers@xm-arts.de)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include <stdlib.h>
+#include <assert.h>
+
+#include <qcheckbox.h>
+#include <qlayout.h>
+#include <qhbox.h>
+#include <qvbox.h>
+#include <qlineedit.h>
+#include <qpainter.h>
+#include <qtooltip.h>
+#include <qfile.h>
+#include <qcursor.h>
+#include <qpushbutton.h>
+#include <qgroupbox.h>
+#include <qheader.h>
+#include <qpixmap.h>
+#include <qbitmap.h>
+
+#include <kconfig.h>
+#include <khelpmenu.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kpassivepopup.h>
+#include <knotifyclient.h>
+#include <knuminput.h>
+#include <kseparator.h>
+#include <kpopupmenu.h>
+#include <kdialogbase.h>
+#include <kaction.h>
+#include <knotifydialog.h>
+
+#include "tealist.h"
+#include "timeedit.h"
+#include "toplevel.h"
+#include "toplevel.moc"
+
+
+const int TopLevel::DEFAULT_TEA_TIME = 3*60;
+
+
+TopLevel::TopLevel() : KSystemTray()
+{
+ setBackgroundMode(X11ParentRelative); // what for?
+ QString n, key;
+ unsigned int num;
+
+ teas.clear();
+
+ KConfig *config = kapp->config();
+ config->setGroup("Teas");
+
+ if (config->hasKey("Number")) {
+ // assuming this is a new-style config
+ num = config->readNumEntry("Number", 0);
+ teas.resize(num);
+ QString tempstr;
+ for (unsigned int index=1; index<=num; ++index) {
+ key.sprintf("Tea%d Time", index);
+ tempstr = config->readEntry(key, NULL);
+ teas[index-1].time = tempstr.toInt();
+ key.sprintf("Tea%d Name", index);
+ teas[index-1].name = config->readEntry(key, NULL);
+ // FIXME: check for non-existence!
+ }
+ config->setGroup("General");
+ } else {
+ // either old-style config or first start, so provide some sensible defaults
+ // (which are the same as in old-style kteatime)
+ tea_struct temp;
+ temp.name = i18n("Black Tea");
+ temp.time = 180;
+ teas.append(temp);
+ temp.name = i18n("Earl Grey");
+ temp.time = 300;
+ teas.append(temp);
+ temp.name = i18n("Fruit Tea");
+ temp.time = 480;
+ teas.append(temp);
+
+ // switch back to old-style default group
+ config->setGroup(NULL);
+ // look for old-style "UserTea"-entry and add that one also
+ if (config->hasKey("UserTea")) {
+ num = config->readNumEntry("UserTea", 150);
+ temp.name = i18n("Other Tea");
+ temp.time = num;
+ teas.append(temp);
+ }
+ }
+ current_selected = config->readNumEntry("Tea", 0);
+ if (current_selected >= teas.count())
+ current_selected = 0;
+
+ listempty = (teas.count() == 0);
+
+
+ startAct = new KAction(i18n("&Start"), "1rightarrow", 0,
+ this, SLOT(start()), actionCollection(), "start");
+ stopAct = new KAction(i18n("Sto&p"), "cancel", 0,
+ this, SLOT(stop()), actionCollection(), "stop");
+ confAct = new KAction(i18n("&Configure..."), "configure", 0,
+ this, SLOT(config()), actionCollection(), "configure");
+ anonAct = new KAction(i18n("&Anonymous..."), 0, 0,
+ this, SLOT(anonymous()), actionCollection(), "anonymous");
+// KAction *quitAct = actionCollection()->action("file_quit");
+
+ // create app menu (displayed on right-click)
+ menu = new QPopupMenu();
+ menu->setCheckable(true);
+ connect(menu, SIGNAL(activated(int)), this, SLOT(teaSelected(int)));
+
+ // this menu will be displayed when no tea is steeping, and left mouse button is clicked
+ start_menu = new QPopupMenu();
+ start_menu->setCheckable(true); // menu isn't tickable, but this gives some add. spacing
+ connect(start_menu, SIGNAL(activated(int)), this, SLOT(teaStartSelected(int)));
+
+ rebuildTeaMenus(); // populate tops of menus with tea-entries from config
+
+ KHelpMenu* help = new KHelpMenu(this, KGlobal::instance()->aboutData(), false);
+ KPopupMenu* helpMnu = help->menu();
+
+ start_menu->insertSeparator();
+ anonAct->plug(start_menu);
+
+ menu->insertSeparator();
+ anonAct->plug(menu);
+ startAct->plug(menu);
+ stopAct->plug(menu);
+ menu->insertSeparator();
+ confAct->plug(menu);
+ menu->insertItem(SmallIcon("help"), i18n("&Help"), helpMnu);
+ menu->insertItem(SmallIcon("exit"), i18n("Quit"), kapp, SLOT(quit()));
+// quitAct->plug(menu); // FIXME: this doesn't seem to work with above definition of quitAct?
+ // (need special 'quit'-method?)
+
+ // this menu will be displayed when a tea is steeping, and left mouse button is clicked
+ steeping_menu = new QPopupMenu();
+// steeping_menu->insertItem(SmallIcon("cancel"), i18n("Just &Cancel Current"), this, SLOT(stop()));
+ stopAct->plug(steeping_menu); // FIXME: can provide different text for this incarnation?
+
+// start_menu->insertSeparator();
+// startAct->plug(start_menu); // FIXME: include "start" entry here for quick access to current tea?
+
+ // read remaining entries from config-file
+ useNotify = config->readBoolEntry("Beep", true); // "Beep" should really be named "Notify"
+ usePopup = config->readBoolEntry("Popup", true);
+ useAction = config->readBoolEntry("UseAction", true);
+ action = config->readEntry("Action");
+ useTrayVis = config->readBoolEntry("UseTrayVis", true);
+
+ mugPixmap = loadIcon("mug");
+ teaNotReadyPixmap = loadIcon("tea_not_ready");
+ teaAnim1Pixmap = loadIcon("tea_anim1");
+ teaAnim2Pixmap = loadIcon("tea_anim2");
+
+ confdlg = 0L;
+ anondlg = 0L;
+
+ stop(); // reset timer, disable some menu entries, etc.
+}
+
+/* slot: signal shutDown() from KApplication */
+/* (not currently needed)
+void TopLevel::queryExit()
+{
+ KConfig *config = kapp->config();
+// config->sync();
+}
+*/
+
+
+/** Destructor */
+TopLevel::~TopLevel()
+{
+ delete menu;
+ delete steeping_menu;
+ delete start_menu;
+ // FIXME: must delete more (like all the QWidgets in config-window)?
+}
+
+
+/** Handle mousePressEvent */
+void TopLevel::mousePressEvent(QMouseEvent *event)
+{
+ if (event->button() == LeftButton) {
+ if (ready) {
+ stop(); // reset tooltip and stop animation
+ } else {
+ if (running)
+ steeping_menu->popup(QCursor::pos());
+ else
+ start_menu->popup(QCursor::pos());
+ }
+ } else if (event->button() == RightButton)
+ menu->popup(QCursor::pos());
+// else if (event->button() == MidButton) // currently unused
+}
+
+/** Handle paintEvent (ie. animate icon) */
+void TopLevel::paintEvent(QPaintEvent *)
+{
+ QPixmap *pm = &mugPixmap;
+
+ if (running) {
+ if (useTrayVis)
+ pm = &teaAnim1Pixmap; // this is 'mugPixmap' plus brown content
+ else
+ pm = &teaNotReadyPixmap; // generic "steeping" icon
+ } else {
+ // use simple two-frame "animation"
+ // FIXME: how about using a QMovie instead? (eg. MNG)
+ if (ready) {
+ if (firstFrame)
+ pm = &teaAnim1Pixmap;
+ else
+ pm = &teaAnim2Pixmap;
+ }
+ }
+
+ // overlay pie chart onto tray icon
+ QPixmap base(*pm); // make copy of base pixmap
+ if (useTrayVis && running) {
+ // extend mask
+ QBitmap mask = *(base.mask());
+ QPainter pm(&mask);
+ pm.setBrush(Qt::color1); // fill with "foreground-colour"
+ pm.setPen(Qt::NoPen); // no border needed/wanted
+ pm.drawPie(0+1, 9+1, 11, 11, 90*16, -360*16); // full circle of small size
+ pm.drawPie(0, 9, 13, 13, 90*16, percentDone*16); // pie part of big size
+ pm.end();
+ base.setMask(mask);
+
+ // draw pie chart
+ QPainter px(&base);
+ px.setPen(QPen(Qt::black, 0)); // black border
+ px.setBrush(QColor(192, 0, 0)); // red fill colour for small circle
+ px.drawPie(0+1, 9+1, 11, 11, 90*16, -360*16);
+
+ px.setBrush(QColor(0, 192, 0)); // green fill colour for pie part
+ px.drawPie(0, 9, 13, 13, 90*16, percentDone*16);
+ px.end();
+ }
+ // FIXME: over-emphasize first and last few percent? (for better visibility)
+ // FIXME: some optimizations (eg. store pre-drawn QPixmap with small circle)
+ // (and use drawEllipse() instead of drawPie() for small circle!)
+
+ // set new tray icon
+ QPainter p(this);
+ int x = 1 + (12 - pm->width()/2);
+ int y = 1 + (12 - pm->height()/2);
+ p.drawPixmap(x, y, base);
+ p.end();
+}
+
+/** Check timer and initiate appropriate action if finished */
+void TopLevel::timerEvent(QTimerEvent *)
+{
+ if (running) {
+ // a tea is steeping; must count down
+ seconds--;
+
+ if (seconds <= 0) {
+ // timer has run out; notify user
+ running = false;
+ ready = true;
+ enable_menuEntries();
+ if (shooting) {
+ // re-check current tea
+ shooting = false;
+ if (!listempty)
+ menu->setItemChecked(current_selected, true);
+ }
+
+ QString teaMessage = i18n("The %1 is now ready!").arg(current_name);
+ // invoke action
+ if (useNotify) {
+ KNotifyClient::event(winId(), "tea", teaMessage);
+ }
+ if (useAction && (!action.isEmpty())) {
+ QString cmd = action;
+ cmd.replace("%t", current_name);
+ system(QFile::encodeName(cmd));
+ }
+ if (usePopup)
+ KPassivePopup::message(i18n("The Tea Cooker"),
+ teaMessage, teaAnim1Pixmap, this, "popup", 0);
+ // FIXME: does auto-deletion work without timeout?
+ setToolTip(teaMessage);
+ repaint();
+ } else {
+ // timer not yet run out; just update tray-icon (if configured)...
+ if (useTrayVis) {
+ int pDone = (360 * (startSeconds - seconds)) / startSeconds;
+ if (pDone - percentDone > 8) {
+ // update icon not every second, but only if somewhat noticable
+ percentDone = pDone;
+ repaint();
+ }
+ }
+ // ...and Tooltip
+ QString min = int2time(seconds);
+ setToolTip(i18n("%1 left for %2").arg(min).arg(current_name));
+ }
+ } else {
+ // no tea is steeping; just animate icon
+ if (ready) {
+ firstFrame = !firstFrame;
+ repaint();
+ }
+ }
+}
+
+/** update ToolTip */
+void TopLevel::setToolTip(const QString &text, bool force)
+{
+ // don't update if text hasn't changed
+ if (lastTip == text)
+ return;
+
+ // don't remove Tooltip if (probably - can't know for sure?) currently showing
+ // FIXME: this isn't too nice: currently mouse must stay outside for >1s for update to occur
+ if (force || !this->hasMouse() || (lastTip == i18n("The Tea Cooker"))) {
+ lastTip = text;
+ QToolTip::remove(this);
+ QToolTip::add(this, text);
+ }
+}
+
+
+/** add all configured teas to both menus */
+void TopLevel::rebuildTeaMenus() {
+ // first remove all current tea-entries from menus; these can be identified by their positive id
+ while (menu->idAt(0) >= 0)
+ menu->removeItemAt(0); // remove from right-click menu
+ while (start_menu->idAt(0) >= 0)
+ start_menu->removeItemAt(0); // remove from left-click menu
+
+ // now add new tea-entries to top of menus
+ int id = 0;
+ int index = 0;
+ for (QValueVector<tea_struct>::ConstIterator it=teas.begin(); it != teas.end(); ++it) {
+ // construct string with name and steeping time
+ QString str = it->name;
+ str.append(" (");
+ str.append(int2time(it->time));
+ str.append(")");
+
+ start_menu->insertItem(str, id, index); // add to left-click menu
+ menu->insertItem(str, id++, index++); // add to right-click menu
+ }
+
+ // now select 'current' tea
+ if (!listempty)
+ menu->setItemChecked(current_selected, true); // all others aren't checked,
+ // because we just added them
+}
+
+/* enable/disable menu-entries according to current running-state */
+void TopLevel::enable_menuEntries()
+{
+ for (int index=0; menu->idAt(index) >= 0; ++index) {
+ // [en|dis]able all tea-entries (all have positive menu-ids)
+ menu->setItemEnabled(menu->idAt(index), !running);
+ }
+
+ startAct->setEnabled(!running); // "start" entry
+ stopAct->setEnabled(running); // "stop" entry
+ confAct->setEnabled(!running); // "configuration" entry
+ anonAct->setEnabled(!running); // "anonymous" entry
+}
+
+/* menu-slot: tea selected in tea-menu */
+void TopLevel::teaSelected(int index)
+{
+ if (index >=0 && (unsigned int)index < teas.count()) {
+ // tick new active item in menu
+ menu->setItemChecked(current_selected, false);
+ menu->setItemChecked(index, true);
+
+ current_selected = index;
+ KConfig *config = kapp->config();
+ config->setGroup("General");
+ config->writeEntry("Tea", current_selected);
+ }
+ // all other entries of this menu have custom handlers
+}
+
+/* start_menu-slot: tea selected (and activated!) in tea-menu */
+void TopLevel::teaStartSelected(int index)
+{
+ if (index >=0 && (unsigned int)index < teas.count()) {
+ teaSelected(index);
+
+ start();
+ }
+}
+
+/* menu-slot: "start" selected in menu */
+void TopLevel::start()
+{
+ if (listempty && !shooting) {
+ KMessageBox::error(this, i18n("There is no tea to begin steeping."), i18n("No Tea"));
+ } else {
+ if (!shooting) {
+ current_name = teas[current_selected].name; // remember name of current tea
+ startSeconds = teas[current_selected].time; // initialize time for current tea
+ seconds = startSeconds;
+ percentDone = 0;
+ }
+ // else both are already defined by dialog handler
+
+ killTimers();
+ startTimer(1000); // 1000ms = 1s (sufficient resolution)
+
+ running = true;
+ ready = false;
+ enable_menuEntries(); // disable "start", enable "stop"
+
+ repaint();
+ }
+}
+
+/* menu-slot: "stop" selected in menu */
+void TopLevel::stop()
+{
+ killTimers();
+
+ running = false;
+ ready = false;
+ enable_menuEntries(); // disable "top", enable "start"
+ if (shooting) {
+ // re-check current tea
+ shooting = false;
+ if (!listempty)
+ menu->setItemChecked(current_selected, true);
+ }
+
+ setToolTip(i18n("The Tea Cooker"), true);
+ repaint();
+}
+
+/* open dialog to start an 'anonymous' tea */
+void TopLevel::anonymous()
+{
+ if (!anondlg) {
+ // FIXME: dialog appears centered on screen, but should be near systray icon!
+ anondlg = new KDialogBase(KDialogBase::Plain, i18n("Anonymous Tea"),
+ KDialogBase::Ok | KDialogBase::Cancel,
+ KDialogBase::Ok, this, "anonymous", true);
+ QWidget *page = anondlg->plainPage();
+ QBoxLayout *top_box = new QVBoxLayout(page);
+ QBoxLayout *prop_box = new QHBoxLayout(top_box);
+ QVBox *propleft = new QVBox(page);
+ prop_box->addWidget(propleft);
+ QVBox *propright = new QVBox(page);
+ prop_box->addWidget(propright);
+
+ anon_time = new TimeEdit(propright);
+ anon_time->setFixedHeight(anon_time->sizeHint().height());
+ anon_time->setValue(DEFAULT_TEA_TIME);
+ QLabel *l = new QLabel(anon_time, i18n("Tea time:"), propleft);
+ l->setFixedSize(l->sizeHint());
+
+ top_box->addStretch();
+
+ anon_time->setFocus();
+ } else {
+ // FIXME: do what here?
+ // reset time to DEFAULT_TEA_TIME?
+ // (why? - better use LRU, and save that to config)
+ }
+
+ if (anondlg->exec() == QDialog::Accepted) {
+ shooting = true;
+ if (!listempty)
+ menu->setItemChecked(current_selected, false); // no item is to be checked
+ current_name = i18n("tea"); // some generic tea name
+ startSeconds = anon_time->value();
+ seconds = startSeconds;
+ percentDone = 0;
+ start();
+ }
+}
+
+
+
+
+//
+// Configure-window handling
+//
+
+
+/* enable/disable buttons for editing listbox */
+void TopLevel::enable_controls() {
+ bool haveSelection = (listbox->currentItem() != 0);
+ bool amFirst = (listbox->currentItem() == listbox->firstChild());
+ bool amLast = true;
+ if (haveSelection)
+ amLast = (!listbox->currentItem()->itemBelow()); // itemBelow() returns returns NULL if last
+
+ btn_del->setEnabled(haveSelection);
+ btn_up->setEnabled(haveSelection && !amFirst);
+ btn_down->setEnabled(haveSelection && !amLast);
+ if (haveSelection)
+ listbox->ensureItemVisible(listbox->currentItem());
+}
+
+/* disable right side of configure-window */
+void TopLevel::disable_properties() {
+ editgroup->setEnabled(false);
+}
+
+/* enable right side of configure-window */
+void TopLevel::enable_properties() {
+ editgroup->setEnabled(true);
+}
+
+/* config-slot: item in tea-list selected */
+void TopLevel::listBoxItemSelected() {
+ if (listbox->currentItem()) {
+ // item selected, display its properties on right side
+ nameEdit->setText(static_cast<TeaListItem *>(listbox->currentItem())->name());
+ timeEdit->setValue(static_cast<TeaListItem *>(listbox->currentItem())->time());
+ enable_controls();
+ }
+}
+
+/* config-slot: name of a tea edited */
+void TopLevel::nameEditTextChanged(const QString& newText) {
+ /* this method also gets called when the last TeaListItem has been deleted
+ * (to clear the name edit widget), so check for empty listbox */
+ if (listbox->currentItem() != NULL) {
+ listbox->blockSignals(TRUE);
+ static_cast<TeaListItem *>(listbox->currentItem())->setName(newText);
+ listbox->blockSignals(FALSE);
+ }
+}
+
+/* config-slot: time for a tea changed */
+void TopLevel::spinBoxValueChanged(int v) {
+ /* this method also gets called when the last TeaListItem has been deleted
+ * (to clear the time edit widget), so check for empty listbox */
+ if (listbox->currentItem() != NULL)
+ static_cast<TeaListItem *>(listbox->currentItem())->setTime(v);
+}
+
+/* config-slot: "new" button clicked */
+void TopLevel::newButtonClicked() {
+ TeaListItem* item = new TeaListItem(listbox, listbox->currentItem());
+ listbox->setCurrentItem(item);
+
+ nameEdit->setText(i18n("New Tea"));
+ timeEdit->setValue(DEFAULT_TEA_TIME);
+
+ nameEdit->setFocus();
+
+ if (listbox->childCount() == 1) {
+ enable_properties();
+ current_item = item;
+ }
+ enable_controls();
+}
+
+/* config-slot: "delete" button clicked */
+void TopLevel::delButtonClicked() {
+ if (listbox->currentItem()) {
+ TeaListItem *curritem = static_cast<TeaListItem *>(listbox->currentItem());
+
+ if (listbox->childCount() == 1) {
+ // no childs left after we've deleted this item
+ listbox->setSelected(listbox->currentItem(), false);
+ nameEdit->setText("");
+ timeEdit->setValue(0);
+ disable_properties();
+ } else {
+ // select new current item
+ if (listbox->firstChild() != curritem)
+ listbox->setSelected(listbox->firstChild(), true);
+ else
+ listbox->setSelected(listbox->firstChild()->nextSibling(), true);
+ }
+
+ delete curritem;
+ enable_controls();
+ }
+}
+
+/* config-slot: "up" button clicked */
+void TopLevel::upButtonClicked() {
+ QListViewItem* item = listbox->currentItem();
+
+ if (item && item->itemAbove())
+ item->itemAbove()->moveItem(item);
+
+ enable_controls();
+}
+
+/* config-slot: "down" button clicked */
+void TopLevel::downButtonClicked() {
+ QListViewItem* item = listbox->currentItem();
+
+ if (item && item->itemBelow())
+ item->moveItem(item->itemBelow());
+
+ enable_controls();
+}
+
+/* config-slot: checkbox next to "action" field toggled*/
+void TopLevel::actionEnableToggled(bool on)
+{
+ actionEdit->setEnabled(on);
+}
+
+/* config-slot: "help" button clicked */
+void TopLevel::help()
+{
+ kapp->invokeHelp();
+}
+
+/* config-slot: "Configure Events..." button clicked */
+void TopLevel::confButtonClicked()
+{
+ KNotifyDialog::configure(btn_conf);
+}
+
+
+void TopLevel::config()
+{
+ if (!confdlg) {
+ confdlg = new KDialogBase(KDialogBase::Plain, i18n("Configure Tea Cooker"),
+ KDialogBase::Ok|KDialogBase::Cancel|KDialogBase::Help,
+ KDialogBase::Ok, this, "config", true);
+ QWidget *page = confdlg->plainPage();
+ // FIXME: enforce sensible initial/default size of dialog
+ // FIXME: modal is ok, but can avoid always-on-top?
+
+ QBoxLayout *top_box = new QVBoxLayout(page, 0, 8); // whole config-stuff
+ QBoxLayout *box = new QHBoxLayout(top_box); // list + properties
+
+ /* left side - tea list and list-modifying buttons */
+ QBoxLayout *leftside = new QVBoxLayout(box);
+ QGroupBox *listgroup = new QGroupBox(2, Vertical, i18n("Tea List"), page);
+ leftside->addWidget(listgroup, 0, 0);
+
+ listbox = new QListView(listgroup, "listBox");
+ listbox->addColumn(i18n("Name"));
+ listbox->header()->setClickEnabled(false, listbox->header()->count()-1);
+ listbox->addColumn(i18n("Time"));
+ listbox->header()->setClickEnabled(false, listbox->header()->count()-1);
+ listbox->setSorting(-1);
+ connect(listbox, SIGNAL(selectionChanged()), SLOT(listBoxItemSelected()));
+
+ // now buttons for editing the tea-list
+ QWidget *listgroup_widget = new QWidget(listgroup);
+ QBoxLayout *hbox = new QHBoxLayout(listgroup_widget);
+ hbox->setSpacing(4);
+ btn_new = new QPushButton(QString::null, listgroup_widget);
+ QToolTip::add(btn_new, i18n("New"));
+ btn_new->setPixmap(SmallIcon("filenew"));
+ btn_new->setMinimumSize(btn_new->sizeHint() * 1.2);
+ connect(btn_new, SIGNAL(clicked()), SLOT(newButtonClicked()));
+ hbox->addWidget(btn_new);
+
+ btn_del = new QPushButton(QString::null, listgroup_widget);
+ QToolTip::add(btn_del, i18n("Delete"));
+ btn_del->setIconSet(SmallIconSet("editdelete"));
+ btn_del->setMinimumSize(btn_new->sizeHint() * 1.2);
+ connect(btn_del, SIGNAL(clicked()), SLOT(delButtonClicked()));
+ hbox->addWidget(btn_del);
+
+ btn_up = new QPushButton(QString::null, listgroup_widget);
+ QToolTip::add(btn_up, i18n("Up"));
+ btn_up->setIconSet(SmallIconSet("up"));
+ btn_up->setMinimumSize(btn_up->sizeHint() * 1.2);
+ connect(btn_up, SIGNAL(clicked()), SLOT(upButtonClicked()));
+ hbox->addWidget(btn_up);
+
+ btn_down = new QPushButton(QString::null, listgroup_widget);
+ QToolTip::add(btn_down, i18n("Down"));
+ btn_down->setIconSet(SmallIconSet("down"));
+ btn_down->setMinimumSize(btn_down->sizeHint() * 1.2);
+ connect(btn_down, SIGNAL(clicked()), SLOT(downButtonClicked()));
+ hbox->addWidget(btn_down);
+
+ hbox->addStretch(10);
+
+ /* right side - tea properties */
+ QBoxLayout *rightside = new QVBoxLayout(box);
+ editgroup = new QGroupBox(2, Vertical, i18n("Tea Properties"), page);
+ rightside->addWidget(editgroup, 0, 0);
+ QHBox *propbox = new QHBox(editgroup);
+
+ // FIXME: - must enforce correct vertical alignment of each label-editor pair
+ // (better use one HBox for each label-editor pair?)
+ QVBox *propleft = new QVBox(propbox);
+ QVBox *propright = new QVBox(propbox);
+ nameEdit = new QLineEdit(propright);
+ nameEdit->setFixedHeight(nameEdit->sizeHint().height());
+ nameEdit->setAlignment(QLineEdit::AlignLeft);
+ QLabel *l = new QLabel(nameEdit, i18n("Name:"), propleft);
+ l->setFixedSize(l->sizeHint());
+ connect(nameEdit, SIGNAL(textChanged(const QString&)), SLOT(nameEditTextChanged(const QString&)) );
+
+ timeEdit = new TimeEdit(propright);
+ timeEdit->setFixedHeight(timeEdit->sizeHint().height());
+ l = new QLabel(timeEdit, i18n("Tea time:"), propleft);
+ l->setFixedSize(l->sizeHint());
+ connect(timeEdit, SIGNAL(valueChanged(int)), SLOT(spinBoxValueChanged(int)));
+
+ /* bottom - timeout actions */
+ QGroupBox *actiongroup = new QGroupBox(4, Vertical, i18n("Action"), page);
+ top_box->addWidget(actiongroup, 0, 0);
+
+ QWidget *actionconf_widget = new QWidget(actiongroup);
+ QBoxLayout *actionconf_hbox = new QHBoxLayout(actionconf_widget);
+ btn_conf = new QPushButton(i18n("Configure Events..."), actionconf_widget);
+ actionconf_hbox->addWidget(btn_conf);
+ connect(btn_conf, SIGNAL(clicked()), SLOT(confButtonClicked()));
+ actionconf_hbox->addStretch(10);
+
+ eventEnable = new QCheckBox(i18n("Event"), actiongroup);
+ popupEnable = new QCheckBox(i18n("Popup"), actiongroup);
+ eventEnable->setFixedHeight(eventEnable->sizeHint().height());
+ popupEnable->setFixedHeight(popupEnable->sizeHint().height());
+
+ QHBox *actionbox = new QHBox(actiongroup);
+ actionEnable = new QCheckBox(actionbox);
+// FIXME: add text to this line:
+// QLabel *actionLabel = new QLabel(i18n("Execute: "), actiongroup);
+ actionEdit = new QLineEdit(actionbox);
+ actionEdit->setFixedHeight(actionEdit->sizeHint().height());
+ QToolTip::add(actionEdit, i18n("Enter command here; '%t' will be replaced with name of steeping tea"));
+ connect(actionEnable, SIGNAL(toggled(bool)), SLOT(actionEnableToggled(bool)));
+ rightside->addStretch();
+
+ // single checkbox
+ visEnable = new QCheckBox(i18n("Visualize progress in icon tray"), page);
+ top_box->addWidget(visEnable, 0, 0);
+
+
+ // let listbox claim all remaining vertical space
+ top_box->setStretchFactor(box, 10);
+
+ connect(confdlg, SIGNAL(helpClicked()), SLOT(help()));
+ }
+
+ // now add all defined teas (and their times) to the listview
+ // this is done backwards because QListViewItems are inserted at the top
+ listbox->clear();
+ for (int i=teas.count()-1; i>=0; i--) {
+ TeaListItem *item = new TeaListItem(listbox);
+ item->setName(teas[i].name);
+ item->setTime(teas[i].time);
+ if ((unsigned int)i == current_selected)
+ current_item = item;
+ }
+
+ // select first entry in listbox; if no entries present then disable right side
+ if (listempty) {
+ enable_controls();
+ disable_properties();
+ nameEdit->setText("");
+ timeEdit->setValue(1);
+ } else {
+ listbox->setSelected(listbox->firstChild(), true);
+ }
+
+ // -------------------------
+
+ eventEnable->setChecked(useNotify);
+ popupEnable->setChecked(usePopup);
+ actionEnable->setChecked(useAction);
+ actionEdit->setText(action);
+ actionEdit->setEnabled(useAction);
+ visEnable->setChecked(useTrayVis);
+
+ if (confdlg->exec() == QDialog::Accepted)
+ {
+ // activate new settings
+ useNotify = eventEnable->isChecked();
+ usePopup = popupEnable->isChecked();
+ useAction = actionEnable->isChecked();
+ action = actionEdit->text();
+ useTrayVis = visEnable->isChecked();
+
+ teas.clear();
+
+ // Copy over teas and times from the QListView
+ int i = 0;
+ teas.clear();
+ teas.resize(listbox->childCount());
+ for (QListViewItemIterator it(listbox); it.current() != 0; ++it) {
+ teas[i].name = static_cast<TeaListItem *>(it.current())->name();
+ teas[i].time = static_cast<TeaListItem *>(it.current())->time();
+ if (it.current() == current_item)
+ current_selected = i;
+ i++;
+ }
+
+ listempty = (teas.count() == 0);
+
+ rebuildTeaMenus();
+
+ // and store to config
+ KConfig *config = kapp->config();
+ // remove old-style entries from default-group (if present)
+ if (config->hasKey("UserTea"))
+ config->deleteEntry("UserTea");
+
+ config->setGroup("General");
+ config->writeEntry("Beep", useNotify);
+ config->writeEntry("Popup", usePopup);
+ config->writeEntry("UseAction", useAction);
+ config->writeEntry("Action", action);
+ config->writeEntry("Tea", current_selected);
+ config->writeEntry("UseTrayVis", useTrayVis);
+ // first get rid of all previous tea-entries from config, then write anew
+ config->deleteGroup("Teas", true); // deep remove of whole group
+ config->setGroup("Teas");
+ config->writeEntry("Number", teas.count());
+ QString key;
+ int index = 1;
+ for (QValueVector<tea_struct>::ConstIterator it = teas.begin(); it != teas.end(); ++it) {
+ key.sprintf("Tea%d Name", index);
+ config->writeEntry(key, it->name);
+ key.sprintf("Tea%d Time", index);
+ config->writeEntry(key, it->time);
+ index++;
+ }
+
+ config->sync();
+ }
+}
diff --git a/kteatime/toplevel.h b/kteatime/toplevel.h
new file mode 100644
index 0000000..a172189
--- /dev/null
+++ b/kteatime/toplevel.h
@@ -0,0 +1,124 @@
+/*
+ * This file is part of the KTeaTime application.
+ *
+ * Copyright (C) 1998-1999 Matthias Hoelzer-Kluepfel (hoelzer@kde.org)
+ * Copyright (C) 2002-2003 Martin Willers (willers@xm-arts.de)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef TOPLEVEL_H
+#define TOPLEVEL_H
+
+#include <kapplication.h>
+#include <qpopupmenu.h>
+#include <qtimer.h>
+#include <qlineedit.h>
+#include <qvaluevector.h>
+#include <qlistview.h>
+#include <qpushbutton.h>
+#include <qgroupbox.h>
+#include <knuminput.h>
+#include <ksystemtray.h>
+#include <qpixmap.h>
+
+class KAction;
+class KDialogBase;
+class QCheckBox;
+class TimeEdit;
+
+class TopLevel : public KSystemTray
+{
+ Q_OBJECT
+
+public:
+
+ TopLevel();
+ ~TopLevel();
+
+protected:
+
+ void paintEvent(QPaintEvent *);
+ void mousePressEvent(QMouseEvent *);
+ void timerEvent(QTimerEvent *);
+
+private slots:
+
+ void teaSelected(int index);
+ void teaStartSelected(int index);
+ void start();
+ void stop();
+ void config();
+ void help();
+ void anonymous();
+ void setToolTip(const QString &text, bool force=false);
+ void rebuildTeaMenus();
+
+ void listBoxItemSelected();
+ void nameEditTextChanged(const QString& newText);
+ void spinBoxValueChanged(int v);
+ void newButtonClicked();
+ void delButtonClicked();
+ void upButtonClicked();
+ void downButtonClicked();
+ void confButtonClicked();
+ void enable_menuEntries();
+ void disable_properties();
+ void enable_properties();
+ void enable_controls();
+ void actionEnableToggled(bool on);
+
+private:
+
+ static const int DEFAULT_TEA_TIME;
+
+ struct tea_struct {
+ QString name;
+ int time;
+ };
+ QValueVector<tea_struct> teas; // list of tea-names and times
+
+ bool running, ready, firstFrame, listempty;
+ int seconds; // variable for counting down seconds
+ int startSeconds; // steeping time for current tea
+ int percentDone; // ok, this isn't really "per 100", but "per 360"
+
+ unsigned current_selected; // index of currently +selected+ tea in menu
+ QListViewItem *current_item; // ptr to currently +selected+ tea in ListView
+ QString current_name; // name of currently +running+ tea (if any)
+ bool shooting; // anonymous tea currently steeping?
+
+ bool useNotify, usePopup, useAction;
+ QString action;
+ bool useTrayVis; // visualize progress in tray icon
+
+ QPixmap mugPixmap, teaNotReadyPixmap, teaAnim1Pixmap, teaAnim2Pixmap;
+
+ KAction *startAct, *stopAct, *confAct, *anonAct;
+ QPopupMenu *menu, *steeping_menu, *start_menu;
+ QListView *listbox;
+ QLineEdit *nameEdit, *actionEdit;
+ TimeEdit *timeEdit;
+ QGroupBox *editgroup;
+ QPushButton *btn_new, *btn_del, *btn_up, *btn_down, *btn_conf;
+
+ QString lastTip;
+ KDialogBase *anondlg, *confdlg;
+ TimeEdit *anon_time;
+ QCheckBox *eventEnable, *popupEnable, *actionEnable, *visEnable;
+};
+
+#endif
diff --git a/ktux/AUTHORS b/ktux/AUTHORS
new file mode 100644
index 0000000..394a242
--- /dev/null
+++ b/ktux/AUTHORS
@@ -0,0 +1,2 @@
+Code: Martin Jones <mjones@kde.org>
+Graphics: Carlos Rego
diff --git a/ktux/Makefile.am b/ktux/Makefile.am
new file mode 100644
index 0000000..8a32552
--- /dev/null
+++ b/ktux/Makefile.am
@@ -0,0 +1,38 @@
+## Makefile.am for ktux
+
+# this has all of the subdirectories that make will recurse into. if
+# there are none, comment this out
+SUBDIRS = sprites
+
+# this is the program that gets installed. it's name is used for all
+# of the other Makefile.am variables
+bin_PROGRAMS = ktux
+
+# set the include path for X, qt and KDE
+INCLUDES = $(all_includes)
+
+# the library search path.
+ktux_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+
+# the libraries to link against.
+ktux_LDADD = $(LIB_KDEUI) -lkscreensaver
+
+# which sources should be compiled for ktux
+ktux_SOURCES = spriteanim.cpp spritemisc.cpp spritepm.cpp sprite.cpp
+
+# these are the headers for your project
+noinst_HEADERS = sprite.h spriteanim.h spritemisc.h spritepm.h
+
+# let automoc handle all of the meta source files (moc)
+METASOURCES = AUTO
+
+# make messages.po. Move this one to ../po/ and "make merge" in po
+# the -x is for skipping messages already translated in kdelibs
+messages:
+ $(XGETTEXT) *.cpp -o $(podir)/ktux.pot
+
+KDE_ICON = ktux
+
+appsdir = $(kde_appsdir)/System/ScreenSavers
+apps_DATA = ktux.desktop
+
diff --git a/ktux/hi16-app-ktux.png b/ktux/hi16-app-ktux.png
new file mode 100644
index 0000000..e21db29
--- /dev/null
+++ b/ktux/hi16-app-ktux.png
Binary files differ
diff --git a/ktux/hi32-app-ktux.png b/ktux/hi32-app-ktux.png
new file mode 100644
index 0000000..4ecd9ce
--- /dev/null
+++ b/ktux/hi32-app-ktux.png
Binary files differ
diff --git a/ktux/ktux.desktop b/ktux/ktux.desktop
new file mode 100644
index 0000000..9895467
--- /dev/null
+++ b/ktux/ktux.desktop
@@ -0,0 +1,212 @@
+[Desktop Entry]
+Name=KTux
+Name[af]=Ktux
+Name[bg]=ТъкÑ
+Name[bn]=কে-টাকà§à¦¸
+Name[eo]=Tuĉjo
+Name[hi]=के-टकà¥à¤¸
+Name[ne]=केडीई टकà¥à¤¸
+Name[ta]= KTux
+Name[tg]=KТукÑ
+Name[th]=ตุ๊à¸à¸‹à¹Œ
+Exec=ktux %i %m -caption "%c"
+Icon=ktux
+Type=Application
+Actions=Setup;InWindow;Root;
+X-KDE-Category=Flying Things
+Terminal=false
+
+[Desktop Action Setup]
+Exec=ktux -setup
+Name=Setup...
+Name[af]=Opstelling...
+Name[ar]=اعداد...
+Name[az]=Qurulum...
+Name[be]=ÐаÑтаўленні...
+Name[bg]=ÐаÑтройване...
+Name[bn]=পà§à¦°à¦¸à§à¦¤à§à¦¤à¦¿...
+Name[br]=Kefluniadur ...
+Name[bs]=Postavke...
+Name[ca]=Configuració...
+Name[cs]=Nastavení...
+Name[cy]=Gosod ...
+Name[da]=Opsætning...
+Name[de]=Einrichtung ...
+Name[el]=ΡÏθμιση...
+Name[eo]=Agordo...
+Name[es]=Configuración...
+Name[et]=Seadistused...
+Name[eu]=Konfigurazioa...
+Name[fa]=برپایی...
+Name[fi]=Asetukset...
+Name[fr]=Configuration...
+Name[ga]=Socraigh...
+Name[gl]=Configuración...
+Name[he]=הגדרות...
+Name[hi]=सेटअप...
+Name[hr]=Postavke...
+Name[hu]=Beállítás...
+Name[id]=Aturan...
+Name[is]=Stillingar...
+Name[it]=Impostazioni...
+Name[ja]=セットアップ...
+Name[km]=រៀបចំ...
+Name[ko]=설정...
+Name[lt]=Nustatymas...
+Name[lv]=UzstÄdÄ«jumi...
+Name[mk]=ПоÑтавување...
+Name[ms]=Tetapan...
+Name[nb]=Oppsett …
+Name[nds]=Instellen...
+Name[ne]=सेटअप...
+Name[nl]=Instellingen...
+Name[nn]=Oppsett …
+Name[pa]=ਸੈੱਟਅੱਪ...
+Name[pl]=Ustawienia...
+Name[pt]=Configurar...
+Name[pt_BR]=Configurar...
+Name[ro]=Setări...
+Name[ru]=ÐаÑтройка...
+Name[rw]=Iboneza...
+Name[sk]=Nastavenie...
+Name[sl]=Nastavitve ...
+Name[sr]=ПодеÑи...
+Name[sr@Latn]=Podesi...
+Name[sv]=Inställningar...
+Name[ta]=அமைபà¯à®ªà¯...
+Name[tg]=Соз кардан...
+Name[th]=ติดตั้ง...
+Name[tr]=Kurulum...
+Name[uk]=Ð’Ñтановити...
+Name[uz]=Oʻrnatish
+Name[uz@cyrillic]=Ўрнатиш
+Name[ven]=Vhekanya...
+Name[wa]=Apontyî...
+Name[xh]=Iyacwangciswa...
+Name[zh_CN]=设置...
+Name[zh_TW]=設定...
+Name[zu]=Iyalungiselela...
+Icon=kscreensaver
+
+[Desktop Action InWindow]
+Exec=ktux -window-id %w
+Name=Display in Specified Window
+Name[be]=Паказваць у зададзеным вакне
+Name[bg]=Стартиране в избран прозорец
+Name[bn]=উলà§à¦²à§‡à¦–কৃত উইনà§à¦¡à§‹à¦¤à§‡ দেখাও
+Name[br]=Diskwel er prenestr spisaet
+Name[bs]=Prikaži u navedenom prozoru
+Name[ca]=Mostra a la finestra especificada
+Name[cs]=Zobrazit v urÄeném oknÄ›
+Name[cy]=Dangos mewn Ffenestr Benodol
+Name[da]=Visning i angivet vindue
+Name[de]=In vorgegebenem Fenster anzeigen
+Name[el]=Εμφάνιση σε Ï€ÏοκαθοÏισμένο παÏάθυÏο
+Name[eo]=Montru en indikita fenestro
+Name[es]=Mostrar en la ventana especificada
+Name[et]=Määratud aknas näitamine
+Name[eu]=Zehaztutako lehioan erakutsi
+Name[fa]=نمایش در پنجرۀ مشخص‌شده
+Name[fi]=Näytä määrätyssä ikkunassa
+Name[fr]=Affichage dans la fenêtre indiquée
+Name[ga]=Taispeáin san Fhuinneog Sonraithe
+Name[gl]=Mostrar na fiestra indicada
+Name[he]=הצג בחלון המצויין
+Name[hr]=Prikazianje u određenom prozoru
+Name[hu]=Megjelenítés a megadott ablakban
+Name[id]=Ditampilkan di Window Khusus
+Name[is]=Birta í ákveðnum glugga
+Name[it]=Mostra nella finestra specificata
+Name[ja]=指定ウィンドウã§è¡¨ç¤º
+Name[km]=បង្ហាញ​ក្នុង​បង្អួច​ជាក់លាក់
+Name[ko]=지정한 ì°½ì— í‘œì‹œí•˜ê¸°
+Name[lt]=Rodyti nurodytame lange
+Name[lv]=RÄdÄ«t norÄdÄ«tajÄ logÄ
+Name[mk]=Приказ во зададениот прозорец
+Name[mt]=Uri fil-window speċifikata
+Name[nb]=Vis i det oppgitte vinduet
+Name[nds]=In't angeven Finster wiesen
+Name[ne]=निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ सञà¥à¤à¥à¤¯à¤¾à¤²à¤®à¤¾ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥
+Name[nl]=Weergeven in een gedefinieerd venster
+Name[nn]=Vis i oppgjeve vindauge
+Name[pl]=Wyświetl w zadanym oknie
+Name[pt]=Mostrar na Janela Indicada
+Name[pt_BR]=Mostrar em janela especificada
+Name[ro]=Afişează în fereastra specificată
+Name[ru]=Показывать в указанном окне
+Name[rw]=Kwerekana mu Idirishya Ryihariye
+Name[sk]=Zobraziť v zadanom okne
+Name[sl]=Prikaz v doloÄenemu oknu
+Name[sr]=Прикажи у задатом прозору
+Name[sr@Latn]=Prikaži u zadatom prozoru
+Name[sv]=Visa i angivet fönster
+Name[ta]= கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿà¯à®Ÿ சாளர காடà¯à®šà®¿à®¯à¯ˆ காடà¯à®Ÿà¯
+Name[tg]=Дар Тирезаи МуайÑншуда Ðамоиш додан
+Name[tr]=Belirtilen Pencerede Göster
+Name[uk]=Відобразити у вказаному вікні
+Name[wa]=Håyner dins l' purnea specifyî
+Name[zh_CN]=在指定的窗å£ä¸­æ˜¾ç¤º
+Name[zh_TW]=在指定的視窗中顯示
+NoDisplay=true
+
+[Desktop Action Root]
+Exec=ktux -root
+Name=Display in Root Window
+Name[be]=Паказваць у фанавым вакне
+Name[bg]=Стартиране в Ð³Ð»Ð°Ð²Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€ÐµÑ†
+Name[bn]=রà§à¦Ÿ উইনà§à¦¡à§‹à¦¤à§‡ দেখাও
+Name[br]=Diskwel er prenestr gwrizienn
+Name[bs]=Prikaži u korijenskom prozoru
+Name[ca]=Mostra a la finestra arrel
+Name[cs]=Zobrazit na pozadí plochy
+Name[cy]=Dangos mewn Ffenestr Wraidd
+Name[da]=Visning i root-vindue
+Name[de]=Im Hintergrundfenster anzeigen
+Name[el]=ΠÏοβολή στο βασικό παÏάθυÏο
+Name[eo]=Montru en radika fenestro
+Name[es]=Mostrar en la ventana raíz
+Name[et]=Juuraknas näitamine
+Name[eu]=Lehio nagusian erakutsi
+Name[fa]=نمایش در پنجرۀ ریشه
+Name[fi]=Näytä juuri-ikkunassa
+Name[fr]=Affichage dans la fenêtre principale
+Name[ga]=Taispeáin sa bhFréamhfhuinneog
+Name[gl]=Mostrar na fiestra raiz
+Name[he]=הצג בחלון השורש
+Name[hr]=Prikazivanje u korijenskom prozoru
+Name[hu]=Megjelenítés a gyökérablakban
+Name[id]=Ditampilkan di Root Window
+Name[is]=Birta í rótarglugga
+Name[it]=Mostra sullo sfondo
+Name[ja]=ルートウィンドウã§è¡¨ç¤º
+Name[km]=បង្ហាញ​ក្នុង​បង្អួច Root
+Name[ko]=주 ì°½ì— í‘œì‹œí•˜ê¸°
+Name[lt]=Rodyti root lange
+Name[lv]=RÄdÄ«t galvenajÄ logÄ
+Name[mk]=Приказ во коренÑкиот прозорец
+Name[mt]=Uri fil-window ewlenija
+Name[nb]=Vis i rotvinduet
+Name[nds]=In't Hööftfinster wiesen
+Name[ne]=मूल सञà¥à¤à¥à¤¯à¤¾à¤²à¤®à¤¾ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥
+Name[nl]=Weergeven in hoofdvenster
+Name[nn]=Vis i rotvindauget
+Name[pl]=Wyświetl w oknie głównym
+Name[pt]=Mostrar na Janela de Fundo
+Name[pt_BR]=Mostrar na janela raiz
+Name[ro]=Afişează în fereastra rădăcină
+Name[ru]=Показывать на фоне рабочего Ñтола
+Name[rw]=Kwerekana mu Idirishya Umuzi
+Name[sk]=Zobraziť v koreňovom okne
+Name[sl]=Prikaz v korenskem oknu
+Name[sr]=Прикажи у кореном прозору
+Name[sr@Latn]=Prikaži u korenom prozoru
+Name[sv]=Visa i rotfönster
+Name[ta]=மூல சாளரதà¯à®¤à®¿à®²à¯ காடà¯à®Ÿà¯
+Name[tg]=Дар Тирезаи Решавӣ Ðамоиш додан
+Name[tr]=Kök Pencerede Göster
+Name[uk]=Відобразити на тлі екрана
+Name[wa]=HÃ¥yner e purnea raecene (li fond do scribanne)
+Name[zh_CN]=在根窗å£ä¸­æ˜¾ç¤º
+Name[zh_TW]=在根視窗中顯示
+NoDisplay=true
+X-DCOP-ServiceType=Multi
diff --git a/ktux/sprite.cpp b/ktux/sprite.cpp
new file mode 100644
index 0000000..205c754
--- /dev/null
+++ b/ktux/sprite.cpp
@@ -0,0 +1,254 @@
+//-----------------------------------------------------------------------------
+//
+// KTux - QCanvas based screensaver
+//
+// Copyright (c) Martin R. Jones 1999
+//
+
+#include <stdlib.h>
+#include <time.h>
+#include <qlabel.h>
+#include <qmessagebox.h>
+#include <qlayout.h>
+#include <qslider.h>
+#include <kstandarddirs.h>
+#include <klocale.h>
+#include <kdebug.h>
+#include <kstdguiitem.h>
+#include <kbuttonbox.h>
+
+#include "spritepm.h"
+#include "spritemisc.h"
+#include "sprite.h"
+#include "sprite.moc"
+
+
+// libkscreensaver interface
+extern "C"
+{
+ KDE_EXPORT const char *kss_applicationName = "ktux";
+ KDE_EXPORT const char *kss_description = I18N_NOOP( "Tux Screen Saver" );
+ KDE_EXPORT const char *kss_version = "1.0.0";
+
+ KDE_EXPORT KScreenSaver *kss_create( WId id )
+ {
+ return new KSpriteSaver( id );
+ }
+
+ KDE_EXPORT QDialog *kss_setup()
+ {
+ return new KSpriteSetup();
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+KSpriteSetup::KSpriteSetup( QWidget *parent, const char *name )
+ : QDialog( parent, name, TRUE )
+{
+ KGlobal::locale()->insertCatalogue("ktux");
+ saver = 0;
+
+ readSettings();
+
+ setCaption(i18n("Setup KTux") );
+
+ QVBoxLayout *tl = new QVBoxLayout(this, 10, 10);
+ QHBoxLayout *tl1 = new QHBoxLayout;
+ tl->addLayout(tl1);
+ QVBoxLayout *tl11 = new QVBoxLayout(5);
+ tl1->addLayout(tl11);
+
+ QLabel *label = new QLabel( i18n("Speed:"), this );
+ label->setMinimumSize(label->sizeHint());
+ tl11->addStretch(1);
+ tl11->addWidget(label);
+
+ QSlider *sb = new QSlider(0, 100, 10, speed, QSlider::Horizontal, this );
+ tl11->addWidget(sb);
+ connect( sb, SIGNAL( valueChanged( int ) ), SLOT( slotSpeed( int ) ) );
+
+ preview = new QWidget( this );
+ preview->setFixedSize( 220, 170 );
+ preview->setBackgroundColor( black );
+ preview->show(); // otherwise saver does not get correct size
+ saver = new KSpriteSaver( preview->winId() );
+ tl1->addWidget(preview);
+
+ KButtonBox *bbox = new KButtonBox(this);
+ QButton *button = bbox->addButton( i18n("About"));
+ connect( button, SIGNAL( clicked() ), SLOT(slotAbout() ) );
+ bbox->addStretch(1);
+
+ button = bbox->addButton( KStdGuiItem::ok());
+ connect( button, SIGNAL( clicked() ), SLOT( slotOkPressed() ) );
+
+ button = bbox->addButton(KStdGuiItem::cancel());
+ connect( button, SIGNAL( clicked() ), SLOT( reject() ) );
+ bbox->layout();
+ tl->addWidget(bbox);
+
+ tl->freeze();
+}
+
+KSpriteSetup::~KSpriteSetup()
+{
+ delete saver;
+}
+
+// read settings from config file
+void KSpriteSetup::readSettings()
+{
+ KConfig *config = KGlobal::config();
+ config->setGroup( "Settings" );
+
+ speed = config->readNumEntry( "Speed", 50 );
+ if (speed > 100)
+ speed = 100;
+ else if (speed < 0)
+ speed = 0;
+}
+
+void KSpriteSetup::slotSpeed(int s)
+{
+ speed = s;
+ if (saver)
+ saver->setSpeed(speed);
+}
+
+// Ok pressed - save settings and exit
+void KSpriteSetup::slotOkPressed()
+{
+ KConfig *config = KGlobal::config();
+ config->setGroup("Settings");
+ config->writeEntry("Speed", speed);
+ config->sync();
+ accept();
+}
+
+void KSpriteSetup::slotAbout()
+{
+ QMessageBox::message(i18n("About KTux"),
+ i18n("KTux Version 1.0\n\nWritten by Martin R. Jones 1999\nmjones@kde.org"),
+ i18n("OK"));
+}
+
+
+//-----------------------------------------------------------------------------
+
+KSpriteSaver::KSpriteSaver( WId id ) : KScreenSaver( id )
+{
+ KGlobal::dirs()->addResourceType("sprite", KStandardDirs::kde_default("data") + "ktux/sprites/");
+
+ initialise();
+ readSettings();
+ blank();
+
+ connect(&mTimer, SIGNAL(timeout()), SLOT(slotTimeout()));
+ mTimer.start(120-mSpeed, true);
+}
+
+//-----------------------------------------------------------------------------
+KSpriteSaver::~KSpriteSaver()
+{
+ mTimer.stop();
+ delete mView;
+ delete mCanvas;
+}
+
+//-----------------------------------------------------------------------------
+//
+void KSpriteSaver::setSpeed(int speed)
+{
+ mSpeed = speed;
+ mTimer.changeInterval(120-mSpeed);
+}
+
+//-----------------------------------------------------------------------------
+// read settings from config file
+//
+void KSpriteSaver::readSettings()
+{
+ QString str;
+
+ KConfig *config = KGlobal::config();
+ config->setGroup("Settings");
+
+ mSpeed = config->readNumEntry("Speed", 50);
+
+ QString path = KGlobal::dirs()->findResourceDir( "sprite", "bg.png" );
+
+ SpritePixmapManager::manager()->setPixmapDir(path);
+
+ path += "spriterc";
+
+ KSimpleConfig *mConfig = new KSimpleConfig(path, true);
+ mConfig->setGroup("Config");
+ QStrList list;
+ int groups = mConfig->readListEntry("Groups", list);
+ mTimerIds.resize(groups);
+ for (int i = 0; i < groups; i++)
+ {
+ kdDebug() << "Group: " << list.at(i) << endl;;
+ mConfig->setGroup(list.at(i));
+ SpriteGroup *obj = new SpriteGroup(mCanvas, *mConfig);
+ mTimerIds[i] = startTimer(obj->refreshTime());
+ mGroups.append(obj);
+ }
+ delete mConfig;
+}
+
+//-----------------------------------------------------------------------------
+void KSpriteSaver::initialise()
+{
+ mCanvas = new QCanvas();
+ QPixmap pm( locate("sprite", "bg.png") );
+ mCanvas->setBackgroundPixmap( pm );
+ mCanvas->resize( width(), height() );
+ mView = new QCanvasView(mCanvas);
+ mView->viewport()->setBackgroundColor( black );
+ mView->resize( size());
+ mView->setFrameStyle( QFrame::NoFrame );
+ mView->setVScrollBarMode( QScrollView::AlwaysOff );
+ mView->setHScrollBarMode( QScrollView::AlwaysOff );
+ embed( mView );
+ mView->show();
+ SpriteRange::setFieldSize(mView->size());
+}
+
+//-----------------------------------------------------------------------------
+void KSpriteSaver::slotTimeout()
+{
+ mTimer.start(120-mSpeed, true);
+ SpriteGroup *grp;
+
+ for (grp = mGroups.first(); grp; grp = mGroups.next())
+ {
+ grp->next();
+ }
+
+ mCanvas->advance();
+}
+
+//-----------------------------------------------------------------------------
+void KSpriteSaver::timerEvent(QTimerEvent *ev)
+{
+ for (unsigned i = 0; i < mTimerIds.size(); i++)
+ {
+ if (mTimerIds[i] == ev->timerId())
+ {
+ mGroups.at(i)->refresh();
+ killTimer(ev->timerId());
+ mTimerIds[i] = startTimer(mGroups.at(i)->refreshTime());
+ break;
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+void KSpriteSaver::blank()
+{
+ setBackgroundColor( black );
+ erase();
+}
+
diff --git a/ktux/sprite.h b/ktux/sprite.h
new file mode 100644
index 0000000..d93e285
--- /dev/null
+++ b/ktux/sprite.h
@@ -0,0 +1,72 @@
+//-----------------------------------------------------------------------------
+//
+// ksprite - QCanvas based screensaver
+//
+// Copyright (c) Martin R. Jones 1996
+//
+
+#ifndef __SPRITE_H__
+#define __SPRITE_H__
+
+#include <qtimer.h>
+#include <qpushbutton.h>
+#include <qptrlist.h>
+#include <qstrlist.h>
+#include <qcanvas.h>
+#include <kscreensaver.h>
+#include "spriteanim.h"
+
+//-----------------------------------------------------------------------------
+class KSpriteSaver : public KScreenSaver
+{
+ Q_OBJECT
+public:
+ KSpriteSaver( WId id );
+ virtual ~KSpriteSaver();
+
+ void setSpeed(int speed);
+
+private:
+ void readSettings();
+ void initialise();
+ void blank();
+
+protected slots:
+ void slotTimeout();
+
+protected:
+ virtual void timerEvent(QTimerEvent *);
+
+protected:
+ QCanvas *mCanvas;
+ QCanvasView *mView;
+ QTimer mTimer;
+ int mSpeed;
+ QPtrList<SpriteGroup> mGroups;
+ QMemArray<int> mTimerIds;
+};
+
+class KSpriteSetup : public QDialog
+{
+ Q_OBJECT
+public:
+ KSpriteSetup( QWidget *parent = NULL, const char *name = NULL );
+ ~KSpriteSetup();
+
+protected:
+ void readSettings();
+
+private slots:
+ void slotSpeed(int s);
+ void slotOkPressed();
+ void slotAbout();
+
+private:
+ int speed;
+ QWidget *preview;
+ KSpriteSaver *saver;
+};
+
+
+#endif
+
diff --git a/ktux/spriteanim.cpp b/ktux/spriteanim.cpp
new file mode 100644
index 0000000..2c21838
--- /dev/null
+++ b/ktux/spriteanim.cpp
@@ -0,0 +1,161 @@
+//---------------------------------------------------------------------------
+//
+// spriteanim.cpp
+//
+// Copyright (c) 1999 Martin R. Jones <mjones@kde.org>
+//
+
+#include "spritemisc.h"
+#include "spritepm.h"
+#include "spriteanim.h"
+#include <kdebug.h>
+
+//===========================================================================
+//
+// SpriteObject stores the animations that create an object
+//
+SpriteObject::SpriteObject(SpritePixmapSequence *seq, QCanvas *c )
+ : QCanvasSprite(seq, c),
+ mCycle(0),
+ mLifeSpan(-1),
+ mSeq(seq)
+{
+}
+
+//---------------------------------------------------------------------------
+void SpriteObject::age()
+{
+ if (mLifeSpan > 0)
+ {
+ mLifeSpan--;
+ }
+ mCycle++;
+ if (mCycle > mSeq->delay(frame()))
+ {
+ setFrame((frame()+1)%frameCount());
+ mCycle = 0;
+ }
+}
+
+void SpriteObject::setBounds( int x1, int y1, int x2, int y2 )
+{
+ mBound = QRect( x1, y1, x2-x1, y2-y1 );
+}
+
+bool SpriteObject::outOfBounds() const
+{
+ bool in = mBound.contains( static_cast<int>(x()), static_cast<int>(y()) );
+ return !in;
+}
+
+//===========================================================================
+//
+// SpriteDef stores the animations that create an object
+//
+SpriteDef::SpriteDef(KConfigBase &config)
+{
+ read(config);
+}
+
+//---------------------------------------------------------------------------
+SpriteObject *SpriteDef::create( QCanvas *c )
+{
+ SpriteObject *sprite = 0;
+ if (mSeq)
+ {
+ int startX = mStartX.random();
+ int startY = mStartY.random();
+ sprite = new SpriteObject(mSeq, c);
+ sprite->setVelocity(mDirX.random(), mDirY.random());
+ if ( mDirX.min() != 0 || mDirX.max() != 0 ||
+ mDirY.min() != 0 || mDirY.max() != 0 ) {
+ sprite->setAnimated( true );
+ }
+ sprite->move(startX, startY);
+ sprite->setBounds(startX-1, startY-1, mEndX.random()+1, mEndY.random()+1);
+ sprite->setLifeSpan(mLifeSpan);
+ sprite->setZ(mZ);
+ sprite->show();
+ }
+
+ return sprite;
+}
+
+//---------------------------------------------------------------------------
+void SpriteDef::read(KConfigBase &config)
+{
+ mDirX.set(config.readEntry("DirectionX", "0"));
+ mDirY.set(config.readEntry("DirectionY", "0"));
+ mStartX.set(config.readEntry("StartX", "0"));
+ mStartY.set(config.readEntry("StartY", "0"));
+ mEndX.set(config.readEntry("EndX", "10000"));
+ mEndY.set(config.readEntry("EndY", "10000"));
+ mLifeSpan = config.readNumEntry("LifeSpan", -1);
+ mZ = config.readNumEntry("Z", 1);
+ QString animation = config.readEntry("Animation", "");
+ mSeq = SpriteSequenceManager::manager()->load(config, animation);
+ kdDebug() << "Set Z = " << mZ << endl;
+}
+
+//===========================================================================
+//
+// SpriteGroup
+//
+SpriteGroup::SpriteGroup(QCanvas *c, KConfigBase &config)
+ : mCanvas(c)
+{
+ mAvailable.setAutoDelete(true);
+ mActive.setAutoDelete(true);
+ read(config);
+}
+
+//---------------------------------------------------------------------------
+void SpriteGroup::next()
+{
+ QPtrListIterator<SpriteObject> it(mActive);
+
+ for (; it.current(); ++it)
+ {
+ SpriteObject *sprite = it.current();
+ if (sprite->outOfBounds() || sprite->dead())
+ {
+ mActive.removeRef(sprite);
+ }
+ else
+ {
+// sprite->forward(1);
+ sprite->age();
+ }
+ }
+}
+
+//---------------------------------------------------------------------------
+void SpriteGroup::refresh()
+{
+ if (((int) mActive.count()) < mCount)
+ {
+ SpriteObject *sprite = mAvailable.first()->create(mCanvas);
+ mActive.append(sprite);
+ }
+}
+
+
+//---------------------------------------------------------------------------
+void SpriteGroup::read(KConfigBase &config)
+{
+ SpriteRange countRange(config.readEntry("Count", "1"));
+ mCount = countRange.random();
+
+ mRefresh.set(config.readEntry("Refresh", "1000"));
+
+ QStrList anims;
+ config.readListEntry("Animations", anims);
+
+ for (anims.first(); anims.current(); anims.next())
+ {
+ config.setGroup(anims.current());
+ SpriteDef *obj = new SpriteDef(config);
+ mAvailable.append(obj);
+ }
+}
+
diff --git a/ktux/spriteanim.h b/ktux/spriteanim.h
new file mode 100644
index 0000000..9d5417b
--- /dev/null
+++ b/ktux/spriteanim.h
@@ -0,0 +1,96 @@
+//---------------------------------------------------------------------------
+//
+// spriteanim.h
+//
+// Copyright (c) 1999 Martin R. Jones <mjones@kde.org>
+//
+
+#ifndef SPRITEANIM_H
+#define SPRITEANIM_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <qpixmap.h>
+#include <qdict.h>
+#include <qptrlist.h>
+#include <qstrlist.h>
+#include <qcanvas.h>
+#include <kconfigbase.h>
+#include <ksimpleconfig.h>
+
+//---------------------------------------------------------------------------
+//
+// SpriteObject stores the animations that create an object
+//
+class SpriteObject : public QCanvasSprite
+{
+public:
+ SpriteObject(SpritePixmapSequence *seq, QCanvas *c);
+
+ void setLifeSpan(int l) { mLifeSpan = l; }
+ void age();
+ bool dead() const { return (mLifeSpan == 0); }
+ void setBounds( int x1, int y1, int x2, int y2 );
+ bool outOfBounds() const;
+
+protected:
+ int mCycle;
+ int mLifeSpan;
+ SpritePixmapSequence *mSeq;
+ QRect mBound;
+};
+
+//---------------------------------------------------------------------------
+//
+// SpriteDef stores the definition of a sprite
+//
+class SpriteDef
+{
+public:
+ SpriteDef(KConfigBase &config);
+
+ SpriteObject *create( QCanvas *c );
+
+protected:
+ void read(KConfigBase &config);
+
+protected:
+ SpriteRange mDirX;
+ SpriteRange mDirY;
+ SpriteRange mStartX;
+ SpriteRange mStartY;
+ SpriteRange mEndX;
+ SpriteRange mEndY;
+ int mLifeSpan;
+ int mZ;
+ SpritePixmapSequence *mSeq;
+};
+
+//---------------------------------------------------------------------------
+//
+// SpriteGroup
+//
+class SpriteGroup
+{
+public:
+ SpriteGroup(QCanvas *c, KConfigBase &config);
+
+ void next();
+ void refresh();
+ int refreshTime() const { return mRefresh.random(); }
+
+protected:
+ void read(KConfigBase &config);
+
+protected:
+ QPtrList<SpriteDef> mAvailable;
+ QPtrList<SpriteObject> mActive;
+ int mCount;
+ SpriteRange mRefresh;
+ QCanvas *mCanvas;
+};
+
+#endif // SPRITEANIM_H
+
diff --git a/ktux/spritemisc.cpp b/ktux/spritemisc.cpp
new file mode 100644
index 0000000..f3a9a73
--- /dev/null
+++ b/ktux/spritemisc.cpp
@@ -0,0 +1,69 @@
+//-----------------------------------------------------------------------------
+//
+// spritemisc
+//
+// Copyright (c) Martin R. Jones 1999
+//
+
+#include <kapplication.h>
+#include "spritemisc.h"
+
+QSize SpriteRange::mFieldSize;
+
+SpriteRange::SpriteRange(const QString &str)
+{
+ set(str);
+}
+
+int SpriteRange::random() const
+{
+ int val = mMin;
+
+ if (mMax != mMin)
+ {
+ val = (KApplication::random()%(mMax-mMin)) + mMin;
+ }
+
+ return val;
+}
+
+void SpriteRange::set(const QString &str)
+{
+ int r = str.find("..");
+
+ if (r > 0)
+ {
+ mMin = parse(str.left(r));
+ mMax = parse(str.mid(r+2, 10));
+ }
+ else
+ {
+ mMin = mMax = parse(str);
+ }
+}
+
+void SpriteRange::setFieldSize(const QSize &size)
+{
+ mFieldSize = size;
+}
+
+int SpriteRange::parse(const QString &str)
+{
+ int val = 0;
+
+ if (str == "WIDTH")
+ {
+ val = mFieldSize.width();
+ }
+ else if (str == "HEIGHT")
+ {
+ val = mFieldSize.height();
+ }
+ else
+ {
+ val = str.toInt();
+ }
+
+ return val;
+}
+
diff --git a/ktux/spritemisc.h b/ktux/spritemisc.h
new file mode 100644
index 0000000..0a0d058
--- /dev/null
+++ b/ktux/spritemisc.h
@@ -0,0 +1,41 @@
+//-----------------------------------------------------------------------------
+//
+// spritemisc
+//
+// Copyright (c) Martin R. Jones 1999
+//
+
+#ifndef __SPRITEMISC_H__
+#define __SPRITEMISC_H__
+
+#include <qstring.h>
+#include <qsize.h>
+
+class SpriteRange
+{
+public:
+ SpriteRange(const QString &str);
+ SpriteRange(int l=0, int h=0) : mMin(l), mMax(h) {}
+
+ int min() const { return mMin; }
+ int max() const { return mMax; }
+
+ int random() const;
+
+ void set(int l, int h) { mMin=l; mMax=h; }
+ void set(const QString &str);
+
+ static void setFieldSize(const QSize &size);
+ static QSize fieldSize() { return mFieldSize; }
+
+protected:
+ int parse(const QString &str);
+
+protected:
+ int mMin;
+ int mMax;
+ static QSize mFieldSize;
+};
+
+#endif
+
diff --git a/ktux/spritepm.cpp b/ktux/spritepm.cpp
new file mode 100644
index 0000000..ec9ba47
--- /dev/null
+++ b/ktux/spritepm.cpp
@@ -0,0 +1,176 @@
+//---------------------------------------------------------------------------
+//
+// spritepm.cpp
+//
+// Copyright (c) 1999 Martin R. Jones <mjones@kde.org>
+//
+
+#include <stdlib.h>
+#include <kdebug.h>
+#include "spritepm.h"
+
+// static
+SpritePixmapManager *SpritePixmapManager::mManager = 0;
+
+//---------------------------------------------------------------------------
+//
+// Constructor
+//
+SpritePixmapManager::SpritePixmapManager()
+ : mPixmapDir(".")
+{
+ mPixmaps.setAutoDelete(true);
+}
+
+//---------------------------------------------------------------------------
+//
+// Destructor
+//
+SpritePixmapManager::~SpritePixmapManager()
+{
+}
+
+//---------------------------------------------------------------------------
+//
+// Load an image into the image manager
+//
+// Returns:
+// pointer to pixmap if loaded successfully, 0 otherwise.
+//
+const QPixmap *SpritePixmapManager::load(const QString & img)
+{
+ QPixmap *pixmap = mPixmaps.find(img);
+
+ if (!pixmap)
+ {
+ // pixmap has not yet been loaded.
+ kdDebug() << "Reading pixmap: " << img << endl;
+ QString path = mPixmapDir + QString("/") + img;
+ pixmap = new QPixmap(path);
+
+ if (!pixmap->isNull())
+ {
+ mPixmaps.insert(img,pixmap);
+ }
+ else
+ {
+ delete pixmap;
+ pixmap = 0;
+ kdDebug() << "read failed" << endl;;
+ }
+ }
+
+ return pixmap;
+}
+
+//---------------------------------------------------------------------------
+//
+// returns a pointer to the pixmap manager.
+//
+SpritePixmapManager *SpritePixmapManager::manager()
+{
+ if (!mManager)
+ {
+ mManager = new SpritePixmapManager();
+ }
+
+ return mManager;
+}
+
+//===========================================================================
+//
+SpritePixmapSequence::SpritePixmapSequence(QPtrList<QPixmap> pm, QPtrList<QPoint> hs,
+ QMemArray<int> d)
+ : QCanvasPixmapArray(pm, hs), mDelays(d)
+{
+}
+
+// static
+SpriteSequenceManager *SpriteSequenceManager::mManager = 0;
+
+//===========================================================================
+//
+// Constructor
+//
+SpriteSequenceManager::SpriteSequenceManager()
+{
+ mSprites.setAutoDelete(true);
+}
+
+//---------------------------------------------------------------------------
+//
+// Destructor
+//
+SpriteSequenceManager::~SpriteSequenceManager()
+{
+}
+
+//---------------------------------------------------------------------------
+//
+// Load an image into the sprite manager
+//
+// Returns:
+// pointer to sprite if loaded successfully, 0 otherwise.
+//
+SpritePixmapSequence *SpriteSequenceManager::load(KConfigBase &config,
+ const QString & name)
+{
+ SpritePixmapSequence *sprite = mSprites.find(name);
+
+ if (!sprite)
+ {
+ kdDebug() << "Reading sprite: " << name << endl;
+ config.setGroup(name);
+ sprite = read(config);
+ if (sprite)
+ {
+ mSprites.insert(name, sprite);
+ }
+ }
+
+ return sprite;
+}
+
+//---------------------------------------------------------------------------
+//
+SpritePixmapSequence *SpriteSequenceManager::read(KConfigBase &config)
+{
+ QStrList strImages;
+ QStrList strDelays;
+ QPtrList<QPixmap> pixmaps;
+ QPtrList<QPoint> hotspots;
+
+ int frames = config.readListEntry("Images", strImages);
+ config.readListEntry("Delays", strDelays);
+
+ QMemArray<int> delays(frames);
+
+ for (int i = 0; i < frames; i++)
+ {
+ const QPixmap *pixmap =
+ SpritePixmapManager::manager()->load(strImages.at(i));
+ if (pixmap)
+ {
+ pixmaps.append(pixmap);
+ hotspots.append(new QPoint(0,0));
+ delays[i] = atoi(strDelays.at(i));
+ }
+ }
+
+ return new SpritePixmapSequence(pixmaps, hotspots, delays);
+}
+
+//---------------------------------------------------------------------------
+//
+// returns a pointer to the sprite manager.
+//
+SpriteSequenceManager *SpriteSequenceManager::manager()
+{
+ if (!mManager)
+ {
+ mManager = new SpriteSequenceManager();
+ }
+
+ return mManager;
+}
+
diff --git a/ktux/spritepm.h b/ktux/spritepm.h
new file mode 100644
index 0000000..e9f24be
--- /dev/null
+++ b/ktux/spritepm.h
@@ -0,0 +1,85 @@
+//---------------------------------------------------------------------------
+//
+// spritepm.h
+//
+// Copyright (c) 1999 Martin R. Jones <mjones@kde.org>
+//
+
+#ifndef SPRITEPM_H
+#define SPRITEPM_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <qdict.h>
+#include <qpixmap.h>
+#include <qcanvas.h>
+#include <kconfigbase.h>
+#include <ksimpleconfig.h>
+
+//---------------------------------------------------------------------------
+//
+// SpritePixmapManager stores the frames used in animations.
+//
+class SpritePixmapManager
+{
+public:
+ SpritePixmapManager();
+ virtual ~SpritePixmapManager();
+
+ void setPixmapDir(const QString &dir)
+ { mPixmapDir = dir; }
+ void reset()
+ { mPixmapDir = "."; mPixmaps.clear(); }
+ const QPixmap *load(const QString & img);
+ const QPixmap *pixmap(const char *img) const
+ { return mPixmaps.find(img); }
+
+ static SpritePixmapManager *manager();
+
+public:
+ QString mPixmapDir; // get pixmaps from here
+ QDict<QPixmap> mPixmaps; // list of pixmaps
+ static SpritePixmapManager *mManager; // static pointer to instance
+};
+
+//---------------------------------------------------------------------------
+//
+class SpritePixmapSequence : public QCanvasPixmapArray
+{
+public:
+ SpritePixmapSequence(QPtrList<QPixmap> pm, QPtrList<QPoint> hs, QMemArray<int> d);
+
+ int delay(int i) const { return mDelays[i]; }
+
+protected:
+ QMemArray<int> mDelays;
+};
+
+//---------------------------------------------------------------------------
+//
+// SpriteManager stores the animation sequences
+//
+class SpriteSequenceManager
+{
+public:
+ SpriteSequenceManager();
+ ~SpriteSequenceManager();
+
+ SpritePixmapSequence *load(KConfigBase &config, const QString & name);
+ SpritePixmapSequence *sprite(const char *name)
+ { return mSprites.find(name); }
+
+ static SpriteSequenceManager *manager();
+
+protected:
+ SpritePixmapSequence *read(KConfigBase &config);
+
+protected:
+ QDict<SpritePixmapSequence> mSprites;
+ static SpriteSequenceManager *mManager;
+};
+
+#endif // SPRITEPM_H
+
diff --git a/ktux/sprites/Makefile.am b/ktux/sprites/Makefile.am
new file mode 100644
index 0000000..8f27a80
--- /dev/null
+++ b/ktux/sprites/Makefile.am
@@ -0,0 +1,8 @@
+# Add all of your pixmaps here
+sprite_DATA = anim0001.png anim0002.png anim0003.png anim0004.png \
+ anim0005.png anim0006.png anim0007.png anim0008.png \
+ anim0009.png anim0010.png bg.png flare0001.png \
+ flare0002.png spriterc star0001.png star0002.png
+
+# This is where it will all be installed
+spritedir = $(kde_datadir)/ktux/sprites
diff --git a/ktux/sprites/anim0001.png b/ktux/sprites/anim0001.png
new file mode 100644
index 0000000..f53aef7
--- /dev/null
+++ b/ktux/sprites/anim0001.png
Binary files differ
diff --git a/ktux/sprites/anim0002.png b/ktux/sprites/anim0002.png
new file mode 100644
index 0000000..ca06fe3
--- /dev/null
+++ b/ktux/sprites/anim0002.png
Binary files differ
diff --git a/ktux/sprites/anim0003.png b/ktux/sprites/anim0003.png
new file mode 100644
index 0000000..15c604c
--- /dev/null
+++ b/ktux/sprites/anim0003.png
Binary files differ
diff --git a/ktux/sprites/anim0004.png b/ktux/sprites/anim0004.png
new file mode 100644
index 0000000..b48da81
--- /dev/null
+++ b/ktux/sprites/anim0004.png
Binary files differ
diff --git a/ktux/sprites/anim0005.png b/ktux/sprites/anim0005.png
new file mode 100644
index 0000000..3c308ec
--- /dev/null
+++ b/ktux/sprites/anim0005.png
Binary files differ
diff --git a/ktux/sprites/anim0006.png b/ktux/sprites/anim0006.png
new file mode 100644
index 0000000..debe245
--- /dev/null
+++ b/ktux/sprites/anim0006.png
Binary files differ
diff --git a/ktux/sprites/anim0007.png b/ktux/sprites/anim0007.png
new file mode 100644
index 0000000..48ce5c8
--- /dev/null
+++ b/ktux/sprites/anim0007.png
Binary files differ
diff --git a/ktux/sprites/anim0008.png b/ktux/sprites/anim0008.png
new file mode 100644
index 0000000..2a299a4
--- /dev/null
+++ b/ktux/sprites/anim0008.png
Binary files differ
diff --git a/ktux/sprites/anim0009.png b/ktux/sprites/anim0009.png
new file mode 100644
index 0000000..11c4ea6
--- /dev/null
+++ b/ktux/sprites/anim0009.png
Binary files differ
diff --git a/ktux/sprites/anim0010.png b/ktux/sprites/anim0010.png
new file mode 100644
index 0000000..2d5cbf8
--- /dev/null
+++ b/ktux/sprites/anim0010.png
Binary files differ
diff --git a/ktux/sprites/bg.png b/ktux/sprites/bg.png
new file mode 100644
index 0000000..2ddefdb
--- /dev/null
+++ b/ktux/sprites/bg.png
Binary files differ
diff --git a/ktux/sprites/flare0001.png b/ktux/sprites/flare0001.png
new file mode 100644
index 0000000..0e7b146
--- /dev/null
+++ b/ktux/sprites/flare0001.png
Binary files differ
diff --git a/ktux/sprites/flare0002.png b/ktux/sprites/flare0002.png
new file mode 100644
index 0000000..46c9366
--- /dev/null
+++ b/ktux/sprites/flare0002.png
Binary files differ
diff --git a/ktux/sprites/spriterc b/ktux/sprites/spriterc
new file mode 100644
index 0000000..16e3929
--- /dev/null
+++ b/ktux/sprites/spriterc
@@ -0,0 +1,62 @@
+[Config]
+Groups=G_Ship,G_Star,G_Flare
+Background=bg.ppm
+
+# Ship
+[G_Ship]
+Animations=O_Fly
+Count=1
+Refresh=4000
+
+[O_Fly]
+Animation=A_Base
+DirectionX=5
+DirectionY=2
+StartX=-250
+StartY=-300..HEIGHT
+EndX=WIDTH
+EndY=HEIGHT
+Z=100
+
+[A_Base]
+Images=anim0001.png,anim0002.png,anim0003.png,anim0004.png,anim0005.png,anim0006.png,anim0007.png,anim0008.png,anim0009.png,anim0010.png
+Delays=1,1,1,1,1,1,1,1,1,1
+
+# Star
+[G_Star]
+Animations=O_Star
+Count=10
+Refresh=100..500
+
+[O_Star]
+Animation=A_Star
+DirectionX=0
+DirectionY=0
+StartX=0..WIDTH
+StartY=0..HEIGHT
+LifeSpan=2000
+Z=5
+
+[A_Star]
+Images=star0001.png,star0002.png
+Delays=3,3
+
+# Flare
+[G_Flare]
+Animations=O_Flare
+Count=2
+Refresh=500..5000
+
+[O_Flare]
+Animation=A_Flare
+DirectionX=0
+DirectionY=0
+StartX=0..WIDTH
+StartY=0..HEIGHT
+LifeSpan=110
+Z=10
+
+[A_Flare]
+Images=flare0001.png,flare0002.png,flare0001.png
+Delays=5,100,5
+
diff --git a/ktux/sprites/star0001.png b/ktux/sprites/star0001.png
new file mode 100644
index 0000000..9913b17
--- /dev/null
+++ b/ktux/sprites/star0001.png
Binary files differ
diff --git a/ktux/sprites/star0002.png b/ktux/sprites/star0002.png
new file mode 100644
index 0000000..a42d0e7
--- /dev/null
+++ b/ktux/sprites/star0002.png
Binary files differ
diff --git a/kweather/AUTHORS b/kweather/AUTHORS
new file mode 100644
index 0000000..7aa0c0f
--- /dev/null
+++ b/kweather/AUTHORS
@@ -0,0 +1,2 @@
+Ian Reinhart Geiser <geiseri@kde.org>
+Nadeem Hasan <nhasan@kde.org>
diff --git a/kweather/Makefile.am b/kweather/Makefile.am
new file mode 100644
index 0000000..4db22b5
--- /dev/null
+++ b/kweather/Makefile.am
@@ -0,0 +1,81 @@
+SUBDIRS = graphics
+
+METASOURCES = AUTO
+INCLUDES = $(all_includes)
+
+check_PROGRAMS = sun_test stationdatabase_test metar_parser_test
+bin_PROGRAMS = kweatherservice
+lib_LTLIBRARIES =
+kdeinit_LTLIBRARIES = kweatherreport.la
+kde_module_LTLIBRARIES = weather_panelapplet.la kcm_weather.la kcm_weatherservice.la
+
+sun_test_SOURCES = sun_test.cpp sun.cpp
+sun_test_LDFLAGS = $(all_libraries)
+sun_test_LDADD = -lqt-mt
+
+stationdatabase_test_SOURCES = stationdatabase_test.cpp stationdatabase.cpp
+stationdatabase_test_LDFLAGS = $(all_libraries)
+stationdatabase_test_LDADD = -lqt-mt -lkdecore
+
+metar_parser_test_SOURCES = metar_parser_test.cpp metar_parser.cpp\
+ stationdatabase.cpp sun.cpp
+metar_parser_test_LDFLAGS = $(all_libraries)
+metar_parser_test_LDADD = -lqt-mt -lkdecore
+
+weather_panelapplet_la_SOURCES = reportview.cpp kweather.cpp dockwidget.cpp \
+ weatherIface.skel weatherservice.stub \
+ weatherbutton.cpp
+weather_panelapplet_la_LDFLAGS = $(KDE_PLUGIN) -module $(all_libraries)
+weather_panelapplet_la_LIBADD = $(LIB_KHTML)
+
+appletdir = $(kde_datadir)/kicker/applets
+applet_DATA = kweather.desktop
+
+stationdir = $(kde_datadir)/kweatherservice
+station_DATA = stations.dat
+
+kcm_weather_la_SOURCES = kcmweather.cpp prefdialogdata.ui weatherservice.stub
+kcm_weather_la_LDFLAGS = -module $(KDE_PLUGIN) $(KDE_RPATH) $(all_libraries) \
+ -avoid-version -no-undefined
+kcm_weather_la_LIBADD = $(LIB_KDEUI) $(LIB_KIO)
+
+kcm_weatherservice_la_SOURCES = kcmweatherservice.cpp serviceconfigwidget.cpp \
+ serviceconfigdata.ui weatherservice.stub
+kcm_weatherservice_la_LDFLAGS = -module $(KDE_PLUGIN) $(KDE_RPATH) $(all_libraries) \
+ -avoid-version -no-undefined
+kcm_weatherservice_la_LIBADD = $(LIB_KDEUI)
+
+#weather_sidebar_la_SOURCES = sidebarwidgetbase.ui sidebarwidget.cpp dockwidget.cpp weatherbar.cpp weatherbar.skel
+#weather_sidebar_la_LDFLAGS = $(all_libraries) -module -no-undefined
+#weather_sidebar_la_LIBADD = $(LIB_KPARTS) $(LIB_KFILE) -lkonqsidebarplugin
+
+#globalentrydir = $(kde_datadir)/konqsidebartng/entries
+#globalentry_DATA = weatherbar.desktop
+
+#globaladddir = $(kde_datadir)/konqsidebartng/add
+#globaladd_DATA = weatherbar_add.desktop
+
+kweatherservice_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+kweatherservice_LDADD = $(LIB_KIO)
+kweatherservice_SOURCES = main.cpp metar_parser.cpp weatherlib.cpp \
+ weatherservice.cpp weatherservice.skel \
+ stationdatabase.cpp sun.cpp weatherservice.stub
+
+service_DATA = kweatherservice.desktop
+servicedir = $(kde_servicesdir)
+
+kde_services_DATA = kcmweather.desktop kcmweatherservice.desktop
+
+kweatherreport_la_LDFLAGS = $(all_libraries) $(KDE_RPATH) -module -avoid-version
+kweatherreport_la_LIBADD = $(LIB_KHTML) reportview.lo
+kweatherreport_la_SOURCES = reportmain.cpp weatherservice.stub
+
+KDE_ICON = kweather
+
+kweatherdatadir = $(kde_datadir)/kweatherservice
+kweatherdata_DATA = weather_stations.desktop
+
+messages: rc.cpp
+ $(EXTRACTRC) *.ui > rc.cpp
+ $(XGETTEXT) rc.cpp *.cpp *.h -o $(podir)/kweather.pot
+ rm -f rc.cpp
diff --git a/kweather/configure.in.in b/kweather/configure.in.in
new file mode 100644
index 0000000..4fab26d
--- /dev/null
+++ b/kweather/configure.in.in
@@ -0,0 +1 @@
+#DO_NOT_COMPILE="$DO_NOT_COMPILE kweather"
diff --git a/kweather/dockwidget.cpp b/kweather/dockwidget.cpp
new file mode 100644
index 0000000..6d9dd92
--- /dev/null
+++ b/kweather/dockwidget.cpp
@@ -0,0 +1,467 @@
+/***************************************************************************
+ dockwidget.cpp - description
+ -------------------
+ begin : Thu Jul 6 2000
+ copyright : (C) 2000-2003 by Ian Reinhart Geiser
+ : (C) 2002-2003 Nadeem Hasan <nhasan@kde.org>
+ email : geiseri@msoe.edu
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "dockwidget.h"
+#include "weatherbutton.h"
+#include "weatherservice_stub.h"
+
+#include <qtooltip.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qtimer.h>
+#include <qobjectlist.h>
+
+#include <kdebug.h>
+#include <kglobalsettings.h>
+#include <klocale.h>
+
+dockwidget::dockwidget(const QString &location, QWidget *parent,
+ const char *name) : QWidget(parent,name), m_locationCode( location ), m_orientation( Horizontal )
+{
+ m_font = KGlobalSettings::generalFont();
+ setBackgroundOrigin( AncestorOrigin );
+ initDock();
+ connect(m_button, SIGNAL( clicked() ), SIGNAL( buttonClicked() ));
+
+ m_weatherService = new WeatherService_stub( "KWeatherService", "WeatherService" );
+}
+
+dockwidget::~dockwidget()
+{
+ delete m_weatherService;
+}
+
+void dockwidget::setLocationCode(const QString &locationCode)
+{
+ m_locationCode = locationCode;
+ showWeather();
+}
+
+void dockwidget::setViewMode(int _mode)
+{
+ kdDebug(12004) << "View mode " << _mode << endl;
+ m_mode = _mode;
+ if (m_mode == ShowIconOnly)
+ {
+ m_lblTemp->hide();
+ m_lblWind->hide();
+ m_lblPres->hide();
+ }
+ else if (m_mode == ShowTempOnly)
+ {
+ m_lblTemp->show();
+ m_lblWind->hide();
+ m_lblPres->hide();
+ }
+ else if (m_mode == ShowAll)
+ {
+ m_lblTemp->show();
+ m_lblWind->show();
+ m_lblPres->show();
+ }
+}
+
+void dockwidget::showWeather()
+{
+ QString tip = "<qt>";
+
+ QString temp = "?";
+ QString wind = "?";
+ QString pressure = "?";
+
+ if ( !m_locationCode.isEmpty() )
+ {
+ temp = m_weatherService->temperature( m_locationCode );
+ wind = m_weatherService->wind( m_locationCode );
+ pressure = m_weatherService->pressure( m_locationCode );
+
+ QString dewPoint = m_weatherService->dewPoint( m_locationCode);
+ QString relHumidity = m_weatherService->relativeHumidity( m_locationCode );
+ QString heatIndex = m_weatherService->heatIndex( m_locationCode );
+ QString windChill = m_weatherService->windChill( m_locationCode );
+ QString sunRiseTime = m_weatherService->sunRiseTime( m_locationCode );
+ QString sunSetTime = m_weatherService->sunSetTime( m_locationCode );
+
+ tip += "<h3><center><nobr>" +
+ m_weatherService->stationName( m_locationCode ) + " (" +
+ m_weatherService->stationCountry( m_locationCode ) + ")</nobr></center></h3>";
+
+ if ( m_weatherService->currentIconString( m_locationCode ) == "dunno" ) // no data
+ tip += "<center><nobr>" + i18n("The network is currently offline...") + "</nobr></center>";
+
+ tip += QString("<br><table>"
+ "<tr><th><nobr>" + i18n( "Temperature:" ) + "</nobr></th><td><nobr>%1</nobr></td>"
+ "<th><nobr>" + i18n( "Dew Point:" ) + "</nobr></th><td><nobr>%2</nobr></td></nobr></tr>"
+
+ "<tr><th><nobr>" + i18n( "Air Pressure:" ) + "</nobr></th><td><nobr>%3</nobr></td>"
+ "<th><nobr>" + i18n( "Rel. Humidity:" ) + "</nobr></th><td><nobr>%4</nobr></td></nobr></tr>"
+
+ "<tr><th><nobr>" + i18n( "Wind Speed:" ) + "</nobr></th><td><nobr>%5</nobr></td>")
+ .arg(temp).arg(dewPoint).arg(pressure).arg(relHumidity).arg(wind);
+
+ if ( !heatIndex.isEmpty() )
+ tip += QString("<th><nobr>" + i18n( "Heat Index:" ) + "</nobr></th><td><nobr>%1</nobr></td>").arg(heatIndex);
+ else if ( !windChill.isEmpty() )
+ tip += QString("<th><nobr>" + i18n( "Wind Chill:" ) + "</nobr></th><td><nobr>%1</nobr></td>").arg(windChill);
+ else
+ tip += "<td>&nbsp;</td><td>&nbsp;</td>";
+ tip += "</tr>";
+
+ tip += QString("<tr><th><nobr>" + i18n( "Sunrise:" ) + "</nobr></th><td><nobr>%1</nobr></td>" +
+ "<th><nobr>" + i18n( "Sunset:" ) + "</nobr></th><td><nobr>%2</nobr></td>")
+ .arg(sunRiseTime).arg(sunSetTime);
+
+ tip += "</tr></table>";
+
+ if ( m_weatherService->stationNeedsMaintenance( m_locationCode ) )
+ {
+ tip += "<br>" + i18n("Station reports that it needs maintenance\n"
+ "Please try again later");
+ }
+ }
+ else
+ {
+ tip += i18n("Temperature: ") + temp + "<br>";
+ tip += i18n("\nWind: ") + wind + "<br>";
+ tip += i18n("\nAir pressure: ") + pressure + "<br>";
+ }
+
+ tip += "</qt>";
+
+ // On null or empty location code, or if the station needs maintenance, this will return the dunno icon.
+ QPixmap icon = m_weatherService->icon( m_locationCode );
+
+ QToolTip::remove(this);
+ QToolTip::add(this, tip);
+
+ kdDebug(12004) << "show weather: " << endl;
+ kdDebug(12004) << "location: " << m_locationCode << endl;
+ kdDebug(12004) << "temp,wind,pressure: " << temp << " " << wind << " " << pressure << endl;
+ kdDebug(12004) << "tip: " << tip << endl;
+
+ m_lblTemp->setText(temp);
+ m_lblWind->setText(wind);
+ m_lblPres->setText(pressure);
+
+ m_button->setPixmap( icon );
+}
+
+void dockwidget::initDock()
+{
+ kdDebug(12004) << "Init dockwidget " << endl;
+
+ m_button= new WeatherButton(this,"m_button");
+
+ m_lblTemp= new QLabel(this,"lblTemp");
+ m_lblWind= new QLabel(this,"lblWind");
+ m_lblPres= new QLabel(this,"lblPres");
+
+ m_lblTemp->setBackgroundOrigin(AncestorOrigin);
+ m_lblWind->setBackgroundOrigin(AncestorOrigin);
+ m_lblPres->setBackgroundOrigin(AncestorOrigin);
+
+ m_lblTemp->setMargin(0);
+ m_lblWind->setMargin(0);
+ m_lblPres->setMargin(0);
+
+ QBoxLayout *mainLayout = new QBoxLayout(this, QBoxLayout::TopToBottom);
+ mainLayout->setSpacing(0);
+ mainLayout->setMargin(0);
+ mainLayout->addWidget(m_button, 0, Qt::AlignCenter);
+
+ QBoxLayout *layout = new QBoxLayout(mainLayout, QBoxLayout::TopToBottom);
+ layout->setSpacing(0);
+ layout->setMargin(0);
+ layout->addWidget(m_lblTemp);
+ layout->addWidget(m_lblWind);
+ layout->addWidget(m_lblPres);
+
+ mainLayout->addSpacing(8);
+
+ updateFont();
+
+ QTimer::singleShot( 0, this, SLOT( showWeather() ) );
+}
+
+/** resize the view **/
+void dockwidget::resizeView( const QSize &size )
+{
+ kdDebug(12004) << "Changing to size " << size << endl;
+ resize(size);
+
+ if ( m_orientation == Horizontal ) // Kicker in horizontal mode
+ {
+ int h = size.height();
+
+ if ( m_mode == ShowAll )
+ {
+ if ( h <= 128 ) // left to right layout
+ {
+ static_cast<QBoxLayout*>(layout())->setDirection(QBoxLayout::LeftToRight);
+ m_lblTemp->setAlignment(Qt::AlignAuto | Qt::AlignVCenter);
+ m_lblWind->setAlignment(Qt::AlignAuto | Qt::AlignVCenter);
+ m_lblPres->setAlignment(Qt::AlignAuto | Qt::AlignVCenter);
+ }
+ else // top to bottom
+ {
+ static_cast<QBoxLayout*>(layout())->setDirection(QBoxLayout::TopToBottom);
+ QFontMetrics fm(m_font);
+ h = 128 - (3 * fm.height()); // 3 lines of text below the button
+ m_lblTemp->setAlignment(Qt::AlignCenter);
+ m_lblWind->setAlignment(Qt::AlignCenter);
+ m_lblPres->setAlignment(Qt::AlignCenter);
+ }
+ m_button->setFixedSize(h, h);
+ }
+ else if ( m_mode == ShowTempOnly )
+ {
+ if ( h <= 32 ) // left to right
+ {
+ static_cast<QBoxLayout*>(layout())->setDirection(QBoxLayout::LeftToRight);
+ m_lblTemp->setAlignment(Qt::AlignAuto | Qt::AlignVCenter);
+ }
+ else // top to bottom
+ {
+ static_cast<QBoxLayout*>(layout())->setDirection(QBoxLayout::TopToBottom);
+ QFontMetrics fm(m_font);
+ h = QMIN(128, h) - fm.height();
+ m_lblTemp->setAlignment(Qt::AlignCenter);
+ }
+ m_button->setFixedSize(h, h);
+ }
+ else
+ {
+ h = QMIN(h, 128);
+ m_button->setFixedSize(h, h);
+ }
+ }
+ else // Kicker in vertical mode
+ {
+ int w = size.width();
+ int h = size.height();
+
+ if ( m_mode == ShowAll )
+ {
+ if ( w <= 128 ) // top to bottom
+ {
+ static_cast<QBoxLayout*>(layout())->setDirection(QBoxLayout::TopToBottom);
+ m_lblTemp->setAlignment(Qt::AlignCenter);
+ m_lblWind->setAlignment(Qt::AlignCenter);
+ m_lblPres->setAlignment(Qt::AlignCenter);
+
+ QFontMetrics fm(m_font);
+ h = h - (3 * fm.height()); // 3 lines of text below the button
+ h = QMIN(w, h);
+ }
+ else // left to right layout
+ {
+ static_cast<QBoxLayout*>(layout())->setDirection(QBoxLayout::LeftToRight);
+ m_lblTemp->setAlignment(Qt::AlignAuto | Qt::AlignVCenter);
+ m_lblWind->setAlignment(Qt::AlignAuto | Qt::AlignVCenter);
+ m_lblPres->setAlignment(Qt::AlignAuto | Qt::AlignVCenter);
+ }
+ m_button->setFixedSize(h, h);
+ }
+ else if ( m_mode == ShowTempOnly )
+ {
+ if ( w <= 128 ) // top to bottom
+ {
+ static_cast<QBoxLayout*>(layout())->setDirection(QBoxLayout::TopToBottom);
+ m_lblTemp->setAlignment(Qt::AlignCenter);
+
+ h = w;
+ }
+ else // left to right layout
+ {
+ static_cast<QBoxLayout*>(layout())->setDirection(QBoxLayout::LeftToRight);
+ m_lblTemp->setAlignment(Qt::AlignAuto | Qt::AlignVCenter);
+
+ h = static_cast<int>(w * 0.33);
+ }
+ m_button->setFixedSize(h, h);
+ }
+ else
+ {
+ w = QMIN(w, 128);
+ m_button->setFixedSize(w, w);
+ }
+ }
+}
+
+int dockwidget::widthForHeight(int h)
+{
+ int w;
+ QFontInfo fi(KGlobalSettings::generalFont());
+
+ if ( m_mode == ShowAll )
+ {
+ if ( h <= 128 ) // left to right layout
+ {
+ int pixelSize = h/3 - 3;
+ pixelSize = QMIN(pixelSize, fi.pixelSize()); // don't make it too large
+ m_font.setPixelSize(pixelSize);
+ QFontMetrics fm(m_font);
+ w = h + QMAX(fm.width(m_lblWind->text()), fm.width(m_lblPres->text())) + 1;
+ }
+ else // top to bottom
+ {
+ if ( fi.pixelSize() * 3 <= (h/2) ) // half icon, half text
+ {
+ m_font = KGlobalSettings::generalFont();
+ }
+ else
+ {
+ m_font.setPixelSize(h/2/3);
+ }
+ QFontMetrics fm(m_font);
+ // size of icon
+ h = 128 - (3 * fm.height()); // 3 lines of text below the button
+ w = QMAX(fm.width(m_lblWind->text()), fm.width(m_lblPres->text())) + 1;
+ w = QMAX(h, w); // at least width of square icon
+ }
+ }
+ else if ( m_mode == ShowTempOnly )
+ {
+ if ( h <= 32 ) // left to right layout
+ {
+ int pixelSize = h - 3;
+ pixelSize = QMIN(pixelSize, fi.pixelSize()); // don't make it too large
+ m_font.setPixelSize(pixelSize);
+ QFontMetrics fm(m_font);
+ w = h + fm.width(m_lblTemp->text()) + 1;
+ }
+ else // top to bottom
+ {
+ if ( fi.pixelSize() <= (h/2) ) // half icon, half text
+ {
+ m_font = KGlobalSettings::generalFont();
+ }
+ else
+ {
+ m_font.setPixelSize(h/2);
+ }
+ QFontMetrics fm(m_font);
+ // size of icon
+ h = QMIN(128, h) - fm.height();
+ w = fm.width(m_lblTemp->text()) + 1;
+ w = QMAX(h, w); // at least width of square icon
+ }
+ }
+ else
+ {
+ w = QMIN(128, h); // don't make it too large
+ }
+
+ updateFont();
+ return w + 4;
+}
+
+int dockwidget::heightForWidth( int w )
+{
+ int h;
+
+ if ( m_mode == ShowAll )
+ {
+ QFontMetrics fmg(KGlobalSettings::generalFont());
+ int maxWidth = fmg.width("888 km/h NNWW"); // a good approximation
+
+ if ( w <= 128 ) // top to bottom
+ {
+ if ( maxWidth <= w ) // enough space to use global font
+ {
+ m_font = KGlobalSettings::generalFont();
+ }
+ else // we have to reduce the fontsize
+ {
+ m_font.setPixelSize(static_cast<int>(fmg.height() * double(w) / maxWidth));
+ }
+
+ QFontMetrics fm(m_font);
+ h = w + (3 * fm.height()); // 3 lines of text below the button
+ }
+ else
+ {
+ if ( w >= (maxWidth * 1.5) ) // half of text width shall be icon
+ {
+ m_font = KGlobalSettings::generalFont();
+ }
+ else
+ {
+ m_font.setPixelSize(static_cast<int>(fmg.height() * (w*0.66) / maxWidth));
+ }
+
+ QFontMetrics fm(m_font);
+ h = 3 * fm.height(); // 3 lines of text
+
+ }
+ }
+ else if ( m_mode == ShowTempOnly )
+ {
+ QFontMetrics fmg(KGlobalSettings::generalFont());
+ int maxWidth = fmg.width("888.88 CC"); // a good approximation
+
+ if ( w <= 128 ) // top to bottom
+ {
+ if ( maxWidth <= w ) // enough space to use global font
+ {
+ m_font = KGlobalSettings::generalFont();
+ }
+ else // we have to reduce the fontsize
+ {
+ m_font.setPixelSize(static_cast<int>(fmg.height() * double(w) / maxWidth));
+ }
+
+ QFontMetrics fm(m_font);
+ h = w + fm.height(); // text below the button
+ }
+ else
+ {
+ if ( w >= (maxWidth * 1.5) ) // half of text width shall be icon
+ {
+ m_font = KGlobalSettings::generalFont();
+ }
+ else
+ {
+ m_font.setPixelSize(static_cast<int>(fmg.height() * (w*0.66) / maxWidth));
+ }
+
+ QFontMetrics fm(m_font);
+ h = QMAX(fm.height(), static_cast<int>(w * 0.33));
+ }
+ }
+ else
+ {
+ h = QMIN(128, w); // don't make it too large
+ }
+
+ updateFont();
+ return h;
+}
+
+
+void dockwidget::updateFont()
+{
+ //kdDebug(12004) << "Update font: " << m_font.pixelSize() << endl;
+ m_lblTemp->setFont(m_font);
+ m_lblWind->setFont(m_font);
+ m_lblPres->setFont(m_font);
+}
+
+#include "dockwidget.moc"
+
+// vim:ts=4:sw=4:et
diff --git a/kweather/dockwidget.h b/kweather/dockwidget.h
new file mode 100644
index 0000000..f61f6b1
--- /dev/null
+++ b/kweather/dockwidget.h
@@ -0,0 +1,74 @@
+/***************************************************************************
+ dockwidget.h - description
+ -------------------
+ begin : Thu Jul 6 2000
+ copyright : (C) 2000-2003 by Ian Reinhart Geiser
+ : (C) 2002-2003 Nadeem Hasan <nhasan@kde.org>
+ email : geiseri@msoe.edu
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+#ifndef DOCKWIDGET_H
+#define DOCKWIDGET_H
+
+#include <qfont.h>
+#include <qpixmap.h>
+#include <qwidget.h>
+
+#include <dcopref.h>
+
+class QLabel;
+class WeatherService_stub;
+class WeatherButton;
+
+class dockwidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ dockwidget(const QString &location, QWidget *parent=0, const char *name=0);
+ ~dockwidget();
+
+ enum {ShowIconOnly=1, ShowTempOnly=2, ShowAll=3 };
+
+ void setLocationCode(const QString &locationCode);
+ void setViewMode(int);
+ void setOrientation(Orientation o) { m_orientation = o; }
+ /** resize the view **/
+ void resizeView(const QSize &size);
+ int widthForHeight(int h);
+ int heightForWidth(int w);
+
+public slots:
+ void showWeather();
+
+signals: // Signals
+ void buttonClicked();
+
+private:
+ void initDock();
+ void updateFont();
+
+ int m_mode;
+ QString m_locationCode;
+ QFont m_font;
+ QPixmap m_icon;
+ WeatherButton *m_button;
+ QLabel *m_lblTemp;
+ QLabel *m_lblWind;
+ QLabel *m_lblPres;
+ Orientation m_orientation;
+
+ WeatherService_stub *m_weatherService;
+};
+
+#endif
+
+// vim:ts=4:sw=4:et
diff --git a/kweather/graphics/Makefile.am b/kweather/graphics/Makefile.am
new file mode 100644
index 0000000..c87fc25
--- /dev/null
+++ b/kweather/graphics/Makefile.am
@@ -0,0 +1,2 @@
+wdir = $(kde_datadir)/kweather
+w_DATA = overcast.png sunny.png dunno.png cloudy1.png cloudy2.png cloudy3.png cloudy4.png cloudy5.png fog.png hail.png light_rain.png mist.png shower1.png shower2.png shower3.png sleet.png snow1.png snow2.png snow3.png snow4.png snow5.png tstorm1.png tstorm2.png tstorm3.png cloudy1_night.png cloudy2_night.png cloudy3_night.png cloudy4_night.png fog_night.png mist_night.png shower1_night.png shower2_night.png snow1_night.png snow2_night.png snow3_night.png sunny_night.png tstorm1_night.png tstorm2_night.png
diff --git a/kweather/graphics/cloudy1.png b/kweather/graphics/cloudy1.png
new file mode 100644
index 0000000..7cdeb26
--- /dev/null
+++ b/kweather/graphics/cloudy1.png
Binary files differ
diff --git a/kweather/graphics/cloudy1_night.png b/kweather/graphics/cloudy1_night.png
new file mode 100644
index 0000000..703f68d
--- /dev/null
+++ b/kweather/graphics/cloudy1_night.png
Binary files differ
diff --git a/kweather/graphics/cloudy2.png b/kweather/graphics/cloudy2.png
new file mode 100644
index 0000000..88a5f41
--- /dev/null
+++ b/kweather/graphics/cloudy2.png
Binary files differ
diff --git a/kweather/graphics/cloudy2_night.png b/kweather/graphics/cloudy2_night.png
new file mode 100644
index 0000000..93cdacf
--- /dev/null
+++ b/kweather/graphics/cloudy2_night.png
Binary files differ
diff --git a/kweather/graphics/cloudy3.png b/kweather/graphics/cloudy3.png
new file mode 100644
index 0000000..c9658e9
--- /dev/null
+++ b/kweather/graphics/cloudy3.png
Binary files differ
diff --git a/kweather/graphics/cloudy3_night.png b/kweather/graphics/cloudy3_night.png
new file mode 100644
index 0000000..53bef9c
--- /dev/null
+++ b/kweather/graphics/cloudy3_night.png
Binary files differ
diff --git a/kweather/graphics/cloudy4.png b/kweather/graphics/cloudy4.png
new file mode 100644
index 0000000..810a81d
--- /dev/null
+++ b/kweather/graphics/cloudy4.png
Binary files differ
diff --git a/kweather/graphics/cloudy4_night.png b/kweather/graphics/cloudy4_night.png
new file mode 100644
index 0000000..c08ba19
--- /dev/null
+++ b/kweather/graphics/cloudy4_night.png
Binary files differ
diff --git a/kweather/graphics/cloudy5.png b/kweather/graphics/cloudy5.png
new file mode 100644
index 0000000..4c45c43
--- /dev/null
+++ b/kweather/graphics/cloudy5.png
Binary files differ
diff --git a/kweather/graphics/dunno.png b/kweather/graphics/dunno.png
new file mode 100644
index 0000000..07358ec
--- /dev/null
+++ b/kweather/graphics/dunno.png
Binary files differ
diff --git a/kweather/graphics/fog.png b/kweather/graphics/fog.png
new file mode 100644
index 0000000..771d713
--- /dev/null
+++ b/kweather/graphics/fog.png
Binary files differ
diff --git a/kweather/graphics/fog_night.png b/kweather/graphics/fog_night.png
new file mode 100644
index 0000000..035444c
--- /dev/null
+++ b/kweather/graphics/fog_night.png
Binary files differ
diff --git a/kweather/graphics/hail.png b/kweather/graphics/hail.png
new file mode 100644
index 0000000..4343f79
--- /dev/null
+++ b/kweather/graphics/hail.png
Binary files differ
diff --git a/kweather/graphics/light_rain.png b/kweather/graphics/light_rain.png
new file mode 100644
index 0000000..b9ba7c7
--- /dev/null
+++ b/kweather/graphics/light_rain.png
Binary files differ
diff --git a/kweather/graphics/mist.png b/kweather/graphics/mist.png
new file mode 100644
index 0000000..bbc3a5c
--- /dev/null
+++ b/kweather/graphics/mist.png
Binary files differ
diff --git a/kweather/graphics/mist_night.png b/kweather/graphics/mist_night.png
new file mode 100644
index 0000000..bcf9dd2
--- /dev/null
+++ b/kweather/graphics/mist_night.png
Binary files differ
diff --git a/kweather/graphics/overcast.png b/kweather/graphics/overcast.png
new file mode 100644
index 0000000..4c45c43
--- /dev/null
+++ b/kweather/graphics/overcast.png
Binary files differ
diff --git a/kweather/graphics/shower1.png b/kweather/graphics/shower1.png
new file mode 100644
index 0000000..94e4871
--- /dev/null
+++ b/kweather/graphics/shower1.png
Binary files differ
diff --git a/kweather/graphics/shower1_night.png b/kweather/graphics/shower1_night.png
new file mode 100644
index 0000000..40e8900
--- /dev/null
+++ b/kweather/graphics/shower1_night.png
Binary files differ
diff --git a/kweather/graphics/shower2.png b/kweather/graphics/shower2.png
new file mode 100644
index 0000000..11eb352
--- /dev/null
+++ b/kweather/graphics/shower2.png
Binary files differ
diff --git a/kweather/graphics/shower2_night.png b/kweather/graphics/shower2_night.png
new file mode 100644
index 0000000..fe384f8
--- /dev/null
+++ b/kweather/graphics/shower2_night.png
Binary files differ
diff --git a/kweather/graphics/shower3.png b/kweather/graphics/shower3.png
new file mode 100644
index 0000000..74dc3b4
--- /dev/null
+++ b/kweather/graphics/shower3.png
Binary files differ
diff --git a/kweather/graphics/sleet.png b/kweather/graphics/sleet.png
new file mode 100644
index 0000000..9d134f7
--- /dev/null
+++ b/kweather/graphics/sleet.png
Binary files differ
diff --git a/kweather/graphics/snow1.png b/kweather/graphics/snow1.png
new file mode 100644
index 0000000..63d4cab
--- /dev/null
+++ b/kweather/graphics/snow1.png
Binary files differ
diff --git a/kweather/graphics/snow1_night.png b/kweather/graphics/snow1_night.png
new file mode 100644
index 0000000..f75df16
--- /dev/null
+++ b/kweather/graphics/snow1_night.png
Binary files differ
diff --git a/kweather/graphics/snow2.png b/kweather/graphics/snow2.png
new file mode 100644
index 0000000..c4c1854
--- /dev/null
+++ b/kweather/graphics/snow2.png
Binary files differ
diff --git a/kweather/graphics/snow2_night.png b/kweather/graphics/snow2_night.png
new file mode 100644
index 0000000..25483a2
--- /dev/null
+++ b/kweather/graphics/snow2_night.png
Binary files differ
diff --git a/kweather/graphics/snow3.png b/kweather/graphics/snow3.png
new file mode 100644
index 0000000..3d09d1c
--- /dev/null
+++ b/kweather/graphics/snow3.png
Binary files differ
diff --git a/kweather/graphics/snow3_night.png b/kweather/graphics/snow3_night.png
new file mode 100644
index 0000000..974b89f
--- /dev/null
+++ b/kweather/graphics/snow3_night.png
Binary files differ
diff --git a/kweather/graphics/snow4.png b/kweather/graphics/snow4.png
new file mode 100644
index 0000000..30dd021
--- /dev/null
+++ b/kweather/graphics/snow4.png
Binary files differ
diff --git a/kweather/graphics/snow5.png b/kweather/graphics/snow5.png
new file mode 100644
index 0000000..c4483bc
--- /dev/null
+++ b/kweather/graphics/snow5.png
Binary files differ
diff --git a/kweather/graphics/sunny.png b/kweather/graphics/sunny.png
new file mode 100644
index 0000000..fffe5e5
--- /dev/null
+++ b/kweather/graphics/sunny.png
Binary files differ
diff --git a/kweather/graphics/sunny_night.png b/kweather/graphics/sunny_night.png
new file mode 100644
index 0000000..9872732
--- /dev/null
+++ b/kweather/graphics/sunny_night.png
Binary files differ
diff --git a/kweather/graphics/tstorm1.png b/kweather/graphics/tstorm1.png
new file mode 100644
index 0000000..e5048cc
--- /dev/null
+++ b/kweather/graphics/tstorm1.png
Binary files differ
diff --git a/kweather/graphics/tstorm1_night.png b/kweather/graphics/tstorm1_night.png
new file mode 100644
index 0000000..c35fc2f
--- /dev/null
+++ b/kweather/graphics/tstorm1_night.png
Binary files differ
diff --git a/kweather/graphics/tstorm2.png b/kweather/graphics/tstorm2.png
new file mode 100644
index 0000000..5073026
--- /dev/null
+++ b/kweather/graphics/tstorm2.png
Binary files differ
diff --git a/kweather/graphics/tstorm2_night.png b/kweather/graphics/tstorm2_night.png
new file mode 100644
index 0000000..d113626
--- /dev/null
+++ b/kweather/graphics/tstorm2_night.png
Binary files differ
diff --git a/kweather/graphics/tstorm3.png b/kweather/graphics/tstorm3.png
new file mode 100644
index 0000000..474b0da
--- /dev/null
+++ b/kweather/graphics/tstorm3.png
Binary files differ
diff --git a/kweather/hi16-app-kweather.png b/kweather/hi16-app-kweather.png
new file mode 100644
index 0000000..4985bba
--- /dev/null
+++ b/kweather/hi16-app-kweather.png
Binary files differ
diff --git a/kweather/hi32-app-kweather.png b/kweather/hi32-app-kweather.png
new file mode 100644
index 0000000..a8f5a9c
--- /dev/null
+++ b/kweather/hi32-app-kweather.png
Binary files differ
diff --git a/kweather/hi48-app-kweather.png b/kweather/hi48-app-kweather.png
new file mode 100644
index 0000000..2162177
--- /dev/null
+++ b/kweather/hi48-app-kweather.png
Binary files differ
diff --git a/kweather/kcmweather.cpp b/kweather/kcmweather.cpp
new file mode 100644
index 0000000..26b029f
--- /dev/null
+++ b/kweather/kcmweather.cpp
@@ -0,0 +1,222 @@
+/*
+ This file is part of KWeather.
+ Copyright (c) 2003 Tobias Koenig <tokoe@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ As a special exception, permission is given to link this program
+ with any edition of Qt, and distribute the resulting executable,
+ without including the source code for Qt in the source distribution.
+*/
+
+#include <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kurlrequester.h>
+#include <kcombobox.h>
+#include <kcolorbutton.h>
+
+#include "dockwidget.h"
+#include "prefdialogdata.h"
+
+#include "kcmweather.h"
+#include "weatherservice_stub.h"
+
+extern "C"
+{
+ KDE_EXPORT KCModule *create_weather( QWidget *parent, const char * )
+ {
+ return new KCMWeather( parent, "kweather" );
+ }
+}
+
+KCMWeather::KCMWeather( QWidget *parent, const char *name )
+ : KCModule( parent, name )
+{
+ mWeatherService = new WeatherService_stub( "KWeatherService",
+ "WeatherService" );
+ QVBoxLayout *layout = new QVBoxLayout( this );
+ mWidget = new prefsDialogData( this );
+
+ mWidget->m_reportLocation->setFocus();
+ layout->addWidget( mWidget );
+ layout->addStretch();
+
+ fillStationList();
+ load();
+ connect( mWidget->m_enableLog, SIGNAL( toggled( bool ) ),
+ SLOT( enableLogWidgets( bool ) ) );
+ connect( mWidget->m_viewMode, SIGNAL( released( int ) ),
+ SLOT( changeViewMode( int ) ) );
+ connect( mWidget->m_reportLocation, SIGNAL( activated( const QString& ) ),
+ SLOT( reportLocationChanged() ) );
+ connect( mWidget->m_textColor, SIGNAL( changed(const QColor &) ),
+ SLOT( textColorChanged(const QColor &) ) );
+
+ KAboutData *about = new KAboutData(
+ I18N_NOOP( "kcmweather" ),
+ I18N_NOOP( "KWeather Configure Dialog" ),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP( "(c), 2003 Tobias Koenig" ) );
+
+ about->addAuthor( "Tobias Koenig", 0, "tokoe@kde.org" );
+ setAboutData(about);
+}
+
+KCMWeather::~KCMWeather()
+{
+ delete mWeatherService;
+}
+void KCMWeather::showEvent( QShowEvent * )
+{
+ fillStationList();
+}
+
+void KCMWeather::fillStationList()
+{
+ // store current selection
+ QString current = mWidget->m_reportLocation->currentText();
+
+ mWidget->m_reportLocation->clear();
+
+ QStringList stationList = mWeatherService->listStations();
+ QStringList::Iterator idx = stationList.begin();
+
+ // get station name from station id for sorting afterwards
+ for(; idx != stationList.end(); ++idx)
+ *idx = mWeatherService->stationName(*idx);
+
+ stationList.sort();
+
+ idx = stationList.begin();
+ for(; idx != stationList.end(); ++idx)
+ mWidget->m_reportLocation->insertItem(*idx);
+
+ // restore previous selection
+ if ( current.isEmpty() )
+ {
+ // nothing defined yet; show this situation to the user, otherwise
+ // he will see the first available setting which is not what he selected to view
+ mWidget->m_reportLocation->insertItem("");
+ mWidget->m_reportLocation->setCurrentText("");
+ }
+ else
+ {
+ for (int i = 0; i < mWidget->m_reportLocation->count(); i++)
+ if ( mWidget->m_reportLocation->text(i) == current )
+ {
+ mWidget->m_reportLocation->setCurrentItem(i);
+ break;
+ }
+ }
+
+ if ( current != mWidget->m_reportLocation->currentText() )
+ reportLocationChanged();
+}
+
+void KCMWeather::changeViewMode( int mode )
+{
+ mViewMode = mode;
+ emit changed( true );
+}
+
+void KCMWeather::enableLogWidgets( bool value )
+{
+ mWidget->m_logFile->setEnabled( value );
+ mWidget->m_labelLogFile->setEnabled( value );
+
+ emit changed( true );
+}
+
+void KCMWeather::reportLocationChanged()
+{
+ kdDebug() << "New station: " << mWidget->m_reportLocation->currentText()
+ << " Code: " << mWeatherService->stationCode( mWidget->m_reportLocation->currentText() ) << endl;
+ emit changed( true );
+}
+
+void KCMWeather::textColorChanged(const QColor &)
+{
+ emit changed( true );
+}
+
+void KCMWeather::load()
+{
+ kdDebug() << "Load" << endl;
+ KConfig config( "weather_panelappletrc" );
+
+ config.setGroup( "General Options" );
+ bool enabled = config.readBoolEntry( "logging", false );
+ mWidget->m_enableLog->setChecked( enabled );
+ enableLogWidgets( enabled );
+
+ static QColor black(Qt::black);
+ QColor textColor = config.readColorEntry("textColor", &black);
+ mWidget->m_textColor->setColor(textColor);
+
+ QString loc = config.readEntry( "report_location" );
+
+ mWidget->m_logFile->setURL( config.readPathEntry( "log_file_name" ) );
+
+ if ( ! loc.isEmpty() )
+ mWidget->m_reportLocation->setCurrentText( mWeatherService->stationName( loc ) );
+
+ mWidget->m_viewMode->setButton( config.readNumEntry( "smallview_mode", dockwidget::ShowAll ) );
+ changeViewMode( config.readNumEntry( "smallview_mode", dockwidget::ShowAll ) );
+ emit changed( false );
+}
+
+void KCMWeather::save()
+{
+ kdDebug() << "Save" << endl;
+ KConfig config( "weather_panelappletrc" );
+
+ config.setGroup( "General Options" );
+ config.writeEntry( "logging", mWidget->m_enableLog->isChecked() );
+ config.writeEntry( "log_file_name", mWidget->m_logFile->url() );
+ config.writeEntry( "textColor", mWidget->m_textColor->color() );
+
+ // Station idx to local idx; if nothing selected yet, keep it empty
+ QString loc;
+ if ( ! mWidget->m_reportLocation->currentText().isEmpty() )
+ loc = mWeatherService->stationCode( mWidget->m_reportLocation->currentText() );
+ config.writeEntry( "report_location", loc);
+
+ config.writeEntry( "smallview_mode", mViewMode );
+ config.sync();
+
+ emit changed( false );
+}
+
+void KCMWeather::defaults()
+{
+ mWidget->m_enableLog->setChecked( false );
+ enableLogWidgets( false );
+
+ mWidget->m_logFile->setURL( "" );
+ mWidget->m_reportLocation->setCurrentText( "" );
+ changeViewMode( dockwidget::ShowAll );
+
+ emit changed( true );
+}
+
+#include "kcmweather.moc"
diff --git a/kweather/kcmweather.desktop b/kweather/kcmweather.desktop
new file mode 100644
index 0000000..34893f9
--- /dev/null
+++ b/kweather/kcmweather.desktop
@@ -0,0 +1,178 @@
+[Desktop Entry]
+Icon=configure
+Type=Service
+ServiceTypes=KCModule
+
+X-KDE-ModuleType=Library
+X-KDE-Library=weather
+X-KDE-FactoryName=weather
+X-KDE-ParentApp=weather_panelapplet
+X-KDE-ParentComponents=weather_panelapplet
+
+Name=Display
+Name[ar]=الشاشة
+Name[be]=Паказваць
+Name[bg]=Показване
+Name[bn]=ডিসপà§à¦²à§‡
+Name[br]=Diskwel
+Name[bs]=Prikaz
+Name[ca]=Pantalla
+Name[cs]=Zobrazení
+Name[cy]=Dangos
+Name[da]=Visning
+Name[de]=Anzeige
+Name[el]=Εμφάνιση
+Name[eo]=Vidigilo
+Name[es]=Visualización
+Name[et]=Vaade
+Name[eu]=Pantaila
+Name[fa]=نمایش
+Name[fi]=Näyttö
+Name[fr]=Affichage
+Name[ga]=Taispeáint
+Name[gl]=Mostrar
+Name[he]=תצוגה
+Name[hi]=पà¥à¤°à¤•à¤Ÿà¤¨
+Name[hr]=Zaslon
+Name[hu]=Képernyő
+Name[id]=Tampilan
+Name[is]=Skjáborð
+Name[it]=Visualizzazione
+Name[ja]=表示
+Name[km]=បង្ហាញ
+Name[ko]=표시
+Name[lv]=Displejs
+Name[mk]=Приказ
+Name[nb]=Vis
+Name[nds]=Dorstellen
+Name[ne]=पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥
+Name[nn]=Vising
+Name[pa]=ਡਿਸਪਲੇਅ
+Name[pl]=Wyświetlanie
+Name[pt]=Aparência
+Name[pt_BR]=Tela
+Name[ro]=Ecran
+Name[ru]=Показ
+Name[rw]=Kwerekana
+Name[sk]=Displej
+Name[sl]=Prikaz
+Name[sr]=Приказ
+Name[sr@Latn]=Prikaz
+Name[sv]=Visning
+Name[ta]= காடà¯à®šà®¿
+Name[tg]=Ðишон диҳед
+Name[tr]=Görünüm
+Name[uk]=ДиÑплей
+Name[uz]=Koʻrsatish
+Name[uz@cyrillic]=КўрÑатиш
+Name[wa]=HÃ¥ynaedje
+Name[zh_CN]=显示
+Name[zh_TW]=顯示
+Comment=Display Setup
+Comment[ar]=تعيين الشاشة
+Comment[be]=ÐаÑтаўленне паказу
+Comment[bg]=ÐаÑтройки на показването
+Comment[bn]=ডিসপà§à¦²à§‡ সংকà§à¦°à¦¾à¦¨à§à¦¤ পà§à¦°à¦¸à§à¦¤à§à¦¤à¦¿
+Comment[br]=Kefluniadur an Diskwel
+Comment[bs]=Postavke prikaza
+Comment[ca]=Configuració de pantalla
+Comment[cs]=Nastavení zobrazení
+Comment[cy]=Gosod Ymddangosiad
+Comment[da]=Opsætning af visning
+Comment[de]=Einrichtung der Anzeige
+Comment[el]=ΡÏθμιση εμφάνισης
+Comment[eo]=Vidigilagordo
+Comment[es]=Configuración de vistas
+Comment[et]=Vaateseadistused
+Comment[eu]=Pantaila Egokitu
+Comment[fa]=برپایی نمایش
+Comment[fi]=Näytön asetukset
+Comment[fr]=Configuration de l'affichage
+Comment[ga]=Socrú an Taispeáint
+Comment[gl]=Configurar visualización
+Comment[he]=הגדרות תצוגה
+Comment[hi]=पà¥à¤°à¤•à¤Ÿà¤¨ सेटअप
+Comment[hr]=Podešavanje prikazivanja
+Comment[hu]=A képernyő beállításai
+Comment[is]=Stillingar skjáborðs
+Comment[it]=Impostazione visualizzazione
+Comment[ja]=表示設定
+Comment[km]=បង្ហាញ​ការ​រៀបចំ
+Comment[ko]=표시 설정
+Comment[lv]=Displeja uzstÄdÄ«jumi
+Comment[mk]=ПоÑтавување на приказот
+Comment[mt]=Set tad-Display
+Comment[nb]=Visningsoppsett
+Comment[nds]=Dorstell-Optschonen
+Comment[ne]=सेटअप पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥
+Comment[nl]=Display-instellingen
+Comment[nn]=Oppsett av skjermvising
+Comment[pa]=ਡਿਸਪਲੇਅ ਸੈੱਟਅੱਪ
+Comment[pl]=Ustawienia wyświetlania
+Comment[pt]=Configuração da Aparência
+Comment[pt_BR]=Configurações da Tela
+Comment[ro]=Setări ecran
+Comment[ru]=Параметры показа
+Comment[sk]=Nastavenie displeja
+Comment[sl]=Nastavitev prikaza
+Comment[sr]=Подешавање приказа
+Comment[sr@Latn]=Podešavanje prikaza
+Comment[sv]=Inställning av visning
+Comment[ta]=அமைபà¯à®ªà¯ˆ காடà¯à®Ÿà¯
+Comment[tg]=Соз кардани намоиш
+Comment[tr]=Görünüm Ayarı
+Comment[uk]=ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¸Ñплею
+Comment[wa]=Apontiaedje do håynaedje
+Comment[zh_CN]=显示设置
+Comment[zh_TW]=顯示設定
+Keywords=kweather, weather, configure, settings, display
+Keywords[ar]=kweather برنامج, الطقس, تهيئة, إعدادات, شاشة
+Keywords[bg]=време, метеорологично, метеорологиÑ, показване, ÑÑŠÑтоÑние, доклад, kweather, weather, configure, settings, display
+Keywords[bn]=কে-ওয়েদার, আবহাওয়া, কনফিগার, বৈশিষà§à¦Ÿà§à¦¯, ডিসপà§à¦²à§‡
+Keywords[br]=kweather, amzer, kefluniañ, dibarzhoù, diskwel
+Keywords[bs]=kweather, weather, configure, settings, display, vrijeme, podesi, postavke, prikaz
+Keywords[ca]=kweather, temps, configuració, paràmetres, pantalla
+Keywords[cs]=kweather,poÄasí,nastavení,zobrazení
+Keywords[cy]=kweather, ktywydd, tywydd, ffurfweddu, gosodiadau, ymddangosiad
+Keywords[da]=kweather, vejr, indstil, opsætning, visning
+Keywords[de]=kweather, kwetter, wetter, einrichten, einstellungen, anzeige
+Keywords[el]=kweather, καιÏός, ÏÏθμιση, Ïυθμίσεις, εμφάνιση
+Keywords[es]=kweather, clima, configurar, parámetros, visualización
+Keywords[et]=kweather, ilm, seadistamine, seadistused, vaade
+Keywords[eu]=kweather, eguraldia, configuratu, ezarpenak, pantaila
+Keywords[fa]=kweather، آب و هوا، پیکربندی، تنظیمات، نمایش
+Keywords[fi]=kweather, sää, aseta, asetukset, näyttö
+Keywords[fr]=kweather, temps, configurer, affichage, météo
+Keywords[ga]=kweather, aimsir, cumraigh, socruithe, taispeáint
+Keywords[gl]=kweather, clima, configurar, axustes, mostrar
+Keywords[he]=kweather, weather, configure, settings, display, מזג ×וויר, הגדרות, הגדרות, תצוגה
+Keywords[hi]=के-वेदर,वेदर,कॉनà¥à¤«à¤¼à¤¿à¤—र,विनà¥à¤¯à¤¾à¤¸,पà¥à¤°à¤•à¤Ÿà¤¨
+Keywords[hr]=kweather, weather service, configure, settings, prikazivanje, podešavanje, postavke, meteorologija, vrijeme, meteorološki izvještaj, prognoza, prikaz, kvrijeme
+Keywords[hu]=kweather,időjárás,beállítás,konfiguráció,képernyő
+Keywords[it]=kweather,tempo,meteo,configurazione,impostazioni,visualizzazione
+Keywords[ja]=kweather, 気象, 設定, 設定, 表示
+Keywords[km]=kweather, អាកាសធាážáž», កំណážáŸ‹â€‹ážšáž…នាសម្ពáŸáž“្ធ, ការ​កំណážáŸ‹, បង្ហាញ
+Keywords[ko]=kweather, 날씨, 설정, 표시
+Keywords[lv]=kweather, laikapstÄkļi, konfigurÄ“t, uzstÄdÄ«jumi, displejs
+Keywords[mk]=kweather, weather, configure, settings, display, време, конфигурација, поÑтавувања, приказ
+Keywords[nb]=kweather, vær, oppsett, innstillinger, visning
+Keywords[nds]=kweather, kweder, weder, instellen, setten, Schirm
+Keywords[nl]=kweather,weerbericht,configureren,instellen,display
+Keywords[nn]=kweather,vêr,oppsett,innstillingar,vising
+Keywords[pl]=kweather, pogoda, konfiguruj, konfiguracja, ustawienia, wyświetlanie
+Keywords[pt]=kweather, tempo, meteorologia, configurar, configuração, aparência
+Keywords[pt_BR]=kweather, tempo, configurar,configurações,tela
+Keywords[ro]=kweather,meteo,configurare,setări,ecran
+Keywords[ru]=kweather, weather, configure, settings, display, наÑтройка, погода
+Keywords[sk]=kweather,poÄasie,nastaviÅ¥,displej,zobrazenie
+Keywords[sl]=kweather,kvreme,vreme,nastavi,prikaz
+Keywords[sr]=kweather, weather service, configure, settings, подеÑи, подешавања, поÑтавке, прогноза, време, временÑка прогноза, приказ
+Keywords[sr@Latn]=kweather, weather service, configure, settings, podesi, podešavanja, postavke, prognoza, vreme, vremenska prognoza, prikaz
+Keywords[sv]=kweather,väder,anpassa,inställningar,visning
+Keywords[ta]= k வானிலை, வானிலை, உளà¯à®³à®®à¯ˆ,அமைபà¯à®ªà¯à®•à®³à¯, காடà¯à®šà®¿
+Keywords[tg]=kҳаво, ҳаво, дигаргуниҳо, танзимотҳо, намоиш
+Keywords[tr]=kweather, hava, ayar, seçenek, görünüm
+Keywords[uk]=kweather, погода, налаштуваннÑ, параметри, диÑплей
+Keywords[wa]=kweather, meteyo, tins, apontyî, apontiaedjes, håyner, håynaedje
+Keywords[zh_CN]=kweather, weather, configure, settings, display, 天气, é…ç½®, 设置, 显示
+DocPath=kweather?anchor=configuring-kweather
diff --git a/kweather/kcmweather.h b/kweather/kcmweather.h
new file mode 100644
index 0000000..4fe2326
--- /dev/null
+++ b/kweather/kcmweather.h
@@ -0,0 +1,58 @@
+/*
+ This file is part of KWeather.
+ Copyright (c) 2003 Tobias Koenig <tokoe@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ As a special exception, permission is given to link this program
+ with any edition of Qt, and distribute the resulting executable,
+ without including the source code for Qt in the source distribution.
+*/
+
+#ifndef KCMWEATHER_H
+#define KCMWEATHER_H
+
+#include <kcmodule.h>
+
+class prefsDialogData;
+
+class KCMWeather : public KCModule
+{
+ Q_OBJECT
+
+ public:
+ KCMWeather( QWidget *parent = 0, const char *name = 0 );
+ ~KCMWeather();
+
+ virtual void load();
+ virtual void save();
+ virtual void defaults();
+
+ protected:
+ void fillStationList();
+ virtual void showEvent( QShowEvent * );
+
+ private slots:
+ void enableLogWidgets( bool value );
+ void changeViewMode( int mode );
+ void reportLocationChanged();
+ void textColorChanged(const QColor &);
+
+ private:
+ prefsDialogData *mWidget;
+ WeatherService_stub *mWeatherService;
+ int mViewMode;
+};
+
+#endif
diff --git a/kweather/kcmweatherservice.cpp b/kweather/kcmweatherservice.cpp
new file mode 100644
index 0000000..ee7fb0f
--- /dev/null
+++ b/kweather/kcmweatherservice.cpp
@@ -0,0 +1,72 @@
+/*
+ This file is part of KWeather.
+ Copyright (c) 2003 Tobias Koenig <tokoe@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ As a special exception, permission is given to link this program
+ with any edition of Qt, and distribute the resulting executable,
+ without including the source code for Qt in the source distribution.
+*/
+
+#include <qlayout.h>
+
+#include <kaboutdata.h>
+#include <kdebug.h>
+#include <klocale.h>
+
+#include "serviceconfigwidget.h"
+
+#include "kcmweatherservice.h"
+
+extern "C"
+{
+ KDE_EXPORT KCModule *create_weatherservice( QWidget *parent, const char * ) {
+ return new KCMWeatherService( parent, "kweather" );
+ }
+}
+
+KCMWeatherService::KCMWeatherService( QWidget *parent, const char *name )
+ : KCModule( parent, name )
+{
+ QVBoxLayout *layout = new QVBoxLayout( this );
+ mWidget = new ServiceConfigWidget( this );
+
+ // not needed, as a change immediately changes the service
+ //connect(mWidget, SIGNAL(changed(bool)), this, SIGNAL(changed(bool)));
+
+ layout->addWidget( mWidget );
+ KAboutData *about = new KAboutData( "kcmweatherservice",
+ I18N_NOOP( "KWeather Configure Dialog" ),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP( "(c), 2003 Tobias Koenig" ) );
+
+ about->addAuthor( "Tobias Koenig", 0, "tokoe@kde.org" );
+ setAboutData(about);
+}
+
+void KCMWeatherService::load()
+{
+}
+
+void KCMWeatherService::save()
+{
+}
+
+void KCMWeatherService::defaults()
+{
+}
+
+#include "kcmweatherservice.moc"
diff --git a/kweather/kcmweatherservice.desktop b/kweather/kcmweatherservice.desktop
new file mode 100644
index 0000000..d7522d2
--- /dev/null
+++ b/kweather/kcmweatherservice.desktop
@@ -0,0 +1,181 @@
+[Desktop Entry]
+Icon=kweather
+Type=Service
+ServiceTypes=KCModule
+
+X-KDE-ModuleType=Library
+X-KDE-Library=weatherservice
+X-KDE-FactoryName=weatherservice
+X-KDE-ParentApp=weather_panelapplet
+X-KDE-ParentComponents=weather_panelapplet,kontact_weatherplugin
+X-KDE-CfgDlgHierarchy=KontactSummary
+
+Name=Weather Service
+Name[ar]=خدمة الأرصاد الجوية
+Name[be]=Ð¡ÐµÑ€Ð²Ñ–Ñ Ð½Ð°Ð´Ð²Ð¾Ñ€'Ñ
+Name[bg]=Сървър
+Name[bn]=আবহাওয়া সারà§à¦­à¦¿à¦¸
+Name[br]=Servij an amzer
+Name[bs]=Servis vremenske prognoze
+Name[ca]=Servei meteorològic
+Name[cs]=Služba poÄasí
+Name[cy]=GwasanaethTywydd
+Name[da]=Vejrtjeneste
+Name[de]=Wetterdienst
+Name[el]=ΥπηÏεσία καιÏοÏ
+Name[eo]=VeteroServo
+Name[es]=Servicio de meteorología
+Name[et]=Ilmateenistus
+Name[eu]=Eguraldi Serbitzua
+Name[fa]=خدمت آب و هوا
+Name[fi]=Sääpalvelu
+Name[fr]=KWeatherService
+Name[ga]=Seirbhís Aimsire
+Name[gl]=Servizo Meteorolóxico
+Name[he]=שרות ה־DCOP של KWeather
+Name[hi]=मौसम सेवा
+Name[hr]=Meteorološki izvještaj
+Name[hu]=Időjárás-előrejelzés
+Name[is]=Veðurþjónustan
+Name[it]=Servizio meteorologico
+Name[ja]=気象サービス
+Name[km]=សáŸážœáž¶â€‹áž¢áž¶áž€áž¶ážŸáž’ាážáž»
+Name[ko]=날씨 서비스
+Name[lv]=LaikapstÄkļu serviss
+Name[mk]=Ð¡ÐµÑ€Ð²Ð¸Ñ Ð·Ð°\nвременÑка\nпрогноза
+Name[mt]=Servizz tat-Temp
+Name[nb]=Værtjeneste
+Name[nds]=Wederdeenst
+Name[ne]=मौसम सेवा
+Name[nl]=Weerbericht
+Name[nn]=Vêrteneste
+Name[pa]=ਮੌਸਮ ਸੇਵਾ
+Name[pl]=Serwis pogodowy
+Name[pt]=Serviço Meteorológico
+Name[pt_BR]=Serviço do Tempo
+Name[ro]=Meteo
+Name[ru]=Погода
+Name[sk]=PredpoveÄ poÄasia
+Name[sl]=Vremenske storitve
+Name[sr]=Ð¡ÐµÑ€Ð²Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ñке прогнозе
+Name[sr@Latn]=Servis vremenske prognoze
+Name[sv]=Väderlekstjänst
+Name[ta]= வானிலை சேவை
+Name[tg]=Хизмати Ҳаво
+Name[tr]=Hava Servisi
+Name[uk]=Служба погоди
+Name[uz]=Ob-havo xizmati
+Name[uz@cyrillic]=Об-ҳаво хизмати
+Name[wa]=Siervice meteyo
+Name[zh_CN]=气象æœåŠ¡
+Name[zh_TW]=氣象æœå‹™
+Comment=Weather Service Setup
+Comment[be]=ÐаÑтаўленне ÑервіÑу надвор'Ñ
+Comment[bg]=ÐаÑтройки на Ð¼ÐµÑ‚ÐµÐ¾Ñ€Ð¾Ð»Ð¾Ð³Ð¸Ñ‡Ð½Ð¸Ñ Ñървър
+Comment[bn]=আবহাওয়া সারà§à¦­à¦¿à¦¸ পà§à¦°à¦¸à§à¦¤à§à¦¤à¦¿
+Comment[br]=Kefluniadur servij an amzer
+Comment[bs]=Postavke servisa vremenske prognoze
+Comment[ca]=Configuració del servei meteorològic
+Comment[cs]=Nastavení služby poÄasí
+Comment[cy]=Gosod GwasanaethTywydd
+Comment[da]=Opsætning af vejrtjeneste
+Comment[de]=Einrichtung des Wetterdienstes
+Comment[el]=ΡÏθμιση υπηÏεσίας καιÏοÏ
+Comment[eo]=Agordo de VeteroServo
+Comment[es]=Configuración del servicio de meteorología
+Comment[et]=Ilmateenistuse seadistamine
+Comment[eu]=Eguraldi Serbitzua Egokitu
+Comment[fa]=برپایی خدمت آب و هوا
+Comment[fi]=Sääpalvelun asetukset
+Comment[fr]=Configuration du service Weather
+Comment[ga]=Socrú na Seirbhíse Aimsire
+Comment[gl]=Configuración do Servizo Meteorolóxico
+Comment[he]=הגדרות שרות ה־DCOP של KWeather
+Comment[hi]=मौसम सेवा सेटअप
+Comment[hr]=Podešavanje usluga meteorološkog izvještaja
+Comment[hu]=Az időjárás-előrejelző szolgáltatás beállításai
+Comment[is]=Stilla veðurþjónustuna
+Comment[it]=Impostazione servizio meteorologico
+Comment[ja]=気象サービスã®è¨­å®š
+Comment[km]=ការ​រៀបចំ​សáŸážœáž¶â€‹áž¢áž¶áž€áž¶ážŸáž’ាážáž»
+Comment[ko]=날씨 서비스 설정
+Comment[lv]=LaikapstÄkļu servisa uzstÄdÄ«jumi
+Comment[mk]=ПоÑтавување на ÑервиÑот за временÑка прогноза
+Comment[mt]=Konfigurazzjoni tas-Servizz tat-Temp
+Comment[nb]=Oppsett av værtjeneste
+Comment[nds]=Wederdeenst instellen
+Comment[ne]=मौसम सेवा सेटअप
+Comment[nl]=Instellingen voor weerbericht
+Comment[nn]=Oppsett av vêrteneste
+Comment[pl]=Ustawienia serwisu pogodowego
+Comment[pt]=Configuração do Serviço Meteorológico
+Comment[pt_BR]=Configuração do Serviço do Tempo
+Comment[ro]=Setare serviciu meteo
+Comment[ru]=ÐаÑтройка информации о погоде
+Comment[sk]=Nastavenie služby pre predpoveÄ poÄasia
+Comment[sl]=Nastavitev vremenskih storitev
+Comment[sr]=Подешавање ÑервиÑа временÑке прогнозе
+Comment[sr@Latn]=Podešavanje servisa vremenske prognoze
+Comment[sv]=Inställning av väderlekstjänst
+Comment[ta]= வானிலை சேவை அமைபà¯à®ªà¯
+Comment[tg]=Соз Кардани Хизмати Ҳаво
+Comment[tr]=Hava Servis Ayarı
+Comment[uk]=ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñлужби погоди
+Comment[uz]=Ob-havo xizmatini oʻrnatish
+Comment[uz@cyrillic]=Об-ҳаво хизматини ўрнатиш
+Comment[wa]=Apontiaedje do siervice meteyo
+Comment[zh_CN]=气象æœåŠ¡è®¾ç½®
+Comment[zh_TW]=氣象æœå‹™è¨­å®š
+Keywords=kweather, weather service, configure, settings
+Keywords[ar]=kweather برنامج, خدمة الأرصاد الجوية والطقس, تهيئة, إعدادات, شاشة
+Keywords[bg]=време, метеорологично, метеорологиÑ, показване, ÑÑŠÑтоÑние, доклад, kweather, weather service, configure, settings
+Keywords[bn]=কে-ওয়েদার, আবহাওয়া সারà§à¦­à¦¿à¦¸, কনফিগার, বৈশিষà§à¦Ÿà§à¦¯
+Keywords[bs]=kweather, weather service, configure, settings, servis, vremenska prognoza, postavke
+Keywords[ca]=kweather, servei meteorològic, configuració, paràmetres
+Keywords[cs]=kweather,služba poÄasí,nastavení
+Keywords[cy]=kweather, ktywydd, tywydd, ffurfweddu, gosodiadau
+Keywords[da]=kweather, vejrtjeneste, indstilling, opsætning
+Keywords[de]=kweather, kwetter, wetterdienst, einrichten, einstellungen
+Keywords[el]=kweather, υπηÏεσία καιÏοÏ, ÏÏθμιση, Ïυθμίσεις
+Keywords[es]=kweather, servicio de meteorología, configurar, parámetros
+Keywords[et]=kweather, ilmateenistus, seadistamine, seadistused
+Keywords[eu]=kweather,eguraldi serbitzua, konfiguratu, ezarpenak
+Keywords[fa]=kweather، خدمت آب و هوا، پیکربندی، تنظیمات
+Keywords[fi]=kweather, sääpalvelu, aseta, asetukset
+Keywords[fr]=kweather, weather service, configurer, réglages
+Keywords[ga]=kweather, seirbhís aimsire, cumraigh, socruithe
+Keywords[gl]=kweather, servizo meteorolóxico, configurar, axustes
+Keywords[he]=kweather, weather service, configure, settings, שרות ה־DCOP של kweather, הגדרות, הגדרות, שרות ה-DCOP של kweather
+Keywords[hi]=के-वेदर,वेदर सरà¥à¤µà¤¿à¤¸,कॉनà¥à¤«à¤¼à¤¿à¤—र,विनà¥à¤¯à¤¾à¤¸
+Keywords[hr]=kweather, weather service, configure, settings, podesi, podešavanja, postavke, meteorologija, vrijeme, vremenska prognoza, meteorološki izvještaj
+Keywords[hu]=kweather,időjárás-előrejelzés,beállítás,konfiguráció
+Keywords[it]=kweather,servizio meteorologico,meteo,configurazione,impostazioni
+Keywords[ja]=kweather, 気象サービス, 設定, 設定
+Keywords[km]=kweather, សáŸážœáž¶â€‹áž¢áž¶áž€áž¶ážŸáž’ាážáž», កំណážáŸ‹â€‹ážšáž…នាសម្ពáŸáž“្ធ, ការ​កំណážáŸ‹
+Keywords[ko]=kweather, 날씨 서비스, 설정
+Keywords[lv]=kweather, laikapstÄkļu serviss, konfigurÄ“t, uzstÄdÄ«jumi
+Keywords[mk]=kweather, weather service, configure, settings, ÑÐµÑ€Ð²Ð¸Ñ Ð·Ð° време, конфигурација, поÑтавувања
+Keywords[mt]=kweather, weather service, configure, settings, servizz tat-temp, konfigurazzjoni
+Keywords[nb]=kweather, værtjeneste, oppsett, innstillinger
+Keywords[nds]=KWeather, KWeder, Wederdeenst, Instellen
+Keywords[nl]=kweather,weerberichten,instellen,configureren
+Keywords[nn]=kweather,vêrteneste,oppsett,innstillingar
+Keywords[pl]=kweather, ustawienia, konfiguruj, konfiguracja, serwis pogodowy
+Keywords[pt]=kweather, serviço meteorológico, configurar, configuração
+Keywords[pt_BR]=kweather, serviço de tempo, configurar,configurações
+Keywords[ro]=kweather,serviciu,meteo,configurare,setări
+Keywords[ru]=kweather, weather service, configure, settings, наÑтройки, погода
+Keywords[sk]=kweather,služba poÄasia,predpoveÄ poÄasia,nastavenie
+Keywords[sl]=kweather,kvreme,vreme,nastavi,storit
+Keywords[sr]=kweather, weather service, configure, settings, подеÑи, подешавања, поÑтавке, прогноза, време, временÑка прогноза
+Keywords[sr@Latn]=kweather, weather service, configure, settings, podesi, podešavanja, postavke, prognoza, vreme, vremenska prognoza
+Keywords[sv]=kweather,väderlekstjänst,anpassa,inställningar
+Keywords[ta]=k வானிலை, வானிலை சேவை, உளà¯à®³à®®à¯ˆ,அமைபà¯à®ªà¯à®•à®³à¯
+Keywords[tg]=kҳаво, хизмати ҳаво, дигаргуниҳо, танзимотҳо
+Keywords[tr]=kweather, hava servisi, ayar, seçenek
+Keywords[uk]=kweather, Ñлужба погоди, налаштуваннÑ, параметри
+Keywords[uz]=kweather, ob-havo xizmati, moslash, moslamalar
+Keywords[uz@cyrillic]=kweather, об-ҳаво хизмати, моÑлаш, моÑламалар
+Keywords[wa]=kweather, meteyo, tins, siervice meteyo, apontyî, apontiaedjes
+Keywords[zh_CN]=kweather, weather service, configure, settings, 气象æœåŠ¡, é…ç½®, 设置
+DocPath=kweather?anchor=weather-service
diff --git a/kweather/kcmweatherservice.h b/kweather/kcmweatherservice.h
new file mode 100644
index 0000000..c5466d4
--- /dev/null
+++ b/kweather/kcmweatherservice.h
@@ -0,0 +1,46 @@
+/*
+ This file is part of KWeather.
+ Copyright (c) 2003 Tobias Koenig <tokoe@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ As a special exception, permission is given to link this program
+ with any edition of Qt, and distribute the resulting executable,
+ without including the source code for Qt in the source distribution.
+*/
+
+#ifndef KCMWEATHERSERVICE_H
+#define KCMWEATHERSERVICE_H
+
+#include <kcmodule.h>
+
+class ServiceConfigWidget;
+
+class KCMWeatherService : public KCModule
+{
+ Q_OBJECT
+
+ public:
+ KCMWeatherService( QWidget *parent = 0, const char *name = 0 );
+
+ virtual void load();
+ virtual void save();
+ virtual void defaults();
+
+ private:
+ ServiceConfigWidget *mWidget;
+};
+
+#endif
diff --git a/kweather/kweather.cpp b/kweather/kweather.cpp
new file mode 100644
index 0000000..5410b10
--- /dev/null
+++ b/kweather/kweather.cpp
@@ -0,0 +1,425 @@
+/***************************************************************************
+ kweather.cpp - description
+ -------------------
+ begin : Wed Jul 5 23:09:02 CDT 2000
+ copyright : (C) 2000-2003 by Ian Reinhart Geiser
+ : (C) 2002-2003 Nadeem Hasan <nhasan@kde.org>
+ email : geiseri@msoe.edu
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include <kaboutapplication.h>
+#include <kapplication.h>
+#include <kcmultidialog.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kmessagebox.h>
+#include <kpopupmenu.h>
+#include <kconfig.h>
+#include <ksettings/dialog.h>
+#include <ksettings/dispatcher.h>
+#include <dcopclient.h>
+
+#include <qfile.h>
+#include <qtimer.h>
+#include <qpalette.h>
+
+#include "kweather.h"
+#include "reportview.h"
+#include "dockwidget.h"
+#include "weatherservice_stub.h"
+
+extern "C"
+{
+ KDE_EXPORT KPanelApplet* init(QWidget *parent, const QString& configFile)
+ {
+ KGlobal::locale()->insertCatalogue("kweather");
+ kweather *theApplet = new kweather(configFile, KPanelApplet::Normal,
+ 0, parent, "kweather");
+ return theApplet;
+ }
+}
+
+kweather::kweather(const QString& configFile, Type t, int actions,
+ QWidget *parent, const char *name):
+ KPanelApplet(configFile, t, actions, parent, name), weatherIface(),
+ mFirstRun( false ), mReport( 0 ), mClient( 0 ),
+ mContextMenu( 0 ), mWeatherService( 0 ), settingsDialog( 0 ), mTextColor(Qt::black)
+{
+ kdDebug(12004) << "Constructor " << endl;
+ setObjId("weatherIface");
+
+ setBackgroundOrigin( QWidget::AncestorOrigin );
+ loadPrefs();
+ initContextMenu();
+ initDCOP();
+
+ dockWidget = new dockwidget(reportLocation, this, "dockwidget");
+ connect(dockWidget, SIGNAL(buttonClicked()), SLOT(doReport()));
+ dockWidget->setViewMode(mViewMode);
+ setLabelColor();
+
+ timeOut = new QTimer(this, "timeOut" );
+ connect(timeOut, SIGNAL(timeout()), SLOT(timeout()));
+ timeOut->start(10*60*1000);
+
+ if(mFirstRun)
+ preferences();
+ else
+ timeout();
+}
+
+kweather::~kweather()
+{
+ delete mWeatherService;
+}
+
+void kweather::initContextMenu()
+{
+ mContextMenu = new KPopupMenu(this);
+ mContextMenu->insertTitle(i18n("KWeather - %1").arg( reportLocation ), -1, 0);
+ mContextMenu->insertItem(SmallIcon("viewmag"), i18n("Show &Report"),
+ this, SLOT(doReport()), 0, -1, 1);
+ mContextMenu->insertItem(SmallIcon("reload"), i18n("&Update Now"),
+ this, SLOT(slotUpdateNow()), 0, -1, 2);
+ mContextMenu->insertSeparator();
+ mContextMenu->insertItem(SmallIcon("kweather"), i18n("&About KWeather"), this, SLOT(about()));
+ mContextMenu->insertItem(SmallIcon("configure"),
+ i18n("&Configure KWeather..."), this, SLOT(preferences()));
+ setCustomMenu(mContextMenu);
+}
+
+void kweather::initDCOP()
+{
+ if ( !mClient )
+ mClient = KApplication::dcopClient();
+
+ if(!mClient->isAttached())
+ mClient->attach();
+
+ if(!attach())
+ return;
+
+ kdDebug(12004) << "attached to the server..." << endl;
+
+ if ( mWeatherService )
+ delete mWeatherService;
+
+ mWeatherService = new WeatherService_stub( "KWeatherService", "WeatherService" );
+
+ if (!connectDCOPSignal(0, 0, "fileUpdate(QString)",
+ "refresh(QString)",false))
+ kdDebug(12004) << "Could not attach dcop signal..." << endl;
+ else
+ kdDebug(12004) << "attached dcop signals..." << endl;
+}
+
+/** about box */
+void kweather::about(){
+ kdDebug(12004) << "Telling about" << endl;
+ KAboutData aboutData("KWeather", "KWeather", "2.1.0",
+ I18N_NOOP("Weather applet for the Kicker"), KAboutData::License_GPL_V2);
+ aboutData.addAuthor("Ian Reinhart Geiser", "", "geiseri@kde.org",
+ "http://www.kde.org/");
+ //aboutData.addAuthor("Nadeem Hasan", "", "nhasan@nadmm.com", "http://www.nadmm.com/");
+ aboutData.addCredit("Nadeem Hasan", I18N_NOOP("Lots of bugfixes,"
+ " improvements and cleanups."), "nhasan@nadmm.com");
+ aboutData.addCredit("Will Andrews", I18N_NOOP("Fixed for BSD port"),
+ "wca@users.sourceforge.net", "");
+ aboutData.addCredit("Ben Burton", I18N_NOOP("Debian fixes"), "benb@acm.org");
+ aboutData.addCredit("Otto Bruggeman", I18N_NOOP("Fixed the i18n stuff and"
+ " made sure the indentation was consistent :P"), "bruggie@home.nl");
+ aboutData.addCredit( "Carles Carbonell Bernado",
+ I18N_NOOP( "Great new weather icons" ), "mail@carlitus.net" );
+ aboutData.addCredit( "John Ratke",
+ I18N_NOOP( "Improvements and more code cleanups" ), "jratke@comcast.net" );
+
+ KAboutApplication about(&aboutData, this, 0);
+ about.setProgramLogo( KGlobal::instance()->iconLoader()->iconPath( "kweather", -KIcon::SizeLarge ) );
+ about.exec();
+}
+
+/** prefs */
+void kweather::preferences()
+{
+ kdDebug(12004) << "prefs" << endl;
+
+ savePrefs();
+
+ if ( settingsDialog == 0 )
+ {
+ settingsDialog = new KCMultiDialog( this );
+ connect( settingsDialog, SIGNAL( configCommitted() ), SLOT( slotPrefsAccepted() ) );
+
+ settingsDialog->addModule( "kcmweather.desktop" );
+ settingsDialog->addModule( "kcmweatherservice.desktop" );
+ }
+
+ settingsDialog->show();
+ settingsDialog->raise();
+}
+
+/** The help handler */
+void kweather::help()
+{
+ kapp->invokeHelp(QString::null, QString::fromLatin1("kweather"));
+}
+
+/** Display the current weather report. */
+void kweather::doReport()
+{
+ if ( reportLocation.isEmpty() )
+ {
+ // no station to display defined -> open settings dialog
+ preferences();
+ return;
+ }
+
+ kdDebug(12004) << "Showing out the report" << endl;
+ if ( mReport == 0 )
+ {
+ mReport = new reportView(reportLocation);
+
+ connect( mReport, SIGNAL( finished() ), SLOT( slotReportFinished() ) );
+ }
+
+ mReport->show();
+ mReport->raise();
+}
+
+void kweather::slotReportFinished(){
+ mReport->delayedDestruct();
+ mReport = 0;
+}
+
+/** load the application */
+void kweather::loadPrefs(){
+ kdDebug(12004) << "Loading Prefs" << endl;
+ KConfig *kcConfig = config();
+ kcConfig->reparseConfiguration();
+
+ if (!kcConfig->hasGroup ("General Options") )
+ mFirstRun = true;
+
+ kcConfig->setGroup("General Options");
+ logOn = kcConfig->readBoolEntry("logging", false);
+ fileName = kcConfig->readPathEntry("log_file_name");
+ reportLocation = kcConfig->readEntry("report_location");
+ mViewMode = kcConfig->readNumEntry("smallview_mode", dockwidget::ShowAll);
+
+ static QColor black(Qt::black);
+ mTextColor = kcConfig->readColorEntry("textColor", &black);
+}
+
+/** Save the application mPrefs. */
+void kweather::savePrefs(){
+ kdDebug(12004) << "Saving Prefs..." << endl;
+ KConfig *kcConfig = config();
+
+ kcConfig->setGroup("General Options");
+ kcConfig->writeEntry("logging", logOn);
+ kcConfig->writeEntry("report_location", reportLocation);
+ kcConfig->writeEntry("smallview_mode", mViewMode);
+ kcConfig->writePathEntry("log_file_name", fileName );
+ kcConfig->sync();
+}
+
+void kweather::showWeather()
+{
+ kdDebug(12004) << "Show weather" << endl;
+ dockWidget->showWeather();
+ emit updateLayout();
+}
+
+void kweather::writeLogEntry()
+{
+ // Write data line in the CSV format
+ if (logOn && !fileName.isEmpty())
+ {
+ kdDebug(12004)<< "Try log file:" << fileName << endl;
+ QFile logFile(fileName);
+ QTextStream logFileStream(&logFile);
+ if (logFile.open(IO_Append | IO_ReadWrite))
+ {
+ QString temperature = mWeatherService->temperature(reportLocation );
+ QString wind = mWeatherService->wind(reportLocation );
+ QString pressure = mWeatherService->pressure(reportLocation );
+ QString date = mWeatherService->date(reportLocation );
+ QStringList weather = mWeatherService->weather(reportLocation );
+ QStringList cover = mWeatherService->cover(reportLocation );
+ QString visibility = mWeatherService->visibility(reportLocation );
+ logFileStream << date << ",";
+ logFileStream << wind << ",";
+ logFileStream << temperature << ",";
+ logFileStream << pressure << ",";
+ logFileStream << cover.join(";") << ",";
+ logFileStream << visibility << ",";
+ logFileStream << weather.join(";");
+ logFileStream << endl;
+ }
+ else
+ {
+ KMessageBox::sorry( this,
+ i18n("For some reason the log file could not be written to.\n"
+ "Please check to see if your disk is full or if you "
+ "have write access to the location you are trying to "
+ "write to."),
+ i18n("KWeather Error"));
+ }
+ logFile.close();
+ }
+}
+
+/** get new data */
+void kweather::timeout()
+{
+ if ( !mWeatherService )
+ initDCOP();
+
+ if ( mWeatherService )
+ {
+ // isEmtpy is true for null and 0 length strings
+ if ( !reportLocation.isEmpty() )
+ {
+ kdDebug(12004)<< "Requesting new data for " << reportLocation << endl;
+ mWeatherService->update(reportLocation);
+ }
+ }
+}
+
+int kweather::widthForHeight(int h) const
+{
+ //kdDebug(12004) << "widthForHeight " << h << endl;
+ dockWidget->setOrientation(Horizontal);
+ int w = dockWidget->widthForHeight(h);
+ return w;
+}
+
+int kweather::heightForWidth(int w) const
+{
+ kdDebug(12004) << "heightForWidth " << w<< endl;
+ dockWidget->setOrientation(Vertical);
+ int h = dockWidget->heightForWidth( w );
+ return h;
+}
+
+void kweather::refresh(QString stationID)
+{
+ kdDebug(12004) << "refresh " << stationID << endl;
+ if( stationID == reportLocation)
+ {
+ showWeather();
+ writeLogEntry();
+ }
+}
+
+void kweather::slotPrefsAccepted()
+{
+ // Preferences have been saved in the config file by the KCModule,
+ // so read them out.
+ loadPrefs();
+
+ dockWidget->setLocationCode(reportLocation);
+ dockWidget->setViewMode(mViewMode);
+ setLabelColor();
+ emit updateLayout();
+
+ if (logOn && !fileName.isEmpty())
+ {
+ QFile logFile(fileName);
+ // Open the file, create it if not already exists
+ if (logFile.open(IO_ReadWrite))
+ {
+ if (logFile.size() == 0)
+ {
+ // Empty file, put the header
+ QTextStream logFileStream(&logFile);
+ logFileStream << "Date,Wind Speed & Direction,Temperature,Pressure,Cover,Visibility,Current Weather" << endl;
+ }
+ logFile.close();
+ }
+ else
+ {
+ kdDebug(12004) << "There was an error opening the file...." << endl;
+ KMessageBox::sorry( this,
+ i18n("For some reason a new log file could not be opened.\n"
+ "Please check to see if your disk is full or if you have "
+ "write access to the location you are trying to write to."),
+ i18n("KWeather Error"));
+ }
+ }
+
+ timeout();
+}
+
+void kweather::mousePressEvent(QMouseEvent *e)
+{
+ if ( e->button() != RightButton )
+ {
+ KPanelApplet::mousePressEvent( e );
+ return;
+ }
+
+ mContextMenu->exec(e->globalPos());
+}
+
+void kweather::slotUpdateNow()
+{
+ if ( !mWeatherService )
+ initDCOP();
+
+ mWeatherService->forceUpdate(reportLocation );
+}
+
+bool kweather::attach()
+{
+ QString error;
+ kdDebug(12004) << "Looking for dcop service..." << endl;
+ if (!mClient->isApplicationRegistered("KWeatherService"))
+ {
+ kdDebug(12004) << "Could not find service so I am starting it..."
+ << endl;
+ if (!KApplication::startServiceByDesktopName("kweatherservice",
+ QStringList(), &error))
+ {
+ kdDebug(12004) << "Starting KWeatherService failed with message: "
+ << error << endl;
+ return false;
+ }
+
+ kdDebug (12004) << "Service Started..." << endl;
+ }
+ else
+ {
+ kdDebug(12004) << "Found weather service..." << endl;
+ }
+
+ return true;
+}
+
+void kweather::resizeEvent(QResizeEvent *e)
+{
+ kdDebug(12004) << "KWeather Resize event " << e->size() << endl;
+ dockWidget->resizeView(e->size());
+}
+
+void kweather::setLabelColor()
+{
+ setPaletteForegroundColor(mTextColor);
+}
+
+void kweather::paletteChange(const QPalette &)
+{
+ setLabelColor();
+}
+
+#include "kweather.moc"
diff --git a/kweather/kweather.desktop b/kweather/kweather.desktop
new file mode 100644
index 0000000..ee354fe
--- /dev/null
+++ b/kweather/kweather.desktop
@@ -0,0 +1,113 @@
+[Desktop Entry]
+Type=Plugin
+Comment=Stay informed of the weather outside
+Comment[ar]=كن على علم دوماً بحالة الطقس ÙÙŠ الخارج
+Comment[be]=ЗаÑтаньцеÑÑ Ñ–Ð½Ñ„Ð°Ñ€Ð¼Ð°Ð²Ð°Ð½Ñ‹Ð¼Ñ– аб надвор'Ñ–
+Comment[bg]=Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° метеорологичното време
+Comment[bn]=বাহিরের আবহাওয়া সমà§à¦ªà¦°à§à¦•à§‡ অবহিত থাকà§à¦¨
+Comment[ca]=Estigueu informat del temps de l'exterior
+Comment[cs]=Informuje o poÄasí
+Comment[cy]=Cael eich hysbysu am y tywydd tu allan
+Comment[da]=Vær informeret om vejret udenfor
+Comment[de]=Hält Sie über das Wetter auf dem Laufenden
+Comment[el]=ΕνημεÏωθείτε για τον καιÏÏŒ
+Comment[eo]=Estu informita de la ekstera vetero
+Comment[es]=Manténgase informado del clima que hace afuera
+Comment[et]=Näitab väljas olevat ilma
+Comment[eu]=Eskuratu kanpoko eguraldiaren informazioa
+Comment[fa]=با خبر ماندن از آب و هوای بیرون
+Comment[fi]=Seuraa säätilan muutoksia
+Comment[fr]=Restez informé(e) sur le temps à l'extérieur
+Comment[ga]=Faigh eolas faoin aimsir
+Comment[gl]=Estexa informado do tempo que fai
+Comment[he]=קבל ×¢×“×›×•× ×™× ×ודות מזג ×”×וויר
+Comment[hr]=Budite u tijeku s meteorološki uvjetima oko vas
+Comment[hu]=Aktuális időjárási információk lekérdezése
+Comment[is]=Haltu þér upplýstum um veðrið úti
+Comment[it]=Tieniti informato sul tempo che c'è fuori
+Comment[ja]=外ã®å¤©æ°—を知らã›ã¾ã™
+Comment[km]=នៅ​ážáŸ‚​ជូន​ដំណឹង​អំពី​អាកាសធាážáž»â€‹ážáž¶áž„ក្រៅ
+Comment[lv]=Saņemiet informÄciju par laikapstÄkļiem ÄrpusÄ“
+Comment[mk]=Бидете информирани за времето
+Comment[nb]=Få informasjon om været
+Comment[nds]=Jümmers dat opstunns aktuelle Weder
+Comment[ne]=निमनà¥à¤¤à¥à¤°à¤£à¤¾ गरिà¤à¤•à¥‹ बाहिरको मौसम लाई राखि राखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥
+Comment[nl]=Blijf geïnformeerd over het weer buiten
+Comment[nn]=Hald greie på vêret på utsida
+Comment[pl]=Informuje o pogodzie na zewnÄ…trz
+Comment[pt]=Saiba como está o tempo lá fora
+Comment[pt_BR]=Mantenha-se informado sobre o tempo
+Comment[ro]=Vă ţine informat despre starea vremii de afară
+Comment[ru]=ÐšÐ°ÐºÐ°Ñ Ð½Ð° дворе погода
+Comment[sk]=BuÄte informovaný o poÄasí vonku
+Comment[sl]=Ostanite obveÅ¡Äeni o vremenu zunaj
+Comment[sr]=Будите обавештени о времену напољу
+Comment[sr@Latn]=Budite obavešteni o vremenu napolju
+Comment[sv]=Håll dig informerad om vädret utanför
+Comment[tg]=Дар бораи ҳаво огоҳ шавед
+Comment[tr]=Hava durumundan haberdar olun
+Comment[uk]=Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ погодні умови надворі
+Comment[uz]=Yerning turli joyidagi ob-havo haqida maʼlumot
+Comment[uz@cyrillic]=Ернинг турли жойидаги об-ҳаво ҳақида маълумот
+Comment[zh_CN]=知晓户外天气
+Comment[zh_TW]=ç•™ä½å¤–é¢çš„天氣報告
+Name=Weather Report
+Name[ar]=تقرير الطقس
+Name[be]=Прагноз надвор'Ñ
+Name[bg]=Метеорологично време
+Name[bn]=আবহাওয়া রিপোরà§à¦Ÿ
+Name[ca]=Informació del temps
+Name[cs]=Zpráva o poÄasí
+Name[cy]=Adroddiad Tywydd
+Name[da]=Vejrudsigt
+Name[de]=Wetterbericht
+Name[el]=ΜετεωÏολογική αναφοÏά
+Name[eo]=VeterRaporto
+Name[es]=Informe meteorológico
+Name[et]=Ilmateade
+Name[eu]=Eguraldiaren txostena
+Name[fa]=گزارش آب و هوا
+Name[fi]=Navigointipalkin säätiedotus
+Name[fr]=Rapport météorologique
+Name[ga]=Tuairisc Aimsire
+Name[gl]=Parte Meteorolóxico
+Name[he]=דו"×— מזג ×וויר
+Name[hr]=Meteorološki izvještaj
+Name[hu]=Időjárás-jelentés
+Name[is]=Veðurfréttir
+Name[it]=Bollettino meteorologico
+Name[ja]=気象情報
+Name[km]=របាយការណáŸâ€‹áž¢áž¶áž€áž¶ážŸáž’ាážáž»
+Name[ko]=날씨 보고
+Name[lv]=LaikapstÄkļu atskaite
+Name[mk]=Извештај за време
+Name[mt]=Rapport Tat-Temp
+Name[nb]=Værmelding
+Name[nds]=Wederbericht
+Name[ne]=मौसम पà¥à¤°à¤¤à¤¿à¤µà¥‡à¤¦à¤¨
+Name[nl]=Weerbericht
+Name[nn]=Vêrmelding
+Name[pa]=ਮੌਸਮ ਰਿਪੋਰਟ
+Name[pl]=Raport o pogodzie
+Name[pt]=Boletim Meteorológico
+Name[pt_BR]=Relatório do Tempo
+Name[ro]=Raport meteo
+Name[ru]=Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ погоде
+Name[sk]=Správa o poÄasí
+Name[sl]=Vremensko poroÄilo
+Name[sr]=ВременÑка прогноза
+Name[sr@Latn]=Vremenska prognoza
+Name[sv]=Väderprognos
+Name[ta]=வானிலை அறிகà¯à®•à¯ˆ
+Name[tg]=Ðхборот дар бораи ҳаво
+Name[tr]=Hava Durumu
+Name[uk]=Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ погоду
+Name[uz]=Ob-havo haqida hisobot
+Name[uz@cyrillic]=Об-ҳаво ҳақида ҳиÑобот
+Name[wa]=Rapoirt meteyo
+Name[zh_CN]=气象报告
+Name[zh_TW]=氣象報告
+Icon=kweather
+DocPath=kweather/index.html
+X-KDE-Library=weather_panelapplet
+X-KDE-UniqueApplet=true
diff --git a/kweather/kweather.h b/kweather/kweather.h
new file mode 100644
index 0000000..d139411
--- /dev/null
+++ b/kweather/kweather.h
@@ -0,0 +1,90 @@
+/***************************************************************************
+ kweather.h - description
+ -------------------
+ begin : Wed Jul 5 23:09:02 CDT 2000
+ copyright : (C) 2000 by Ian Reinhart Geiser
+ email : geiseri@msoe.edu
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef KWEATHER_H
+#define KWEATHER_H
+
+#include <kpanelapplet.h>
+#include <dcopref.h>
+
+#include "weatherIface.h"
+
+class QTimer;
+class dockwidget;
+class reportView;
+class KPopupMenu;
+class WeatherService_stub;
+class QPalette;
+
+class kweather : public KPanelApplet, public weatherIface
+{
+ Q_OBJECT
+
+public:
+ kweather(const QString& configFile, Type t = Normal, int actions = 0, QWidget *parent = 0, const char *name = 0);
+ ~kweather();
+ void help();
+ void resizeEvent(QResizeEvent*);
+ int heightForWidth(int i) const;
+ int widthForHeight(int i) const;
+ void refresh(QString);
+ void setBackground();
+ void setLabelColor();
+
+public slots: // Public slots
+ void preferences();
+ void about();
+
+protected:
+ void paletteChange(const QPalette &);
+
+protected slots:
+ void doReport();
+ void timeout();
+ void slotPrefsAccepted();
+ void slotReportFinished();
+ void slotUpdateNow();
+
+private: // Private methods
+ void initContextMenu();
+ void initDCOP();
+ void loadPrefs();
+ void savePrefs();
+ void showWeather();
+ void writeLogEntry();
+ void mousePressEvent(QMouseEvent *e);
+
+ bool attach();
+
+ QString reportLocation;
+ QString fileName;
+ QString metarData;
+ bool logOn;
+ bool mFirstRun;
+ int mViewMode;
+ QTimer *timeOut;
+ dockwidget *dockWidget;
+ reportView *mReport;
+ DCOPClient *mClient;
+ //DCOPRef *mWeatherService;
+ KPopupMenu *mContextMenu;
+ WeatherService_stub *mWeatherService;
+ KCMultiDialog *settingsDialog;
+ QColor mTextColor;
+};
+
+#endif
diff --git a/kweather/kweather.kdevprj b/kweather/kweather.kdevprj
new file mode 100644
index 0000000..75578e0
--- /dev/null
+++ b/kweather/kweather.kdevprj
@@ -0,0 +1,296 @@
+[./AUTHORS]
+dist=true
+install=false
+install_location=
+type=DATA
+[./Makefile.am]
+files=./AUTHORS,./dockwidget.cpp,./dockwidget.h,./kweather.cpp,./kweather.desktop,./kweather.h,./prefsDialog.cpp,./prefsDialog.h,./prefsDialogData.cpp,./prefsDialogData.h,./reportview.cpp,./reportview.h,./weatherIface.h,./weatherlib.cpp,./weatherlib.h,./kweather.kdevprj,
+sub_dirs=
+type=normal
+[./dockwidget.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+[./dockwidget.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+[./kweather.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+[./kweather.desktop]
+dist=true
+install=false
+install_location=
+type=DATA
+[./kweather.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+[./kweather.kdevprj]
+dist=true
+install=false
+install_location=
+type=DATA
+[./prefsDialog.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+[./prefsDialog.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+[./prefsDialogData.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+[./prefsDialogData.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+[./reportview.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+[./reportview.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+[./weatherIface.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+[./weatherlib.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+[./weatherlib.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+[Config for BinMakefileAm]
+addcxxflags=
+bin_program=kweather
+cxxflags= -O1
+ldadd=
+ldflags=
+libtool_dir=
+path_to_bin_program=.
+[General]
+author=ian reinhart geiser
+dir_where_make_will_be_called=
+email=geiseri@yahoo.com
+kdevprj_version=1.3
+lfv_open_groups=
+make_options= -j1
+makefiles=./Makefile.am,graphics/Makefile.am,
+modifyMakefiles=true
+project_name=kweather
+project_type=normal_empty
+short_info=A kickerapplet that will display the current weather outside
+sub_dir=
+version=2.0
+version_control=CVS
+workspace=1
+[LFV Groups]
+Desktop=*.desktop,
+GNU=AUTHORS,COPYING,ChangeLog,INSTALL,README,TODO,NEWS,
+Headers=*.h,*.hxx,*.hpp,*.H,
+Others=*,
+Sources=*.cpp,*.c,*.cc,*.C,*.cxx,*.ec,*.ecpp,*.lxx,*.l++,*.ll,*.l,
+Translations=*.ts,*.po,
+User Interface=*.ui,*.kdevdlg,*.rc,
+groups=Headers,Sources,GNU,Translations,User Interface,Desktop,Others
+[graphics/Makefile.am]
+files=graphics/cloudy1.png,graphics/cloudy2.png,graphics/cloudy3.png,graphics/cloudy4.png,graphics/cloudy5.png,graphics/dunno.png,graphics/fog.png,graphics/hail.png,graphics/light_rain.png,graphics/mcloudy.png,graphics/mist.png,graphics/overcast.png,graphics/part-cloud.png,graphics/pcloudy.png,graphics/rain.png,graphics/rainy.png,graphics/shower1.png,graphics/shower2.png,graphics/shower3.png,graphics/sleet.png,graphics/slop.png,graphics/snow.png,graphics/snow1.png,graphics/snow2.png,graphics/snow3.png,graphics/snow4.png,graphics/snow5.png,graphics/snowshowers.png,graphics/sunny.png,graphics/thunderstorm.png,graphics/tstorm.png,graphics/tstorm1.png,graphics/tstorm2.png,graphics/tstorm3.png,graphics/wind.png,
+sub_dirs=
+type=normal
+[graphics/cloudy1.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/cloudy2.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/cloudy3.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/cloudy4.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/cloudy5.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/dunno.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/fog.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/hail.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/light_rain.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/mcloudy.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/mist.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/overcast.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/part-cloud.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/pcloudy.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/rain.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/rainy.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/shower1.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/shower2.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/shower3.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/sleet.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/slop.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/snow.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/snow1.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/snow2.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/snow3.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/snow4.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/snow5.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/snowshowers.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/sunny.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/thunderstorm.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/tstorm.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/tstorm1.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/tstorm2.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/tstorm3.png]
+dist=true
+install=false
+install_location=
+type=DATA
+[graphics/wind.png]
+dist=true
+install=false
+install_location=
+type=DATA
diff --git a/kweather/kweatherreport.desktop b/kweather/kweatherreport.desktop
new file mode 100644
index 0000000..aeff765
--- /dev/null
+++ b/kweather/kweatherreport.desktop
@@ -0,0 +1,9 @@
+[Desktop Entry]
+Exec=kweatherreport
+Icon=kweatherreport
+MimeType=
+Path=
+Terminal=false
+Type=Application
+X-KDE-SubstituteUID=false
+X-KDE-Username=
diff --git a/kweather/kweatherservice.desktop b/kweather/kweatherservice.desktop
new file mode 100644
index 0000000..97dcfef
--- /dev/null
+++ b/kweather/kweatherservice.desktop
@@ -0,0 +1,88 @@
+[Desktop Entry]
+Type=Service
+Name=KWeatherService
+Name[ar]=خدمة الأرصاد الجوية KWeatherService
+Name[bn]=কে-ওয়েদার-সারà§à¦­à¦¿à¦¸
+Name[ca]=Servei KTemps
+Name[cy]=KGwasanaethTywydd
+Name[eo]=VeteroServo
+Name[et]=KIlmajaam
+Name[eu]=KweatherSerbitzua
+Name[fi]=Sääpalvelu
+Name[hi]=के-वेदर-सरà¥à¤µà¤¿à¤¸
+Name[hr]=KMeteorološki izvještaj
+Name[lv]=KWeather serviss
+Name[mk]=КВременÑкиСервиÑ
+Name[ne]=केडीई मौसम सेवा
+Name[pa]=ਕੇ-ਮੌਸਮ ਸੇਵਾ
+Name[pl]=Serwis pogodowy
+Name[pt_BR]=Serviço do Tempo
+Name[ro]=Serviciu meteo
+Name[ru]=Ð¡ÐµÑ€Ð²Ð¸Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð³Ð¾Ð´Ñ‹
+Name[sl]=KVremenskiServis
+Name[sv]=Kweather-tjänst
+Name[ta]= K வானிலை சேவை
+Name[tg]=KХизматиҲаво
+Name[th]=รายงานอาà¸à¸²à¸¨ K
+Name[uz]=Ob-havo xizmati
+Name[uz@cyrillic]=Об-ҳаво хизмати
+Name[wa]=Siervice meteyo
+Name[xh]=Inkonzo ye KWeather
+Name[zh_CN]=K 气象æœåŠ¡
+Name[zh_TW]=KDE 天氣æœå‹™
+Exec=kweatherservice
+X-DCOP-ServiceType=Unique
+X-DCOP-ServiceName=KWeatherService
+X-KDE-StartupNotify=false
+Comment= A DCOP service to provide weather data.
+Comment[be]=DCOP-ÑервіÑ, Ñкі дае звеÑткі пра надвор'е
+Comment[bg]=УÑлуга DCOP за метеорологични данни
+Comment[bn]= আবহাওয়া তথà§à¦¯ সরবরাহের জনà§à¦¯ à¦à¦•à¦Ÿà¦¿ ডিকপ সারà§à¦­à¦¿à¦¸à¥¤
+Comment[ca]=Un servei DCOP per proveir dades del temps.
+Comment[cs]=Služba DCOP poskytující údaje o poÄasí.
+Comment[cy]=Gwasanaeth DCOP i ddarparu data tywydd.
+Comment[da]= En DCOP-tjeneste som sørger for vejrdata.
+Comment[de]=DCOP-Dienst für Wetterdaten
+Comment[el]=Μια υπηÏεσία DCOP που Ï€ÏοσφέÏει μετεωÏολογικά δεδομένα.
+Comment[eo]=DCOP-servo por montri la vetero-datumojn.
+Comment[es]= Un servicio DCOP para proporcionar datos meteorológicos.
+Comment[et]=DCOP teenus ilmaandmete esitamiseks.
+Comment[eu]=Eguraldiari buruzko datuak eskeintzeko DCOP zerbitzua
+Comment[fa]=یک خدمت DCOP برای Ùراهم کردن داده‌های آب Ùˆ هوا
+Comment[fi]=DCOP-palvelu säätietojen välittämiseen.
+Comment[fr]=Un service DCOP pour fournir des données sur le temps.
+Comment[ga]= Seirbhís DCOP chun faisnéis aimsire a chur ar fáil.
+Comment[gl]=Un servizo DCOP para obter dados climáticos.
+Comment[he]=שירות DCOP לסיפוק נתוני מזג ×וויר
+Comment[hr]=DCOP usluga s podacima o meteorološki uvjetima.
+Comment[hu]=DCOP-szolgáltatás időjárási adatok lekérdezéséhez
+Comment[is]=DCOP þjónusta sem veitir veðurupplýsingar.
+Comment[it]=Servizio DCOP per fornire dati meteorologici
+Comment[ja]=気象データをæä¾›ã™ã‚‹ DCOP サービス。
+Comment[km]= សáŸážœáž¶ DCOP សម្រាប់​ផ្ដល់​ទិន្ននáŸáž™â€‹áž¢áž¶áž€áž¶ážŸáž’ាážáž»Â áŸ”
+Comment[ko]=날씨 ë°ì´í„°ë¥¼ 제공하는 DCOP 서비스
+Comment[lv]=DCOP laikapstÄkļu piegÄdÄtÄjs.
+Comment[mk]= DCOP-ÑÐµÑ€Ð²Ð¸Ñ Ð·Ð° обезбедување на податоци за времето.
+Comment[mt]= Servizz DCOP li jipprovdi informazzjoni dwar it-temp.
+Comment[nb]=En DCOP-tjeneste som skaffer værdata.
+Comment[nds]= DCOP-Deenst för Wederdaten
+Comment[ne]=मौसम डेटा पà¥à¤°à¤¦à¤¾à¤¨ गरà¥à¤¨ DCOP सेवा
+Comment[nl]=Een DCOP-service die weergegevens aanlevert.
+Comment[nn]=Ei DCOP-teneste som kan levera vêrdata.
+Comment[pl]=Usługa DCOP podająca dane o pogodzie.
+Comment[pt]=Um serviço DCOP que fornece boletins meteorológicos.
+Comment[pt_BR]=Um serviço DCOP para fornecer dados sobre o tempo.
+Comment[ro]=Serviciu DCOP ce furnizează date despre starea vremii.
+Comment[ru]=Ð¡ÐµÑ€Ð²Ð¸Ñ DCOP, предоÑтавлÑющий данные о погоде.
+Comment[sk]=Služba DCOP poskytujúca dáta o poÄasí.
+Comment[sl]=Servis DCOP za zagotavljanje vremenskih podatkov.
+Comment[sr]=DCOP ÑÐµÑ€Ð²Ð¸Ñ ÐºÐ¾Ñ˜Ð¸ пружа информације о времену.
+Comment[sr@Latn]=DCOP servis koji pruža informacije o vremenu.
+Comment[sv]=En DCOP-tjänst för att tillhandahålla värderrapporter.
+Comment[ta]= வானிலை தகவலை வழஙà¯à®• ஒர௠டிகாப௠சேவை.
+Comment[tg]=Хизмати DCOP барои пуштибон кардани маълумоти ҳаво.
+Comment[tr]=Meteoroloji bilgisi sağlamak için DCOP servisi.
+Comment[uk]=Служба DCOP Ð´Ð»Ñ Ð½Ð°Ð´Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… про погоду.
+Comment[wa]=On siervice DCOP po dner des dnêyes sol meteyo.
+Comment[zh_CN]=æ供气象数æ®çš„ DCOP æœåŠ¡ã€‚
+Comment[zh_TW]=一個æ供氣象資料的 DCOP æœå‹™
diff --git a/kweather/main.cpp b/kweather/main.cpp
new file mode 100644
index 0000000..d6e8caa
--- /dev/null
+++ b/kweather/main.cpp
@@ -0,0 +1,35 @@
+#include <kuniqueapplication.h>
+#include <kcmdlineargs.h>
+#include <kdebug.h>
+#include <kaboutdata.h>
+#include <klocale.h>
+#include <dcopclient.h>
+#include "weatherservice.h"
+
+int main (int argc, char *argv[])
+{
+ KLocale::setMainCatalogue("kdelibs");
+ KAboutData aboutdata("KWeatherService", I18N_NOOP("KDE"),
+ "0.8", I18N_NOOP("KWeather DCOP Service"),
+ KAboutData::License_GPL, "(C) 2002, Ian Reinhart Geiser");
+ aboutdata.addAuthor("Ian Reinhart Geiser",I18N_NOOP("Developer"),"geiseri@kde.org");
+ aboutdata.addAuthor("Nadeem Hasan",I18N_NOOP("Developer"),"nhasan@kde.org");
+
+ KCmdLineArgs::init( argc, argv, &aboutdata );
+ // KCmdLineArgs::addCmdLineOptions( options );
+ KUniqueApplication::addCmdLineOptions();
+
+ if (!KUniqueApplication::start())
+ {
+ kdDebug() << "dcopservice is already running!" << endl;
+ return (0);
+ }
+
+ KUniqueApplication app;
+ // This app is started automatically, no need for session management
+ app.disableSessionManagement();
+ kdDebug() << "starting dcopservice " << endl;
+ new WeatherService(&app, "WeatherService");
+ return app.exec();
+
+}
diff --git a/kweather/metar_parser.cpp b/kweather/metar_parser.cpp
new file mode 100644
index 0000000..771d4d7
--- /dev/null
+++ b/kweather/metar_parser.cpp
@@ -0,0 +1,871 @@
+/***************************************************************************
+ metar_parser.cpp - Metar Parser
+ Based on code originally in weatherlib.cpp.
+ -------------------
+begin : Wed June 7 2004
+copyright : (C) 2004 by John Ratke
+ : (C) 2002-2004 Nadeem Hasan <nhasan@kde.org>
+ : (C) 2002-2004 Ian Geiser <geiseri@kde.org>
+email : jratke@comcast.net
+***************************************************************************/
+
+/***************************************************************************
+* *
+* This program is free software; you can redistribute it and/or modify *
+* it under the terms of the GNU General Public License as published by *
+* the Free Software Foundation; either version 2 of the License, or *
+* (at your option) any later version. *
+* *
+***************************************************************************/
+
+#include "config.h"
+
+#include <qdatetime.h>
+#include <kdebug.h>
+#include <math.h>
+
+#include "metar_parser.h"
+#include "stationdatabase.h"
+#include "sun.h"
+
+// Temperature conversion macros
+#define TEMP_C_TO_F(x) ( ((x) * 9/5) + 32 )
+#define TEMP_F_TO_C(x) ( ((x) - 32) * 5/9 )
+
+MetarParser::MetarParser(StationDatabase *stationDB,
+ KLocale::MeasureSystem units,
+ QDate date,
+ QTime time,
+ unsigned int localUTCOffset) :
+ m_stationDb(stationDB), m_units(units), m_date(date), m_time(time), m_localUTCOffset(localUTCOffset)
+{
+ CoverRegExp = QRegExp("^(FEW|SCT|BKN|OVC|SKC|CLR|CAVOK)([0-9]{3})?(?:TCU|CB)?$");
+ CurrentRegExp = QRegExp("^(\\+|-|VC)?([A-Z]{2,4})$");
+ WindRegExp = QRegExp("^([0-9]{3}|VRB)([0-9]{2,3})(?:G([0-9]{2,3}))?(KT|KMH|MPS)$");
+ VisRegExp = QRegExp("^([0-9]{1,2})SM$");
+ VisFracRegExp = QRegExp("^1/(2|4)SM$");
+ TempRegExp = QRegExp("^(M)?([0-9]{2})/(?:(M)?([0-9]{2}))?$");
+ TimeRegExp = QRegExp("^([0-9]{2}:[0-9]{2})$");
+ DateRegExp = QRegExp("^([0-9]{4}/[0-9]{2}/[0-9]{2})$");
+ PressRegExp = QRegExp("^([AQ])([0-9]{4})$");
+ TempTenRegExp = QRegExp("^T([01][0-9]{3})([01][0-9]{3})$");
+}
+
+void MetarParser::reset()
+{
+ // Initialize the WeatherInfo structure
+ weatherInfo.theWeather = QString::null;
+ weatherInfo.clouds = 0;
+ weatherInfo.windMPH = 0;
+ weatherInfo.tempC = 0;
+ weatherInfo.dewC = 0;
+ weatherInfo.heavy = false;
+ weatherInfo.qsCoverList.clear();
+ weatherInfo.qsCurrentList.clear();
+ weatherInfo.qsDate = m_date;
+ weatherInfo.qsTime = m_time;
+ weatherInfo.qsPressure = QString::null;
+ weatherInfo.qsTemperature = QString::null;
+ weatherInfo.qsDewPoint = QString::null;
+ weatherInfo.qsRelHumidity = QString::null;
+ weatherInfo.qsVisibility = QString::null;
+ weatherInfo.qsWindSpeed = QString::null;
+ weatherInfo.qsWindChill = QString::null;
+ weatherInfo.qsHeatIndex = QString::null;
+ weatherInfo.qsWindDirection = QString::null;
+ weatherInfo.stationNeedsMaintenance = false;
+}
+
+struct WeatherInfo MetarParser::processData(const QString &stationID, const QString &metar)
+{
+ reset();
+
+ weatherInfo.reportLocation = stationID;
+
+ kdDebug(12006) << "Processing data: " << metar << endl;
+
+ // Split at whitespace into tokens
+ QStringList dataList = QStringList::split(QRegExp("\\s+"), metar);
+ bool found = false;
+ bool beforeRemark = true;
+
+ for (QStringList::ConstIterator it = dataList.begin();
+ it != dataList.end(); ++it)
+ {
+ // Don't try to parse the ICAO location code
+ if ((!found) && (*it == weatherInfo.reportLocation.upper().stripWhiteSpace()))
+ {
+ found = true;
+ continue;
+ }
+
+ kdDebug(12006) << "Processing Token: " << *it << endl;
+
+ if (*it == "RMK")
+ {
+ beforeRemark = false;
+ continue;
+ }
+
+ if (beforeRemark)
+ {
+ if (parseDate(*it))
+ continue;
+ if (parseTime(*it))
+ continue;
+ if (parseWindSpeed(*it))
+ continue;
+ if (parseVisibility(it)) // Note, pass in iterator.
+ continue;
+ if (parseTemperature(*it))
+ continue;
+ if (parsePressure(*it))
+ continue;
+ if (parseCover(*it))
+ continue;
+ if (parseCurrent(*it))
+ continue;
+ }
+ else
+ {
+ if (parseTemperatureTenths(*it))
+ continue;
+ if (parseStationNeedsMaintenance(*it))
+ continue;
+ }
+ }
+
+ calcTemperatureVariables();
+ calcWindChill();
+ calcCurrentIcon();
+
+ return weatherInfo;
+}
+
+/** Parse the current cover type */
+bool MetarParser::parseCover(const QString &s)
+{
+ if (CoverRegExp.search(s) > -1)
+ {
+ kdDebug(12006) << "Cover: " << CoverRegExp.capturedTexts().join("-")
+ << endl;
+
+ QString sCode = CoverRegExp.cap(1);
+ float height = CoverRegExp.cap(2).toFloat(); // initially in 100's of feet
+ QString sClouds;
+ QString skycondition;
+
+ height *= 100;
+ if (m_units == KLocale::Metric)
+ {
+ height = height * 0.3048;
+ // using plural i18n form for proper translations
+ sClouds = i18n("1 meter", "%n meters", (int)height);
+ }
+ else
+ {
+ // using plural i18n form for proper translations
+ sClouds = i18n("1 foot", "%n feet", (int)height);
+ }
+
+ if (sCode == "FEW")
+ {
+ skycondition = i18n( "Few clouds at %1" ).arg(sClouds);
+ weatherInfo.clouds += 2;
+ }
+ else if (sCode == "SCT")
+ {
+ skycondition = i18n( "Scattered clouds at %1" ).arg(sClouds);
+ weatherInfo.clouds += 4;
+ }
+ else if (sCode == "BKN")
+ {
+ skycondition = i18n( "Broken clouds at %1" ).arg(sClouds);
+ weatherInfo.clouds += 8;
+ }
+ else if (sCode == "OVC")
+ {
+ skycondition = i18n( "Overcast clouds at %1" ).arg(sClouds);
+ weatherInfo.clouds += 64;
+ }
+ else if ((sCode == "CLR") || (sCode == "SKC") || (sCode == "CAVOK"))
+ {
+ skycondition = i18n("Clear skies");
+ weatherInfo.clouds = 0;
+ }
+
+ kdDebug(12006) << "*** Clouds: " << weatherInfo.clouds << endl;
+ weatherInfo.qsCoverList << skycondition;
+
+ return true;
+ }
+ return false;
+}
+
+/** Parse the current weather conditions */
+bool MetarParser::parseCurrent(const QString &s)
+{
+ if (CurrentRegExp.search(s) > -1)
+ {
+ QString sIntensity = CurrentRegExp.cap(1);
+ QString sCode = CurrentRegExp.cap(2);
+ QString intensity, descriptor, phenomena, currentWeather;
+
+ kdDebug(12006) << "Current: " << CurrentRegExp.capturedTexts().join("-") << endl;
+
+ // Decode the intensity
+ if (sIntensity == "+")
+ {
+ intensity = i18n("Heavy");
+ weatherInfo.heavy = true;
+ }
+ else if (sIntensity == "-")
+ {
+ intensity = i18n("Light");
+ weatherInfo.heavy = false;
+ }
+
+ // Decode the descriptor
+ if (sCode.contains("MI"))
+ descriptor = i18n("Shallow");
+ else if (sCode.contains("PR"))
+ descriptor = i18n("Partial");
+ else if (sCode.contains("BC"))
+ descriptor = i18n("Patches");
+ else if (sCode.contains("DR"))
+ descriptor = i18n("Low Drifting");
+ else if (sCode.contains("BL"))
+ descriptor = i18n("Blowing");
+ else if (sCode.contains("SH"))
+ {
+ descriptor = i18n("Showers");
+ weatherInfo.theWeather = "shower";
+ }
+ else if (sCode.contains("TS"))
+ {
+ descriptor = i18n("Thunder Storm");
+ weatherInfo.theWeather = "tstorm";
+ }
+ else if (sCode.contains("FZ"))
+ {
+ descriptor = i18n("Freezing");
+ }
+
+ // Decode weather phenomena
+ if (sCode.contains("DZ"))
+ {
+ phenomena = i18n("Drizzle");
+ weatherInfo.theWeather = "light_rain";
+ }
+ else if (sCode.contains("RA"))
+ {
+ phenomena = i18n("Rain");
+ weatherInfo.theWeather = "shower";
+ }
+ else if (sCode.contains("SN"))
+ {
+ phenomena = i18n("Snow");
+ weatherInfo.theWeather = "snow";
+ }
+ else if (sCode.contains("SG"))
+ {
+ phenomena = i18n("Snow Grains");
+ weatherInfo.theWeather = "snow4";
+ }
+ else if (sCode.contains("IC"))
+ {
+ phenomena = i18n("Ice Crystals");
+ weatherInfo.theWeather = "hail";
+ }
+ else if (sCode.contains("PE"))
+ {
+ phenomena = i18n("Ice Pellets");
+ weatherInfo.theWeather = "hail";
+ }
+ else if (s.contains("GR"))
+ {
+ phenomena = i18n("Hail");
+ weatherInfo.theWeather = "hail";
+ }
+ else if (sCode.contains("GS"))
+ {
+ phenomena = i18n("Small Hail Pellets");
+ weatherInfo.theWeather = "hail";
+ }
+ else if (s.contains("UP"))
+ {
+ phenomena = i18n("Unknown Precipitation");
+ weatherInfo.theWeather = iconName("shower1");
+ }
+ else if (sCode.contains("BR"))
+ {
+ phenomena = i18n("Mist");
+ // Mist has lower priority than say rain or snow
+ if ( weatherInfo.theWeather.isEmpty() )
+ {
+ weatherInfo.theWeather = "mist";
+ }
+ }
+ else if (sCode.contains("FG"))
+ {
+ phenomena = i18n("Fog");
+ // Fog has lower priority than say rain or snow
+ if ( weatherInfo.theWeather.isEmpty() )
+ {
+ weatherInfo.theWeather = "fog";
+ }
+ }
+ else if (sCode.contains("FU"))
+ phenomena = i18n("Smoke");
+ else if (sCode.contains("VA"))
+ phenomena = i18n("Volcanic Ash");
+ else if (sCode.contains("DU"))
+ phenomena = i18n("Widespread Dust");
+ else if (sCode.contains("SA"))
+ phenomena = i18n("Sand");
+ else if (sCode.contains("HZ"))
+ phenomena = i18n("Haze");
+ else if (sCode.contains("PY"))
+ phenomena = i18n("Spray");
+ else if (sCode.contains("PO"))
+ phenomena = i18n("Dust/Sand Swirls");
+ else if (sCode.contains("SQ"))
+ phenomena = i18n("Sudden Winds");
+ else if (sCode.contains("FC"))
+ {
+ if (sIntensity == "+")
+ currentWeather = i18n("Tornado");
+ else
+ phenomena = i18n("Funnel Cloud");
+ }
+ else if (sCode.contains("SS"))
+ phenomena = i18n("Sand Storm");
+ else if (sCode.contains("DS"))
+ phenomena = i18n("Dust Storm");
+
+ if (currentWeather.isEmpty()) currentWeather = i18n("%1 is the intensity, %2 is the descriptor and %3 is the phenomena", "%1 %2 %3").arg(intensity).arg(descriptor).arg(phenomena);
+
+ if (!currentWeather.isEmpty())
+ weatherInfo.qsCurrentList << currentWeather;
+
+ return true;
+ }
+ return false;
+}
+
+/** Parse out the current temperature */
+bool MetarParser::parseTemperature(const QString &s)
+{
+ if (TempRegExp.search(s) > -1)
+ {
+ kdDebug(12006) << "Temp: " << TempRegExp.capturedTexts().join("-")
+ << endl;
+
+ float fTemp = TempRegExp.cap(2).toFloat();
+ if (TempRegExp.cap(1) == "M" && fTemp != 0 )
+ fTemp *= -1;
+ float fDew = TempRegExp.cap(4).toFloat();
+ if (TempRegExp.cap(3) == "M" && fDew != 0 )
+ fDew *= -1;
+
+ weatherInfo.tempC = fTemp;
+ weatherInfo.dewC = fDew;
+ return true;
+ }
+ return false;
+}
+
+bool MetarParser::parseTemperatureTenths(const QString &s)
+{
+ if (TempTenRegExp.search(s) > -1)
+ {
+ kdDebug(12006) << "Temp Tenths: " << TempTenRegExp.capturedTexts().join("-")
+ << endl;
+
+ float temperature = TempTenRegExp.cap( 1 ).toFloat() / 10;
+ float dewPoint = TempTenRegExp.cap( 2 ).toFloat() / 10;
+
+ if ( temperature >= 100 )
+ {
+ temperature -= 100;
+ temperature *= -1;
+ }
+ if ( dewPoint >= 100 )
+ {
+ dewPoint -= 100;
+ dewPoint *= -1;
+ }
+
+ weatherInfo.tempC = temperature;
+ weatherInfo.dewC = dewPoint;
+
+ return true;
+ }
+ return false;
+}
+
+void MetarParser::calcTemperatureVariables()
+{
+#define E(t) ::pow(10, 7.5*t/(237.7+t))
+ float fRelHumidity = E(weatherInfo.dewC)/E(weatherInfo.tempC) * 100;
+ if (fRelHumidity > 100.0) fRelHumidity = 100.0;
+
+ weatherInfo.qsRelHumidity.sprintf("%.1f", fRelHumidity);
+ removeTrailingDotZero(weatherInfo.qsRelHumidity);
+ weatherInfo.qsRelHumidity += "%";
+
+ float fHeatIndex = 0;
+ float tempF = TEMP_C_TO_F(weatherInfo.tempC);
+ if (tempF >= 80)
+ {
+#define SQR(a) ((a)*(a))
+ fHeatIndex = -42.379 + (2.04901523*tempF)
+ + (10.14333127*fRelHumidity)
+ - (0.22475541*tempF*fRelHumidity)
+ - (0.00683783*SQR(tempF))
+ - (0.05481717*SQR(fRelHumidity))
+ + (0.00122874*SQR(tempF)*fRelHumidity)
+ + (0.00085282*tempF*SQR(fRelHumidity))
+ - (0.00000199*SQR(tempF)*SQR(fRelHumidity));
+
+ if ( fHeatIndex <= tempF )
+ fHeatIndex = 0;
+ }
+
+ QString unit;
+ if (m_units == KLocale::Metric)
+ {
+ unit = i18n("°C");
+ weatherInfo.qsTemperature.sprintf("%.1f", weatherInfo.tempC);
+ weatherInfo.qsDewPoint.sprintf("%.1f", weatherInfo.dewC);
+ if (fHeatIndex >= 80)
+ weatherInfo.qsHeatIndex.sprintf("%.1f", TEMP_F_TO_C(fHeatIndex));
+ }
+ else
+ {
+ unit = i18n("°F");
+ weatherInfo.qsTemperature.sprintf("%.1f", tempF);
+ weatherInfo.qsDewPoint.sprintf("%.1f", TEMP_C_TO_F(weatherInfo.dewC));
+ if (fHeatIndex >= 80)
+ weatherInfo.qsHeatIndex.sprintf("%.1f", (fHeatIndex));
+ }
+
+ removeTrailingDotZero(weatherInfo.qsTemperature);
+ removeTrailingDotZero(weatherInfo.qsDewPoint);
+ removeTrailingDotZero(weatherInfo.qsHeatIndex);
+
+ weatherInfo.qsTemperature += unit;
+ weatherInfo.qsDewPoint += unit;
+ if (!weatherInfo.qsHeatIndex.isEmpty())
+ weatherInfo.qsHeatIndex += unit;
+}
+
+void MetarParser::removeTrailingDotZero(QString &string)
+{
+ if ( string.right( 2 ) == ".0" )
+ {
+ string = string.left( string.length() - 2 );
+ }
+}
+
+/** Parse out the current date. */
+bool MetarParser::parseDate(const QString &s)
+{
+ if (DateRegExp.search(s) > -1)
+ {
+ kdDebug(12006) << "Date: " << DateRegExp.capturedTexts().join("-")
+ << endl;
+ QString dateString = DateRegExp.cap(1);
+ QString day, month, year;
+
+ day = dateString.mid(8,2);
+ month = dateString.mid(5,2);
+ year = dateString.mid(0,4);
+
+ QDate theDate(year.toInt(), month.toInt(), day.toInt());
+
+
+ weatherInfo.qsDate = theDate;
+ return true;
+ }
+ return false;
+}
+
+/** Parse out the current time. */
+bool MetarParser::parseTime(const QString &s)
+{
+ if (TimeRegExp.search(s) > -1)
+ {
+ kdDebug(12006) << "Time: " << TimeRegExp.capturedTexts().join("-")
+ << endl;
+
+ QString hour, minute, dateString;
+
+ dateString = TimeRegExp.cap(1);
+ hour = dateString.mid(0,2);
+ minute = dateString.mid(3,2);
+ QTime theTime(hour.toInt(), minute.toInt());
+
+ weatherInfo.qsTime = theTime;
+ return true;
+ }
+ return false;
+}
+
+/** Parse out the current visibility */
+bool MetarParser::parseVisibility(QStringList::ConstIterator it)
+{
+ float fVisibility = 0;
+
+ if (VisRegExp.search(*it) > -1)
+ {
+ fVisibility = VisRegExp.cap(1).toFloat();
+
+ kdDebug(12006) << "Visibility: " << VisRegExp.capturedTexts().join("-")
+ << endl;
+
+ }
+ else if (VisFracRegExp.search(*it) > -1)
+ {
+ // got a fractional visibility, go back to previous string in the list
+ // and get the whole part.
+ fVisibility = (*(it--)).toFloat();
+ // shouldn't be necessary?
+ //it++;
+ fVisibility += ( 1 / VisFracRegExp.cap(1).toFloat() );
+ }
+
+ if (fVisibility > 0)
+ {
+ if (m_units == KLocale::Metric)
+ {
+ fVisibility *= 1.6;
+ weatherInfo.qsVisibility.setNum(fVisibility);
+ weatherInfo.qsVisibility += i18n("km");
+ }
+ else
+ {
+ weatherInfo.qsVisibility.setNum(fVisibility);
+ weatherInfo.qsVisibility += i18n("m");
+ }
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+/** Parse out the current pressure. */
+bool MetarParser::parsePressure( const QString &s)
+{
+ if (PressRegExp.search(s) > -1)
+ {
+ QString type = PressRegExp.cap(1);
+ float fPressure = PressRegExp.cap(2).toFloat();
+
+ kdDebug(12006) << "Pressure: " << PressRegExp.capturedTexts().join("-")
+ << endl;
+
+ if (m_units == KLocale::Metric)
+ {
+ if (type == "A")
+ fPressure *= (33.8639/100);
+ weatherInfo.qsPressure.setNum(fPressure, 'f', 0);
+ weatherInfo.qsPressure += i18n(" hPa");
+ }
+ else
+ {
+ if (type == "Q")
+ fPressure /= 33.8639;
+ else
+ fPressure /= 100;
+ weatherInfo.qsPressure.setNum(fPressure, 'f', 2);
+ weatherInfo.qsPressure += i18n("\" Hg");
+ }
+ return true;
+ }
+ return false;
+}
+
+struct wind_info
+{
+ unsigned int number;
+ QString name;
+};
+
+static const struct wind_info wind_direction[] =
+{
+ { 0, i18n("N") }, // North is 0 to 11, and so on
+ { 12, i18n("NNE") },
+ { 33, i18n("NE") },
+ { 57, i18n("ENE") },
+ { 79, i18n("E") },
+ { 102, i18n("ESE") },
+ { 124, i18n("SE") },
+ { 147, i18n("SSE") },
+ { 169, i18n("S") },
+ { 192, i18n("SSW") },
+ { 214, i18n("SW") },
+ { 237, i18n("WSW") },
+ { 259, i18n("W") },
+ { 282, i18n("WNW") },
+ { 304, i18n("NW") },
+ { 327, i18n("NNW") },
+ { 349, i18n("N") },
+ { 360, i18n("N") }
+};
+
+
+QString MetarParser::parseWindDirection(const unsigned int direction)
+{
+ unsigned int i = 0;
+
+ for (i = 0; i < (sizeof(wind_direction) / sizeof(wind_info)) - 1; i++)
+ {
+ if (direction >= wind_direction[i].number &&
+ direction < wind_direction[i + 1].number)
+ {
+ break;
+ }
+ }
+
+ return wind_direction[i].name;
+}
+
+/** Parse the wind speed */
+bool MetarParser::parseWindSpeed(const QString &s)
+{
+ if (WindRegExp.search(s) > -1)
+ {
+ unsigned int direction = WindRegExp.cap(1).toInt();
+ float windSpeed = WindRegExp.cap(2).toFloat();
+ float gustSpeed = WindRegExp.cap(3).toFloat();
+ QString sWindUnit = WindRegExp.cap(4);
+
+ kdDebug(12006) << "Wind: " << WindRegExp.capturedTexts().join("-")
+ << endl;
+
+ if (m_units == KLocale::Metric)
+ {
+ if (sWindUnit == "KT")
+ {
+ windSpeed = (windSpeed * 3.6 / 1.94);
+ gustSpeed = (gustSpeed * 3.6 / 1.94);
+ }
+ else if (sWindUnit == "MPS")
+ {
+ windSpeed = (windSpeed * 3.6);
+ gustSpeed = (gustSpeed * 3.6);
+ }
+ weatherInfo.windMPH = (windSpeed / 1.61);
+ weatherInfo.qsWindSpeed = i18n("1 km/h", "%n km/h", (int) windSpeed);
+ }
+ else
+ {
+ if (sWindUnit == "KT")
+ {
+ windSpeed = (windSpeed * 2.24 / 1.94);
+ gustSpeed = (gustSpeed * 2.24 / 1.94);
+ }
+ else if (sWindUnit == "KMH")
+ {
+ windSpeed = (windSpeed / 1.61);
+ gustSpeed = (gustSpeed / 1.61);
+ }
+ else if (sWindUnit == "MPS")
+ {
+ windSpeed = (windSpeed * 2.24);
+ gustSpeed = (gustSpeed * 2.24);
+ }
+ weatherInfo.windMPH = windSpeed;
+ weatherInfo.qsWindSpeed = i18n("1 MPH", "%n MPH", (int) windSpeed);
+ }
+
+ if (gustSpeed >= 1)
+ {
+ if (m_units == KLocale::Metric)
+ {
+ weatherInfo.qsCurrentList << i18n("Wind gusts up to 1 km/h",
+ "Wind gusts up to %n km/h", (int) gustSpeed);
+ }
+ else
+ {
+ weatherInfo.qsCurrentList << i18n("Wind gusts up to 1 MPH",
+ "Wind gusts up to %n MPH", (int) gustSpeed);
+ }
+ }
+
+ if ((WindRegExp.cap(1) != "VRB") && (windSpeed >= 1))
+ {
+ weatherInfo.qsWindDirection = parseWindDirection(direction);
+ }
+ return true;
+ }
+ return false;
+}
+
+bool MetarParser::parseStationNeedsMaintenance(const QString &s)
+{
+ if (s == "$")
+ {
+ weatherInfo.stationNeedsMaintenance = true;
+ kdDebug(12006) << "Station Needs Maintenance" << endl;
+ return true;
+ }
+
+ return false;
+}
+
+void MetarParser::calcCurrentIcon()
+{
+ // Default to overcast clouds
+ if ( weatherInfo.clouds == -1 )
+ weatherInfo.clouds = 64;
+
+ if (weatherInfo.theWeather.isEmpty())
+ {
+ if (weatherInfo.clouds == 0)
+ weatherInfo.theWeather = iconName("sunny");
+ else if (weatherInfo.clouds > 0 && weatherInfo.clouds <= 2)
+ weatherInfo.theWeather = iconName("cloudy1");
+ else if ( weatherInfo.clouds > 2 && weatherInfo.clouds <= 4)
+ weatherInfo.theWeather = iconName("cloudy2");
+ else if ( weatherInfo.clouds > 4 && weatherInfo.clouds <= 8)
+ weatherInfo.theWeather = iconName("cloudy3");
+ else if ( weatherInfo.clouds > 8 && weatherInfo.clouds < 63)
+ weatherInfo.theWeather = iconName( "cloudy4" );
+ else
+ weatherInfo.theWeather = "cloudy5";
+ }
+ else if (weatherInfo.theWeather == "tstorm")
+ {
+ if ( weatherInfo.heavy )
+ weatherInfo.clouds = 30;
+
+ if (weatherInfo.clouds >= 0 && weatherInfo.clouds <= 10)
+ weatherInfo.theWeather = iconName("tstorm1");
+ else if ( weatherInfo.clouds > 10 && weatherInfo.clouds <= 20)
+ weatherInfo.theWeather = iconName("tstorm2");
+ else
+ weatherInfo.theWeather = "tstorm3";
+ }
+ else if (weatherInfo.theWeather == "shower")
+ {
+ if ( weatherInfo.heavy )
+ weatherInfo.clouds = 30;
+
+ if (weatherInfo.clouds >= 0 && weatherInfo.clouds <= 10)
+ weatherInfo.theWeather = iconName("shower1");
+ else if ( weatherInfo.clouds > 10 && weatherInfo.clouds <= 20)
+ weatherInfo.theWeather = iconName("shower2");
+ else
+ weatherInfo.theWeather = "shower3";
+ }
+ else if (weatherInfo.theWeather == "snow")
+ {
+ if ( weatherInfo.heavy )
+ weatherInfo.clouds = 30;
+
+ if (weatherInfo.clouds >= 0 && weatherInfo.clouds <= 8)
+ weatherInfo.theWeather = iconName("snow1");
+ else if ( weatherInfo.clouds > 8 && weatherInfo.clouds <= 16)
+ weatherInfo.theWeather = iconName("snow2");
+ else if (weatherInfo.clouds > 16 && weatherInfo.clouds <= 24)
+ weatherInfo.theWeather = iconName("snow3");
+ else
+ weatherInfo.theWeather = "snow5";
+ }
+ else if (isNight(weatherInfo.reportLocation) && weatherInfo.theWeather == "mist")
+ weatherInfo.theWeather = "mist_night";
+ else if (isNight(weatherInfo.reportLocation) && weatherInfo.theWeather == "fog")
+ weatherInfo.theWeather = "fog_night";
+ else if ( weatherInfo.theWeather == "mist" || weatherInfo.theWeather == "fog" )
+ {
+ if ( weatherInfo.clouds >= 63 )
+ weatherInfo.theWeather = "cloudy5";
+ }
+
+ kdDebug(12006) << "Clouds: " << weatherInfo.clouds << ", Icon: "
+ << weatherInfo.theWeather << endl;
+}
+
+void MetarParser::calcWindChill()
+{
+ float windChill = 35.74 + (0.6215 * TEMP_C_TO_F(weatherInfo.tempC))
+ - (35.75 * ::pow(weatherInfo.windMPH, 0.16))
+ + (0.4275 * TEMP_C_TO_F(weatherInfo.tempC) * ::pow(weatherInfo.windMPH, 0.16));
+
+ kdDebug(12006) << "Wind Chill: " << windChill << endl;
+
+ if (windChill < 48)
+ {
+ if (m_units == KLocale::Metric)
+ {
+ weatherInfo.qsWindChill.setNum(TEMP_F_TO_C(windChill), 'f', 1);
+ removeTrailingDotZero(weatherInfo.qsWindChill);
+ weatherInfo.qsWindChill += i18n("°C");
+ }
+ else
+ {
+ weatherInfo.qsWindChill.setNum(windChill, 'f', 1);
+ removeTrailingDotZero(weatherInfo.qsWindChill);
+ weatherInfo.qsWindChill += i18n("°F");
+ }
+ }
+}
+
+bool MetarParser::isNight(const QString &stationID) const
+{
+ QString upperStationID = stationID.upper();
+ QString latitude = m_stationDb->stationLatitudeFromID(upperStationID);
+ QString longitude = m_stationDb->stationLongitudeFromID(upperStationID);
+
+ if ( latitude.compare( i18n("Unknown Station" ) ) == 0 ||
+ longitude.compare( i18n("Unknown Station" ) ) == 0 )
+ {
+ return false;
+ }
+ else
+ {
+ Sun theSun( latitude, longitude , m_date, m_localUTCOffset );
+
+ QTime currently = m_time;
+
+ QTime civilStart = theSun.computeCivilTwilightStart();
+ QTime civilEnd = theSun.computeCivilTwilightEnd();
+
+ kdDebug (12006) << "station, current, lat, lon, start, end, offset: " <<
+ upperStationID << " " << currently << " " << latitude << " " <<
+ longitude << " " << civilStart << " " << civilEnd << " " <<
+ m_localUTCOffset << endl;
+
+ if (civilStart != civilEnd)
+ {
+ if (civilEnd < civilStart)
+ /* Handle daylight past midnight in local time */
+ /* for weather stations located at other timezones */
+ return (currently < civilStart && currently > civilEnd);
+ else
+ return (currently < civilStart || currently > civilEnd);
+ }
+ else
+ {
+ // Midnight Sun & Polar Night - In summer, the Sun is always
+ // over the horizon line ... so use latitude & today date to
+ // set isNight() value.
+ return ((m_date.daysInYear() >= 80 || m_date.daysInYear() <= 264) && latitude.contains("S"));
+ }
+ }
+}
+
+QString MetarParser::iconName( const QString &icon ) const
+{
+ QString _iconName = icon;
+
+ if ( isNight( weatherInfo.reportLocation ) )
+ _iconName += "_night";
+
+ return _iconName;
+}
+
diff --git a/kweather/metar_parser.h b/kweather/metar_parser.h
new file mode 100644
index 0000000..946c34d
--- /dev/null
+++ b/kweather/metar_parser.h
@@ -0,0 +1,123 @@
+/***************************************************************************
+ metar_parser.h - Metar Parser
+ -------------------
+begin : Wed June 7 2004
+copyright : (C) 2004 by John Ratke
+email : jratke@comcast.net
+***************************************************************************/
+
+/***************************************************************************
+* *
+* This program is free software; you can redistribute it and/or modify *
+* it under the terms of the GNU General Public License as published by *
+* the Free Software Foundation; either version 2 of the License, or *
+* (at your option) any later version. *
+* *
+***************************************************************************/
+
+#ifndef METAR_PARSER_H
+#define METAR_PARSER_H
+
+#include <kglobal.h>
+#include <klocale.h>
+#include <krfcdate.h>
+
+#include <qdatetime.h>
+#include <qregexp.h>
+#include <qstringlist.h>
+
+class StationDatabase;
+
+struct WeatherInfo
+{
+ /** The current weather state outside */
+ QString theWeather;
+ int clouds;
+ float windMPH;
+ float tempC;
+ float dewC;
+ bool heavy;
+ QStringList qsCoverList;
+ QStringList qsCurrentList;
+ QDate qsDate;
+ QString qsPressure;
+ QString qsTemperature;
+ QString qsDewPoint;
+ QString qsRelHumidity;
+ QTime qsTime;
+ QString qsVisibility;
+ QString qsWindSpeed;
+ QString qsWindChill;
+ QString qsHeatIndex;
+ QString qsWindDirection;
+ QString reportLocation;
+ bool stationNeedsMaintenance;
+};
+
+
+class MetarParser
+{
+ public:
+ MetarParser(StationDatabase *stationDB,
+ KLocale::MeasureSystem units = KLocale::Imperial,
+ QDate date = QDate::currentDate(),
+ QTime time = QTime::currentTime(),
+ unsigned int localUTCOffset = KRFCDate::localUTCOffset());
+
+ /*
+ * Process a METAR string (the second parameter) and return a WeatherInfo struct
+ *
+ * The first parameter is the station ICAO code, which is needed to match
+ * the code present in the METAR string in order to parse the rest of the
+ * data correctly. But the station code is also used to lookup the station
+ * latitude and longitude to calculate the sunrise and sunset time to see if
+ * the day or night icon should be used.
+ */
+ struct WeatherInfo processData(const QString &stationID, const QString &metar);
+
+ private:
+ bool parseCover(const QString &s);
+ bool parseCurrent(const QString &s);
+ bool parseTemperature(const QString &s);
+ bool parseTemperatureTenths(const QString &s);
+ void calcTemperatureVariables();
+ void removeTrailingDotZero(QString &string);
+ bool parseDate(const QString &s);
+ bool parseTime(const QString &s);
+ bool parseVisibility(QStringList::ConstIterator it);
+ bool parsePressure( const QString &s );
+ QString parseWindDirection(const unsigned int direction);
+ bool parseWindSpeed(const QString &s);
+ bool parseStationNeedsMaintenance(const QString &s);
+ void calcCurrentIcon();
+ void calcWindChill();
+ bool isNight(const QString &stationID) const;
+ QString iconName( const QString &icon ) const;
+
+ /*
+ * Reset the internal WeatherInfo struct of the class so that
+ * processing can be run again. (processData can be run again)
+ */
+ void reset();
+
+ StationDatabase* const m_stationDb;
+ const KLocale::MeasureSystem m_units;
+ const QDate m_date;
+ const QTime m_time;
+ const unsigned int m_localUTCOffset;
+
+ struct WeatherInfo weatherInfo;
+
+ QRegExp CoverRegExp;
+ QRegExp CurrentRegExp;
+ QRegExp WindRegExp;
+ QRegExp VisRegExp;
+ QRegExp VisFracRegExp;
+ QRegExp TempRegExp;
+ QRegExp TimeRegExp;
+ QRegExp DateRegExp;
+ QRegExp PressRegExp;
+ QRegExp TempTenRegExp;
+};
+
+#endif
diff --git a/kweather/metar_parser_test.cpp b/kweather/metar_parser_test.cpp
new file mode 100644
index 0000000..8b79695
--- /dev/null
+++ b/kweather/metar_parser_test.cpp
@@ -0,0 +1,218 @@
+/****************************************************************************
+ * metar_parser_test.cpp - MetarParser Test Program
+ *
+ * Run all of the unit tests with "make check". Run just this
+ * test with "make metar_parser_test; ./metar_parser_test"
+ * -------------------
+ * begin : Wednesday June 16 2004
+ * copyright : (C) 2004 by John Ratke
+ * email : jratke@comcast.net
+ ****************************************************************************/
+
+/****************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ****************************************************************************/
+
+#include <iostream>
+using namespace std;
+
+#include <qdatetime.h>
+#include <qfile.h>
+#include <qstringlist.h>
+
+#include <krfcdate.h>
+
+#include "stationdatabase.h"
+#include "metar_parser.h"
+
+void test1();
+void test2();
+
+void displayWeatherInfo(const struct WeatherInfo &wi);
+const char *getString(const QString &str);
+
+int localUTCOffset = -300;
+
+StationDatabase *stationDb;
+
+bool anyFailed = false;
+
+int main()
+{
+ bool found = false;
+
+ // try the stations.dat file in the current directory first.
+ QString path("stations.dat");
+
+ if (QFile::exists(path))
+ {
+ found = true;
+ }
+ else
+ {
+ // If we couldn't find it, then maybe the build directory is not the
+ // same as the source directory. If that is the case, try to read it
+ // from its location in the share/apps/kweatherservice directory, which
+ // means that make install would have had to be done first before calling
+ // make check so that the file will be there.
+
+ QString kdeDirs(getenv("KDEDIR"));
+
+ path = kdeDirs + "/share/apps/kweatherservice/stations.dat";
+ if (QFile::exists(path))
+ {
+ found = true;
+ }
+ }
+
+ if (found)
+ {
+ cout << "found stations.dat at " << path.latin1() << endl;
+ }
+ else
+ {
+ cout << "couldn't find stations.dat!! try \"make install\" before \"make check\"" << endl;
+ return 1;
+ }
+
+ stationDb = new StationDatabase(path);
+
+ test1();
+ test2();
+
+ delete stationDb;
+
+ // If success, return 0, else return 1
+ if (anyFailed)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+void test1()
+{
+ QDate Date(2004, 6, 17); // June 17th.
+ QTime Time(21, 7); // hours, minutes, seconds and ms defaults to 0
+
+ // Construct a MetarParser object for our tests.
+ MetarParser parser( stationDb, KLocale::Imperial, Date, Time, localUTCOffset );
+
+ struct WeatherInfo results = parser.processData("KUGN", "2004/06/18 00:55 KUGN 180055Z AUTO 04004KT 9SM SCT050 17/15 A3005 RMK AO2 SLP167 T01670150 TSNO");
+
+ if (results.theWeather == "cloudy2_night" &&
+ results.qsCoverList[0] == "Scattered clouds at 5000 feet" &&
+ results.qsVisibility == "9m" &&
+ results.qsPressure == "30.05\" Hg" &&
+ results.qsTemperature == "62.1°F" &&
+ results.qsDewPoint == "59°F" &&
+ results.qsRelHumidity == "89.7%" &&
+ results.qsWindSpeed == "4 MPH" &&
+ results.qsWindChill.isNull() &&
+ results.qsHeatIndex.isNull() &&
+ results.qsWindDirection == "NE" &&
+ results.reportLocation == "KUGN" &&
+ results.stationNeedsMaintenance == false)
+ {
+ cout << "passed" << endl;
+ }
+ else
+ {
+ cout << "failed" << endl;
+ displayWeatherInfo(results);
+ anyFailed = true;
+ }
+}
+
+void test2()
+{
+ QDate Date(2004, 6, 18); // June 18th.
+ QTime Time(18, 43); // hours, minutes, seconds and ms defaults to 0
+
+ // Construct a MetarParser object for our tests.
+ MetarParser parser( stationDb, KLocale::Imperial, Date, Time, localUTCOffset );
+
+ struct WeatherInfo results = parser.processData("KUGN", "2004/06/18 22:55 KUGN 182255Z 29005KT 10SM BKN110 21/13 A3010 RMK AO2 SLP187 T02110133");
+
+ if (results.theWeather == "cloudy3" &&
+ results.qsCoverList[0] == "Broken clouds at 11000 feet" &&
+ results.qsVisibility == "10m" &&
+ results.qsPressure == "30.10\" Hg" &&
+ results.qsTemperature == "70°F" &&
+ results.qsDewPoint == "55.9°F" &&
+ results.qsRelHumidity == "61.1%" &&
+ results.qsWindSpeed == "5 MPH" &&
+ results.qsWindChill.isNull() &&
+ results.qsHeatIndex.isNull() &&
+ results.qsWindDirection == "WNW" &&
+ results.reportLocation == "KUGN" &&
+ results.stationNeedsMaintenance == false)
+ {
+ cout << "passed" << endl;
+ }
+ else
+ {
+ cout << "failed" << endl;
+ displayWeatherInfo(results);
+ anyFailed = true;
+ }
+}
+
+void displayWeatherInfo(const struct WeatherInfo &wi)
+{
+ cout << "theWeather: " << getString(wi.theWeather) << endl;
+ cout << "clouds: " << wi.clouds << endl;
+ cout << "windMPH: " << wi.windMPH << endl;
+ cout << "tempC: " << wi.tempC << endl;
+ cout << "dewC: " << wi.dewC << endl;
+ cout << "heavy: " << wi.heavy << endl;
+
+ unsigned int i = 0;
+ for ( QStringList::ConstIterator it = wi.qsCoverList.begin();
+ it != wi.qsCoverList.end();
+ ++it, i++ ) {
+ cout << "qsCoverList[" << i << "]: " << (*it).latin1() << endl;
+ }
+ i = 0;
+ for ( QStringList::ConstIterator it = wi.qsCurrentList.begin();
+ it != wi.qsCurrentList.end();
+ ++it, i++ ) {
+ cout << "qsCurrentList[" << i << "]: " << (*it).latin1() << endl;
+ }
+
+ cout << "qsDate: " << wi.qsDate.toString().latin1() << endl;
+ cout << "qsPressure: " << getString(wi.qsPressure) << endl;
+ cout << "qsTemperature: " << getString(wi.qsTemperature) << endl;
+ cout << "qsDewPoint: " << getString(wi.qsDewPoint) << endl;
+ cout << "qsRelHumidity: " << getString(wi.qsRelHumidity) << endl;
+ cout << "qsTime: " << wi.qsTime.toString().latin1() << endl;
+ cout << "qsVisibility: " << getString(wi.qsVisibility) << endl;
+ cout << "qsWindSpeed: " << getString(wi.qsWindSpeed) << endl;
+ cout << "qsWindChill: " << getString(wi.qsWindChill) << endl;
+ cout << "qsHeatIndex: " << getString(wi.qsHeatIndex) << endl;
+ cout << "qsWindDirection: " << getString(wi.qsWindDirection) << endl;
+ cout << "reportLocation: " << getString(wi.reportLocation) << endl;
+ cout << "stationNeedsMaintenance: " << wi.stationNeedsMaintenance << endl;
+}
+
+static const char *nullString = "[null]";
+
+const char *getString(const QString &str)
+{
+ if (str.isNull())
+ {
+ return nullString;
+ }
+ else
+ {
+ return str.latin1();
+ }
+}
diff --git a/kweather/prefdialogdata.ui b/kweather/prefdialogdata.ui
new file mode 100644
index 0000000..e3d0f2e
--- /dev/null
+++ b/kweather/prefdialogdata.ui
@@ -0,0 +1,360 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>prefsDialogData</class>
+<author>ian reinhart geiser &lt;geiseri@kde.org&gt;</author>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>prefsDialogData</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>429</width>
+ <height>341</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>3</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>GroupBox2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>GroupBoxPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="title">
+ <string>Weather Station Options</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel1_4_2_2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Location:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_reportLocation</cstring>
+ </property>
+ </widget>
+ <widget class="KComboBox">
+ <property name="name">
+ <cstring>m_reportLocation</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>MinimumExpanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>m_viewMode</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="midLineWidth">
+ <number>0</number>
+ </property>
+ <property name="title">
+ <string>Panel Display Options</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignLeft</set>
+ </property>
+ <property name="exclusive">
+ <bool>true</bool>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>m_smallView</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Show icon only</string>
+ </property>
+ <property name="buttonGroupId">
+ <number>1</number>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>&lt;qt&gt;Click here to show only the weather icon.&lt;/qt&gt;</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This feature will allow you to make KWeather take up only one slot on the kicker. Normally this application will take up two slots. The small view will only show the weather icon, while the normal view will display both the icon and the current weather statistics. For the small view the weather statistics will be put on the buttons tool tip.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>CheckBox9</cstring>
+ </property>
+ <property name="text">
+ <string>Show &amp;icon and temperature</string>
+ </property>
+ <property name="buttonGroupId">
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>CheckBox10</cstring>
+ </property>
+ <property name="text">
+ <string>Show icon, temperature, &amp;wind and pressure information</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="buttonGroupId">
+ <number>3</number>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>GroupBox1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Logging Options</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>m_enableLog</cstring>
+ </property>
+ <property name="text">
+ <string>E&amp;nable logging</string>
+ </property>
+ </widget>
+ <spacer row="0" column="2">
+ <property name="name">
+ <cstring>Spacer6_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>294</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>m_labelLogFile</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Log &amp;file:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>m_logFile</cstring>
+ </property>
+ </widget>
+ <widget class="KURLRequester" row="1" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>m_logFile</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>252</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Enter the logfile name.</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Enter the full path and filename to enable logging in KWeather.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox3</cstring>
+ </property>
+ <property name="title">
+ <string>Text</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Color:</string>
+ </property>
+ </widget>
+ <widget class="KColorButton">
+ <property name="name">
+ <cstring>m_textColor</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>170</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+</customwidgets>
+<connections>
+ <connection>
+ <sender>m_enableLog</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_labelLogFile</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_enableLog</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_logFile</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="3" margin="6"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>kcombobox.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kcolorbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/kweather/reportmain.cpp b/kweather/reportmain.cpp
new file mode 100644
index 0000000..198263a
--- /dev/null
+++ b/kweather/reportmain.cpp
@@ -0,0 +1,63 @@
+#include "reportview.h"
+
+#include <stdlib.h>
+#include <kapplication.h>
+#include <kcmdlineargs.h>
+#include <kdebug.h>
+#include <kaboutdata.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <dcopclient.h>
+
+static KCmdLineOptions options[] =
+{
+ { "+location", I18N_NOOP( "METAR location code for the report" ), 0 },
+ KCmdLineLastOption
+};
+
+extern "C" KDE_EXPORT int kdemain(int argc, char *argv[])
+{
+ KAboutData aboutData("reportview", I18N_NOOP("Weather Report"),
+ "0.8", I18N_NOOP("Weather Report for KWeatherService"),
+ KAboutData::License_GPL, "(C) 2002-2003, Ian Reinhart Geiser");
+ aboutData.addAuthor("Ian Reinhart Geiser", I18N_NOOP("Developer"),
+ "geiseri@kde.org");
+ aboutData.addAuthor("Nadeem Hasan", I18N_NOOP("Developer"),
+ "nhasan@kde.org");
+
+ KGlobal::locale()->setMainCatalogue( "kweather" );
+
+ KCmdLineArgs::init( argc, argv, &aboutData );
+ KCmdLineArgs::addCmdLineOptions( options );
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ if ( args->count() != 1 )
+ {
+ args->usage();
+ return -1;
+ }
+
+ KApplication app;
+
+ DCOPClient *client = app.dcopClient();
+ client->attach();
+ QString error;
+ if (!client->isApplicationRegistered("KWeatherService"))
+ {
+ if (KApplication::startServiceByDesktopName("kweatherservice",
+ QStringList(), &error))
+ {
+ kdDebug() << "Starting kweatherservice failed: " << error << endl;
+ return -2;
+ }
+ }
+
+ QString reportLocation = args->arg( 0 );
+ reportView *report = new reportView(reportLocation);
+ args->clear();
+ report->exec();
+
+ delete report;
+
+ return 0;
+}
diff --git a/kweather/reportview.cpp b/kweather/reportview.cpp
new file mode 100644
index 0000000..af37d9b
--- /dev/null
+++ b/kweather/reportview.cpp
@@ -0,0 +1,185 @@
+/***************************************************************************
+ reportview.cpp - description
+ -------------------
+ begin : Sun Oct 15 2000
+ copyright : (C) 2000 by Ian Reinhart Geiser <geiseri@msoe.edu>
+ : ( C ) 2002-2004 Nadeem Hasan <nhasan@kde.org>
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include <kconfig.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <khtml_part.h>
+#include <khtmlview.h>
+#include <kglobalsettings.h>
+
+#include <qvbox.h>
+#include <qpixmap.h>
+#include <qapplication.h>
+
+#include "reportview.h"
+#include "weatherservice_stub.h"
+
+reportView::reportView(const QString &reportLocation)
+ : KDialogBase( (QWidget *)0, "report", false, QString::null, Close ),
+ m_locationCode(reportLocation)
+{
+ QVBox *vbox = makeVBoxMainWidget();
+ m_reportView = new KHTMLPart(vbox, "m_reportView");
+
+ KConfig config( "weather_panelappletrc" );
+ config.setGroup( "General Options" );
+ QSize defaultSize( 450, 325 );
+ resize( config.readSizeEntry( "reportview_size", &defaultSize ) );
+
+ centerOnScreen( this );
+
+ m_weatherService = new WeatherService_stub( "KWeatherService", "WeatherService" );
+
+ QPixmap icon = m_weatherService->icon( m_locationCode );
+ setIcon( icon );
+
+ render();
+}
+
+reportView::~reportView(){
+ delete m_weatherService;
+ // we do not have to delete m_reportView because this class is
+ // the parent of the QVBox, and that is the parent of the KHTMLPart.
+
+ KConfig config( "weather_panelappletrc" );
+ config.setGroup( "General Options" );
+ config.writeEntry( "reportview_size", size() );
+}
+
+/** Render the document */
+void reportView::render(){
+ QFont generalFont = KGlobalSettings::generalFont();
+ QString fntFamily = generalFont.family();
+ int fntSize = generalFont.pointSize();
+ if (fntSize == -1)
+ fntSize = QFontInfo(generalFont).pointSize();
+
+ QString textColor = KGlobalSettings::textColor().name();
+ QString baseColor = KGlobalSettings::baseColor().name();
+ QColorGroup cg = palette().active();
+ QString bgColor = cg.background().name();
+ QString hlColor = cg.highlight().name();
+ QString hlTextColor = cg.highlightedText().name();
+
+ QString locationName = m_weatherService->stationName(m_locationCode);
+ QString countryName = m_weatherService->stationCountry(m_locationCode);
+ QString temp = m_weatherService->temperature(m_locationCode);
+ QString dewPoint = m_weatherService->dewPoint( m_locationCode);
+ QString relHumidity = m_weatherService->relativeHumidity(m_locationCode );
+ QString heatIndex = m_weatherService->heatIndex(m_locationCode );
+ QString windChill = m_weatherService->windChill(m_locationCode );
+ QString pressure = m_weatherService->pressure(m_locationCode );
+ QString wind = m_weatherService->wind(m_locationCode );
+ QString sunRiseTime = m_weatherService->sunRiseTime(m_locationCode );
+ QString sunSetTime = m_weatherService->sunSetTime(m_locationCode );
+ QString date = m_weatherService->date(m_locationCode );
+ QString icon = m_weatherService->iconFileName(m_locationCode );
+ QStringList cover = m_weatherService->cover(m_locationCode );
+ QStringList weather = m_weatherService->weather(m_locationCode );
+
+ setCaption(i18n("Weather Report - %1").arg( locationName ) );
+
+ QString weatherText = "<ul>\n";
+
+ if ( m_weatherService->stationNeedsMaintenance( m_locationCode ) )
+ {
+ weatherText += "<li>" + i18n( "Station reports that it needs maintenance" ) + " \n";
+ }
+ for (QStringList::const_iterator it = cover.begin();
+ it != cover.end(); ++it)
+ weatherText += "<li>" + *it + "\n";
+
+ for (QStringList::const_iterator it = weather.begin();
+ it != weather.end(); ++it)
+ weatherText += "<li>" + *it + "\n";
+
+ weatherText += "</ul>\n";
+
+ QString contents =
+ "<html><head><style type=\"text/css\">" +
+ QString("body { font-family: \"%1\"; font-size: %2pt; color: %3; background-color: %4; }\n")
+ .arg(fntFamily).arg(fntSize).arg(textColor).arg(baseColor) +
+ QString("div.headerTitle { background-color: %1; color: %2; padding: 4px; font-size: 120%; border: solid %3 1px; }\n")
+ .arg(hlColor).arg(hlTextColor).arg(textColor) +
+ QString("div.headerMsg { background-color: %1; color: %2; border-bottom: solid %3 1px; "
+ "border-left: solid %4 1px; border-right: solid %5 1px; margin-bottom: 1em; padding: 2px; }\n")
+ .arg(bgColor).arg(textColor).arg(textColor).arg(textColor).arg(textColor) +
+ QString("</style><title></title></head><body dir=\"%1\">").arg( QApplication::reverseLayout()?"rtl":"ltr") +
+ "<div class=\"headerTitle\"><b>" + i18n( "Weather Report - %1 - %2" ).arg( locationName ).arg( countryName ) +
+ "</b></div>\n";
+
+ if ( ! date.isEmpty() )
+ contents += "<div class=\"headerMsg\"><b>" + i18n( "Latest data from %1" ).arg(date) + "</b></div>\n";
+
+ contents += QString(
+ "<table><tr><td width=\"60\" style=\"text-align: center; border: dotted %1 1px;\">"
+ "<img width=\"64\" height=\"64\" src=\"%2\" /></td>"
+ "<td style=\"vertical-align: top\">%3</td></tr>")
+ .arg(bgColor).arg(KURL(icon).url()).arg(weatherText) +
+ "</table><table>" +
+ QString("<tr><th style=\"text-align: right\">" + i18n( "Temperature:" )
+ + "</th><td>%1</td>"
+ "<td width=\"50\">&nbsp;</td>"
+ "<th style=\"text-align: right\">" + i18n( "Dew Point:" )
+ + "</th><td>%2</td></tr>"
+ "<tr><th style=\"text-align: right\">" + i18n( "Air Pressure:" )
+ + "</th><td>%3</td>"
+ "<td width=\"50\">&nbsp;</td>"
+ "<th style=\"text-align: right\">" + i18n( "Rel. Humidity:" )
+ + "</th><td>%4</td></tr>"
+ "<tr><th style=\"text-align: right\">" + i18n( "Wind Speed:" )
+ + "</th><td>%5</td>")
+ .arg(temp).arg(dewPoint).arg(pressure).arg(relHumidity)
+ .arg(wind) + "<td width=\"50\">&nbsp;</td>";
+
+ if (!heatIndex.isEmpty())
+ contents += QString("<th style=\"text-align: right\">"
+ + i18n( "Heat Index:" ) + "</th><td>%1</td>").arg(heatIndex);
+ else if (!windChill.isEmpty())
+ contents += QString("<th style=\"text-align: right\">"
+ + i18n( "Wind Chill:" ) + "</th><td>%1</td>").arg(windChill);
+ else
+ contents += "<td>&nbsp;</td><td>&nbsp;</td>";
+ contents += "</tr>";
+
+ contents += QString("<tr><th style=\"text-align: right\">"
+ + i18n( "Sunrise:" ) + "</th><td>%1</td>" +
+ "<td width=\"50\">&nbsp;</td><th style=\"text-align: right\">"
+ + i18n( "Sunset:" ) + "</th><td>%2</td>")
+ .arg(sunRiseTime).arg(sunSetTime);
+
+ contents += "</tr></table></body></html>";
+
+ m_reportView->begin();
+ m_reportView->write( contents );
+ m_reportView->end();
+
+ QScrollView *view = m_reportView->view();
+ kdDebug() << "Size " << view->size().height() << "," << view->size().width() << endl;
+ kdDebug() << "Size " << view->visibleHeight() << "," << view->visibleWidth() << endl;
+
+ m_reportView->view()->resize(view->size().width(), view->size().height());
+
+}
+
+#include "reportview.moc"
+
+/* vim: et sw=4 ts=4
+*/
+
diff --git a/kweather/reportview.h b/kweather/reportview.h
new file mode 100644
index 0000000..569a071
--- /dev/null
+++ b/kweather/reportview.h
@@ -0,0 +1,47 @@
+/***************************************************************************
+ reportview.h - description
+ -------------------
+ begin : Sun Oct 15 2000
+ copyright : (C) 2000 by Ian Reinhart Geiser
+ email : geiseri@msoe.edu
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef REPORTVIEW_H
+#define REPORTVIEW_H
+
+#include <kdialogbase.h>
+#include <qstringlist.h>
+
+
+class KHTMLPart;
+class WeatherService_stub;
+
+/**This is the main report generated for the user.
+ *@author Ian Reinhart Geiser
+ */
+
+class reportView : public KDialogBase {
+ Q_OBJECT
+
+public:
+ reportView(const QString &reportLocation);
+ ~reportView();
+
+ void render();
+
+private:
+ WeatherService_stub *m_weatherService;
+ KHTMLPart *m_reportView;
+ QString m_locationCode;
+};
+
+#endif
diff --git a/kweather/serviceconfigdata.ui b/kweather/serviceconfigdata.ui
new file mode 100644
index 0000000..5ebdcde
--- /dev/null
+++ b/kweather/serviceconfigdata.ui
@@ -0,0 +1,258 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>wsPrefs</class>
+<author>Ian Reinhart Geiser &lt;geiseri@kde.org&gt;</author>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>wsPrefs</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>374</width>
+ <height>315</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="KPushButton" row="2" column="1">
+ <property name="name">
+ <cstring>mAddButton</cstring>
+ </property>
+ <property name="text">
+ <string>A&amp;dd</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="2">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Se&amp;lected stations:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>mSelectedStations</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>A&amp;vailable stations:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>mAllStations</cstring>
+ </property>
+ </widget>
+ <spacer row="1" column="1">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>86</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KListView" row="1" column="2" rowspan="4" colspan="1">
+ <column>
+ <property name="text">
+ <string>Selected</string>
+ </property>
+ <property name="clickable">
+ <bool>false</bool>
+ </property>
+ <property name="resizable">
+ <bool>false</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>mSelectedStations</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="resizeMode">
+ <enum>LastColumn</enum>
+ </property>
+ <property name="fullWidth">
+ <bool>false</bool>
+ </property>
+ <property name="itemsMovable">
+ <bool>false</bool>
+ </property>
+ <property name="autoOpen">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="KPushButton" row="3" column="1">
+ <property name="name">
+ <cstring>mRemoveButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Remove</string>
+ </property>
+ </widget>
+ <spacer row="4" column="1">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>85</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KListView" row="1" column="0" rowspan="4" colspan="1">
+ <column>
+ <property name="text">
+ <string>All</string>
+ </property>
+ <property name="clickable">
+ <bool>false</bool>
+ </property>
+ <property name="resizable">
+ <bool>false</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>mAllStations</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="rootIsDecorated">
+ <bool>true</bool>
+ </property>
+ <property name="resizeMode">
+ <enum>LastColumn</enum>
+ </property>
+ <property name="fullWidth">
+ <bool>false</bool>
+ </property>
+ <property name="itemsMovable">
+ <bool>false</bool>
+ </property>
+ <property name="autoOpen">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="5" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>mExit</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Stop Weather Service</string>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>mUpdate</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Update All</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+</customwidgets>
+<connections>
+ <connection>
+ <sender>mAddButton</sender>
+ <signal>clicked()</signal>
+ <receiver>wsPrefs</receiver>
+ <slot>addStation()</slot>
+ </connection>
+ <connection>
+ <sender>mRemoveButton</sender>
+ <signal>clicked()</signal>
+ <receiver>wsPrefs</receiver>
+ <slot>removeStation()</slot>
+ </connection>
+ <connection>
+ <sender>mUpdate</sender>
+ <signal>clicked()</signal>
+ <receiver>wsPrefs</receiver>
+ <slot>updateStations()</slot>
+ </connection>
+ <connection>
+ <sender>mExit</sender>
+ <signal>clicked()</signal>
+ <receiver>wsPrefs</receiver>
+ <slot>exitWeatherService()</slot>
+ </connection>
+ <connection>
+ <sender>mSelectedStations</sender>
+ <signal>selectionChanged(QListViewItem*)</signal>
+ <receiver>wsPrefs</receiver>
+ <slot>selectionChanged(QListViewItem*)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>mAllStations</tabstop>
+ <tabstop>mSelectedStations</tabstop>
+ <tabstop>mAddButton</tabstop>
+ <tabstop>mRemoveButton</tabstop>
+ <tabstop>mExit</tabstop>
+ <tabstop>mUpdate</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in implementation">kiconloader.h</include>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+ <include location="global" impldecl="in implementation">knuminput.h</include>
+</includes>
+<slots>
+ <slot>exitWeatherService()</slot>
+ <slot>removeStation()</slot>
+ <slot>updateStations()</slot>
+ <slot>addStation()</slot>
+ <slot>selectionChanged( QListViewItem* )</slot>
+</slots>
+<layoutdefaults spacing="3" margin="6"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>klistview.h</includehint>
+ <includehint>klistview.h</includehint>
+</includehints>
+</UI>
diff --git a/kweather/serviceconfigwidget.cpp b/kweather/serviceconfigwidget.cpp
new file mode 100644
index 0000000..5372984
--- /dev/null
+++ b/kweather/serviceconfigwidget.cpp
@@ -0,0 +1,239 @@
+/*
+ This file is part of KWeather.
+ Copyright (c) 2004 Tobias Koenig <tokoe@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include <qimage.h>
+#include <qheader.h>
+
+#include <dcopclient.h>
+#include <dcopref.h>
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdialog.h>
+#include <kglobal.h>
+#include <klistview.h>
+#include <klocale.h>
+#include <kpushbutton.h>
+#include <kstandarddirs.h>
+
+#include "serviceconfigwidget.h"
+#include "weatherservice_stub.h"
+
+class StationItem : public QListViewItem
+{
+ public:
+ StationItem( QListView *view, const QString &name, const QString &uid )
+ : QListViewItem( view, name ), mUID( uid )
+ {
+ }
+
+ StationItem( QListViewItem *item, const QString &name, const QString &uid )
+ : QListViewItem( item, name ), mUID( uid )
+ {
+ }
+
+ QString uid() const { return mUID; }
+
+ private:
+ QString mUID;
+};
+
+static void parseStationEntry( const QString &line, QString &name, QString &uid );
+
+ServiceConfigWidget::ServiceConfigWidget( QWidget *parent, const char *name )
+ : wsPrefs( parent, name ), mService(0)
+{
+ mService = new WeatherService_stub( "KWeatherService", "WeatherService" );
+ connect( mAllStations, SIGNAL( doubleClicked ( QListViewItem *, const QPoint &, int ) ), SLOT( addStation() ) );
+ connect( mSelectedStations, SIGNAL( doubleClicked ( QListViewItem *, const QPoint &, int ) ), SLOT( removeStation() ) );
+
+ initGUI();
+ loadLocations();
+ scanStations();
+}
+
+ServiceConfigWidget::~ServiceConfigWidget()
+{
+ delete mService;
+}
+
+void ServiceConfigWidget::addStation()
+{
+ if ( !dcopActive() )
+ return;
+
+ StationItem *item = dynamic_cast<StationItem*>( mAllStations->selectedItem() );
+ if ( item == 0 )
+ return;
+
+ mService->addStation( item->uid() );
+ scanStations();
+
+ modified();
+}
+
+void ServiceConfigWidget::removeStation()
+{
+ if ( !dcopActive() )
+ return;
+
+ StationItem *item = dynamic_cast<StationItem*>( mSelectedStations->selectedItem() );
+ if ( item == 0 )
+ return;
+
+ mService->removeStation( item->uid() );
+ scanStations();
+
+ modified();
+}
+
+void ServiceConfigWidget::updateStations()
+{
+ if ( !dcopActive() )
+ return;
+
+ mService->updateAll( );
+ scanStations();
+}
+
+void ServiceConfigWidget::exitWeatherService()
+{
+ if ( !dcopActive() )
+ return;
+
+ mService->exit();
+ modified();
+}
+
+void ServiceConfigWidget::scanStations()
+{
+ if ( !dcopActive() )
+ return;
+
+ QStringList list = mService->listStations( );
+
+ mSelectedStations->clear();
+ for ( uint i = 0; i < list.count(); ++i ) {
+ QPixmap pm = mService->icon( list[ i ] );
+ QImage img = pm.convertToImage();
+ img = img.smoothScale( 22, 22 );
+ pm.convertFromImage( img );
+
+ QString uid = list[ i ];
+ if (mStationMap[ uid ].isEmpty())
+ {
+ mStationMap[ uid ] = uid;
+ }
+ StationItem *item = new StationItem( mSelectedStations, mStationMap[ uid ], uid );
+
+ item->setPixmap( 0, pm );
+ }
+}
+
+void ServiceConfigWidget::selectionChanged( QListViewItem *item )
+{
+ mRemoveButton->setEnabled( item != 0 );
+}
+
+void ServiceConfigWidget::modified()
+{
+ emit changed( true );
+}
+
+void ServiceConfigWidget::initGUI()
+{
+ mAllStations->header()->hide();
+ mSelectedStations->header()->hide();
+}
+
+void ServiceConfigWidget::loadLocations()
+{
+ KConfig config( locate( "data", "kweatherservice/weather_stations.desktop" ) );
+
+ config.setGroup( "Main" );
+ QStringList regions = QStringList::split( ' ', config.readEntry( "regions" ) );
+
+ QStringList::ConstIterator regionIt;
+ for ( regionIt = regions.begin(); regionIt != regions.end(); ++regionIt ) {
+ config.setGroup( *regionIt );
+ QString name = config.readEntry( "name" );
+ QStringList states = config.readListEntry( "states", ' ' );
+
+ QListViewItem *regionItem = new QListViewItem( mAllStations, name );
+ regionItem->setSelectable( false );
+
+ QStringList::ConstIterator stateIt;
+ for ( stateIt = states.begin(); stateIt != states.end(); ++stateIt ) {
+ config.setGroup( *regionIt + "_" + *stateIt );
+ QString name = config.readEntry( "name" );
+
+ QListViewItem *stateItem = new QListViewItem( regionItem, name );
+ stateItem->setSelectable( false );
+
+ QMap<QString, QString> entries = config.entryMap( *regionIt + "_" + *stateIt );
+ QMap<QString, QString>::ConstIterator entryIt;
+ for ( entryIt = entries.begin(); entryIt != entries.end(); ++entryIt ) {
+ if ( entryIt.key() != "name" ) {
+ QString station, uid;
+ // get station and uid from the data
+ parseStationEntry( entryIt.data(), station, uid );
+ new StationItem( stateItem, station, uid );
+ mStationMap.insert( uid, QString( "%1, %2" )
+ .arg( station ).arg( *stateIt ) );
+ }
+ }
+ }
+ }
+}
+
+bool ServiceConfigWidget::dcopActive()
+{
+ QString error;
+ QCString appID;
+ bool isGood = true;
+ DCOPClient *client = kapp->dcopClient();
+ if ( !client->isApplicationRegistered( "KWeatherService" ) ) {
+ if ( KApplication::startServiceByDesktopName( "kweatherservice", QStringList(), &error, &appID ) )
+ isGood = false;
+ }
+
+ return isGood;
+}
+
+void parseStationEntry( const QString &line, QString &name, QString &uid )
+{
+ QStringList list = QStringList::split( ' ', line );
+
+ bool inName = true;
+
+ for ( uint i = 0; i < list.count(); ++i ) {
+ if ( inName ) {
+ if ( list[ i ].endsWith( "\\" ) ) {
+ name.append( list[ i ].replace( "\\", " " ) );
+ } else {
+ name.append( list[ i ] );
+ inName = false;
+ }
+ } else {
+ uid = list[ i ];
+ return;
+ }
+ }
+}
+
+#include "serviceconfigwidget.moc"
diff --git a/kweather/serviceconfigwidget.h b/kweather/serviceconfigwidget.h
new file mode 100644
index 0000000..f9b04f5
--- /dev/null
+++ b/kweather/serviceconfigwidget.h
@@ -0,0 +1,58 @@
+/*
+ This file is part of KWeather.
+ Copyright (c) 2004 Tobias Koenig <tokoe@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SERVICECONFIGWIDGET_H
+#define SERVICECONFIGWIDGET_H
+
+#include <serviceconfigdata.h>
+
+class QListViewItem;
+class WeatherService_stub;
+
+class ServiceConfigWidget : public wsPrefs
+{
+ Q_OBJECT
+
+ public:
+ ServiceConfigWidget( QWidget *parent, const char *name = 0 );
+ virtual ~ServiceConfigWidget();
+
+ signals:
+ void changed( bool );
+
+ public slots:
+ void addStation();
+ void removeStation();
+ void updateStations();
+ void exitWeatherService();
+
+ void selectionChanged( QListViewItem* );
+ void modified();
+
+ private:
+ void initGUI();
+ void loadLocations();
+ bool dcopActive();
+ void scanStations();
+
+ QMap<QString, QString> mStationMap;
+ WeatherService_stub *mService;
+};
+
+#endif
diff --git a/kweather/sidebarwidget.cpp b/kweather/sidebarwidget.cpp
new file mode 100644
index 0000000..fa2f008
--- /dev/null
+++ b/kweather/sidebarwidget.cpp
@@ -0,0 +1,49 @@
+ /*
+ * This file is part of the KDE project
+ * Copyright (C) 2002 Ian Reinhart Geiser <geiseri@kde.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2.0 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * $Id$
+ */
+
+ #include "sidebarwidget.h"
+ #include <qscrollview.h>
+
+ sidebarwidget::sidebarwidget(QWidget* parent, const char* name) :
+ sidebarwidgetbase(parent,name)
+ {
+ view = new QVBox(reportGrid->viewport());
+ reportGrid->addChild(view);
+ reportGrid->setResizePolicy(QScrollView::AutoOneFit);
+ }
+
+ sidebarwidget::~sidebarwidget()
+ {
+
+ }
+
+ void sidebarwidget::addWidget(QWidget *w, const QString &s)
+ {
+ w->setFixedWidth(reportGrid->visibleWidth ());
+ }
+
+ QWidget *sidebarwidget::viewport()
+ {
+ return view;
+ }
+
+#include "sidebarwidget.moc"
+
diff --git a/kweather/sidebarwidget.h b/kweather/sidebarwidget.h
new file mode 100644
index 0000000..0dbeb86
--- /dev/null
+++ b/kweather/sidebarwidget.h
@@ -0,0 +1,43 @@
+/*
+ * This file is part of the KDE project
+ * Copyright (C) 2002 Ian Reinhart Geiser <geiseri@kde.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2.0 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * $Id$
+ */
+
+#ifndef __SIDEBARWIDGET_H__
+#define __SIDEBARWIDGET_H__
+
+
+#include <sidebarwidgetbase.h>
+#include <qvbox.h>
+
+class sidebarwidget : public sidebarwidgetbase
+{
+Q_OBJECT
+public:
+ sidebarwidget(QWidget* parent, const char* name = 0);
+ virtual ~sidebarwidget();
+ void addWidget(QWidget *w, const QString &s);
+ QWidget *viewport();
+ QVBox *view;
+
+};
+
+#endif
+
+
diff --git a/kweather/sidebarwidgetbase.ui b/kweather/sidebarwidgetbase.ui
new file mode 100644
index 0000000..fe84dce
--- /dev/null
+++ b/kweather/sidebarwidgetbase.ui
@@ -0,0 +1,112 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>sidebarwidgetbase</class>
+<author>ian reinhart geiser &lt;geiseri@kde.org&gt;</author>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Form1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>338</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox" row="1" column="0">
+ <property name="name">
+ <cstring>GroupBox2</cstring>
+ </property>
+ <property name="title">
+ <string>Station Manager</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KComboBox">
+ <property name="name">
+ <cstring>stationList</cstring>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>addStation</cstring>
+ </property>
+ <property name="text">
+ <string>Add</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer row="0" column="1">
+ <property name="name">
+ <cstring>Spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="0" column="0">
+ <property name="name">
+ <cstring>reportGroup</cstring>
+ </property>
+ <property name="title">
+ <string>Weather Report</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QScrollView" row="0" column="0">
+ <property name="name">
+ <cstring>reportGrid</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>QScrollView</class>
+ <header location="global">qscrollview.h</header>
+ <sizehint>
+ <width>25</width>
+ <height>25</height>
+ </sizehint>
+ <container>1</container>
+ <sizepolicy>
+ <hordata>3</hordata>
+ <verdata>3</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ </customwidget>
+</customwidgets>
+<layoutdefaults spacing="5" margin="5"/>
+</UI>
diff --git a/kweather/stationdatabase.cpp b/kweather/stationdatabase.cpp
new file mode 100644
index 0000000..00f13c1
--- /dev/null
+++ b/kweather/stationdatabase.cpp
@@ -0,0 +1,170 @@
+//
+//
+// C++ Implementation: $MODULE$
+//
+// Description:
+//
+//
+// Author: ian reinhart geiser <geiseri@yahoo.com>, (C) 2003
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+#include "stationdatabase.h"
+
+#include <qstringlist.h>
+#include <qfile.h>
+#include <kdebug.h>
+
+class StationInfo
+{
+ public:
+ QString cityName;
+ QString country;
+ QString longitude;
+ QString latitude;
+ StationInfo () {}
+};
+
+StationDatabase::StationDatabase(const QString path) : mPath(path)
+{
+}
+
+
+StationDatabase::~StationDatabase()
+{
+}
+
+bool StationDatabase::loadStation( const QString & stationID )
+{
+ QFile file( mPath );
+ bool found = FALSE;
+
+ if ( !file.open( IO_ReadOnly ) )
+ return false;
+
+ QTextStream stream( &file );
+ stream.setEncoding( QTextStream::UnicodeUTF8 );
+ QString line;
+ while ( !stream.eof() )
+ {
+ line = stream.readLine(); // line of text excluding '\n'
+ QStringList data = QStringList::split( ";", line, true );
+
+ if ( data[ 0 ].stripWhiteSpace() == stationID )
+ {
+ StationInfo station;
+ station.cityName = data[ 3 ].stripWhiteSpace();
+ station.country = data[ 5 ].stripWhiteSpace();
+ station.latitude = data[ 7 ].stripWhiteSpace();
+ station.longitude = data[ 8 ].stripWhiteSpace();
+
+ theDB.insert( data[ 0 ], station );
+ found = TRUE;
+ break;
+ }
+ }
+
+ file.close();
+ return found;
+}
+
+/*!
+ \fn StationDatabase::stationNameFromID(const QString& id)
+ */
+QString StationDatabase::stationNameFromID( const QString & stationID )
+{
+ QString result;
+
+ if ( theDB.find( stationID ) == theDB.end() )
+ {
+ if ( loadStation( stationID ) )
+ result = theDB[ stationID ].cityName;
+ else
+ result = i18n( "Unknown Station" );
+ }
+ else
+ {
+ result = theDB[ stationID ].cityName;
+ }
+
+ return result;
+}
+
+/*!
+ \fn StationDatabase::stationLongitudeFromID( const QString &stationID)
+ */
+QString StationDatabase::stationLongitudeFromID( const QString & stationID )
+{
+ QString result;
+
+ if ( theDB.find( stationID ) == theDB.end() )
+ {
+ if ( loadStation( stationID ) )
+ result = theDB[ stationID ].longitude;
+ else
+ result = i18n( "Unknown Station" );
+ }
+ else
+ {
+ result = theDB[ stationID ].longitude;
+ }
+
+ return result;
+}
+
+/*!
+ \fn StationDatabase::stationLatitudeFromID(const QString &stationID)
+ */
+QString StationDatabase::stationLatitudeFromID( const QString & stationID )
+{
+ QString result;
+
+ if ( theDB.find( stationID ) == theDB.end() )
+ {
+ if ( loadStation( stationID ) )
+ result = theDB[ stationID ].latitude;
+ else
+ result = i18n( "Unknown Station" );
+ }
+ else
+ {
+ result = theDB[ stationID ].latitude;
+ }
+
+ return result;
+}
+
+/*!
+ \fn StationDatabase::stationCountryFromID( const QString &stationID)
+ */
+QString StationDatabase::stationCountryFromID( const QString &stationID )
+{
+ QString result;
+
+ if ( theDB.find( stationID ) == theDB.end() )
+ {
+ if ( loadStation( stationID ) )
+ result = theDB[ stationID ].country;
+ else
+ result = i18n( "Unknown Station" );
+ }
+ else
+ {
+ result = theDB[ stationID ].country;
+ }
+
+ return result;
+}
+
+QString StationDatabase::stationIDfromName( const QString &name )
+{
+ QMap<QString,StationInfo>::Iterator itr = theDB.begin();
+ for( ; itr != theDB.end(); ++itr)
+ {
+ kdDebug() << "Checking " << itr.data().cityName << endl;
+ if( itr.data().cityName == name )
+ return itr.key();
+ }
+ return "0000";
+}
diff --git a/kweather/stationdatabase.h b/kweather/stationdatabase.h
new file mode 100644
index 0000000..1e020a9
--- /dev/null
+++ b/kweather/stationdatabase.h
@@ -0,0 +1,54 @@
+//
+//
+// C++ Interface: $MODULE$
+//
+// Description:
+//
+//
+// Author: ian reinhart geiser <geiseri@yahoo.com>, (C) 2003
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+#ifndef STATIONDATABASE_H
+#define STATIONDATABASE_H
+
+#include <qmap.h>
+#include <qstring.h>
+
+#include <klocale.h>
+#include <kstandarddirs.h>
+
+/**
+This is the main database for mapping METAR codes to Station information.
+
+@author ian reinhart geiser
+*/
+
+class StationInfo;
+
+class StationDatabase
+{
+public:
+ StationDatabase(const QString path = locate("data", "kweatherservice/stations.dat"));
+ ~StationDatabase();
+
+ QString stationNameFromID(const QString& id);
+
+ QString stationLongitudeFromID( const QString &stationID);
+
+ QString stationLatitudeFromID(const QString &stationID);
+
+ QString stationCountryFromID( const QString &stationID);
+
+ QString stationIDfromName( const QString &name );
+
+private:
+ QMap<QString, StationInfo> theDB;
+
+ bool loadStation( const QString & stationID );
+
+ const QString mPath;
+};
+
+#endif
diff --git a/kweather/stationdatabase_test.cpp b/kweather/stationdatabase_test.cpp
new file mode 100644
index 0000000..902b7ab
--- /dev/null
+++ b/kweather/stationdatabase_test.cpp
@@ -0,0 +1,226 @@
+/****************************************************************************
+ * stationdatabase_test.cpp - Test Program for StationDatabase Class
+ * -------------------
+ * begin : Friday June 4 2004
+ * copyright : (C) 2004 by John Ratke
+ * email : jratke@comcast.net
+ ****************************************************************************/
+
+/****************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ****************************************************************************/
+
+#include <iostream>
+#include <cstdlib>
+using namespace std;
+
+#include <qfile.h>
+#include <qstring.h>
+#include <qdatetime.h>
+#include <krfcdate.h>
+
+#include "stationdatabase.h"
+
+
+int main()
+{
+ bool anyFailed = false;
+ bool found = false;
+
+ // try the stations.dat file in the current directory first.
+ QString path("stations.dat");
+
+ if (QFile::exists(path))
+ {
+ found = true;
+ }
+ else
+ {
+ // If we couldn't find it, then maybe the build directory is not the
+ // same as the source directory. If that is the case, try to read it
+ // from its location in the share/apps/kweatherservice directory, which
+ // means that make install would have had to be done first before calling
+ // make check so that the file will be there.
+
+ QString kdeDirs(getenv("KDEDIR"));
+
+ path = kdeDirs + "/share/apps/kweatherservice/stations.dat";
+ if (QFile::exists(path))
+ {
+ found = true;
+ }
+ }
+
+ if (found)
+ {
+ cout << "found stations.dat at " << path.latin1() << endl;
+ }
+ else
+ {
+ cout << "couldn't find stations.dat!! try \"make install\" before \"make check\"" << endl;
+ return 1;
+ }
+
+ StationDatabase stationDb(path);
+
+ cout << "Testing station name from ID with known station...";
+
+ if (stationDb.stationNameFromID("KORD") == "Chicago, Chicago-O'Hare International Airport")
+ {
+ cout << "passed" << endl;
+ }
+ else
+ {
+ cout << "failed" << endl;
+ anyFailed = true;
+ }
+
+ cout << "Testing station name from ID with unknown station...";
+
+ if (stationDb.stationNameFromID("KXYZ") == "Unknown Station")
+ {
+ cout << "passed" << endl;
+ }
+ else
+ {
+ cout << "failed" << endl;
+ anyFailed = true;
+ }
+
+ cout << "Testing station name from ID with known station already loaded...";
+
+ // station should be cached this time.
+ if (stationDb.stationNameFromID("KORD") == "Chicago, Chicago-O'Hare International Airport")
+ {
+ cout << "passed" << endl;
+ }
+ else
+ {
+ cout << "failed" << endl;
+ anyFailed = true;
+ }
+
+ cout << "Testing latitude from ID with known station...";
+
+ if (stationDb.stationLatitudeFromID("KPWK") == "42-07-15N")
+ {
+ cout << "passed" << endl;
+ }
+ else
+ {
+ cout << "failed" << endl;
+ anyFailed = true;
+ }
+
+ cout << "Testing latitude from ID with unknown station...";
+
+ if (stationDb.stationLatitudeFromID("KZZZ") == "Unknown Station")
+ {
+ cout << "passed" << endl;
+ }
+ else
+ {
+ cout << "failed" << endl;
+ anyFailed = true;
+ }
+
+ cout << "Testing latitude from ID with known station already loaded...";
+
+ if (stationDb.stationLatitudeFromID("KPWK") == "42-07-15N")
+ {
+ cout << "passed" << endl;
+ }
+ else
+ {
+ cout << "failed" << endl;
+ anyFailed = true;
+ }
+
+ cout << "Testing longitude from ID with known station...";
+
+ if (stationDb.stationLongitudeFromID("KAAA") == "089-20-06W")
+ {
+ cout << "passed" << endl;
+ }
+ else
+ {
+ cout << "failed" << endl;
+ anyFailed = true;
+ }
+
+ cout << "Testing longitude from ID with unknown station...";
+
+ if (stationDb.stationLongitudeFromID("KZYY") == "Unknown Station")
+ {
+ cout << "passed" << endl;
+ }
+ else
+ {
+ cout << "failed" << endl;
+ anyFailed = true;
+ }
+
+ cout << "Testing longitude from ID with known station already loaded...";
+
+ if (stationDb.stationLongitudeFromID("KAAA") == "089-20-06W")
+ {
+ cout << "passed" << endl;
+ }
+ else
+ {
+ cout << "failed" << endl;
+ anyFailed = true;
+ }
+
+ cout << "Testing country from ID with known station...";
+
+ if (stationDb.stationCountryFromID("KUGN") == "United States")
+ {
+ cout << "passed" << endl;
+ }
+ else
+ {
+ cout << "failed" << endl;
+ anyFailed = true;
+ }
+
+ cout << "Testing country from ID with unknown station...";
+
+ if (stationDb.stationCountryFromID("KYYY") == "Unknown Station")
+ {
+ cout << "passed" << endl;
+ }
+ else
+ {
+ cout << "failed" << endl;
+ anyFailed = true;
+ }
+
+ cout << "Testing country from ID with known station already loaded...";
+
+ if (stationDb.stationCountryFromID("KUGN") == "United States")
+ {
+ cout << "passed" << endl;
+ }
+ else
+ {
+ cout << "failed" << endl;
+ anyFailed = true;
+ }
+
+ // If success, return 0, else return 1
+ if (anyFailed)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+
+}
diff --git a/kweather/stations.dat b/kweather/stations.dat
new file mode 100644
index 0000000..3db1fc1
--- /dev/null
+++ b/kweather/stations.dat
@@ -0,0 +1,6615 @@
+AGGH;91;520;Honiara / Henderson;;Solomon Islands;5;09-25S;160-03E;;;8;9;P
+AGGL;91;541;Santa Cruz;;Solomon Islands;5;10-42S;165-48E;10-42S;165-48E;23;24;P
+AGGM;91;503;Munda;;Solomon Islands;5;08-20S;157-16E;;;6;6;P
+ANAU;91;530;Nauru Airport;;Nauru;5;00-32S;166-55E;;;6;6;
+AYMD;94;014;Madang;;Papua New Guinea;5;05-13S;145-47E;05-13S;145-47E;3;5;P
+AYMO;--;---;Manus Island/Momote;;Papua New Guinea;5;02-03-43S;147-25-27E;;;4;;
+AYPY;94;035;Moresby;;Papua New Guinea;5;09-26S;147-13E;09-26S;147-13E;38;49;P
+AYWK;94;004;Wewak;;Papua New Guinea;5;03-34S;143-38E;;;6;;P
+BGAM;04;360;Tasiilaq;;Greenland;6;65-36N;037-38W;65-36N;037-38W;50;52;P
+BGAS;04;285;Angisoq;;Greenland;6;59-59N;045-12W;;;16;16;
+BGAT;04;351;Aputiteeq;;Greenland;6;67-47N;032-18W;;;13;12;
+BGBW;04;270;Narsarsuaq;;Greenland;6;61-10N;045-25W;61-11N;045-26W;34;32;P
+BGCO;04;341;Constable Pynt;;Greenland;6;70-45N;022-39W;;;14;10;
+BGDB;04;330;Daneborg;;Greenland;6;74-18N;020-13W;;;44;44;
+BGDH;04;320;Danmarkshavn;;Greenland;6;76-46N;018-40W;76-46N;018-40W;11;12;P
+BGEM;04;220;Egedesminde;;Greenland;6;68-42N;052-45W;68-42N;052-45W;43;41;P
+BGFH;04;260;Frederikshaab;;Greenland;6;62-00N;049-40W;;;13;15;P
+BGGD;04;261;Groennedal;;Greenland;6;61-14N;048-06W;;;35;32;
+BGGH;04;250;Godthaab / Nuuk;;Greenland;6;64-10N;051-45W;;;80;70;P
+BGHB;04;230;Holsteinsborg;;Greenland;6;66-55N;053-40W;;;12;9;P
+BGJH;04;272;Julianehaab;;Greenland;6;60-43N;046-03W;;;32;34;P
+BGJN;04;221;Jacobshavn Lufthavn;;Greenland;6;69-14N;051-04W;;;29;31;
+BGKK;04;361;Kulusuk Lufthavn;;Greenland;6;65-35N;037-09W;;;35;37;
+BGKT;04;340;Cape Tobin Automated Reporting Station ;;Greenland;6;70-25N;021-58W;70-25N;021-58W;41;41;
+BGPC;04;390;Prins Christian Sund;;Greenland;6;60-03N;043-10W;;;88;75;
+BGSC;04;339;Scoresbysund;;Greenland;6;70-29N;021-57W;70-29N;021-58W;65;69;
+BGSF;04;231;Sdr Stroemfjord;;Greenland;6;67-01N;050-42W;67-00N;050-48W;50;53;P
+BGTL;04;202;Thule A. B.;;Greenland;6;76-32N;068-45W;76-32N;068-45W;77;77;P
+BIAR;04;063;Akureyri;;Iceland;6;65-41N;018-05W;;;23;27;P
+BIEG;04;089;Egilsstadir;;Iceland;6;65-17N;014-24W;;;23;23;
+BIGR;04;065;Grimsey;;Iceland;6;66-32N;018-01W;;;15;16;
+BIHN;04;082;Akurnes;;Iceland;6;64-18N;015-13W;;;17;21;P
+BIKF;04;018;Keflavikurflugvollur;;Iceland;6;63-58N;022-36W;63-58N;022-36W;52;54;P
+BIRG;04;077;Raufarhofn;;Iceland;6;66-27N;015-57W;;;8;8;P
+BIRK;04;030;Reykjavik;;Iceland;6;64-08N;021-54W;;;54;61;P
+BIST;04;013;Stykkisholmur;;Iceland;6;65-05N;022-44W;;;8;8;
+BIVM;04;048;Vestmannaeyjar;;Iceland;6;63-24N;020-17W;;;118;124;P
+BIVO;04;085;Skjaldthingsstadir;;Iceland;6;65-42N;014-49W;;;44;48;
+BIX1;--;---;Biloxi, Keesler Air Force Base, Navu;MS;United States;4;30-24-07N;088-55-04W;40-18-00N;088-08-00W;224;228;
+BIX2;--;---;Biloxi, Keesler Air Force Base, Navu;MS;United States;4;30-24-34N;088-55-08W;30-24-34N;088-55-08W;7;10;
+BIX3;--;---;Biloxi, Keesler Air Force Base, Navu;MS;United States;4;30-24-36N;088-55-09W;30-24-34N;088-55-08W;7;10;
+CTPP;--;---;Camp Canargus;;Haiti;4;18-34N;072-19W;;;38;;
+CWAC;71;483;Nitinat Lake Meteorological Aeronautical Presentation System ;;Canada;4;48-40N;124-50W;;;41;;
+CWAD;--;---;Cape Mudge Light House ;;Canada;4;50-00N;125-12W;;;4;;
+CWAE;--;---;Whistler ;;Canada;4;50-08N;122-57W;;;658;;
+CWAF;71;426;Ile Rouge Meteorological Aeronautical Presentation System ;;Canada;4;48-05N;069-33W;;;5;;
+CWAG;71;806;La Scie, Nfld.;;Canada;4;49-55N;055-40W;;;192;194;P
+CWAH;71;410;Amherst, N. S.;;Canada;4;45-51N;064-16W;;;22;23;P
+CWAJ;71;465;Erieau Meteorological Aeronautical Presentation System ;;Canada;4;42-15N;081-54W;;;178;;
+CWAN;71;112;Amphitrite Point;;Canada;4;48-55N;125-33W;;;27;;
+CWAQ;71;516;Coronach Spc;;Canada;4;49-03N;105-29W;;;756;;
+CWAR;71;807;Argentia, Nfld;;Canada;4;47-18N;054-00W;47-17N;054-00W;16;16;P
+CWAS;71;211;Pam Rocks;;Canada;4;49-29N;123-18W;;;;;
+CWAU;--;---;Dryad Point Light House ;;Canada;4;52-11N;128-07W;;;4;;
+CWAV;71;248;Sundre;;Canada;4;51-46N;114-41W;;;1114;;
+CWAX;71;819;St. Anthony, Nfld.;;Canada;4;51-22N;055-38W;;;106;111;P
+CWBA;71;122;Banff, Alta.;;Canada;4;51-11N;115-34W;;;1397;1384;P
+CWBE;71;460;Killarney Meteorological Aeronautical Presentation System ;;Canada;4;45-58N;081-29W;;;196;;
+CWBF;--;---;Burgeo Automated Reporting Station ;;Canada;4;47-37N;057-38W;;;12;;
+CWBG;71;760;Big Creek ;;Canada;4;51-15N;123-05W;;;1670;;
+CWBI;71;632;Britt, Ont.;;Canada;4;45-48N;080-32W;;;190;;P
+CWBJ;71;162;Inner Whalebacks;;Canada;4;61-55N;113-44W;;;165;;
+CWBK;71;415;Caribou Point Meteorological Aeronautical Presentation System ;;Canada;4;45-46N;062-41W;;;2;;
+CWBL;71;143;Bachelors Island Automated Reporting Station ;;Canada;4;51-45N;099-54W;;;256;;
+CWBM;71;230;Beaverlodge;;Canada;4;55-12N;119-24W;;;745;;
+CWBO;71;457;Brooks Automatic Weather Reporting System ;;Canada;4;50-33N;111-51W;;;747;;
+CWBR;71;049;B, R;;Canada;4;66-02N;091-50W;;;31;;
+CWBT;71;512;Longue Point De Mingan, Que.;;Canada;4;50-16N;064-14W;;;11;;
+CWBV;71;403;Beaven Island, N. S.;;Canada;4;44-49N;062-20W;;;14;10;P
+CWBY;71;810;Port Menier, Que.;;Canada;4;49-50N;064-18W;;;53;53;P
+CWBZ;71;712;St Anicet;;Canada;4;45-07N;074-17W;45-07N;074-17W;49;49;
+CWCA;71;818;Cartwright, Nfld.;;Canada;4;53-42N;057-02W;;;14;14;P
+CWCB;--;---;Nanakwa Shoals;;Canada;4;53-49N;128-50W;;;0;;
+CWCD;71;513;Saskatoon Kernen;;Canada;4;52-09N;106-33W;;;510;;
+CWCF;71;158;Berens River CS , Man.;;Canada;4;52-21N;097-02W;;;222;;
+CWCH;71;748;Atikokan Automated Reporting Station ;;Canada;4;48-45N;091-37W;;;424;;
+CWCI;71;433;Caribou Island, Ont.;;Canada;4;47-20N;085-50W;;;187;;P
+CWCJ;71;750;Pukaskwa ;;Canada;4;48-36N;086-18W;;;206;;
+CWCL;71;474;Clinton, B. C.;;Canada;4;51-09N;121-30W;;;1057;1057;P
+CWCM;71;170;Carberry Mcdc;;Canada;4;49-54N;099-21W;;;384;;
+CWCN;--;---;Malloch Dome Automatic Weather Reporting System ;;Canada;4;78-13N;101-03W;;;12;;
+CWCO;71;270;Collingwood Automatic Weather Reporting System ;;Canada;4;44-30N;080-13W;;;180;;
+CWCQ;--;---;Chatham Automatic Weather Reporting System ;;Canada;4;47-00N;065-28W;;;34;;
+CWCS;--;---;Cote-Ste-Cath Mot;;Canada;4;45-25N;073-34W;;;17;;
+CWCT;--;---;Coronation Automated Reporting Station ;;Canada;4;52-04N;111-28W;;;791;;
+CWCU;71;436;Barrie, Ont.;;Canada;4;44-23N;079-47W;;;295;;P
+CWCV;--;---;Nootka Lightstation, B. C.;;Canada;4;49-36N;126-37W;;;16;;
+CWCX;71;056;Clut Lake Automated Reporting Station ;;Canada;4;66-00N;117-46W;;;185;;
+CWCZ;--;---;Addenbrooke Island Light, B. C.;;Canada;4;51-36N;127-52W;;;21;;
+CWDA;71;417;Englee Meteorological Aeronautical Presentation System ;;Canada;4;50-43N;056-07W;;;29;;
+CWDB;71;967;Burwash Automatic Weather Reporting System ;;Canada;4;61-22N;139-03W;;;806;;
+CWDC;71;076;Uranium City, Sask.;;Canada;4;59-34N;108-29W;;;318;318;P
+CWDD;--;---;Belle River, Ont.;;Canada;4;42-18N;082-42W;;;184;;
+CWDE;71;520;Lac Benoit;;Canada;4;51-33N;071-07W;;;549;;
+CWDF;71;283;Oliphant \ Ont;;Canada;4;44-44N;081-17W;;;182;;
+CWDH;71;185;Daniel's Harbour, Nfld;;Canada;4;50-14N;057-35W;;;18;19;P
+CWDI;71;400;Badger, Nfld;;Canada;4;48-58N;056-04W;;;105;;P
+CWDJ;71;514;Regina University;;Canada;4;50-24N;104-35W;;;573;;
+CWDK;71;234;Claresholm Automatic Weather Reporting System ;;Canada;4;50-01N;113-38W;;;1012;;
+CWDL;71;958;Dease Lake B. C.;;Canada;4;58-25N;130-00W;;;816;816;P
+CWDM;71;814;Chevery, Que.;;Canada;4;50-28N;059-38W;;;6;6;P
+CWDN;--;---;Wasaga Beach Automatic Weather Reporting System ;;Canada;4;44-31N;080-01W;;;182;;
+CWDO;71;402;Twillingate Meteorological Aeronautical Presentation System ;;Canada;4;49-41N;054-48W;;;92;;
+CWDP;71;521;Manouane-Est Automated Reporting Station ;;Canada;4;50-40N;070-32W;;;496;;
+CWDQ;71;378;La Tuque;;Canada;4;47-25N;072-48W;;;169;;
+CWDS;71;802;St. Lawrence, Nfld.;;Canada;4;46-55N;055-23W;;;46;49;P
+CWDT;71;522;Chute Des Passes;;Canada;4;49-54N;071-15W;;;399;;
+CWDU;71;235;Cop Upper;;Canada;4;51-05N;114-13W;;;1235;;
+CWDV;71;435;Upsala, Ont.;;Canada;4;49-02N;090-28W;;;489;489;P
+CWDZ;--;---;Drumheller East;;Canada;4;51-26N;112-40W;;;678;;
+CWEA;71;448;Pinawa Automatic Weather Reporting System ;;Canada;4;50-11N;096-04W;;;268;;
+CWEB;71;894;Estevan Point, B. C.;;Canada;4;49-23N;126-33W;;;7;;P
+CWEC;71;751;Welcome Island;;Canada;4;48-22N;089-07W;;;209;;
+CWEE;71;523;Chamouchouane Automatic Weather Reporting System;;Canada;4;49-17N;073-21W;;;305;;
+CWEF;71;418;Saint Paul Island Meteorological Aeronautical Presentation System ;;Canada;4;47-14N;060-08W;;;26;;
+CWEG;--;---;Alberta Weather Centre ;;Canada;4;53-30N;113-30W;;;;;
+CWEH;71;131;Eastend Cypress, Sask;;Canada;4;49-26N;108-59W;;;1078;;P
+CWEI;71;447;Melita, Man;;Canada;4;49-17N;100-59W;;;446;446;P
+CWEJ;--;---;Bow Drill Iii;;Canada;4;47-12N;055-06W;;;0;;
+CWEK;71;476;Grey Islet Meteorological Aeronautical Presentation System ;;Canada;4;54-35N;130-42W;;;8;;
+CWEL;71;772;Entrance Island Automatic Weather Reporting System ;;Canada;4;49-13N;123-48W;;;5;;
+CWEM;--;---;Egg Island Light;;Canada;4;51-15N;127-50W;;;14;;
+CWEO;71;421;Lac Eon, Que;;Canada;4;51-52N;063-17W;;;561;561;P
+CWEP;71;412;East Point, P. E. I;;Canada;4;46-27N;061-58W;;;11;13;P
+CWEQ;71;443;Swan River, Man.;;Canada;4;52-07N;101-14W;;;335;335;P
+CWER;71;424;Ile D'Orleans Automated Reporting Station ;;Canada;4;47-00N;070-49W;;;5;;
+CWES;71;111;Cape Scott Light;;Canada;4;50-47N;128-26W;;;70;;
+CWET;--;---;Egbert Meteorological Aeronautical Presentation System ;;Canada;4;44-14N;079-47W;;;251;;
+CWEU;71;917;Eureka, N. W. T.;;Canada;4;79-59N;085-56W;79-59N;085-56W;10;10;P
+CWEV;71;085;Ellice River Automated Reporting Station ;;Canada;4;67-42N;104-28W;;;42;;
+CWEW;71;524;L'Assomption;;Canada;4;45-49N;073-26W;45-49N;073-26W;21;21;
+CWEZ;71;473;Saturna Island Meteorological Aeronautical Presentation System ;;Canada;4;48-47N;123-03W;;;24;;
+CWFD;71;094;Cape Dyer, N. W. T.;;Canada;4;66-35N;061-37W;;;393;393;P
+CWFE;71;238;Elk Island National Park;;Canada;4;53-41N;112-52W;;;716;;
+CWFF;71;456;Melfort Automatic Weather Reporting System ;;Canada;4;52-49N;104-36W;;;490;;
+CWFG;71;478;Sartine Island Meteorological Aeronautical Presentation System ;;Canada;4;50-49N;128-54W;;;112;;
+CWFH;--;---;St. Shotts;;Canada;4;46-43N;053-29W;;;143;;
+CWFJ;71;153;Cardston Automated Reporting Station ;;Canada;4;49-12N;113-17W;;;1136;;
+CWFL;71;073;Fort Reliance ;;Canada;4;62-43N;109-10W;;;164;;
+CWFM;--;---;Chatham Point Lighthouse ;;Canada;4;50-20N;125-26W;;;23;;
+CWFN;71;920;Cree Lake Meteorological Aeronautical Presentation System ;;Canada;4;57-21N;107-08W;57-21N;107-08W;495;497;
+CWFP;--;---;Nain;;Canada;4;56-33N;061-42W;;;7;;
+CWFQ;71;373;Frelighsburg;;Canada;4;45-03N;072-50W;;;152;;
+CWFR;--;---;Horsefly River, B. C.;;Canada;4;52-17N;121-03W;;;846;;
+CWFU;--;---;Little Macatina;;Canada;4;52-14N;061-19W;;;321;;
+CWFW;71;829;Baie Comeau;;Canada;4;49-16N;068-09W;;;129;;
+CWFX;71;055;Colville Lake;;Canada;4;67-02N;126-05W;;;259;;
+CWFY;--;---;Conne River;;Canada;4;48-10N;055-29W;;;183;;
+CWFZ;71;160;Fort Reliance, N. W. T.;;Canada;4;62-43N;109-11W;;;168;;
+CWGB;71;769;Ballenas Island Automatic Weather Reporting System ;;Canada;4;49-21N;124-10W;;;5;;
+CWGD;71;261;Goderich Automatic Weather Reporting System ;;Canada;4;43-46N;081-43W;;;214;;
+CWGF;71;253;Garden River Automatic Weather Reporting System ;;Canada;4;58-41N;113-53W;;;241;;
+CWGH;71;281;Grenadier Island ;;Canada;4;44-25N;075-51W;;;82;;
+CWGJ;--;---;Montreal River Radar Site;;Canada;4;47-14N;084-31W;;;559;;
+CWGL;71;282;Lagoon City ;;Canada;4;44-32N;079-13W;;;221;;
+CWGM;71;154;Waterton Park Gate;;Canada;4;59-08N;113-48W;;;1296;;
+CWGN;71;441;Gretna, Man.;;Canada;4;49-02N;097-34W;;;251;253;P
+CWGP;71;777;Pemberton Automatic Weather Reporting System ;;Canada;4;50-18N;122-44W;;;204;;
+CWGQ;71;736;Roquemaure;;Canada;4;48-38N;079-27W;;;269;;
+CWGR;71;710;Iles-De-La-Madelein;;Canada;4;47-25N;061-48W;;;10;;
+CWGT;71;781;Sisters Island Automatic Weather Reporting System ;;Canada;4;49-29N;124-26W;;;5;;
+CWGU;71;857;Gypsumville;;Canada;4;51-40N;098-45W;;;265;;
+CWGV;--;---;Carp Radar Site;;Canada;4;45-19N;076-00W;;;;;
+CWGW;71;782;Sparwood Automatic Weather Reporting System ;;Canada;4;49-45N;114-54W;;;1137;;
+CWGX;--;---;Gillam, Man.;;Canada;4;56-22N;094-42W;;;145;;
+CWGY;71;240;Esther 1;;Canada;4;51-40N;110-12W;;;707;;
+CWGZ;--;---;Grise Fiord Airport;;Canada;4;76-25N;082-54W;;;45;;
+CWHA;71;241;Highvale;;Canada;4;53-27N;114-28W;;;747;;
+CWHC;71;201;Vancouver Automatic Weather Reporting System ;;Canada;4;49-18N;123-07W;;;2;;
+CWHE;71;239;Ellerslie;;Canada;4;53-25N;113-12W;;;694;;
+CWHH;71;142;Hunters Point Mar;;Canada;4;53-02N;100-56W;;;256;;
+CWHI;71;249;Three Hills;;Canada;4;51-42N;113-13W;;;907;;
+CWHL;71;440;Holland Rock Automatic Weather Reporting System ;;Canada;4;54-10N;130-22W;;;5;;
+CWHM;71;184;Varennes;;Canada;4;45-43N;073-23W;;;19;;
+CWHN;--;---;Jimmy Lake ;;Canada;4;54-55N;109-57W;54-55N;109-58W;658;625;
+CWHO;71;900;Hopedale Meteorological Aeronautical Presentation System ;;Canada;4;55-27N;060-14W;;;8;;
+CWHP;71;423;Heath Point Meteorological Aeronautical Presentation System ;;Canada;4;49-05N;061-42W;;;4;;
+CWHQ;71;389;Deschambaults , Que.;;Canada;4;46-41N;071-57W;;;55;;
+CWHS;71;062;Bernard Harbour;;Canada;4;68-47N;114-50W;;;65;;
+CWHT;71;505;Haines Junction;;Canada;4;60-46N;137-35W;;;599;;
+CWHU;--;---;Star Brook;;Canada;4;48-35N;057-14W;;;290;;
+CWHV;71;323;Beauceville;;Canada;4;46-12N;070-47W;;;229;;
+CWHW;71;193;Comfort Cove, Nfld.;;Canada;4;49-16N;054-53W;;;96;99;P
+CWHY;71;618;Mont-Orford;;Canada;4;45-19N;072-15W;;;851;;
+CWIA;--;---;Saint Henri , Que.;;Canada;4;48-39N;071-51W;;;103;;
+CWIC;71;074;Isachsen Meteorological Aeronautical Presentation System ;;Canada;4;78-47N;103-33W;;;58;;
+CWID;71;087;Fort Providence;;Canada;4;61-19N;117-36W;;;161;;
+CWIE;71;161;Indian River ;;Canada;4;64-23N;115-01W;;;478;;
+CWIF;--;---;Quatsino Light Station ;;Canada;4;50-26N;128-02W;;;21;;
+CWIG;--;---;Ile Aux Grues, Que.;;Canada;4;47-04N;070-32W;;;18;;
+CWII;71;552;Victoria Beach ;;Canada;4;50-42N;096-34W;;;220;;
+CWIJ;71;496;Lupin, N. W. T.;;Canada;4;65-46N;111-14W;;;500;500;P
+CWIK;71;861;Broadview, Sask.;;Canada;4;50-23N;102-41W;50-23N;102-35W;598;602;P
+CWIL;71;084;Hat Island, N. W. T.;;Canada;4;68-19N;100-05W;;;36;;
+CWIM;--;---;Upsala Radar Site ;;Canada;4;49-02N;090-25W;;;480;;
+CWIO;71;762;Iskut River ;;Canada;4;56-44N;131-40W;;;15;;
+CWIP;71;390;Pointe Noire , Que.;;Canada;4;50-10N;066-26W;;;25;;
+CWIQ;71;124;Primrose Lake ;;Canada;4;54-45N;110-03W;54-45N;110-03W;702;700;
+CWIR;--;---;Victoria Marine ;;Canada;4;48-22N;123-45W;;;32;;
+CWIS;71;319;Charlevoix CS , Que.;;Canada;4;47-17N;070-38W;;;719;;
+CWIT;71;614;Saint Clothilde Automated Reporting Station ;;Canada;4;45-10N;073-41W;;;52;;
+CWIU;--;---;Saint Gedeon, Que.;;Canada;4;48-29N;071-47W;;;103;;
+CWIW;71;511;Watrous East Automated Reporting Station ;;Canada;4;51-40N;105-24W;;;526;;
+CWIX;71;381;Mistook Automated Reporting Station ;;Canada;4;48-46N;071-43W;;;113;;
+CWIY;--;---;St Leonard Automatic Weather Reporting System;;Canada;4;47-09N;067-49W;;;49;;
+CWIZ;71;372;L'Acadie;;Canada;4;45-18N;073-21W;;;45;;
+CWJA;71;888;Jasper, Alta.;;Canada;4;52-53N;118-04W;;;1061;1061;P
+CWJB;71;392;Ste Foy CS , Que.;;Canada;4;47-18N;071-16W;;;91;
+CWJC;71;923;Ennadai Lake Meteorological Aeronautical Presentation System ;;Canada;4;61-08N;100-54W;;;357;;
+CWJD;71;858;Grand Rapids, Man.;;Canada;4;53-11N;099-16W;;;223;223;P
+CWJG;--;---;Ivory Island Light;;Canada;4;52-16N;128-25W;;;10;;
+CWJH;71;451;Southend Automatic Weather Reporting System ;;Canada;4;56-20N;103-17W;;;344;;
+CWJI;71;487;Assiniboia Airport Automated Reporting Station;;Canada;4;49-44N;105-56W;;;724;;
+CWJM;71;290;Upper Rideau Lake;;Canada;4;44-42N;076-18W;;;125;;
+CWJN;71;501;Herschel Island Automatic Weather Reporting System ;;Canada;4;69-34N;138-55W;;;1;;
+CWJO;71;617;Jonquiere Automated Reporting Station ;;Canada;4;48-25N;071-13W;;;133;;
+CWJP;71;167;Porter Lake;;Canada;4;61-40N;108-25W;;;396;;
+CWJR;71;770;Creston Automatic Weather Reporting System ;;Canada;4;49-05N;116-30W;;;646;;
+CWJT;71;376;St Jovite Automatic Weather Reporting System ;;Canada;4;46-04N;074-32W;;;239;;
+CWJU;71;899;Langara, B. C.;;Canada;4;54-15N;133-03W;;;41;41;P
+CWJV;--;---;Vernon, B. C.;;Canada;4;50-14N;119-18W;;;556;;
+CWJW;71;486;Jasper Warden Automated Reporting Station ;;Canada;4;52-56N;118-19W;52-56N;118-19W;1020;1020;
+CWJX;71;459;Leader Airport Automatic Weather Reporting System ;;Canada;4;50-54N;109-30W;;;672;;
+CWJY;71;507;Yathkyed Lake Meteorological Aeronautical Presentation System ;;Canada;4;62-42N;098-18W;;;148;;
+CWJZ;71;499;Dubawnt Lake Meteorological Aeronautical Presentation System ;;Canada;4;63-14N;101-46W;;;237;;
+CWKD;71;383;Bonnard 1, Que.;;Canada;4;50-44N;071-01W;;;497;;
+CWKE;71;919;Pelly Bay;;Canada;4;68-26N;089-43W;;;326;;
+CWKG;71;599;Kejimkujik 1, N. S.;;Canada;4;44-26N;065-12W;;;127;;
+CWKH;71;774;Malahat Automatic Weather Reporting System ;;Canada;;48-35N;123-35W;;;366;;
+CWKI;--;---;Kitimat;;Canada;4;54-03N;128-41W;;;13;;
+CWKK;71;468;Katatota Island;;Canada;4;49-43N;088-20W;;;260;;
+CWKM;71;046;Komakuk Beach, Y. T.;;Canada;4;69-37N;140-12W;;;13;
+CWKO;71;135;Rockglen, Sask.;;Canada;4;49-10N;105-59W;;;915;917;P
+CWKR;--;---;King Radar Site;;Canada;4;43-58N;079-34W;;;390;;
+CWKS;--;---;Sikanni Chief, B. C.;;Canada;4;57-15N;122-43W;;;937;;
+CWKU;--;---;Whiskey Automated Reporting Station ;;Canada;4;81-02N;076-57W;;;829;;
+CWKV;--;---;Hope Slide;;Canada;4;49-17N;121-14W;;;674;;
+CWKW;71;176;Cape Kakkiviak;;Canada;4;59-59N;064-10W;;;551;;
+CWKX;71;222;Dease Lake Coastal Station;;Canada;4;58-25N;130-00W;;;816;;
+CWLA;71;899;Langara, B. C.;;Canada;4;54-15N;133-08W;;;41;
+CWLB;71;931;Lac La Biche, Alta.;;Canada;4;54-46N;112-01W;;;565;567;P
+CWLC;--;---;Lucy Island, B. C.;;Canada;4;54-18N;130-36W;;;27;;
+CWLE;71;455;Lucky Lake Automatic Weather Reporting System ;;Canada;4;50-57N;107-09W;;;665;;
+CWLF;71;846;Lansdowne House ;;Canada;4;52-14N;087-53W;;;242;;
+CWLG;71;164;Little Chicago;;Canada;4;67-12N;130-13W;;;63;;
+CWLI;71;960;Liverpool Bay;;Canada;4;69-36N;130-54W;;;102;;
+CWLM;71;200;Victoria Automatic Weather Reporting System ;;Canada;4;48-25N;123-19W;;;70;;
+CWLO;71;853;Shilo;;Canada;4;49-47N;099-38W;49-47N;099-38W;373;373;
+CWLP;71;485;Herbert Island Meteorological Aeronautical Presentation System ;;Canada;4;50-56N;127-38W;;;17;;
+CWLQ;71;271;Nipissing;;Canada;4;46-19N;079-28W;;;204;;
+CWLS;71;631;Mount Forest, Ont.;;Canada;4;43-59N;080-45W;;;415;;P
+CWLT;71;082;Alert, N. W. T.;;Canada;4;82-30N;062-20W;82-30N;062-20W;63;66;P
+CWLU;--;---;Lauzon, Que.;;Canada;4;46-50N;071-10W;;;20;;
+CWLV;71;454;Waskesiu Lake Automated Reporting Station ;;Canada;4;53-55N;106-04W;;;569;;
+CWLX;71;091;Longstaff Bluff, N. W. T.;;Canada;4;68-53N;075-08W;;;162;161;P
+CWLY;71;891;Lytton, B. C.;;Canada;4;50-14N;121-35W;;;229;229;P
+CWLZ;71;146;Candle Lake;;Canada;4;53-44N;105-16W;53-44N;105-16W;503;503;
+CWMA;--;---;Masset A;;Canada;4;54-01N;132-07W;;;5;;
+CWMD;--;---;Mould Bay Camp;;Canada;4;76-14N;119-19W;;;12;;
+CWME;71;482;Cathedral Point Meteorological Aeronautical Presentation System ;;Canada;4;52-11N;127-28W;;;32;;
+CWMH;71;817;Mary's Harbour, Nfld.;;Canada;4;52-18N;055-50W;;;10;11;P
+CWMI;71;719;Miscou Island, N. B.;;Canada;4;48-01N;064-30W;;;3;4;P
+CWMJ;71;721;Maniwaki;;Canada;4;46-17N;076-00W;;;200;;
+CWMM;71;775;P. Meadows Coastal Station Automatic Weather Reporting System;;Canada;;49-12N;122-41W;;;5;;
+CWMN;71;626;Mcgill Radar Site;;Canada;4;45-25N;073-56W;;;63;;
+CWMP;71;168;Powder Lake;;Canada;4;61-03N;109-20W;;;396;;
+CWMQ;71;453;Maplecreek Automatic Weather Reporting System ;;Canada;4;49-54N;109-28W;;;767;;
+CWMR;--;---;Merry Island ;;Canada;4;49-28N;123-55W;;;8;;
+CWMS;71;897;Mcinnes Island, B. C.;;Canada;4;52-16N;128-43W;;;25;26;P
+CWMT;71;163;Lac La Martre;;Canada;4;63-09N;117-16W;;;271;;
+CWMU;71;981;Rampart River Automatic Weather Reporting System ;;Canada;4;65-57N;130-28W;;;155;;
+CWMV;71;986;St Charles Creek;;Canada;4;64-45N;124-13W;;;341;;
+CWMW;71;722;Maniwaki, Que.;;Canada;4;46-23N;075-58W;46-22N;075-59W;170;173;P
+CWMX;71;255;Mildred Lake;;Canada;4;57-32N;111-34W;;;310;;
+CWMZ;71;438;Western Island Meteorological Aeronautical Presentation System ;;Canada;4;45-02N;080-22W;;;191;;
+CWNB;71;466;S. E. Shoal Meteorological Aeronautical Presentation System ;;Canada;4;41-50N;082-28W;;;195;;
+CWNC;71;431;Cobourg, Ont.;;Canada;4;43-57N;078-10W;;;78;78;P
+CWND;71;502;Pelly Island Automatic Weather Reporting System ;;Canada;4;69-38N;135-26W;;;12;;
+CWNE;--;---;North Point, Prince Edward Island;;Canada;4;47-05N;064-00W;;;15;;
+CWNH;71;715;Riviere Du Loup, Que.;;Canada;4;47-48N;069-33W;;;148;148;P
+CWNI;--;---;Nipterk Base;;Canada;4;69-37N;135-20W;;;10;;
+CWNJ;--;---;Green Island Light Station - Heliport, B. C.;;Canada;4;54-34N;130-42W;;;12;;
+CWNK;71;147;Carman U Of M;;Canada;4;49-30N;098-02W;;;268;;
+CWNL;71;462;Great Duck Island;;Canada;4;45-38N;082-58W;;;183;;
+CWNM;71;776;Nelson Automatic Weather Reporting System ;;Canada;4;49-30N;117-18W;;;535;;
+CWNO;71;976;Satah River Automatic Weather Reporting System;;Canada;4;66-52N;134-12W;;;86;;
+CWNP;71;216;Nakusp Automatic Weather Reporting System ;;Canada;;50-16N;117-49W;;;524;;
+CWNQ;71;723;Nicolet Automatic Weather Reporting System ;;Canada;4;46-13N;072-39W;;;10;;
+CWNR;71;245;Nakiska Ridgetop ;;Canada;4;50-57N;115-11W;;;2543;;
+CWNT;71;250;Turtle Mountain;;Canada;4;49-35N;114-25W;;;2164;;
+CWNW;71;982;Haldane River Automatic Weather Reporting System;;Canada;4;67-04N;121-06W;;;186;;
+CWNX;71;763;Nechako River ;;Canada;4;53-41N;124-50W;;;715;;
+CWNZ;71;832;Nagagami, Ont.;;Canada;4;49-45N;084-10W;;;259;263;P
+CWOA;71;060;Camsell River, N. W. T.;;Canada;4;65-37N;118-07W;;;230;;P
+CWOB;71;097;Brevoort Island;;Canada;4;63-20N;064-09W;;;367;;
+CWOC;71;619;New Carlisle1;;Canada;4;48-01N;065-20W;;;47;;
+CWOD;71;379;Normandin;;Canada;4;48-50N;072-33W;;;137;;
+CWOE;71;116;Onefour Automatic Weather Reporting System ;;Canada;4;49-07N;110-28W;;;935;;
+CWOH;71;720;Ste Agathe Des Mont;;Canada;4;46-03N;074-17W;;;395;;
+CWOI;71;978;Ivvavik Park Automatic Weather Reporting System;;Canada;4;69-09N;140-09W;;;244;;
+CWOK;71;450;Elbow Marine Aviation Reporting Station ;;Canada;4;51-08N;106-35W;;;595;;
+CWOL;--;---;Sable Island Man ;;Canada;4;43-55N;059-55W;;;4;;
+CWON;--;---;Dawson Automatic Weather Reporting System ;;Canada;4;64-03N;139-09W;;;370;;
+CWOU;71;127;Primrose Lake 2;;Canada;4;54-47N;110-04W;54-47N;110-04W;606;606;
+CWOY;--;---;Wynyard Marine Aviation Reporting Station ;;Canada;4;51-46N;104-13W;;;561;;
+CWPA;71;979;Henderickson Automatic Weather Reporting System;;Canada;4;53-47N;118-26W;;;1542;;
+CWPB;71;272;Beausoleil Island Automated Reporting Station ;;Canada;4;44-51N;079-52W;;;183;;
+CWPC;71;463;Port Colborne Automated Reporting Station ;;Canada;4;42-52N;079-15W;;;184;;
+CWPD;71;382;Parc Des Laurentid;;Canada;4;47-34N;071-14W;;;803;;
+CWPE;--;---;Point Lepreau, N. B.;;Canada;4;45-04N;066-28W;;;1;;
+CWPF;71;798;Esquimalt Harbour, B. C.;;Canada;4;48-26N;123-26W;;;3;;
+CWPH;71;907;Inukjuak, Que;;Canada;4;58-27N;078-07W;58-27N;078-07W;3;6;P
+CWPI;71;105;Pine Island Meteorological Aeronautical Presentation System ;;Canada;4;50-59N;127-44W;;;9;;
+CWPJ;71;414;Point Escuminac Meteorological Aeronautical Presentation System ;;Canada;4;47-04N;064-48W;;;5;;
+CWPK;71;726;Parent, Que.;;Canada;4;47-55N;074-37W;;;442;441;P
+CWPL;71;845;Pickle Lake, Ont.;;Canada;4;51-27N;090-12W;51-27N;090-12W;389;386;P
+CWPO;71;148;Pilot Mound, Man.;;Canada;4;49-12N;098-54W;;;470;470;P
+CWPQ;71;675;Montreal-Est;;Canada;4;45-38N;070-33W;;;51;;
+CWPR;71;032;Princeton Automatic Weather Reporting System ;;Canada;4;50-36N;120-31W;;;700;;
+CWPS;71;464;Long Point Meteorological Aeronautical Presentation System ;;Canada;4;42-34N;080-03W;;;175;;
+CWPU;71;050;Puntzi Mountain, B. C.;;Canada;4;52-07N;124-08W;;;910;910;P
+CWPX;--;---;Cape Peel West, N. W. T.;;Canada;4;69-02N;107-49W;;;165;;
+CWPY;--;---;Fort Chipewyan Automated Reporting Station ;;Canada;4;58-46N;111-08W;;;232;;
+CWPZ;71;952;Burns Lake CS , B. C.;;Canada;4;54-23N;125-57W;;;713;;
+CWQC;71;475;Port Alberni, B. C.;;Canada;4;49-15N;124-50W;;;2;2;P
+CWQE;71;284;Toronto Headland;;Canada;4;43-37N;079-21W;;;87;;
+CWQF;71;980;Rabbit Kettle Automated Reporting Station;;Canada;4;61-58N;127-13W;;;634;;
+CWQG;71;151;Valcartier;;Canada;4;46-54N;071-30W;;;168;;
+CWQH;71;611;Lennoxville;;Canada;4;45-22N;071-49W;;;181;;
+CWQJ;--;---;Sedco 710;;Canada;4;46-30N;048-30W;;;0;;
+CWQK;71;778;Race Rocks Automatic Weather Reporting System ;;Canada;4;48-18N;123-32W;;;5;;
+CWQL;71;243;Lethbridge Automated Reporting Station ;;Canada;4;49-42N;112-47W;;;921;;
+CWQM;71;186;Cap Rouge;;Canada;4;48-23N;070-32W;;;7;;
+CWQO;71;385;Ile Bicquette, Que.;;Canada;4;48-24-56N;068-53-36W;;;7;;
+CWQP;71;430;Point Petre , Ont.;;Canada;4;43-50N;077-09W;;;79;79;P
+CWQQ;71;242;Lacombe Cda;;Canada;4;52-27N;113-45W;;;874;;
+CWQR;71;375;Ile Aux Perroquets, Que.;;Canada;4;50-13-25N;064-12-30W;;;9;;
+CWQS;71;472;Kindakun Rocks, B. C.;;Canada;4;53-19N;132-45W;;;14;14;P
+CWQV;71;189;Puinte Claveau;;Canada;4;48-16N;070-07W;;;0;;
+CWQW;71;374;Cape Whittle;;Canada;4;50-10N;060-04W;;;7;;
+CWQY;71;963;Hanbury River Automated Reporting Station ;;Canada;4;63-35N;105-09W;;;317;;
+CWQZ;--;---;Quesnel Automatic Weather Reporting System ;;Canada;4;53-02N;122-32W;;;545;;
+CWRA;71;800;Cape Race, Nfld;;Canada;4;46-39N;053-04W;;;27;28;P
+CWRD;71;246;Red Earth;;Canada;4;56-32N;115-16W;;;546;;
+CWRF;71;918;Pelly Bay 1;;Canada;4;69-26N;089-44W;;;325;;
+CWRH;71;972;Resolution Island, N. W. T.;;Canada;4;61-35N;64-39W;;;369;;
+CWRJ;71;510;Rosetown East, Sask;;Canada;4;51-34N;107-55W;;;586;;P
+CWRK;--;---;Bancroft Automatic Weather Reporting System;;Canada;4;45-04N;077-52W;;;331;;
+CWRM;--;---;Rocky House Marine Aviation Reporting Station ;;Canada;4;52-26N;114-56W;;;988;;
+CWRN;71;419;Hart Island Meteorological Aeronautical Presentation System ;;Canada;4;45-21N;060-59W;;;4;;
+CWRO;71;477;Rose Spit Meteorological Aeronautical Presentation System ;;Canada;4;54-10N;131-40W;;;7;;
+CWRP;71;956;Nicholson Peninsul ;;Canada;4;69-56N;128-58W;;;89;;
+CWRQ;--;---;Trois Rivieres;;Canada;4;46-23N;072-37W;;;11;;
+CWRT;71;236;Crowsnest;;Canada;4;49-38N;114-29W;;;1303;;
+CWRU;71;479;Solander Island Meteorological Aeronautical Presentation System ;;Canada;4;50-07N;127-56W;;;99;;
+CWRV;71;254;Camrose;;Canada;4;53-02N;112-49W;;;739;;
+CWRW;71;416;Fourchu Head Meteorological Aeronautical Presentation System ;;Canada;4;45-43N;060-14W;;;10;;
+CWRX;--;---;Rowley Island, N. W. T.;;Canada;4;69-04N;079-04W;;;41;;
+CWRY;71;244;Milk River;;Canada;4;49-08N;112-03W;;;1050;;
+CWRZ;71;429;Cap D'Espoir , Que.;;Canada;4;48-25N;064-19W;;;16;;
+CWSA;71;600;Sable Island, N. S.;;Canada;4;43-56N;060-01W;43-56N;060-01W;4;4;P
+CWSD;--;---;Summerside Automatic Weather Reporting System ;;Canada;4;46-26N;063-51W;;;24;;
+CWSE;71;119;Edmonton Stony Plain Alta.;;Canada;4;53-32N;114-06W;53-33N;114-06W;766;766;P
+CWSF;71;425;Cap Madeleine Meteorological Aeronautical Presentation System ;;Canada;4;49-15N;065-20W;;;29;;
+CWSG;71;428;Cap Chat CS, Que.;;Canada;4;49-07N;066-39W;;;5;;
+CWSH;71;247;Sousa Crk Avt ;;Canada;4;58-35N;118-30W;;;373;;
+CWSI;71;527;Simcoe, Ont.;;Canada;4;42-51N;080-16W;;;241;;P
+CWSK;71;207;Squamish Airport, B. C;;Canada;4;49-47N;123-10W;;;59;52;P
+CWSL;71;218;Salmon Arm Automatic Weather Reporting System ;;Canada;;50-42N;119-17W;;;351;;
+CWSO;--;---;Exeter Radar Site;;Canada;4;43-22N;081-23W;;;;;
+CWSP;71;780;Sheringham Automatic Weather Reporting System ;;Canada;4;48-23N;123-55W;;;21;;
+CWSQ;71;974;Aulvik National Park;;Canada;4;74-08N;119-59W;;;32;;
+CWSR;71;133;Spiritwood West, Sask;;Canada;4;53-22N;107-33W;;;584;590;P
+CWSS;71;607;St. Stephen, N. B.;;Canada;4;45-13N;067-15W;;;26;;P
+CWST;71;713;La Pocatiere;;Canada;4;47-21N;070-02W;;;31;;
+CWSV;--;---;Blue River Marine Aviation Reporting Station ;;Canada;4;52-06N;119-18W;;;683;;
+CWSW;--;---;Sparwood / Elk Valley;;Canada;4;49-45N;114-53W;;;1138;;
+CWSY;71;051;Sachs Harbour, N. W. T.;;Canada;4;72-00N;125-16W;72-00N;125-16W;88;88;P
+CWSZ;71;442;Fisher Branch Marine Aviation Reporting Station ;;Canada;4;51-05N;097-33W;;;253;;
+CWTA;71;612;Mc Tavish Automated Reporting Station ;;Canada;4;45-30N;073-35W;;;63;;
+CWTB;71;901;Border, Que.;;Canada;4;55-20N;063-13W;;;479;479;P
+CWTC;71;102;Ethelda Bay;;Canada;4;53-03N;129-41W;;;10;;
+CWTD;71;490;Robertson Lake Automated Reporting Station ;;Canada;4;65-06N;102-26W;;;244;;
+CWTE;71;166;Trout Lake;;Canada;4;60-26N;121-14W;;;498;;
+CWTF;71;134;Beartooth Island;;Canada;4;59-13N;109-42W;;;238;;
+CWTG;71;427;Pointe-Des-Monts , Que.;;Canada;4;49-19N;067-23W;;;5;;
+CWTH;--;---;Tetsa River;;Canada;4;58-39N;124-14W;;;804;;
+CWTI;--;---;Triple Island Light, B. C.;;Canada;4;54-18N;130-53W;;;21;;
+CWTN;71;384;Cap Tourmente;;Canada;4;47-04N;070-48W;;;6;;
+CWTO;71;638;Toronto Aes Hq ;;Canada;4;43-47N;079-28W;43-47N;079-28W;187;187;
+CWTU;--;---;Tukialik Bay, Nfld.;;Canada;4;54-43N;058-21W;;;683;;
+CWTY;71;724;Trois Rivieres;;Canada;4;46-21N;072-31W;;;6;;
+CWTZ;--;---;Toronto Island;;Canada;4;43-38N;079-25W;;;77;;
+CWUL;--;---;Quebec Fcst Office;;Canada;4;45-30N;073-41W;;;;;
+CWUM;71;949;Faro, Y. T.;;Canada;4;62-14N;133-21W;;;717;717;P
+CWUP;71;093;Cape Hooper, N. W. T.;;Canada;4;68-28N;066-48W;;;401;390;P
+CWUR;71;398;Truro, N. S.;;Canada;4;45-22N;063-16W;;;40;;P
+CWUS;71;768;Summerland Automatic Weather Reporting System ;;Canada;4;49-34N;119-39W;;;454;;
+CWUT;71;150;Shoal Lake Airport Automated Reporting Station ;;Canada;4;50-27N;100-36W;;;561;;
+CWUU;71;080;Mackar Inlet;;Canada;4;68-18N;085-40W;;;395;;
+CWUW;71;092;Dewar Lakes, N. W. T.;;Canada;4;68-39N;071-10W;;;518;527;P
+CWUX;71;388;La Baie , Que.;;Canada;4;48-18N;70-56W;;;135;;
+CWUY;71;734;Rouyn;;Canada;4;48-15N;079-02W;;;318;;
+CWVA;71;196;Bonavista, Nfld.;;Canada;4;48-40N;053-07W;;;25;27;P
+CWVB;71;484;Bonilla Island Light;;Canada;4;53-30N;130-38W;;;16;;
+CWVC;71;446;Swift Current Automatic Weather Reporting System ;;Canada;4;50-16N;107-44W;;;825;;
+CWVD;71;096;Broughton Island;;Canada;4;67-32N;063-47W;;;584;;
+CWVE;--;---;Valleyfield;;Canada;4;45-14N;074-06W;;;46;;
+CWVF;--;---;Sand Heads CS, B. C.;;Canada;4;49-06N;123-18W;;;13;;
+CWVH;71;052;Storm Hills , N. W. T.;;Canada;4;68-54N;133-56W;;;261;;
+CWVI;71;458;Vegreville Automatic Weather Reporting System ;;Canada;4;53-37N;112-02W;;;639;;
+CWVK;71;115;Vernon, B. C.;;Canada;4;50-14N;119-17W;;;555;556;P
+CWVN;71;137;Val Marie Southeast, Sask;;Canada;4;49-04N;107-35W;;;785;785;P
+CWVO;71;251;Vauxhall Cda;;Canada;4;50-03N;112-08W;;;779;;
+CWVP;71;139;Cypress Hills Park;;Canada;4;49-39N;109-31W;;;1271;;
+CWVQ;71;377;Ste Anne De Bell 1;;Canada;4;45-26N;073-56W;;;39;;
+CWVT;71;077;Buffalo Narrows, Sask.;;Canada;4;55-50N;108-26W;;;434;434;P
+CWVU;71;988;Brier Island, N. S.;;Canada;4;44-17-09N;066-20-48W;;;16;;
+CWVV;--;---;Vic. Hartland Automatic Weather Reporting System;;Canada;4;48-32N;123-28W;;;154;;
+CWVY;71;616;Villeroy Radar Site;;Canada;4;46-26N;071-56W;;;108;;
+CWVZ;--;---;Ile Charron, Que.;;Canada;4;45-35N;073-30W;;;12;;
+CWWA;71;784;W Vancouver Automatic Weather Reporting System ;;Canada;4;49-21N;123-11W;;;178;;
+CWWB;71;437;Burlington Piers ;;Canada;4;43-18N;079-48W;;;77;;
+CWWC;71;075;Collins Bay Automatic Weather Reporting System ;;Canada;4;58-11N;103-42W;;;492;;
+CWWE;71;411;Western Head, N. S.;;Canada;4;43-59N;064-40W;;;9;;P
+CWWF;71;452;Weyburn Automatic Weather Reporting System ;;Canada;4;49-42N;103-48W;;;589;;
+CWWK;71;785;White Rock Automatic Weather Reporting System ;;Canada;4;49-01N;122-47W;;;15;;
+CWWL;71;484;Bonilla Island Meteorological Aeronautical Presentation System ;;Canada;4;53-30N;130-38W;;;17;;
+CWWM;--;---;Grant Automatic Weather Reporting System ;;Canada;4;82-30N;065-05W;;;1242;;
+CWWN;71;434;Peawanuck Meteorological Aeronautical Presentation System ;;Canada;4;54-59N;085-26W;;;52;;
+CWWO;71;252;Willow Creek;;Canada;4;53-23N;118-20W;;;1402;;
+CWWP;71;444;Wasagaming, Man.;;Canada;4;50-39N;099-56W;;;626;627;P
+CWWQ;71;945;Muncho Lake;;Canada;4;58-55N;125-46W;;;835;;
+CWWS;71;445;George Island Meteorological Aeronautical Presentation System ;;Canada;4;52-48N;097-37W;;;223;;
+CWWU;--;---;Ingenika Point;;Canada;4;56-48N;124-54W;;;680;;
+CWWV;71;098;Killinek Meteorological Aeronautical Presentation System ;;Canada;4;60-25N;064-51W;;;31;;
+CWWX;71;439;Cove Island Meteorological Aeronautical Presentation System ;;Canada;4;45-20N;081-44W;;;181;;
+CWWZ;71;432;Port Weller, Ont.;;Canada;4;43-15N;079-13W;;;79;;P
+CWXA;71;232;Bow Valley;;Canada;4;51-05N;115-04W;;;1298;;
+CWXC;71;387;Onatchiway, Que.;;Canada;4;48-53N;071-02W;;;304;;
+CWXH;71;562;Holberg, B. C.;;Canada;4;50-38N;128-07W;;;568;;
+CWXI;--;---;Ferolle Point Meteorological Aeronautical Presentation System ;;Canada;4;51-01N;057-06W;;;8;;
+CWXJ;--;---;Bull Arm Automatic Weather Reporting System;;Canada;4;47-49N;053-54W;;;119;;
+CWXL;71;231;Bow Island;;Canada;4;49-38N;111-27W;;;838;;
+CWXM;71;481;Helmcken Island Meteorological Aeronautical Presentation System ;;Canada;4;50-24N;125-52W;;;19;;
+CWXO;--;---;Rowan Gorilla Iii;;Canada;4;43-53N;060-33W;;;44;;
+CWXP;71;826;Pangnirtung;;Canada;4;66-09N;065-44W;;;23;;
+CWXR;--;---;Croker River, N. W. T.;;Canada;4;69-16N;119-13W;;;69;;
+CWXV;71;498;Back River Meteorological Aeronautical Presentation System ;;Canada;4;66-05N;096-30W;;;28;;
+CWXW;71;183;Alexis River Meteorological Aeronautical Presentation System ;;Canada;4;52-39N;056-52W;;;43;;
+CWYB;--;---;N. Bay Weather Office;;Canada;4;46-19N;079-27W;;;;;
+CWYE;71;551;Outlook Pfra;;Canada;4;51-29N;107-03W;;;541;;
+CWYG;--;---;Charlottetown;;Canada;4;46-14N;063-08W;;;50;;
+CWYH;71;165;Rae Lakes;;Canada;4;64-07N;117-22W;;;231;;
+CWYJ;71;783;Victoria University;;Canada;;48-27N;123-18W;;;60;;
+CWYK;71;177;Cape Kiglapait, Nfld.;;Canada;4;57-08N;061-29W;;;834;;
+CWYL;71;786;Yoho Park Automatic Weather Reporting System ;;Canada;;51-27N;116-20W;;;1615;;
+CWYM;71;975;Cape Mercy;;Canada;4;64-57N;063-35W;;;583;;
+CWYO;71;865;Wynyard, Sask.;;Canada;4;51-46N;104-12W;;;561;561;P
+CWYY;71;215;Osoyoos Automatic Weather Reporting System ;;Canada;;49-02N;119-26W;;;283;;
+CWZA;71;113;Agassiz Automated Reporting Station ;;Canada;;49-15N;121-46W;;;15;;
+CWZB;71;197;Port-Aux-Basques, Nfld.;;Canada;4;47-34N;059-10W;47-34N;059-10W;40;40;P
+CWZD;--;---;Scudder Point Meteorological Aeronautical Presentation System ;;Canada;4;52-27N;131-14W;;;5;;
+CWZG;--;---;Banff Marine Aviation Reporting Station ;;Canada;4;51-12N;115-33W;;;1397;;
+CWZL;--;---;Cumshewa Island Meteorological Aeronautical Presentation System ;;Canada;4;53-02N;131-36W;;;17;;
+CWZM;--;---;Boat Bluff Light;;Canada;4;52-39N;128-31W;;;11;;
+CWZN;71;408;Sagona Island Meteorological Aeronautical Presentation System ;;Canada;4;47-22N;055-48W;;;35;;
+CWZO;--;---;Kelp Reefs, B. C.;;Canada;4;48-33N;123-14W;;;0;;
+CWZQ;71;597;Grand Etang, N. S.;;Canada;4;46-33N;061-03W;;;13;;
+CWZS;71;386;Amqui , Que.;;Canada;4;48-28N;067-26W;;;166;;
+CWZT;71;550;Dauphin Coastal Station;;Canada;4;51-06N;100-03W;;;305;;
+CWZV;71;048;Virginia Falls;;Canada;4;61-38N;125-48W;;;610;;
+CWZW;--;---;Teslin Marine Aviation Reporting Station ;;Canada;4;60-10N;132-46W;;;705;;
+CWZZ;71;804;Saglek Bay ;;Canada;4;58-20N;062-35W;;;483;;
+CXBK;71;569;Bratts Lake, Sask.;;Canada;4;50-12N;104-42W;;;580;;
+CXBO;71;578;Beauport CS, Que.;;Canada;4;46-50N;071-12W;;;10;;
+CXBP;--;---;Confederation Bridge, Prince Edward Island ;;Canada;4;46-14N;063-44W;;;54;;
+CXCH;--;---;Cheticamp, N. S.;;Canada;4;46-39N;060-57W;;;44;;
+CXCK;71;039;Carmacks CS, Y. T.;;Canada;4;62-07N;136-11W;;;632;;
+CXDE;71;503;Deline , N. W. T.;;Canada;4;65-13N;123-26W;;;213;;
+CXDI;71;573;Delhi CS, Ont.;;Canada;4;42-52N;080-33W;;;232;;
+CXDW;71;840;Deerwood RCS , Man.;;Canada;4;49-24N;098-19W;;;341;;
+CXEC;71;157;Edmonton Municipal CR10 , Alta.;;Canada;4;53-34N;113-31W;;;671;;
+CXEG;71;155;Edmonton International CS , Alta.;;Canada;4;53-18N;113-36W;;;715;;
+CXGH;71;577;Gimli Harbour CS, Man.;;Canada;4;50-37-52N;096-58-56W;;;217;;
+CXHF;71;391;High Falls , Que.;;Canada;4;45-50N;075-39W;;;190;;
+CXKT;71;605;Kentville , N. S.;;Canada;4;45-04N;064-29W;;;49;;
+CXLC;71;680;Lower Carp Lake , N. W. T.;;Canada;4;63-36N;113-52W;;;373;;
+CXLL;71;682;Lindberg Landing , N. W. T.;;Canada;4;61-07N;122-51W;;;183;;
+CXMD;71;564;Morden CDA CS , Man.;;Canada;4;49-11N;098-05W;;;298;;
+CXMI;--;---;McNabs Island , N. S.;;Canada;4;44-36N;063-32W;;;15;;
+CXMM;71;585;Fort McMurray CS, Alta.;;Canada;4;56-39N;111-13W;;;369;;
+CXMY;--;---;Malay Falls , N. S.;;Canada;4;44-59N;062-29W;;;40;;
+CXNM;71;604;North Mountain , N. S.;;Canada;4;46-49N;060-40W;;;439;;
+CXOX;71;586;La Ronge , Sask.;;Canada;4;55-09N;105-16W;;;378;;
+CXPV;71;593;Prairie River, Alta;;Canada;4;58-37-20N;111-40-21W;;;212;;
+CXQA;71;583;Qavvik Lake, N. W. T.;;Canada;4;68-15-28N;122-06-13W;;;530;;
+CXRH;71;588;Rocky Harbour CS, Nfld.;;Canada;4;49-34N;057-53W;;;68;;
+CXSH;71;370;Shawinigan CS , Que.;;Canada;4;46-35N;072-35W;;;110;;
+CXSR;71;571;Spirit River Auto Station, Alta;;Canada;4;55-41-43N;119-14-03W;;;1015;;
+CXSW;71;587;St. John's West CDA CS, Nfld.;;Canada;4;47-30-56N;052-47-05W;;;114;;
+CXTN;71;492;Tuktut Nogait , N. W. T.;;Canada;4;69-11N;122-21W;;;552;;
+CXTP;71;589;Terra Nova National Park CS, Nfld.;;Canada;4;48-33-25N;053-58-28W;;;107;;
+CXTV;71;683;Trail Valley , N. W. T.;;Canada;4;68-45N;133-30W;;;85;;
+CXWN;71;579;Winnipeg The Forks, Man.;;Canada;4;49-53N;097-08W;;;230;;
+CXXX;71;073;Cluff Lake , Sask.;;Canada;4;58-23N;109-30W;;;339;;
+CXZU;71;256;Whitecourt , Alta.;;Canada;4;54-09N;115-47W;;;785;;
+CYAD;--;---;La Grande Iii Supplementary Aviation Weather Reporting Station ;;Canada;4;53-34N;076-12W;;;233;;
+CYAH;71;823;La Grande Iv, Que.;;Canada;4;53-45N;073-40W;53-45N;073-40W;306;307;P
+CYAJ;71;969;Komakuk Beach Airport;;Canada;4;69-35N;140-11W;;;7;;
+CYAM;71;260;Sault Ste Marie, Ont.;;Canada;4;46-29N;084-30W;;;187;192;P
+CYAS;--;---;Kangirsuk Supplementary Aviation Weather Reporting Station ;;Canada;4;60-01N;070-00W;;;117;;
+CYAW;71;601;Shearwater, N. S.;;Canada;4;44-38N;063-30W;44-38N;063-30W;51;51;P
+CYAY;--;---;Saint Anthony Airport;;Canada;4;51-24N;056-05W;;;28;;
+CYAZ;71;106;Tofino Airport;;Canada;4;49-05N;125-46W;;;24;;
+CYBB;--;---;Pelly Bay Airport;;Canada;4;68-32N;089-49W;;;15;;
+CYBC;71;187;Baie Comeau, Que.;;Canada;4;49-08N;068-12W;;;21;22;P
+CYBD;71;206;Bella Coola Airport ;;Canada;4;52-23N;126-35W;;;35;;
+CYBG;71;727;Bagotville, Que.;;Canada;4;48-20N;071-00W;48-20N;071-00W;159;159;P
+CYBK;71;926;Baker Lake, N. W. T.;;Canada;4;64-18N;096-05W;64-18N;096-00W;18;18;P
+CYBL;--;---;Campbell River Airport;;Canada;4;49-57N;125-16W;;;106;;
+CYBN;--;---;Borden, Ont.;;Canada;4;44-15N;079-55W;;;223;;
+CYBR;71;140;Brandon, Man.;;Canada;4;49-55N;099-57W;;;409;409;P
+CYBU;71;130;Nipawin, Sask.;;Canada;4;53-20N;104-00W;;;372;372;P
+CYBV;71;859;Berens River Airport;;Canada;4;52-21N;097-02W;;;222;;
+CYBW;--;---;Calgary / Springbank;;Canada;4;51-06N;114-22W;;;1200;;
+CYBX;71;808;Blanc Sablon, Que.;;Canada;4;51-27N;057-11W;;;30;36;P
+CYCA;--;---;Cartwright Man ;;Canada;4;53-41N;057-02W;;;12;;
+CYCB;71;925;Cambridge Bay, N. W. T.;;Canada;4;69-06N;105-07W;69-08N;105-04W;23;27;P
+CYCD;71;890;Nanaimo Airport;;Canada;4;49-03N;123-52W;;;28;;
+CYCG;71;884;Castlegar Airport;;Canada;4;49-18N;117-38W;49-18N;117-38W;495;495;
+CYCH;71;717;Chatham Can-Mil ;;Canada;4;47-00N;065-27W;47-01N;065-27W;31;34;
+CYCL;71;711;Charlo, N. B.;;Canada;4;47-59N;066-20W;;;38;38;P
+CYCO;71;938;Coppermine, N. W. T.;;Canada;4;67-49N;115-08W;67-50N;115-07W;22;22;P
+CYCP;71;883;Blue River, B. C.;;Canada;4;52-08N;119-18W;;;679;683;P
+CYCQ;--;---;Chetwynd Airport;;Canada;4;55-42N;121-38W;;;609;;
+CYCS;--;---;Chesterfield Inlet;;Canada;4;63-20N;090-43W;;;11;;
+CYCT;71;873;Coronation Marine Aviation Reporting Station ;;Canada;4;52-04N;111-27W;;;791;;
+CYCX;71;701;Gagetown Can-Mil ;;Canada;4;45-50N;066-26W;45-50N;066-26W;51;51;
+CYCY;71;090;Clyde, N. W. T.;;Canada;4;70-29N;068-31W;70-27N;068-33W;25;26;P
+CYDA;71;966;Dawson, Y. T.;;Canada;4;64-03N;139-08W;;;370;370;P
+CYDB;--;---;Burwash Airport;;Canada;4;61-22N;139-02W;;;807;;
+CYDC;71;886;Princeton Airport ;;Canada;4;49-28N;120-31W;;;700;;
+CYDF;71;809;Deer Lake, Nfld.;;Canada;4;49-13N;057-24W;;;17;22;P
+CYDM;--;---;Ross River Airport;;Canada;4;61-58N;132-26W;;;705;;
+CYDN;71;855;Dauphin, Man.;;Canada;4;51-06N;100-03W;51-06N;100-03W;305;305;P
+CYDP;71;902;Nain, Nfld;;Canada;4;56-33N;061-41W;;;6;7;P
+CYDQ;--;---;Dawson Creek Airport ;;Canada;4;55-45N;120-11W;;;655;;
+CYED;71;121;Edmonton Namao Alta.;;Canada;4;53-40N;113-28W;53-40N;113-28W;688;688;P
+CYEG;71;123;Edmonton International, Alta.;;Canada;4;53-18N;113-35W;53-19N;113-35W;715;723;P
+CYEK;--;---;Arviat Airport;;Canada;4;61-06N;094-04W;;;10;;
+CYEL;--;---;Elliot Lake Supplementary Aviation Weather Reporting Station ;;Canada;4;46-21N;082-34W;;;329;;
+CYEN;71;862;Estevan, Sask.;;Canada;4;49-13N;102-58W;;;572;581;P
+CYET;71;881;Edson, Alta.;;Canada;4;53-35N;116-28W;;;921;927;P
+CYEU;--;---;Eureka Man ;;Canada;4;80-00N;085-49W;;;78;;
+CYEV;71;957;Inuvik, N. W. T.;;Canada;4;68-18N;133-29W;68-19N;133-32W;59;68;P
+CYFB;71;909;Iqaluit, N. W. T.;;Canada;4;63-45N;068-33W;63-45N;068-33W;34;34;P
+CYFC;71;700;Fredericton, N. B.;;Canada;4;45-52N;066-32W;;;17;20;P
+CYFO;--;---;Flin Flon Airport;;Canada;4;54-41N;101-41W;;;304;;
+CYFR;--;---;Fort Resolution;;Canada;4;61-11N;113-41W;;;164;;
+CYFS;71;946;Fort Simpson, N. W. T.;;Canada;4;61-45N;121-14W;;;168;169;P
+CYFT;--;---;Makkovik Airport;;Canada;4;55-05N;059-11W;;;71;;
+CYGE;--;---;Golden Airport;;Canada;4;51-18N;116-59W;;;785;;
+CYGH;--;---;Fort Good Hope Airport;;Canada;4;66-16N;128-37W;;;60;;
+CYGK;71;620;Kingston, Ont.;;Canada;4;44-13N;076-36W;;;93;93;P
+CYGL;71;827;La Grande Riviere, Que;;Canada;4;53-38N;077-42W;;;195;195;P
+CYGM;71;856;Gimli Industrial, Man;;Canada;4;50-37N;097-02W;;;230;232;P
+CYGP;71;188;Gaspe, Que.;;Canada;4;48-46N;064-29W;;;33;33;P
+CYGQ;71;834;Geraldton, Ont.;;Canada;4;49-47N;086-56W;49-42N;086-57W;349;349;P
+CYGR;71;709;Iles De La Madeleineque.;;Canada;4;47-25N;061-47W;;;10;10;P
+CYGT;--;---;Igloolik Airport;;Canada;4;69-22N;081-49W;;;51;;
+CYGV;71;313;Havre St Pierre ;;Canada;4;50-17N;063-37W;;;33;;
+CYGW;71;905;Kuujjuarapik, Que.;;Canada;4;55-17N;077-46W;;;21;10;P
+CYGX;71;912;Gillam, Man.;;Canada;4;56-21N;094-42W;;;145;145;P
+CYHA;71;904;Quaqtaq Airport;;Canada;4;61-03N;069-38W;;;30;;
+CYHB;71;868;Hudson Bay, Sask.;;Canada;4;52-49N;102-19W;;;357;358;P
+CYHD;--;---;Dryden Airport;;Canada;4;49-50N;092-45W;;;413;;
+CYHE;71;114;Hope, B. C.;;Canada;4;49-22N;121-29W;;;39;39;P
+CYHH;--;---;Nemiscau Airport Supplementary Aviation Weather Reporting Station ;;Canada;4;51-42N;076-07W;;;244;;
+CYHI;--;---;Holman Island Airport;;Canada;4;70-46N;117-48W;;;36;;
+CYHK;--;---;Gjoa Haven Airport;;Canada;4;68-38N;095-51W;;;46;;
+CYHM;71;263;Hamilton Airport ;;Canada;4;43-10N;079-56W;;;237;;
+CYHU;71;371;Saint Hubert Airport ;;Canada;4;45-31N;073-25W;;;27;;
+CYHY;71;935;Hay River, N. W. T.;;Canada;4;60-50N;115-47W;;;164;166;P
+CYHZ;71;395;Halifax International Airport ;;Canada;4;44-53N;063-30W;;;145;;
+CYID;--;---;Digby Airport Aviation Weather Reporting Station ;;Canada;4;44-33N;065-47W;;;152;;
+CYIK;--;---;Ivujivik Airport Supplementary Aviation Weather Reporting Station ;;Canada;4;62-25N;077-57W;;;42;;
+CYIO;71;095;Pond Inlet, N. W. T.;;Canada;4;72-42N;077-58W;;;59;55;P
+CYIV;71;145;Island Lake, Man.;;Canada;4;53-51N;094-39W;53-52N;094-40W;237;237;P
+CYJF;--;---;Fort Liard Airport;;Canada;4;60-14N;123-29W;;;215;;
+CYJT;71;815;Stephenville, Nfld.;;Canada;4;48-32N;058-33W;48-32N;058-33W;8;26;P
+CYKA;71;887;Kamloops, B. C.;;Canada;4;50-42N;120-27W;;;345;346;P
+CYKD;--;---;Aklavik Airport;;Canada;4;68-13N;135-00W;;;7;;
+CYKF;71;368;Waterloo Well ;;Canada;4;43-28N;080-23W;;;317;;
+CYKG;--;---;Kangiqsujuaq Supplementary Aviation Weather Reporting Station ;;Canada;4;61-35N;071-56W;;;151;;
+CYKJ;71;488;Key Lake;;Canada;4;57-15N;105-37W;;;509;;
+CYKL;71;828;Schefferville, Que.;;Canada;4;54-48N;066-48W;54-48N;066-49W;521;518;P
+CYKO;--;---;Akulivik Airport;;Canada;4;60-49N;078-09W;;;20;;
+CYKQ;--;---;Waskaganish Airport;;Canada;4;51-29N;078-45W;;;23;;
+CYKY;71;129;Kindersley, Sask.;;Canada;4;51-31N;109-10W;51-31N;109-11W;694;694;P
+CYKZ;--;---;Toronto Buttonville;;Canada;4;43-52N;079-22W;;;198;;
+CYLA;--;---;Aupaluk, Que.;;Canada;4;59-17-48N;069-35-59W;;;35;;
+CYLC;--;---;Kimmirut A Nwt;;Canada;4;62-51N;069-53W;;;53;;
+CYLD;--;---;Chapleau, Ont.;;Canada;4;47-49N;083-21W;;;447;;
+CYLJ;71;125;Meadow Lake, Sask.;;Canada;4;54-08N;108-31W;;;480;480;P
+CYLK;--;---;Lutsel KE, N. W. T.;;Canada;4;62-25N;110-40W;;;179;;
+CYLL;71;871;Lloydminister, Alta.;;Canada;4;53-19N;110-04W;;;665;669;P
+CYLT;--;---;Alert Airport;;Canada;4;82-31N;062-17W;;;31;;
+CYLU;--;---;Kangiksualujjuaq A;;Canada;4;58-43N;065-59W;;;60;;
+CYLW;71;203;Kelowna Airport;;Canada;4;49-58N;119-23W;49-58N;119-23W;430;430;
+CYMA;71;965;Mayo Airport;;Canada;4;63-37N;135-52W;;;504;;
+CYMD;71;072;Mould Bay, N. W. T.;;Canada;4;76-14N;119-20W;76-15N;119-21W;15;12;P
+CYMH;--;---;Mary's Harbour ;;Canada;4;52-18N;055-51W;;;11;;
+CYMJ;71;864;Moose Jaw, Sask.;;Canada;4;50-20N;105-33W;;;577;577;P
+CYML;--;---;Charlevoix Airport;;Canada;4;47-36N;070-14W;;;298;;
+CYMM;71;932;Fort Mcmurray, Alta.;;Canada;4;56-39N;111-13W;56-39N;111-13W;369;369;P
+CYMO;71;836;Moosonee, Ont.;;Canada;4;51-16N;080-39W;51-16N;080-39W;10;10;P
+CYMT;71;822;Chibougamau-Chapais, Que;;Canada;4;49-46N;074-32W;;;388;387;P
+CYMU;--;---;Umiujaq;;Canada;4;56-32N;076-31W;;;71;;
+CYMX;--;---;Montreal / Mirabel;;Canada;4;45-41N;074-02W;;;82;;
+CYNA;71;813;Natashquan, Que.;;Canada;4;50-11N;061-49W;;;7;11;P
+CYNC;--;---;Aeroport de Wemindji, Que.;;Canada;4;53-00-39N;078-49-49W;;;15;;
+CYND;--;---;Gatineau Airport;;Canada;4;45-31N;075-34W;;;64;;
+CYNE;71;141;Norway House, Man.;;Canada;4;53-58N;097-50W;;;223;223;P
+CYNM;71;821;Matagami, Que.;;Canada;4;49-46N;077-49W;;;281;281;P
+CYOA;--;---;Ekati, N. W. T.;;Canada;4;64-42N;110-37W;;;469;;
+CYOC;--;---;Old Crow Airport;;Canada;4;67-34N;139-49W;;;251;;
+CYOD;71;120;Cold Lake, Alta.;;Canada;4;54-25N;110-17W;54-25N;110-17W;541;541;P
+CYOJ;71;066;High Level, Alta;;Canada;4;58-37N;117-10W;;;338;338;P
+CYOW;71;628;Ottawa Int'L. Ont.;;Canada;4;45-19N;075-40W;45-19N;075-40W;116;114;P
+CYOY;71;716;Valcartier Airport;;Canada;4;46-54N;071-30W;46-54N;071-29W;168;178;
+CYPA;71;869;Prince Albert, Sask.;;Canada;4;53-13N;105-41W;53-13N;105-41W;428;428;P
+CYPC;--;---;Paulatuk Airport;;Canada;4;69-21N;124-02W;;;6;;
+CYPD;--;---;Port Hawkesbury;;Canada;4;45-40N;061-23W;;;114;;
+CYPE;71;068;Peace River, Alta.;;Canada;4;56-14N;117-26W;;;571;571;P
+CYPG;71;851;Portage Southport A;;Canada;4;49-54N;098-16W;;098-16W;269;259;
+CYPH;--;---;Inukjuak Airport Supplementary Aviation Weather Reporting Station ;;Canada;4;58-28N;078-05W;;;25;;
+CYPL;--;---;Pickle Lake Man ;;Canada;4;51-27N;090-12W;;;386;;
+CYPN;--;---;Port Menier Man ;;Canada;4;49-50N;064-17W;;;51;;
+CYPQ;71;629;Peterborough Airport ;;Canada;4;44-14N;078-22W;;;191;;
+CYPR;71;898;Prince Rupert, B. C.;;Canada;4;54-18N;130-26W;;;34;34;P
+CYPW;71;208;Powell River Airport ;;Canada;4;49-50N;124-30W;;;130;;
+CYPX;--;---;Povungnituq;;Canada;4;60-03N;077-17W;;;23;;
+CYPY;71;933;Fort Chipewyan, Alta.;;Canada;4;58-46N;111-07W;;;232;232;P
+CYPZ;71;952;Burns Lake ;;Canada;4;54-23N;125-57W;;;713;;
+CYQA;71;630;Muskoka, Ont.;;Canada;4;44-58N;079-18W;;;280;282;P
+CYQB;71;714;Quebec, Que;;Canada;4;46-48N;071-23W;46-48N;071-23W;70;74;P
+CYQD;71;867;The Pas, Man.;;Canada;4;53-58N;101-06W;53-58N;101-06W;271;271;P
+CYQF;71;878;Red Deer, Alta.;;Canada;4;52-11N;113-54W;52-11N;113-54W;905;905;P
+CYQG;71;538;Windsor, Ont.;;Canada;4;42-16N;082-58W;;;190;190;P
+CYQH;71;953;Watson Lake, Y. T.;;Canada;4;60-07N;128-49W;60-07N;128-49W;690;690;P
+CYQI;71;603;Yarmouth, N. S.;;Canada;4;43-50N;066-05W;43-52N;066-06W;43;43;P
+CYQK;71;850;Kenora, Ont.;;Canada;4;49-47N;094-22W;;;407;410;P
+CYQL;71;874;Lethbridge, Alta.;;Canada;4;49-38N;112-48W;49-38N;112-48W;929;929;P
+CYQM;71;705;Moncton, N. B.;;Canada;4;46-07N;064-41W;;;71;71;P
+CYQQ;71;893;Comox, B. C.;;Canada;4;49-43N;124-54W;49-43N;124-54W;24;24;P
+CYQR;71;863;Regina, Sask.;;Canada;4;50-26N;104-40W;50-26N;104-40W;577;577;P
+CYQT;71;749;Thunder Bay, Ont.;;Canada;4;48-22N;089-19W;;;199;199;P
+CYQU;71;940;Grande Prairie, Alta.;;Canada;4;55-11N;118-53W;;;666;669;P
+CYQV;71;138;Yorkton, Sask.;;Canada;4;51-16N;102-28W;;;498;498;P
+CYQW;71;876;North Battleford, Sask.;;Canada;4;52-46N;108-15W;;;548;548;P
+CYQX;71;803;Gander Int. Airport, Nfld.;;Canada;4;48-57N;054-34W;48-57N;054-34W;151;151;P
+CYQY;71;707;Sydney, N. S.;;Canada;4;46-10N;060-03W;46-10N;060-03W;56;62;P
+CYQZ;71;103;Quesnel Airport;;Canada;4;53-02N;122-31W;;;545;;
+CYRB;71;924;Resolute, N. W. T.;;Canada;4;74-43N;094-59W;74-42N;094-58W;67;67;P
+CYRJ;71;728;Roberval, Que.;;Canada;4;48-31N;072-16W;;;179;179;P
+CYRL;71;854;Red Lake, Ont.;;Canada;4;51-04N;093-48W;;;375;383;P
+CYRM;71;928;Rocky Mountain House, Alta;;Canada;4;52-26N;114-55W;52-23N;114-55W;988;988;P
+CYRT;71;083;Rankin Inlet, N. W. T.;;Canada;4;62-49N;092-07W;;;31;31;P
+CYRV;71;882;Revelstoke, B. C.;;Canada;4;50-58N;118-11W;;;443;443;P
+CYSA;--;---;Sable Island Airport ;;Canada;4;43-56N;060-00W;;;4;;
+CYSB;71;730;Sudbury, Ont.;;Canada;4;46-37N;080-48W;;;348;348;P
+CYSC;71;610;Sherbrooke, Que.;;Canada;4;45-24N;071-53W;;;170;;P
+CYSD;71;128;Suffield Airport;;Canada;4;50-16N;111-11W;;;770;;
+CYSF;71;132;Stony Rapids Airport;;Canada;4;59-15N;105-50W;;;250;;
+CYSJ;71;609;Saint John, N. B.;;Canada;4;45-20N;065-53W;;;103;109;P
+CYSK;--;---;Sanikiluaq Airport;;Canada;4;56-32N;079-15W;;;32;;
+CYSL;71;703;Saint Leonard Airport ;;Canada;4;47-09N;067-50W;;;241;;
+CYSM;71;934;Fort Smith, N. W. T.;;Canada;4;60-01N;111-57W;60-02N;111-56W;203;205;P
+CYSN;--;---;Saint Catharines Airport;;Canada;4;43-12N;079-10W;;;98;;
+CYSR;--;---;Nanisivik Airport ;;Canada;4;72-59N;084-38W;;;649;;
+CYSU;71;702;Summerside Can-Mil ;;Canada;4;46-26N;063-50W;46-26N;063-50W;24;24;
+CYSY;--;---;Sachs Harbour Airport;;Canada;4;72-00N;125-17W;;;86;;
+CYTE;71;910;Cape Dorset, N. W. T.;;Canada;4;64-13N;076-32W;;;51;50;P
+CYTH;71;079;Thompson Weather Office, Man;;Canada;4;55-48N;097-51W;55-48N;097-52W;204;222;P
+CYTJ;--;---;Terrace Bay Supplementary Aviation Weather Reporting Station ;;Canada;4;48-49N;087-06W;;;287;;
+CYTL;71;848;Big Trout Lake;;Canada;4;53-50N;089-52W;53-50N;089-52W;224;224;
+CYTN;--;---;Trenton Municipal A, N. S.;;Canada;4;45-36-41N;062-37-19W;;;97;;
+CYTQ;--;---;Tasiujaq A;;Canada;4;58-40N;069-57W;;;31;;
+CYTR;71;621;Trenton, Ont.;;Canada;4;44-07N;077-32W;44-07N;077-32W;85;86;P
+CYTS;71;739;Timmins, Ont.;;Canada;4;48-34N;081-22W;;;295;295;P
+CYTZ;71;265;Toronto Island Airport Automated Reporting Station;;Canada;4;43-38N;079-24W;;;77;;
+CYUA;71;968;Shingle Point, Y. T.;;Canada;4;68-57N;137-13W;;;56;38;P
+CYUB;71;954;Tuktoyaktuk ;;Canada;4;69-27N;133-01W;69-27N;133-01W;5;5;
+CYUI;71;939;Cape Young Airport;;Canada;4;68-56N;116-55W;;;16;;
+CYUJ;71;937;Lady Franklin Point, N. W. T.;;Canada;4;68-30N;113-13W;;;21;16;P
+CYUK;71;929;Byron Bay Airport;;Canada;4;68-45N;109-04W;;;92;;
+CYUL;71;627;Montreal / Pierre Elliot Trudeau International Airport, Que;;Canada;4;45-28N;073-45W;45-28N;073-45W;31;36;P
+CYUQ;71;071;Jenny Lind Island Airport;;Canada;4;68-39N;101-44W;;;18;;
+CYUS;71;911;Shepherd Bay, N. W. T.;;Canada;4;68-49N;093-26W;;;51;42;P
+CYUT;--;---;Repulse Bay Airport;;Canada;4;66-32N;086-15W;;;24;;
+CYUV;--;---;Longstaff Blf Airport;;Canada;4;68-56N;075-17W;;;14;;
+CYUX;71;081;Hall Beach, N. W. T.;;Canada;4;68-47N;081-15W;68-46N;081-13W;8;8;P
+CYUY;--;---;Rouyn Airport;;Canada;4;48-12N;078-50W;;;301;;
+CYVC;71;922;La Ronge, Sask;;Canada;4;55-09N;105-16W;;;375;379;P
+CYVM;--;---;Broughton Island Airport;;Canada;4;67-33N;064-02W;;;6;;
+CYVO;71;725;Val D'Or, Que.;;Canada;4;48-04N;077-47W;;;337;337;P
+CYVP;71;906;Kuujjuaq, Que.;;Canada;4;58-06N;068-25W;58-06N;068-25W;37;37;P
+CYVQ;71;043;Norman Wells, N. W. T.;;Canada;4;65-17N;126-48W;65-17N;126-45W;67;74;P
+CYVR;71;892;Vancouver International Air-Port, B. C.;;Canada;4;49-11N;123-10W;49-11N;123-10W;3;2;P
+CYVT;--;---;Buffalo Narrows Man;;Canada;4;55-50N;108-27W;;;434;;
+CYVV;71;633;Wiarton, Ont.;;Canada;4;44-45N;081-06W;;;222;222;P
+CYWA;71;625;Petawawa, Ont.;;Canada;4;45-57N;077-19W;45-57N;077-19W;130;130;P
+CYWG;71;852;Winnipeg Int. Airportman.;;Canada;4;49-54N;097-14W;49-54N;097-14W;239;239;P
+CYWH;--;---;Victoria Harbour;;Canada;4;48-25N;123-20W;;;5;;
+CYWJ;--;---;Fort Franklin Airport;;Canada;4;65-12N;123-26W;;;176;;
+CYWK;71;825;Wabush Lake, Nfld.;;Canada;4;52-56N;066-52W;;;551;551;P
+CYWL;71;104;Williams Lake, B. C.;;Canada;4;52-11N;122-03W;;;940;940;P
+CYWO;--;---;Lupin Airport Supplementary Aviation Weather Reporting Station ;;Canada;4;65-46N;111-15W;;;494;;
+CYWV;--;---;Wainwright Airport;;Canada;4;52-48N;110-53W;;;662;;
+CYWY;--;---;Wrigley Airport;;Canada;4;63-13N;123-26W;;;150;;
+CYXC;71;880;Cranbrook, B. C.;;Canada;4;49-37N;115-47W;;;939;939;P
+CYXD;71;879;Edmonton Municipal Alta.;;Canada;4;53-34N;113-31W;53-34N;113-31W;671;671;P
+CYXE;71;866;Saskatoon, Sask.;;Canada;4;52-10N;106-41W;52-10N;106-41W;501;504;P
+CYXH;71;872;Medicine Hat, Alta.;;Canada;4;50-01N;110-43W;;;717;717;P
+CYXJ;71;943;Fort St John, B. C.;;Canada;4;56-14N;120-44W;;;695;695;P
+CYXL;71;842;Sioux Lookout, Ont.;;Canada;4;50-07N;091-54W;;;389;390;P
+CYXN;--;---;Whale Cove Airport;;Canada;4;62-14N;092-36W;;;20;;
+CYXP;--;---;Pangnirtung Airport;;Canada;4;66-09N;065-43W;;;23;;
+CYXQ;--;---;Beaver Creek Airport;;Canada;4;62-25N;140-52W;;;649;;
+CYXR;71;735;Earlton, Ont.;;Canada;4;47-42N;079-51W;;;243;243;P
+CYXS;71;896;Prince George, B. C.;;Canada;4;53-53N;122-41W;53-53N;122-40W;691;691;P
+CYXT;71;951;Terrace, B. C.;;Canada;4;54-28N;128-35W;;;217;217;P
+CYXU;71;623;London, Ont.;;Canada;4;43-02N;081-09W;;;278;278;P
+CYXX;71;108;Abbotsford, B. C.;;Canada;4;49-02N;122-22W;;;54;58;P
+CYXY;71;964;Whitehorse, Y. T.;;Canada;4;60-43N;135-04W;60-43N;135-04W;703;703;P
+CYXZ;71;738;Wawa, Ont.;;Canada;4;47-58N;084-47W;;;287;287;P
+CYYB;71;731;North Bay, Ont.;;Canada;4;46-21N;079-26W;46-22N;079-25W;358;371;P
+CYYC;71;877;Calgary International, Alta.;;Canada;4;51-07N;114-01W;51-07N;114-01W;1077;1084;P
+CYYD;71;950;Smithers, B. C.;;Canada;4;54-49N;127-11W;;;523;523;P
+CYYE;71;945;Fort Nelson, B. C.;;Canada;4;58-50N;122-35W;58-50N;122-36W;382;382;P
+CYYF;71;889;Penticton, B. C.;;Canada;4;49-28N;119-36W;;;344;344;P
+CYYG;71;706;Charlottetown, P. E. I.;;Canada;4;46-17N;063-08W;;;48;54;P
+CYYH;--;---;Spence Bay Airport ;;Canada;4;69-33N;093-35W;;;28;;
+CYYJ;71;799;Victoria Int. Airport, B. C.;;Canada;4;48-39N;123-26W;48-39N;123-26W;20;19;P
+CYYL;71;078;Lynn Lake, Man.;;Canada;4;56-52N;101-05W;56-52N;101-05W;357;357;P
+CYYN;71;870;Swift Current, Sask.;;Canada;4;50-17N;107-41W;;;818;818;P
+CYYQ;71;913;Churchill, Man.;;Canada;4;58-44N;094-04W;58-44N;094-05W;28;29;P
+CYYR;71;816;Goose, Nfld.;;Canada;4;53-19N;060-25W;53-18N;060-22W;46;49;P
+CYYT;71;801;St. John's, Nfld;;Canada;4;47-37N;052-44W;47-40N;052-45W;134;140;P
+CYYU;71;831;Kapuskasing, Ont.;;Canada;4;49-25N;082-28W;;;227;227;P
+CYYW;71;841;Armstrong, Ont.;;Canada;4;50-18N;089-02W;;;351;351;P
+CYYY;71;718;Mont Joli, Que.;;Canada;4;48-36N;068-13W;;;48;52;P
+CYYZ;71;624;Toronto Pearson Int'L. Ont.;;Canada;4;43-40N;079-38W;43-41N;079-38W;173;173;P
+CYZE;71;733;Gore Bay, Ont.;;Canada;4;45-53N;082-34W;;;193;193;P
+CYZF;71;936;Yellowknife, N. W. T.;;Canada;4;62-28N;114-27W;;;205;206;P
+CYZG;--;---;Salliut Airport Supplementary Aviation Weather Reporting Station ;;Canada;4;62-11N;075-40W;;;226;;
+CYZH;71;069;Slave Lake, Alta;;Canada;4;55-18N;114-47W;55-18N;114-47W;581;581;P
+CYZP;71;101;Sandspit, B. C.;;Canada;4;53-15N;131-49W;;;6;6;P
+CYZR;71;634;Sarnia Airport ;;Canada;4;43-00N;082-19W;;;181;;
+CYZS;71;915;Coral Harbour, N. W. T.;;Canada;4;64-12N;083-22W;64-12N;083-22W;64;64;P
+CYZT;71;109;Port Hardy, B. C.;;Canada;4;50-41N;127-22W;50-41N;127-22W;22;22;P
+CYZU;71;930;Whitecourt, Alta.;;Canada;4;54-09N;115-47W;;;783;782;P
+CYZV;71;811;Sept-Iles, Que.;;Canada;4;50-13N;066-16W;50-13N;066-15W;55;55;P
+CYZW;71;045;Teslin, Y. T.;;Canada;4;60-10N;132-44W;;;711;705;P
+CYZX;71;397;Greenwood, N. S.;;Canada;4;44-59N;064-55W;;;28;28;P
+CYZY;71;944;Mackenzie, B. C.;;Canada;4;55-18N;123-08W;;;695;690;P
+CZAG;--;---;La Grande Iv Remote Environment Automatic Data Acquisition Concept;;Canada;4;53-45N;073-41W;;;307;;
+CZBF;--;---;Bathurst Airport Aviation Weather Reporting Station ;;Canada;4;47-38N;065-45W;;;59;;
+CZCP;--;---;Cape Parry, N. W. T.;;Canada;4;70-06N;124-43W;;;87;;
+CZDI;71;180;Churchill Falls;;Canada;4;53-34N;064-06W;;;440;;
+CZEM;--;---;Eastmain River Airport;;Canada;4;52-14N;078-31W;;;7;;
+CZFA;--;---;Faro Airport;;Canada;4;62-12N;133-22W;;;717;;
+CZFM;--;---;Fort Mcpherson Airport;;Canada;4;67-24N;134-51W;;;43;;
+CZFN;--;---;Fort Norman Airport;;Canada;4;64-55N;125-34W;;;98;;
+CZNB;--;---;North Bay Remote Environment Automatic Data Acquisition Concept ;;Canada;4;46-22N;079-25W;;;364;;
+CZOC;71;044;Old Crow Automatic Weather Reporting System ;;Canada;4;67-34N;139-50W;;;251;;
+CZPC;--;---;Pincher Creek Airport;;Canada;4;49-31N;113-59W;;;1190;;
+CZPK;71;984;Paulatuk Automated Reporting Station ;;Canada;4;69-21N;124-03W;;;6;;
+CZST;71;955;Stewart Airport;;Canada;4;55-56N;129-59W;;;7;;
+CZUB;71;985;Tuktoyaktuk Automated Reporting Station ;;Canada;4;69-26N;133-02W;;;6;;
+CZUE;71;948;Cape Parry, N. W. T.;;Canada;4;70-10N;124-42W;;;17;17;P
+CZUM;71;182;Churchill Falls, Nfld.;;Canada;4;53-33N;064-06W;;;440;440;P
+CZVL;--;---;Edmonton / Villeneuve;;Canada;4;53-40N;113-52W;;;686;;
+CZWN;--;---;Wainwright Automatic Weather Reporting System ;;Canada;4;52-49N;111-05W;;;684;;
+DAAD;60;515;Bou-Saada;;Algeria;1;35-20N;004-12E;;;461;461;P
+DAAE;60;402;Bejaia;;Algeria;1;36-43N;005-04E;36-43N;005-04E;2;2;P
+DAAF;--;---;Aoulef ;;Algeria;1;26-58N;001-05E;;;309;;
+DAAG;60;390;Dar-El-Beida;;Algeria;1;36-43N;003-15E;36-43N;003-15E;25;25;P
+DAAJ;60;670;Djanet;;Algeria;1;24-33N;009-28E;24-33N;009-28E;1054;1054;P
+DAAP;60;640;Illizi;;Algeria;1;26-30N;008-25E;26-30N;008-25E;558;558;P
+DAAS;60;445;Setif;;Algeria;1;36-11N;005-25E;36-11N;005-25E;1038;1081;P
+DAAT;--;---;Tamanrasset / Aguenna;;Algeria;1;22-49N;005-28E;;;1377;;
+DAAV;60;351;Jijel Achouat;;Algeria;1;36-53N;005-49E;;;2;10;P
+DAAY;60;549;Mecheria;;Algeria;1;34-56N;000-26W;34-56N;000-26W;1149;1149;P
+DABB;60;360;Annaba;;Algeria;1;36-50N;007-49E;36-50N;007-49E;4;4;P
+DABC;60;419;Constantine;;Algeria;1;36-17N;006-37E;36-17N;006-37E;694;694;P
+DABP;60;355;Skikda;;Algeria;1;36-56N;006-57E;36-56N;006-57E;7;7;P
+DABS;60;475;Tebessa;;Algeria;1;35-29N;008-08E;35-29N;008-08E;813;813;P
+DABT;60;468;Batna;;Algeria;1;35-33N;006-11E;;;1052;1052;P
+DAFH;--;---;Tilrempt/Hassi R'mel;;Algeria;1;32-55-48N;003-18-44E;;;774;;
+DAFI;60;535;Djelfa;;Algeria;1;34-41N;003-15E;34-41N;003-15E;1144;1144;P
+DAOB;60;511;Tiaret;;Algeria;1;35-15N;001-26E;;;1127;1127;P
+DAOF;60;656;Tindouf;;Algeria;1;27-40N;008-08W;27-40N;008-08W;431;431;P
+DAOI;60;425;Chlef;;Algeria;1;36-13N;001-20E;36-13N;001-20E;143;143;P
+DAOL;--;---;Oran/Tafaraoui;;Algeria;1;35-32-33N;000-31-56W;;;112;;
+DAON;60;531;Tlemcen Zenata ;;Algeria;1;35-01N;001-28W;;;247;247;P
+DAOO;60;490;Oran / Es Senia;;Algeria;1;35-38N;000-36W;35-38N;000-36W;90;90;P
+DAOR;60;571;Bechar;;Algeria;1;31-37N;002-14W;31-37N;002-14W;773;773;P
+DAOV;60;507;Mascara-Ghriss;;Algeria;1;35-12N;000-08E;;;514;;
+DATG;--;---;In Guezzam;;Algeria;1;19-34N;005-45E;;;399;;
+DATM;--;---;Bordj Mokhtar;;Algeria;1;21-22-30N;000-55-26E;;;396;;
+DAUA;60;620;Adrar;;Algeria;1;27-53N;000-17W;27-53N;000-17W;263;263;P
+DAUB;60;525;Biskra;;Algeria;1;34-48N;005-44E;34-48N;005-44E;87;87;P
+DAUE;60;590;El Golea;;Algeria;1;30-34N;002-52E;30-34N;002-52E;397;397;P
+DAUG;60;566;Ghardaia;;Algeria;1;32-23N;003-49E;32-23N;003-49E;450;450;P
+DAUH;60;581;Hassi-Messaoud;;Algeria;1;31-40N;006-09E;;;142;142;P
+DAUI;--;---;In Salah North;;Algeria;1;27-15N;002-31E;;;269;;
+DAUK;60;555;Touggourt;;Algeria;1;33-07N;006-08E;33-07N;006-08E;85;85;P
+DAUL;60;545;Laghouat;;Algeria;1;33-46N;002-56E;33-46N;002-56E;765;765;P
+DAUO;60;559;El Oued;;Algeria;1;33-30N;006-07E;33-30N;006-47E;63;63;P
+DAUT;60;607;Timimoun;;Algeria;1;29-15N;000-17E;29-15N;000-17E;312;312;P
+DAUU;60;580;Ouargla;;Algeria;1;31-55N;005-24E;31-55N;005-24E;141;141;P
+DAUZ;60;611;In Amenas;;Algeria;1;28-03N;009-38E;28-03N;009-38E;562;562;P
+DBBB;65;344;Cotonou;;Benin;1;06-21N;002-23E;06-21N;002-23E;5;9;P
+DBBC;65;338;Bohicon;;Benin;1;07-10N;002-04E;;;166;167;P
+DBBK;65;306;Kandi;;Benin;1;11-08N;002-56E;11-08N;002-56E;290;292;P
+DBBN;65;319;Natitingou;;Benin;1;10-19N;001-23E;;;460;461;P
+DBBP;65;330;Parakou;;Benin;1;09-21N;002-37E;09-21N;002-37E;392;393;P
+DBBS;65;335;Save;;Benin;1;08-02N;002-28E;;;199;200;P
+DFCC;65;502;Ouahigouya;;Burkina Faso;1;13-34N;002-25W;;;337;336;
+DFCO;65;516;Boromo;;Burkina Faso;1;11-45N;002-56W;;;270;271;
+DFCP;65;518;Po;;Burkina Faso;1;11-09N;001-09W;;;320;322;
+DFEE;65;501;Dori;;Burkina Faso;1;14-02N;000-02W;14-02N;000-02W;276;277;
+DFEF;65;507;Fada N'Gourma;;Burkina Faso;1;12-02N;000-22E;;;308;309;
+DFFD;65;503;Ouagadougou;;Burkina Faso;1;12-21N;001-31W;12-21N;001-31W;316;306;P
+DFOD;65;505;Dedougou;;Burkina Faso;1;12-28N;003-29W;;;300;300;
+DFOG;65;522;Gaoua;;Burkina Faso;1;10-20N;003-11W;;;333;335;
+DFOO;65;510;Bobo-Dioulasso;;Burkina Faso;1;11-10N;004-19W;11-10N;004-19W;460;460;P
+DGAA;65;472;Accra;;Ghana;1;05-36N;000-10W;05-36N;000-10W;68;69;P
+DGAD;65;475;Ada;;Ghana;1;05-47N;000-38E;;;5;7;P
+DGAH;65;453;Ho;;Ghana;1;06-36N;000-28E;;;158;158;P
+DGAK;65;460;Akuse;;Ghana;1;06-06N;000-07E;;;17;19;P
+DGAS;65;469;Saltpond;;Ghana;1;05-12N;001-04W;;;44;47;P
+DGAT;65;473;Tema;;Ghana;1;05-37N;00-00E;;;14;18;
+DGKA;65;457;Akim Oda;;Ghana;1;05-56N;000-59W;;;139;140;P
+DGKK;65;459;Koforidua;;Ghana;1;06-05N;000-15W;;;166;167;P
+DGLB;65;416;Bole;;Ghana;1;09-02N;002-29W;09-02N;002-29W;299;301;P
+DGLE;65;418;Tamale;;Ghana;1;09-30N;000-51W;09-30N;000-51W;168;173;P
+DGLN;65;401;Navrongo;;Ghana;1;10-54N;001-06W;;;201;203;P
+DGLW;65;404;Wa;;Ghana;1;10-03N;002-30W;;;323;323;P
+DGLY;65;420;Yendi;;Ghana;1;09-27N;000-01W;;;195;197;P
+DGSB;65;445;Sefwi Bekwai;;Ghana;1;06-12N;002-20W;;;171;172;P
+DGSI;65;442;Kumasi;;Ghana;1;06-43N;001-36W;06-43N;001-36W;287;293;P
+DGSN;65;439;Sunyani;;Ghana;1;07-20N;002-20W;;;309;312;P
+DGSW;65;432;Wenchi;;Ghana;1;07-45N;002-06W;;;339;340;P
+DGTK;65;467;Takoradi;;Ghana;1;04-53N;001-46W;04-53N;001-46W;5;9;P
+DGTX;65;465;Axim;;Ghana;1;04-52N;002-14W;;;38;40;P
+DIAD;65;585;Adiake;;Cote d'Ivoire;1;05-18N;003-18W;;;33;39;P
+DIAP;65;578;Abidjan;;Cote d'Ivoire;1;05-15N;003-56W;05-15N;003-56W;7;8;P
+DIBK;65;555;Bouake;;Cote d'Ivoire;1;07-44N;005-04W;07-44N;005-04W;376;376;P
+DIBU;65;545;Bondoukou;;Cote d'Ivoire;1;08-03N;002-47W;;;369;370;P
+DIDK;65;562;Dimbokro;;Cote d'Ivoire;1;06-39N;004-42W;;;92;92;P
+DIDL;65;560;Daloa;;Cote d'Ivoire;1;06-52N;006-28W;;;276;277;P
+DIGA;65;557;Gagnoa;;Cote d'Ivoire;1;06-08N;005-57W;;;205;210;P
+DIKO;65;536;Korhogo;;Cote d'Ivoire;1;09-25N;005-37W;09-25N;005-37W;381;381;P
+DIMN;65;548;Man;;Cote d'Ivoire;1;07-23N;007-31W;07-23N;007-31W;339;340;P
+DIOD;65;528;Odienne;;Cote d'Ivoire;1;09-30N;007-34W;09-30N;007-34W;434;421;P
+DISP;65;594;San Pedro;;Cote d'Ivoire;1;04-45N;006-39W;;;30;30;P
+DISS;65;599;Sassandra;;Cote d'Ivoire;1;04-57N;006-05W;;;62;66;P
+DITB;65;592;Tabou;;Cote d'Ivoire;1;04-25N;007-22W;04-25N;007-22W;21;21;P
+DIYO;65;563;Yamoussoukro;;Cote d'Ivoire;1;06-54N;005-21W;;;196;213;P
+DNBI;65;112;Bida;;Nigeria;1;09-06N;006-01E;;;137;143;P
+DNCA;65;264;Calabar;;Nigeria;1;04-58N;008-21E;;;63;63;P
+DNEN;65;257;Enugu;;Nigeria;1;06-28N;007-33E;;;137;;
+DNGU;65;015;Gusau;;Nigeria;1;12-10N;006-42E;;;463;469;P
+DNIB;65;208;Ibadan;;Nigeria;1;07-26N;003-54E;07-26N;003-54E;234;228;P
+DNIL;65;101;Ilorin;;Nigeria;1;08-29N;004-35E;;;308;305;P
+DNJO;65;134;Jos;;Nigeria;1;09-52N;008-54E;;;1295;1285;P
+DNKA;65;019;Kaduna;;Nigeria;1;10-36N;007-27E;;;645;642;P
+DNKN;65;046;Kano;;Nigeria;1;12-03N;008-32E;12-03N;008-32E;476;481;P
+DNMA;65;082;Maiduguri;;Nigeria;1;11-51N;013-05E;;;354;;
+DNMK;65;271;Makurdi;;Nigeria;1;07-41N;008-37E;07-41N;008-37E;113;97;P
+DNMM;65;201;Lagos / Ikeja;;Nigeria;1;06-35N;003-20E;06-35N;003-20E;40;38;P
+DNOS;65;215;Oshogbo;;Nigeria;1;07-47N;004-29E;;;305;304;P
+DNPO;65;250;Port Harcourt;;Nigeria;1;04-51N;007-01E;04-51N;007-01E;18;18;P
+DNSO;65;010;Sokoto;;Nigeria;1;13-01N;005-15E;;;351;302;P
+DNYO;65;167;Yola;;Nigeria;1;09-14N;012-28E;09-14N;012-28E;191;174;P
+DNZA;65;030;Zaria;;Nigeria;1;11-08N;007-41E;;;664;664;P
+DRRB;61;075;Birni-N'Konni;;Niger;1;13-48N;005-15E;13-48N;005-15E;272;273;
+DRRG;61;099;Gaya;;Niger;1;11-53N;003-27E;;;202;203;
+DRRI;61;017;Bilma;;Niger;1;18-41N;012-55E;18-41N;012-55E;355;357;
+DRRL;61;036;Tillabery;;Niger;1;14-12N;001-27E;;;209;210;
+DRRM;61;080;Maradi;;Niger;1;13-28N;007-05E;13-28N;007-05E;372;373;
+DRRN;61;052;Niamey-Aero;;Niger;1;13-29N;002-10E;13-29N;002-10E;223;227;
+DRRT;61;043;Tahoua;;Niger;1;14-54N;005-15E;;;386;391;
+DRZA;61;024;Agadez;;Niger;1;16-58N;007-59E;16-58N;007-59E;501;502;
+DRZF;61;085;Diffa;;Niger;1;13-25N;012-47E;;;303;305;
+DRZG;61;045;Goure;;Niger;1;13-59N;010-18E;;;464;460;
+DRZM;61;096;Maine-Soroa;;Niger;1;13-14N;011-59E;;;338;337;
+DRZR;61;090;Zinder;;Niger;1;13-47N;008-59E;13-47N;008-59E;452;453;
+DTKA;60;710;Tabarka;;Tunisia;1;36-57N;008-45E;36-57N;008-45E;20;21;
+DTMB;--;---;Habib Bourguiba ;;Tunisia;1;35-46N;010-45E;;;2;;
+DTTA;60;715;Tunis-Carthage;;Tunisia;1;36-50N;010-14E;36-50N;010-14E;3;4;P
+DTTB;60;714;Bizerte;;Tunisia;1;37-15N;009-48E;37-14N;009-49E;5;3;P
+DTTD;60;775;Remada;;Tunisia;1;32-19N;010-24E;32-19N;010-24E;300;301;P
+DTTF;60;745;Gafsa;;Tunisia;1;34-25N;008-49E;34-25N;008-49E;313;314;P
+DTTG;60;765;Gabes;;Tunisia;1;33-53N;010-06E;33-53N;010-06E;4;5;
+DTTJ;60;769;Djerba Mellita;;Tunisia;1;33-52N;010-46E;33-52N;010-46E;3;4;P
+DTTK;60;735;Kairouan;;Tunisia;1;35-40N;010-06E;35-40N;010-06E;60;68;P
+DTTL;60;720;Kelibia;;Tunisia;1;36-51N;011-05E;37-04N;011-02E;29;30;P
+DTTM;60;740;Monastir-Skanes;;Tunisia;1;35-40N;010-45E;35-45N;010-45E;2;3;P
+DTTN;60;725;Jendouba;;Tunisia;1;36-29N;008-48E;36-29N;008-48E;143;144;P
+DTTR;60;780;El Borma;;Tunisia;1;31-41N;009-10E;31-41N;009-12E;258;259;P
+DTTX;60;750;Sfax El-Maou;;Tunisia;1;34-43N;010-41E;34-43N;010-41E;21;23;P
+DTTZ;60;760;Tozeur;;Tunisia;1;33-55N;008-06E;33-55N;008-10E;87;93;P
+DXAK;65;376;Atakpame;;Togo;1;07-35N;001-07E;;;400;402;P
+DXMG;65;352;Mango;;Togo;1;10-22N;000-28E;;;145;146;P
+DXNG;65;355;Niamtougou;;Togo;1;09-46N;001-06E;;;342;343;P
+DXSK;65;361;Sokode;;Togo;1;08-59N;001-09E;08-59N;001-09E;386;387;P
+DXTA;65;380;Tabligbo;;Togo;1;06-35N;001-30E;;;44;44;P
+DXXX;65;387;Lome;;Togo;1;06-10N;001-15E;06-10N;001-15E;20;25;P
+EBAW;06;450;Antwerpen / Deurne;;Belgium;6;51-12N;004-28E;;;12;14;P
+EBBE;06;458;Beauvechain;;Belgium;6;50-45N;004-46E;;;105;127;P
+EBBL;06;479;Kleine Brogel;;Belgium;6;51-10N;005-28E;51-10N;005-28E;55;64;P
+EBBR;06;451;Bruxelles National;;Belgium;6;50-54N;004-32E;50-54N;004-28E;55;58;P
+EBBT;06;452;Brasschaat;;Belgium;6;51-20N;004-30E;;;22;23;P
+EBBX;06;467;Bertrix Bel-Afb ;;Belgium;6;49-54N;005-13E;;;461;;
+EBCI;06;449;Charleroi / Gosselies;;Belgium;6;50-28N;004-27E;;;187;192;P
+EBCV;06;432;Chievres;;Belgium;6;50-34N;003-50E;;;60;63;P
+EBDT;06;465;Schaffen;;Belgium;6;51-00N;005-04E;;;30;54;
+EBFN;06;400;Koksijde;;Belgium;6;51-05N;002-39E;;;4;9;P
+EBFS;06;456;Florennes;;Belgium;6;50-14N;004-39E;;;279;299;P
+EBGT;06;431;Gent / Industrie-Zone;;Belgium;6;51-11N;003-49E;;;10;13;P
+EBLB;06;496;Elsenborn;;Belgium;6;50-28N;006-11E;50-28N;006-11E;564;570;P
+EBLG;06;478;Bierset;;Belgium;6;50-39N;005-27E;;;186;178;P
+EBMB;06;448;Melsbroek Bel-Afb ;;Belgium;6;50-54N;004-30E;;;55;;
+EBMT;06;428;Munte;;Belgium;6;50-56N;003-44E;;;55;60;P
+EBOS;06;407;Oostende Airport ;;Belgium;6;51-12N;002-52E;;;4;5;P
+EBSP;06;490;Spa / La Sauveniere;;Belgium;6;50-29N;005-55E;;;470;482;P
+EBST;06;470;Sint-Truiden;;Belgium;6;50-48N;005-12E;;;74;75;P
+EBSU;06;476;St-Hubert;;Belgium;6;50-02N;005-24E;50-02N;005-24E;563;557;P
+EBTN;06;463;Goetsenhoven;;Belgium;6;50-47N;004-57E;;;71;81;P
+EBWE;06;462;Weelde Military ;;Belgium;6;51-25N;005-00E;;;60;;
+EBZW;06;481;Genk;;Belgium;6;50-56N;005-30E;;;61;63;P
+EDAC;--;---;Altenburg Nobitz;;Germany;;50-58N;012-30E;;;195;;
+EDAH;--;---;Heringsdorf;;Germany;6;53-53N;014-09E;;;28;;
+EDBM;--;---;Magdeburg, Sachsen-Anhalt;;Germany;6;52-04-35N;011-37-25E;;;82;;
+EDDB;10;385;Berlin-Schoenefeld;;Germany;6;52-23N;013-31E;52-23N;013-31E;47;50;P
+EDDC;10;488;Dresden-Klotzsche;;Germany;6;51-08N;013-45E;;;230;232;P
+EDDE;10;554;Erfurt-Bindersleben;;Germany;6;50-59N;010-58E;;;315;322;P
+EDDF;10;637;Frankfurt / M-Flughafen;;Germany;6;50-03N;008-36E;50-03N;008-35E;111;113;P
+EDDG;10;315;Muenster / Osnabrueck;;Germany;6;52-08N;007-42E;;;48;53;P
+EDDH;10;147;Hamburg-Fuhlsbuettel;;Germany;6;53-38N;010-00E;;;16;15;P
+EDDI;10;384;Berlin-Tempelhof;;Germany;6;52-28N;013-24E;52-29N;013-25E;50;49;P
+EDDK;10;513;Koeln / Bonn;;Germany;6;50-52N;007-10E;50-52N;007-08E;91;100;P
+EDDL;10;400;Duesseldorf;;Germany;6;51-18N;006-46E;;;45;41;P
+EDDM;10;866;Munchen;;Germany;6;48-21N;011-47E;48-08N;011-43E;453;;
+EDDN;10;763;Nuernberg;;Germany;6;49-30N;011-03E;49-30N;011-05E;318;318;P
+EDDP;10;469;Leipzig-Schkeuditz;;Germany;6;51-25N;012-14E;;;144;149;P
+EDDR;10;708;Saarbruecken / Ensheim;;Germany;6;49-13N;007-07E;49-13N;007-07E;322;320;P
+EDDS;10;738;Stuttgart-Echterdingen;;Germany;6;48-41N;009-13E;48-41N;009-13E;396;391;P
+EDDT;10;382;Berlin-Tegel;;Germany;6;52-34N;013-19E;;;37;37;
+EDDV;10;338;Hannover;;Germany;6;52-28N;009-41E;52-28N;009-42E;56;59;P
+EDDW;10;224;Bremen;;Germany;6;53-03N;008-48E;;;3;5;P
+EDFH;10;616;Hahn;;Germany;6;49-57N;007-16E;;;491;498;
+EDFM;10;729;Baden Württemberg, Neuostheim;;Germany;6;49-28-21N;008-30-56E;;;100;;
+EDGS;--;---;Hessen;;Germany;6;50-42-28N;008-04-59E;;;602;;
+EDHI;10;149;Hamburg-Finkenwerder;;Germany;6;53-32N;009-50E;;;5;13;
+EDHK;--;---;Kiel / Holtenau Civilian;;Germany;;54-23N;010-10E;;;31;;
+EDHL;10;156;Luebeck-Blankensee;;Germany;6;53-49N;010-42E;;;14;15;
+EDLN;--;---;Monchengladbach;;Germany;6;51-13-49N;006-30-16E;;;38;;
+EDLP;10;426;Paderborn / Lippstadt;;Germany;6;51-37N;008-37E;;;213;;
+EDLV;--;---;Niederrhein;;Germany;6;51-36-09N;006-08-32E;;;32;;
+EDLW;10;416;Dortmund / Wickede;;Germany;6;51-31N;007-37E;;;127;;
+EDMA;10;852;Augsburg;;Germany;6;48-26N;010-56E;48-23N;010-51E;461;463;P
+EDMO;--;---;Oberpfaffenhofen;;Germany;6;48-05N;011-17E;;;600;;
+EDNY;10;935;Friedrichshafen;;Germany;6;47-40N;009-31E;;;416;424;
+EDOP;10;745;Mecklenburg-Vorpommern, Parchim;;Germany;6;53-25-37N;011-47-01E;;;52;;
+EDQD;10;677;Bayreuth;;Germany;6;49-59N;011-38E;;;488;498;
+EDQM;10;685;Hof;;Germany;6;50-19N;011-53E;;;567;568;P
+EDRZ;--;---;Zweibrucken, Rheinland-Pfalz;;Germany;6;49-12-34N;007-24-04E;;;344;;
+EDSB;10;613;Karlsruhe, Baden Württemberg;;Germany;6;48-46-43N;008-04-47E;;;124;;
+EDTD;10;912;Donaueschingen / Villingen;;Germany;6;47-58N;008-31E;;;680;;
+EDTL;--;---;Lahr, CAN-AFB;;Germany;6;48-22-09N;007-49-40E;;;156;;
+EDTZ;10;929;Konstanz;;Germany;6;47-41N;009-11E;;;443;447;P
+EDVE;10;348;Braunschweig;;Germany;6;52-18N;010-27E;;;81;88;P
+EDVK;10;436;Kassel / Calden;;Germany;6;51-24N;009-23E;;;277;283;
+EDWD;--;---;Lemwerder;;Germany;6;53-09N;008-37E;;;30;;
+EDXW;10;018;Westerland / Sylt;;Germany;6;54-55N;008-21E;;;16;20;
+EDZE;10;410;Essen;;Germany;6;51-24N;006-58E;51-24N;006-58E;152;161;
+EEKA;26;116;Kardla;;Estonia;6;58-59N;022-49E;;;5;;
+EEKE;--;---;Kuressaare;;Estonia;6;58-13-48N;022-30-34E;;;4;;
+EEPU;--;---;Parnu;;Estonia;6;58-25-09N;024-28-22E;;;14;;
+EETN;--;---;Tallinn;;Estonia;6;59-24N;024-49E;59-27N;024-48E;40;34;
+EETU;--;---;Tartu/Ulenurme;;Estonia;6;58-18N;026-44E;;;59;;
+EFET;--;---;Enontekio;;Finland;6;68-21-52N;023-25-39E;;;308;;
+EFHA;02;945;Halli;;Finland;6;61-51N;024-48E;;;143;145;
+EFHF;02;975;Helsinki-Malmi;;Finland;6;60-15N;025-03E;;;17;28;
+EFHK;02;974;Helsinki-Vantaa;;Finland;6;60-19N;024-58E;60-19N;024-58E;51;56;P
+EFHL;02;874;Hailuoto;;Finland;6;65-02N;024-48E;;;6;6;
+EFHT;02;924;Ahtari;;Finland;6;62-32N;024-13E;;;157;161;
+EFIL;--;---;Ilmajoki;;Finland;6;62-42N;022-50E;;;92;;
+EFIV;02;807;Ivalo;;Finland;6;68-37N;027-25E;;;147;148;P
+EFJO;02;929;Joensuu;;Finland;6;62-40N;029-38E;;;119;117;P
+EFJY;02;935;Jyvaskyla;;Finland;6;62-24N;025-41E;62-24N;025-40E;141;145;P
+EFKA;02;913;Kauhava;;Finland;6;63-06N;023-02E;;;42;44;
+EFKE;02;864;Kemi;;Finland;6;65-47N;024-35E;;;15;;
+EFKI;02;897;Kajaani;;Finland;6;64-17N;027-41E;;;143;136;P
+EFKK;02;903;Kruunupyy;;Finland;6;63-43N;023-09E;;;25;;
+EFKS;02;869;Kuusamo;;Finland;6;65-58N;029-11E;;;262;263;P
+EFKT;--;---;Kittila;;Finland;6;67-42N;024-51E;;;643;;
+EFKU;02;917;Kuopio;;Finland;6;63-01N;027-48E;63-01N;027-48E;98;102;P
+EFLP;02;958;Lappeenranta;;Finland;6;61-02-45N;028-08-55E;;;106;;
+EFMA;02;970;Mariehamn / Aland Island;;Finland;6;60-07N;019-54E;;;6;;
+EFMI;02;947;Mikkeli;;Finland;6;61-44N;027-18E;;;138;138;
+EFOU;02;875;Oulu;;Finland;6;64-56N;025-22E;;;12;15;P
+EFPE;02;844;Pello;;Finland;6;66-48N;024-00E;;;84;84;
+EFPO;02;952;Pori;;Finland;6;61-28N;021-48E;;;13;17;P
+EFPU;02;867;Pudasjarvi;;Finland;6;65-22N;027-01E;;;114;117;
+EFRO;02;845;Rovaniemi;;Finland;6;66-34N;025-50E;;;197;201;
+EFSA;02;948;Savonlinna;;Finland;6;61-57N;028-57E;;;95;95;
+EFSI;--;---;Seinajoki-Ilmajok;;Finland;6;62-41-37N;022-49-55E;;;91;;
+EFSO;02;836;Sodankyla;;Finland;6;67-22N;026-39E;67-22N;026-39E;179;179;P
+EFSU;02;879;Suomussalmi;;Finland;6;64-54N;029-01E;;;223;224;
+EFTP;02;944;Tampere / Pirkkala;;Finland;6;61-25N;023-35E;;;112;112;P
+EFTU;02;972;Turku;;Finland;6;60-31N;022-16E;60-31N;022-16E;49;59;P
+EFUT;02;966;Utti;;Finland;6;60-54N;026-56E;;;100;100;
+EFVA;02;911;Vaasa;;Finland;6;63-03N;021-46E;;;4;;
+EFVI;02;915;Viitasaari;;Finland;6;63-05N;025-52E;;;132;132;
+EFVR;--;---;Varkaus;;Finland;6;62-10N;027-52E;;;87;;
+EGAA;03;917;Belfast / Aldergrove Airport;;United Kingdom;6;54-39N;006-13W;;;81;0;P
+EGAC;03;924;Belfast / Harbour;;United Kingdom;6;54-36N;005-53W;;;5;0;
+EGAE;--;---;Eglinton / Londonderr;;United Kingdom;6;55-03N;007-09W;;;9;;
+EGBB;03;534;Birmingham / Airport;;United Kingdom;6;52-27N;001-44W;;;99;0;P
+EGBE;--;---;Coventry Airport ;;United Kingdom;6;52-22N;001-29W;;;82;;
+EGBJ;--;---;Staverton Private ;;United Kingdom;6;51-54N;002-10W;;;29;;
+EGCC;03;334;Manchester Airport;;United Kingdom;6;53-21N;002-17W;;;69;0;P
+EGDB;03;827;Plymouth;;United Kingdom;6;50-21N;004-07W;;;50;0;P
+EGDC;03;707;Chivenor;;United Kingdom;6;51-05N;004-09W;;;8;0;
+EGDG;03;817;Saint Mawgan;;United Kingdom;6;50-26N;005-00W;;;119;0;P
+EGDK;--;---;Kemble Royal Air Force Base ;;United Kingdom;6;51-40N;002-03W;;;133;;
+EGDL;03;740;Lyneham;;United Kingdom;6;51-30N;001-59W;;;145;0;P
+EGDM;03;746;Boscombe Down;;United Kingdom;6;51-10N;001-45W;;;124;0;P
+EGDP;03;858;Portland / Rnas;;United Kingdom;6;50-34N;002-27W;;;3;0;
+EGDR;03;809;Culdrose;;United Kingdom;6;50-05N;005-15W;;;78;0;P
+EGDX;--;---;St Athan Royal Air Force Base;;United Kingdom;6;51-24N;003-26W;;;50;;
+EGDY;03;853;Yeovilton;;United Kingdom;6;51-00N;002-38W;;;23;0;P
+EGEC;--;---;Campbeltown;;United Kingdom;6;55-26-14N;005-41-11W;;;13;;
+EGFF;03;715;Cardiff-Wales Airport;;United Kingdom;6;51-24N;003-21W;51-24N;003-21W;67;0;P
+EGFH;--;---;Swansea;;United Kingdom;6;51-36N;004-04W;;;90;;
+EGGD;--;---;Bristol / Lulsgate ;;United Kingdom;6;51-23N;002-43W;;;189;;
+EGGP;--;---;Liverpool Airport ;;United Kingdom;6;53-20N;002-51W;;;26;;
+EGGW;--;---;Luton Airport ;;United Kingdom;6;51-52N;000-22W;;;160;;
+EGHD;--;---;Plymouth / Roborough;;United Kingdom;6;50-25N;004-07W;;;25;;
+EGHE;03;803;Scilly, Saint Mary'S;;United Kingdom;6;49-55N;006-18W;;;31;0;
+EGHH;03;862;Bournemouth Airport;;United Kingdom;6;50-47N;001-50W;;;11;0;P
+EGHI;03;865;Southampton / Weather Centre;;United Kingdom;6;50-54N;001-24W;;;9;0;
+EGJA;--;---;Alderney / Channel Island;;United Kingdom;6;49-43N;002-12W;;;71;;
+EGJB;03;894;Guernsey Airport;;United Kingdom;6;49-26N;002-36W;;;102;0;P
+EGJJ;03;895;Jersey Airport;;United Kingdom;6;49-13N;002-12W;;;84;0;P
+EGKA;03;876;Shoreham Airport;;United Kingdom;6;50-50N;000-17W;;;2;0;
+EGKB;--;---;Biggin Hill ;;United Kingdom;6;51-19N;000-02E;;;183;;
+EGKK;03;776;London / Gatwick Airport;;United Kingdom;6;51-09N;000-11W;;;62;0;P
+EGLC;--;---;London City Airport;;United Kingdom;6;51-30N;000-30W;;;5;;
+EGLF;03;768;Farnborough;;United Kingdom;6;51-17N;000-46W;;;65;0;
+EGLL;03;772;London / Heathrow Airport;;United Kingdom;6;51-29N;000-27W;;;24;0;P
+EGMC;--;---;Southend-On-Sea ;;United Kingdom;6;51-34N;000-42E;;;15;;
+EGMD;--;---;Lydd Airport ;;United Kingdom;6;50-57N;000-56E;;;3;;
+EGMH;--;---;Manston, South East;;United Kingdom;6;51-20-31N;001-20-46E;;;55;;
+EGNC;03;222;Carlisle;;United Kingdom;6;54-56N;002-57W;;;26;;
+EGNH;03;318;Blackpool Airport;;United Kingdom;6;53-46N;003-02W;;;10;0;P
+EGNJ;--;---;Humberside;;United Kingdom;6;53-35N;000-21W;;;31;;
+EGNL;03;214;Walney Island;;United Kingdom;6;54-07N;003-15W;;;15;0;
+EGNM;--;---;Leeds And Bradford;;United Kingdom;6;53-52N;001-39W;;;208;;
+EGNR;03;321;Hawarden;;United Kingdom;6;53-10N;002-59W;;;10;0;
+EGNS;03;204;Isle Of Man / Ronaldsway Airport;;United Kingdom;6;54-05N;004-38W;;;17;0;P
+EGNT;--;---;Newcastle ;;United Kingdom;6;55-02N;001-42W;;;81;;
+EGNV;--;---;Tees-Side;;United Kingdom;6;54-31N;001-25W;;;37;;
+EGNX;--;---;East Midlands;;United Kingdom;6;52-50N;001-20W;;;94;;
+EGOD;--;---;Llanbedr;;United Kingdom;6;52-49N;004-08W;;;9;;
+EGOM;03;165;Spadeadam;;United Kingdom;6;55-03N;002-33W;;;325;;
+EGOP;03;605;Pembrey Sands;;United Kingdom;6;51-43N;004-22W;;;3;;
+EGOS;03;414;Shawbury;;United Kingdom;6;52-48N;002-40W;;;76;0;P
+EGOV;03;302;Valley;;United Kingdom;6;53-15N;004-32W;;;1;0;P
+EGOW;--;---;Woodvale;;United Kingdom;6;53-34-54N;003-03-20W;;;11;;
+EGOY;03;132;West Freugh;;United Kingdom;6;54-51N;004-57W;;;11;0;
+EGPA;03;017;Kirkwall Airport;;United Kingdom;6;58-57N;002-54W;;;21;0;P
+EGPB;03;003;Sumburgh Cape ;;United Kingdom;6;59-53N;001-18W;;;5;;
+EGPC;03;075;Wick;;United Kingdom;6;58-27N;003-05W;;;39;0;P
+EGPD;03;091;Aberdeen / Dyce;;United Kingdom;6;57-12N;002-13W;57-12N;002-13W;65;0;P
+EGPE;03;059;Inverness / Dalcross;;United Kingdom;6;57-32N;004-03W;;;9;0;
+EGPF;03;140;Glasgow Airport;;United Kingdom;6;55-52N;004-26W;;;8;0;P
+EGPH;03;160;Edinburgh Airport;;United Kingdom;6;55-57N;003-21W;;;41;0;P
+EGPI;--;---;Islay;;United Kingdom;6;55-40-55N;006-15-24W;;;16;;
+EGPK;03;135;Prestwick Airport;;United Kingdom;6;55-30N;004-35W;;;20;0;P
+EGPL;03;022;Benbecula;;United Kingdom;6;57-28N;007-22W;;;6;0;P
+EGPM;--;---;Scatsa / Shetland Island;;United Kingdom;6;60-26N;001-18W;;;22;;
+EGPN;--;---;Dundee / Riverside;;United Kingdom;6;56-27N;003-01W;;;4;;
+EGPO;03;026;Stornoway;;United Kingdom;6;58-13N;006-19W;58-13N;006-19W;9;13;P
+EGPT;--;---;Perth / Scone ;;United Kingdom;6;56-27N;003-22W;;;121;;
+EGPU;03;100;Tiree;;United Kingdom;6;56-30N;006-53W;;;12;0;P
+EGPW;--;---;Unst Island;;United Kingdom;6;60-44N;000-49W;;;285;;
+EGQA;03;062;Tain Range;;United Kingdom;6;57-49N;003-58W;;;4;0;
+EGQJ;03;111;Machrihanish;;United Kingdom;6;55-26N;005-42W;;;13;0;
+EGQK;03;066;Kinloss;;United Kingdom;6;57-39N;003-34W;57-39N;003-34W;7;0;P
+EGQL;03;171;Leuchars;;United Kingdom;6;56-23N;002-52W;;;12;0;P
+EGQM;03;240;Boulmer;;United Kingdom;6;55-25N;001-36W;55-25N;001-36W;23;0;P
+EGQS;03;068;Lossiemouth;;United Kingdom;6;57-43N;003-19W;;;13;;P
+EGRB;03;779;London Weather Centre;;United Kingdom;6;51-31N;000-07W;;;5;0;
+EGRR;03;763;Bracknell / Beaufort Park;;United Kingdom;6;51-23N;000-47W;;;74;0;
+EGSC;--;---;Cambridge;;United Kingdom;6;52-12N;000-11E;;;15;;
+EGSH;03;492;Norwich Weather Centre;;United Kingdom;6;52-38N;001-18E;;;14;0;
+EGSS;03;683;Stansted Airport;;United Kingdom;6;51-53N;000-14E;;;106;0;P
+EGSY;--;---;Yorkshire and Humberside, Sheffield City;;United Kingdom;6;53-23-39N;001-23-18W;;;70;;
+EGTC;--;---;Cranfield;;United Kingdom;6;52-04N;000-37W;;;111;;
+EGTE;03;839;Exeter Airport;;United Kingdom;6;50-44N;003-25W;;;30;;
+EGTG;--;---;Filton Private ;;United Kingdom;6;51-31N;002-35W;;;69;;
+EGTH;--;---;Hatfeild Private ;;United Kingdom;6;51-46N;000-15W;;;77;;
+EGUA;--;---;Upper Heyford Royal Air Force Base ;;United Kingdom;6;51-56N;001-15W;;;134;;
+EGUB;03;658;Benson;;United Kingdom;6;51-37N;001-05W;;;63;0;P
+EGUC;03;502;Aberporth;;United Kingdom;6;52-08N;004-34W;52-08N;004-34W;133;134;P
+EGUF;03;766;Farnborough Military ;;United Kingdom;6;51-17N;000-46W;;;72;;
+EGUL;03;583;Lakenheath Royal Air Force Base;;United Kingdom;6;52-25N;000-34E;;;10;;
+EGUM;03;797;Manston;;United Kingdom;6;51-21N;001-21E;;;55;0;P
+EGUN;03;577;Mildenhall Royal Air Force Base;;United Kingdom;6;52-22N;000-29E;;;10;;
+EGUO;--;---;Colerne;;United Kingdom;6;51-26-21N;002-17-11W;;;181;;
+EGUP;--;---;Sculthorpe Af Met ;;United Kingdom;6;52-51N;000-46E;;;65;;
+EGUW;03;590;Wattisham;;United Kingdom;6;52-07N;000-58E;;;87;0;P
+EGUY;03;566;Wyton Royal Air Force Base;;United Kingdom;6;52-21N;000-07W;;;41;;
+EGVA;03;644;Fairford Royal Air Force Base;;United Kingdom;6;51-41N;001-47W;;;87;;
+EGVG;--;---;Woodbridge Royal Air Force Base ;;United Kingdom;6;52-05N;001-24E;;;29;;
+EGVI;--;---;Greenham Common Royal Air Force Base;;United Kingdom;6;51-23N;001-17W;;;122;;
+EGVJ;--;---;Bentwaters Royal Air Force Base ;;United Kingdom;6;52-08N;001-26E;;;26;;
+EGVN;03;649;Brize Norton;;United Kingdom;6;51-45N;001-35W;51-45N;001-35W;88;0;P
+EGVO;03;761;Odiham;;United Kingdom;6;51-14N;000-57W;;;123;0;
+EGVP;03;749;Middle Wallop;;United Kingdom;6;51-09N;001-34W;;;91;0;
+EGWC;--;---;Cosford Royal Air Force Base;;United Kingdom;6;52-38N;002-18W;;;83;;
+EGWU;03;672;Northolt;;United Kingdom;6;51-33N;000-25W;;;38;0;
+EGWZ;03;562;Alconbury Royal Air Force Base;;United Kingdom;6;52-22N;000-13W;;;49;;
+EGXC;03;391;Coningsby Royal Air Force Base;;United Kingdom;6;53-05N;000-10W;;;7;;
+EGXD;03;261;Disforth;;United Kingdom;6;54-08N;001-25W;;;36;0;
+EGXE;03;257;Leeming;;United Kingdom;6;54-18N;001-32W;54-18N;001-32W;40;40;
+EGXF;--;---;Cowden;;United Kingdom;6;53-51N;006-06W;;;15;;
+EGXG;03;355;Church Fenton;;United Kingdom;6;53-50N;001-12W;;;9;0;
+EGXH;03;586;Honington Royal Air Force Base;;United Kingdom;6;52-20N;000-46E;52-20N;000-46E;54;54;
+EGXJ;03;453;Cottesmore;;United Kingdom;6;52-44N;000-39W;;;138;;
+EGXN;--;---;Newton;;United Kingdom;6;52-58N;000-59W;;;55;;
+EGXP;--;---;Scampton;;United Kingdom;6;53-18-27N;000-33-03W;;;62;;
+EGXT;03;462;Wittering;;United Kingdom;6;52-37N;000-28W;;;84;0;
+EGXU;03;266;Linton-On-Ouse;;United Kingdom;6;54-03N;001-15W;;;16;0;
+EGXV;03;384;Leconfield;;United Kingdom;6;53-52N;000-26W;;;6;0;
+EGXW;03;377;Waddington;;United Kingdom;6;53-10N;000-31W;53-10N;000-31W;68;0;P
+EGXZ;--;---;Topcliffe Royal Air Force Base ;;United Kingdom;6;54-12N;001-23W;;;28;;
+EGYC;03;495;Coltishall;;United Kingdom;6;52-26N;001-21E;;;20;0;P
+EGYD;03;379;Cranwell;;United Kingdom;6;53-02N;000-30W;;;67;0;
+EGYE;--;---;Barkston Heath Royal Air Force Base ;;United Kingdom;6;52-58N;000-34W;;;112;;
+EGYH;03;469;Holbeach;;United Kingdom;6;52-52N;000-09E;;;3;0;
+EGYM;03;482;Marham;;United Kingdom;6;52-39N;000-34E;;;23;0;P
+EGYP;88;889;Mount Pleasant Airport;;South Georgia and the Islands;3;51-49S;058-27W;51-49S;058-27W;74;73;
+EGYW;03;392;Wainfleet;;United Kingdom;6;53-05N;000-16E;;;3;0;
+EHAM;06;240;Amsterdam Airport Schiphol;;Netherlands;6;52-18N;004-46E;;;-4;-2;P
+EHBK;06;380;Maastricht Airport Zuid Limburg;;Netherlands;6;50-55N;005-47E;;;114;116;
+EHDB;06;260;De Bilt;;Netherlands;6;52-06N;005-11E;52-06N;005-11E;2;15;P
+EHDL;06;275;Deelen;;Netherlands;6;52-04N;005-53E;;;48;52;
+EHEH;06;370;Eindhoven;;Netherlands;6;51-27N;005-25E;;;23;28;
+EHGG;06;280;Groningen Airport Eelde;;Netherlands;6;53-08N;006-35E;;;4;4;
+EHGR;06;350;Gilze-Rijen;;Netherlands;6;51-34N;004-56E;;;15;24;
+EHKD;06;235;De Kooy;;Netherlands;6;52-55N;004-47E;;;0;14;P
+EHLE;06;269;Lelystad;;Netherlands;6;52-27N;005-31E;;;0;;
+EHLW;06;270;Leeuwarden;;Netherlands;6;53-13N;005-46E;;;1;11;P
+EHRD;06;344;Rotterdam Airport Zestienhoven;;Netherlands;6;51-57N;004-27E;;;-5;-4;
+EHSB;06;265;Soesterberg;;Netherlands;6;52-08N;005-17E;;;20;25;
+EHTW;06;290;Twenthe;;Netherlands;6;52-16N;006-54E;52-16N;006-54E;35;57;P
+EHVB;06;210;Valkenburg;;Netherlands;6;52-11N;004-25E;52-11N;004-25E;0;2;
+EHVK;06;375;Volkel;;Netherlands;6;51-39N;005-42E;;;22;21;P
+EHVL;06;242;Vlieland;;Netherlands;6;53-15N;004-55E;53-15N;004-55E;11;12;
+EHWO;06;340;Woensdrecht;;Netherlands;6;51-27N;004-20E;51-27N;004-20E;20;17;
+EICK;03;955;Cork Airport;;Ireland;6;51-51N;008-29W;;;153;162;P
+EIDW;03;969;Dublin Airport;;Ireland;6;53-26N;006-15W;;;68;85;P
+EIKN;--;---;Connaught;;Ireland;6;53-54-37N;008-49-05W;;;203;;
+EIME;03;967;Casement Aerodrome;;Ireland;6;53-18N;006-26W;;;97;93;P
+EINN;03;962;Shannon Airport;;Ireland;6;52-42N;008-55W;;;14;20;P
+EKAH;06;070;Tirstrup;;Denmark;6;56-18N;010-37E;;;23;25;P
+EKAT;06;078;Anholt Island Automated Reporting Station ;;Denmark;6;56-42N;011-33E;;;8;;
+EKAV;06;150;Avno Danish Air Force Base ;;Denmark;6;55-05N;011-47E;;;4;;
+EKBI;06;104;Billund Lufthavn;;Denmark;6;55-44N;009-10E;;;75;79;P
+EKCH;06;180;Koebenhavn / Kastrup;;Denmark;6;55-37N;012-39E;55-38N;012-40E;5;5;P
+EKEB;06;080;Esbjerg;;Denmark;6;55-32N;008-34E;;;30;29;
+EKHO;06;054;Lindtorp Airport;;Denmark;6;56-24N;008-27E;;;15;;
+EKHS;06;048;Hadsund;;Denmark;6;56-43N;010-07E;;;2;2;
+EKKA;06;060;Karup;;Denmark;6;56-18N;009-07E;;;52;53;P
+EKMB;06;143;Maribo Lufthavn;;Denmark;6;54-42N;011-27E;;;5;5;
+EKOD;06;120;Odense / Beldringe;;Denmark;6;55-29N;010-20E;;;17;17;P
+EKRK;06;170;Koebenhavn / Roskilde;;Denmark;6;55-35N;012-08E;;;44;44;
+EKRN;06;190;Roenne;;Denmark;6;55-04N;014-45E;;;16;16;
+EKSB;06;118;Soenderborg Lufthavn;;Denmark;6;54-58N;009-47E;;;7;14;
+EKSN;06;034;Sindal Flyveplads;;Denmark;6;57-30N;010-13E;;;28;28;
+EKSP;06;110;Skrydstrup;;Denmark;6;55-14N;009-16E;;;43;47;P
+EKST;06;124;Sydfyns Flyveplads;;Denmark;6;55-01N;010-34E;;;6;;
+EKSV;06;062;Skive Lufthavn;;Denmark;6;56-33N;009-10E;;;23;21;
+EKTS;06;024;Thisted Lufthavn;;Denmark;6;57-04N;008-43E;;;7;7;
+EKVA;06;100;Vandel;;Denmark;6;55-42N;009-12E;;;73;76;
+EKVD;06;108;Vamdrup;;Denmark;6;55-26N;009-20E;;;44;45;
+EKVG;06;010;Soervaag / Vagar;;Denmark;6;62-04N;007-17W;;;85;92;
+EKVJ;06;066;Stauning Lufthavn;;Denmark;6;56-00N;008-21E;;;5;5;
+EKVL;06;160;Vaerloese;;Denmark;6;55-46N;012-20E;;;18;31;
+EKYT;06;030;Aalborg;;Denmark;6;57-06N;009-51E;57-06N;009-52E;3;13;P
+ELLX;06;590;Luxembourg / Luxembourg;;Luxembourg;6;49-37N;006-13E;49-37N;006-13E;376;379;P
+ENAL;01;210;Alesund / Vigra;;Norway;6;62-34N;006-07E;;;2;22;
+ENAN;01;010;Andoya;;Norway;6;69-18N;016-09E;69-18N;016-09E;1;14;P
+ENAS;01;004;Ny-Alesund Ii;;Norway;6;78-55N;011-56E;78-55N;011-56E;8;8;
+ENAT;01;049;Alta Lufthavn;;Norway;6;69-59N;023-22E;;;0;3;P
+ENBJ;01;028;Bjornoya;;Norway;6;74-31N;019-01E;74-31N;019-01E;16;16;P
+ENBL;--;---;Forde / Bringeland;;Norway;6;61-27N;005-52E;;;150;;
+ENBM;01;336;Voss-Bo;;Norway;6;60-39N;006-30E;;;125;122;
+ENBN;01;112;Bronnoysund / Bronnoy;;Norway;6;65-28N;012-13E;;;0;9;
+ENBO;01;152;Bodo Vi;;Norway;6;67-16N;014-22E;67-15N;014-24E;1;13;P
+ENBR;01;311;Bergen / Flesland;;Norway;6;60-17N;005-14E;;;5;50;P
+ENBS;--;---;Batsfjord;;Norway;6;70-38N;029-44E;;;10;;
+ENBV;01;083;Berlevag;;Norway;6;70-52N;029-02E;;;1;13;
+ENCN;01;452;Kristiansand / Kjevik;;Norway;6;58-12N;008-05E;;;1;17;P
+ENDI;--;---;Dagali;;Norway;6;60-25N;008-31E;;;798;;
+ENDR;--;---;Draugen;;Norway;6;64-21-20N;007-47-30E;;;0;;
+ENDU;01;023;Bardufoss;;Norway;6;69-04N;018-32E;;;7;79;P
+ENEK;--;---;Ekofisk Oil Platform;;Norway;6;56-33N;003-15E;;;3;;
+ENEV;01;183;Evenes;;Norway;6;68-31N;016-41E;;;26;26;
+ENFB;01;488;Oslo / Fornebu;;Norway;6;59-54N;010-38E;;;1;17;P
+ENFG;01;368;Fagernes Leirin;;Norway;6;61-00N;009-18E;;;822;;
+ENFL;01;310;Floro;;Norway;6;61-35N;005-02E;;;0;9;
+ENFR;--;---;Frigg;;Norway;6;59-56N;002-00E;;;;;
+ENGC;--;---;Gullfax Platform ;;Norway;6;61-02N;002-02E;;;10;;
+ENGM;01;384;Oslo / Gardermoen;;Norway;6;60-12N;011-05E;60-12N;011-06E;20;204;P
+ENHD;01;408;Haugesund / Karmoy;;Norway;6;59-21N;005-13E;;;2;24;
+ENHE;--;---;Heidrun;;Norway;6;65-19-30N;002-19-36E;;;0;;
+ENHF;01;052;Hammerfest;;Norway;6;70-40N;023-40E;;;8;81;
+ENHK;--;---;Hasvik;;Norway;6;70-29N;022-09E;;;10;;
+ENHO;01;062;Hopen;;Norway;6;76-30N;025-04E;;;6;10;P
+ENHV;01;068;Honningsvag / Valan;;Norway;6;71-01N;025-59E;;;1;14;
+ENJA;01;001;Jan Mayen;;Norway;6;70-56N;008-40W;70-56N;008-40W;10;9;P
+ENKA;01;047;Kautokeino;;Norway;6;69-00N;023-02E;;;305;308;
+ENKB;01;223;Kristiansund / Kvernberget;;Norway;6;63-07N;007-50E;;;6;62;
+ENKR;01;089;Kirkenes Lufthavn;;Norway;6;69-44N;029-54E;;;9;91;P
+ENLI;01;428;Lista Flyplass;;Norway;6;58-06N;006-38E;;;1;10;
+ENLK;01;141;Leknes;;Norway;6;68-09N;013-37E;;;2;26;
+ENMH;01;074;Mehamn;;Norway;6;71-02N;027-50E;;;1;13;
+ENML;01;217;Molde / Aro;;Norway;6;62-45N;007-16E;;;0;3;
+ENMS;01;122;Mosjoen Kjaerstad;;Norway;6;65-48N;013-08E;;;70;;
+ENNA;01;059;Banak;;Norway;6;70-04N;024-59E;;;0;8;P
+ENNK;01;194;Narvik Iii;;Norway;6;68-28N;017-30E;;;17;23;
+ENNM;01;290;Namsos Lufthavn;;Norway;6;64-28N;011-35E;;;0;2;
+ENNO;--;---;Notodden;;Norway;6;59-34N;009-13E;;;19;;
+ENOA;--;---;Oseberg ;;Norway;6;59-19N;010-27E;;;15;;
+ENOL;01;241;Orland Iii;;Norway;6;63-42N;009-36E;63-42N;009-36E;0;7;P
+ENOV;01;209;Orsta-Volda / Hovden;;Norway;6;62-11N;006-04E;;;7;74;
+ENRA;01;151;Mo I Rana / Rossvoll;;Norway;6;66-22N;014-18E;;;7;70;
+ENRM;01;282;Rorvik / Ryum;;Norway;6;64-50N;011-09E;;;4;;
+ENRO;01;289;Roros Lufthavn;;Norway;6;62-35N;011-21E;;;62;626;
+ENRS;01;107;Rost Flyplass;;Norway;6;67-31N;012-06E;;;4;;
+ENRY;01;494;Rygge;;Norway;6;59-23N;010-47E;;;5;53;P
+ENSB;01;008;Svalbard Lufthavn;;Norway;6;78-15N;015-28E;;;2;29;P
+ENSD;01;320;Sandane / Anda;;Norway;6;61-50N;006-07E;;;6;60;
+ENSG;01;347;Sogndal / Haukasen;;Norway;6;61-09N;007-08E;;;49;497;
+ENSH;01;161;Svolvaer / Helle;;Norway;6;68-15N;014-40E;;;0;9;
+ENSK;01;162;Storkmarknes / Skagen;;Norway;6;68-35N;015-01E;;;0;3;
+ENSN;01;475;Skien-Geiteryggen;;Norway;6;59-11N;009-34E;;;1;14;
+ENSO;--;---;Stord / Soerstokken;;Norway;6;59-48N;005-21E;;;49;;
+ENSR;01;046;Sorkjosen;;Norway;6;69-47N;020-58E;;;0;6;
+ENSS;01;097;Svartnes;;Norway;6;70-21N;031-03E;;;12;;
+ENST;01;116;Sandnessjoen / Stokka;;Norway;6;65-58N;012-28E;;;1;17;
+ENTC;01;025;Tromso / Langnes;;Norway;6;69-41N;018-55E;;;1;10;P
+ENTO;01;483;Torp;;Norway;6;59-12N;010-16E;;;8;88;
+ENVA;01;271;Trondheim / Vaernes;;Norway;6;63-28N;010-56E;;;1;17;P
+ENVD;01;088;Vadso;;Norway;6;70-04N;029-51E;;;3;39;
+ENZV;01;415;Stavanger / Sola;;Norway;6;58-53N;005-38E;58-52N;005-40E;0;9;P
+EPGD;12;150;Gdansk-Rebiechowo;;Poland;6;54-23N;018-28E;54-23N;018-28E;135;138;P
+EPKK;12;566;Krakow;;Poland;6;50-05N;019-48E;50-05N;019-48E;237;237;P
+EPKO;12;105;Koszalin;;Poland;6;54-12N;016-09E;54-12N;016-11E;32;34;
+EPKT;12;560;Katowice;;Poland;6;50-14N;019-02E;;;284;284;P
+EPPO;12;330;Poznan;;Poland;6;52-25N;016-50E;52-25N;016-50E;86;92;P
+EPRZ;12;580;Rzeszow-Jasionka;;Poland;6;50-06N;022-03E;50-06N;022-03E;200;202;P
+EPSC;12;205;Szczecin;;Poland;6;53-24N;014-37E;53-24N;014-37E;1;3;P
+EPSK;--;---;Slupsk ;;Poland;6;54-28N;017-01E;;;25;;
+EPWA;12;375;Warszawa-Okecie;;Poland;6;52-10N;020-58E;52-11N;020-59E;106;107;P
+EPWR;12;424;Wroclaw Ii;;Poland;6;51-06N;016-53E;;;120;121;P
+EPZG;12;400;Zielona Gora;;Poland;6;51-56N;015-32E;;;192;192;P
+ESCF;02;562;Linkoping / Malmen;;Sweden;6;58-24N;015-31E;;;93;117;P
+ESCL;02;376;Soderhamn;;Sweden;6;61-16N;017-06E;;;26;36;P
+ESCM;02;458;Uppsala;;Sweden;6;59-53N;017-36E;;;21;41;P
+ESDA;02;630;Ljungbyhed, Ljungbyhed, SWE-AFB;;Sweden;6;56-05-07N;013-12-26E;;;52;52;P
+ESDB;02;607;Angelholm;;Sweden;6;56-18N;012-51E;;;20;47;P
+ESDF;02;664;Ronneby;;Sweden;6;56-16N;015-17E;;;58;74;P
+ESGG;02;526;Goteborg / Landvetter;;Sweden;6;57-40N;012-18E;;;169;;
+ESGJ;02;550;Jonkoping Flygplats;;Sweden;6;57-46N;014-05E;;;226;232;P
+ESGP;02;512;Goteborg / Save;;Sweden;6;57-47N;011-53E;;;20;53;P
+ESGR;02;535;Skovde Flygplats;;Sweden;6;58-27N;013-58E;;;98;105;
+ESGT;--;---;Trollhattan Private ;;Sweden;6;58-19N;012-21E;;;41;;
+ESIB;02;520;Satenas;;Sweden;6;58-26N;012-42E;;;54;74;P
+ESKM;--;---;Siljan / Mora;;Sweden;6;60-58N;014-31E;;;193;;
+ESKN;--;---;Stockholm/Skavsta;;Sweden;6;58-47N;016-55E;;;43;;
+ESMK;02;651;Kristianstad / Everod;;Sweden;6;55-55N;014-05E;;;23;;
+ESMQ;02;672;Kalmar;;Sweden;6;56-44N;016-18E;;;16;;
+ESMS;02;636;Malmo / Sturup;;Sweden;6;55-33N;013-22E;;;106;;
+ESMT;02;604;Halmstad Swedish Air Force Base ;;Sweden;6;56-41N;012-50E;;;30;;
+ESMV;02;556;Hagshult;;Sweden;6;57-18N;014-08E;;;169;172;P
+ESMX;02;641;Vaxjo;;Sweden;6;56-51N;014-50E;;;199;200;
+ESNG;02;049;Gallivare;;Sweden;6;67-09N;020-39E;;;359;360;
+ESNJ;02;142;Jokkmokk;;Sweden;6;66-38N;019-39E;;;263;264;P
+ESNK;02;259;Kramfors Flygplats;;Sweden;6;63-03N;017-46E;;;10;19;P
+ESNL;--;---;Lycksele;;Sweden;6;64-32-51N;018-43-03E;;;211;;
+ESNN;02;366;Sundsvall-Harnosand Flygplats;;Sweden;6;62-32N;017-27E;62-32N;017-27E;4;10;P
+ESNO;02;267;Ornskoldsvik Airport;;Sweden;6;63-24N;018-58E;;;103;;
+ESNQ;02;044;Kiruna Airport;;Sweden;6;67-49N;020-20E;;;452;;
+ESNS;02;293;Skelleftea Airport;;Sweden;6;64-38N;021-05E;;;49;;
+ESNU;02;286;Umea Flygplats;;Sweden;6;63-48N;020-17E;;;7;14;P
+ESNY;--;---;Soderhamn;;Sweden;6;61-15-41N;017-05-57E;;;27;;
+ESOE;--;---;Orebro Private ;;Sweden;6;59-14N;015-03E;;;57;;
+ESOK;--;---;Karlstad ;;Sweden;6;59-26-41N;013-20-15E;;;107;;
+ESOW;02;446;Vasteras / Hasslo;;Sweden;6;59-35N;016-38E;;;6;31;P
+ESPA;02;186;Lulea / Kallax;;Sweden;6;65-33N;022-08E;65-33N;022-08E;17;34;P
+ESPC;02;226;Ostersund / Froson;;Sweden;6;63-11N;014-30E;63-11N;014-30E;376;370;P
+ESPD;02;128;Gunnarn;;Sweden;6;64-58N;017-42E;;;280;283;P
+ESPE;02;154;Vidsel;;Sweden;6;65-52N;020-08E;;;180;182;
+ESSA;02;460;Stockholm / Arlanda;;Sweden;6;59-39N;017-57E;;;38;61;P
+ESSB;02;464;Stockholm / Bromma;;Sweden;6;59-21N;017-57E;59-21N;017-57E;14;14;
+ESSD;02;435;Borlange;;Sweden;6;60-26N;015-31E;;;145;0;
+ESSF;02;565;Hultsfred Swedish Air Force Base ;;Sweden;6;57-31N;015-50E;;;112;;
+ESSK;02;443;Gavle / Sandviken Air Force Base;;Sweden;6;60-36N;016-57E;;;79;;
+ESSL;--;---;Linkoping / Saab;;Sweden;6;58-24N;015-41E;;;52;;
+ESSP;02;571;Norrkoping;;Sweden;6;58-35N;016-09E;;;34;0;
+ESSQ;02;418;Karlstad Flygplats;;Sweden;6;59-22N;013-28E;;;46;55;P
+ESSV;02;590;Visby Flygplats;;Sweden;6;57-40N;018-21E;;;51;47;P
+ESTL;--;---;Ljungbyhed;;Sweden;6;56-04N;013-12E;;;43;;
+ETAD;10;607;Spangdahlem;;Germany;6;49-59N;006-42E;;;365;356;
+ETAR;10;614;Ramstein;;Germany;6;49-26N;007-36E;;;238;237;
+ETAS;10;712;Sembach United States Air Force Operated Base In Foreign Country ;;Germany;6;49-30N;007-52E;;;321;;
+ETBA;10;503;Aachen / Merzbruck;;Germany;6;50-49N;006-11E;50-49N;006-11E;191;190;
+ETCE;--;---;Mebstetten / Albstadt;;Germany;6;50-07N;009-07E;;;475;;
+ETEB;10;755;Ansbach / Katterbach;;Germany;6;49-19N;010-38E;49-19N;010-38E;467;476;
+ETEH;10;627;Bad Kreuznach;;Germany;6;49-51N;007-53E;;;103;105;
+ETEU;10;653;Giebelstadt;;Germany;6;49-39N;009-58E;49-39N;009-58E;298;298;
+ETGB;10;238;Bergen;;Germany;6;52-49N;009-56E;52-49N;009-56E;70;69;
+ETGG;10;033;Gluecksburg / Meierwik;;Germany;6;54-50N;009-30E;;;27;33;
+ETGI;10;618;Idar-Oberstein;;Germany;6;49-42N;007-20E;49-42N;007-20E;376;377;
+ETGK;10;771;Kuemmersruck;;Germany;6;49-26N;011-54E;49-26N;011-54E;419;418;
+ETGW;10;272;Wittstock;;Germany;6;53-12N;012-31E;53-12N;012-31E;72;74;
+ETGY;10;404;Kalkar;;Germany;6;51-44N;006-16E;;;31;43;
+ETGZ;10;827;Messstetten;;Germany;6;48-11N;009-00E;;;920;930;
+ETHA;10;954;Altenstadt;;Germany;6;47-50N;010-52E;47-50N;010-52E;739;757;
+ETHB;10;335;Bueckeburg;;Germany;6;52-17N;009-05E;;;70;78;
+ETHC;10;343;Celle;;Germany;6;52-36N;010-01E;;;39;52;
+ETHE;10;306;Rheine-Bentlage;;Germany;6;52-18N;007-23E;;;40;49;
+ETHF;10;439;Fritzlar;;Germany;6;51-07N;009-17E;;;172;181;
+ETHI;10;142;Itzehoe;;Germany;6;54-00N;009-35E;;;25;26;
+ETHL;10;837;Laupheim;;Germany;6;48-13N;009-55E;;;538;550;
+ETHM;10;514;Mendig;;Germany;6;50-22N;007-19E;;;182;190;
+ETHN;10;743;Niederstetten;;Germany;6;49-24N;009-58E;;;468;473;
+ETHR;10;765;Roth;;Germany;6;49-13N;011-06E;49-13N;011-06E;388;395;
+ETHS;10;246;Fassberg;;Germany;6;52-55N;010-11E;;;75;88;
+ETHT;10;492;Cottbus Flugplatz ;;Germany;6;51-46N;014-18E;;;67;68;
+ETIC;10;687;Grafenwoehr;;Germany;6;49-42N;011-57E;49-06N;011-08E;415;415;
+ETID;10;642;Hanau;;Germany;6;50-10N;008-58E;50-10N;008-57E;112;114;
+ETIE;10;734;Heidelberg;;Germany;6;49-24N;008-39E;;;110;109;
+ETIH;10;775;Hohenfels;;Germany;6;49-13N;011-50E;;;442;442;
+ETIK;10;752;Illesheim;;Germany;6;49-28N;010-23E;;;325;347;
+ETIN;10;669;Kitzingen Usa \ Af ;;Germany;6;49-45N;010-12E;49-45N;010-12E;210;210;
+ETME;10;034;Eggebek;;Germany;6;54-38N;009-21E;;;20;22;
+ETMK;10;046;Kiel-Holtenau;;Germany;6;54-23N;010-09E;54-23N;010-09E;31;31;
+ETMN;10;136;Nordholz;;Germany;6;53-46N;008-40E;;;23;31;
+ETND;10;321;Diepholz;;Germany;6;52-35N;008-21E;;;39;43;
+ETNG;10;500;Geilenkirchen;;Germany;6;50-58N;006-03E;;;90;98;
+ETNH;10;038;Hohn;;Germany;6;54-19N;009-32E;;;12;17;
+ETNJ;10;122;Jever;;Germany;6;53-32N;007-53E;;;7;21;
+ETNL;10;172;Laage;;Germany;6;53-55N;012-17E;;;40;46;
+ETNN;10;502;Noervenich;;Germany;6;50-50N;006-40E;;;118;135;
+ETNP;10;314;Hopsten;;Germany;6;52-20N;007-32E;;;39;43;
+ETNR;10;493;Preschen;;Germany;6;51-40N;014-38E;;;100;;
+ETNS;10;037;Schleswig-Jagel;;Germany;6;54-28N;009-31E;;;22;25;
+ETNT;10;126;Wittmundhaven;;Germany;6;53-33N;007-40E;;;8;12;
+ETNU;10;281;Trollenhagen;;Germany;6;53-36N;013-19E;;;71;70;
+ETNW;10;334;Wunstorf;;Germany;6;52-27N;009-26E;;;57;70;
+ETOR;10;728;Coleman Mannheim ;;Germany;6;49-34N;008-28E;;;96;95;
+ETOU;10;633;Wiesbaden;;Germany;6;50-03N;008-20E;;;140;;
+ETSA;10;857;Landsberg;;Germany;6;48-04N;010-54E;;;623;628;
+ETSB;10;613;Buechel;;Germany;6;50-10N;007-04E;;;478;486;
+ETSE;10;869;Erding;;Germany;6;48-19N;011-57E;;;462;467;
+ETSF;10;858;Fuerstenfeldbruck;;Germany;6;48-12N;011-16E;;;519;535;
+ETSH;10;476;Holzdorf;;Germany;6;51-46N;013-11E;;;79;83;
+ETSI;10;860;Ingolstadt;;Germany;6;48-43N;011-32E;;;367;370;
+ETSL;10;856;Lechfeld;;Germany;6;48-11N;010-52E;;;555;562;
+ETSM;10;947;Memmingen;;Germany;6;47-59N;010-14E;;;634;644;
+ETSN;10;853;Neuburg / Donau;;Germany;6;48-43N;011-13E;;;380;387;
+ETSP;10;626;Pferdsfeld;;Germany;6;49-51N;007-36E;;;396;403;
+ETUL;10;405;Laarbruch;;Germany;6;51-36N;006-09E;;;32;31;
+ETUN;10;308;Nordhorn;;Germany;6;52-27N;007-10E;;;26;26;
+ETUO;10;320;Guetersloh;;Germany;6;51-55N;008-18E;;;72;72;
+ETUR;10;401;Brueggen;;Germany;6;51-12N;006-08E;;;73;76;
+ETWM;--;---;Meppen-Mil;;Germany;6;52-43-24N;007-19-35E;;;21;;
+EVLA;--;---;Liepaja International Airport;;Latvia;6;56-31N;021-05E;;;5;;
+EVRA;--;---;Riga International Airport;;Latvia;6;56-55N;023-58E;;;10;;
+EYKA;--;---;Kaunas;;Lithuania;6;54-54N;023-55-12E;;;77;;
+EYPA;--;---;Palanga Intl.;;Lithuania;6;55-55-12N;021-03E;;;10;;
+EYSA;--;---;Siauliai Intl./Mil.;;Lithuania;6;55-53-38N;023-23-42E;;;135;;
+EYVI;26;730;Vilnius;;Lithuania;6;54-38N;025-06E;;;162;156;P
+FAAB;68;406;Alexander Bay;;South Africa;1;28-34S;016-32E;28-34S;016-32E;21;0;P
+FAAN;68;546;Aliwal North;;South Africa;1;30-43S;026-43E;;;1348;1300;P
+FABL;68;442;Bloemfontein, Bloemfontein Airport;;South Africa;1;29-06S;026-18E;29-06S;026-18E;1354;1400;P
+FABM;68;461;Bethlehem Airport;;South Africa;1;28-15S;028-20E;28-15S;028-20E;1686;1700;P
+FABY;68;728;Beaufort West;;South Africa;1;32-21S;022-35E;32-21S;022-35E;842;900;P
+FACL;68;380;Carolina;;South Africa;1;26-04S;030-07E;;;1693;1700;
+FACT;68;816;Cape Town, Cape Town International Airport;;South Africa;1;33-59S;018-36E;33-58S;018-36E;42;0;P
+FACV;68;618;Calvinia;;South Africa;1;31-28S;019-46E;;;975;1000;P
+FADA;68;536;De Aar;;South Africa;1;30-39S;024-01E;;;1247;;
+FADN;68;588;Durban, Durban International Airport;;South Africa;1;29-58S;030-57E;29-58S;030-57E;14;0;P
+FADY;68;538;De Aar;;South Africa;1;30-38S;023-55E;;;384;;
+FAEL;68;858;East London, East London Airport;;South Africa;1;33-02S;027-50E;33-02S;027-50E;125;0;P
+FAEO;--;---;Ermelo;;South Africa;1;26-30S;029-59E;;;1737;;
+FAER;68;156;Ellisras;;South Africa;1;23-43-35S;027-41-18E;;;851;;
+FAFF;68;362;Frankfort;;South Africa;1;27-16S;028-30E;;;1499;1500;P
+FAFR;68;624;Fraserburg;;South Africa;1;31-55S;021-31E;;;1264;1300;P
+FAGB;68;116;Gobabis;;Namibia;1;22-28S;018-58E;;;1440;1400;P
+FAGE;68;906;Gough Island;;South Africa;1;40-21S;009-53W;40-21S;009-53W;54;0;P
+FAGG;68;828;George, George Airport;;South Africa;1;34-00S;022-23E;33-58S;022-25E;193;0;P
+FAGM;--;---;Rand;;South Africa;1;26-15S;028-00E;;;1668;;
+FAGR;68;736;Graaff Reinet;;South Africa;1;32-15S;024-32E;;;752;800;P
+FAGY;--;---;Greytown;;South Africa;1;29-07S;030-34E;;;1100;;
+FAHS;68;290;Hoedspruit;;South Africa;1;24-22S;031-02E;;;513;500;P
+FAIR;68;263;Pretoria Irene ;;South Africa;1;25-55S;028-13E;25-55S;028-13E;1523;1500;
+FAJS;68;368;Johannesburg International Airport;;South Africa;1;26-08S;028-14E;26-08S;028-14E;1694;1700;P
+FAKD;68;347;Klerksdorp;;South Africa;1;26-52S;026-43E;;;1355;;
+FAKM;68;438;Kimberley, Kim-Apt;;South Africa;1;28-48S;024-46E;28-48S;024-46E;1198;1200;P
+FALA;--;---;Lanseria;;South Africa;1;25-56S;027-56E;;;1377;;
+FALT;--;---;Lichtenburg;;South Africa;1;26-11S;026-11E;;;1486;;
+FALW;68;714;Langebaanweg;;South Africa;1;32-58S;018-10E;;;31;0;P
+FALY;68;476;Ladysmith;;South Africa;1;28-34S;029-46E;28-34S;029-46E;1078;1100;P
+FAMB;68;638;Middelburg;;South Africa;1;31-29S;025-02E;;;1270;1300;P
+FAME;68;994;Marion Island;;South Africa;1;46-53S;037-52E;46-53S;037-52E;22;0;P
+FAMG;--;---;Margate;;South Africa;1;30-51S;030-21E;;;151;;
+FAMM;68;242;Mafikeng Intl. Ad;;South Africa;1;25-47S;025-32E;25-47S;025-32E;1281;1300;P
+FAMO;68;928;Mossel Bay Cape Saint Blaize ;;South Africa;1;34-11S;022-09E;;;59;0;P
+FANC;--;---;Newcastle;;South Africa;1;27-47S;029-59E;;;1251;;
+FANS;68;288;Nelspruit;;South Africa;1;25-26S;030-59E;;;671;700;P
+FAOB;--;---;Overberg;;South Africa;1;34-36S;020-17E;;;75;;
+FAOH;68;826;Oudtshoorn;;South Africa;1;33-34S;022-13E;;;359;0;P
+FAPB;68;174;Pietersburg;;South Africa;1;23-52S;029-27E;23-52S;029-27E;1228;1200;P
+FAPE;68;842;Port Elizabeth, Port E Apt;;South Africa;1;33-59S;025-36E;33-59S;025-36E;61;0;P
+FAPG;--;---;Plettenberg Bay;;South Africa;1;34-05-17S;023-19-46E;;;139;;
+FAPH;68;190;Phalaborwa;;South Africa;1;23-56S;031-09E;;;427;400;P
+FAPI;--;---;Pietersburg Civil ;;South Africa;1;23-54S;029-28E;;;1327;;
+FAPJ;68;674;Port St Johns;;South Africa;1;31-38S;029-33E;;;47;0;P
+FAPM;--;---;Pietermaritzburg;;South Africa;1;29-39S;030-24E;;;739;;
+FAPR;68;262;Pretoria;;South Africa;1;25-44S;028-11E;25-44S;028-11E;1330;1300;P
+FAPS;--;---;Potchefstroom;;South Africa;1;26-40-16S;027-04-55E;;;1378;;
+FAQT;68;648;Queenstown;;South Africa;1;31-54S;026-52E;;;1094;1100;P
+FARB;68;498;Richard Bay;;South Africa;1;28-48S;032-06E;;;47;0;P
+FARG;--;---;Rustenburg;;South Africa;1;25-38-39S;027-16-16E;;;1128;;
+FASB;68;512;Springbok;;South Africa;1;29-40S;017-52E;29-40S;017-52E;1006;1000;P
+FASI;--;---;Springs;;South Africa;1;26-14-54S;028-23-51E;;;1628;;
+FASR;--;---;Standerton;;South Africa;1;26-56S;029-13E;;;1581;;
+FASS;--;---;Sishen;;South Africa;1;27-38-59S;023-00E;;;1173;;
+FATC;68;902;Tristan Da Cunha;;South Africa;1;37-03S;012-19W;;;23;0;
+FATZ;--;---;Tzaneen ;;South Africa;1;23-49S;030-20E;;;583;;
+FAUL;--;---;Ulundi;;South Africa;1;28-19-06S;031-25-04E;;;525;;
+FAUP;68;424;Upington, Up-Apt;;South Africa;1;28-24S;021-16E;28-24S;021-16E;839;800;P
+FAUT;68;668;Umtata;;South Africa;1;31-32S;028-40E;;;742;700;P
+FAVB;68;338;Vryburg;;South Africa;1;26-57S;024-38E;;;1234;1200;P
+FAVG;--;---;Durban/Virginia;;South Africa;1;29-46-14S;031-03-37E;;;6;;
+FAVR;68;614;Vredendal;;South Africa;1;31-40S;018-30E;;;34;0;P
+FAVV;--;---;Vereeniging;;South Africa;1;26-34-29S;027-57-45E;;;1483;;
+FAVY;--;---;Vryheid;;South Africa;1;27-47S;030-48E;;;1158;;
+FAWB;--;---;Wonderboom / Pretoria;;South Africa;1;25-39S;028-13E;;;1248;;
+FAWI;--;---;Witbank;;South Africa;1;25-49-51S;029-11-32E;;;1553;;
+FAWK;68;264;Waterkloof (SAAF);;South Africa;1;25-50S;028-13E;;;1498;1500;P
+FAWM;68;346;Welkom;;South Africa;1;28-00S;026-40E;;;1338;1300;P
+FBFT;68;054;Francistown;;Botswana;1;21-13S;027-30E;21-10S;027-29E;1001;1000;P
+FBGZ;68;024;Ghanzi;;Botswana;1;21-42S;021-39E;21-42S;021-39E;1131;1100;P
+FBJW;68;234;Jwaneng;;Botswana;1;24-36S;024-40E;;;1189;1200;
+FBKE;68;029;Kasane;;Botswana;1;17-49S;025-09E;;;968;1000;
+FBLT;68;040;Letlhakane;;Botswana;1;21-25S;025-36E;;;986;985;
+FBMN;68;032;Maun;;Botswana;1;19-59S;023-25E;19-59S;023-25E;945;900;P
+FBSK;68;240;Seretse Khama International Airport;;Botswana;1;24-13S;025-55E;24-13S;025-55E;1005;1005;
+FBSN;68;038;Sua-Pan;;Botswana;1;20-28S;025-59E;20-28S;025-59E;903;904;
+FBSP;--;---;Selebi Phikwe;;Botswana;1;22-03-19S;027-49-13E;;;892;;
+FBSW;68;026;Shakawe;;Botswana;1;18-22S;021-51E;;;1032;1000;P
+FBTE;68;226;Tshane;;Botswana;1;24-01S;021-53E;;;1118;1100;P
+FBTS;68;328;Tsabong;;Botswana;1;26-03S;022-27E;26-03S;022-27E;960;1000;P
+FCBB;64;450;Brazzaville / Maya-Maya;;Congo, Republic of the;1;04-15S;015-15E;04-15S;015-15E;319;316;P
+FCBD;64;453;Djambala;;Congo, Republic of the;1;02-32S;014-46E;02-32S;014-46E;791;790;P
+FCBM;64;402;Mouyondzi;;Congo, Republic of the;1;03-59S;013-55E;;;509;512;P
+FCBO;64;452;M'Pouya;;Congo, Republic of the;1;02-37S;016-13E;;;311;312;P
+FCBS;64;405;Sibiti;;Congo, Republic of the;1;03-41S;013-21E;;;530;531;P
+FCOG;64;454;Gamboma;;Congo, Republic of the;1;01-52S;015-52E;;;476;377;P
+FCOI;64;459;Impfondo;;Congo, Republic of the;1;01-37N;018-04E;01-37N;018-04E;335;326;P
+FCOM;64;456;Makoua;;Congo, Republic of the;1;00-01S;015-35E;00-01S;015-35E;394;379;P
+FCOS;64;460;Souanke;;Congo, Republic of the;1;02-04N;014-08E;;;549;550;P
+FCOU;64;458;Ouesso;;Congo, Republic of the;1;01-37N;016-03E;01-37N;016-03E;352;352;P
+FCPA;64;403;Makabana;;Congo, Republic of the;1;03-29S;012-37E;;;160;161;P
+FCPL;64;401;Loubomo;;Congo, Republic of the;1;04-12S;012-42E;04-13S;012-40E;329;330;P
+FCPP;64;400;Pointe-Noire;;Congo, Republic of the;1;04-49S;011-54E;04-49S;011-54E;17;17;P
+FDMS;68;396;Manzini / Matsapa Airport;;Swaziland;1;26-32S;031-18E;;;641;;
+FEFA;64;662;Alindao;;Central African Republic;1;05-03N;021-12E;;;447;449;P
+FEFB;64;659;Obo;;Central African Republic;1;05-24N;026-30E;;;650;651;P
+FEFF;64;650;Bangui;;Central African Republic;1;04-24N;018-31E;04-24N;018-31E;365;366;P
+FEFG;64;656;Bangassou;;Central African Republic;1;04-44N;022-50E;04-44N;022-50E;499;500;P
+FEFI;64;658;Birao;;Central African Republic;1;10-17N;022-47E;;;463;464;P
+FEFL;64;605;Bossembele;;Central African Republic;1;05-16N;017-38E;;;673;674;P
+FEFM;64;660;Bambari;;Central African Republic;1;05-51N;020-39E;;;474;475;P
+FEFN;64;654;N'Dele;;Central African Republic;1;08-24N;020-39E;08-24N;020-39E;510;511;P
+FEFO;64;601;Bouar;;Central African Republic;1;05-58N;015-38E;05-58N;015-38E;1019;1020;P
+FEFR;64;655;Bria;;Central African Republic;1;06-32N;021-59E;;;583;584;P
+FEFS;64;610;Bossangoa;;Central African Republic;1;06-29N;017-26E;06-29N;017-26E;464;465;P
+FEFT;64;600;Berberati;;Central African Republic;1;04-15N;015-48E;04-13N;015-47E;582;583;P
+FEFY;64;661;Yalinga;;Central African Republic;1;06-30N;023-16E;;;601;602;P
+FGSL;64;810;Malabo/Fernando Poo;;Equatorial Guinea;1;03-45N;008-46E;;;56;;
+FHAW;61;902;Wide Awake Field Ascension Island ;;Saint Helena;1;07-58S;014-24W;07-58S;014-24W;86;79;P
+FIMP;61;990;Plaisance Mauritius ;;Mauritius;1;20-26S;057-40E;;;55;57;P
+FIMR;61;988;Rodrigues;;Mauritius;1;19-41S;063-25E;19-41S;063-25E;58;59;P
+FJDG;61;967;Diego Garcia;;British Indian Ocean Territory;1;07-18S;072-24E;07-18S;072-24E;1;3;P
+FKAB;64;880;Banyo;;Cameroon;1;06-47N;011-49E;;;1110;;
+FKAF;64;920;Bafia;;Cameroon;1;04-44N;011-15E;;;500;500;P
+FKAG;64;960;Abong-Mbang;;Cameroon;1;03-58N;013-12E;;;693;;
+FKAL;64;961;Lomie;;Cameroon;1;03-09N;013-37E;;;624;;
+FKAM;64;882;Meiganga;;Cameroon;1;06-32N;014-22E;;;1027;1027;P
+FKAN;64;911;Nkongsamba;;Cameroon;1;04-57N;009-56E;04-57N;009-56E;816;821;P
+FKAO;64;901;Betare-Oya;;Cameroon;1;05-36N;014-04E;;;815;804;
+FKAY;64;900;Yoko;;Cameroon;1;05-33N;012-22E;05-33N;012-22E;1027;1031;P
+FKKA;64;851;Maroua-Salak;;Cameroon;1;10-27N;014-15E;;;423;422;P
+FKKB;64;971;Kribi;;Cameroon;1;02-57N;009-54E;;;10;16;P
+FKKC;64;912;Tiko;;Cameroon;1;04-05N;009-22E;;;52;;
+FKKD;64;910;Douala Obs.;;Cameroon;1;04-00N;009-44E;04-01N;009-42E;10;9;P
+FKKF;64;890;Mamfe;;Cameroon;1;05-43N;009-17E;;;126;;
+FKKI;64;931;Batouri;;Cameroon;1;04-28N;014-22E;04-28N;014-22E;656;656;P
+FKKM;64;893;Koundja;;Cameroon;1;05-39N;010-45E;05-39N;010-45E;1208;1210;P
+FKKN;64;870;Ngaoundere;;Cameroon;1;07-21N;013-34E;07-21N;013-34E;1114;1104;P
+FKKR;64;860;Garoua;;Cameroon;1;09-20N;013-23E;09-20N;013-23E;242;244;P
+FKKV;64;892;Bamenda ;;Cameroon;1;06-03N;010-07E;;;1239;;
+FKKY;--;---;Younde Ii;;Cameroon;1;03-50N;011-32E;;;751;;
+FKYS;64;950;Yaounde;;Cameroon;1;03-50N;011-31E;03-50N;011-31E;751;760;P
+FLBA;67;413;Mbala;;Zambia;1;08-51S;031-20E;;;1673;;
+FLCH;67;753;Choma;;Zambia;1;16-50S;027-04E;;;1213;1278;P
+FLCP;67;581;Chipata;;Zambia;1;13-33S;032-35E;13-33S;032-35E;1028;1032;P
+FLIK;67;481;Isoka;;Zambia;1;10-07S;032-38E;;;1360;;
+FLKB;67;403;Kawambwa;;Zambia;1;09-48S;029-05E;;;1323;1324;P
+FLKO;67;641;Kaoma;;Zambia;1;14-48S;024-48E;;;1213;1213;P
+FLKS;67;475;Kasama;;Zambia;1;10-13S;031-08E;10-13S;031-08E;1382;1384;P
+FLKW;67;663;Kabwe;;Zambia;1;14-27S;028-28E;14-27S;028-28E;1206;1207;P
+FLLC;67;666;Lusaka City Airport;;Zambia;1;14-27S;028-28E;15-25S;028-19E;1280;1280;
+FLLD;67;583;Lundazi;;Zambia;1;12-17S;033-12E;;;1143;;
+FLLI;67;743;Livingstone;;Zambia;1;17-49S;025-49E;17-49S;025-49E;985;986;P
+FLLS;67;665;Lusaka Internationalairport;;Zambia;1;15-19S;028-27E;15-19S;028-27E;1152;1154;P
+FLMA;67;461;Mansa;;Zambia;1;11-06S;028-51E;;;1382;1384;P
+FLMF;--;---;Mfuwe;;Zambia;1;13-15-32S;031-56-12E;;;573;;
+FLMG;67;633;Mongu;;Zambia;1;15-15S;023-09E;15-15S;023-09E;1052;1053;P
+FLMP;67;477;Mpika;;Zambia;1;11-54S;031-26E;;;1400;1402;P
+FLMW;67;441;Mwinilunga;;Zambia;1;11-45S;024-26E;11-45S;024-26E;1361;1363;P
+FLND;67;561;Ndola;;Zambia;1;13-00S;028-39E;13-00S;028-39E;1269;1270;P
+FLPA;67;541;Kasempa;;Zambia;1;13-32S;025-51E;;;1234;1234;P
+FLPE;67;673;Petauke;;Zambia;1;14-15S;031-17E;;;1035;1036;P
+FLPO;67;543;Kabompo;;Zambia;1;13-36S;024-12E;;;1075;;
+FLSE;67;571;Serenje;;Zambia;1;13-14S;030-13E;;;1384;;
+FLSN;67;731;Senanga;;Zambia;1;16-06S;023-16E;;;1027;;
+FLSS;67;741;Sesheke;;Zambia;1;17-28S;024-18E;;;949;951;P
+FLSW;67;551;Solwezi;;Zambia;1;12-11S;026-23E;;;1386;;
+FLZB;67;531;Zambezi;;Zambia;1;13-32S;023-07E;;;1077;1078;P
+FMCH;67;002;Hahaya International Airport;;Comoros;1;11-32S;043-16E;11-32S;043-16E;29;29;
+FMCV;67;004;Ouani Anjouan ;;Comoros;1;12-07S;044-26E;12-07S;044-26E;19;12;P
+FMCZ;67;005;Dzaoudzi / Pamanzi Mayotte ;;Comoros;1;12-48S;045-17E;12-48S;045-17E;8;7;P
+FMEE;61;980;Saint-Denis / Gillot;;Reunion;1;20-53S;055-31E;20-53S;055-31E;21;25;P
+FMEP;61;984;Saint-Pierre;;Reunion;1;21-20S;055-29E;21-20S;055-29E;52;53;P
+FMME;67;107;Antsirabe;;Madagascar;1;19-49S;047-04E;19-49S;047-04E;1523;1532;
+FMMH;67;113;Mahanoro;;Madagascar;1;19-50S;048-48E;19-50S;048-48E;5;5;P
+FMMI;67;083;Antananarivo / Ivato;;Madagascar;1;18-48S;047-29E;18-48S;047-29E;1279;1276;P
+FMMO;67;073;Maintirano;;Madagascar;1;18-03S;044-02E;18-03S;044-02E;23;23;P
+FMMS;67;072;Sainte-Marie Aerodrome;;Madagascar;1;17-05S;049-49E;17-05S;049-49E;2;3;P
+FMMT;67;095;Tamatave;;Madagascar;1;18-07S;049-24E;18-07S;049-24E;5;6;P
+FMMV;67;117;Morondava;;Madagascar;1;20-17S;044-19E;20-17S;044-19E;7;8;P
+FMNA;67;009;Diego-Suarez;;Madagascar;1;12-21S;049-18E;12-21S;049-18E;114;105;P
+FMND;67;022;Andapa;;Madagascar;1;14-39S;049-37E;;;473;474;
+FMNH;67;025;Antalaha;;Madagascar;1;14-53S;050-15E;15-00S;050-20E;87;88;P
+FMNL;67;019;Analalava;;Madagascar;1;14-38S;047-46E;14-38S;047-46E;105;57;P
+FMNM;67;027;Majunga;;Madagascar;1;15-40S;046-21E;14-53S;050-15E;26;18;P
+FMNN;67;012;Fascene Nossi-Be ;;Madagascar;1;13-19S;048-19E;13-19S;048-19E;10;9;P
+FMNQ;67;037;Besalampy;;Madagascar;1;16-45S;044-29E;16-45S;044-29E;38;36;
+FMNS;67;023;Sambava;;Madagascar;1;14-17S;050-10E;14-17S;050-10E;5;5;
+FMNV;67;017;Vohemar;;Madagascar;1;13-22S;050-00E;13-22S;050-00E;6;5;
+FMSD;67;197;Fort-Dauphin;;Madagascar;1;25-02S;046-57E;25-02S;046-57E;8;9;P
+FMSF;67;137;Fianarantsoa;;Madagascar;1;21-27S;047-06E;21-27S;047-06E;1115;1109;P
+FMSG;67;157;Farafangana;;Madagascar;1;22-48S;047-50E;22-48S;047-50E;8;6;P
+FMSM;67;143;Mananjary;;Madagascar;1;21-12S;048-22E;21-12S;048-22E;5;6;P
+FMSO;67;152;Ranohira;;Madagascar;1;22-33S;045-24E;22-33S;045-24E;824;824;P
+FMSR;67;131;Morombe;;Madagascar;1;21-45S;043-22E;21-45S;043-22E;5;4;
+FMST;67;161;Tulear;;Madagascar;1;23-23S;043-44E;23-23S;043-44E;8;8;P
+FNBG;66;310;Monbaca Benguela ;;Angola;1;12-35S;013-25E;;;33;4;P
+FNCA;66;104;Cabinda;;Angola;1;05-33S;012-11E;;;25;20;P
+FNHU;66;318;Huambo Nova Lisboa ;;Angola;1;12-48S;015-45E;12-48S;015-45E;1710;1701;P
+FNKU;66;325;Bie Silva Porto ;;Angola;1;12-23S;016-57E;;;1701;1699;P
+FNLU;66;160;Luanda;;Angola;1;08-51S;013-14E;08-51S;013-14E;74;70;P
+FOGM;64;550;Mouila;;Gabon;1;01-52S;011-01E;;;88;89;P
+FOGR;64;551;Lambarene;;Gabon;1;00-43S;010-14E;;;27;26;P
+FOOB;64;510;Bitam;;Gabon;1;02-05N;011-29E;02-05N;011-29E;600;599;P
+FOOC;64;504;Cocobeach;;Gabon;1;01-00N;009-36E;;;12;13;P
+FOOD;64;565;Moanda;;Gabon;1;01-32S;013-16E;01-32S;013-16E;572;573;P
+FOOE;64;545;Mekambo;;Gabon;1;01-01N;013-56E;;;499;501;P
+FOOG;64;501;Port-Gentil;;Gabon;1;00-42S;008-45E;00-42S;008-45E;3;4;P
+FOOK;64;556;Makokou;;Gabon;1;00-34N;012-52E;;;509;515;P
+FOOL;64;500;Libreville;;Gabon;1;00-27N;009-25E;00-27N;009-25E;12;15;P
+FOOM;64;552;Mitzic;;Gabon;1;00-47N;011-32E;;;583;583;P
+FOON;--;---;Franceville / Mvengue;;Gabon;1;01-39S;013-26E;;;441;;
+FOOR;64;560;Lastoursville;;Gabon;1;00-50S;012-43E;;;483;485;P
+FOOT;64;507;Tchibanga;;Gabon;1;02-51S;011-01E;;;83;79;P
+FOOY;64;503;Mayumba;;Gabon;1;03-25S;010-39E;;;31;34;P
+FPPR;61;934;Principe;;Sao Tome and Principe;1;01-39N;007-25E;;;3;5;P
+FPST;61;931;S. Tome;;Sao Tome and Principe;1;00-23N;006-43E;00-23N;006-43E;8;13;P
+FQBR;67;297;Beira;;Mozambique;1;19-48S;034-54E;19-48S;034-54E;8;16;
+FQCB;67;231;Cuamba;;Mozambique;1;14-49S;036-32E;;;606;607;
+FQCH;67;295;Chimoio;;Mozambique;1;19-07S;033-28E;;;731;732;
+FQIN;67;323;Inhambane;;Mozambique;1;23-52S;035-23E;23-52S;035-23E;14;15;
+FQLC;67;217;Lichinga;;Mozambique;1;13-18S;035-14E;13-17S;035-15E;1364;1365;
+FQLU;67;241;Lumbo;;Mozambique;1;15-02S;040-40E;15-02S;040-40E;10;11;
+FQMA;67;341;Maputo / Mavalane;;Mozambique;1;25-55S;032-34E;25-55S;032-34E;39;44;
+FQMP;67;205;Mocimboa Da Praia;;Mozambique;1;11-21S;040-22E;;;27;29;
+FQNP;67;237;Nampula;;Mozambique;1;15-06S;039-17E;15-06S;039-17E;438;441;
+FQPB;67;215;Pemba;;Mozambique;1;12-59S;040-32E;12-58S;040-30E;101;50;
+FQQL;67;283;Quelimane;;Mozambique;1;17-53S;036-53E;17-53S;036-53E;6;16;
+FQTE;67;261;Tete;;Mozambique;1;16-11S;033-35E;16-11S;033-35E;149;150;
+FQTT;--;---;Tete / Chingozi;;Mozambique;1;16-06S;033-38E;;;160;;
+FQVL;67;315;Vilanculos;;Mozambique;1;22-00S;035-19E;;;20;21;
+FQXA;67;335;Xai Xai;;Mozambique;1;25-03S;033-38E;;;4;5;
+FSIA;63;980;Seychelles Inter-National Airport;;Seychelles;1;04-40S;055-31E;04-40S;055-31E;3;3;P
+FSSS;63;985;Seychelles International Airport Rawinsonde Station ;;Seychelles;1;04-41S;055-32E;04-41S;055-32E;4;4;
+FTTA;64;750;Sarh;;Chad;1;09-09N;018-23E;09-09N;018-23E;365;365;P
+FTTC;64;756;Abeche;;Chad;1;13-51N;020-51E;13-51N;020-51E;545;549;P
+FTTD;64;706;Moundou;;Chad;1;08-37N;016-04E;;;428;422;P
+FTTJ;64;700;Ndjamena;;Chad;1;12-08N;015-02E;12-08N;015-02E;295;295;P
+FTTK;64;708;Bokoro;;Chad;1;12-23N;017-03E;;;300;301;P
+FTTL;64;702;Bol-Berim;;Chad;1;13-26N;014-44E;;;291;292;P
+FTTN;64;754;Am-Timan;;Chad;1;11-02N;020-17E;;;433;436;P
+FTTP;64;709;Pala;;Chad;1;09-22N;014-55E;;;467;455;P
+FTTY;64;753;Faya;;Chad;1;18-00N;019-10E;18-00N;019-10E;235;234;P
+FVBB;67;991;Beitbridge;;Zimbabwe;1;22-13S;030-00E;22-13S;030-00E;456;457;P
+FVBI;67;755;Binga;;Zimbabwe;1;17-37S;027-20E;;;620;617;
+FVBU;67;965;Bulawayo Airport;;Zimbabwe;1;20-01S;028-37E;20-01S;028-37E;1326;1326;P
+FVCH;67;983;Chipinge;;Zimbabwe;1;20-12S;032-37E;;;1131;1132;P
+FVCZ;67;977;Buffalo Range;;Zimbabwe;1;21-01S;031-35E;21-01S;031-35E;429;430;P
+FVFA;67;843;Victoria Falls;;Zimbabwe;1;18-06S;025-51E;18-06S;025-51E;1061;1062;P
+FVGO;67;861;Gokwe;;Zimbabwe;1;18-13S;028-56E;18-13S;028-56E;1282;1282;P
+FVHA;67;775;Harare Kutsaga ;;Zimbabwe;1;17-55S;031-08E;17-56S;031-06E;1479;1480;P
+FVKA;67;765;Karoi;;Zimbabwe;1;16-50S;029-37E;16-50S;029-37E;1343;1344;P
+FVKB;67;761;Kariba;;Zimbabwe;1;16-31S;028-53E;16-31S;028-53E;518;518;
+FVMT;67;781;Mutoko;;Zimbabwe;1;17-25S;032-13E;17-25S;032-13E;1244;1244;
+FVMV;67;975;Masvingo;;Zimbabwe;1;20-04S;030-52E;20-04S;030-52E;1094;1095;P
+FVRU;67;881;Rusape;;Zimbabwe;1;18-32S;032-08E;18-32S;032-09E;1430;1430;P
+FVTL;67;867;Gweru;;Zimbabwe;1;19-27S;029-51E;19-27S;029-51E;1428;1429;P
+FVWN;67;853;Hwange National Park;;Zimbabwe;1;18-38S;027-00E;18-38S;026-51E;1079;1077;P
+FWCL;67;693;Chileka;;Malawi;1;15-41S;034-58E;15-41S;034-58E;766;767;P
+FWCT;67;421;Chitipa;;Malawi;1;09-42S;033-16E;;;1278;1278;P
+FWDZ;67;689;Dedza;;Malawi;1;14-19S;034-16E;;;1630;1632;
+FWKA;67;423;Karonga;;Malawi;1;09-57S;033-53E;09-57S;033-54E;529;529;P
+FWKI;67;586;Lilongwe International Airport;;Malawi;1;13-47S;033-46E;13-47S;033-47E;1229;1229;P
+FWKK;67;591;Nkhota Kota;;Malawi;1;12-55S;034-16E;;;500;500;
+FWMG;67;695;Mangochi;;Malawi;1;14-26S;035-15E;;;485;485;P
+FWMY;67;690;Monkey Bay;;Malawi;1;14-05S;034-55E;;;474;474;
+FWMZ;67;485;Mzimba;;Malawi;1;11-53S;033-37E;11-53S;033-37E;1349;1351;P
+FWSM;67;597;Salima;;Malawi;1;13-45S;034-35E;13-45S;034-35E;513;513;P
+FWUU;67;489;Mzuzu;;Malawi;1;11-27S;034-01E;11-27S;034-01E;1251;1253;P
+FXMM;--;---;Maseru / Moshoeshoe;;Lesotho;1;29-27S;027-33E;;;1631;;
+FXMU;68;454;Maseru-Mia;;Lesotho;1;29-27S;027-33E;;;1631;1628;P
+FYGF;68;014;Grootfontein;;Namibia;1;19-36S;018-07E;19-36S;018-07E;1411;1400;P
+FYKM;--;---;Katima Mulilo;;Namibia;1;17-38-04S;024-10-36E;;;985;;
+FYKT;68;312;Keetmanshoop;;Namibia;1;26-32S;018-07E;26-32S;018-07E;1067;1100;P
+FYLZ;--;---;Luderitz / Diaz Point;;Namibia;1;26-41S;015-15E;;;130;;
+FYOA;--;---;Ondangwa;;Namibia;1;17-52-42S;015-57-09E;;;1096;;
+FYRK;--;---;Rooikop Saaf / Civ ;;Namibia;1;22-59S;014-39E;;;88;;
+FYRU;68;018;Rundu;;Namibia;1;17-55S;019-46E;;;1083;1100;P
+FYWB;--;---;Walvis Bay;;Namibia;1;22-58-59S;014-39E;;;46;;
+FYWH;68;112;J. G. Strijdom;;Namibia;1;22-29S;017-28E;22-29S;017-28E;1715;1700;P
+FYWW;--;---;Windhoek, Town MET;;Namibia;1;22-34S;017-06E;;;1725;;
+FZAA;64;210;Kinshasa / N'Djili;;Congo, Democratic Republic of the;1;04-23S;015-26E;04-23S;015-26E;309;312;P
+FZAG;64;201;Moanda;;Congo, Democratic Republic of the;1;06-00S;012-25E;;;27;27;P
+FZAM;64;207;Matadi;;Congo, Democratic Republic of the;1;05-48S;013-26E;05-48S;013-26E;355;340;P
+FZAN;64;206;Inga;;Congo, Democratic Republic of the;1;05-31S;013-35E;;;277;277;P
+FZBA;64;115;Inongo;;Congo, Democratic Republic of the;1;01-58S;018-16E;01-58S;018-16E;300;300;P
+FZBO;64;108;Bandundu;;Congo, Democratic Republic of the;1;03-18S;017-21E;;;324;324;P
+FZCA;64;222;Kikwit;;Congo, Democratic Republic of the;1;05-02S;018-48E;05-02S;018-48E;518;449;P
+FZCS;64;217;Kenge;;Congo, Democratic Republic of the;1;04-55S;017-04E;;;563;563;P
+FZEA;64;005;Mbandaka;;Congo, Democratic Republic of the;1;00-03N;018-16E;00-03N;018-16E;345;317;P
+FZFK;64;006;Gemena;;Congo, Democratic Republic of the;1;03-17N;019-47E;;;475;446;P
+FZGN;64;126;Boende;;Congo, Democratic Republic of the;1;00-13S;020-51E;00-13S;020-51E;351;351;P
+FZIA;64;040;Kisangani;;Congo, Democratic Republic of the;1;00-31N;025-11E;00-31N;025-11E;415;396;P
+FZMB;64;072;Butembo;;Congo, Democratic Republic of the;1;00-08N;029-16E;;;1840;1840;P
+FZNA;64;184;Goma;;Congo, Democratic Republic of the;1;01-41S;029-14E;;;1552;1552;P
+FZNC;64;157;Rutshuru;;Congo, Democratic Republic of the;1;01-11S;029-27E;;;1275;1275;P
+FZOA;64;155;Kindu;;Congo, Democratic Republic of the;1;02-57S;025-55E;02-57S;025-55E;497;497;P
+FZQA;64;360;Lubumbashi-Luano;;Congo, Democratic Republic of the;1;11-40S;027-29E;;;1276;1298;P
+FZQM;64;328;Kolwezi;;Congo, Democratic Republic of the;1;10-43S;025-27E;;;1405;1526;P
+FZRA;64;282;Manono;;Congo, Democratic Republic of the;1;07-17S;027-26E;07-17S;027-26E;614;633;P
+FZRF;64;285;Kalemie;;Congo, Democratic Republic of the;1;05-53S;029-11E;05-52S;029-11E;790;818;P
+FZRQ;64;276;Kongolo;;Congo, Democratic Republic of the;1;05-21S;027-00E;;;561;561;
+FZSA;64;315;Kamina / Base;;Congo, Democratic Republic of the;1;08-38S;025-15E;08-38S;025-15E;1088;1106;P
+FZUA;64;235;Kananga;;Congo, Democratic Republic of the;1;05-53S;022-25E;;;654;657;P
+FZUK;64;228;Tshikapa;;Congo, Democratic Republic of the;1;06-25S;020-51E;;;521;481;P
+FZVA;64;146;Lodja;;Congo, Democratic Republic of the;1;03-29S;023-28E;;;479;500;P
+FZVI;64;246;Lusambo;;Congo, Democratic Republic of the;1;04-58S;023-26E;;;424;424;P
+FZVS;64;224;Ilebo;;Congo, Democratic Republic of the;1;04-20S;020-35E;;;465;420;P
+FZWA;64;247;Mbuji-Mayi;;Congo, Democratic Republic of the;1;06-10S;023-37E;;;633;677;P
+GABG;61;296;Bougouni;;Mali;1;11-25N;007-30W;11-25N;007-30W;350;351;P
+GABS;61;291;Bamako / Senou;;Mali;1;12-32N;007-57W;12-32N;007-57W;380;381;P
+GAGO;61;226;Gao;;Mali;1;16-16N;000-03W;16-16N;000-03W;265;260;P
+GAHB;61;240;Hombori;;Mali;1;15-20N;001-41W;;;287;288;P
+GAKA;61;285;Kenieba;;Mali;1;12-51N;011-14W;;;132;132;P
+GAKL;61;214;Kidal;;Mali;1;18-26N;001-21E;18-26N;001-21E;458;459;P
+GAKO;61;293;Koutiala;;Mali;1;12-23N;005-28W;;;365;367;P
+GAKT;61;270;Kita;;Mali;1;13-04N;009-28W;;;333;334;P
+GAKY;61;257;Kayes;;Mali;1;14-26N;011-26W;14-26N;011-26W;47;47;P
+GAMB;61;265;Mopti;;Mali;1;14-31N;004-06W;14-31N;004-06W;276;272;P
+GAMK;61;250;Menaka;;Mali;1;15-52N;002-13E;;;278;278;P
+GANK;61;233;Nara;;Mali;1;15-10N;007-17W;15-10N;007-17W;271;265;P
+GANR;61;230;Nioro Du Sahel;;Mali;1;15-14N;009-21W;;;235;237;P
+GASG;61;272;Segou;;Mali;1;13-24N;006-09W;13-26N;006-17W;288;289;P
+GASK;61;297;Sikasso;;Mali;1;11-21N;005-41W;11-21N;005-41W;374;375;P
+GASN;61;277;San;;Mali;1;13-20N;004-50W;;;283;284;P
+GATB;61;223;Tombouctou;;Mali;1;16-43N;003-00W;16-43N;003-00W;263;264;P
+GATS;61;202;Tessalit;;Mali;1;20-12N;000-59E;20-12N;000-59E;494;491;P
+GBYD;61;701;Banjul / Yundum;;Gambia, The;1;13-21N;016-48W;13-21N;016-48W;36;36;P
+GCFV;60;035;Fuerteventura / Aeropuerto;;Spain;1;28-27N;013-52W;;;22;30;
+GCHI;60;001;Hierro / Aeropuerto;;Spain;1;27-49N;017-53W;;;32;32;
+GCLA;60;005;La Palma / Aeropuerto;;Spain;1;28-37N;017-45W;;;29;31;P
+GCLP;60;030;Gran Canaria - Canary Islands;;Spain;1;27-56N;015-23W;27-56N;015-23W;23;47;P
+GCRR;60;040;Lanzarote / Aeropuerto;;Spain;1;28-57N;013-36W;;;14;21;P
+GCTS;60;025;Tenerife Sur;;Spain;1;28-03N;016-34W;;;64;77;
+GCXO;60;015;Tenerife / Los Rodeos;;Spain;1;28-28N;016-19W;;;632;617;P
+GEML;60;338;Melilla;;Spain;1;35-17N;002-57W;;;47;55;P
+GFLL;61;856;Lungi;;Sierra Leone;1;08-37N;013-12W;08-37N;013-12W;25;27;P
+GGBF;61;781;Bafata;;Guinea-Bissau;1;12-10N;014-40W;;;42;43;
+GGOV;61;766;Bissau Aeroport ;;Guinea-Bissau;1;11-53N;015-39W;11-53N;015-39W;39;36;
+GLRB;65;660;Grand Bassa, Roberts Field;;Liberia;1;06-15N;010-21W;;;18;;
+GMAA;60;250;Agadir;;Morocco;1;30-23N;009-34W;30-23N;009-34W;27;23;P
+GMAD;60;252;Agadir Al Massira;;Morocco;1;30-20N;009-24W;30-20N;009-25W;74;74;
+GMAT;60;285;Tan-Tan;;Morocco;1;28-27N;011-09W;;;229;200;P
+GMFF;60;141;Fes-Sais;;Morocco;1;33-56N;004-59W;33-56N;004-59W;579;579;P
+GMFI;60;160;Ifrane;;Morocco;1;33-30N;005-10W;33-30N;005-10W;1664;1665;P
+GMFK;60;210;Errachidia;;Morocco;1;31-56N;004-24W;31-58N;004-25W;1034;1042;P
+GMFM;60;150;Meknes;;Morocco;1;33-53N;005-32W;33-53N;005-32W;576;549;P
+GMFN;60;340;Nador;;Morocco;1;35-09N;002-55W;35-09N;002-55W;3;16;P
+GMFO;60;115;Oujda;;Morocco;1;34-47N;001-56W;34-47N;001-57W;468;470;P
+GMFZ;60;127;Taza;;Morocco;1;34-13N;004-00W;34-13N;004-00W;509;510;P
+GMMC;60;155;Casablanca;;Morocco;1;33-34N;007-40W;33-34N;007-40W;62;62;P
+GMME;60;135;Rabat-Sale;;Morocco;1;34-03N;006-46W;34-03N;006-46W;84;75;P
+GMMF;60;060;Sidi Ifni;;Morocco;1;29-22N;010-11W;29-22N;010-11W;58;66;P
+GMMI;60;220;Essaouira;;Morocco;1;31-31N;009-47W;31-31N;009-47W;15;8;P
+GMML;--;---;Laayoune/Hassan Isl;;Morocco;1;27-10N;013-12-59W;;;6;;
+GMMN;60;156;Nouasseur;;Morocco;1;33-22N;007-35W;;;200;206;P
+GMMS;60;185;Safi;;Morocco;1;32-17N;009-14W;32-17N;009-14W;52;45;P
+GMMW;--;---;Nador/Arwi;;Morocco;1;34-59-20N;003-01-42W;;;175;;
+GMMX;60;230;Marrakech;;Morocco;1;31-37N;008-02W;31-37N;008-02W;468;466;P
+GMMY;60;120;Kenitra;;Morocco;1;34-18N;006-36W;;;5;14;P
+GMMZ;60;265;Ouarzazate;;Morocco;1;30-56N;006-54W;30-56N;006-54W;1139;1140;P
+GMTA;60;107;Al Hoceima;;Morocco;1;35-11N;003-51W;35-11N;003-51W;27;14;P
+GMTN;60;318;Tetuan / Sania Ramel;;Morocco;1;35-35N;005-20W;;;10;10;P
+GMTT;60;101;Tanger Aerodrome ;;Morocco;1;35-44N;005-54W;35-44N;005-54W;19;21;P
+GOGG;61;695;Ziguinchor;;Senegal;1;12-33N;016-16W;12-33N;016-16W;26;23;P
+GOGK;61;698;Kolda;;Senegal;1;12-53N;014-58W;;;10;10;P
+GOGS;61;697;Cap-Skirring;;Senegal;1;12-24N;016-45W;;;16;13;
+GOOD;61;666;Diourbel;;Senegal;1;14-39N;016-14W;;;7;9;P
+GOOG;61;627;Linguere;;Senegal;1;15-23N;015-07W;;;20;21;P
+GOOK;61;679;Kaolack;;Senegal;1;14-08N;016-04W;;;6;7;P
+GOOY;61;641;Dakar / Yoff;;Senegal;1;14-44N;017-30W;14-44N;017-30W;27;24;P
+GOSM;61;630;Matam;;Senegal;1;15-39N;013-15W;;;15;17;P
+GOSP;61;612;Podor;;Senegal;1;16-39N;014-58W;;;6;7;P
+GOSS;61;600;Saint-Louis;;Senegal;1;16-03N;016-27W;16-03N;016-27W;4;4;P
+GOTK;61;699;Kedougou;;Senegal;1;12-34N;012-13W;;;178;167;P
+GOTT;61;687;Tambacounda;;Senegal;1;13-46N;013-41W;13-46N;013-41W;49;50;P
+GQNA;61;499;Aioun El Atrouss;;Mauritania;1;16-42N;009-36W;16-42N;009-36W;223;223;P
+GQNB;61;461;Boutilimit;;Mauritania;1;17-32N;014-41W;;;77;75;P
+GQND;61;450;Tidjikja;;Mauritania;1;18-34N;011-26W;;;396;402;P
+GQNF;61;498;Kiffa;;Mauritania;1;16-38N;011-24W;16-38N;011-24W;115;115;P
+GQNI;61;497;Nema;;Mauritania;1;16-36N;007-16W;16-36N;007-16W;269;269;P
+GQNJ;61;437;Akjoujt;;Mauritania;1;19-45N;014-22W;;;123;120;P
+GQNK;61;492;Kaedi;;Mauritania;1;16-09N;013-31W;;;18;18;
+GQNN;61;442;Nouakchott;;Mauritania;1;18-06N;015-57W;18-06N;015-57W;2;3;P
+GQNR;61;489;Rosso;;Mauritania;1;16-30N;015-49W;;;5;6;P
+GQPA;61;421;Atar;;Mauritania;1;20-31N;013-04W;20-31N;013-04W;226;224;P
+GQPP;61;415;Nouadhibou;;Mauritania;1;20-56N;017-02W;20-56N;017-02W;5;3;P
+GQPT;61;401;Bir Moghrein;;Mauritania;1;25-14N;011-37W;25-14N;011-37W;364;360;P
+GSVO;60;096;Villa Cisneros;;Western Sahara;1;23-42N;015-52W;23-42N;015-56W;10;10;P
+GUCY;61;832;Conakry / Gbessia;;Guinea;1;09-34N;013-37W;09-34N;013-38W;26;26;
+GUFH;61;833;Faranah / Badala;;Guinea;1;10-02N;010-45W;;;458;459;
+GUID;61;818;Kindia;;Guinea;1;10-03N;012-52W;;;458;459;
+GUKU;61;834;Kissidougou;;Guinea;1;09-11N;010-06W;;;525;525;
+GULB;61;809;Labe;;Guinea;1;11-19N;012-18W;11-19N;012-18W;1025;1026;
+GUMA;61;847;Macenta;;Guinea;1;08-32N;009-28W;;;543;544;
+GUNZ;61;849;N'Zerekore;;Guinea;1;07-44N;008-50W;;;470;470;
+GUOK;61;816;Boke;;Guinea;1;10-56N;014-19W;;;69;69;
+GUSI;61;811;Siguiri;;Guinea;1;11-26N;009-10W;;;362;366;
+GUXD;61;829;Kankan;;Guinea;1;10-23N;009-18W;10-23N;009-18W;377;384;
+GVAC;08;594;Sal;;Cape Verde;1;16-44N;022-57W;16-44N;022-57W;54;55;P
+HAAB;63;450;Addis Ababa;;Ethiopia;1;08-59N;038-48E;08-59N;038-48E;2355;2324;P
+HAAG;--;---;Agordat ;;Ethiopia;1;15-33N;037-53E;;;626;;
+HAAM;63;500;Arba Minch;;Ethiopia;1;06-04N;037-40E;;;1219;;
+HAAW;--;---;Awash ;;Ethiopia;1;08-59N;040-10E;;;1052;;
+HAAX;--;---;Axum;;Ethiopia;1;14-07N;038-43E;;;2134;;
+HABC;--;---;Baco / Bako ;;Ethiopia;1;05-50N;036-37E;;;1311;;
+HABD;63;332;Bahar Dar;;Ethiopia;1;11-36N;037-24E;;;1820;1805;P
+HADC;63;333;Combolcha;;Ethiopia;1;11-05N;039-43E;;;1864;1916;P
+HADM;63;334;Debremarcos;;Ethiopia;1;10-21N;037-43E;;;2476;2440;P
+HADR;63;471;Dire Dawa;;Ethiopia;1;09-36N;041-52E;;;1146;1146;P
+HAGH;--;---;Ghinnir / Ginir ;;Ethiopia;1;07-09N;040-43E;;;1844;;
+HAGN;63;331;Gondar;;Ethiopia;1;12-32N;037-26E;;;1985;1966;P
+HAGO;63;478;Gode;;Ethiopia;1;05-06N;044-35E;05-06N;044-35E;320;320;P
+HAGR;63;403;Gore;;Ethiopia;1;08-10N;035-33E;;;1974;1974;P
+HAHM;63;451;Harar Meda;;Ethiopia;1;08-44N;039-00E;08-44N;039-00E;1876;1876;P
+HAJJ;63;473;Jiggiga;;Ethiopia;1;09-20N;042-43E;;;1644;1644;P
+HAJM;63;402;Jimma;;Ethiopia;1;07-40N;036-50E;;;1676;1577;P
+HAKD;--;---;Kabre Dare Military ;;Ethiopia;1;06-45N;044-17E;;;550;;
+HALA;63;460;Awassa;;Ethiopia;1;07-04N;038-30E;;;1652;1652;P
+HAMK;63;330;Makale;;Ethiopia;1;13-30N;039-29E;;;2212;2212;P
+HAML;--;---;Masslo / Meslo ;;Ethiopia;1;06-22N;039-50E;;;2274;;
+HAMS;63;023;Massawa;;Ethiopia;1;15-37N;039-27E;;;10;10;P
+HANG;63;533;Neghelli;;Ethiopia;1;05-17N;039-45E;05-17N;039-45E;1455;1455;P
+HASB;63;043;Assab;;Ethiopia;1;13-04N;042-43E;;;14;14;P
+HASO;--;---;Assosa / Asosa ;;Ethiopia;1;10-02N;034-32E;;;1733;;
+HATS;--;---;Tessenei / Teseney ;;Ethiopia;1;15-07N;036-41E;;;615;;
+HBBA;64;390;Bujumbura;;Burundi;1;03-19S;029-19E;03-19S;029-19E;782;783;P
+HCMH;63;170;Hargeisa;;Somalia;1;09-30N;044-05E;;;1326;;
+HCMI;63;160;Berbera;;Somalia;1;10-25N;045-01E;;;9;;
+HCMM;63;260;Mogadiscio;;Somalia;1;02-02N;045-21E;02-02N;045-21E;9;9;P
+HCMN;63;240;Belet Uen;;Somalia;1;04-42N;045-13E;;;173;173;P
+HCMV;63;175;Burao;;Somalia;1;09-30N;045-34E;;;1032;;
+HDAM;--;---;Djibouti \ Ambouli;;Djibouti;1;11-33N;043-10E;;;49;;
+HEAR;62;337;El Arish;;Egypt;1;31-05N;033-49E;31-05N;033-50E;31;32;
+HEAT;62;393;Asyut;;Egypt;1;27-03N;031-01E;27-11N;031-06E;226;70;P
+HEAX;62;318;Alexandria / Nouzha;;Egypt;1;31-12N;029-57E;31-12N;029-57E;-2;7;P
+HEBA;--;---;Alexandria Borg El Arab;;Egypt;1;31-31N;030-10E;;;54;;
+HECA;62;366;Cairo Airport;;Egypt;1;30-08N;031-24E;;;64;74;P
+HEGN;62;463;Hurguada;;Egypt;1;27-09N;033-43E;27-09N;033-43E;16;14;
+HELX;62;405;Luxor;;Egypt;1;25-40N;032-42E;25-40N;032-42E;93;99;P
+HEMM;62;306;Mersa Matruh;;Egypt;1;31-20N;027-13E;31-20N;027-13E;25;30;
+HEPS;62;333;Port Said;;Egypt;1;31-16N;032-18E;31-16N;032-14E;6;6;
+HESH;--;---;Sharm El Sheikhintl;;Egypt;1;27-58N;034-23E;;;50;;
+HESN;62;414;Asswan;;Egypt;1;23-58N;032-47E;23-58N;032-47E;200;194;P
+HETB;--;---;Taba;;Egypt;1;29-35-57N;034-46-36E;;;749;;
+HETR;62;459;El Tor;;Egypt;1;28-14N;032-37E;28-14N;033-37E;21;14;P
+HFFF;63;125;Djibouti;;Djibouti;1;11-33N;043-09E;11-33N;043-09E;13;19;P
+HHAS;63;021;Asmara;;Ethiopia;1;15-17N;038-55E;15-17N;038-55E;2356;2325;P
+HKEL;63;686;Eldoret;;Kenya;1;00-32N;035-17E;00-32N;035-17E;2120;2133;P
+HKEM;63;720;Embu;;Kenya;1;00-30S;037-27E;00-30S;037-27E;1493;1493;P
+HKGA;63;723;Garissa;;Kenya;1;00-28S;039-38E;00-28S;039-38E;138;147;P
+HKIS;--;---;Isiolo ;;Kenya;1;00-21N;037-35E;;;1067;;
+HKJK;--;---;Nairobi/Jomo Kenyatta Airport TWR/APP/NOF/Civil Airlines;;Kenya;1;01-19S;036-55E;;;1624;1624;P
+HKKG;63;687;Kakamega;;Kenya;1;00-17N;034-47E;;;1530;;
+HKKI;63;708;Kisumu;;Kenya;1;00-06S;034-45E;00-06S;034-45E;1157;1146;P
+HKKR;63;710;Kericho;;Kenya;1;00-22S;035-21E;00-22S;035-21E;2184;2184;P
+HKKS;63;709;Kisii;;Kenya;1;00-40S;034-47E;;;1493;;
+HKKT;63;661;Kitale;;Kenya;1;01-01N;035-00E;01-01N;035-00E;1890;1875;P
+HKLO;63;612;Lodwar;;Kenya;1;03-07N;035-37E;03-07N;035-37E;506;515;P
+HKLU;63;772;Lamu;;Kenya;1;02-16S;040-50E;;;6;;P
+HKMA;63;624;Mandera;;Kenya;1;03-56N;041-52E;03-56N;041-52E;230;231;P
+HKMB;63;641;Marsabit;;Kenya;1;02-18N;037-54E;02-18N;037-54E;1219;1345;P
+HKME;63;695;Meru;;Kenya;1;00-05N;037-39E;00-05N;037-39E;1554;1554;P
+HKML;63;799;Malindi;;Kenya;1;03-14S;040-06E;03-14S;040-06E;20;23;P
+HKMO;63;820;Mombasa;;Kenya;1;04-02S;039-37E;04-02S;039-37E;57;55;P
+HKMU;63;766;Makindu;;Kenya;1;02-17S;037-50E;02-17S;037-50E;1000;1000;P
+HKMY;63;619;Moyale;;Kenya;1;03-32N;039-03E;03-32N;039-03E;1097;1097;P
+HKNA;63;740;Nairobi ACC/FIC/RCC/MET/COM/;;Kenya;1;01-19S;036-56E;;;1624;;
+HKNC;63;741;Nairobi / Dagoretti;;Kenya;1;01-18S;036-45E;01-18S;036-45E;1798;1798;P
+HKNI;63;717;Nyeri;;Kenya;1;00-30S;036-58E;00-30S;036-58E;1759;1759;P
+HKNK;63;714;Nakuru;;Kenya;1;00-16S;036-06E;00-16S;036-04E;1901;1901;P
+HKNO;63;737;Narok;;Kenya;1;01-08S;035-50E;01-06S;035-50E;1890;1890;P
+HKNW;63;742;Nairobi / Wilson;;Kenya;1;01-19S;036-49E;;;1683;1679;P
+HKNY;--;---;Nanyuki ;;Kenya;1;00-04S;037-02E;;;1905;;
+HKVO;63;793;Voi;;Kenya;1;03-24S;038-34E;03-24S;038-34E;579;579;P
+HKWJ;63;671;Wajir;;Kenya;1;01-45N;040-04E;01-45N;040-04E;244;244;P
+HLGT;62;212;Ghat;;Libya;1;25-08N;010-09E;25-08N;010-08E;699;693;P
+HLKF;62;271;Kufra;;Libya;1;24-13N;023-18E;24-13N;023-18E;417;436;P
+HLLB;62;053;Benina;;Libya;1;32-06N;020-16E;32-05N;020-16E;131;132;P
+HLLS;62;124;Sebha;;Libya;1;27-01N;014-27E;27-01N;014-26E;435;432;P
+HLLT;62;010;Tripoli Inter-National Airport;;Libya;1;32-40N;013-09E;32-41N;013-10E;80;82;P
+HLTD;62;103;Ghadames;;Libya;1;30-08N;009-30E;30-08N;009-30E;346;347;P
+HRYG;64;381;Gisenyi;;Rwanda;1;01-40S;029-15E;;;1556;1554;P
+HRYR;64;387;Kigali;;Rwanda;1;01-58S;030-07E;01-58S;030-07E;1491;1497;P
+HSAT;62;680;Atbara;;Sudan;1;17-42N;033-58E;17-42N;033-58E;347;345;P
+HSDN;62;650;Dongola;;Sudan;1;19-10N;030-29E;19-10N;030-29E;226;226;P
+HSDZ;62;805;Damazine;;Sudan;1;11-47N;034-23E;11-47N;034-23E;474;470;P
+HSFS;62;760;El Fasher;;Sudan;1;13-37N;025-20E;13-37N;025-20E;733;730;P
+HSGF;62;752;Gedaref;;Sudan;1;14-02N;035-24E;14-02N;035-24E;599;599;P
+HSGN;62;770;Geneina;;Sudan;1;13-29N;022-27E;13-29N;022-27E;805;805;P
+HSKA;62;730;Kassala;;Sudan;1;15-28N;036-24E;15-28N;036-24E;500;500;P
+HSKI;62;772;Kosti;;Sudan;1;13-10N;032-40E;13-10N;032-40E;381;381;P
+HSLI;62;810;Kadugli;;Sudan;1;11-00N;029-43E;;;499;499;P
+HSNL;62;790;Nyala;;Sudan;1;12-03N;024-53E;;;67;674;P
+HSNR;62;762;Sennar;;Sudan;1;13-33N;033-37E;;;418;418;P
+HSOB;62;771;El Obeid;;Sudan;1;13-10N;030-14E;13-10N;030-14E;574;574;P
+HSPN;--;---;Port Sudan International;;Sudan;1;19-26N;037-14E;;;138;;
+HSRN;62;801;Renk;;Sudan;1;11-45N;032-47E;;;282;282;
+HSSJ;62;941;Juba;;Sudan;1;04-52N;031-36E;04-52N;031-36E;460;457;P
+HSSM;62;840;Malakal;;Sudan;1;09-33N;031-39E;09-33N;031-39E;387;388;P
+HSSP;62;641;Port Sudan;;Sudan;1;19-35N;037-13E;19-35N;037-13E;3;2;P
+HSSS;62;721;Khartoum;;Sudan;1;15-36N;032-33E;15-36N;032-33E;382;380;P
+HSSW;62;600;Wadi Halfa;;Sudan;1;21-49N;031-29E;21-48N;031-31E;183;183;P
+HTAR;63;789;Arusha;;Tanzania;1;03-20S;036-37E;03-20S;036-37E;1387;1387;P
+HTBU;63;729;Bukoba;;Tanzania;1;01-20S;031-49E;01-20S;031-49E;1137;1137;P
+HTDA;63;894;Dar Es Salaam Airport;;Tanzania;1;06-52S;039-12E;06-52S;039-12E;55;55;P
+HTDO;63;862;Dodoma;;Tanzania;1;06-10S;035-46E;06-10S;035-46E;1119;1120;P
+HTIR;63;887;Iringa;;Tanzania;1;07-40S;035-45E;07-40S;035-45E;1426;1428;P
+HTKA;63;801;Kigoma;;Tanzania;1;04-53S;029-38E;04-53S;029-38E;882;885;P
+HTKI;--;---;Kilwa Masoko ;;Tanzania;1;08-56S;039-31E;;;18;;
+HTKJ;63;791;Kilimanjaro Airport;;Tanzania;1;03-25S;037-04E;03-25S;037-04E;891;896;P
+HTMB;63;932;Mbeya;;Tanzania;1;08-56S;033-28E;08-56S;033-28E;1704;1707;P
+HTMG;63;866;Morogoro;;Tanzania;1;06-50S;037-39E;06-50S;037-39E;526;526;P
+HTMO;63;818;Mombo;;Tanzania;1;04-53S;038-17E;04-55S;038-14E;511;411;
+HTMS;63;790;Moshi;;Tanzania;1;03-21S;037-20E;;;854;831;P
+HTMT;63;971;Mtwara;;Tanzania;1;10-16S;040-11E;10-16S;040-11E;113;113;P
+HTMU;63;733;Musoma;;Tanzania;1;01-30S;033-48E;;;1147;1147;P
+HTMW;63;756;Mwanza;;Tanzania;1;02-28S;032-55E;02-28S;032-55E;1139;1140;P
+HTNA;63;969;Nachingwea;;Tanzania;1;10-21S;038-45E;;;463;465;
+HTPE;63;845;Pemba / Karume Airport;;Tanzania;1;05-15S;039-49E;;;25;;
+HTSE;63;816;Same;;Tanzania;1;04-05S;037-43E;04-05S;037-43E;872;872;P
+HTSO;63;962;Songea;;Tanzania;1;10-41S;035-35E;10-41S;035-35E;1067;1067;P
+HTSY;--;---;Shinyanga;;Tanzania;1;03-30S;033-00E;;;1100;;
+HTTB;63;832;Tabora Airport;;Tanzania;1;05-05S;032-50E;05-05S;032-50E;1181;1190;P
+HTTG;63;844;Tanga;;Tanzania;1;05-05S;039-04E;05-05S;039-04E;39;35;P
+HTZA;63;870;Zanzibar / Kisauni;;Tanzania;1;06-13S;039-13E;;;15;15;P
+HUAR;63;602;Arua;;Uganda;1;03-03N;030-55E;03-03N;030-55E;1204;1211;P
+HUEN;63;705;Entebbe Airport;;Uganda;1;00-03N;032-27E;00-03N;032-27E;1155;1155;P
+HUFP;--;---;Fort Portal ;;Uganda;1;00-40N;030-17E;;;1533;;
+HUGU;63;630;Gulu;;Uganda;1;02-45N;032-20E;02-45N;032-20E;1104;1105;P
+HUJI;63;682;Jinja;;Uganda;1;00-27N;033-11E;;;1175;1173;P
+HUKB;63;726;Kabale;;Uganda;1;01-15S;029-59E;01-15S;029-59E;1867;1869;P
+HUKS;63;674;Kasese;;Uganda;1;00-11N;030-06E;00-11N;030-06E;959;961;P
+HULI;--;---;Lira;;Uganda;1;02-15N;032-54E;;;1091;;
+HUMA;63;702;Mbarara;;Uganda;1;00-37S;030-39E;00-37S;030-39E;1412;1413;P
+HUMI;63;654;Masindi;;Uganda;1;01-41N;031-43E;01-41N;031-43E;1146;1147;P
+HUMO;--;---;Moroto ;;Uganda;1;02-32N;034-39E;;;1280;;
+HUSO;63;658;Soroti;;Uganda;1;01-43N;033-37E;01-43N;033-37E;1132;1123;P
+HUTO;63;684;Tororo;;Uganda;1;00-41N;034-10E;00-41N;034-10E;1170;1171;P
+K01R;74;755;Claiborne Range, Airways Facilities Sector ;LA;United States;4;31-08N;092-34W;31-11N;092-38W;67;67;
+K01T;--;---;High Island;LA;United States;4;28-08N;094-24W;;;30;;
+K03Y;--;---;Hallock;MN;United States;4;48-47N;096-57W;;;250;;
+K04V;--;---;Saguache, Saguache Municipal Airport;CO;United States;4;38-05-50N;106-10-07W;;;2385;;
+K05F;--;---;Gatesville, City-County Airport;TX;United States;4;31-25-16N;097-47-49W;;;276;;
+K07G;--;---;Charlotte, Fitch H Beach Airport;MI;United States;4;42-34-28N;084-48-41W;;;271;;
+K07S;--;---;Deer Park, Deer Park Airport;WA;United States;4;47-58-27N;117-25-42W;47-57-44N;117-26-06W;672;668;
+K0B9;--;---;Goat Island Remote Automatic Meteorological Observing System ;ME;United States;4;43-20N;070-24W;;;12;;
+K0D1;--;---;South Haven, South Haven Area Regional Airport;MI;United States;4;42-21-03N;086-15-22W;;;203;;
+K0E4;--;---;Payson;AZ;United States;4;34-14N;111-20W;;;1498;;
+K0J4;--;---;Florala, Florala Municipal Airport;AL;United States;4;31-02-33N;086-18-42W;31-02-55N;086-18-69W;96;;
+K0L3;--;---;Zuma Beach;CA;United States;4;34-01N;118-49W;;;6;;
+K0V1;--;---;Custer, Custer County Airport;SD;United States;4;43-43-59N;103-36-41W;43-44-00N;103-36-50W;1711;1725;
+K0W8;--;---;Chincoteague;VA;United States;4;37-56N;075-23W;;;2;;
+K0Y2;--;---;Sturgeon Bay;WI;United States;4;44-47N;087-19W;;;176;;
+K11J;--;---;Blakely, Early County Airport;GA;United States;4;31-23-49N;084-53-42W;;;65;;
+K11R;--;---;Brenham, Brenham Municipal Airport;TX;United States;4;30-13-08N;096-22-27W;;;94;;
+K12B;--;---;New Castles Coast Guard Light Station;NH;United States;4;43-07N;070-29W;;;1;;
+K12C;--;---;Rochelle, Rochelle Municipal-Koritz Field Airport;IL;United States;4;41-53-35N;089-04-42W;;;238;;
+K12N;--;---;Andover, Aeroflex-Andover Airport;NJ;United States;4;41-00-32N;074-44-12W;41-00-29N;074-44-22W;177;177;
+K13A;--;---;Nogales Automatic Meteorological Observing System;AZ;United States;4;31-25N;110-51W;;;1198;;
+K13G;--;---;Niagara Coast Guard Station;NY;United States;4;43-16N;079-04W;;;82;;
+K14B;--;---;Great Duck Island Coast Guard Light Station;ME;United States;4;44-09N;068-15W;;;1;;
+K14C;--;---;Frankfort Coast Guard Station;MI;United States;4;44-38N;086-15W;;;174;;
+K14R;--;---;Caldwell, Caldwell Municipal Airport;TX;United States;4;30-30-55N;096-42-14W;;;119;;
+K15B;--;---;Halfway Rock Coast Guard Light Station;ME;United States;4;43-39N;070-02W;;;1;;
+K15C;--;---;Milwaukee Coast Guard Light Station;WI;United States;4;43-01N;087-57W;;;179;;
+K16B;--;---;Heron Neck Coast Guard Light Station;ME;United States;4;44-02N;068-52W;;;1;;
+K16C;--;---;Kenosha Coast Guard Station;WI;United States;4;42-35N;087-45W;;;223;;
+K17C;--;---;Ludington Coast Guard Station;MI;United States;4;43-57N;086-28W;;;182;;
+K17W;--;---;Wadena, Wadena Municipal Airport;MN;United States;4;46-26-48N;095-12-42W;;;418;;
+K17Y;--;---;Mc Gregor, Isedor Iverson Airport;MN;United States;4;46-37-07N;093-18-35W;;;374;;
+K18B;--;---;Monhegan / Manana Island;ME;United States;4;43-46N;069-20W;;;1;;
+K18C;--;---;Michigan City Coast Guard Station;IN;United States;4;41-43N;086-55W;;;177;;
+K18N;--;---;New London Ledge Coast Guard Station;CT;United States;4;41-18N;072-05W;;;8;;
+K19C;--;---;Muskegon Coast Guard Station;MI;United States;4;43-14N;086-20W;;;182;;
+K19D;--;---;Mora Municipal Automatic Weather Observing / Reporting System ;MN;United States;4;45-53N;093-16W;;;309;;
+K19G;--;---;Buffalo Coast Guard Station;NY;United States;4;42-53N;078-53W;;;180;;
+K19R;--;---;Ship Shoal Platform;LA;United States;4;28-41N;091-13W;;;18;;
+K1A5;--;---;Franklin, Macon County Airport;NC;United States;4;35-13N;083-25W;;;616;;
+K1A6;--;---;Middlesboro, Middlesboro-Bell County Airport;KY;United States;4;36-36-38N;083-44-14W;;;352;;
+K1B7;--;---;Boothville Heliport;LA;United States;4;29-21N;89-26W;;;1;;
+K1F0;--;---;Ardmore, Ardmore Downtown Executive Airport;OK;United States;4;34-08-49N;097-07-21W;;;257;;
+K1F9;--;---;Bridgeport, Bridgeport Municipal Airport;TX;United States;4;33-10-31N;097-49-42W;;;260;;
+K1G2;--;---;Granite Falls, Granite Falls Municipal Airport/Lenzen-Roe Memorial Field;MN;United States;4;44-45-11N;095-33-21W;;;319;;
+K1G7;--;---;Mississippi Canyon;LA;United States;4;28-47N;089-03W;;;18;;
+K1H2;--;---;Effingham, Effingham County Memorial Airport;IL;United States;4;39-04-14N;088-32-00W;;;179;;
+K1J1;--;---;Saint Simon Island Coast Guard Station;GA;United States;4;31-08N;081-22W;;;1;;
+K1J2;--;---;Tybee Coast Guard Station;GA;United States;4;32-01N;080-51W;;;2;;
+K1J3;--;---;Ponce De Leon Inlet;FL;United States;4;29-04N;080-55W;;;3;;
+K1J4;--;---;Cape San Blas Coast Guard Station;FL;United States;4;29-41N;085-22W;;;2;;
+K1J5;--;---;Santa Rosa Coast Guard Station;FL;United States;4;30-19N;087-15W;;;2;;
+K1K5;72;460;Elkhart / Elkhart-Morton County Airport;KS;United States;4;37-00N;101-53W;;;1102;1102;P
+K1L2;--;---;Santa Monica Pier;CA;United States;4;34-00N;118-30W;;;2;;
+K1M4;--;---;Haleyville, Posey Field Airport;AL;United States;4;34-16-49N;087-36-01W;;;284;;
+K1O5;--;---;Montague;CA;United States;4;41-44N;122-33W;;;770;;
+K1P1;--;---;Plymouth, Plymouth Municipal Airport;NH;United States;4;43-46-45N;071-45-13W;;;154;;
+K1V1;--;---;Rifle Aviation Weather Reporting Station ;CO;United States;4;39-32N;107-48W;;;1622;;
+K1V4;72;614;Saint Johnsbury;VT;United States;4;44-25-10N;072-01-10W;44-25-10N;072-01-10W;212;210;
+K1W9;--;---;Wrightsville Beach;NC;United States;4;34-11N;077-49W;;;3;;
+K20B;--;---;Rockland Coast Guard Station;ME;United States;4;44-06N;069-06W;;;1;;
+K20C;--;---;Saint Joseph Coast Guard Station;MI;United States;4;42-07N;086-29W;;;176;;
+K20G;--;---;Ashtabula Coast Guard Station;OH;United States;4;41-55N;080-48W;;;178;;
+K20J;--;---;West Jonesport Coast Guard Station;ME;United States;4;44-32N;067-37W;;;5;;
+K20V;--;---;Kremmling, Mc Elroy Airfield;CO;United States;4;40-03-13N;106-22-08W;;;2259;;
+K215;--;---;Rantoul, Frank Elliott Field Airport;IL;United States;4;40-17-03N;088-08-03W;;;225;;
+K21C;--;---;Sheboygan Coast Guard Station;WI;United States;4;43-45N;087-42W;;;1;;
+K21G;--;---;Marblehead Coast Guard Station;OH;United States;4;41-33N;082-44W;;;196;;
+K23B;--;---;Seguin Island Coast Guard Light Station;ME;United States;4;43-40N;069-46W;;;1;;
+K23G;--;---;Cleveland Harbor Coast Guard Station;OH;United States;4;41-30N;081-43W;;;181;;
+K24B;--;---;West Quoddy Head Coast Guard Light Station;ME;United States;4;44-48N;066-57W;;;1;;
+K24G;--;---;Toledo Coast Guard Station;OH;United States;4;41-42N;083-27W;;;180;;
+K25B;--;---;Portsmouth Harbor;NH;United States;4;43-04N;070-43W;;;1;;
+K25G;--;---;Erie Coast Guard Station;PA;United States;4;42-07N;080-05W;;;175;;
+K25R;--;---;Edinburg, Edinburg International Airport;TX;United States;4;26-26-31N;098-07-46W;;;24;;
+K26B;--;---;Isle Of Shoals Coast Guard Station;NH;United States;4;42-58N;070-37W;;;1;;
+K26G;--;---;Rochester Coast Guard Light Station;NY;United States;4;43-15N;077-36W;;;82;;
+K27A;--;---;Elberton, Elbert County Airport-Patz Field;GA;United States;4;34-05-42N;082-48-57W;;;184;;
+K27B;--;---;Cape Neddick Coast Guard Light Station;ME;United States;4;43-10N;070-36W;;;12;;
+K27G;--;---;Lorain Coast Guard Station;OH;United States;4;41-28N;082-11W;;;176;;
+K27U;--;---;Salmon;ID;United States;4;45-11N;113-54W;;;1210;;
+K27Y;--;---;Grand Marais Coast Guard Station;MI;United States;4;46-40N;085-59W;;;183;;
+K28G;--;---;Oswego Coast Guard Station;NY;United States;4;43-28N;076-31W;;;78;;
+K28K;--;---;Grncyn Blk52 Supplementary Aviation Weather Reporting Station ;LA;United States;4;27-53N;091-30W;;;1;;
+K28T;--;---;Sabine Pass;TX;United States;4;29-42N;093-57W;;;5;;
+K28Y;--;---;North Manitou Shoal;MI;United States;4;45-01N;085-57W;;;177;;
+K29B;--;---;Boston / Hull Coast Guard Light Station;MA;United States;4;42-19N;070-53W;;;0;;
+K29G;--;---;Ravenna / Portage County;OH;United States;4;41-13N;081-15W;;;365;;
+K29Y;--;---;Devils Island Light Station;WI;United States;4;47-05N;090-44W;;;192;;
+K2B8;--;---;Portland Head Coast Guard Light Station;ME;United States;4;43-37N;070-12W;;;23;;
+K2C2;72;269;White Sands;NM;United States;4;32-23N;106-29W;32-24N;106-22W;1244;1244;
+K2DP;74;695;Dare County Gunnery Range;NC;United States;4;35-40N;075-54W;35-41N;075-54W;3;3;
+K2F8;--;---;Bastrop, Morehouse Memorial Airport;LA;United States;4;32-45-21N;091-52-50W;;;51;;
+K2G6;--;---;Meadville, Port Meadville Airport;PA;United States;4;41-37-33N;080-12-44W;41-37-33N;080-12-39W;426;428;
+K2GL;--;---;Galliano, Galliano Heliport;LA;United States;4;29-24-48N;090-17-56W;;;2;;
+K2H1;--;---;Huntington B. Oil;CA;United States;4;33-34N;118-08W;;;36;;
+K2I4;--;---;Columbus / Bolton Field;OH;United States;4;39-54N;083-08W;;;280;;
+K2I5;--;---;Rantoul, Rantoul Natl Aviation Cntr-Frank Elliott Fld Airp.;IL;United States;4;40-17-37N;088-08-33W;;;225;;
+K2L6;--;---;Marina Del Rey;CA;United States;4;33-58N;118-26W;;;8;;
+K2L7;--;---;Solana Beach;CA;United States;4;32-59N;117-16W;;;5;;
+K2P3;--;---;Paynesville, Paynesville Municipal Airport;MN;United States;4;45-22-20N;094-44-47W;;;360;;
+K2PJ;74;792;Poinsett Range, Sumpter;SC;United States;4;33-51N;080-29W;33-51N;080-29W;68;68;
+K2R8;--;---;Port Aransas, Mustang Beach Airport;TX;United States;4;27-48-41N;097-05-20W;;;2;;
+K2S9;--;---;Willapa Harbor;WA;United States;4;46-42N;123-49W;;;5;;
+K2U7;--;---;Stanley, Stanley Airport;ID;United States;4;44-12-30N;114-56-04W;;;1952;1980;
+K2V9;--;---;Gunnison Aviation Weather Reporting Station ;CO;United States;4;38-36N;106-55W;;;2380;;
+K2WX;--;---;Buffalo;SD;United States;4;45-36-16N;103-32-47W;45-36-16N;103-32-48W;915;915;
+K30B;--;---;Sandwich Coast Guard Station;MA;United States;4;41-47N;070-30W;;;1;;
+K30G;--;---;Saginaw River Coast Guard Station;MI;United States;4;43-38N;083-51W;;;177;;
+K30N;--;---;Faulkner Island Coast Guard Light Station;CT;United States;4;41-13N;072-40W;;;15;;
+K30Y;--;---;Duluth Harbor Coast Guard Station;MN;United States;4;46-46N;092-05W;;;186;;
+K31B;--;---;Chatham Coast Guard Station;MA;United States;4;41-40N;069-57W;;;1;;
+K31F;--;---;Seminole, Gaines County Airport;TX;United States;4;32-40-31N;102-39-09W;;;1010;;
+K31G;--;---;Belle Isle Coast Guard Station;MI;United States;4;42-20N;082-58W;;;177;;
+K31Y;--;---;Eagle Harbor Coast Guard Light Station;MI;United States;4;47-28N;088-10W;;;186;;
+K32N;--;---;Little Gulf Island Light Station;CT;United States;4;41-12N;072-06W;;;6;;
+K32Y;--;---;Portage Coast Guard Station;MI;United States;4;47-14N;088-38W;;;190;;
+K33B;--;---;Buzzards Bay Coast Guard Light Station;MA;United States;4;41-23N;071-02W;;;1;;
+K33G;--;---;Port Huron Coast Guard Station;MI;United States;4;43-00N;082-25W;;;177;;
+K34B;--;---;Gloucester Coast Guard Station;MA;United States;4;42-35N;070-40W;;;1;;
+K34N;--;---;Eatons Neck Coast Guard Station;NY;United States;4;40-57N;073-24W;;;1;;
+K34Y;--;---;Marquette Coast Guard Light Station;MI;United States;4;46-33N;087-23W;;;203;;
+K35B;--;---;Merrimac River Coast Guard Station;MA;United States;4;42-49N;070-52W;;;1;;
+K36B;--;---;Race Point Coast Guard Station;MA;United States;4;42-03N;070-11W;;;1;;
+K36U;--;---;Heber, Heber City Municipal-Russ McDonald Field Airport;UT;United States;4;40-28-55N;111-25-44W;;;1718;;
+K36Y;--;---;Point Betsie / Frankfort;MI;United States;4;44-37N;086-12W;;;183;;
+K37B;--;---;Scituate Coast Guard Station;MA;United States;4;42-12N;070-43W;;;1;;
+K37W;--;---;Erwin, Harnett County Airport;NC;United States;4;35-22-43N;078-44-01W;;;60;;
+K38Y;--;---;Saint Ignace;MI;United States;4;45-51N;084-43W;;;176;;
+K39Y;--;---;Tawas Point Coast Guard Station;MI;United States;4;44-15N;083-26W;;;178;;
+K3A1;--;---;Cullman, Folsom Field Airport;AL;United States;4;34-16-07N;086-51-30W;;;294;;
+K3A6;--;---;Newhall;CA;United States;4;34-22N;118-34W;;;427;;
+K3B1;--;---;Greenville, Greenville Municipal Airport;ME;United States;4;45-27-47N;069-33-06W;45-27-44N;069-35-43W;427;;P
+K3B2;--;---;Marshfield Airport;MA;United States;4;42-06N;070-41W;;;3;;
+K3B6;--;---;Eugene Island 330;LA;United States;4;28-05N;92-42W;;;0;;
+K3B9;--;---;Chester, Chester Airport;CT;United States;4;41-23-02N;072-30-21W;;;127;;
+K3D4;--;---;Frankfort, Frankfort Dow Memorial Field Airport;MI;United States;4;44-37-30N;086-12-02W;;;193;;
+K3DU;--;---;Drummond;MT;United States;4;46-40N;113-09W;;;1202;;
+K3HE;--;---;Howell;MI;United States;4;42-38N;083-59W;;;293;;
+K3HT;--;---;Harlowton;MT;United States;4;46-26N;109-50W;;;1268;;
+K3I2;--;---;Point Pleasant, Mason County Airport;WV;United States;4;38-54-52N;082-05-54W;;;196;;
+K3J7;--;---;Greensboro, Greene County Regional Airport;GA;United States;4;33-35-51N;083-08-20W;;;206;;
+K3KM;--;---;Wichita, Colonel James Jabara Airport;KS;United States;4;37-44-59N;097-13-08W;;;434;;
+K3L3;--;---;Newport Beach;CA;United States;4;33-36N;117-53W;;;3;;
+K3LC;--;---;Lincoln, Logan County Airport;IL;United States;4;40-09-31N;089-20-06W;;;182;;
+K3LF;--;---;Litchfield, Litchfield Municipal Airport;IL;United States;4;39-09-44N;089-40-28W;;;210;;
+K3MW;--;---;Mount Werner;CO;United States;4;40-26-94N;106-44-95W;;;3241;;
+K3O6;--;---;Treasure Island;CA;United States;4;37-48N;122-22W;;;8;;
+K3OI;--;---;Lamoni;IA;United States;4;40-37N;093-57W;;;342;;
+K3R1;--;---;Bay City, Bay City Municipal Airport;TX;United States;4;28-58N;095-51W;;;14;;
+K3RN;74;365;Graying Air Force Range;MI;United States;4;44-50N;084-33W;44-50N;084-33W;387;387;
+K3S2;--;---;Aurora State;OR;United States;4;45-15N;122-46W;;;60;;
+K3SE;--;---;Spencer;IA;United States;4;43-10N;095-09W;;;404;408;P
+K3T1;--;---;Mineola/Quitman, Wood County Airport;TX;United States;4;32-44-31N;095-29-47W;;;132;;
+K3T5;--;---;La Grange, Fayette Regional Air Center Airport;TX;United States;4;29-54-29N;096-57-00W;;;99;;
+K3TH;--;---;Thompson Falls;MT;United States;4;47-36N;115-22W;;;725;;
+K3V8;--;---;Venice Heliport;LA;United States;4;29-07N;089-12W;;;80;;
+K3W4;--;---;Swansboro / Bogue;NC;United States;4;34-39N;077-06W;;;2;;
+K40B;--;---;Clayton Lake;ME;United States;4;46-37N;069-32W;;;314;;
+K40G;--;---;Grand Canyon, Valle Airport;AZ;United States;4;35-39-03N;112-08-46W;;;1829;;
+K40J;--;---;Perry-Foley, Perry-Foley Airport;FL;United States;4;30-04-19N;083-34-25W;30-04-41N;083-34-48W;13;13;
+K40N;--;---;Chester County Airport;PA;United States;4;39-59N;075-52W;;;201;;
+K40Y;--;---;Thunder Bay Island;MI;United States;4;45-04N;083-33W;;;178;;
+K41G;--;---;Bath;MI;United States;4;42-51N;084-29W;;;261;;
+K41I;--;---;Eugene Island;LA;United States;4;28-28N;091-47W;;;30;;
+K43F;--;---;Litchfield Municipal;MN;United States;4;45-06N;094-30W;;;347;;
+K43S;--;---;West Point Coast Guard Light Station;WA;United States;4;47-40N;122-26W;;;4;;
+K44N;--;---;Millbrook / Sky Acres;NY;United States;4;41-42N;073-44W;;;213;;
+K44W;74;696;Diamond Shoals Coast Guard Station;NC;United States;4;35-09N;075-18W;;;1;;
+K44Y;--;---;Sault Ste. Marie Coast Guard Station;MI;United States;4;46-30N;084-20W;;;176;;
+K45B;--;---;Brant Point Coast Guard Station;MA;United States;4;41-17N;070-05W;;;8;;
+K45J;--;---;Rockingham, Rockingham-Hamlet Airport;NC;United States;4;34-53-27N;079-45-32W;;;109;;
+K45N;--;---;Bay Shore / Fire Island;NY;United States;4;40-38N;073-16W;;;5;;
+K45W;--;---;Oracoke Coast Guard Station;NC;United States;4;35-07N;075-59W;;;2;;
+K47A;--;---;Canton, Cherokee County Airport;GA;United States;4;34-18-38N;084-25-26W;;;372;;
+K48I;--;---;Sutton, Braxton County Airport;WV;United States;4;38-41-13N;080-39-06W;;;387;;
+K48N;--;---;Montauk Point Coast Guard Light Station;NY;United States;4;41-04N;071-56W;;;1;;
+K49N;--;---;East Moriches Coast Guard Station;NY;United States;4;40-47N;072-45W;;;1;;
+K49Y;--;---;Preston, Fillmore County Airport;MN;United States;4;43-40-36N;092-10-47W;;;389;;
+K4A9;--;---;Fort Payne, Isbell Field Airport;AL;United States;4;34-28-25N;085-43-17W;;;267;;
+K4BK;--;---;Brookings;OR;United States;4;42-03N;124-17W;;;24;;
+K4BL;--;---;Blanding ;UT;United States;4;37-37N;109-28W;;;1840;;
+K4BM;--;---;Wilkerson Pass;CO;United States;4;39-03-01N;105-30-52W;;;3438;;
+K4BQ;--;---;Broadus ;MT;United States;4;45-26N;105-24W;;;922;;
+K4CB;74;618;Cuddleback Gunnery Range;CA;United States;4;35-16N;117-26W;35-16N;117-26W;864;864;
+K4CR;--;---;Corona / Lincoln;NM;United States;4;34-06N;105-41W;;;1981;;
+K4DG;72;568;Douglas;WY;United States;4;42-45N;105-23W;;;1477;;
+K4F4;--;---;Gilmer, Fox Stephens Field - Gilmer Municipal Airport;TX;United States;4;32-41-56N;094-56-56W;;;127;;
+K4HV;--;---;Hanksville ;UT;United States;4;38-22N;110-43W;;;1314;;
+K4L7;--;---;Hermosa Beach Pier;CA;United States;4;33-52N;118-24W;;;8;;
+K4LW;--;---;Lakeview;OR;United States;4;42-13N;120-21W;;;1455;;
+K4MR;74;638;Melrose Gunnery Range;NM;United States;4;34-18N;103-48W;34-18N;103-48W;1326;1326;
+K4MY;--;---;Moriarty;NM;United States;4;34-59N;106-03W;;;1890;;
+K4O4;--;---;Idabel, Mc Curtain County Regional Airport;OK;United States;4;33-54-33N;094-51-33W;;;144;;
+K4OM;--;---;Omak;WA;United States;4;48-25N;119-32W;;;374;382;P
+K4SL;--;---;Torreon;NM;United States;4;35-48N;107-11W;;;2106;;
+K4SU;74;619;Superior Valley Gunnery Range;CA;United States;4;36-20N;117-06W;36-20N;117-06W;962;962;
+K4SV;--;---;Strevell;ID;United States;4;42-01N;113-15W;;;1612;;
+K4T6;--;---;Midlothian/Waxahachie, Mid-Way Regional Airport;TX;United States;4;32-27-21N;096-54-44W;;;217;;
+K4V5;--;---;Durango Aviation Weather Reporting Station;CO;United States;4;37-17N;107-52W;;;2012;;
+K50N;--;---;Rockaway Coast Guard Station;NY;United States;4;40-34N;073-53W;;;3;;
+K50Q;72;495;Farallon Island;CA;United States;4;37-42N;123-00W;;;12;;
+K51N;--;---;Short Beach Coast Guard Station;NY;United States;4;40-35N;073-33W;;;1;;
+K51Q;--;---;San Francisco Pbs ;CA;United States;4;37-45N;122-42W;;;5;;
+K52N;--;---;Wildwood;NJ;United States;4;39-00N;074-49W;;;2;;
+K52Q;--;---;Davis Point Aviation Weather Reporting Station ;CA;United States;4;38-03N;122-16W;;;18;;
+K53D;--;---;Glenwood;MN;United States;4;45-39N;095-23W;;;423;;
+K53Q;--;---;Pillar Pt / El Granda;CA;United States;4;37-30N;122-30W;;;40;;
+K53S;--;---;Point Wilson Coast Guard Light Station;WA;United States;4;48-07N;122-45W;;;1;;
+K54N;--;---;Manasquan Inl Coast Guard Station;NJ;United States;4;40-06N;074-01W;;;1;;
+K54Q;--;---;Castroville / Moss;CA;United States;4;36-48N;121-48W;;;5;;
+K55D;--;---;Grayling, Grayling AAF Airport;MI;United States;4;44-40-49N;084-43-44W;;;353;;
+K55N;--;---;Atlantic City Coast Guard Station;NJ;United States;4;39-23N;074-25W;;;4;;
+K56N;--;---;Sandy Hook Coast Guard Station;NJ;United States;4;40-28N;074-01W;;;5;;
+K5D3;--;---;Owosso, Owosso Community Airport;MI;United States;4;42-59-34N;084-08-20W;;;224;;
+K5G9;--;---;Lambertville, Toledo Suburban Airport;MI;United States;4;41-44-09N;083-39-19W;;;204;;
+K5I3;--;---;Pikeville Remote Automatic Meteorological Observing System ;KY;United States;4;37-29N;082-31W;;;446;;
+K5J0;--;---;John Day, John Day State Airport;OR;United States;4;44-24-15N;118-57-45W;;;1127;;
+K5L8;--;---;Long Beach ;CA;United States;4;33-46N;118-10W;;;3;;
+K5R0;--;---;East Addition B323;TX;United States;4;28-13N;093-45W;;;26;;
+K5R5;--;---;Wharton, Wharton Regional Airport;TX;United States;4;29-15-15N;096-09-15W;;;31;;
+K5SM;--;---;Sunlight;CO;United States;4;39-25-32N;107-22-45W;;;3232;;
+K5T5;--;---;Hillsboro, Hillsboro Municipal Airport;TX;United States;4;32-05-00N;097-05-50W;;;209;;
+K5T6;--;---;Santa Teresa, Dona Ana County Airport at Santa Teresa;NM;United States;4;31-52-51N;106-42-17W;;;1253;;
+K60Y;--;---;Slayton, Slayton Municipal Airport;MN;United States;4;43-59-12N;095-46-57W;;;495;;
+K61N;--;---;Indian River Coast Guard Station;DE;United States;4;38-37N;075-04W;;;1;;
+K61W;--;---;Annapolis Coast Guard Station;MD;United States;4;38-55N;076-28W;;;8;;
+K62G;--;---;Wilmette Marines;IL;United States;4;42-04N;087-41W;;;183;;
+K62H;--;---;Giddings, Giddings-Lee County Airport;TX;United States;4;30-10-09N;096-58-48W;;;148;;
+K62W;--;---;Cape Henry Coast Guard Light Station;VA;United States;4;36-56N;076-00W;;;1;;
+K63G;--;---;Chicago / Calumet Coast Guard Station;IL;United States;4;41-43N;087-32W;;;180;;
+K63W;--;---;Milford Haven Coast Guard Station;VA;United States;4;37-29N;076-19W;;;1;;
+K64W;--;---;Parramore Beach;VA;United States;4;37-32N;075-37W;;;1;;
+K65W;--;---;Thomas Point Coast Guard Station;MD;United States;4;38-54N;076-26W;;;1;;
+K66W;--;---;Cove Point Coast Guard Light Station;MD;United States;4;38-23N;076-23W;;;1;;
+K67B;--;---;Castle Hill Coast Guard Station;RI;United States;4;41-27N;071-21W;;;15;;
+K67W;--;---;Stillpond Coast Guard Station;MD;United States;4;39-20N;076-06W;;;8;;
+K69R;--;---;Rocksprings, Edwards County Airport;TX;United States;4;29-56-48N;100-10-25W;;;723;;
+K6A3;--;---;Andrews, Andrews-Murphy Airport;NC;United States;4;35-11-40N;083-51-53W;;;518;;
+K6L9;--;---;Huntington Beach;CA;United States;4;33-39N;118-00W;;;35;;
+K6R6;--;---;Dryden, Terrel County Airport;TX;United States;4;30-02-53N;102-12-47W;;;707;701;
+K6R9;--;---;Llano, Llano Municipal Airport;TX;United States;4;30-47-01N;098-39-43W;;;336;;
+K6V3;--;---;Richlands, Tazewell County Airport;VA;United States;4;37-03-49N;081-47-53W;;;808;;
+K75S;--;---;Burlington / Mt Vern;WA;United States;4;48-28N;122-25W;;;43;;
+K76S;--;---;Oak Harbor Airpark;WA;United States;4;48-15N;122-40W;;;58;;
+K77M;--;---;Malta;ID;United States;4;42-19N;113-20W;;;1375;;
+K77W;--;---;Cape Lookout Coast Guard Station;NC;United States;4;34-36N;076-32W;;;4;;
+K78D;--;---;Caro, Tuscola Area Airport;MI;United States;4;43-27-31N;083-26-43W;;;214;;
+K78N;--;---;Reidsville, Rockingham County NC Shiloh Airport;NC;United States;4;36-26-14N;079-51-03W;;;211;;
+K78W;--;---;South Port / Oak Island Coast Guard Station;NC;United States;4;33-53N;078-01W;;;1;;
+K79J;--;---;Andalusia, Andalusia-Opp Municipal Airport;AL;United States;4;31-18-00N;086-23-00W;;;94;94;
+K79W;--;---;Oregon Inlet Coast Guard Station;NC;United States;4;35-46N;075-31W;;;1;;
+K7A9;--;---;Plains / Peterson Field;GA;United States;4;32-05N;084-22W;;;160;;
+K7B5;--;---;West Cameron 560A;LA;United States;4;28-17N;93-11W;;;0;;
+K7BM;--;---;Cottonwood Pass;CO;United States;4;38-46-57N;106-13-05W;;;2995;;
+K7D2;--;---;Troy, Oakland/Troy Airport;MI;United States;4;42-32-34N;083-10-40W;;;222;;
+K7F6;--;---;Clarksville, Clarksville-Red River County Airport;TX;United States;4;33-35-35N;095-03-48W;;;134;;
+K7F9;--;---;Comanche, Comanche County-City Airport;TX;United States;4;31-55N;098-36-01W;;;423;;
+K7R1;--;---;Venice, Venice Heliport;LA;United States;4;29-15-46N;089-21-48W;29-15-45N;089-21-46W;0;3;
+K7R2;--;---;Leeville;LA;United States;4;29-13N;090-14W;;;2;;
+K7R3;--;---;Amelia / Lake Palourd;LA;United States;4;29-42N;091-06W;;;2;;
+K7R4;--;---;Intracoastal City;LA;United States;4;29-47N;092-08W;;;5;;
+K7R5;--;---;Cameron Heliport;LA;United States;4;29-47N;093-18W;;;1;;
+K7R8;--;---;South Marsh Island;LA;United States;4;28-18N;091-59W;;;1;;
+K82S;--;---;Cape Disappointment;WA;United States;4;46-17N;124-03W;;;55;;
+K83S;--;---;Coos Bay Coast Guard Station;OR;United States;4;43-21N;124-20W;;;23;;
+K84J;--;---;Folly Beach Long Range Navigation;SC;United States;4;32-41N;079-53W;;;3;;
+K84Q;--;---;Blunts Reef Coast Guard Station;CA;United States;4;40-26N;124-30W;;;8;;
+K84S;--;---;Grays Harbor Coast Guard Station;WA;United States;4;46-55N;124-06W;;;6;;
+K85J;--;---;Georgetown Coast Guard Light Station;SC;United States;4;33-13N;079-11W;;;8;;
+K85Q;--;---;Santa Cruz Harbor;CA;United States;4;36-58N;122-00W;;;1;;
+K85S;--;---;Siuslaw River Coast Guard Station;OR;United States;4;44-00N;124-07W;;;12;;
+K86J;--;---;Sullivans Island Coast Guard Station;SC;United States;4;32-46N;079-51W;;;3;;
+K86Q;--;---;St George Reef Coast Guard Light Station;CA;United States;4;41-50N;124-24W;;;45;;
+K86S;--;---;Smith Island Coast Guard Light Station;WA;United States;4;48-19N;122-51W;;;1;;
+K87Q;72;390;Point Piedras Blanca;CA;United States;4;35-39-56N;121-17-05W;;;17;27;P
+K87S;--;---;Quillayute River Coast Guard Light Station;WA;United States;4;47-54N;124-38W;;;1;;
+K88Q;--;---;Samoa / Humboldt Bay;CA;United States;4;40-46N;124-14W;;;2;;
+K88S;--;---;Tillamook Bay Coast Guard Station;OR;United States;4;45-34N;123-55W;;;15;;
+K89Q;--;---;Point Arena Coast Guard Light Station;CA;United States;4;38-57N;123-44W;;;18;;
+K8A0;--;---;Albertville, Albertville Municipal Airport;AL;United States;4;34-13-44N;086-15-20W;;;315;;
+K8B9;--;---;Egg Rock Light Station;ME;United States;4;44-21N;068-08W;;;12;;
+K8D3;--;---;Sisseton, Sisseton Municipal Airport;SD;United States;4;45-40-08N;096-59-29W;45-40-04N;096-59-52W;354;354;
+K8F7;--;---;Decatur, Decatur Municipal Airport;TX;United States;4;33-15-16N;097-34-50W;;;319;;
+K8R0;--;---;Pascagoula Coast Guard Station;MS;United States;4;30-22N;088-34W;;;8;;
+K8R1;--;---;Mobile Point Coast Guard Station;AL;United States;4;30-14N;088-02W;;;1;;
+K8R3;--;---;Southwest Pass Coast Guard Station;LA;United States;4;28-55N;089-26W;;;1;;
+K8R5;--;---;Grand Isle Coast Guard Station;LA;United States;4;29-16N;089-57W;;;2;;
+K8R6;--;---;Calcasieu Coast Guard Station;LA;United States;4;29-47N;093-21W;;;1;;
+K8R7;--;---;Sabine Pass Coast Guard Station;TX;United States;4;29-44N;093-52W;;;1;;
+K8R8;--;---;Freeport Coast Guard Station;TX;United States;4;28-57N;095-18W;;;2;;
+K8S0;--;---;Browning, Starr-Browning Airstrip;MT;United States;4;48-36-04N;113-06-53W;;;1419;;
+K8Y2;--;---;Buffalo, Buffalo Municipal Airport;MN;United States;4;45-09-32N;093-50-35W;;;295;;
+K8Y8;--;---;Crane Lake Automatic Weather Observing / Reporting System;MN;United States;4;46-16N;092-34W;;;350;;
+K90S;--;---;Umpqua River Coast Guard Station;OR;United States;4;43-41N;124-10W;;;41;;
+K91Q;--;---;Point Blunt Coast Guard Light Station;CA;United States;4;37-51N;122-25W;;;73;;
+K91S;--;---;Alki Point Coast Guard Light Station;WA;United States;4;47-31N;122-25W;;;1;;
+K92Q;--;---;Bodega Bay Coast Guard Light Station;CA;United States;4;38-19N;123-03W;;;3;;
+K92S;--;---;Cape Blanco Coast Guard Station;OR;United States;4;42-50N;124-34W;;;57;;
+K93Q;--;---;Pigeon Point Coast Guard Light Station;CA;United States;4;37-11N;122-24W;;;1;;
+K93S;--;---;Cape Flattery Coast Guard Light Station;WA;United States;4;48-23N;124-44W;;;26;;
+K94B;--;---;Wood Island Light Station;ME;United States;4;43-27N;070-19W;;;9;;
+K94Q;--;---;Point Bonita Coast Guard Light Station;CA;United States;4;37-48N;122-31W;;;1;;
+K95B;--;---;Cape Vincent Marine Aviation Reporting Station;NY;United States;4;44-07N;076-20W;;;75;;
+K95Q;--;---;Point Pinos Coast Guard Light Station;CA;United States;4;36-38N;121-56W;;;6;;
+K95S;--;---;Yaquina Bay Coast Guard Station;OR;United States;4;44-37N;124-03W;;;1;;
+K96B;--;---;Owl's Head Light Station;ME;United States;4;44-05N;069-02W;;;15;;
+K96Q;--;---;Trinidad Head Coast Guard Light Station;CA;United States;4;41-03N;124-09W;;;58;;
+K96S;--;---;New Dungeness Coast Guard Station;WA;United States;4;48-10N;123-06W;;;12;;
+K97Q;--;---;Point Reyes Coast Guard Station;CA;United States;4;38-00N;123-01W;;;87;;
+K97S;--;---;Point No Point Coast Guard Station;WA;United States;4;47-55N;122-32W;;;1;;
+K98Q;--;---;Rio Vista Coast Guard Light Station;CA;United States;4;38-09N;121-42W;;;1;;
+K99M;--;---;Moorhead, Moorhead Municipal Airport;MN;United States;4;46-50-21N;096-39-47W;;;280;;
+K99Q;--;---;Port Chicago;CA;United States;4;38-02N;122-02W;;;12;;
+K99S;--;---;Point Robinson Coast Guard Light Station;WA;United States;4;47-23N;122-22W;;;0;;
+K9B2;72;612;Newport;VT;United States;4;44-56N;072-12W;;;233;233;
+K9B5;--;---;Bear Island Coast Guard Station;ME;United States;4;44-17N;068-16W;;;12;;
+K9BB;--;---;Wells;NV;United States;4;41-07N;114-58W;;;1722;;
+K9F2;--;---;Fourchon Supplementary Aviation Weather Reporting Station;LA;United States;4;29-06N;090-12W;;;2;;
+K9L0;--;---;Dana Point;CA;United States;4;33-27N;117-41W;;;15;;
+K9L2;--;---;Edwards, Edwards Air Force Auxiliary North Base;CA;United States;4;34-59N;117-51W;;;701;;
+K9R0;--;---;Galveston Coast Guard Station;TX;United States;4;29-20N;094-46W;;;1;;
+K9R1;--;---;Port Aransas Coast Guard Station;TX;United States;4;27-50N;097-04W;;;1;;
+K9V9;72;653;Chamberlain, Chamberlain Municipal Airport;SD;United States;4;43-46-00N;099-19-06W;43-46-00N;099-19-06W;516;519;
+K9W7;--;---;Currituck, Currituck County Airport;NC;United States;4;36-23-56N;076-00-58W;;;5;;
+KA21;--;---;Portage Glacier, Portage Visitor Center;AK;United States;4;60-47-03N;148-50-46W;60-47-59N;148-50-20W;31;28;
+KAAA;--;---;Lincoln, Logan County Airport;IL;United States;4;40-09-31N;089-20-06W;;;182;;
+KAAF;72;220;Apalachicola, Apalachicola;FL;United States;4;29-43-37N;085-01-29W;29-43-20N;085-01-32W;6;5;P
+KAAO;--;---;Wichita, Colonel James Jabara Airport;KS;United States;4;37-44-59N;097-13-08W;37-44-52N;097-13-28W;432;434;
+KAAT;--;---;Alturas;CA;United States;4;41-29-29N;120-33-52W;41-28-59N;120-33-51W;1333;1331;
+KABE;72;517;Allentown, Lehigh Valley International Airport;PA;United States;4;40-39-03N;075-26-57W;40-39-12N;075-25-59W;120;114;
+KABI;72;266;Abilene, Abilene Regional Airport;TX;United States;4;32-24-37N;099-40-54W;32-24-45N;099-40-52W;545;548;P
+KABQ;72;365;Albuquerque, Albuquerque International Airport;NM;United States;4;35-02-30N;106-36-53W;35-02-13N;106-37-18W;1631;1618;P
+KABR;72;659;Aberdeen, Aberdeen Regional Airport;SD;United States;4;45-26-36N;098-24-47W;45-27-25N;098-25-36W;396;400;P
+KABX;--;---;Albuquerque Nexrad;NM;United States;4;35-09N;106-49W;;;1814;;
+KABY;72;216;Albany, Southwest Georgia Regional Airport;GA;United States;4;31-32-08N;084-11-40W;31-32-12N;084-14-3W;60;58;
+KACB;--;---;Bellaire, Antrim County Airport;MI;United States;4;44-59-18N;085-11-54W;;;190;;
+KACK;--;---;Nantucket, Nantucket Memorial Airport;MA;United States;4;41-15-14N;070-03-35W;41-15-26N;070-03-49W;14;16;
+KACP;--;---;Oakdale, Allen Parish Airport;LA;United States;4;30-45-02N;092-41-19W;;;33;;
+KACQ;--;---;Waseca, Waseca Municipal Airport;MN;United States;4;44-04-24N;093-33-11W;;;343;;
+KACT;72;256;Waco, Waco Regional Airport;TX;United States;4;31-37-02N;097-13-40W;31-36-33N;097-13-18W;157;151;P
+KACV;--;---;Arcata / Eureka, Arcata Airport;CA;United States;4;40-58-41N;124-06-31W;40-58-14N;124-06-25W;66;67;
+KACY;72;407;Atlantic City, Atlantic City International Airport;NJ;United States;4;39-27-53N;074-35-12W;39-26-58N;074-34-02W;23;35;P
+KADC;--;---;Wadena, Wadena Municipal Airport;MN;United States;4;46-27-01N;095-12-39W;;;417;;
+KADG;--;---;Adrian, Lenawee County Airport;MI;United States;4;41-52-04N;084-04-46W;41-52-24N;084-04-28W;244;241;
+KADH;--;---;Ada, Ada Municipal Airport;OK;United States;4;34-48-16N;096-40-17W;;;310;;
+KADM;--;---;Ardmore, Ardmore Municipal Airport;OK;United States;4;34-18-11N;097-01-10W;;;232;;
+KADQ;--;---;Kodiak, Kodiak Airport;AK;United States;4;57-45-04N;152-29-08W;57-44-52N;152-29-29W;22;33;
+KADS;--;---;Dallas / Addison Airport;TX;United States;4;32-58N;096-50W;;;196;;
+KADU;--;---;Audubon, Audubon County Airport;IA;United States;4;41-42-04N;094-55-13W;;;392;;
+KADW;74;594;Camp Springs / Andrews Air Force Base;MD;United States;4;38-49N;076-51W;;;86;88;P
+KAEG;--;---;Albuquerque, Double Eagle II Airport;NM;United States;4;35-08-42N;106-47-42W;;;1779;;
+KAEL;--;---;Albert Lea, Albert Lea Municipal Airport;MN;United States;4;43-41N;093-22W;;;384;;
+KAEX;74;754;Alexandria, Alexandria International Airport;LA;United States;4;31-20-05N;092-33-31W;31-19-26N;092-32-37W;27;27;
+KAFF;74;531;Air Force Academy;CO;United States;4;38-58N;104-49W;38-58N;104-49W;2003;1999;
+KAFJ;--;---;Washington, Washington County Airport;PA;United States;4;40-08N;080-17W;;;361;;
+KAFK;--;---;Nebraska City, Nebraska City Municipal Airport;NE;United States;4;40-36N;095-51W;;;354;;
+KAFN;--;---;Jaffrey, Jaffrey Municipal-Silver Ranch Airport;NH;United States;4;42-48-21N;072-00-02W;42-48-23N;072-00-10W;317;313;
+KAFP;--;---;Wadesboro, Anson County Airport;NC;United States;4;35-01-14N;080-04-37W;;;91;;
+KAFW;--;---;Fort Worth, Fort Worth Alliance Airport;TX;United States;4;32-58-24N;097-19-05W;32-59-17N;097-18-39W;220;233;
+KAGC;--;---;Pittsburgh, Allegheny County Airport;PA;United States;4;40-21-17N;079-55-18W;40-20-44N;079-55-37W;382;389;
+KAGR;74;796;Avon Park Gunnery Range;FL;United States;4;27-39N;081-20W;27-39N;081-20W;20;20;
+KAGS;72;218;Augusta, Bush Field;GA;United States;4;33-21-52N;081-57-48W;33-22-18N;081-58-27W;44;44;P
+KAHN;72;311;Athens, Athens Airport;GA;United States;4;33-57-03N;083-19-41W;33-57-05N;083-19-25W;246;244;P
+KAIA;--;---;Alliance, Alliance Municipal Airport;NE;United States;4;42-03-26N;102-48-00W;42-03-51N;102-48-57W;1197;1196;
+KAID;--;---;Anderson Municipal;IN;United States;4;40-07N;085-37W;;;280;;
+KAIG;--;---;Antigo, Langlade County Airport;WI;United States;4;45-09N;089-06W;;;464;;
+KAIO;--;---;Atlantic;IA;United States;4;41-24N;095-03W;;;360;;
+KAIT;--;---;Aitkin, Aitkin Municipal Airport-Steve Kurtz Field;MN;United States;4;46-33N;093-41W;;;367;;
+KAIZ;--;---;Kaiser Lake Ozark, Lee C Fine Memorial Airport;MO;United States;4;38-06N;092-33W;;;265;;
+KAJG;--;---;Mount Carmel, Mount Carmel Municipal Airport;IL;United States;4;38-36-23N;087-43-36W;;;131;;
+KAKH;--;---;Gastonia, Gastonia Municipal Airport;NC;United States;4;35-11-48N;081-09-21W;35-12-01N;081-09-12W;243;243;
+KAKO;--;---;Akron, Akron-Washington County Airport;CO;United States;4;40-10-28N;103-12-52W;40-10-15N;103-12-31W;1431;1421;
+KAKQ;--;---;Wakefield, Wakefield Municipal Airport;VA;United States;4;36-58-53N;077-00-04W;36-58-48N;077-00-08W;34;33;
+KAKR;--;---;Akron, Akron Fulton International Airport;OH;United States;4;41-02-15N;081-27-51W;41-02-17N;081-27-26W;325;363;
+KAKW;--;---;Klawock, Klawock Airport;AK;United States;4;55-34-34N;133-04-34W;55-34-49N;133-04-08W;15;18;
+KALB;72;518;Albany, Albany International Airport;NY;United States;4;42-44-53N;073-48-06W;;;87;;
+KALI;--;---;Alice, Alice International Airport;TX;United States;4;27-44-28N;098-01-37W;27-44-31N;098-01-59W;54;53;
+KALM;--;---;Alamogordo-White;NM;United States;4;32-50N;105-59W;;;1279;;
+KALN;--;---;Alton/St. Louis, St. Louis Regional Airport;IL;United States;4;38-54N;090-03W;;;166;;
+KALO;72;548;Waterloo, Waterloo Municipal Airport;IA;United States;4;42-33-16N;092-24-04W;42-33-00N;092-23-52W;266;264;
+KALS;72;462;Alamosa, San Luis Valley Regional Airport;CO;United States;4;37-26-20N;105-51-41W;37-26-36N;105-51-52W;2297;2299;P
+KALW;--;---;Walla Walla, Walla Walla Regional Airport;WA;United States;4;46-05-42N;118-17-03W;46-05-35N;118-16-55W;367;363;
+KALX;--;---;Alexander City, Thomas C Russell Field Airport;AL;United States;4;32-54-53N;085-57-46W;;;209;;
+KAMA;72;363;Amarillo, Amarillo International Airport;TX;United States;4;35-13-12N;101-43-02W;35-13-58N;101-42-28W;1099;1093;P
+KAMG;--;---;Alma, Bacon County Airport;GA;United States;4;31-32-10N;082-30-24W;31-32-27N;082-30-30W;61;59;
+KAMN;--;---;Alma, Gratiot Community Airport;MI;United States;4;43-19-19N;084-41-16W;;;229;;
+KAMW;--;---;Ames, Ames Municipal Airport;IA;United States;4;41-59-26N;093-37-08W;41-59-57N;093-37-22W;288;279;
+KAMX;--;---;Miami Nexrad;FL;United States;4;25-37N;080-25W;;;34;;
+KANB;--;---;Anniston, Anniston Metropolitan Airport;AL;United States;4;33-35-26N;085-50-51W;33-35-25N;085-51-04W;186;183;
+KAND;--;---;Anderson, Anderson County Airport;SC;United States;4;34-29-52N;082-42-35W;34-30-04N;082-42-54W;238;239;
+KANE;--;---;Minneapolis / Blaine;MN;United States;4;45-09N;093-13W;;;278;;
+KANJ;72;734;Sault Ste. Marie;MI;United States;4;46-28-46N;084-21-26W;46-28-45N;084-21-24W;210;219;P
+KANN;--;---;Annette, Annette Island Airport;AK;United States;4;55-01-49N;131-34-34W;55-01-44N;131-34-38W;36;34;
+KANW;--;---;Ainsworth Municipal;NE;United States;4;42-35N;100-00W;;;789;;
+KAOH;--;---;Lima, Lima Allen County Airport;OH;United States;4;40-42-29N;084-01-17W;40-42-17N;084-01-36W;297;296;
+KAOO;--;---;Altoona, Altoona-Blair County Airport;PA;United States;4;40-18-00N;078-19-01W;40-17-37N;078-19-20W;458;455;
+KAPA;--;---;Denver, Centennial Airport;CO;United States;4;39-33-50N;104-50-54W;39-34-30N;104-50-42W;1793;1775;
+KAPC;--;---;Napa, Napa County Airport;CA;United States;4;38-12-27N;122-16-46W;38-12-28N;122-16-41W;10;13;
+KAPF;--;---;Naples, Naples Municipal Airport;FL;United States;4;26-09N;081-46W;;;2;;
+KAPG;--;---;Phillips Army Air Field / Aberdeen;MD;United States;4;39-28N;076-10W;;;18;;
+KAPN;72;639;Alpena, Alpena County Regional Airport;MI;United States;4;45-04-18N;083-33-52W;45-04-12N;083-33-59W;210;210;
+KAPV;--;---;Apple Valley;CA;United States;4;34-35N;117-11W;;;932;;
+KAQO;--;---;Llano, Llano Municipal Airport;TX;United States;4;30-47-01N;098-39-43W;;;336;;
+KAQP;--;---;Appleton, Appleton Municipal Airport;MN;United States;4;45-13-39N;096-00-15W;;;310;;
+KAQQ;72;220;Apalachicola, Apalachicola;FL;United States;4;29-43-37N;085-01-29W;29-43-20N;085-01-32W;6;5;P
+KAQR;--;---;Atoka, Atoka Municipal Airport;FL;United States;4;34-23-54N;096-08-53W;;;180;;
+KAQV;--;---;Ft. Polk, Peason Ridge;LA;United States;4;31-40N;093-27W;;;111;;
+KAQW;--;---;North Adams, Harriman-And-West Airport;MA;United States;4;42-41-50N;073-10-13W;42-41-50N;073-09-51W;199;201;
+KARA;--;---;New Iberia, Acadiana Regional Airport;LA;United States;4;30-01-44N;091-53-04W;30-01-47N;091-52-35W;7;18;
+KARB;--;---;Ann Arbor, Ann Arbor Municipal Airport;MI;United States;4;42-13-26N;083-44-24W;42-13-31N;083-44-47W;255;251;
+KARG;--;---;Walnut Ridge, Walnut Ridge Regional Airport;AR;United States;4;36-08N;090-55W;;;83;;
+KARL;--;---;Arlington;WY;United States;4;41-42N;106-13W;;;2179;;
+KARM;--;---;Wharton, Wharton Regional Airport;TX;United States;4;29-15-15N;096-09-15W;;;31;;
+KARR;--;---;Aurora, Aurora Municipal Airport;IL;United States;4;41-46-12N;088-28-53W;41-46-05N;088-27-57W;215;215;
+KART;--;---;Watertown, Watertown International Airport;NY;United States;4;43-59-31N;076-01-18W;43-59-38N;076-01-25W;99;100;
+KARV;--;---;Minocqua/Woodruff, Lakeland Airport/Noble F. Lee Memorial Field;WI;United States;4;45-56N;089-44W;;;497;;
+KASD;--;---;Slidell, Slidell Airport;LA;United States;4;30-20-35N;089-49-19W;30-20-25N;089-49-20W;9;8;
+KASE;--;---;Aspen, Aspen-Pitkin County Airport;CO;United States;4;39-13-44N;106-52-10W;39-13-33N;106-52-04W;2382;2354;
+KASG;--;---;Springdale Municipal;AR;United States;4;36-11N;094-07W;;;412;;
+KASH;--;---;Nashua, Boire Field Airport;NH;United States;4;42-46-54N;071-30-53W;;;61;;
+KASJ;--;---;Ahoskie, Tri-County Airport;NC;United States;4;36-17-51N;077-10-15W;;;21;;
+KAST;72;791;Astoria, Astoria Regional Airport;OR;United States;4;46-09-25N;123-52-57W;46-09-22N;123-52-51W;3;3;
+KASW;--;---;Warsaw, Warsaw Municipal Airport;IN;United States;4;41-16-28N;085-50-24W;;;259;;
+KASX;--;---;Ashland, Kennedy Memorial Airport;WI;United States;4;46-32-59N;090-55-06W;46-33-09N;090-54-57W;251;251;
+KATL;72;219;Atlanta, Hartsfield - Jackson Atlanta International Airport;GA;United States;4;33-38-25N;084-25-37W;;;313;;
+KATS;--;---;Artesia, Artesia Municipal Airport;NM;United States;4;32-51-09N;104-28-03W;;;1079;;
+KATT;72;254;Austin City, Austin Camp Mabry;TX;United States;4;30-19N;097-46W;;;200;;P
+KATW;--;---;Appleton / Outagamie;WI;United States;4;44-15N;088-31W;;;280;;
+KATX;--;---;Seattle NEXRAD;WA;United States;4;48-12N;122-30W;;;185;;
+KATY;--;---;Watertown, Watertown Municipal Airport;SD;United States;4;44-54-17N;097-08-58W;44-55-17N;097-09-38W;532;532;
+KAUB;--;---;Auburn University Automatic Meteorological Observing System;AL;United States;4;32-36N;085-30W;;;198;;
+KAUD;--;---;Audubon Park;LA;United States;4;29-56N;090-08W;;;2;;
+KAUG;--;---;Augusta, Augusta State Airport;ME;United States;4;44-19-14N;069-47-50W;44-19-03N;069-47-39W;107;109;
+KAUH;--;---;Aurora, Aurora Municipal Airport;NE;United States;4;40-53-38N;097-59-40W;;;550;;
+KAUM;--;---;Austin Municipal;MN;United States;4;43-40N;092-56W;;;375;;
+KAUN;--;---;Auburn, Auburn Municipal Airport;CA;United States;4;38-57N;121-04W;;;467;;
+KAUO;--;---;Auburn-Opelika Airport;AL;United States;4;32-37N;085-26W;;;236;;
+KAUS;--;---;Austin, Austin-Bergstrom International Airport;TX;United States;4;30-11-40N;097-40-12W;30-11-57N;097-40-13W;165;172;
+KAUW;--;---;Wausau, Wausau Downtown Airport;WI;United States;4;44-55-43N;089-37-36W;44-55-46N;089-37-39W;366;362;
+KAVC;--;---;South Hill, Mecklenburg-Brunswick Regional Airport;VA;United States;4;36-41-19N;078-03-15W;;;135;;
+KAVK;--;---;Alva, Alva Regional Airport;OK;United States;4;36-46-23N;098-40-12W;;;449;;
+KAVL;72;315;Asheville, Asheville Regional Airport;NC;United States;4;35-25-55N;082-32-15W;35-26-04N;082-32-14W;660;670;
+KAVP;72;513;Wilkes-Barre - Scranton, Wilkes-Barre / Scranton International Airport;PA;United States;4;41-20-20N;075-43-36W;41-20-10N;075-43-50W;293;291;
+KAVX;72;292;Avalon, Catalina Airport;CA;United States;4;33-24-18N;118-24-57W;33-24-12N;118-24-48W;488;482;
+KAWG;--;---;Washington;IA;United States;4;41-17N;091-40W;;;230;;
+KAWH;--;---;Wildhorse Reservation / Elko;NV;United States;4;41-40N;115-47W;;;1902;;
+KAWI;--;---;Wainwright, Wainwright Airport;AK;United States;4;70-38-19N;160-00-24W;70-38-19N;160-00-24W;9;8;
+KAWM;--;---;West Memphis, West Memphis Municipal Airport;AR;United States;4;35-08N;090-14W;;;65;;
+KAWO;--;---;Arlington Municipal;WA;United States;4;48-10N;122-10W;;;42;;
+KAXA;--;---;Algona;IA;United States;4;43-05N;094-16W;;;372;;
+KAXN;--;---;Alexandria, Chandler Field;MN;United States;4;45-52-07N;095-23-39W;45-51-55N;095-23-23W;434;433;
+KAXO;--;---;Grand Isle Supplementary Aviation Weather Reporting Station;LA;United States;4;29-15N;089-58W;;;2;;
+KAXS;--;---;Altus, Altus/Quartz Mountain Regional Airport;OK;United States;4;34-41-55N;099-20-17W;;;437;;
+KAYE;--;---;Fort Devens / Ayer;MA;United States;4;42-34N;071-36W;;;82;;
+KAYS;72;213;Waycross / Ware County, Ga;GA;United States;4;31-15N;082-24W;31-15N;082-24W;46;46;P
+KAZC;--;---;Colorado City, Colorado City Municipal Airport;AZ;United States;4;36-57N;113-00W;;;1486;;
+KAZO;--;---;Kalamazoo, Kalamazoo / Battle Creek International Airport;MI;United States;4;42-13-45N;085-32-47W;42-14-22N;085-33-22W;266;272;
+KB23;--;---;Battle Mountain;NV;United States;4;40-36N;116-52W;;;1381;;
+KBAB;--;---;Marysville, Beale Air Force Base;CA;United States;4;39-08N;121-26W;;;34;;
+KBAD;--;---;Barksdale Air Force Base;LA;United States;4;32-30N;093-40W;;;51;;
+KBAF;--;---;Westfield, Barnes Municipal Airport;MA;United States;4;42-09-35N;072-42-46W;42-09-25N;072-43-06W;82;83;
+KBAK;--;---;Columbus / Bakalar ;IN;United States;4;39-16N;085-54W;;;200;;
+KBAX;--;---;Bad Axe, Huron County Memorial Airport;MI;United States;4;43-46-51N;082-59-08W;;;233;;
+KBAZ;--;---;New Braunfels, New Braunfels Municipal Airport;TX;United States;4;29-42-31N;098-02-43W;29-42-20N;098-02-08W;197;195;
+KBBB;--;---;Benson Municipal;MN;United States;4;45-19N;095-39W;;;317;;
+KBBD;--;---;Brady, Curtis Field Airport;TX;United States;4;31-10-45N;099-19-26W;;;557;;
+KBBW;--;---;Broken Bow, Broken Bow Municipal Airport;NE;United States;4;41-26N;099-39W;;;776;;
+KBCB;--;---;Virginia Tech Airport;VA;United States;4;37-13N;080-25W;;;650;;
+KBCE;--;---;Bryce Canyon, Bryce Canyon Airport;UT;United States;4;37-42-23N;112-08-44W;37-42-05N;112-09-16W;2312;2312;
+KBCG;--;---;Butte La Rose;LA;United States;4;30-07N;091-33W;;;10;;
+KBCT;--;---;Boca Raton, Boca Raton Airport;FL;United States;4;26-22-43N;080-06-28W;;;4;;
+KBDE;--;---;Baudette, Baudette International Airport;MN;United States;4;48-43-36N;094-36-44W;48-43-17N;094-36-10W;330;329;
+KBDF;--;---;Bradford / Rinkenberg;IL;United States;4;41-14N;089-37W;;;247;;
+KBDL;72;508;Windsor Locks, Bradley International Airport;CT;United States;4;41-56-17N;072-40-57W;41-55-59N;072-41-12W;53;60;
+KBDR;72;504;Bridgeport, Sikorsky Memorial Airport;CT;United States;4;41-09-30N;073-07-44W;41-09-50N;073-07-40W;3;7;
+KBED;74;490;Bedford, Hanscom Field;MA;United States;4;42-28-06N;071-17-40W;42-27-57N;071-17-22W;40;50;
+KBEH;--;---;Benton Harbor, Southwest Michigan Regional Airport;MI;United States;4;42-07-43N;086-25-42W;42-07-32N;086-25-44W;196;191;
+KBET;--;---;Bethel, Bethel Airport;AK;United States;4;60-47-09N;161-49-35W;60-47-03N;161-50-08W;39;39;
+KBFD;--;---;Bradford, Bradford Regional Airport;PA;United States;4;41-47-55N;078-38-09W;41-47-57N;078-38-24W;653;647;
+KBFF;72;566;Scottsbluff, Heilig Field;NE;United States;4;41-52-01N;103-35-09W;41-52-12N;103-35-36W;1208;1203;
+KBFI;--;---;Seattle, Seattle Boeing Field;WA;United States;4;47-32-45N;122-18-49W;47-31-45N;122-18-11W;5;4;
+KBFL;72;384;Bakersfield, Meadows Field Airport;CA;United States;4;35-26-01N;119-03-24W;35-26-02N;119-03-06W;155;151;
+KBFM;--;---;Mobile, Mobile Downtown Airport;AL;United States;4;30-36-50N;088-03-48W;30-37-37N;088-04-05W;7;20;
+KBFU;--;---;Belle Fourche;WY;United States;4;43-56N;105-27W;;;1422;;
+KBFW;--;---;Silver Bay;MN;United States;4;47-12N;091-24W;;;331;;
+KBGD;--;---;Borger, Hutchinson County Airport;TX;United States;4;35-41-42N;101-23-42W;35-41-43N;101-23-40W;931;927;
+KBGE;--;---;Bainbridge, Decatur County Industrial Air Park Airport;GA;United States;4;30-58N;084-38W;;;43;;
+KBGM;72;515;Binghamton, Binghamton Regional Airport;NY;United States;4;42-12-28N;075-58-53W;42-12-32N;075-58-58W;496;492;P
+KBGR;--;---;Bangor, Bangor International Airport;ME;United States;4;44-47-50N;068-49-07W;44-48-43N;068-49-31W;58;57;
+KBHB;--;---;Bar Harbor, Hancock County-Bar Harbor Airport;ME;United States;4;44-27N;068-22W;;;25;;
+KBHK;--;---;Baker, Baker Municipal Airport;MT;United States;4;46-20-52N;104-15-27W;46-21-22N;104-16-12W;905;902;
+KBHM;72;228;Birmingham, Birmingham International Airport;AL;United States;4;33-33-56N;086-44-42W;33-33-48N;086-44-42W;196;197;P
+KBHX;--;---;Eureka NEXRAD;CA;United States;4;40-30N;124-18W;;;767;;
+KBID;--;---;Block Island, Block Island State Airport;RI;United States;4;41-10N;071-34W;;;33;;
+KBIE;--;---;Beatrice Municipal;NE;United States;4;40-18N;096-45W;;;403;;
+KBIF;--;---;Biggs Army Air Field / Ft. Bliss;TX;United States;4;31-51N;106-23W;;;1204;;
+KBIG;--;---;Delta Junction / Ft. Greely, Allen Army Air Field;AK;United States;4;63-59-37N;145-41-33W;63-59-20N;145-43-05W;389;387;
+KBIH;72;480;Bishop, Bishop Airport;CA;United States;4;37-22-16N;118-21-29W;37-22-15N;118-21-59W;1256;1253;
+KBIJ;--;---;Blakely, Early County Airport;GA;United States;4;31-23-49N;084-53-42W;;;65;;
+KBIL;72;677;Billings, Billings Logan International Airport;MT;United States;4;45-48-25N;108-32-32W;45-48-15N;108-32-09W;1112;1091;P
+KBIS;72;764;Bismarck, Bismarck Municipal Airport;ND;United States;4;46-46-57N;100-45-26W;46-46-20N;100-45-26W;511;503;P
+KBIT;--;---;Bittercreek;WY;United States;4;41-39N;108-35W;;;2160;;
+KBIV;--;---;Holland, Tulip City Airport;MI;United States;4;42-44-46N;086-05-48W;42-44-38N;086-06-56W;209;208;
+KBIX;--;---;Keesler Air Force Base / Biloxi;MS;United States;4;30-25N;088-55W;;;10;;
+KBJC;--;---;Broomfield / Jeffco;CO;United States;4;39-55N;105-07W;;;1724;;
+KBJI;72;755;Bemidji;MN;United States;4;47-30N;094-56W;;;423;420;P
+KBJJ;--;---;Wooster, Wayne County Airport;OH;United States;4;40-52-23N;081-53-12W;40-52-27N;081-52-54W;346;343;
+KBJN;72;282;Las Vegas, Tonopah Range #74 Nellis AFB;NV;United States;4;37-37-02;116-15-51W;;;1756;;
+KBKB;--;---;Ft. Polk, Fullerton Landing Strip;LA;United States;4;31-00N;092-97W;;;94;;
+KBKE;--;---;Baker City, Baker City Municipal Airport;OR;United States;4;44-50-14N;117-48-33W;45-50-27N;117-48-25W;1028;1024;
+KBKF;--;---;Aurora, Buckley Air Force Base Airport;CO;United States;4;39-42-36N;104-45-29W;;;1726;;
+KBKL;--;---;Cleveland, Burke Lakefront Airport;OH;United States;4;41-31-32N;081-40-08W;41-30-44N;081-41-21W;178;184;
+KBKS;--;---;Falfurrias, Brooks County Airport;TX;United States;4;27-12-24N;098-07-16W;;;34;;
+KBKT;--;---;Ft. Pickett / Blackstone;VA;United States;4;37-05N;077-57W;;;130;;
+KBKV;--;---;Brooksville, Hernando County Airport;FL;United States;4;28-28-25N;082-27-16W;28-28-23N;082-27-09W;23;20;
+KBKW;72;412;Beckley, Raleigh County Memorial Airport;WV;United States;4;37-47-42N;081-07-29W;37-47-00N;081-07-16W;763;764;
+KBKX;--;---;Brookings, Brookings Municipal Airport;SD;United States;4;44-18N;096-49W;;;502;;
+KBLF;--;---;Bluefield, Mercer County Airport;WV;United States;4;37-17-45N;081-12-28W;37-17-32N;081-12-33W;871;873;
+KBLH;--;---;Blythe, Blythe Airport;CA;United States;4;33-37-09N;114-43-01W;33-36-48N;114-42-48W;121;119;
+KBLI;--;---;Bellingham, Bellingham International Airport;WA;United States;4;48-47-58N;122-32-21W;48-47-56N;122-32-05W;48;50;
+KBLM;--;---;Belmar-Farmingdale;NJ;United States;4;40-11N;074-08W;;;48;;
+KBLU;--;---;Emigrant Gap, Blue Canyon Nyack Airport;CA;United States;4;39-16-34N;120-42-29W;39-16-32N;120-42-29W;1610;1609;
+KBLV;--;---;Belleville, Scott AFB/MidAmerica Airport;IL;United States;4;38-33N;089-51W;;;140;;
+KBLX;--;---;Billing Yell Nexrad;MT;United States;4;45-51-14N;108-36-22W;;;1116;;
+KBMG;--;---;Bloomington, Monroe County Airport;IN;United States;4;39-08-35N;086-37-00W;39-08-51N;086-36-44W;257;257;
+KBMI;--;---;Bloomington/Normal, Central Illinois Regional Airport at Bloomington-Normal;IL;United States;4;40-28-37N;088-54-57W;;;266;;
+KBML;72;616;Berlin, Berlin Municipal Airport;NH;United States;4;44-34-34N;071-10-43W;44-34-41N;071-10-49W;353;345;
+KBMQ;--;---;Burnet, Burnet Municipal Craddock Field;TX;United States;4;30-44-26N;098-14-07W;30-44-27N;098-14-10W;392;389;
+KBMX;--;---;Birmingham Nexrad;AL;United States;4;33-10N;086-45W;;;231;;
+KBNA;72;327;Nashville, Nashville International Airport;TN;United States;4;36-07-08N;086-41-21W;36-06-59N;086-40-31W;182;210;P
+KBNO;72;683;Burns, Burns Municipal Airport;OR;United States;4;43-35-42N;118-57-23W;43-35-12N;118-57-12W;1263;1264;P
+KBNW;--;---;Boone Municipal;IA;United States;4;42-03N;093-51W;;;354;;
+KBNY;--;---;Burney;CA;United States;4;40-53N;121-40W;;;957;;
+KBOI;72;681;Boise, Boise Air Terminal;ID;United States;4;43-34-00N;116-14-26W;43-34-03N;116-12-40W;871;875;P
+KBOK;--;---;Brookings, Brookings Airport;OR;United States;4;42-04-28N;124-17-24W;;;140;;
+KBOS;72;509;Boston, Logan International Airport;MA;United States;4;42-21-38N;071-00-38W;42-21-51N;071-01-09W;6;54;P
+KBOW;--;---;Bartow Municipal;FL;United States;4;27-57N;081-47W;;;39;;
+KBOX;--;---;Boston Nexrad;MA;United States;4;41-57N;071-08W;;;71;;
+KBPG;--;---;Big Spring, Big Spring McMahon-Wrinkle Airport;TX;United States;4;32-12N;101-31W;;;784;;
+KBPI;72;671;Big Piney, Big Piney-Marbleton Airport;WY;United States;4;42-34-44N;110-06-11W;42-34-41N;110-06-14W;2126;2117;
+KBPK;--;---;Mountain Home, Ozark Regional Airport;AR;United States;4;36-22-14N;092-28-19W;36-22-17N;092-27-42W;282;280;
+KBPP;--;---;Bowman, Bowman Municipal Airport;ND;United States;4;46-11-13N;103-25-41W;;;902;;
+KBPT;72;241;Beaumont / Port Arthur, Southeast Texas Regional Airport;TX;United States;4;29-57-03N;094-01-15W;29-57-27N;094-01-21W;5;5;
+KBQK;--;---;Brunswick / Glynco;GA;United States;4;31-15N;081-28W;;;8;;
+KBRD;--;---;Brainerd, Brainerd-Crow Wing County Regional Airport;MN;United States;4;46-24-17N;094-07-51W;46-23-33N;094-08-24W;373;372;
+KBRL;--;---;Burlington, Burlington Regional Airport;IA;United States;4;40-46-22N;091-07-31W;40-46-55N;091-07-11W;212;211;
+KBRO;72;250;Brownsville, Brownsville / South Padre Island International Airport;TX;United States;4;25-54-51N;097-25-23W;25-54-22N;097-25-54W;7;5;P
+KBRX;--;---;Bordeaux;WY;United States;4;41-56N;104-57W;;;1422
+KBTL;--;---;Battle Creek, Kellogg Airport;MI;United States;4;42-18-45N;085-14-27W;42-18-49N;085-14-19W;290;290;
+KBTM;--;---;Butte, Bert Mooney Airport;MT;United States;4;45-57-17N;112-29-51W;45-57-15N;112-30-05W;1690;1688;
+KBTP;--;---;Butler, Butler County Airport/K W Scholter Field;PA;United States;4;40-47N;079-57W;;;380;;
+KBTR;--;---;Baton Rouge, Baton Rouge Metropolitan, Ryan Field;LA;United States;4;30-32-14N;091-08-49W;30-31-50N;091-08-36W;21;21;
+KBTT;--;---;Bettles, Bettles Airport;AK;United States;4;66-54-58N;151-30-32W;66-54-58N;151-30-33W;196;197;
+KBTV;72;617;Burlington, Burlington International Airport;VT;United States;4;44-28-05N;073-09-01W;44-28-08N;073-09-18W;101;105;P
+KBUF;72;528;Buffalo, Greater Buffalo International Airport;NY;United States;4;42-56-27N;078-44-09W;42-56-21N;078-43-10W;220;225;P
+KBUO;--;---;Beaumont;CA;United States;4;33-56N;116-58W;;;692;;
+KBUR;72;288;Burbank, Burbank-Glendale-Pasadena Airport;CA;United States;4;34-11-59N;118-21-53W;34-11-58N;118-21-11W;236;217;
+KBUU;--;---;Burlington, Burlington Municipal Airport;WI;United States;4;42-41-26N;088-18-17W;;;237;;
+KBUY;--;---;Burlington, Burlington Alamance Regional Airport;NC;United States;4;36-02-52N;079-28-26W;36-03-00N;079-28-46W;188;180;
+KBVE;72;232;Boothville;LA;United States;4;29-20N;089-24W;29-20N;089-24W;0;1;
+KBVI;--;---;Beaver Falls Airport;PA;United States;4;40-46N;080-24W;;;382;;
+KBVN;--;---;Albion, Albion Municipal Airport;NE;United States;4;41-43-42N;098-03-20W;;;551;;
+KBVO;--;---;Bartlesville, Bartlesville Municipal Airport;OK;United States;4;36-46-06N;096-01-34W;36-45-32N;096-00-26W;217;210;
+KBVR;--;---;Beaver Rim;WY;United States;4;42-35N;108-17W;;;2072;;
+KBVS;--;---;Burlington/Mount Vernon, Skagit Regional Airport;WA;United States;4;48-28-15N;122-25-15W;;;44;;
+KBVX;--;---;Batesville, Batesville Regional Airport;AR;United States;4;35-44N;091-39W;;;141;;
+KBVY;--;---;Beverly, Beverly Municipal Airport;MA;United States;4;42-35-01N;070-54-59W;42-35-07N;070-54-46W;33;28;
+KBWD;--;---;Brownwood, Brownwood Regional Airport;TX;United States;4;31-48N;098-57W;;;422;;
+KBWG;--;---;Bowling Green, Bowling Green-Warren County Regional Airport;KY;United States;4;36-57-52N;086-25-10W;36-57-45N;086-25-35W;167;161;
+KBWI;72;406;Baltimore, Baltimore-Washington International Airport;MD;United States;4;39-10-00N;076-41-00W;39-10-44N;076-40-11W;44;59;
+KBWP;--;---;Wahpeton, Harry Stern Airport;ND;United States;4;46-14-38N;096-36-26W;;;295;;
+KBXA;--;---;Bogalusa, George R Carr Memorial Air Field;LA;United States;4;30-48-49N;089-51-53W;;;36;;
+KBYG;--;---;Buffalo, Buffalo Johnson County Airport;WY;United States;4;44-22-53N;106-43-08W;44-22-43N;106-42-55W;1514;1497;
+KBYH;--;---;Eaker Air Force Base;AR;United States;4;35-58N;089-57W;;;78;;
+KBYI;--;---;Burley, Burley Municipal Airport;ID;United States;4;42-32-33N;113-46-17W;42-32-20N;113-46-06W;1265;1264;
+KBYS;74;611;Fort Irwin/Barstow, Bicycle Lake Army Airfield;CA;United States;4;35-17N;116-37W;35-17N;116-37W;716;716;
+KBYY;--;---;Bay City, Bay City Municipal Airport;TX;United States;4;28-58-23N;095-51-48W;;;14;;
+KBZN;--;---;Bozeman, Gallatin Field;MT;United States;4;45-47-17N;111-09-39W;45-46-35N;111-09-15W;1364;1361;
+KC09;--;---;Morris, Morris Municipal-James R Washburn Field Airport;IL;United States;4;41-25-31N;088-25-07W;;;178;;
+KC19;--;---;Holland / Tulip City;MI;United States;4;42-45N;086-06W;;;210;;
+KC52;--;---;Burlington, Burlington Municipal Airport;WI;United States;4;42-41-26N;088-18-17W;;;237;;
+KC58;--;---;Two Rivers Coast Guard Station;WI;United States;4;44-08N;087-33W;;;176;;
+KC73;--;---;Dixon / Walgreen Field;IL;United States;4;41-50N;089-27W;;;240;;
+KC75;--;---;Lacon, Marshall County Airport;IL;United States;4;41-01-09N;089-23-11W;;;173;;
+KC96;--;---;Winter Park Resort ;CO;United States;4;39-53N;105-46W;;;2771;;
+KCAD;--;---;Cadillac / Wexford County;MI;United States;4;44-17N;085-25W;;;398;;
+KCAE;72;310;Columbia, Columbia Metropolitan Airport;SC;United States;4;33-56-31N;081-07-05W;33-56-43N;081-07-22W;71;73;P
+KCAG;72;570;Craig, Craig-Moffat Airport;CO;United States;4;40-29-36N;107-31-25W;40-29-34N;107-31-16W;1888;1887;P
+KCAK;72;521;Akron, Akron-Canton Regional Airport;OH;United States;4;40-55-05N;081-26-33W;40-54-43N;081-26-18W;374;377;
+KCAO;72;360;Clayton, Clayton Municipal Airpark;NM;United States;4;36-26-54N;103-09-11W;36-26-46N;103-09-18W;1513;1514;P
+KCAR;72;712;Caribou, Caribou Municipal Airport;ME;United States;4;46-52-02N;068-00-48W;46-52-06N;068-00-48W;191;191;P
+KCAV;--;---;Clarion;IA;United States;4;42-45N;093-46W;;;354;;
+KCBE;--;---;Cumberland, Greater Cumberland Regional Airport;MD;United States;4;39-36-55N;078-45-39W;;;236;;
+KCBF;--;---;Council Bluffs;IA;United States;4;41-16N;095-46W;;;382;;
+KCBG;--;---;Cambridge Municipal;MN;United States;4;45-34N;093-16W;;;287;;
+KCBM;--;---;Columbus Air Force Base;MS;United States;4;33-39N;088-27W;;;67;;
+KCCO;--;---;Newnan, Newnan Coweta County Airport;GA;United States;4;33-18-44N;084-46-13W;;;296;;
+KCCR;--;---;Concord, Buchanan Field;CA;United States;4;37-59-30N;122-03-07W;37-59-09N;122-03-16W;7;11;
+KCCU;--;---;Copper Mountain, Red Cliff Pass;CO;United States;4;39-28-02N;106-09-01W;;;3680;;
+KCCX;--;---;State College Nexrad;PA;United States;4;40-55N;078-00W;;;758;;
+KCCY;--;---;Charles City;IA;United States;4;43-04N;092-37W;;;343;;
+KCDC;--;---;Cedar City, Cedar City Municipal Airport;UT;United States;4;37-42-24N;113-05-48W;37-42-00N;113-05-30W;1715;1714;
+KCDD;--;---;Crane Lake, Scotts Seaplane Base;MN;United States;4;48-15-59N;92-29-01W;;;341;;
+KCDH;--;---;Camden / Harrell Field;AR;United States;4;33-37N;092-46W;;;40;;
+KCDJ;--;---;Chillicothe, Chillicothe Agri-Science Center;MO;United States;4;39-49N;093-35W;;;234;;
+KCDR;--;---;Chadron, Chadron Municipal Airport;NE;United States;4;42-50-15N;103-05-43W;42-49-44N;103-05-50W;1005;1010;
+KCDS;--;---;Childress, Childress Municipal Airport;TX;United States;4;34-25-39N;100-17-00W;34-25-39N;100-16-58W;595;594;
+KCDV;--;---;Cordova, Smith Airport;AK;United States;4;60-29-20N;145-27-04W;60-29-38N;145-28-02W;12;18;
+KCDW;--;---;Caldwell, Essex County Airport;NJ;United States;4;40-52-35N;074-16-59W;40-52-33N;074-16-40W;52;64;
+KCEC;--;---;Crescent City, Jack McNamara Field Airport;CA;United States;4;41-46-49N;124-14-12W;;;17;;
+KCEF;74;491;Chicopee Falls / Westover Air Force Base;MA;United States;4;42-12N;072-32W;;;75;75;
+KCEU;--;---;Clemson, Clemson-Oconee County Airport;SC;United States;4;34-40-20N;082-52-53W;34-40-19N;082-52-49W;272;268;
+KCEW;--;---;Crestview, Sikes Airport;FL;United States;4;30-46-20N;086-31-12W;;;65;55;
+KCEZ;--;---;Cortez, Cortez-Montezuma County Airport;CO;United States;4;37-18-23N;108-37-32W;37-18-14N;108-37-43W;1803;1797;
+KCFE;--;---;Buffalo, Buffalo Municipal Airport;MN;United States;4;45-09-32N;093-50-35W;;;295;;
+KCFS;--;---;Caro, Tuscola Area Airport;MI;United States;4;43-27-31N;083-26-43W;;;214;;
+KCFT;--;---;Clifton/Morenci, Greenlee County Airport;AZ;United States;4;32-57-10N;109-12-37W;;;1162;;
+KCFV;--;---;Coffeyville, Coffeyville Municipal Airport;KS;United States;4;37-05-28N;095-33-59W;37-05-52N;095-34-32W;229;225;
+KCGF;--;---;Cleveland / Cuyahoga;OH;United States;4;41-34N;081-29W;;;268;;
+KCGI;--;---;Cape Girardeau, Cape Girardeau Regional Airport;MO;United States;4;37-13-32N;089-34-42W;37-13-38N;089-33-53W;104;102;
+KCGX;--;---;Chicago / Meigs;IL;United States;4;41-52N;087-36W;;;181;;
+KCGZ;--;---;Casa Grande, Casa Grande Municipal Airport;AZ;United States;4;32-57N;111-46W;;;446;;
+KCHA;72;324;Chattanooga, Lovell Field;TN;United States;4;35-02-00N;085-12-00W;35-01-31N;085-12-06W;207;210;P
+KCHD;--;---;Chandler, Chandler Municipal Airport;AZ;United States;4;33-16-09N;111-48-40W;;;379;;
+KCHH;74;494;Chatham;MA;United States;4;41-40N;069-58W;41-40N;069-58W;14;16;
+KCHI;--;---;Chicago Weather Service Forecast Office;IL;United States;4;42-00N;087-53W;;;181;;
+KCHK;--;---;Chickasha, Chickasha Municipal Airport;OK;United States;4;35-05-46N;097-57-58W;;;351;;
+KCHO;--;---;Charlottesville, Charlottesville-Albemarle Airport;VA;United States;4;38-08-18N;078-27-21W;38-08-19N;078-27-00W;195;192;
+KCHS;72;208;Charleston, Charleston Air Force Base;SC;United States;4;32-53-56N;080-02-26W;32-53-40N;080-01-40W;14;13;P
+KCIC;--;---;Chico Municipal ;CA;United States;4;39-48N;121-51W;;;73;;
+KCID;--;---;Cedar Rapids, The Eastern Iowa Airport;IA;United States;4;41-53-04N;091-42-38W;;;263;;
+KCIN;--;---;Carroll;IA;United States;4;42-03N;094-47W;;;375;;
+KCIR;--;---;Cairo, Cairo Regional Airport;IL;United States;4;37-03-52N;089-13-10W;;;98;;
+KCIU;--;---;Sault Ste Marie, Chippewa County International Airport;MI;United States;4;46-15N;084-28W;;;244;;
+KCJR;--;---;Culpeper, Culpeper County Airport;VA;United States;4;38-31-36N;077-51-32W;;;95;;
+KCKB;--;---;Clarksburg, Clarksburg Benedum Airport;WV;United States;4;39-18-00N;080-13-29W;39-18-00N;080-13-45W;366;360;
+KCKC;--;---;Grand Marais, Grand Marais/Cook County Airport;MN;United States;4;47-50-18N;090-22-59W;;;548;;
+KCKL;72;229;Centreville;AL;United States;4;32-54N;087-15W;32-54N;087-15W;140;140;P
+KCKN;--;---;Crookston Municipal Field;MN;United States;4;47-51N;096-37W;;;273;;
+KCKP;--;---;Cherokee, Cherokee Municipal Airport;IA;United States;4;42-43-54N;095-33-21W;;;374;;
+KCKV;--;---;Clarksville, Outlaw Field Airport;TN;United States;4;36-37-19N;087-24-54W;36-37-18N;087-25-07W;168;165;
+KCLE;72;524;Cleveland, Cleveland-Hopkins International Airport;OH;United States;4;41-24-18N;081-51-10W;41-24-41N;081-51-36W;241;236;P
+KCLI;--;---;Clintonville, Clintonville Municipal Airport;WI;United States;4;44-36-50N;088-43-53W;;;251;;
+KCLK;--;---;Clinton, Clinton Regional Airport;OK;United States;4;35-32-17N;098-55-17W;;;492;;
+KCLL;--;---;College Station, Easterwood Field;TX;United States;4;30-34-56N;096-21-42W;30-35-30N;096-21-30W;97;96;
+KCLM;--;---;Port Angeles, William R. Fairchild International Airport;WA;United States;4;48-07-20N;123-30-19W;48-07-01N;123-29-32W;87;85;
+KCLT;72;314;Charlotte, Charlotte / Douglas International Airport;NC;United States;4;35-12-48N;080-56-55W;35-13-25N;080-56-46W;228;220;P
+KCMA;--;---;Camarillo, Camarillo Airport;CA;United States;4;34-13N;119-05W;;;23;;
+KCMH;72;428;Columbus, Port Columbus International Airport;OH;United States;4;39-59-42N;082-52-35W;40-00-24N;082-53-15W;248;247;P
+KCMI;--;---;Champaign / Urbana, University Of Illinois-Willard Airport;IL;United States;4;40-01-56N;088-16-24W;40-02-24N;088-16-15W;229;228;
+KCMS;--;---;Cemetery Separa;WY;United States;4;41-32N;109-28W;;;1949;;
+KCMX;72;744;Hancock, Houghton County Memorial Airport;MI;United States;4;47-10-06N;088-29-20W;47-10-15N;088-29-46W;334;326;
+KCMY;--;---;Sparta, Sparta / Fort McCoy Airport;WI;United States;4;43-57-30N;090-44-16W;;;255;;
+KCNC;--;---;Chariton;IA;United States;4;41-02N;093-22W;;;320;;
+KCNK;72;458;Concordia, Blosser Municipal Airport;KS;United States;4;39-33-05N;097-39-02W;39-33-00N;097-39-15W;453;447;P
+KCNM;--;---;Carlsbad, Cavern City Air Terminal Airport;NM;United States;4;32-20-15N;104-15-48W;32-20-33N;104-15-07W;1004;985;
+KCNO;--;---;Chino, Chino Airport;CA;United States;4;33-58-32N;117-37-25W;33-58-45N;117-38-19W;198;207;
+KCNU;--;---;Chanute, Chanute Martin Johnson Airport;KS;United States;4;37-40-13N;095-29-03W;37-41-09N;095-29-14W;305;297;
+KCNY;--;---;Moab, Canyonlands Field;UT;United States;4;38-45-36N;109-44-41W;38-45-41N;109-44-22W;1388;1390;
+KCOD;72;670;Cody;WY;United States;4;44-31N;109-01W;;;1551;1553;P
+KCOE;--;---;Coeur d'Alene, Coeur d'Alene Air Terminal;ID;United States;4;47-46N;116-49W;;;707;;
+KCOF;74;795;Cocoa / Patrick Air Force Base;FL;United States;4;28-14N;080-36W;;;3;3;
+KCOI;--;---;Merritt Island, Merritt Island Airport;FL;United States;4;28-20-29N;080-41-07W;;;2;;
+KCON;72;605;Concord, Concord Municipal Airport;NH;United States;4;43-11-43N;071-30-04W;43-12-22N;071-30-36W;105;103;
+KCOQ;--;---;Cloquet, Cloquet Carlton County Airport;MN;United States;4;46-42N;092-30W;;;390;;
+KCOS;72;466;Colorado Springs, City Of Colorado Springs Municipal Airport;CO;United States;4;38-48-57N;104-42-39W;38-48-31N;104-43-14W;1881;1856;
+KCOT;--;---;Cotulla, Cotulla-La Salle County Airport;TX;United States;4;28-27-30N;099-13-13W;28-27-13N;099-13-05W;145;140;
+KCOU;72;445;Columbia, Columbia Regional Airport;MO;United States;4;38-49-01N;092-13-06W;38-49-06N;092-13-14W;271;271;P
+KCPC;--;---;Whiteville, Columbus County Municipal Airport;NC;United States;4;34-16-22N;078-42-54W;;;30;;
+KCPK;--;---;Chesapeake, Chesapeake Municipal Airport;VA;United States;4;36-39-56N;076-19-14W;;;6;;
+KCPR;72;569;Casper, Natrona County International Airport;WY;United States;4;42-53-51N;106-28-23W;42-53-50N;106-27-50W;1630;1621;P
+KCPS;--;---;Cahokia / St. Louis, St. Louis Downtown Airport;IL;United States;4;38-34-15N;090-09-22W;38-34-13N;090-09-41W;126;126;
+KCPT;--;---;Cleburne, Cleburne Municipal Airport;TX;United States;4;32-21-13N;097-26-01W;;;260;;
+KCPW;--;---;Pagosa Springs, Wolf Creek Pass;CO;United States;4;37-27-05N;106-48-01W;;;3584;;
+KCQB;--;---;Chandler, Chandler Municipal Airport;OK;United States;4;35-43-26N;096-49-13W;;;300;;;
+KCQC;--;---;Clines Corners;NM;United States;4;35-00N;105-40W;;;2160;;
+KCQM;--;---;Cook, Cook Municipal Airport;MN;United States;4;47-49-19N;092-41-22W;;;405;;
+KCQN;--;---;Chattanooga / Daisy;TN;United States;4;35-10N;085-09W;;;225;;
+KCQT;--;---;Los Angeles / USC Campus Downtown;CA;United States;4;34-01N;118-17W;;;56;;
+KCQV;--;---;Colville Municipal;WA;United States;4;48-33N;117-53W;;;572;;
+KCQX;--;---;Chatham, Chatham Municipal Airport;MA;United States;4;41-41-15N;069-59-36W;41-41-17N;069-59-32W;20;19;
+KCRE;--;---;North Myrtle Beach, Grand Strand Airport;SC;United States;4;33-48-42N;078-43-26W;33-48-07N;078-34-4W;10;10;
+KCRG;--;---;Jacksonville, Craig Municipal Airport;FL;United States;4;30-20-10N;081-30-53W;30-20-11N;081-30-53W;12;13;
+KCRP;72;251;Corpus Christi, Corpus Christi International Airport;TX;United States;4;27-46-23N;097-30-46W;27-46-26N;097-29-59W;13;16;P
+KCRQ;--;---;Carlsbad, McClellan-Palomar Airport;CA;United States;4;33-07-48N;117-16-33W;33-07-38N;117-16-32W;100;99;
+KCRS;--;---;Corsicana, Campbell Field-Corsicana Municipal Airport;TX;United States;4;32-01-52N;096-23-56W;32-01-42N;096-23-46W;136;133;
+KCRV;--;---;Nederland Mountain, Corona Pass;CO;United States;4;40-03-01N;105-35-02W;;;3538;;
+KCRW;72;414;Charleston, Yeager Airport;WV;United States;4;38-22-46N;081-35-29W;38-21-44N;081-35-24W;299;309;P
+KCSG;--;---;Columbus, Columbus Metropolitan Airport;GA;United States;4;32-30-58N;084-56-32W;32-31-18N;084-56-39W;121;135;
+KCSL;--;---;Camp San Luis Airport ;CA;United States;4;35-20N;120-44W;;;76;;
+KCSM;--;---;Clinton, Clinton-Sherman Airport;OK;United States;4;35-21-24N;099-12-13W;35-21-05N;099-11-50W;585;588;
+KCSQ;--;---;Creston;IA;United States;4;41-01N;094-22W;;;394;;
+KCSV;--;---;Crossville, Crossville Memorial-Whitson Field Airport;TN;United States;4;35-57-05N;085-05-06W;35-57-14N;085-04-59W;573;570;
+KCTB;--;---;Cut Bank, Cut Bank Municipal Airport;MT;United States;4;48-36-30N;112-22-34W;;;1175;;
+KCTD;--;---;Continental Div;WY;United States;4;41-43N;107-47W;;;2146;;
+KCTO;--;---;Calverton / Grumman;NY;United States;4;40-55N;072-47W;;;23;;
+KCTY;72;212;Cross City, Cross City Airport;FL;United States;4;29-33-00N;083-06-19W;29-37-49N;083-06-31W;12;12;P
+KCTZ;--;---;Clinton, Sampson County Airport;NC;United States;4;34-58-32N;078-21-53W;;;45;;
+KCUB;--;---;Columbia, Columbia Owens Downtown Airport;SC;United States;4;33-58-15N;080-59-40W;33-58-22N;080-59-39W;64;56;
+KCUH;--;---;Cushing, Cushing Municipal Airport;OK;United States;4;35-56-59N;096-46-22W;;;279;;
+KCUL;--;---;Carmi, Carmi Municipal Airport;IL;United States;4;38-05-22N;088-07-23W;;;118;;
+KCUT;--;---;Custer, Custer County Airport;SD;United States;4;43-43-59N;103-37-03W;43-44-00N;103-36-50W;1707;1725;
+KCVG;72;421;Covington / Cincinnati, Cincinnati / Northern Kentucky International Airport;KY;United States;4;39-02-35N;084-40-18W;39-03-17N;084-39-40W;273;269;P
+KCVN;--;---;Clovis, Clovis Municipal Airport;NM;United States;4;34-26N;103-05W;;;1285;;
+KCVO;--;---;Corvallis, Corvallis Municipal Airport;OR;United States;4;44-30N;123-17W;;;75;;
+KCVS;--;---;Cannon Air Force Base / Clovis;NM;United States;4;34-23N;103-19W;;;1309;;
+KCVX;--;---;Charlevoix, Charlevoix Municipal Airport;MI;United States;4;45-18-17N;085-16-29W;;;204;;
+KCWA;--;---;Mosinee / Central Wisconsin;WI;United States;4;44-47N;089-40W;;;389;;
+KCWF;--;---;Chenault Airpark;LA;United States;4;30-13N;093-09W;;;4;;
+KCWI;--;---;Clinton, Clinton Municipal Airport;IA;United States;4;41-50N;090-20W;;;216;;
+KCWL;--;---;Calexico, Calexico International Airport;CA;United States;4;32-40-10N;115-30-48W;;;1;;
+KCXO;--;---;Conroe, Montgomery County Airport;TX;United States;4;30-21-24N;095-24-50W;30-21-11N;095-25-30W;74;75;
+KCXY;--;---;Harrisburg, Capital City Airport;PA;United States;4;40-13-02N;076-51-05W;40-13-13N;076-51-14W;106;106;
+KCYS;72;564;Cheyenne, Cheyenne Airport;WY;United States;4;41-09-28N;104-48-25W;41-09-11N;104-48-33W;1876;1865;P
+KCZD;--;---;Cozad Municipal;NE;United States;4;40-52N;100-00W;;;762;;
+KCZK;--;---;Cascade Locks State;OR;United States;4;45-40N;121-53W;;;46;;
+KCZZ;--;---;Campo;CA;United States;4;32-37-34N;116-28-06W;;;807;807;
+KD07;--;---;Faith;SD;United States;4;45-01-55N;102-01-09W;;;787;784;
+KD19;--;---;Luverne, Quentin Aanenson Field Airport;MN;United States;4;43-37-16N;096-12-56W;;;436;;
+KD45;72;756;Warroad;MN;United States;4;48-56N;095-21W;;;328;328;
+KD87;--;---;Harbor Springs, Harbor Springs Airport;MI;United States;4;45-25-32N;084-54-48W;;;209;;
+KD97;--;---;South St. Paul Municipal;MN;United States;4;44-51N;093-09W;;;250;;
+KDAA;--;---;Fort Belvoir;VA;United States;4;38-43N;077-11W;;;21;;
+KDAB;--;---;Daytona Beach, Daytona Beach Regional Airport;FL;United States;4;29-10-38N;081-03-36W;29-10-56N;081-02-53W;10;9;
+KDAG;--;---;Daggett, Barstow-Daggett Airport;CA;United States;4;34-51-13N;116-47-12W;34-51-10N;116-47-30W;587;587;
+KDAL;--;---;Dallas, Dallas Love Field;TX;United States;4;32-51-09N;096-51-20W;32-50-42N;096-51-00W;148;158;
+KDAN;--;---;Danville, Danville Regional Airport;VA;United States;4;36-34-22N;079-20-10W;36-34-32N;079-20-24W;174;175;
+KDAW;--;---;Rochester, Skyhaven Airport;NH;United States;4;43-16-41N;070-55-20W;43-16-56N;070-55-47W;98;100;
+KDAX;--;---;Sacramento Nexrad;CA;United States;4;38-30N;121-41W;;;44;;
+KDAY;72;429;Dayton, Cox Dayton International Airport;OH;United States;4;39-54-22N;084-13-07W;39-54-16N;084-12-20W;307;305;P
+KDBN;--;---;Dublin, W H 'Bud' Barron Airport;GA;United States;4;32-33-52N;082-59-06W;;;94;;
+KDBQ;72;547;Dubuque, Dubuque Regional Airport;IA;United States;4;42-23-52N;090-42-13W;42-24-20N;090-42-20W;328;326;P
+KDCA;72;405;Washington DC, Reagan National Airport;VA;United States;4;38-50-54N;077-02-03W;38-50-56N;077-02-29W;4;18;P
+KDCU;--;---;Decatur, Pryor Field;AL;United States;4;34-39-29N;086-56-36W;34-39-01N;086-56-52W;180;176;
+KDDC;72;451;Dodge City, Dodge City Regional Airport;KS;United States;4;37-46-22N;099-58-11W;37-45-45N;099-58-08W;790;789;P
+KDDH;--;---;Bennington, Bennington Morse State Airport;VT;United States;4;42-53-24N;073-14-47W;42-53-24N;073-14-54W;252;244;
+KDEC;--;---;Decatur, Decatur Airport;IL;United States;4;39-50-04N;088-51-56W;39-50-05N;088-52-37W;208;207;
+KDEE;--;---;Deering, Deering Airport;AK;United States;4;66-04-14N;162-45-30W;66-04-13N;162-45-30W;4;4;
+KDEH;--;---;Decorah;IA;United States;4;43-17N;091-44W;;;353;;
+KDEN;72;565;Denver, Denver International Airport;CO;United States;4;39-49-58N;104-39-27W;39-51-45N;104-40-25W;1655;1640;
+KDEQ;--;---;De Queen, J Lynn Helms Sevier County Airport;AR;United States;4;34-02-49N;094-23-58W;34-02-44N;094-23-58W;108;106;
+KDET;--;---;Detroit, Detroit City Airport;MI;United States;4;42-24-33N;083-00-36W;42-24-35N;083-00-18W;191;190;
+KDEW;--;---;Deer Park, Deer Park Airport;WA;United States;4;47-58-27N;117-25-42W;47-57-44N;117-26-06W;672;668;
+KDFI;--;---;Defiance, Defiance Memorial Airport;OH;United States;4;41-20-11N;084-25-46W;41-20-04N;084-25-40W;215;219;
+KDFW;72;259;Dallas / Fort Worth, Dallas / Fort Worth International Airport;TX;United States;4;32-53-49N;097-01-19W;32-53-07N;097-01-18W;183;174;P
+KDGW;72;568;Douglas, Converse County Airport;WY;United States;4;42-47-39N;105-22-55W;42-47-47N;105-23-06W;1502;1499;
+KDHN;--;---;Dothan, Dothan Regional Airport;AL;United States;4;31-19-17N;085-26-59W;31-18-54N;085-26-51W;122;113;
+KDHS;--;---;Dead Horse;WY;United States;4;44-13N;106-06W;;;1241;;
+KDHT;--;---;Dalhart, Dalhart Municipal Airport;TX;United States;4;36-01-24N;102-32-50W;36-01-16N;102-32-52W;1216;1217;
+KDIK;--;---;Dickinson, Dickinson Municipal Airport;ND;United States;4;46-47-50N;102-48-07W;46-48-11N;102-47-59W;790;788;
+KDIX;--;---;Philadelphia NEXRAD;PA;United States;4;39-57N;074-25W;;;70;;
+KDKB;--;---;De Kalb, De Kalb Taylor Municipal Airport;IL;United States;4;41-55-55N;088-42-30W;;;279;;
+KDKK;--;---;Dunkirk, Chautauqua County / Dunkirk Airport;NY;United States;4;42-29-35N;079-16-33W;42-29-37N;079-16-45W;211;202;
+KDKR;--;---;Crockett, Houston County Airport;TX;United States;4;31-18-25N;095-24-13W;;;106;;
+KDKX;--;---;Knoxville Downtown;TN;United States;4;35-58N;083-52W;;;254;;
+KDLF;--;---;Laughlin, Laughlin Air Force Base Auxiliary Airfield;TX;United States;4;29-07-00N;100-28-00W;;;294;294;
+KDLH;72;745;Duluth, Duluth International Airport;MN;United States;4;46-50-34N;092-13-34W;46-50-22N;092-11-24W;435;435;P
+KDLL;--;---;Baraboo, Baraboo Wisconsin Dells Airport;WI;United States;4;43-31-19N;089-46-15W;;;298;;
+KDLN;--;---;Dillon, Dillon Airport;MT;United States;4;45-15-27N;112-33-16W;45-15-10N;112-33-10W;1597;1591;
+KDLS;--;---;The Dalles, Columbia Gorge Regional / The Dalles Municipal Airport;OR;United States;4;45-37-07N;121-10-02W;45-37-06N;121-10-17W;75;71;
+KDMA;--;---;Davis-Monthan Air Force Base;AZ;United States;4;32-10N;110-53W;;;824;;
+KDMH;--;---;Baltimore, Inner Harbor;MD;United States;4;39-17N;076-37W;;;6;;
+KDMN;--;---;Deming, Deming Municipal Airport;NM;United States;4;32-15-44N;107-43-14W;32-15-19N;107-43-21W;1315;1311;
+KDMO;--;---;Sedalia, Sedalia Memorial Airport;MO;United States;4;38-42-44N;093-10-28W;38-42-15N;093-11-00W;277;274;
+KDMX;--;---;Des Moines Nexrad;IA;United States;4;41-44N;093-43W;;;322;;
+KDNK;--;---;Ft. Polk, Self Strip;LA;United States;4;31-10N;093-00W;;;114;;
+KDNL;--;---;Augusta, Daniel Field;GA;United States;4;33-28-01N;082-02-19W;33-27-56N;082-02-07W;128;130;
+KDNN;--;---;Dalton, Dalton Municipal Airport;GA;United States;4;34-43-18N;084-52-09W;;;216;;
+KDNR;72;469;Denver / Stapleton International, Co.;CO;United States;4;39-47N;104-52W;39-45N;104-52W;1626;1626;P
+KDNS;--;---;Denison;IA;United States;4;41-59N;095-23W;;;388;;
+KDNV;--;---;Danville, Vermilion County Airport;IL;United States;4;40-11-58N;087-35-44W;;;212;;
+KDOV;--;---;Dover Air Force Base;DE;United States;4;39-08N;075-28W;;;9;;
+KDPA;--;---;Chicago / West Chicago, Dupage Airport;IL;United States;4;41-53-47N;088-15-04W;41-54-24N;088-15-20W;231;230;
+KDPG;74;003;Dugway Proving Grounds;UT;United States;4;40-10N;112-56W;40-11N;112-56W;1326;1325;
+KDPL;--;---;Kenansville, Duplin County Airport;NC;United States;4;35-00-00N;077-58-54W;;;42;;
+KDQH;--;---;Douglas, Douglas Municipal Airport;GA;United States;4;31-28-36N;082-51-37W;;;78;;
+KDRA;72;387;Mercury, Desert Rock Airport;NV;United States;4;36-37-14N;116-01-40W;36-37-27N;116-01-06W;1007;1006;P
+KDRC;--;---;Deer Creek;WY;United States;4;42-50N;105-52W;;;1543;;
+KDRI;--;---;De Ridder, Beauregard Parish Airport;LA;United States;4;30-49-54N;093-20-23W;;;63;;
+KDRO;--;---;Durango, Durango-La Plata County Airport;CO;United States;4;37-08-35N;107-45-35W;37-09-34N;107-45-00W;2038;2035;
+KDRT;72;261;Del Rio, Del Rio International Airport;TX;United States;4;29-22-29N;100-55-25W;29-22-28N;100-55-06W;304;313;P
+KDSM;72;546;Des Moines, Des Moines International Airport;IA;United States;4;41-32-16N;093-39-58W;41-32-20N;093-39-25W;291;295;P
+KDSV;--;---;Dansville, Dansville Municipal Airport;NY;United States;4;42-34-10N;077-42-52W;42-34-03N;077-42-51W;201;198;
+KDTL;--;---;Detroit Lakes, Detroit Lakes Airport-Wething Field;MN;United States;4;46-50N;095-53W;;;426;;
+KDTN;--;---;Shreveport, Shreveport Downtown Airport;LA;United States;4;32-32-33N;093-44-41W;32-32-23N;093-44-55W;54;53;
+KDTO;--;---;Denton, Denton Municipal Airport;TX;United States;4;33-12-22N;097-11-56W;33-12-04N;097-11-39W;195;196;
+KDTS;--;---;Destin, Destin-Ft. Walton Beach Airport;FL;United States;4;30-23-36N;086-28-03W;30-23-48N;086-28-17W;6;5;
+KDTW;72;537;Detroit, Detroit Metropolitan Wayne County Airport;MI;United States;4;42-13-53N;083-19-51W;42-12-51N;083-21-13W;194;195;P
+KDTX;--;---;Detroit NEXRAD;MI;United States;4;42-42N;083-27W;;;361;;
+KDUA;--;---;Durant, Eaker Field Airport;OK;United States;4;33-56-32N;096-23-40W;;;213;;
+KDUC;--;---;Duncan, Halliburton Field Airport;OK;United States;4;34-28-15N;097-57-36W;;;339;;
+KDUG;--;---;Douglas Bisbee, Bisbee Douglas International Airport;AZ;United States;4;31-28-09N;109-36-13W;;;1266;;
+KDUH;--;---;Lambertville, Toledo Suburban Airport;MI;United States;4;41-44-09N;083-39-19W;;;204;;
+KDUJ;--;---;Du Bois, Du Bois-Jefferson County Airport;PA;United States;4;41-11N;078-54W;;;555;;
+KDUX;--;---;Dumas, Moore County Airport;TX;United States;4;35-51-28N;102-00-47W;;;1129;;
+KDVL;--;---;Devils Lake, Devils Lake Municipal Airport;ND;United States;4;48-07N;098-55W;;;444;;
+KDVN;--;---;Davenport, Davenport Municipal Airport;IA;United States;4;41-36-50N;090-35-29W;41-36-38N;090-35-06W;229;228;
+KDVP;--;---;Slayton, Slayton Municipal Airport;MN;United States;4;43-59-12N;095-46-57W;;;495;;
+KDVT;--;---;Phoenix, Phoenix-Deer Valley Municipal Airport;AZ;United States;4;33-41-25N;112-03-56W;33-41-08N;112-04-53W;450;443;
+KDWH;--;---;Houston, Hooks Memorial Airport;TX;United States;4;30-04-03N;095-33-22W;30-04-00N;095-33-21W;46;46;
+KDXR;--;---;Danbury, Danbury Municipal Airport;CT;United States;4;41-22-18N;073-29-04W;41-22-21N;073-29-03W;139;139;
+KDXX;--;---;Madison, Madison-Lac Qui Parle County Airport;MN;United States;4;44-59-10N;096-10-40W;;;330;;
+KDYL;--;---;Doylestown, Doylestown Airport;PA;United States;4;40-19-48N;075-07-21W;40-20-01N;075-07-22W;120;117;
+KDYR;--;---;Dyersburg, Dyersburg Municipal Airport;TN;United States;4;36-00N;089-24W;;;103;;
+KDYS;--;---;Abilene, Dyess Air Force Base;TX;United States;4;32-25-12N;099-51-25W;;;545;;
+KDYT;--;---;Duluth, Sky Harbor Airport;MN;United States;4;46-43-19N;092-02-36W;;;186;;
+KE12;--;---;East Cameron 345;LA;United States;4;28-05N;092-42W;;;0;;
+KE15;--;---;Graham, Graham Municipal Airport;TX;United States;4;33-06-36N;098-33-19W;;;342;;
+KE24;--;---;Whiteriver, Whiteriver Airport;AZ;United States;4;33-49N;109-59W;;;1570;;
+KE28;74;733;Northrup Landing Strip;NM;United States;4;33-54N;106-24W;32-54N;106-24W;1193;1193;
+KE29;--;---;Sonora, Sonora Municipal Airport;TX;United States;4;30-35-08N;100-38-54W;;;652;;
+KE33;--;---;Chama;NM;United States;4;36-54N;106-35W;;;2393;;
+KE38;--;---;Alpine, Alpine-Casparis Municipal Airport;TX;United States;4;30-23-03N;103-41-00W;;;1376;;
+KE74;--;---;Safford Automatic Meteorological Observing System;AZ;United States;4;32-49N;109-41W;;;950;;
+KEAA;--;---;Eagle, Eagle Airport;AK;United States;4;64-46-35N;141-09-38W;64-46-35N;141-09-38W;268;273;
+KEAR;--;---;Kearney, Kearney Municipal Airport;NE;United States;4;40-44N;099-00W;;;650;;
+KEAT;--;---;Wenatchee, Pangborn Memorial Airport;WA;United States;4;47-23-56N;120-12-25W;47-24-06N;120-12-21W;381;377;
+KEAU;--;---;Eau Claire, Chippewa Valley Regional Airport;WI;United States;4;44-51-55N;091-29-06W;;;277;;
+KEAX;--;---;Pleasant NEXRAD;MO;United States;4;38-49N;094-16W;;;335;;
+KEBG;--;---;Edinburg, Edinburg International Airport;TX;United States;4;26-26-31N;098-07-46W;;;24;;
+KEBS;--;---;Webster City;IA;United States;4;42-26N;093-52W;;;342;;
+KECG;--;---;Elizabeth City, Elizabeth City Coast Guard Air Station;NC;United States;4;36-15-47N;076-10-58W;36-15-50N;076-10-30W;3;11;
+KECU;--;---;Rocksprings, Edwards County Airport;TX;United States;4;29-56-48N;100-10-25W;;;723;;
+KEDE;--;---;Edenton, Northeastern Regional Airport;NC;United States;4;36-01-40N;076-34-02W;;;6;;
+KEDW;72;381;Edwards Air Force Base;CA;United States;4;34-55N;117-54W;34-54N;117-55W;702;705;
+KEED;--;---;Needles, Needles Airport;CA;United States;4;34-45-58N;114-37-24W;;;300;;
+KEEN;--;---;Keene, Dillant-Hopkins Airport;NH;United States;4;42-54N;072-16W;;;149;;
+KEEO;--;---;Meeker, Meeker Airport;CO;United States;4;40-02-32N;107-53-23W;40-02-25N;107-53-30W;1948;1930;
+KEET;--;---;Alabaster, Shelby County Airport;AL;United States;4;33-10-42N;086-46-54W;33-10-35N;086-46-51W;178;173;
+KEEW;--;---;Neenah;WI;United States;4;44-13N;088-33W;;;275;;
+KEFC;--;---;Belle Fourche, Belle Fourche Municipal Airport;SD;United States;4;44-44N;103-52W;;;972;;
+KEFD;--;---;Houston / Ellington;TX;United States;4;29-36N;095-10W;;;10;;
+KEFT;--;---;Monroe, Monroe Municipal Airport;WI;United States;4;42-36-54N;089-35-27W;;;331;;
+KEGE;--;---;Eagle County Regional;CO;United States;4;39-39N;106-55W;;;1993;;
+KEGI;--;---;Duke Field / Eglin Auxiliary;FL;United States;4;30-39N;086-31W;;;59;;
+KEGV;--;---;Eagle River, Eagle River Union Airport;WI;United States;4;45-55-54N;089-16-09W;;;501;;
+KEHA;--;---;Elkhart, Elkhart-Morton County Airport;KS;United States;4;37-00N;101-53W;;;1104;;
+KEHO;--;---;Shelby, Shelby Municipal Airport;NC;United States;4;35-15N;081-36W;;;258;;
+KEHR;--;---;Henderson City;KY;United States;4;37-49N;087-41W;;;117;;
+KEKA;72;594;Eureka;CA;United States;4;40-48N;124-10W;;;13;18;P
+KEKM;--;---;Elkhart Municipal;IN;United States;4;41-43N;086-00W;;;237;;
+KEKN;72;417;Elkins, Elkins-Randolph County-Jennings Randolph Field;WV;United States;4;38-53-07N;079-51-10W;38-53-01N;079-51-17W;605;603;
+KEKO;--;---;Elko, Elko Regional Airport;NV;United States;4;40-49-30N;115-47-30W;;;1568;1547;
+KEKQ;--;---;Monticello, Wayne County Airport;KY;United States;4;36-51-19N;084-51-22W;;;294;;
+KELD;--;---;El Dorado, South Arkansas Regional at Goodwin Field Airport;AR;United States;4;33-13-15N;092-48-48W;33-13-00N;092-48-37W;84;81;
+KELM;--;---;Elmira, Elmira / Corning Regional Airport;NY;United States;4;42-09-23N;076-54-10W;42-09-45N;076-53-44W;291;302;
+KELN;--;---;Ellensburg, Ellensburg Bowers Field;WA;United States;4;47-02-01N;120-31-45W;47-01-45N;120-32-11W;536;519;
+KELO;--;---;Ely, Ely Municipal Airport;MN;United States;4;47-49N;091-50W;;;444;;
+KELP;72;270;El Paso, El Paso International Airport;TX;United States;4;31-48-40N;106-22-33W;31-47-50N;106-23-28W;1206;1197;P
+KELY;72;486;Ely, Ely Airport;NV;United States;4;39-17-42N;114-50-43W;39-17-35N;114-50-32W;1907;1906;P
+KELZ;--;---;Wellsville, Wellsville Municipal Airport;NY;United States;4;42-06-27N;077-59-04W;42-06-39N;077-59-28W;647;646;
+KEMP;--;---;Emporia, Emporia Municipal Airport;KS;United States;4;38-19-44N;096-11-38W;39-19-45N;096-11-29W;367;367;
+KEMT;--;---;El Monte;CA;United States;4;34-05N;118-02W;;;90;;
+KEMV;--;---;Emporia, Emporia-Greensville Regional Airport;VA;United States;4;36-41-13N;077-28-58W;;;39;;
+KEND;--;---;Vance Air Force Base / Enid;OK;United States;4;36-20N;097-55W;;;398;;
+KENL;--;---;Centralia, Centralia Municipal Airport;IL;United States;4;38-30-53N;089-05-32W;;;163;;
+KENN;--;---;Nenana, Nenana Municipal Airport;AK;United States;4;64-32-52N;149-05-02W;64-32-52N;149-05-02W;110;109;
+KENV;72;581;Wendover / Air Force Auxillary Field;UT;United States;4;40-44N;114-02W;40-44N;114-02W;1291;1292;P
+KENW;--;---;Kenosha, Kenosha Regional Airport;WI;United States;4;42-35-42N;087-56-17W;42-35-40N;087-55-39W;226;219;
+KENX;--;---;Albany NEXRAD;NY;United States;4;42-36N;074-04W;;;581;;
+KEOK;--;---;Keokuk Municipal;IA;United States;4;40-28N;091-26W;;;205;;
+KEPH;--;---;Ephrata, Ephrata Municipal Airport;WA;United States;4;47-18-27N;119-30-57W;47-18-37N;119-31-18W;389;383;
+KEPO;72;608;Eastport;ME;United States;4;44-55N;067-00W;;;24;23;
+KEPZ;72;364;Santa Teresa;NM;United States;4;31-52N;106-42W;31-52N;106-42W;1252;1252;P
+KEQY;--;---;Monroe, Monroe Airport;NC;United States;4;35-01-01N;080-37-14W;35-01-20N;080-37-09W;207;212;
+KERI;72;526;Erie, Erie International Airport;PA;United States;4;42-04-48N;080-10-57W;42-04-59N;080-11-00W;223;222;
+KERV;--;---;Kerrville, Kerrville Municipal Airport/Louis Schreiner Field;TX;United States;4;29-58N;099-05W;;;493;;
+KERY;--;---;Newberry, Luce County Airport;MI;United States;4;46-18-40N;085-27-26W;;;265;;
+KESC;72;648;Escanaba;MI;United States;4;45-45N;087-02W;;;180;187;
+KESF;--;---;Alexandria, Alexandria Esler Regional Airport;LA;United States;4;31-23-42N;092-17-25W;31-23-29N;092-17-41W;34;28;
+KESN;--;---;Easton / Newman Field;MD;United States;4;38-48N;076-04W;;;22;;
+KEST;--;---;Estherville, Estherville Municipal Airport;IA;United States;4;43-24-04N;094-44-50W;43-24-13N;094-44-48W;401;401;
+KESX;--;---;Las Vegas Nexrad;NV;United States;4;35-43N;114-54W;;;1509;;
+KETB;--;---;West Bend, West Bend Municipal Airport;WI;United States;4;43-25-20N;088-07-41W;;;270;;
+KETH;--;---;Wheaton, Wheaton Municipal Airport;MN;United States;4;45-46N;096-32W;;;312;;
+KEUG;72;693;Eugene, Mahlon Sweet Field;OR;United States;4;44-08-00N;123-12-52W;44-07-15N;123-12-40W;111;114;P
+KEUL;--;---;Caldwell, Caldwell Industrial Airport;ID;United States;4;43-38N;116-38W;;;741;;
+KEVB;--;---;New Smyrna Beach, New Smyrna Beach Municipal Airport;FL;United States;4;29-03-20N;080-56-54W;;;3;;
+KEVM;--;---;Eveleth, Eveleth-Virginia Municipal Airport;MN;United States;4;47-25N;092-30W;;;420;;
+KEVV;72;432;Evansville, Evansville Regional Airport;IN;United States;4;38-02-35N;087-31-13W;38-01-53N;087-32-16W;127;117;P
+KEVW;--;---;Evanston, Evanston-Uninta County Burns Field;WY;United States;4;41-16-23N;111-01-50W;41-16-23N;111-01-44W;2183;2177;
+KEWB;--;---;New Bedford, New Bedford Regional Airport;MA;United States;4;41-40-31N;070-57-25W;41-41-04N;070-57-07W;24;23;
+KEWK;--;---;Newton, Newton City/County Airport;KS;United States;4;38-03N;097-17W;;;467;;
+KEWN;--;---;New Bern, Craven County Regional Airport;NC;United States;4;35-04-03N;077-02-50W;35-04-36N;077-02-37W;5;3;
+KEWR;72;502;Newark, Newark International Airport;NJ;United States;4;40-40-57N;074-10-10W;40-42-22N;074-09-36W;5;7;
+KEWX;--;---;San Antonio Nexrad;TX;United States;4;29-42N;098-02W;;;223;;
+KEXX;--;---;Lexington, Davidson County Airport;NC;United States;4;35-46-52N;080-18-14W;;;223;;
+KEYE;--;---;Indianapolis, Eagle Creek Airpark;IN;United States;4;39-49-30N;086-17-45W;39-49-34N;086-17-42W;250;248;
+KEYF;--;---;Elizabethtown, Curtis L Brown Jr. Field Airport;NC;United States;4;34-36N;078-35W;;;40;;
+KEYW;72;201;Key West, Key West International Airport;FL;United States;4;24-33-13N;081-45-13W;24-33-11N;081-45-24W;1;5;P
+KEZF;--;---;Fredericksburg, Shannon Airport;VA;United States;4;38-16N;077-27W;;;26;;
+KEZM;--;---;Eastman, Heart of Georgia Regional Airport;GA;United States;4;32-12-51N;083-07-40W;;;93;;
+KF05;--;---;Vernon, Wilbarger County Airport;TX;United States;4;34-13-32N;099-17-01W;;;386;;
+KF10;74;645;Henryetta Municipal;OK;United States;4;35-24N;096-01W;35-24N;096-01W;259;259;
+KF18;--;---;Cleburne, Cleburne Municipal Airport;TX;United States;4;32-21-13N;097-26-01W;;;260;;
+KF28;--;---;El Reno, El Reno Municipal Air Park;OK;United States;4;35-28-21N;098-00-20W;;;432;;
+KF30;74;646;Sulphur Municipal;OK;United States;4;34-31N;096-59W;34-31N;096-59W;320;320;
+KF39;--;---;Sherman-Denison;TX;United States;4;33-43N;096-40W;;;228;;
+KF55;--;---;Granbury, Granbury Municipal Airport;TX;United States;4;32-26-39N;097-49-01W;;;237;;
+KFAF;--;---;Fort Eustis / Felker;VA;United States;4;37-08N;076-37W;;;4;;
+KFAM;--;---;Farmington Airport;MO;United States;4;37-46N;090-26W;;;288;;
+KFAR;72;753;Fargo, Hector International Airport;ND;United States;4;46-55-31N;096-48-40W;46-54-29N;096-48-31W;274;277;P
+KFAT;72;389;Fresno, Fresno Air Terminal;CA;United States;4;36-46-48N;119-43-10W;36-47-13N;119-43-01W;101;104;P
+KFAY;--;---;Fayetteville, Fayetteville Regional Airport;NC;United States;4;34-59-22N;078-52-48W;34-59-29N;078-53-08W;57;55;
+KFBG;74;693;Fort Bragg / Simmons Army Airfield;NC;United States;4;35-08N;078-56W;35-08N;078-56W;74;74;
+KFBL;--;---;Faribault, Faribault Municipal Airport;MN;United States;4;44-20N;093-19W;;;323;;
+KFCA;72;779;Kalispell, Glacier Park International Airport;MT;United States;4;48-18-15N;114-15-49W;48-18-33N;114-15-01W;906;908;P
+KFCH;--;---;Fresno-Chandler;CA;United States;4;36-44N;119-49W;;;85;;
+KFCL;--;---;Fort Collins Supplementary Aviation Weather Reporting Station ;CO;United States;4;40-35N;105-05W;;;1525;;
+KFCM;--;---;Minneapolis, Flying Cloud Airport;MN;United States;4;44-49-56N;093-28-13W;44-49-18N;093-27-29W;287;280;
+KFCS;72;468;Fort Carson;CO;United States;4;38-42N;104-46W;38-42N;104-46W;1789;1789;
+KFCX;--;---;Roanoke NEXRAD;VA;United States;4;37-01N;080-16W;;;904;;
+KFDK;--;---;Frederick, Frederick Municipal Airport;MD;United States;4;39-25-03N;077-22-28W;;;92;;
+KFDR;--;---;Frederick, Frederick Municipal Airport;OK;United States;4;34-20-40N;098-58-59W;34-21-25N;098-59-12W;382;377;
+KFDY;--;---;Findlay, Findlay Airport;OH;United States;4;41-00-49N;083-40-07W;;;248;;
+KFEP;--;---;Freeport, Albertus Airport;IL;United States;4;42-14-47N;089-34-56W;;;262;;
+KFET;--;---;Fremont Municipal Airport;NE;United States;4;41-27N;096-31W;;;379;;
+KFFA;--;---;Kill Devil Hills, First Flight Airport;NC;United States;4;36-01N;075-40W;;;4;;
+KFFC;--;---;Atlanta, Peachtree City-Falcon Field;GA;United States;4;33-21-19N;084-34-01W;33-21-29N;084-34-07W;246;248;
+KFFL;--;---;Fair Field;IA;United States;4;41-03N;091-59W;;;244;;
+KFFM;--;---;Fergus Falls, Fergus Falls Municipal Airport-Einar Mickelson Field;MN;United States;4;46-17N;096-09W;;;360;;
+KFFO;74;570;Dayton / Wright-Patterson Air Force Base;OH;United States;4;39-50N;084-03W;39-50N;084-03W;251;251;P
+KFFT;--;---;Frankfort, Capital City Airport;KY;United States;4;38-11-05N;084-54-12W;38-10-50N;084-54-12W;245;236;
+KFFZ;--;---;Mesa / Falcon Field;AZ;United States;4;33-28N;111-44W;;;424;;
+KFGN;--;---;Flag Island;MN;United States;4;49-19N;94-54W;;;329;;
+KFHR;--;---;Friday Harbor, Friday Harbor Airport;WA;United States;4;48-31-13N;123-01-31W;48-31-31N;123-01-28W;33;32;
+KFHU;72;273;Fort Huachuca, Libby AAF Ft Huachuca;AZ;United States;4;46-98N;110-20W;;;1438;;
+KFIG;--;---;Clearfield, Clearfield-Lawrence Airport;PA;United States;4;41-02-48N;078-24-42W;41-02-51N;078-24-51W;462;462;
+KFIR;--;---;First Divide;WY;United States;4;41-18N;110-46W;;;2294;;
+KFIT;--;---;Fitchburg, Fitchburg Municipal Airport;MA;United States;4;42-33-07N;071-45-21W;42-33-15N;071-45-14W;106;103;
+KFKA;--;---;Preston, Fillmore County Airport;MN;United States;4;43-40-36N;092-10-47W;;;389;;
+KFKL;--;---;Franklin, Venango Regional Airport;PA;United States;4;41-23N;079-52W;;;469;;
+KFKN;--;---;Franklin / J B Rose;VA;United States;4;36-42N;076-54W;;;12;;
+KFKS;--;---;Frankfort, Frankfort Dow Memorial Field Airport;MI;United States;4;44-37-30N;086-12-02W;;;193;;
+KFLD;--;---;Fond Du Lac, Fond Du Lac County Airport;WI;United States;4;43-46-12N;088-29-11W;43-46-05N;088-29-19W;246;240;
+KFLG;--;---;Flagstaff, Flagstaff Pulliam Airport;AZ;United States;4;35-08-25N;111-40-20W;35-08-31N;111-40-15W;2137;2134;
+KFLL;--;---;Fort Lauderdale, Fort Lauderdale / Hollywood International Airport;FL;United States;4;26-04-05N;080-09-09W;26-04-13N;080-09-21W;3;30;
+KFLO;--;---;Florence, Florence Regional Airport;SC;United States;4;34-11-16N;079-43-51W;34-11-36N;079-43-45W;45;44;
+KFLP;--;---;Flippin, Marion County Regional Airport;AR;United States;4;36-18N;092-35W;;;219;;
+KFLV;--;---;Fort Leavenworth;KS;United States;4;39-22N;094-55W;;;235;;
+KFME;--;---;Fort Meade / Tipton;MD;United States;4;39-05N;076-46W;;;46;;
+KFMH;72;506;Otis Air National Guard Base;MA;United States;4;41-39N;070-31W;;;40;;
+KFMN;--;---;Farmington, Four Corners Regional Airport;NM;United States;4;36-44-37N;108-13-45W;36-44-21N;108-13-38W;1677;1685;
+KFMY;--;---;Fort Myers, Page Field;FL;United States;4;26-35-03N;081-51-45W;26-35-27N;081-51-25W;5;4;
+KFNB;--;---;Falls City, Brenner Field Airport;NE;United States;4;40-04-44N;095-35-31W;;;300;;
+KFNL;--;---;Fort Collins/Loveland, Fort Collins-Loveland Municipal Airport;CO;United States;4;40-27N;105-01W;;;1529;;
+KFNT;72;637;Flint, Bishop International Airport;MI;United States;4;42-58-00N;083-44-58W;42-58-27N;083-44-52W;238;233;P
+KFOA;--;---;Flora, Flora Municipal Airport;IL;United States;4;38-39-54N;088-27-11W;;;144;;
+KFOD;72;549;Fort Dodge;IA;United States;4;42-33N;094-11W;;;354;355;
+KFOE;--;---;Topeka, Forbes Field;KS;United States;4;38-56-29N;095-39-02W;38-56-53N;095-40-35W;329;320;
+KFOK;--;---;Westhampton Beach, The Gabreski Airport;NY;United States;4;40-51-03N;072-37-14W;40-50-23N;072-38-29W;20;33;
+KFOQ;--;---;Freeport Supplementary Aviation Weather Reporting Station ;TX;United States;4;29-00N;095-19W;;;2;;
+KFOZ;--;---;Bigfork, Bigfork Municipal Airport;MN;United States;4;47-46-58N;093-39-01W;;;411;;
+KFPK;--;---;Charlotte, Fitch H Beach Airport;MI;United States;4;42-34-28N;084-48-41W;;;271;;
+KFPR;--;---;Fort Pierce, St. Lucie County International Airport;FL;United States;4;27-29-53N;080-22-36W;27-29-35N;080-22-24W;8;13;
+KFQD;--;---;Rutherfordton, Rutherford County-Marchman Field Airport;NC;United States;4;35-25-42N;081-56-06W;;;329;;
+KFRG;--;---;Farmingdale, Republic Airport;NY;United States;4;40-44-03N;073-25-01W;40-43-39N;073-25-07W;24;21;
+KFRI;72;455;Fort Riley, Marshall AAF Ft Riley;KS;United States;4;39-03-20N;096-45-51W;;;324;;
+KFRM;--;---;Fairmont, Fairmont Municipal Airport;MN;United States;4;43-39N;094-25W;;;354;;
+KFSD;72;651;Sioux Falls, Foss Field;SD;United States;4;43-34-37N;096-45-13W;43-35-14N;096-44-03W;435;434;P
+KFSE;--;---;Fosston, Fosston Municipal Airport;MN;United States;4;47-35-34N;095-46-24W;;;389;;
+KFSI;72;355;Fort Sill;OK;United States;4;34-36N;098-24W;34-39N;098-24W;362;360;
+KFSM;72;344;Fort Smith, Fort Smith Regional Airport;AR;United States;4;35-20-01N;094-21-54W;35-20-16N;094-22-12W;142;140;P
+KFST;--;---;Fort Stockton, Fort Stockton-Pecos County Airport;TX;United States;4;30-54-43N;102-55-00W;30-54-33N;102-54-45W;917;918;
+KFSW;--;---;Fort Madison;IA;United States;4;40-40N;091-20W;;;221;;
+KFTG;--;---;Denver Nexrad;CO;United States;4;39-47N;104-33W;;;1709;;
+KFTK;72;424;Fort Knox;KY;United States;4;37-54N;085-58W;37-54N;085-58W;230;230;
+KFTW;--;---;Fort Worth, Meacham International Airport;TX;United States;4;32-49-31N;097-21-51W;32-49-35N;097-21-22W;216;214;
+KFTY;--;---;Atlanta, Fulton County Airport-Brown Field;GA;United States;4;33-46-39N;084-31-28W;33-46-37N;084-31-12W;256;263;
+KFUL;--;---;Fullerton, Fullerton Municipal Airport;CA;United States;4;33-52-19N;117-59-05W;33-52-15N;117-58-48W;29;35;
+KFVE;--;---;Frenchville, Northern Aroostook Regional Airport;ME;United States;4;47-17-06N;068-18-26W;47-17-13N;068-18-50W;301;301;
+KFVX;--;---;Farmville;VA;United States;4;37-21N;078-26W;;;125;;
+KFWA;72;533;Fort Wayne, Fort Wayne International Airport;IN;United States;4;40-58-42N;085-11-43W;40-59-11N;085-11-17W;248;248;P
+KFWC;--;---;Fairfield, Fairfield Municipal Airport;IL;United States;4;38-22-43N;088-24-46W;;;133;;
+KFWD;72;249;Fort Worth;TX;United States;4;32-50N;097-18W;32-50N;097-18W;196;196;
+KFWN;--;---;Sussex, Sussex Airport;NJ;United States;4;41-12-01N;074-37-23W;41-12-02N;074-37-29W;128;133;
+KFWQ;--;---;Monongahela, Rostraver Airport;PA;United States;4;40-12-35N;079-49-53W;;;374;;
+KFWS;--;---;Fort Worth, Forth Worth Spinks Airport;TX;United States;4;32-34N;097-18W;;;213;;
+KFXE;--;---;Fort Lauderdale, Fort Lauderdale Executive Airport;FL;United States;4;26-12-00N;080-11-00W;26-11-44N;080-10-25W;4;6;
+KFYJ;--;---;West Point, Middle Peninsula Regional Airport;VA;United States;4;37-31-16N;076-45-52W;;;7;;
+KFYV;--;---;Fayetteville, Drake Field;AR;United States;4;36-00-37N;094-10-04W;36-00-19N;094-10-21W;381;379;
+KFZY;--;---;Fulton, Oswego County Airport;NY;United States;4;43-21-03N;076-23-17W;;;145;;
+KGAD;--;---;Gadsden, Gadsden Municipal Airport;AL;United States;4;33-58N;086-05W;;;173;;
+KGAG;--;---;Gage, Gage Airport;OK;United States;4;36-17-48N;099-46-08W;36-17-50N;099-46-07W;677;668;
+KGAO;--;---;Galliano, South Lafourche Airport;LA;United States;4;29-26-41N;090-15-40W;;;0;;
+KGBD;--;---;Great Bend, Great Bend Municipal Airport;KS;United States;4;38-21N;098-52W;;;575;;
+KGBG;--;---;Galesburg, Galesburg Municipal Airport;IL;United States;4;40-56-17N;090-25-52W;;;233;;
+KGBN;74;724;Gila Bend U. S. Army Airfield;AZ;United States;4;32-26N;112-41W;32-56N;112-42W;262;261;
+KGCC;72;665;Gillette, Gillette-Campbell County Airport;WY;United States;4;44-20-22N;105-32-31W;44-20-54N;105-32-13W;1330;1320;P
+KGCK;--;---;Garden City, Garden City Regional Airport;KS;United States;4;37-55-39N;100-43-28W;37-55-36N;100-43-44W;881;877;
+KGCM;--;---;Claremore, Claremore Regional Airport;OK;United States;4;36-17-40N;095-28-47W;;;221;;
+KGCN;--;---;Grand Canyon, Grand Canyon National Park Airport;AZ;United States;4;35-56-46N;112-09-17W;35-57-27N;112-08-39W;2014;2016;
+KGDB;--;---;Granite Falls, Granite Falls Municipal Airport/Lenzen-Roe Memorial Field;MN;United States;4;44-45-11N;095-33-21W;;;319;;
+KGDJ;--;---;Granbury, Granbury Municipal Airport;TX;United States;4;32-26-39N;097-49W;;;237;;
+KGDP;72;262;Pine Springs, Guadalupe Mountains National Park;TX;United States;4;31-49-52N;104-48-32W;;;1661;1692;P
+KGDV;--;---;Glendive, Dawson Community Airport;MT;United States;4;47-08N;104-48W;;;749;;
+KGED;--;---;Georgetown, Sussex County Airport;DE;United States;4;38-41-24N;075-21-45W;38-41-30N;075-21-46W;15;19;
+KGEG;72;785;Spokane, Spokane International Airport;WA;United States;4;47-37-17N;117-31-40W;47-37-19N;117-32-22W;723;735;P
+KGEU;--;---;Glendale, Glendale Municipal Airport;AZ;United States;4;33-31-38N;112-17-43W;;;325;;
+KGEV;--;---;Jefferson, Ashe County Airport;NC;United States;4;36-26N;81-25W;;;969;
+KGEY;--;---;Greybull, South Big Horn County Airport;WY;United States;4;44-30-57N;108-04-33W;44-30-36N;108-04-49W;1199;1191;
+KGEZ;--;---;Shelbyville, Shelbyville Municipal Airport;IN;United States;4;39-35-08N;085-48-00W;39-34-42N;085-47-59W;245;245;
+KGFA;--;---;Malmstrom Air Force Base;MT;United States;4;47-30N;111-11W;;;1075;;
+KGFK;--;---;Grand Forks, Grand Forks International Airport;ND;United States;4;47-56-53N;097-10-57W;47-57-02N;097-10-42W;257;190;
+KGFL;--;---;Glens Falls, Floyd Bennett Memorial Airport;NY;United States;4;43-20-28N;073-36-38W;43-20-30N;073-36-20W;100;103;
+KGGB;--;---;Golden Gate Bridge;CA;United States;4;37-49N;122-28W;;;81;;
+KGGG;72;247;Longview, Gregg County Airport;TX;United States;4;32-23-26N;094-42-50W;32-22-48N;094-42-43W;111;107;P
+KGGW;72;768;Glasgow, Glasgow International Airport;MT;United States;4;48-12-50N;106-37-17W;48-12-30N;106-37-34W;699;693;P
+KGHW;--;---;Glenwood, Glenwood Municipal Airport;MN;United States;4;45-39N;095-19W;;;425;;
+KGIF;--;---;Winter Haven, Winter Haven's Gilbert Airport;FL;United States;4;28-03-38N;081-45-27W;28-03-34N;081-45-08W;44;43;
+KGJT;72;476;Grand Junction, Walker Field;CO;United States;4;39-08-02N;108-32-19W;39-07-00N;108-32-00W;1481;1452;P
+KGKJ;--;---;Meadville, Port Meadville Airport;PA;United States;4;41-37-35N;080-12-53W;;;427;;
+KGKN;--;---;Gulkana, Gulkana Airport;AK;United States;4;62-09-37N;145-27-27W;62-09-30N;145-27-24W;481;480;
+KGKY;--;---;Arlington, Arlington Municipal Airport;TX;United States;4;32-39-50N;097-05-45W;32-39-52N;097-05-30W;192;185;
+KGLD;72;465;Goodland, Renner Field;KS;United States;4;39-22-03N;101-41-35W;39-22-12N;101-41-53W;1114;1114;P
+KGLE;--;---;Gainesville, Gainesville Municipal Airport;TX;United States;4;33-39-05N;097-11-49W;;;256;;
+KGLH;--;---;Greenville, Mid Delta Regional Airport;MS;United States;4;33-28-58N;090-59-08W;33-28-53N;090-59-25W;40;45;
+KGLR;--;---;Gaylord, Otsego County Airport;MI;United States;4;45-00-59N;084-41-20W;45-00-59N;084-41-30W;404;407;
+KGLS;72;242;Galveston, Scholes Field;TX;United States;4;29-16-13N;094-51-51W;29-16-05N;094-51-18W;2;6;P
+KGLW;--;---;Glasgow, Glasgow Municipal Airport;KY;United States;4;37-01-54N;085-57-13W;;;218;;
+KGMJ;--;---;Grove, Grove Municipal Airport;OK;United States;4;36-36-19N;094-44-19W;;;254;;
+KGMU;--;---;Greenville, Greenville Downtown Airport;SC;United States;4;34-50-46N;082-20-46W;34-51-01N;082-21-05W;319;315;
+KGNA;--;---;Grand Marais, The Bay of Grand Marais;MN;United States;4;47-50N;090-23W;;;186;;
+KGNC;--;---;Seminole, Gaines County Airport;TX;United States;4;32-40-31N;102-39-09W;;;1010;;
+KGNR;--;---;Greenville;ME;United States;4;45-28N;69-35W;;;427;;
+KGNT;--;---;Grants, Grants-Milan Municipal Airport;NM;United States;4;35-09-55N;107-54-08W;35-09-58N;107-53-56W;1988;1987;
+KGNV;--;---;Gainesville, Gainesville Regional Airport;FL;United States;4;29-41-31N;082-16-32W;29-41-34N;082-16-48W;46;45;
+KGOK;--;---;Guthrie, Guthrie Municipal Airport;OK;United States;4;35-51-07N;097-24-27W;35-51-03N;097-25-07W;327;324;
+KGON;--;---;Groton / New London, Groton / New London Airport;CT;United States;4;41-19-39N;072-02-58W;41-19-55N;072-02-42W;3;3;
+KGOP;--;---;Gatesville, City-County Airport;TX;United States;4;31-25-16N;097-47-49W;;;276;;
+KGOV;--;---;Grayling, Grayling Army Airfield;MI;United States;4;44-40-49N;084-43-44W;;;353;;
+KGPI;72;779;Kalispell, Glacier Park International Airport;MT;United States;4;48-18-15N;114-15-49W;48-18-33N;114-15-01W;906;908;P
+KGPM;--;---;Grand Prairie, Grand Prairie Municipal Airport;TX;United States;4;32-41-55N;097-02-48W;;;180;;
+KGPT;--;---;Gulfport, Gulfport-Biloxi Regional Airport;MS;United States;4;30-24-43N;089-04-51W;30-24-05N;089-04-21W;8;14;
+KGPZ;--;---;Grand Rapids, Grand Rapids/Itasca County Airport-Gordon Newstrom Field;MN;United States;4;47-13N;093-31W;;;413;;
+KGRB;72;645;Green Bay, Austin Straubel International Airport;WI;United States;4;44-28-46N;088-08-12W;44-29-47N;088-06-46W;211;205;P
+KGRD;--;---;Greenwood, Greenwood County Airport;SC;United States;4;34-14-50N;082-09-17W;34-14-46N;082-09-11W;192;185;
+KGRF;74;207;Fort Lewis / Gray U. S. Army Airfield;WA;United States;4;47-07N;122-33W;47-08N;122-36W;92;87;
+KGRI;72;552;Grand Island, Central Nebraska Regional Airport;NE;United States;4;40-57-30N;098-18-45W;40-57-30N;098-19-05W;562;561;P
+KGRK;--;---;Fort Hood, Robert Gray AAF Ft Hood;TX;United States;4;31-04N;097-49W;;;309;;
+KGRN;--;---;Gordon Municipal;NE;United States;4;42-48N;102-10W;;;1085;;
+KGRR;72;635;Grand Rapids, Gerald R. Ford International Airport;MI;United States;4;42-52-51N;085-31-22W;42-53-04N;085-31-45W;242;239;P
+KGSB;--;---;Seymour-Johnson Air Force Base;NC;United States;4;35-20N;077-58W;;;33;;
+KGSH;--;---;Goshen, Goshen Municipal Airport;IN;United States;4;41-31-34N;085-47-12W;41-31-24N;085-47-39W;252;252;
+KGSM;--;---;Ship Shoal 207A;LA;United States;4;28-32N;090-59W;;;1;;
+KGSO;72;317;Greensboro, Piedmont Triad International Airport;NC;United States;4;36-05-51N;079-56-37W;36-05-53N;079-56-38W;282;275;P
+KGSP;72;312;Greer, Greenville-Spartanburg Airport;SC;United States;4;34-53-02N;082-13-15W;34-53-00N;082-13-13W;296;286;P
+KGTB;74;370;Fort Drum / Wheeler-Sack U. S. Army Airfield;NY;United States;4;44-03N;075-44W;44-03N;075-44W;207;207;
+KGTF;72;775;Great Falls, Great Falls International Airport;MT;United States;4;47-28-24N;111-22-56W;47-28-48N;111-21-31W;1120;1119;P
+KGTR;--;---;Columbus/West Point/Starkville, Golden Triangle Regional Airport;MS;United States;4;33-27N;088-35W;;;81;;
+KGTU;--;---;Georgetown, Georgetown Municipal Airport;TX;United States;4;30-41N;097-41W;;;241;;
+KGUC;--;---;Gunnison, Gunnison-Crested Butte Regional Airport;CO;United States;4;38-32N;106-56W;;;2340;;
+KGUP;--;---;Gallup, Gallup Municipal Airport;NM;United States;4;35-30-40N;108-47-22W;35-30-54N;108-46-50W;1973;1971;
+KGUS;--;---;Grissom Air Force Base / Peru;IN;United States;4;40-39N;086-09W;;;247;;
+KGUY;--;---;Guymon / Guymon Municipal Airport;OK;United States;4;36-40-54N;101-30-19W;;;952;948;
+KGVL;--;---;Gainesville, Gilmer Memorial Airport;GA;United States;4;34-16-19N;083-49-49W;34-16-33N;083-49-51W;388;386;
+KGVT;--;---;Greenville / Majors;TX;United States;4;33-04N;096-04W;;;163;;
+KGVW;--;---;Kansas City, Richards-Gebaur Airport;MO;United States;4;38-50-06N;094-33-41W;38-50-45N;094-33-21W;332;337;
+KGWO;--;---;Greenwood, Greenwood-LeFlore Airport;MS;United States;4;33-29-33N;090-05-01W;33-29-45N;090-05-22W;47;44;
+KGWW;--;---;Goldsboro, Goldsboro-Wayne Municipal Airport;NC;United States;4;35-27-38N;077-57-54W;;;40;;
+KGXY;--;---;Greeley, Greeley-Weld County Airport;CO;United States;4;40-26N;104-38W;;;1432;;
+KGYB;--;---;Giddings, Giddings-Lee County Airport;TX;United States;4;30-10-09N;096-58-48W;;;148;;
+KGYI;--;---;Sherman/Denison, Grayson County Airport;TX;United States;4;33-43N;096-40W;;;228;;
+KGYL;--;---;Glencoe, Glencoe Municipal Airport;MN;United States;4;44-45-22N;094-04-52W;;;302;;
+KGYR;--;---;Goodyear Municipal;AZ;United States;4;33-25N;112-23W;;;295;;
+KGYY;--;---;Gary Regional;IN;United States;4;41-37N;087-25W;;;180;;
+KGZH;--;---;Evergreen, Middleton Field;AL;United States;4;31-25-08N;087-02-53W;31-25-10N;087-02-38W;78;78;
+KH08;--;---;High Island 264C;LA;United States;4;28-28N;93-44W;;;0;;
+KH32;--;---;Southwest Harbor;ME;United States;4;44-16N;068-19W;;;5;;
+KH39;--;---;High Island A572c;LA;United States;4;27-57N;093-59W;;;30;;
+KH45;--;---;Seminole, Seminole Municipal Airport;OK;United States;4;35-16-28N;096-40-30W;;;312;;
+KH92;74;643;Hominy Municipal;OK;United States;4;36-26N;096-23W;36-26N;096-23W;251;252;
+KHAO;--;---;Hamilton, Butler County Regional Airport;OH;United States;4;39-21-41N;084-31-15W;39-21-47N;084-31-34W;193;188;
+KHAT;72;304;Cape Hatteras;NC;United States;4;35-16N;075-33W;35-16N;075-33W;2;3;P
+KHBG;--;---;Hattiesburg, Bobby L Chain Municipal Airport;MS;United States;4;31-15-54N;089-15-11W;31-16-11N;089-15-14W;46;44;
+KHBI;--;---;Asheboro, Asheboro Municipal Airport;NC;United States;4;35-39-14N;079-53-42W;;;205;;
+KHBR;--;---;Hobart, Hobart Municipal Airport;OK;United States;4;34-59-22N;099-03-09W;34-59-19N;099-03-26W;476;473;
+KHBV;--;---;Hebbronville, Jim Hogg County Airport;TX;United States;4;27-20N;098-44W;;;202;;
+KHCD;--;---;Hutchinson, Hutchinson Municipal Airport-Butler Field;MN;United States;4;44-52N;094-23W;;;323;;
+KHCO;--;---;Hallock, Hallock Municipal Airport;MN;United States;4;48-45-10N;096-56-35W;;;250;;
+KHDC;--;---;Hammond, Hammond Municipal Airport;LA;United States;4;30-31-15N;090-25-03W;;;13;;
+KHDE;--;---;Brewster Field Airport;NE;United States;4;40-27N;099-20W;;;704;;
+KHDN;--;---;Hayden, Yampa Valley Airport;CO;United States;4;40-29N;107-13W;;;2012;;
+KHDO;--;---;Hondo, Hondo Municipal Airport;TX;United States;4;29-21-34N;099-10-27W;29-21-26N;099-09-49W;283;282;
+KHEF;--;---;Manassas, Manassas Regional Airport/Harry P. Davis Field;VA;United States;4;38-43N;077-31W;;;59;;
+KHEI;--;---;Hettinger, Hettinger Municipal Airport;ND;United States;4;46-00-38N;102-38-59W;46-01-02N;102-39-07W;824;828;
+KHEY;--;---;Hanchey AHP / Ozark;AL;United States;4;31-21N;085-40W;;;97;;
+KHEZ;--;---;Natchez, Hardy-Anders Field Natchez-Adams County Airport;MS;United States;4;31-37N;091-18W;;;83;;
+KHFD;--;---;Hartford, Hartford-Brainard Airport;CT;United States;4;41-44-06N;072-39-06W;41-44-05N;072-39-07W;5;4;
+KHFF;--;---;Mackall U. S. Army Airfield;NC;United States;4;35-02N;079-30W;;;115;;
+KHGR;--;---;Hagerstown, Washington County Regional Airport;MD;United States;4;39-42-21N;077-43-48W;39-42-37N;077-43-53W;214;224;
+KHGX;--;---;Houston / Galviston Nexrad;TX;United States;4;29-28N;095-05W;;;35;;
+KHHF;--;---;Canadian, Hemphill County Airport;TX;United States;4;35-54N;100-24W;;;730;;
+KHHR;--;---;Hawthorne, Hawthorne Municipal Airport;CA;United States;4;33-55-25N;118-19-55W;33-55-24N;118-20-10W;19;18;
+KHIB;--;---;Hibbing, Chisholm-Hibbing Airport;MN;United States;4;47-23-12N;092-50-20W;47-23-33N;092-50-21W;412;412;
+KHIE;--;---;Whitefield, Mount Washington Regional Airport;NH;United States;4;44-21-58N;071-33-09W;44-21-57N;071-33-03W;327;318;
+KHIF;--;---;Hill Air Force Base / Ogden;UT;United States;4;41-07N;111-58W;;;1459;;
+KHIO;--;---;Portland, Portland-Hillsboro Airport;OR;United States;4;45-32-53N;122-57-16W;45-32-15N;122-56-57W;62;68;
+KHJH;--;---;Hebron, Hebron Municipal Airport;NE;United States;4;40-09-08N;097-35-13W;;;447;;
+KHJO;--;---;Hanford, Hanford Municipal Airport;CA;United States;4;36-19-07N;119-37-44W;;;74;;
+KHKA;--;---;Blytheville, Blytheville Municipal Airport;AR;United States;4;35-56-20N;089-49-57W;35-56-17N;089-49-55W;78;78;
+KHKS;--;---;Jackson, Hawkins Field Airport;MS;United States;4;32-20-05N;090-13-21W;32-19-58N;090-13-35W;104;108;
+KHKY;--;---;Hickory, Hickory Regional Airport;NC;United States;4;35-44-32N;081-22-56W;35-44-30N;081-23-22W;362;354;
+KHLC;--;---;Hill City, Hill City Municipal Airport;KS;United States;4;39-22-29N;099-49-47W;;;678;669;
+KHLD;--;---;Hiland;WY;United States;4;43-06N;107-19W;;;1846;;
+KHLG;--;---;Wheeling, Wheeling Ohio County Airport;WV;United States;4;40-10-13N;080-38-40W;40-10-54N;080-38-48W;364;372;
+KHLN;72;772;Helena, Helena Regional Airport;MT;United States;4;46-36-20N;111-57-49W;46-36-09N;111-59-39W;1180;1187;P
+KHLR;72;257;Fort Hood, Hood AAF Ft Hood;TX;United States;4;31-08N;097-42W;;;282;;
+KHLX;--;---;Hillsville;VA;United States;4;36-46N;080-49W;;;834;;
+KHMM;--;---;Hamilton / Ravalli County;MT;United States;4;46-15N;114-09W;;;1110;;
+KHMN;74;732;Holloman Air Force Base;NM;United States;4;32-51N;106-06W;32-54N;106-06W;1248;1248;
+KHMS;72;784;Hanford;WA;United States;4;46-34N;119-36W;;;223;223;
+KHMZ;--;---;Bedford, Bedford County Airport;PA;United States;4;40-05-07N;078-30-44W;;;354;;
+KHNB;--;---;Huntingburg;IN;United States;4;38-15N;086-57W;;;161;;
+KHND;--;---;Las Vegas, Henderson Executive Airport;NV;United States;4;35-58-22N;115-08-04W;;;760;;
+KHNR;--;---;Harlan, Harlan Municipal Airport;IA;United States;4;41-35-04N;095-20-23W;;;375;;
+KHNS;--;---;Haines, Haines Airport;AK;United States;4;59-14-38N;135-30-34W;59-14-36N;135-30-34W;4;5;
+KHNZ;--;---;Oxford, Henderson-Oxford Airport;NC;United States;4;36-21-42N;078-31-45W;;;161;
+KHOB;--;---;Hobbs / Lea County;NM;United States;4;32-41N;103-13W;;;1115;;
+KHOM;--;---;Homer, Homer Airport;AK;United States;4;59-38-33N;151-29-14W;59-38-23N;151-29-02W;23;23;
+KHON;72;654;Huron, Huron Regional Airport;SD;United States;4;44-23-17N;098-13-42W;44-23-09N;098-13-22W;392;390;P
+KHOP;74;671;Fort Campbell U. S. Army Airfield;KY;United States;4;36-40N;087-30W;36-40N;087-30W;174;174;
+KHOT;--;---;Hot Springs, Memorial Field Airport;AR;United States;4;34-28-41N;093-05-46W;34-28-57N;093-05-44W;165;162;
+KHOU;--;---;Houston, Houston Hobby Airport;TX;United States;4;29-38-15N;095-16-57W;29-38-24N;095-16-38W;14;36;
+KHPN;--;---;White Plains, Westchester County Airport;NY;United States;4;41-04-01N;073-42-27W;41-03-46N;073-42-41W;134;121;
+KHQM;--;---;Hoquiam, Bowerman Airport;WA;United States;4;46-58-16N;123-55-12W;46-58-26N;123-55-37W;4;7;
+KHQU;--;---;Thomson, Thomson-McDuffie County Airport;GA;United States;4;33-31-46N;082-30-59W;;;152;;
+KHQZ;--;---;Mesquite, Mesquite Metro Airport;TX;United States;4;32-44-49N;096-31-49W;;;136;;
+KHRI;--;---;Hermiston, Hermiston Municipal Airport;OR;United States;4;45-49-33N;119-15-40W;45-49-41N;119-15-44W;194;195;
+KHRJ;--;---;Erwin, Harnett County Airport;NC;United States;4;35-22-43N;078-44-01W;;;60;;
+KHRL;--;---;Harlingen, Rio Grande Valley International Airport;TX;United States;4;26-13-47N;097-39-19W;26-13-33N;097-39-40W;10;10;
+KHRO;--;---;Harrison, Boone County Airport;AR;United States;4;36-15-42N;093-09-17W;36-15-53N;093-09-03W;416;417;
+KHRT;74;777;Hurlburt Field;FL;United States;4;30-25N;086-41W;30-26N;086-41W;12;11;
+KHSA;--;---;Bay St. Louis, Stennis International Airport;MS;United States;4;30-22-04N;089-27-17W;;;7;;
+KHSB;--;---;Harrisburg, Harrisburg-Raleigh Airport;IL;United States;4;37-48-41N;088-32-57W;;;121;;
+KHSE;--;---;Hatteras, Mitchell Field;NC;United States;4;35-13-56N;075-37-21W;35-13-55N;075-37-22W;5;3;
+KHSI;--;---;Hastings, Hastings Municipal Airport;NE;United States;4;40-36-02N;098-25-33W;40-36-00N;098-25-35W;595;591;
+KHSP;--;---;Hot Springs / Ingalls;VA;United States;4;37-57N;079-50W;;;1156;;
+KHSS;--;---;Hot Springs Aviation Weather Reporting Station;NC;United States;4;35-54N;082-49W;;;451;;
+KHST;--;---;Homestead Air Force Base;FL;United States;4;25-29N;080-23W;;;2;;
+KHSV;72;323;Huntsville, Huntsville International / Jones Field;AL;United States;4;34-38-37N;086-47-08W;34-38-46N;086-46-16W;192;191;P
+KHTH;--;---;Hawthorne Municipal;NV;United States;4;38-33N;118-38W;;;1285;;
+KHTL;72;638;Houghton Lake, Roscommon County Airport;MI;United States;4;44-21-04N;084-40-27W;44-21-02N;084-40-39W;350;351;P
+KHTO;--;---;East Hampton, East Hampton Airport;NY;United States;4;40-57-34N;072-15-07W;;;17;;
+KHTS;72;425;Huntington, Tri-State Airport;WV;United States;4;38-21-54N;082-33-18W;38-22-09N;082-33-18W;252;254;P
+KHUF;--;---;Terre Haute, Terre Haute International Airport - Hulman Field;IN;United States;4;39-26-30N;087-19-31W;39-27-43N;087-18-09W;178;179;
+KHUL;--;---;Houlton, Houlton International Airport;ME;United States;4;46-07-23N;067-47-31W;46-07-30N;067-47-10W;149;150;
+KHUM;--;---;Houma-Terrebonne;LA;United States;4;29-34N;090-40W;;;3;;
+KHUT;--;---;Hutchinson, Hutchinson Municipal Airport;KS;United States;4;38-04-05N;097-51-38W;38-03-59N;097-51-38W;470;467;
+KHVN;--;---;New Haven, Tweed-New Haven Airport;CT;United States;4;41-15-50N;072-53-14W;41-15-55N;072-53-05W;4;3;
+KHVR;72;777;Havre, Havre City-County Airport;MT;United States;4;48-32-34N;109-45-48W;48-32-46N;109-45-42W;789;787;P
+KHWD;--;---;Hayward, Hayward Air Terminal;CA;United States;4;37-39-39N;122-07-06W;37-39-46N;122-07-11W;14;21;
+KHWO;--;---;Hollywood, North Perry Airport;FL;United States;4;25-59-56N;080-14-28W;26-00-00N;080-15-06W;2;2;
+KHWV;--;---;Shirley, Brookhaven Airport;NY;United States;4;40-49-18N;072-52-08W;40-48-56N;072-52-03W;25;21;
+KHXD;--;---;Hilton Head Island, Hilton Head Airport;SC;United States;4;32-13N;080-42W;;;6;;
+KHYA;--;---;Hyannis, Barnstable Municipal-Boardman Airport;MA;United States;4;41-40-19N;070-16-11W;41-40-19N;070-16-11W;15;22;
+KHYI;--;---;San Marcos, San Marcos Municipal Airport;TX;United States;4;29-53-37N;097-51-53W;;;182;;
+KHYR;--;---;Hayward, Hayward Municipal Airport;WI;United States;4;46-01-14N;091-27-01W;46-01-38N;091-26-45W;370;370;
+KHYS;--;---;Hays, Hays Regional Airport;KS;United States;4;38-51N;099-16W;;;609;;
+KHYX;--;---;Saginaw, Saginaw County H.W. Browne Airport;MI;United States;4;43-26-00N;083-51-45W;;;183;;
+KHZX;--;---;Mc Gregor, Isedor Iverson Airport;MN;United States;4;46-37-07N;093-18-35W;;;374;;
+KHZY;--;---;Ashtabula, Ashtabula County Airport;OH;United States;4;41-46-46N;080-41-48W;41-46-48N;080-42-04W;281;276;
+KI05;--;---;Sturgis, Sturgis Municipal Airport;KY;United States;4;37-32-27N;087-57-06W;;;113;;
+KI12;--;---;Sidney, Sidney Municipal Airport;OH;United States;4;40-14-28N;084-09-03W;;;318;;
+KI16;--;---;Pineville, Kee Field Airport;WV;United States;4;37-36-01N;081-33-33W;;;544;;
+KI63;--;---;Mount Sterling, Mount Sterling Municipal Airport;IL;United States;4;39-59-15N;090-48-15W;;;223;;
+KIAB;--;---;McConnell Air Force Base;KS;United States;4;37-37N;097-16W;;;418;;
+KIAD;72;403;Washington DC, Washington-Dulles International Airport;VA;United States;4;38-56-05N;077-26-51W;38-57-06N;077-26-37W;95;93;P
+KIAG;--;---;Niagara Falls, Niagara Falls International Airport;NY;United States;4;43-06-26N;078-56-43W;43-06-01N;078-56-37W;180;182;
+KIAH;72;243;Houston, Houston Intercontinental Airport;TX;United States;4;29-59-33N;095-21-50W;29-58-25N;095-20-33W;29;36;
+KIBM;--;---;Kimball, Kimball Municipal Airport/Robert E Arraj Field;NE;United States;4;41-11N;103-40W;;;1501;;
+KICL;--;---;Clarinda;IA;United States;4;40-43N;095-02W;;;303;;
+KICT;72;450;Wichita, Wichita Mid-Continent Airport;KS;United States;4;37-38-50N;097-25-46W;37-39-16N;097-26-35W;406;408;P
+KIDA;--;---;Idaho Falls, Fanning Field;ID;United States;4;43-31-15N;112-03-58W;43-30-56N;112-03-58W;1445;1453;
+KIDI;--;---;Indiana / Stewart Field;PA;United States;4;40-38N;079-06W;;;429;;
+KIDV;--;---;I-25 Divide;WY;United States;4;43-56N;106-39W;;;1531;;
+KIEN;--;---;Pine Ridge, Pine Ridge Airport;SD;United States;4;43-01-32N;102-31-23W;43-01-34N;102-31-23W;1015;998;
+KIER;--;---;Natchitoches, Natchitoches Regional Airport;LA;United States;4;31-44-09N;093-05-57W;;;37;;
+KIFP;--;---;Bullhead City, Laughlin/Bullhead International Airport;AZ;United States;4;35-09-27N;114-33-34W;;;212;;
+KIGC;--;---;Charleston Air Force Base;SC;United States;4;32-54N;080-03W;;;14;;
+KIGM;72;370;Kingman, Kingman Airport;AZ;United States;4;35-15-28N;113-55-59W;35-15-35N;113-56-31W;1050;1032;P
+KIGQ;--;---;Chicago, Lansing Municipal Airport;IL;United States;4;41-32-24N;087-31-56W;;;188;;
+KIGX;--;---;Chapel Hill, Williams Airport;NC;United States;4;35-46-00N;079-03-51W;35-56-01N;079-03-38W;155;155;
+KIIB;--;---;Independence, Independence Municipal Airport;IA;United States;4;42-27N;091-56W;;;298;;
+KIIY;--;---;Washington, Washington-Wilkes County Airport;GA;United States;4;33-46-47N;082-48-59W;;;197;;
+KIJD;--;---;Willimantic, Windham Airport;CT;United States;4;41-44-31N;072-11-01W;41-44-21N;072-10-56W;75;75;
+KIJX;--;---;Jacksonville, Jacksonville Municipal Airport;IL;United States;4;39-46-27N;090-14-19W;;;190;;
+KIKA;--;---;Inyan Kara;WY;United States;4;44-18N;104-38W;;;1319;;
+KIKK;--;---;Kankakee, Greater Kankakee Airport;IL;United States;4;41-04-17N;087-50-47W;;;192;;
+KIKR;--;---;Kirtland, Kirtland Air Force Base Auxiliary Field;NM;United States;4;34-57-00N;106-34-00W;;;1612;1609;
+KIKV;--;---;Ankeny, Ankeny Regional Airport;IA;United States;4;41-41-24N;093-33-57W;;;275;;
+KILE;--;---;Killeen, Skylark Field Airport;TX;United States;4;31-05N;097-41W;;;259;;
+KILG;--;---;Wilmington, New Castle County Airport;DE;United States;4;39-40-22N;075-36-03W;39-40-30N;075-35-54W;24;28;
+KILI;--;---;Iliamna, Iliamna Airport;AK;United States;4;59-44-57N;154-54-33W;59-44-57N;154-54-33W;63;52;
+KILL;--;---;Willmar, Willmar Municipal Airport-John L Rice Field;MN;United States;4;45-07N;095-05W;;;344;;
+KILM;--;---;Wilmington, Wilmington International Airport;NC;United States;4;34-16-14N;077-54-09W;34-16-31N;077-54-42W;10;9;
+KILN;--;---;Wilmington, Airborne Airpark Airport;OH;United States;4;39-25-42N;083-46-45W;;;328;332;
+KIML;--;---;Imperial, Imperial Municipal Airport;NE;United States;4;40-31N;101-37W;;;997;;
+KIMT;--;---;Iron Mountain / Kingsford, Ford Airport;MI;United States;4;45-48-51N;088-06-32W;45-48-50N;088-07-00W;360;349;
+KIND;72;438;Indianapolis, Indianapolis International Airport;IN;United States;4;39-43-30N;086-16-55W;39-42-29N;086-16-47W;243;242;P
+KINJ;--;---;Hillsboro, Hillsboro Municipal Airport;TX;United States;4;32-05N;097-05-50W;;;209;;
+KINK;--;---;Wink, Winkler County Airport;TX;United States;4;31-46-47N;103-12-05W;31-47-01N;103-11-40W;860;855;
+KINL;72;747;International Falls, Falls International Airport;MN;United States;4;48-33-43N;093-23-52W;48-33-59N;093-23-53W;361;360;P
+KINS;74;614;Indian Springs, Indian Springs Auxiliary AFLD Nellis AFB;NV;United States;4;36-35N;115-40W;;;955;;
+KINT;--;---;Winston Salem, Smith Reynolds Airport;NC;United States;4;36-08-00N;080-13-29W;36-08-13N;080-13-42W;295;291;
+KINW;72;374;Winslow, Winslow Municipal Airport;AZ;United States;4;35-01-41N;110-43-15W;35-01-17N;110-43-02W;1505;1490;
+KINX;--;---;Tulsa Nexrad;OK;United States;4;36-11N;095-34W;;;226;;
+KIOW;--;---;Iowa City, Iowa City Municipal Airport;IA;United States;4;41-37-58N;091-32-35W;47-38-25N;091-32-30W;203;198;
+KIPJ;--;---;Lincolnton, Lincolnton-Lincoln County Regional Airport;NC;United States;4;35-28-59N;081-09-41W;;;267;;
+KIPL;--;---;Imperial, Imperial County Airport;CA;United States;4;32-50-03N;115-34-43W;32-50-08N;115-34-36W;-17;-15;
+KIPT;72;514;Williamsport, Williamsport Regional Airport;PA;United States;4;41-14-30N;076-55-15W;41-14-41N;076-55-08W;161;164;
+KIRK;--;---;Kirksville, Kirksville Regional Airport;MO;United States;4;40-05-50N;092-32-36W;40-05-33N;092-32-41W;294;293;
+KIRS;--;---;Sturgis, Kirsch Municipal Airport;MI;United States;4;41-48-46N;085-26-21W;;;282;;
+KISM;--;---;Orlando, Kissimmee Municipal Airport;FL;United States;4;28-17-23N;081-26-14W;;;25;;
+KISN;72;767;Williston, Sloulin Field International Airport;ND;United States;4;48-10-26N;103-38-12W;48-10-37N;103-37-52W;604;579;P
+KISO;--;---;Kinston, Kinston Regional Jetport at Stallings Field;NC;United States;4;35-20N;077-37W;;;29;;
+KISP;--;---;Islip, Long Island Mac Arthur Airport;NY;United States;4;40-47-38N;073-06-06W;40-47-29N;073-06-12W;30;43;
+KISQ;--;---;Manistique, Schoolcraft County Airport;MI;United States;4;45-58-29N;086-10-19W;;;209;;
+KISW;--;---;Wisconsin Rapids, Alexander Field South Wood County Airport;WI;United States;4;44-21-33N;089-50-13W;44-21-42N;089-49-59W;311;307;
+KITH;--;---;Ithaca, Ithaca Tompkins Regional Airport;NY;United States;4;42-29-27N;076-27-30W;;;335;;
+KITR;--;---;Burlington, Carson County Airport;CO;United States;4;39-14-32N;102-16-58W;39-14-38N;102-17-08W;1285;1279;
+KIWA;--;---;Mesa, Williams Gateway Airport;AZ;United States;4;33-19N;111-39W;;;421;;
+KIWD;--;---;Ironwood, Gogebic-Iron County Airport;MI;United States;4;46-32N;090-08W;;;375;;
+KIWI;--;---;Wiscasset, Wiscasset Airport;ME;United States;4;43-57-49N;069-42-42W;43-57-50N;069-42-40W;20;20;
+KIWS;--;---;West Houston / Lakeside;TX;United States;4;29-49N;095-40W;;;34;;
+KIXD;--;---;Olathe, New Century Aircenter;KS;United States;4;38-49-28N;094-53-13W;38-50-03N;094-53-25W;331;342;
+KIYK;--;---;Inyokern;CA;United States;4;35-40N;117-50W;;;749;;
+KIZA;--;---;Santa Ynez, Santa Ynez Airport;CA;United States;4;34-36-25N;120-04-32W;;;205;;
+KIZG;--;---;Fryeburg, Eastern Slopes Regional Airport;ME;United States;4;43-59-21N;070-57-01W;43-59-18N;070-56-59W;137;135;
+KJAC;--;---;Jackson, Jackson Hole Airport;WY;United States;4;43-36N;110-44W;;;1966;;
+KJAN;72;235;Jackson, Jackson International Airport;MS;United States;4;32-19-11N;090-04-39W;32-19-08N;090-04-49W;105;89;P
+KJAS;--;---;Jasper, Jasper County-Bell Field Airport;TX;United States;4;30-53-08N;094-02-05W;;;65;;
+KJAX;72;206;Jacksonville, Jacksonville International Airport;FL;United States;4;30-29-40N;081-41-36W;30-29-38N;081-40-52W;9;7;P
+KJBR;--;---;Jonesboro, Jonesboro Municipal Airport;AR;United States;4;35-50-14N;090-38-35W;35-50-10N;090-38-53W;79;79;
+KJCT;74;740;Junction, Kimble County Airport;TX;United States;4;30-30-39N;099-45-59W;30-30-36N;099-45-57W;527;523;P
+KJDD;--;---;Mineola/Quitman, Wood County Airport;TX;United States;4;32-44-31N;095-29-47W;;;132;;
+KJDN;--;---;Jordan, Jordan Airport;MT;United States;4;47-19-33N;106-56-51W;;;811;801;
+KJEF;--;---;Jefferson City, Jefferson City Memorial Airport;MO;United States;4;38-35-40N;092-09-21W;38-35-42N;092-09-15W;167;168;
+KJER;--;---;Jerome, Jerome County Airport;ID;United States;4;42-43-36N;114-27-26W;;;1234;;
+KJFK;74;486;New York, Kennedy International Airport;NY;United States;4;40-38-19N;073-45-44W;40-38-34N;073-46-52W;3;9;
+KJGG;--;---;Williamsburg, Williamsburg-Jamestown Airport;VA;United States;4;37-14-21N;076-42-57W;;;15;;
+KJHW;--;---;Jamestown, Chautauqua County/Jamestown Airport;NY;United States;4;42-09N;079-16W;;;525;;
+KJKJ;--;---;Moorhead, Moorhead Municipal Airport;MN;United States;4;46-50-21N;096-39-47W;;;280;;
+KJKL;--;---;Jackson, Carroll Airport;KY;United States;4;37-35-29N;083-18-52W;37-35-29N;083-19-02W;421;412;
+KJLN;--;---;Joplin, Joplin Regional Airport;MO;United States;4;37-09-22N;094-30-02W;37-08-50N;094-30-03W;299;299;
+KJMR;--;---;Mora, Mora Municipal Airport;MN;United States;4;45-53-10N;093-16-18W;;;309;;
+KJMS;--;---;Jamestown, Jamestown Municipal Airport;ND;United States;4;46-55-47N;098-40-42W;46-55-35N;098-40-35W;457;455;
+KJNW;--;---;Newport;OR;United States;4;44-35N;124-04W;;;48;;
+KJNX;--;---;Smithfield, Johnston County Airport;NC;United States;4;35-32-27N;078-23-25W;;;50;;
+KJOT;--;---;Joliet, Joliet Regional Airport;IL;United States;4;41-31-05N;088-10-31W;;;177;;
+KJQF;--;---;Concord, Concord Regional Airport;NC;United States;4;35-23-07N;080-42-35W;;;210;;
+KJSO;--;---;Jacksonville, Cherokee County Airport;TX;United States;4;31-52-09N;095-13-02W;;;206;;
+KJST;--;---;Johnstown, Johnstown-Cambria County Airport;PA;United States;4;40-18-58N;078-50-02W;40-19-10N;078-49-59W;696;694;
+KJSV;--;---;Sallisaw, Sallisaw Municipal Airport;OK;United States;4;35-26-17N;094-48-10W;;;161;;
+KJVL;--;---;Janesville / Rock County;WI;United States;4;42-37N;089-02W;;;246;;
+KJWG;--;---;Watonga, Watonga Airport;OK;United States;4;35-51-53N;098-25-15W;;;472;;
+KJWX;--;---;Fort Ritchie;MD;United States;4;39-44N;077-26W;;;275;;
+KJWY;--;---;Midlothian/Waxahachie, Mid-Way Regional Airport;TX;United States;4;32-27-21N;096-54-44W;;;217;;
+KJXI;--;---;Gilmer, Fox Stephens Field - Gilmer Municipal Airport;TX;United States;4;32-41-56N;094-56-55W;;;127;;
+KJXN;--;---;Jackson, Jackson County-Reynolds Field Airport;MI;United States;4;42-15-35N;084-27-34W;;;305;;
+KJYG;--;---;St. James, St. James Municipal Airport;MN;United States;4;43-59-11N;094-33-29W;;;325;;
+KJYL;--;---;Sylvania, Plantation Airpark;GA;United States;4;32-38-43N;081-35-47W;;;57;;
+KJYM;--;---;Hillsdale, Hillsdale Municipal Airport;MI;United States;4;41-55-17N;084-35-09W;;;360;;
+KJYO;--;---;Leesburg / Godfrey;VA;United States;4;39-05N;077-34W;;;119;;
+KJYR;--;---;York, York Municipal Airport;NE;United States;4;40-53-48N;097-37-22W;;;509;;
+KKAL;--;---;Kaltag, Kaltag Airport;AK;United States;4;64-19-27N;158-43-59W;64-19-27N;158-43-59W;60;52;
+KKLS;--;---;Kelso, Kelso-Longview Airport;WA;United States;4;46-07N;122-54W;;;6;;
+KKVL;--;---;Kivalina, Kivalina Airport;AK;United States;4;67-43-52N;164-32-33W;67-43-52N;164-32-33W;3;3;
+KL10;--;---;San Clemente;CA;United States;4;33-25N;117-37W;;;3;;
+KL13;--;---;Point Loma / Cabrillo;CA;United States;4;32-40N;117-29W;;;111;;
+KL14;--;---;Cabrillo Beach;CA;United States;4;33-43N;118-17W;;;8;;
+KL21;--;---;Scripps Pier / La Jol;CA;United States;4;32-52N;117-15W;;;4;;
+KL27;--;---;Santa Catalina Island;CA;United States;4;33-20N;118-20W;;;3;;
+KL34;--;---;Oceanside Harbor;CA;United States;4;33-13N;117-24W;;;9;;
+KL40;--;---;High Island A489b;LA;United States;4;28-12N;094-12W;;;;;
+KL42;--;---;Oakdale, Allen Parish Airport;LA;United States;4;30-45-02N;092-41-19W;;;33;;
+KL46;--;---;Anacapa Island;CA;United States;4;34-01N;119-22W;;;42;;
+KL49;--;---;Galliano, South Lafourche Airport;LA;United States;4;29-26-41N;090-15-40W;;;0;;
+KL55;--;---;Malibu Beach;CA;United States;4;34-02N;118-41W;;;139;;
+KL58;--;---;Mission Beach;CA;United States;4;32-46N;117-14W;;;2;;
+KL79;--;---;Oxnard / Channel Island;CA;United States;4;34-10N;119-13W;;;2;;
+KL82;--;---;Terminal Island;CA;United States;4;33-44N;118-16W;;;10;;
+KL97;--;---;Point Vincente;CA;United States;4;33-44N;118-24W;;;5;;
+KL98;--;---;El Capitan Beach;CA;United States;4;33-27N;120-02W;;;27;;
+KLAA;--;---;Lamar, Lamar Municipal Airport;CO;United States;4;38-04-21N;102-41-12W;38-04-34N;102-41-31W;1128;1119;
+KLAF;--;---;Lafayette, Purdue University Airport;IN;United States;4;40-24-45N;086-56-51W;40-24-53N;086-56-00W;184;182;
+KLAL;--;---;Lakeland Regional;FL;United States;4;27-59N;082-01W;;;43;;
+KLAM;--;---;Los Alamos, Los Alamos Airport;NM;United States;4;35-52-47N;106-16-09W;;;2186;;
+KLAN;72;539;Lansing, Capital City Airport;MI;United States;4;42-46-49N;084-34-44W;42-46-27N;084-35-35W;262;264;
+KLAR;--;---;Laramie, Laramie Regional Airport;WY;United States;4;41-18-43N;105-40-30W;41-19-01N;105-40-16W;2218;2216;
+KLAS;72;386;Las Vegas, McCarran International Airport;NV;United States;4;36-04-44N;115-09-19W;36-04-58N;115-08-47W;663;636;P
+KLAW;--;---;Lawton, Lawton Municipal Airport;OK;United States;4;34-33-27N;098-25-00W;34-34-34N;098-25-16W;338;337;
+KLAX;72;295;Los Angeles, Los Angeles International Airport;CA;United States;4;33-56-17N;118-23-20W;33-56-41N;118-24-10W;38;46;P
+KLBB;72;267;Lubbock, Lubbock International Airport;TX;United States;4;33-40-03N;101-49-17W;33-39-30N;101-48-52W;1000;992;P
+KLBE;--;---;Latrobe / Westmorland;PA;United States;4;40-17N;079-24W;;;361;;
+KLBF;72;562;North Platte, North Platte Regional Airport;NE;United States;4;41-07-19N;100-40-06W;41-07-58N;100-41-54W;846;847;P
+KLBL;--;---;Liberal, Liberal Municipal Airport;KS;United States;4;37-03N;100-58W;;;879;;
+KLBR;--;---;Clarksville, Clarksville/Red River County-J D Trissell Field Airport;TX;United States;4;33-35-35N;095-03-48W;;;134;;
+KLBT;--;---;Lumberton, Lumberton Municipal Airport;NC;United States;4;34-36-26N;079-03-36W;34-36-50N;079-03-37W;38;37;
+KLBX;--;---;Angleton / Lake Jackson, Brazoria County Airport;TX;United States;4;29-06-55N;095-27-47W;29-06-42N;095-27-35W;7;6;
+KLCG;--;---;Wayne, Wayne Municipal Airport;NE;United States;4;42-14-30N;096-58-53W;;;436;;
+KLCH;72;240;Lake Charles, Lake Charles Regional Airport;LA;United States;4;30-07-34N;093-13-24W;30-07-29N;093-12-55W;5;3;P
+KLCI;--;---;Laconia, Laconia Municipal Airport;NH;United States;4;43-34N;071-25W;;;166;;
+KLCK;--;---;Rickenbacker Air National Guard Base;OH;United States;4;39-49N;082-56W;;;227;;
+KLDM;--;---;Ludington, Mason County Airport;MI;United States;4;43-58N;86-24W;;;197;;
+KLDS;--;---;Leeds;MT;United States;4;48-33N;109-41W;;;775;;
+KLEB;--;---;Lebanon, Lebanon Municipal Airport;NH;United States;4;43-37-38N;072-18-21W;43-37-41N;072-18-42W;182;171;
+KLEE;--;---;Leesburg, Leesburg Regional Airport;FL;United States;4;28-49-21N;081-48-32W;28-49-44N;081-48-48W;24;23;
+KLEW;--;---;Auburn-Lewiston;ME;United States;4;44-03N;070-17W;;;88;;
+KLEX;72;422;Lexington, Blue Grass Airport;KY;United States;4;38-02-27N;084-36-21W;38-02-13N;084-35-54W;298;300;P
+KLFI;74;598;Langley Air Force Base;VA;United States;4;37-05N;076-21W;;;3;6;
+KLFK;--;---;Lufkin, Angelina County Airport;TX;United States;4;31-14-02N;094-45-00W;31-13-53N;094-45-12W;90;88;
+KLFT;--;---;Lafayette, Lafayette Regional Airport;LA;United States;4;30-12-08N;091-59-35W;30-12-10N;091-59-42W;12;11;
+KLGA;72;503;New York, La Guardia Airport;NY;United States;4;40-46-45N;073-52-48W;40-46-25N;073-53-08W;6;11;P
+KLGB;72;297;Long Beach, Long Beach Airport;CA;United States;4;33-48-42N;118-08-47W;33-48-42N;118-08-57W;17;10;
+KLGC;--;---;La Grange, Callaway Airport;GA;United States;4;33-00-32N;085-04-21W;;;211;;
+KLGD;--;---;La Grande, La Grande/Union County Airport;OR;United States;4;45-17N;118-00W;;;828;;
+KLGU;--;---;Logan, Logan-Cache Airport;UT;United States;4;41-46-58N;111-51-14W;41-46-58N;111-51-12W;1357;1355;
+KLHB;--;---;Hearne, Hearne Municipal Airport;TX;United States;4;30-52-18N;096-37-20W;;;87;;
+KLHD;--;---;Anchorage, Lake Hood Sea Plane Base;AK;United States;4;61-10-41N;149-57-49W;61-10-41N;149-57-49W;21;28;
+KLHQ;--;---;Lancaster, Fairfield County Airport;OH;United States;4;39-45-26N;082-39-48W;39-45-10N;082-39-42W;264;260;
+KLHU;--;---;Lake Havasu Automatic Weather Observing / Reporting System;AZ;United States;4;34-28N;111-46W;;;147;;
+KLHW;72;209;Ft. Stewart;GA;United States;4;31-53N;081-34W;31-53N;081-34W;14;14;
+KLHX;--;---;La Junta, La Junta Municipal Airport;CO;United States;4;38-02-58N;103-30-44W;38-02-43N;103-30-41W;1288;1277;
+KLHZ;--;---;Louisburg, Franklin County Airport;NC;United States;4;36-01-24N;078-19-49W;;;113;;
+KLIC;--;---;Limon, Limon Municipal Airport;CO;United States;4;39-16-24N;103-40-00W;39-16-09N;103-40-00W;1635;1630;
+KLIT;--;---;Little Rock, Adams Field;AR;United States;4;34-43-36N;092-14-10W;34-43-59N;092-14-26W;79;79;
+KLIX;72;233;Slidell;LA;United States;4;30-20N;089-49W;30-20N;089-49W;8;8;
+KLIZ;--;---;Loring Air Force Base / Limeston;ME;United States;4;46-57N;067-53W;;;227;;
+KLJF;--;---;Litchfield, Litchfield Municipal Airport;MN;United States;4;45-05-50N;094-30-26W;;;348;;
+KLKU;--;---;Louisa, Louisa County Airport/Freeman Field;VA;United States;4;38-00-35N;077-58-13W;;;150;;
+KLKV;--;---;Lakeview, Lake County Airport;OR;United States;4;42-10N;120-24W;;;1443;;
+KLLJ;--;---;Challis, Challis Airport;ID;United States;4;44-31-22N;114-12-54W;44-31-12N;114-12-54W;1546;1536;
+KLLQ;--;---;Monticello, Monticello Municipal Airport/Ellis Field;AR;United States;4;33-38-18N;091-45-04W;33-38-04N;091-45-20W;82;83;
+KLMT;--;---;Klamath Falls, Klamath Falls International Airport;OR;United States;4;42-08-49N;121-43-27W;42-09-41N;121-44-32W;1247;1246;
+KLNC;--;---;Lancaster, Lancaster Airport;TX;United States;4;32-34-45N;096-43-08W;;;153;;
+KLND;72;576;Lander;WY;United States;4;42-48-53N;108-43-41W;42-49-00N;108-44-00W;1703;1694;P
+KLNK;72;551;Lincoln, Lincoln Municipal Airport;NE;United States;4;40-49-52N;096-45-52W;40-51-01N;096-44-52W;370;364;
+KLNL;--;---;Land O' Lakes, Kings Land O' Lakes Airport;WI;United States;4;46-09-14N;089-12-43W;;;520;;
+KLNN;--;---;Willoughby;OH;United States;4;41-41N;081-23W;;;191;;
+KLNP;--;---;Wise / Lonesome Pine;VA;United States;4;36-59N;082-32W;;;817;;
+KLNR;--;---;Lone Rock, Tri-County Regional Airport;WI;United States;4;43-12-43N;090-10-53W;43-12-48N;090-11-27W;219;217;
+KLNS;--;---;Lancaster, Lancaster Airport;PA;United States;4;40-07-13N;076-17-40W;40-07-28N;076-16-52W;123;125;
+KLOL;--;---;Lovelock, Derby Field Airport;NV;United States;4;40-03-59N;118-33-55W;40-04-13N;118-34-09W;1190;1189;
+KLOM;--;---;Philadelphia, Wings Field Airport;PA;United States;4;40-08-15N;075-15-54W;;;92;;
+KLOR;--;---;Fort Rucker, Lowe Army Heliport;AL;United States;4;31-21-32N;085-44-54W;;;78;93;
+KLOT;--;---;Chicago/Romeoville, Lewis University Airport;IL;United States;4;41-36-30N;088-05-39W;;;205;;
+KLOU;--;---;Louisville, Bowman Field Airport;KY;United States;4;38-13-40N;085-39-49W;38-13-40N;085-39-39W;166;164;
+KLOZ;--;---;London, London-Corbin Airport-Magee Field;KY;United States;4;37-05-22N;084-04-07W;37-05-15N;084-04-15W;369;362;
+KLPC;--;---;Lompoc, Lompoc Airport;CA;United States;4;34-40N;120-28W;;;27;;
+KLPR;--;---;Lorain / Elyria, Lorain County Regional Airport;OH;United States;4;41-20-46N;082-10-46W;41-20-20N;082-10-38W;242;241;
+KLRD;72;252;Laredo, Laredo International Airport;TX;United States;4;27-32-37N;099-27-41W;;;155;;
+KLRF;--;---;Little Rock Air Force Base;AR;United States;4;34-55N;092-09W;;;95;;
+KLRJ;--;---;Le Mars, Le Mars Municipal Airport;IA;United States;4;42-46-41N;096-11-37W;;;365;;
+KLRU;--;---;Las Cruces, Las Cruces International Airport;NM;United States;4;32-17-22N;106-55-19W;;;1358;;
+KLRX;--;---;Elko Nexrad;NV;United States;4;40-44-20N;116-48-10W;;;2019;;
+KLSD;--;---;Lexington / Creech;KY;United States;4;38-02N;084-37W;;;299;;
+KLSE;72;643;La Crosse, La Crosse Municipal Airport;WI;United States;4;43-52-46N;091-15-24W;43-52-18N;091-15-09W;199;200;
+KLSF;72;225;Fort Benning;GA;United States;4;32-20N;084-50W;32-20N;084-50W;71;130;
+KLSV;--;---;Nellis Air Force Base;NV;United States;4;36-14N;115-02W;;;570;;
+KLTS;72;352;Altus Air Force Base;OK;United States;4;34-39N;099-16W;34-39N;099-16W;420;420;
+KLTX;--;---;Wilmington Nexrad;NC;United States;4;33-59N;078-26W;;;44;;
+KLUD;--;---;Decatur, Decatur Municipal Airport;TX;United States;4;33-15-16N;097-34-50W;;;319;;
+KLUF;--;---;Luke Air Force Base / Phoenix;AZ;United States;4;33-32N;112-23W;33-32N;112-23W;332;332;
+KLUK;--;---;Cincinnati, Cincinnati Municipal Airport Lunken Field;OH;United States;4;39-06-21N;084-24-57W;39-06-26N;084-25-24W;147;155;
+KLUM;--;---;Menomonie, Menomonie Municipal Airport-Score Field;WI;United States;4;44-53-32N;091-52-04W;;;273;;
+KLVJ;--;---;Houston, Pearland Regional Airport;TX;United States;4;29-31-16N;095-14-31W;29-31-05N;095-14-29W;13;12;
+KLVK;--;---;Livermore, Livermore Municipal Airport;CA;United States;4;37-41-34N;121-48-52W;37-41-45N;121-49-01W;121;117;
+KLVM;--;---;Livingston, Mission Field Airport;MT;United States;4;45-41-58N;110-26-54W;45-41-49N;110-27-12W;1419;1418;
+KLVN;--;---;Minneapolis, Airlake Airport;MN;United States;4;44-37-40N;093-13-41W;;;293;;
+KLVS;--;---;Las Vegas, Las Vegas Municipal Airport;NM;United States;4;35-39-15N;105-08-33W;35-39-05N;105-08-50W;2096;2091;
+KLVX;--;---;Louisville Nexrad;KY;United States;4;37-59N;085-56W;;;254;;
+KLWA;--;---;South Haven, South Haven Area Regional Airport;MI;United States;4;42-21-03N;086-15-22W;;;203;;
+KLWB;--;---;Lewisburg / Greenbrier;WV;United States;4;37-52N;080-24W;;;702;;
+KLWC;--;---;Lawrence, Lawrence Municipal Airport;KS;United States;4;39-00-30N;095-12-42W;39-00-18N;095-12-57W;253;253;
+KLWD;--;---;Lamoni, Lamoni Municipal Airport;IA;United States;4;40-37-50N;093-54-03W;40-37-47N;093-54-01W;344;346;
+KLWM;--;---;Lawrence, Lawrence Municipal Airport;MA;United States;4;42-42-47N;071-07-33W;42-42-55N;071-07-14W;45;54;
+KLWS;72;783;Lewiston, Lewiston-Nez Perce County Airport;ID;United States;4;46-22-29N;117-00-52W;46-22-38N;117-00-37W;438;438;
+KLWT;--;---;Lewistown, Lewistown Municipal Airport;MT;United States;4;47-02-57N;109-27-59W;;;1270;;
+KLWV;--;---;Lawrenceville, Lawrenceville-Vincennes International Airport;IL;United States;4;38-45-38N;087-35-56W;38-45-40N;087-36-20W;131;131;
+KLWX;--;---;Baltimore / DC Nexrad;MD;United States;4;38-59N;077-29W;;;113;;
+KLXL;--;---;Little Falls, Little Falls/Morrison County Airport-Lindbergh Field;MN;United States;4;45-57N;094-21W;;;342;;
+KLXN;--;---;Lexington, Jim Kelly Field Airport;NE;United States;4;40-47-28N;099-46-38W;;;736;;
+KLXT;--;---;Lee's Summit, Lee's Summit Municipal Airport;MO;United States;4;38-57-35N;094-22-18W;;;306;;
+KLXV;--;---;Leadville, Lake County Airport;CO;United States;4;39-13-41N;106-18-58W;;;3026;3028;
+KLYH;72;410;Lynchburg, Lynchburg Regional Airport;VA;United States;4;37-19-15N;079-12-24W;37-19-45N;079-12-09W;285;295;
+KLYV;--;---;Luverne, Quentin Aanenson Field Airport;MN;United States;4;43-37-16N;096-12-56W;;;436;;
+KLZK;72;340;North Little Rock, North Little Rock Airport;AR;United States;4;34-50N;092-15W;34-50N;092-15W;165;165;P
+KLZU;--;---;Lawrenceville, Gwinnett County-Briscoe Field Airport;GA;United States;4;33-58-41N;083-57-45W;;;323;;
+KLZZ;--;---;Lampasas, Lampasas Airport;TX;United States;4;31-06-22N;098-11-45W;;;370;;
+KM19;--;---;Newport, Newport Municipal Airport;AR;United States;4;35-38-15N;091-10-34W;;;73;;;
+KM30;--;---;Metropolis, Metropolis Municipal Airport;IL;United States;4;37-11-09N;088-45-02W;;;117;;
+KM39;--;---;Mena, Mena Intermountain Municipal Airport;AR;United States;4;34-32-43N;094-12-09W;34-32-54N;094-12-33W;329;;
+KM82;--;---;Huntsville, Madison County Executive Airport;AL;United States;4;34-51-41N;086-33-26W;;;230;;
+KM89;--;---;Arkadelphia, Dexter B Florence Memorial Field Airport;AR;United States;4;34-05-59N;093-03-58W;;;56;;
+KM97;--;---;Tunica, Tunica Municipal Airport;MS;United States;4;34-40-51N;090-20-47W;;;59;;
+KMAE;--;---;Madera, Madera Municipal Airport;CA;United States;4;36-59-12N;120-06-39W;36-59-20N;120-06-28W;77;77;
+KMAF;72;265;Midland, Midland International Airport;TX;United States;4;31-56-52N;102-12-31W;31-56-38N;102-11-23W;875;872;P
+KMAI;--;---;Marianna, Marianna Municipal Airport;FL;United States;4;30-50-12N;085-11-01W;30-50-06N;085-10-56W;34;32;
+KMAX;--;---;Medford Nexrad;OR;United States;4;42-04-51N;122-42-57W;;;2290;
+KMBG;--;---;Mobridge, Mobridge Municipal Airport;SD;United States;4;45-33-00N;100-24-31W;45-32-35N;100-24-13W;522;510;
+KMBL;--;---;Manistee, Manistee County-Blacker Airport;MI;United States;4;44-16N;086-15W;;;189;;
+KMBS;--;---;Saginaw, MBS International Airport;MI;United States;4;43-31-58N;084-04-46W;43-31-36N;084-04-58W;204;202;
+KMCB;--;---;McComb, McComb / Pike County / John E Lewis Field Airport;MS;United States;4;31-10-42N;090-28-19W;31-10-55N;090-28-16W;126;124;
+KMCC;--;---;Sacramento, McClellan Airfield Airport;CA;United States;4;38-40N;121-24W;;;23;;
+KMCD;--;---;Macinac Island, Mackinac Island Airport;MI;United States;4;45-51-54N;084-38-14W;;;226;;
+KMCE;--;---;Merced, Merced Municipal Airport;CA;United States;4;37-16-59N;120-30-28W;37-17-20N;120-30-52W;47;47;
+KMCF;74;788;Macdill Air Force Base, Fl.;FL;United States;4;27-51N;082-30W;27-51N;082-30W;4;4;
+KMCG;--;---;McGrath, McGrath Airport;AK;United States;4;62-57-22N;155-36-21W;62-57-29N;155-36-00W;102;102;
+KMCI;72;446;Kansas City, Kansas City International Airport;MO;United States;4;39-17-50N;094-43-50W;39-17-57N;094-43-03W;312;320;P
+KMCK;--;---;McCook, McCook Municipal Airport;NE;United States;4;40-12-11N;100-35-18W;40-12-14N;100-35-38W;786;782;
+KMCN;72;217;Macon, Middle Georgia Regional Airport;GA;United States;4;32-41-16N;083-39-16W;32-42-05N;083-38-53W;107;109;P
+KMCO;72;205;Orlando, Orlando International Airport;FL;United States;4;28-25-02N;081-19-30W;28-25-52N;081-18-38W;29;29;P
+KMCW;--;---;Mason City, Mason City Municipal Airport;IA;United States;4;43-09-28N;093-19-53W;43-09-12N;093-20-11W;370;369;
+KMDD;--;---;Midland, Midland Airpark;TX;United States;4;32-02-11N;102-06-03W;;;854;;
+KMDH;--;---;Carbondale / Murphysboro, Southern Illinois Airport;IL;United States;4;37-46-59N;089-14-42W;37-46-36N;089-15-09W;125;130;
+KMDQ;--;---;Huntsville, Madison County Executive Airport;AL;United States;4;34-51-41N;086-33-26W;;;230;;
+KMDT;--;---;Harrisburg, Harrisburg International Airport;PA;United States;4;40-11-37N;076-45-48W;40-11-50N;076-45-48W;95;95;
+KMDW;72;534;Chicago, Chicago Midway Airport;IL;United States;4;41-47-03N;087-45-19W;41-46-49N;087-45-08W;188;188;
+KMDZ;--;---;Medford, Taylor County Airport;WI;United States;4;45-06-04N;090-18-12W;;;448;;
+KMEB;--;---;Maxton, Laurinburg-Maxton Airport;NC;United States;4;34-47-29N;079-22-05W;34-47-47N;079-22-07W;67;67;
+KMEH;--;---;Meacham, Meacham;OR;United States;4;45-30-41N;118-25-29W;45-30-41N;118-25-29W;1135;1136;
+KMEI;72;234;Meridian, Key Field;MS;United States;4;32-20-17N;088-44-52W;32-20-03N;088-44-25W;90;89;P
+KMEM;72;334;Memphis, Memphis International Airport;TN;United States;4;35-03-40N;089-59-06W;35-03-00N;089-58-45W;101;86;P
+KMER;72;481;Merced / Castle Air Force Base;CA;United States;4;37-22N;120-34W;37-23N;120-34W;57;60;
+KMEZ;--;---;Mena, Mena Intermountain Municipal Airport;AR;United States;4;34-32-43N;094-12-09W;34-32-54N;094-12-33W;329;;
+KMFD;--;---;Mansfield, Mansfield Lahm Municipal Airport;OH;United States;4;40-49-13N;082-31-04W;40-48-56N;082-30-45W;395;395;
+KMFE;--;---;McAllen, Miller International Airport;TX;United States;4;26-10-47N;098-14-40W;26-10-42N;098-14-17W;32;38;
+KMFI;--;---;Marshfield, Marshfield Municipal Airport;WI;United States;4;44-38-17N;090-11-15W;44-38-25N;090-11-01W;389;379;
+KMFR;72;597;Medford, Rogue Valley International Airport;OR;United States;4;42-22-52N;122-52-20W;42-22-37N;122-52-50W;405;396;P
+KMFV;--;---;Melfa / Accomack Airport;VA;United States;4;37-39N;075-46W;;;15;;
+KMGE;72;227;Marietta / Dobbins Air Force Base;GA;United States;4;33-55N;084-31W;;;326;326;P
+KMGG;--;---;Maple Lake, Maple Lake Municipal Airport;MN;United States;4;45-14-10N;093-59-08W;;;313;;
+KMGJ;--;---;Montgomery, Orange County Airport;NY;United States;4;41-30-33N;074-15-54W;41-30-55N;074-15-41W;111;108;
+KMGM;72;226;Montgomery, Dannelly Field;AL;United States;4;32-18-01N;086-24-22W;32-18-17N;086-23-27W;67;63;P
+KMGN;--;---;Harbor Springs, Harbor Springs Airport;MI;United States;4;45-25-32N;084-54-48W;;;209;;
+KMGR;--;---;Moultrie, Moultrie Municipal Airport;GA;United States;4;31-05-05N;083-48-11W;;;90;;
+KMGW;--;---;Morgantown, Morgantown Municipal-Hart Field;WV;United States;4;39-38-58N;079-55-16W;39-38-35N;079-55-12W;380;378;
+KMGY;--;---;Dayton, Dayton-Wright Brothers Airport;OH;United States;4;39-35-20N;084-13-29W;39-35-29N;084-13-42W;292;289;
+KMHE;--;---;Mitchell, Mitchell Municipal Airport;SD;United States;4;43-46N;098-02W;;;397;;
+KMHK;--;---;Manhattan, Manhattan Municipal Airport;KS;United States;4;39-08-07N;096-40-40W;39-08-03N;096-40-10W;321;317;
+KMHN;--;---;Mullen / Hooker County;NE;United States;4;42-03N;101-04W;;;994;;
+KMHR;--;---;Sacramento, Sacramento Mather Airport;CA;United States;4;38-33N;121-18W;;;29;;
+KMHS;--;---;Mount Shasta;CA;United States;4;41-18-57N;122-18-58W;41-18-56N;122-18-57W;1077;1078;
+KMHT;--;---;Manchester, Manchester Airport;NH;United States;4;42-55-45N;071-26-09W;42-56-01N;071-26-21W;71;81;
+KMHV;--;---;Mojave;CA;United States;4;35-04N;118-09W;;;849;;
+KMHX;72;305;Newport;NC;United States;4;34-47N;076-53W;34-47N;076-53W;11;11;
+KMIA;72;202;Miami, Miami International Airport;FL;United States;4;25-47-26N;080-18-59W;25-48-12N;080-17-49W;3;8;P
+KMIB;--;---;Minot Air Force Base;ND;United States;4;48-25N;101-21W;;;508;;
+KMIC;--;---;Minneapolis, Crystal Airport;MN;United States;4;45-03-45N;093-21-03W;45-03-39N;093-21-20W;264;265;
+KMIE;--;---;Muncie, Delaware County-Johnson Field;IN;United States;4;40-14-03N;085-23-37W;40-14-31N;085-23-47W;285;285;
+KMIV;--;---;Millville, Millville Municipal Airport;NJ;United States;4;39-21-58N;075-04-42W;39-22-12N;075-04-15W;26;23;
+KMIW;--;---;Marshalltown, Marshalltown Municipal Airport;IA;United States;4;42-06-38N;092-54-58W;42-06-31N;092-54-51W;296;296;
+KMJQ;--;---;Jackson, Jackson Municipal Airport;MN;United States;4;43-39N;094-59W;;;441;;
+KMKC;--;---;Kansas City, Kansas City Downtown Airport;MO;United States;4;39-07-15N;094-35-49W;39-07-27N;094-35-31W;231;227;
+KMKE;72;640;Milwaukee, General Mitchell International Airport;WI;United States;4;42-57-18N;087-54-16W;42-56-52N;087-54-23W;220;206;P
+KMKG;72;636;Muskegon, Muskegon County Airport;MI;United States;4;43-10-16N;086-14-12W;43-09-50N;086-14-19W;191;191;P
+KMKJ;--;---;Marion / Wytheville;VA;United States;4;36-54N;081-21W;;;780;;
+KMKK;--;---;Kaunakakai, Molokai Airport;HI;United States;5;21-09-28N;157-05-55W;21-09-29N;157-05-54W;138;141;
+KMKL;--;---;Jackson, McKellar-Sipes Regional Airport;TN;United States;4;35-35-35N;088-55-00W;35-36-12N;088-55-22W;132;128;
+KMKN;--;---;Comanche, Comanche County-City Airport;TX;United States;4;31-55N;098-36-01W;;;423;;
+KMKO;--;---;Muskogee, Davis Field;OK;United States;4;35-39-25N;095-21-35W;35-39-33N;095-21-14W;185;185;
+KMKT;--;---;Mankato, Mankato Regional Airport;MN;United States;4;44-13N;093-55W;;;311;;
+KMKX;--;---;Milwaukee NEXRAD;WI;United States;4;42-58N;088-33W;;;312;;
+KMLB;72;204;Melbourne, Melbourne International Airport;FL;United States;4;28-06-10N;080-38-45W;28-05-57N;080-38-36W;10;10;
+KMLC;--;---;McAlester, McAlester Regional Airport;OK;United States;4;34-52-56N;095-46-59W;34-52-30N;095-46-59W;234;232;
+KMLD;--;---;Malad City;ID;United States;4;42-10N;112-18W;;;1373;;
+KMLE;--;---;Omaha, Millard Airport;NE;United States;4;41-11-45N;096-06-44W;;;320;;
+KMLF;--;---;Milford, Milford Municipal Airport;UT;United States;4;38-25-21N;113-00-35W;38-25-08N;113-00-34W;1536;1534;
+KMLI;72;544;Moline, Quad-City Airport;IL;United States;4;41-27-05N;090-30-53W;41-26-33N;090-30-34W;179;184;
+KMLJ;--;---;Milledgeville, Baldwin County Airport;GA;United States;4;33-09-15N;083-14-26W;;;117;;
+KMLP;--;---;Mullan Pass, Mullan Pass Vor;ID;United States;4;47-27-15N;115-40-11W;47-27-23N;115-38-45W;1829;1837;
+KMLS;74;230;Miles City, Frank Wiley Field Airport;MT;United States;4;46-25-41N;105-53-11W;46-25-40N;105-52-29W;801;801;
+KMLT;--;---;Millinocket, Millinocket Municipal Airport;ME;United States;4;45-38-52N;068-41-31W;45-38-38N;068-41-30W;124;123;
+KMLU;--;---;Monroe, Monroe Regional Airport;LA;United States;4;32-30-42N;092-01-53W;32-30-36N;092-02-36W;24;29;
+KMMH;--;---;Mammoth / June Lakes;CA;United States;4;37-37N;118-50W;;;2173;;
+KMMK;--;---;Meriden, Meriden Markham Municipal Airport;CT;United States;4;41-30-35N;072-49-40W;41-30-48N;072-49-49W;31;31;
+KMML;--;---;Marshall, Southwest Minnesota Regional Airport - Marshall/Ryan Field;MN;United States;4;44-27N;095-49W;;;360;;
+KMMO;74;460;Marseilles Island;IL;United States;4;41-22N;088-41W;;;223;225;
+KMMT;--;---;McEntire Air National Guard Weather Facility Base;SC;United States;4;33-55N;080-48W;;;77;;
+KMMU;--;---;Morristown Municipal;NJ;United States;4;40-48N;074-25W;;;57;;
+KMMV;--;---;McMinnville, McMinnville Municipal Airport;OR;United States;4;45-11-46N;123-07-56W;45-11-58N;123-08-17W;48;48;
+KMNH;--;---;Elbert Mountain, Monument Pass;CO;United States;4;39-13-00N;104-38-02W;;;2152;;
+KMNI;--;---;Manning / Cooper Regional;SC;United States;4;33-35N;080-13W;;;32;;
+KMNM;--;---;Menominee, Menominee-Marinette Twin County Airport;MI;United States;4;45-08N;087-38W;;;191;;
+KMNN;--;---;Marion, Marion Municipal Airport;OH;United States;4;40-37-00N;083-04-06W;40-36-59N;083-04-06W;303;301;
+KMOB;72;223;Mobile, Mobile Regional Airport;AL;United States;4;30-41-18N;088-14-44W;30-40-58N;088-14-30W;66;67;P
+KMOD;--;---;Modesto, Modesto City-County-Sham Field;CA;United States;4;37-37-27N;120-57-02W;37-37-45N;120-57-11W;29;29;
+KMOP;--;---;Mount Pleasant, Mount Pleasant Municipal Airport;MI;United States;4;43-37N;84-44W;;;230;;
+KMOT;--;---;Minot, Minot International Airport;ND;United States;4;48-15-34N;101-16-49W;48-16-13N;101-17-06W;523;519;
+KMOX;--;---;Morris, Morris Municipal Airport;MN;United States;4;45-34N;095-58W;;;347;;
+KMPO;--;---;Mount Pocono, Pocono Mountains Municipal Airport;PA;United States;4;41-08-20N;075-23-46W;41-08-47N;075-22-31W;584;577;
+KMPV;--;---;Barre / Montpelier, Knapp State Airport;VT;United States;4;44-12-17N;072-33-58W;44-12-08N;072-33-47W;355;343;
+KMPZ;--;---;Mount Pleasant, Mount Pleasant Municipal Airport;IA;United States;4;40-56-48N;091-30-40W;;;224;;
+KMQB;--;---;Macomb, Macomb Municipal Airport;IL;United States;4;40-31-13N;090-39-09W;;;216;;
+KMQE;--;---;East Milton;MA;United States;4;42-12-44N;71-06-53W;;;192;;
+KMQI;--;---;Manteo / Dare County Regional;NC;United States;4;35-55N;075-42W;;;4;;
+KMQM;--;---;Monida;MT;United States;4;44-34N;112-19W;;;2068;;
+KMQT;72;743;Marquette;MI;United States;4;46-32N;087-33W;46-34N;087-24W;434;434;P
+KMQY;--;---;Smyrna, Smyrna Airport;TN;United States;4;36-00-32N;086-31-12W;;;166;;
+KMRB;--;---;Martinsburg, Eastern West Virginia Regional/Shepherd Airport;WV;United States;4;39-24-07N;077-59-04W;39-23-58N;077-58-50W;170;164;
+KMRC;--;---;Columbia / Maury County;TN;United States;4;35-33N;087-11W;;;206;;
+KMRF;72;264;Marfa;TX;United States;4;30-22N;104-01W;;;1478;1481;P
+KMRH;--;---;Beaufort, Michael J Smith Field Airport;NC;United States;4;34-44-01N;076-39-38W;34-43-59N;076-39-16W;3;3;
+KMRI;--;---;Anchorage, Merrill Field;AK;United States;4;61-13-01N;149-51-18W;61-13-04N;149-50-25W;41;40;
+KMRJ;--;---;Mineral Point, Iowa County Airport;WI;United States;4;42-53-07N;090-13-55W;;;359;;
+KMRN;--;---;Morganton, Morganton-Lenoir Airport;NC;United States;4;35-49-17N;081-36-39W;;;387;;
+KMRX;--;---;Morristown Nexrad;TN;United States;4;36-10N;083-24W;;;437;;
+KMRY;--;---;Monterey, Monterey Peninsula Airport;CA;United States;4;36-35-26N;121-50-51W;36-35-17N;121-51-12W;77;66;
+KMSL;--;---;Muscle Shoals, North West Alabama Regional Airport;AL;United States;4;34-44-38N;087-35-58W;34-44-49N;087-37-03W;167;164;
+KMSN;72;641;Madison, Dane County Regional-Truax Field;WI;United States;4;43-08-26N;089-20-43W;43-08-22N;089-20-46W;262;261;P
+KMSO;72;773;Missoula, Missoula International Airport;MT;United States;4;46-55-15N;114-05-33W;46-55-30N;114-05-24W;975;975;P
+KMSP;72;658;Minneapolis, Minneapolis-St. Paul International Airport;MN;United States;4;44-52-59N;093-13-44W;44-53-15N;093-12-25W;256;265;P
+KMSS;--;---;Massena, Massena International-Richards Field;NY;United States;4;44-56-09N;074-50-44W;44-56-00N;074-50-35W;66;66;
+KMSV;--;---;Monticello, Sullivan County International Airport;NY;United States;4;41-42N;074-48W;;;428;;
+KMSX;--;---;Missoula NEXRAD;MT;United States;4;47-02N;113-59W;;;2451;;
+KMSY;72;231;New Orleans, New Orleans International Airport;LA;United States;4;29-59-34N;090-15-03W;29-59-11N;090-15-31W;1;5;P
+KMTC;--;---;Selfridge Air National Guard Base;MI;United States;4;42-37N;082-50W;;;177;;
+KMTH;--;---;Marathon, Marathon Airport;FL;United States;4;24-43-33N;081-02-52W;24-43-31N;081-02-57W;2;2;
+KMTJ;--;---;Montrose, Montrose Regional Airport;CO;United States;4;38-30-18N;107-53-51W;38-29-32N;107-53-21W;1755;1750;
+KMTN;--;---;Baltimore / Martin;MD;United States;4;39-20N;076-25W;;;7;;
+KMTO;--;---;Mattoon / Charleston, Coles County Memorial Airport;IL;United States;4;39-28-41N;088-16-45W;39-29-01N;088-16-33W;220;214;
+KMTP;--;---;Montauk, Montauk Airport;NY;United States;4;41-04-23N;071-55-24W;;;2;2;
+KMTV;--;---;Martinsville;VA;United States;4;36-38N;080-01W;;;287;;
+KMTW;--;---;Manitowoc, Manitowoc County Airport;WI;United States;4;44-08N;087-41W;;;198;;
+KMTX;--;---;Salt Lake Nexrad;UT;United States;4;41-26N;112-45W;;;2004;;
+KMUI;--;---;Muir Army Air Field / Indiantown;PA;United States;4;40-26N;076-34W;;;149;;
+KMUO;--;---;Mountain Home Air Force Base;ID;United States;4;43-03N;115-52W;;;913;;
+KMUT;--;---;Muscatine;IA;United States;4;41-22N;091-09W;;;167;;
+KMUX;--;---;Monterey NEXRAD;CA;United States;4;37-10N;121-54W;;;1082;;
+KMVE;--;---;Montevideo, Montevideo-Chippewa County Airport;MN;United States;4;44-58N;095-43W;;;315;;
+KMVL;--;---;Morrisville, Morrisville-Stowe State Airport;VT;United States;4;44-32-10N;072-36-58W;44-32-13N;072-36-57W;223;223;
+KMVN;--;---;Mount Vernon, Mount Vernon Airport;IL;United States;4;38-19N;088-52W;;;146;;
+KMVY;--;---;Vineyard Haven, Marthas Vineyard Airport;MA;United States;4;41-23-32N;070-37-00W;41-23-22N;070-36-45W;20;16;
+KMWA;--;---;Marion, Williamson County Regional Airport;IL;United States;4;37-45-01N;089-00-04W;;;144;;
+KMWC;--;---;Milwaukee / Timmerman;WI;United States;4;43-07N;088-02W;;;227;;
+KMWH;--;---;Moses Lake, Grant County Airport;WA;United States;4;47-11-35N;119-18-48W;47-11-23N;119-19-19W;361;362;
+KMWK;--;---;Mount Airy, Mount Airy/Surry County Airport;NC;United States;4;36-27-35N;080-33-11W;;;380;;
+KMWL;--;---;Mineral Wells, Mineral Wells Airport;TX;United States;4;32-46-54N;098-03-37W;32-47-00N;098-03-45W;297;284;
+KMWM;--;---;Windom, Windom Municipal Airport;MN;United States;4;43-54-48N;095-06-34W;;;430;;
+KMWN;72;613;Mount Washington;NH;United States;4;44-16N;071-18W;;;1909;1910;
+KMWS;72;289;Mount Wilson;CA;United States;4;34-14N;118-04W;;;1739;;
+KMWT;--;---;Mount Ida;AR;United States;4;34-33N;93-35W;;;214;;
+KMXF;--;---;Maxwell Air Force Base / Montgomery;AL;United States;4;32-23N;086-22W;;;51;;
+KMXO;--;---;Monticello Municipal;IA;United States;4;42-14N;091-10W;;;259;;
+KMYF;--;---;San Diego, Montgomery Field;CA;United States;4;32-48-52N;117-08-11W;32-49-01N;117-08-04W;128;136;
+KMYL;--;---;McCall, McCall Airport;ID;United States;4;44-53-00N;116-05-58W;44-53-50N;116-05-54W;1530;1533;
+KMYP;--;---;Salida Mountain, Monarch Pass;CO;United States;4;38-29-04N;106-19-01W;;;3667
+KMYR;74;791;Myrtle Beach Air Force Base;SC;United States;4;33-41N;078-56W;33-41N;078-56W;8;8;
+KMYV;--;---;Marysville, Yuba County Airport;CA;United States;4;39-05-52N;121-34-11W;39-05-50N;121-33-56W;19;21;
+KMZH;--;---;Moose Lake, Moose Lake Carlton County Airport;MN;United States;4;46-25N;092-48W;;;328;;
+KN00;--;---;Fulton, Oswego County Airport;NY;United States;4;43-20-59N;076-23-05W;43-21-03N;076-23-37W;144;138;
+KN11;--;---;New Haven Coast Guard Station;CT;United States;4;41-16N;072-54W;;;3;;
+KN28;--;---;Ambrose / Ft. Tilden;NY;United States;4;40-27N;073-49W;;;1;;
+KN60;--;---;Garrison;ND;United States;4;47-38-45N;101-26-22W;;;582;582;
+KN67;--;---;Philadelphia, Wings Field Airport;PA;United States;4;40-08-15N;075-15-54W;;;92;;
+KN78;74;590;Barnegat Coast Guard Station;NJ;United States;4;39-46N;074-06W;;;6;;
+KN80;--;---;Ocean City, Ocean City Municipal Airport;MD;United States;4;38-18-30N;075-07-26W;38-18-38N;075-07-13W;3;3;
+KN84;--;---;Bronx / Execution Coast Guard Station;NY;United States;4;40-53N;073-44W;;;8;;
+KN91;--;---;Cape May Coast Guard Station;NJ;United States;4;38-57N;074-53W;;;2;;
+KNAE;--;---;Astor, Bombing Range Detachment Astor;FL;United States;4;29-08-35N;081-37-58W;29-08-34N;081-37-59W;28;29;
+KNAK;--;---;Annapolis, United States Naval Academy;MD;United States;4;38-59-29N;076-29-00W;38-59-02N;076-29-03W;2;11;
+KNBC;--;---;Beaufort, Marine Corps Air Station;SC;United States;4;32-29-37N;080-42-11W;32-28-15N;080-43-26W;11;8;
+KNBE;--;---;Dallas United States Naval Air Station;TX;United States;4;32-44N;096-58W;;;150;;
+KNBG;--;---;New Orleans, Naval Air Station - Alvin Callender Field;LA;United States;4;29-49-31N;090-02-06W;;;1;;
+KNBJ;--;---;Barin, Barin Field, Naval Air Facility;AL;United States;4;30-23-28N;087-37-57W;30-23-20N;087-38-13W;13;14;
+KNBQ;--;---;Kings Bay, Naval Station;GA;United States;4;30-47-39N;081-33-25W;30-47-05N;081-34-14W;8;10;
+KNBT;--;---;Piney Island, Bt-11 Bombing Range;NC;United States;4;35-01-20N;076-27-45W;34-58-00N;076-23-11W;5;3;
+KNCA;--;---;Jacksonville, New River, Marine Corps Air Station;NC;United States;4;34-42-21N;077-26-27W;34-42-26N;077-26-07W;7;4;
+KNDZ;--;---;Milton, Whiting Field South;FL;United States;4;30-41-50N;087-01-12W;30-42-12N;087-00-54W;54;62;
+KNED;--;---;Winner, Wiley Field;SD;United States;4;43-23-22N;099-50-34W;43-23-17N;099-50-40W;619;621;
+KNEL;72;409;Lakehurst Naval Air Station;NJ;United States;4;40-02N;074-19W;40-02N;074-19W;31;24;
+KNEW;--;---;New Orleans, New Orleans Lakefront Airport;LA;United States;4;30-02-58N;090-01-44W;30-02-31N;090-01-32W;2;3;
+KNEX;--;---;Charleston Nise;SC;United States;4;32-55N;079-59W;;;12;;
+KNFE;--;---;Fentress, Naval Auxiliary Landing Field;VA;United States;4;36-42-03N;076-07-42W;36-42-20N;076-07-40W;3;4;
+KNFG;--;---;Oceanside, Camp Pendleton, Marine Corps Air Station;CA;United States;4;33-18-17N;117-21-14W;33-18-25N;117-21-13W;23;23;
+KNFJ;--;---;Milton, Choctaw Pensacola, Naval Auxiliary Landing Field;FL;United States;4;30-30-42N;086-57-14W;30-30-45N;086-57-19W;33;38;
+KNFL;--;---;Fallon, Naval Air Station;NV;United States;4;39-25-56N;118-41-08W;39-25-16N;118-42-34W;1199;1199;
+KNFW;--;---;Fort Worth, Naval Air Station;TX;United States;4;32-45-57N;097-26-00W;32-46-36N;097-25-54W;198;187;
+KNGP;--;---;Corpus Christi, Corpus Christi Naval Air Station/Truax Field;TX;United States;4;27-41-33N;097-17-28W;;;6;;
+KNGU;--;---;Norfolk, Naval Air Station;VA;United States;4;36-56-01N;076-17-45W;36-56-21N;076-17-34W;4;8;
+KNGW;--;---;Corpus Christi, NOLF Cabaniss Field Naval Outlying Field;TX;United States;4;27-42-01N;097-26-04W;;;9;;
+KNGZ;74;506;Alameda Naval Air Station;CA;United States;4;37-47N;122-19W;;;4;9;
+KNHK;72;404;Patuxent River, Naval Air Station;MD;United States;4;38-16-43N;076-24-50W;38-17-20N;076-25-23W;12;6;
+KNHZ;74;392;Brunswick, Naval Air Station;ME;United States;4;43-54-01N;069-56-06W;43-53-52N;069-56-06W;22;23;
+KNID;74;612;China Lake, Naval Air Facility;CA;United States;4;35-41-11N;117-41-24W;35-41-15N;117-40-47W;696;682;
+KNIP;--;---;Jacksonville, Naval Air Station;FL;United States;4;30-14-03N;081-40-29W;30-13-45N;081-40-03W;6;8;
+KNIS;--;---;Cherry Point, Marine Corps Air Station;NC;United States;4;34-53-11N;076-51-47W;34-54-35N;076-53-16W;8;9;
+KNJK;72;281;El Centro, Naval Air Facility;CA;United States;4;32-49-30N;115-39-38W;32-49-28N;115-40-22W;-13;-13;
+KNJM;--;---;Swansboro, Bogue Field, Marine Corps Auxiliary Landing Field;NC;United States;4;34-41-34N;077-01-46W;34-41-34N;077-01-46W;6;6;
+KNJW;--;---;Meridian, Joe Williams Naval Outlying Field;MS;United States;4;32-47-46N;088-49-54W;32-47-38N;088-49-58W;165;163;
+KNKT;72;309;Cherry Point, Marine Corps Air Station;NC;United States;4;34-53-52N;076-52-51W;34-54-35N;076-53-16W;8;9;
+KNKX;72;293;San Diego, Miramar MCAS/Mitscher Field Airport;CA;United States;4;32-52-06N;117-08-33W;32-52-28N;117-08-20W;146;146;
+KNLC;74;702;Lemoore, Naval Air Station;CA;United States;4;36-18-13N;119-56-17W;36-19-40N;119-56-50W;71;72;
+KNLT;--;---;Atlantic, Atlantic Field Outlying Landing Field;NC;United States;4;34-52-45N;076-20-10W;34-52-35N;076-20-50W;4;4;
+KNMM;--;---;Meridian, Meridian Naval Air Station - McCain Field;MS;United States;4;32-33-07N;088-33-19W;32-33N;088-33W;97;86;
+KNMT;--;---;McMullen, McMullen Target Site;TX;United States;4;28-14-10N;098-43-27W;28-14-10N;098-43-25W;79;85;
+KNNZ;--;---;Point Sur;CA;United States;4;36-18N;121-53W;;;34;;
+KNOG;--;---;Orange Grove, Naval Auxiliary Landing Field;TX;United States;4;27-53-21N;098-02-39W;27-53-58N;098-02-54W;78;91;
+KNOW;74;201;Port Angeles Coast Guard Air Station;WA;United States;4;48-08N;123-24W;;;5;9;
+KNPA;--;---;Pensacola, Naval Air Station;FL;United States;4;30-21-22N;087-19-24W;30-20-51N;087-19-40W;9;10;
+KNQA;--;---;Millington, Millington Municipal Airport;TN;United States;4;35-21-24N;089-52-13W;;;98;;
+KNQI;--;---;Kingsville, Naval Air Station;TX;United States;4;27-30-11N;097-48-42W;27-30-20N;097-48-51W;15;15;
+KNQX;--;---;Key West, Naval Air Station;FL;United States;4;24-34-46N;081-41-02W;27-34-49N;081-41-18W;1;6;
+KNRA;--;---;Coupeville, Outlying Landing Field;WA;United States;4;48-11-26N;122-37-50W;48-11-27N;122-37-45W;60;59;
+KNRB;--;---;Mayport, Mayport Naval Station, Adm David L. McDonald Field;FL;United States;4;30-23-45N;081-25-21W;30-23-33N;081-25-02W;5;4;
+KNRC;--;---;Crows Landing Naval Auxiliary Landing Field;CA;United States;4;37-24N;121-06W;;;50;;
+KNRS;--;---;Imperial Beach, Naval Auxiliary Landing Field;CA;United States;4;32-33-47N;117-06-36W;;;7;5;
+KNSE;--;---;Milton, Whiting Field Naval Air Station North;FL;United States;4;30-43-27N;087-01-19W;30-43-04N;087-01-21W;61;60;
+KNSI;72;291;San Nicholas Island;CA;United States;4;33-14-05N;119-27-10W;33-14-25N;119-27-31W;153;153;
+KNTD;72;391;Point Mugu, Naval Air Warfare Center;CA;United States;4;34-07-26N;119-07-18W;34-06-46N;119-07-04W;3;2;
+KNTU;--;---;Virginia Beach, Oceana, Naval Air Station;VA;United States;4;36-49-16N;076-01-42W;36-49-07N;076-02-00W;6;6;
+KNUC;--;---;San Clemente Island, San Clemente Island NALF;CA;United States;4;33-01-24N;118-35-13W;33-01-19N;118-35-01W;55;62;
+KNUI;--;---;St. Inigoes, Webster Field, Naval Electronic Systems Engineering Activity;MD;United States;4;38-08-56N;076-25-12W;38-08-30N;076-25-45W;6;6;
+KNUQ;74;509;Mountain View, Moffett Field;CA;United States;4;37-24-21N;122-02-53W;37-24-32N;122-02-59W;10;19;
+KNUW;--;---;Whidbey Island, Naval Air Station;WA;United States;4;48-20-57N;122-39-02W;48-20-45N;122-40-06W;14;8;
+KNVT;--;---;Corpus Christi, NOLF Waldron Field;TX;United States;4;27-38-01N;097-18-47W;;;8;;
+KNXP;--;---;Twenty-Nine Palms, Marine Corps Air-Ground Combat Center;CA;United States;4;34-17-40N;116-08-42W;34-17-41N;116-09-08W;626;627;
+KNXX;--;---;Willow Grove, Naval Air Station;PA;United States;4;40-11-35N;075-08-40W;40-12-15N;075-08-20W;110;101;
+KNYC;--;---;New York City, Central Park;NY;United States;4;40-47-00N;073-58-00W;;;47;48;
+KNYG;--;---;Quantico, Marine Corps Air Facility;VA;United States;4;38-30-45N;077-17-30W;38-32-20N;077-18-25W;3;3;
+KNYL;--;---;Yuma, Marine Corps Air Station;AZ;United States;4;32-37-25N;113-45-50W;32-39-34N;114-35-35W;64;63;
+KNZC;--;---;Cecil, Naval Air Station;FL;United States;4;30-12-44N;081-52-13W;30-13-16N;081-52-51W;24;26;
+KNZY;--;---;San Diego, North Island, Naval Air Station;CA;United States;4;32-41-27N;117-12-32W;32-47-08N;117-11-49W;7;14;
+KO18;--;---;Hanford, Hanford Municipal Airport;CA;United States;4;36-19-03N;119-37-46W;36-18-52N;119-37-39W;75;74;
+KO64;72;590;Fort Bragg;CA;United States;4;39-24N;123-49W;;;19;;
+KO72;--;---;Point Cabrillo;CA;United States;4;39-21N;123-49W;;;20;;
+KO87;--;---;Shelter Cove;CA;United States;4;40-01N;124-04W;;;21;;
+KOAJ;--;---;Jacksonville, Albert J Ellis Airport;NC;United States;4;34-50N;077-37W;;;29;;
+KOAK;72;493;Oakland, Metro Oakland International Airport;CA;United States;4;37-43-10N;122-14-07W;37-42-45N;122-12-48W;1;26;P
+KOAX;72;558;Valley;NE;United States;4;41-19N;096-22W;41-19N;096-22W;350;350;
+KOCF;--;---;Ocala, Ocala International Airport-Jim Taylor Field;FL;United States;4;29-10N;082-13W;;;27;;
+KOCH;--;---;Nacogdoches, A L Mangham Jr. Regional Airport;TX;United States;4;31-35N;094-43W;;;108;;
+KOCW;--;---;Washington, Warren Field Airport;NC;United States;4;35-34-14N;077-02-59W;;;12;;
+KODO;--;---;Odessa, Odessa-Schlemeyer Field;TX;United States;4;31-55-17N;102-23-30W;31-55-08N;102-23-32W;914;902;
+KODX;--;---;Ord, Evelyn Sharp Field Airport;NE;United States;4;41-37-27N;098-57-09W;;;631;;
+KOEB;--;---;Coldwater, Branch County Memorial Airport;MI;United States;4;41-56N;085-03-09W;;;292;;
+KOEO;--;---;Osceola, L O Simenstad Municipal Airport;WI;United States;4;45-18-31N;092-41-24W;;;275;;
+KOFF;72;554;Omaha / Offutt Air Force Base;NE;United States;4;41-07N;095-54W;;;319;315;
+KOFK;72;556;Norfolk, Stefan Memorial Airport;NE;United States;4;41-58-50N;097-26-13W;41-59-05N;097-25-48W;479;470;P
+KOFP;--;---;Ashland, Hanover County Municipal Airport;VA;United States;4;37-42-29N;077-26-04W;37-42-25N;077-26-18W;62;62;
+KOGA;--;---;Ogallala, Searle Field Airport;NE;United States;4;41-07-11N;101-46-08W;;;999;;
+KOGB;--;---;Orangeburg, Orangeburg Municipal Airport;SC;United States;4;33-27-50N;080-51-13W;33-27-59N;080-51-18W;60;59;
+KOGD;72;575;Ogden, Ogden-Hinckley Airport;UT;United States;4;41-11-37N;112-00-59W;41-11-36N;112-00-25W;1362;1353;
+KOGS;--;---;Ogdensburg International;NY;United States;4;44-41N;075-28W;;;91;;
+KOHX;--;---;Nashville NEXRAD;TN;United States;4;36-45N;086-34W;;;206;;
+KOJA;--;---;Weatherford, Thomas P Stafford Airport;OK;United States;4;35-32-41N;098-40-06W;;;489;;
+KOJC;--;---;Olathe, Johnson County Executive Airport;KS;United States;4;38-51-00N;094-44-21W;38-50-51N;094-44-14W;334;326;
+KOKB;--;---;Oceanside, Oceanside Municipal Airport;CA;United States;4;33-13-05N;117-21-05W;33-13-03N;117-21-07W;9;8;
+KOKC;72;353;Oklahoma City, Will Rogers World Airport;OK;United States;4;35-23-19N;097-36-01W;35-24-05N;097-36-04W;394;390;P
+KOKH;--;---;Oceanside, Oceanside Municipal Airport;CA;United States;4;33-13-10N;117-20-58W;33-13-03N;117-21-07W;8;8;
+KOKK;--;---;Kokomo, Kokomo Municipal Airport;IN;United States;4;40-32N;086-04W;;;253;;
+KOKM;--;---;Okmulgee, Okmulgee Municipal Airport;OK;United States;4;35-40-05N;095-56-55W;;;220;;
+KOKV;--;---;Winchester Regional;VA;United States;4;39-09N;078-09W;;;222;;
+KOKX;--;---;N. Y. City NEXRAD;NY;United States;4;40-52N;072-52W;;;60;;
+KOLD;--;---;Old Town / Dewitt Field;ME;United States;4;44-57N;068-40W;;;39;;
+KOLE;--;---;Olean Municipal;NY;United States;4;42-14N;078-22W;;;651;;
+KOLF;--;---;Wolf Point, Clayton Airport;MT;United States;4;48-05-40N;105-34-38W;48-05-43N;105-34-21W;605;604;
+KOLM;72;792;Olympia, Olympia Airport;WA;United States;4;46-58-24N;122-54-12W;46-58-30N;122-53-46W;62;58;
+KOLS;--;---;Nogales, Nogales International Airport;AZ;United States;4;31-25-15N;110-50-45W;31-25-05N;110-50-57W;1198;1184;
+KOLU;--;---;Columbus, Columbus Municipal Airport;NE;United States;4;41-27N;097-20W;;;440;;
+KOLV;--;---;Olive Branch, Olive Branch Airport;MS;United States;4;34-58-44N;089-47-13W;;;122;;
+KOLY;--;---;Olney-Noble, Olney-Noble Airport;IL;United States;4;38-43-19N;088-10-35W;;;147;;
+KOLZ;--;---;Oelwein, Oelwein Municipal Airport;IA;United States;4;42-40-51N;091-58-28W;;;328;;
+KOMA;72;550;Omaha, Eppley Airfield;NE;United States;4;41-18-37N;095-53-57W;41-18-03N;095-53-55W;299;312;P
+KOMH;--;---;Orange, Orange County Airport;VA;United States;4;38-14-50N;78-02-44W;;;142;;
+KOMK;--;---;Omak, Omak Airport;WA;United States;4;48-27-51N;119-31-05W;48-27-40N;119-30-54W;397;395;
+KOMN;--;---;Ormond Beach, Ormond Beach Municipal Airport;FL;United States;4;29-18-04N;081-06-49W;;;9;;
+KONA;--;---;Winona, Winona Municipal Airport-Max Conrad Field;MN;United States;4;44-05N;091-42W;;;200;;
+KONL;--;---;O'Neill / Baker Field;NE;United States;4;42-28N;098-41W;;;619;;
+KONM;72;362;Socorro Municipal;NM;United States;4;34-01N;106-54W;;;1478;;
+KONO;--;---;Ontario, Ontario Municipal Airport;OR;United States;4;44-01-10N;117-00-35W;44-01-24N;117-00-46W;667;667;
+KONP;--;---;Newport, Newport Municipal Airport;OR;United States;4;44-34-49N;124-03-29W;;;49;;
+KONT;--;---;Ontario, Ontario International Airport;CA;United States;4;34-03-12N;117-34-33W;34-03-05N;117-35-55W;287;275;
+KONX;--;---;Currituck, Currituck County Airport;NC;United States;4;36-23-56N;076-00-58W;;;5;;
+KONZ;--;---;Detroit/Grosse Ile, Grosse Ile Airport;MI;United States;4;42-05-55N;083-09-40W;;;180;;
+KOOA;--;---;Oskaloosa, Oskaloosa Municipal Airport;IA;United States;4;41-13-34N;092-29-37W;;;256;;
+KOPF;--;---;Miami, Opa Locka Airport;FL;United States;4;25-54-36N;080-16-59W;25-54-35N;080-16-23W;3;16;
+KOPN;--;---;Thomaston, Thomaston-Upson County Airport;GA;United States;4;32-57-18N;084-15-52W;;;243;;
+KOQT;--;---;Oak Ridge;TN;United States;4;36-01-22N;84-14W;;;279;;
+KOQU;--;---;N. Kingston / Quonset;RI;United States;4;41-36N;071-25W;;;6;;
+KORB;--;---;Orr;MN;United States;4;48-01N;092-52W;;;397;;
+KORC;--;---;Orange City;IA;United States;4;42-59N;096-04W;;;431;;
+KORD;72;530;Chicago, Chicago-O'Hare International Airport;IL;United States;4;41-58-47N;087-54-16W;42-00N;087-53W;203;200;P
+KORE;--;---;Orange, Orange Municipal Airport;MA;United States;4;42-34-18N;072-16-39W;42-34-20N;072-16-31W;169;164;
+KORF;72;308;Norfolk, Norfolk International Airport;VA;United States;4;36-54-13N;076-11-31W;36-53-28N;076-17-06W;8;14;P
+KORG;--;---;Orange, Orange County Airport;TX;United States;4;30-04-09N;093-48-13W;;;4;;
+KORH;--;---;Worcester, Worcester Regional Airport;MA;United States;4;42-16-14N;071-52-23W;42-16-10N;071-52-18W;307;304;
+KORL;--;---;Orlando, Orlando Executive Airport;FL;United States;4;28-32-47N;081-20-09W;28-32-37N;081-19-44W;34;37;
+KORS;--;---;Eastsound, Orcas Island Airport;WA;United States;4;48-42-29N;122-54-37W;;;9;;
+KOSA;--;---;Mount Pleasant, Mount Pleasant Regional Airport;TX;United States;4;33-05-43N;094-57-41W;;;111;;
+KOSC;--;---;Oscoda, Oscoda-Wurtsmith Airport;MI;United States;4;44-27N;083-22W;;;193;;
+KOSH;--;---;Oshkosh, Wittman Regional Airport;WI;United States;4;43-58-00N;088-33-29W;43-58-54N;088-33-37W;246;248;
+KOSU;--;---;Columbus, Ohio State University Airport;OH;United States;4;40-04-41N;083-04-41W;40-04-30N;083-04-16W;275;280;
+KOTG;--;---;Worthington, Worthington Municipal Airport;MN;United States;4;43-39N;095-35W;;;480;;
+KOTH;--;---;North Bend, North Bend Municipal Airport;OR;United States;4;43-25N;124-15W;;;5;;
+KOTM;--;---;Ottumwa, Ottumwa Industrial Airport;IA;United States;4;41-06-24N;092-26-53W;41-06-24N;092-26-44W;258;256;
+KOUN;72;357;Norman / Max Westheimer;OK;United States;4;35-13N;097-27W;35-13N;097-27W;357;357;
+KOVE;--;---;Oroville, Oroville Municipal Airport;CA;United States;4;39-29-41N;121-37-13W;39-29-42N;121-36-48W;57;58;
+KOVL;--;---;Olivia, Olivia Regional Airport;MN;United States;4;44-46-43N;095-01-58W;;;328;;
+KOVS;--;---;Boscobel, Boscobel Airport;WI;United States;4;43-09-22N;090-40-39W;43-08-42N;090-42-07W;205;202;
+KOWA;--;---;Owatonna, Owatonna Degner Regional Airport;MN;United States;4;44-07N;093-15W;;;349;;
+KOWB;--;---;Owensboro, Owensboro-Daviess County Airport;KY;United States;4;37-44-24N;087-10-00W;;;124;;
+KOWD;--;---;Norwood, Norwood Memorial Airport;MA;United States;4;42-11-27N;071-10-26W;42-11-10N;071-10-39W;15;19;
+KOWY;--;---;Owyhee;NV;United States;4;41-57N;116-06W;;;1645;;
+KOXB;--;---;Ocean City, Ocean City Municipal Airport;MD;United States;4;38-18-38N;075-07-26W;;;4;;
+KOXC;--;---;Oxford, Waterbury-Oxford Airport;CT;United States;4;41-29N;073-08W;;;221;;
+KOXR;--;---;Oxnard, Oxnard Airport;CA;United States;4;34-12-02N;119-12-11W;34-11-58N;119-12-20W;13;20;
+KOXV;--;---;Knoxville;IA;United States;4;41-18N;093-07W;;;283;;
+KOZR;--;---;Cairns Army Air Field / Ozark;AL;United States;4;31-17N;085-43W;;;91;;
+KOZW;--;---;Howell, Livingston County Airport;MI;United States;4;42-37-46N;083-59-03W;;;293;;
+KP00;--;---;Tenneco Platform;LA;United States;4;28-00N;093-00W;;;15;;
+KP01;--;---;Ajo Municipal;AZ;United States;4;32-27N;112-52W;;;444;;
+KP06;--;---;Bullhead City;AZ;United States;4;35-10N;114-34W;;;167;;
+KP07;74;730;Sanderson;TX;United States;4;30-10N;102-25W;;;865;865;P
+KP11;72;758;Devils Lake;ND;United States;4;48-06N;098-52W;;;439;443;P
+KP21;--;---;Main Pass B68;LA;United States;4;29-40N;088-53W;;;1;;
+KP22;--;---;Vermilion B131;LA;United States;4;29-04N;092-11W;;;1;;
+KP24;72;765;Roseglen;ND;United States;4;47-45N;101-50W;;;624;624;P
+KP25;--;---;Vermilion B215;LA;United States;4;28-42N;092-19W;;;1;;
+KP26;--;---;Grand Isle B95;LA;United States;4;28-30N;090-07W;;;1;;
+KP28;72;452;Medicine Lodge, Medicine Lodge;KS;United States;4;37-17-02N;098-33-10W;;;469;469;
+KP30;--;---;West Cameron;LA;United States;4;28-20N;093-01W;;;24;;
+KP35;72;540;Spickard;MO;United States;4;40-15N;093-43W;;;271;270;P
+KP38;72;487;Caliente;NV;United States;4;37-36-44N;114-31-35W;37-36-44N;114-31-35W;1333;1333;P
+KP39;72;750;Pequot Lake;MN;United States;4;46-36N;094-19W;;;390;390;
+KP43;--;---;Ventura Harbor;CA;United States;4;34-15N;119-15W;;;7;;
+KP44;--;---;Santa Barbara Harbor;CA;United States;4;34-24N;119-42W;;;8;;
+KP47;--;---;Chetco River Coast Guard Station;OR;United States;4;42-09N;124-16W;;;6;;
+KP53;--;---;Munising, Munising Lakeshore Observation;MI;United States;4;46-24-42N;086-39-03W;;;;;
+KP58;--;---;Port Hope;MI;United States;4;44-01-19N;082-47-35W;;;179;179;
+KP59;--;---;Copper Harbor;MI;United States;4;47-28-01N;087-52-30W;;;190;190;
+KP60;--;---;Yellowstone Lake;WY;United States;4;44-32-40N;110-25-16W;;;2388;2388;
+KP61;--;---;Grand Marais;MN;United States;4;47-44-50N;090-20-40W;;;185;185;
+KP65;--;---;Lukeville;AZ;United States;4;31-53N;112-49W;;;511;;
+KP67;--;---;Lidgerwood Remote Automatic Meteorological Observing System;ND;United States;4;46-06N;097-09W;;;351;;
+KP68;--;---;Eureka;NV;United States;4;39-36-05N;116-00-20W;;;1812;1809;
+KP69;--;---;Lowell;ID;United States;4;46-08-39N;115-35-47W;;;480;480;
+KP75;--;---;Manistique;MI;United States;4;45-57-00N;086-13-47W;;;178;178;
+KP88;--;---;Rome Automatic Meteorological Observing System;OR;United States;4;42-54N;117-39W;;;1162;;
+KP92;--;---;Salt Point;LA;United States;4;29-33-44N;091-31-32W;;;0;0;
+KPAE;--;---;Everett, Snohomish County Airport;WA;United States;4;47-55-23N;122-16-57W;47-54-25N;122-16-42W;184;180;
+KPAH;72;435;Paducah, Barkley Regional Airport;KY;United States;4;37-03-23N;088-46-26W;37-04-07N;088-46-20W;125;118;
+KPAM;74;775;Tyndall Air Force Base;FL;United States;4;30-04N;085-35W;30-04N;085-35W;5;13;
+KPAO;--;---;Palo Alto Airport;CA;United States;4;37-28N;122-07W;;;2;;
+KPAQ;--;---;Palmer, Palmer Municipal Airport;AK;United States;4;61-35-46N;149-05-30W;61-35-52N;149-05-29W;70;69;
+KPAT;--;---;Pathfinder Hill;WY;United States;4;42-34N;106-51W;;;1912;;
+KPBF;--;---;Pine Bluff, Grider Field Airport;AR;United States;4;34-10-30N;091-56-05W;34-10-44N;091-56-16W;63;62;
+KPBG;--;---;Plattsburgh Air Force Base;NY;United States;4;44-39N;073-28W;;;72;;
+KPBH;--;---;Phillips / Price County;WI;United States;4;45-42N;090-24W;;;449;;
+KPBI;72;203;West Palm Beach, Palm Beach International Airport;FL;United States;4;26-41-05N;080-05-58W;26-40-40N;080-06-30W;5;6;P
+KPBV;--;---;St. George Island, New St. George Airport;AK;United States;4;56-34-37N;169-39-47W;56-34-37N;169-39-47W;27;34;
+KPBZ;--;---;Pittsburgh Nexrad;PA;United States;4;40-32N;080-13W;;;386;;
+KPCM;--;---;Plant City, Plant City Municipal Airport;FL;United States;4;28-00N;082-09W;;;47;;
+KPCU;--;---;Picayune / Pearl River;MS;United States;4;30-31N;089-42W;;;19;;
+KPCZ;--;---;Waupaca, Waupaca Municipal Airport;WI;United States;4;44-20-01N;089-00-55W;;;252;;
+KPDC;--;---;Prairie Du Chien, Prairie Du Chien Municipal Airport;WI;United States;4;43-01-19N;091-07-29W;;;201;;
+KPDK;--;---;Atlanta, De Kalb-Peachtree Airport;GA;United States;4;33-52-42N;084-17-53W;33-52-30N;084-17-06W;305;302;
+KPDT;72;688;Pendleton, Eastern Oregon Regional At Pendleton Airport;OR;United States;4;45-41-54N;118-50-03W;45-41-22N;118-50-18W;455;458;P
+KPDX;72;698;Portland, Portland International Airport;OR;United States;4;45-35-27N;122-36-01W;45-35-50N;122-36-21W;8;7;P
+KPEA;--;---;Pella, Pella Municipal Airport;IA;United States;4;41-24N;092-56W;;;270;;
+KPEF;--;---;Peterson Air Force Base;CO;United States;4;38-49N;104-44W;;;1876;;
+KPEO;--;---;Penn Yan, Penn Yan Airport;NY;United States;4;42-38-35N;077-02-58W;42-38-37N;077-03-32W;275;256;
+KPEQ;--;---;Pecos, Pecos Municipal Airport;TX;United States;4;31-22-56N;103-30-38W;;;796;;
+KPEX;--;---;Paynesville, Paynesville Municipal Airport;MN;United States;4;45-22-20N;094-44-47W;;;360;;
+KPFC;--;---;Pacific City State;OR;United States;4;45-12N;123-58W;;;2;;
+KPFN;--;---;Panama City, Panama City-Bay County International Airport;FL;United States;4;30-12-27N;085-41-06W;30-12-22N;085-40-54W;6;12;
+KPGA;72;371;Page, Page Municipal Airport;AZ;United States;4;36-55-14N;111-26-53W;36-55-15N;111-26-53W;1314;1307;P
+KPGD;--;---;Punta Gorda, Charlotte County Airport;FL;United States;4;26-55-04N;081-59-37W;26-54-57N;081-59-53W;7;7;
+KPGL;--;---;Pascagoula / Jackson;MS;United States;4;30-24N;088-29W;;;3;;
+KPGV;--;---;Pitt-Greenville Airport;NC;United States;4;35-38N;077-24W;;;8;;
+KPHD;--;---;New Philadelphia, Harry Clever Field;OH;United States;4;40-28-19N;081-25-25W;40-28-13N;081-25-03W;272;272;
+KPHF;--;---;Newport News, Newport News / Williamsburg International Airport;VA;United States;4;37-07-55N;076-29-35W;37-07-54N;076-30-04W;13;12;
+KPHL;72;408;Philadelphia, Philadelphia International Airport;PA;United States;4;39-52-06N;075-13-52W;39-52-34N;075-14-37W;6;18;P
+KPHN;--;---;St. Clair County International;MI;United States;4;42-55N;082-32W;;;198;;
+KPHP;--;---;Philip, Philip Airport;SD;United States;4;44-03-04N;101-36-04W;44-03-08N;101-36-00W;673;672;
+KPHX;72;278;Phoenix, Phoenix Sky Harbor International Airport;AZ;United States;4;33-26-03N;112-03-04W;33-26-07N;112-00-33W;345;336;P
+KPIA;72;532;Peoria, Greater Peoria Regional Airport;IL;United States;4;40-40-03N;089-41-02W;40-39-59N;089-41-15W;201;205;P
+KPIB;--;---;Hattiesburg/Laurel, Hattiesburg-Laurel Regional Airport;MS;United States;4;31-28N;089-20W;;;91;;
+KPIE;--;---;St. Petersburg / Clearwater, St. Petersburg / Clearwater International Airport;FL;United States;4;27-54-44N;082-41-08W;27-54-14N;082-41-30W;3;4;
+KPIH;72;578;Pocatello, Pocatello Regional Airport;ID;United States;4;42-55-13N;112-34-16W;42-54-16N;112-35-24W;1356;1359;P
+KPIL;--;---;Port Isabel, Port Isabel-Cameron County Airport;TX;United States;4;26-09-33N;097-20-15W;26-09-34N;097-20-21W;5;5;
+KPIN;--;---;Piney Creek;WY;United States;4;44-34N;106-49W;;;1392;;
+KPIR;--;---;Pierre, Pierre Regional Airport;SD;United States;4;44-22-58N;100-17-09W;44-22-49N;100-17-32W;531;526;
+KPIT;72;520;Pittsburgh, Pittsburgh International Airport;PA;United States;4;40-30-14N;080-15-59W;40-29-41N;080-11-25W;366;357;P
+KPJB;--;---;Payson;AZ;United States;4;34-16N;111-21W;;;1571;;
+KPJI;--;---;Point Judith Coast Guard Station;RI;United States;4;41-21N;071-28W;;;2;;
+KPKB;--;---;Parkersburg, Mid-Ohio Valley Regional Airport;WV;United States;4;39-20-42N;081-26-21W;;;262;;
+KPKD;--;---;Park Rapids, Park Rapids Municipal Airport;MN;United States;4;46-54-02N;095-04-04W;46-53-55N;095-03-51W;439;442;
+KPKF;72;741;Park Falls;WI;United States;4;45-56N;090-27W;;;462;469;P
+KPKV;--;---;Port Lavaca, Calhoun County Airport;TX;United States;4;28-39-14N;096-40-52W;;;9;;
+KPLB;--;---;Plattsburgh, Clinton County Airport;NY;United States;4;44-40-56N;073-31-40W;44-41-29N;073-31-19W;113;106;
+KPLN;--;---;Pellston, Pellston Regional Airport of Emmet County Airport;MI;United States;4;45-34-15N;084-47-48W;45-34-08N;084-47-10W;220;217;
+KPMD;72;382;Palmdale, Palmdale Production Flight Plant;CA;United States;4;34-37-47N;118-04-53W;34-37-12N;118-04-50W;775;780;
+KPMP;--;---;Pompano Beach, Pompano Beach Airpark;FL;United States;4;26-14-44N;080-06-41W;26-14-35N;080-06-51W;6;6;
+KPMV;--;---;Plattsmouth, Plattsmouth Municipal Airport;NE;United States;4;40-57-00N;095-55-04W;;;366;;
+KPNA;--;---;Pinedale, Ralph Wenz Field Airport;WY;United States;4;42-47-43N;109-48-25W;;;2160;;
+KPNC;--;---;Ponca City, Ponca City Municipal Airport;OK;United States;4;36-43-50N;097-05-59W;36-43-45N;097-06-04W;307;308;
+KPNE;--;---;Philadelphia, Northeast Philadelphia Airport;PA;United States;4;40-04-44N;075-00-49W;40-04-31N;075-00-35W;36;28;
+KPNM;--;---;Princeton;MN;United States;4;45-33N;093-36W;;;298;;
+KPNS;--;---;Pensacola, Pensacola Regional Airport;FL;United States;4;30-28-41N;087-11-13W;30-28-37N;087-11-33W;36;38;
+KPNT;--;---;Pontiac, Pontiac Municipal Airport;IL;United States;4;40-55-25N;088-37-31W;;;201;;
+KPOB;72;303;Pope Air Force Base;NC;United States;4;35-10N;079-02W;35-10N;079-02W;61;61;
+KPOC;--;---;La Verne / Brackett;CA;United States;4;34-06N;117-47W;;;308;;
+KPOE;72;239;Fort Polk, Polk AAF Ft Polk;LA;United States;4;31-03N;093-11-38W;;;101;;
+KPOF;--;---;Poplar Bluff, Poplar Bluff Municipal Airport;MO;United States;4;36-46-14N;090-19-20W;;;100;100;
+KPOU;--;---;Poughkeepsie, Dutchess County Airport;NY;United States;4;41-37-36N;073-53-03W;41-37-28N;073-52-57W;50;46;
+KPPA;--;---;Pampa, Perry Lefors Field Airport;TX;United States;4;35-36-46N;100-59-46W;;;989;;
+KPPF;--;---;Parsons, Tri-City Airport;KS;United States;4;37-19-40N;095-30-15W;37-20-17N;095-30-31W;274;274;
+KPPQ;--;---;Pittsfield, Pittsfield Penstone Municipal Airport;IL;United States;4;39-38-20N;090-46-42W;;;216;;
+KPQI;72;713;Presque Isle;ME;United States;4;46-41N;068-03W;;;163;146;
+KPQL;--;---;Pascagoula, Lott International Airport;MS;United States;4;30-27-49N;088-31-55W;30-27-45N;088-31-36W;5;6;
+KPQN;--;---;Pipestone, Pipestone Municipal Airport;MN;United States;4;43-59N;096-19W;;;529;;
+KPRB;--;---;Paso Robles, Paso Robles Municipal Airport;CA;United States;4;35-40-22N;120-37-37W;35-40-19N;120-38-13W;255;245;
+KPRC;--;---;Prescott, Love Field;AZ;United States;4;34-38-57N;112-25-20W;34-38-58N;112-25-14W;1537;1524;
+KPRG;--;---;Paris, Edgar County Airport;IL;United States;4;39-42-01N;087-40-11W;;;199;;
+KPRX;--;---;Paris / Cox Field;TX;United States;4;33-38N;095-27W;;;167;;
+KPSC;--;---;Pasco, Tri-Cities Airport;WA;United States;4;46-16-11N;119-07-00W;46-15-37N;119-06-52W;124;121;
+KPSF;--;---;Pittsfield, Pittsfield Municipal Airport;MA;United States;4;42-25-38N;073-17-21W;42-25-32N;073-17-30W;364;355;
+KPSK;--;---;Dublin / New River Valley;VA;United States;4;37-08N;080-41W;;;642;;
+KPSM;--;---;Pease Air Force Base / Portsmouth;NH;United States;4;43-05N;070-49W;;;31;;
+KPSN;--;---;Palestine, Palestine Municipal Airport;TX;United States;4;31-46-46N;095-42-22W;;;129;;
+KPSP;--;---;Palm Springs, Palm Springs Regional Airport;CA;United States;4;33-49-20N;116-30-13W;33-49-35N;116-30-26W;140;135;
+KPSX;--;---;Palacios, Palacios Municipal Airport;TX;United States;4;28-43-39N;096-15-03W;;;5;;
+KPTB;--;---;Petersburg, Dinwiddie County Airport;VA;United States;4;37-11N;077-31W;;;59;;
+KPTK;--;---;Pontiac, Oakland County International Airport;MI;United States;4;42-39-47N;083-24-36W;42-39-46N;083-25-00W;299;300;
+KPTN;--;---;Patterson Memorial;LA;United States;4;29-43N;091-20W;;;3;;
+KPTT;74;543;Pratt Municipal;KS;United States;4;37-42N;098-45W;37-42N;098-45W;595;595;
+KPTV;--;---;Porterville, Porterville Municipal Airport;CA;United States;4;36-02N;119-04W;;;135;;
+KPTW;--;---;Pottstown, Pottstown Limerick Airport;PA;United States;4;40-14-18N;075-33-26W;40-14-31N;075-33-22W;89;89;
+KPUB;72;464;Pueblo, Pueblo Memorial Airport;CO;United States;4;38-17-24N;104-29-54W;38-17-03N;104-29-43W;1440;1420;P
+KPUC;72;470;Price, Carbon County Airport;UT;United States;4;39-36-33N;110-45-17W;39-36-41N;110-44-55W;1805;2091;P
+KPUM;--;---;Pumpkin Vine;WY;United States;4;41-03N;105-28W;;;2420;;
+KPUW;--;---;Pullman / Moscow, Pullman / Moscow Regional Airport;WA;United States;4;46-44-38N;117-06-35W;46-44-37N;117-06-48W;779;773;
+KPUX;--;---;Pueblo NEXRAD;CO;United States;4;38-28N;104-11W;;;1620;;
+KPVC;--;---;Provincetown, Provincetown Municipal Airport;MA;United States;4;42-04N;070-13W;;;2;;
+KPVD;72;507;Providence, Theodore Francis Green State Airport;RI;United States;4;41-43-26N;071-25-41W;41-43-53N;071-25-43W;16;16;
+KPVJ;--;---;Pauls Valley, Pauls Valley Municipal Airport;OK;United States;4;34-42-40N;097-13-24W;;;295;;
+KPVU;--;---;Provo, Provo Municipal Airport;UT;United States;4;40-13N;111-43W;;;1371;;
+KPVW;--;---;Plainview, Hale County Airport;TX;United States;4;34-10-05N;101-43-02W;;;1028;;
+KPWA;--;---;Oklahoma City, Wiley Post Airport;OK;United States;4;35-32-28N;097-38-48W;35-31-52N;097-38-34W;396;397;
+KPWC;--;---;Pine River, Pine River Regional Airport;MN;United States;4;46-43-30N;094-23-01W;;;395;;
+KPWG;--;---;Waco, Mc Gregor Executive Airport;TX;United States;4;31-29N;097-19W;;;180;;
+KPWK;--;---;Chicago / Wheeling, Pal-Waukee Airport;IL;United States;4;42-07-15N;087-54-17W;42-06-37N;087-54-11W;197;203;
+KPWM;72;606;Portland, Portland International Jetport;ME;United States;4;43-38-32N;070-18-16W;43-38-53N;070-18-09W;22;15;P
+KPWT;--;---;Bremerton, Bremerton National Airport;WA;United States;4;47-30N;122-45W;;;134;;
+KPYM;--;---;Plymouth, Plymouth Municipal Airport;MA;United States;4;41-54-31N;070-43-41W;41-54-34N;070-43-54W;45;43;
+KPYX;--;---;Perryton, Perryton Ochiltree County Airport;TX;United States;4;36-24N;100-44W;;;890;;
+KPZQ;--;---;Rogers City, Presque Isle County Airport;MI;United States;4;45-24-25N;083-48-46W;;;204;;
+KQCA;--;---;Granite Peak;UT;United States;4;40-10N;113-21W;;;1310;;
+KQCB;--;---;Little Mountain;UT;United States;4;41-15N;112-15W;;;1326;;
+KQCJ;--;---;Eagle Range;UT;United States;4;41-03N;113-05W;;;1294;;
+KQIR;--;---;Al Udeid;;Qatar;2;25-07N;051-18E;;;42;;
+KQUK;--;---;Camp Bondsteel;;Serbia and Montenegro;6;42-35N;021-23E;;;592;;
+KRAC;--;---;Racine, Batten International Airport;WI;United States;4;42-45-31N;087-49-04W;42-45-32N;087-49-13W;205;203;
+KRAD;--;---;Warroad Automatic Weather Observing / Reporting System;MN;United States;4;48-56N;095-20W;;;328;;
+KRAL;--;---;Riverside, Riverside Municipal Airport;CA;United States;4;33-57-05N;117-27-02W;33-56-59N;117-26-21W;248;252;
+KRAP;72;662;Rapid City, Rapid City Regional Airport;SD;United States;4;44-02-44N;103-03-14W;44-02-33N;103-03-43W;976;965;P
+KRAS;--;---;Port Aransas, Mustang Beach Airport;TX;United States;4;27-48-42N;097-05-19W;;;2;;
+KRAX;--;---;Raleigh NEXRAD;NC;United States;4;35-40N;078-30W;;;141;;
+KRBD;--;---;Dallas, Redbird Airport;TX;United States;4;32-40-33N;096-51-50W;32-40-51N;096-51-51W;201;203;
+KRBG;--;---;Roseburg, Roseburg Regional Airport;OR;United States;4;43-14-02N;123-21-22W;43-14-10N;123-21-23W;160;154;
+KRBL;72;591;Red Bluff, Red Bluff Municipal Airport;CA;United States;4;40-09-02N;122-15-08W;40-09-19N;122-14-28W;106;104;P
+KRBO;--;---;Robstown, Nueces County Airport;TX;United States;4;27-46-42N;097-41-25W;;;24;;
+KRCA;--;---;Ellsworth Air Force Base;SD;United States;4;44-09N;103-06W;;;999;;
+KRCX;--;---;Ladysmith, Ruck County Airport;WI;United States;4;45-29-48N;091-00-01W;;;377;;
+KRDD;72;592;Redding, Redding Municipal Airport;CA;United States;4;40-30-54N;122-17-48W;40-31-00N;122-17-50W;153;155;
+KRDG;--;---;Reading, Reading Regional Airport;PA;United States;4;40-22-24N;075-57-34W;40-22-33N;075-57-58W;105;109;
+KRDK;--;---;Red Oak;IA;United States;4;41-01N;095-16W;;;318;;
+KRDM;--;---;Redmond, Roberts Field Airport;OR;United States;4;44-15-15N;121-08-59W;;;938;;
+KRDR;--;---;Grand Forks Air Force Base;ND;United States;4;47-58N;097-24W;47-58N;097-24W;278;278;
+KRDU;72;306;Raleigh / Durham, Raleigh-Durham International Airport;NC;United States;4;35-52-14N;078-47-11W;35-52-59N;078-47-01W;133;130;P
+KRED;--;---;Red Lodge;MT;United States;4;45-11N;109-16W;;;1757;;
+KREE;--;---;Reese Air Force Base / Lubbock;TX;United States;4;33-36N;102-03W;;;1017;;
+KREO;--;---;Rome, Rome;OR;United States;4;42-35-26N;117-51-52W;42-35-24N;117-52-07W;1234;1235;
+KRFD;72;543;Rockford, Greater Rockford Airport;IL;United States;4;42-11-34N;089-05-36W;42-11-25N;089-05-10W;224;221;
+KRGK;--;---;Red Wing, Red Wing Municipal Airport;MN;United States;4;44-35-25N;092-29-10W;;;239;;
+KRGX;--;---;Reno NEXRAD;NV;United States;4;39-45N;119-28W;;;2560;;
+KRHI;--;---;Rhinelander, Rhinelander-Oneida County Airport;WI;United States;4;45-37-54N;089-28-56W;45-37-34N;089-27-48W;495;485;
+KRHP;--;---;Andrews, Andrews-Murphy Airport;NC;United States;4;35-11-42N;083-51-49W;;;517;;
+KRHV;--;---;San Jose / Reid / Hillv;CA;United States;4;37-20N;121-49W;;;41;;
+KRIC;72;401;Richmond, Richmond International Airport;VA;United States;4;37-30-40N;077-19-24W;37-30-34N;077-19-55W;51;50;P
+KRIE;--;---;Rice Lake Municipal;WI;United States;4;45-29N;091-43W;;;347;;
+KRIL;--;---;Rifle, Garfield County Regional Airport;CO;United States;4;39-31-30N;107-43-38W;39-31-25N;107-43-30W;1690;1678;
+KRIV;72;286;Riverside / March Air Force Base;CA;United States;4;33-54N;117-15W;;;469;468;
+KRIW;72;672;Riverton, Riverton Regional Airport;WY;United States;4;43-03-43N;108-26-47W;43-03-43N;108-27-19W;1684;1664;
+KRJO;--;---;San Marcos Automatic Weather Observing / Reporting System;TX;United States;4;29-54N;097-52W;;;182;;
+KRKD;--;---;Rockland, Knox County Regional Airport;ME;United States;4;44-04N;069-06W;;;17;;
+KRKP;--;---;Rockport, Aransas County Airport;TX;United States;4;28-05-01N;097-02-47W;28-05-23N;097-02-45W;7;6;
+KRKR;--;---;Poteau, Robert S Kerr Airport;OK;United States;4;35-01-18N;094-37-17W;;;138;;
+KRKS;72;574;Rock Springs, Rock Springs-Sweetwater County Airport;WY;United States;4;41-35-39N;109-03-55W;;;2060;;
+KRLX;--;---;Charleston;WV;United States;4;38-19N;081-43W;;;364;;
+KRME;--;---;Griffiss Air Force Base / Rome;NY;United States;4;43-14N;075-24W;;;154;;
+KRMG;72;320;Rome, R. B. Russell Airport;GA;United States;4;34-20-52N;085-09-40W;34-21-09N;085-09-44W;194;193;
+KRMN;--;---;Stafford, Stafford Regional Airport;VA;United States;4;38-23-53N;077-27-19W;;;65;;
+KRMY;--;---;Marshall, Brooks Field Airport;MI;United States;4;42-15-04N;084-57-20W;;;287;;
+KRND;--;---;Randolph Air Force Base;TX;United States;4;29-32N;098-17W;;;232;;
+KRNH;--;---;New Richmond, New Richmond Municipal Airport;WI;United States;4;45-08-54N;092-32-17W;;;304;;
+KRNM;--;---;Ramona, Ramona Airport;CA;United States;4;33-02-15N;116-54-57W;33-02-27N;116-54-39W;424;427;
+KRNO;72;488;Reno, Reno Tahoe International Airport;NV;United States;4;39-29-02N;119-46-16W;39-29-53N;119-46-24W;1345;1342;P
+KRNP;--;---;Owosso, Owosso Community Airport;MI;United States;4;42-59-34N;084-08-20W;;;224;;
+KRNT;--;---;Renton, Renton Municipal Airport;WA;United States;4;47-29-40N;122-12-46W;47-29-50N;122-12-43W;8;21;
+KROA;72;411;Roanoke, Roanoke Regional Airport;VA;United States;4;37-19-01N;079-58-27W;37-19-32N;079-58-34W;358;362;P
+KROC;72;529;Rochester, Greater Rochester International Airport;NY;United States;4;43-07-00N;077-40-36W;43-07-44N;077-40-27W;170;178;
+KROG;--;---;Rogers, Rogers Municipal Airport-Carter Field;AR;United States;4;36-22N;094-06W;;;414;;
+KROS;--;---;Rush City, Rush City Regional Airport;MN;United States;4;45-41-53N;092-57-11W;;;281;;
+KROW;72;268;Roswell, Roswell Industrial Air Center Airport;NM;United States;4;33-18-29N;104-30-28W;33-18-25N;104-31-38W;1118;1112;
+KROX;--;---;Roseau, Roseau Municipal Airport/Rudy Billberg Field;MN;United States;4;48-51N;095-42W;;;323;;
+KRPD;--;---;Rice Lake, Rice Lake Regional-Carl's Field Airport;WI;United States;4;45-25-05N;091-46-25W;;;337;;
+KRPE;--;---;Sabine Pass;TX;United States;4;29-42N;093-57W;;;3;;
+KRPH;--;---;Graham, Graham Municipal Airport;TX;United States;4;33-06-36N;098-33-19W;;;342;;
+KRPJ;--;---;Rochelle, Rochelle Municipal-Koritz Field Airport;IL;United States;4;41-53-35N;089-04-42W;;;238;;
+KRQB;--;---;Big Rapids, Roben-Hood Airport;MI;United States;4;43-43-21N;085-30-15W;;;302;;
+KRQE;72;276;Window Rock, Window Rock Airport;AZ;United States;4;35-39N;109-04W;35-39-34N;109-03-31W;2055;2055;
+KRQO;--;---;El Reno, El Reno Regional Airport;OK;United States;4;35-28-21N;098-00-20W;;;432;;
+KRRF;--;---;New Port Richey, Tampa Bay Executive Airport;FL;United States;4;28-11-21N;082-37-33W;28-11-19N;082-37-44W;12;12;
+KRRL;--;---;Merrill, Merrill Municipal Airport;WI;United States;4;45-11N;089-42W;;;401;;
+KRRT;--;---;Warroad, Warroad International Airport-Swede Carlson Field;MN;United States;4;48-56-29N;095-20-54W;;;327;;
+KRSL;--;---;Russell, Russell Municipal Airport;KS;United States;4;38-52-22N;098-48-47W;;;567;567;
+KRSN;--;---;Ruston, Ruston Regional Airport;LA;United States;4;32-30-52N;092-35-18W;;;95;;
+KRST;72;644;Rochester, Rochester International Airport;MN;United States;4;43-54-15N;092-29-30W;43-54-42N;092-29-30W;401;403;P
+KRSV;--;---;Robinson, Robinson Municipal Airport;IL;United States;4;39-00-57N;087-38-59W;;;141;;
+KRSW;--;---;Fort Myers, Southwest Florida International Airport;FL;United States;4;26-31-37N;081-45-59W;26-32-13N;081-45-32W;9;9;
+KRTN;--;---;Raton, Raton Municipal \ Crews Field Airport;NM;United States;4;36-44-31N;104-39-28W;;;1935;1939;
+KRTX;--;---;Portland NEXRAD;OR;United States;4;45-43N;122-58W;;;514;;
+KRUE;72;342;Russellville, Russellville Regional Airport;AR;United States;4;35-15-32N;093-05-36W;35-15-35N;093-05-48W;123;115;
+KRUM;72;618;Rumford;ME;United States;4;44-32N;070-32W;;;192;205;
+KRUQ;--;---;Salisbury, Rowan County Airport;NC;United States;4;35-39N;080-31W;;;236;;
+KRUT;--;---;Rutland, Rutland State Airport;VT;United States;4;43-32N;072-57W;;;240;;
+KRVL;--;---;Reedsville / Mifflin;PA;United States;4;40-41N;077-38W;;;250;;
+KRVS;--;---;Tulsa, Jones Jr. Airport;OK;United States;4;36-02-33N;095-59-22W;36-02-09N;095-59-23W;194;200;
+KRWF;--;---;Redwood Falls, Redwood Falls Municipal Airport;MN;United States;4;44-32-50N;095-04-56W;44-32-35N;095-04-38W;312;311;
+KRWI;--;---;Rocky Mount, Rocky Mount-Wilson Regional Airport;NC;United States;4;35-51-18N;077-53-35W;35-51-02N;077-53-54W;49;47;
+KRWL;--;---;Rawlins, Rawlins Municipal Airport;WY;United States;4;41-48-20N;107-11-59W;;;2077;;
+KRWV;--;---;Caldwell, Caldwell Municipal Airport;TX;United States;4;30-30-55N;096-42-14W;;;119;;
+KRXE;--;---;Rexburg, Rexburg-Madison County Airport;ID;United States;4;43-49-54N;111-48-22W;43-49-55N;111-48-20W;1481;1480;
+KRYV;--;---;Watertown;WI;United States;4;43-10N;088-43W;;;254;;
+KRYY;--;---;Marietta, Cobb County-McCollum Field Airport;GA;United States;4;34-00-47N;084-35-55W;;;317;;
+KRZN;--;---;Siren, Burnett County Airport;WI;United States;4;45-49-22N;092-22-21W;;;301;;
+KRZZ;--;---;Roanoke Rapids, Halifax County Airport;NC;United States;4;36-26-22N;077-42-35W;36-26-32N;077-42-37W;77;75;
+KS02;--;---;Ship Shoal B224a;LA;United States;4;28-30N;091-18W;;;32;;
+KS06;--;---;Mullan Aviation Weather Reporting Station;ID;United States;4;47-28N;115-48W;;;1011;;
+KS14;--;---;Spencer;ID;United States;4;44-21N;112-11W;;;1793;;
+KS21;--;---;Sunriver;OR;United States;4;43-53N;121-27W;;;1266;;
+KS29;--;---;Salida;CO;United States;4;38-31N;106-01W;;;2186;;
+KS38;--;---;Burrows Island;WA;United States;4;48-05N;122-06W;;;18;;
+KS47;--;---;Tillamook, Tillamook Airport;OR;United States;4;45-25-05N;123-48-52W;;;11;;
+KS53;--;---;Destruction Island;WA;United States;4;47-40N;124-29W;;;24;;
+KS58;--;---;South Timbalier;LA;United States;4;28-32N;090-35W;;;1;;
+KS65;--;---;Ship Shoal 198g;LA;United States;4;28-30N;091-12W;;;2;;
+KS80;--;---;Grangeville ;ID;United States;4;45-57N;116-08W;;;1009;;
+KS88;--;---;Skykomish, Skykomish State Airport;WA;United States;4;47-42N;121-20W;;;304;;
+KSAC;72;483;Sacramento, Sacramento Executive Airport;CA;United States;4;38-30-25N;121-29-42W;38-30-50N;121-29-49W;6;11;
+KSAD;--;---;Safford, Safford Municipal Airport;AZ;United States;4;32-51-26N;109-38-08W;32-51-01N;109-38-16W;968;962;
+KSAF;--;---;Santa Fe, Santa Fe County Municipal Airport;NM;United States;4;35-36-38N;106-05-42W;35-37-03N;106-05-03W;1934;1930;
+KSAN;72;290;San Diego, San Diego International-Lindbergh Field;CA;United States;4;32-44-01N;117-10-59W;32-44-11N;117-11-22W;4;12;P
+KSAR;--;---;Sparta, Sparta Community-Hunter Field Airport;IL;United States;4;38-08-56N;089-41-55W;;;164;;
+KSAT;72;253;San Antonio, San Antonio International Airport;TX;United States;4;29-31-58N;098-27-49W;29-31-42N;098-28-25W;246;243;P
+KSAV;72;207;Savannah, Savannah International Airport;GA;United States;4;32-07-08N;081-12-08W;32-07-34N;081-11-55W;15;14;P
+KSAW;--;---;Marquette, Sawyer International Airport;MI;United States;4;46-21-13N;087-23-43W;;;372;;
+KSAZ;--;---;Staples, Staples Municipal Airport;MN;United States;4;46-22-51N;094-48-24W;;;392;;
+KSBA;--;---;Santa Barbara, Santa Barbara Municipal Airport;CA;United States;4;34-25-34N;119-50-37W;34-25-49N;119-50-36W;3;3;
+KSBD;--;---;Norton Air Force Base / San Bern;CA;United States;4;34-06N;117-14W;;;353;;
+KSBM;--;---;Sheboygan, Sheboygan County Memorial Airport;WI;United States;4;43-46-35N;087-50-59W;43-45-41N;087-51-04W;228;232;
+KSBN;72;535;South Bend, South Bend Regional Airport;IN;United States;4;41-42-32N;086-19-07W;41-42-31N;086-18-52W;244;237;
+KSBP;--;---;San Luis Obispo, San Luis Obispo County-Mc Chesney Field;CA;United States;4;35-14-10N;120-38-10W;35-14-19N;120-38-22W;63;59;
+KSBS;--;---;Steamboat Springs;CO;United States;4;40-31N;106-52W;;;2096;;
+KSBY;--;---;Salisbury, Salisbury-Ocean City Wicomico County Regional Airport;MD;United States;4;38-20-26N;075-30-37W;38-20-32N;075-31-00W;16;19;
+KSCC;--;---;Deadhorse, Deadhorse Airport;AK;United States;4;70-11-30N;148-28-38W;70-11-53N;148-28-03W;17;23;
+KSCH;--;---;Schenectady Airport;NY;United States;4;42-51N;073-56W;;;115;;
+KSCK;72;492;Stockton, Stockton Metropolitan Airport;CA;United States;4;37-53-23N;121-13-25W;37-53-51N;121-15-00W;9;10;P
+KSDA;--;---;Shenandoah Municipal;IA;United States;4;40-45N;095-25W;;;296;;
+KSDB;72;383;Sandberg;CA;United States;4;34-44-37N;118-43-28W;34-44-37N;118-43-27W;1378;1377;
+KSDF;72;423;Louisville, Standiford Field;KY;United States;4;38-10-38N;085-43-47W;38-10-44N;085-43-50W;151;146;
+KSDL;--;---;Scottsdale, Scottsdale Airport;AZ;United States;4;33-37-22N;111-54-38W;33-37-17N;111-54-34W;460;447;
+KSDM;--;---;San Diego, Brown Field Municipal Airport;CA;United States;4;32-34-31N;116-59-35W;32-34-10N;116-59-04W;164;159;
+KSDY;--;---;Sidney-Richland;MT;United States;4;47-42N;104-12W;;;605;;
+KSEA;72;793;Seattle, Seattle-Tacoma International Airport;WA;United States;4;47-26-41N;122-18-49W;47-26-37N;122-18-07W;130;136;P
+KSEE;--;---;San Diego/El Cajon, Gillespie Field Airport;CA;United States;4;32-49-34N;116-58-20W;;;118;;
+KSEG;--;---;Selinsgrove, Penn Valley Airport;PA;United States;4;40-49-09N;076-51-58W;40-48-59N;076-51-25W;137;134;
+KSEM;--;---;Craig Field / Selma;AL;United States;4;32-21N;086-59W;;;51;;
+KSEP;72;260;Stephenville, Clark Field Municipal Airport;TX;United States;4;32-13N;098-11W;32-13N;098-11W;403;402;
+KSET;--;---;St. Charles, St. Charles County Smartt Airport;MO;United States;4;38-55-50N;090-25-57W;38-55-49N;090-26-01W;133;134;
+KSEZ;--;---;Sedona Airport;AZ;United States;4;34-51N;111-47W;;;1471;;
+KSFB;--;---;Orlando / Sanford Airport;FL;United States;4;28-47N;081-15W;;;17;;
+KSFD;72;656;Winner, Bob Wiley Field Airport;SD;United States;4;43-23-26N;099-50-33W;;;619;;
+KSFF;--;---;Spokane, Felts Field;WA;United States;4;47-41-08N;117-19-13W;47-40-51N;117-19-04W;595;609;
+KSFM;--;---;Sanford, Sanford Regional Airport;ME;United States;4;43-24N;070-43W;;;74;;
+KSFO;72;494;San Francisco, San Francisco International Airport;CA;United States;4;37-37-11N;122-21-53W;37-37-01N;122-22-58W;3;26;P
+KSFQ;--;---;Suffolk, Suffolk Municipal Airport;VA;United States;4;36-40-56N;076-36-07W;;;22;;
+KSFY;--;---;Savanna, Tri-Township Airport;IL;United States;4;42-02-45N;090-06-28W;;;188;;
+KSFZ;--;---;Pawtucket, North Central State Airport;RI;United States;4;41-55N;071-30W;;;134;;
+KSGF;72;440;Springfield, Springfield Regional Airport;MO;United States;4;37-14-23N;093-23-23W;37-14-26N;093-23-28W;386;389;P
+KSGH;--;---;Springfield, Springfield-Beckley Municipal Airport;OH;United States;4;39-50-25N;083-50-24W;;;320;;
+KSGJ;--;---;St. Augustine, St. Augustine Airport;FL;United States;4;29-57-33N;081-20-23W;;;3;;
+KSGR;--;---;Houston, Sugar Land Municipal / Hull Field Airport;TX;United States;4;29-37-20N;095-39-24W;;;25;;
+KSGS;--;---;South St. Paul, South St. Paul Municipal-Richard E. Fleming Field Airport;MN;United States;4;44-51-26N;093-01-58W;;;250;;
+KSGT;--;---;Stuttgart, Stuttgart Municipal Airport;AR;United States;4;34-36N;091-34W;;;68;;
+KSGU;--;---;St George, St George Municipal Airport;UT;United States;4;37-05N;113-36W;;;896;;
+KSHD;--;---;Staunton / Shenandoah;VA;United States;4;38-16N;078-54W;;;366;;
+KSHI;--;---;Ashtabula, Ashtabula County Airport;OH;United States;4;41-46-46N;080-41-48W;41-46-48N;080-42-04W;281;276;
+KSHL;--;---;Sheldon;IA;United States;4;43-13N;095-50W;;;432;;
+KSHN;--;---;Shelton, Shelton Sanderson Field;WA;United States;4;47-14-17N;123-08-27W;47-14-24N;123-08-25W;82;82;
+KSHP;--;---;Sheppard Air Force Base;TX;United States;4;33-58N;098-29W;;;314;;
+KSHR;72;666;Sheridan, Sheridan County Airport;WY;United States;4;44-46-10N;106-58-08W;44-46-26N;106-58-12W;1225;1202;P
+KSHV;72;248;Shreveport, Shreveport Regional Airport;LA;United States;4;32-26-49N;093-49-27W;32-27-02N;093-50-01W;78;80;P
+KSIB;--;---;Sibley Peak;WY;United States;4;42-27N;105-02W;;;1500;;
+KSIL;--;---;Slidell Radar Site;LA;United States;4;30-15N;089-46W;;;3;;
+KSIY;--;---;Montague, Siskiyou County Airport;CA;United States;4;41-46-53N;122-28-05W;;;807;;
+KSJC;--;---;San Jose, San Jose International Airport;CA;United States;4;37-21-33N;121-55-27W;35-39-56N;121-17-05W;18;25;
+KSJN;--;---;St. Johns, St. Johns Industrial Airpark;AZ;United States;4;34-31-06N;109-22-45W;34-31-09N;109-22-44W;1747;1745;
+KSJT;72;263;San Angelo, Mathis Field;TX;United States;4;31-21-05N;100-29-38W;31-21-22N;100-30-10W;584;581;P
+KSJX;--;---;Beaver Island, Beaver Island Airport;MI;United States;4;45-41-32N;085-33-59W;;;204;;
+KSKA;--;---;Fairchild Air Force Base;WA;United States;4;47-37N;117-39W;;;750;;
+KSKC;--;---;Waukesha;WI;United States;4;43-02N;088-14W;;;284;;
+KSKF;--;---;Kelly Air Force Base;TX;United States;4;29-23N;098-35W;;;210;;
+KSKX;--;---;Taos, Taos Regional Airport;NM;United States;4;36-27N;105-40W;;;2161;;
+KSLB;--;---;Storm Lake;IA;United States;4;42-36N;095-14W;;;454;;
+KSLC;72;572;Salt Lake City, Salt Lake City International Airport;UT;United States;4;40-46-41N;111-58-10W;40-46-35N;111-57-31W;1288;1286;P
+KSLE;72;694;Salem, McNary Field;OR;United States;4;44-54-28N;122-59-42W;44-54-33N;123-00-25W;64;59;P
+KSLG;--;---;Siloam Springs, Smith Field Airport;AR;United States;4;36-12N;094-29W;;;364;;
+KSLH;--;---;Cheboygan, Cheboygan County Airport;MI;United States;4;45-39-13N;084-31-09W;;;195;;
+KSLI;--;---;Los Alamitos U. S. Army Airfield;CA;United States;4;33-47N;118-03W;;;11;;
+KSLK;--;---;Saranac Lake, Adirondack Regional Airport;NY;United States;4;44-23-35N;074-12-10W;44-22-49N;074-12-14W;507;498;
+KSLN;--;---;Salina, Salina Municipal Airport;KS;United States;4;38-46-48N;097-38-39W;38-46-08N;097-38-39W;387;385;
+KSLO;72;433;Salem, Salem-Leckrone Airport;IL;United States;4;38-38-34N;088-57-51W;38-39N;088-58W;175;174;
+KSLR;--;---;Sulphur Springs, Sulphur Springs Municipal Airport;TX;United States;4;33-09-40N;095-37-16W;;;149;;
+KSLW;--;---;Smithville / Wooster;OH;United States;4;40-53N;081-50W;;;357;;
+KSME;--;---;Somerset, Somerset-Pulaski County - J.T. Wilson Field Airport;KY;United States;4;37-03-15N;084-36-54W;;;283;;
+KSMF;--;---;Sacramento, Sacramento International Airport;CA;United States;4;38-42-05N;121-35-38W;38-41-30N;121-35-23W;8;6;
+KSMN;--;---;Salmon, Lemhi County Airport;ID;United States;4;45-07N;113-53W;;;1233;;
+KSMO;--;---;Santa Monica, Santa Monica Municipal Airport;CA;United States;4;34-00-57N;118-27-05W;34-01-10N;118-26-53W;53;57;
+KSMP;--;---;Stampede Pass;WA;United States;4;47-16-36N;121-20-14W;47-16-36N;121-20-14W;1207;1208;
+KSMQ;--;---;Somerville, Somerset Airport;NJ;United States;4;40-37-26N;074-40-10W;40-37-32N;074-40-08W;32;30;
+KSMX;72;394;Santa Maria, Santa Maria Public Airport;CA;United States;4;34-53-58N;120-26-55W;34-53-57N;120-26-56W;78;74;P
+KSNA;--;---;Santa Ana, John Wayne Airport-Orange County Airport;CA;United States;4;33-40-48N;117-51-59W;33-40-41N;117-52-08W;16;15;
+KSNC;--;---;Chester, Chester Airport;CT;United States;4;41-23-02N;072-30-21W;;;127;;
+KSNK;--;---;Snyder, Winston Field Airport;TX;United States;4;32-41-36N;100-57-01W;;;741;;
+KSNL;--;---;Shawnee, Shawnee Municipal Airport;OK;United States;4;35-21-26N;096-56-34W;;;327;;
+KSNP;--;---;St. Paul Island, St. Paul Island Airport;AK;United States;4;57-09-21N;170-13-15W;57-09-25N;170-13-01W;13;7;
+KSNS;--;---;Salinas, Salinas Municipal Airport;CA;United States;4;36-39-49N;121-36-29W;36-39-37N;121-36-18W;25;30;
+KSNT;--;---;Stanley, Stanley Ranger Station;ID;United States;4;44-12-31N;114-56-04W;;;1980;;
+KSNY;72;561;Sidney, Sidney Municipal Airport;NE;United States;4;41-05-58N;102-59-08W;41-06-10N;102-58-56W;1314;1307;P
+KSOA;--;---;Sonora, Sonora Municipal Airport;TX;United States;4;30-35-08N;100-38-54W;;;652;;
+KSOP;--;---;Pinehurst/Southern Pines, Moore County Airport;NC;United States;4;35-14N;079-24W;;;141;;
+KSOV;--;---;Seldovia, Seldovia Airport;AK;United States;4;59-26-48N;151-42-16W;59-26-48N;151-42-16W;8;10;
+KSOW;--;---;Show Low, Show Low Regional Airport;AZ;United States;4;34-15-55N;110-00-20W;;;1955;;
+KSPA;--;---;Spartanburg Memorial;SC;United States;4;34-55N;081-57W;;;246;;
+KSPB;--;---;Scappoose, Scappoose Industrial Airpark;OR;United States;4;45-46-09N;122-51-44W;45-46-35N;122-51-35W;16;14;
+KSPD;--;---;Springfield, Comanche National Grassland;CO;United States;4;37-17N;102-37W;;;1335;;
+KSPF;--;---;Spearfish / Clyde Ice;SD;United States;4;44-29N;103-47W;;;1188;;
+KSPG;--;---;St. Petersburg, Whitted Airport;FL;United States;4;27-46-04N;082-37-34W;27-46-00N;082-37-40W;2;2;
+KSPI;--;---;Springfield, Abraham Lincoln Capital Airport;IL;United States;4;39-50-43N;089-41-02W;39-51-04N;089-40-36W;182;181;
+KSPS;72;351;Wichita Falls, Sheppard Air Force Base;TX;United States;4;33-58-43N;098-29-34W;33-58-25N;098-30-07W;309;308;P
+KSPW;--;---;Spencer, Spencer Municipal Airport;IA;United States;4;43-09-56N;095-12-10W;43-10-02N;095-11-47W;408;403;
+KSQI;--;---;Sterling Rockfalls;IL;United States;4;41-45N;089-40W;;;197;;
+KSQL;--;---;San Carlos Airport;CA;United States;4;37-31N;122-15W;;;1;;
+KSRC;--;---;Searcy, Searcy Municipal Airport;AR;United States;4;35-12-43N;091-44-14W;;;81;;
+KSRE;--;---;Seminole, Seminole Municipal Airport;OK;United States;4;35-16-28N;096-40-30W;;;312;;
+KSRF;--;---;Hamilton U. S. Army Airfield;CA;United States;4;38-04N;122-30W;;;1;;
+KSRN;--;---;South Marsh 268A;LA;United States;4;29-07N;91-52W;;;0;;
+KSRQ;--;---;Sarasota / Bradenton, Sarasota-Bradenton International Airport;FL;United States;4;27-24-05N;082-33-31W;27-24-09N;082-33-10W;9;18;
+KSRR;--;---;Ruidoso Regional;NM;United States;4;33-28N;105-32W;;;2076;;
+KSSC;74;790;Shaw Air Force Base;SC;United States;4;33-58N;080-29W;33-58N;080-29W;74;73;
+KSSF;--;---;San Antonio, Stinson Municipal Airport;TX;United States;4;29-20-20N;098-28-18W;29-20-19N;098-28-04W;175;176;
+KSSI;--;---;Brunswick, Malcolm McKinnon Airport;GA;United States;4;31-09-06N;081-23-29W;31-09-20N;081-23-13W;6;6;
+KSSU;--;---;White Sulphur Sprng;WV;United States;4;37-46N;080-20W;;;549;;
+KSTC;--;---;St Cloud, St Cloud Regional Airport;MN;United States;4;45-32-47N;094-03-35W;;;314;;
+KSTE;--;---;Stevens Point, Stevens Point Municipal Airport;WI;United States;4;44-32-42N;089-31-49W;;;338;;
+KSTJ;72;449;St. Joseph, Rosecrans Memorial Airport;MO;United States;4;39-46-05N;094-54-33W;39-46-14N;094-54-10W;251;247;
+KSTL;72;434;St. Louis, Lambert-St. Louis International Airport;MO;United States;4;38-45-09N;090-22-25W;38-45-06N;090-21-07W;184;171;P
+KSTP;--;---;St. Paul, St. Paul Downtown Holman Field;MN;United States;4;44-55-49N;093-02-53W;44-56-31N;093-03-55W;214;219;
+KSTS;--;---;Santa Rosa, Santa Rosa Sonoma County Airport;CA;United States;4;38-30-00N;122-49-00W;38-30-16N;122-48-17W;38;39;
+KSTT;--;---;Charlotte Amalie, King Airport;VI;United States;4;18-20-18N;064-58-44W;18-20-26N;064-58-30W;4;15;
+KSTX;--;---;Christiansted, Hamilton Airport;VI;United States;4;17-42-03N;064-48-24W;17-42-08N;064-47-56W;18;9;
+KSUA;--;---;Stuart, Witham Field Airport;FL;United States;4;27-10-54N;080-13-16W;;;6;;
+KSUE;--;---;Sturgeon Bay;WI;United States;4;44-51N;087-25W;;;221;;
+KSUN;--;---;Hailey, Friedman Memorial Airport;ID;United States;4;43-30N;114-18W;;;1621;;
+KSUS;--;---;St. Louis, Spirit Of St. Louis Airport;MO;United States;4;38-39-26N;090-39-21W;38-39-45N;090-39-07W;141;141;
+KSUT;--;---;Oak Island, Brunswick County Airport;NC;United States;4;33-55-45N;078-04-29W;;;8;;
+KSUU;74;516;Fairfield / Travis Air Force Base;CA;United States;4;38-16N;121-57W;;;19;22;P
+KSUW;--;---;Superior, Richard I. Bong Airport;WI;United States;4;46-41-23N;092-05-41W;;;205;;
+KSUX;72;557;Sioux City, Sioux Gateway Airport;IA;United States;4;42-24-09N;096-23-04W;42-24-03N;096-22-39W;335;338;P
+KSVC;72;272;Silver City / Grant;NM;United States;4;32-38N;108-09W;;;1659;;
+KSVE;--;---;Susanville Municipal;CA;United States;4;40-23N;120-34W;;;1263;;
+KSVH;--;---;Statesville, Statesville Municipal Airport;NC;United States;4;35-45-55N;080-57-24W;;;294;;
+KSVN;--;---;Hunter U. S. Army Airfield ;GA;United States;4;32-01N;081-09W;;;13;;
+KSWD;--;---;Seward, Seward Airport;AK;United States;4;60-07-37N;149-25-07W;60-07-58N;149-25-35W;6;2;
+KSWF;--;---;Newburgh / Stewart;NY;United States;4;41-30N;074-06W;;;150;;
+KSWO;--;---;Stillwater, Stillwater Regional Airport;OK;United States;4;36-09-44N;097-05-21W;36-09-28N;097-05-01W;300;290;
+KSWW;--;---;Sweetwater, Avenger Field Airport;TX;United States;4;32-28-02N;100-27-59W;;;725;;
+KSXT;--;---;Sexton Summit,;OR;United States;4;42-36-01N;123-21-51W;42-36-01N;123-21-52W;0;1170;
+KSYN;--;---;Stanton, Stanton Airfield;MN;United States;4;44-28-31N;093-00-58W;;;280;;
+KSYR;72;519;Syracuse, Syracuse Hancock International Airport;NY;United States;4;43-06-33N;076-06-12W;43-06-39N;076-06-38W;128;127;P
+KSZL;--;---;Whiteman Air Force Base;MO;United States;4;38-44N;093-33W;;;265;;
+KSZN;--;---;Santa Cruz Island;CA;United States;4;34-01N;119-45W;;;10;;
+KSZT;--;---;Sandpoint, Sandpoint Airport;ID;United States;4;48-17-58N;116-33-36W;;;648;;
+KT08;--;---;Tomahawk, Tomahawk Regional Airport;WI;United States;4;45-28-08N;089-48-20W;;;453;;
+KT18;--;---;Falfurrias, Brooks County Airport;TX;United States;4;27-12-24N;098-07-16W;;;34;;
+KT46;--;---;South Brazos A70;TX;United States;4;28-01N;095-52W;;;23;;
+KT49;--;---;Big Spring, Big Spring McMahon-Wrinkle Airport;TX;United States;4;32-12N;101-31W;;;784;;
+KT53;--;---;Robstown, Nueces County Airport;TX;United States;4;27-46-42N;097-41-25W;;;24;;
+KT56;--;---;Crockett, Houston County Airport;TX;United States;4;31-18-25N;095-24-13W;;;106;;
+KT62;--;---;Tooele;UT;United States;4;40-19N;112-18W;;;1628;;
+KT65;--;---;Weslaco, Mid Valley Airport;TX;United States;4;26-10-39N;097-58-23W;;;21;;
+KT72;--;---;Hearne, Hearne Municipal Airport;TX;United States;4;30-52-18N;096-37-20W;;;87;;
+KT82;--;---;Fredericksburg, Gillespie County Airport;TX;United States;4;30-14-37N;098-54-34W;;;517;;
+KT97;--;---;Port Lavaca, Calhoun County Airport;TX;United States;4;28-39-14N;096-40-52W;;;9;;
+KTAD;--;---;Trinidad, Perry Stokes Airport;CO;United States;4;37-16N;104-26W;;;1756;;
+KTAL;--;---;Tanana, Calhoun Memorial Airport;AK;United States;4;65-10-28N;152-06-25W;65-10-29N;152-06-30W;69;72;
+KTAN;--;---;Taunton, Taunton Municipal Airport;MA;United States;4;41-52-32N;071-01-16W;41-52-31N;071-01-12W;13;7;
+KTAZ;--;---;Taylorville, Taylorville Municipal Airport;IL;United States;4;39-32-03N;089-19-40W;;;190;;
+KTBN;--;---;Fort Leonard Wood;MO;United States;4;37-44N;092-08W;;;353;;
+KTBR;--;---;Statesboro, Statesboro-Bulloch County Airport;GA;United States;4;32-28-59N;081-44-14W;;;57;;
+KTBW;72;210;Tampa Bay Area;FL;United States;4;27-42N;082-24W;27-42N;082-24W;12;13;P
+KTCC;--;---;Tucumcari, Tucumcari Municipal Airport;NM;United States;4;35-10-58N;103-36-11W;35-10-52N;103-36-33W;1239;1235;
+KTCL;--;---;Tuscaloosa, Tuscaloosa Regional Airport;AL;United States;4;33-13-14N;087-36-41W;;;52;;
+KTCM;74;206;Tacoma / McChord Air Force Base;WA;United States;4;47-09N;122-29W;47-09N;122-29W;98;87;
+KTCS;72;271;Truth Or Consequences, Truth Or Consequences Municipal Airport;NM;United States;4;33-14-12N;107-16-05W;33-14-17N;107-16-08W;1478;1469;
+KTDF;--;---;Roxboro, Person County Airport;NC;United States;4;36-17-06N;078-59-03W;;;186;;
+KTDO;--;---;Toledo-Winlock Memorial;WA;United States;4;46-29N;122-48W;;;113;;
+KTDZ;--;---;Toledo, Metcalf Field;OH;United States;4;41-33-47N;083-28-35W;41-33-52N;083-28-34W;189;189;
+KTEB;--;---;Teterboro, Teterboro Airport;NJ;United States;4;40-51-32N;074-03-24W;40-51-09N;074-03-19W;2;7;
+KTEW;--;---;Mason, Mason Jewett Field Airport;MI;United States;4;42-33-57N;084-25-24W;;;280;;
+KTEX;--;---;Telluride, Telluride Regional Airport;CO;United States;4;37-57-14N;107-54-31W;;;2767;;
+KTFX;--;---;Great Falls Nexrad;MT;United States;4;47-28N;111-22W;;;1151;;
+KTHV;--;---;York, York Airport;PA;United States;4;39-55-10N;076-52-37W;39-55-22N;076-52-41W;146;144;
+KTIF;--;---;Thedford, Thomas County Airport;NE;United States;4;41-57-43N;100-34-08W;;;892;;
+KTIK;72;354;Tinker Air Force Base;OK;United States;4;35-25N;097-23W;35-25N;097-23W;394;397;
+KTIP;--;---;Rantoul, Rantoul National Aviation Center Airport-Frank Elliott Field;IL;United States;4;40-17-37N;088-08-33W;;;225;;
+KTIW;--;---;Tacoma, Tacoma Narrows Airport;WA;United States;4;47-16-03N;122-34-34W;47-16-09N;122-34-25W;96;96;
+KTIX;--;---;Titusville;FL;United States;4;28-31N;080-48W;;;11;;
+KTKA;--;---;Talkeetna, Talkeetna Airport;AK;United States;4;62-19-12N;150-05-42W;62-19-13N;150-05-38W;109;107;
+KTKC;--;---;Tracy, Tracy Municipal Airport;MN;United States;4;44-14-56N;095-36-26W;;;408;;
+KTKI;--;---;Mc Kinney, Collin County Regional Airport at Mc Kinney;TX;United States;4;33-10-40N;096-35-25W;33-10-39N;096-35-31W;178;179;
+KTKV;--;---;Tomahawk, Tomahawk Regional Airport;WI;United States;4;45-28-08N;089-48-20W;;;453;;
+KTLH;72;214;Tallahassee, Tallahassee Regional Airport;FL;United States;4;30-23-35N;084-21-12W;30-23-46N;084-21-20W;24;16;P
+KTLX;--;---;Oklahoma City Nexrad;OK;United States;4;35-20N;097-17W;;;338;;
+KTMB;--;---;Miami, Kendall-Tamiami Executive Airport;FL;United States;4;25-38-31N;080-26-05W;25-38-50N;080-25-35W;3;2;
+KTMH;--;---;20 Mile Hill;WY;United States;4;43-07N;106-20W;;;1743;;
+KTNB;--;---;Boone, Watauga County Hospital Heliport;NC;United States;4;36-12N;081-39W;;;959;;
+KTNU;--;---;Newton Municipal;IA;United States;4;41-41N;093-01W;;;290;;
+KTNX;--;---;Tonopah Test Range;NV;United States;4;37-48N;116-47W;;;1691;;
+KTOA;--;---;Torrance, Zamperini Field Airport;CA;United States;4;33-48N;118-20W;;;31;;
+KTOB;--;---;Dodge Center, Dodge Center Airport;MN;United States;4;44-01-05N;092-49-53W;;;398;;
+KTOI;--;---;Troy, Troy Municipal Airport;AL;United States;4;31-51-38N;086-00-44W;31-51-39N;088-00-28W;121;118;
+KTOL;72;536;Toledo, Toledo Express Airport;OH;United States;4;41-35-19N;083-48-05W;41-35-33N;083-48-15W;208;210;
+KTOP;72;456;Topeka, Philip Billard Municipal Airport;KS;United States;4;39-04-21N;095-37-33W;39-04-21N;095-37-50W;268;268;P
+KTOR;--;---;Torrington, Torrington Municipal Airport;WY;United States;4;42-03-53N;104-09-10W;42-03-45N;104-09-31W;1282;1277;
+KTPA;72;211;Tampa, Tampa International Airport;FL;United States;4;27-57-41N;082-32-25W;27-58-04N;082-31-33W;8;11;P
+KTPF;--;---;Tampa, Peter O Knight Airport;FL;United States;4;27-54-56N;082-26-57W;;;2;;
+KTPH;--;---;Tonopah, Tonopah Airport;NV;United States;4;38-03-37N;117-05-14W;38-03-49N;117-05-44W;1654;1652;
+KTPL;--;---;Temple, Draughon-Miller Central Texas Regional Airport;TX;United States;4;31-09N;097-24W;;;208;;
+KTQE;--;---;Tekamah, Tekamah Municipal Airport;NE;United States;4;41-46-01N;096-10-40W;41-46-02N;096-10-29W;313;312;
+KTQH;--;---;Tahlequah, Tahlequah Municipal Airport;OK;United States;4;35-55-44N;095-00-16W;;;266;;
+KTRI;--;---;Bristol / Johnson / Kingsport, Tri-City Regional Airport;TN;United States;4;36-28-47N;082-23-56W;36-28-54N;082-24-26W;463;474;
+KTRK;--;---;Truckee-Tahoe;CA;United States;4;39-19N;120-08W;;;1798;;
+KTRL;--;---;Terrell, Terrell Municipal Airport;TX;United States;4;32-42-49N;096-16-06W;32-42-58N;096-16-07W;144;144;
+KTRM;--;---;Palm Springs, Jacqueline Cochran Regional Airport;CA;United States;4;33-37-36N;116-09-34W;;;-38;;
+KTTA;--;---;Sanford, Sanford-Lee County Regional Airport;NC;United States;4;35-34-57N;079-06-05W;;;75;;
+KTTD;--;---;Portland, Portland-Troutdale Airport;OR;United States;4;45-33-04N;122-24-32W;45-33-03N;122-23-49W;11;14;
+KTTF;--;---;Monroe, Custer Airport;MI;United States;4;41-56-24N;083-26-05W;;;188;;
+KTTN;--;---;Trenton, Mercer County Airport;NJ;United States;4;40-16-35N;074-48-59W;40-16-39N;074-48-58W;64;59;
+KTTS;--;---;Titusville, NASA Shuttle Landing Facility;FL;United States;4;28-37N;080-42W;;;3;;
+KTUL;72;356;Tulsa, Tulsa International Airport;OK;United States;4;36-11-51N;095-53-11W;36-11-32N;095-54-13W;206;207;P
+KTUP;72;332;Tupelo, Tupelo Regional Airport;MS;United States;4;34-16-05N;088-46-12W;34-15-54N;088-45-59W;106;105;
+KTUS;72;274;Tucson, Tucson International Airport;AZ;United States;4;32-07-53N;110-57-19W;32-07-28N;110-56-25W;805;786;P
+KTVC;--;---;Traverse City, Cherry Capital Airport;MI;United States;4;44-44-12N;085-34-12W;44-44-38N;085-35-06W;190;190;
+KTVF;--;---;Thief River Falls, Thief River Falls Regional Airport;MN;United States;4;48-04N;096-11W;;;340;;
+KTVL;--;---;South Lake Tahoe, Lake Tahoe Airport;CA;United States;4;38-53-38N;119-59-43W;38-53-47N;119-59-50W;1909;1925;
+KTVR;--;---;Vicksburg, Vicksburg / Tallulah Regional Airport;LA;United States;4;32-20-53N;091-01-48W;32-21-11N;091-01-29W;26;26;
+KTWF;--;---;Twin Falls, Joslin Field-Magic Valley Regional Airport;ID;United States;4;42-28-43N;114-28-34W;42-29-03N;114-28-55W;1265;1266;
+KTWM;--;---;Two Harbors;MN;United States;4;47-03N;091-45W;;;328;;
+KTWT;--;---;Sturgis, Sturgis Municipal Airport;KY;United States;4;37-32-27N;087-57-06W;;;113;;
+KTWX;--;---;Topeka NEXRAD;KS;United States;4;39-00N;096-14W;;;431;;
+KTXK;--;---;Texarkana, Texarkana Regional-Webb Field;AR;United States;4;33-27-22N;093-59-15W;33-27-21N;093-59-38W;118;111;
+KTYR;--;---;Tyler, Tyler Pounds Field;TX;United States;4;32-21-31N;095-24-14W;32-21- N;095-24- W;165;165;
+KTYS;72;326;Knoxville, McGhee Tyson Airport;TN;United States;4;35-49-05N;083-59-09W;35-49-29N;083-59-10W;299;302;P
+KTZR;--;---;Columbus, Bolton Field Airport;OH;United States;4;39-54-03N;083-08-14W;;;276;;
+KU15;--;---;Challis, Challis Airport;ID;United States;4;44-31-22N;114-12-54W;44-31-12N;114-12-54W;1534;1536;
+KU16;--;---;Eagle Range;UT;United States;4;41-03N;113-04W;;;1292;;
+KU17;--;---;Bullfrog Marina;UT;United States;4;37-30N;110-42W;;;1110;;
+KU24;--;---;Delta;UT;United States;4;39-20N;112-35W;;;1414;;
+KU28;--;---;Green River Range;UT;United States;4;39-00N;110-10W;;;1241;;
+KU31;--;---;Austin;NV;United States;4;39-30N;117-05W;;;2014;;
+KU42;--;---;Salt Lake City, Salt Lake City Municipal 2 Airport;UT;United States;4;40-37-10N;111-59-34W;;;1403;;
+KU59;--;---;Driggs, Driggs-Reed Memorial Airport;ID;United States;4;43-44-30N;111-05-52W;;;1898;;
+KU67;74;420;Roosevelt;UT;United States;4;40-18N;109-59W;;;1553;1556;
+KU71;--;---;Vernal;UT;United States;4;40-28N;109-32W;;;1612;;
+KU73;--;---;Jerome, Jerome County Airport;ID;United States;4;42-43-39N;114-27-11W;42-43-31N;114-27-15W;1233;1222;
+KU78;--;---;Soda Springs / Tigert;ID;United States;4;42-39N;111-35W;;;1780;;
+KUAO;--;---;Aurora, Aurora State Airport;OR;United States;4;45-14-56N;122-45-56W;45-15-03N;122-45-57W;59;59;
+KUCA;--;---;Utica, Oneida County Airport;NY;United States;4;43-08-42N;075-23-04W;43-08-50N;075-22-52W;227;228;
+KUCP;--;---;New Castle, New Castle Municipal Airport;PA;United States;4;41-01-31N;080-24-48W;;;327;;
+KUDG;--;---;Darlington, Darlington County Jetport Airport;SC;United States;4;34-26-57N;079-53-25W;;;59;;
+KUES;--;---;Waukesha, Waukesha County Airport;WI;United States;4;43-02-28N;088-14-13W;;;278;;
+KUEX;--;---;Grand Island Nexrad;NE;United States;4;40-19N;098-26W;;;626;;
+KUGN;--;---;Chicago / Waukegan, Waukegan Regional Airport;IL;United States;4;42-25N;087-52W;;;222;;
+KUIL;72;797;Quillayute, Quillayute State Airport;WA;United States;4;47-56-15N;124-33-18W;47-56-03N;124-33-32W;59;54;P
+KUIN;--;---;Quincy, Quincy Regional-Baldwin Field Airport;IL;United States;4;39-56-33N;091-11-40W;;;234;;
+KUKF;--;---;North Wilkesboro, Wilkes County Airport;NC;United States;4;36-13N;81-05W;;;396;;
+KUKI;--;---;Ukiah, Ukiah Municipal Airport;CA;United States;4;39-07-33N;123-12-03W;;;187;;
+KUKL;--;---;Burlington, Coffey County Airport;KS;United States;4;38-18-09N;095-43-30W;;;358;;
+KUKT;--;---;Quakertown, Quakertown Airport;PA;United States;4;40-26-06N;075-22-54W;;;160;;
+KULM;--;---;New Ulm, New Ulm Municipal Airport;MN;United States;4;44-19N;094-30W;;;308;;
+KUNO;--;---;West Plains, West Plains Municipal Airport;MO;United States;4;36-52-45N;091-54-18W;36-52-44N;091-54-16W;374;372;
+KUNU;--;---;Juneau, Dodge County Airport;WI;United States;4;43-25-36N;088-42-12W;;;285;;
+KUNV;--;---;State College, University Park Airport;PA;United States;4;40-51N;077-51W;;;378;;
+KUOX;--;---;Oxford, University-Oxford Airport;MS;United States;4;34-23-04N;089-32-08W;;;138;;
+KUTA;--;---;Tunica, Tunica Municipal Airport;MS;United States;4;34-40-51N;090-20-47W;;;59;;
+KUTS;--;---;Huntsville, Huntsville Municipal Airport;TX;United States;4;30-44-38N;095-35-10W;30-44-34N;095-35-08W;111;104;
+KUUU;--;---;Newport, Newport State Airport;RI;United States;4;41-31-48N;071-17-01W;41-31-53N;071-17-00W;52;51;
+KUVA;--;---;Uvalde, Garner Field Airport;TX;United States;4;29-12-40N;099-44-36W;;;287;;
+KUZA;--;---;Rock Hill, Rock Hill - York County Airport;SC;United States;4;34-59-02N;081-03-21W;34-59-14N;081-03-36W;204;202;
+KVAD;74;781;Moody Air Force Base;GA;United States;4;30-58N;083-12W;;;71;71;
+KVAY;--;---;Mount Holly, South Jersey Regional Airport;NJ;United States;4;39-56-26N;074-50-28W;39-56-22N;074-50-38W;16;15;
+KVBG;72;393;Lompoc, Vandenberg Air Force Base;CA;United States;4;34-43-46N;120-34-36W;34-44N;120-33W;112;121;P
+KVBT;--;---;Bentonville, Bentonville Municipal Airport/Louise M Thaden Field;AR;United States;4;36-21N;094-13W;;;395;;
+KVCB;--;---;Vacaville, Nut Tree Airport;CA;United States;4;38-22-40N;121-57-27W;38-22-32N;121-57-31W;34;33;
+KVCT;72;255;Victoria, Victoria Regional Airport;TX;United States;4;28-51-45N;096-55-47W;28-50-43N;096-55-13W;35;31;P
+KVCV;--;---;Victorville, Southern California Logistics Airport;CA;United States;4;34-35-50N;117-22-58W;;;879;;
+KVDF;--;---;Tampa, Vandenberg Airport;FL;United States;4;28-00-50N;082-20-43W;;;7;;
+KVDI;--;---;Vidalia, Vidalia Municipal Airport;GA;United States;4;32-11-33N;082-22-19W;;;84;;
+KVDW;--;---;Vedauwoo;WY;United States;4;41-09N;105-24W;;;2542;;
+KVEL;--;---;Vernal, Vernal Airport;UT;United States;4;40-26-39N;109-30-42W;40-26-47N;109-30-42W;1607;1604;
+KVGT;--;---;Las Vegas, North Las Vegas Airport;NV;United States;4;36-12-42N;115-11-45W;;;672;;
+KVIH;--;---;Rolla / Vichy, Rolla National Airport;MO;United States;4;38-07-55N;091-45-55W;38-07-56N;091-45-54W;350;333;
+KVIS;--;---;Visalia, Visalia Municipal Airport;CA;United States;4;36-19N;119-24W;;;90;;
+KVJI;--;---;Abingdon;VA;United States;4;36-41N;082-02W;;;631;;
+KVKS;--;---;Vicksburg Municipal;MS;United States;4;32-14N;090-56W;;;32;;
+KVLD;--;---;Valdosta, Valdosta Regional Airport;GA;United States;4;30-47N;083-17W;;;62;;
+KVLG;--;---;The Villages;FL;United States;4;28-58N;081-58W;;;27;;
+KVLL;--;---;Troy, Oakland/Troy Airport;MI;United States;4;42-32-34N;083-10-40W;;;222;;
+KVNY;--;---;Van Nuys, Van Nuys Airport;CA;United States;4;34-12-45N;118-29-27W;34-12-29N;118-29-27W;243;245;
+KVOK;--;---;Volk / Camp Douglas;WI;United States;4;43-56N;090-16W;;;277;;
+KVPC;--;---;Cartersville, Cartersville Airport;GA;United States;4;34-07-42N;084-50-50W;34-07-22N;084-51-02W;233;222;
+KVPS;72;221;Valparaiso / Eglin Air Force Base;FL;United States;4;30-29N;086-31W;30-29N;086-31W;26;29;P
+KVPZ;--;---;Valparaiso, Porter County Municipal Airport;IN;United States;4;41-27-11N;086-59-53W;41-26-58N;087-00-33W;234;231;
+KVQN;--;---;Volens;VA;United States;4;36-57N;078-59W;;;185;;
+KVQQ;--;---;Jacksonville, Cecil Field Airport;FL;United States;4;30-13-07N;081-52-36W;;;25;;
+KVRB;--;---;Vero Beach, Vero Beach Municipal Airport;FL;United States;4;27-39-20N;080-25-05W;27-39-05N;080-25-04W;7;10;
+KVRX;--;---;Vermillion Area;LA;United States;4;28-35N;092-27W;;;1;;
+KVSF;--;---;Springfield, Hartness State Springfield Airport;VT;United States;4;43-20-33N;072-31-18W;43-20-34N;072-31-19W;175;175;
+KVTA;--;---;Newark, Newark Heath Airport;OH;United States;4;40-01-22N;082-27-45W;40-01-25N;082-27-49W;269;268;
+KVTI;--;---;Vinton, Vinton Veterans Memorial Airpark Airport;IA;United States;4;42-13-07N;092-01-33W;;;258;;
+KVTN;72;567;Valentine, Miller Field;NE;United States;4;42-51-31N;100-33-05W;42-51-41N;100-32-56W;789;788;P
+KVTP;--;---;La Veta Mountain, La Veta Pass;CO;United States;4;37-30-04N;105-10-01W;;;3114;;
+KVTX;--;---;Los Angeles Nexrad;CA;United States;4;34-25N;119-11W;;;856;;
+KVUJ;--;---;Albemarle, Stanly County Airport;NC;United States;4;35-25-00N;080-09-03W;;;186;;
+KVUO;--;---;Vancouver, Pearson Field Airport;WA;United States;4;45-37-13N;122-39-23W;;;8;;
+KVUW;--;---;Eugene Island;LA;United States;4;28-15N;091-50W;;;1;;
+KVVG;--;---;The Villages;FL;United States;4;28-58N;081-58W;;;27;;
+KVVV;--;---;Ortonville, Ortonville Muncipal-Martinson Field Airport;MN;United States;4;45-18-20N;096-25-28W;;;335;;
+KVWU;--;---;Waskish, Waskish Municipal Airport;MN;United States;4;48-09-15N;094-31-01W;;;360;;
+KVYS;--;---;Peru, Illinois Valley Regional-Walter A Duncan Field Airport;IL;United States;4;41-21-07N;089-09-11W;;;199;;
+KW08;--;---;Weirwood / Kellam Field;VA;United States;4;37-28N;075-53W;;;12;;
+KW11;--;---;Menomonie, Menomonie Municipal Airport-Score Field;WI;United States;4;44-53-32N;091-52-04W;;;273;;
+KW22;--;---;Buckhannon, Upshur County Regional Airport;WV;United States;4;39-00N;080-16W;;;498;;
+KW30;74;595;Ocean City;MD;United States;4;38-20N;075-05W;;;4;4;
+KW39;--;---;Norfolk / Chesapeak;VA;United States;4;36-54N;075-43W;;;23;;
+KW44;--;---;Asheboro, Asheboro Municipal Airport;NC;United States;4;35-39-14N;079-53-42W;;;205;;
+KW51;--;---;Cape Charles Coast Guard Station;VA;United States;4;37-15N;076-00W;;;2;;
+KW60;--;---;West Cameron 560;LA;United States;4;28-09N;093-21W;;;0;;
+KW63;--;---;Clarksville / Marks;VA;United States;4;36-36N;078-34W;;;128;;
+KW71;--;---;Smith Point / Sunnybank;VA;United States;4;37-53N;076-11W;;;1;;
+KW76;--;---;West Cameron B522;LA;United States;4;28-23N;093-30W;;;29;;
+KW77;--;---;Sanford, Sanford-Lee County Brick Field Airport;NC;United States;4;35-26N;079-11W;;;131;;
+KW99;--;---;Petersburg, Grant County Airport;WV;United States;4;38-59N;079-08W;;;293;;
+KWAL;72;402;Wallops Island, Wallops Flight Facility Airport;VA;United States;4;37-56-26N;075-27-47W;37-56-26N;075-28-01W;12;14;
+KWDD;71;273;Belle River;;Canada;4;42-18N;082-42W;;;184;;
+KWDG;--;---;Enid, Enid Woodring Regional Airport;OK;United States;4;36-22-45N;097-47-28W;;;356;;
+KWDR;--;---;Winder, Winder-Barrow Airport;GA;United States;4;33-58-56N;083-40-05W;;;287;;
+KWEY;--;---;West Yellowstone;MT;United States;4;44-39N;111-06W;;;2031;;
+KWHP;--;---;Los Angeles, Whiteman Airport;CA;United States;4;34-15N;118-24W;;;306;;
+KWJF;--;---;Lancaster, General William J. Fox Airfield Airport;CA;United States;4;34-44-27N;118-13-08W;;;715;;
+KWLD;--;---;Winfield / Arkansas City, Strother Field;KS;United States;4;37-10-05N;097-02-13W;37-10-11N;097-01-59W;353;350;
+KWMC;72;583;Winnemucca, Winnemucca Municipal Airport;NV;United States;4;40-54-07N;117-48-26W;40-54-18N;117-48-24W;1311;1310;P
+KWRB;--;---;Warner Robins Air Force Base;GA;United States;4;32-38N;083-36W;;;90;;
+KWRI;--;---;Mcguire Air Force Base;NJ;United States;4;40-01N;074-36W;;;41;;
+KWRL;--;---;Worland, Worland Municipal Airport;WY;United States;4;43-57-57N;107-57-03W;43-58-22N;107-57-02W;1288;1271;
+KWST;--;---;Westerly, Westerly State Airport;RI;United States;4;41-20-59N;071-47-56W;41-21-02N;071-48-24W;24;21;
+KWTR;--;---;Whitaker;WY;United States;4;41-41N;104-87W;;;1888;;
+KWVI;--;---;Watsonville, Watsonville Municipal Airport;CA;United States;4;36-56-22N;121-47-20W;36-56-03N;121-47-12W;49;43;
+KWVL;--;---;Waterville, Waterville Robert LaFleur Airport;ME;United States;4;44-32N;069-41W;;;102;;
+KWWD;--;---;Wildwood, Cape May County Airport;NJ;United States;4;39-01N;074-55W;;;7;;
+KWWR;74;641;Woodward, West Woodward Airport;OK;United States;4;36-26-12N;099-31-16W;36-26N;099-32W;667;667;
+KWYS;--;---;West Yellowstone;MT;United States;4;44-41N;111-07W;;;2025;;
+KX21;--;---;Titusville, Arthur Dunn Air Park;FL;United States;4;28-37-20N;080-50-08W;;;9;;
+KX53;--;---;Clewiston;FL;United States;4;26-45N;080-57W;;;6;;
+KX68;--;---;Titusville, NASA Shuttle Landing Facility;FL;United States;4;28-37N;080-42W;;;3;;
+KX80;--;---;Jupiter Inlet Coast Guard Station;FL;United States;4;27-02N;080-07W;;;1;;
+KX81;--;---;Lake Worth Inlet;FL;United States;4;26-46N;080-03W;;;1;;
+KX82;--;---;Fort Pierce Coast Guard Station;FL;United States;4;27-28N;080-18W;;;1;;
+KX84;--;---;Islamorada Coast Guard Station;FL;United States;4;24-57N;080-35W;;;1;;
+KX86;--;---;Fowey Rocks Coast Guard Station;FL;United States;4;25-35N;080-06W;;;1;;
+KX87;--;---;Miami Beach Coast Guard Station;FL;United States;4;25-46N;080-08W;;;1;;
+KX88;--;---;Marathon Coast Guard Station;FL;United States;4;24-43N;081-07W;;;1;;
+KX89;--;---;Ft. Myers Beach Coast Guard Station;FL;United States;4;26-27N;081-57W;;;1;;
+KX90;--;---;Venice Long Range Navigation;FL;United States;4;27-05N;082-27W;;;1;;
+KX91;--;---;Egmont Key Coast Guard Station;FL;United States;4;27-36N;082-46W;;;1;;
+KXBP;--;---;Bridgeport, Bridgeport Municipal Airport;TX;United States;4;33-10-31N;097-49-42W;;;260;;
+KXCN;--;---;Green Canyon 184;LA;United States;4;27-46N;091-31W;;;0;;
+KXMR;74;794;Cocoa Beach, Cape Canaveral Air Force Station Skid Strip;FL;United States;4;28-28N;080-34W;28-28N;080-33W;3;3;
+KXNA;--;---;Fayetteville/Springdale, Northwest Arkansas Regional Airport;AR;United States;4;36-16-55N; 094-18-25W;;;392;;
+KXVG;--;---;Longville, Longville Municipal Airport;MN;United States;4;46-59-25N;094-12-14W;;;407;;
+KXVW;--;---;Vandenberg Range;CA;United States;4;34-43N;120-34W;;;100;;
+KY12;--;---;Airlake;MN;United States;4;44-38N;093-14W;;;292;;
+KY15;--;---;Cheboygan, Cheboygan County Airport;MI;United States;4;45-39-13N;084-31-09W;;;195;;
+KY26;--;---;Mobridge;SD;United States;4;45-32N;100-26W;;;508;;
+KY39;--;---;Olivia, Olivia Regional Airport;MN;United States;4;44-46-43N;095-01-58W;;;328;;
+KY50;--;---;Wautoma, Wautoma Municipal Airport;WI;United States;4;44-02-29N;089-18-16W;;;262;;
+KY68;--;---;Tracy, Tracy Municipal Airport;MN;United States;4;44-14-56N;095-36-26W;;;408;;
+KYAK;--;---;Yakutat, Yakutat Airport;AK;United States;4;59-30-37N;139-39-46W;59-30-48N;139-40-15W;10;10;
+KYIP;--;---;Detroit, Willow Run Airport;MI;United States;4;42-14-12N;083-31-34W;42-14-05N;083-31-18W;218;215;
+KYKM;72;781;Yakima, Yakima Air Terminal;WA;United States;4;46-33-51N;120-32-01W;46-34-14N;120-32-27W;333;324;P
+KYKN;--;---;Yankton, Chan Gurney Municipal Airport;SD;United States;4;42-55N;097-23W;;;398;;
+KYNG;72;525;Youngstown, Youngstown-Warren Regional Airport;OH;United States;4;41-15-16N;080-40-26W;41-15-48N;080-40-25W;364;360;
+KYUM;72;280;Yuma / Yuma International;AZ;United States;4;32-39N;114-36W;32-52N;114-20W;65;63;P
+KZAB;--;---;Albuquerque Radar Site;NM;United States;4;35-10N;106-34W;;;1621;;
+KZLC;--;---;Salt Lake City;UT;United States;4;40-47N;111-57W;;;1288;;
+KZSE;--;---;Auburn;WA;United States;4;47-17N;122-11W;;;99;;
+KZZV;--;---;Zanesville, Zanesville Municipal Airport;OH;United States;4;39-56-40N;081-53-32W;39-56-50N;081-53-32W;274;268;
+LATI;13;615;Tirana;;Albania;6;41-20N;019-47E;41-20N;019-47E;89;90;P
+LBBG;15;655;Burgas;;Bulgaria;6;42-29N;027-29E;;;16;28;P
+LBGO;--;---;Gorna Orechovista;;Bulgaria;6;43-09N;025-36E;;;;;
+LBPD;15;625;Plovdiv;;Bulgaria;6;42-08N;024-45E;;;179;185;P
+LBRS;15;535;Rousse;;Bulgaria;6;43-51N;025-57E;;;37;45;P
+LBSF;15;614;Sofia Observ. ;;Bulgaria;6;42-39N;023-23E;42-39N;023-23E;586;595;P
+LBWN;15;552;Varna;;Bulgaria;6;43-12N;027-55E;;;41;43;P
+LCEN;--;---;Ercan;;Cyprus;6;35-09N;033-30E;;;91;;
+LCLK;17;609;Larnaca Airport;;Cyprus;6;34-53N;033-38E;34-53N;033-38E;2;2;P
+LCNC;17;607;Athalassa;;Cyprus;6;35-09N;033-24E;35-09N;033-24E;162;161;
+LCPH;17;600;Paphos Airport;;Cyprus;6;34-43N;032-29E;34-43N;032-29E;11;8;P
+LCRA;17;601;Akrotiri;;Cyprus;6;34-35N;032-59E;34-35N;032-59E;23;0;
+LDDD;14;240;Zagreb / Maksimir;;Croatia;6;45-49N;016-02E;45-49N;016-02E;123;128;
+LDDU;14;474;Dubrovnik / Cilipi;;Croatia;6;42-34N;018-16E;;;157;165;
+LDLO;--;---;Losinj Island;;Croatia;6;44-33-57N;014-23-35E;;;45;;
+LDOC;--;---;Cepin;;Croatia;;45-31N;018-33E;;;72;;
+LDOR;14;370;Slavonski Brod;;Croatia;6;45-10N;018-00E;45-10N;018-00E;88;89;
+LDOS;14;280;Osijek / Cepin;;Croatia;6;45-27N;018-48E;;;88;;
+LDPL;14;307;Pula Aerodrome;;Croatia;6;45-54N;013-55E;;;63;63;
+LDRI;13;116;Rijeka / Omisalj;;Croatia;6;45-13N;014-35E;;;85;;
+LDSB;--;---;Brac;;Croatia;6;43-17-09N;016-40-47E;;;541;;
+LDSH;14;447;Hvar;;Croatia;6;43-10N;016-27E;;;20;25;
+LDSP;14;444;Split / Resnik;;Croatia;6;43-32N;016-18E;;;19;21;
+LDVA;14;246;Varazdin;;Croatia;6;46-18N;016-23E;;;167;168;
+LDZA;14;241;Zagreb / Pleso;;Croatia;6;45-44N;016-04E;;;106;107;
+LDZD;14;431;Zadar / Zemunik;;Croatia;6;44-06N;015-21E;;;82;;
+LEAB;08;280;Albacete / Los Llanos;;Spain;6;38-57N;001-51W;38-57N;001-51W;702;704;P
+LEAL;08;360;Alicante / El Altet;;Spain;6;38-17N;000-33W;;;43;31;P
+LEAM;08;487;Almeria / Aeropuerto;;Spain;6;36-51N;002-23W;36-51N;002-23W;15;21;P
+LEAS;08;011;Asturias / Aviles;;Spain;6;43-33N;006-02W;;;127;130;
+LEBA;08;410;Cordoba / Aeropuerto;;Spain;6;37-51N;004-51W;;;90;92;P
+LEBB;08;025;Bilbao / Sondica;;Spain;6;43-18N;002-56W;;;42;37;P
+LEBG;08;075;Burgos / Villafria;;Spain;6;42-22N;003-38W;;;894;891;P
+LEBL;08;181;Barcelona / Aeropuerto;;Spain;6;41-17N;002-04E;41-17N;002-04E;4;6;P
+LEBZ;08;330;Badajoz / Talavera La Real;;Spain;6;38-53N;006-49W;38-53N;006-49W;185;192;P
+LECH;08;233;Calamocha;;Spain;6;40-56N;001-18W;;;890;889;
+LECO;08;002;La Coruna / Alvedro;;Spain;6;43-18N;008-23W;43-18N;008-23W;97;103;
+LECV;08;219;Madri-Colmenar;;Spain;6;40-39N;003-44W;;;;;
+LEGA;--;---;Granada / Armilla;;Spain;6;37-08N;003-38-08W;;;700;;
+LEGE;08;184;Gerona / Costa Brava;;Spain;6;41-54N;002-46E;;;143;129;
+LEGR;08;419;Granada / Aeropuerto;;Spain;6;37-11N;003-47W;;;567;570;P
+LEGT;08;224;Madrid / Getafe;;Spain;6;40-18N;003-43W;;;620;617;
+LEHI;08;335;Hinojosa Del Duque;;Spain;6;38-31N;005-07W;;;540;540;
+LEIB;08;373;Ibiza / Es Codola;;Spain;6;38-52N;001-23E;;;7;12;P
+LEJR;08;451;Jerez De La Fronteraaeropuerto;;Spain;6;36-45N;006-04W;;;27;28;P
+LELC;08;433;Murcia / San Javier;;Spain;6;37-47N;000-48W;37-47N;000-48W;5;3;P
+LELL;--;---;Sabadell;;Spain;6;41-31N;002-06E;;;250;;
+LELN;08;055;Leon / Virgen Del Camino;;Spain;6;42-35N;005-39W;42-35N;005-39W;926;914;P
+LELO;08;084;Logrono / Agoncillo;;Spain;6;42-27N;002-20W;42-27N;002-20W;353;363;P
+LEMD;08;221;Madrid / Barajas;;Spain;6;40-27N;003-33W;40-30N;003-35W;609;582;P
+LEMG;08;482;Malaga / Aeropuerto;;Spain;6;36-40N;004-29W;36-40N;004-29W;16;7;P
+LEMH;08;314;Menorca / Mahon;;Spain;6;39-52N;004-14E;39-52N;004-14E;87;82;P
+LEMO;08;397;Moron De La Frontera;;Spain;6;37-09N;005-37W;;;87;88;
+LEPA;08;306;Palma De Mallorca / Son San Juan;;Spain;6;39-33N;002-44E;;;4;8;P
+LEPP;08;085;Pamplona / Noain;;Spain;6;42-46N;001-38W;;;459;453;
+LERI;08;429;Murcia / Alcantarilla;;Spain;6;37-57N;001-14W;;;75;75;
+LERS;08;175;Reus / Aeropuerto;;Spain;6;41-09N;001-10E;;;71;76;
+LERT;08;449;Rota;;Spain;6;36-39N;006-21W;36-39N;006-21W;26;26;
+LESA;08;202;Salamanca / Matacan;;Spain;6;40-57N;005-30W;40-57N;005-30W;793;795;P
+LESO;08;029;San Sebastian / Fuenterrabia;;Spain;6;43-21N;001-48W;;;5;8;
+LEST;08;042;Santiago / Labacolla;;Spain;6;42-54N;008-26W;;;370;367;P
+LETO;08;227;Madrid / Torrejon;;Spain;6;40-29N;003-27W;;;607;611;
+LEVC;08;284;Valencia / Aeropuerto;;Spain;6;39-30N;000-28W;39-30N;000-28W;69;62;P
+LEVD;08;140;Valladolid / Villanubla;;Spain;6;41-43N;004-51W;41-43N;004-51W;849;846;P
+LEVS;08;223;Madrid / Cuatro Vientos;;Spain;6;40-23N;003-47W;;;690;687;
+LEVT;08;080;Vitoria;;Spain;6;42-53N;002-43W;;;513;510;
+LEVX;08;045;Vigo / Peinador;;Spain;6;42-13N;008-38W;;;264;255;P
+LEXJ;08;021;Santander / Parayas;;Spain;6;43-26N;003-49W;;;6;9;
+LEZA;--;---;Zaragoza United States Air Force Operated Base In Foreign Country ;;Spain;6;41-40N;001-03W;;;263;;
+LEZG;08;160;Zaragoza / Aeropuerto;;Spain;6;41-40N;001-01W;41-40N;001-01W;263;258;P
+LEZL;08;391;Sevilla / San Pablo;;Spain;6;37-25N;005-54W;37-25N;005-54W;34;31;P
+LFAT;07;003;Le Touquet;;France;6;50-31N;001-37E;;;10;14;P
+LFBA;07;524;Agen;;France;6;44-11N;000-36E;;;61;60;P
+LFBC;07;502;Cazaux;;France;6;44-32N;001-08W;44-32N;001-08W;25;33;P
+LFBD;07;510;Bordeaux / Merignac;;France;6;44-50N;000-42W;44-50N;000-42W;49;61;P
+LFBE;07;530;Bergerac;;France;6;44-49N;000-31E;;;51;52;P
+LFBF;07;631;Toulouse / Francazal;;France;6;43-32N;001-22E;;;164;166;P
+LFBG;07;412;Cognac;;France;6;45-40N;000-19W;45-40N;000-19W;30;31;P
+LFBH;07;315;La Rochelle;;France;6;46-09N;001-09W;;;4;10;P
+LFBI;07;335;Poitiers;;France;6;46-35N;000-19E;46-35N;000-19E;129;120;P
+LFBK;--;---;Montlucon / Gueret;;France;6;46-13N;002-22E;;;415;;
+LFBL;07;434;Limoges;;France;6;45-52N;001-11E;45-52N;001-11E;396;402;P
+LFBM;07;607;Mont-De-Marsan;;France;6;43-55N;000-30W;43-55N;000-30W;62;63;P
+LFBN;07;330;Niort;;France;6;46-19N;000-24W;;;61;61;P
+LFBO;07;630;Toulouse / Blagnac;;France;6;43-38N;001-22E;43-38N;001-22E;152;153;P
+LFBP;07;610;Pau;;France;6;43-23N;000-25W;;;188;185;P
+LFBS;07;503;Biscarosse;;France;6;44-26N;001-15W;44-26N;001-15W;33;39;P
+LFBT;07;621;Tarbes Ossun Lourdes;;France;6;43-11N;000-00W;;;379;363;P
+LFBV;07;438;Brive;;France;6;45-09N;001-28E;;;111;117;P
+LFBX;07;428;Perigueux;;France;6;45-12N;000-49E;;;100;97;
+LFBY;07;603;Dax;;France;6;43-41N;001-04W;43-41N;001-04W;32;32;P
+LFBZ;07;602;Biarritz;;France;6;43-28N;001-32W;43-28N;001-32W;75;71;P
+LFCG;07;627;St-Girons;;France;6;43-00N;001-06E;43-00N;001-06E;414;412;P
+LFCI;07;632;Albi;;France;6;43-55N;002-07E;;;172;178;P
+LFCR;07;552;Rodez;;France;6;44-24N;002-29E;;;581;580;
+LFDH;07;622;Auch;;France;6;43-41N;000-36E;;;125;128;P
+LFFS;--;---;Suippes Range Met ;;France;6;49-09N;004-32E;;;199;;
+LFGJ;--;---;Dole Tavaux;;France;6;47-02-34N;005-26-06E;;;196;;
+LFHP;07;471;Le Puy;;France;6;45-05N;003-46E;;;832;833;P
+LFIG;07;555;Cassagnes-Begonhes;;France;6;44-11N;002-31E;;;1020;;
+LFJL;07;093;Metz-Nancy-Lorraine;;France;6;48-59N;006-15E;;;264;;
+LFKB;07;790;Bastia;;France;6;42-33N;009-29E;42-33N;009-29E;8;12;P
+LFKC;07;754;Calvi;;France;6;42-32N;008-48E;;;64;58;P
+LFKF;07;780;Figari;;France;6;41-30N;009-06E;;;26;23;P
+LFKJ;07;761;Ajaccio;;France;6;41-55N;008-48E;41-55N;008-48E;6;9;P
+LFKS;07;765;Solenzara;;France;6;41-55N;009-24E;41-55N;009-24E;8;22;P
+LFLA;07;265;Auxerre;;France;6;47-48N;003-33E;47-48N;003-33E;207;212;P
+LFLB;07;491;Chambery / Aix-Les-Bains;;France;6;45-39N;005-53E;;;235;239;P
+LFLC;07;460;Clermont-Ferrand;;France;6;45-47N;003-10E;45-47N;003-10E;332;330;P
+LFLD;07;255;Bourges;;France;6;47-04N;002-22E;47-04N;002-22E;161;166;P
+LFLL;07;481;Lyon / Satolas;;France;6;45-44N;005-05E;45-44N;005-05E;248;240;P
+LFLM;07;385;Macon;;France;6;46-18N;004-48E;46-18N;004-48E;221;217;P
+LFLN;07;379;Saint-Yan;;France;6;46-25N;004-01E;;;242;244;P
+LFLQ;07;577;Montelimar;;France;6;44-35N;004-44E;44-35N;004-44E;73;74;P
+LFLS;07;486;Grenoble / St. Geoirs;;France;6;45-22N;005-20E;;;384;386;P
+LFLV;07;374;Vichy;;France;6;46-10N;003-24E;;;249;251;P
+LFLW;07;549;Aurillac;;France;6;44-54N;002-25E;;;640;639;P
+LFLX;07;354;Chateauroux;;France;6;46-51N;001-43E;;;160;157;P
+LFLY;07;480;Lyon / Bron;;France;6;45-43N;004-57E;45-43N;004-57E;200;201;P
+LFMA;07;649;Aix Les Milles;;France;6;43-30N;005-22E;;;111;111;P
+LFMC;07;675;Le Luc;;France;6;43-23N;006-23E;;;80;78;P
+LFMD;07;684;Cannes;;France;6;43-33N;006-57E;;;3;9;P
+LFME;07;645;Nimes / Courbessac;;France;6;43-52N;004-24E;43-52N;004-24E;60;62;P
+LFMH;07;475;St-Etienne Boutheon;;France;6;45-32N;004-18E;;;404;402;P
+LFMI;07;647;Istres;;France;6;43-31N;004-56E;;;23;24;P
+LFMK;07;635;Carcassonne;;France;6;43-13N;002-19E;43-13N;002-19E;130;130;P
+LFML;07;650;Marseille / Marignane;;France;6;43-27N;005-14E;43-27N;005-13E;6;36;P
+LFMN;07;690;Nice;;France;6;43-39N;007-12E;43-39N;007-12E;4;10;P
+LFMO;07;579;Orange;;France;6;44-08N;004-50E;;;60;55;P
+LFMP;07;747;Perpignan;;France;6;42-44N;002-52E;42-44N;002-52E;43;48;P
+LFMT;07;643;Montpellier;;France;6;43-35N;003-58E;;;5;6;P
+LFMU;--;---;Beziers / Vias;;France;6;43-19N;003-21E;;;17;;
+LFMX;07;588;St-Auban-Sur-Durance;;France;6;44-04N;006-00E;44-04N;006-00E;460;461;P
+LFMY;07;648;Salon;;France;6;43-36N;005-06E;;;59;60;P
+LFNB;--;---;Mende / Brenoux;;France;6;44-30N;003-32E;;;1024;;
+LFOA;--;---;Avord;;France;6;47-03-12N;002-37-57E;;;177;;
+LFOB;07;055;Beauvais;;France;6;49-28N;002-07E;;;109;111;P
+LFOC;07;140;Chateaudun;;France;6;48-03N;001-23E;;;134;127;P
+LFOE;07;038;Evreux;;France;6;49-01N;001-13E;;;141;146;P
+LFOF;07;139;Alencon;;France;6;48-27N;000-07E;48-27N;000-07E;144;141;P
+LFOH;07;028;La Heve;;France;6;49-31N;000-04E;;;100;103;P
+LFOI;07;005;Abbeville;;France;6;50-08N;001-50E;50-08N;001-50E;74;77;P
+LFOJ;07;249;Orleans;;France;6;47-59N;001-45E;47-59N;001-45E;126;125;P
+LFOK;--;---;Chalons-Vatry;;France;6;48-46-34N;004-11-04E;;;179;;
+LFOP;07;037;Rouen;;France;6;49-23N;001-11E;49-23N;001-11E;157;157;P
+LFOR;07;143;Chartres;;France;6;48-28N;001-31E;;;155;156;P
+LFOS;07;033;Vittefleur / St. Vale;;France;6;49-50N;000-39E;;;83;;
+LFOT;07;240;Tours;;France;6;47-27N;000-43E;47-27N;000-43E;108;112;P
+LFOW;07;061;Saint-Quentin;;France;6;49-49N;003-12E;49-49N;003-12E;98;101;P
+LFPB;07;150;Paris / Le Bourget;;France;6;48-58N;002-27E;;;66;65;P
+LFPC;07;057;Creil Fafb ;;France;6;49-15N;002-31E;;;88;;
+LFPG;07;157;Paris-Aeroport Charles De Gaulle;;France;6;49-01N;002-32E;;;118;109;P
+LFPM;07;153;Melun;;France;6;48-37N;002-41E;;;95;92;P
+LFPN;07;146;Toussus Le Noble;;France;6;48-46N;001-06E;;;164;161;P
+LFPO;07;149;Paris-Orly;;France;6;48-44N;002-24E;48-44N;002-24E;89;96;P
+LFPV;07;147;Villacoublay;;France;6;48-46N;002-12E;;;177;179;P
+LFPW;--;---;Paris Met Center;;France;6;48-50N;002-20E;;;75;;
+LFQB;07;168;Troyes;;France;6;48-20N;004-01E;;;118;118;P
+LFQG;07;260;Nevers;;France;6;47-00N;003-06E;;;180;181;P
+LFQH;07;276;Chatillon-Sur-Seine;;France;6;47-51N;004-33E;;;264;;
+LFQI;07;017;Cambrai;;France;6;50-13N;003-09E;;;78;77;P
+LFQQ;07;015;Lille;;France;6;50-34N;003-06E;50-34N;003-06E;48;52;P
+LFQV;07;075;Charleville;;France;6;49-47N;004-38E;;;149;150;P
+LFRA;07;230;Angers;;France;6;47-30N;000-34W;;;57;58;P
+LFRB;07;110;Brest;;France;6;48-27N;004-25W;48-27N;004-25W;99;103;P
+LFRC;07;024;Cherbourg / Maupertus;;France;6;49-39N;001-28W;49-39N;001-28W;138;139;
+LFRD;07;125;Dinard;;France;6;48-35N;002-04W;;;65;60;
+LFRH;07;205;Lann Bihoue;;France;6;47-46N;003-27W;;;52;44;P
+LFRI;07;306;La Roche-Sur-Yon;;France;6;46-42N;001-23W;;;90;91;P
+LFRJ;07;106;Landivisiau;;France;6;48-31N;004-09W;;;106;115;P
+LFRK;07;027;Caen;;France;6;49-11N;000-27W;;;78;67;P
+LFRL;07;109;Lanveoc Poulmic;;France;6;48-17N;004-26W;;;87;82;P
+LFRM;07;235;Le Mans;;France;6;47-56N;000-12E;;;59;52;P
+LFRN;07;130;Rennes;;France;6;48-04N;001-44W;48-04N;001-44W;37;37;P
+LFRO;--;---;Lannion / Servel;;France;6;48-45N;003-28W;;;89;;
+LFRQ;07;201;Quimper;;France;6;47-58N;004-10W;;;92;94;P
+LFRS;07;222;Nantes;;France;6;47-10N;001-36W;47-10N;001-36W;27;27;P
+LFRT;07;120;Saint-Brieuc;;France;6;48-32N;002-51W;;;138;136;P
+LFRU;--;---;Morlaix / Ploujean;;France;6;48-36N;003-49W;;;86;;
+LFRZ;07;217;St-Nazaire;;France;6;47-19N;002-10W;;;3;4;P
+LFSA;07;288;Besancon;;France;6;47-15N;005-59E;;;307;309;P
+LFSB;07;299;Bale-Mulhouse;;France;6;47-36N;007-31E;;;270;271;P
+LFSC;07;197;Colmar;;France;6;47-55N;007-24E;;;211;217;P
+LFSD;07;280;Dijon;;France;6;47-16N;005-05E;47-16N;005-05E;222;227;P
+LFSF;07;090;Metz / Frescaty;;France;6;49-05N;006-08E;;;190;191;P
+LFSI;07;169;St-Dizier;;France;6;48-38N;004-54E;;;139;140;P
+LFSL;07;179;Toul / Rosieres;;France;6;48-47N;005-29E;;;285;298;P
+LFSN;07;180;Nancy / Essey;;France;6;48-41N;006-13E;48-41N;006-13E;225;217;P
+LFSO;07;181;Nancy / Ochey;;France;6;48-35N;005-58E;;;336;350;P
+LFSQ;07;295;Belfort;;France;6;47-38N;006-52E;;;422;423;P
+LFSR;07;070;Reims;;France;6;49-18N;004-02E;49-18N;004-02E;95;99;P
+LFST;07;190;Strasbourg;;France;6;48-33N;007-38E;;;153;154;P
+LFSX;07;292;Luxeuil;;France;6;47-47N;006-21E;;;278;273;P
+LFTH;07;667;Hyeres;;France;6;43-06N;006-09E;;;3;4;P
+LFTU;07;680;St-Raphael;;France;6;43-25N;006-45E;43-25N;006-45E;2;6;P
+LFTW;07;646;Nimes / Garons;;France;6;43-45N;004-25E;;;94;96;P
+LFVP;71;805;Saint-Pierre;;Saint Pierre and Miquelon;4;46-46N;056-10W;46-46N;056-10W;3;5;P
+LFXA;07;482;Amberieu;;France;6;45-59N;005-20E;;;250;257;P
+LFYR;07;247;Romorantin;;France;6;47-19N;001-41E;;;85;86;P
+LGAD;16;682;Andravida Airport ;;Greece;6;37-55N;021-17E;;;10;14;P
+LGAL;16;627;Alexandroupoli Airport ;;Greece;6;40-51N;025-55E;;;7;3;P
+LGAT;16;716;Athinai Airport ;;Greece;6;37-54N;023-44E;37-54N;023-44E;28;15;P
+LGAV;--;---;Athens Eleftherios Venizelos International Airport;;Greece;6;37-56N;023-56E;;;94
+LGBL;16;665;Anchialos Airport ;;Greece;6;39-13N;022-48E;;;25;15;
+LGEL;16;718;Elefsis Airport ;;Greece;6;38-04N;023-33E;;;44;31;
+LGHI;16;706;Chios Airport ;;Greece;6;38-20N;026-08E;;;5;4;P
+LGIR;16;754;Heraklion Airport ;;Greece;6;35-20N;025-11E;35-20N;025-11E;37;39;P
+LGKA;16;614;Kastoria Airport ;;Greece;6;40-27N;021-17E;;;604;;P
+LGKC;--;---;Kithira Airport;;Greece;6;36-17-21N;023-01-24E;;;321;;
+LGKF;16;685;Kefalhnia Airport ;;Greece;6;38-07N;020-30E;;;19;22;
+LGKL;16;726;Kalamata Airport ;;Greece;6;37-04N;022-01E;;;6;8;
+LGKO;16;742;Kos Airport ;;Greece;6;36-47N;027-04E;;;129;;P
+LGKP;16;765;Karpathos Airport;;Greece;6;35-24-51N;027-08-54E;;;6;;
+LGKR;16;641;Kerkyra Airport ;;Greece;6;39-37N;019-55E;;;2;4;P
+LGKV;16;624;Chrysoupoli Airport ;;Greece;6;40-59N;024-36E;;;5;5;P
+LGKZ;16;632;Kozani Airport ;;Greece;6;40-18N;021-47E;;;634;627;
+LGLM;16;650;Limnos Airport ;;Greece;6;39-55N;025-14E;;;5;4;P
+LGLR;16;648;Larissa Airport ;;Greece;6;39-38N;022-25E;;;73;74;
+LGMK;--;---;Mikonos Island, Mikonos Airport;;Greece;6;37-26-09N;025-20-45E;;;123;;
+LGMT;16;667;Mytilini Airport ;;Greece;6;39-04N;026-36E;;;3;5;P
+LGNX;--;---;Cyclades Islands, Naxos Airport;;Greece;6;37-04-47N;025-22-01E;;;3;;
+LGPA;--;---;Paros Community Airport;;Greece;6;37-00-40N;025-07-32E;;;36;;
+LGPZ;16;643;Aktion Airport ;;Greece;6;38-37N;020-46E;;;4;4;P
+LGRD;--;---;Rhodes / Maritsa;;Greece;6;36-23N;028-07E;;;62;;
+LGRP;16;749;Rhodes Airport ;;Greece;6;36-24N;028-05E;36-23N;028-07E;4;11;P
+LGRX;16;687;Araxos Airport ;;Greece;6;38-09N;021-25E;38-10N;021-25E;11;12;
+LGSA;16;746;Souda Airport ;;Greece;6;35-29N;024-07E;;;146;151;P
+LGSK;--;---;Skiathos Island;;Greece;6;39-11N;023-30E;;;15;;
+LGSM;16;723;Samos Airport ;;Greece;6;37-42N;026-55E;;;2;7;
+LGSO;--;---;Syros Airport;;Greece;6;37-25-16N;024-56-54E;;;73;;
+LGSR;--;---;Santorini Island;;Greece;6;36-24N;025-29E;;;38;;
+LGTG;16;699;Tanagra Airport ;;Greece;6;38-19N;023-32E;;;148;140;
+LGTP;16;710;Tripolis Airport;;Greece;6;37-32N;022-24E;;;644;652;
+LGTS;16;622;Thessaloniki Airport ;;Greece;6;40-31N;022-58E;40-31N;022-58E;8;4;P
+LGTT;16;715;Tatoi;;Greece;6;38-06N;023-47E;;;239;235;
+LGZA;--;---;Zakinthos Airport ;;Greece;6;37-45N;020-53E;;;3;;
+LHBC;12;992;Bekescsaba;;Hungary;6;46-41N;021-10E;;;88;90;P
+LHBM;12;840;Budapest Met Center;;Hungary;6;47-31N;019-02E;;;129;;
+LHBP;12;839;Budapest / Ferihegy;;Hungary;6;47-26N;019-16E;;;151;185;
+LHBS;12;838;Budaors;;Hungary;6;47-27N;018-58E;;;132;;
+LHDC;12;882;Debrecen;;Hungary;6;47-29N;021-36E;47-29N;021-38E;108;109;P
+LHKE;12;970;Kecskemet;;Hungary;6;46-55N;019-45E;;;113;123;P
+LHKV;12;930;Kaposvar;;Hungary;6;46-23N;017-50E;;;144;145;
+LHMC;12;772;Miskolc;;Hungary;6;48-05N;020-46E;48-06N;020-47E;232;236;P
+LHNY;12;892;Nyiregyhaza / Napkor;;Hungary;6;47-58N;021-59E;;;141;142;P
+LHPA;12;825;Papa;;Hungary;6;47-12N;017-30E;;;145;146;P
+LHPP;12;942;Pecs / Pogany;;Hungary;6;46-06N;018-14E;46-00N;018-14E;201;203;P
+LHSA;--;---;Szentkiralyszabadja;;Hungary;6;47-04N;017-59E;;;280;;
+LHSK;12;935;Siofok;;Hungary;6;46-55N;018-03E;46-55N;018-03E;108;109;P
+LHSN;12;860;Szolnok;;Hungary;6;47-07N;020-14E;47-10N;020-14E;89;94;P
+LHSY;12;812;Szombathely;;Hungary;6;47-16N;016-38E;47-16N;016-38E;220;221;P
+LHTA;--;---;Taszar;;Hungary;6;46-24N;017-55E;;;160;;
+LHTL;--;---;Tokol;;Hungary;6;47-21N;018-59E;;;101;;
+LHUD;12;982;Szeged;;Hungary;6;46-15N;020-06E;46-15N;020-06E;82;83;P
+LIBA;16;261;Amendola;;Italy;6;41-32N;015-43E;;;57;60;P
+LIBC;16;350;Crotone;;Italy;6;39-00N;017-04E;;;155;161;P
+LIBD;16;270;Bari / Palese Macchie;;Italy;6;41-08N;016-47E;;;34;49;P
+LIBE;16;258;Monte S. Angelo;;Italy;6;41-42N;015-57E;;;838;844;
+LIBG;16;324;Grottaglie;;Italy;6;40-31N;017-24E;;;64;69;
+LIBH;16;325;Marina Di Ginosa;;Italy;6;40-26N;016-53E;;;2;12;P
+LIBN;16;332;Lecce;;Italy;6;40-14N;018-09E;;;48;61;
+LIBP;16;230;Pescara;;Italy;6;42-26N;014-12E;42-26N;014-12E;10;11;P
+LIBQ;16;344;Monte Scuro;;Italy;6;39-20N;016-24E;;;1710;1720;
+LIBR;16;320;Brindisi;;Italy;6;40-39N;017-57E;40-39N;017-57E;15;10;P
+LIBS;16;252;Campobasso;;Italy;6;41-34N;014-39E;;;793;807;P
+LIBT;16;232;Termoli;;Italy;6;42-00N;015-00E;;;16;44;
+LIBU;16;316;Latronico;;Italy;6;40-05N;016-01E;;;888;896;
+LIBV;16;312;Gioia Del Colle;;Italy;6;40-46N;016-56E;;;345;350;
+LIBW;16;337;Bonifati;;Italy;6;39-35N;015-53E;39-35N;015-53E;484;485;
+LIBY;16;360;S. Maria Di Leuca;;Italy;6;39-49N;018-21E;;;104;112;P
+LIBZ;16;300;Potenza;;Italy;6;40-38N;015-48E;40-38N;015-48E;823;843;P
+LICA;16;362;Lamezia Terme;;Italy;6;38-54N;016-15E;;;15;;P
+LICB;--;---;Comiso As Usaf ;;Italy;6;36-56N;014-36E;;;220;;
+LICC;16;460;Catania / Fontanarossa;;Italy;6;37-28N;015-03E;37-28N;015-03E;11;17;P
+LICD;16;490;Lampedusa;;Italy;6;35-30N;012-36E;;;16;20;P
+LICE;16;450;Enna;;Italy;6;37-34N;014-17E;;;940;965;
+LICF;16;420;Messina;;Italy;6;38-12N;015-33E;38-12N;015-33E;59;51;P
+LICG;16;470;Pantelleria;;Italy;6;36-49N;011-58E;36-49N;011-58E;191;170;P
+LICJ;16;405;Palermo / Punta Raisi;;Italy;6;38-11N;013-06E;38-11N;013-06E;21;21;P
+LICL;16;453;Gela;;Italy;6;37-05N;014-13E;;;11;33;P
+LICM;--;---;Calopezzati ;;Italy;6;39-33N;016-48E;;;179;;
+LICO;16;480;Cozzo Spadaro;;Italy;6;36-41N;015-08E;;;46;51;P
+LICP;16;410;Palermo Boccadifalco;;Italy;6;38-06N;013-18E;;;107;117;
+LICR;16;422;Reggio Calabria;;Italy;6;38-04N;015-39E;;;11;21;
+LICT;16;429;Trapani / Birgi;;Italy;6;37-55N;012-30E;37-55N;012-30E;7;14;P
+LICU;16;400;Ustica;;Italy;6;38-42N;013-11E;38-42N;013-11E;250;251;P
+LICZ;16;459;Catania / Sigonella;;Italy;6;37-24N;014-55E;;;22;22;
+LIEA;16;520;Alghero;;Italy;6;40-38N;008-17E;40-38N;008-17E;23;40;P
+LIEB;16;550;Capo Bellavista;;Italy;6;39-56N;009-43E;;;138;150;P
+LIEC;16;564;Capo Carbonara;;Italy;6;39-06N;009-31E;;;116;118;
+LIED;16;546;Decimomannu;;Italy;6;39-21N;008-58E;;;29;28;
+LIEE;16;560;Cagliari / Elmas;;Italy;6;39-15N;009-04E;39-15N;009-03E;4;5;P
+LIEF;16;539;Capo Frasca;;Italy;6;39-45N;008-28E;;;89;95;P
+LIEG;16;506;Guardiavecchia;;Italy;6;41-13N;009-24E;;;158;159;P
+LIEH;16;522;Capo Caccia;;Italy;6;40-34N;008-10E;40-34N;008-10E;200;204;
+LIEL;16;542;Capo S. Lorenzo;;Italy;6;39-30N;009-38E;;;4;5;
+LIEN;16;538;Fonni;;Italy;6;40-07N;009-15E;;;1022;1029;
+LIEO;16;531;Olbia / Costa Smeralda;;Italy;6;40-54N;009-31E;;;11;13;
+LIEP;16;541;Perdasdefogu;;Italy;6;39-40N;009-26E;;;608;606;
+LIMC;16;066;Milano / Malpensa;;Italy;6;45-37N;008-44E;;;234;211;P
+LIME;16;076;Bergamo / Orio Al Serio;;Italy;6;45-40N;009-42E;;;238;237;
+LIMF;16;059;Torino / Caselle;;Italy;6;45-13N;007-39E;45-13N;007-39E;301;287;P
+LIMG;16;122;Albenga;;Italy;6;44-03N;008-07E;;;45;49;
+LIMH;16;052;Pian Rosa;;Italy;6;45-56N;007-42E;;;3480;3488;P
+LIMJ;16;120;Genova / Sestri;;Italy;6;44-25N;008-51E;;;2;3;P
+LIMK;16;061;Torino / Bric Della Croce;;Italy;6;45-02N;007-44E;;;709;710;
+LIML;16;080;Milano / Linate;;Italy;6;45-26N;009-17E;45-26N;009-17E;107;103;P
+LIMN;16;064;Novara / Cameri;;Italy;6;45-31N;008-40E;;;178;169;
+LIMO;16;072;Monte Bisbino;;Italy;6;45-52N;009-04E;;;1319;1322;
+LIMP;--;---;Parma;;Italy;6;44-49-17N;010-17-41E;;;50;;
+LIMS;16;084;Piacenza;;Italy;6;44-55N;009-44E;;;134;138;P
+LIMT;16;124;Passo Della Cisa;;Italy;6;44-26N;009-56E;;;1039;1040;
+LIMU;16;153;Capo Mele;;Italy;6;43-57N;008-10E;43-57N;008-10E;220;221;P
+LIMV;16;119;Passo Dei Giovi;;Italy;6;44-38N;008-56E;;;468;475;
+LIMY;16;115;Monte Malanotte;;Italy;6;44-15N;007-48E;;;1741;1742;
+LIMZ;--;---;Cuneo / Levaldigi;;Italy;6;44-32-47N;007-37-20E;;;386;;
+LIPA;16;036;Aviano;;Italy;6;46-02N;012-36E;;;128;128;
+LIPB;16;020;Bolzano;;Italy;6;46-28N;011-20E;;;1459;1461;P
+LIPC;16;148;Cervia;;Italy;6;44-13N;012-18E;;;6;10;
+LIPD;16;044;Udine / Campoformido;;Italy;6;46-02N;013-11E;46-02N;013-11E;93;94;P
+LIPE;16;140;Bologna / Borgo Panigale;;Italy;6;44-32N;011-18E;44-32N;011-18E;36;49;
+LIPF;16;138;Ferrara;;Italy;6;44-50N;011-37E;;;10;10;
+LIPH;16;099;Treviso / S. Angelo;;Italy;6;45-39N;012-11E;;;18;23;
+LIPI;16;045;Udine / Rivolto;;Italy;6;45-59N;013-02E;;;51;53;P
+LIPK;16;147;Forli;;Italy;6;44-12N;012-04E;;;27;32;
+LIPL;16;088;Brescia / Ghedi;;Italy;6;45-25N;010-17E;;;102;97;
+LIPO;--;---;Brescia / Montichia;;Italy;6;45-24-02N;010-18-59E;;;104;;
+LIPP;--;---;Dova Area Control Center;;Italy;6;45-24N;011-52E;;;14;;
+LIPQ;16;108;Ronchi Dei Legionari;;Italy;6;45-49N;013-29E;;;12;12;
+LIPR;16;149;Rimini;;Italy;6;44-02N;012-37E;;;12;13;P
+LIPS;16;098;Treviso / Istrana;;Italy;6;45-41N;012-06E;;;45;46;
+LIPT;16;094;Vicenza;;Italy;6;45-34N;011-31E;;;39;53;
+LIPX;16;090;Verona / Villafranca;;Italy;6;45-23N;010-52E;;;67;68;P
+LIPY;16;191;Falconara;;Italy;6;43-37N;013-22E;;;12;10;P
+LIPZ;16;105;Venezia / Tessera;;Italy;6;45-30N;012-20E;45-30N;012-20E;2;6;P
+LIQB;16;172;Arezzo;;Italy;6;43-28N;011-51E;;;248;249;
+LIQC;16;294;Capri;;Italy;6;40-33N;014-12E;;;160;161;
+LIQD;--;---;Porretta Pass;;Italy;6;44-02N;010-56E;;;932;;
+LIQI;--;---;Gran Sasso Mountain Range ;;Italy;6;42-27N;013-42E;;;2138;;
+LIQJ;16;214;Civitavecchia;;Italy;6;42-02N;011-50E;;;3;4;
+LIQK;16;310;Capo Palinuro;;Italy;6;40-01N;015-17E;;;184;185;P
+LIQN;16;221;Rieti;;Italy;6;42-25N;012-51E;;;389;;
+LIQO;16;168;Monte Argentario;;Italy;6;42-23N;011-10E;;;630;631;
+LIQP;16;129;Isola Di Palmaria;;Italy;6;44-02N;009-50E;;;192;191;
+LIQR;16;204;Radicofani;;Italy;6;42-54N;011-46E;;;816;828;
+LIQV;16;164;Volterra;;Italy;6;43-24N;010-52E;;;555;575;
+LIQW;16;125;Sarzana / Luni;;Italy;6;44-05N;009-59E;;;9;10;
+LIQZ;16;280;Ponza;;Italy;6;40-55N;012-57E;;;184;185;P
+LIRA;16;239;Roma / Ciampino;;Italy;6;41-47N;012-35E;;;129;105;
+LIRB;16;224;Vigna Di Valle;;Italy;6;42-05N;012-13E;;;262;266;
+LIRE;16;245;Pratica Di Mare;;Italy;6;41-39N;012-27E;41-39N;012-26E;6;21;
+LIRF;16;242;Roma Fiumicino;;Italy;6;41-48N;012-14E;41-48N;012-14E;2;3;
+LIRG;16;234;Guidonia;;Italy;6;42-00N;012-44E;;;88;89;
+LIRH;16;244;Frosinone;;Italy;6;41-38N;013-18E;;;180;185;
+LIRI;--;---;Pontecagnano Air Force Base ;;Italy;6;40-37N;014-55E;;;40;;
+LIRJ;16;197;M. Calamita;;Italy;6;42-44N;010-24E;;;396;397;
+LIRK;16;219;Monte Terminillo;;Italy;6;42-28N;012-59E;;;1874;1875;P
+LIRL;16;243;Latina;;Italy;6;41-33N;012-54E;;;25;26;
+LIRM;16;253;Grazzanise;;Italy;6;41-03N;014-04E;;;9;10;
+LIRN;16;289;Napoli / Capodichino;;Italy;6;40-51N;014-18E;40-53N;014-18E;88;72;P
+LIRP;16;158;Pisa / S. Giusto;;Italy;6;43-41N;010-23E;43-40N;010-23E;2;6;P
+LIRQ;16;170;Firenze / Peretola;;Italy;6;43-48N;011-12E;;;40;38;P
+LIRS;16;206;Grosseto;;Italy;6;42-45N;011-04E;;;5;7;P
+LIRT;16;263;Trevico;;Italy;6;41-03N;015-14E;;;1085;1093;
+LIRU;16;235;Roma / Urbe;;Italy;6;41-57N;012-30E;;;18;24;
+LIRV;16;216;Viterbo;;Italy;6;42-26N;012-03E;;;300;308;
+LIRZ;16;181;Perugia;;Italy;6;43-05N;012-30E;43-05N;012-30E;208;205;P
+LIVC;16;134;Monte Cimone;;Italy;6;44-12N;010-42E;;;2165;2173;P
+LIVD;16;033;Dobbiaco;;Italy;6;46-44N;012-13E;;;1222;1226;
+LIVE;--;---;Resia Pass ;;Italy;6;46-50N;010-30E;;;1800;;
+LIVF;16;179;Frontone;;Italy;6;43-31N;012-44E;;;570;574;
+LIVM;16;146;Punta Marina;;Italy;6;44-27N;012-18E;;;2;6;
+LIVO;16;040;Tarvisio;;Italy;6;46-30N;013-35E;;;777;778;P
+LIVP;16;022;Paganella;;Italy;6;46-09N;011-02E;;;2125;2129;
+LIVR;16;021;Passo Rolle;;Italy;6;46-18N;011-47E;;;2004;2006;
+LIVT;16;110;Trieste;;Italy;6;45-39N;013-45E;;;8;20;P
+LIYW;16;037;Aviano Usaf ;;Italy;6;46-02N;012-37E;;;126;;
+LJLJ;14;014;Ljubljana / Brnik;;Slovenia;6;46-13N;014-29E;46-13N;014-29E;385;362;
+LJMB;14;026;Maribor / Slivnica;;Slovenia;6;46-29N;015-41E;;;264;265;
+LJMS;13;031;Murska Sobota;;Slovenia;6;46-39N;016-11E;;;188;;
+LJPZ;13;105;Portoroz;;Slovenia;6;45-31N;013-34E;;;95;;
+LKHO;11;774;Holesov;;Czech Republic;6;49-19N;017-34E;;;224;224;
+LKKU;--;---;Kunovice;;Czech Republic;6;49-01-46N;017-26-23E;;;177;;
+LKKV;11;414;Karlovy Vary;;Czech Republic;6;50-12N;012-55E;;;603;604;
+LKKZ;11;968;Kosice;;Slovakia;6;48-40N;021-13E;48-42N;021-16E;230;231;P
+LKLB;--;---;Liberec;;Czech Republic;6;50-46-06N;015-01-30E;;;405;;
+LKMT;11;782;Ostrava / Mosnov;;Czech Republic;6;49-41N;018-07E;49-47N;018-16E;256;256;P
+LKPP;11;826;Piestany;;Slovakia;6;48-37N;017-50E;;;163;164;
+LKPR;11;518;Praha / Ruzyne;;Czech Republic;6;50-06N;014-15E;50-06N;014-17E;365;365;P
+LKSL;11;903;Sliac;;Slovakia;6;48-39N;019-09E;;;314;315;P
+LKTB;11;723;Brno / Turany;;Czech Republic;6;49-09N;016-42E;;;241;246;P
+LLBG;40;180;Ben-Gurion International Airport;;Israel;6;32-00N;034-54E;32-00N;034-54E;40;49;P
+LLBS;40;191;Beer-Sheva;;Israel;6;31-14N;034-47E;31-14N;034-47E;275;280;P
+LLET;40;199;Eilat;;Israel;6;29-33N;034-57E;29-33N;034-57E;12;12;P
+LLHA;40;155;Sde-Haifa Haifa;;Israel;6;32-48N;035-02E;;;8;8;P
+LLIB;--;---;Galilee / Pina;;Israel;6;32-58-48N;035-34-12E;;;;;
+LLJR;40;290;Jerusalem Airport;;Israel;6;31-52N;035-13E;31-52N;035-13E;749;759;P
+LLOV;40;198;Ovda;;Israel;6;30-00N;034-50E;;;432;445;
+LLSD;--;---;Tel Aviv / Sde-Dov Airport;;Israel;6;32-06-53N;034-46-56E;;;13;;
+LMML;16;597;Luqa;;Malta;6;35-51N;014-29E;35-51N;014-29E;91;91;P
+LOAG;--;---;Krems-Langenlois;;Austria;6;48-26-46N;015-38-01E;;;312;;
+LOAN;--;---;Niederösterreich / Wiener Neustadt-Ost Flugplatz;;Austria;6;47-50-36N;016-15-29E;;;272;;
+LOAV;11;181;Niederösterreich / Flugplatz Vöslau;;Austria;6;47-57-52N;016-15-34E;;;233;;
+LOGG;--;---;Punitz-Güssing;;Austria;6;47-08-51N;016-19-04E;;;290;;
+LOIH;--;---;Hohenems-Dornbirn;;Austria;6;47-23-05N;009-42-02E;;;418;;
+LOLF;--;---;Oberösterreich / Freistadt Flugplatz;;Austria;6;48-30-53N;014-24-32E;;;685;;
+LOLW;--;---;Wels;;Austria;6;48-10N;014-02E;;;;;
+LOWG;11;240;Graz-Thalerhof-Flughafen;;Austria;6;47-00N;015-26E;47-00N;015-27E;340;347;P
+LOWI;11;120;Innsbruck-Flughafen;;Austria;6;47-16N;011-21E;;;581;593;P
+LOWK;11;231;Klagenfurt-Flughafen;;Austria;6;46-39N;014-20E;;;448;476;P
+LOWL;11;010;Linz / Hörsching-Flughafen;;Austria;6;48-14N;014-11E;48-14N;014-11E;298;313;P
+LOWS;11;150;Salzburg-Flughafen;;Austria;6;47-48N;013-00E;;;430;450;P
+LOWW;11;036;Wien / Schwechat-Flughafen;;Austria;6;48-07N;016-34E;;;183;190;P
+LOWZ;--;---;Zell Am See;;Austria;6;47-17-33N;012-47-15E;;;754;;
+LOXA;11;157;Aigen Im Ennstal;;Austria;6;47-32N;014-08E;;;638;649;P
+LOXL;11;011;Hörsching Aus-Afb ;;Austria;6;48-14N;014-11E;48-14N;014-11E;313;298;
+LOXS;11;122;Schwaz Heliport ;;Austria;6;47-20N;011-42E;;;543;;
+LOXT;11;030;Tulln;;Austria;6;48-19N;016-07E;;;175;176;
+LOXZ;11;165;Zeltweg;;Austria;6;47-12N;014-45E;;;677;682;P
+LPAZ;08;515;Santa Maria Acores ;;Portugal;6;36-58N;025-10W;;;100;100;P
+LPBG;08;575;Braganca;;Portugal;6;41-48N;006-44W;;;691;692;P
+LPBJ;08;562;Beja;;Portugal;6;38-01N;007-52W;;;246;247;P
+LPFL;08;501;Flores Acores ;;Portugal;6;39-27N;031-08W;;;28;29;P
+LPFR;08;554;Faro / Aeroporto;;Portugal;6;37-01N;007-58W;37-01N;007-58W;7;8;P
+LPFU;08;521;Funchal / S. Catarina;;Portugal;1;32-41N;016-46W;32-41N;016-46W;58;49;P
+LPHR;08;505;Horta / Castelo Branco Acores ;;Portugal;6;38-31N;028-43W;;;40;41;P
+LPLA;08;509;Lajes Acores ;;Portugal;6;38-46N;027-06W;38-44N;027-05W;52;54;P
+LPMA;--;---;Aeroporto Da Madeira;;Portugal;6;32-41-52N;016-46-28W;;;59;;
+LPMR;--;---;Monte Real Mil.;;Portugal;6;39-49-52N;008-53-14W;;;57;;
+LPMT;--;---;Montijo Mil.;;Portugal;6;38-42-14N;009-02-09W;;;14;;
+LPOV;--;---;Ovar Mil.;;Portugal;6;40-54-57N;008-38-45W;;;17;;
+LPPD;08;512;Ponta Delgada / Nordela Acores ;;Portugal;6;37-44N;025-42W;;;71;72;P
+LPPR;08;545;Porto / Pedras Rubras;;Portugal;6;41-14N;008-41W;41-14N;008-41W;69;77;P
+LPPS;08;524;Porto Santo;;Portugal;1;33-04N;016-21W;;;97;82;P
+LPPT;08;536;Lisboa / Portela;;Portugal;6;38-46N;009-08W;38-46N;009-08W;114;123;
+LPST;--;---;Sintra Mil.;;Portugal;6;38-49-52N;009-20-22W;;;134;;
+LPTN;--;---;Tancos Mil.;;Portugal;6;39-28-31N;008-21-52W;;;81;;
+LPVR;08;567;Vila Real;;Portugal;6;41-16N;007-43W;;;561;562;
+LQBI;13;228;Bihac;;Serbia and Montenegro;6;44-49N;015-53E;44-49N;015-53E;250;246;
+LQBK;13;242;Banja Luka;;Bosnia and Herzegovina;6;44-47N;017-13E;;;156;;
+LQLV;14;640;Livno;;Bosnia and Herzegovina;6;43-50N;017-01E;;;724;728;
+LQMO;13;348;Mostar;;Bosnia and Herzegovina;6;43-21N;017-48E;43-21N;017-48E;108;99;
+LQSA;13;353;Sarajevo;;Bosnia and Herzegovina;6;43-49N;018-20E;43-49N;018-20E;511;510;
+LQTZ;13;257;Tuzla;;Bosnia and Herzegovina;6;44-33N;018-42E;;;306;;
+LRAR;15;200;Arad;;Romania;6;46-12N;021-24E;46-10N;021-19E;117;118;P
+LRBC;15;150;Bacau;;Romania;6;46-35N;026-58E;46-35N;026-59E;184;190;P
+LRBM;15;014;Baia Mare;;Romania;6;47-40N;023-35E;47-40N;023-35E;218;194;
+LRBS;15;420;Bucuresti / Imh;;Romania;6;44-30N;026-08E;44-30N;026-08E;90;91;P
+LRCK;15;481;Kogalniceanu;;Romania;6;44-20N;028-26E;;;97;102;
+LRCL;15;120;Cluj-Napoca;;Romania;6;46-47N;023-34E;46-47N;023-34E;410;413;P
+LRCS;15;292;Caransebes;;Romania;6;45-25N;022-15E;;;241;242;P
+LRCV;15;450;Craiova;;Romania;6;44-14N;023-52E;44-14N;023-52E;192;195;P
+LRIA;15;090;Iasi;;Romania;6;47-10N;027-38E;47-10N;027-38E;102;104;P
+LROD;15;080;Oradea;;Romania;6;47-03N;021-56E;47-03N;021-56E;135;140;P
+LROP;15;421;Bucuresti Otopeni;;Romania;6;44-33N;026-06E;;;95;95;
+LRSB;15;260;Sibiu;;Romania;6;45-48N;024-09E;45-48N;024-09E;443;444;P
+LRSM;15;010;Satu Mare;;Romania;6;47-48N;022-53E;47-47N;022-53E;123;124;P
+LRSV;15;023;Suceava / Salcea;;Romania;6;47-39N;026-15E;47-39N;026-15E;351;351;
+LRTC;15;335;Tulcea;;Romania;6;45-11N;028-49E;45-11N;028-49E;4;6;
+LRTM;15;145;Tirgu Mures;;Romania;6;46-32N;024-32E;46-32N;024-32E;308;309;P
+LRTR;15;247;Timisoara;;Romania;6;45-46N;021-15E;45-46N;021-15E;86;88;P
+LSGC;--;---;Les Eplatures;;Switzerland;6;47-05-03N;006-47-37E;;;1027;;
+LSGG;06;700;Geneve-Cointrin;;Switzerland;6;46-15N;006-08E;;;420;416;P
+LSGL;06;710;Lausanne;;Switzerland;6;46-33N;006-37E;;;616;615;
+LSGN;06;604;Neuchatel;;Switzerland;6;47-00N;006-57E;;;485;487;
+LSGS;06;720;Sion;;Switzerland;6;46-13N;007-20E;;;482;481;P
+LSMP;06;610;Payerne;;Switzerland;6;46-49N;006-57E;46-49N;006-57E;490;491;P
+LSZA;06;770;Lugano;;Switzerland;6;46-00N;008-58E;;;273;276;
+LSZB;--;---;Bern / Belp ;;Switzerland;6;46-55N;007-30E;;;505;;
+LSZG;06;632;Grenchen;;Switzerland;6;47-10-53N;007-24-59E;;;430;;
+LSZH;06;670;Zurich-Kloten;;Switzerland;6;47-29N;008-32E;;;436;432;P
+LSZR;06;691;Saint Gallen-Altenrhein;;Switzerland;6;47-29-06N;009-33-43E;;;398;;
+LTAB;--;---;Ankara / Guvercin Lik;;Turkey;6;39-56N;032-45E;;;819;;
+LTAC;17;128;Ankara / Esenboga;;Turkey;6;40-07N;032-59E;;;953;949;P
+LTAD;17;129;Ankara / Etimesgut;;Turkey;6;39-57N;032-41E;;;799;806;P
+LTAE;17;120;Murted Tur-Afb ;;Turkey;6;40-05N;032-34E;;;843;;
+LTAF;17;352;Adana / Sakirpasa;;Turkey;6;36-59N;035-18E;36-59N;035-18E;20;20;
+LTAG;17;350;Adana / Incirlik;;Turkey;6;37-00N;035-25E;37-00N;035-25E;73;66;P
+LTAH;17;190;Afyon;;Turkey;6;38-45N;030-32E;;;1034;1034;P
+LTAI;17;300;Antalya;;Turkey;6;36-42N;030-44E;36-54N;030-47E;50;57;P
+LTAJ;17;260;Gaziantep;;Turkey;6;37-05N;037-22E;;;701;701;P
+LTAK;17;370;Iskenderun;;Turkey;6;36-35N;036-10E;;;3;3;P
+LTAN;17;244;Konya;;Turkey;6;37-58N;032-33E;37-58N;032-33E;1032;1022;P
+LTAP;17;082;Merzifon;;Turkey;6;40-51N;035-35E;40-50N;035-31E;545;535;P
+LTAQ;17;029;Samsun;;Turkey;6;41-16N;036-18E;;;162;168;
+LTAR;17;090;Sivas;;Turkey;6;39-45N;037-01E;;;1285;1285;P
+LTAS;17;022;Zonguldak;;Turkey;6;41-27N;031-48E;41-27N;031-48E;136;136;P
+LTAT;17;200;Malatya / Erhac;;Turkey;6;38-26N;038-05E;38-26N;038-05E;862;849;P
+LTAU;17;195;Kayseri / Erkilet;;Turkey;6;38-47N;035-29E;38-47N;035-29E;1053;1054;P
+LTAV;--;---;Sivrihisar;;Turkey;6;39-27N;031-21E;;;96;;
+LTAW;17;086;Tokat;;Turkey;6;40-18N;036-34E;;;608;608;
+LTAY;--;---;Cardak;;Turkey;6;37-47N;029-42E;;;849;;
+LTAZ;--;---;Nevsehir;;Turkey;6;38-46-12N;034-32-30E;;;945;;
+LTBA;17;060;Istanbul / Ataturk;;Turkey;6;40-58N;028-49E;;;48;37;P
+LTBD;17;234;Aydin;;Turkey;6;37-51N;027-51E;;;57;57;P
+LTBE;17;116;Bursa;;Turkey;6;40-11N;029-04E;;;101;100;P
+LTBF;17;150;Balikesir;;Turkey;6;39-37N;027-55E;;;101;102;P
+LTBG;17;115;Bandirma;;Turkey;6;40-19N;027-58E;40-19N;027-58E;51;49;P
+LTBH;17;112;Canakkale;;Turkey;6;40-08N;026-24E;;;3;3;P
+LTBI;17;124;Eskisehir;;Turkey;6;39-47N;030-34E;39-47N;030-34E;785;785;P
+LTBJ;17;219;Izmir / Adnan Menderes;;Turkey;6;38-16N;027-09E;;;125;120;
+LTBL;17;218;Izmir / Cigli;;Turkey;6;38-30N;027-01E;;;5;5;P
+LTBM;17;240;Isparta;;Turkey;6;37-45N;030-33E;37-45N;030-33E;997;997;P
+LTBO;17;188;Usak;;Turkey;6;38-40N;029-25E;;;919;919;P
+LTBQ;--;---;Topel Tur-Afb ;;Turkey;6;40-44N;030-05E;;;50;;
+LTBR;--;---;Bursa / Yenisehir, Mil-Civ;;Turkey;6;40-15-19N;029-33-45E;;;233;;
+LTBS;17;295;Dalaman;;Turkey;6;36-42N;028-47E;;;7;2;
+LTBT;17;184;Akhisar;;Turkey;6;38-55N;027-51E;;;93;93;P
+LTBU;--;---;Corlu;;Turkey;6;41-08N;027-55E;;;173;;
+LTBV;17;290;Bodrum;;Turkey;6;37-02N;027-25E;;;27;27;P
+LTCA;17;202;Elazig;;Turkey;6;38-36N;039-17E;;;902;882;P
+LTCC;17;280;Diyarbakir;;Turkey;6;37-53N;040-11E;37-53N;040-11E;686;677;P
+LTCD;17;092;Erzincan;;Turkey;6;39-44N;039-30E;;;1156;1215;P
+LTCE;17;096;Erzurum;;Turkey;6;39-55N;041-16E;;;1756;1758;P
+LTCF;17;098;Kars;;Turkey;6;40-36N;043-05E;;;1775;1775;P
+LTCG;17;038;Trabzon;;Turkey;6;41-00N;039-43E;;;35;30;P
+LTCH;17;270;Urfa;;Turkey;6;37-08N;038-46E;;;547;547;P
+LTCI;17;170;Van;;Turkey;6;38-27N;043-19E;;;1667;1661;P
+LTCJ;17;282;Batman;;Turkey;6;37-52N;041-10E;;;540;540;
+LTCK;--;---;Mus Tur-Afb ;;Turkey;6;38-45N;041-40E;;;1266;;
+LTFA;--;---;Izmir \ Kaklic;;Turkey;6;38-31N;026-59E;;;4;;
+LTFC;--;---;Suleyman Demirel;;Turkey;6;37-51N;030-22E;;;864;;
+LTFE;--;---;Bodrum Milas Airport;;Turkey;6;37-14-53N;027-40-55E;;;6;;
+LTFH;--;---;Samsun / Carsamba;;Turkey;6;41-15-15N;036-34-03E;;;5;;
+LTFJ;--;---;Istanbul / Sabiha Gokcen;;Turkey;6;40-53-55N;029-18-33E;;;95;;
+LUBL;--;---;Baltsi-Leadoveni - The North of Moldova;;Moldova;6;47-50-03N;027-46-09E;;;231
+LUCH;--;---;Kaxul - The South of Moldova;;Moldova;6;45-50-38N;028-15-55E;;;199;;
+LUKK;--;---;Chisinau International Airport;;Moldova;6;46-55-40N;028-55-51E;;;122;;
+LWOH;13;578;Ohrid;;Macedonia, The Republic of;6;41-07N;020-48E;;;760;761;
+LWSK;13;586;Skopje-Petrovec;;Macedonia, The Republic of;6;41-58N;021-39E;41-57N;021-38E;238;239;P
+LXGB;08;495;Gibraltar;;Gibraltar;6;36-09N;005-21W;36-15N;005-33W;5;0;
+LYBE;13;272;Beograd / Surcin;;Serbia and Montenegro;6;44-49N;020-17E;;;96;99;P
+LYNI;13;388;Nis;;Serbia and Montenegro;6;43-20N;021-54E;43-20N;021-54E;202;202;P
+LYPG;--;---;Podgorica Titograd ;;Serbia and Montenegro;6;42-26N;019-17E;;;53;;
+LYPR;13;481;Pristina;;Serbia and Montenegro;6;42-34N;021-02E;;;545;576;P
+LYPZ;14;105;Portoroz / Secovlje;;Slovenia;6;45-29N;013-37E;;;2;3;
+LYTI;13;462;Podgorica / Golubovci;;Serbia and Montenegro;6;42-22N;019-15E;42-22N;019-15E;33;33;P
+LYTV;13;457;Tivat;;Serbia and Montenegro;6;42-24N;018-44E;;;5;5;P
+LYVR;13;183;Vrsac;;Serbia and Montenegro;6;45-09N;021-19E;;;83;85;P
+LZIB;11;816;Bratislava Ivanka;;Slovakia;6;48-12N;017-12E;48-10N;017-12E;133;142;P
+LZKC;11;993;Kamenica Nad Cirochou;;Slovakia;6;48-56N;022-00E;;;177;;
+LZKZ;--;---;Kosice, Barca;;Slovakia;6;48-39-47N;021-14-28E;;;232;;
+LZLU;11;927;Lucenec;;Slovakia;6;48-20N;019-44E;;;214;;
+LZNI;--;---;Nitra;;Slovakia;6;48-16-46N;018-07-58E;;;134;;
+LZPE;--;---;Prievidza;;Slovakia;6;48-45-59N;018-35-18E;;;260;;
+LZPP;--;---;Piestany;;Slovakia;6;48-37-30N;017-49-43E;;;163;;
+LZSL;--;---;Sliac;;Slovakia;6;48-38-17N;019-08-03E;;;318;;
+LZTT;11;934;Poprad / Tatry;;Slovakia;6;49-04N;020-15E;49-04N;020-15E;694;695;P
+LZZI;--;---;Dolny Hricov;;Slovakia;6;49-14N;018-36-49E;;;312;;
+MBPV;--;---;Providenciales;;Turks and Caicos Islands;4;21-46-25N;072-15-57W;;;5;;
+MDBH;78;482;Barahona;;Dominican Republic;4;18-12N;071-06W;;;3;;P
+MDHE;78;484;Herrera;;Dominican Republic;4;18-28N;069-58W;;;58;;
+MDLR;--;---;La Romana International Airport;;Dominican Republic;4;18-25N;068-57W;;;8;;
+MDPC;78;479;Punta Cana;;Dominican Republic;4;18-34N;068-22W;;;12;;P
+MDPP;78;457;Puerto Plata International;;Dominican Republic;4;19-45N;070-33W;;;15;;
+MDSD;78;485;Las Americas;;Dominican Republic;4;18-26N;069-40W;;;18;;P
+MDSI;--;---;San Isidro Air Force Base;;Dominican Republic;4;18-30N;069-46W;;;111;;
+MDST;78;460;Santiago;;Dominican Republic;4;19-27N;070-42W;;;183;;P
+MGCB;78;631;Coban;;Guatemala;4;15-28N;090-19W;;;1316;;
+MGFL;78;615;Flores;;Guatemala;4;16-55N;089-53W;;;115;115;
+MGGT;78;641;Guatemala Aeropuertola Aurora ;;Guatemala;4;14-35N;090-31W;14-35N;090-31W;1489;1489;
+MGHT;78;627;Huehuetenango;;Guatemala;4;15-19N;091-28W;;;1901;1901;
+MGPB;78;637;Puerto Barrios;;Guatemala;4;15-43N;088-36W;15-43N;088-36W;1;1;
+MGQZ;--;---;Quezaltenango;;Guatemala;4;14-50N;091-31W;;;2500;;
+MGRT;78;639;Retalhuleu;;Guatemala;4;14-32N;091-40W;;;239;;
+MGSJ;78;647;San Jose;;Guatemala;4;13-55N;090-49W;13-55N;090-49W;2;2;
+MGTK;--;---;Tikal;;Guatemala;4;16-54N;089-51W;;;128;;
+MGZA;--;---;Zacapa;;Guatemala;4;14-58N;089-32W;;;490;;
+MHAM;78;700;Amapala;;Honduras;4;13-16N;087-39W;;;5;;
+MHCA;78;714;Catacamas;;Honduras;4;14-54N;085-56W;;;442;442;P
+MHCH;78;724;Choluteca;;Honduras;4;13-18N;087-11W;13-18N;087-11W;48;48;P
+MHIC;78;501;Islas Del Cisne;;Honduras;4;17-24N;083-56W;17-24N;083-56W;9;11;P
+MHLC;78;705;La Ceiba Airport ;;Honduras;4;15-44N;086-52W;;;3;26;P
+MHLE;78;719;La Esperanza;;Honduras;4;14-19N;088-09W;;;1100;1674;
+MHLM;78;708;La Mesa San Pedro Sula ;;Honduras;4;15-27N;087-56W;;;31;31;P
+MHNJ;78;701;Guanaja;;Honduras;4;16-28N;085-55W;16-28N;085-55W;2;2;P
+MHNO;78;701;Guanaja;;Honduras;4;16-28N;086-04W;;;2;;
+MHPL;78;711;Puerto Lempira;;Honduras;4;15-13N;083-48W;;;13;13;P
+MHRO;78;703;Roatan;;Honduras;4;16-19N;086-31W;;;5;2;P
+MHSC;78;718;Coronel Enrique Soto Cano Air Base;;Honduras;4;14-23N;087-37W;14-23N;087-37W;628;628;
+MHSR;78;717;Santa Rosa De Copan;;Honduras;4;14-47N;088-47W;;;1079;1079;P
+MHTE;78;706;Tela;;Honduras;4;15-43N;087-29W;;;3;3;P
+MHTG;78;720;Tegucigalpa;;Honduras;4;14-03N;087-13W;14-02N;087-15W;994;1007;P
+MHYR;78;707;Yoro;;Honduras;4;15-10N;087-07W;;;670;670;
+MKJP;78;397;Kingston / Norman Manley;;Jamaica;4;17-56N;076-47W;17-56N;076-47W;3;14;P
+MKJS;78;388;Montego Bay / Sangster;;Jamaica;4;18-30N;077-55W;;;1;8;P
+MMAA;--;---;Acapulco / G. Alvarez;;Mexico;4;16-46N;099-45W;;;5;;
+MMAN;76;394;Aerop. Internacional Monterrey, N. L.;;Mexico;4;25-52N;100-14W;25-52N;100-12W;448;450;
+MMAS;76;571;Aguascalientes, Ags.;;Mexico;4;21-53N;102-18W;;;1874;;
+MMBT;--;---;Bahias De Huatulco ;;Mexico;4;15-47N;096-16W;;;143;;
+MMCB;76;726;Cuernavaca, Mor.;;Mexico;4;18-53N;099-14W;;;1618;;
+MMCE;--;---;Ciudad Del Carmen ;;Mexico;4;18-39N;091-48W;;;2;;
+MMCL;76;412;Culiacan, Sin.;;Mexico;4;24-49N;107-24W;;;39;;
+MMCM;76;750;Chetumal, Q. Roo;;Mexico;4;18-29N;088-18W;;;9;;
+MMCN;76;253;Ciudad Obregon;;Mexico;4;27-23-34N;109-49-59W;;;62;;
+MMCP;76;695;Campeche, Camp.;;Mexico;4;19-51N;090-33W;;;5;;
+MMCS;--;---;Ciudad Juarez International ;;Mexico;4;31-38N;106-26W;;;1171;;
+MMCT;--;---;Chichen-Itza;;Mexico;4;20-38-30N;088-26-58W;;;31;;
+MMCU;--;---;Chihuahua International Airport;;Mexico;4;28-42N;105-58W;;;1360;;
+MMCV;--;---;Ciudad Victoria Airport;;Mexico;4;23-43N;098-58W;;;238;;
+MMCZ;--;---;Cozumel Civ / Mil ;;Mexico;4;20-32N;086-56W;;;5;;
+MMDO;--;---;Durango Airport;;Mexico;4;24-08N;104-32W;;;1857;;
+MMEP;76;556;Tepic, Nay.;;Mexico;4;21-31N;104-54W;;;922;;
+MMGL;--;---;Don Miguel / Guadalaj;;Mexico;4;20-31N;103-19W;;;1528;;
+MMGM;--;---;Guaymas International Airport;;Mexico;4;27-58N;110-56W;;;27;;
+MMHO;76;160;Hermosillo, Son.;;Mexico;4;29-04N;110-57W;;;211;;
+MMIA;76;658;Colima ;;Mexico;4;19-16N;103-35W;;;723;;
+MMIO;76;390;Saltillo, Coah.;;Mexico;4;25-27N;100-59W;;;1790;;
+MMIT;--;---;Ixtepec Ox;;Mexico;4;16-27N;095-05W;;;61;;
+MMLC;--;---;Lazaro Cardenas;;Mexico;4;17-59N;102-13W;;;12;;
+MMLM;--;---;Los Mochis Airport;;Mexico;4;25-41N;109-05W;;;4;;
+MMLO;--;---;Del Bajio / Leon;;Mexico;4;21-00N;101-29W;;;1819;;
+MMLP;--;---;La Paz International Airport;;Mexico;4;24-04N;110-22W;;;21;;
+MMLT;76;305;Loreto, B. C. S.;;Mexico;4;26-01N;111-21W;;;15;;
+MMMA;--;---;Matamoros International ;;Mexico;4;25-46N;097-32W;;;8;;
+MMMD;76;644;Merida / lic Manuel Crecencio;;Mexico;4;20-56N;089-39W;20-57N;089-40W;10;11;
+MMML;--;---;Mexicali International Airport ;;Mexico;4;32-38N;117-00W;;;22;;
+MMMM;--;---;Morelia New;;Mexico;4;19-51N;101-02W;;;1833;;
+MMMT;--;---;Minatitlan;;Mexico;4;18-06N;094-35W;;;40;;
+MMMV;76;342;Monclova, Coah.;;Mexico;4;26-53N;101-25W;26-54N;101-25W;615;586;
+MMMX;--;---;Mexico City / Licenci;;Mexico;4;19-26N;099-06W;;;2238;;
+MMMY;--;---;Monterrey / Gen Maria;;Mexico;4;25-47N;100-06W;;;387;;
+MMMZ;--;---;Mazatlan / G. Buelna;;Mexico;4;23-10N;106-16W;;;10;;
+MMNL;--;---;Nuevo Laredo International ;;Mexico;4;27-26N;099-34W;;;148;;
+MMOX;--;---;Oaxaca / Xoxocotlan;;Mexico;4;16-58N;096-44W;;;1528;;
+MMPA;--;---;Poza Rica / Palizada;;Mexico;4;20-31N;097-28W;;;15;;
+MMPB;76;685;Puebla, Pue.;;Mexico;4;19-03N;098-10W;;;2179;;
+MMPG;76;243;Piedras Negras, Coah.;;Mexico;4;28-42N;100-31W;;;250;;
+MMPN;--;---;Uruapan / Gen Rayon;;Mexico;4;19-24N;102-02W;;;1593;;
+MMPR;--;---;Puerto Vallarta / Lic;;Mexico;4;20-41N;105-15W;;;6;;
+MMPS;--;---;Puerto Escondido ;;Mexico;4;15-52N;097-05W;;;88;;
+MMQT;76;625;Queretaro, Qro.;;Mexico;4;20-36N;100-23W;;;1813;;
+MMRX;--;---;Reynosa International Airport ;;Mexico;4;26-01N;098-14W;;;39;;
+MMSD;--;---;San Jose Del Cabo ;;Mexico;4;23-09N;109-42W;;;109;;
+MMSP;76;539;San Luis Potosi, S. L. P.;;Mexico;4;22-09N;100-59W;;;1870;;
+MMTC;76;382;Torreon, Coah.;;Mexico;4;25-32N;103-27W;25-32N;103-27W;1124;1150;
+MMTG;76;843;Tuxtla Gutierrez, Chis.;;Mexico;4;16-45N;093-07W;;;528;;
+MMTJ;--;---;Tijuana International Airport ;;Mexico;4;32-33N;116-58W;;;152;;
+MMTL;76;634;Tulancingo ;;Mexico;4;20-05N;098-22W;;;2181;;
+MMTM;--;---;Tampico / Gen Fj Mina;;Mexico;4;22-17N;097-52W;;;24;;
+MMTO;--;---;Toluca / Jose Maria ;;Mexico;4;19-21N;099-34W;;;2576;;
+MMTP;--;---;Tapachula ;;Mexico;4;14-47N;092-23W;;;29;;
+MMUN;--;---;Cancun International Airport;;Mexico;4;21-02N;086-52W;;;5;;
+MMVA;--;---;Villahermosa ;;Mexico;4;18-00N;092-49W;;;13;;
+MMVR;--;---;Veracruz / Las Bajadas / General Heriberto Jara;;Mexico;4;19-09N;096-11W;;;32;;
+MMZC;--;---;Zacatecas Airport;;Mexico;4;22-54N;102-41W;;;2140;;
+MMZH;--;---;Ixtapa-Zihuatanejo;;Mexico;4;17-36N;101-28W;;;6;;
+MMZO;--;---;Manzanillo International ;;Mexico;4;19-09N;104-34W;;;8;;
+MMZP;--;---;Zapopan Military ;;Mexico;4;20-45N;103-28W;;;1625;;
+MNBL;78;745;Bluefields;;Nicaragua;4;12-00N;086-46W;;;5;5;P
+MNCH;78;739;Chinandega;;Nicaragua;4;12-38N;087-08W;;;53;60;P
+MNJG;78;734;Jinotega;;Nicaragua;4;13-05N;085-59W;;;985;1032;P
+MNJU;78;735;Juigalpa;;Nicaragua;4;12-06N;085-22W;;;90;90;P
+MNMG;78;741;Managua A. C. Sandino;;Nicaragua;4;12-09N;086-10W;12-07N;086-11W;50;56;P
+MNPC;78;730;Puerto Cabezas;;Nicaragua;4;14-03N;083-22W;14-02N;083-24W;20;20;P
+MNRS;78;733;Rivas;;Nicaragua;4;11-25N;085-50W;;;53;70;P
+MPBO;--;---;Bocas Del Toro International;;Panama;4;09-21N;082-15W;;;3;;
+MPCH;--;---;Changuinola / Captain Manuel Nino;;Panama;4;09-28N;082-31W;;;6;;
+MPDA;78;793;David;;Panama;4;08-24N;082-25W;;;29;26;P
+MPFS;78;801;Ft Sherman Rocob ;;Panama;4;09-20N;079-59W;09-20N;079-59W;52;52;
+MPHO;78;806;Howard Air Force Base;;Panama;4;08-55N;079-36W;08-55N;079-36W;16;13;P
+MPLB;--;---;Albrook Afs / Balboa ;;Panama;4;08-58N;079-33W;;;9;;
+MPMG;--;---;Marcos A. Gelabert;;Panama;4;08-59N;079-31W;;;13;;
+MPNU;--;---;Augusto Vergara;;Panama;4;07-50N;080-17W;;;21;;
+MPSA;78;795;Santiago;;Panama;4;08-05N;080-57W;;;83;88;P
+MPTO;78;792;Tocumen;;Panama;4;09-03N;079-22W;;;45;;P
+MRCH;--;---;Chacarita;;Costa Rica;4;09-59N;084-47W;;;2;;
+MRLB;78;774;Liberia;;Costa Rica;4;10-37N;085-26W;;;80;80;
+MRLM;78;767;Puerto Limon;;Costa Rica;4;10-00N;083-03W;;;5;3;P
+MRNC;78;755;Nicoya;;Costa Rica;4;10-09N;085-27W;;;120;;
+MROC;78;762;Juan Santamaria;;Costa Rica;4;10-00N;084-13W;09-59N;084-13W;920;939;P
+MRPM;78;772;Palmar Sur;;Costa Rica;4;08-57N;083-28W;;;15;16;
+MRPV;--;---;Tobias Bolanos International;;Costa Rica;4;09-57N;084-09W;;;994;;
+MSAC;78;650;Acajutla;;El Salvador;4;13-34N;089-50W;13-34N;089-50W;15;15;P
+MSLP;78;666;El Salvador Intl. Airport / Comalapa;;El Salvador;4;13-26N;089-03W;;;25;25;
+MSSA;78;655;Santa Ana / El Palmar;;El Salvador;4;13-59N;089-34W;;;725;;
+MSSM;78;670;San Miguel / El Papalon;;El Salvador;4;13-27N;088-07W;;;80;;
+MSSS;78;663;San Salvador / Ilopango;;El Salvador;4;13-42N;089-07W;13-42N;089-07W;616;621;P
+MTCH;78;409;Cap-Haitien;;Haiti;4;19-45N;072-11W;;;2;3;
+MTPP;78;439;Port-Au-Prince / Aeroport International;;Haiti;4;18-34N;072-18W;18-33N;072-21W;31;34;
+MUBA;78;268;Baracoa, Oriente;;Cuba;4;20-21N;074-30W;;;9;9;
+MUBY;--;---;Bayamo ;;Cuba;4;20-24N;076-37W;;;64;;
+MUCA;78;346;Venezuela, Ciego De Avila;;Cuba;4;21-47N;078-47W;;;26;26;
+MUCC;--;---;Cayo Coco / Jardines Del Ray;;Cuba;4;22-27-40N;078-19-42W;;;4;;
+MUCF;78;244;Cienfuegos, Las Villas;;Cuba;4;22-09N;080-24W;;;39;39;
+MUCL;--;---;Cayo Largo Del Sur;;Cuba;4;21-37N;081-33W;;;2;;
+MUCM;78;255;Camaguey Aeropuerto;;Cuba;4;21-25N;077-51W;21-25N;077-51W;122;118;
+MUCU;78;264;Santiago De Cuba, Oriente;;Cuba;4;19-58N;075-51W;;;69;55;
+MUGM;78;367;Guantanamo, Leeward Point Field;;Cuba;4;19-54-23N;075-12-25W;19-54N;075-08W;17;23;
+MUGT;78;267;Guantanamo, Oriente;;Cuba;4;20-05N;075-09W;;;8;8;
+MUHA;78;224;Aeropuerto Jose Marti, Rancho-Boyeros, Habana;;Cuba;4;22-59N;082-24W;;;59;75;
+MUHG;--;---;Holguin Civ / Mil ;;Cuba;4;20-47N;076-19W;;;106;;
+MUMO;--;---;Moa Military ;;Cuba;4;20-39N;074-55W;;;5;;
+MUMZ;78;256;Manzanillo, Oriente;;Cuba;4;20-20N;077-07W;;;60;60;
+MUNG;78;221;Nueva Gerona, Isla De Pinos;;Cuba;4;21-50N;082-47W;;;23;23;
+MUPR;78;315;Pinar Del Rio, Pinar Del Rio;;Cuba;4;22-25N;083-41W;;;37;37;
+MUSN;--;---;Siguanea;;Cuba;4;21-38-33N;082-57-18W;;;;;
+MUVR;78;229;Varadero, Matanzas;;Cuba;4;23-08N;081-17W;;;3;3;
+MUVT;78;357;Las Tunas, Las Tunas;;Cuba;4;20-57N;076-57W;;;106;106;
+MWCB;--;---;Gerrard Smith Intl. / Cayman Brac;;Cayman Islands;4;19-41-13N;079-52-58W;;;2;;
+MWCG;--;---;Grand Cayman City;;Cayman Islands;4;19-18-00N;081-22-00W;;;;;
+MWCR;78;384;Owen Roberts Airportgrand Cayman;;Cayman Islands;4;19-17N;081-21W;19-18N;081-22W;3;3;
+MYAK;--;---;Congo Town, Andros Island;;Bahamas,The;4;24-09-31N;077-35-23W;;;5;;
+MYBS;78;070;Alice Town, Bimini;;Bahamas, The;4;25-44N;079-18W;;;2;3;P
+MYEG;78;092;Georgetown, Exuma;;Bahamas, The;4;23-28-30N;075-46-00W;;;2;3;P
+MYGF;78;062;Freeport, Grand Bahama;;Bahamas, The;4;26-33N;078-42W;;;2;11;P
+MYGW;78;061;West End, Grand Bahama;;Bahamas, The;4;26-42N;078-58W;;;2;4;P
+MYIG;78;121;Matthew Town, Inagua;;Bahamas, The;4;20-57N;073-41W;;;2;4;P
+MYNN;78;073;Nassau Airport;;Bahamas, The;4;25-03N;077-28W;25-03N;077-28W;3;7;P
+MYSM;78;088;Cockburn Town, San Salvador;;Bahamas, The;4;24-03N;074-32W;;;3;5;P
+MZBZ;78;583;Belize / Phillip Goldston Intl. Airport;;Belize;4;17-32N;088-18W;17-32N;088-18W;5;5;P
+NCRG;91;843;Rarotonga;;Cook Islands;5;21-12S;159-49W;21-12S;159-49W;7;7;P
+NEXC;--;---;Charleston, Navelexcen;SC;United States;4;32-54-56N;079-58-45W;32-54-56N;079-58-45W;8;11;
+NFFN;91;680;Nandi;;Fiji;5;17-45S;177-27E;17-45S;177-27E;13;18;P
+NFNA;91;683;Nausori;;Fiji;5;18-03S;178-34E;;;5;7;P
+NFNK;91;691;Lakemba;;Fiji;5;18-14S;178-48W;;;2;3;
+NFNR;91;650;Rotuma;;Fiji;5;12-30S;177-03E;12-30S;177-03E;26;26;P
+NFTF;91;792;Fua'Amotu;;Tonga;5;21-14S;175-09W;21-14S;175-09W;38;41;
+NFTL;91;784;Haapai;;Tonga;5;19-48S;174-21W;;;2;3;
+NGBR;91;623;Beru;;Kiribati;5;01-21S;176-00E;;;2;3;
+NGFO;91;631;Nanumea;;Tuvalu;5;05-40S;176-08E;;;2;3;
+NGFU;91;643;Funafuti;;Tuvalu;5;08-31S;179-13E;08-31S;179-13E;1;2;P
+NGTA;91;610;Tarawa;;Kiribati;5;01-21N;172-55E;01-21N;172-55E;2;4;P
+NGTR;91;629;Arorae;;Kiribati;5;02-40S;176-50E;;;4;7;
+NGTU;91;601;Butaritari;;Kiribati;5;03-02N;172-47E;;;1;;
+NIUE;91;822;Alofi / Niue;;Cook Islands;5;19-04S;169-55W;;;20;22;P
+NLWF;91;754;Maopoopo Ile Futuna ;;France;5;14-19S;178-07W;;;6;36;P
+NLWW;91;753;Hihifo Ile Wallis ;;France;5;13-14S;176-10W;13-14S;176-10W;23;27;P
+NSAP;91;762;Apia / Upolu Island;;Samoa;5;13-48S;171-47W;13-48S;171-47W;2;2;
+NSFA;91;759;Faleolo Intl / Apia;;Samoa;5;13-49S;172-00W;;;5;;
+NSTU;91;765;Pago Pago / Int. Airport;;United States Minor Outlying Islands;5;14-20S;170-43W;14-20S;170-43W;3;3;P
+NTAA;91;938;Tahiti-Faaa;;French Polynesia;5;17-33S;149-37W;17-33S;149-37W;2;2;P
+NTAT;91;954;Tubuai;;French Polynesia;5;23-21S;149-29W;23-21S;149-29W;2;3;P
+NTTB;91;930;Bora-Bora;;French Polynesia;5;16-27S;151-45W;16-29S;151-45W;4;3;P
+NTTG;91;941;Rangiroa / Tuamoto Island;;French Polynesia;5;14-58S;147-40W;14-58S;147-40W;3;3;
+NTTO;91;944;Hao;;French Polynesia;5;18-04S;140-57W;18-04S;140-57W;2;7;P
+NTTX;91;952;Mururoa;;French Polynesia;5;21-49S;138-48W;21-49S;138-49W;2;3;P
+NVSC;91;551;Sola Vanua Lava ;;Vanuatu;5;13-51S;167-33E;13-51S;167-33E;17;18;P
+NVSL;91;555;Lamap Malekula ;;Vanuatu;5;16-25S;167-48E;;;26;26;P
+NVSS;91;554;Pekoa Airport Santo ;;Vanuatu;5;15-31S;167-13E;15-31S;167-13E;41;44;P
+NVVV;91;557;Bauerfield Efate ;;Vanuatu;5;17-42S;168-18E;17-42S;168-18E;20;21;P
+NWWE;91;596;Moue Ile Des Pins ;;New Caledonia;5;22-36S;167-27E;;;96;97;
+NWWK;91;577;Koumac Nlle-Caledonie ;;New Caledonia;5;20-34S;164-17E;20-34S;164-17E;23;18;P
+NWWL;91;582;Ouanaham Ile Lifou ;;New Caledonia;5;20-46S;167-14E;20-46S;167-14E;28;29;P
+NWWN;91;592;Noumea Nlle-Caledonie ;;New Caledonia;5;22-16S;166-27E;22-16S;166-27E;69;72;P
+NWWR;91;587;La Roche Ile Mare ;;New Caledonia;5;21-29S;168-02E;;;43;42;
+NWWV;91;579;Ouloup Ile Ouvea ;;New Caledonia;5;20-39S;166-35E;;;7;7;
+NWWW;91;590;La Tontouta Nlle-Caledonie ;;New Caledonia;5;22-01S;166-13E;22-01S;166-13E;16;14;P
+NZAA;93;119;Auckland Airport;;New Zealand;5;37-01S;174-48E;37-01S;174-48E;7;6;P
+NZCH;93;780;Christchurch;;New Zealand;5;43-29S;172-33E;43-29S;172-33E;38;30;P
+NZCI;93;986;Chatham Island;;New Zealand;5;43-57S;176-34W;43-57S;176-34W;44;48;P
+NZCM;89;674;Williams Field;;Antarctica;7;77-52S;166-58E;;;8;8;
+NZDN;93;890;Dunedin Aerodrome;;New Zealand;5;45-56S;170-12E;45-56S;170-12E;1;2;
+NZGS;93;291;Gisborne Aerodrome;;New Zealand;5;38-40S;177-59E;38-40S;177-59E;5;8;
+NZHK;93;614;Hokitika Aerodrome;;New Zealand;5;42-43S;170-59E;42-43S;170-59E;45;44;
+NZIR;--;---;Ice Runway;;Antarctica;7;77-52S;166-32E;;;2;;
+NZKI;93;677;Kaikoura ;;New Zealand;5;42-25S;173-42E;42-25S;173-42E;101;99;
+NZNP;93;308;New Plymouth Aerodrome;;New Zealand;5;39-01S;174-11E;39-01S;174-11E;28;36;P
+NZNV;93;844;Invercargill Aerodrome;;New Zealand;5;46-42S;168-33E;46-25S;168-20E;0;4;P
+NZOH;93;401;Ohakea;;New Zealand;5;40-12S;175-22E;40-12S;175-23E;50;52;
+NZPP;93;417;Paraparaumu Aerodrome;;New Zealand;5;40-54S;174-59E;40-54S;174-59E;7;12;P
+NZRN;93;997;Raoul Island, Kermadec Island;;New Zealand;5;29-15S;177-55W;29-15S;177-55W;38;49;P
+NZRO;93;246;Rotorua Aerodrome;;New Zealand;5;38-07S;176-19E;38-07S;176-19E;285;294;
+NZSP;89;009;Amundsen-Scott South Pole Station;;Antarctica;7;90-00S;00-00E;90-00S;000-00E;2830;2835;P
+NZTG;93;186;Tauranga Aerodrome Aws;;New Zealand;5;37-40S;176-12E;;;4;5;
+NZWD;--;---;Williams Field, Antarctic;;New Zealand;5;77-53S;166-39E;;;12;;
+NZWN;93;436;Wellington Airport;;New Zealand;5;41-20S;174-48E;;;12;8;
+NZWP;93;112;Whenuapai;;New Zealand;5;36-47S;174-38E;36-47S;174-38E;30;27;
+OAFR;40;974;Farah;;Afghanistan;2;32-22N;062-11E;;;700;700;
+OAFZ;40;904;Faizabad;;Afghanistan;2;37-07N;070-31E;;;1200;1200;
+OAHR;40;938;Herat;;Afghanistan;2;34-13N;062-13E;34-13N;062-13E;964;964;
+OAJL;40;954;Jalalabad;;Afghanistan;2;34-26N;070-28E;;;580;580;
+OAJS;40;932;Jabul-Saraj;;Afghanistan;2;35-08N;069-15E;;;1630;1630;
+OAKB;40;948;Kabul Airport;;Afghanistan;2;34-38N;069-12E;;;1789;;
+OAMS;40;911;Mazar-I-Sharif;;Afghanistan;2;36-42N;067-12E;;;378;378;
+OASD;40;957;Shindand;;Afghanistan;2;33-24N;062-17E;;;1150;1150;
+OASG;40;908;Shebirghan;;Afghanistan;2;36-40N;065-43E;;;360;360;
+OAZB;40;920;Zebak;;Afghanistan;2;36-30N;071-15E;;;2600;2600;
+OAZG;40;986;Zaranj;;Afghanistan;2;31-00N;061-51E;;;478;478;
+OBBI;41;150;Bahrain International Airport ;;Bahrain;2;26-16N;050-39E;;;2;2;
+OEAB;41;112;Abha;;Saudi Arabia;2;18-14N;042-39E;;;2090;2093;P
+OEAH;40;420;Al Ahsa;;Saudi Arabia;2;25-18N;049-29E;;;179;178;P
+OEBA;41;055;Al Baha;;Saudi Arabia;2;20-18N;041-38E;;;1652;1662;P
+OEBH;41;084;Bisha;;Saudi Arabia;2;19-59N;042-37E;;;1167;1163;P
+OEDF;40;415;Dammam-King Fahd International Airport;;Saudi Arabia;2;26-28N;049-47E;;;22;;
+OEDR;40;416;Dhahran;;Saudi Arabia;2;26-16N;050-09E;26-16N;050-10E;26;17;P
+OEDW;40;435;Dawadmi;;Saudi Arabia;2;24-30N;044-21E;;;990;991;P
+OEGN;41;140;Gizan;;Saudi Arabia;2;16-54N;042-35E;16-52N;042-35E;6;7;P
+OEGS;40;405;Gassim;;Saudi Arabia;2;26-18N;043-46E;;;648;650;P
+OEGT;40;360;Guriat;;Saudi Arabia;2;31-24N;037-16E;;;509;504;P
+OEHL;40;394;Hail;;Saudi Arabia;2;27-26N;041-41E;27-31N;041-44E;1015;1013;P
+OEJB;--;---;Jubail Naval ;;Saudi Arabia;2;27-03N;049-24E;;;8;;
+OEJD;41;026;Jeddah ;;Saudi Arabia;2;21-30N;039-12E;;;15;;
+OEJN;41;024;Jeddah King Abdul Aziz International Airport ;;Saudi Arabia;2;21-42N;039-11E;21-40N;039-09E;15;17;P
+OEKK;40;377;Hafr Al-Batin;;Saudi Arabia;2;27-54N;045-32E;;;413;414;
+OEKM;41;114;Khamis Mushait;;Saudi Arabia;2;18-18N;042-48E;18-18N;042-48E;2066;2056;P
+OEMA;40;430;Madinah;;Saudi Arabia;2;24-33N;039-42E;24-33N;039-43E;654;636;P
+OEMK;41;030;Makkah;;Saudi Arabia;2;21-26N;039-46E;;;310;240;P
+OENG;41;128;Najran;;Saudi Arabia;2;17-37N;044-25E;;;1212;1210;P
+OEPA;40;373;Al Qaysumah;;Saudi Arabia;2;28-19N;046-07E;28-20N;046-07E;358;360;P
+OERF;40;362;Rafha;;Saudi Arabia;2;29-37N;043-29E;;;449;444;P
+OERK;40;437;King Khaled International Airport;;Saudi Arabia;2;24-56N;046-43E;24-56N;046-43E;614;612;P
+OERR;40;357;Arar;;Saudi Arabia;2;30-54N;041-08E;;;555;549;P
+OERY;40;438;Riyadh;;Saudi Arabia;2;24-43N;046-44E;24-42N;046-44E;635;620;P
+OESH;41;136;Sharurah;;Saudi Arabia;2;17-28N;047-07E;;;720;725;P
+OESK;40;361;Al-Jouf;;Saudi Arabia;2;29-47N;040-06E;;;689;689;P
+OETB;40;375;Tabuk;;Saudi Arabia;2;28-22N;036-36E;28-22N;036-35E;778;768;P
+OETF;41;036;Taif;;Saudi Arabia;2;21-29N;040-33E;;;1478;1454;P
+OETR;40;356;Turaif;;Saudi Arabia;2;31-41N;038-44E;;;813;852;P
+OEWD;41;061;Wadi Al Dawasser Airport;;Saudi Arabia;2;20-30N;045-12E;;;624;622;P
+OEWJ;40;400;Wejh;;Saudi Arabia;2;26-12N;036-28E;26-14N;036-26E;20;21;P
+OEYN;40;439;Yenbo;;Saudi Arabia;2;24-09N;038-04E;;;8;10;P
+OIAA;40;831;Abadan;;Iran;2;30-22N;048-15E;;;3;11;P
+OIAG;40;833;Omidieh;;Iran;2;30-46N;049-40E;;;29;27;P
+OIAH;40;835;Gach Saran Du Gunbadan;;Iran;2;30-26N;050-46E;;;738;699;P
+OIAI;40;812;Masjed-Soleyman;;Iran;2;31-59N;049-16E;;;372;372;P
+OIAJ;--;---;Omidiyeh;;Iran;2;30-50-07N;049-32-06E;;;26;;
+OIAM;--;---;Bandar Mahshahr / Mahshahr;;Iran;2;30-33-23N;049-09-07E;;;2;;
+OIAW;40;811;Ahwaz;;Iran;2;31-20N;048-40E;;;20;22;P
+OIBA;--;---;Abumusa Island / Abumusa;;Iran;2;25-52-33N;055-02-01E;;;7;;
+OIBB;40;858;Bushehr Civ / Afb ;;Iran;2;28-59N;050-50E;;;19;;
+OIBK;--;---;Kish Island / Kish;;Iran;2;26-31-36N;053-58-54E;;;30;;
+OIBL;40;883;Bandar Lengeh;;Iran;2;26-35N;054-50E;;;14;14;P
+OIBS;--;---;Sirri Island / Sirri;;Iran;2;25-54-34N;054-32-22E;;;13;;
+OICC;40;766;Kermanshah;;Iran;2;34-16N;047-07E;34-21N;047-09E;1320;1322;P
+OICG;40;765;Ghasre-Shirin;;Iran;2;34-31N;045-35E;;;378;;
+OICI;--;---;Ilam;;Iran;2;33-35-09N;046-24-20E;;;1334;;
+OICK;--;---;Khorram Abad;;Iran;2;33-26-11N;048-17-09E;;;1155;;
+OICS;40;747;Sanandaj;;Iran;2;35-20N;047-00E;;;1373;1373;P
+OIFK;40;785;Kashan;;Iran;2;33-59N;051-27E;;;982;982;P
+OIFM;40;800;Esfahan;;Iran;2;32-28N;051-43E;32-37N;051-40E;1590;1550;P
+OIFS;40;798;Shahre-Kord;;Iran;2;32-20N;050-51E;;;2078;1991;P
+OIGG;40;719;Rasht;;Iran;2;37-12N;049-38E;;;-7;37;P
+OIHH;--;---;Hamadan;;Iran;2;34-52-05N;048-33-08E;;;1757;;
+OIHR;40;769;Arak;;Iran;2;34-06N;049-24E;;;1720;1720;P
+OIII;40;754;Tehran-Mehrabad;;Iran;2;35-41N;051-21E;35-41N;051-19E;1204;1191;P
+OIIK;40;731;Ghazvin;;Iran;2;36-15N;050-00E;;;1278;1278;P
+OIIP;--;---;Karaj / Payam;;Iran;2;35-46-34N;050-49-36E;;;1271;;
+OIIS;40;757;Semnan;;Iran;2;35-33N;053-23E;;;1171;1171;P
+OIKB;40;875;Bandarabbass;;Iran;2;27-13N;056-22E;27-13N;056-22E;10;10;P
+OIKK;40;841;Kerman;;Iran;2;30-15N;056-58E;30-15N;056-58E;1748;1754;P
+OIKM;40;854;Bam;;Iran;2;29-06N;058-24E;;;1067;1067;P
+OIKQ;--;---;Gheshm Island / Dayrestan;;Iran;2;26-45-18N;055-54-08E;;;12;;
+OIMB;40;809;Birjand;;Iran;2;32-52N;059-12E;32-52N;059-12E;1491;1491;P
+OIMC;--;---;Sarakhs;;Iran;2;36-30-04N;061-03-54E;;;288;;
+OIMH;40;762;Torbat-Heydarieh;;Iran;2;35-16N;059-13E;;;1333;1333;P
+OIMM;40;745;Mashhad;;Iran;2;36-16N;059-38E;36-16N;059-38E;989;980;P
+OIMN;40;723;Bojnourd;;Iran;2;37-28N;057-20E;;;1074;1074;
+OIMS;40;743;Sabzevar;;Iran;2;36-13N;057-40E;;;941;941;P
+OIMT;40;791;Tabas;;Iran;2;33-36N;056-55E;;;710;711;
+OING;40;738;Gorgan;;Iran;2;36-49N;054-28E;36-51N;054-28E;155;155;P
+OINN;--;---;Noshahr;;Iran;2;36-39-48N;051-27-53E;;;0;;
+OINR;40;732;Ramsar;;Iran;2;36-54N;050-40E;;;-23;-20;P
+OISA;40;818;Abadeh;;Iran;2;31-11N;052-40E;;;2004;2004;
+OISF;40;859;Fasa;;Iran;2;28-58N;053-41E;;;1383;1383;P
+OISL;--;---;Lar;;Iran;2;27-40-26N;054-22-53E;;;792;;
+OISS;40;848;Shiraz;;Iran;2;29-32N;052-35E;29-32N;052-35E;1486;1491;P
+OISY;--;---;Yasouj / National;;Iran;2;30-41-49N;051-33E;;;1825;;
+OITK;40;703;Khoy;;Iran;2;38-33N;044-58E;;;1107;1107;P
+OITL;--;---;Ardabil;;Iran;2;38-19-35N;048-25-28E;;;1315;;
+OITM;--;---;Maragheh / Sahand;;Iran;2;37-20-55N;046-07-35E;;;1340;;
+OITR;40;712;Orumieh;;Iran;2;37-32N;045-05E;;;1297;1312;P
+OITS;40;727;Saghez;;Iran;2;36-15N;046-16E;;;1493;1493;P
+OITT;40;706;Tabriz;;Iran;2;38-05N;046-17E;38-08N;046-15E;1367;1361;P
+OITZ;40;729;Zanjan;;Iran;2;36-41N;048-29E;;;1663;1663;P
+OIYY;40;821;Yazd;;Iran;2;31-54N;054-24E;;;1238;1230;P
+OIZB;40;829;Zabol;;Iran;2;31-20N;061-29E;;;489;489;P
+OIZC;40;898;Chahbahar;;Iran;2;25-25N;060-45E;;;6;6;P
+OIZH;40;856;Zahedan;;Iran;2;29-28N;060-53E;29-28N;060-53E;1370;1370;P
+OIZI;40;879;Iranshahr;;Iran;2;27-12N;060-42E;;;591;591;P
+OIZJ;40;893;Jask;;Iran;2;26-38N;057-46E;;;3;4;
+OJAI;40;272;Queen Alia Airport;;Jordan;6;31-40N;035-58E;;;721;;
+OJAM;40;270;Amman Airport;;Jordan;6;31-59N;035-59E;31-59N;035-59E;767;768;P
+OJAQ;40;340;Aqaba Airport;;Jordan;6;29-38N;035-01E;;;53;51;
+OJBD;40;255;Irbid;;Jordan;6;32-33N;035-51E;32-33N;035-51E;618;619;P
+OJHF;40;260;H-5'Safawi;;Jordan;6;32-12N;037-08E;;;668;670;P
+OJHR;40;250;H-4'Irwaished;;Jordan;6;32-30N;038-12E;;;686;688;P
+OJMF;40;265;Mafraq;;Jordan;6;32-22N;036-15E;32-22N;036-16E;686;687;
+OJMN;40;310;Ma'An;;Jordan;6;30-10N;035-47E;30-10N;035-47E;1069;1070;P
+OKBK;40;582;Kuwait Internationalairport;;Kuwait;2;29-13N;047-59E;29-13N;047-59E;55;55;P
+OLBA;40;100;Beyrouth Aeroport ;;Lebanon;6;33-49N;035-29E;33-49N;035-29E;29;19;
+OMAA;41;217;Abu Dhabi International Airport;;United Arab Emirates;2;24-26N;054-39E;24-26N;054-39E;16;27;
+OMAB;--;---;Buhasa;;United Arab Emirates;2;23-37N;053-23E;;;94;;
+OMAD;41;216;Abu Dhabi Bateen Airport;;United Arab Emirates;2;24-26N;054-28E;;;5;3;
+OMAL;41;218;Al Ain International Airport;;United Arab Emirates;2;24-16N;055-36E;;;265;262;
+OMDB;41;194;Dubai International Airport;;United Arab Emirates;2;25-15N;055-20E;;;8;5;
+OMFJ;41;198;Fujairah;;United Arab Emirates;2;25-06N;056-20E;;;28;28;
+OMRK;41;184;Ras Al Khaimah International Airport;;United Arab Emirates;2;25-37N;055-56E;;;31;31;
+OMSJ;41;196;Sharjah International Airport;;United Arab Emirates;2;25-20N;055-31E;;;35;33;
+OOBR;41;244;Buraimi;;Oman;2;24-14N;055-47E;;;299;;
+OOFD;41;262;Fahud;;Oman;2;22-21N;056-29E;;;170;;
+OOKB;41;240;Khassab;;Oman;2;26-13N;056-14E;;;3;;
+OOMA;41;288;Masirah;;Oman;2;20-40N;058-54E;20-40N;058-54E;19;19;P
+OOMS;41;256;Seeb, International Airport;;Oman;2;23-35N;058-17E;23-35N;058-17E;8;17;P
+OOSA;41;316;Salalah;;Oman;2;17-02N;054-05E;17-02N;054-05E;20;17;P
+OOSH;41;246; Sohar Majis;;Oman;2;24-28N;056-38E;;;4;;
+OOSQ;41;254;Saiq;;Oman;2;23-04N;057-39E;;;1755;;
+OOSR;41;268;Sur;;Oman;2;22-32N;059-29E;;;14;;
+OOTH;41;314;Thumrait;;Oman;2;17-40N;054-02E;;;467;;
+OPDI;41;624;Dera Ismail Khan;;Pakistan;2;31-49N;070-55E;31-49N;070-55E;172;173;P
+OPJA;41;715;Jacobabad;;Pakistan;2;28-18N;068-28E;28-18N;068-28E;55;56;P
+OPJI;41;756;Jiwani;;Pakistan;2;25-04N;061-48E;25-04N;061-48E;56;57;P
+OPKC;41;780;Karachi Airport;;Pakistan;2;24-54N;067-08E;24-54N;067-08E;21;22;P
+OPKD;41;764;Hyderabad Airport;;Pakistan;2;25-23N;068-25E;;;40;41;P
+OPLA;41;641;Lahore Airport;;Pakistan;2;31-31N;074-24E;;;216;217;P
+OPLH;41;640;Lahore City;;Pakistan;2;31-33N;074-20E;31-33N;074-20E;214;215;P
+OPMI;41;592;Mianwali;;Pakistan;2;32-33N;071-31E;;;210;212;P
+OPMT;41;675;Multan;;Pakistan;2;30-12N;071-26E;30-12N;071-26E;122;123;P
+OPNH;41;749;Nawabshah;;Pakistan;2;26-15N;068-22E;26-15N;068-22E;37;38;P
+OPPG;41;739;Panjgur;;Pakistan;2;26-58N;064-06E;26-58N;064-06E;980;981;P
+OPPS;41;530;Peshawar;;Pakistan;2;34-01N;071-35E;34-01N;071-35E;359;360;P
+OPQT;41;660;Quetta Airport;;Pakistan;2;30-15N;066-53E;;;1587;1589;P
+OPRN;41;571;Islamabad Airport;;Pakistan;2;33-37N;073-06E;33-37N;073-06E;507;508;P
+OPRS;41;533;Risalpur;;Pakistan;2;34-04N;071-59E;;;315;317;P
+OPSB;41;697;Sibi;;Pakistan;2;29-33N;067-53E;;;133;134;P
+OPSK;--;---;Sukkur;;Pakistan;2;27-43-19N;068-47-31E;;;60;;
+OPSR;41;594;Sargodha;;Pakistan;2;32-03N;072-40E;32-03N;072-40E;187;188;P
+ORBB;40;650;Baghdad;;Iraq;2;33-14N;044-14E;33-14N;044-14E;34;34;P
+ORBM;40;608;Mosul;;Iraq;2;36-19N;043-09E;36-19N;043-09E;223;223;P
+ORBS;--;---;Saddam Irq-Afb / Civ ;;Iraq;2;33-16N;044-14E;;;34;;
+ORMS;40;688;Shaibah / Basrah;;Iraq;2;30-25N;047-39E;;;19;;
+OSAP;40;007;Aleppo International Airport;;Syria;6;36-11N;037-12E;36-20N;037-13E;393;384;P
+OSDI;40;080;Damascus Int. Airport;;Syria;6;33-25N;036-31E;33-25N;036-31E;608;609;P
+OSDZ;40;045;Deir Ezzor;;Syria;6;35-19N;040-09E;35-19N;040-09E;215;212;P
+OSKL;40;001;Kamishli;;Syria;6;37-03N;041-13E;37-03N;041-13E;455;455;P
+OSLK;40;022;Lattakia;;Syria;6;35-32N;035-46E;35-30N;035-47E;7;7;P
+OSPR;40;061;Palmyra;;Syria;6;34-33N;038-18E;;;408;404;P
+OTBD;41;170;Doha International Airport;;Qatar;2;25-15N;051-34E;25-16N;051-33E;11;10;
+OYAA;41;480;Aden;;Yemen;2;12-40N;045-02E;;;3;3;
+OYAR;41;443;Riyan;;Yemen;2;14-39N;049-23E;;;16;25;
+OYAT;41;437;Ataq;;Yemen;2;14-31N;046-51E;;;1067;1067;
+OYHD;41;431;Hodeidah;;Yemen;2;14-45N;042-59E;;;115;115;
+OYMB;41;350;Marib ;;Yemen;2;15-26N;045-20E;;;1000;;
+OYMC;41;477;Mokha;;Yemen;2;13-15N;044-08E;;;4;3;
+OYMK;41;382;Mokha ;;Yemen;2;13-15N;043-17E;;;3;;
+OYSH;--;---;Sa'Ada / Sadah ;;Yemen;2;16-58N;043-44E;;;1890;;
+OYSN;41;404;Sana'A;;Yemen;2;15-31N;044-11E;15-23N;044-12E;2206;2190;
+OYSQ;41;494;Socotra;;Yemen;2;12-38N;053-54E;12-38N;053-54E;45;47;
+OYSY;--;---;Sayun;;Yemen;2;15-58N;048-48E;;;701;;
+OYTZ;41;466;Taiz;;Yemen;2;13-41N;044-08E;;;1402;1385;
+OYZM;41;326;Al-Hazm ;;Yemen;2;16-12N;044-47E;;;1900;;
+PAAK;--;---;Atka, Atka Airport;AK;United States;4;52-13-13N;174-12-23W;;;17;;
+PAAP;--;---;Port Alexander, Port Alexander Seaplane Base;AK;United States;4;56-15N;134-39W;;;0;;
+PAAQ;70;274;Palmer, Palmer Municipal Airport;AK;United States;4;61-36N;149-05W;;;74;;
+PABA;70;086;Barter Island, Barter Island LRRS Airport;AK;United States;4;70-08-02N;143-34-37W;70-08N;143-38W;2;15;P
+PABE;70;219;Bethel, Bethel Airport;AK;United States;4;60-46-47N;161-50-16W;60-47N;161-50W;38;46;P
+PABG;--;---;Big Delta Arctic Weather;AK;United States;4;64-00N;145-43W;;;389;;
+PABI;70;267;Delta Junction/Ft Greely, Allen Army Airfield;AK;United States;4;64-00N;145-44W;64-00N;145-44W;389;391;P
+PABL;00;000;Buckland, Buckland Airport;AK;United States;4;65-58-56N;161-09-07W;;;7;;
+PABN;--;---;Nabesna, Devil Mountain Lodge Airport;AK;United States;4;62-24N;143-00W;;;878;;
+PABR;70;026;Barrow, Wiley Post-Will Rogers Memorial Airport;AK;United States;4;71-17-07N;156-45-57W;71-17-21N;156-47-02W;13;10;P
+PABT;70;174;Bettles, Bettles Airport;AK;United States;4;66-55N;151-31W;66-54N;151-31W;196;196;P
+PABV;--;---;Birchwood, Birchwood Airport;AK;United States;4;61-25N;149-31W;;;29;;
+PACD;70;316;Cold Bay, Cold Bay Airport;AK;United States;4;55-13-15N;162-43-40W;55-12-05N;162-42-50W;30;29;P
+PACL;--;---;Clear;AK;United States;4;64-18N;149-07W;;;168;;
+PACP;70;360;Cape Saint Elias;AK;United States;4;59-48N;144-36W;;;18;;
+PACR;--;---;Circle City Airport;AK;United States;4;65-50N;144-04W;;;182;;
+PACS;--;---;Cape Sarichef Airport;AK;United States;4;54-36N;164-56W;;;9;;
+PACV;70;296;Cordova, Merle K (Mudhole) Smith Airport;AK;United States;4;60-29-30N;145-28-40W;;;13;13;
+PACY;70;298;Yakataga;AK;United States;4;60-05N;142-30W;;;4;11;
+PACZ;70;212;Cape Romanzof, Cape Romanzof LRRS Airport;AK;United States;4;61-47N;166-02W;;;139;;
+PADE;--;---;Deering, Deering/New Airport;AK;United States;4;66-05N;162-45W;;;5;;
+PADK;70;454;Adak Island, Adak Airport;AK;United States;4;51-52-40N;176-38-45W;51-52-50N;176-38-33W;6;4;
+PADL;70;321;Dillingham, Dillingham Airport;AK;United States;4;59-03N;158-31W;;;26;29;
+PADQ;70;350;Kodiak, Kodiak Airport;AK;United States;4;57-45N;152-30W;57-45N;152-30W;22;34;P
+PADT;--;---;Slana Airport;AK;United States;4;62-42N;143-59W;;;730;;
+PADU;70;489;Unalaska, Unalaska Airport;AK;United States;4;53-54N;166-32W;;;7;;
+PAEC;--;---;Chulitna, Chulitna Airport;AK;United States;4;62-53N;149-50W;;;381;;
+PAED;70;272;Anchorage, Elmendorf Air Force Base;AK;United States;4;61-15-11N;149-47-38W;;;65;59;
+PAEG;--;---;Eagle, Eagle Airport;AK;United States;4;64-46-35N;141-09-03W;;;268;;
+PAEH;70;305;Cape Newenham, Cape Newenham LRRS Airport;AK;United States;4;58-39N;162-04W;;;165;;
+PAEI;70;265;Fairbanks, Eielson Air Force Base;AK;United States;4;64-39N;147-06W;64-39N;147-04W;167;167;
+PAEL;--;---;Elfin Cove, Elfin Cove Seaplane Base;AK;United States;4;58-12N;136-21W;;;0;;
+PAEM;--;---;Emmonak, Emmonak Airport;AK;United States;4;62-47N;164-30W;;;4;;
+PAEN;70;259;Kenai, Kenai Municipal Airport;AK;United States;4;60-34-23N;151-14-42W;60-34-25N;151-14-13W;30;25;
+PAER;--;---;Merrill Pass West;AK;United States;4;61-15N;153-49W;;;358;;
+PAFA;70;261;Fairbanks, Fairbanks International Airport;AK;United States;4;64-48-14N;147-52-34W;64-49-11N;147-51-29W;132;140;P
+PAFB;--;---;Fort Wainwright AAF;AK;United States;4;64-50-12N;147-35-44W;;;138;;
+PAFE;--;---;Kake, Kake Airport;AK;United States;4;56-57N;133-54W;;;52;;
+PAFK;--;---;Farewell Lake, Farewell Lake Seaplane Base;AK;United States;4;62-32-33N;153-37-21W;;;321;;
+PAFM;70;171;Ambler, Ambler Airport;AK;United States;4;67-06N;157-51W;;;88;;
+PAFR;70;270;Ft. Richardson / Bryant U. S. Army Heliport, Ak;AK;United States;4;61-16N;149-39W;61-16N;149-39W;115;115;
+PAFW;--;---;Farewell Lake;AK;United States;4;62-32N;153-37W;;;323;;
+PAGA;70;222;Galena, Edward G. Pitka Sr. Airport;AK;United States;4;64-44N;156-56W;64-44N;156-56W;46;49;
+PAGB;--;---;Galbraith Lake, Galbraith Lake Airport;AK;United States;4;68-29N;149-29W;;;814;;
+PAGK;70;271;Gulkana, Gulkana Airport;AK;United States;4;62-09N;145-27W;;;481;481;P
+PAGL;--;---;Golovin, Golovin Airport;AK;United States;4;64-32-36N;163-02-22W;;;8;;
+PAGM;70;204;Gambell, Gambell Airport;AK;United States;4;63-46N;171-44W;;;8;;
+PAGN;70;383;Angoon;AK;United States;4;57-30N;134-35W;;;0;1;
+PAGS;70;367;Gustavus, Gustavus Airport;AK;United States;4;58-25N;135-42W;;;10;9;
+PAGT;--;---;Nightmute;AK;United States;4;60-28N;164-42W;;;4;;
+PAGY;70;362;Skagway;AK;United States;4;59-28N;135-18W;;;16;5;
+PAHD;70;341;Homer / Municipal;AK;United States;4;59-38N;151-30W;;;24;22;
+PAHL;--;---;Huslia, Huslia Airport;AK;United States;4;65-41-51N;156-21-4W;;;65;;
+PAHN;--;---;Haines, Haines Airport;AK;United States;4;59-15N;135-31W;;;5;;
+PAHO;--;---;Homer, Homer Airport;AK;United States;;59-39N;151-29W;;;26;;
+PAHP;--;---;Hooper Bay, Hooper Bay Airport;AK;United States;4;61-31N;166-08W;;;5;;
+PAHS;--;---;Huslia, Huslia Airport;AK;United States;4;65-42N;156-23W;;;55;;
+PAHV;--;---;Healy, Healy River Airport;AK;United States;4;63-52N;148-58W;;;394;;
+PAHY;--;---;Hydaburg, Hydaburg Seaplane Base;AK;United States;4;55-12N;132-50W;;;0;;
+PAHZ;--;---;Hayes River, Hayes River Airport;AK;United States;4;61-59N;152-05W;;;305;;
+PAII;--;---;Egegik, Egegik Airport;AK;United States;4;58-11-07N;157-23-08W;;;28;;
+PAIK;--;---;Kinana / Bob Baker Me;AK;United States;4;66-59N;160-26W;;;46;;
+PAIL;70;340;Iliamna, Iliamna Airport;AK;United States;4;59-45N;154-54W;;;57;49;P
+PAIM;70;173;Utopia Creek, Indian Mountain LRRS Airport;AK;United States;4;66-59N;153-42W;;;372;;
+PAIN;--;---;McKinley Park, McKinley National Park Airport;AK;United States;4;63-44N;148-55W;;;524;;
+PAIZ;--;---;Lazy Mtn / Wolverine;AK;United States;4;61-38N;149-02W;;;236;;
+PAJB;--;---;Biorka Island Supplementary Aviation Weather Reporting Station;AK;United States;4;56-51N;135-32W;;;15;;
+PAJC;--;---;Chignik, Chignik Airport;AK;United States;4;56-18-41N;158-22-24W;;;6;;
+PAJN;70;381;Juneau, Juneau International Airport;AK;United States;4;58-21-17N;134-34-34W;58-21-48N;134-34-33W;6;8;P
+PAJO;--;---;Johnstone Point;AK;United States;4;60-29N;146-36W;;;14;;
+PAJV;--;---;Sutton;AK;United States;4;61-43N;148-53W;;;265;;
+PAKI;--;---;Kipnuk, Kipnuk Airport;AK;United States;4;59-55-58N;164-01-49W;;;3;;
+PAKK;--;---;Koyuk, Koyuk Airport;AK;United States;4;64-56-02N;161-09-29W;;;37;;
+PAKN;70;326;King Salmon, King Salmon Airport;AK;United States;4;58-40-36N;156-38-57W;58-40-50N;156-39-28W;17;10;P
+PAKO;70;482;Nikolski;AK;United States;4;52-57N;168-51W;;;21;;P
+PAKP;--;---;Anaktuvuk Pass, Anaktuvuk Pass Airport;AK;United States;4;68-08-01N;151-44-36W;;;641;;
+PAKT;70;395;Ketchikan, Ketchikan International Airport;AK;United States;4;55-21-20N;131-42-49W;55-21-10N;131-42-24W;27;25;
+PAKU;--;---;Kuparuk, Ugnu-Kuparuk Airport;AK;United States;4;70-19N;149-35W;;;20;;
+PAKV;--;---;Kaltag, Kaltag Airport;AK;United States;4;64-19N;158-44W;;;54;;
+PAKW;70;389;Klawock, Klawock Airport;AK;United States;4;55-35N;133-05W;;;24;;
+PALH;--;---;Anchorage, Lake Hood Seaplane Base;AK;United States;4;61-11N;149-58W;;;22;;
+PALJ;--;---;Port Alsworth, Port Alsworth Airport;AK;United States;4;60-12N;154-19W;;;85;;
+PALK;--;---;Snowshoe Lake;AK;United States;4;62-02N;142-40W;;;735;;
+PALP;--;---;Deadhorse, Alpine Airstrip;AK;United States;4;70-20N;150-56W;;;5;;
+PALR;--;---;Chandalar Lake, Chandalar Lake Airport;AK;United States;4;67-30N;148-29W;;;585;;
+PALU;70;104;Cape Lisburne, Cape Lisburne LRRS Airport;AK;United States;4;68-53N;166-06W;;;4;;
+PALV;--;---;Big River Lake;AK;United States;4;60-49N;152-18W;;;12;;
+PAMC;70;231;McGrath, McGrath Airport;AK;United States;4;62-58N;155-37W;62-58N;155-37W;103;103;P
+PAMD;70;343;Middleton Island, Middleton Island Airport;AK;United States;4;59-26N;146-18W;;;27;14;
+PAMH;70;246;Minchumina, Minchumina Airport;AK;United States;4;63-52-50N;152-18-02W;;;208;214;
+PAML;--;---;Manley Hot Springs, Manly Hot Springs Airport;AK;United States;4;64-59N;150-38W;;;82;;
+PAMM;--;---;Metlakatla, Metlakatla Seaplane Base;AK;United States;4;55-07-52N;131-34-41W;;;0;;
+PAMR;--;---;Anchorage, Merrill Field Airport;AK;United States;4;61-13N;149-51W;;;42;;
+PAMX;--;---;McCarthy;AK;United States;4;61-26N;142-56W;;;455;;
+PAMY;--;---;Mekoryuk, Mekoryuk Airport;AK;United States;4;60-22N;166-16W;;;15;;
+PANC;70;273;Anchorage, Ted Stevens Anchorage International Airport;AK;United States;4;61-10-28N;149-59-46W;61-10-25N;150-00-39W;44;48;P
+PANI;70;232;Aniak, Aniak Airport;AK;United States;4;61-34-53N;159-32-34W;;;27;26;
+PANN;70;260;Nenana, Nenana Municipal Airport;AK;United States;4;64-33N;149-05W;;;110;;
+PANR;--;---;Funter Bay Seaplane;AK;United States;4;58-15N;134-54W;;;0;;
+PANT;70;398;Annette, Annette Island Airport;AK;United States;4;55-02-32N;131-34-20W;55-02N;131-34W;36;34;P
+PANV;--;---;Anvik, Anvik Airport;AK;United States;4;62-38-54N;160-11-23W;;;94;;
+PAOH;--;---;Hoonah, Hoonah Seaplane Base;AK;United States;4;58-07N;135-27W;;;0;;
+PAOM;70;200;Nome, Nome Airport;AK;United States;4;64-30-43N;165-26-42W;64-30-32N;165-25-50W;11;4;P
+PAOR;70;291;Northway, Northway Airport;AK;United States;4;62-57-40N;141-55-44W;62-57-44N;141-56-10W;523;522;
+PAOT;70;133;Kotzebue, Ralph Wien Memorial Airport;AK;United States;4;66-53-04N;162-35-54W;66-53-12N;162-36-31W;3;5;P
+PAPB;--;---;St. George, St. George Airport;AK;United States;4;56-34-43N;169-39-41W;;;38;;
+PAPC;70;119;Port Clarence, Port Clarence Coast Guard Station;AK;United States;4;65-15N;166-51W;;;3;5;
+PAPG;70;386;Petersburg;AK;United States;4;56-49N;132-58W;;;0;;
+PAPH;70;333;Port Heiden, Port Heiden Airport;AK;United States;4;56-57N;158-38W;;;29;;P
+PAPM;--;---;Platinum;AK;United States;4;59-01N;161-49W;;;3;;
+PAPO;--;---;Point Hope, Point Hope Airport;AK;United States;4;68-21N;166-48W;;;4;;
+PAPR;--;---;Prospect Creek, Prospect Creek Airport;AK;United States;4;66-48-46N;150-38-38W;;;335;;
+PAPT;70;249;Puntilla;AK;United States;4;62-06N;152-45W;;;560;;
+PAQT;70;364;Nuiqsut, Nuiqsut Airport;AK;United States;4;70-12-36N;151-00-20W;70-12-49N;150-59-18W;12;17;
+PARC;--;---;Arctic Village, Arctic Village Airport;AK;United States;4;68-06-52N;145-34-45W;;;638;;
+PARD;--;---;Red Dog, Red Dog Airport;AK;United States;4;68-01-53N;162-54-11W;;;297;;
+PARL;--;---;Central, Central Airport;AK;United States;4;65-34-26N;144-46-59W;;;284;;
+PASA;--;---;Savoonga Airport;AK;United States;4;63-41N;170-30W;;;16;;
+PASC;--;---;Deadhorse, Deadhorse Airport;AK;United States;4;70-12N;148-28W;;;17;;
+PASD;--;---;Sand Point;AK;United States;4;55-19N;160-31W;;;7;;
+PASG;--;---;Skagway, Skagway Airport;AK;United States;4;59-27-19N;136-19-23W;59-27-19N;136-19-23W;13;7;
+PASH;--;---;Shishmaref, Shishmaref Airport;AK;United States;4;66-16N;166-05W;;;4;;
+PASI;70;371;Sitka, Sitka Airport;AK;United States;4;57-02-53N;135-21-53W;57-02-53N;135-21-53W;6;14;
+PASK;--;---;Selawik;AK;United States;4;66-37N;160-00W;;;8;;
+PASL;--;---;Sleetmute;AK;United States;4;61-43N;157-09W;;;54;;
+PASM;--;---;St. Mary's, St. Mary's Airport;AK;United States;4;62-03N;163-18W;;;95;;
+PASN;70;308;St. Paul Island, St. Paul Island Airport;AK;United States;4;57-10N;170-13W;57-09N;170-13W;19;9;P
+PASO;--;---;Seldovia, Seldovia Airport;AK;United States;4;59-27N;151-42W;;;9;;
+PASP;--;---;Sheep Mountain, Sheep Mountain Airport;AK;United States;4;61-48-43N;147-30-25W;;;838;;
+PASV;70;235;Sparrevohn Airways Facilities Sector;AK;United States;4;61-06N;155-34W;;;484;;
+PASW;70;255;Skwentna;AK;United States;4;61-58N;151-11W;;;45;;
+PASX;--;---;Soldotna;AK;United States;4;60-29N;151-02W;;;33;;
+PASY;70;414;Shemya, Eareckson AFB;AK;United States;4;52-43N;174-07E;;;30;;
+PATA;70;178;Tanana, Calhoun Memorial Airport;AK;United States;4;65-10N;152-06W;;;69;67;
+PATC;70;117;Tin City Airways Facilities Sector;AK;United States;4;65-34N;167-55W;;;83;;
+PATG;--;---;Togiac Village, Togiak Airport;AK;United States;4;59-03N;160-24W;;;6;;
+PATJ;--;---;Tok;AK;United States;4;63-19N;142-43W;;;509;;
+PATK;70;251;Talkeetna, Talkeetna Airport;AK;United States;4;62-19-14N;150-05-37W;;;109;109;
+PATL;--;---;Takotna, Tatalina LRRS Airport;AK;United States;4;62-54N;155-59W;;;294;;
+PATO;--;---;Portage, Portage Glacier;AK;United States;4;60-47N;148-50W;;;29;;
+PATW;--;---;Cantwell, Cantwell Airport;AK;United States;4;63-24N;148-57W;;;668;;
+PAUM;70;162;Umiat;AK;United States;4;69-22N;152-08W;;;81;85;
+PAUN;70;207;Unalakleet;AK;United States;4;63-53N;160-48W;;;6;6;P
+PAUO;--;---;Willow Airport ;AK;United States;4;61-45N;150-03W;;;67;;
+PAVD;--;---;Valdez 2;AK;United States;4;61-08N;146-16W;;;37;;
+PAVL;--;---;Kivalina, Kivalina Airport;AK;United States;4;67-44N;164-33W;;;4;;
+PAVW;--;---;Valdez Weather Station Office;AK;United States;4;61-08N;146-21W;;;10;;
+PAWD;70;277;Seward;AK;United States;4;60-07N;149-27W;;;9;18;
+PAWG;70;387;Wrangell;AK;United States;4;56-29N;132-22W;;;13;13;
+PAWI;70;030;Wainwright, Wainwright Airport;AK;United States;4;70-38N;159-51W;;;12;;
+PAWN;--;---;Noatak, Noatak Airport;AK;United States;4;67-34N;162-59W;;;27;;
+PAWR;--;---;Whittier;AK;United States;4;60-46N;148-41W;;;9;;
+PAWS;--;---;Wasilla, Wasilla Airport;AK;United States;4;61-34-19N;149-32-26W;;;106;;
+PAXK;--;---;Paxson;AK;United States;4;63-02N;145-30W;;;809;;
+PAYA;70;361;Yakutat;AK;United States;4;59-31N;139-40W;59-31N;139-40W;11;9;P
+PAZK;--;---;Eureka, Skelton Airport;AK;United States;4;61-56N;147-10W;;;1002;;
+PBTI;--;---;Barter Island Distant Early Warning ;AK;United States;4;70-08N;143-35W;;;2;;
+PFYU;70;194;Fort Yukon, Fort Yukon Airport;AK;United States;4;66-34N;145-16W;66-35N;145-05W;433;431;P
+PGAC;91;217;Guam, Mariana Island;GU;United States;5;13-55N;144-50E;;;111;;
+PGNT;91;233;Sabanettan / Tinian Island;GU;United States;5;14-96N;145-06E;14-58N;145-36E;80;80;
+PGRO;91;221;Rota Island, N. Mariana Is, Rota International Airport;GU;United States;5;14-11N;145-15E;;;185;;
+PGSN;91;232;Saipan Island, Saipan International Airport;Northern Mariana Islands;United States;5;15-07N;145-44E;15-07N;145-45W;66;3;
+PGUA;91;218;Andersen, Mariana Is, Andersen Air Force Base;GU;United States;5;13-35N;144-56E;13-35N;144-55E;187;187;
+PGUM;91;212;Agana, Guam International Airport;GU;United States;5;13-29N;144-48E;13-21N;144-48E;91;;
+PGWT;91;233;Tinian Island, N. Mariana Is, West Tinian Airport;GU;United States;5;14-59N;145-37E;;;82;;
+PHBK;91;162;Kekaha, Pacific Missile Test Facility Barking Sands;HI;United States;5;22-02-11N;159-47-11W;22-02-00N;159-47-00W;4;3;
+PHHI;91;170;Wheeler Air Force Base / Oahu;HI;United States;5;21-29N;158-02W;21-29N;158-02W;255;256;
+PHHN;--;---;Hana, Hana Airport;HI;United States;5;20-47-44N;156-00-52W;;;24;;
+PHIK;--;---;Hickam Air Force Base / Oahu ;HI;United States;5;21-19N;157-55W;;;4;;
+PHJH;--;---;Lahaina / West Maui;HI;United States;5;21-01N;156-38W;;;40;;
+PHJR;91;178;Oahu, Kalaeloa Airport;HI;United States;5;21-18-30N;158-04-05W;21-18-20N;158-04-28W;10;15;
+PHKO;--;---;Kailua / Kona, Keahole Airport;HI;United States;5;19-44-27N;156-03-02W;19-44-08N;156-02-30W;13;27;
+PHLI;91;165;Lihue, Lihue Airport;HI;United States;5;21-59-02N;159-20-28W;21-59-13N;159-20-36W;45;31;
+PHMK;91;186;Kaunakakai, Molokai Airport;HI;United States;5;21-09N;157-06W;21-09N;157-06W;138;134;
+PHMU;--;---;Kamuela, Waimea-Kohala Airport;HI;United States;5;20-00N;155-40W;;;814;;
+PHNG;91;176;Kaneohe, Marine Corps Air Station;HI;United States;5;21-27-14N;157-45-56W;21-26-27N;157-46-32W;5;1;
+PHNL;91;182;Honolulu, Honolulu International Airport;HI;United States;5;21-19-39N;157-56-35W;21-19-26N;157-55-47W;3;4;
+PHNY;--;---;Lanai City, Lanai Airport;HI;United States;4;20-47-08N;156-57-05W;;;399;;
+PHOG;91;190;Kahului, Kahului Airport;HI;United States;5;20-53-33N;156-26-13W;20-54-02N;156-25-44W;16;12;
+PHSF;--;---;Bradshaw Army Air Field / Hawaii;HI;United States;5;19-47N;155-33W;;;1887;;
+PHTO;91;285;Hilo, Hilo International Airport;HI;United States;5;19-43-20N;155-03-21W;19-43-16N;155-03-46W;11;12;
+PHWH;91;293;South Kona / Hawaii;HI;United States;5;19-06N;155-45W;;;808;;
+PJON;91;275;Johnston Island, Johnston Atoll Airport;;United States Minor Outlying Islands;5;16-44N;169-32W;16-44N;169-31W;2;2;
+PKMJ;91;376;Majuro Atoll, Marshall Islands Int. Airp.;;Marshall Islands;5;07-04N;171-17E;07-05N;171-23E;2;3;
+PKMR;--;---;Majuro Atoll, NWS Office;;Marshall Islands;5;07-05N;171-12E;;;4;;
+PKWA;91;366;Kwajalein, Bucholz AAF, Kwajalein KMR ATOL Airport;;Marshall Islands;5;08-43N;167-44E;08-44N;167-44E;3;2;
+PLCH;91;490;Christmas / Cassidy;;New Zealand;5;01-59N;157-29W;;;3;;
+PLFA;91;487;Fanning Island;;New Zealand;5;03-51N;159-22W;03-54N;159-23W;5;3;
+PMDY;91;066;Sand Island, Henderson Field Airport;HI;United States;5;28-13N;177-22W;28-13N;177-22W;4;6;
+POLI;70;063;Oliktok Distant Early Warning ;AK;United States;4;70-30N;149-53W;;;5;;
+PPIZ;70;121;Point Lay, Point Lay LRRS Airport;AK;United States;4;69-43N;163-00W;;;8;;P
+PTKK;91;334;Weno Island, Chuuk Int. Airp.;;Micronesia, Federated States of;5;07-28N;151-51E;07-28N;151-51E;3;2;
+PTKR;--;---;Koror, Palau, NWS Office;;Palau;5;07-20N;134-29E;;;30;;
+PTPN;91;348;Pohnpei Island, Pohnpei Int. Airp.;;Micronesia, Federated States of;5;06-59N;158-12E;06-58N;158-13E;2;;
+PTRO;91;408;Babelthuap Island, Babelthuap/Koror Airport;;Palau;5;07-22N;134-32E;07-20N;134-29E;54;;
+PTSA;91;356;Kosrae Island, Kosrae Airport;;Micronesia, Federated States of;5;05-21N;162-57E;;;3;;
+PTTK;91;355;Kosrae Carolines / V;;Micronesia, Federated States of;5;05-21N;162-57E;;;2;;
+PTTP;--;---;Pohnpei, NWS Office;;Micronesia, Federated States of;5;06-58N;158-13E;;;39;;
+PTYA;91;413;Yap Island, Yap Int. Airp.;;Micronesia, Federated States of;5;09-29N;138-05E;09-29N;138-05E;28;;
+PWAK;91;245;Wake Island, Wake Island Army Airfield Airport;GU;United States;5;19-17N;166-39E;19-17N;166-39E;4;4;
+RCAY;46;745;Kangshan Tw-Afb ;;Taiwan;2;22-47N;120-16E;;;10;;
+RCBS;46;736;Chinmem / Shatou Air Force Base ;;Taiwan;2;24-26N;118-22E;24-26N;118-26E;9;12;
+RCDC;46;750;Pingtung South Air Force Base ;;Taiwan;2;22-41N;120-28E;22-40N;120-27E;24;24;
+RCFG;46;689;Mazu;;Taiwan;2;26-10N;119-56E;26-09N;119-57E;91;30;
+RCFN;--;---;Feng Nin Tw-Afb ;;Taiwan;2;22-46N;121-05E;;;42;;
+RCFS;46;772;Chia Tung;;Taiwan;2;22-25N;120-33E;;;20;;
+RCGM;46;697;Taoyuan Ab = 589650;;Taiwan;2;25-04N;121-14E;25-03N;121-15E;45;48;
+RCKH;46;740;Kaohsiung International Airport;;Taiwan;2;22-35N;120-21E;;;9;;
+RCKU;46;746;Chiayi Tw-Afb ;;Taiwan;2;23-28N;120-23E;23-28N;120-23E;25;25;
+RCKW;46;752;Hengchun;;Taiwan;2;21-56N;120-50E;;;13;;
+RCLG;46;751;Taichung Tw-Afb ;;Taiwan;2;24-11N;120-39E;24-11N;120-39E;112;112;
+RCLM;46;810;Dongsha;;Taiwan;2;20-40N;116-43E;20-43N;116-43E;6;3;
+RCLY;46;762;Lan Yu;;Taiwan;2;22-02N;121-33E;;;325;;
+RCMJ;46;747;Donggang;;Taiwan;2;22-28N;120-26E;22-28N;120-26E;8;8;
+RCMQ;46;770;Wuchia Observatory;;Taiwan;2;24-16N;120-37E;24-16N;120-37E;5;203;
+RCMS;46;764;Ilan;;Taiwan;2;24-45N;121-46E;;;9;;
+RCNN;46;743;Tainan Tw-Afb ;;Taiwan;2;22-57N;120-12E;22-57N;120-13E;19;16;
+RCNO;46;730;Dongshi;;Taiwan;2;23-16N;119-40E;;;45;;
+RCPO;46;756;Hsinchu Tw-Afb ;;Taiwan;2;24-49N;120-56E;;;8;;
+RCQC;46;734;Makung Ab;;Taiwan;2;23-35N;119-37E;23-35N;119-37E;31;31;
+RCQS;46;760;Chihhang Tw-Afb ;;Taiwan;2;22-48N;121-11E;;;37;;
+RCSQ;46;758;Pingtung North Air Force Base ;;Taiwan;2;22-42N;120-29E;;;29;;
+RCSS;46;696;Sungshan / Taipei;;Taiwan;2;25-04N;121-33E;;;6;;
+RCTP;46;686;Chiang Kai Shek;;Taiwan;2;25-05N;121-13E;;;33;;
+RCUK;46;738;Pa Kuei / Bakuai;;Taiwan;2;24-56N;121-18E;;;141;;
+RCYU;46;763;Hulien Ab;;Taiwan;2;24-02N;121-37E;24-01N;121-37E;16;14;
+RJAA;47;686;New Tokyo Inter-National Airport;;Japan;2;35-46N;140-23E;;;41;44;
+RJAF;47;709;Matsumoto Airport;;Japan;2;36-10N;137-56E;;;668;661;
+RJAH;47;715;Hyakuri Ab;;Japan;2;36-11N;140-25E;;;32;35;
+RJAI;--;---;Ichikawa ;;Japan;2;35-44N;139-55E;;;31;;
+RJAK;47;716;Kasumigaura Ab;;Japan;2;36-02N;140-12E;;;26;29;
+RJAM;47;991;Minamitorishima;;Japan;2;24-18N;153-58E;24-18N;153-58E;8;9;P
+RJAO;47;971;Chichijima;;Japan;2;27-05N;142-11E;27-05N;142-11E;3;8;P
+RJAT;47;721;Fuji Ab;;Japan;2;35-19N;138-52E;;;680;683;
+RJAW;47;981;Iwojima;;Japan;2;24-47N;141-19E;24-47N;141-20E;113;116;
+RJBB;47;774;Kansai International Airport;;Japan;2;34-25N;135-15E;;;5;8;
+RJBD;47;782;Nankishirahama Airport;;Japan;2;33-40N;135-21E;;;105;108;
+RJBH;--;---;Hiroshimanishi;;Japan;2;34-22N;132-26E;;;5;;
+RJBT;--;---;Tajima;;Japan;2;35-31N;134-48E;;;210;;
+RJCA;47;477;Asahikawa Ab;;Japan;2;43-48N;142-22E;;;115;118;
+RJCB;47;490;Obihiro Airport;;Japan;2;42-44N;143-13E;;;149;152;
+RJCC;47;425;Chitose Ab;;Japan;2;42-48N;141-40E;;;27;30;
+RJCH;47;488;Hakodate Airport;;Japan;2;41-46N;140-49E;;;33;36;
+RJCJ;47;434;Chitose Japanese Air Self Defense Force ;;Japan;2;42-49N;141-41E;;;27;;
+RJCK;47;489;Kushiro Airport;;Japan;2;43-02N;144-12E;;;95;98;
+RJCM;47;481;Memambetsu Airport;;Japan;2;43-53N;144-10E;;;33;36;
+RJCN;47;483;Nakashibetsu Airport;;Japan;2;43-34N;144-58E;;;66;69;
+RJCO;47;479;Sapporo Ab;;Japan;2;43-07N;141-23E;;;8;11;
+RJCR;--;---;Rebun Island;;Japan;2;45-27N;141-02E;;;27;;
+RJCS;47;418;Kushiro;;Japan;2;42-59N;144-24E;;;32;37;P
+RJCT;--;---;Tokachi Japanese Ground Self Defense Force ;;Japan;2;42-54N;143-10E;;;84;;
+RJCW;47;441;Wakkanai Airport;;Japan;2;45-24N;141-48E;;;8;11;
+RJCY;47;423;Muroran;;Japan;2;42-19N;140-59E;;;40;49;
+RJDB;47;858;Iki Airport;;Japan;2;33-45N;129-47E;;;13;16;
+RJDC;47;786;Yamaguchi Ube Airport;;Japan;2;33-56N;131-17E;;;5;8;
+RJDK;--;---;Kamigoto;;Japan;2;33-01N;129-11E;;;20;;
+RJDM;47;860;Metabaru Ab;;Japan;2;33-19N;130-25E;;;16;19;
+RJDO;--;---;Ojika Island ;;Japan;2;33-13N;129-03E;;;20;;
+RJDT;47;799;Tsushima Airport;;Japan;2;34-17N;129-20E;;;63;66;
+RJEB;47;474;Mombetsu Airport;;Japan;2;44-15N;143-32E;;;6;9;
+RJEC;47;476;Asahikawa Airport;;Japan;2;43-40N;142-27E;;;208;211;
+RJEO;--;---;Okushiri Island;;Japan;2;42-04N;139-27E;;;36;;
+RJER;--;---;Rishiri Island;;Japan;2;45-15N;141-11E;;;30;;
+RJFA;47;803;Ashiya Ab;;Japan;2;33-53N;130-39E;;;30;33;
+RJFC;47;836;Yakushima;;Japan;2;30-23N;130-40E;;;36;38;
+RJFE;47;844;Fukue Airport;;Japan;2;32-40N;128-50E;;;77;80;
+RJFF;47;808;Fukuoka Airport;;Japan;2;33-35N;130-27E;33-35N;130-27E;9;12;
+RJFG;47;870;Tanegashima Airport;;Japan;2;30-33N;130-57E;;;92;95;
+RJFK;47;851;Kagoshima Airport;;Japan;2;31-48N;130-43E;;;272;275;
+RJFM;47;857;Miyazaki Airport;;Japan;2;31-52N;131-27E;;;6;9;
+RJFN;47;854;Nyutabaru Ab;;Japan;2;32-05N;131-27E;;;79;82;
+RJFO;47;852;Oita Airport;;Japan;2;33-29N;131-44E;;;5;8;
+RJFR;47;853;Kitakyushu Airport;;Japan;2;33-50N;130-57E;;;3;6;
+RJFS;--;---;Saga Airport;;Japan;2;33-09N;130-18E;;;2;5;
+RJFT;47;856;Kumamoto Airport;;Japan;2;32-50N;130-51E;;;193;196;
+RJFU;47;855;Nagasaki Airport;;Japan;2;32-55N;129-55E;32-55N;129-55E;2;5;
+RJFW;47;811;Sasebo Usn;;Japan;2;33-09N;129-43E;;;19;22;
+RJFY;47;850;Kanoya Ab;;Japan;2;31-22N;130-50E;31-21N;130-50E;65;68;
+RJFZ;47;840;Tsuiki Ab;;Japan;2;33-41N;131-03E;;;17;20;
+RJGG;47;635;Nagoya Airport;;Japan;2;35-15N;136-56E;;;14;17;
+RJKA;47;872;Amami Airport;;Japan;2;28-26N;129-43E;;;4;7;
+RJKB;47;942;Okinoerabu;;Japan;2;27-26N;128-42E;;;27;29;
+RJKI;--;---;Kikai Island;;Japan;2;28-19N;129-56E;;;6;;
+RJKN;47;910;Tokunoshima Island;;Japan;2;27-50N;128-53E;;;5;;
+RJNF;47;706;Fukui Airport;;Japan;2;36-08N;136-14E;;;5;8;
+RJNG;47;634;Gifu Ab;;Japan;2;35-23N;136-52E;;;39;42;
+RJNH;47;681;Hamamatsu Ab;;Japan;2;34-45N;137-42E;34-44N;137-40E;45;48;
+RJNK;47;704;Komatsu Ab;;Japan;2;36-23N;136-25E;;;6;9;
+RJNN;47;635;Nagoya Airport;;Japan;2;35-15N;136-56E;;;14;17;
+RJNO;47;739;Oki Airport;;Japan;2;36-11N;133-20E;;;92;95;
+RJNT;47;707;Toyama Airport;;Japan;2;36-39N;137-11E;;;24;27;
+RJNY;47;658;Shizuhama Ab;;Japan;2;34-49N;138-18E;;;7;10;
+RJOA;47;789;Hiroshima Airport;;Japan;2;34-26N;132-55E;;;331;334;
+RJOB;47;793;Okayama Airport;;Japan;2;34-45N;133-51E;;;241;244;
+RJOC;47;790;Izumo Airport;;Japan;2;35-25N;132-54E;;;2;5;
+RJOE;47;730;Akeno Ab;;Japan;2;34-32N;136-41E;;;6;9;
+RJOF;47;788;Hofu Ab;;Japan;2;34-02N;131-33E;34-02N;131-32E;2;5;
+RJOH;47;743;Miho Ab;;Japan;2;35-29N;133-15E;;;6;9;
+RJOI;47;764;Iwakuni Marine Corps Air Station;;Japan;2;34-08N;132-14E;34-08N;132-14E;2;5;
+RJOK;47;883;Kochi Airport;;Japan;2;33-32N;133-40E;;;7;10;
+RJOM;47;882;Matsuyama Airport;;Japan;2;33-49N;132-42E;;;4;7;
+RJOO;47;771;Osaka International Airport;;Japan;2;34-47N;135-27E;;;12;15;
+RJOP;47;884;Komatsujima Ab;;Japan;2;34-00N;134-38E;34-00N;134-38E;3;6;
+RJOR;47;794;Tottori Airport;;Japan;2;35-32N;134-10E;;;15;18;
+RJOS;47;881;Tokushima Ab;;Japan;2;34-08N;134-37E;34-08N;134-36E;8;11;
+RJOT;47;880;Takamatsu Airport;;Japan;2;34-13N;134-01E;;;185;188;
+RJOW;47;783;Iwami Airport;;Japan;2;34-40N;131-48E;;;54;57;
+RJOY;47;779;Yao Airport;;Japan;2;34-36N;135-36E;;;10;13;
+RJOZ;47;787;Ozuki Ab;;Japan;2;34-03N;131-03E;34-03N;131-03E;4;7;
+RJSA;47;542;Aomori Airport;;Japan;2;40-44N;140-42E;;;199;202;
+RJSC;47;553;Yamagata Airport;;Japan;2;38-25N;140-22E;;;105;108;
+RJSD;47;700;Sado Airport;;Japan;2;38-03N;138-25E;;;23;26;
+RJSF;47;557;Fukushima Airport;;Japan;2;37-14N;140-26E;;;372;375;
+RJSH;47;515;Hachinohe Ab;;Japan;2;40-33N;141-28E;40-33N;141-28E;46;49;
+RJSI;47;549;Hanamaki Airport;;Japan;2;39-26N;141-08E;;;90;93;
+RJSK;47;545;Akita Airport;;Japan;2;39-37N;140-13E;;;93;96;
+RJSM;47;580;Misawa Ab;;Japan;2;40-42N;141-23E;40-41N;141-22E;36;39;
+RJSN;47;573;Niigata Airport;;Japan;2;37-57N;139-07E;;;1;4;
+RJSO;47;516;Ominato Ab;;Japan;2;41-14N;141-08E;41-14N;141-09E;7;10;
+RJSR;--;---;Odate-Noshiro Airport;;Japan;2;40-11N;140-12E;;;84;87;
+RJSS;47;569;Sendai Airport;;Japan;2;38-08N;140-55E;;;1;4;
+RJST;47;591;Matsushima Ab;;Japan;2;38-24N;141-13E;;;2;5;
+RJSU;47;567;Kasuminome Ab;;Japan;2;38-14N;140-55E;;;7;10;
+RJSY;--;---;Shonai;;Japan;2;38-49N;139-47E;;;22;;
+RJTA;47;679;Atsugi United States Naval Air Station;;Japan;2;35-27N;139-27E;35-27N;139-28E;62;65;
+RJTC;47;660;Tachikawa Ab;;Japan;2;35-42N;139-24E;;;95;98;
+RJTD;47;662;Tokyo;;Japan;2;35-41N;139-46E;;;5;36;P
+RJTE;47;688;Tateyama Ab;;Japan;2;34-59N;139-50E;34-59N;139-50E;3;6;
+RJTF;47;683;Chofu Airport;;Japan;2;35-40N;139-32E;;;41;44;
+RJTH;47;738;Hachijojima Airport;;Japan;2;33-07N;139-47E;;;92;95;
+RJTI;47;687;Tokyo Heliport;;Japan;2;35-38N;139-51E;;;5;8;
+RJTJ;47;643;Iruma Ab;;Japan;2;35-50N;139-25E;35-50N;139-25E;90;93;
+RJTK;47;661;Kisarazu Ab;;Japan;2;35-24N;139-55E;;;3;6;
+RJTL;47;727;Shimofusa Ab;;Japan;2;35-48N;140-01E;35-47N;140-01E;30;33;
+RJTO;47;735;Oshima Airport;;Japan;2;34-47N;139-22E;;;38;41;
+RJTQ;47;737;Miyakejima Airport;;Japan;2;34-04N;139-34E;;;20;23;
+RJTR;47;680;Zama Airfield;;Japan;2;35-31N;139-24E;;;109;112;
+RJTT;47;671;Tokyo International Airport;;Japan;2;35-33N;139-47E;;;5;8;
+RJTU;47;692;Utsunomiya Ab;;Japan;2;36-31N;139-52E;;;102;105;
+RJTX;47;696;Yokosuka Fwf;;Japan;2;35-17N;139-40E;;;49;53;
+RJTY;47;642;Yokota Ab;;Japan;2;35-45N;139-21E;;;139;142;
+RKJJ;47;158;Kwangju Ab;;Korea, South;2;35-07N;126-49E;35-07N;126-49E;13;13;
+RKJK;47;141;Kunsan Ab;;Korea, South;2;35-55N;126-37E;35-54N;126-37E;10;10;
+RKJY;47;167;Yosu Airport;;Korea, South;2;34-50N;127-37E;;;21;20;
+RKNC;47;104;Chunchon Ab;;Korea, South;2;37-52N;127-43E;37-53N;127-43E;76;75;
+RKNF;--;---;Whang Ryeong;;Korea, South;2;37-45N;128-40E;;;1407;;
+RKNH;47;118;Hoengsong Ab;;Korea, South;2;37-26N;127-57E;37-26N;126-58E;100;101;
+RKNN;47;107;Kangnung Ab;;Korea, South;2;37-45N;128-57E;37-45N;128-57E;11;6;
+RKNO;--;---;Keo Jin;;Korea, South;2;38-28N;128-28E;;;107;;
+RKNR;--;---;Kotar Range;;Korea, South;2;37-06N;128-54E;;;792;;
+RKNW;47;114;Wonju;;Korea, South;2;37-20N;127-57E;;;150;150;P
+RKPC;47;182;Cheju International Airport;;Korea, South;2;33-30N;126-30E;;;36;28;
+RKPK;47;153;Pusan / Kimhae International Airport;;Korea, South;2;35-11N;128-56E;35-11N;128-56E;4;6;
+RKPM;47;187;Mosulpo Ab;;Korea, South;2;33-12N;126-16E;33-12N;126-16E;27;27;
+RKPS;47;161;Sach'On Ab;;Korea, South;2;35-05N;128-05E;35-05N;128-05E;8;8;
+RKPU;47;152;Ulsan;;Korea, South;2;35-33N;129-19E;;;32;33;P
+RKSB;47;106;Tonghae Radar Site;;Korea, South;2;37-30N;129-08E;37-52N;126-48E;31;32;P
+RKSC;--;---;Sv Ri San;;Korea, South;2;37-21N;126-55E;;;406;;
+RKSD;--;---;Maesanri;;Korea, South;2;37-21N;127-16E;;;144;;
+RKSF;47;117;Seoul / Yongdungp'O Rokaf Wc;;Korea, South;2;37-30N;126-56E;;;49;;
+RKSG;47;127;Pyongtaek Ab;;Korea, South;2;36-56N;127-00E;;;16;16;
+RKSH;--;---;Command Post Tango;;Korea, South;2;37-31N;126-59E;;;73;;
+RKSI;47;113;Incheon International Airport;;Korea, South;2;37-28N;126-27E;;;7;;
+RKSJ;--;---;Taesong-San;;Korea, South;2;38-12N;127-33E;;;1182;;
+RKSL;47;108;Seoul;;Korea, South;2;37-34N;126-58E;;;86;87;P
+RKSM;47;111;Seoul E Ab;;Korea, South;2;37-26N;127-07E;37-26N;127-07E;20;20;
+RKSN;69;010;Koon-Ni Range;;Korea, South;2;37-02N;126-45E;;;15;;
+RKSO;47;122;Osan Ab;;Korea, South;2;37-06N;127-02E;37-06N;127-02E;11;12;
+RKSP;47;103;Paengnyongdo Ab;;Korea, South;2;37-58N;124-40E;37-58N;124-40E;171;177;
+RKSQ;--;---;Yeonpyeungdo;;Korea, South;2;37-42N;125-42E;;;91;;
+RKSS;47;110;Seoul / Kimp'O International Airport;;Korea, South;2;37-33N;126-48E;37-33N;126-48E;18;18;
+RKST;--;---;Camp Casey / Tongduch;;Korea, South;2;37-55N;127-03E;;;60;;
+RKSU;--;---;Yeoju Range;;Korea, South;2;37-26N;127-38E;37-26N;127-38E;43;43;
+RKSV;--;---;Pyoripsan;;Korea, South;2;37-47N;126-22E;;;250;;
+RKSW;47;120;Suwon Ab;;Korea, South;2;37-15N;127-00E;;;24;24;
+RKSX;--;---;Camp Stanley / H-207;;Korea, South;2;37-43N;127-06E;;;71;;
+RKSY;--;---;Yongsan / H-208 Hp;;Korea, South;2;37-31N;126-59E;;;12;;
+RKTA;47;136;Andong;;Korea, South;2;36-33N;128-43E;;;139;142;P
+RKTB;--;---;Paekado;;Korea, South;2;37-01N;126-03E;;;46;;
+RKTD;47;132;Taejon Kor-Afb ;;Korea, South;2;36-20N;127-23E;;;63;;
+RKTE;47;124;Songmu Ab;;Korea, South;2;36-24N;127-30E;;;79;79;
+RKTF;47;133;Taejon;;Korea, South;2;36-18N;127-24E;;;77;78;P
+RKTG;--;---;Camp Walker H-805 ;;Korea, South;2;35-51N;128-35E;;;75;;
+RKTH;47;139;Pohang Ab;;Korea, South;2;35-59N;129-25E;35-59N;129-25E;20;20;
+RKTI;47;125;Jung Won Rok-Ab ;;Korea, South;2;37-02N;127-53E;;;91;;
+RKTM;47;126;Mangilsan Ab;;Korea, South;2;36-56N;126-27E;;;302;;
+RKTN;47;142;Taegu Ab;;Korea, South;2;35-54N;128-39E;35-54N;128-39E;35;37;
+RKTP;--;---;Hae Mi;;Korea, South;2;36-24N;126-21E;;;31;;
+RKTS;--;---;Sangju;;Korea, South;2;36-25N;128-10E;;;150;;
+RKTT;47;143;Taegu;;Korea, South;2;35-53N;128-37E;;;58;61;P
+RKTU;47;128;Chongju Ab;;Korea, South;2;36-42N;127-30E;36-42N;127-30E;58;66;
+RKTV;--;---;Chungju;;Korea, South;2;37-04N;127-53E;;;59;;
+RKTW;--;---;Woong Cheon;;Korea, South;2;36-12N;126-33E;;;13;;
+RKTY;47;134;Yechon Ab;;Korea, South;2;36-38N;128-21E;36-37N;128-21E;108;120;
+RKXX;--;---;Nightmare Range;;Korea, South;2;38-04N;127-21E;;;;;
+ROAH;47;930;Naha Airport;;Japan;2;26-11N;127-39E;;;3;6;
+RODE;47;938;Iejima Auxiliary Ab;;Japan;2;26-43N;127-47E;26-43N;127-47E;70;73;
+RODN;47;931;Kadena Ab;;Japan;2;26-21N;127-46E;26-21N;127-45E;45;48;
+ROHF;47;935;Hamby U. S. Army Airfield;;Japan;2;26-18N;127-46E;;;5;6;
+ROIG;47;918;Ishigakijima;;Japan;2;24-20N;124-10E;24-20N;124-10E;6;7;P
+ROKJ;47;929;Kumejima;;Japan;2;26-20N;126-48E;;;4;5;
+ROMD;47;945;Minamidaitojima;;Japan;2;25-50N;131-14E;25-50N;131-14E;16;20;P
+ROMY;47;927;Miyakojima;;Japan;2;24-47N;125-17E;;;40;41;P
+RORA;--;---;Aguni Island;;Japan;2;26-36N;127-14E;;;29;;
+RORH;--;---;Hateruma;;Japan;2;24-04N;123-48E;;;13;;
+RORK;--;---;Kitadaito Island;;Japan;2;25-55N;131-20E;;;22;;
+RORS;--;---;Shimoji-Shima Island;;Japan;2;24-50N;125-09E;;;16;;
+RORT;--;---;Tarama Island;;Japan;2;24-39N;124-42E;;;9;;
+RORY;--;---;Yoron Island;;Japan;2;27-03N;128-24E;;;16;;
+ROTM;47;933;Futenma Marine Corps Air Facility;;Japan;2;26-16N;127-45E;;;75;78;
+ROYN;47;911;Yonaguni Airport;;Japan;2;24-28N;122-59E;;;16;19;
+RPLB;98;426;Subic Bay Weather Station;;Philippines;5;14-48N;120-16E;14-48N;120-16E;18;19;
+RPLC;--;---;Clarkfield Pampanga International Airport;;Philippines;5;15-11N;120-33E;;;148;;
+RPLI;98;223;Laoag;;Philippines;5;18-11N;120-32E;18-11N;120-32E;4;5;P
+RPLL;98;429;Ninoy Aquino Inter-National Airport;;Philippines;5;14-31N;121-00E;;;14;15;P
+RPMD;98;753;Davao Airport;;Philippines;5;07-07N;125-39E;07-07N;125-39E;17;18;P
+RPMK;98;327;Clark Ab;;Philippines;5;15-10N;120-34E;15-10N;120-34E;196;196;
+RPMP;98;444;Legaspi;;Philippines;5;13-08N;123-44E;13-08N;123-44E;16;17;P
+RPMR;98;536;Romblon;;Philippines;5;12-35N;122-16E;;;46;47;P
+RPMS;98;428;Sangley Point;;Philippines;5;14-30N;120-55E;14-30N;120-55E;3;4;
+RPMT;98;646;Mactan;;Philippines;5;10-18N;123-58E;10-18N;123-58E;23;24;P
+RPMZ;98;836;Zamboanga;;Philippines;5;06-54N;122-04E;06-54N;122-04E;5;6;P
+RPUA;98;232;Aparri;;Philippines;5;18-22N;121-38E;;;2;3;P
+RPUB;98;328;Baguio;;Philippines;5;16-25N;120-36E;16-25N;120-36E;1500;1501;P
+RPUD;98;440;Daet;;Philippines;5;14-08N;122-59E;;;3;4;P
+RPUH;98;531;San Jose;;Philippines;5;12-21N;121-02E;;;2;3;P
+RPUI;98;324;Iba;;Philippines;5;15-20N;119-58E;;;4;5;
+RPUK;98;431;Calapan;;Philippines;5;13-25N;121-11E;;;39;41;P
+RPUN;--;---;Naga / Luzon Island;;Philippines;5;13-35N;123-16E;;;43;;
+RPUO;98;135;Basco;;Philippines;5;20-27N;121-58E;20-27N;121-58E;10;11;P
+RPUQ;98;222;Vigan;;Philippines;5;17-34N;120-23E;;;31;33;
+RPUR;98;333;Baler;;Philippines;5;15-46N;121-34E;;;4;6;
+RPUT;98;233;Tuguegarao;;Philippines;5;17-37N;121-44E;;;61;62;
+RPUV;98;446;Virac;;Philippines;5;13-35N;124-14E;;;39;40;
+RPUW;--;---;Marinduque Island;;Philippines;5;13-22N;121-50E;;;5;;
+RPVA;98;550;Tacloban;;Philippines;5;11-15N;125-00E;;;2;3;P
+RPVD;98;642;Dumaguete;;Philippines;5;09-18N;123-18E;;;5;8;
+RPVF;98;546;Catarman;;Philippines;5;12-29N;124-38E;;;4;5;
+RPVG;98;558;Guiuan;;Philippines;5;11-02N;126-44E;11-02N;126-44E;56;60;
+RPVI;98;637;Iloilo;;Philippines;5;10-42N;122-34E;;;7;8;P
+RPVM;98;543;Masbate;;Philippines;5;12-22N;123-37E;;;6;6;P
+RPVP;98;618;Puerto Princesa;;Philippines;5;09-45N;118-44E;09-45N;118-44E;14;16;P
+RPVR;98;538;Roxas;;Philippines;5;11-35N;122-45E;;;3;4;
+RPVT;98;644;Tagbilaran;;Philippines;5;09-36N;123-51E;;;7;8;
+RPWB;98;851;Gen. Santos;;Philippines;5;06-07N;125-11E;;;14;15;
+RPWC;98;746;Cotobato;;Philippines;5;07-10N;124-13E;;;58;62;
+RPWE;98;752;Butuan;;Philippines;5;09-56N;125-31E;;;45;46;
+RPWG;98;741;Dipolog;;Philippines;5;08-36N;123-21E;;;3;5;P
+RPWL;98;748;Cagayan De Oro;;Philippines;5;08-29N;124-38E;;;5;6;
+RPWS;98;653;Surigao;;Philippines;5;09-48N;125-30E;09-48N;125-30E;54;55;P
+RPWY;98;751;Malaybalay;;Philippines;5;08-09N;125-05E;;;626;627;
+RPXT;98;435;Alabat;;Philippines;5;14-05N;122-01E;;;4;5;
+SAAC;87;395;Concordia Aerodrome;;Argentina;3;31-18S;058-01W;;;35;38;P
+SAAG;87;497;Gualeguaychu Aerodrome;;Argentina;3;33-00S;058-37W;;;23;21;P
+SAAJ;87;548;Junin Aerodrome;;Argentina;3;34-33S;060-55W;;;82;81;P
+SAAP;87;374;Parana Aerodrome;;Argentina;3;31-47S;060-29W;;;74;78;P
+SAAR;87;480;Rosario Aerodrome;;Argentina;3;32-55S;060-47W;;;25;25;P
+SAAU;87;385;Villaguay Aerodrome;;Argentina;3;31-51S;059-05W;;;40;43;
+SAAV;87;371;Sauce Viejo Aerodrome;;Argentina;3;31-42S;060-49W;;;17;18;
+SABA;87;585;Buenos Aires Observatorio;;Argentina;3;34-35S;058-29W;;;25;25;
+SABE;87;582;Aeroparque Bs. As. Aerodrome;;Argentina;3;34-34S;058-25W;;;6;6;
+SACI;87;349;Pilar Observatorio;;Argentina;3;31-40S;063-53W;;;338;338;
+SACO;87;344;Cordoba Aerodrome;;Argentina;3;31-19S;064-13W;31-19S;064-13W;484;474;P
+SACP;87;322;Chepes;;Argentina;3;31-20S;066-36W;;;658;658;
+SACT;--;---;Gobernador Gordillo;;Argentina;3;30-22S;066-18W;;;457;;
+SACV;87;244;Villa De Maria Del Rio Seco;;Argentina;3;29-54S;063-41W;;;341;341;P
+SADD;87;568;Don Torcuato Aerodrome;;Argentina;3;34-29S;058-37W;;;5;4;
+SADF;--;---;San Fernando, BA;;Argentina;3;34-27-11S;058-35-23W;;;3;;
+SADL;87;593;La Plata Aerodrome;;Argentina;3;34-58S;057-54W;;;21;19;
+SADP;87;571;El Palomar Aerodrome;;Argentina;3;34-36S;058-36W;;;18;12;
+SAEZ;87;576;Ezeiza Aerodrome;;Argentina;3;34-49S;058-32W;34-49S;058-32W;20;20;P
+SAME;87;418;Mendoza Aerodrome;;Argentina;3;32-50S;068-47W;32-50S;068-47W;705;704;P
+SAMI;87;416;San Martin;;Argentina;3;33-05S;068-25W;;;653;653;
+SAMJ;87;305;Jachal;;Argentina;3;30-15S;068-45W;;;1165;1165;
+SAMM;87;506;Malargue Aerodrome;;Argentina;3;35-30S;069-35W;;;1426;1425;P
+SAMR;87;509;San Rafael Aerodrome;;Argentina;3;34-35S;068-24W;34-35S;068-24W;745;748;P
+SAMS;87;412;San Carlos;;Argentina;3;33-46S;069-02W;;;940;940;
+SAMU;87;405;Uspallata;;Argentina;3;32-36S;069-20W;;;1844;1891;
+SANC;87;222;Catamarca Aero.;;Argentina;3;28-36S;065-46W;;;454;454;P
+SANE;87;129;Santiago Del Estero Aero.;;Argentina;3;27-46S;064-18W;;;198;199;P
+SANI;87;211;Tinogasta;;Argentina;3;28-04S;067-34W;;;1201;1201;
+SANL;87;217;La Rioja Aero.;;Argentina;3;29-23S;066-49W;;;438;429;P
+SANO;87;214;Chilecito;;Argentina;3;29-13S;067-26W;;;950;;
+SANT;87;121;Tucuman Aerodrome;;Argentina;3;26-51S;065-06W;;;440;450;P
+SANU;87;311;San Juan Aerodrome;;Argentina;3;31-34S;068-52W;;;597;598;P
+SANW;87;257;Ceres Aerodrome;;Argentina;3;29-53S;061-57W;29-53S;061-57W;87;88;P
+SAOC;87;453;Rio Cuarto Aerodrome;;Argentina;3;33-07S;064-14W;;;420;421;P
+SAOD;87;328;Villa Dolores Aerodrome;;Argentina;3;31-57S;065-08W;;;561;569;
+SAOL;87;534;Laboulaye;;Argentina;3;34-08S;063-22W;34-08S;063-22W;136;137;
+SAOM;87;467;Marcos Juarez Aerodrome;;Argentina;3;32-42S;062-09W;;;110;114;P
+SAOR;87;448;Villa Reynolds Aerodrome;;Argentina;3;33-44S;065-23W;;;485;486;
+SAOU;87;436;San Luis Aerodrome;;Argentina;3;33-16S;066-21W;33-16S;066-21W;710;713;P
+SARC;87;166;Corrientes Aero.;;Argentina;3;27-27S;058-46W;;;62;62;
+SARE;87;155;Resistencia Aero.;;Argentina;3;27-27S;059-03W;27-27S;059-03W;53;52;P
+SARF;87;162;Formosa Aerodrome;;Argentina;3;26-12S;058-14W;;;59;60;P
+SARI;87;097;Iguazu Aerodrome;;Argentina;3;25-44S;054-28W;;;270;270;P
+SARL;87;289;Paso De Los Libres Aerodrome;;Argentina;3;29-41S;057-09W;;;69;70;P
+SARM;87;393;Monte Caseros Aerodrome;;Argentina;3;30-16S;057-39W;30-16S;057-39W;53;54;
+SARP;87;178;Posadas Aero.;;Argentina;3;27-22S;055-58W;27-22S;055-58W;131;133;P
+SARS;87;149;Presidencia Roque Saenz Pena Aerodrome;;Argentina;3;26-49S;060-27W;;;91;92;P
+SASA;87;047;Salta Aerodrome;;Argentina;3;24-51S;065-29W;24-51S;065-29W;1238;1221;P
+SASJ;87;046;Jujuy Aerodrome;;Argentina;3;24-23S;065-05W;;;921;905;P
+SASO;87;016;Oran Aerodrome;;Argentina;3;23-09S;064-19W;;;357;357;
+SASQ;87;007;La Quiaca Observatorio;;Argentina;3;22-06S;065-36W;;;3462;3459;
+SASR;87;065;Rivadavia;;Argentina;3;24-10S;062-54W;;;205;205;
+SAST;87;022;Tartagal Aerodrome;;Argentina;3;22-39S;063-49W;;;450;450;P
+SATK;87;078;Las Lomitas;;Argentina;3;24-42S;060-35W;24-42S;060-35W;130;130;P
+SATR;--;---;Reconquista, SF;;Argentina;3;29-12-37S;059-41-27W;;;49;;
+SATU;87;286;Curuzu Cuatia Aerodrome;;Argentina;3;29-47S;057-59W;;;80;73;
+SAVB;87;800;El Bolson Aerodrome;;Argentina;3;41-58S;071-31W;;;337;337;
+SAVC;87;860;Comodoro Rivadavia Aerodrome;;Argentina;3;45-47S;067-30W;45-47S;067-27W;58;46;P
+SAVE;87;803;Esquel Aerodrome;;Argentina;3;42-56S;071-09W;;;789;785;P
+SAVO;87;784;San Antonio Oeste Aerodrome;;Argentina;3;40-47S;065-06W;;;20;20;P
+SAVP;87;814;Paso De Indios;;Argentina;3;43-49S;068-53W;;;460;460;
+SAVT;87;828;Trelew Aerodrome;;Argentina;3;43-12S;065-16W;;;39;43;P
+SAVV;87;791;Viedma Aerodrome;;Argentina;3;40-51S;063-01W;;;6;7;P
+SAVY;--;---;Puerto Madryn, CHT;;Argentina;3;42-45-33S;065-06-10W;;;136;;
+SAWA;87;903;Lago Argentino Aerodrome;;Argentina;3;50-20S;072-18W;;;223;220;P
+SAWD;87;896;Puerto Deseado Aerodrome;;Argentina;3;47-44S;065-55W;47-44S;065-55W;81;80;
+SAWE;87;934;Rio Grande B. A.;;Argentina;3;53-48S;067-45W;53-48S;067-45W;13;22;
+SAWG;87;925;Rio Gallegos Aerodrome;;Argentina;3;51-37S;069-17W;;;20;19;P
+SAWH;87;938;Ushuaia Aerodrome;;Argentina;3;54-48S;068-19W;54-48S;068-19W;16;14;P
+SAWJ;87;909;San Julian Aerodrome;;Argentina;3;49-19S;067-45W;;;58;62;P
+SAWP;87;852;Perito Moreno Aerodrome;;Argentina;3;46-31S;071-01W;;;429;429;P
+SAWR;87;880;Gobernador Gregores Aerodrome;;Argentina;3;48-47S;070-10W;;;358;357;
+SAWU;87;912;Santa Cruz Aerodrome;;Argentina;3;50-01S;068-34W;;;113;111;
+SAZA;87;642;Azul Airport;;Argentina;3;36-45S;059-50W;36-44S;059-50W;132;132;
+SAZB;87;750;Bahia Blanca Aerodrome;;Argentina;3;38-44S;062-10W;;;75;83;P
+SAZD;87;648;Dolores Aerodrome;;Argentina;3;36-21S;057-44W;;;10;9;P
+SAZE;87;679;Pigue Aerodrome;;Argentina;3;37-36S;062-23W;;;304;304;
+SAZG;87;532;General Pico Aerodrome;;Argentina;3;35-42S;063-45W;;;139;145;
+SAZH;87;688;Tres Arroyos;;Argentina;3;38-20S;060-15W;;;115;115;P
+SAZM;87;692;Mar Del Plata Aerodrome;;Argentina;3;37-56S;057-35W;37-56S;057-35W;18;21;P
+SAZN;87;715;Neuquen Aerodrome;;Argentina;3;38-57S;068-08W;38-57S;068-08W;270;271;P
+SAZP;87;544;Pehuajo Aerodrome;;Argentina;3;35-52S;061-54W;;;87;86;
+SAZQ;87;736;Rio Colorado;;Argentina;3;39-01S;064-05W;;;79;79;
+SAZR;87;623;Santa Rosa Aerodrome;;Argentina;3;36-34S;064-16W;36-34S;064-16W;190;191;P
+SAZS;87;765;Bariloche Aerodrome;;Argentina;3;41-09S;071-10W;;;845;840;P
+SAZT;87;645;Tandil Aerodrome;;Argentina;3;37-14S;059-15W;;;175;175;P
+SAZV;87;663;Villa Gesell;;Argentina;3;37-14S;057-02W;;;7;;
+SAZY;87;761;Chapelco;;Argentina;3;40-05S;071-08W;;;779;;
+SBAA;82;861;Conceicao Do Araguaia;;Brazil;3;08-15S;049-17W;;;157;;
+SBAF;83;748;Afonsos Aeroporto ;;Brazil;3;22-52S;043-22W;;;34;;
+SBAN;83;419;Anapolis Braz-Afb ;;Brazil;3;16-14S;048-58W;;;1137;;
+SBAR;83;095;Aracaju Aeroporto ;;Brazil;3;10-59S;037-04W;;;8;9;
+SBAT;82;965;Alta Floresta Aeroporto ;;Brazil;3;09-52S;056-06W;09-52S;056-06W;288;288;
+SBBC;82;410;Benjamin Constant;;Brazil;3;04-23S;070-02W;;;65;;
+SBBE;82;193;Belem Aeroporto ;;Brazil;3;01-23S;048-29W;01-23S;048-29W;16;16;
+SBBG;83;981;Bage Aeroporto ;;Brazil;3;31-21S;054-07W;31-21S;054-07W;180;180;
+SBBH;83;583;Belo Horizonte Aeroporto ;;Brazil;3;19-51S;043-57W;19-51S;043-57W;785;785;
+SBBI;83;842;Curitiba;;Brazil;3;25-26S;049-16W;;;924;;
+SBBQ;83;689;Barbacena;;Brazil;3;21-15S;043-46W;;;1171;1171;
+SBBR;83;378;Brasilia Aeroporto ;;Brazil;3;15-52S;047-56W;15-52S;047-56W;1061;1061;
+SBBU;83;722;Bauru;;Brazil;3;22-19S;049-04W;;;590;;
+SBBV;82;022;Boa Vista, Boa Vista Intl ;;Brazil;3;02-50N;060-42W;02-50N;060-42W;84;;
+SBBW;83;359;Barra Do Garcas;;Brazil;3;15-52S;052-23W;;;350;350;
+SBCC;--;---;Cachimbo;;Brazil;3;09-20S;054-57W;;;536;;
+SBCF;83;587;Belo Horizonte;;Brazil;3;19-56S;043-56W;;;850;;
+SBCG;83;612;Campo Grande Aeroporto ;;Brazil;3;20-28S;054-40W;20-28S;054-40W;567;567;
+SBCI;82;764;Maranhao / Carolina Airport;;Brazil;3;07-19S;047-28W;;;183;;
+SBCJ;--;---;Carajas / Maraba;;Brazil;3;06-07S;050-00W;;;621;;
+SBCO;83;967;Porto Alegre;;Brazil;3;30-01S;051-13W;;;47;;
+SBCP;83;698;Campos;;Brazil;3;21-45S;041-20W;21-45S;041-20W;11;11;
+SBCR;83;552;Corumba;;Brazil;3;19-05S;057-30W;;;130;;
+SBCT;83;840;Curitiba Aeroporto ;;Brazil;3;25-31S;049-10W;25-31S;049-10W;908;908;
+SBCV;83;497;Caravelas ;;Brazil;3;17-39S;039-15W;17-38S;039-15W;11;;
+SBCY;83;362;Cuiaba Aeroporto ;;Brazil;3;15-39S;056-06W;15-39S;056-06W;187;182;
+SBCZ;82;704;Cruzeiro Do Sul;;Brazil;3;07-38S;072-40W;;;170;;
+SBDN;83;716;Presidente Prudente;;Brazil;3;22-07S;051-23W;;;436;;
+SBEG;82;111;Eduardo Gomes International;;Brazil;3;03-02S;060-03W;;;2;;
+SBEK;82;640;Jacareacanga;;Brazil;3;06-16S;057-44W;06-16S;057-44W;98;98;
+SBES;83;759;S. P. Aldeia Aerodrome ;;Brazil;3;22-49S;042-06W;;;10;11;
+SBFI;83;827;Foz Do Iguacu Aeroporto ;;Brazil;3;25-31S;054-35W;25-31S;054-35W;180;180;
+SBFL;83;899;Florianopolis Aeroporto ;;Brazil;3;27-40S;048-33W;27-40S;048-33W;5;5;
+SBFN;82;400;Fernando De Noronha;;Brazil;3;03-51S;032-25W;03-51S;032-25W;56;45;
+SBFZ;82;398;Fortaleza / pinto Martins ;;Brazil;3;03-47S;038-32W;03-47S;038-32W;25;25;
+SBGA;83;375;Gama;;Brazil;3;16-03S;048-03W;;;700;;
+SBGL;83;746;Galeao;;Brazil;3;22-49S;043-15W;22-49S;043-15W;6;42;
+SBGO;83;424;Goiania Aeroporto ;;Brazil;3;16-38S;049-13W;;;747;;
+SBGR;--;---;Guarulhos Civ / Mil ;;Brazil;3;23-26S;046-28W;;;750;;
+SBGW;83;708;Guaratingueta;;Brazil;3;22-47S;045-12W;;;537;537;
+SBHT;82;353;Altamira;;Brazil;3;03-12S;052-12W;;;74;;
+SBIH;82;444;Itaituba;;Brazil;3;04-15S;056-00W;;;34;;
+SBIL;83;349;Ilheus Aeroporto ;;Brazil;3;14-49S;039-02W;;;4;;
+SBIZ;82;564;Imperatriz;;Brazil;3;05-32S;047-30W;;;123;;
+SBJF;83;692;Juiz De Fora;;Brazil;3;21-46S;043-21W;;;939;939;
+SBJP;82;798;Joao Pessoa;;Brazil;3;07-06S;034-52W;;;7;;
+SBJR;83;111;Rio / Jacarepagua;;Brazil;3;22-59S;043-22W;;;3;;
+SBKG;82;795;Campina Grande;;Brazil;3;07-13S;035-53W;;;548;;
+SBKP;83;721;Campinas Aeroporto ;;Brazil;3;23-00S;047-08W;23-00S;047-08W;661;661;
+SBLO;83;768;Londrina Aeroporto ;;Brazil;3;23-20S;051-08W;23-20S;051-08W;569;570;
+SBLP;83;288;Bom Jesus Da Lapa;;Brazil;3;13-16S;043-25W;13-16S;043-25W;440;440;
+SBMA;82;562;Maraba;;Brazil;3;05-21S;049-09W;;;95;;
+SBME;--;---;Macae;;Brazil;3;22-21S;041-46W;;;2;;
+SBMG;83;767;Maringa;;Brazil;3;23-25S;051-57W;;;542;542;
+SBMK;83;437;Montes Claros;;Brazil;3;16-43S;043-52W;16-44S;043-52W;646;647;
+SBMN;82;332;Manaus Aeroporto ;;Brazil;3;03-09S;059-59W;03-09S;059-59W;84;84;
+SBMO;82;993;Maceio Aeroporto ;;Brazil;3;09-31S;035-47W;09-31S;035-47W;117;115;
+SBMQ;82;098;Macapa;;Brazil;3;00-02N;050-03W;;;15;;
+SBMS;82;591;Mocoro / 17 Rosado;;Brazil;3;05-12S;037-22W;;;23;;
+SBMT;83;779;Marte Civ / Mil ;;Brazil;3;23-31S;046-38W;;;722;;
+SBMY;82;533;Manicore;;Brazil;3;05-49S;061-18W;;;50;;
+SBNT;82;599;Natal Aeroporto;;Brazil;3;05-55S;035-15W;05-55S;035-15W;52;49;
+SBOI;82;017;Oiapoque;;Brazil;3;03-50N;051-50W;;;39;39;
+SBPA;83;971;Porto Alegre Aero-Porto ;;Brazil;3;30-00S;051-11W;30-00S;051-11W;3;3;
+SBPB;82;288;Parnaiba Aeroporto ;;Brazil;3;02-55S;041-45W;;;5;;
+SBPC;83;681;Pocos De Caldas;;Brazil;3;21-51S;046-34W;;;1260;;
+SBPF;83;914;Passo Fundo;;Brazil;3;28-15S;052-24W;;;684;;
+SBPG;83;844;Paranagua;;Brazil;3;25-31S;048-31W;;;5;;
+SBPK;83;985;Pelotas;;Brazil;3;31-52S;052-21W;;;13;13;
+SBPL;82;984;Petrolina ;;Brazil;3;09-21S;040-33W;;;385;;
+SBPN;83;063;Porto Nacional Aeroporto ;;Brazil;3;10-42S;048-24W;10-42S;048-24W;261;290;
+SBPP;83;703;Ponta Pora Intl ;;Brazil;3;22-33S;055-42W;;;657;;
+SBPS;--;---;Porto Seguro;;Brazil;3;16-26S;039-04W;;;51;;
+SBPV;82;824;Porto Velho Aeroporto ;;Brazil;3;08-46S;063-55W;08-46S;063-55W;102;102;
+SBQV;83;344;Vitoria Da Conquista;;Brazil;3;14-57S;040-53W;14-51S;040-50W;840;1042;
+SBRB;82;917;Rio Branco;;Brazil;3;10-00S;067-48W;;;142;143;
+SBRF;82;899;Recife Aeroporto ;;Brazil;3;08-04S;034-51W;;;19;;
+SBRJ;83;755;Rio De Janeiro Aeroporto ;;Brazil;3;22-54S;043-10W;;;3;;
+SBRP;--;---;Leite Lopes / Ribeir ;;Brazil;3;21-08S;047-47W;;;549;;
+SBRS;83;738;Resende;;Brazil;3;22-29S;044-28W;;;440;;
+SBSA;83;726;Sao Carlos;;Brazil;3;22-01S;047-53W;;;856;;
+SBSC;83;741;Rio De Janeiro-Santa Cruz Ab ;;Brazil;3;22-56S;043-43W;22-56S;043-43W;3;3;
+SBSJ;--;---;Sao Jose Dos Campo ;;Brazil;3;23-14S;045-52W;;;646;;
+SBSL;82;281;Sao Luiz Aeroporto ;;Brazil;3;02-36S;044-14W;02-36S;044-14W;53;53;
+SBSM;83;937;Santa Maria Aero-Porto ;;Brazil;3;29-43S;053-42W;;;85;;
+SBSN;82;244;Santarem-Aeroporto;;Brazil;3;02-26S;054-43W;02-26S;054-43W;72;72;
+SBSP;83;780;Sao Paulo/Congonhas Aeroporto;;Brazil;3;23-37S;046-39W;23-37S;046-39W;803;802;
+SBST;83;818;Santos Aeroporto ;;Brazil;3;23-56S;046-18W;;;3;3;
+SBSV;83;248;Salvador Aeroporto ;;Brazil;3;12-54S;038-20W;12-56S;038-21W;6;13;
+SBTE;82;579;Teresina Aeroporto ;;Brazil;3;05-03S;042-49W;05-03S;042-49W;69;69;
+SBTF;82;317;Tefe;;Brazil;3;03-22S;064-41W;;;47;47;
+SBTK;82;807;Tarauaca;;Brazil;3;08-10S;070-46W;;;190;;
+SBTT;82;411;Tabatinga;;Brazil;3;03-40S;069-40W;;;85;;
+SBTU;82;361;Tucurui;;Brazil;3;03-43S;049-43W;;;40;;
+SBUA;82;106;Sao Gabriel Da Cachoeira;;Brazil;3;00-08S;067-05W;;;90;;
+SBUF;82;986;Paulo Afonso;;Brazil;3;09-24S;038-13W;;;253;;
+SBUG;83;928;Uruguaiana Aeroporto ;;Brazil;3;29-47S;057-02W;29-47S;057-02W;74;74;
+SBUL;--;---;Uberlandia ;;Brazil;3;18-53S;048-14W;;;943;;
+SBUR;83;576;Uberaba;;Brazil;3;19-47S;047-58W;19-46S;047-57W;807;809;
+SBVH;83;208;Vilhena Aeroporto ;;Brazil;3;12-42S;060-06W;12-44S;060-08W;612;652;
+SBVT;83;649;Vitoria Aeroporto ;;Brazil;3;20-16S;040-17W;20-16S;040-17W;4;4;
+SBXV;83;319;Xavantina ;;Brazil;3;14-42S;052-21W;;;315;;
+SBYA;82;067;Iauarete;;Brazil;3;00-37N;069-12W;;;120;;
+SBYS;83;671;Pirassununga;;Brazil;3;21-59S;047-20W;21-59S;047-21W;597;598;
+SCAR;85;406;Arica;;Chile;3;18-20S;070-20W;18-21S;070-21W;58;58;P
+SCBA;85;874;Balmaceda;;Chile;3;45-55S;071-41W;45-54S;071-43W;520;520;P
+SCCC;85;886;Chile Chico;;Chile;3;46-33S;071-42W;;;325;325;P
+SCCH;85;672;Chillan;;Chile;3;36-34S;072-02W;36-34S;072-02W;124;148;P
+SCCI;85;934;Punta Arenas;;Chile;3;53-00S;070-51W;53-02S;070-51W;37;33;P
+SCCY;85;864;Coyhaique;;Chile;3;45-35S;072-07W;;;310;;P
+SCDA;85;418;Iquique / Diego Arac;;Chile;3;20-32S;070-11W;;;52;;
+SCEL;85;574;Pudahuel;;Chile;3;33-23S;070-47W;33-23S;070-47W;475;476;P
+SCER;85;543;Quintero Santiago;;Chile;3;32-47S;071-31W;32-47S;071-31W;8;8;P
+SCFA;85;442;Antofagasta;;Chile;3;23-26S;070-26W;23-25S;070-28W;135;137;P
+SCHA;85;470;Copiapo;;Chile;3;27-18S;070-25W;27-18S;070-25W;291;291;P
+SCHR;85;892;Cochrane;;Chile;3;47-14S;072-33W;;;167;167;P
+SCIC;85;629;Curico;;Chile;3;34-58S;071-14W;;;228;;P
+SCIE;85;682;Concepcion;;Chile;3;36-46S;073-03W;;;12;;P
+SCIP;85;469;Isla De Pascua;;Chile;3;27-09S;109-25W;27-10S;109-26W;51;41;P
+SCLL;85;486;Vallenar;;Chile;3;28-36S;070-46W;;;538;526;P
+SCRA;85;460;Chanaral;;Chile;3;26-19S;070-37W;26-19S;070-37W;30;30;P
+SCSE;85;488;La Serena;;Chile;3;29-54S;071-12W;;;142;;P
+SCTC;85;743;Temuco;;Chile;3;38-45S;072-38W;;;114;;P
+SCTE;85;799;Puerto Montt;;Chile;3;41-25S;073-05W;41-26S;073-07W;85;84;P
+SCVD;85;766;Valdivia;;Chile;3;39-37S;073-05W;;;19;;P
+SEAM;84;147;Ambato / Chachoan;;Ecuador;3;01-12S;078-34W;;;2520;;
+SEBC;84;101;Bahia De Caraquez;;Ecuador;3;00-35S;080-24W;;;3;;
+SECU;84;239;Cuenca / Mariscal Lamar;;Ecuador;3;02-53S;078-59W;02-53S;078-58W;2530;2531;P
+SEES;84;018;Esmeraldas-Tachina;;Ecuador;3;00-58N;079-38W;00-59N;079-39W;7;8;P
+SEGU;84;203;Guayaquil / Simon Bolivar;;Ecuador;3;02-09S;079-53W;02-09S;079-53W;4;9;P
+SEIB;84;043;Ibarra / Atahualpa;;Ecuador;3;00-21N;078-08W;;;2228;;
+SELO;84;265;Catamayo / Camilo Ponce Enriquez;;Ecuador;3;04-00S;079-22W;;;1239;1238;P
+SELT;84;123;Latacunga;;Ecuador;3;00-55S;078-37W;;;2785;;
+SEMA;84;279;Macara / J. M. Velasco I.;;Ecuador;3;04-22S;079-56W;;;430;;
+SEMH;84;248;Machala / General M. Serrano;;Ecuador;3;03-15S;079-58W;;;4;10;
+SEMT;84;117;Manta;;Ecuador;3;00-57S;080-41W;;;13;14;P
+SEPA;84;163;Pastaza / Rio Amazonas;;Ecuador;3;01-30S;078-03W;;;1043;1054;P
+SEQU;84;071;Quito / Mariscal Sucre;;Ecuador;3;00-09S;078-29W;00-08S;078-29W;2811;2812;P
+SESA;84;200;Salinas / General Ulpiano Paez;;Ecuador;3;02-12S;080-59W;;;4;8;P
+SEST;84;008;San Cristobal Galapagos ;;Ecuador;3;00-54S;089-36W;00-54S;089-37W;6;6;P
+SETI;84;131;Tiputini ;;Ecuador;3;00-47S;075-31W;;;220;;
+SETU;84;027;Tulcan / El Rosal;;Ecuador;3;00-49N;077-42W;;;2950;;
+SFAL;88;891;Stanley Airport;;Falkland Islands, Islas Malvinas;3;51-41S;057-46W;;;23;;
+SGAS;86;218;Asuncion / Aeropuerto;;Paraguay;3;25-16S;057-38W;25-16S;057-38W;101;101;
+SGCO;86;134;Concepcion;;Paraguay;3;23-25S;057-18W;;;74;74;
+SGEN;86;297;Encarnacion;;Paraguay;3;27-19S;055-50W;;;91;91;
+SGES;--;---;Aeropuerto Guarany;;Paraguay;3;25-27S;054-51W;;;849;;
+SGME;86;068;Mariscal Estigarribia;;Paraguay;3;22-01S;060-36W;;;172;181;
+SGNA;86;017;Nueva Asuncion;;Paraguay;3;20-43S;061-55W;20-43S;061-55W;318;315;
+SKAR;80;211;Armenia / El Eden;;Colombia;3;04-30N;075-43W;;;1204;1219;P
+SKAS;80;372;Puerto Asis;;Colombia;3;00-30N;076-30W;;;254;;P
+SKBG;80;094;Bucaramanga / Palonegro;;Colombia;3;07-06N;073-12W;;;1189;;P
+SKBO;80;222;Bogota / Eldorado;;Colombia;3;04-43N;074-09W;04-42N;074-09W;2547;2548;P
+SKBQ;80;028;Barranquilla / Ernestocortissoz;;Colombia;3;10-53N;074-47W;10-54N;074-46W;14;30;P
+SKBU;80;252;Buenaventura;;Colombia;3;03-51N;076-58W;;;14;15;P
+SKCC;80;097;Cucuta / Camilo Daza;;Colombia;3;07-56N;072-31W;;;250;317;P
+SKCG;80;022;Cartagena / Rafael Nunez;;Colombia;3;10-27N;075-31W;;;1;12;P
+SKCL;80;259;Cali / Alfonso Bonillaaragon;;Colombia;3;03-33N;076-23W;03-33N;076-23W;961;969;P
+SKEJ;80;091;Barrancabermeja / Yariguies;;Colombia;3;07-01N;073-48W;;;126;134;P
+SKIB;80;214;Ibague / Perales;;Colombia;3;04-26N;075-09W;;;928;;P
+SKIP;80;370;Ipiales / San Luis;;Colombia;3;00-49N;077-38W;;;2961;;P
+SKLC;80;084;Apartado / Los Cedros;;Colombia;3;07-49N;076-42W;;;20;;P
+SKLT;80;398;Leticia / Vasquez Cobo;;Colombia;3;04-10S;069-57W;04-10S;069-57W;84;84;P
+SKMD;80;110;Medellin / Olaya Herrera;;Colombia;3;06-13N;075-36W;;;1490;1499;P
+SKMR;80;063;Monteria / Los Garzones;;Colombia;3;08-49N;075-51W;;;20;26;P
+SKMU;80;361;Mitu;;Colombia;3;01-08N;070-03W;;;207;;
+SKNV;80;315;Neiva / Benito Salas;;Colombia;3;02-58N;075-18W;;;439;443;P
+SKPC;80;139;Puerto Carreno / A. Guauquea;;Colombia;3;06-10N;067-30W;;;55;;P
+SKPE;80;210;Pereira / Matecana;;Colombia;3;04-49N;075-44W;;;1342;1342;P
+SKPP;80;308;Popayan / Guillermo;;Colombia;3;02-28N;076-36W;02-27N;076-36W;1730;1730;
+SKPS;80;342;Pasto / Antonio Narin;;Colombia;3;01-25N;077-16W;;;1826;;
+SKPV;80;002;Providencia Isla / El Embrujo;;Colombia;4;13-22N;081-21W;;;6;;P
+SKRG;80;112;Rionegro / J. M. Cordova;;Colombia;3;06-08N;075-26W;;;2140;2142;P
+SKRH;80;035;Riohacha / Almirante Padilla;;Colombia;3;11-32N;072-56W;11-32N;072-56W;4;4;P
+SKSJ;80;322;San Jose Del Guaviare;;Colombia;3;02-34N;072-38W;;;155;155;P
+SKSM;80;009;Santa Marta / Simon Bolivar;;Colombia;3;11-08N;074-14W;;;4;14;P
+SKSP;80;001;San Andres Isla / Sesquicentenario;;Colombia;4;12-35N;081-43W;12-35N;081-42W;1;6;P
+SKUC;80;099;Arauca / Santiago Perez;;Colombia;3;07-04N;070-44W;;;128;128;P
+SKUI;80;144;Quibdo / El Carano;;Colombia;3;05-43N;076-37W;;;53;;P
+SKVP;80;036;Valledupar / Alfonso Lopez;;Colombia;3;10-26N;073-15W;;;138;;P
+SKVV;80;234;Villavicencio / Vanguardia;;Colombia;3;04-10N;073-37W;;;423;431;P
+SLAP;85;151;Apolo;;Bolivia;3;14-44S;068-30W;;;1415;;
+SLAS;85;175;Ascencion De Guarayos;;Bolivia;3;15-43S;063-06W;;;247;;
+SLCA;85;315;Camiri;;Bolivia;3;20-00S;063-32W;;;798;;P
+SLCB;85;223;Cochabamba;;Bolivia;3;17-25S;066-11W;17-23S;066-10W;2548;2570;P
+SLCN;85;230;Charana;;Bolivia;3;17-35S;069-36W;;;4054;;P
+SLCO;85;041;Cobija;;Bolivia;3;11-02S;068-47W;11-01S;068-47W;235;260;P
+SLCP;85;196;Concepcion;;Bolivia;3;16-09S;062-01W;;;497;;
+SLET;85;245;Santa Cruz / El Trompillo;;Bolivia;3;17-48S;063-11W;17-48S;063-10W;418;414;P
+SLGY;85;033;Guayaramerin;;Bolivia;3;10-49S;065-21W;;;130;;
+SLJE;85;247;San Jose De Chiquitos;;Bolivia;3;17-48S;060-44W;;;284;;P
+SLJO;85;104;San Joaquin;;Bolivia;3;13-04S;064-49W;;;140;;P
+SLJV;85;195;San Javier;;Bolivia;3;16-16S;062-28W;;;534;;
+SLLP;85;201;La Paz / Alto;;Bolivia;3;16-31S;068-11W;16-30S;068-11W;4058;4038;P
+SLMG;85;114;Magdalena;;Bolivia;3;13-20S;064-07W;;;140;;
+SLOR;85;242;Oruro;;Bolivia;3;17-58S;067-04W;;;3072;;P
+SLPO;85;293;Potosi;;Bolivia;3;19-33S;065-44W;;;3935;;
+SLPS;85;289;Puerto Suarez;;Bolivia;3;18-59S;057-49W;;;134;;P
+SLRB;85;268;Robore;;Bolivia;3;18-19S;059-46W;;;276;;P
+SLRI;85;043;Riberalta;;Bolivia;3;11-00S;066-07W;;;141;;P
+SLRQ;85;141;Rurrenabaque;;Bolivia;3;14-28S;067-34W;14-28S;067-35W;204;274;P
+SLRY;85;140;Reyes;;Bolivia;3;14-19S;067-23W;;;140;;
+SLSA;85;123;Santa Ana;;Bolivia;3;13-46S;065-26W;;;144;;
+SLSB;85;152;San Borja;;Bolivia;3;14-52S;066-52W;;;194;;
+SLSI;85;207;San Ignacio De Velasco;;Bolivia;3;16-23S;060-58W;;;413;;P
+SLSM;85;153;San Ignacio De Moxos;;Bolivia;3;14-55S;065-36W;;;160;;
+SLSU;85;283;Sucre;;Bolivia;3;19-01S;065-18W;;;2904;;
+SLTJ;85;364;Tarija;;Bolivia;3;21-33S;064-42W;;;1854;;
+SLTR;85;154;Trinidad;;Bolivia;3;14-49S;064-55W;14-45S;064-48W;155;236;P
+SLVM;85;345;Villamontes;;Bolivia;3;21-15S;063-27W;;;398;;
+SLVR;85;244;Viru-Viru;;Bolivia;3;17-38S;063-08W;;;373;;P
+SLYA;85;365;Yacuiba;;Bolivia;3;21-57S;063-39W;;;645;;P
+SMJP;--;---;Johan A. Pengel;;Suriname;3;05-27N;055-11W;;;16;;
+SMZY;81;225;Zanderij;;Suriname;3;05-27N;055-12W;05-27N;055-12W;15;15;P
+SOCA;81;405;Cayenne / Rochambeau;;French Guiana;3;04-50N;052-22W;04-50N;052-22W;105;9;P
+SOOM;81;401;Saint-Laurent-Du-Maroni;;French Guiana;3;05-30N;054-02W;05-30N;054-02W;4;9;P
+SPAY;84;593;Atalaya;;Peru;3;10-44S;073-47W;;;450;451;
+SPCL;84;515;Pucallpa;;Peru;3;08-25S;074-36W;08-22S;074-35W;148;149;
+SPEO;84;531;Chimbote;;Peru;3;09-10S;078-31W;;;20;21;
+SPGM;84;534;Tingo Maria;;Peru;3;09-08S;075-57W;;;664;665;
+SPHI;84;452;Chiclayo;;Peru;3;06-47S;079-50W;06-47S;079-50W;29;34;
+SPHO;84;673;Ayacucho;;Peru;3;13-08S;074-13W;;;2740;2749;
+SPHY;84;688;Andahuayla;;Peru;3;13-43S;073-21W;;;3444;;
+SPHZ;84;542;Anta Huaraz ;;Peru;3;09-21S;077-36W;;;2750;2760;
+SPIM;84;628;Lima-Callao / Aerop. Internacional Jorgechavez;;Peru;3;12-00S;077-07W;12-01S;077-02W;12;13;
+SPJA;84;440;Rioja;;Peru;3;06-03S;077-09W;;;792;;
+SPJI;84;474;Juanjui;;Peru;3;07-13S;076-43W;;;350;363;
+SPJL;84;735;Juliaca;;Peru;3;15-29S;070-09W;;;3826;3827;
+SPJN;84;721;San Juan;;Peru;3;15-23S;075-10W;;;60;60;
+SPJR;84;472;Cajamarca;;Peru;3;07-08S;078-28W;;;2620;2622;
+SPME;84;370;Tumbes;;Peru;3;03-33S;080-24W;;;25;27;
+SPMS;84;425;Yurimaguas;;Peru;3;05-54S;076-05W;;;179;184;
+SPNC;84;564;Huanuco;;Peru;3;09-54S;075-45W;;;1859;1860;
+SPPY;84;444;Chachapoyas;;Peru;3;06-13S;077-50W;;;2540;2540;
+SPQT;84;377;Iquitos;;Peru;3;03-45S;073-15W;03-45S;073-15W;125;126;
+SPQU;84;752;Arequipa;;Peru;3;16-19S;071-33W;16-19S;071-33W;2538;2539;
+SPRU;84;501;Trujillo;;Peru;3;08-06S;079-02W;;;26;30;
+SPSO;84;691;Pisco;;Peru;3;13-45S;076-17W;13-45S;076-13W;8;7;
+SPST;84;455;Tarapoto;;Peru;3;06-27S;076-23W;;;281;282;
+SPTN;84;782;Tacna;;Peru;3;18-04S;070-18W;;;468;469;
+SPTU;84;658;Puerto Maldonado;;Peru;3;12-38S;069-12W;;;265;266;
+SPUR;84;401;Piura;;Peru;3;05-11S;080-36W;;;49;55;
+SPYL;84;390;Talara;;Peru;3;04-34S;081-15W;04-34S;081-15W;85;90;
+SPZO;84;686;Cuzco;;Peru;3;13-33S;071-59W;;;3248;3249;
+SUAA;86;575;Melilla;;Uruguay;3;34-47S;056-15W;;;53;48;
+SUAG;86;330;Artigas;;Uruguay;3;30-23S;056-30W;;;123;120;P
+SUCA;86;560;Colonia;;Uruguay;3;34-27S;057-50W;;;23;22;P
+SUDU;86;530;Durazno;;Uruguay;3;33-21S;056-30W;;;93;92;
+SULS;--;---;Capitan Corbeta;;Uruguay;3;34-52S;055-06W;;;30;;
+SUME;86;490;Mercedes;;Uruguay;3;33-15S;058-04W;;;22;17;
+SUMO;86;440;Melo;;Uruguay;3;32-22S;054-13W;;;100;100;
+SUMU;86;580;Carrasco;;Uruguay;3;34-50S;056-00W;;;32;32;P
+SUPE;--;---;Maldonado / Punta Est;;Uruguay;3;34-55S;054-55W;;;15;;
+SUPU;86;430;Paysandu;;Uruguay;3;32-20S;058-02W;;;61;61;
+SURV;86;350;Rivera;;Uruguay;3;30-53S;055-32W;;;205;241;
+SUSO;86;360;Salto;;Uruguay;3;31-23S;057-57W;;;34;33;P
+SUTB;86;370;Tacuarembo;;Uruguay;3;31-42S;055-59W;;;134;134;
+SUTR;86;500;Treinta Y Tres;;Uruguay;3;33-13S;054-23W;;;46;46;P
+SVAC;80;427;Acarigua;;Venezuela;3;09-33N;069-14W;;;226;225;P
+SVBC;80;419;Barcelona;;Venezuela;3;10-07N;064-41W;10-07N;064-41W;7;7;P
+SVBI;80;440;Barinas;;Venezuela;3;08-37N;070-13W;;;203;204;P
+SVBM;80;410;Barquisimeto;;Venezuela;3;10-04N;069-19W;10-04N;069-19W;613;614;P
+SVBS;80;413;Maracay-B. A. Sucre;;Venezuela;3;10-15N;067-39W;10-15N;067-39W;436;437;P
+SVCB;80;444;Ciudad Bolivar;;Venezuela;3;08-09N;063-33W;08-07N;063-32W;43;48;P
+SVCL;80;442;Calabozo;;Venezuela;3;08-56N;067-25W;;;100;101;P
+SVCP;--;---;Carupano / Gen. Jose;;Venezuela;3;10-40N;063-16W;;;10;;
+SVCR;80;403;Coro;;Venezuela;3;11-25N;069-41W;11-25N;069-41W;16;17;P
+SVCS;--;---;Caracas / Oscar Macha;;Venezuela;3;10-18N;066-49W;;;654;;
+SVCU;80;420;Cumana;;Venezuela;3;10-27N;064-11W;;;2;4;P
+SVFM;80;416;Caracas / La Carlota;;Venezuela;3;10-30N;066-53W;10-30N;066-53W;835;835;P
+SVGD;80;448;Guasdualito;;Venezuela;3;07-14N;070-48W;07-14N;070-48W;130;131;P
+SVGI;80;423;Guiria;;Venezuela;3;10-35N;062-19W;;;13;14;P
+SVGU;80;428;Guanare;;Venezuela;3;09-01N;069-44W;;;163;163;P
+SVHG;--;---;Higuerote;;Venezuela;3;10-28N;066-06W;;;4;;
+SVJC;--;---;Paraguana / Josefa;;Venezuela;3;11-47N;070-09W;;;23;;
+SVJM;80;431;San Juan De Los Morros;;Venezuela;3;09-55N;067-20W;;;429;429;P
+SVLF;--;---;La Fria;;Venezuela;3;08-15N;072-16W;;;98;;
+SVLO;80;405;La Orchila;;Venezuela;3;11-48N;066-11W;11-48N;066-11W;3;3;P
+SVMC;80;407;Maracaibo-La Chinita;;Venezuela;3;10-34N;071-44W;10-34N;071-44W;66;65;P
+SVMD;80;438;Merida;;Venezuela;3;08-36N;071-11W;;;1479;1498;P
+SVMG;--;---;Margarita / Del Carib;;Venezuela;3;10-55N;063-59W;;;23;;
+SVMI;80;415;Caracas / Maiquetia Aerop. Intl. Simon Bolivar;;Venezuela;3;10-36N;066-59W;10-36N;066-59W;43;48;P
+SVMN;80;425;Mene Grande;;Venezuela;3;09-49N;070-56W;09-49N;070-56W;27;28;P
+SVMP;--;---;Metropolitano Private ;;Venezuela;3;10-08N;066-47W;;;175;;
+SVMT;80;435;Maturin;;Venezuela;3;09-45N;063-11W;09-45N;063-11W;65;66;P
+SVPA;80;457;Puerto Ayacucho;;Venezuela;3;05-36N;067-30W;05-36N;067-30W;73;74;P
+SVPC;80;412;Pto. Cabello;;Venezuela;3;10-30N;068-00W;;;2;2;P
+SVPM;--;---;Paramillo Private ;;Venezuela;3;07-48N;072-12W;;;1000;;
+SVPR;--;---;Guayana / Manuel Car ;;Venezuela;3;08-18N;062-44W;;;144;;
+SVSA;80;447;San Antonio Del Tachira;;Venezuela;3;07-51N;072-27W;07-51N;072-27W;377;378;P
+SVSE;80;462;Santa Elena De Uairen;;Venezuela;3;04-36N;061-07W;04-36N;061-07W;907;907;P
+SVSO;80;475;Sto. Domingo;;Venezuela;3;07-35N;072-04W;;;327;327;P
+SVSP;--;---;San Felipe;;Venezuela;3;10-17N;068-45W;;;232;;
+SVSR;80;450;San Fernando De Apure;;Venezuela;3;07-54N;067-25W;07-52N;067-26W;47;48;P
+SVST;--;---;San Tome Private ;;Venezuela;3;08-57N;064-09W;;;262;;
+SVSZ;--;---;Santa Barbara Zulia;;Venezuela;3;08-59N;071-57W;;;10;;
+SVTM;80;453;Tumeremo;;Venezuela;3;07-18N;061-27W;07-18N;061-27W;180;181;P
+SVTR;80;478;Temblador;;Venezuela;3;09-01N;062-37W;;;30;30;P
+SVVA;80;472;Valencia;;Venezuela;3;10-10N;067-56W;;;430;431;P
+SVVG;--;---;El Vigia / Perez Alph;;Venezuela;3;08-38N;071-40W;;;100;;
+SVVL;80;426;Valera;;Venezuela;3;09-21N;070-37W;09-21N;070-37W;582;582;P
+SVVP;80;434;Valle De La Pascua;;Venezuela;3;09-13N;066-01W;;;125;;
+SWBC;82;113;Barcelos;;Brazil;3;00-59S;062-35W;;;40;;
+SYCJ;--;---;Georgetown/Cheddi Jagan International Airport;;Guyana;3;06-29N;058-15W;;;29;;
+SYGT;81;001;Georgetown;;Guyana;3;06-48N;058-09W;;;1;2;
+SYTM;81;002;Timehri Airport;;Guyana;3;06-30N;058-15W;;;28;30;
+TAKA;--;---;Takao Radar Site;;Japan;2;35-34N;133-14E;;;15;;
+TAPA;78;862;Vc Bird International Airport Antigua;;Antigua and Barbuda;4;17-07N;061-47W;;;8;10;
+TBPB;78;954;Grantley Adams;;Barbados;4;13-04N;059-29W;13-04N;059-30W;50;56;P
+TBPO;--;---;Bridgetown City ;;Barbados;4;13-06N;059-37W;;;50;;
+TDCF;78;906;Canefield Airport;;Dominica;4;15-32N;061-24W;;;5;5;
+TDPD;78;905;Melville Hall Airport;;Dominica;4;15-32N;061-18W;;;13;14;
+TDPR;78;907;Roseau;;Dominica;4;15-18N;061-24W;;;72;72;
+TFFF;78;925;Le Lamentin;;Martinique;4;14-36N;061-00W;14-36N;061-00W;5;7;P
+TFFJ;78;894;Gustavia, Saint Barthelemy;;Guadeloupe;4;17-54N;062-51W;17-54N;062-52W;48;52;P
+TFFR;78;897;Le Raizet, Guadeloupe;;Guadeloupe;4;16-16N;061-31W;16-16N;061-32W;11;11;P
+TGPY;78;958;Point Salines Airport;;Grenada;4;12-00N;061-47W;;;6;7;
+TIST;78;543;Charlotte Amalie St. Thomas, Cyril E. King Airport;;Virgin Islands;4;18-20N;064-59W;;;7;;
+TISX;78;547;Christiansted, Henry E. Rohlsen Airport;;Virgin Islands;4;17-42N;064-48W;17-42N;064-48W;20;17;
+TJBQ;78;514;Aquadilla, Rafael Hernandez Airport;PR;United States;4;18-30N;067-08W;18-30N;067-08W;72;69;
+TJMZ;--;---;Mayaguez, Eugenio Maria de Hostos Airport;PR;United States;4;18-16N;067-09W;;;9;;
+TJNR;78;535;Roosevelt Roads, Roosevelt Roads Naval Station, Ofstie Field;PR;United States;4;18-15-19N;065-38-36W;18-59-20N;065-38-20W;12;10;P
+TJPS;--;---;Ponce, Mercedita Airport;PR;United States;4;18-01N;066-34W;;;8;;
+TJSJ;--;---;San Juan, Luis Munoz Marin International Airport;PR;United States;4;18-27N;066-00W;;;3;;
+TKPK;78;858;Golden Rock;;Saint Kitts and Nevis;4;17-18N;062-41W;;;48;48;
+TKPN;78;859;Charlestown / Newcast;;Antigua and Barbuda;4;17-12N;062-35W;;;17;;
+TLPC;78;947;Vigie;;Saint Lucia;4;14-01N;061-00W;;;2;2;
+TLPL;78;948;Hewanorra International Airport;;Saint Lucia;4;13-45N;060-57W;;;3;10;
+TNCA;78;982;Queen Beatrix Airport;;Aruba;4;12-30N;070-01W;;;18;33;P
+TNCB;78;990;Flamingo Airport, Bonaire;;Netherlands Antilles;4;12-09N;068-17W;;;6;7;P
+TNCC;78;988;Hato Airport, Curacao;;Netherlands Antilles;4;12-12N;068-58W;12-12N;068-58W;9;67;P
+TNCE;78;873;Roosevelt Airport Saint Eustatius;;Netherlands Antilles;4;17-29N;062-59W;;;38;39;P
+TNCM;78;866;Juliana Airport, Saint Maarten;;Netherlands Antilles;4;18-03N;063-07W;18-03N;063-07W;4;9;P
+TQPF;--;---;Wallblake;;Anguilla;4;18-12-17N;063-03-18W;;;31;;
+TRPM;--;---;Blackburne / Plymouth;;Antigua and Barbuda;4;16-45N;062-10W;;;12;;
+TTCP;--;---;Crown Pt./ Scarborou;;Trinidad and Tobago;4;11-09N;060-51W;;;8;;
+TTPP;78;970;Piarco International Airport, Trinidad;;Trinidad and Tobago;4;10-37N;061-21W;10-35N;061-21W;12;15;P
+TTPT;78;962;Crown Point Airport, Tobago;;Trinidad and Tobago;4;11-09N;060-50W;11-09N;060-50W;3;6;P
+TUPJ;78;550;Beef Island, Tortola;;British Virgin Islands;4;18-27N;064-32W;;;4;;
+TVSV;78;951;Arnos Vale;;Saint Vincent and the Grenadines;4;13-08N;061-12W;;;9;13;
+TXKF;78;016;Bermuda;;Bermuda;4;32-22N;064-41W;;;6;;P
+UAAA;36;870;Almaty;;Kazakhstan;2;43-14N;076-56E;43-14N;076-56E;847;851;P
+UACC;--;---;Astana;;Kazakhstan;2;51-12N;071-27E;;;;;
+UAFM;--;---;Bishkek/Manas Airport;;Kyrgyzstan;2;42-51N;074-35E;;;;;
+UAII;38;328;Shymkent;;Kazakhstan;2;42-19N;069-42E;42-18N;069-36E;552;604;
+UAKK;35;394;Karaganda;;Kazakhstan;2;49-48N;073-09E;;;553;;
+UAOO;38;062;Kzyl-Orda;;Kazakhstan;2;44-51N;065-30E;44-46N;065-32E;129;130;P
+UARR;35;108;Uralsk;;Kazakhstan;2;51-15N;051-17E;51-15N;051-24E;36;37;P
+UATA;35;746;Aralskoe More;;Kazakhstan;2;46-47N;061-39E;46-47N;061-40E;56;62;P
+UATE;--;---;Aktau;;Kazakhstan;2;43-52-12N;051-06E;;;;;
+UATT;35;229;Aktjubinsk;;Kazakhstan;2;50-17N;057-09E;50-17N;057-09E;227;219;P
+UAUU;--;---;Kostanay;;Kazakhstan;2;53-12-23N;063-33-03E;;;182;;
+UBBB;37;864;Baku / Bine Airport;;Azerbaijan;6;40-27N;050-04E;40-27N;050-04E;-6;-1;
+UBBG;--;---;Gyanca Airport;;Azerbaijan;6;40-44N;046-24E;;;330;;
+UEEE;24;959;Jakutsk;;Russia;2;62-01N;129-43E;62-05N;129-45E;103;101;P
+UELL;30;393;Cul'Man;;Russia;2;56-50N;124-52E;56-50N;124-52E;859;858;P
+UERP;--;---;Polyarny;;Russia;2;66-24-02N;112-01-49E;;;509;;
+UERR;--;---;Mirny;;Russia;2;62-31-48N;114-01-48E;;;347;;
+UEST;--;---;Tiksi;;Russia;2;71-42N;128-54E;;;7;;
+UGEE;37;789;Yerevan;;Armenia;6;40-08N;044-28E;40-08N;044-28E;890;907;P
+UGGG;37;549;Tbilisi;;Georgia;6;41-41N;044-57E;41-41N;044-57E;467;490;
+UGMM;37;541;Muhrani;;Georgia;6;41-56N;044-35E;;;551;551;
+UHBP;31;329;Ekimchan;;Russia;2;53-04N;132-59E;53-04N;132-56E;543;542;P
+UHHH;31;735;Habarovsk;;Russia;2;48-31N;135-10E;48-31N;135-10E;72;76;P
+UHHO;31;655;Troickoe;;Russia;2;49-27N;136-34E;49-27N;136-34E;29;33;P
+UHMA;25;563;Anadyr;;Russia;2;64-47N;177-34E;64-47N;177-34E;62;61;P
+UHMD;25;594;Buhta Providenja;;Russia;2;64-25N;173-14W;64-26N;173-14W;3;17;P
+UHMG;--;---;Chaybukha;;Russia;2;61-57N;160-25E;;;;;
+UHMM;25;913;Magadan;;Russia;2;59-33N;150-47E;59-35N;150-47E;118;116;P
+UHPP;32;540;Petropavlovsk-Kamchatskij;;Russia;2;53-05N;158-35E;52-58N;158-45E;24;84;
+UHSS;32;150;Yuzhno-Sakhalinsk;;Russia;2;46-57N;142-43E;46-56N;142-44E;31;24;P
+UHWW;31;960;Vladivostok;;Russia;2;43-07N;131-56E;43-06N;131-54E;184;183;P
+UIAA;30;758;Chita;;Russia;2;52-05N;113-29E;52-01N;113-20E;685;671;P
+UIBB;--;---;Bratsk / Irkutsk;;Russia;2;56-22-15N;101-41-55E;;;490;;
+UIII;30;710;Irkutsk;;Russia;2;52-16N;104-19E;52-22N;104-11E;513;469;P
+UIIO;30;713;Ust'Ordynskij;;Russia;2;52-49N;104-46E;;;525;526;
+UIKB;30;253;Bodajbo;;Russia;2;57-51N;114-14E;57-51N;114-12E;278;275;
+UIKK;30;230;Kirensk;;Russia;2;57-46N;108-04E;57-46N;108-07E;258;259;P
+UINN;29;698;Nizhneudinsk;;Russia;2;54-53N;099-02E;54-53N;099-02E;410;411;P
+UIUH;30;739;Horinsk;;Russia;2;52-10N;109-47E;52-10N;109-46E;666;666;P
+UIUU;30;823;Ulan-Ude;;Russia;2;51-50N;107-36E;51-48N;107-26E;510;515;P
+UKBB;33;347;Boryspil;;Ukraine;6;50-20N;030-58E;;;121;122;
+UKCC;--;---;Donetsk;;Ukraine;6;48-05N;037-45E;;;;;
+UKDD;--;---;Dnipropetrovs'k;;Ukraine;6;48-32N;034-40E;;;;;
+UKDE;--;---;Zaporizhzhia / Mokraya;;Ukraine;6;47-52-02N;035-18-59E;;;114;;
+UKDR;--;---;Krivyy Rih / Dnipropetrovs'k;;Ukraine;6;48-03N;033-13-12E;;;;;
+UKFF;33;946;Simferopol;;Ukraine;6;44-41N;034-08E;45-09N;033-59E;180;181;P
+UKHH;34;300;Kharkiv;;Ukraine;6;49-58N;036-08E;49-56N;036-17E;154;155;P
+UKII;33;815;Kisinev;;Moldova;6;47-01N;028-59E;47-01N;028-52E;180;173;
+UKKE;--;---;Cherkasy;;Ukraine;6;49-24-58N;031-59-47E;;;114;;
+UKKK;33;345;Kyiv;;Ukraine;6;50-24N;030-34E;50-24N;030-27E;166;167;P
+UKKM;--;---;Hostomel;;Ukraine;6;50-36-01N;030-11-37E;;;157;;
+UKLI;--;---;Ivano-Frankivsk;;Ukraine;6;48-53-03N;024-41-10E;;;280;;
+UKLL;33;393;L'Viv;;Ukraine;6;49-49N;023-57E;49-49N;023-57E;319;323;P
+UKLN;--;---;Chernovsty;;Ukraine;6;48-15-36N;025-58-54E;;;252;;
+UKLR;33;301;Rivne;;Ukraine;6;50-35N;026-08E;;;231;;
+UKLU;--;---;Uzhhorod;;Ukraine;6;48-38-05N;022-15-53E;;;117;;
+UKON;--;---;Mykolaiv;;Ukraine;6;47-03-29N;031-55-15E;;;56;;
+UKOO;33;837;Odesa;;Ukraine;6;46-26N;030-46E;46-29N;030-38E;42;42;P
+ULAA;22;550;Arhangel'Sk;;Russia;6;64-30N;040-44E;64-35N;040-30E;13;8;P
+ULAK;22;887;Kotlas;;Russia;6;61-14N;046-43E;61-14N;046-38E;56;56;P
+ULLI;26;063;St. Peterburg;;Russia;6;59-58N;030-18E;59-58N;030-18E;4;6;P
+ULMM;22;113;Murmansk;;Russia;6;68-58N;033-03E;68-58N;033-03E;51;51;P
+ULOL;26;477;Velikie Luki;;Russia;6;56-21N;030-37E;56-23N;030-36E;98;106;P
+ULWT;27;051;Tot'Ma;;Russia;6;59-53N;042-45E;;;134;134;P
+ULWW;27;037;Vologda;;Russia;6;59-19N;039-55E;59-17N;039-52E;131;130;P
+UMBB;--;---;Brest;;Belarus;6;52-06-30N;023-53-48E;;;143;;
+UMGG;--;---;Gomel';;Belarus;6;52-31-36N;031-01-06E;;;144;;
+UMII;26;666;Vitebsk;;Belarus;6;55-10N;030-13E;55-10N;030-08E;176;176;P
+UMKK;--;---;Kaliningrad/Khrabrovo Airport;;Russia;6;54-43-12N;020-30E;;;21;;
+UMMG;--;---;Grodno;;Belarus;6;53-36-06N;024-03-18E;;;135;;
+UMMM;--;---;Loshitsa / Minsk International 1;;Belarus;6;53-51-54N;027-32-30E;;;228;;
+UMMS;26;850;Minsk;;Belarus;6;53-56N;027-38E;53-52N;027-32E;234;231;P
+UMRR;26;422;Riga;;Latvia;6;56-58N;024-03E;56-58N;024-04E;7;7;P
+UMRW;26;314;Ventspils;;Latvia;6;57-24N;021-32E;57-22N;021-33E;3;3;
+UNAA;--;---;Abakan;;Russia;2;53-45N;091-24E;;;245;;
+UNBB;29;838;Barnaul;;Russia;2;53-26N;083-31E;53-20N;083-42E;252;184;P
+UNEE;--;---;Kemerovo;;Russia;2;55-19-48N;086-04-48E;;;260;;
+UNII;29;263;Enisejsk;;Russia;2;58-27N;092-09E;58-27N;092-09E;78;79;P
+UNNN;29;634;Novosibirsk;;Russia;2;55-05N;082-54E;55-02N;082-54E;177;176;P
+UNOO;--;---;Omsk;;Russia;2;54-58N;073-18E;;;122;
+UNWW;--;---;Novokuznetsk;;Russia;2;53-44N;087-11E;;;308;;
+URKA;--;---;Anapa / Vitiazevo;;Russia;6;44-54N;037-19E;;;;;
+URKK;34;929;Krasnodar;;Russia;6;45-02N;039-09E;45-02N;039-09E;33;34;P
+URMM;37;054;Mineral'Nye Vody;;Russia;6;44-14N;043-04E;44-13N;043-06E;314;316;P
+URMN;--;---;Nalchik;;Russia;6;43-30-46N;043-38-12E;;;445;;
+URMT;--;---;Stavropol / Shpakovskoye;;Russia;6;45-20N;042-00E;;;;;
+URRR;34;731;Rostov-Na-Donu;;Russia;6;47-16N;039-49E;47-15N;039-49E;77;75;P
+URSS;37;171;Adler;;Russia;6;43-26N;039-54E;;;16;13;P
+URWA;--;---;Astrakhan;;Russia;6;46-17N;048-00-23E;;;0;;
+URWI;34;861;Elista;;Russia;6;46-22N;044-20E;46-19N;044-18E;150;155;
+URWW;34;560;Volgograd;;Russia;6;48-47N;044-22E;48-41N;044-21E;145;134;P
+USCC;--;---;Chelyabinsk-Balandino;;Russia;2;55-10N;061-24E;;;;;
+USHH;23;933;Hanty-Mansijsk;;Russia;2;61-01N;069-02E;60-58N;069-04E;40;46;P
+USNN;--;---;Nizhnevartovsk;;Russia;2;60-56N;076-29E;;;54;;
+USPP;--;---;Perm'/Bolshoe Savino;;Russia;2;58-00N;056-15E;;;170;;
+USRR;23;849;Surgut;;Russia;2;61-15N;073-30E;61-15N;073-30E;44;56;P
+USSS;28;440;Ekaterinburg;;Russia;2;56-50N;060-38E;56-48N;060-38E;237;283;P
+UTAA;--;---;Ashgabat;;Turkmenistan;2;37-59N;058-22E;;;;;
+UTDD;38;836;Dushanbe;;Tajikistan;2;38-33N;068-47E;38-35N;068-47E;803;800;P
+UTED;38;579;Dzizak;;Uzbekistan;2;40-07N;067-50E;;;345;345;P
+UTNN;--;---;Nukus / Karakalpakstan;;Uzbekistan;2;42-28-48N;059-37-48E;;;;;
+UTNU;--;---;Urgench;;Uzbekistan;2;41-35N;060-38-42E;;;98;;
+UTSM;38;413;Tamdy;;Uzbekistan;2;41-44N;064-37E;41-44N;064-37E;238;237;P
+UTSS;38;696;Samarkand;;Uzbekistan;2;39-34N;066-57E;39-41N;066-57E;724;724;P
+UTST;38;927;Termez;;Uzbekistan;2;37-14N;067-16E;37-17N;067-19E;302;310;P
+UTTT;38;457;Tashkent;;Uzbekistan;2;41-16N;069-16E;41-16N;069-16E;489;488;P
+UUBP;26;898;Brjansk;;Russia;6;53-15N;034-19E;53-14N;034-23E;217;216;P
+UUDD;--;---;Moscow / Domodedovo;;Russia;6;55-24N;037-54E;;;179;;
+UUEE;--;---;Moscow / Sheremet'Ye ;;Russia;6;55-59N;037-30E;;;190;;
+UUEM;27;402;Tver;;Russia;6;56-54N;035-53E;;;137;146;P
+UUOO;34;122;Voronez;;Russia;6;51-39N;039-15E;51-40N;039-16E;154;104;
+UUWW;--;---;Moscow / Vnukovo ;;Russia;6;55-39N;037-16E;;;203;;
+UUYT;23;803;Ust'- Kulom;;Russia;2;61-41N;053-41E;;;139;144;P
+UUYY;23;804;Syktyvkar;;Russia;2;61-43N;050-50E;61-40N;050-51E;119;119;P
+UWGG;--;---;Nizhny Novgorod/Strigino;;Russia;6;56-19-48N;044-00E;;;;;
+UWKD;--;---;Kazan';;Russia;6;55-47N;049-12E;;;;;
+UWLW;--;---;Ulyanovsk;;Russia;6;54-21N;048-23E;;;;;
+UWOO;--;---;Orenburg / Tsentralny;;Russia;2;51-46-48N;055-07-12E;;;109;;
+UWPP;27;962;Penza;;Russia;6;53-07N;045-01E;53-08N;045-01E;174;177;P
+UWSS;--;---;Saratov / Tsentralny;;Russia;6;51-34-12N;046-04-12E;;;166;;
+UWUU;--;---;Ufa;;Russia;2;54-43-48N;055-55-48E;;;;;
+UWWW;28;900;Samara;;Russia;2;53-12N;050-09E;;;44;;
+VAAH;42;647;Ahmadabad;;India;2;23-04N;072-38E;23-04N;072-38E;55;55;P
+VAAK;42;934;Akola;;India;2;20-42N;077-04E;;;305;309;P
+VAAU;43;014;Aurangabad Chikalthan Aerodrome;;India;2;19-51N;075-24E;19-51N;075-24E;582;579;P
+VABB;43;003;Bombay / Santacruz;;India;2;19-07N;072-51E;19-05N;072-51E;8;14;P
+VABI;42;080;Bilaspur;;India;2;31-15N;076-40E;;;589;587;P
+VABJ;42;634;Bhuj-Rudramata;;India;2;23-15N;069-40E;23-17N;069-40E;78;80;P
+VABM;43;198;Belgaum / Sambra;;India;2;15-51N;074-37E;;;758;747;P
+VABP;42;667;Bhopal / Bairagarh;;India;2;23-17N;077-21E;23-17N;077-21E;523;523;P
+VABV;42;838;Bhaunagar;;India;2;21-45N;072-12E;;;5;11;
+VAGO;43;194;Goa / Dabolim Airport;;India;2;15-23N;073-49E;;;42;52;
+VAID;42;754;Indore;;India;2;22-43N;075-48E;22-43N;075-48E;561;567;P
+VAJB;42;675;Jabalpur;;India;2;23-12N;079-57E;23-10N;079-57E;391;393;P
+VAKD;42;855;Khandwa;;India;2;21-50N;076-22E;;;317;318;
+VAKP;43;157;Kolhapur;;India;2;16-42N;074-14E;;;569;570;
+VANP;42;867;Nagpur Sonegaon;;India;2;21-06N;079-03E;21-06N;079-03E;308;310;P
+VARK;42;737;Rajkot;;India;2;22-18N;070-47E;;;134;138;P
+VASL;43;117;Sholapur;;India;2;17-40N;075-54E;;;477;479;P
+VBBM;48;019;Bhamo;;Myanmar;2;24-16N;097-12E;;;111;113;
+VBBS;48;094;Pathein;;Myanmar;2;16-46N;094-46E;16-46N;094-46E;9;10;P
+VBCI;48;109;Coco Island;;Myanmar;2;14-07N;093-22E;14-07N;093-22E;2;3;P
+VBHL;48;010;Homalin;;Myanmar;2;24-52N;094-55E;;;130;131;
+VBKG;48;060;Kengtung;;Myanmar;2;21-18N;099-37E;21-18N;099-37E;827;828;
+VBKP;48;071;Kyaukpyu;;Myanmar;2;19-25N;093-33E;;;5;5;
+VBLS;48;035;Lashio;;Myanmar;2;22-56N;097-45E;;;747;749;
+VBMK;48;008;Myitkyina;;Myanmar;2;25-22N;097-24E;25-22N;097-24E;145;147;P
+VBML;48;053;Meiktila;;Myanmar;2;20-50N;095-50E;20-53N;095-54E;214;220;P
+VBMM;48;103;Moulmein;;Myanmar;2;16-30N;097-37E;16-30N;097-37E;21;22;
+VBPA;48;099;Hpa-An;;Myanmar;2;16-45N;097-40E;;;9;10;
+VBPR;48;077;Prome;;Myanmar;2;18-48N;095-13E;;;58;60;
+VBPT;48;001;Putao;;Myanmar;2;27-20N;097-25E;;;409;;
+VBRM;48;042;Mandalay;;Myanmar;2;21-59N;096-06E;21-59N;096-06E;74;76;
+VBRN;48;110;Mergui;;Myanmar;2;12-26N;098-36E;12-26N;098-36E;36;37;P
+VBRR;48;096;Mingaladon;;Myanmar;2;16-54N;096-11E;16-54N;096-11E;28;29;
+VBSY;48;080;Sandoway;;Myanmar;2;18-28N;094-21E;18-28N;094-21E;9;11;P
+VBTV;48;108;Dawei;;Myanmar;2;14-06N;098-13E;14-06N;098-13E;16;17;P
+VCBI;43;450;Katunayake;;Sri Lanka;2;07-10N;079-53E;;;8;8;P
+VCCA;43;421;Anuradhapura;;Sri Lanka;2;08-20N;080-25E;;;89;89;P
+VCCB;43;436;Batticaloa;;Sri Lanka;2;07-43N;081-42E;;;5;12;P
+VCCC;43;467;Ratmalana;;Sri Lanka;2;06-49N;079-53E;;;5;5;P
+VCCT;43;418;Trincomalee;;Sri Lanka;2;08-35N;081-15E;08-35N;081-15E;3;7;P
+VDKC;48;995;Kompong-Cham;;Cambodia;2;12-00N;105-27E;12-00N;105-27E;16;16;
+VDPP;48;991;Phnom-Penh / Pochentong;;Cambodia;2;11-33N;104-51E;11-33N;104-51E;10;10;P
+VDSR;48;966;Siemreap;;Cambodia;2;13-22N;103-51E;13-22N;103-51E;15;15;P
+VEAT;42;724;Agartala;;India;2;23-53N;091-15E;23-53N;091-15E;15;16;P
+VEBD;42;398;Siliguri;;India;2;26-38N;088-19E;26-41N;088-20E;126;131;P
+VEBS;42;971;Bhubaneswar;;India;2;20-15N;085-50E;20-15N;085-50E;45;46;P
+VECC;42;809;Calcutta / Dum Dum;;India;2;22-39N;088-27E;22-39N;088-27E;4;6;P
+VECX;43;368;Car Nicobar;;India;2;09-09N;092-49E;09-09N;092-49E;10;14;P
+VEGK;42;379;Gorakhpur;;India;2;26-45N;083-22E;26-45N;083-22E;76;77;P
+VEGT;42;410;Gauhati;;India;2;26-06N;091-35E;26-06N;091-35E;47;54;P
+VEGY;42;591;Gaya;;India;2;24-45N;084-57E;24-45N;084-57E;110;116;P
+VEIM;42;623;Imphal Tulihal;;India;2;24-46N;093-54E;24-46N;093-54E;780;781;P
+VEJH;42;886;Jharsuguda;;India;2;21-55N;084-05E;21-55N;084-05E;228;230;P
+VEJS;42;798;Jamshedpur;;India;2;22-49N;086-11E;22-49N;086-11E;140;142;P
+VELR;42;309;North Lakhimpur;;India;2;27-14N;094-07E;;;101;102;P
+VEMN;42;314;Dibrugarh / Mohanbari;;India;2;27-29N;095-01E;27-29N;095-01E;110;111;P
+VEPB;43;333;Port Blair;;India;2;11-40N;092-43E;11-40N;092-43E;73;79;P
+VEPT;42;492;Patna;;India;2;25-36N;085-06E;25-36N;085-06E;51;60;P
+VERC;42;701;M. O. Ranchi;;India;2;23-19N;085-19E;23-19N;085-19E;652;652;
+VGCB;41;992;Cox's Bazar;;Bangladesh;2;21-26N;091-58E;21-26N;091-58E;2;4;P
+VGEG;41;978;Chittagong Patenga ;;Bangladesh;2;22-16N;091-49E;22-15N;091-49E;4;6;P
+VGIS;41;907;Ishurdi;;Bangladesh;2;24-08N;089-03E;24-09N;089-02E;13;14;P
+VGJR;41;936;Jessore;;Bangladesh;2;23-11N;089-10E;23-11N;089-10E;6;7;P
+VGRJ;41;895;Rajshahi;;Bangladesh;2;24-22N;088-42E;24-22N;088-42E;17;20;P
+VGSY;41;891;Sylhet;;Bangladesh;2;24-54N;091-53E;24-54N;091-53E;34;35;P
+VGTJ;41;923;Dhaka;;Bangladesh;2;23-46N;090-23E;23-46N;090-23E;8;9;P
+VGZR;41;922;Kurmitola, Dia;;Bangladesh;2;23-51N;090-24E;;;9;10;P
+VHCH;45;001;Cheung Chau;;Hong Kong;2;22-12N;114-01E;;;79;;
+VHHH;45;007;Hong Kong Inter-National Airport;;Hong Kong;2;22-20N;114-11E;;;5;24;
+VIAG;42;260;Agra;;India;2;27-09N;077-58E;27-09N;077-58E;168;169;P
+VIAL;42;475;Allahabad / Bamhrauli;;India;2;25-27N;081-44E;25-27N;081-44E;97;98;P
+VIAR;42;071;Amritsar;;India;2;31-38N;074-52E;31-42N;074-48E;229;234;P
+VIBN;42;479;Varanasi / Babatpur;;India;2;25-27N;082-52E;;;81;85;
+VIBY;42;189;Bareilly;;India;2;28-22N;079-24E;28-22N;079-24E;167;169;P
+VICX;42;367;Kanpur / Chakeri;;India;2;26-24N;080-24E;26-24N;080-24E;123;126;
+VIDD;42;182;New Delhi / Safdarjung;;India;2;28-35N;077-12E;28-35N;077-12E;211;216;P
+VIDP;42;181;New Delhi / Palam;;India;2;28-34N;077-07E;;;220;233;
+VIGR;42;361;Gwalior;;India;2;26-14N;078-15E;26-14N;078-15E;205;207;P
+VIHR;42;131;Hissar;;India;2;29-10N;075-44E;;;216;221;P
+VIJN;42;463;Jhansi;;India;2;25-27N;078-35E;;;250;251;
+VIJO;42;339;Jodhpur;;India;2;26-18N;073-01E;26-18N;073-01E;217;224;P
+VIJP;42;348;Jaipur / Sanganer;;India;2;26-49N;075-48E;26-49N;075-48E;385;390;P
+VIKO;42;452;Kota Aerodrome;;India;2;25-09N;075-51E;;;273;274;P
+VILK;42;369;Lucknow / Amausi;;India;2;26-45N;080-53E;26-45N;080-53E;122;128;P
+VIST;42;571;Satna;;India;2;24-34N;080-50E;;;315;317;P
+VIUD;42;542;Udaipur Dabok;;India;2;24-37N;073-53E;24-37N;073-53E;509;514;
+VLAP;48;957;Attopeu;;Laos;2;14-48N;106-50E;;;105;105;
+VLIP;48;955;Pakse;;Laos;2;15-07N;105-10E;15-08N;105-47E;102;102;P
+VLLB;48;930;Luang-Prabang;;Laos;2;19-53N;102-08E;;;305;305;P
+VLSB;48;938;Sayaboury;;Laos;2;19-14N;101-44E;19-14N;101-44E;326;326;
+VLSK;48;947;Savannakhet;;Laos;2;16-33N;104-39E;;;155;145;P
+VLSV;48;952;Saravane;;Laos;2;15-41N;106-26E;;;168;168;P
+VLTK;48;946;Thakhek;;Laos;2;17-23N;104-39E;;;52;152;
+VLVT;48;940;Vientiane;;Laos;2;17-57N;102-34E;17-59N;102-34E;171;171;P
+VMMC;45;011;Taipa;;Macau;2;22-10N;113-34E;;;114;;P
+VNBW;44;438;Bhairawa Airport;;Nepal;2;27-31N;083-27E;;;109;109;
+VNJL;44;424;Jumla;;Nepal;2;29-17N;082-10E;;;2300;;
+VNKT;44;454;Kathmandu Airport;;Nepal;2;27-42N;085-22E;27-42N;085-22E;1337;1337;
+VNPK;44;434;Pokhara Airport;;Nepal;2;28-13N;084-00E;;;827;827;
+VNSI;44;449;Simra Airport;;Nepal;2;27-10N;084-59E;;;137;137;
+VNSK;44;416;Surkhet;;Nepal;2;28-36N;081-37E;;;720;720;
+VNTJ;44;474;Taplejung;;Nepal;2;27-21N;087-40E;;;1732;1732;
+VNVT;44;478;Biratnagar Airport;;Nepal;2;26-29N;087-16E;;;72;72;
+VOBG;--;---;Bangalore / Hindustan;;India;2;12-57N;077-40E;;;888;;
+VOBI;43;205;Bellary;;India;2;15-09N;076-51E;;;448;449;
+VOBZ;43;181;Vijayawada / Gannavaram;;India;2;16-32N;080-48E;16-32N;080-48E;21;24;
+VOCB;43;321;Coimbatore / Peelamedu;;India;2;11-02N;077-03E;;;396;399;P
+VOCC;43;353;Cochin / Willingdon;;India;2;09-57N;076-16E;09-56N;076-14E;1;3;P
+VOCP;43;241;Cuddapah;;India;2;14-29N;078-50E;;;129;130;
+VOHY;43;128;Hyderabad Airport;;India;2;17-27N;078-28E;17-27N;078-28E;530;545;
+VOMD;43;360;Madurai;;India;2;09-50N;078-05E;;;139;131;
+VOML;43;284;Mangalore / Bajpe;;India;2;12-55N;074-53E;12-58N;074-54E;102;102;P
+VOMM;43;279;Madras / Minambakkam;;India;2;13-00N;080-11E;13-00N;080-11E;10;16;P
+VOTR;43;344;Tiruchchirapalli;;India;2;10-46N;078-43E;10-46N;078-43E;85;88;P
+VOTV;43;372;Thiruvananthapuram;;India;2;08-28N;076-57E;;;4;8;
+VOVR;43;303;Vellore;;India;2;12-55N;079-09E;;;213;214;
+VRGN;43;599;Gan;;Maldives;2;00-41S;073-09E;00-41S;073-09E;2;2;
+VRMM;43;555;Male;;Maldives;2;04-12N;073-32E;04-12N;073-32E;2;2;
+VTBC;48;480;Chanthaburi;;Thailand;2;12-36N;102-07E;12-36N;102-07E;3;4;P
+VTBD;48;456;Don Muang;;Thailand;2;13-55N;100-36E;13-55N;100-36E;4;12;P
+VTBG;48;450;Kanchanaburi;;Thailand;2;14-01N;099-32E;;;28;29;P
+VTBI;48;430;Prachin Buri;;Thailand;2;14-03N;101-22E;;;5;6;P
+VTBJ;48;465;Phetchaburi;;Thailand;2;13-09N;100-04E;;;2;4;P
+VTBP;48;500;Prachuap Khirikhan;;Thailand;2;11-50N;099-50E;11-48N;099-48E;4;5;P
+VTBS;48;459;Chon Buri;;Thailand;2;13-22N;100-59E;;;1;2;P
+VTBU;48;478;Rayong;;Thailand;2;12-38N;101-21E;12-38N;101-21E;3;5;P
+VTCC;48;327;Chiang Mai;;Thailand;2;18-47N;098-59E;18-47N;098-59E;312;314;P
+VTCH;48;300;Mae Hong Son;;Thailand;2;19-18N;097-50E;;;267;269;P
+VTCL;48;328;Lampang;;Thailand;2;18-17N;099-31E;18-16N;099-30E;241;242;P
+VTCN;48;331;Nan;;Thailand;2;18-46N;100-46E;;;200;201;P
+VTCP;48;330;Phrae;;Thailand;2;18-10N;100-10E;;;161;162;P
+VTCR;48;303;Chiang Rai;;Thailand;2;19-55N;099-50E;;;394;395;P
+VTCS;48;325;Mae Sariang;;Thailand;2;18-10N;097-56E;;;212;213;P
+VTPH;48;475;Hua Hin;;Thailand;2;12-35N;099-57E;;;5;6;P
+VTPM;48;375;Mae Sot;;Thailand;2;16-40N;098-33E;16-42N;098-33E;196;197;P
+VTPN;48;400;Nakhon Sawan;;Thailand;2;15-48N;100-10E;15-40N;100-08E;34;35;P
+VTPS;48;378;Phitsanulok;;Thailand;2;16-47N;100-16E;16-49N;100-16E;44;45;P
+VTPT;48;376;Tak;;Thailand;2;16-53N;099-09E;;;121;124;P
+VTPU;48;351;Uttaradit;;Thailand;2;17-37N;100-06E;17-37N;100-06E;63;64;P
+VTSA;48;570;Satun;;Thailand;2;06-39N;100-05E;;;4;6;P
+VTSB;48;551;Surat Thani;;Thailand;2;09-07N;099-21E;09-07N;099-21E;10;11;P
+VTSD;48;517;Chumphon;;Thailand;2;10-29N;099-11E;;;3;5;P
+VTSH;48;568;Songkhla;;Thailand;2;07-12N;100-36E;07-12N;100-36E;4;5;P
+VTSK;48;580;Pattani;;Thailand;2;06-47N;101-09E;06-47N;101-09E;5;9;P
+VTSN;48;552;Nakhon Si Thammarat;;Thailand;2;08-28N;099-58E;;;7;9;P
+VTSP;48;565;Phuket Airport;;Thailand;2;08-07N;098-19E;08-06N;098-18E;6;10;P
+VTSR;48;532;Ranong;;Thailand;2;09-59N;098-37E;09-58N;098-38E;7;8;P
+VTSS;48;569;Hat Yai;;Thailand;2;06-55N;100-26E;06-56N;100-25E;27;35;P
+VTST;48;567;Trang;;Thailand;2;07-31N;099-37E;;;14;16;P
+VTUB;48;383;Mukdahan;;Thailand;2;16-32N;104-43E;;;138;139;P
+VTUC;48;403;Chaiyaphum;;Thailand;2;15-48N;102-02E;15-48N;102-02E;182;183;P
+VTUD;48;354;Udon Thani;;Thailand;2;17-23N;102-48E;17-23N;102-48E;177;182;P
+VTUK;48;381;Khon Kaen;;Thailand;2;16-26N;102-50E;;;165;166;P
+VTUL;48;353;Loei;;Thailand;2;17-27N;101-44E;;;253;254;P
+VTUM;48;352;Nong Khai;;Thailand;2;17-52N;102-43E;;;174;175;P
+VTUN;48;431;Nakhon Ratchasima;;Thailand;2;14-58N;102-05E;14-58N;102-05E;187;188;P
+VTUP;48;357;Nakhon Phanom;;Thailand;2;17-25N;104-47E;17-25N;104-47E;146;148;P
+VTUR;48;405;Roi Et;;Thailand;2;16-03N;103-41E;;;140;142;P
+VTUS;48;356;Sakon Nakhon;;Thailand;2;17-09N;104-08E;;;171;172;P
+VTUU;48;407;Ubon Ratchathani;;Thailand;2;15-15N;104-52E;15-15N;104-52E;123;127;P
+VVDN;48;855;Da Nang;;Vietnam;2;16-02N;108-11E;16-02N;108-11E;7;7;P
+VVGL;--;---;Hanoi / Gialam;;Vietnam;2;21-02N;105-51E;;;12;;
+VVNB;48;820;Ha Noi;;Vietnam;2;21-01N;105-48E;21-01N;105-48E;6;6;P
+VVNT;48;877;Nha Trang;;Vietnam;2;12-15N;109-12E;12-15N;109-12E;10;10;P
+VVPB;48;852;Hue;;Vietnam;2;16-24N;107-41E;;;17;17;P
+VVPK;48;866;Pleiku City;;Vietnam;2;13-59N;108-00E;13-59N;108-00E;801;801;
+VVQN;48;870;Quy Nhon;;Vietnam;2;13-46N;109-13E;13-46N;109-13E;6;6;P
+VVTS;48;900;Ho Chi Minh;;Vietnam;2;10-49N;106-40E;10-49N;106-40E;19;19;P
+VVVH;48;845;Vinh;;Vietnam;2;18-42N;105-40E;;;6;6;P
+VYSW;48;062;Sittwe;;Myanmar;2;20-08N;092-53E;20-08N;092-53E;4;5;P
+VYYY;48;097;Yangon;;Myanmar;2;16-46N;096-10E;16-46N;096-10E;14;15;P
+WAAA;97;180;Ujung Pandang / Hasanuddin;;Indonesia;5;05-04S;119-33E;05-04S;119-33E;14;14;P
+WAAB;97;192;Bau-Bau / Beto Ambiri;;Indonesia;5;05-28S;122-37E;05-28S;122-37E;2;2;
+WAAU;97;146;Kendari / Woltermon-Ginsidi;;Indonesia;5;04-06S;122-26E;04-05S;122-25E;50;50;P
+WABB;97;560;Biak / Mokmer;;Indonesia;5;01-11S;136-07E;01-12S;136-07E;11;11;P
+WABI;97;682;Nabire;;Indonesia;5;03-20S;135-30E;;;3;3;P
+WABN;97;796;Kokonao / Timuka;;Indonesia;5;04-43S;136-26E;;;3;3;P
+WABO;97;570;Serui / Yendosa;;Indonesia;5;01-52S;136-14E;;;3;3;P
+WABT;97;780;Enarotali;;Indonesia;5;03-55S;136-22E;03-55S;136-22E;1770;1770;P
+WAJI;97;580;Sarmi;;Indonesia;5;01-50S;138-43E;01-50S;138-43E;3;3;P
+WAJJ;97;690;Jayapura / Sentani;;Indonesia;5;02-34S;140-29E;02-35S;140-31E;99;99;P
+WAJW;97;686;Wamena / Wamena;;Indonesia;5;04-04S;138-57E;04-06S;138-57E;1660;1660;P
+WAKK;97;980;Merauke / Mopah;;Indonesia;5;08-28S;140-23E;08-31S;140-25E;3;3;P
+WAKT;97;876;Tanah Merah / Tanah Merah;;Indonesia;5;06-06S;140-18E;;140-18E;16;16;P
+WAMA;97;406;Galela / Gamarmalamu;;Indonesia;5;01-49N;127-50E;;;8;;
+WAMG;97;048;Gorontalo / Jalaluddin;;Indonesia;5;00-31N;123-04E;00-38N;122-51E;2;2;P
+WAMH;97;008;Tahuna;;Indonesia;5;03-35N;125-28E;03-35N;125-28E;38;38;
+WAMI;97;028;Toli-Toli / Lalos;;Indonesia;5;01-01N;120-48E;01-01N;120-48E;2;2;
+WAML;97;072;Palu / Mutiara;;Indonesia;5;00-41S;119-44E;00-55S;119-54E;6;6;P
+WAMM;97;014;Menado / Dr. Sam Ratulangi;;Indonesia;5;01-32N;124-55E;01-33N;124-56E;80;80;P
+WAMP;97;096;Poso / Kasiguncu;;Indonesia;5;01-23S;120-44E;01-24S;120-43E;2;2;P
+WAMT;97;430;Ternate / Babullah;;Indonesia;5;00-47N;127-23E;00-50N;127-23E;23;23;P
+WAMW;97;086;Luwuk / Bubung;;Indonesia;5;00-54S;122-47E;00-54S;122-47E;2;2;P
+WAPA;97;722;Amahai;;Indonesia;5;03-21S;128-53E;;;10;10;
+WAPH;97;460;Labuha / Taliabu;;Indonesia;5;01-37S;124-33E;01-37S;124-33E;3;3;
+WAPI;97;900;Saumlaki;;Indonesia;5;07-59S;131-18E;07-59S;131-18E;24;24;P
+WAPN;97;600;Sanana;;Indonesia;5;02-05S;126-00E;02-05S;126-00E;2;2;P
+WAPP;97;724;Ambon / Pattimura;;Indonesia;5;03-42S;128-05E;03-42S;128-05E;12;12;P
+WAPR;97;700;Namlea;;Indonesia;5;03-15S;127-05E;;;20;20;
+WASF;97;630;Fak-Fak / Torea;;Indonesia;5;02-53S;132-15E;;;130;130;P
+WASK;97;760;Kaimana / Utarom;;Indonesia;5;03-40S;133-45E;03-40S;133-45E;3;3;P
+WASR;97;530;Manokwari / Rendani;;Indonesia;5;00-53S;134-03E;00-53S;134-03E;3;3;P
+WASS;97;502;Sorong / Jefman;;Indonesia;5;00-56S;131-07E;00-56S;131-07E;3;3;P
+WBGB;96;441;Bintulu;;Malaysia;5;03-12N;113-02E;03-12N;113-02E;2;5;P
+WBGG;96;413;Kuching;;Malaysia;5;01-29N;110-20E;01-29N;110-20E;27;27;P
+WBGR;96;449;Miri;;Malaysia;5;04-20N;113-59E;;;17;18;P
+WBGS;96;421;Sibu;;Malaysia;5;02-20N;111-50E;;;8;8;P
+WBKK;96;471;Kota Kinabalu;;Malaysia;5;05-56N;116-03E;05-57N;116-03E;3;3;P
+WBKL;96;465;Labuan;;Malaysia;5;05-18N;115-15E;05-17N;115-14E;30;30;P
+WBKS;96;491;Sandakan;;Malaysia;5;05-54N;118-04E;05-54N;118-04E;12;13;P
+WBKT;96;477;Kudat;;Malaysia;5;06-55N;116-50E;06-55N;116-50E;3;5;P
+WBKW;96;481;Tawau;;Malaysia;5;04-16N;117-53E;04-16N;117-52E;18;20;P
+WBSB;96;315;Brunei Airport;;Brunei;5;04-56N;114-56E;04-56N;114-56E;22;15;
+WIAA;96;001;Sabang / Cut Bau;;Indonesia;5;05-52N;095-19E;05-52N;095-19E;126;126;P
+WIAG;96;273;Menggala / Astra Ksetra;;Indonesia;5;04-27S;105-11E;04-37S;105-13E;19;19;
+WIAM;96;801;Tasikmalaya / Cibeureum;;Indonesia;5;07-20S;108-15E;07-21S;108-15E;335;335;P
+WIAR;96;881;Madiun / Iswahyudi;;Indonesia;5;07-37S;111-31E;07-37S;111-26E;110;110;P
+WIAS;96;947;Malang / Abdul Rahkmansaleh;;Indonesia;5;07-58S;112-42E;07-56S;112-43E;526;526;P
+WIBB;96;109;Pakanbaru / Simpangtiga;;Indonesia;5;00-28N;101-27E;00-28N;101-27E;31;31;P
+WIIA;96;739;Curug / Budiarto;;Indonesia;5;06-14S;106-39E;06-17S;106-34E;46;46;P
+WIIB;96;781;Bandung / Husein;;Indonesia;5;06-54S;107-35E;06-54S;107-35E;740;740;P
+WIIH;96;747;Jakarta Halim Perdanakusuma;;Indonesia;5;06-15S;106-54E;;;30;30;P
+WIII;96;749;Jakarta / Soekarno-Hatta;;Indonesia;5;06-07S;106-39E;06-08S;106-40E;8;8;
+WIIJ;96;853;Jogyakarta / Adisucipto;;Indonesia;5;07-47S;110-26E;07-47S;110-26E;107;107;P
+WIIK;96;773;Kalijati;;Indonesia;5;06-33S;107-40E;06-33S;107-40E;110;110;
+WIIL;96;805;Cilacap;;Indonesia;5;07-44S;109-01E;07-44S;109-01E;6;6;P
+WIIS;96;839;Semarang / Ahmadyani;;Indonesia;5;06-59S;110-23E;06-59S;110-23E;3;3;P
+WIIT;96;295;Telukbetung / Beranti;;Indonesia;5;05-16S;105-11E;05-14S;105-11E;96;96;P
+WIKB;96;087;Batan, Sumatra;;Indonesia;5;01-07N;104-07E;;;24;;
+WIKD;96;249;Tanjungpandan / Buluh Tumbang;;Indonesia;5;02-45S;107-45E;02-45S;107-46E;44;44;P
+WIKK;96;237;Pangkalpinang / Pangkalpinang;;Indonesia;5;02-10S;106-08E;02-10S;106-08E;33;33;P
+WIKN;96;091;Tanjungpinang / Kijang;;Indonesia;5;00-55N;104-32E;00-55N;104-32E;18;18;P
+WIKS;96;179;Singkep / Dabo;;Indonesia;5;00-29S;104-35E;00-29S;104-35E;31;31;P
+WIMB;96;075;Gunung Sitoli / Binaka;;Indonesia;5;01-30N;097-38E;01-30N;097-38E;6;6;P
+WIMG;96;163;Padang / Tabing;;Indonesia;5;00-53S;100-21E;00-53S;100-21E;3;3;P
+WIMM;96;035;Medan / Polonia;;Indonesia;5;03-34N;098-41E;03-34N;098-40E;25;25;P
+WIMS;96;073;Sibolga / Pinangsori;;Indonesia;5;01-33N;098-53E;01-33N;098-54E;3;3;P
+WIOI;96;533;Singkawang Ii;;Indonesia;5;01-05N;109-40E;01-05N;109-40E;38;38;
+WIOK;96;615;Ketapang / Rahadi Usmaman;;Indonesia;5;01-51S;109-58E;;;9;9;
+WION;96;147;Ranai / Ranai;;Indonesia;5;03-57N;108-23E;03-55N;108-23E;2;2;P
+WIOO;96;581;Pontianak / Supadio;;Indonesia;5;00-09S;109-24E;00-09S;109-24E;3;3;P
+WIOS;96;559;Sintang;;Indonesia;5;00-07N;111-32E;;;30;30;
+WIPA;96;195;Jambi / Sultan Taha;;Indonesia;5;01-38S;103-39E;01-38S;103-39E;25;25;P
+WIPH;96;207;Kerinci / Depati Parbo;;Indonesia;5;02-46S;101-22E;;101-22E;782;782;
+WIPL;96;253;Bengkulu / Padangkemiling;;Indonesia;5;03-53S;102-20E;03-52S;102-21E;16;16;P
+WIPP;96;221;Palembang / Talangbetutu;;Indonesia;5;02-54S;104-42E;02-54S;104-42E;10;10;P
+WIPR;96;171;Rengat / Japura;;Indonesia;5;00-28N;102-19E;00-21S;102-20E;46;46;P
+WITC;96;015;Meulaboh / Cut Nyak Dhien;;Indonesia;5;04-15N;096-07E;04-15N;096-07E;90;90;
+WITM;96;009;Lhokseumawe / Malikussaleh;;Indonesia;5;05-14N;097-12E;05-14N;097-12E;87;87;P
+WITT;96;011;Banda Aceh / Blangbintang;;Indonesia;5;05-31N;095-25E;05-31N;095-25E;21;21;P
+WMBA;48;620;Sitiawan;;Malaysia;5;04-13N;100-42E;04-13N;100-42E;7;8;P
+WMKC;48;615;Kota Bharu;;Malaysia;5;06-10N;102-17E;06-10N;102-17E;5;5;P
+WMKD;48;657;Kuantan;;Malaysia;5;03-37N;103-13E;03-47N;103-13E;18;16;P
+WMKJ;48;679;Johore Bharu / Senai;;Malaysia;5;01-38N;103-40E;;;37;40;P
+WMKK;48;647;Sepang/KL International Airport;;Malaysia;5;02-44N;101-42E;03-07N;101-33E;21;22;P
+WMKL;48;600;Langkawi;;Malaysia;5;06-20N;099-44E;06-20N;099-44E;8;7;P
+WMKM;48;665;Malacca;;Malaysia;5;02-16N;102-15E;;;11;9;P
+WMKP;48;601;Penang / Bayan Lepas;;Malaysia;5;05-18N;100-16E;05-18N;100-16E;3;4;P
+WMSA;--;---;Subang/Sultan Abdul Aziz Shah Airport;;Malaysia;5;03-07N;101-32E;;;27;;
+WPDL;97;390;Dilli / Dilli Airport;;East Timor;5;08-34S;125-34E;08-33S;125-33E;6;6;P
+WPEC;97;395;Baucau;;East Timor;5;08-30S;126-24E;08-30S;126-24E;522;522;
+WPOC;97;385;Oe-Cusse / Oe Cusse;;East Timor;5;09-12S;124-22E;;124-22E;5;5;P
+WRBB;96;685;Banjarmasin / Syamsuddin Noor;;Indonesia;5;03-26S;114-45E;03-27S;114-46E;20;20;P
+WRBI;96;645;Pangkalan Bun / Iskandar;;Indonesia;5;02-42S;110-42E;02-42S;111-41E;25;25;
+WRBK;96;695;Kotabaru;;Indonesia;5;03-24S;116-13E;;;18;18;
+WRBM;96;595;Muaratewe / Beringin;;Indonesia;5;00-57S;114-54E;00-57S;114-54E;60;60;
+WRBP;96;655;Palangkaraya / Panarung;;Indonesia;5;01-00S;114-00E;01-00S;114-00E;27;27;P
+WRKC;97;300;Maumere / Wai Oti;;Indonesia;5;08-38S;122-15E;08-38S;122-14E;3;3;P
+WRKK;97;372;Kupang / El Tari;;Indonesia;5;10-10S;123-40E;10-10S;123-40E;108;108;P
+WRKL;97;310;Larantuka;;Indonesia;5;08-16S;122-58E;;;9;;
+WRKM;97;320;Alor / Mali;;Indonesia;5;08-13S;124-34E;;;12;12;
+WRKR;97;378;Rote / Baa;;Indonesia;5;10-44S;123-04E;;;1;1;
+WRKS;97;380;Sabu / Tardamu;;Indonesia;5;10-30S;121-50E;10-30S;121-50E;26;26;
+WRLB;96;505;Longbawan / Juvai Semaring;;Indonesia;5;03-44N;115-41E;;;550;;
+WRLG;96;525;Tanjung Selor;;Indonesia;5;02-51N;117-20E;;;50;50;
+WRLK;96;529;Tanjung Redep / Berau;;Indonesia;5;02-07N;117-27E;02-07N;117-27E;26;26;
+WRLL;96;633;Balikpapan / Sepinggan;;Indonesia;5;01-16S;116-54E;01-16S;116-54E;3;3;P
+WRLR;96;509;Tarakan / Juwata;;Indonesia;5;03-20N;117-34E;03-20N;117-34E;6;6;P
+WRLS;96;607;Samarinda / Temindung;;Indonesia;5;00-37S;117-09E;00-37S;117-09E;230;230;P
+WRRA;97;240;Ampenan / Selaparang;;Indonesia;5;08-32S;116-04E;08-34S;116-06E;3;3;P
+WRRB;97;270;Bima;;Indonesia;5;08-33S;118-42E;08-33S;118-41E;2;2;
+WRRR;97;230;Denpasar / Ngurah-Rai;;Indonesia;5;08-45S;115-10E;08-45S;115-10E;1;1;P
+WRRS;97;260;Sumbawa Besar / Sumbawa Besar;;Indonesia;5;08-26S;117-25E;08-30S;117-25E;3;3;P
+WRRW;97;340;Waingapu / Mau Hau;;Indonesia;5;09-40S;120-20E;09-40S;120-19E;12;12;P
+WRSJ;96;935;Surabaya / Juanda;;Indonesia;5;07-22S;112-46E;07-23S;112-47E;3;3;P
+WRSP;96;933;Surabaya / Perak;;Indonesia;5;07-13S;112-43E;07-13S;112-43E;3;3;P
+WRSQ;96;845;Surakarta / Adisumarmo;;Indonesia;5;07-52S;110-55E;07-31S;110-45E;104;104;P
+WRSS;96;937;Surabaya;;Indonesia;5;07-13S;113-43E;;;3;3;
+WSAP;48;694;Singapore / Paya Lebar;;Singapore;5;01-22N;103-55E;01-22N;103-55E;18;32;
+WSSS;48;698;Singapore / Changi Airport;;Singapore;5;01-22N;103-59E;01-22N;103-59E;5;16;P
+YAYE;--;---;Ayers Rock;;Australia;5;25-11S;130-58E;;;496;;
+YBAF;94;575;Archerfield Aerodrome;;Australia;5;27-34S;153-00E;;;23;18;
+YBAM;94;568;Amberley Aerodrome;;Australia;5;27-38S;152-43E;;;27;31;P
+YBAS;94;326;Alice Springs Aerodrome;;Australia;5;23-48S;133-53E;23-48S;133-54E;545;547;P
+YBBN;94;578;Brisbane Airport M. O;;Australia;5;27-23S;153-06E;27-25S;153-05E;4;5;P
+YBCG;94;592;Coolangatta Airport Aws;;Australia;5;28-10S;153-30E;;;6;6;
+YBCS;94;287;Cairns Airport;;Australia;5;16-53S;145-45E;16-53S;145-45E;3;7;P
+YBCV;94;510;Charleville Airport;;Australia;5;26-24S;146-16E;26-25S;146-16E;306;304;P
+YBGL;94;380;Gladstone;;Australia;5;23-51S;151-15E;23-51S;151-16E;75;76;P
+YBLR;94;346;Longreach Airport;;Australia;5;23-26S;144-16E;23-26S;144-16E;192;193;P
+YBMA;94;332;Mount Isa Amo;;Australia;5;20-40S;139-28E;20-40S;139-29E;342;341;P
+YBMK;94;367;Mackay Mo;;Australia;5;21-07S;149-12E;21-07S;149-13E;30;32;P
+YBOK;94;552;Oakey Aerodrome;;Australia;5;27-25S;151-44E;;;407;407;P
+YBPN;94;365;Proserpine Airport;;Australia;5;20-29S;148-32E;;;25;18;
+YBRK;94;374;Rockhampton Airport;;Australia;5;23-23S;150-28E;23-23S;150-28E;10;14;P
+YBRM;94;203;Broome Airport;;Australia;5;17-57S;122-13E;17-57S;122-14E;17;9;P
+YBTL;94;294;Townsville Amo;;Australia;5;19-15S;146-45E;19-15S;146-45E;6;9;P
+YBWP;94;171;Weipa City;;Australia;5;12-38S;141-53E;;;12;;
+YDGV;94;150;Gove Airport;;Australia;5;12-16S;136-49E;12-16S;136-49E;52;54;P
+YDTC;94;238;Tennant Creek Airport;;Australia;5;19-38S;134-10E;19-38S;134-10E;375;376;P
+YDYL;94;462;Yulara Aws;;Australia;5;25-11S;130-58E;;;493;492;
+YMAV;--;---;Avalon, Avalon Airport;;Australia;5;38-02S;144-29E;;;8;;
+YMAY;94;896;Albury Airport;;Australia;5;36-04S;146-57E;;;165;171;
+YMDV;94;960;Devonport East;;Australia;5;41-10S;146-22E;;;47;;
+YMEN;94;864;Goldstream Aws;;Australia;5;37-44S;145-24E;;;76;84;
+YMES;94;907;East Sale Aerodrome;;Australia;5;38-06S;147-08E;38-06S;147-08E;5;8;P
+YMHB;94;975;Hobart Airport;;Australia;5;42-50S;147-29E;42-50S;147-30E;4;27;P
+YMLT;94;968;Launceston Airport;;Australia;5;41-32S;147-12E;41-32S;147-12E;171;178;P
+YMLV;94;865;Laverton Aerodrome;;Australia;5;37-51S;144-44E;37-52S;144-45E;18;21;P
+YMMB;94;870;Moorabbin Airport Aws;;Australia;5;37-58S;145-06E;;;13;13;P
+YMMG;94;821;Mount Gambier Aerodrome;;Australia;5;37-44S;140-47E;37-44S;140-47E;65;69;P
+YMMI;94;693;Mildura Airport;;Australia;5;34-13S;142-05E;34-14S;142-05E;50;52;P
+YMML;94;866;Melbourne Airport;;Australia;5;37-40S;144-50E;37-44S;144-50E;132;141;P
+YMMQ;94;998;Macquarie Island;;Australia;5;54-29S;158-57E;54-29S;158-56E;6;8;P
+YMWY;94;957;Wynyard West;;Australia;5;40-59S;145-43E;;;11;;
+YPAD;94;672;Adelaide Airport;;Australia;5;34-56S;138-31E;34-56S;138-31E;6;4;P
+YPAL;94;802;Albany Airport;;Australia;5;34-56S;117-48E;34-56S;117-48E;71;69;P
+YPBH;94;689;Broken Hill Patton Street;;Australia;5;31-58S;141-28E;;;315;;P
+YPCC;96;996;Cocos Island Airport;;Christmas Island;5;12-11S;096-49E;12-11S;096-50E;3;3;P
+YPCD;94;653;Ceduna Airport;;Australia;5;32-07S;133-42E;32-07S;133-42E;23;17;P
+YPDB;94;205;Derby;;Australia;5;17-18S;123-37E;17-19S;123-38E;8;9;P
+YPDN;94;120;Darwin Airport;;Australia;5;12-24S;130-52E;12-26S;130-52E;31;30;P
+YPEA;94;612;Bullsbrook Pearce Amo;;Australia;5;31-40S;116-01E;;;45;49;P
+YPED;95;676;Edinburgh M. O.;;Australia;5;34-42S;138-37E;;;20;20;P
+YPFT;94;646;Forrest Airport;;Australia;5;30-50S;128-06E;30-50S;128-06E;160;156;
+YPGN;94;403;Geraldton Airport;;Australia;5;28-47S;114-42E;28-48S;114-42E;37;34;P
+YPKG;94;637;Kalgoorlie Boulder Amo;;Australia;5;30-47S;121-27E;30-46S;121-27E;367;370;P
+YPKU;94;216;Kununurra Kununurra Aws ;;Australia;5;15-46S;128-42E;;;44;45;P
+YPLC;94;674;Leigh Creek Airport;;Australia;5;30-35S;138-25E;;;261;259;
+YPLM;94;302;Learmonth Airport;;Australia;5;22-14S;114-05E;22-14S;114-05E;5;6;P
+YPMR;94;430;Meekatharra Airport;;Australia;5;26-36S;118-32E;26-36S;118-31E;522;518;P
+YPPD;94;312;Port Hedland Pardoo;;Australia;5;20-06S;119-34E;20-22S;118-37E;9;10;P
+YPPF;95;677;Parafield Airport;;Australia;5;34-47S;138-38E;;;17;10;P
+YPPH;94;610;Belmont Perth Airport ;;Australia;5;31-56S;115-57E;31-55S;115-58E;20;29;P
+YPTN;--;---;Tindal / Katherine;;Australia;5;14-26S;132-16E;;;108;109;P
+YPWR;94;659;Woomera Aerodrome;;Australia;5;31-08S;136-49E;31-09S;136-48E;165;167;P
+YPXM;96;995;Christmas Island Aerodrome;;Christmas Island;5;10-26S;105-41E;10-27S;105-42E;279;262;P
+YSBK;94;765;Bankstown Airport Aws;;Australia;5;33-55S;150-59E;;;9;8;
+YSCB;94;926;Canberra;;Australia;5;35-18S;149-11E;35-18S;149-11E;575;580;P
+YSCH;94;791;Coffs Harbour Mo;;Australia;5;30-19S;153-07E;30-19S;153-07E;5;6;P
+YSCM;94;923;Cooma;;Australia;5;36-14S;149-05E;;;778;;
+YSCN;94;755;Camden Airport;;Australia;5;34-02S;150-41E;;;70;;
+YSDU;94;719;Dubbo;;Australia;5;32-12S;148-34E;32-12S;148-34E;275;275;P
+YSNF;94;996;Norfolk Island Airport;;Australia;5;29-02S;167-56E;29-02S;167-56E;113;109;P
+YSNW;94;750;Nowra Ran Air Station;;Australia;5;34-57S;150-32E;34-57S;150-32E;122;110;P
+YSRI;94;753;Richmond Aus-Afb ;;Australia;5;33-36S;150-47E;;;21;;
+YSSY;94;767;Sydney Airport;;Australia;5;33-57S;151-11E;33-57S;151-11E;6;3;P
+YSTW;94;762;Tamworth Airport;;Australia;5;31-05S;150-50E;;;410;;
+YSWG;94;910;Wagga Airport;;Australia;5;35-09S;147-27E;35-09S;147-27E;221;213;P
+YSWM;94;776;Williamtown Aerodrome;;Australia;5;32-47S;151-49E;32-47S;151-49E;9;8;P
+ZBAA;54;511;Beijing;;China;2;39-56N;116-17E;39-48N;116-28E;55;55;
+ZBHH;53;463;Hohhot;;China;2;40-49N;111-41E;40-49N;111-41E;1065;1065;
+ZBTJ;--;---;Tianjin / Zhangguizhu;;China;2;39-11N;117-21E;;;3;;
+ZBYN;53;772;Taiyuan;;China;2;37-47N;112-33E;37-47N;112-33E;779;779;
+ZGCS;57;679;Changsha;;China;2;28-12N;113-05E;28-12N;112-58E;46;46;
+ZGGG;59;287;Guangzhou;;China;2;23-10N;113-20E;23-08N;113-19E;8;42;
+ZGHA;--;---;Changsha;;China;2;28-14N;112-52E;;;;;
+ZGHK;59;758;Haikou;;China;2;20-02N;110-21E;20-02N;110-21E;15;15;
+ZGKL;57;957;Guilin;;China;2;25-20N;110-18E;25-20N;110-18E;166;166;
+ZGNN;59;431;Nanning;;China;2;22-49N;108-21E;22-49N;108-21E;73;73;
+ZGOW;59;316;Shantou;;China;2;23-24N;116-41E;23-21N;116-40E;3;3;
+ZGSZ;59;493;Shenzhen;;China;2;22-33N;114-06E;;;18;18;
+ZGZJ;59;658;Zhanjiang;;China;2;21-13N;110-24E;21-13N;110-24E;28;28;
+ZHCC;57;083;Zhengzhou;;China;2;34-43N;113-39E;34-43N;113-39E;111;111;
+ZHHH;57;494;Wuhan;;China;2;30-37N;114-08E;30-35N;114-16E;23;23;
+ZJSY;--;---;Sanya/Fenghuang;;China;2;18-18N;109-24E;;;27;;
+ZKKC;47;025;Kimchaek;;Korea, North;2;40-40N;129-12E;;;19;23;P
+ZKPY;47;058;Pyongyang;;Korea, North;2;39-02N;125-47E;39-02N;125-47E;36;38;P
+ZLIC;53;614;Yinchuan;;China;2;38-29N;106-13E;38-29N;106-13E;1112;1112;
+ZLJQ;52;533;Jiuquan;;China;2;39-46N;098-29E;39-46N;098-31E;1478;1478;
+ZLLL;--;---;Lanzhou / Zhongchuan;;China;2;36-01-12N;103-45E;;;;;
+ZLSN;57;036;Xi'An;;China;2;34-18N;108-56E;34-18N;108-56E;398;398;
+ZLXN;52;866;Xining;;China;2;36-37N;101-46E;36-43N;101-45E;2262;2262;
+ZLXY;--;---;Xian/Xianyang;;China;2;34-26N;108-45E;;;479;;
+ZLYA;53;845;Yan An;;China;2;36-36N;109-30E;36-36N;109-30E;959;959;
+ZMUB;--;---;Ulan-Bator;;Mongolia;2;47-51N;106-46E;;;;;
+ZPPP;56;778;Kunming;;China;2;25-01N;102-41E;25-01N;102-41E;1892;1892;
+ZSAM;59;134;Xiamen;;China;2;24-29N;118-05E;24-27N;118-04E;139;139;
+ZSCN;58;606;Nanchang;;China;2;28-36N;115-55E;28-40N;115-55E;50;50;
+ZSFZ;58;847;Fuzhou;;China;2;26-05N;119-17E;26-05N;119-17E;85;85;
+ZSGZ;57;993;Ganzhou;;China;2;25-51N;114-57E;25-51N;114-56E;125;125;
+ZSHC;58;457;Hangzhou;;China;2;30-14N;120-10E;30-14N;120-10E;43;43;
+ZSNJ;58;238;Nanjing;;China;2;32-00N;118-48E;32-00N;118-48E;12;12;
+ZSOF;58;321;Hefei;;China;2;31-52N;117-14E;31-52N;117-14E;36;36;
+ZSPD;--;---;Shanghai / Pudong;;China;2;31-07N;121-46E;;;4;;
+ZSQD;54;857;Qingdao;;China;2;36-04N;120-20E;36-04N;120-20E;77;77;
+ZSSS;58;367;Shanghai / Hongqiao;;China;2;31-10N;121-26E;31-10N;121-26E;7;3;
+ZSTN;54;823;Jinan;;China;2;36-41N;116-59E;36-41N;116-59E;58;58;
+ZUCK;57;516;Chongqing;;China;2;29-31N;106-29E;29-31N;106-29E;351;351;
+ZUGY;57;816;Guiyang;;China;2;26-35N;106-43E;26-29N;106-39E;1074;1074;
+ZULS;55;591;Lhasa;;China;2;29-40N;091-08E;29-40N;091-08E;3650;3650;
+ZUUU;56;294;Chengdu;;China;2;30-40N;104-01E;30-40N;104-01E;508;508;
+ZWHM;52;203;Hami;;China;2;42-49N;093-31E;42-49N;093-31E;739;739;
+ZWSH;51;709;Kashi;;China;2;39-28N;075-59E;39-28N;075-59E;1291;1291;
+ZWTN;51;828;Hotan;;China;2;37-08N;079-56E;37-08N;079-56E;1375;1375;
+ZWWW;--;---;Urum-Qi / Diwopu;;China;2;43-54N;087-28E;;;654;;
+ZWYN;51;431;Yining;;China;2;43-57N;081-20E;43-57N;081-20E;663;663;
+ZYCC;54;161;Changchun;;China;2;43-54N;125-13E;43-54N;125-13E;238;238;
+ZYHB;--;---;Harbin;;China;2;46-01-12N;126-34-48E;;;;;
+ZYQQ;50;745;Qiqihar;;China;2;47-23N;123-55E;47-23N;123-55E;148;148;
+ZYTL;54;662;Dalian;;China;2;38-54N;121-38E;38-59N;121-38E;97;97;
+ZYTX;--;---;Shenyang / Taokian;;China;2;41-48N;123-24E;;;35;;
diff --git a/kweather/sun.cpp b/kweather/sun.cpp
new file mode 100644
index 0000000..5c6fca1
--- /dev/null
+++ b/kweather/sun.cpp
@@ -0,0 +1,462 @@
+/***************************************************************************
+ sun.cpp - Sun Rise and Set Calculations
+ -------------------
+ begin : Friday July 11 2003
+ copyright : (C) 2003 by John Ratke
+ email : jratke@comcast.net
+
+ history:
+ Written as DAYLEN.C, 1989-08-16
+ Modified to SUNRISET.C, 1992-12-01
+ (c) Paul Schlyter, 1989, 1992
+ Released to the public domain by Paul Schlyter, December 1992
+ Portions Modified to SUNDOWN.NLM by Cliff Haas 98-05-22
+ Converted to C++ and modified by John Ratke
+
+***************************************************************************/
+
+/***************************************************************************
+* *
+* This program is free software; you can redistribute it and/or modify *
+* it under the terms of the GNU General Public License as published by *
+* the Free Software Foundation; either version 2 of the License, or *
+* (at your option) any later version. *
+* *
+***************************************************************************/
+
+#include <kdebug.h>
+
+#include <math.h>
+#include "sun.h"
+
+/* A function to compute the number of days elapsed since 2000 Jan 0.0 */
+/* (which is equal to 1999 Dec 31, 0h UT) */
+
+static inline double days_since_2000_Jan_0(int y, int m, int d)
+{
+ return (367L*(y)-((7*((y)+(((m)+9)/12)))/4)+((275*(m))/9)+(d)-730530L);
+}
+
+/* Some conversion factors between radians and degrees */
+
+static const double PI = 3.14159265358979323846;
+
+static const double RADEG = ( 180.0 / PI );
+static const double DEGRAD = ( PI / 180.0 );
+
+/* The trigonometric functions in degrees */
+static inline double sind(double x) { return sin( x * DEGRAD ); }
+static inline double cosd(double x) { return cos( x * DEGRAD ); }
+static inline double tand(double x) { return tan( x * DEGRAD ); }
+static inline double atand(double x) { return RADEG * atan(x); }
+static inline double asind(double x) { return RADEG * asin(x); }
+static inline double acosd(double x) { return RADEG * acos(x); }
+static inline double atan2d(double y, double x) { return RADEG * atan2(y, x); }
+
+/* Other local functions */
+static double latitudeToDouble( const QString &latitude );
+static double longitudeToDouble( const QString &longitude );
+static int __sunriset__( int year, int month, int day, double lon, double lat,
+ double altit, int upper_limb, double &trise, double &tset );
+static void sunpos( double d, double &lon, double &r );
+static void sun_RA_dec( double d, double &RA, double &dec, double &r );
+static inline double revolution( const double x );
+static inline double rev180( const double x );
+static inline double GMST0( const double d );
+
+
+/*
+ * This function computes times for sunrise/sunset.
+ * Sunrise/set is considered to occur when the Sun's upper limb is
+ * 35 arc minutes below the horizon (this accounts for the refraction
+ * of the Earth's atmosphere).
+ */
+static inline int sun_rise_set(int year, int month, int day, double lon, double lat, double &rise, double &set)
+{
+ return __sunriset__( year, month, day, lon, lat, -35.0/60.0, 1, rise, set );
+}
+
+/*
+ * This function computes the start and end times of civil twilight.
+ * Civil twilight starts/ends when the Sun's center is 6 degrees below
+ * the horizon.
+ */
+static inline int civil_twilight(int year, int month, int day, double lon, double lat, double &start, double &end)
+{
+ return __sunriset__( year, month, day, lon, lat, -6.0, 0, start, end );
+}
+
+
+Sun::Sun(const QString &latitude, const QString &longitude, QDate date, const int localUTCOffset) :
+ m_date(date),
+ m_lat(latitudeToDouble(latitude)), m_lon(longitudeToDouble(longitude)),
+ m_localUTCOffset(localUTCOffset)
+{
+}
+
+
+QTime Sun::computeRiseTime()
+{
+ double riseTime;
+ double setTime;
+
+ sun_rise_set( m_date.year(), m_date.month(), m_date.day(), m_lon, m_lat, riseTime, setTime );
+
+ QTime result = convertDoubleToLocalTime( riseTime );
+
+ if ( ! result.isValid() )
+ result.setHMS( 6, 0, 0 );
+
+ return result;
+}
+
+
+QTime Sun::computeSetTime()
+{
+ double riseTime;
+ double setTime;
+
+ sun_rise_set( m_date.year(), m_date.month(), m_date.day(), m_lon, m_lat, riseTime, setTime );
+
+ QTime result = convertDoubleToLocalTime( setTime );
+
+ if ( ! result.isValid() )
+ result.setHMS( 19, 0, 0 );
+
+ return result;
+}
+
+
+QTime Sun::computeCivilTwilightStart()
+{
+ double start;
+ double end;
+
+ civil_twilight( m_date.year(), m_date.month(), m_date.day(), m_lon, m_lat, start, end );
+
+ QTime result = convertDoubleToLocalTime( start );
+
+ if ( ! result.isValid() )
+ result.setHMS( 6, 0, 0 );
+
+ return result;
+}
+
+
+QTime Sun::computeCivilTwilightEnd()
+{
+ double start;
+ double end;
+
+ civil_twilight( m_date.year(), m_date.month(), m_date.day(), m_lon, m_lat, start, end );
+
+ QTime result = convertDoubleToLocalTime( end );
+
+ if ( ! result.isValid() )
+ result.setHMS( 19, 0, 0 );
+
+ return result;
+}
+
+
+/*
+ * Converts latitude in format DD-MMH, where DD is degrees, MM is minutes,
+ * and H is Hemisphere (N for North, or S for South) to a floating point number.
+ *
+ * For example: 27-00S to -27.0
+ *
+ * Does not currently handle seconds.
+ */
+static double latitudeToDouble( const QString &latitude )
+{
+ double result;
+
+ double dd = latitude.left(2).toDouble();
+ double mm = latitude.mid(3, 2).toDouble();
+
+ result = dd + (mm / 60);
+
+ if (latitude.contains("S"))
+ result *= -1;
+
+ return result;
+}
+
+
+static double longitudeToDouble( const QString &longitude )
+{
+ double result;
+
+ double ddd = longitude.left(3).toDouble();
+ double mm = longitude.mid(4, 2).toDouble();
+
+ result = ddd + (mm / 60);
+
+ if (longitude.contains("W"))
+ result *= -1;
+
+ return result;
+}
+
+
+QTime Sun::convertDoubleToLocalTime( const double time )
+{
+ QTime result;
+
+ // Example: say time is 17.7543 Then hours = 17 and minutes = 0.7543 * 60 = 45.258
+ // We need to convert the time to CORRECT local hours
+ int hours = (int)floor(time);
+ int localhours = hours + (m_localUTCOffset / 60);
+
+ // We need to convert the time to CORRECT local minutes
+ int minutes = (int)floor((time - hours) * 60);
+ int localminutes = minutes + (m_localUTCOffset % 60);
+
+ // We now have to adjust the time to be within the 60m boundary
+ if (localminutes < 0)
+ {
+ //As minutes is less than 0, we need to
+ //reduce a hour and add 60m to minutes.
+ localminutes += 60;
+ localhours--;
+ }
+ if (localminutes >= 60)
+ {
+ //As minutes are more than 60, we need to
+ //add one more hour and reduce the minutes to
+ //a value between 0 and 59.
+ localminutes -= 60;
+ localhours++;
+ }
+
+ // Round up or down to nearest second.
+ // Use rint instead of nearbyint because rint is in FreeBSD
+ int seconds = (int)rint( fabs( minutes - ((time - hours) * 60) ) * 60 );
+
+ // We now have to adjust the time to be within the 24h boundary
+ if (localhours < 0) { localhours += 24; }
+ if (localhours >= 24) { localhours -= 24; }
+
+ // Try to set the hours, minutes and seconds for the local time.
+ // If this doesn't work, then we will return the invalid time.
+ result.setHMS( localhours, localminutes, seconds );
+
+ return result;
+}
+
+
+/*
+ * Note: year,month,date = calendar date, 1801-2099 only.
+ * Eastern longitude positive, Western longitude negative
+ * Northern latitude positive, Southern latitude negative
+ * The longitude value IS critical in this function!
+ * altit = the altitude which the Sun should cross
+ * Set to -35/60 degrees for rise/set, -6 degrees
+ * for civil, -12 degrees for nautical and -18
+ * degrees for astronomical twilight.
+ * upper_limb: non-zero -> upper limb, zero -> center
+ * Set to non-zero (e.g. 1) when computing rise/set
+ * times, and to zero when computing start/end of
+ * twilight.
+ * trise = the rise time gets stored here
+ * tset = the set time gets stored here
+ * Both times are relative to the specified altitude,
+ * and thus this function can be used to comupte
+ * various twilight times, as well as rise/set times
+ *
+ * Return value: 0 = sun rises/sets this day, times stored in
+ * trise and tset.
+ * +1 = sun above the specified "horizon" 24 hours.
+ * trise set to time when the sun is at south,
+ * minus 12 hours while tset is set to the south
+ * time plus 12 hours. "Day" length = 24 hours
+ * -1 = sun is below the specified "horizon" 24 hours
+ * "Day" length = 0 hours, trise and tset are
+ * both set to the time when the sun is at south.
+ *
+ */
+static int __sunriset__( int year, int month, int day, double lon, double lat,
+ double altit, int upper_limb, double &trise, double &tset )
+{
+ double d; /* Days since 2000 Jan 0.0 (negative before) */
+ double sr; /* Solar distance, astronomical units */
+ double sRA; /* Sun's Right Ascension */
+ double sdec; /* Sun's declination */
+ double sradius; /* Sun's apparent radius */
+ double t; /* Diurnal arc */
+ double tsouth; /* Time when Sun is at south */
+ double sidtime; /* Local sidereal time */
+
+ int rc = 0; /* Return code from function - usually 0 */
+
+ /* Compute d of 12h local mean solar time */
+ d = days_since_2000_Jan_0(year, month, day);
+
+ d = days_since_2000_Jan_0(year, month, day) + 0.5 - lon / 360.0;
+
+ /* Compute local sideral time of this moment */
+ sidtime = revolution( GMST0(d) + 180.0 + lon );
+
+ /* Compute Sun's RA + Decl at this moment */
+ sun_RA_dec( d, sRA, sdec, sr );
+
+ /* Compute time when Sun is at south - in hours UT */
+ tsouth = 12.0 - rev180(sidtime - sRA) / 15.0;
+
+ /* Compute the Sun's apparent radius, degrees */
+ sradius = 0.2666 / sr;
+
+ /* Do correction to upper limb, if necessary */
+ if ( upper_limb )
+ altit -= sradius;
+
+ /* Compute the diurnal arc that the Sun traverses to reach */
+ /* the specified altitide altit: */
+ double cost;
+ cost = ( sind(altit) - sind(lat) * sind(sdec) ) /
+ ( cosd(lat) * cosd(sdec) );
+ if ( cost >= 1.0 )
+ {
+ rc = -1;
+ t = 0.0; /* Sun always below altit */
+ }
+ else if ( cost <= -1.0 )
+ {
+ rc = +1;
+ t = 12.0; /* Sun always above altit */
+ }
+ else
+ t = acosd(cost) / 15.0; /* The diurnal arc, hours */
+
+ /* Store rise and set times - in hours UT */
+ trise = tsouth - t;
+ tset = tsouth + t;
+
+ return rc;
+}
+
+
+/* This function computes the Sun's position at any instant
+ *
+ * Computes the Sun's ecliptic longitude and distance
+ * at an instant given in d, number of days since
+ * 2000 Jan 0.0. The Sun's ecliptic latitude is not
+ * computed, since it's always very near 0.
+ */
+static void sunpos( double d, double &lon, double &r )
+{
+ double M; /* Mean anomaly of the Sun */
+ double w; /* Mean longitude of perihelion */
+ /* Note: Sun's mean longitude = M + w */
+ double e; /* Eccentricity of Earth's orbit */
+ double E; /* Eccentric anomaly */
+ double x;
+ double y; /* x, y coordinates in orbit */
+ double v; /* True anomaly */
+
+ /* Compute mean elements */
+ M = revolution( 356.0470 + 0.9856002585 * d );
+ w = 282.9404 + 4.70935E-5 * d;
+ e = 0.016709 - 1.151E-9 * d;
+
+ /* Compute true longitude and radius vector */
+ E = M + e * RADEG * sind(M) * ( 1.0 + e * cosd(M) );
+ x = cosd(E) - e;
+ y = sqrt( 1.0 - e*e ) * sind(E);
+ r = sqrt( x*x + y*y ); /* Solar distance */
+ v = atan2d( y, x ); /* True anomaly */
+ lon = v + w; /* True solar longitude */
+
+ if ( lon >= 360.0 )
+ lon -= 360.0; /* Make it 0..360 degrees */
+}
+
+
+static void sun_RA_dec( double d, double &RA, double &dec, double &r )
+{
+ double lon;
+ double obl_ecl;
+ double x;
+ double y;
+ double z;
+
+ /* Compute Sun's ecliptical coordinates */
+ sunpos( d, lon, r );
+
+ /* Compute ecliptic rectangular coordinates (z=0) */
+ x = r * cosd(lon);
+ y = r * sind(lon);
+
+ /* Compute obliquity of ecliptic (inclination of Earth's axis) */
+ obl_ecl = 23.4393 - 3.563E-7 * d;
+
+ /* Convert to equatorial rectangular coordinates - x is unchanged */
+ z = y * sind(obl_ecl);
+ y = y * cosd(obl_ecl);
+
+ /* Convert to spherical coordinates */
+ RA = atan2d( y, x );
+ dec = atan2d( z, sqrt(x*x + y*y) );
+}
+
+
+static const double INV360 = 1.0 / 360.0;
+
+/*
+ * This function reduces any angle to within the first revolution
+ * by subtracting or adding even multiples of 360.0 until the
+ * result is >= 0.0 and < 360.0
+ */
+static inline double revolution( const double x )
+{
+ return ( x - 360.0 * floor( x * INV360 ) );
+}
+
+/*
+ * Reduce angle to within +180..+180 degrees
+ */
+static inline double rev180( const double x )
+{
+ return ( x - 360.0 * floor( x * INV360 + 0.5 ) );
+}
+
+
+/*
+ * This function computes GMST0, the Greenwhich Mean Sidereal Time
+ * at 0h UT (i.e. the sidereal time at the Greenwhich meridian at
+ * 0h UT). GMST is then the sidereal time at Greenwich at any
+ * time of the day. I've generelized GMST0 as well, and define it
+ * as: GMST0 = GMST - UT -- this allows GMST0 to be computed at
+ * other times than 0h UT as well. While this sounds somewhat
+ * contradictory, it is very practical: instead of computing
+ * GMST like:
+ *
+ * GMST = (GMST0) + UT * (366.2422/365.2422)
+ *
+ * where (GMST0) is the GMST last time UT was 0 hours, one simply
+ * computes:
+ *
+ * GMST = GMST0 + UT
+ *
+ * where GMST0 is the GMST "at 0h UT" but at the current moment!
+ * Defined in this way, GMST0 will increase with about 4 min a
+ * day. It also happens that GMST0 (in degrees, 1 hr = 15 degr)
+ * is equal to the Sun's mean longitude plus/minus 180 degrees!
+ * (if we neglect aberration, which amounts to 20 seconds of arc
+ * or 1.33 seconds of time)
+ *
+ */
+static inline double GMST0( const double d )
+{
+ double sidtim0;
+
+ /* Sidtime at 0h UT = L (Sun's mean longitude) + 180.0 degr */
+ /* L = M + w, as defined in sunpos(). Since I'm too lazy to */
+ /* add these numbers, I'll let the C compiler do it for me. */
+ /* Any decent C compiler will add the constants at compile */
+ /* time, imposing no runtime or code overhead. */
+ sidtim0 = revolution( ( 180.0 + 356.0470 + 282.9404 ) +
+ ( 0.9856002585 + 4.70935E-5 ) * d );
+ return sidtim0;
+}
+
diff --git a/kweather/sun.h b/kweather/sun.h
new file mode 100644
index 0000000..6773d01
--- /dev/null
+++ b/kweather/sun.h
@@ -0,0 +1,57 @@
+/***************************************************************************
+ sun.h - Sun Rise and Set Calculations
+ -------------------
+ begin : Friday July 11 2003
+ copyright : (C) 2003 by John Ratke
+ email : jratke@comcast.net
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef SUN_H
+#define SUN_H
+
+#include <qstring.h>
+#include <qdatetime.h>
+#include <krfcdate.h>
+
+class Sun
+{
+ public:
+ /* Constructs a Sun instance for calculating sun rise and set
+ * times. Users should construct it once and then call one or
+ * more of the other four public functions.
+ *
+ * Inputs are the location on earth to calculate the rise/set time
+ * for (for example, the location of a particular weather station),
+ * the current date, and the offset in minutes from universal time
+ * to the local time zone.
+ *
+ */
+ Sun( const QString &latitude,
+ const QString &longitude,
+ QDate date = QDate::currentDate(),
+ const int localUTCOffset = KRFCDate::localUTCOffset() );
+
+ QTime computeRiseTime();
+ QTime computeSetTime();
+ QTime computeCivilTwilightStart();
+ QTime computeCivilTwilightEnd();
+
+ private:
+ QTime convertDoubleToLocalTime( const double time );
+
+ const QDate m_date;
+ const double m_lat;
+ const double m_lon;
+ const int m_localUTCOffset;
+};
+
+#endif
diff --git a/kweather/sun_test.cpp b/kweather/sun_test.cpp
new file mode 100644
index 0000000..d5dcccd
--- /dev/null
+++ b/kweather/sun_test.cpp
@@ -0,0 +1,84 @@
+/****************************************************************************
+ * sun_test.cpp - Sun Rise and Set Test Program
+ * -------------------
+ * begin : Tuesday June 2 2004
+ * copyright : (C) 2004 by John Ratke
+ * email : jratke@comcast.net
+ ****************************************************************************/
+
+/****************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ****************************************************************************/
+
+#include <iostream>
+using namespace std;
+
+#include <qstring.h>
+#include <qdatetime.h>
+#include <krfcdate.h>
+
+#include "sun.h"
+
+
+int main()
+{
+ bool anyFailed = false;
+
+ QString KUGN_Latitude("42-25N");
+ QString KUGN_Longitude("087-52W");
+ QDate Date(2004, 6, 1); // June 1st.
+ int localUTCOffset = -300;
+
+ // Construct a sun object for our tests.
+ Sun theSun( KUGN_Latitude, KUGN_Longitude, Date, localUTCOffset );
+
+ QTime civilStart = theSun.computeCivilTwilightStart();
+ QTime civilEnd = theSun.computeCivilTwilightEnd();
+
+ cout << "Testing Civil Twilight Calculations...";
+ // Start should be 04:42:39 End should be 20:56:06
+ if (civilStart.hour() == 4 && civilStart.minute() == 42 && civilStart.second() == 39 &&
+ civilEnd.hour() == 20 && civilEnd.minute() == 56 && civilEnd.second() == 06)
+ {
+ cout << "passed" << endl;
+ }
+ else
+ {
+ cout << "failed" << endl;
+ anyFailed = true;
+ }
+
+ cout << "Testing Rise and Set Time Calculations...";
+
+ QTime rise = theSun.computeRiseTime();
+ QTime set = theSun.computeSetTime();
+
+ // Rise should be 05:16:35 Set should be 20:22:10
+ if (rise.hour() == 5 && rise.minute() == 16 && rise.second() == 35 &&
+ set.hour() == 20 && set.minute() == 22 && set.second() == 10)
+ {
+ cout << "passed" << endl;
+ }
+ else
+ {
+ cout << "failed" << endl;
+ anyFailed = true;
+ }
+
+
+ // If success, return 0, else return 1
+ if (anyFailed)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
diff --git a/kweather/test.sh b/kweather/test.sh
new file mode 100755
index 0000000..ee64ba2
--- /dev/null
+++ b/kweather/test.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+mkdir nowind nopress notemp
+for file in `ls .`
+do
+ METAR=`cat $file | grep -v ":"`
+# echo testing data $METAR
+ KWEATHER=`dcopfind kweather* weatherIface`
+ dcop "$KWEATHER" parseWeather "$METAR" false
+ WIND=`dcop "$KWEATHER" get_wind`
+ PRESS=`dcop "$KWEATHER" get_pressure`
+ TEMP=`dcop "$KWEATHER" get_temperature`
+ if `test "$WIND"=""`
+ then
+ cp $file nowind/$file
+ fi
+ if `test "$PRESS"=""`
+ then
+ cp $file nopress/$file
+ fi
+ if `test "$TEMP"=""`
+ then
+ cp $file notemp/$file
+ fi
+
+ echo $WIND $PRESS $TEMP
+# #sleep 1
+done
+
diff --git a/kweather/weatherIface.h b/kweather/weatherIface.h
new file mode 100644
index 0000000..5f52b39
--- /dev/null
+++ b/kweather/weatherIface.h
@@ -0,0 +1,15 @@
+#ifndef __WE_IFACE_H
+#define __WE_IFACE_H
+
+#include <dcopobject.h>
+class weatherIface : virtual public DCOPObject
+{
+ K_DCOP
+public:
+
+ k_dcop:
+ /** Cause KWeather to refrsh it's data **/
+ virtual void refresh(QString) = 0;
+};
+
+#endif
diff --git a/kweather/weather_stations.desktop b/kweather/weather_stations.desktop
new file mode 100644
index 0000000..22fe77a
--- /dev/null
+++ b/kweather/weather_stations.desktop
@@ -0,0 +1,3112 @@
+[Main]
+regions=US CA MX EU AF OZ ME AS M_ AT
+
+[ME]
+name=Middle East
+states=DZ BH IR IL KW LB OM QA SA AE YE
+
+[ME_IL]
+name=Israel
+loc0=Ben\\ Gurion LLBG ------ ---
+loc1=Eilat LLET ------ ---
+loc2=Ovda LLOV ------ ---
+
+[ME_AE]
+name=United Arab Emirates
+loc0=Abu\\ Dhabi\\ -\\ Bateen OMAD ------ ---
+loc1=Abu\\ Dhabi OMAA ------ ---
+loc2=Al\\ Ain OMAL ------ ---
+loc3=Dubai OMDB ------ ---
+loc4=Fujairah OMFJ ------ ---
+loc5=Ras\\ Al\\ Khaimah OMRK ------ ---
+loc6=Sharjah OMSJ ------ ---
+
+[ME_QA]
+name=Qatar
+loc0=Doha OTBD ------ ---
+
+[ME_OM]
+name=Oman
+loc0=Masirah OOMA ------ ---
+loc1=Saiq OOSQ ------ ---
+loc2=Salalah OOSA ------ ---
+loc3=Seeb OOMS ------ ---
+loc4=Thumrait OOTH ------ ---
+
+[ME_YE]
+name=Yemen
+loc0=Aden OYAA ------ ---
+loc1=Hodeidah OYHD ------ ---
+loc2=Marib OYMB ------ ---
+loc3=Sana'A OYSN ------ ---
+loc4=Sayun OYSY ------ ---
+loc5=Socotra OYSQ ------ ---
+loc6=Taiz OYTZ ------ ---
+
+[ME_SA]
+name=Saudi Arabia
+loc0=Abha OEAB ------ ---
+loc1=Al\\ Ahsa OEAH ------ ---
+loc2=Al\\ Baha OEBA ------ ---
+loc3=Al\\ Qaysumah OEPA ------ ---
+loc4=Al-Jouf OESK ------ ---
+loc5=Arar OERR ------ ---
+loc6=Bisha OEBH ------ ---
+loc7=Dawadmi OEDW ------ ---
+loc8=Dhahran OEDR ------ ---
+loc9=Gassim OEGS ------ ---
+loc10=Gizan OEGN ------ ---
+loc11=Guriat OEGT ------ ---
+loc12=Hafr\\ Al-Batin OEKK ------ ---
+loc13=Hail OEHL ------ ---
+loc14=Jeddah\\ King\\ Abdul\\ Aziz\\ International\\ Airport OEJN ------ ---
+loc15=Khamis\\ Mushait OEKM ------ ---
+loc16=King\\ Khaled\\ International\\ Airport OERK ------ ---
+loc17=Madinah OEMA ------ ---
+loc18=Makkah OEMK ------ ---
+loc19=Najran OENG ------ ---
+loc20=Rafha OERF ------ ---
+loc21=Riyadh OERY ------ ---
+loc22=Sharurah OESH ------ ---
+loc23=Tabuk OETB ------ ---
+loc24=Taif OETF ------ ---
+loc25=Turaif OETR ------ ---
+loc26=Wadi\\ Al\\ Dawasser\\ Airport OEWD ------ ---
+loc27=Wejh OEWJ ------ ---
+loc28=Yenbo OEYN ------ ---
+
+[ME_DZ]
+name=Algeria
+loc0=Adrar DAUA ------ ---
+loc1=Annaba DABB ------ ---
+loc2=Constantine DABC ------ ---
+loc3=Dar-El-Beida DAAG ------ ---
+loc4=Ghardaia DAUG ------ ---
+loc5=Hassi-Messaoud DAUH ------ ---
+loc6=In\\ Amenas DAUZ ------ ---
+loc7=Oran/Es\\ Senia DAOO ------ ---
+loc8=Tamanrasset/Aguenna DAAT ------ ---
+loc9=Tebessa DABS ------ ---
+loc10=Tlemcen\\ Zenata DAON ------ ---
+
+[ME_BH]
+name=Bahrain
+loc0=Bahrain OBBI ------ ---
+
+[ME_LB]
+name=Lebanon
+loc0=Beirut OLBA ------ ---
+
+[ME_IR]
+name=Iran, Islamic Republic of
+loc0=Ahwaz OIAW ------ ---
+loc1=Bandarabbass OIKB ------ ---
+loc2=Esfahan OIFM ------ ---
+loc3=Kerman OIKK ------ ---
+loc4=Mashhad OIMM ------ ---
+loc5=Shiraz OISS ------ ---
+loc6=Tabriz OITT ------ ---
+loc7=Tehran-Mehrabad OIII ------ ---
+
+[ME_KW]
+name=Kuwait
+loc0=Kuwait OKBK ------ ---
+
+[US]
+name=United States
+states=AL AK AZ AR CA CO CT DE DC FL GA HI ID IL IN IA KS KY LA ME MA MD MI MS MN MO MT NE NH NM NV NY ND NJ NC OH OK OR PA RI SC SD TN TX UT VT VA WA WI WV WY
+
+[US_AK]
+name=Alaska
+loc0=Adak PADK AKZ020 ---
+loc1=Ambl\\er PAFM AKZ003 ---
+loc2=Anaktuvuk PAKP AKZ001 ---
+loc3=Anchorage PANC AKZ015 ---
+loc4=Anchorage\\ -\\ Elmendorf\\ AFB PAED AKZ015 ---
+loc5=Aniak PANI AKZ010 ---
+loc6=Annette PANT ------ ---
+loc7=Barrow PABR AKZ001 ---
+loc8=Barter\\ Island PABA ------ ---
+loc9=Bethel PABE AKZ010 ---
+loc10=Bettles PABT AKZ004 ---
+loc11=Big\\ River\\ Lake PALV AKZ001 ---
+loc12=Cantwell PATW AKZ004 ---
+loc13=Cape\\ Lisburne PALU ------ ---
+loc14=Cape\\ Newenham PAEH ------ ---
+loc15=Cape\\ Romanzoff PACZ ------ ---
+loc16=Chandalar\\ Lake PALR AKZ004 ---
+loc17=Chulitna PAEC ------ ---
+loc18=Circle\\ City PACR AKZ004 ---
+loc19=Cold\\ Bay PACD AKZ020 ---
+loc20=Cordova PACV AKZ017 ---
+loc21=Dead\\ Horse PASC AKZ001 ---
+loc22=Dillingham PADL AKZ010 ---
+loc23=Dutch\\ Harbor PADU AKZ020 ---
+loc24=Elfin\\ Cove PAEL AKZ022 ---
+loc25=Emmonak PAEM ------ ---
+loc26=Fairbanks PAFA AKZ007 ---
+loc27=Farbanks/Eielson\\ AFB PAEI AKZ007 ---
+loc28=Fort\\ Greely/Allen\\ AAF PABI ------ ---
+loc29=Galbraith\\ Lake PAGB ------ ---
+loc30=Galena PAGA ------ ---
+loc31=Gambell PAGM AKZ006 ---
+loc32=Gulkana PAGK AKZ015 ---
+loc33=Gustavus PAGS AKZ024 ---
+loc34=Haines PAHN AKZ002 ---
+loc35=Hayes\\ River PAHZ ------ ---
+loc36=Healy\\ River PAHV AKZ004 ---
+loc37=Homer PAHO AKZ017 ---
+loc38=Hoonah PAOH AKZ026 ---
+loc39=Iliamna PAIL AKZ010 ---
+loc40=Juneau PAJN AKZ025 ---
+loc41=Kake PAFE AKZ026 ---
+loc42=Kenai PAEN AKZ017 ---
+loc43=Ketchikan PAKT AKZ027 ---
+loc44=King\\ Salmon PAKN AKZ016 ---
+loc45=Klawock PAKW ------ ---
+loc46=Kodiak PADQ AKZ018 ---
+loc47=Kotzebue PAOT AKZ003 ---
+loc48=Lake\\ Hood PALH ------ ---
+loc49=McCarthy PAMX AKZ017 ---
+loc50=McGrath PAMC AKZ004 ---
+loc51=Mekoryuk PAMY AKZ010 ---
+loc52=Merril\\ Field PAMR ------ ---
+loc53=Middleton\\ Island PAMD ------ ---
+loc54=Minchumina PAMH ------ ---
+loc55=Nabesna/Devil\\ Mt. PABN ------ ---
+loc56=Nenana PANN AKZ004 ---
+loc57=Nome PAOM AKZ006 ---
+loc58=Northway PAOR AKZ007 ---
+loc59=Palmer PAAQ AKZ015 ---
+loc60=Paxson PAXK AKZ017 ---
+loc61=Petersburg PAPG AKZ026 ---
+loc62=Point\\ Hope PAPO AKZ001 ---
+loc63=Point\\ Lay PPIZ AKZ001 ---
+loc64=Port\\ Alexander PAAP AKZ026 ---
+loc65=Port\\ Alsworth PALJ ------ ---
+loc66=Port\\ Heiden PAPH AKZ010 ---
+loc67=Puntilla\\ Lake PAPT ------ ---
+loc68=Saint\\ Mary's PASM AKZ010 ---
+loc69=Saint\\ Paul PASN ------ ---
+loc70=Sand\\ Point PASD AKZ020 ---
+loc71=Selanik PASK AKZ003 ---
+loc72=Seward PAWD AKZ017 ---
+loc73=Shishmaref PASH AKZ006 ---
+loc74=Sitka PASI AKZ023 ---
+loc75=Skagway PAGY AKZ026 ---
+loc76=Skwentna PASW AKZ015 ---
+loc77=Slana PADT ------ ---
+loc78=Snowshoe\\ Lake PALK ------ ---
+loc79=Soldotna PASX AKZ017 ---
+loc80=Sparrevohn PASV ------ ---
+loc81=Sutton PAJV ------ ---
+loc82=Talkeetna PATK AKZ015 ---
+loc83=Tanana PATA AKZ004 ---
+loc84=Tatalina PATL ------ ---
+loc85=Tin\\ City PATC ------ ---
+loc86=Togiak\\ Village PATG AKZ010 ---
+loc87=Umiat PAUM AKZ001 ---
+loc88=Unalakleet PAUN AKZ006 ---
+loc89=Valdez\\ 2 PAVD AKZ017 ---
+loc90=Wainwright PAFB AKZ001 ---
+loc91=Whittier PAWR AKZ015 ---
+loc92=Willow\\ Airport PAUO AKZ015 ---
+loc93=Wrangell PAWG AKZ026 ---
+loc94=Yakutat PAYA AKZ022 ---
+
+[US_AR]
+name=Arkansas
+loc0=Batesville KBVX ARZ016 ---
+loc1=Bentonville KVBT ARZ001 ---
+loc2=El\\ Dorado KELD ARZ073 ---
+loc3=Fayetteville KFYV ARZ010 085
+loc4=Flippin KFLP ARZ004 ---
+loc5=Fort\\ Smith KFSM ------ 085
+loc6=Harrison KHRO ARZ003 085
+loc7=Hot\\ Springs KHOT ARZ042 ---
+loc8=Jonesboro KJBR ARZ026 085
+loc9=Little\\ Rock KLIT ARZ044 ---
+loc10=Little\\ Rock\\ AFB KLRF ARZ044 ---
+loc11=Pine\\ Bluff KPBF ARZ056 ---
+loc12=Rogers KROG ARZ001 ---
+loc13=Siloam\\ Springs KSLG ARZ001 ---
+loc14=Stuttgart KSGT ARZ057 ---
+loc15=Texarkana KTXK ARZ070 ---
+loc16=Walnut\\ Ridge KARG ARZ017 ---
+
+[US_DC]
+name=District of Columbia
+loc0=Washington/Dulles KIAD DCZ013 dca
+loc1=Washington KDCA DCZ013 dca
+
+[US_ID]
+name=Idaho
+loc0=Boise KBOI IDZ014 ---
+loc1=Burley KBYI IDZ022 ---
+loc2=Challis KU15 IDZ018 ---
+loc3=Coeur\\ d'Alene KCOE IDZ002 ---
+loc4=Elk\\ City KP69 IDZ006 ---
+loc5=Grangeville KS80 IDZ007 ---
+loc6=Hailey-Sun\\ Valley KSUN IDZ018 ---
+loc7=Idaho\\ Falls KIDA IDZ020 ---
+loc8=Lewiston KLWS IDZ003 ---
+loc9=Malad\\ City KMLD IDZ022 ---
+loc10=Malta K77M IDZ022 ---
+loc11=McCall KMYL IDZ011 ---
+loc12=Mountain\\ Home KMUO IDZ014 ---
+loc13=Mullan KS06 IDZ004 ---
+loc14=Pocatello KPIH IDZ021 ---
+loc15=Salmon KSMN IDZ009 ---
+loc16=Salmon\\ (2) K27U IDZ009 ---
+loc17=Soda\\ Springs KU78 IDZ023 ---
+loc18=Strevell K4SV ------ ---
+loc19=Twin\\ Falls KTWF IDZ015 ---
+
+[US_IA]
+name=Iowa
+loc0=Algona KAXA IAZ005 043
+loc1=Ames KAMW IAZ048 043
+loc2=Atlantic KAIO IAZ070 ---
+loc3=Boone KBNW IAZ047 ---
+loc4=Burlington KBRL IAZ089 058
+loc5=Carroll KCIN IAZ045 ---
+loc6=Cedar\\ Rapids KCID IAZ052 ---
+loc7=Chariton KCNC IAZ084 ---
+loc8=Charles\\ City KCCY IAZ018 ---
+loc9=Clarinda KICL IAZ091 ---
+loc10=Clarion KCAV IAZ025 ---
+loc11=Clinton KCWI IAZ066 ---
+loc12=Council\\ Bluffs KCBF IAZ069 ---
+loc13=Creston KCSQ IAZ082 ---
+loc14=Davenport KDVN IAZ068 ---
+loc15=Decorah KDEH IAZ010 ---
+loc16=Denison KDNS IAZ044 ---
+loc17=Des\\ Moines KDSM IAZ060 057
+loc18=Dubuque KDBQ IAZ042 ---
+loc19=Estherville KEST IAZ004 ---
+loc20=Fairfield KFFL IAZ087 ---
+loc21=Fort\\ Dodge KFOD IAZ035 043
+loc22=Fort\\ Madison KFSW IAZ099 ---
+loc23=Iowa\\ City KIOW IAZ064 ---
+loc24=Keokuk KEOK ------ ---
+loc25=Knoxville KOXV ------ ---
+loc26=Lamoni K0Y7 IAZ094 057
+loc27=Le\\ Marine KLRJ ------ ---
+loc28=Marshalltown KMIW IAZ049 ---
+loc29=Mason\\ City KMCW IAZ017 044
+loc30=Monticello KMXO IAZ053 ---
+loc31=Muscatine KMUT IAZ067 ---
+loc32=Newton KTNU IAZ061 ---
+loc33=Oelwen KOLZ IAZ029 ---
+loc34=Orange\\ City KORC IAZ012 ---
+loc35=Ottumwa KOTM IAZ086 058
+loc36=Red\\ Oak KRDK IAZ080 ---
+loc37=Sheldon KSHL IAZ012 ---
+loc38=Shenandoah KSDA IAZ091 ---
+loc39=Sioux\\ City KSUX IAZ031 043
+loc40=Spencer KSPW IAZ014 043
+loc41=Storm\\ Lake KSLB IAZ022 ---
+loc42=Washington KAWG IAZ077 ---
+loc43=Waterloo KALO IAZ039 044
+loc44=Webster\\ City KEBS ------ ---
+
+[US_KS]
+name=Kansas
+loc0=Chanute KCNU KSZ096 084
+loc1=Concordia KCNK KSZ020 071
+loc2=Dodge\\ City KDDC KSZ078 070
+loc3=Elkhart K1K5 KSZ084 ---
+loc4=Emporia KEMP KSZ054 071
+loc5=Fort\\ Riley KFRI KSZ036 ---
+loc6=Garden\\ City KGCK KSZ063 070
+loc7=Goodland KGLD KSZ013 070
+loc8=Hays KHYS KSZ031 ---
+loc9=Hill\\ City KHLC KSZ016 070
+loc10=Hutchinson KHUT KSZ067 084
+loc11=Liberal KLBL KSZ086 ---
+loc12=Manhattan KMHK KSZ022 071
+loc13=Medicine\\ Lodge KP28 KSZ090 ---
+loc14=Olathe KOJC KSZ105 071
+loc15=Olathe/Ind. KIXD KSZ105 071
+loc16=Russell KRSL KSZ032 070
+loc17=Salina KSLN KSZ049 071
+loc18=Topeka KTOP KSZ039 071
+loc19=Topeka-Forbes\\ Field KFOE KSZ039 071
+loc20=Wichita KICT KSZ083 084
+loc21=Wichita-Jabara K3KM KSZ083 084
+loc22=Wichita-McConnell\\ AFB KIAB KSZ083 084
+
+[US_KY]
+name=Kentucky
+loc0=Bowling\\ Green KBWG KYZ071 087
+loc1=Covington KCVG KYZ092 074
+loc2=Fort\\ Campbell KHOP KYZ017 ---
+loc3=Fort\\ Knox KFTK KYZ028 ---
+loc4=Frankfort KFFT KYZ035 ---
+loc5=Henderson KEHR KYZ018 ---
+loc6=Jackson KJKL KYZ112 087
+loc7=Lexington KLEX KYZ041 074
+loc8=London KLOZ ------ 087
+loc9=Louisville KLOU KYZ030 073
+loc10=Louisville-Standiford\\ Field KSDF KYZ030 073
+loc11=Owensboro KOWB KYZ019 086
+loc12=Paducah KPAH KYZ005 ---
+loc13=Pikeville K5I3 KYZ120 ---
+loc14=Somerset KSME KYZ079 ---
+
+[US_LA]
+name=Lousiana
+loc0=Alexandria KAEX LAZ028 115
+loc1=Alexandria-Esler KESF LAZ028 115
+loc2=Amelia K7R3 ------ ---
+loc3=Barksdale KBAD ------ ---
+loc4=Baton\\ Rouge KBTR LAZ048 121
+loc5=Cameron K7R5 LAZ051 ---
+loc6=Fort\\ Polk-Leesville KPOE LAZ027 115
+loc7=Fourchon K9F2 ------ ---
+loc8=Grand\\ Isle KAXO LAZ061 ---
+loc9=Houma KHUM LAZ066 ---
+loc10=Intracoastal K7R4 LAZ052 ---
+loc11=Lafayette KLFT LAZ044 121
+loc12=Lake\\ Charles KLCH LAZ041 121
+loc13=Monroe KMLU LAZ014 ---
+loc14=New\\ Iberia KARA LAZ053 ---
+loc15=New\\ Orleans KMSY LAZ062 121
+loc16=New\\ Orleans\\ NAS KNBG LAZ062 121
+loc17=New\\ Orleans-Lakefront KNEW LAZ062 121
+loc18=Patterson KPTN ------ ---
+loc19=Salt\\ point KP92 ------ ---
+loc20=Shreveport\\ Downtown KDTN LAZ001 107
+loc21=Shreveport\\ Regional KSHV LAZ001 107
+loc22=South\\ Marsh\\ Island K7R8 LAZ053 ---
+loc23=South\\ Timbalier KS58 ------ ---
+loc24=Venice K7R1 ------ 121
+loc25=Vermillion K9R9 ------ ---
+loc26=Vicksburg KTVR ------ ---
+
+[US_ME]
+name=Maine
+loc0=Augusta KAUG MEZ021 034
+loc1=Bangor KBGR MEZ015 034
+loc2=Bar\\ Harbor KBHB MEZ029 ---
+loc3=Brunswick KNHZ MEZ024 049
+loc4=Caribou KCAR MEZ002 ---
+loc5=Clayton\\ Lake K40B ------ ---
+loc6=Frenchville KFVE MEZ002 ---
+loc7=Fryeburg KIZG ------ ---
+loc8=Greenville K3B1 MEZ010 034
+loc9=Houlton KHUL MEZ002 ---
+loc10=Lewiston KLEW MEZ020 ---
+loc11=Millinocket KMLT MEZ015 ---
+loc12=Portland KPWM MEZ024 049
+loc13=Presque\\ Isle KPQI MEZ002 ---
+loc14=Rockland KRKD MEZ027 ---
+loc15=Sanford KSFM MEZ023 ---
+loc16=Turin K3B5 ------ ---
+loc17=Waterville KWVL MEZ021 ---
+loc18=Wiscasset KIWI MEZ026 ---
+
+[US_MS]
+name=Mississippi
+loc0=Columbus KGTR MSZ031 109
+loc1=Columbus-W\\ Point-Starkville KCBM MSZ031 109
+loc2=Greenville KGLH ------ 108
+loc3=Greenwood KGWO MSZ025 108
+loc4=Gulfport KGPT MSZ081 ---
+loc5=Jackson KJAN MSZ048 108
+loc6=Laurel KPIB MSZ066 ---
+loc7=McComb KMCB MSZ070 ---
+loc8=Meridian KMEI MSZ052 109
+loc9=Meridian-Lauderdale KNMM MSZ052 109
+loc10=Natchez KHEZ MSZ060 ---
+loc11=Tupelo KTUP MSZ016 098
+loc12=Vicksburg KTVR MSZ047 ---
+
+[US_MO]
+name=Missouri
+loc0=Cape\\ Girardeau KCGI MOZ087 ---
+loc1=Columbia KCOU MOZ041 072
+loc2=Fort\\ Leonard KTBN MOZ070 072
+loc3=Grandview KGVW MOZ037 ---
+loc4=Jefferson\\ City KJEF MOZ048 072
+loc5=Joplin KJLN MOZ088 084
+loc6=Kansas\\ City KMKC MOZ037 071
+loc7=Kansas\\ City-Gladstone KMCI MOZ029 071
+loc8=Kirksville KIRK MOZ017 058
+loc9=Poplar\\ Bluff KP02 MOZ109 ---
+loc10=Sedalia KSZL MOZ045 ---
+loc11=Spickard KP35 MOZ015 ---
+loc12=Springfield KSGF MOZ095 084
+loc13=St\\ Joseph KSTJ MOZ020 057
+loc14=St\\ Louis KSTL MOZ064 stl
+loc15=St\\ Louis-Spirit KSUS MOZ064 stl
+loc16=Vichy-Rolla KVIH MOZ058 072
+
+[US_MT]
+name=Montana
+loc0=Billings KBIL MTZ035 ---
+loc1=Bozeman KBZN MTZ015 013
+loc2=Broadus K4BQ MTZ036 ---
+loc3=Butte KBTM MTZ007 013
+loc4=Cut\\ Bank KCTB MTZ010 004
+loc5=Dillon KDLN MTZ008 025
+loc6=Drummond K3DU MTZ006 013
+loc7=Glasgow KGGW MTZ017 ---
+loc8=Glendive KGDV MTZ025 ---
+loc9=Great\\ Falls KGFA MTZ012 004
+loc10=Harlowton K3HT MTZ028 ---
+loc11=Havre KHVR MTZ011 004
+loc12=Helena KHLN MTZ014 013
+loc13=Jordan KJDN MTZ022 ---
+loc14=Kalispell KFCA MTZ003 004
+loc15=Lewistown KLWT MTZ013 013
+loc16=Livingston KLVM MTZ028 013
+loc17=Miles\\ City KMLS MTZ032 ---
+loc18=Missoula KMSO MTZ005 013
+loc19=Monida KMQM ------ ---
+loc20=Sidney KSDY MTZ024 ---
+loc21=Thompson\\ Falls K3TH MTZ004 ---
+loc22=West\\ Yellowstone KWYS MTZ015 025
+loc23=West\\ Yellowstone\\ (2) KWEY MTZ015 025
+loc24=Wolf\\ Point KOLF MTZ020 ---
+
+[US_NE]
+name=Nebraska
+loc0=Ainsworth KANW NEZ008 042
+loc1=Alliance KAIA NEZ003 ---
+loc2=Beatrice KBIE NEZ089 057
+loc3=Broken\\ Bow KBBW NEZ038 056
+loc4=Burwell KK20 ------ ---
+loc5=Chadron KCDR NEZ002 041
+loc6=Columbus KOLU NEZ042 ---
+loc7=Falls\\ City KFNB NEZ093 057
+loc8=Grand\\ Island KGRI NEZ062 056
+loc9=Hastings KHSI NEZ075 056
+loc10=Imperial KIML NEZ069 055
+loc11=Imperial\\ (2) K6V1 NEZ069 055
+loc12=Kearney KEAR NEZ061 ---
+loc13=Lincoln KLNK NEZ066 057
+loc14=McCook KMCK NEZ081 056
+loc15=Mullen KMHN NEZ007 042
+loc16=Norfolk KOFK NEZ031 042
+loc17=North\\ Platte KLBF NEZ059 ---
+loc18=O'Neill KONL NEZ010 042
+loc19=Omaha KOMA NEZ052 057
+loc20=Omaha-Bellevue KOFF NEZ052 057
+loc21=Ord-Sharp KODX NEZ039 ---
+loc22=Scottsbluff KBFF NEZ019 041
+loc23=Sidney KSNY NEZ055 055
+loc24=Valentine KVTN NEZ005 042
+
+[US_NH]
+name=New Hampshire
+loc0=Berlin KBML NHZ002 034
+loc1=Concord KCON NHZ008 049
+loc2=Jaffrey KAFN NHZ011 ---
+loc3=Keene KEEN NHZ011 049
+loc4=Laconia KLCI NHZ009 049
+loc5=Lebanon KLEB NHZ003 049
+loc6=Manchester KMHT NHZ012 049
+loc7=Mt\\ Washington KMWN ------ 034
+loc8=Nashua KASH NHZ012 ---
+loc9=North\\ Conway KCWN ------ ---
+loc10=Portsmouth KPSM NHZ013 049
+loc11=Whitefield KHIE ------ ---
+
+[US_NM]
+name=New Mexico
+loc0=Alamogordo KHMN NMZ024 ---
+loc1=Albuquerque KABQ NMZ009 abq
+loc2=Carlsbad KCNM NMZ028 ---
+loc3=Clayton KCAO NMZ007 ---
+loc4=Clovis-Cannon\\ AFB KCVS NMZ021 ---
+loc5=Corona K4CR NMZ016 ---
+loc6=Cuba\\ Awrs K4SL NMZ002 ---
+loc7=Deming KDMN NMZ031 ---
+loc8=Farmington KFMN NMZ001 081
+loc9=Gallup KGUP NMZ008 093
+loc10=Grants KGNT NMZ008 093
+loc11=Hobbs KHOB NMZ029 ---
+loc12=Las\\ Vegas KLVS NMZ005 abq
+loc13=Los\\ Alamos KLAM NMZ002 081
+loc14=Moriarty K4MY NMZ011 ---
+loc15=Roswell KROW NMZ019 ---
+loc16=Ruidoso-Sierra\\ Blanca KRUI NMZ016 ---
+loc17=Santa\\ Fe KSAF NMZ011 abq
+loc18=Silver\\ City KSVC NMZ022 ---
+loc19=Socorro KONM NMZ015 ---
+loc20=Taos KE23 NMZ004 ---
+loc21=Truth\\ or\\ Consequences KTCS NMZ023 ---
+loc22=Tucumcari KTCC NMZ013 ---
+loc23=Zuni\\ Pueblo KZUN ------ ---
+
+[US_ND]
+name=North Dakota
+loc0=Bismark KBIS NDZ035 016
+loc1=Devils\\ Lake KDVL NDZ015 007
+loc2=Devils\\ Lake\\ (2) KP11 NDZ015 007
+loc3=Dickinson KDIK NDZ033 015
+loc4=Fargo KFAR NDZ039 ---
+loc5=Grand\\ Forks KGFK NDZ027 007
+loc6=Jamestown KJMS NDZ037 016
+loc7=Lidgerwood KP67 NDZ053 ---
+loc8=Minot KMOT NDZ011 007
+loc9=Minot\\ AFB KMIB NDZ011 007
+loc10=Roseglen KP24 NDZ021 ---
+loc11=Williston KISN NDZ009 006
+
+[US_OK]
+name=Oklahoma
+loc0=Altus KLTS OKZ036 ---
+loc1=Ardmore KADM OKZ046 ---
+loc2=Bartlesville KBVO OKZ054 084
+loc3=Clinton KCSM OKZ016 ---
+loc4=Enid KEND OKZ012 ---
+loc5=Enid/Woodring KWDG OKZ012 084
+loc6=Fort\\ Sill KFSI OKZ038 ---
+loc7=Gage KGAG OKZ009 ---
+loc8=Guymon KGUY ------ 082
+loc9=Hobart KHBR OKZ035 095
+loc10=Lawton KLAW OKZ038 ---
+loc11=McAlester KMLC OKZ073 ---
+loc12=Oklahoma\\ City KOKC OKZ025 095
+loc13=Oklahoma\\ City-Bethany KPWA OKZ025 095
+loc14=Oklahoma\\ City-Midwest\\ City KTIK OKZ025 095
+loc15=Page KPGO OKZ076 ---
+loc16=Ponca\\ City KPNC OKZ008 084
+loc17=Stillwater KSWO OKZ020 084
+loc18=Tulsa KTUL OKZ060 084
+
+[US_SD]
+name=South Dakota
+loc0=Aberdeen KABR SDZ006 ---
+loc1=Brookings KBKX SDZ040 ---
+loc2=Chamberlain K9V9 SDZ057 ---
+loc3=Custer K0V1 SDZ029 ---
+loc4=Huron KHON SDZ038 028
+loc5=Lemmon KY22 SDZ002 ---
+loc6=Mitchell KMHE SDZ059 028
+loc7=Mobridge KY26 SDZ009 028
+loc8=Philip KPHP SDZ032 028
+loc9=Pierre KPIR SDZ035 028
+loc10=Rapid\\ City KRAP SDZ031 027
+loc11=Rapid\\ City-Ellsworth\\ AFB KRCA SDZ031 027
+loc12=Redig KREJ SDZ001 ---
+loc13=Sioux\\ Falls KFSD SDZ062 043
+loc14=Watertown KATY SDZ020 ---
+loc15=Yankton KYKN SDZ069 043
+
+[US_UT]
+name=Utah
+loc0=Blanding K4BL UTZ022 067
+loc1=Bryce\\ Canyon KBCE UTZ020 080
+loc2=Bullfrog KU17 UTZ021 ---
+loc3=Cedar\\ City KCDC UTZ016 080
+loc4=Delta KU24 UTZ015 ---
+loc5=Dugway KDPG UTZ005 slc
+loc6=Eagle\\ Range KU16 ------ ---
+loc7=Green\\ River KU28 UTZ013 ---
+loc8=Hanksville K4HV UTZ013 067
+loc9=Logan KLGU UTZ001 ---
+loc10=Milford KMLF UTZ016 ---
+loc11=Ogden KOGD UTZ002 slc
+loc12=Ogden-Hill\\ AFB KHIF UTZ002 slc
+loc13=Price-Carbon KPUC UTZ012 067
+loc14=Provo KPVU UTZ004 slc
+loc15=Roosevelt KU67 UTZ011 ---
+loc16=St.\\ George KSGU UTZ019 080
+loc17=Salt\\ Lake\\ City KSLC UTZ003 slc
+loc18=Vernal KVEL UTZ024 ---
+loc19=Wendover KENV UTZ005 slc
+
+[US_VT]
+name=Vermont
+loc0=Ball\\ Mountain K8B3 ------ ---
+loc1=Burlington KBTV VTZ005 ---
+loc2=Canaan KVT1 ------ ---
+loc3=Enosburg\\ Falls K3B8 ------ ---
+loc4=Montpelier KMPV VTZ008 034
+loc5=Newport KNPV VTZ003 034
+loc6=Pownal K5B5 ------ ---
+loc7=Rutland KRUT VTZ011 ---
+loc8=Springfield KVSF VTZ012 ---
+loc9=St\\ Johnsbury K9B2 VTZ007 ---
+loc10=Waterbury K5B1 ------ ---
+loc11=West\\ Burke KVT2 ------ ---
+loc12=Wilmington K0B0 VTZ014 049
+
+[US_WY]
+name=Wyoming
+loc0=Big\\ Piney KBPI WYZ020 ---
+loc1=Casper KCPR WYZ064 ---
+loc2=Cheyenne KCYS WYZ069 ---
+loc3=Cody KCOD WYZ002 026
+loc4=Douglas K4DG WYZ059 ---
+loc5=Evanston KEVW WYZ021 ---
+loc6=Gillette KGCC WYZ054 026
+loc7=Jackson KJAC WYZ006 ---
+loc8=Lander KLND WYZ012 040
+loc9=Laramie KLAR WYZ066 ---
+loc10=Rawlins KRWL WYZ061 040
+loc11=Riverton KRIW WYZ013 040
+loc12=Rock\\ Springs KRKS WYZ022 ---
+loc13=Sheridan KSHR WYZ099 ---
+loc14=Worland KWRL WYZ009 026
+loc15=Yellowstone KP60 WYZ001 ---
+
+
+[US_PA]
+name=Pennsylvania
+loc0=Allentown KABE PAZ061 062
+loc1=Altoona KAOO PAZ025 061
+loc2=Bradford KBFD PAZ005 047
+loc3=Du\\ Bois KDUJ PAZ017 061
+loc4=Erie KERI PAZ002 047
+loc5=Franklin KFKL PAZ008 061
+loc6=Harrisburg KCXY PAZ057 062
+loc7=Johnstown KJST PAZ024 pit
+loc8=Lancaster KLNS PAZ066 phl
+loc9=Latrobe KLBE PAZ030 pit
+loc10=Middletown KMDT PAZ057 062
+loc11=Muir KMUI PAZ058 062
+loc12=Northeast\\ Philadelphia KPNE PAZ071 phl
+loc13=Philadelphia KPHL PAZ071 phl
+loc14=Philipsburg KPSB PAZ019 061
+loc15=Pittsburgh KPIT PAZ021 pit
+loc16=Pittsburgh-West\\ Mifflin KAGC PAZ021 pit
+loc17=Reading KRDG PAZ060 phl
+loc18=Scranton KAVP PAZ047 062
+loc19=State\\ College KUNV PAZ019 061
+loc20=Wilkes\\ -\\ Barre KAVP PAZ047 062
+loc21=Williamsport KIPT PAZ046 062
+
+[US_CA]
+name=California
+loc0=Alturas KS11 CAZ012 ---
+loc1=Arcata KACV CAZ001 ---
+loc2=Avalon KAVX ------ ---
+loc3=Bakersfield KBFL CAZ021 ---
+loc4=Beaumont KBUO CAZ056 ---
+loc5=Bicycle\\ Lake KBYS ------ ---
+loc6=Bishop KBIH CAZ026 ---
+loc7=Blue\\ Canyon KBLU ------ ---
+loc8=Blythe KBLH CAZ031 ---
+loc9=Burbank KBUR CAZ047 ---
+loc10=Camarillo KCMA CAZ040 ---
+loc11=Campo KCZZ CAZ058 ---
+loc12=Carlsbad KCRQ CAZ043 ---
+loc13=Chico KCIC CAZ016 ---
+loc14=China\\ Lake KNID CAZ028 ---
+loc15=Chino KCNO CAZ048 ---
+loc16=Concord KCCR CAZ007 ---
+loc17=Crescent\\ City KCEC CAZ001 ---
+loc18=Daggett KDAG CAZ028 ---
+loc19=Edwards\\ AFB KEDW CAZ025 ---
+loc20=El\\ Centro KNJK CAZ033 ---
+loc21=El\\ Monte KEMT CAZ047 ---
+loc22=Fairfield KSUU CAZ018 ---
+loc23=Fresno KFAT CAZ020 078
+loc24=Fresno-Chandler KFCH CAZ020 078
+loc25=Fullerton KFUL CAZ042 ---
+loc26=Hawthorne KHHR CAZ041 ---
+loc27=Hayward KHWD CAZ007 ---
+loc28=Imperial KIPL CAZ033 ---
+loc29=Imperial\\ Beach KNRS CAZ043 ---
+loc30=Inyokern KIYK CAZ025 ---
+loc31=La\\ Verne KPOC CAZ047 ---
+loc32=Lake\\ Tahoe KTVL CAZ072 ---
+loc33=Lancaster KWJF CAZ059 ---
+loc34=Lemoore KNLC CAZ021 ---
+loc35=Livermore KLVK CAZ007 ---
+loc36=Lompoc KLPC CAZ035 ---
+loc37=Long\\ Beach KLGB CAZ041 lax
+loc38=Los\\ Angeles KLAX CAZ041 lax
+loc39=Mammoth\\ Lakes KMMH CAZ073 ---
+loc40=Marysville KMYV CAZ016 ---
+loc41=Marysville-Beale\\ AFB KBAB CAZ016 ---
+loc42=McClellan KMCC ------ ---
+loc43=Merced KMCE CAZ020 ---
+loc44=Modesto KMOD CAZ019 ---
+loc45=Mojave KMHV CAZ024 ---
+loc46=Montague KSIY CAZ011 ---
+loc47=Monterey KMRY CAZ009 ---
+loc48=Mount\\ Shasta KMHS CAZ011 ---
+loc49=Mount\\ Wilson KMWS CAZ047 ---
+loc50=Mountain\\ View KNUQ CAZ006 sfo
+loc51=Napa KAPC CAZ064 ---
+loc52=Needles KEED CAZ029 ---
+loc53=Oakland KOAK CAZ007 sfo
+loc54=Oceanside KNFG CAZ043 ---
+loc55=Ontario KONT CAZ048 lax
+loc56=Oxnard KOXR CAZ040 ---
+loc57=Palm\\ Springs KPSP CAZ061 ---
+loc58=Palmdale KPMD CAZ054 ---
+loc59=Palo\\ Alto KPAO CAZ006 sfo
+loc60=Paso\\ Robles KPRB CAZ037 ---
+loc61=Point\\ Mugu KNTD ------ ---
+loc62=Point\\ Piedras\\ Blanca K87Q ------ ---
+loc63=Porterville KPTV CAZ021 ---
+loc64=Red\\ Bluff KRBL CAZ015 ---
+loc65=Redding KRDD CAZ013 ---
+loc66=Riverside KRAL CAZ048 ---
+loc67=Riverside/March\\ AFB KRIV CAZ061 ---
+loc68=Sacramento KSAC CAZ017 ---
+loc69=Sacramento-Woodland KSMF CAZ017 ---
+loc70=Salinas KSNS CAZ009 ---
+loc71=San\\ Carlos KSQL CAZ006 ---
+loc72=San\\ Diego KSAN CAZ043 san
+loc73=San\\ Diego-Santee KSEE CAZ050 san
+loc74=San\\ Diego-Brown KSDM CAZ050 san
+loc75=San\\ Diego-Miramar KNKX CAZ043 san
+loc76=San\\ Diego-Montgomery KMYF CAZ043 san
+loc77=San\\ Diego-North\\ Island KNZY ------ san
+loc78=San\\ Francisco KSFO CAZ006 sfo
+loc79=San\\ Jose-Santa\\ Clara KSJC CAZ008 sfo
+loc80=San\\ Luis\\ Obispo KSBP CAZ034 ---
+loc81=San\\ Nicholas\\ Island KNSI CAZ039 ---
+loc82=Sandberg KSDB ------ ---
+loc83=Santa\\ Ana KSNA CAZ042 lax
+loc84=Santa\\ Barbara KSBA CAZ039 lax
+loc85=Santa\\ Maria KSMX CAZ035 090
+loc86=Santa\\ Monica KSMO CAZ041 ---
+loc87=Santa\\ Rosa KSTS CAZ005 ---
+loc88=Shelter\\ Cove KO87 CAZ001 ---
+loc89=Stockton KSCK CAZ019 ---
+loc90=Tahoe\\ Valley KTVL ------ ---
+loc91=Torrance KTOA CAZ042 lax
+loc92=Truckee KTRK CAZ072 ---
+loc93=Twentynine\\ Palms KNXP CAZ028 ---
+loc94=Ukiah KUKI CAZ003 ---
+loc95=Van\\ Nuys KVNY CAZ047 ---
+loc96=Vandenberg\\ AFB KVBG CAZ039 ---
+loc97=Vandenberg\\ Range KVBG CAZ039 ---
+loc98=Visalia KVIS CAZ021 ---
+
+[US_AL]
+name=Alabama
+loc0=Anniston KANB ALZ019 ---
+loc1=Auburn KAUO ALZ047 ---
+loc2=Birmingham KBHM ALZ024 019
+loc3=Decatur KDCU ------ ---
+loc4=Dothan KDHN ALZ066 ---
+loc5=Evergreen KGZH ------ ---
+loc6=Gadsden KGAD ALZ018 ---
+loc7=Huntsville KHSV ALZ006 ---
+loc8=Mobile\\ Regional\\ Airport KMOB ALZ061 ---
+loc9=Mobile\\ Downtown KBFM ALZ061 ---
+loc10=Montgomery KMGM ALZ044 109
+loc11=Montgomery-Maxwell\\ AFB KMXF ALZ044 109
+loc12=Muscle\\ Shoals KMSL ALZ002 ---
+loc13=Ozark KOZR ALZ066 ---
+loc14=Tuscaloosa KTCL ALZ023 ---
+
+[US_AZ]
+name=Arizona
+loc0=Casa\\ Granda KCGZ AZZ028 ---
+loc1=Chandler KIWA AZZ015 ---
+loc2=Douglas KDUG AZZ030 ---
+loc3=Flagstaff KFLG AZZ015 092
+loc4=Fort\\ Huachuca KFHU AZZ035 ---
+loc5=Gila\\ Bend KGBN AZZ027 ---
+loc6=Grand\\ Canyon KGCN AZZ006 ---
+loc7=Kingman KIGM AZZ003 ---
+loc8=Mesa-Falcon\\ Field KFFZ AZZ023 ---
+loc9=Nogales K13A AZZ034 ---
+loc10=Page KPGA AZZ005 ---
+loc11=Payson K0E4 AZZ018 ---
+loc12=Phoenix KPHX AZZ023 phx
+loc13=Phoenix-Deer\\ Valley KDVT AZZ023 phx
+loc14=Phoenix-Goodyear KGYR AZZ023 phx
+loc15=Phoenix-Luke\\ AFB KLUF AZZ023 phx
+loc16=Prescott KPRC AZZ008 ---
+loc17=Safford-Municipal\\ Airport KSAD AZZ030 ---
+loc18=Scottsdale KSDL AZZ023 ---
+loc19=Show\\ Low KSOW AZZ017 ---
+loc20=Tucson KTUS AZZ033 103
+loc21=Tucson-Davis\\ AFB KDMA AZZ033 103
+loc22=Winslow KINW AZZ013 ---
+loc23=Yuma\\ MCAS KNYL AZZ025 ---
+
+[US_CO]
+name=Colorado
+loc0=Air\\ Force KAFF COZ071 ---
+loc1=Akron KAKO COZ049 ---
+loc2=Alamosa KALS COZ063 ---
+loc3=Aspen KASE COZ010 068
+loc4=Colorado\\ Springs KCOS COZ071 ---
+loc5=Cortez KCEZ COZ021 ---
+loc6=Craig KCAG COZ002 ---
+loc7=Denver KDEN COZ040 den
+loc8=Denver-Aurora KAPA COZ040 den
+loc9=Denver-Broomfield KBKF COZ040 den
+loc10=Denver-Cherry\\ Knolls KBJC COZ040 den
+loc11=Durango KDRO COZ022 ---
+loc12=Durango\\ Awrs K4V5 COZ022 ---
+loc13=Eagle KEGE COZ010 ---
+loc14=Fort\\ Carson KFCS COZ071 ---
+loc15=Fort\\ Collins KFCL COZ035 ---
+loc16=Fort\\ Collins/Lovel KFNL COZ035 ---
+loc17=Grand\\ Junction KGJT COZ006 ---
+loc18=Greeley KGXY COZ043 ---
+loc19=Gunnison KGUC COZ012 ---
+loc20=Gunnison\\ (2) K2V9 COZ012 ---
+loc21=Hayden KHDN COZ005 ---
+loc22=La\\ Junta KLHX COZ076 ---
+loc23=Lamar K4LJ COZ080 ---
+loc24=Leadville KLXV COZ012 ---
+loc25=Limon KLIC COZ047 ---
+loc26=Montrose KMTJ COZ017 ---
+loc27=Montrose\\ (2) K6V8 COZ017 ---
+loc28=Pueblo KPUB COZ073 ---
+loc29=Rifle K1V1 COZ003 ---
+loc30=Salida KS29 COZ069 ---
+loc31=Salida-Harriet K0V2 COZ069 ---
+loc32=Steamboat\\ Springs KSBS COZ005 ---
+loc33=Trinidad KTAD COZ077 ---
+loc34=Winter\\ Park KC96 COZ033 ---
+
+[US_CT]
+name=Connecticut
+loc0=Bridgeport KBDR CTZ009 hfd
+loc1=Danbury KDXR CTZ009 ---
+loc2=Groton KGON CTZ012 hfd
+loc3=Hartford KHFD CTZ002 hfd
+loc4=New\\ Haven KHVN CTZ010 ---
+loc5=Oxford KOXC CTZ010 ---
+loc6=Windsor\\ Locks KBDL CTZ002 ---
+
+[US_DE]
+name=Delaware
+loc0=Dover KDOV DEZ002 076
+loc1=Wilmington KILG DEZ001 076
+
+[US_FL]
+name=Florida
+loc0=Apalachicola KAQQ FLZ015 ---
+loc1=Bartow KBOW ------ ---
+loc2=Brooksville KBKV FLZ048 ---
+loc3=Cecil\\ NAS KNZC FLZ025 ---
+loc4=Cocoa\\ Beach KCOF FLZ047 ---
+loc5=Crestview KCEW FLZ006 ---
+loc6=Cross\\ City KCTY FLZ034 ---
+loc7=Daytona\\ Beach KDAB FLZ041 ---
+loc8=Destin KDTS ------ ---
+loc9=Eglin KEGI FLZ006 ---
+loc10=Fort\\ Lauderdale\\ (International) KFLL FLZ072 ---
+loc11=Fort\\ Lauderdale KFXE FLZ072 ---
+loc12=Fort\\ Myers\\ (Page\\ Field) KFMY FLZ065 ---
+loc13=Fort\\ Myers\\ (Southwest\\ Florida\\ International) KRSW FLZ065 ---
+loc14=Gainesville KGNV FLZ036 ---
+loc15=Homestead\\ AFB KHST FLZ074 ---
+loc16=Hurlburt KHRT ------ ---
+loc17=Jacksonville KJAX FLZ025 ---
+loc18=Jacksonville\\ NAS KNIP FLZ025 ---
+loc19=Jacksonville-Craig\\ Airport KCRG FLZ025 ---
+loc20=Key\\ West KEYW FLZ075 ---
+loc21=Key\\ West\\ NAS KNQX FLZ075 ---
+loc22=Lakeland KLAL FLZ052 ---
+loc23=Leesburg KLEE ------ ---
+loc24=Marathon KMTH FLZ075 ---
+loc25=Marianna KMAI FLZ011 ---
+loc26=Mayport KNRB FLZ025 ---
+loc27=Melbourne KMLB FLZ047 ---
+loc28=Miami KMIA FLZ074 mia
+loc29=Miami-Kendall KTMB FLZ074 mia
+loc30=Miami-Opa\\ Locka KOPF FLZ074 mia
+loc31=Milton KNSE FLZ004 ---
+loc32=Nasa\\ Shuttle KTTS ------ ---
+loc33=Naples KAPF FLZ069 ---
+loc34=New\\ Port\\ Richey KRRF FLZ051 ---
+loc35=Ocala KOCF FLZ040 ---
+loc36=Orlando KORL FLZ045 ---
+loc37=Orlando\\ (Orlando\\ International) KMCO FLZ045 ---
+loc38=Panama\\ City KPFN FLZ012 ---
+loc39=Pensacola KPNS FLZ002 ---
+loc40=Pensacola\\ NAS KNPA FLZ002 ---
+loc41=Perry-Foley K40J ------ ---
+loc42=Pompano\\ Beach KPMP ------ ---
+loc43=Punta\\ Gorda KPGD ------ ---
+loc44=Sanford KSFB FLZ046 ---
+loc45=Sarasota KSRQ FLZ060 ---
+loc46=St\\ Petersburg KSPG FLZ050 ---
+loc47=St\\ Petersburg\\ /\\ Clearwater KPIE FLZ050 ---
+loc48=Tallahassee KTLH FLZ017 ---
+loc49=Tampa KTPA FLZ051 ---
+loc50=Tampa-Macdill\\ AFB KMCF FLZ051 ---
+loc51=Titusville KTIX FLZ047 ---
+loc52=Tyndall\\ AFB KPAM ------ ---
+loc53=Valparaiso KVPS FLZ006 ---
+loc54=Valparaiso-Eglin\\ AFB KEGI FLZ006 ---
+loc55=Vero\\ Beach KVRB FLZ054 ---
+loc56=West\\ Palm\\ Beach KPBI FLZ068 ---
+loc57=Winter\\ Haven KGIF ------ ---
+
+[US_GA]
+name=Georgia
+loc0=Albany KABY GAZ125 ---
+loc1=Alma KAMG GAZ134 ---
+loc2=Athens KAHN GAZ036 atl
+loc3=Atlanta KATL GAZ033 atl
+loc4=Augusta KAGS GAZ065 ---
+loc5=Brunswick KSSI GAZ154 ---
+loc6=Columbus KCSG GAZ089 ---
+loc7=Columbus-Fort\\ Benning KLSF GAZ089 ---
+loc8=Dekalb/Peachtree KPDK ------ ---
+loc9=Hinesville KLHW ------ ---
+loc10=Fort\\ Benning KLSF GAZ090 ---
+loc11=Fort\\ Stewart KLHW GAZ138 ---
+loc12=Macon KMCN GAZ082 ---
+loc13=Marietta KMGE GAZ032 ---
+loc14=Moultrie KMGR ------ ---
+loc15=Rome-Russell KRMG GAZ019 atl
+loc16=Savannah KSAV GAZ119 ---
+loc17=Savannah-Hunter\\ AAF KSVN GAZ119 ---
+loc18=St\\ Simon's\\ Island KSSI GAZ154 ---
+loc19=Valdosta KVLD GAZ160 ---
+loc20=Valdosta-Moody\\ AFB KVAD GAZ160 ---
+loc21=Warner\\ Robins KWRB GAZ095 ---
+loc22=West\\ Atlanta KFTY GAZ033 ---
+loc23=Waycross KAYS GAZ151 ---
+
+[US_HI]
+name=Hawaii
+loc0=Barbers\\ Point PHNA HIZ002 ---
+loc1=Barking\\ Sand PHBK ------ ---
+loc2=Bradshaw\\ Field PHSF ------ ---
+loc3=Hilo PHTO HIZ004 ---
+loc4=Honolulu PHNL HIZ002 ---
+loc5=Kahului PHOG HIZ003 ---
+loc6=Kailua-Kona PHKO HIZ002 ---
+loc7=Kaneohe PHNG HIZ002 ---
+loc8=Lahaina PHJH HIZ003 ---
+loc9=Lanai PHNY HIZ003 ---
+loc10=Lihue PHLI HIZ001 ---
+loc11=Molokai PHMK HIZ005 ---
+loc12=Oahu PHHI HIZ002 ---
+
+[US_IL]
+name=Illinois
+loc0=Alton KALN ILZ100 ---
+loc1=Aurora KARR ILZ013 ---
+loc2=Belleville KBLV ILZ101 ---
+loc3=Bloomington KBMI ILZ038 ---
+loc4=Cairo KCIR ILZ092 ---
+loc5=Carbondale KMDH ILZ084 ---
+loc6=Champaign KCMI ILZ045 059
+loc7=Chicago-DuPage KDPA ILZ014 ord
+loc8=Chicago-O'Hare KORD ILZ013 ord
+loc9=Chicago-Lakefront KCGX ILZ014 ord
+loc10=Chicago-Midway KMDW ILZ014 ord
+loc11=Danville KDNV ILZ046 ---
+loc12=Decatur KDEC ILZ053 ---
+loc13=East\\ St\\ Louis KCPS ILZ101 ---
+loc14=Galesburg KGBG ILZ027 ---
+loc15=Marion KMWA ILZ085 ---
+loc16=Marseilles KMMO ILZ019 ---
+loc17=Mattoon KMTO ILZ056 ---
+loc18=Moline-Quad\\ Cities KMLI ILZ015 ---
+loc19=Mount\\ Vernon KMVN ILZ075 ---
+loc20=Peoria KPIA ILZ029 ---
+loc21=Quincy KUIN ILZ095 ---
+loc22=Rockford KRFD ILZ003 ---
+loc23=Salem KSLO ILZ070 ---
+loc24=Springfield KSPI ILZ051 ---
+
+[US_IN]
+name=Indiana
+loc0=Bloomington KBMG INZ062 ---
+loc1=Elkhart KEKM INZ005 ---
+loc2=Evansville KEVV INZ086 ---
+loc3=Fort\\ Wayne KFWA INZ018 ---
+loc4=Gary KGYY INZ001 ---
+loc5=Indianapolis KIND INZ047 ---
+loc6=Lafayette KLAF INZ029 ---
+loc7=Marion KMZZ ------ ---
+loc8=Muncie KMIE INZ041 ---
+loc9=Peru KGUS INZ023 ---
+loc10=South\\ Bend KSBN INZ004 ---
+loc11=Terre\\ Haute KHUF INZ051 ---
+
+[US_MD]
+name=Maryland
+loc0=Aberdeen KAPG ------ ---
+loc1=Andrews\\ AFB KADW MDZ013 ---
+loc2=Baltimore KMTN MDZ011 dca
+loc3=Baltimore-Glen\\ Burnie KBWI MDZ014 dca
+loc4=Cumberland KCBE ------ ---
+loc5=Fort\\ Meade KFME MDZ014 ---
+loc6=Hagerstown KHGR MDZ003 ---
+loc7=Oakland K2G4 ------ 075
+loc8=Patuxent\\ River KNHK MDZ014 ---
+loc9=Salisbury KSBY MDZ022 ---
+
+[US_MI]
+name=Michigan
+loc0=Ann\\ Arbor KARB MIZ075 dtw
+loc1=Alpena KAPN MIZ024 ---
+loc2=Battle\\ Creek KBTL MIZ073 ---
+loc3=Benton\\ Harbor KBEH ------ ---
+loc4=Chippewa\\ County KCIU MIZ008 ---
+loc5=Copper\\ Harbor KP59 MIZ003 ---
+loc6=Detroit KDET MIZ076 dtw
+loc7=Detroit-Taylor KDTW MIZ076 dtw
+loc8=Detroit/Ypsilanti KYIP MIZ075 dtw
+loc9=Escanaba KESC MIZ013 ---
+loc10=Flint KFNT MIZ061 dtw
+loc11=Grand\\ Rapids KGRR MIZ057 ---
+loc12=Hancock KCMX MIZ003 ---
+loc13=Harbor\\ Beach KP58 MIZ049 ---
+loc14=Houghton\\ Lake KHTL MIZ034 ---
+loc15=Iron\\ Mountain KIMT MIZ011 ---
+loc16=Ironwood KIWD MIZ009 ---
+loc17=Jackson KJXN MIZ074 dtw
+loc18=Kalamazoo KAZO MIZ072 045
+loc19=Lansing KLAN MIZ066 ---
+loc20=Manistee KMBL MIZ031 ---
+loc21=Menominee KMNM MIZ012 ---
+loc22=Mount\\ Clemens KMTC MIZ070 ---
+loc23=Muskegon KMKG MIZ050 ---
+loc24=Oscoda KOSC MIZ036 ---
+loc25=Pellston KPLN MIZ016 ---
+loc26=Pontiac KPTK MIZ069 ---
+loc27=Saginaw KMBS MIZ053 ---
+loc28=Sault\\ Ste\\ Marie KSSM MIZ008 ---
+loc29=Sawyer\\ AFB KSAW MIZ077 ---
+loc30=Seul\\ Choix\\ Pt KP75 ------ ---
+loc31=Traverse\\ City KTVC MIZ020 ---
+loc32=Ypsilanti KYIP MIZ075 dtw
+
+[US_MN]
+name=Minnesota
+loc0=Alexandria KAXN MNZ041 ---
+loc1=Bemidji KBJI MNZ009 ---
+loc2=Brainerd KBRD MNZ034 ---
+loc3=Detroit\\ Lakes KDTL MNZ027 ---
+loc4=Duluth KDLH MNZ019 ---
+loc5=Ely KELO MNZ019 ---
+loc6=Fairmont KFRM MNZ091 ---
+loc7=Fergus\\ Falls KFFM MNZ031 ---
+loc8=Grand\\ Marais KP61 MNZ021 ---
+loc9=Grand\\ Rapids KGPZ MNZ026 ---
+loc10=Hibbing KHIB MNZ019 ---
+loc11=International\\ Falls KINL MNZ010 ---
+loc12=Litchfield KY69 MNZ058 ---
+loc13=Mankato KMKT MNZ083 ---
+loc14=Marshall KMML MNZ072 ---
+loc15=Minneapolis KMSP MNZ060 msp
+loc16=Minneapolis\\ [2] KFCM MNZ060 msp
+loc17=Minneapolis\\ [3] KMIC MNZ060 msp
+loc18=Pequot\\ Lakes KP39 MNZ034 ---
+loc19=Redwood\\ Falls KRWF MNZ073 ---
+loc20=Rochester KRST MNZ087 030
+loc21=St\\ Cloud KSTC MNZ051 ---
+loc22=St\\ Paul KSTP MNZ062 ---
+loc23=Thief\\ River\\ Falls KTVF MNZ013 ---
+loc24=Warroad KD45 MNZ005 ---
+loc25=Worthington KOTG MNZ089 ---
+
+[US_NV]
+name=Nevada
+loc0=Austin KU31 NVZ012 ---
+loc1=Battle\\ Mountain KBAM NVZ012 ---
+loc2=Caliente KP38 NVZ015 ---
+loc3=Desert\\ Rock KDRA ------ ---
+loc4=Elko KEKO NVZ008 ---
+loc5=Ely KELY NVZ011 ---
+loc6=Eureka KP68 NVZ012 ---
+loc7=Fallon KNFL NVZ004 ---
+loc8=Hawthorne KHTH NVZ001 ---
+loc9=Indian\\ Springs KL63 NVZ017 ---
+loc10=Las\\ Vegas KLAS NVZ020 079
+loc11=N\\ Las\\ Vegas KLSV NVZ020 079
+loc12=Lovelock KLOL NVZ004 ---
+loc13=Owyhee KOWY NVZ007 ---
+loc14=Reno KRNO NVZ003 065
+loc15=Tonopah KTPH NVZ014 ---
+loc16=Winnemucca KWMC NVZ006 ---
+
+[US_NJ]
+name=New Jersey
+loc0=Atlantic\\ City KACY NJZ022 ---
+loc1=Belmar-Farmingdale KBLM NJZ013 ---
+loc2=Caldwell KCDW NJZ005 ---
+loc3=Lakehurst KNEL ------ ---
+loc4=Millville KMIV NJZ021 ---
+loc5=Morristown KMMU NJZ008 ---
+loc6=Mount\\ Holly KVAY ------ ---
+loc7=Newark KEWR NJZ005 ---
+loc8=Teterboro KTEB NJZ003 ---
+loc9=Trenton KTTN NJZ015 ---
+loc10=Wildwood KWWD NJZ024 ---
+loc11=Wrightstown\\ /\\ Mcguire\\ AFB KWRI NJZ019 ---
+
+[US_NC]
+name=North Carolina
+loc0=Asheville KAVL NCZ053 ---
+loc1=Cape\\ Hatteras KHAT NCZ047 ---
+loc2=Charlotte KCLT NCZ071 100
+loc3=Cherry\\ Point KNKT ------ ---
+loc4=Elizabeth\\ City KECG NCZ016 ---
+loc5=Fayetteville KFAY NCZ088 100
+loc6=Fort\\ Bragg KFBG NCZ088 ---
+loc7=Goldsboro KGSB NCZ078 ---
+loc8=Greensboro KGSO NCZ022 rdu
+loc9=Hickory KHKY NCZ056 ---
+loc10=Hoffman KHFF ------ ---
+loc11=Hot\\ Springs KHSS NCZ048 ---
+loc12=Jacksonville KOAJ NCZ098 ---
+loc13=Kinston KISO NCZ091 ---
+loc14=New\\ Bern KEWN NCZ093 ---
+loc15=New\\ River KNCA NCZ098 ---
+loc16=Pope\\ AFB KPOB NCZ088 ---
+loc17=Raleigh-Durham KRDU NCZ041 rdu
+loc18=Rocky\\ Mount KRWI NCZ028 rdu
+loc19=Stumpy\\ Point K2DP ------ ---
+loc20=Wilmington KILM NCZ101 ---
+loc21=Winston-Salem KINT NCZ021 ---
+
+[US_OH]
+name=Ohio
+loc0=Akron KCAK OHZ021 ---
+loc1=Cincinnati KLUK OHZ077 074
+loc2=Cleveland KCLE OHZ011 cle
+loc3=Cleveland-Lakefront KBKL OHZ011 cle
+loc4=Cleveland/Cuyahoga KCGF OHZ011 cle
+loc5=Columbus-Gahanna KCMH OHZ055 ---
+loc6=Columbus-OSU KOSU OHZ055 ---
+loc7=Dayton KDAY OHZ061 074
+loc8=Dayton-Fairborn KFFO OHZ061 ---
+loc9=Dayton-South\\ Airport KMGY OHZ061 ---
+loc10=Findlay KFDY OHZ017 ---
+loc11=Hamilton KHAO OHZ070 ---
+loc12=Lancaster KLHQ OHZ067 ---
+loc13=Mansfield KMFD OHZ029 ---
+loc14=Rickenbacker KLCK OHZ070 ---
+loc15=Toledo KTOL OHZ003 ---
+loc16=Willoughby KLNN OHZ012 ---
+loc17=Wilmington KILN OHZ072 ---
+loc18=Wooster KBJJ OHZ031 ---
+loc19=Youngstown KYNG OHZ033 ---
+loc20=Zanesville KZZV OHZ057 ---
+
+[US_OR]
+name=Oregon
+loc0=Astoria KAST ORZ001 ---
+loc1=Aurora K3S2 ORZ005 ---
+loc2=Baker\\ City KBKE ORZ020 ---
+loc3=Brookings K4BK ORZ003 ---
+loc4=Burns KBNO ORZ022 ---
+loc5=Cascade KCZK ORZ015 ---
+loc6=Eugene KEUG ORZ006 ---
+loc7=Hillsboro KHIO ORZ004 ---
+loc8=Klamath\\ Falls KLMT ORZ012 ---
+loc9=Lakeview K4LW ORZ015 ---
+loc10=Meacham KMEH ORZ017 ---
+loc11=Medford KMFR ORZ008 ---
+loc12=Newport KONP ORZ002 ---
+loc13=North\\ Bend KOTH ORZ003 ---
+loc14=Ontario KONO ORZ021 ---
+loc15=Pendleton KPDT ORZ017 ---
+loc16=Portland KPDX ORZ004 ---
+loc17=Redmond KRDM ORZ014 ---
+loc18=Roseburg KRBG ORZ007 ---
+loc19=Salem KSLE ORZ005 ---
+loc20=Sexton\\ Summit KSXT ORZ008 ---
+loc21=The\\ Dalles KDLS ORZ010 ---
+loc22=Troutdale KTTD ORZ004 ---
+
+[US_RI]
+name=Rhode Island
+loc0=Block\\ Island KBID RIZ006 ---
+loc1=North\\ Kingstown KOQU RIZ006 ---
+loc2=Providence KPVD RIZ002 bos
+
+[US_SC]
+name=South Carolina
+loc0=Anderson KAND SCZ010 099
+loc1=Beaufort KNBC SCZ048 ---
+loc2=Charleston KCHS SCZ050 ---
+loc3=Columbia KCAE SCZ028 100
+loc4=Columbia-McEntire KMMT SCZ028 100
+loc5=Florence KFLO SCZ032 ---
+loc6=Greenville KGMU SCZ006 099
+loc7=Greenville-Spartanburg KGSP SCZ007 099
+loc8=Myrtle\\ Beach KMYR SCZ034 ---
+loc9=N\\ Myrtle\\ Beach KCRE SCZ034 ---
+loc10=Sumter KSSC SCZ031 ---
+loc11=Sumter\\ (2) K2PJ SCZ031 ---
+
+[US_TN]
+name=Tennessee
+loc0=Bristol KTRI TNZ017 ---
+loc1=Chattanooga KCHA TNZ099 ---
+loc2=Crossville KCSV TNZ066 ---
+loc3=Dyersburg KDYR TNZ019 ---
+loc4=Jackson KMKL TNZ052 ---
+loc5=Knoxville KTYS TNZ069 087
+loc6=Knoxville-Downtown KDKX TNZ069 087
+loc7=Memphis KMEM TNZ088 097
+loc8=Memphis-NAS KNQA TNZ088 097
+loc9=Nashville KBNA TNZ027 ---
+loc10=Smyrna KMQY TNZ062 ---
+
+[US_TX]
+name=Texas
+loc0=Abilene KABI TXZ127 ---
+loc1=Alice KALI TXZ241 ---
+loc2=Amarillo KAMA TXZ017 ---
+loc3=Angleton KLBX ------ ---
+loc4=Arlington KF54 TXZ119 ---
+loc5=Austin KAUS TXZ192 113
+loc6=Beaumont-Port\\ Arthur KBPT TXZ215 ---
+loc7=Bergstrom\\ AFB KBSM TXZ192 ---
+loc8=Borger KBGD TXZ008 ---
+loc9=Brownsville KBRO TXZ255 ---
+loc10=Burnet KBMQ ------ ---
+loc11=Childress KCDS TXZ026 ---
+loc12=College\\ Station KCLL TXZ196 ---
+loc13=Conroe KCXO ------ ---
+loc14=Corpus\\ Christi KCRP TXZ243 ---
+loc15=Corpus\\ Christi\\ NAS KNGP TXZ243 ---
+loc16=Corsicana KCRS TXZ146 ---
+loc17=Cotulla KCOT TXZ229 119
+loc18=Dalhart KDHT TXZ001 ---
+loc19=Dallas-Addison KADS TXZ119 ---
+loc20=Dallas-Fort\\ Worth KDFW TXZ119 ---
+loc21=Dallas-Love\\ Field KDAL TXZ119 ---
+loc22=Dallas-Redbird KRBD TXZ119 ---
+loc23=Del\\ Rio KDRT TXZ183 ---
+loc24=Denton KDTO ------ ---
+loc25=El\\ Paso KELP TXZ055 ---
+loc26=Fort\\ Stockton KFST TXZ075 ---
+loc27=Fort\\ Worth-Meacham KFTW TXZ118 ---
+loc28=Fort\\ Worth\\ NAS KNFW TXZ118 ---
+loc29=Fort\\ Worth-Alliance KAFW TXZ118 ---
+loc30=Galveston KGLS TXZ238 ---
+loc31=Georgetown KGTU TXZ173 ---
+loc32=Greenville KGVT ------ ---
+loc33=Guadalupe\\ Pass KGDP TXZ234 ---
+loc34=Harlingen KHRL TXZ255 ---
+loc35=Hondo KHDO TXZ204 ---
+loc36=Houston-Bush KIAH TXZ213 hou
+loc37=Houston-Hooks KDWH TXZ213 hou
+loc38=Houston-Ellington\\ Field KEFD TXZ213 hou
+loc39=Houston-Clover KT02 TXZ213 hou
+loc40=Houston-Hobby KHOU TXZ213 hou
+loc41=Huntsville KUTS ------ ---
+loc42=Junction KJCT TXZ169 ---
+loc43=Killeen KILE TXZ158 113
+loc44=Killeen-Ft\\ Hood KHLR TXZ158 113
+loc45=Killeen-Gray\\ AAF KGRK TXZ158 113
+loc46=Kingsville KNQI TXZ242 ---
+loc47=Laredo KLRD TXZ239 ---
+loc48=Laughlin KDLF ------ ---
+loc49=Longview KGGG TXZ138 ---
+loc50=Lubbock KLBB TXZ035 ---
+loc51=Lufkin KLFK TXZ165 ---
+loc52=Mc\\ Gregor KPWG ------ ---
+loc53=McAllen KMFE TXZ253 ---
+loc54=Midland KMAF TXZ062 ---
+loc55=Mineral\\ Wells KMWL TXZ117 ---
+loc56=Nacogdoches KOCH TXZ152 ---
+loc57=New\\ Braunfels K3R5 TXZ207 ---
+loc58=Palacios KPSX TXZ236 ---
+loc59=Paris KPRX TXZ095 ---
+loc60=Randolph\\ AFB KRND ------ ---
+loc61=Rockport KRKP TXZ245 ---
+loc62=Sabine\\ Pass KRPE ------ ---
+loc63=San\\ Angelo KSJT TXZ072 ---
+loc64=San\\ Antonio KSAT TXZ205 119
+loc65=San\\ Antonio-Kelly\\ AFB KSKF TXZ205 119
+loc66=San\\ Antonio-Stinson KSSF TXZ205 119
+loc67=Sanderson KP07 TXZ082 ---
+loc68=Sherman-Denison KF39 TXZ093 ---
+loc69=Temple KTPL TXZ158 ---
+loc70=Terrell KTRL ------ ---
+loc71=Tyler KTYR TXZ136 ---
+loc72=Victoria KVCT TXZ234 ---
+loc73=Waco KACT TXZ159 ---
+loc74=Wichita\\ Falls KSPS TXZ086 ---
+loc75=Wink KINK TXZ060 ---
+
+[US_VA]
+name=Virginia
+loc0=Abingdon KVJI VAZ008 ---
+loc1=Ashland KOFP VAZ063 ---
+loc2=Charlottesville KCHO VAZ037 ---
+loc3=Danville KDAN VAZ044 ---
+loc4=Dublin KPSK VAZ013 ---
+loc5=Farmville KFVX VAZ061 ---
+loc6=Fort\\ Belvoir KDAA VAZ053 ---
+loc7=Fort\\ Eustis KFAF ------ ---
+loc8=Franklin KFKN VAZ092 ---
+loc9=Galax-Hillsville KHLX VAZ016 ---
+loc10=Hampton KLFI VAZ094 ---
+loc11=Hot\\ Springs KHSP VAZ020 ---
+loc12=Langley\\ AFB KLFI VAZ094 ---
+loc13=Leesburg KJYO VAZ042 ---
+loc14=Lynchburg KLYH VAZ045 ---
+loc15=Manassas KHEF VAZ052 ---
+loc16=Marion-Wytheville KMKJ VAZ009 ---
+loc17=Martinsville KMTV VAZ043 ---
+loc18=Melfa KMFV VAZ099 ---
+loc19=Newport\\ News KPHF VAZ093 ---
+loc20=Norfolk KORF VAZ093 089
+loc21=Norfolk\\ NAS KNGU VAZ093 089
+loc22=Petersburg KPTB VAZ081 ---
+loc23=Quantico KNYG VAZ052 ---
+loc24=Richmond KRIC VAZ071 089
+loc25=Roanoke KROA VAZ022 ---
+loc26=Shannon KEZF ------ ---
+loc27=Staunton KSHD VAZ025 ---
+loc28=Virginia\\ Beach KNTU VAZ098 ---
+loc29=Virginia\\ Tech\\ Airport KBCB VAZ014 ---
+loc30=Wakefield KAKQ VAZ088 ---
+loc31=Wallops\\ Island KWAL ------ ---
+loc32=Waynesboro KSHD VAZ025 ---
+loc33=Winchester KOKV VAZ028 ---
+loc34=Wise KLNP VAZ002 ---
+
+[US_WV]
+name=West Virginia
+loc0=Beckley KBKW WVZ035 ---
+loc1=Bluefield KBLF WVZ042 ---
+loc2=Charleston KCRW WVZ015 074
+loc3=Clarksburg KCKB WVZ031 ---
+loc4=Elkins KEKN WVZ047 ---
+loc5=Huntington KHTS WVZ006 ---
+loc6=Lewisburg KLWB WVZ045 ---
+loc7=Martinsburg KMRB WVZ052 ---
+loc8=Morgantown KMGW WVZ022 075
+loc9=Parkersburg KPKB WVZ009 ---
+loc10=Wheeling KHLG WVZ004 ---
+loc11=White\\ Sulphur KSSU WVZ045 ---
+
+[US_WI]
+name=Wisconsin
+loc0=Antigo KAIG WIZ019 ---
+loc1=Appleton KATW WIZ038 ---
+loc2=Eau\\ Claire KEAU WIZ028 ---
+loc3=Fond\\ Du\\ Lac KFLD WIZ051 ---
+loc4=Green\\ Bay KGRB WIZ039 ---
+loc5=Hayward KHYR WIZ008 ---
+loc6=Janesville KJVL WIZ069 ---
+loc7=Kenosha KENW WIZ072 ---
+loc8=La\\ Crosse KLSE WIZ041 ---
+loc9=Lone\\ Rock KLNR WIZ055 ---
+loc10=Madison KMSN WIZ063 045
+loc11=Manitowoc KMTW WIZ050 ---
+loc12=Marshfield KMFI WIZ035 ---
+loc13=Milwaukee KMKE WIZ066 045
+loc14=Milwaukee-Timmerman KMWC WIZ066 045
+loc15=Minocqua KARV WIZ010 ---
+loc16=Mosinee KCWA WIZ030 ---
+loc17=Oshkosh KOSH WIZ048 ---
+loc18=Phillips KPBH WIZ009 ---
+loc19=Rhinelander KRHI WIZ010 ---
+loc20=Sheboygan KSBM WIZ052 045
+loc21=Sturgeon\\ Bay KSUE WIZ022 ---
+loc22=Superior KSUW WIZ001 ---
+loc23=Volk\\ Field KVOK ------ ---
+loc24=Waukesha KUES WIZ065 ---
+loc25=Wausau KAUW WIZ030 ---
+loc26=Wisconsin\\ Rapids KISW WIZ035 ---
+
+
+[US_MA]
+name=Massachusetts
+loc0=Ashburnam K9B4 ------ ---
+loc1=Ashfield K2B5 ------ ---
+loc2=Bedford KBED MAZ005 ---
+loc3=Beverly KBVY MAZ007 ---
+loc4=Boston KBOS MAZ015 bos
+loc5=Chatham KCQX MAZ022 bos
+loc6=Chicopee\\ Falls KCEF ------ ---
+loc7=Falmouth-Otis\\ AFB KFMH MAZ022 ---
+loc8=Fitchburg KFIT ------ ---
+loc9=Hyannis KHYA MAZ022 ---
+loc10=Lawrence KLWM MAZ007 ---
+loc11=Marthas\\ Vineyard KMVY MAZ023 ---
+loc12=Nantucket KACK MAZ024 ---
+loc13=New\\ Bedford KEWB MAZ017 ---
+loc14=North\\ Adams K2B6 MAZ001 ---
+loc15=Norwood KOWD MAZ013 ---
+loc16=Orange KORE ------ ---
+loc17=Plymouth KPYM MAZ018 ---
+loc18=Provincetown KPVC ------ ---
+loc19=Taunton K9B0 ------ ---
+loc20=Westfield KBAF MAZ011 ---
+loc21=Worcester KORH MAZ012 bos
+
+[US_NY]
+name=New York
+loc0=Albany KALB NYZ052 048
+loc1=Binghamton KBGM NYZ056 ---
+loc2=Buffalo KBUF NYZ010 047
+loc3=Elmira KELM NYZ024 ---
+loc4=Farmingdale KFRG NYZ077 ---
+loc5=Fort\\ Drum KGTB NYZ007 ---
+loc6=Glens\\ Falls KGFL NYZ042 ---
+loc7=Griffiss\\ AFB KRME ------ ---
+loc8=Islip KISP NYZ080 ---
+loc9=Ithaca KITH NYZ025 048
+loc10=Jamestown KJHW NYZ019 047
+loc11=Massena KMSS NYZ026 ---
+loc12=Montgomery KMGJ NYZ067 ---
+loc13=Monticello KMSV NYZ062 ---
+loc14=New\\ York-JFK\\ Arpt KJFK NYZ076 lga
+loc15=New\\ York-La\\ Guardia KLGA NYZ076 lga
+loc16=Newburgh KSWF NYZ067 ---
+loc17=Niagara\\ Falls KIAG NYZ001 047
+loc18=Ogdensburg KOGS NYZ026 ---
+loc19=Penn\\ Yan KPEO ------ ---
+loc20=Plattsburg KPBG NYZ031 ---
+loc21=Poughkeepsie KPOU NYZ065 ---
+loc22=Rochester KROC NYZ003 047
+loc23=Saranac\\ Lake KSLK NYZ027 ---
+loc24=Schenectady KSCH NYZ049 ---
+loc25=Syracuse KSYR NYZ018 048
+loc26=Utica KUCA NYZ037 ---
+loc27=Watertown KART NYZ007 ---
+loc28=Westhampton KFOK NYZ080 ---
+loc29=White\\ Plains KHPN NYZ070 ---
+
+[US_WA]
+name=Washington
+loc0=Bellingham KBLI WAZ002 ---
+loc1=Bremerton KPWT WAZ010 ---
+loc2=Burlington K75S WAZ005 ---
+loc3=Colville K63S WAZ035 ---
+loc4=Ephrata KEPH WAZ033 ---
+loc5=Everett KPAE WAZ006 sea
+loc6=Fairchild KSKA ------ ---
+loc7=Fort\\ Lewis KGRF WAZ008 ---
+loc8=Friday\\ Harbor KFHR WAZ001 ---
+loc9=Hoquiam KHQM WAZ016 ---
+loc10=Moses\\ Lake KMWH WAZ033 ---
+loc11=Oak\\ Harbor K76S WAZ009 ---
+loc12=Olympia KOLM WAZ008 sea
+loc13=Omak K4OM WAZ038 ---
+loc14=Pasco KPSC WAZ028 ---
+loc15=Port\\ Angeles KCLM WAZ013 ---
+loc16=Pullman KPUW WAZ032 ---
+loc17=Quillayute KUIL ------ ---
+loc18=Renton KRNT WAZ007 ---
+loc19=Seattle KSEA WAZ007 sea
+loc20=Seattle-Boeing KBFI WAZ007 sea
+loc21=Shelton KSHN WAZ010 ---
+loc22=Spokane KGEG WAZ034 002
+loc23=Spokane-Parkwater KSFF WAZ034 002
+loc24=Stampede\\ Pass KSMP ------ ---
+loc25=Tacoma KTIW WAZ007 sea
+loc26=Tacoma-Lakewood KTCM WAZ007 sea
+loc27=Toledo KTDO WAZ020 ---
+loc28=Walla\\ Walla KALW WAZ029 ---
+loc29=Wenatchee KEAT WAZ038 ---
+loc30=Whidbey\\ Island KNUW WAZ009 ---
+loc31=Yakima KYKM WAZ025 ---
+
+[CA]
+name=Canada
+states=AB BC MB NB NF NS NT ON QC SK YK
+
+[CA_AB]
+name=Alberta
+loc0=Calgary CYYC ------ ---
+loc1=Edmonton CYEG ------ ---
+loc2=Edmonton/Villeneuve CZVL ------ ---
+
+[CA_BC]
+name=British Columbia
+loc0=Abbotsford CYXX ------ ---
+loc1=Comox CYQQ ------ ---
+loc2=Port\\ Hardy CYZT ------ ---
+loc3=Smithers CYYD ------ ---
+loc4=Vancouver CYVR ------ ---
+loc5=Victoria CYYJ ------ ---
+
+[CA_MB]
+name=Manitoba
+loc0=Churchill CYYQ ------ ---
+loc1=Winnipeg CYWG ------ ---
+
+[CA_NB]
+name=New Brunswick
+loc0=Chatham CYCH ------ ---
+loc1=Fredericton CYFC ------ ---
+loc2=Moncton CYQM ------ ---
+loc3=Saint\\ John CYSJ ------ ---
+
+[CA_NF]
+name=Newfoundland
+loc0=Churchill\\ Falls KZUM ------ ---
+loc1=Gander CYQX ------ ---
+loc2=Goose\\ Bay CYYR ------ ---
+loc3=Saint\\ Anthony CYAY ------ ---
+loc4=St.\\ John's CYYT ------ ---
+loc5=Stephenville CYJT ------ ---
+
+[CA_NS]
+name=Nova Scotia
+loc0=Greenwood CYZX ------ ---
+loc1=Halifax CYHZ ------ ---
+loc2=Shearwater CYAW ------ ---
+loc3=Sydney CYQY ------ ---
+
+[CA_NT]
+name=Northwest Territories
+loc0=Iqaluit CYFB ------ ---
+loc1=Yellowknife CYZF ------ ---
+
+[CA_ON]
+name=Ontario
+loc0=Ottawa CYOW ------ ---
+loc1=Toronto CYYZ ------ 047
+loc2=Trenton CYTR ------ ---
+loc3=Windsor CYQG ------ ---
+
+[CA_QC]
+name=Quebec
+loc0=Bagotville CYBG ------ ---
+loc1=Gatineau CYND ------ ---
+loc2=La\\ Grande CYGL ------ ---
+loc3=Montreal\\ Saint-Hubert CYHU ------ ---
+loc4=Montreal\\ Mirabel CYMX ------ ---
+loc5=Montreal\\ Dorval CYUL ------ ---
+loc6=Quebec\\ City CYQB ------ ---
+loc7=Sept-Iles CYZV ------ ---
+
+[CA_SK]
+name=Saskatchewan
+loc0=Nipawin CYBU ------ ---
+loc1=Regina CYQR ------ ---
+loc2=Saskatoon CYXE ------ ---
+loc3=Swift\\ Current CYYN ------ ---
+
+[CA_YK]
+name=Yukon
+loc0=Shingle\\ Point CYUA ------ ---
+
+[MX]
+name=Mexico
+states=MX
+
+[MX_MX]
+name=Mexico
+loc0=Acapulco MMAA ------ ---
+loc1=Aeropuerto\\ del\\ Norte MMAN ------ ---
+loc2=Aguascaliantes MMAS ------ ---
+loc3=Bahias\\ de\\ Huatulco MMBT ------ ---
+loc4=Campeche MMCP ------ ---
+loc5=Cancun MMUN ------ ---
+loc6=Chetumal MMCM ------ ---
+loc7=Chihuahua MMCU ------ ---
+loc8=Ciudad\\ del\\ Carmen MMCE ------ ---
+loc9=Ciudad\\ Juarez MMCS ------ ---
+loc10=Ciudad\\ Obregon MMCN ------ ---
+loc11=Ciudad\\ Victoria MMCV ------ ---
+loc12=Colima MMIA ------ ---
+loc13=Cozumel MMCZ ------ ---
+loc14=Cuernavaca MMCB ------ ---
+loc15=Culiacan MMCL ------ ---
+loc16=Del\\ Bajio MMLO ------ ---
+loc17=Durango MMDO ------ ---
+loc18=Guadalajara MMGL ------ ---
+loc19=Guaymas MMGM ------ ---
+loc20=Hermosillo MMHO ------ ---
+loc21=Ixtapa MMZH ------ ---
+loc22=La\\ Paz MMLP ------ ---
+loc23=Los\\ Mochis MMLM ------ ---
+loc24=Manzanillo MMZO ------ ---
+loc25=Matamoros MMMA ------ ---
+loc26=Mazatlan MMMZ ------ ---
+loc27=Merida MMMD ------ ---
+loc28=Mexicali MMML ------ ---
+loc29=Mexico MMMX ------ ---
+loc30=Minatitlan MMMT ------ ---
+loc31=Monclova MMMV ------ ---
+loc32=Morelia MMMM ------ ---
+loc33=Monterrey MMMY ------ ---
+loc34=Nuevo\\ Laredo MMNL ------ ---
+loc35=Oaxaca MMOX ------ ---
+loc36=Piedras\\ Negras MMPG ------ ---
+loc37=Poza\\ Rica MMPA ------ ---
+loc38=Puebla MMPB ------ ---
+loc39=Puerto\\ Vallarta MMPR ------ ---
+loc40=Puerto\\ Escondido MMPS ------ ---
+loc41=Queretaro MMQT ------ ---
+loc42=Reynosa MMRX ------ ---
+loc43=Saltillo MMIO ------ ---
+loc44=San\\ Jose\\ del\\ Cabo MMSD ------ ---
+loc45=San\\ Luis\\ Potosi MMSP ------ ---
+loc46=Tampico MMTM ------ ---
+loc47=Tapachula MMTP ------ ---
+loc48=Tepic MMEP ------ ---
+loc49=Tijuana MMTJ ------ ---
+loc50=Toluca MMTO ------ ---
+loc51=Torreon MMTC ------ ---
+loc52=Tulancingo MMTL ------ ---
+loc53=Tuxtla\\ Gutierrez MMTG ------ ---
+loc54=Uruapan MMPN ------ ---
+loc55=Veracruz MMVR ------ ---
+loc56=Villahermosa MMVA ------ ---
+loc57=Zacatecas MMZC ------ ---
+
+[EU]
+name=Europe
+states=AB OS BE BA BY BG CZ HR CY DK EE FI FR MK DE GI GR HU IE IS IT LV LT LU MT MD NL NO PL PT RO RU SK SI SP SE CH TR UA UK YU
+
+[EU_AB]
+name=Albania
+loc0=Tirana LATI ------ ---
+
+[EU_OS]
+name=Austria
+loc0=Niederösterreich\\ Flugplatz\\ Vöslau LOAV ------ ---
+loc1=Hohenems-Dornbirn LOIH ------ ---
+loc2=Graz-Thalerhof-Flughafen LOWG ------ ---
+loc3=Innsbruck-Flughafen LOWI ------ ---
+loc4=Klagenfurt-Flughafen LOWK ------ ---
+loc5=Linz\\ /\\ Hörsching-Flughafen LOWL ------ ---
+loc6=Salzburg-Flughafen LOWS ------ ---
+loc7=Wien\\ /\\ Schwechat-Flughafen LOWW ------ ---
+loc8=Zell\\ Am\\ See LOWZ ------ ---
+loc9=Aigen\\ Im\\ Ennstal LOXA ------ ---
+loc10=Krems-Langenlois LOAG ------ ---
+loc11=Niederösterreich\\ /\\ Wiener\\ Neustadt-Ost\\ Flugplatz LOAN ------ ---
+loc12=Punitz-Güssing LOGG ------ ---
+loc13=Oberösterreich\\ /\\ Freistadt\\ Flugplatz LOLF ------ ---
+#loc14=Wels LOLW ------ ---
+#loc15=Hörsching\\ Aus-Afb LOXL ------ ---
+#loc16=Schwaz\\ Heliport LOXS ------ ---
+loc17=Tulln LOXT ------ ---
+loc18=Zeltweg LOXZ ------ ---
+
+[EU_BE]
+name=Belgium
+loc0=Antwerpen/Deurne EBAW ------ ---
+loc1=Beauvechain EBBE ------ ---
+loc2=Brasschaat EBBT ------ ---
+loc3=Brussels-National\\ Airport EBBR ------ ---
+loc4=Charleroi-Brussels\\ South EBCI ------ ---
+loc5=Chievres EBCV ------ ---
+loc6=Elsenborn EBLB ------ ---
+loc7=Florennes EBFS ------ ---
+loc8=Goetsenhoven EBTN ------ ---
+loc9=Kleine\\ Brogel EBBL ------ ---
+loc10=Koksijde EBFN ------ ---
+loc11=Liege EBLG ------ ---
+loc12=Oostende EBOS ------ ---
+loc13=Schaffen EBDT ------ ---
+loc14=Spa/La\\ Sauveniere EBSP ------ ---
+
+[EU_BA]
+name=Bosnia-Herzegovina
+loc0=Sarajevo LQSA ------ ---
+
+[EU_BG]
+name=Bulgaria
+loc0=Burgas LBBG ------ ---
+loc1=Plovdiv LBPD ------ ---
+loc2=Sofia LBSF ------ ---
+loc3=Varna LBWN ------ ---
+
+[EU_BY]
+name=Belarus
+loc0=Brest UMBB ------ ---
+loc1=Gomel UMGG ------ ---
+loc2=Grodno UMMG ------ ---
+loc3=Minsk UMMS ------ ---
+loc4=Minsk-International/Loszica UMMM ------ ---
+loc5=Vitebsk UMII ------ ---
+
+[EU_CZ]
+name=Czech Republic
+loc0=Brno LKTB ------ ---
+loc1=Ostrava LKMT ------ ---
+loc2=Praha LKPR ------ ---
+
+[EU_HR]
+name=Croatia
+loc0=Dubrovnik LDDU ------ ---
+loc1=Pula LDPL ------ ---
+loc2=Rijeka LDRI ------ ---
+loc3=Split LDSP ------ ---
+loc4=Zadar LDZD ------ ---
+loc5=Zagreb LDZA ------ ---
+
+[EU_DK]
+name=Denmark
+loc0=Aarhus EKAH ------ ---
+loc1=Billund EKBI ------ ---
+loc2=Esbjerg EKEB ------ ---
+loc3=Karup EKKA ------ ---
+loc4=Kobenhavn/Kastrup EKCH ------ ---
+loc5=Kobenhavn/Roskilde EKRK ------ ---
+loc6=Lolland\\ Falster EKMB ------ ---
+loc7=Odense EKOD ------ ---
+loc8=Bornholm EKRN ------ ---
+loc9=Sonderborg EKSB ------ ---
+loc10=Sindal EKSN ------ ---
+loc11=Vojens/Skrydstrup EKSP ------ ---
+loc12=Skive EKSV ------ ---
+loc13=Thisted EKTS ------ ---
+loc14=Vandel EKVA ------ ---
+loc15=Kolding/Vandrup EKVD ------ ---
+loc16=Vagar EKVG ------ ---
+loc17=Stauning EKVJ ------ ---
+loc18=Vaerlose EKVL ------ ---
+loc19=Alborg EKYT ------ ---
+
+[EU_EE]
+name=Estonia
+loc0=Tallinn EETN ------ ---
+
+[EU_GI]
+name=Gibraltar
+loc0=Gibraltar LXGB ------ ---
+
+[EU_IS]
+name=Iceland
+loc0=Egilsstadir BIEG ------ ---
+loc1=Keflavik BIKF ------ ---
+loc2=Reykjavik BIRK ------ ---
+
+[EU_LV]
+name=Latvia
+loc0=Riga EVRA ------ ---
+loc1=Liepaja\\ International\\ Airport EVLA ------ ---
+
+[EU_LT]
+name=Lithuania
+loc0=Vilnius EYVI ------ ---
+loc1=Kaunas EYKA ------ ---
+loc2=Siauliai EYSA ------ ---
+loc3=Palanga EYPA ------ ---
+
+[EU_LU]
+name=Luxembourg
+loc0=Luxembourg ELLX ------ ---
+
+[EU_MK]
+name=FYR Macedonia
+loc0=Ohrid LWOH ------ ---
+loc1=Skopje LWSK ------ ---
+
+[EU_MT]
+name=Malta
+loc0=Luqa LMML ------ ---
+
+[EU_MD]
+name=Moldova
+loc0=Kishineu LUKK ------ ---
+
+[EU_NO]
+name=Norway
+loc0=Alesund ENAL ------ ---
+loc1=Andoya ENAN ------ ---
+loc2=Alta ENAT ------ ---
+loc3=Forde/Bringeland ENBL ------ ---
+loc4=Bronnoysund ENBN ------ ---
+loc5=Bodo ENBO ------ ---
+loc6=Bergen ENBR ------ ---
+loc7=Berlevag ENBV ------ ---
+loc8=Kristiansand/Kjevik ENCN ------ ---
+loc9=Dagali ENDI ------ ---
+loc10=Bardufoss ENDU ------ ---
+loc11=Ekofisk ENEK ------ ---
+loc12=Harstad/Narvik/Evenes ENEV ------ ---
+loc13=Fagernes ENFG ------ ---
+loc14=Floro ENFL ------ ---
+loc15=Frigg ENFR ------ ---
+loc16=Gullfax\\ C ENGC ------ ---
+loc17=Oslo/Gardermoen ENGM ------ ---
+loc18=Haugesund ENHD ------ ---
+loc19=Hammerfest ENHF ------ ---
+loc20=Honningsvag ENHV ------ ---
+loc21=Kristiansund/Kvernberget ENKB ------ ---
+loc22=Kirkenes ENKR ------ ---
+loc23=Lista ENLI ------ ---
+loc24=Leknes ENLK ------ ---
+loc25=Mehamn ENMH ------ ---
+loc26=Molde ENML ------ ---
+loc27=Mosjoen ENMS ------ ---
+loc28=Banak ENNA ------ ---
+loc29=Narvik ENNK ------ ---
+loc30=Namsos ENNM ------ ---
+loc31=Notodden ENNO ------ ---
+loc32=Oseberg\\ A ENOA ------ ---
+loc33=Orland ENOL ------ ---
+loc34=Orsta-Volda ENOV ------ ---
+loc35=Mo\\ I\\ Rana ENRA ------ ---
+loc36=Rorvik/Ryum ENRM ------ ---
+loc37=Roros ENRO ------ ---
+loc38=Rost ENRS ------ ---
+loc39=Rygge ENRY ------ ---
+loc40=Svalbard ENSB ------ ---
+loc41=Sandane ENSD ------ ---
+loc42=Sogndal ENSG ------ ---
+loc43=Svolvaer/Helle ENSH ------ ---
+loc44=Stokmarknes/Skagen ENSK ------ ---
+loc45=Skien/Geiteryggen ENSN ------ ---
+loc46=Stord/Sorstokken ENSO ------ ---
+loc47=Sorkjosen ENSR ------ ---
+loc48=Sandnessjoen/Stokka ENST ------ ---
+loc49=Tromso/Langnes ENTC ------ ---
+loc50=Torp ENTO ------ ---
+loc51=Trondheim/Vaernes ENVA ------ ---
+loc52=Vadso ENVD ------ ---
+loc53=Stavanger/Sola ENZV ------ ---
+
+[EU_PL]
+name=Poland
+loc0=Gdansk EPGD ------ ---
+loc1=Krakow EPKK ------ ---
+loc2=Katowice EPKT ------ ---
+loc3=Poznan EPPO ------ ---
+loc4=Rzeszow EPRZ ------ ---
+loc5=Szczecin EPSC ------ ---
+loc6=Warszawa EPWA ------ ---
+loc7=Wroclaw EPWR ------ ---
+
+[EU_PT]
+name=Portugal
+loc0=Beja LPBJ ------ ---
+loc1=Faro LPFR ------ ---
+#loc2=Funchal LPFU ------ ---
+loc3=Lajes LPLA ------ ---
+loc4=Lisboa LPPT ------ ---
+loc5=Porto\\ /\\ Pedras\\ Rubras LPPR ------ ---
+loc6=Porto\\ Santo LPPS ------ ---
+loc7=Santa\\ Maria\\ Acores LPAZ ------ ---
+loc8=Aeroporto\\ Da\\ Madeira LPMA ------ ---
+loc9=Monte\\ Real\\ Mil. LPMR ------ ---
+loc10=Montijo\\ Mil. LPMT ------ ---
+#loc11=Braganca LPBG ------ ---
+loc12=Flores\\ Acores LPFL ------ ---
+loc13=Horta\\ /\\ Castelo\\ Branco\\ Acores LPHR ------ ---
+#loc14=Ovar\\ Mil. LPOV ------ ---
+loc15=Ponta\\ Delgada\\ /\\ Nordela\\ Acores LPPD ------ ---
+loc16=Sintra\\ Mil. LPST ------ ---
+#loc17=Tancos\\ Mil. LPTN ------ ---
+#loc18=Vila\\ Real LPVR ------ ---
+
+[EU_RO]
+name=Romania
+loc0=Arad LRAR ------ ---
+loc1=Bucuresti LRBS ------ ---
+loc2=Bucuresti-Otopeni LROP ------ ---
+loc3=Iasi LRIA ------ ---
+loc4=Kogalniceanu LRCK ------ ---
+loc5=Timisoara LRTR ------ ---
+loc6=Tirgu\\ Mures LRTM ------ ---
+loc7=Tulcea LRTC ------ ---
+
+[EU_RU]
+name=Russia
+loc0=Abakan UNAA ------ ---
+loc1=Anadyr UHMA ------ ---
+loc2=Anapa URKA ------ ---
+loc3=Arkhangelsk ULAA ------ ---
+loc4=Astrakhan URWA ------ ---
+loc5=Barnaul UNBB ------ ---
+loc6=Belgorod UUOB ------ ---
+loc7=Blagoveschensk UHBB ------ ---
+loc8=Bratsk UIBB ------ ---
+loc9=Bryansk UUBP ------ ---
+loc10=Cheboksary UWKS ------ ---
+loc11=Chelyabinsk USCC ------ ---
+loc12=Chita UIAA ------ ---
+loc13=Kliningrad UMKK ------ ---
+loc14=Kazan UWKD ------ ---
+loc15=Khabarovsk UHHH ------ ---
+loc16=Kogalym USRK ------ ---
+loc17=Krasnodar URKK ------ ---
+loc18=Krasnoyarsk UNKL ------ ---
+loc19=Magadan UHMM ------ ---
+loc20=Makhachkala URML ------ ---
+loc21=Mineralnye\\ Vody URMM ------ ---
+loc22=Moscow\\ Domodedovo UUDD ------ ---
+loc23=Moscow\\ Sheremetyevo UUEE ------ ---
+loc24=Murmansk ULMM ------ ---
+loc25=Nalchik URMN ------ ---
+loc26=Nizhny\\ Novgorod UWGG ------ ---
+loc27=Novosibirsk UNNT ------ ---
+loc28=Omsk UNOO ------ ---
+loc29=Orenburg UWOO ------ ---
+loc30=Perm USPP ------ ---
+loc31=Petropavlovsk-Kamchatsky UHPP ------ ---
+loc32=Petrozavodsk ULPB ------ ---
+loc33=Pskov ULOO ------ ---
+loc34=Raduzhny USNR ------ ---
+loc35=Rostov-Na-Donu URRR ------ ---
+loc36=Samara UWWW ------ ---
+loc37=Sankt-Peterburg ULLI ------ ---
+loc38=Saratov UWSS ------ ---
+loc39=Sochi URSS ------ ---
+loc40=Stavropol URMT ------ ---
+loc41=Syktyvkar UUYY ------ ---
+loc42=Tyumen USTR ------ ---
+loc43=Ufa UWUU ------ ---
+loc44=Ulan-Ude UIUU ------ ---
+loc45=Ulyanovsk UWLW ------ ---
+loc46=Vladikavkaz URMO ------ ---
+loc47=Vladivostok UHWW ------ ---
+loc48=Volgograd URWW ------ ---
+loc49=Voronezh UUOO ------ ---
+loc50=Yakutsk UEEE ------ ---
+loc51=Yekaterinburg USSS ------ ---
+loc52=Yuzhno-Sakhalinsk UHSS ------ ---
+
+[EU_UA]
+name=Ukraine
+loc0=Dnipropetrovsk UKDD ------ ---
+loc1=Donetsk UKCC ------ ---
+loc2=Ivano-Frankivsk UKLI ------ ---
+loc3=Kharkiv UKHH ------ ---
+loc4=Kyiv/Boryspil UKBB ------ ---
+loc5=Kyiv/Zhulyany UKKK ------ ---
+loc6=Kryviy\\ Rig/Lozovatka UKDR ------ ---
+loc7=Lviv UKLL ------ ---
+loc8=Odesa UKOO ------ ---
+loc9=Rivne UKLR ------ ---
+loc10=Sympheropol UKFF ------ ---
+loc11=Uzhgorod UKLU ------ ---
+
+[EU_SK]
+name=Slovakia
+loc0=Bratislava LZIB ------ ---
+loc1=Poprad LZTT ------ ---
+
+[EU_SI]
+name=Slovenia
+loc0=Ljubljana LJLJ ------ ---
+loc1=Maribor LJMB ------ ---
+loc2=Portoroz LJPZ ------ ---
+
+[EU_SE]
+name=Sweden
+loc0=Borlange ESSD ------ --
+loc1=Gavle\\ Sandviken ESSK ------ --
+loc2=Gallivare ESNG ------ --
+loc3=Goteborg\\ (Landvetter) ESGG ------ --
+loc4=Goteborg\\ (Save) ESGP ------ --
+loc5=Hagshult ESMV ------ --
+loc6=Halmstad\\ (Swedish\\ Air\\ Force\\ Base) ESMT ------ --
+loc7=Hultsfred\\ (Swedish\\ Air\\ Force\\ Base) ESSF ------ --
+loc8=Jonkoping ESGJ ------ ---
+loc9=Kiruna ESNQ ------ ---
+loc10=Linkoping\\ (Malmen) ESCF ------ --
+loc11=Linkoping\\ (Saab) ESSL ------ --
+loc12=Lulea\\ (Kallax) ESPA ------ --
+loc13=Malmo\\ (Sturup) ESMS ------ --
+loc14=Norrkoping ESSP ------ ---
+loc15=Ronneby ESDF ------ ---
+loc16=Stockholm\\ (Arlanda) ESSA ------ --
+loc17=Stockholm\\ (Bromma) ESSB ------ --
+loc18=Sundsvall-Harnosand ESNN ------ --
+loc19=Umea ESNU ------ ---
+loc20=Vasteras ESOW ------ ---
+loc21=Vaxjo ESMX ------ ---
+loc22=Visby ESSV ------ --
+loc23=Angelholm ESDB ------ --
+loc24=Ornskoldsvik ESNO ------ --
+loc25=Ostersund\\ (Froson) ESPC ------ --
+
+[EU_CH]
+name=Switzerland
+loc0=Bern LSZB ------ ---
+loc1=Geneve LSGG ------ ---
+loc2=Lugano LSZA ------ ---
+loc3=Zurich LSZH ------ ---
+
+[EU_TR]
+name=Turkey
+loc0=Adana LTAF ------ ---
+loc1=Adana/Incirlik LTAG ------ ---
+loc2=Afyon LTAH ------ ---
+loc3=Amasya LTAP ------ ---
+loc4=Ankara/Esenboga LTAC ------ ---
+loc5=Ankara/Etimesgut LTAD ------ ---
+loc6=Antalya LTAI ------ ---
+loc7=Balikesir LTBF ------ ---
+loc8=Balikesir/Bandirma LTBG ------ ---
+loc9=Batman LTCJ ------ ---
+loc10=Bursa LTBE ------ ---
+loc11=Diyarbakir LTCC ------ ---
+loc12=Elazig LTCA ------ ---
+loc13=Erzurum LTCE ------ ---
+loc14=Eskisehir LTBI ------ ---
+loc15=Gaziantep LTAJ ------ ---
+loc16=Istanbul LTBA ------ ---
+loc17=Izmir/Adnan\\ Menderes LTBJ ------ ---
+loc18=Izmir/Cigli LTBL ------ ---
+loc19=Izmit LTBQ ------ ---
+loc20=Kayseri LTAU ------ ---
+loc21=Konya LTAN ------ ---
+loc22=Malatya LTAT ------ ---
+loc23=Manisa LTBT ------ ---
+loc24=Mugla/Dalaman LTBS ------ ---
+loc25=Mus LTCK ------ ---
+loc26=Samsun LTAQ ------ ---
+loc27=Sanliurfa LTCH ------ ---
+loc28=Sivas LTAR ------ ---
+loc29=Sivrihisar LTAV ------ ---
+loc30=Trabzon LTCG ------ ---
+loc31=Van LTCI ------ ---
+
+[EU_CY]
+name=Cyprus
+loc0=Akrotiri LCRA ------ ---
+loc1=Ercan LCEN ------ ---
+loc2=Larnaka LCLK ------ ---
+loc3=Paphos LCPH ------ ---
+
+[EU_FI]
+name=Finland
+loc0=Helsinki-Malmi EFHF ------ ---
+loc1=Helsinki-Vantaa EFHK ------ ---
+loc2=Ivalo EFIV ------ ---
+loc3=Jyvaskyla EFJY ------ ---
+loc4=Kemi EFKE ------ ---
+loc5=Kruunupyy EFKK ------ ---
+loc6=Kuopio EFKU ------ ---
+loc7=Mariehamn EFMA ------ ---
+loc8=Oulu EFOU ------ ---
+loc9=Pori EFPO ------ ---
+loc10=Rovaniemi EFRO ------ ---
+loc11=Tampere EFTP ------ ---
+loc12=Turku EFTU ------ ---
+loc13=Vaasa EFVA ------ ---
+
+[EU_FR]
+name=France
+loc0=Agen LFBA ------ ---
+loc1=Ajaccio/Campo\\ dell'Oro LFKJ ------ ---
+loc2=Bale-Mulhouse LFSB ------ ---
+loc3=Bastia LFKB ------ ---
+loc4=Beauvais-Tille LFOB ------ ---
+loc5=Biarritz-Bayonne LFBZ ------ ---
+loc6=Bordeaux LFBD ------ ---
+loc7=Bourges LFLD ------ ---
+loc8=Brest LFRB ------ ---
+loc9=Caen-Carpiquet LFRK ------ ---
+loc10=Calvi-Ste-Catherine LFKC ------ ---
+loc11=Cannes-Mandelieu LFMD ------ ---
+loc12=Cazaux LFBC ------ ---
+loc13=Chambery LFLB ------ ---
+loc14=Cherbourg LFRC ------ ---
+loc15=Clermont-Ferrand LFLC ------ ---
+loc16=Colmar-Meyenheim LFSC ------ ---
+loc17=Deauville-Saint-Gatien LFRG ------ ---
+loc18=Dijon LFSD ------ ---
+loc19=Dinard LFRD ------ ---
+loc20=Dole LFGJ ------ ---
+loc21=Evreux-Fauville LFOE ------ ---
+loc22=Figari LFKF ------ ---
+loc23=Grenoble-Saint-Geoirs LFLS ------ ---
+loc24=Hyeres-Le\\ Palyvestre LFTH ------ ---
+loc25=Lannion LFRO ------ ---
+loc26=Le\\ Havre-Octeville LFOH ------ ---
+loc27=Le\\ Mans LFRM ------ ---
+loc28=Le\\ Touquet LFAT ------ ---
+loc29=Lille-Lesquin LFQQ ------ ---
+loc30=Limoges LFBL ------ ---
+loc31=Lorient-Lann-Bihoue LFRH ------ ---
+loc32=Lyon-Bron LFLY ------ ---
+loc33=Lyon-Satolas LFLL ------ ---
+loc34=Luxeuil LFSX ------ ---
+loc35=Marseille-Provence LFML ------ ---
+loc36=Metz-Frescaty LFSF ------ ---
+loc37=Monpellier-Mediterrannee LFMT ------ ---
+loc38=Mont-de-Marsan LFBM ------ ---
+loc39=Nancy-Essey LFSN ------ ---
+loc40=Nancy-Ochey LFSO ------ ---
+loc41=Nantes\\ Atlantique LFRS ------ ---
+loc42=Nice-Côte\\ d'Azur LFMN ------ ---
+loc43=Nimes-Garons LFTW ------ ---
+loc44=Paris/Charles\\ De\\ Gaulle LFPG ------ ---
+loc45=Paris/Le\\ Bourget LFPB ------ ---
+loc46=Paris/Orly LFPO ------ ---
+loc47=Pau/Pyrenees LFBP ------ ---
+loc48=Perpignan-Rivesaltes LFMP ------ ---
+loc49=Poitiers LFBI ------ ---
+loc50=Quimper LFRQ ------ ---
+loc51=Reims-Champagne LFSR ------ ---
+loc52=Rennes LFRN ------ ---
+loc53=Rouen-Valle\\ de\\ Seine LFOP ------ ---
+loc54=Saint-Brieuc-Armor LFRT ------ ---
+loc55=Saint-Dizier-Robinson LFSI ------ ---
+loc56=Saint-Etienne-Boutheon LFMH ------ ---
+loc57=Saint-Nazaire-Montoir LFRZ ------ ---
+loc58=Strasbourg LFST ------ ---
+loc59=Tarbes LFBT ------ ---
+loc60=Toul-Rosieres LFSL ------ ---
+loc61=Toulouse LFBO ------ ---
+loc62=Tours-St-Symphorien LFOT ------ ---
+loc63=Toussus-Le\\ Noble LFPN ------ ---
+loc64=Troyes/Barberey LFQB ------ ---
+loc65=Vichy-Charmeil LFLV ------ ---
+loc66=Villacoublay LFPV ------ ---
+
+[EU_DE]
+name=Germany
+loc0=Augsburg EDMA ------ ---
+loc1=Bayreuth EDQD ------ ---
+loc2=Berlin-Tegel EDDT ------ ---
+loc3=Berlin-Tempelhof EDDI ------ ---
+loc4=Braunschweig EDVE ------ ---
+loc5=Bremen EDDW ------ ---
+loc6=Dortmund-Wickede EDLW ------ ---
+loc7=Dusseldorf EDDL ------ ---
+loc8=Frankfurt/Main EDDF ------ ---
+loc9=Friedrichshafen EDNY ------ ---
+loc10=Hamburg EDDH ------ ---
+loc11=Hamburg-Finkenwerder EDHI ------ ---
+loc12=Hannover EDDV ------ ---
+loc13=Hof EDQM ------ ---
+loc14=Kassel-Calden EDVK ------ ---
+loc15=Koln/Bonn EDDK ------ ---
+loc16=Lubeck-Blankensee EDHL ------ ---
+loc17=Monchengladbach EDLN ------ ---
+loc18=Munchen EDDM ------ ---
+loc19=Munster/Osnabruck EDDG ------ ---
+loc20=Nurnberg EDDN ------ ---
+loc21=Oberpfaffenhofen EDMO ------ ---
+loc22=Paderborn-Haxterberg EDLP ------ ---
+loc23=Saarbrucken EDDR ------ ---
+loc24=Stuttgart EDDS ------ ---
+loc25=Westerland EDXW ------ ---
+loc26=Dresden-Klotzsche EDDC ------ ---
+loc27=Leipzig-Schkeuditz EDDP ------ ---
+loc28=Karlsruhe EDSB ------ ---
+
+
+[EU_GR]
+name=Greece
+loc0=Andravida LGAD ------ ---
+loc1=Alexandroupolis LGAL ------ ---
+loc2=Araxos LGRX ------ ---
+loc3=Athinai LGAT ------ ---
+loc4=Chania LGSA ------ ---
+loc5=Elefsis LGEL ------ ---
+loc6=Iraklion LGIR ------ ---
+loc7=Kalamata LGKL ------ ---
+loc8=Kavala LGKV ------ ---
+loc9=Kefallinia LGKF ------ ---
+loc10=Kerkira LGKR ------ ---
+loc11=Kos LGKO ------ ---
+loc12=Kozani LGKZ ------ ---
+loc13=Limnos LGLM ------ ---
+loc14=Mitilini LGMT ------ ---
+loc15=Mykonos LGMK ------ ---
+loc16=Preveza LGPZ ------ ---
+loc17=Rodos LGRP ------ ---
+loc18=Samos LGSM ------ ---
+loc19=Santorini LGSR ------ ---
+loc20=Skiathos LGSK ------ ---
+loc21=Thessaloniki LGTS ------ ---
+loc22=Zakinthos LGZA ------ ---
+
+[EU_HU]
+name=Hungary
+loc0=Budapest LHBP ------ ---
+loc1=Papa LHPA ------ ---
+loc2=Szombathely LHSY ------ ---
+
+[EU_IE]
+name=Ireland
+loc0=Connaught EIKN ------ ---
+loc1=Cork EICK ------ ---
+loc2=Dublin EIDW ------ ---
+loc3=Shannon EINN ------ ---
+
+[EU_IT]
+name=Italy
+loc0=Albenga LIMG ------ ---
+loc1=Alghero LIEA ------ ---
+loc2=Amendola LIBA ------ ---
+loc3=Ancona LIPY ------ ---
+loc4=Aviano LIPA ------ ---
+loc5=Bari LIBD ------ ---
+loc6=Bergamo LIME ------ ---
+loc7=Bologna LIPE ------ ---
+loc8=Bolzano LIPB ------ ---
+loc9=Brindisi LIBR ------ ---
+loc10=Cagliari LIEE ------ ---
+loc11=Capo\\ Mele LIMU ------ ---
+loc12=Catania LICC ------ ---
+loc13=Cervia LIPC ------ ---
+loc14=Crotone LIBC ------ ---
+loc15=Dobbiaco LIVD ------ ---
+loc16=Decimomannu LIED ------ ---
+loc17=Ferrara LIPF ------ ---
+loc18=Firenze LIRQ ------ ---
+loc19=Forli LIPK ------ ---
+loc20=Frontone LIVF ------ ---
+loc21=Frosinone LIRH ------ ---
+loc22=Genova LIMJ ------ ---
+loc23=Ghedi LIPL ------ ---
+loc24=Gioia\\ del\\ Colle LIBV ------ ---
+loc25=Grosseto LIRS ------ ---
+loc26=Guidonia LIRG ------ ---
+loc27=Lamezia LICA ------ ---
+loc28=Lampedusa LICD ------ ---
+loc29=Latina LIRL ------ ---
+loc30=Lecce LIBN ------ ---
+loc31=Marino\\ di\\ Ravenna LIVM ------ ---
+loc32=Milano/Linate LIML ------ ---
+loc33=Milano/Malpensa LIMC ------ ---
+loc34=Monte\\ Argentario LIQO ------ ---
+loc35=Monte\\ Bisbino LIMO ------ ---
+loc36=Monte\\ Calamita LIRX ------ ---
+loc37=Monte\\ Cimone LIVC ------ ---
+loc38=Monte\\ Malanotte LIMY ------ ---
+loc39=Monte\\ Scuro LIBQ ------ ---
+loc40=Monte\\ Terminillo LIRK ------ ---
+loc41=Napoli LIRN ------ ---
+loc42=Novara/Cameri LIMN ------ ---
+loc43=Olbia LIEO ------ ---
+loc44=Padova LIPU ------ ---
+loc45=Paganella LIVP ------ ---
+loc46=Palermo LICJ ------ ---
+loc47=Pantelleria LICG ------ ---
+loc48=Passo\\ della\\ Cisa LIMT ------ ---
+loc49=Passo\\ dei\\ Giovi LIMV ------ ---
+loc50=Passo\\ Resia LIVE ------ ---
+loc51=Passo\\ Rolle LIVR ------ ---
+loc52=Perugia LIRZ ------ ---
+loc53=Pescara LIBP ------ ---
+loc54=Piacenza LIMS ------ ---
+loc55=Pian\\ Rosa LIMH ------ ---
+loc56=Pisa LIRP ------ ---
+loc57=Pratica\\ di\\ Mare LIRE ------ ---
+loc58=Reggio\\ Calabria LICR ------ ---
+loc59=Rieti LIQN ------ ---
+loc60=Rimini LIPR ------ ---
+loc61=Rivolto LIPI ------ ---
+loc62=Roma/Ciampino LIRA ------ ---
+loc63=Roma/Fiumicino LIRF ------ ---
+loc64=Roma/Urbe LIRU ------ ---
+loc65=Ronchi\\ de'\\ Legionari LIPQ ------ ---
+loc66=Sarzana LIQW ------ ---
+loc67=Sigonella LICZ ------ ---
+loc68=Taranto LIBG ------ ---
+loc69=Tarvisio LIVO ------ ---
+loc70=Trapani LICT ------ ---
+loc71=Torino/Bric\\ Della\\ Croce LIMK ------ ---
+loc72=Torino/Caselle LIMF ------ ---
+loc73=Trevico LIRT ------ ---
+loc74=Treviso/S.Angelo LIPH ------ ---
+loc75=Treviso/Istrana LIPS ------ ---
+loc76=Trieste LIVT ------ ---
+loc77=Venezia LIPZ ------ ---
+loc78=Vicenza LIPT ------ ---
+loc79=Villafranca LIPX ------ ---
+loc80=Viterbo LIRV ------ ---
+
+[EU_NL]
+name=Netherlands
+loc0=Amsterdam EHAM ------ ---
+loc1=Deelen EHDL ------ ---
+loc2=Den\\ Helder/De\\ Kooy EHKD ------ ---
+loc3=Eindhoven EHEH ------ ---
+loc4=Gilze-Rijen EHGR ------ ---
+loc5=Groningen EHGG ------ ---
+loc6=Leeuwarden EHLW ------ ---
+loc7=Maastricht EHBK ------ ---
+loc8=Rotterdam EHRD ------ ---
+loc9=Twenthe EHTW ------ ---
+loc10=Utrecht/Soesterberg EHSB ------ ---
+loc11=Valkenburg EHVB ------ ---
+loc12=Vlieland EHVL ------ ---
+loc13=Volkel EHVK ------ ---
+loc14=Woensdrecht EHWO ------ ---
+
+[EU_SP]
+name=Spain
+loc0=Alicante LEAL ------ ---
+loc1=Almeria LEAM ------ ---
+loc2=Asturias LEAS ------ ---
+loc3=Barcelona LEBL ------ ---
+loc4=Bilbao LEBB ------ ---
+loc5=Canarias/Fuerteventura GCFV ------ ---
+loc6=Canarias/Gran\\ Canaria GCLP ------ ---
+loc7=Canarias/Hierro GCHI ------ ---
+loc8=Canarias/La\\ Palma GCLA ------ ---
+loc9=Canarias/Lanzarote GCRR ------ ---
+loc10=Canarias/Tenerife\\ Sur GCTS ------ ---
+loc11=Canarias/Tenerife\\ Norte GCXO ------ ---
+loc12=Girona LEGE ------ ---
+loc13=Granada LEGR ------ ---
+loc14=Ibiza LEIB ------ ---
+loc15=Jerez LEJR ------ ---
+loc16=La\\ Coruna LECO ------ ---
+loc17=Madrid\\ (Barajas) LEMD ------ ---
+loc18=Madrid\\ (Cuatro\\ Vientos) LEVS ------ ---
+loc19=Malaga LEMG ------ ---
+loc20=Melilla GEML ------ ---
+loc21=Menorca LEMH ------ ---
+loc22=Murcia LELC ------ ---
+loc23=Palma\\ de\\ Mallorca LEPA ------ ---
+loc24=Pamplona LEPP ------ ---
+loc25=Reus LERS ------ ---
+loc26=San\\ Sebastian LESO ------ ---
+loc27=Santander LEXJ ------ ---
+loc28=Santiago LEST ------ ---
+loc29=Sevilla LEZL ------ ---
+loc30=Valencia LEVC ------ ---
+loc31=Vigo LEVX ------ ---
+loc32=Vitoria LEVT ------ ---
+loc33=Zaragoza LEZG ------ ---
+loc34=Valladolid LEVD ------ ---
+loc35=Albacete\\ /\\ Los\\ Llanos LEAB ------ ---
+
+[EU_UK]
+name=United Kingdom
+loc0=Aberdeen EGPD :RQPMS ---
+loc1=Alderney EGJA ------ ---
+loc2=Belfast/Aldergrove EGAA :AAPMS ---
+loc3=Belfast/Harbour EGAC :AAPMS ---
+loc4=Benbecula EGPL :RAPMS ---
+loc5=Biggin\\ Hill EGKB :RBPMS ---
+loc6=Birmingham EGBB :BBPMS ---
+loc7=Blackpool EGNH :RCPMS ---
+loc8=Boscombe\\ Down EGDM ------ ---
+loc9=Boulmer EGQM :RTPMS ---
+loc10=Bournemouth EGHH :RIPMS ---
+loc11=Bristol EGGD :RDPMS ---
+loc12=Cambridge EGSC :RNPMS- ---
+loc13=Cardiff EGFF :RGPMS ---
+loc14=Carlisle EGNC :RCPMS ---
+loc15=Coventry EGBE :BBPMS ---
+loc16=Cranfield EGTC :RIPMS ---
+loc17=Culdrose EGDR :RD2PMS ---
+loc18=Dundee EGPN :RAPMS ---
+loc19=East\\ Midlands EGNX :BBPMS ---
+loc20=Edinburgh EGPH :RAPMS ---
+loc21=Eglington/Londonderry EGAE :AAPMS ---
+loc22=Exeter EGTE :RD2PMS ---
+loc23=Glasgow EGPF :RAPMS ---
+loc24=Guernsey EGJB ------ ---
+loc25=Humberside EGNJ :RTPMS ---
+loc26=Inverness EGPE :RQPMS ---
+loc27=Isle\\ of\\ Man EGNS :RCPMS ---
+loc28=Jersey EGJJ ------ ---
+loc29=Kinloss EGQK :RQPMS ---
+loc30=Leeds\\ and\\ Bradford EGNM :RYPMS ---
+loc31=Leuchars EGQL :RQPMS ---
+loc32=Liverpool EGGP :RCPMS ---
+loc33=London/City EGLC :RBPMS ---
+loc34=London/Gatwick EGKK :RBPMS ---
+loc35=London/Heathrow EGLL :RBPMS ---
+loc36=London/Stansted EGSS :RBPMS ---
+loc37=Lossiemouth EGQS :RQPMS ---
+loc38=Luton EGGW :RBPMS ---
+loc39=Lyneham EGDL :BBPMS ---
+loc40=Manchester EGCC :RCPMS ---
+loc41=Newcastle EGNT :RTPMS ---
+loc42=Norwich EGSH :RNPMS ---
+loc43=Plymouth EGHD :RD2PMS ---
+loc44=Portland EGDP :RIPMS ---
+loc45=Prestwick EGPK :RAPMS ---
+loc46=Saint\\ Mawgan EGDG :RD2PMS ---
+loc47=Scatsta EGPM :RQPMS ---
+loc48=Scilly\\ Isles EGHE :RD2PMS ---
+loc49=Shawbury EGOS :BBPMS ---
+loc50=Shoreham EGKA :RBPMS ---
+loc51=Southampton EGHI :RIPMS ---
+loc52=Southend EGMC :RBPMS ---
+loc53=Staverton EGBJ :RDPMS ---
+loc54=Stornoway EGPO :RQPMS ---
+loc55=Sumburgh EGPB :RQPMS ---
+loc56=Tees-Side EGNV :RTPMS ---
+loc57=Tiree EGPU :RQPMS ---
+loc58=Unst EGPW :RQPMS ---
+loc59=Valley EGOV ------ ---
+loc60=Wick EGPC :RQPMS ---
+loc61=Yeovilton EGDY :RDPMS ---
+
+[EU_YU]
+name=Yugoslavia
+loc0=Beograd LYBE ------ ---
+loc1=Nis LYNI ------ ---
+loc2=Podgorica\\ Titograd LYTI ------ ---
+loc3=Podgorica LYPG ------ ---
+loc4=Pristina LYPR ------ ---
+loc5=Tivat LYTU ------ ---
+
+[AF]
+name=Africa
+states=DZ EG LY MO ZA
+
+[AF_MO]
+name=Morocco
+loc0=Rabat GMME ------ ---
+
+[AF_ZA]
+name=South Africa
+loc0=Bethlehem\\ Airport FABM ------ ---
+loc1=Bloemfontein\\ Airport FABL ------ ---
+loc2=Cape\\ Town\\ International\\ Airport FACT ------ ---
+loc3=Durban\\ International\\ Airport FADN ------ ---
+loc4=East\\ London\\ Airport FAEL ------ ---
+loc5=George\\ Airport FAGG ------ ---
+loc6=OR\\ Tambo\\ International\\ Airport FAJS ------ ---
+loc7=Langebaanweg FALW ------ ---
+loc8=Lichtenburg FALT ------ ---
+loc9=Pietersburg FAPB ------ ---
+loc10=Port\\ Elizabeth\\ Airport FAPE ------ ---
+loc11=Pretoria FAPR ------ ---
+loc12=Springbok FASB ------ ---
+loc13=Upington\\ Airport FAUP ------ ---
+loc14=Kimberley\\ Airport FAKM ------ ---
+
+[AF_LY]
+name=Libya
+loc0=Benina HLLB ------ ---
+loc1=Tripoli HLLT ------ ---
+
+[AF_EG]
+name=Egypt
+loc0=Alexandria/Nouzha HEAX ------ ---
+loc1=Asswan HESN ------ ---
+loc2=Cairo HECA ------ ---
+loc3=Luxor HELX ------ ---
+loc4=Mersa\\ Matruh HEMM ------ ---
+loc5=Port\\ Said HEPS ------ ---
+loc6=Sharm\\ El\\ Sheikhintl HESH ------ ---
+
+[AF_DZ]
+name=Algeria
+loc0=Annaba DABB ------ ---
+loc1=Constantine DABC ------ ---
+loc2=Dar-El-Beida DAAG ------ ---
+loc3=Ghardaia DAUG ------ ---
+loc4=Hassi-Messaoud DAUH ------ ---
+loc5=In\\ Amenas DAUZ ------ ---
+loc6=Oran DAOO ------ ---
+loc7=Tamanrasset DAAT ------ ---
+loc8=Tebessa DABS ------ ---
+loc9=Tlemcen\\ Zenata DAON ------ ---
+
+[OZ]
+name=Australasia
+states=AU NZ AN
+
+[OZ_AU]
+name=Australia
+loc0=Adelaide YPAD ------ ---
+loc1=Alice\\ Springs YBAS ------ ---
+loc2=Brisbane YBBN ------ ---
+loc3=Broome YBRM ------ ---
+loc4=Cairns YBCS ------ ---
+loc5=Canberra YSCB ------ ---
+loc6=Christmas\\ Island YPXM ------ ---
+loc7=Cocos\\ Island YPCC ------ ---
+loc8=Darwin YPDN ------ ---
+loc9=Dubbo YSDU ------ ---
+loc10=Hobart YMHB ------ ---
+loc11=Learmouth YPLM ------ ---
+loc12=Melbourne YMML ------ ---
+loc13=Norfolk\\ Island YSNF ------ ---
+loc14=Perth YPPH ------ ---
+loc15=Port\\ Hedland YPPD ------ ---
+loc16=Sydney YSSY ------ ---
+loc17=Townsville YBTL ------ ---
+
+[OZ_NZ]
+name=New Zealand
+loc0=Auckland NZAA ------ ---
+loc1=Christchurch NZCH ------ ---
+loc2=Wellington NZWN ------ ---
+
+[OZ_AN]
+name=Antarctica
+loc0=Williams\\ Field NZCM ------ ---
+
+[AS]
+name=Asia
+states=CN HK IN JP KR KP PK SG TH TW VN UZ
+
+[AS_VN]
+name=Viet Nam
+loc0=Da\\ Nang VVDN ------ ---
+loc1=Ha\\ Noi VVNB ------ ---
+loc2=Ho\\ Chi\\ Minh VVTS ------ ---
+
+[AS_KR]
+name=Korea, Republic of
+loc0=Camp\\ Stanley/H-207 RKSX ------ ---
+loc1=Cheju RKPC ------ ---
+loc2=Chongju\\ Ab RKTU ------ ---
+loc3=Mangilsan\\ Ab RKTM ------ ---
+loc4=Osan\\ Ab RKSO ------ ---
+loc5=Paekado RKTB ------ ---
+loc6=Paengnyongdo\\ Ab RKSP ------ ---
+loc7=Pohang\\ Ab RKTH ------ ---
+loc8=Pusan/Kimhae RKPK ------ ---
+loc9=Pyongtaek\\ Ab RKSG ------ ---
+loc10=Sangju RKTS ------ ---
+loc11=Seoul/Kimp'O\\ International\\ Airport RKSS ------ ---
+loc12=Seoul/Yongdungp'O\\ Rokaf\\ Wc RKSF ------ ---
+loc13=Seoul\\ E\\ Ab RKSM ------ ---
+loc14=Songmu\\ Ab RKTE ------ ---
+loc15=Suwon\\ Ab RKSW ------ ---
+loc16=Taegu RKTT ------ ---
+loc17=Taegu\\ Ab RKTN ------ ---
+loc18=Taejon RKTF ------ ---
+loc19=Ulsan RKPU ------ ---
+loc20=Woong\\ Cheon RKTW ------ ---
+loc21=Yechon\\ Ab RKTY ------ ---
+loc22=Yeoju\\ Range RKSU ------ ---
+loc23=Yeonpyeungdo RKSQ ------ ---
+loc24=Yongsan/H-208\\ Hp RKSY ------ ---
+loc25=Yosu RKJY ------ ---
+
+[AS_KP]
+name=Korea, Democratic People's Republic of
+loc0=Pyongyang ZKPY ------ ---
+
+[AS_HK]
+name=Hong Kong
+loc=Hong\\ Kong VHHH ------ ---
+
+[AS_PK]
+name=Pakistan
+loc0=Islamabad OPRN ------ ---
+loc1=Karachi OPKC ------ ---
+loc2=Lahore OPLA ------ ---
+loc3=Nawabshah OPNH ------ ---
+
+[AS_IN]
+name=India
+loc0=Ahmadabad VAAH ------ ---
+loc1=Amritsar VIAR ------ ---
+loc2=Bombay/Santacruz VABB ------ ---
+loc3=Calcutta/Dum\\ Dum VECC ------ ---
+loc4=Hyderabad VOHY ------ ---
+loc5=Madras/Minambakkam VOMM ------ ---
+loc6=Nagpur\\ Sonegaon VANP ------ ---
+loc7=New\\ Delhi/Palam VIDP ------ ---
+loc8=Patna VEPT ------ ---
+loc9=Thiruvananthapuram VOTV ------ ---
+loc10=Tiruchchirapalli VOTR ------ ---
+loc11=Varanasi/Babatpur VIBN ------ ---
+
+[AS_CN]
+name=People's Republic of China
+loc0=Beijing ZBAA ------ ---
+loc1=Chengdu ZUUU ------ ---
+loc2=Dalian ZYTL ------ ---
+loc3=Guangzhou ZGGG ------ ---
+loc4=Hangzhou ZSHC ------ ---
+loc5=Hong\\ Kong VHHH ------ ---
+loc6=Kunming ZPPP ------ ---
+loc7=Lanzhou ZLLL ------ ---
+loc8=Nanning ZGNN ------ ---
+loc9=Shanghai ZSSS ------ ---
+loc10=Taiyuan ZBYN ------ ---
+loc11=Tianjin ZBTJ ------ ---
+loc12=Urumqi ZWWW ------ ---
+loc13=Xiamen ZSAM ------ ---
+
+[AS_JP]
+name=Japan
+loc0=Akeno\\ Ab RJOE ------ ---
+loc1=Akita\\ Airport RJSK ------ ---
+loc2=Amami\\ Airport RJKA ------ ---
+loc3=Aomori\\ Airport RJSA ------ ---
+loc4=Asahikawa\\ Ab RJCA ------ ---
+loc5=Asahikawa\\ Airport RJEC ------ ---
+loc6=Ashiya\\ Ab RJFA ------ ---
+loc7=Atsugi\\ US\\ NAS RJTA ------ ---
+loc8=Chichijima RJAO ------ ---
+loc9=Chitose\\ Ab RJCC ------ ---
+loc10=Chitose\\ ASDF RJCJ ------ ---
+loc11=Chofu\\ Airport RJTF ------ ---
+loc12=Fuji\\ Ab RJAT ------ ---
+loc13=Fukue\\ Airport RJFE ------ ---
+loc14=Fukui\\ Airport RJNF ------ ---
+loc15=Fukuoka\\ Airport RJFF ------ ---
+loc16=Gifu\\ Ab RJNG ------ ---
+loc17=Hachijojima\\ Airport RJTH ------ ---
+loc18=Hachinohe\\ Ab RJSH ------ ---
+loc19=Hakodate\\ Airport RJCH ------ ---
+loc20=Hamamatsu\\ Ab RJNH ------ ---
+loc21=Hanamaki\\ Airport RJSI ------ ---
+loc22=Hiroshima\\ Airport RJOA ------ ---
+loc23=Hofu\\ Ab RJOF ------ ---
+loc24=Hyakuri\\ Ab RJAH ------ ---
+loc25=Ichikawa RJAI ------ ---
+loc26=Iki\\ Airport RJDB ------ ---
+loc27=Iruma\\ Ab RJTJ ------ ---
+loc28=Iwakuni\\ MCAS RJOI ------ ---
+loc29=Iwojima RJAW ------ ---
+loc30=Izumo\\ Airport RJOC ------ ---
+loc31=Kadena\\ Ab RODN ------ ---
+loc32=Kagoshima\\ Airport RJFK ------ ---
+loc33=Kamigoto RJDK ------ ---
+loc34=Kanoya\\ Ab RJFY ------ ---
+loc35=Kansai\\ International\\ Airport RJBB ------ ---
+loc36=Kasumigaura\\ Ab RJAK ------ ---
+loc37=Kasuminome\\ Ab RJSU ------ ---
+loc38=Kikai\\ Island RJKI ------ ---
+loc39=Kisarazu\\ Ab RJTK ------ ---
+loc40=Kitakyushu\\ Airport RJFR ------ ---
+loc41=Kochi\\ Airport RJOK ------ ---
+loc42=Komatsu\\ Ab RJNK ------ ---
+loc43=Komatsujima\\ Ab RJOP ------ ---
+loc44=Kumamoto\\ Airport RJFT ------ ---
+loc45=Kushiro\\ Airport RJCK ------ ---
+loc46=Matsumoto\\ Airport RJAF ------ ---
+loc47=Matsushima\\ Ab RJST ------ ---
+loc48=Matsuyama\\ Airport RJOM ------ ---
+loc49=Memambetsu\\ Airport RJCM ------ ---
+loc50=Metabaru\\ Ab RJDM ------ ---
+loc51=Miho\\ Ab RJOH ------ ---
+loc52=Minamitorishima RJAM ------ ---
+loc53=Misawa\\ Ab RJSM ------ ---
+loc54=Miyakejima\\ Airport RJTQ ------ ---
+loc55=Miyazaki\\ Airport RJFM ------ ---
+loc56=Mombetsu\\ Airport RJEB ------ ---
+loc57=Nagasaki\\ Airport RJFU ------ ---
+loc58=Nagoya\\ Airport RJNN ------ ---
+loc59=Naha\\ Airport ROAH ------ ---
+loc60=Nakashibetsu\\ Airport RJCN ------ ---
+loc61=Nankishirahama\\ Airport RJBD ------ ---
+loc62=New\\ Tokyo\\ International\\ Airport RJAA ------ ---
+loc63=Niigata\\ Airport RJSN ------ ---
+loc64=Nyutabaru\\ Ab RJFN ------ ---
+loc65=Obihiro\\ Airport RJCB ------ ---
+loc66=Oita\\ Airport RJFO ------ ---
+loc67=Ojika\\ Island RJDO ------ ---
+loc68=Okayama\\ Airport RJOB ------ ---
+loc69=Oki\\ Airport RJNO ------ ---
+loc70=Okinoerabu RJKB ------ ---
+loc71=Okushiri\\ Island RJEO ------ ---
+loc72=Ominato\\ Ab RJSO ------ ---
+loc73=Osaka\\ International\\ Airport RJOO ------ ---
+loc74=Oshima\\ Airport RJTO ------ ---
+loc75=Ozuki\\ Ab RJOZ ------ ---
+loc76=Rebun\\ Island RJCR ------ ---
+loc77=Rishiri\\ Island RJER ------ ---
+loc78=Sapporo\\ Ab RJCO ------ ---
+loc79=Sendai\\ Airport RJSS ------ ---
+loc80=Shimofusa\\ Ab RJTL ------ ---
+loc81=Shizuhama\\ Ab RJNY ------ ---
+loc82=Tachikawa\\ Ab RJTC ------ ---
+loc83=Tajima RJBT ------ ---
+loc84=Takamatsu\\ Airport RJOT ------ ---
+loc85=Tanegashima\\ Airport RJFG ------ ---
+loc86=Tateyama\\ Ab RJTE ------ ---
+loc87=Tokachi\\ GSDF RJCT ------ ---
+loc88=Tokunoshima\\ Island RJKN ------ ---
+loc89=Tokushima\\ Ab RJOS ------ ---
+loc90=Tokyo\\ Heliport RJTI ------ ---
+loc91=Tokyo\\ International\\ Airport RJTT ------ ---
+loc92=Tokyo\\ New\\ International\\ Airport RJAA ------ ---
+loc93=Tottori\\ Airport RJOR ------ ---
+loc94=Toyama\\ Airport RJNT ------ ---
+loc95=Tsuiki\\ Ab RJFZ ------ ---
+loc96=Tsushima\\ Airport RJDT ------ ---
+loc97=Utsunomiya\\ Ab RJTU ------ ---
+loc98=Wakkanai\\ Airport RJCW ------ ---
+loc99=Yakushima RJFC ------ ---
+loc100=Yamagata\\ Airport RJSC ------ ---
+loc101=Yamaguchi\\ Ube\\ Airport RJDC ------ ---
+loc102=Yao\\ Airport RJOY ------ ---
+loc103=Yokosuka\\ Fwf RJTX ------ ---
+loc104=Yokota\\ Ab RJTY ------ ---
+loc105=Zama\\ Airfield RJTR ------ ---
+
+[AS_SG]
+name=Singapore
+loc0=Singapore WSSS ------ ---
+
+[AS_TH]
+name=Thailand
+loc0=Don\\ Muang VTBD ------ ---
+
+[AS_TW]
+name=Taiwan
+loc0=Chia\\ Tung RCFS ------ ---
+loc1=Chiang\\ Kai\\ Shek RCTP ------ ---
+loc2=Chiayi RCKU ------ ---
+loc3=Chihhang RCQS ------ ---
+loc4=Chinmem/Shatou RCBS ------ ---
+loc5=Dongsha RCLM ------ ---
+loc6=Dongshi RCNO ------ ---
+loc7=Feng\\ Nin RCFN ------ ---
+loc8=Hengchun RCKW ------ ---
+loc9=Hsinchu RCPO ------ ---
+loc10=Hulien RCYU ------ ---
+loc11=Ilan RCMS ------ ---
+loc12=Kangshan RCAY ------ ---
+loc13=Kaohsiung RCKH ------ ---
+loc14=Makung RCQC ------ ---
+loc15=Mazu RCFG ------ ---
+loc16=Pa\\ Kuei/Bakuai RCUK ------ ---
+loc17=Pingtung\\ North RCSQ ------ ---
+loc18=Pingtung\\ South RCDC ------ ---
+loc19=Sungshan/Taipei RCSS ------ ---
+loc20=Taichung RCLG ------ ---
+loc21=Tainan RCNN ------ ---
+loc22=Taoyuan RCGM ------ ---
+loc23=Wuchia\\ Observatory RCMQ ------ ---
+
+[AS_UZ]
+name=Uzbekistan
+loc0=Dzizak UTED ------ ---
+loc1=Nukus/Karakalpakstan UTNN ------ ---
+loc2=Samarkand UTSS ------ ---
+loc3=Tamdy UTSM ------ ---
+loc4=Tashkent UTTT ------ ---
+loc5=Termez UTST ------ ---
+loc6=Urgench UTNU ------ ---
+
+[M_]
+name=Central and South America
+states=BS BZ KY CU CR DO SV GT HT HN JM NI PA AR BR BO CL CO EC PY PE SR UY VE
+
+[M__BS]
+name=Bahamas
+loc0=Freeport MYGF ------ ---
+loc1=Nassau MYNN ------ ---
+
+[M__BZ]
+name=Belize
+loc0=Belize MZBZ ------ ---
+
+[M__BM]
+name=Bermuda
+loc0=Bermuda TXKF ------ ---
+
+[M__KY]
+name=Cayman Islands
+loc0=Grand\\ Cayman MWCR ------ ---
+
+[M__CU]
+name=Cuba
+loc0=Baracoa MUBA ------ ---
+loc1=Bayamo MUBY ------ ---
+loc2=Camaguey MUCM ------ ---
+loc3=Cayo\\ Largo\\ del\\ Sur MUCL ------ ---
+loc4=Guantanamo MUGT ------ ---
+loc5=Habana MUHA ------ ---
+loc6=Holguin MUHG ------ ---
+loc7=Las\\ Tunas MUVT ------ ---
+loc8=Manzanillo MUMZ ------ ---
+loc9=Moa MUMO ------ ---
+loc10=Nueva\\ Gerona MUNG ------ ---
+loc11=Santiago\\ de\\ Cuba MUCU ------ ---
+loc12=Varadero MUVR ------ ---
+loc13=Venezuela MUCA ------ ---
+
+[M__CR]
+name=Costa Rica
+loc0=Chacarita MRCH ------ ---
+loc1=Juan\\ Santamaria MROC ------ ---
+loc2=Liberia MRLB ------ ---
+loc3=Puerto\\ Limon MRLM ------ ---
+loc4=Tobias\\ Bolanos MRPV ------ ---
+
+[M__DO]
+name=Dominican Republic
+loc0=La\\ Romana MDLR ------ ---
+loc1=Las\\ Americas MDSD ------ ---
+loc2=Puerto\\ Plata MDPP ------ ---
+loc3=Punta\\ Cana MDPC ------ ---
+loc4=Santiago MDST ------ ---
+
+[M__SV]
+name=El Salvador
+loc0=Acajutla MSAC ------ ---
+loc1=El\\ Salvador\\ Int. MSLP ------ ---
+loc2=San\\ Miguel MSSM ------ ---
+loc3=San\\ Salvador MSSS ------ ---
+loc4=Santa\\ Ana MSSA ------ ---
+
+[M__GT]
+name=Guatemala
+loc0=Flores MGFL ------ ---
+loc1=Guatemala MGGT ------ ---
+loc2=Huehuetenango MGHT ------ ---
+loc3=Puerto\\ Barrios MGPB ------ ---
+loc4=San\\ Jose MGSJ ------ ---
+
+[M__HT]
+name=Haiti
+loc0=Port-Au-Prince MTPP ------ ---
+
+[M__HN]
+name=Honduras
+loc0=Amapala MHAM ------ ---
+loc1=Catacamas MHCA ------ ---
+loc2=Choluteca MHCH ------ ---
+loc3=La\\ Ceiba MHLC ------ ---
+loc4=La\\ Esperanza MHLE ------ ---
+loc5=La\\ Mesa MHLM ------ ---
+loc6=Nueva\\ Ocotepeque MHSC ------ ---
+loc7=Puerto\\ Lempira MHPL ------ ---
+loc8=Roatan MHRO ------ ---
+loc9=Santa\\ Rosa\\ de\\ Copan MHSR ------ ---
+loc10=Tegucigalpa MHTG ------ ---
+loc11=Tela MHTE ------ ---
+loc12=Yoro MHYR ------ ---
+
+[M__JM]
+name=Jamaica
+loc0=Kingston MKJP ------ ---
+loc1=Montego\\ Bay MKJA ------ ---
+
+[M__NI]
+name=Nicaragua
+loc0=Bluefields MNBL ------ ---
+loc1=Chinandega MNCH ------ ---
+loc2=Jinotega MNJG ------ ---
+loc3=Juigalpa MNJU ------ ---
+loc4=Managua MNMG ------ ---
+loc5=Puerto\\ Cabezas MNPC ------ ---
+loc6=Rivas MNRS ------ ---
+
+[M__PA]
+name=Panama
+loc0=Bocas\\ del\\ Toro MPBO ------ ---
+loc1=David MPDA ------ ---
+loc2=Howard\\ AFB MPHO ------ ---
+loc3=Panama MPMG ------ ---
+loc4=Santiago MPSA ------ ---
+loc5=Tocumen MPTO ------ ---
+
+[M__BO]
+name=Bolivia
+loc0=Camiri SLCA ------ ---
+loc1=Cobija SLCO ------ ---
+loc2=Cochabamba SLCB ------ ---
+loc3=Concepcion SLCP ------ ---
+loc4=La\\ Paz/Alto SLLP ------ ---
+loc5=Magdalena SLMG ------ ---
+loc6=Oruro SLOR ------ ---
+loc7=Potosi SLPO ------ ---
+loc8=Puerto\\ Suarez SLPS ------ ---
+loc9=Reyes SLRY ------ ---
+loc10=Riberalta SLRI ------ ---
+loc11=Robore SLRB ------ ---
+loc12=Rurrenabaque SLRQ ------ ---
+loc13=San\\ Ignacio\\ De\\ Velasco SLSI ------ ---
+loc14=San\\ Joaquin SLJO ------ ---
+loc15=San\\ Jose\\ De\\ Chiquitos SLJE ------ ---
+loc16=Santa\\ Ana SLSA ------ ---
+loc17=Sucre SLSU ------ ---
+loc18=Tarija SLTJ ------ ---
+loc19=Trinidad SLTR ------ ---
+loc20=Villamontes SLVM ------ ---
+loc21=Viru-Viru SLVR ------ ---
+loc22=Yacuiba SLYA ------ ---
+
+[M__CL]
+name=Chile
+loc0=Antofagasta SCFA ------ ---
+loc1=Arica SCAR ------ ---
+loc2=Concepcion SCIE ------ ---
+loc3=Iquique/Diego\\ Arac SCDA ------ ---
+loc4=Pudahuel SCEL ------ ---
+loc5=Puerto\\ Montt SCTE ------ ---
+loc6=Punta\\ Arenas SCCI ------ ---
+
+[M__CO]
+name=Colombia
+loc0=Barranquilla/Ernestocortissoz SKBQ ------ ---
+loc1=Bogota/Eldorado SKBO ------ ---
+loc2=Bucaramanga/Palonegro SKBG ------ ---
+loc3=Cali/Alfonso\\ Bonillaaragon SKCL ------ ---
+loc4=Cartagena/Rafael\\ Nunez SKCG ------ ---
+loc5=Leticia/Vasquez\\ Cobo SKLT ------ ---
+loc6=Pereira/Matecana SKPE ------ ---
+loc7=Rionegro/J.M.Cordova SKRG ------ ---
+loc8=San\\ Andres\\ Isla/Sesquicentenario SKSP ------ ---
+loc9=Santa\\ Marta/Simon\\ Bolivar SKSM ------ ---
+
+[M__EC]
+name=Ecuador
+loc0=Guayaquil/Simon\\ Bolivar SEGU ------ ---
+loc1=Manta SEMT ------ ---
+loc2=Quito/Mariscal\\ Sucre SEQU ------ ---
+
+[M__PY]
+name=Paraguay
+loc0=Asuncion SGAS ------ ---
+loc1=Guarany SGES ------ ---
+
+[M__PE]
+name=Peru
+loc0=Andahuayla SPHY ------ ---
+loc1=Arequipa SPQU ------ ---
+loc2=Ayacucho SPHO ------ ---
+loc3=Chiclayo SPHI ------ ---
+loc4=Cuzco SPZO ------ ---
+loc5=Huanuco SPNC ------ ---
+loc6=Iquitos SPQT ------ ---
+loc7=Juanjui SPJI ------ ---
+loc8=Juliaca SPJL ------ ---
+loc9=Lima-Callao SPIM ------ ---
+loc10=Pisco SPSO ------ ---
+loc11=Pucallpa SPCL ------ ---
+loc12=Puerto\\ Maldonado SPTU ------ ---
+loc13=Rioja SPJA ------ ---
+loc14=Tacna SPTN ------ ---
+loc15=Talara SPYL ------ ---
+loc16=Yurimaguas SPMS ------ ---
+
+[M__SR]
+name=Suriname
+loc0=Johan\\ A.\\ Pengel SMJP ------ ---
+
+[M__UY]
+name=Uruguay
+loc0=Artigas SUAG ------ ---
+loc1=Capitan\\ Corbeta SULS ------ ---
+loc2=Colonia SUCA ------ ---
+loc3=Durazno SUDU ------ ---
+loc4=Maldonado/Punta\\ Est SUPE ------ ---
+loc5=Melilla SUAA ------ ---
+loc6=Montevideo/Carrasco SUMU ------ ---
+loc7=Paysandu SUPU ------ ---
+loc8=Rivera SURV ------ ---
+loc9=Salto SUSO ------ ---
+loc10=Tacuarembo SUTB ------ ---
+
+[M__VE]
+name=Venezuela
+loc0=Acarigua SVAC ------ ---
+loc1=Barcelona SVBC ------ ---
+loc2=Barinas SVBI ------ ---
+loc3=Barquisimeto SVBM ------ ---
+loc4=Calabozo SVCL ------ ---
+loc5=Caracas\\ Maiquetia SVMI ------ ---
+loc6=Ciudad\\ Bolivar SVCB ------ ---
+loc7=Coro SVCR ------ ---
+loc8=Cumana SVCU ------ ---
+loc9=Guanare SVGU ------ ---
+loc10=Maracaibo-La\\ Chinita SVMC ------ ---
+loc11=Maracay-B.A.Sucre SVBS ------ ---
+loc12=Margarita SVMG ------ ---
+loc13=Mene\\ Grande SVMN ------ ---
+loc14=Merida SVMD ------ ---
+loc15=San\\ Antonio\\ Del\\ Tachira SVSA ------ ---
+loc16=San\\ Fernando\\ De\\ Apure SVSR ------ ---
+loc17=Valera* SVVL ------ ---
+loc18=Caracas\\ La\\ Carlota SVFM ------ ---
+
+[M__AR]
+name=Argentina
+loc0=Aeroparque SABE ------ ---
+loc1=Bahia\\ Blanca SAZB ------ ---
+loc2=Bariloche SAZS ------ ---
+loc3=Comodoro\\ Rivadavia SAVC ------ ---
+loc4=Concordia SAAC ------ ---
+loc5=Cordoba SACO ------ ---
+loc6=Corrientes SARC ------ ---
+loc7=Don\\ Torcuato SADD ------ ---
+loc8=Ezeiza SAEZ ------ ---
+loc9=Formosa SARF ------ ---
+loc10=Iguazu SARI ------ ---
+loc11=Jujuy SASJ ------ ---
+loc12=Mar\\ Del\\ Plata SAZM ------ ---
+loc13=Mendoza SAME ------ ---
+loc14=Neuquen SAZN ------ ---
+loc15=Paso\\ De\\ Los\\ Libres SARL ------ ---
+loc16=Posadas SARP ------ ---
+loc17=Resistencia SARE ------ ---
+loc18=Rio\\ Gallegos SAWG ------ ---
+loc19=Rio\\ Grande SAWE ------ ---
+loc20=Rosario SAAR ------ ---
+loc21=Salta SASA ------ ---
+loc22=San\\ Juan SANU ------ ---
+loc23=Santiago\\ Del\\ Estero SANE ------ ---
+loc24=Sauce\\ Viejo SAAV ------ ---
+loc25=Trelew SAVT ------ ---
+loc26=Tucuman SANT ------ ---
+loc27=Villa\\ Reynolds SAOR ------ ---
+
+[M__BR]
+name=Brazil
+loc0=Afonsos SBAF ------ ---
+loc1=Altamira SBHT ------ ---
+loc2=Aracaju SBAR ------ ---
+loc3=Bage SBBG ------ ---
+loc4=Bauru SBBU ------ ---
+loc5=Belem SBBE ------ ---
+loc6=Belo\\ Horizonte SBCF ------ ---
+loc7=Belo\\ Horizonte\\ Apt SBBH ------ ---
+loc8=Boa\\ Vista SBBV ------ ---
+loc9=Brasilia SBBR ------ ---
+loc10=Campinas SBKP ------ ---
+loc11=Campo\\ Grande SBCG ------ ---
+loc12=Caravelas SBCV ------ ---
+loc13=Conceicao\\ Do\\ Araguaia SBAA ------ ---
+loc14=Corumba SBCR ------ ---
+loc15=Cuiaba SBCY ------ ---
+loc16=Curitiba SBBI ------ ---
+loc17=Curitiba\\ Apt SBCT ------ ---
+loc18=Eduardo\\ Gomes\\ International SBEG ------ ---
+loc19=Fernando\\ De\\ Noronha SBFN ------ ---
+loc20=Florianopolis SBFL ------ ---
+loc21=Fortaleza SBFZ ------ ---
+loc22=Foz\\ Do\\ Iguacu SBFI ------ ---
+loc23=Galeao SBGL ------ ---
+loc24=Goiania SBGO ------ ---
+loc25=Guaratingueta SBGW ------ ---
+loc26=Guarulhos SBGR ------ ---
+loc27=Itaituba SBIH ------ ---
+loc28=Londrina SBLO ------ ---
+loc29=Macae SBME ------ ---
+loc30=Macapa SBMQ ------ ---
+loc31=Maceio SBMO ------ ---
+loc32=Manaus SBMN ------ ---
+loc33=Maraba SBMA ------ ---
+loc34=Marte SBMT ------ ---
+loc35=Natal SBNT ------ ---
+loc36=Pelotas SBPK ------ ---
+loc37=Pirassununga SBYS ------ ---
+loc38=Pocos\\ De\\ Caldas SBPC ------ ---
+loc39=Ponta\\ Pora SBPP ------ ---
+loc40=Porto\\ Alegre SBCO ------ ---
+loc41=Porto\\ Alegre\\ Apt SBPA ------ ---
+loc42=Porto\\ Velho SBPV ------ ---
+loc43=Presidente\\ Prudente SBDN ------ ---
+loc44=Recife SBRF ------ ---
+loc45=Rio\\ /\\ Jacarepagua SBJR ------ ---
+loc46=Rio\\ De\\ Janeiro SBRJ ------ ---
+loc47=Salvador SBSV ------ ---
+loc48=Santa\\ Cruz SBSC ------ ---
+loc49=Santa\\ Maria SBSM ------ ---
+loc50=Santarem SBSN ------ ---
+loc51=Santos SBST ------ ---
+loc52=Sao\\ Jose\\ Dos\\ Campo SBSJ ------ ---
+loc53=Sao\\ Luiz SBSL ------ ---
+loc54=Sao\\ Paulo SBSP ------ ---
+loc55=Tabatinga SBTT ------ ---
+loc56=Teresina SBTE ------ ---
+loc57=Tucurui SBTU ------ ---
+loc58=Uberaba SBUR ------ ---
+loc59=Uruguaiana SBUG ------ ---
+loc60=Vilhena SBVH ------ ---
+loc61=Vitoria SBVT ------ ---
+
+[AT]
+name=Atlantic
+states=AG PR
+
+[AT_PR]
+name=Puerto Rico
+loc0=Aquadilla TJBQ ------ ---
+loc1=San\\ Juan TJSJ ------ ---
+loc2=Mayaguez TJMZ ------ ---
+loc3=Ponce TJPS ------ ---
+
+[AT_AG]
+name=Antigua and Barbuda
+loc0=Antigua TAPA ------ ---
+
diff --git a/kweather/weatherbar.cpp b/kweather/weatherbar.cpp
new file mode 100644
index 0000000..2123a3a
--- /dev/null
+++ b/kweather/weatherbar.cpp
@@ -0,0 +1,172 @@
+/*
+ * This file is part of the KDE project
+ * Copyright (C) 2002 Ian Reinhart Geiser <geiseri@kde.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2.0 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * $Id$
+ */
+
+#include "weatherbar.h"
+#include "dockwidget.h"
+#include "sidebarwidget.h"
+
+#include <qlabel.h>
+#include <qfont.h>
+#include <qlayout.h>
+#include <qscrollview.h>
+#include <qgroupbox.h>
+#include <klocale.h>
+#include <kdebug.h>
+#include <kconfig.h>
+#include <kstandarddirs.h>
+#include <kmessagebox.h>
+#include <dcopref.h>
+
+
+KonqSidebarWeather::KonqSidebarWeather(KInstance* inst, QObject* parent,
+ QWidget* widgetParent,
+ QString& desktopName, const char* name)
+
+ : KonqSidebarPlugin(inst, parent, widgetParent, desktopName, name),
+ DCOPObject(name)
+{
+
+ m_container = new sidebarwidget(widgetParent,"sidebarwidget");
+
+ kdDebug() << "Calling Get Widget" << endl;
+
+ kdDebug() << "Get weatherstation list... " << endl;
+
+ if (!connectDCOPSignal(0,0,
+ "fileUpdate(QString)",
+ "refresh(QString)",false))
+ kdDebug() << "Could not attach signal..." << endl;
+ else
+ kdDebug() << "attached dcop signals..." << endl;
+
+ DCOPRef dcopCall( "KWeatherService", "WeatherService" );
+ DCOPReply reply = dcopCall.call("listStations()", true );
+ if ( reply.isValid() ) {
+ QStringList replyList = reply;
+ for(int i = 0; i < replyList.size(); i++)
+ {
+ dockwidget *d = new dockwidget(m_container->viewport(), replyList[i].latin1());
+ m_container->addWidget(d, replyList[i].latin1());
+ d->resizeView(80,48);
+ d->show();
+ m_widgets.insert(replyList[i], d);
+ dcopCall.send("update(QString)", replyList[i]);
+ }
+ }
+
+ timeOut = new QTimer(this, "timeOut" );
+ timeOut->changeInterval(15*60000);
+ connect(timeOut, SIGNAL(timeout()), this, SLOT(update()));
+ // m_widgets.append(new dockwidget(widgetParent));
+}
+
+
+KonqSidebarWeather::~KonqSidebarWeather()
+{
+}
+
+void* KonqSidebarWeather::provides(const QString&)
+{
+ return 0;
+}
+
+void KonqSidebarWeather::emitStatusBarText(const QString& s)
+{
+}
+
+QWidget* KonqSidebarWeather::getWidget()
+{
+ return m_container;
+}
+
+void KonqSidebarWeather::refresh(QString stationID)
+{
+ kdDebug() << "refresh " << stationID << endl;
+ if(m_widgets.find(stationID))
+ {
+ DCOPRef dcopCall( "KWeatherService", "WeatherService" );
+ m_widgets[stationID]->setWeatherIcon(dcopCall.call("currentIcon(QString)", stationID ,true ));
+ m_widgets[stationID]->setTemperature(dcopCall.call("temperature(QString)", stationID,true ));
+ m_widgets[stationID]->setPressure(dcopCall.call("pressure(QString)", stationID,true ));
+ m_widgets[stationID]->setWind(dcopCall.call("wind(QString)", stationID,true ));
+ m_widgets[stationID]->showWeather();
+ }
+ else
+ update();
+}
+
+void KonqSidebarWeather::handleURL(const KURL& url)
+{
+}
+
+void KonqSidebarWeather::handlePreview(const KFileItemList& items)
+{
+}
+
+void KonqSidebarWeather::handlePreviewOnMouseOver(const KFileItem& item)
+{
+}
+
+void KonqSidebarWeather::update()
+{
+ timeOut->stop();
+ DCOPRef dcopCall( "KWeatherService", "WeatherService" );
+ DCOPReply reply = dcopCall.call("listStations()", true );
+ if ( reply.isValid() ) {
+ QStringList replyList = reply;
+ for(int i = 0; i < replyList.size(); i++)
+ {
+ if(!m_widgets.find(replyList[i]))
+ {
+ dockwidget *d = new dockwidget(m_container->viewport(), replyList[i].latin1());
+ m_container->addWidget(d, replyList[i].latin1());
+ d->show();
+ m_widgets.insert(replyList[i], d);
+ }
+ dcopCall.send("update(QString)", replyList[i]);
+ }
+ }
+ timeOut->start(15*60000);
+}
+
+extern "C"
+{
+ KDE_EXPORT void* create_weather_sidebar(KInstance* inst, QObject* par, QWidget*widp,
+ QString& desktopname, const char* name)
+ {
+ return new KonqSidebarWeather(inst, par, widp, desktopname, name);
+ }
+
+ KDE_EXPORT bool add_weather_sidebar(QString* fn, QString* /*param*/,
+ QMap<QString, QString>* map)
+ {
+ map->insert("Type","Link");
+ map->insert("Icon","weather_sidebar");
+ map->insert("Name",i18n("Sidebar Weather Report"));
+ map->insert("Open","false");
+ map->insert("X-KDE-KonqSidebarModule","weather_sidebar");
+ fn->setLatin1("weatherbar%1.desktop");
+ return true;
+ }
+}
+
+#include "weatherbar.moc"
+
diff --git a/kweather/weatherbar.desktop b/kweather/weatherbar.desktop
new file mode 100644
index 0000000..ab8696f
--- /dev/null
+++ b/kweather/weatherbar.desktop
@@ -0,0 +1,61 @@
+[Desktop Entry]
+Type=Link
+URL=
+Icon=weather_sidebar
+Name=Sidebar Weather Report
+Name[ar]=تقرير الطقس على الشريط الجانبي
+Name[be]=Бакавы прагноз надвор'Ñ
+Name[bg]=Метеорологично време
+Name[bn]=সাইডবারে পà§à¦°à¦¦à¦°à§à¦¶à¦¿à¦¤ আবহাওয়া রিপোরà§à¦Ÿ
+Name[bs]=Sidebar vremenska prognoza
+Name[ca]=Barra d'informació del temps
+Name[cs]=Zpráva o poÄasí pro postranní liÅ¡tu
+Name[cy]=Adroddiad Tywydd i'r Bar Ochr
+Name[da]=Sidebjælke vejrudsigt
+Name[de]=Navigationsbereich für Wetterbericht
+Name[el]=ΜετεωÏολογική αναφοÏά ΠλευÏικής μπάÏας
+Name[eo]=Flank-VeterRaporto
+Name[es]=Barra lateral de informe meteorológico
+Name[et]=Külgriba ilmateade
+Name[eu]=Eguraldiaren Egoera Alboko Barran
+Name[fa]=گزارش جانبی آب و هوا
+Name[fi]=Navigointipalkin säätiedotus
+Name[fr]=Rapport météorologique de la barre latérale
+Name[gl]=Barra de Información Meteorolóxica
+Name[he]=דו"×— מזג ×וויר בסרגל צד
+Name[hi]=साइडबार वेदर रपट
+Name[hr]=MeteoroloÅ¡ki izvjeÅ¡taj u boÄnoj traci
+Name[hu]=Időjárás-jelentési oldalsáv
+Name[is]=Veðurupplýusingar í hliðarstiku
+Name[it]=Bollettino meteorologico per la barra laterale
+Name[ja]=サイドãƒãƒ¼æ°—象レãƒãƒ¼ãƒˆ
+Name[km]=របាយការណáŸâ€‹áž¢áž¶áž€áž¶ážŸáž’ាážáž»â€‹áž“ៅ​របារ​ចំហៀង
+Name[ko]=사ì´ë“œë°” 날씨 ë³´ê³ 
+Name[lv]=SÄnjoslas laikaziņas
+Name[mk]=Извештај за време за Ñтранична лента
+Name[mt]=Sidebar tar-rapport tat-temp
+Name[nb]=Værrapport på sidestolpen
+Name[nds]=Sietpaneel för Wederberichten
+Name[ne]=किनारापटà¥à¤Ÿà¥€ मौसम पà¥à¤°à¤¤à¤¿à¤µà¥‡à¤¦à¤¨
+Name[nl]=Zijbalk Weersbericht
+Name[nn]=Sidestolpe med vêrmelding
+Name[pl]=Raport o pogodzie w pasku bocznym
+Name[pt]=Boletim Meteorológico da Barra Lateral
+Name[pt_BR]=Informações sobre o Tempo
+Name[ro]=Bară laterală raport meteo
+Name[ru]=Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ погоде на панели
+Name[sk]=Správa o poÄasí pre boÄný panel
+Name[sl]=Stransko vremensko poroÄilo
+Name[sr]=ВременÑка прогноза у бочној траци
+Name[sr@Latn]=Vremenska prognoza u boÄnoj traci
+Name[sv]=Sidopanel med väderprognos
+Name[ta]= பகà¯à®•à®ªà¯ படà¯à®Ÿà¯ˆ வானிலை அறிகà¯à®•à¯ˆ
+Name[tg]=Ðхборот дар бораи ҳаво
+Name[tr]=Yan Çubuk Hava Durumu Raporlayıcı
+Name[uk]=Панель прогнозу погоди
+Name[wa]=Rapoirt meteyo sol bår di costé
+Name[zh_CN]=气象报告边æ 
+Name[zh_TW]=天氣報告工具列
+
+Open=false
+X-KDE-KonqSidebarModule=weather_sidebar
diff --git a/kweather/weatherbar.h b/kweather/weatherbar.h
new file mode 100644
index 0000000..80559ae
--- /dev/null
+++ b/kweather/weatherbar.h
@@ -0,0 +1,68 @@
+/*
+ * This file is part of the KDE project
+ * Copyright (C) 2002 Ian Reinhart Geiser <geiseri@kde.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2.0 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * $Id$
+ */
+
+#ifndef __KONQSIDEBARWEATHER_H__
+#define __KONQSIDEBARWEATHER_H__
+
+#include <konqsidebarplugin.h>
+#include <kparts/part.h>
+#include <kparts/factory.h>
+#include <kparts/browserextension.h>
+#include <qdict.h>
+#include <dcopobject.h>
+#include <qlayout.h>
+#include <qtimer.h>
+
+class dockwidget;
+class sidebarwidget;
+
+class KonqSidebarWeather: public KonqSidebarPlugin, virtual public DCOPObject
+{
+ Q_OBJECT
+ K_DCOP
+public:
+ KonqSidebarWeather(KInstance* inst, QObject* parent, QWidget* widgetParent,
+ QString& desktopName_, const char* name = 0);
+
+ ~KonqSidebarWeather();
+ virtual void* provides(const QString&);
+ void emitStatusBarText(const QString&);
+ virtual QWidget *getWidget();
+
+ k_dcop:
+ virtual void refresh(QString);
+
+protected:
+ virtual void handleURL(const KURL &url);
+ virtual void handlePreview(const KFileItemList& items);
+ virtual void handlePreviewOnMouseOver(const KFileItem& item);
+
+private slots:
+ void update();
+
+private:
+ QDict <dockwidget> m_widgets;
+ sidebarwidget *m_container;
+ QTimer *timeOut;
+};
+
+#endif
+
diff --git a/kweather/weatherbar_add.desktop b/kweather/weatherbar_add.desktop
new file mode 100644
index 0000000..1b8c687
--- /dev/null
+++ b/kweather/weatherbar_add.desktop
@@ -0,0 +1,61 @@
+[Desktop Entry]
+Type=Link
+URL=
+Icon=weather_sidebar
+Name=Sidebar Weather Report
+Name[ar]=تقرير الطقس على الشريط الجانبي
+Name[be]=Бакавы прагноз надвор'Ñ
+Name[bg]=Метеорологично време
+Name[bn]=সাইডবারে পà§à¦°à¦¦à¦°à§à¦¶à¦¿à¦¤ আবহাওয়া রিপোরà§à¦Ÿ
+Name[bs]=Sidebar vremenska prognoza
+Name[ca]=Barra d'informació del temps
+Name[cs]=Zpráva o poÄasí pro postranní liÅ¡tu
+Name[cy]=Adroddiad Tywydd i'r Bar Ochr
+Name[da]=Sidebjælke vejrudsigt
+Name[de]=Navigationsbereich für Wetterbericht
+Name[el]=ΜετεωÏολογική αναφοÏά ΠλευÏικής μπάÏας
+Name[eo]=Flank-VeterRaporto
+Name[es]=Barra lateral de informe meteorológico
+Name[et]=Külgriba ilmateade
+Name[eu]=Eguraldiaren Egoera Alboko Barran
+Name[fa]=گزارش جانبی آب و هوا
+Name[fi]=Navigointipalkin säätiedotus
+Name[fr]=Rapport météorologique de la barre latérale
+Name[gl]=Barra de Información Meteorolóxica
+Name[he]=דו"×— מזג ×וויר בסרגל צד
+Name[hi]=साइडबार वेदर रपट
+Name[hr]=MeteoroloÅ¡ki izvjeÅ¡taj u boÄnoj traci
+Name[hu]=Időjárás-jelentési oldalsáv
+Name[is]=Veðurupplýusingar í hliðarstiku
+Name[it]=Bollettino meteorologico per la barra laterale
+Name[ja]=サイドãƒãƒ¼æ°—象レãƒãƒ¼ãƒˆ
+Name[km]=របាយការណáŸâ€‹áž¢áž¶áž€áž¶ážŸáž’ាážáž»â€‹áž“ៅ​របារ​ចំហៀង
+Name[ko]=사ì´ë“œë°” 날씨 ë³´ê³ 
+Name[lv]=SÄnjoslas laikaziņas
+Name[mk]=Извештај за време за Ñтранична лента
+Name[mt]=Sidebar tar-rapport tat-temp
+Name[nb]=Værrapport på sidestolpen
+Name[nds]=Sietpaneel för Wederberichten
+Name[ne]=किनारापटà¥à¤Ÿà¥€ मौसम पà¥à¤°à¤¤à¤¿à¤µà¥‡à¤¦à¤¨
+Name[nl]=Zijbalk Weersbericht
+Name[nn]=Sidestolpe med vêrmelding
+Name[pl]=Raport o pogodzie w pasku bocznym
+Name[pt]=Boletim Meteorológico da Barra Lateral
+Name[pt_BR]=Informações sobre o Tempo
+Name[ro]=Bară laterală raport meteo
+Name[ru]=Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ погоде на панели
+Name[sk]=Správa o poÄasí pre boÄný panel
+Name[sl]=Stransko vremensko poroÄilo
+Name[sr]=ВременÑка прогноза у бочној траци
+Name[sr@Latn]=Vremenska prognoza u boÄnoj traci
+Name[sv]=Sidopanel med väderprognos
+Name[ta]= பகà¯à®•à®ªà¯ படà¯à®Ÿà¯ˆ வானிலை அறிகà¯à®•à¯ˆ
+Name[tg]=Ðхборот дар бораи ҳаво
+Name[tr]=Yan Çubuk Hava Durumu Raporlayıcı
+Name[uk]=Панель прогнозу погоди
+Name[wa]=Rapoirt meteyo sol bår di costé
+Name[zh_CN]=气象报告边æ 
+Name[zh_TW]=天氣報告工具列
+
+Open=false
+X-KDE-KonqSidebarAddModule=weather_sidebar
diff --git a/kweather/weatherbutton.cpp b/kweather/weatherbutton.cpp
new file mode 100644
index 0000000..7ae680c
--- /dev/null
+++ b/kweather/weatherbutton.cpp
@@ -0,0 +1,161 @@
+/* This file is part of the KDE project
+ Copyright (C) 2003-2004 Nadeem Hasan <nhasan@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "weatherbutton.h"
+
+#include <qpainter.h>
+
+#include <kapplication.h>
+#include <kcursor.h>
+#include <kglobalsettings.h>
+#include <kiconeffect.h>
+#include <kicontheme.h>
+#include <kipc.h>
+#include <kstandarddirs.h>
+
+WeatherButton::WeatherButton( QWidget *parent, const char *name )
+ : QButton( parent, name ), m_highlight( false )
+{
+ setBackgroundOrigin( AncestorOrigin );
+
+ connect( kapp, SIGNAL( settingsChanged( int ) ),
+ SLOT( slotSettingsChanged( int ) ) );
+ connect( kapp, SIGNAL( iconChanged( int ) ),
+ SLOT( slotIconChanged( int ) ) );
+
+ kapp->addKipcEventMask( KIPC::SettingsChanged );
+ kapp->addKipcEventMask( KIPC::IconChanged );
+
+ slotSettingsChanged( KApplication::SETTINGS_MOUSE );
+}
+
+void WeatherButton::drawButton( QPainter *p )
+{
+ drawButtonLabel(p);
+}
+
+void WeatherButton::drawButtonLabel( QPainter *p )
+{
+ if (!pixmap())
+ {
+ return;
+ }
+
+ QPixmap pix = m_highlight? m_activeIcon : m_normalIcon;
+
+ if (isOn() || isDown())
+ {
+ pix = pix.convertToImage().smoothScale(pix.width() - 2,
+ pix.height() - 2);
+ }
+
+ int h = height();
+ int w = width();
+ int ph = pix.height();
+ int pw = pix.width();
+ int margin = 3;
+ QPoint origin(margin / 2, margin / 2);
+
+ if (ph < (h - margin))
+ {
+ origin.setY((h - ph) / 2);
+ }
+
+ if (pw < (w - margin))
+ {
+ origin.setX((w - pw) / 2);
+ }
+
+ p->drawPixmap(origin, pix);
+}
+
+
+void WeatherButton::setPixmap( const QPixmap &pix )
+{
+ QButton::setPixmap( pix );
+ generateIcons();
+}
+
+void WeatherButton::generateIcons()
+{
+ if ( !pixmap() )
+ return;
+
+ QImage image = pixmap()->convertToImage();
+ image = image.smoothScale( pixmapSize(), QImage::ScaleMin );
+
+ KIconEffect effect;
+
+ m_normalIcon = effect.apply( image, KIcon::Panel, KIcon::DefaultState );
+ m_activeIcon = effect.apply( image, KIcon::Panel, KIcon::ActiveState );
+}
+
+void WeatherButton::slotSettingsChanged( int category )
+{
+ if ( category != KApplication::SETTINGS_MOUSE ) return;
+
+ bool changeCursor = KGlobalSettings::changeCursorOverIcon();
+
+ if ( changeCursor )
+ setCursor( KCursor::handCursor() );
+ else
+ unsetCursor();
+}
+
+void WeatherButton::slotIconChanged( int group )
+{
+ if ( group != KIcon::Panel )
+ return;
+
+ generateIcons();
+ repaint( false );
+}
+
+void WeatherButton::enterEvent( QEvent *e )
+{
+ m_highlight = true;
+
+ repaint( false );
+ QButton::enterEvent( e );
+}
+
+void WeatherButton::leaveEvent( QEvent *e )
+{
+ m_highlight = false;
+
+ repaint( false );
+ QButton::enterEvent( e );
+}
+
+void WeatherButton::resizeEvent( QResizeEvent * )
+{
+ generateIcons();
+}
+
+QPoint WeatherButton::pixmapOrigin() const
+{
+ QSize point = margin()/2;
+ QPoint origin( point.width(), point.height() );
+
+ return origin;
+}
+
+#include "weatherbutton.moc"
+
+// vim:ts=4:sw=4:et
diff --git a/kweather/weatherbutton.h b/kweather/weatherbutton.h
new file mode 100644
index 0000000..d846169
--- /dev/null
+++ b/kweather/weatherbutton.h
@@ -0,0 +1,57 @@
+/* This file is part of the KDE project
+ Copyright (C) 2003-2004 Nadeem Hasan <nhasan@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef WEATHERBUTTON_H
+#define WEATHERBUTTON_H
+
+#include <qbutton.h>
+#include <qpixmap.h>
+
+class WeatherButton : public QButton
+{
+ Q_OBJECT
+
+ public:
+ WeatherButton( QWidget *parent, const char *name );
+ void setPixmap( const QPixmap &pix );
+
+ protected:
+ void drawButton( QPainter *p );
+ void drawButtonLabel( QPainter *p );
+ QSize margin() const { return QSize( 3, 3 ); }
+ QSize pixmapSize() const { return size() - margin()*2; }
+ QPoint pixmapOrigin() const;
+ void generateIcons();
+
+ void enterEvent( QEvent *e );
+ void leaveEvent( QEvent *e );
+ void resizeEvent( QResizeEvent *e );
+
+ bool m_highlight;
+ QPixmap m_normalIcon;
+ QPixmap m_activeIcon;
+
+ protected slots:
+ void slotSettingsChanged( int category );
+ void slotIconChanged( int group );
+};
+
+#endif // WEATHERBUTTON_H
+
+// vim:ts=4:sw=4:et
diff --git a/kweather/weatherlib.cpp b/kweather/weatherlib.cpp
new file mode 100644
index 0000000..cb79a05
--- /dev/null
+++ b/kweather/weatherlib.cpp
@@ -0,0 +1,355 @@
+/***************************************************************************
+ weatherlib.cpp - description
+ -------------------
+begin : Wed Jul 5 2000
+copyright : (C) 2000 by Ian Reinhart Geiser
+email : geiseri@msoe.edu
+***************************************************************************/
+
+/***************************************************************************
+* *
+* This program is free software; you can redistribute it and/or modify *
+* it under the terms of the GNU General Public License as published by *
+* the Free Software Foundation; either version 2 of the License, or *
+* (at your option) any later version. *
+* *
+***************************************************************************/
+
+#include "config.h"
+#include <qfile.h>
+#include <qdatetime.h>
+#include <qtextstream.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kdebug.h>
+#include <math.h>
+#include <krfcdate.h>
+#include <kio/job.h>
+#include <kurl.h>
+#include <knotifyclient.h>
+#include <ktempfile.h>
+#include <unistd.h>
+#include <kapplication.h>
+#include <kpassivepopup.h>
+
+#include "metar_parser.h"
+#include "stationdatabase.h"
+#include "sun.h"
+#include "weatherlib.h"
+
+#include "weatherlib.moc"
+
+
+class WeatherLib::Data
+{
+ public:
+ Data();
+ ~Data(){ if ( target ) delete target; }
+
+ void clear();
+
+ /** The current weather state outside */
+ struct WeatherInfo wi;
+ QDateTime age;
+ KTempFile *target;
+ bool downloading;
+ bool updated;
+ KIO::Job *job;
+};
+
+WeatherLib::Data::Data()
+ : target( 0 ), job( 0 )
+{
+ clear();
+}
+
+void WeatherLib::Data::clear()
+{
+ age = QDateTime::currentDateTime();
+ downloading = false;
+ updated = false;
+ job = 0;
+
+ if ( target )
+ {
+ delete target;
+ target = 0;
+ }
+}
+
+WeatherLib::WeatherLib(StationDatabase *stationDB, QObject *parent, const char *name)
+ : QObject (parent, name)
+{
+ KGlobal::locale()->insertCatalogue("kweather");
+
+ m_StationDb = stationDB;
+
+ data.setAutoDelete( true );
+}
+
+WeatherLib::~WeatherLib()
+{
+}
+
+void WeatherLib::slotCopyDone(KIO::Job* job)
+{
+ kdDebug(12006) << "Copy done..." << endl;
+ if( job->error())
+ {
+ kdDebug(12006) << "Error code: " << job->error() << endl;
+ //job->showErrorDialog(0L);
+ if ((job->error() == KIO::ERR_COULD_NOT_CONNECT || job->error() == KIO::ERR_UNKNOWN_HOST)
+ && !hostDown)
+ {
+ hostDown= true;
+ // no need to show a passive popup here, as below all stations will show "dunno" icon
+ }
+ }
+ // Find the job
+ QDictIterator<Data> it( data );
+ Data *d = 0L;
+ for( ; it.current(); ++it )
+ {
+ kdDebug(12006) << "Searching for job..." << endl;
+ if(it.current()->job == job)
+ {
+ d = it.current();
+ d->downloading = false;
+ if( !job->error() )
+ {
+ kdDebug( 12006) << "Reading: " << d->target->name() << endl;
+ QFile file( d->target->name() );
+ file.open( IO_ReadOnly );
+ QTextStream *t = new QTextStream( &file );
+ //QTextStream *t = d->target->textStream();
+ if( t )
+ {
+ QString s = QString::null;
+ while ( !t->eof() )
+ {
+ s += " " + t->readLine();
+ }
+
+ if ( !s.isEmpty() )
+ {
+ kdDebug( 12006 ) << "Parse: " << s << endl;
+ MetarParser parser(m_StationDb, KGlobal::locale()->measureSystem());
+ d->wi = parser.processData(d->wi.reportLocation, s);
+ d->age = QDateTime::currentDateTime().addSecs(1800);
+ emit fileUpdate(d->wi.reportLocation);
+ d->updated = true;
+ }
+ else
+ {
+ // File error
+ kdDebug( 12006 ) << "File empty error..." << endl;
+ KPassivePopup::message( i18n("KWeather Error!"),
+ i18n("The temp file %1 was empty.").arg(d->target->name()), 0L,"error" );
+ d->updated = false;
+ }
+ }
+ else
+ {
+ // File error
+ kdDebug( 12006 ) << "File read error..." << endl;
+ KPassivePopup::message( i18n("KWeather Error!"),
+ i18n("Could not read the temp file %1.").arg(d->target->name()), 0L,"error" );
+ d->updated = false;
+ }
+ delete d->target;
+ d->target = 0L;
+ d->job = 0L;
+
+ }
+ else if( job->error() == KIO::ERR_DOES_NOT_EXIST)
+ {
+ data.remove(d->wi.reportLocation);
+ kdDebug( 12006 ) << "Bad station data so i am going to remove it" << endl;
+ KPassivePopup::message( i18n("KWeather Error!"),
+ i18n("The requested station does not exist."), 0L,"error" );
+ }
+ else if(job->error() == KIO::ERR_COULD_NOT_CONNECT ||
+ job->error() == KIO::ERR_UNKNOWN_HOST)
+ {
+ kdDebug( 12006 ) << "Offline now..." << endl;
+ d->clear();
+ d->wi.theWeather = "dunno";
+ d->wi.qsCurrentList.append(i18n("The network is currently offline..."));
+ d->wi.qsCurrentList.append(i18n("Please update later."));
+ emit fileUpdate(d->wi.reportLocation);
+ }
+ else
+ {
+ kdDebug( 12006 ) << "Duh?..." << endl;
+ }
+
+ }
+ }
+}
+
+void WeatherLib::getData(Data *d, bool force /* try even if host was down last time*/)
+{
+ if(!d->downloading && (force || !hostDown) )
+ {
+ d->downloading = true;
+ d->updated = false;
+ QString u = "http://weather.noaa.gov/pub/data/observations/metar/stations/";
+ u += d->wi.reportLocation.upper().stripWhiteSpace();
+ u += ".TXT";
+
+ d->target = new KTempFile(QString::null, "-weather");
+ d->target->setAutoDelete(true);
+ d->target->file();
+
+ KURL url(u);
+ KURL local(d->target->name());
+
+ d->job = KIO::file_copy( url, local, -1, true, false, false);
+ d->job->addMetaData("cache", "reload"); // Make sure to get fresh info
+ connect( d->job, SIGNAL( result( KIO::Job *)),
+ SLOT(slotCopyDone(KIO::Job *)));
+ kdDebug( 12006 ) << "Copying " << url.prettyURL() << " to "
+ << local.prettyURL() << endl;
+ emit fileUpdating(d->wi.reportLocation);
+ }
+}
+
+WeatherLib::Data* WeatherLib::findData(const QString &stationID)
+{
+ Data *d = data[stationID];
+ if (!d)
+ {
+ d = new Data();
+ d->wi.reportLocation = stationID;
+ d->wi.theWeather = "dunno";
+ d->wi.qsCurrentList.append( i18n( "Retrieving weather data..." ) );
+ data.insert(stationID, d);
+ getData(d);
+ }
+
+ return d;
+}
+
+QString WeatherLib::temperature(const QString &stationID){
+ Data *d = findData(stationID);
+ return d->wi.qsTemperature;
+}
+
+QString WeatherLib::pressure(const QString &stationID){
+ Data *d = findData(stationID);
+ return d->wi.qsPressure;
+}
+
+QString WeatherLib::wind(const QString &stationID){
+ Data *d = findData(stationID);
+ return (d->wi.qsWindSpeed + " " + d->wi.qsWindDirection);
+}
+
+/** */
+QString WeatherLib::dewPoint(const QString &stationID){
+ Data *d = findData(stationID);
+ return d->wi.qsDewPoint;
+}
+
+QString WeatherLib::relHumidity(const QString &stationID){
+ Data *d = findData(stationID);
+ return d->wi.qsRelHumidity;
+}
+
+QString WeatherLib::heatIndex(const QString &stationID){
+ Data *d = findData(stationID);
+ return d->wi.qsHeatIndex;
+}
+
+QString WeatherLib::windChill(const QString &stationID){
+ Data *d = findData(stationID);
+ return d->wi.qsWindChill;
+}
+
+QString WeatherLib::iconName(const QString &stationID){
+
+ QString result("dunno");
+
+ // isEmpty is true for null or 0 length strings
+ if ( !stationID.isEmpty() )
+ {
+ Data *d = findData(stationID);
+ result = d->wi.theWeather;
+ }
+
+ return result;
+}
+
+QString WeatherLib::date(const QString &stationID){
+ Data *d = findData(stationID);
+
+ if ( ! d->wi.qsDate.isValid() )
+ return "";
+ else
+ {
+ QDateTime gmtDateTime(d->wi.qsDate, d->wi.qsTime);
+ QDateTime localDateTime = gmtDateTime.addSecs(KRFCDate::localUTCOffset() * 60);
+ return KGlobal::locale()->formatDateTime(localDateTime, false, false);
+ }
+}
+
+/** Returns the current cover */
+QStringList WeatherLib::cover(const QString &stationID){
+ Data *d = findData(stationID);
+ return d->wi.qsCoverList;
+}
+
+/** return the visibility */
+QString WeatherLib::visibility(const QString &stationID){
+ Data *d = findData(stationID);
+ return d->wi.qsVisibility;
+}
+
+/** return the weather text */
+QStringList WeatherLib::weather(const QString &stationID){
+ Data *d = findData(stationID);
+ return d->wi.qsCurrentList;
+}
+
+bool WeatherLib::stationNeedsMaintenance(const QString &stationID)
+{
+ Data *d = findData(stationID);
+ return d->wi.stationNeedsMaintenance;
+}
+
+void WeatherLib::update(const QString &stationID)
+{
+ // Only grab new data if its more than 50 minutes old
+ Data *d = findData(stationID);
+
+ QDateTime timeout = QDateTime::currentDateTime();
+
+ kdDebug (12006) << "Current Time: " << KGlobal::locale()->formatDateTime(timeout, false, false) <<
+ " Update at: " << KGlobal::locale()->formatDateTime(d->age, false, false) << endl;
+ if( timeout >= d->age || !d->updated)
+ getData(d, true /* try even if host was down last time */);
+ else
+ emit fileUpdate(d->wi.reportLocation);
+}
+
+QStringList WeatherLib::stations()
+{
+ QStringList l;
+ QDictIterator<Data> it( data );
+ for( ; it.current(); ++it )
+ l += it.currentKey();
+ return l;
+}
+
+void WeatherLib::forceUpdate(const QString &stationID)
+{
+ hostDown = false; // we want to show error message if host is still down
+ Data *d = findData(stationID);
+ getData( d );
+}
+
+void WeatherLib::remove(const QString &stationID)
+{
+ data.remove(stationID);
+ emit stationRemoved(stationID);
+}
diff --git a/kweather/weatherlib.h b/kweather/weatherlib.h
new file mode 100644
index 0000000..723e3dc
--- /dev/null
+++ b/kweather/weatherlib.h
@@ -0,0 +1,84 @@
+/***************************************************************************
+ weatherlib.h - description
+ -------------------
+ begin : Wed Jul 5 2000
+ copyright : (C) 2000 by Ian Reinhart Geiser
+ email : geiseri@msoe.edu
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef WEATHERLIB_H
+#define WEATHERLIB_H
+#include <qobject.h>
+#include <qstring.h>
+#include <qregexp.h>
+#include <qdict.h>
+
+namespace KIO
+{
+ class Job;
+}
+
+class StationDatabase;
+
+class WeatherLib : public QObject
+{
+ Q_OBJECT
+
+ public:
+ class Data;
+
+ WeatherLib(StationDatabase *stationDB, QObject *parent =0L, const char *name =0L);
+ virtual ~WeatherLib();
+
+ QString temperature(const QString &stationID);
+ QString dewPoint(const QString &stationID);
+ QString relHumidity(const QString &stationID);
+ QString heatIndex(const QString &stationID);
+ QString windChill(const QString &stationID);
+ QString wind(const QString &stationID);
+ QString pressure(const QString &stationID);
+ QString iconName(const QString &stationID);
+ QString date(const QString &stationID);
+ QStringList weather(const QString &stationID);
+ QString visibility(const QString &stationID);
+ QStringList cover(const QString &stationID);
+ bool stationNeedsMaintenance(const QString &stationID);
+
+ QStringList stations();
+ bool isNight(const QString &stationID) const;
+
+ void update(const QString &stationID);
+ void forceUpdate(const QString &stationID);
+ void remove(const QString &stationID);
+
+ signals:
+ void fileUpdating(const QString &stationID);
+ void fileUpdate(const QString &stationID);
+ void stationRemoved(const QString &stationID);
+
+ private slots:
+ void slotCopyDone(KIO::Job*);
+
+ private:
+ Data* findData(const QString &stationID);
+ void clearData(Data *d);
+ void getData(Data *d, bool force = false);
+ void processData(const QString &metar, Data *d);
+
+ StationDatabase *m_StationDb;
+
+ QDict<Data> data;
+ bool fileDownloaded;
+ bool hostDown;
+};
+
+#endif
diff --git a/kweather/weatherlog.sh b/kweather/weatherlog.sh
new file mode 100755
index 0000000..51afc45
--- /dev/null
+++ b/kweather/weatherlog.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+LOC=KEWR
+TEMP=`dcop KWeatherService WeatherService temperature $LOC`
+WIND=`dcop KWeatherService WeatherService wind $LOC`
+VIS=`dcop KWeatherService WeatherService visibility $LOC`
+DATE=`date`
+echo "$DATE,$TEMP,$WIND,$VIS" >> $LOC.log
diff --git a/kweather/weatherservice.cpp b/kweather/weatherservice.cpp
new file mode 100644
index 0000000..c35ed8f
--- /dev/null
+++ b/kweather/weatherservice.cpp
@@ -0,0 +1,343 @@
+/* This file is part of the KDE project
+ Copyright (C) 2001-2004 Ian Geiser <geiseri@kde.org>
+ Copyright (C) 2002-2004 Nadeem Hasan <nhasan@kde.org>
+ Copyright (C) 2003-2004 John Ratke
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+
+#include "weatherlib.h"
+#include "weatherservice.h"
+#include "stationdatabase.h"
+#include "sun.h"
+
+WeatherService::WeatherService(QObject *parent, const char *name) : QObject (parent, name), DCOPObject("WeatherService")
+{
+ kdDebug(12006) << "Starting new service... " << endl;
+
+ stationDB = new StationDatabase();
+
+ m_weatherLib = new WeatherLib(stationDB, this, "WeatherLib");
+ connect(m_weatherLib, SIGNAL(fileUpdating( const QString&)),
+ SLOT(updating( const QString&)));
+ connect(m_weatherLib, SIGNAL(fileUpdate( const QString&)),
+ SLOT(updated( const QString&)));
+ connect(m_weatherLib, SIGNAL(stationRemoved(const QString&)),
+ SLOT(slotStationRemoved(const QString&)));
+
+ KConfig *conf = kapp->config();
+
+ conf->setGroup("WEATHERSTATIONS");
+ QStringList stations =conf->readListEntry("stations");
+ QStringList::Iterator it = stations.begin();
+ for ( ; it != stations.end(); ++it )
+ m_weatherLib->update(*it);
+}
+
+WeatherService::~WeatherService()
+{
+ kdDebug(12006) << "Going away... " << endl;
+ // Don't need to call saveSettings() because WeatherService::exit
+ // already does that. Plus it wouldn't work here anyway because
+ // we can't get the config after calling kapp->quit();
+ delete stationDB;
+}
+
+void WeatherService::updated(const QString &stationID)
+{
+ kdDebug(12006) << "Sending update for " << stationID << endl;
+ emit fileUpdate( stationID );
+}
+
+void WeatherService::updateAll()
+{
+ kdDebug(12006) << "Sending for all" << endl;
+ QStringList stations = m_weatherLib->stations();
+ QStringList::ConstIterator end(stations.end());
+ for ( QStringList::ConstIterator it = stations.begin(); it != end; ++it ) {
+ update(*it);
+ }
+
+}
+
+void WeatherService::updating(const QString &stationID)
+{
+ kdDebug(12006) << "Sending updating for " << stationID << endl;
+ emit fileUpdating( stationID );
+}
+
+void WeatherService::slotStationRemoved(const QString &stationID)
+{
+ kdDebug(12006) << "Sending stationRemoved for " << stationID << endl;
+ emit stationRemoved( stationID );
+}
+
+QString WeatherService::temperature(const QString &stationID)
+{
+ kdDebug (12006) << "Returning " << stationID << endl;
+ return m_weatherLib->temperature(stationID);
+}
+
+QString WeatherService::dewPoint(const QString &stationID)
+{
+ return m_weatherLib->dewPoint(stationID);
+}
+
+QString WeatherService::relativeHumidity(const QString &stationID)
+{
+ return m_weatherLib->relHumidity(stationID);
+}
+
+QString WeatherService::heatIndex(const QString &stationID)
+{
+ return m_weatherLib->heatIndex(stationID);
+}
+
+QString WeatherService::windChill(const QString &stationID)
+{
+ return m_weatherLib->windChill(stationID);
+}
+
+QString WeatherService::wind(const QString &stationID)
+{
+ return m_weatherLib->wind(stationID);
+}
+
+QString WeatherService::pressure(const QString &stationID)
+{
+ return m_weatherLib->pressure(stationID);
+}
+
+QPixmap WeatherService::currentIcon(const QString &stationID)
+{
+ return icon( stationID );
+}
+
+QPixmap WeatherService::icon(const QString &stationID)
+{
+ kdDebug(12006) << "Get the current weather icon.." << endl;
+ QString icon = iconFileName(stationID);
+ QPixmap theIcon = QPixmap(icon);
+ return theIcon;
+}
+
+QString WeatherService::currentIconString(const QString &stationID)
+{
+ return m_weatherLib->iconName(stationID);
+}
+
+QString WeatherService::iconFileName(const QString &stationID)
+{
+ QString icon = m_weatherLib->iconName(stationID);
+ icon = locate( "data", "kweather/" + icon + ".png" );
+ return icon;
+}
+
+QString WeatherService::date(const QString &stationID)
+{
+ return m_weatherLib->date(stationID);
+}
+
+QString WeatherService::visibility(const QString &stationID)
+{
+ return m_weatherLib->visibility(stationID);
+}
+
+QStringList WeatherService::cover(const QString &stationID)
+{
+ return m_weatherLib->cover(stationID);
+}
+
+QStringList WeatherService::weather(const QString &stationID)
+{
+ return m_weatherLib->weather(stationID);
+}
+
+bool WeatherService::stationNeedsMaintenance(const QString &stationID)
+{
+ return m_weatherLib->stationNeedsMaintenance(stationID);
+}
+
+void WeatherService::update(const QString &stationID)
+{
+ m_weatherLib->update(stationID);
+}
+
+void WeatherService::forceUpdate(const QString &stationID)
+{
+ m_weatherLib->forceUpdate(stationID);
+}
+
+void WeatherService::removeStation(const QString &stationID)
+{
+ m_weatherLib->remove(stationID);
+ saveSettings();
+}
+
+void WeatherService::addStation(const QString &stationID)
+{
+ m_weatherLib->update(stationID);
+ saveSettings();
+}
+
+void WeatherService::exit()
+{
+ saveSettings();
+ kapp->quit();
+}
+
+QStringList WeatherService::listStations()
+{
+ return m_weatherLib->stations();
+}
+
+void WeatherService::saveSettings()
+{
+ KConfig *conf = kapp->config();
+ conf->setGroup("WEATHERSTATIONS");
+ conf->writeEntry( "stations", m_weatherLib->stations());
+ conf->sync();
+}
+
+QString WeatherService::stationName(const QString &stationID)
+{
+ if ( stationDB )
+ {
+ QString upperStationID = stationID.upper();
+ return stationDB->stationNameFromID(upperStationID);
+ }
+ else
+ return stationID;
+}
+QString WeatherService::stationCode( const QString &stationName )
+{
+ if ( stationDB )
+ {
+ return stationDB->stationIDfromName(stationName);
+ }
+ else
+ return stationName;
+}
+
+QString WeatherService::stationCountry(const QString &stationID)
+{
+
+ if ( stationDB )
+ {
+ QString upperStationID = stationID.upper();
+ return stationDB->stationCountryFromID(upperStationID);
+ }
+ else
+ return stationID;
+}
+QString WeatherService::longitude(const QString &stationID)
+{
+ if ( stationDB )
+ {
+ QString upperStationID = stationID.upper();
+ return stationDB->stationLongitudeFromID(upperStationID);
+ }
+ else
+ return "None";
+}
+QString WeatherService::latitude(const QString &stationID)
+{
+ if ( stationDB )
+ {
+ QString upperStationID = stationID.upper();
+ return stationDB->stationLatitudeFromID(upperStationID);
+ }
+ else
+ return "None";
+}
+
+QStringList WeatherService::findStations(float /*lon*/, float /*lat*/)
+{
+ QStringList stationList;
+ stationList << "KMKE" << "KPNE" << "KTPW";
+ return stationList;
+}
+
+QString WeatherService::getTime(const QString &stationID, TimeType timeType)
+{
+ QString upperStationID = stationID.upper();
+
+ QString latitude = stationDB->stationLatitudeFromID(upperStationID);
+ QString longitude = stationDB->stationLongitudeFromID(upperStationID);
+
+ if ( latitude.compare( i18n("Unknown Station" ) ) == 0 ||
+ longitude.compare( i18n("Unknown Station" ) ) == 0 )
+ {
+ return i18n( "Unknown Station" );
+ }
+ else
+ {
+ Sun theSun( latitude, longitude );
+
+ QTime time;
+ switch ( timeType )
+ {
+ case RISE:
+ time = theSun.computeRiseTime();
+ break;
+ case SET:
+ time = theSun.computeSetTime();
+ break;
+ case CIVIL_START:
+ time = theSun.computeCivilTwilightStart();
+ break;
+ case CIVIL_END:
+ time = theSun.computeCivilTwilightEnd();
+ break;
+ }
+
+ kdDebug(12006) << "station, lat, lon, time: " << upperStationID << " " <<
+ latitude << " " << longitude << " " << time << endl;
+
+ return KGlobal::locale()->formatTime(time);
+ }
+}
+
+QString WeatherService::sunRiseTime(const QString &stationID)
+{
+ return getTime(stationID, RISE);
+}
+
+QString WeatherService::sunSetTime(const QString &stationID)
+{
+ return getTime(stationID, SET);
+}
+
+QString WeatherService::civilTwilightStart(const QString &stationID)
+{
+ return getTime(stationID, CIVIL_START);
+}
+
+QString WeatherService::civilTwilightEnd(const QString &stationID)
+{
+ return getTime(stationID, CIVIL_END);
+}
+
+
+
+#include "weatherservice.moc"
diff --git a/kweather/weatherservice.h b/kweather/weatherservice.h
new file mode 100644
index 0000000..1f3c781
--- /dev/null
+++ b/kweather/weatherservice.h
@@ -0,0 +1,107 @@
+/* This file is part of the KDE project
+ Copyright (C) 2001-2004 Ian Geiser <geiseri@kde.org>
+ Copyright (C) 2002-2004 Nadeem Hasan <nhasan@kde.org>
+ Copyright (C) 2003-2004 John Ratke
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef _WEATHER_SERVICE
+#define _WEATHER_SERVICE
+
+#include <qstringlist.h>
+#include <dcopobject.h>
+#include <qpixmap.h>
+
+class WeatherLib;
+class StationDatabase;
+
+class WeatherService : public QObject, public DCOPObject
+{
+ Q_OBJECT
+ K_DCOP
+
+ private:
+ WeatherLib *m_weatherLib;
+
+ private slots:
+ void updated(const QString &stationID);
+ void updating(const QString &stationID);
+ void slotStationRemoved(const QString &stationID);
+
+ public:
+ WeatherService(QObject *parent, const char *name);
+ ~WeatherService();
+
+ k_dcop_signals:
+ void fileUpdating(QString);
+ void fileUpdate(QString);
+ void stationRemoved(QString);
+
+ k_dcop:
+ QString temperature(const QString &stationID);
+ QString dewPoint(const QString &stationID);
+ QString relativeHumidity(const QString &stationID);
+ QString heatIndex(const QString &stationID);
+ QString windChill(const QString &stationID);
+ QString wind(const QString &stationID);
+ QString pressure(const QString &stationID);
+ QPixmap currentIcon(const QString &stationID);
+ QPixmap icon(const QString &stationID);
+ QString currentIconString(const QString &stationID);
+ QString iconFileName(const QString &stationID);
+ QString date(const QString &stationID);
+ QString visibility(const QString &stationID);
+ QStringList cover(const QString &stationID);
+ QStringList weather(const QString &stationID);
+ bool stationNeedsMaintenance(const QString &stationID);
+
+ QString stationName(const QString &stationID);
+ QString stationCountry(const QString &stationID);
+ QString longitude(const QString &stationID);
+ QString latitude(const QString &stationID);
+
+ QStringList findStations(float lon, float lat);
+
+ QString sunRiseTime(const QString &stationID);
+ QString sunSetTime(const QString &stationID);
+ QString civilTwilightStart(const QString &stationID);
+ QString civilTwilightEnd(const QString &stationID);
+
+ void update(const QString &stationID);
+ void updateAll();
+ void forceUpdate(const QString &stationID);
+ void removeStation(const QString &stationID);
+ void addStation(const QString &stationID);
+ QStringList listStations();
+ QString stationCode( const QString &stationName );
+
+ void exit();
+
+ private:
+ enum TimeType
+ {
+ RISE = 0,
+ SET,
+ CIVIL_START,
+ CIVIL_END
+ };
+
+ void saveSettings();
+ QString getTime(const QString &stationID, TimeType timeType);
+ StationDatabase *stationDB;
+};
+#endif
diff --git a/kweather/weathersig.sh b/kweather/weathersig.sh
new file mode 100644
index 0000000..03f2fa0
--- /dev/null
+++ b/kweather/weathersig.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+LOC=KPTW
+TEMP=`dcop KWeatherService WeatherService temperature $LOC`
+WIND=`dcop KWeatherService WeatherService wind $LOC`
+DATE=`dcop KWeatherService WeatherService date $LOC`
+VIS=`dcop KWeatherService WeatherService visibility $LOC`
+NAME=`dcop KWeatherService WeatherService stationName $LOC`
+EMAIL="geiseri@kde.org"
+echo "===+<KWeather for KDE>+=+<http://www.kde.org>+==="
+echo " Report for $NAME"
+echo " on $DATE"
+echo " $TEMP with winds at $WIND and $VIS of visibility."
+echo "===============================+<$EMAIL>+==="
diff --git a/kworldwatch/Makefile.am b/kworldwatch/Makefile.am
new file mode 100644
index 0000000..75901df
--- /dev/null
+++ b/kworldwatch/Makefile.am
@@ -0,0 +1,42 @@
+SUBDIRS = maps pics
+
+noinst_LTLIBRARIES = libww.la
+libww_la_SOURCES = maploader.cpp mapwidget.cpp astro.c sunclock.c about.ui cities.cpp zoneclock.cpp flags.cpp flow.cpp clock.ui
+
+KDE_ICON = kworldclock
+
+bin_PROGRAMS = kworldclock
+
+INCLUDES = $(all_includes)
+
+kworldclock_SOURCES = main.cpp
+kworldclock_LDADD = libww.la $(LIB_KDEUI)
+kworldclock_LDFLAGS = $(KDE_RPATH) $(all_libraries)
+
+xdg_apps_DATA= kworldclock.desktop
+
+progdir=$(kde_datadir)/kdesktop/programs
+prog_DATA = kdeworld.desktop
+
+kde_module_LTLIBRARIES = ww_panelapplet.la
+
+ww_panelapplet_la_SOURCES = applet.cpp
+
+METASOURCES = main.moc zoneclock.moc applet.moc mapwidget.moc
+
+noinst_HEADERS = applet.h
+
+lnkdir = $(kde_datadir)/kicker/applets
+lnk_DATA = kwwapplet.desktop
+
+tab_DATA = zone.tab
+tabdir = $(kde_datadir)/kworldclock
+
+EXTRA_DIST = $(lnk_DATA)
+
+ww_panelapplet_la_LDFLAGS = $(KDE_PLUGIN) -module $(all_libraries)
+ww_panelapplet_la_LIBADD = libww.la $(LIB_KSYCOCA)
+
+messages: rc.cpp
+ $(XGETTEXT) rc.cpp $(kworldclock_SOURCES) $(libww_la_SOURCES) -o $(podir)/kworldclock.pot
+
diff --git a/kworldwatch/about.ui b/kworldwatch/about.ui
new file mode 100644
index 0000000..9d62a17
--- /dev/null
+++ b/kworldwatch/about.ui
@@ -0,0 +1,217 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>AboutDialog</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>AboutDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>350</width>
+ <height>216</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>About KDE World Clock</string>
+ </property>
+ <property name="icon">
+ <pixmap>image0</pixmap>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>PixmapLabel3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="pixmap">
+ <pixmap>image1</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>The KDE World Clock</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>41</width>
+ <height>31</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>This is a little toy to display the time on each place on the earth.
+
+Copyright: (c) 2000 Matthias Hoelzer-Kluepfel</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter|AlignLeft</set>
+ </property>
+ <property name="wordwrap" stdset="0">
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButton2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<images>
+ <image name="image0">
+ <data format="PNG" length="875">89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff610000033249444154388da59349685c7500c67f6f992533992cd3c964330d934427c1a6a624968ad2d50a31a506b522a2143caa08ea4d7b11173c288aa8f4e0418a68d21244424911d21a43036d206d69d298669b26992493996c7df3f25edef6f76283209efccedff73b7d3ff89f910094a3bdf2eb2f263bdb1a4bdfc6710e20498e27cb0303c30b9f777df2d6ef6843e23f01be7dddf29b6fecffac3551f06e755057caa37e6459663e63b0b01d11b34b6b7659b4703bbb698ff60f672e0c0dce7ecfc82bda0ea1e3bd1b9d9f76a59da9991591cf6f09db76846d3be2fe7d5d8c8e2f8b8fba97c4d0ad6591d56c7137678b33ddf3e98617fa0e3ed82bcd1d1f7cf7c4437a9deaac1289848944c2c8803fe0c3ef83b9058deb33263555616cdba3a12a14318b4a5fce99ad03eb933d736a6ad93dd0f27c98faba04a9549ad9d9797cd915446515959565d497092e5cb738d89ac7a72a9896c323bbac8289c7933f4df7b734a91e8a9000455148d6d7b0327213fdd1466a6bab711c8fc97b065bdb2ef9cd35f286453abbc9b94bb7089454d63477bc735a2d2ef25f9d5ed48fefaeb120354dd963cdc4030184101886c9dc1aa8f60a67bbee309bceb1aabb6c990678d33c7bece4736aee9ef1d5cd6ce4c89ed169359a28a74056c076318c6d1697746e64824cce8cb1aee700f007c2ec7df21021552009a75ec96ebe3aa554c4a440ace0b06ce9e4359df5f52d52f39bfc3117e2cf9c8d1492d958d35094206d479fa1be2141c5ae307edb5a950048ce48475e72c763412bf970652192a29036fde41c8592aa5216a7ee327eed1ad589dd3cdd7e8891abc30415814f5bbfa8023051272cf9f6d9156de3cb9aa63845b118e536445df004c49a1b087a16ad6d495c43a3a9ae024337f9f597de1e69e751ed7de1d74e26c79289686d3c5e8ce982ed821020cbe09721a842812a280d499cef1ebcf3c3fbc7f7ab3b80be76fd7251cfa97d0d87fbab8b88980e38dedf00095405820a840312bf5d99583df7f517a7615b57fe298636767e7178217e295252fa5438541c9fcf38d89687a6bbc40a653cdbe2c79f0747befdf8c35322d33bb263e3bfa2467dd5c7ce74ee69d97b4256028d8ee37adac6eac4e8d095defce8371701f341f52fe03c715325d17f970000000049454e44ae426082</data>
+ </image>
+ <image name="image1">
+ <data format="PNG" length="4795">89504e470d0a1a0a0000000d49484452000000300000003008060000005702f98700001282494441546881ed99696c5cd775c77f6f9f8db371df298a12455114452d9663cb9becd88ee578411cc771e2264d53f4430bb41f02044d8b368b5104481314598a342d92268ed338889d7889bcca966c6d942c895a4d52dc49911c92b3706638db5b6e3f0c4991b2e42869d27ee9010ede9d8737effdfff77fceb9e7be07ff6fffb7265dd755f7bdaabbdd6a7373adaf335ca2dfe5f6a83b035eb5de63a80147082b993167d20b567f266bbd333a9b3d3015c9bc275eba7bea8f8c1db81e02f7bcdcb6bec9ffe97b6facf9c8c6e69296b5552e5f65d090dc868c224b08c0341d52599b89b99cd337918d9ce88d9d7be5c8e44f52f1dc8bbc79fffcff3e815b5f9014552a6d5d137cfcf69d357f7bdf4dd565f5e5869acf9acc4573cccd665848e628e42d6459c2f0e804421e2aca5d04832e1c49e2785f32f7e29bbda74f1c3af2a5e9e3cf1e217538fbc720a05ceda4bbf993755b37557ce3b1fbd6fed5c76eaf0b5b1672f7914b0c9fbf04a9792adc260d65321e698ebab04ca95b6026938c0c4439df9b209d97d9dc56aa6e6bafa92bc8c13be30bba9d98374e91edb7fed004562bd0f98ce4f5e94d5d5babbffbf9c7daef6ea8f2a83d67a3c42f0ed3d522b179531d1e8f8eaaa9288accc8c830c16008bf3f80e3d814f23673d114478e4f306556d0bab58eca3237af1e9e143ff9d9be4c520a652c474a59596b82bc791687c328d221ba1f1dfd8310d0ba9e29efda5afbedcf3edef1485585573d7674926675965d3794313337ce86d63674dd4096419665161616d0750d55d51042e038824824423a9da450f0f3ead179026d2db4adf5f3c63b6314126374ed68239185d1a905fa86e3f40ecccd8e8d258e8aacf90cbafc02473e91fafd0834fea7bcbeb3fa8b8f3ed6f90f1b5acb5cdd8727d81a9ee7ae5baa71b90d6cdbc2e5d251550d599690240959968022f025cfe5f208211042108ba6f9e9de39b4e6665aea7dec7fe30c4fdcee65d78debc90a88666168164ef427387064948347c686e391f4b731947fe3e827ae2b679673400e3fd475e77d1bbfb76d6753e0c889189dee08f7eeaec5ed31505505b7db40d735344d41d314545541516414455e319650d562788184cba5d3542171e4e834595f98fafa725e7da587dbb757e0d674bc8aa0ce0f1beadd747454b1b9ab29a41bcabdc323f1fbadf043034c3f3b747d042a7ee05adb5ef985bb1fdc72db584cc8b9bef3ec58bf40281cc0ef2f4155e515a095650556ba2c4bcbe7579a6e28b010e1ad330e55cde524922ae9e97e1ad6d4923505054ba0490ee586a0d4af51df5ac9a64db5559148f2891971b744e4b9fdbf9580a7fce18e1befdaf4c5706365f9f95397f8c4f602b1e814bdbd23388e4528e4c3ebf5a22832d207ac1c4522f22289e2787c7c8c50482531b5c0a9a89fc6c600a7bb2fb2715d09bacb8d650bf29620670a3caa4d48139886872d3b9a244958b7f7256e6da5e1e3bf61f2d9ab563005a066fd13f7b7ed5cfbf88ced5683a9293e7647051bdad6e0f1189c3d7b91d1d129745d5954e3aa957795c9b28410e03802afd787df1f44c3e4b5d305029521e6a766a92d85505910cb11cb9eb70408877297cdc09cc39a4d755485f48e5327273653bde739a65fb0af4aa0a2f1537fd770436b47dfa4cd3d7571badac3b83d2e6a6bab686f6f269fcf73e2442fc3c313188686cfe74655d5cb778944c03040511042502814c866738bb920e338025d85a367934c4961b45c0ead30cd9a963a2c87556edae0084195c7e695b3f3acd9d8407da9abb5a7fbbd46e65ef9f5d509343ff14fdeb6f5e1c94b291ed994a3b13180aa2aa8aa8cc7e3a2a9a9968a8a10f178929e9e3e1289141e8f816118303888fdeb5f916959cf4c2cc9e0e03867ce5ca4a7a797b2b2003e9f17db16086173e1628a9e5490a0622312036cec5cbb4a81252fd8024596680e49fc60ff3437ee6cc150b4ce81212343ead8e195045400ddedaa99c9aad8991c019f8c6ddb08a12ec732483434d4505d5dcec4c434dddde778e9a5039496fa49bf7b9c4053330baf1f2793c962182aa5a501b66edd4069690800c7b1912441a957303bed501b76138b67c8158a612d844000f28a04cb015e43e64fba0cbefe4a2f7ffde056fafb269f1cdcfbe67e72e78faf222069ba2b5990706c9bf9f92823c369aa6b6a70b92a5625ada669ac59534f7575056f1d38467f6f1f318f0fff428e5d5b6aa9ae2ea3a2a21497cb00246cdb219bcd31353549727e9e425e502840ce51c9176c32d91c8e00af4bc3ebd288255797fe6c0edaaa0d6eaecaf2cbee513ef3b93bf52f9f79f83bce40ef2d609b003280694a195512785c2ac16019cd6b5b080482804088f727a9cbb6b861668ced9d1bd9f5a1ed6cdbba911d3b3a6868a8c5e572b1b43e0a219024999a9a5a9a1a9b71bbbcb85d60db0eb22c8363e377ab844b0ce2f30b64b37972b92b3c6f52ed753872e02805afce1d0f3db21357e727572990cbdae3a5aab5c1f4bb984fa5966bb9e31457d4551d473e8ff5e28b7843016ebc652792242faec8abadb81a83102049328e80541e4a030a4a2e4945d8c3a6e672e61259666349e2f3e9c5672d0253657455e1f98343fcc7cb17b01732bc7ce0241fbf772b077ef3e017acf74e3d03222f03580571d270f278836ea6a216a6692df7368ee35cbeb1e3e01c3c8829cb6877deb9bca85dcd8a65d4599e844cc6249e5509f934c8a4b1b13978f222a7de1b62787c8a6c66815c368359c8210b8b99b904dffec541bef7f3b7c9a7a220329c397618c780adbbeeec4069b8638502ce5e733ef350b831e4198e2aa49279344d45924055156459a0081ba7bb9b7c2482fee8a3282bcbe855c0dbb68d6d3b140a058480d1891429b58450894c743e82bf4a21168b21c9128a2c232932aaaa323397a0fbdc08fbde1d603e960643652911cde40ca7ce9ee7e65b3771ecb91b1e253afa8a0a9088e47ad291cc60ed86f28e742e406fff2ce1d0284d4dcd4522aa8c3430487e7010f5fefb3f107c512807cb2a2a373131412e97e16caf8cbba281859c89484d110ee9e0985896436c21cff87494ded119866716b8343802ba068a0c66fef28dcd1ca78f7773d3e737e3aedf766b36facba00a5028c8fdc327675eaaebac6e6b68ac564f0fccf0c01d15b8dd1e4cdb411a9bc03c72186dcf1ed450e803665e60db0e9665635936a669535555cde14343a43c9568010f53ef0e63c8031cef2f259a1c667a2ec9742c492a9505d3a4b4be818ab52dcc4c8c21cb0a8e6d175b1445c1d65d4c8e8d826cd3d0d2d6d0d713682f4e65f45e33a6bef9e3a193339faeafabafaf5cd7ccc99e6102a112024e01eb9db7716edb8d1a0c6359f672bfb354628bc95a04bf44c0346d6cdb667c3cc158cc85bba992e98b167dc75e256e8dc150a4f8475942566434971b0c37e9f9245b6ede4d3a99c6711c02655500cc8c0d000a0ba9052291299a9a1bb43eb5aafd7263e3ffb39865c959e1d2efa86f09e8259ac4e45084c68933d8edede4822124014bf57d294157cfb8433abd80695a388ec3e4e43c474f26f1b7aee5dcaccea1170e138d1f46f3f950350d552bee2f14454596156459c1b62c54dd85dbeb47313cecbcef63c4a6a6b00b79dab6ec607a6c94b6f6565c5a88d3fbf79ebf4c20fd23b2f2e72e66338409b83b5bdb43aa4f96b83099c7a80e331d19251c2a03a4e5cd4b3c9ec0b6c53229db7688c5a24c4e5e6262c2e25c6f9adaae755c487b39f0fa04a44f30978da21a2e2459b9aa2b9a4e3a116721994092548465130806b8e3a30fb3ae6d13f1e81c6bd6d4e3d6021cdff75aefead672fedff359edcfdf8d47ed9ab4a16fa96f09d2b226c0853333d8a6444989812489e5b27ae9d204b22ca3aa1a8582492693271acd73f6ec3cb23b487d67136f8d1bbcf1da1cb5be21da6f6ee7c2857e64f9f28cbfdf556cdba6b2b195adbbf7606653b46fdd86c75039fef601da3b36515916c0cecb1c7bf5a573ef2b274e7fc7ecac72f16f8e1f1afb4c6cae8e8fde15e0d63b37635e8a70ee5c1cc7b1f07a15dc6e95542ac3ecac842c2f90c958e472e0f1bad872730753aa9fff3a0987f70d52571665e3ad5d0845275456c17c2c8ea25ca52d97c0324dcaeb9ad9f5c023f8bc6e366c68e4e59fff024512cc2712dc74d376ea6a435c9899010457ad87e2bd7589c2f643f34da5e5811ffc2846f78e72eede59cdd69de59492c7cc1648a7f21886174906af4fc7e333700c9d918cc1f3c312fb0fa5490c5fa4adcb43ddba0e4cc58da241454d3df3f124b2aabfffb98e83dbebe143f73d4c20e0461182a1f3bd6ceaec606278981d3bba686aaca4b404d2a91c58e9f4350b7a3a5f186b6d533a8e9deae68d67658ebdb396caa672d6afada0b5c14b7508fc7eb01d989b87b101e81bc972697c0a3395a1ba3acd8df737e1f2873001d30255064fa01459d15194d5041c21300b599ada36505119407600cb4495a06b7b1bbb6e6e4316c5955797612e9a824274fa9a04ccac79269db13bea6a03446343141666193de365ac47639fa4a3e80164c540d50c5c1e1955b5f0043d54d606099485f006d7e2283259f3f23d15c0464155f4550a08c7c16db858dbdec1a61ddbd0005d87543a43dff97e540992f104f7dd7b23b95c0ebc6e26c6230ed6ccc8b59754cb393016497faaa5a99ad3e7c7d15d4b0f34719c3c9619c741e296fb1f2450514aa150dc51398b6d53410057ec6215c0132c47d50d144505248410a8ba4ae3865602c100a1801b55025d82f2b01fd3b4d9f7fa61745d636c3c42677b23d5bbbb181b1a9a434407ae4d4091de387d319af8ecbd0d41c3e54156e4a2d48e83c7e7a2bdb31545d3a9ae2ac512a0a8608b22017bb10b75ae68c565010d2d8d44861a894e4da3682ab66513282b27bf90a1a96b036e4d4295c0d04058129a66a0e96e244566727a9ec71faa61706481e4684f2f5843f23509bc74cff0c5d1f8215577d1da528b2d6414554792356ebb6307bb6ed9c896ae165c2ab815706b8bae82472d8e3d57b85b8512176ce86c4792351c474637dc34aea9e7869bb65051e6c590415826a9780a8f21613b32020d49d2a8a92aa77d5d25070e0ec2dcb17780b90feccaec9cf5d4e1b3337beeb9a58d8b23716c07d6afafa373531db90228a208ca12e038971570161510707943241577158a043535a554d7d7e05836ad1bd7d0ded180244012e076c1e874826422454b4309db363771be6f8a9189380f7c781df91c1cd97f2846e1c23ec0fee0b652555e78f5c8d8c09e0fddd4d2d956cf99de6976ed5c87470361832a15c1db4be09d1504b84c62113f48c52da0dba3b1e7a3bb509562d329ec62e3a9ca60c830311e65dbe63a34e0e17bdab8657b13672e4cf2d05d6bf9e12f4648bff7e26b609e866bbc5e5fb6bea72cb3feb1b4234b0f3efae1751cee89d0541ba4b1c6877040968b33aa2c1e55f90a57405be1ba7c796c68c5dfaa04ba527443014d8670d0454db90f5d2ee64dd8afb1b323cce8258b6f7ee3d98439f4fdaf82751a16f7c41f68baf293bd6f8f1e9a4b16787ccf46de3a3a463663e1358ae1b3ecda8aa3b63a27569d5ffced5228e68f0a2ead385ef235353e3c5a712fe35abcb660c2f79f3a43e6dc0f9f86eca12578bffd355bdf5342b47cfad8d991d467fef481f57a366b93c95ab4d47b61850a2b675e5b9afd952ac857a871a5ab4505f4c56b97cebb55f079e1e917a7f9d5f7bff32ed1e79e04965ffafe760200177f3a93766d9f189c773ffc978faca3a9da0342425e0a9fc55058153a8b477505e025124ba1f43e12ca6512faa2427e1fbc7e34c9b7befed36967e09b7f0fe6dbc0f22bc6eb230030fed2e9a9394d9e90d6df765b5718efe2bab69403578bff25224bae5f9107575341578ba1b334f36f9d48f3d5af3d379febf9ca577062bf02322b615d3f0180b9eefda363194f7f61c3cddbdac254f88b5bb2950a185a11ec5258ad0c9be5305aa180b612fce2d8a381e682e70f2478f2c967e39977fff16b58977e06c4ae84f4bb1100889f7ce3d2e068e6e8cc9add0df515724b8d8abe08d8e7826cce419521e09170eb45604b2babd75824a95e2661ac2062a8e076432207fffaf331befbcf3f1e36cf7cedcb5893cf00b35783f3bb130048f51f9e1fe83eb1afdfbb332eaac26b6b7d94b825fac62c9e3990229d71c89b8291298b822928f32be4f30e839326652532a625087a243cfa65a55c0698c081530b3cf92fddecfbf1b75e63f83b5f4624f702f16b41b9be2ff5d7fcb7ab92ba87bf547ee3a73eb7e7eeedbe8dcd211229189ab2b8346791ca382832d484153279413465535fa6b29017b4d6e9d496a96c6951f17ba0fb429ae75f19e0e06b7bfb1878fa6972179e052e52e4756d08ff23024ba686b75075cf5f043a3ef2e0f61bbaaa3bda6a290d784052c99912d93c588b754320d014701c8b7c2ecf4c2446cfa97e73f0e4dbe7197b792f9993bf01ce03d7f585ff0f4360d9b426bcadbb29ddb25bafddd4515ed35453565eeef7f93cba6168d896432693b793f1786e6e7a321ebdd43fc2f4e9b324cf1dc58e9c044681dff333eb1fde2ac0a84709d422bbca4032001056163b1d43242320a629569605c0f97d1ef2df5c025013d9e7bdc30000000049454e44ae426082</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>PushButton2</sender>
+ <signal>clicked()</signal>
+ <receiver>AboutDialog</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="global" impldecl="in declaration">kseparator.h</include>
+</includes>
+<slots>
+ <slot>PushButton2_clicked()</slot>
+ <slot>accept()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kworldwatch/applet.cpp b/kworldwatch/applet.cpp
new file mode 100644
index 0000000..a12a987
--- /dev/null
+++ b/kworldwatch/applet.cpp
@@ -0,0 +1,122 @@
+/*
+**
+** Copyright (C) 1998-2001 by Matthias Hölzer-Klüpfel <hoelzer@kde.org>
+** Maintainence has ceased - send questions to kde-devel@kde.org.
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+#include <qlayout.h>
+
+
+#include <kapplication.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <krun.h>
+#include <kglobalsettings.h>
+
+
+#include "mapwidget.h"
+#include "applet.moc"
+
+
+extern "C"
+{
+ KDE_EXPORT KPanelApplet *init(QWidget *parent, const QString& configFile)
+ {
+ KGlobal::locale()->insertCatalogue("kworldclock");
+ KGlobal::locale()->insertCatalogue("timezones"); // For time zone translation
+ return new KWWApplet(configFile, KPanelApplet::Normal,
+ 0,
+ parent, "kwwapplet");
+ }
+}
+
+
+KWWApplet::KWWApplet(const QString& configFile, Type type, int actions,
+ QWidget *parent, const char *name)
+ : KPanelApplet(configFile, type, actions, parent, name)
+{
+ // make use of the icons installed for ksaferppp
+ KGlobal::iconLoader()->addAppDir("kworldwatch");
+
+ QVBoxLayout *vbox = new QVBoxLayout(this, 0,0);
+
+ map = new MapWidget(true, true, this);
+ map->load(config());
+ vbox->addWidget(map);
+ setCustomMenu(map->contextMenu());
+
+ map->installEventFilter(this);
+}
+
+
+KWWApplet::~KWWApplet()
+{
+ map->save(config());
+}
+
+
+int KWWApplet::widthForHeight(int height) const
+{
+ return height*2;
+}
+
+
+int KWWApplet::heightForWidth(int width) const
+{
+ return width/2;
+}
+
+
+// catch the mouse clicks of our child widgets
+bool KWWApplet::eventFilter( QObject *o, QEvent *e )
+{
+ if ((e->type() == QEvent::MouseButtonPress) || (e->type() == QEvent::MouseButtonDblClick))
+ {
+ mousePressEvent(static_cast<QMouseEvent*>(e));
+ return true;
+ }
+
+ return KPanelApplet::eventFilter(o, e);
+}
+
+
+void KWWApplet::mousePressEvent(QMouseEvent *e)
+{
+ bool clicked = false;
+
+ if (KGlobalSettings::singleClick())
+ {
+ clicked = e->type() == QMouseEvent::MouseButtonPress;
+ }
+ else
+ {
+ clicked = e->type() == QMouseEvent::MouseButtonDblClick;
+ }
+
+ if (clicked && e->button() == QMouseEvent::LeftButton)
+ {
+ KRun::run("kworldclock", KURL::List());
+ }
+}
diff --git a/kworldwatch/applet.h b/kworldwatch/applet.h
new file mode 100644
index 0000000..7965b8f
--- /dev/null
+++ b/kworldwatch/applet.h
@@ -0,0 +1,70 @@
+/*
+**
+** Copyright (C) 1998-2001 by Matthias Hölzer-Klüpfel <hoelzer@kde.org>
+** Maintainence has ceased - send questions to kde-devel@kde.org
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+#ifndef KWW_applet_h
+#define KWW_applet_h
+
+
+#include <qstring.h>
+#include <qpixmap.h>
+
+
+#include <kpanelapplet.h>
+
+
+class MapWidget;
+
+
+class KWWApplet : public KPanelApplet
+{
+ Q_OBJECT
+
+public:
+
+ KWWApplet(const QString& configFile, Type t = Normal, int actions = 0,
+ QWidget *parent = 0, const char *name = 0);
+ ~KWWApplet();
+
+ int widthForHeight(int height) const;
+ int heightForWidth(int width) const;
+
+
+protected:
+
+ void mousePressEvent(QMouseEvent *ev);
+ bool eventFilter(QObject *, QEvent *);
+
+
+private:
+
+ MapWidget *map;
+
+
+};
+
+
+#endif
diff --git a/kworldwatch/astro.c b/kworldwatch/astro.c
new file mode 100644
index 0000000..3423119
--- /dev/null
+++ b/kworldwatch/astro.c
@@ -0,0 +1,166 @@
+/*
+ * Sun clock - astronomical routines.
+ */
+
+#include "sunclock.h"
+
+long jdate(struct tm *);
+double jtime(struct tm *);
+double kepler(double m, double ecc);
+void sunpos(double jd, int apparent, double *ra, double *dec, double *rv, double *slong);
+double gmst(double jd);
+
+/* JDATE -- Convert internal GMT date and time to Julian day
+ and fraction. */
+
+long
+jdate(t)
+struct tm *t;
+{
+ long c, m, y;
+
+ y = t->tm_year + 1900;
+ m = t->tm_mon + 1;
+ if (m > 2)
+ m = m - 3;
+ else {
+ m = m + 9;
+ y--;
+ }
+ c = y / 100L; /* Compute century */
+ y -= 100L * c;
+ return t->tm_mday + (c * 146097L) / 4 + (y * 1461L) / 4 +
+ (m * 153L + 2) / 5 + 1721119L;
+}
+
+/* JTIME -- Convert internal GMT date and time to astronomical
+ Julian time (i.e. Julian date plus day fraction,
+ expressed as a double). */
+
+double
+jtime(t)
+struct tm *t;
+{
+ return (jdate(t) - 0.5) +
+ (((long) t->tm_sec) +
+ 60L * (t->tm_min + 60L * t->tm_hour)) / 86400.0;
+}
+
+/* KEPLER -- Solve the equation of Kepler. */
+
+double
+kepler(m, ecc)
+double m, ecc;
+{
+ double e, delta;
+#define EPSILON 1E-6
+
+ e = m = dtr(m);
+ do {
+ delta = e - ecc * sin(e) - m;
+ e -= delta / (1 - ecc * cos(e));
+ } while (abs(delta) > EPSILON);
+ return e;
+}
+
+/* SUNPOS -- Calculate position of the Sun. JD is the Julian date
+ of the instant for which the position is desired and
+ APPARENT should be nonzero if the apparent position
+ (corrected for nutation and aberration) is desired.
+ The Sun's co-ordinates are returned in RA and DEC,
+ both specified in degrees (divide RA by 15 to obtain
+ hours). The radius vector to the Sun in astronomical
+ units is returned in RV and the Sun's longitude (true
+ or apparent, as desired) is returned as degrees in
+ SLONG. */
+
+void
+sunpos(jd, apparent, ra, dec, rv, slong)
+double jd;
+int apparent;
+double *ra, *dec, *rv, *slong;
+{
+ double t, t2, t3, l, m, e, ea, v, theta, omega,
+ eps;
+
+ /* Time, in Julian centuries of 36525 ephemeris days,
+ measured from the epoch 1900 January 0.5 ET. */
+
+ t = (jd - 2415020.0) / 36525.0;
+ t2 = t * t;
+ t3 = t2 * t;
+
+ /* Geometric mean longitude of the Sun, referred to the
+ mean equinox of the date. */
+
+ l = fixangle(279.69668 + 36000.76892 * t + 0.0003025 * t2);
+
+ /* Sun's mean anomaly. */
+
+ m = fixangle(358.47583 + 35999.04975*t - 0.000150*t2 - 0.0000033*t3);
+
+ /* Eccentricity of the Earth's orbit. */
+
+ e = 0.01675104 - 0.0000418 * t - 0.000000126 * t2;
+
+ /* Eccentric anomaly. */
+
+ ea = kepler(m, e);
+
+ /* True anomaly */
+
+ v = fixangle(2 * rtd(atan(sqrt((1 + e) / (1 - e)) * tan(ea / 2))));
+
+ /* Sun's true longitude. */
+
+ theta = l + v - m;
+
+ /* Obliquity of the ecliptic. */
+
+ eps = 23.452294 - 0.0130125 * t - 0.00000164 * t2 + 0.000000503 * t3;
+
+ /* Corrections for Sun's apparent longitude, if desired. */
+
+ if (apparent) {
+ omega = fixangle(259.18 - 1934.142 * t);
+ theta = theta - 0.00569 - 0.00479 * sin(dtr(omega));
+ eps += 0.00256 * cos(dtr(omega));
+ }
+
+ /* Return Sun's longitude and radius vector */
+
+ *slong = theta;
+ *rv = (1.0000002 * (1 - e * e)) / (1 + e * cos(dtr(v)));
+
+ /* Determine solar co-ordinates. */
+
+ *ra =
+ fixangle(rtd(atan2(cos(dtr(eps)) * sin(dtr(theta)), cos(dtr(theta)))));
+ *dec = rtd(asin(sin(dtr(eps)) * sin(dtr(theta))));
+}
+
+/* GMST -- Calculate Greenwich Mean Siderial Time for a given
+ instant expressed as a Julian date and fraction. */
+
+double
+gmst(jd)
+double jd;
+{
+ double t, theta0;
+
+
+ /* Time, in Julian centuries of 36525 ephemeris days,
+ measured from the epoch 1900 January 0.5 ET. */
+
+ t = ((floor(jd + 0.5) - 0.5) - 2415020.0) / 36525.0;
+
+ theta0 = 6.6460656 + 2400.051262 * t + 0.00002581 * t * t;
+
+ t = (jd + 0.5) - (floor(jd + 0.5));
+
+ theta0 += (t * 24.0) * 1.002737908;
+
+ theta0 = (theta0 - 24.0 * (floor(theta0 / 24.0)));
+
+ return theta0;
+}
diff --git a/kworldwatch/astro.h b/kworldwatch/astro.h
new file mode 100644
index 0000000..2c6a561
--- /dev/null
+++ b/kworldwatch/astro.h
@@ -0,0 +1,42 @@
+/*
+**
+** Copyright (C) 1998-2001 by Matthias Hölzer-Klüpfel <hoelzer@kde.org>
+** Maintainence has ceased - send questions to kde-devel@kde.org.
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+
+#ifndef ASTRO_H
+#define ASTRO_H
+
+#include <time.h>
+
+extern "C" {
+double jtime(struct tm *t);
+double kepler(double m, double ecc);
+void sunpos(double jd, int apparent, double *ra, double *dec, double *rv, double *slong);
+void projillum(short *wtab, int xdots, int ydots, double dec);
+}
+
+#endif // ASTRO_H
+
diff --git a/kworldwatch/cities.cpp b/kworldwatch/cities.cpp
new file mode 100644
index 0000000..624c814
--- /dev/null
+++ b/kworldwatch/cities.cpp
@@ -0,0 +1,208 @@
+/*
+**
+** Copyright (C) 1998-2001 by Matthias Hölzer-Klüpfel <hoelzer@kde.org>
+** Maintainence has ceased - send questions to kde-devel@kde.org.
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+#include <qfile.h>
+#include <qtextstream.h>
+#include <qregexp.h>
+#include <qpainter.h>
+
+
+#include <kglobal.h>
+#include <kstandarddirs.h>
+
+
+#include "cities.h"
+
+
+CityList::CityList()
+{
+ readCityLists();
+}
+
+CityList::~CityList()
+{
+ _cities.setAutoDelete(true);
+ _cities.clear();
+}
+
+void CityList::readCityLists()
+{
+ QStringList lists = KGlobal::dirs()->findAllResources("data", "kworldclock/*.tab");
+ for (QStringList::Iterator it = lists.begin(); it != lists.end(); ++it)
+ readCityList(*it);
+}
+
+
+double coordinate(QString c)
+{
+ int neg;
+ int d=0, m=0, s=0;
+
+ neg = c.left(1) == "-";
+ c.remove(0,1);
+
+ switch (c.length())
+ {
+ case 4:
+ d = c.left(2).toInt();
+ m = c.mid(2).toInt();
+ break;
+ case 5:
+ d = c.left(3).toInt();
+ m = c.mid(3).toInt();
+ break;
+ case 6:
+ d = c.left(2).toInt();
+ m = c.mid(2,2).toInt();
+ s = c.right(2).toInt();
+ break;
+ case 7:
+ d = c.left(3).toInt();
+ m = c.mid(3,2).toInt();
+ s = c.right(2).toInt();
+ break;
+ default:
+ break;
+ }
+
+ if (neg)
+ return - (d + m/60.0 + s/3600.0);
+ else
+ return d + m/60.0 + s/3600.0;
+}
+
+
+void CityList::readCityList(const QString &fname)
+{
+ QFile f(fname);
+
+ if (f.open(IO_ReadOnly))
+ {
+ QTextStream is(&f);
+
+ QString line;
+ QStringList tags;
+ QRegExp coord("[+-]\\d+[+-]\\d+");
+ QRegExp name("[^\\s]+/[^\\s]+");
+ int pos;
+ while (!is.eof())
+ {
+ line = is.readLine().stripWhiteSpace();
+ if (line.isEmpty() || line.left(1) == "#")
+ continue;
+
+ QString c, n;
+
+ pos = coord.search(line, 0);
+ if (pos >= 0)
+ c = line.mid(pos, coord.matchedLength());
+
+ pos = name.search(line, pos);
+ if (pos > 0)
+ n = line.mid(pos, name.matchedLength()).stripWhiteSpace();
+
+ if (!c.isEmpty() && !n.isEmpty())
+ {
+ double la, lo;
+ pos = c.find("+", 1);
+ if (pos < 0)
+ pos = c.find("-", 1);
+ if (pos > 0)
+ {
+ la = coordinate(c.left(pos));
+ lo = coordinate(c.mid(pos));
+ _cities.append(new City(n.latin1(), la, lo));
+ }
+ }
+ }
+
+ f.close();
+ }
+}
+
+
+QPoint CityList::getPosition(double la, double lo, int w, int h, int offset)
+{
+ int x = (int)((double)w * (180.0 + lo) / 360.0);
+ int y = (int)((double)h * (90.0 - la) / 180.0);
+ x = (x + offset + w/2) % w;
+
+ return QPoint(x,y);
+}
+
+
+void CityList::paint(QPainter *p, int width, int height, int offset)
+{
+ p->setPen(Qt::black);
+
+ QPtrListIterator<City> it(_cities);
+ for ( ; it.current(); ++it)
+ {
+ QPoint pos = getPosition(it.current()->latitude(), it.current()->longitude(), width, height, offset);
+
+ if (width > 100)
+ p->drawEllipse(pos.x(), pos.y(), 3,3);
+ else
+ p->drawPoint(pos);
+ }
+}
+
+
+City *CityList::getNearestCity(int w, int h, int offset, int x, int y, QPoint &where)
+{
+ City *result = 0;
+ double dist = 1.0e10;
+
+ QPtrListIterator<City> it(_cities);
+ for ( ; it.current(); ++it)
+ {
+ QPoint pos = getPosition(it.current()->latitude(), it.current()->longitude(), w, h, offset);
+
+ double d = (pos.x()-x)*(pos.x()-x) + (pos.y()-y)*(pos.y()-y);
+ if (d < dist)
+ {
+ dist = d;
+ where = pos;
+ result = it.current();
+ }
+ }
+
+ return result;
+}
+
+
+QStringList CityList::timezones()
+{
+ QStringList r;
+
+ QPtrListIterator<City> it(_cities);
+ for ( ; it.current(); ++it)
+ r << it.current()->name();
+ r.sort();
+
+ return r;
+}
diff --git a/kworldwatch/cities.h b/kworldwatch/cities.h
new file mode 100644
index 0000000..9c55c37
--- /dev/null
+++ b/kworldwatch/cities.h
@@ -0,0 +1,87 @@
+/*
+**
+** Copyright (C) 1998-2001 by Matthias Hölzer-Klüpfel <hoelzer@kde.org>
+** Maintainence has ceased - send questions to kde-devel@kde.org.
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+#ifndef CITIES_H
+#define CITIES_H
+
+
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qptrlist.h>
+
+
+class QPainter;
+
+
+class City
+{
+public:
+
+ City(const QString &n, double la, double lo) : _name(n), _latitude(la), _longitude(lo) {};
+ QString name() { return _name; };
+
+ double latitude() { return _latitude; };
+ double longitude() { return _longitude; };
+
+
+private:
+
+ QString _name;
+ double _latitude, _longitude;
+
+};
+
+
+class CityList
+{
+public:
+
+ CityList();
+ ~CityList();
+ void paint(QPainter *p, int width, int height, int offset);
+
+ City *getNearestCity(int w, int h, int offset, int x, int y, QPoint &where);
+
+ QStringList timezones();
+
+
+private:
+
+ void readCityLists();
+ void readCityList(const QString &fname);
+
+ QPoint getPosition(double la, double lo, int w, int h, int offset);
+
+
+private:
+
+ QPtrList<City> _cities;
+
+};
+
+
+#endif
diff --git a/kworldwatch/clock.ui b/kworldwatch/clock.ui
new file mode 100644
index 0000000..faae5e7
--- /dev/null
+++ b/kworldwatch/clock.ui
@@ -0,0 +1,259 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>ClockDialog</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>ClockDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>373</width>
+ <height>173</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Edit Clock Settings</string>
+ </property>
+ <property name="icon">
+ <pixmap>clockimage0</pixmap>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout5</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>PixmapLabel1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="pixmap">
+ <pixmap>clockimage1</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer row="1" column="0" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>Spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="2" column="1">
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="0" column="1" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>Layout2</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QComboBox" row="2" column="1">
+ <property name="name">
+ <cstring>ClockZone</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Please enter the settings for the clock.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>TextLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Caption:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>ClockCaption</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>ClockCaption</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>TextLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Timezone:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>ClockZone</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButton1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButton2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<images>
+ <image name="clockimage0">
+ <data format="XPM.GZ" length="620">789c65d0c14e84301006e03b4fd130376258711717637c048d4713e3613a6db7651748743d18e3bbcb7468ece21f0efdfe740a6553a997e747556d8a8f339e0329f2f8ae2af3390c5faf6f0fdf45d9dc2a7ef6aa29af8ab256a49ea6d1f21ae6355cc7300db3db264ec2ae11dac46ecb3c3071870dee982393da344bc2f64ed80be946e813a9651e99cea5592d446c913908d366141a8bc40c429e669e1265b34b742ede5d024beabf0e50d31c6320eb88ac739608f2598aa72fb3cb41790787184bde39bfee20f4903af92c7fd91de77077f259e7867fdd5c71e743efc7d5be10fa69759ee6ceacde6b439fee063ec66a9dfd03b8485dfedc17bfee6d99a3</data>
+ </image>
+ <image name="clockimage1">
+ <data format="XPM.GZ" length="8222">789ccd995b53e3481285dffb57109d6f1d1b39bedb8a8d7de08eb998fb75621eb224199b8b31c6806162fffb962a4f0ad3d8189ade88690d813f57294f669e524962fef83177b2b335f7e38f6f77431976e3b9b82383b91fc9fdf5f5d39f7ffde7ef6fdf2b8d39ff5fa9589c2b7dffd7b7efbbc3b978ae75d34b3360f24085f02f633acfb814796c642cf31957c498ae94cb0dcc7f54aec415097c9771b55489ab418c86cad502789071bd5c2fd6cb417f27b02b148a211e9f822baac7abc618df0537945daa5c8fea2ec45f0127ca1c65dc28db7c5e03c7887f668c7837ca45d4cb4bc6184fc0c8c7b5954d8fd68c1ba13eba556e149525e4d7c8f3e745658bc7057003fa3db0e5db34c6fcba7209f949c837aa583c5905dbfc05659bcfeb60eb77d118e3f360cbe7da18f1831f516cf1654fd9ce9735b0cdaf82ad9e2be5b2f57bcf18facf60eb770f8c7ce45e39aaea7a94fd8ca562f3a506b67e3f814dff52b962fa1b60ebc705d8f446ca5184eb61019c80ef95a5289530bf04ae82cb39c7810f02c765eb5f5dd9f271d760cbe7d818fde880adbf15b0d5373246fd9a4f5cb5eb19f1fdfa0ceb576e95a58a7a87c6885f3446fe8719bb4aaedf005b3d47caa6c75d30e2f33e18fd74b7c6c8b703467fdd9572ada87e73d87f5c62e3726c8cf35bca7ebeea3d804dbf0c8e10ef3c67ed0f2bd78bb5b0bfc98272de2fcd277125d4fb0cae29d372ce1a6f152cca12f6a7b86a7abc09463ddc56ae5bbd0739ebf81618ebdff573d6f11a18f549139cd4743fee294b8afd6a5ed9f2a307657fc156c3f93be01af8247062f93a56cef3bb07231f4760ebf74ace3a7f084e707f69e7ace315e506fa215a6f1297d04f675cd2f14b700dbc6d1c27215e58bf49d5e2cb96b2c5e73467cd5fc0d6df048c7a28cd59e73bb0d5d355b6fd809e95e314f95d2827c89fc3fd34491b567f5539b2fe0ec0b6ff9de6ace331d8fa7d94b3faabf9a722580f1d705a8ac2fc13e372318c2f29fbfcc2b8dc806b6031c6fc8671559f0f6cbe3fc2fc70ff4d6b969f8b73d6fc2ec1e89f7b61adcf290bfc72dd9cd5cf16d8fab30946bddc005b7da41ca7babea9af9ca4692dcc0ffb539ae6fb63012ce8af8053f0b2b2bf41abfea2725cc3f300c663c17ab8504e4a91eeafebc6ba5ee55139b5fe778d357fa19cc338d58db17f3d81cd9f3258743f7741bfedfb81f57baeecf3d77ef7c135d47703b6fab7c1a85f369413413f6370aaf5d093722ac8ff0e6c7e548c71ffec28b7512f158d11af609ca8debe711ad61b9d806bea27ed19b79535dfb63d0fcb3918f75fda02e37980d695edf9908e954b055ccfd7e08afa459be00678171c835bcaf6fc2c8972b50a6e836dff3e536e54b19ee29cf5797447392a46babe9ae048d71745e004fded29e7f7f70118eb838ec029b86aecf4fc54d9d5c00f60bb9e0e956dffa51258c0ba7eda89f9770016dd2fa8a6ec2f30dd3f58b96deb7d04ae814f8de1bf18c3ef45b060be03fb7f19ef0effbfc73f5b8369faf13b34422461c731279c729bcfb9c35dbee04bbee26beebdd6f9150d1fe186fb5ee396077cc743bee7077ef41a237ee2679ee7055ee4a51795cf6b04851b5ee6159ff52aaf7193d77de40dafd1e14ddee296575af4dfaf9aca2f696cfbdc77fcb1cabb3e5a93f77cd411effb6a0ef8d077efc877f1f82b1a4165874f7c474ef98c0b5cf41e6c70c977abecbb56e12ad7b8eeebfc42afa0d1f0ce46bce4cd251272fe108a29a19407d4f6b5f5bfa6b13ba473eaf85c77a91ba28f1f1774e9eb58a0ab97d9bfbc761bdca4eb370ad9d1f375f4beba768386f7836e266af4831fbf43c3fb3151213b323f7e8346e6c7348dcc8f5fd178bd17c18fe9757cc28f97c8746b4776b6fae1bf9d54057dc48f4991c78e4118cbae8f291ab3fd9812794c83eed48f90c5db2a68b61f1fd0801fd33466fb3151e39e1ea88f38037a343fc2ec913f9ee899e609dfccf6031af753ae30e74786e64798ed68d16b2cd1725645f866861f937dfc4963c5fcc0195ac76abeae67f8f1218d35f3233f23abc3e53cc38f571a4d5aa78d706cfe5c87f9f172ce0bcdf2634c43a36fe177eb4d1dbd691a1ff6633344def69f76c2a7dd77fc70b447fb2fbd7adf8fb12a0ee8908ec2a7e3a071f8ae1f2774fa513fde387e864e1dd2143f7046818ad6af597ebcd1d8c88fd2643f7046992a2f1aeffbf146a34ab57c6d4df0239f5fa7067d70bf9a7875446f34d65eef57c242fe9de743fbd58b82c492d086a4e1733b5390f3497e041e4947ba72219772059577fcf8f9da10ffdc213d7ceebda9a387bd6ae4ebe8ca8df469596e67dd3fc6ea188cb9fdfa0a1cf323ab213be4ceea90a1dcbf7f3f1f77634ce5581e5ef993fb1134b48e47ab4346f4eefdfc03fbe12b3fc6ea780a753ce7754cf1e3830a637ef8bbd6e8673f7c1d37d3fdf884c68acc677e082a411d2ef3c3777971ba1f9faa237b6e6fca5278a61eabc32b2c537bba1f9faa6325f34356654d9ab26eef06b2219bb2e5dfdebc1fd29af46ec024dbb233fb27d4b128bbb227fb7220877224c7dc9213ff7e93522aa772c6b75298f6fee1558a529232dd4bd1ffd8ef92b11f535e09ff7fa7267569f8b7c096448eb3e5ee9c8be9d2c717afd076c9a477352697d2dad8cf8afe76ed9fbfe7be3be74dd7e14789fc7be68a7f7fbee381eb4acb5df0811cf9f867d3de07df7baf7f752cfb68973e6ff1efb19bee8af7a5e2ae5dcfbf7dae73d3dd8c2b7ce56f009982ebfb2a5aee562a7c1c1416fc95b1e415befc3780d935bf9ef9cffe9bcc2734fefbef6fff031b478c7d</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>PushButton1</sender>
+ <signal>clicked()</signal>
+ <receiver>ClockDialog</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>PushButton2</sender>
+ <signal>clicked()</signal>
+ <receiver>ClockDialog</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>ClockZone</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>ClockCaption</receiver>
+ <slot>setText(const QString&amp;)</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="global" impldecl="in declaration">kseparator.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kworldwatch/flags.cpp b/kworldwatch/flags.cpp
new file mode 100644
index 0000000..dd60330
--- /dev/null
+++ b/kworldwatch/flags.cpp
@@ -0,0 +1,145 @@
+/*
+**
+** Copyright (C) 1998-2001 by Matthias Hölzer-Klüpfel <hoelzer@kde.org>
+** Maintainence has ceased - send questions to kde-devel@kde.org.
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+#include <limits.h>
+
+
+#include <kstandarddirs.h>
+
+
+#include "flags.h"
+
+
+FlagList::FlagList()
+{
+ _flags.setAutoDelete(true);
+
+ _flagPixmap = QPixmap(locate("data", "kworldclock/pics/flag.png"));
+ _flagMask = QPixmap(locate("data", "kworldclock/pics/flag-mask.xpm"), 0, QPixmap::ThresholdDither);
+ _flagMask.setMask(_flagMask.createHeuristicMask());
+}
+
+
+void FlagList::addFlag(Flag *f)
+{
+ _flags.append(f);
+}
+
+
+QPoint FlagList::getPosition(double la, double lo, int w, int h, int offset)
+{
+ int x = (int)((double)w * (180.0 + lo) / 360.0);
+ int y = (int)((double)h * (90.0 - la) / 180.0);
+ x = (x + offset + w/2) % w;
+
+ return QPoint(x,y);
+}
+
+
+void FlagList::paint(QPainter *p, int width, int height, int offset)
+{
+ p->setPen(Qt::black);
+
+ QPtrListIterator<Flag> it(_flags);
+ for ( ; it.current(); ++it)
+ {
+ QPoint pos = getPosition(it.current()->latitude(), it.current()->longitude(), width, height, offset);
+
+ p->setPen(it.current()->color());
+ p->setBrush(it.current()->color());
+
+ if (width > 100)
+ {
+ pos -= QPoint(5,15);
+
+ p->drawPixmap(pos,_flagMask);
+ p->drawPixmap(pos,_flagPixmap);
+ }
+ else
+ p->drawEllipse(pos.x()-1, pos.y()-1, 3, 3);
+ }
+}
+
+
+void FlagList::removeNearestFlag(const QPoint &target, int w, int h, int offset)
+{
+ Flag *flag = 0;
+
+ QPoint diff;
+
+ int dist = INT_MAX;
+ QPtrListIterator<Flag> it(_flags);
+ for ( ; it.current(); ++it)
+ {
+ diff = getPosition(it.current()->latitude(), it.current()->longitude(), w, h, offset);
+ diff -= target;
+ if (diff.manhattanLength() < dist)
+ {
+ dist = diff.manhattanLength();
+ flag = it.current();
+ }
+ }
+
+ if (flag)
+ _flags.remove(flag);
+}
+
+void FlagList::removeAllFlags()
+{
+ _flags.clear();
+}
+
+void FlagList::save(KConfig *config)
+{
+ config->writeEntry("Flags", _flags.count());
+
+ QPtrListIterator<Flag> it(_flags);
+ int cnt=0;
+ for ( ; it.current(); ++it)
+ {
+ config->writeEntry(QString("Flag_%1_Color").arg(cnt), it.current()->color());
+ config->writeEntry(QString("Flag_%1_Latitude").arg(cnt), it.current()->latitude());
+ config->writeEntry(QString("Flag_%1_Longitude").arg(cnt), it.current()->longitude());
+ cnt++;
+ }
+}
+
+
+void FlagList::load(KConfig *config)
+{
+ _flags.clear();
+ int num = config->readNumEntry("Flags", 0);
+
+ for (int i=0; i<num; ++i)
+ {
+ addFlag(new Flag(config->readDoubleNumEntry(QString("Flag_%1_Longitude").arg(i)),
+ config->readDoubleNumEntry(QString("Flag_%1_Latitude").arg(i)),
+ config->readColorEntry(QString("Flag_%1_Color").arg(i))));
+ }
+}
+
+
diff --git a/kworldwatch/flags.h b/kworldwatch/flags.h
new file mode 100644
index 0000000..7a444db
--- /dev/null
+++ b/kworldwatch/flags.h
@@ -0,0 +1,100 @@
+/*
+**
+** Copyright (C) 1998-2001 by Matthias Hölzer-Klüpfel <hoelzer@kde.org>
+** Maintainence has ceased - send questions to kde-devel@kde.org.
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+#ifndef FLAGS_H
+#define FLAGS_H
+
+
+#include <qstring.h>
+#include <qcolor.h>
+#include <qptrlist.h>
+#include <qpoint.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qbitmap.h>
+
+
+#include <kconfig.h>
+
+
+class Flag
+{
+public:
+
+ Flag(double lo, double la, const QColor &col)
+ : _lo(lo), _la(la), _col(col) {};
+
+ double longitude() const { return _lo; };
+ double latitude() const { return _la; };
+
+ QColor color() const { return _col; };
+
+ QString annotation() const { return _ann; };
+ void setAnnotation(const QString &ann) { _ann = ann; };
+
+
+private:
+
+ double _lo, _la;
+
+ QColor _col;
+
+ QString _ann;
+
+};
+
+
+class FlagList
+{
+public:
+
+ FlagList();
+
+ void paint(QPainter *p, int w, int h, int offset);
+
+ void addFlag(Flag *f);
+
+ void removeNearestFlag(const QPoint &target, int w, int h, int offset);
+ void removeAllFlags();
+
+ void save(KConfig *config);
+ void load(KConfig *config);
+
+
+private:
+
+ QPoint getPosition(double la, double lo, int w, int h, int offset);
+
+ QPtrList<Flag> _flags;
+
+ QPixmap _flagPixmap;
+ QBitmap _flagMask;
+
+};
+
+
+#endif
diff --git a/kworldwatch/flow.cpp b/kworldwatch/flow.cpp
new file mode 100644
index 0000000..ca06d16
--- /dev/null
+++ b/kworldwatch/flow.cpp
@@ -0,0 +1,135 @@
+/****************************************************************************
+** $Id$
+**
+** Implementing your own layout: flow example
+**
+** Copyright (C) 1996 by Trolltech AS. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "flow.h"
+
+class SimpleFlowIterator :public QGLayoutIterator
+{
+public:
+ SimpleFlowIterator( QPtrList<QLayoutItem> *l ) :idx(0), list(l) {}
+ uint count() const;
+ QLayoutItem *current();
+ QLayoutItem *next();
+ QLayoutItem *takeCurrent();
+
+private:
+ int idx;
+ QPtrList<QLayoutItem> *list;
+
+};
+
+uint SimpleFlowIterator::count() const
+{
+ return list->count();
+}
+
+QLayoutItem *SimpleFlowIterator::current()
+{
+ return idx < int(count()) ? list->at(idx) : 0;
+}
+
+QLayoutItem *SimpleFlowIterator::next()
+{
+ idx++; return current();
+}
+
+QLayoutItem *SimpleFlowIterator::takeCurrent()
+{
+ return idx < int(count()) ? list->take( idx ) : 0;
+}
+
+SimpleFlow::~SimpleFlow()
+{
+ deleteAllItems();
+}
+
+
+int SimpleFlow::heightForWidth( int w ) const
+{
+ if ( cached_width != w ) {
+ //Not all C++ compilers support "mutable" yet:
+ SimpleFlow * mthis = (SimpleFlow*)this;
+ int h = mthis->doLayout( QRect(0,0,w,0), TRUE );
+ mthis->cached_hfw = h;
+ mthis->cached_width = w;
+ return h;
+ }
+ return cached_hfw;
+}
+
+void SimpleFlow::addItem( QLayoutItem *item)
+{
+ list.append( item );
+}
+
+bool SimpleFlow::hasHeightForWidth() const
+{
+ return TRUE;
+}
+
+QSize SimpleFlow::sizeHint() const
+{
+ return minimumSize();
+}
+
+QSizePolicy::ExpandData SimpleFlow::expanding() const
+{
+ return QSizePolicy::NoDirection;
+}
+
+QLayoutIterator SimpleFlow::iterator()
+{
+ return QLayoutIterator( new SimpleFlowIterator( &list ) );
+}
+
+void SimpleFlow::setGeometry( const QRect &r )
+{
+ QLayout::setGeometry( r );
+ doLayout( r );
+}
+
+int SimpleFlow::doLayout( const QRect &r, bool testonly )
+{
+ int x = r.x();
+ int y = r.y();
+ int h = 0; //height of this line so far.
+ QPtrListIterator<QLayoutItem> it(list);
+ QLayoutItem *o;
+ while ( (o=it.current()) != 0 ) {
+ ++it;
+ int nextX = x + o->sizeHint().width() + spacing();
+ if ( nextX - spacing() > r.right() && h > 0 ) {
+ x = r.x();
+ y = y + h + spacing();
+ nextX = x + o->sizeHint().width() + spacing();
+ h = 0;
+ }
+ if ( !testonly )
+ o->setGeometry( QRect( QPoint( x, y ), o->sizeHint() ) );
+ x = nextX;
+ h = QMAX( h, o->sizeHint().height() );
+ }
+ return y + h - r.y();
+}
+
+QSize SimpleFlow::minimumSize() const
+{
+ QSize s(0,0);
+ QPtrListIterator<QLayoutItem> it(list);
+ QLayoutItem *o;
+ while ( (o=it.current()) != 0 ) {
+ ++it;
+ s = s.expandedTo( o->minimumSize() );
+ }
+ return s;
+}
+
diff --git a/kworldwatch/flow.h b/kworldwatch/flow.h
new file mode 100644
index 0000000..950c7e5
--- /dev/null
+++ b/kworldwatch/flow.h
@@ -0,0 +1,55 @@
+/****************************************************************************
+** $Id$
+**
+** Definition of simple flow layout for custom layout example
+**
+** Created : 979899
+**
+** Copyright (C) 1997 by Trolltech AS. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef FLOW_H
+#define FLOW_H
+
+#include <qlayout.h>
+#include <qptrlist.h>
+
+class SimpleFlow : public QLayout
+{
+public:
+ SimpleFlow( QWidget *parent, int border=0, int space=-1,
+ const char *name=0 )
+ : QLayout( parent, border, space, name ),
+ cached_width(0), cached_hfw(0) {}
+ SimpleFlow( QLayout* parent, int space=-1, const char *name=0 )
+ : QLayout( parent, space, name ),
+ cached_width(0), cached_hfw(0) {}
+ SimpleFlow( int space=-1, const char *name=0 )
+ : QLayout( space, name ),
+ cached_width(0), cached_hfw(0) {}
+
+ ~SimpleFlow();
+
+ void addItem( QLayoutItem *item);
+ bool hasHeightForWidth() const;
+ int heightForWidth( int ) const;
+ QSize sizeHint() const;
+ QSize minimumSize() const;
+ QLayoutIterator iterator();
+ QSizePolicy::ExpandData expanding() const;
+
+protected:
+ void setGeometry( const QRect& );
+
+private:
+ int doLayout( const QRect&, bool testonly = FALSE );
+ QPtrList<QLayoutItem> list;
+ int cached_width;
+ int cached_hfw;
+};
+
+#endif
diff --git a/kworldwatch/hi16-app-kworldclock.png b/kworldwatch/hi16-app-kworldclock.png
new file mode 100644
index 0000000..4b86bb5
--- /dev/null
+++ b/kworldwatch/hi16-app-kworldclock.png
Binary files differ
diff --git a/kworldwatch/hi22-app-kworldclock.png b/kworldwatch/hi22-app-kworldclock.png
new file mode 100644
index 0000000..9b377f1
--- /dev/null
+++ b/kworldwatch/hi22-app-kworldclock.png
Binary files differ
diff --git a/kworldwatch/hi32-app-kworldclock.png b/kworldwatch/hi32-app-kworldclock.png
new file mode 100644
index 0000000..96ebfc3
--- /dev/null
+++ b/kworldwatch/hi32-app-kworldclock.png
Binary files differ
diff --git a/kworldwatch/hi48-app-kworldclock.png b/kworldwatch/hi48-app-kworldclock.png
new file mode 100644
index 0000000..76ee01d
--- /dev/null
+++ b/kworldwatch/hi48-app-kworldclock.png
Binary files differ
diff --git a/kworldwatch/kdeworld.desktop b/kworldwatch/kdeworld.desktop
new file mode 100644
index 0000000..b13cea1
--- /dev/null
+++ b/kworldwatch/kdeworld.desktop
@@ -0,0 +1,69 @@
+[KDE Desktop Program]
+Comment=KDE WorldClock by Matthias Hoelzer-Kluepfel
+Comment[af]=Kde Wêreld horlosie deur Matthias Hoelzer-kluepfel
+Comment[ar]=ساعة عالمية Ù„KDE من ماتياس هولتسر-كلوبÙÙ„
+Comment[az]=Matthias Hoelzer-Kluepfel'den KDE Dünya Saatı
+Comment[be]=СуÑветны гадзіннік KDE (аўтар Matthias Hoelzer-Kluepfel)
+Comment[bg]=ЧаÑовник, който показва чаÑа в различни точки на Ñвета
+Comment[bn]=কে.ডি.ই. বিশà§à¦¬à¦˜à§œà¦¿, তৈরি করেছেন মà§à¦¯à¦¾à¦¥à¦¿à§Ÿà¦¾à¦¸ হোলজার-কà§à¦²à§à¦ªà¦«à§‡à¦²
+Comment[br]=Eurier bedel KDE gant Matthias Hoelzer-Kluepfel
+Comment[ca]=Rellotge mundial KDE per Matthias Hoelzer-Kluepfel
+Comment[cs]=KDE WorldClock od Matthiase Hoelzer-Kluepfela
+Comment[cy]=Cloc y Byd KDE gan Matthias Hoelzer-Kluepfel
+Comment[da]=KDE Verdensur af Matthias Hoelzer-Kluepfel
+Comment[de]=KDE-Weltzeituhr
+Comment[el]=Παγκόσμιο Ïολόι του KDE από τον Matthias Hoelzer-Kluepfel
+Comment[eo]=KDE-mondhorloÄo
+Comment[es]=El reloj mundial de KDE por Matthias Hoelzer-Kluepfel
+Comment[et]=KDE maailma kell - Matthias Hoelzer-Kluepfel
+Comment[eu]=KDE WorldWatch Matthias Hoelzer-Kluepfelek egina
+Comment[fa]=ساعت جهانی KDE توسط ماتیوز هولزر-کلوپÙÙ„
+Comment[fi]=Maailmankello, tehnyt Matthias Hoelzer-Kluepfel
+Comment[fr]=L'horloge planétaire de KDE par Matthias Hoelzer-Kluepfel
+Comment[ga]=KDE WorldClock le Matthias Hoelzer-Kluepfel
+Comment[gl]=Reloxo Mundial de KDE por Matthias Hoelzer-Kluepfel
+Comment[he]=השעון העולמי של KDE מ×ת מתי×ס הולצר-קליפפל
+Comment[hi]=केडीई विशà¥à¤µ घड़ी- मैथियास होलà¥à¤œà¤¼à¤°-कà¥à¤²à¥‚पफेल दà¥à¤µà¤¾à¤°à¤¾
+Comment[hr]=KDE svjetski sat, autor Matthias Hoelzer-Kluepfel
+Comment[hu]=KDE világóra (készítette: Matthias Hoelzer-Kluepfel)
+Comment[is]=Heimsklukka KDE, eftir Matthias Hoelzer-Kluepfel
+Comment[it]=Orologio mondiale di KDE scritto da Matthias Hoelzer-Kluepfel
+Comment[km]=នាឡិកា​ពិភពលោក KDE ដោយ Matthias Hoelzer-Kluepfel
+Comment[ko]=Matthias Hoelzer-Kluepfelì´ ë§Œë“  KDE 세계 시계
+Comment[lt]=Matthias Hoelzer-Kluepfelio darytas KDE Pasaulio Laikrodis
+Comment[lv]=KDE pasaules pulkstens no Matthias Hoelzer-Kluepfel
+Comment[mk]=СветÑки чаÑовник во KDE од Matthias Hoelzer-Kluepfel
+Comment[ms]=Jam Dunia KDE oleh Matthias Hoelzer-Kluepfel
+Comment[mt]=KDE WorldClock ta' Matthias Hoelzer-Kluepfel
+Comment[nb]=KDE Verdensur av Matthias Hoelzer-Kluepfel
+Comment[nds]=KDE-Weltklock vun Matthias Hoelzer-Kluepfel
+Comment[ne]=माथà¥à¤¯à¤¿à¤¸ होइलà¥à¤œà¤° कà¥à¤²à¥‚पà¥à¤«à¥‡à¤²à¤¦à¥à¤µà¤¾à¤°à¤¾ केडीई विशà¥à¤µà¤µà¥à¤¯à¤¾à¤ªà¥€ घडी
+Comment[nl]=KDE WorldClock door Matthias Hoelzer-Kluepfel
+Comment[nn]=Verdsur for KDE av Matthias Hoelzer-Kluepfel
+Comment[pl]=Czas uniwersalny w KDE autorstwa Matthiasa Hoelzera-Kluepfela
+Comment[pt]=Relógio Global do KDE de Matthias Hoelzer-Kluepfel
+Comment[pt_BR]=Relógio Mundial KDE criado por Matthias Hoelzer-Kluepfel
+Comment[ro]=Ceas mondial KDE de Matthias Hoelzer-Kluepfel
+Comment[ru]=Ð’Ñемирные чаÑÑ‹ KDE от Matthias Hoelzer-Kluepfel
+Comment[sk]=KDE svetové hodiny od Matthiasa Hoelzer-Kluepfela
+Comment[sl]=KDE WorldClock avtorja Matthiasa Hoelzer-Kluepfela
+Comment[sr]=KDE WorldClock од МатијаÑа Хелцера-Клипфела (Matthias Hölzer-Klüpfel)
+Comment[sr@Latn]=KDE WorldClock od Matijasa Helcera-Klipfela (Matthias Hölzer-Klüpfel)
+Comment[sv]=KDE:s världsklocka av Matthias Hoelzer-Kluepfel
+Comment[ta]= KDE உலக கடிகாரம௠by Matthias Hoelzer-Kluepfel
+Comment[tg]=KDE Соати Ҷаҳон аз ÐœÐ°Ñ‚Ñ‚Ð¸Ð°Ñ Ð¥Ð¾Ð»Ð·ÐµÑ€-Клупфел
+Comment[th]=นาฬิà¸à¸²à¸—ั่วโลà¸à¸‚อง KDE โดย Matthias Hoelzer-Kluepfel
+Comment[tr]=Matthias Hoelzer-Kluepfel'den KDE Dünya Saati
+Comment[uk]=Ð’ÑеÑвітній годинник KDE від Matthias Hoelzer-Kluepfel
+Comment[uz]=Matias Hoʻlser-Klyupfel (Matthias Hoelzer-Kluepfel) yaratgan KDE dunyo soati
+Comment[uz@cyrillic]=ÐœÐ°Ñ‚Ð¸Ð°Ñ Ò²ÑžÐ»Ñ†ÐµÑ€-Клюпфел (Matthias Hoelzer-Kluepfel) Ñратган KDE дунё Ñоати
+Comment[ven]=Tshifhinga tsha lifhasi nga Matthias Hoelzer-Kluepfel
+Comment[wa]=Ôrlodje daegnrece po KDE, sicrît pa Matthias Hoelzer-Kluepfel
+Comment[xh]=Ukhangelo lwehlabathi lwe KDE ngu Matthias Hoelzer-Kluepfel
+Comment[zh_CN]=KDE 世界时钟(作者:Matthias Hoelzer-Kluepfel)
+Comment[zh_TW]=KDE 世界表 (Matthias Hoelzer-Kluepfel)
+Comment[zu]=Iwashi Lomhlaba lwe KDE ngu Matthias Hoelzer-Kluepfel
+Executable=kworldclock
+Command=kworldclock --dump --size %xx%y -o %f
+PreviewCommand=kworldclock --dump --size %xx%y -o %f
+Refresh=10
diff --git a/kworldwatch/kworldclock.desktop b/kworldwatch/kworldclock.desktop
new file mode 100644
index 0000000..156d62e
--- /dev/null
+++ b/kworldwatch/kworldclock.desktop
@@ -0,0 +1,80 @@
+[Desktop Entry]
+Name=KWorldClock
+Name[bn]=কে-ওয়ারà§à¦²à§à¦¡-কà§à¦²à¦•
+Name[de]=Weltzeituhr
+Name[el]=Παγκόσμιο Ïολόι
+Name[fi]=Maailmankello
+Name[fr]=Horloge planétaire
+Name[he]=שעון עולמי
+Name[hr]=KSvjetski sat
+Name[mk]=КСветÑкиЧаÑовник
+Name[nb]=Verdensklokke
+Name[ne]=केडीई विशà¥à¤µà¤µà¥à¤¯à¤¾à¤ªà¥€ घडी
+Name[pa]=ਕੇ-ਸੰਸਾਰ ਘੜੀ
+Name[pl]=Zegar światowy
+Name[sk]=Svetové hodiny
+Name[sl]=Svetovna ura
+Name[sv]=Världsklocka
+Name[ta]=கே உலக கடிகாரமà¯
+Name[tg]=Соати Ҷаҳонӣ
+Name[tr]=KDünyaSaati
+Name[wa]=Ôrlodje daegnrece
+GenericName=World Clock
+GenericName[be]=СуÑветны гадзіннік
+GenericName[bg]=Световен чаÑовник
+GenericName[bn]=বিশà§à¦¬ ঘড়ি
+GenericName[br]=Eurier bedel
+GenericName[ca]=Rellotge mundial
+GenericName[cs]=Světové hodiny
+GenericName[cy]=Cloc Byd
+GenericName[da]=Verdensur
+GenericName[de]=Weltzeituhr
+GenericName[el]=Παγκόσμιο Ïολόι
+GenericName[eo]=MondhorloÄo
+GenericName[es]=Reloj mundial
+GenericName[et]=Maailma kell
+GenericName[fa]=ساعت جهانی
+GenericName[fi]=Maailmankello
+GenericName[fr]=Horloge planétaire
+GenericName[gl]=Relóxio Global
+GenericName[he]=שעון עולמי
+GenericName[hr]=Svjetski sat
+GenericName[hu]=Világóra
+GenericName[is]=Heimsklukka
+GenericName[it]=Orologio mondiale
+GenericName[ja]=世界時計
+GenericName[km]=នាឡិកា​ពិភពលោក
+GenericName[ko]=세계 시계
+GenericName[lv]=Pasaules pulkstenis
+GenericName[mk]=СветÑки чаÑовник
+GenericName[mt]=Arloġġ Dinji
+GenericName[nb]=Verdensklokke
+GenericName[nds]=Weltklock
+GenericName[ne]=विशà¥à¤µà¤µà¥à¤¯à¤¾à¤ªà¥€ घडी
+GenericName[nl]=Wereldklok
+GenericName[nn]=Verdsur
+GenericName[pa]=ਸੰਸਾਰ ਘੜੀ
+GenericName[pl]=Zegar światowy
+GenericName[pt]=Relógio Global
+GenericName[pt_BR]=Relógio Mundial
+GenericName[ro]=Ceas mondial
+GenericName[ru]=Ð’Ñемирные чаÑÑ‹
+GenericName[sk]=Svetové hodiny
+GenericName[sl]=Svetovna ura
+GenericName[sr]=СветÑки чаÑовник
+GenericName[sr@Latn]=Svetski Äasovnik
+GenericName[sv]=Världsklocka
+GenericName[ta]=உலக கடிகாரமà¯
+GenericName[tg]=Соати Ҷаҳонӣ
+GenericName[tr]=Dünya Saati
+GenericName[uk]=Ð’ÑеÑвітній годинник
+GenericName[wa]=Ôrlodje daegnrece
+GenericName[zh_CN]=世界时钟
+GenericName[zh_TW]=世界時é˜
+DocPath=kworldclock/index.html
+Exec=kworldclock
+Icon=kworldclock
+Type=Application
+X-KDE-StartupNotify=true
+X-DCOP-ServiceType=Unique
+Categories=Qt;KDE;Utility;Amusement;
diff --git a/kworldwatch/kwwapplet.desktop b/kworldwatch/kwwapplet.desktop
new file mode 100644
index 0000000..54669f8
--- /dev/null
+++ b/kworldwatch/kwwapplet.desktop
@@ -0,0 +1,107 @@
+[Desktop Entry]
+Type=Plugin
+Icon=kworldclock
+Name=World Wide Watch
+Name[af]=Wêreld Wye Waarneem
+Name[az]=Dünya Saatı
+Name[be]=СуÑветны гадзіннік
+Name[bg]=Световен чаÑовник
+Name[bn]=বিশà§à¦¬à¦¬à§à¦¯à¦¾à¦ªà§€ নজর
+Name[br]=Eurier bedel
+Name[ca]=Rellotge de tot el món mundial
+Name[cs]=Světové hodiny
+Name[cy]=Oriawr Fyd-Eang
+Name[da]=Verdensur
+Name[de]=Weltzeituhr
+Name[el]=Παγκόσμιος χάÏτης
+Name[eo]=MondhorloÄo
+Name[es]=Reloj mundial
+Name[et]=Maailma kell
+Name[eu]=Mundu Osoko Ikuspena
+Name[fa]=ساعت گستردۀ جهانی
+Name[fi]=Maailmankello
+Name[fr]=Applet horloge planétaire
+Name[gl]=Relóxio Mundial
+Name[he]=צג עולמי
+Name[hi]=वरà¥à¤²à¥à¤¡ वाइड वाच
+Name[hr]=Sat Å¡irom svijeta
+Name[hu]=Világóra
+Name[is]=Heimsklukka
+Name[it]=Orologio globale
+Name[ja]=世界時計
+Name[km]=នាឡិកា​ពិភពលោក
+Name[ko]=세계 시간 보기
+Name[lt]=Pasaulio vaizdas
+Name[nb]=Verdensur
+Name[nds]=Weltkieker
+Name[ne]=विशà¥à¤µà¤µà¥à¤¯à¤¾à¤ªà¥€ घडी
+Name[pl]=Czas uniwersalny
+Name[pt]=Relógio Global
+Name[pt_BR]=Relógio Mundial
+Name[ro]=Hartă mondială
+Name[ru]=Ð’Ñемирные чаÑÑ‹
+Name[sl]=Svetovna ura
+Name[sv]=Världsklocka
+Name[ta]= உலகளாவிய கடிகாரமà¯
+Name[tg]=Соати Ҷаҳони Кушод
+Name[th]=ดูเวลาทั่วโลà¸
+Name[tr]=Dünya Saati
+Name[uk]=Тенета чаÑових поÑÑів Ñвіту
+Name[ven]=U sedza lifhasi lothe
+Name[wa]=Eure eyet loumaedje sol Daegne
+Name[xh]=Ukhangelo ngokubanzi kwehlabathi
+Name[zh_CN]=世界时钟
+Name[zh_TW]=世界表
+Name[zu]=UKubheka Okubanzi Komhlaba Wonke
+Comment=Displays time and sunshine on a world map
+Comment[ar]=يعرض الوقت و وقت شروق الشمس على خريطة عالمية
+Comment[be]=Паказвае Ñ‡Ð°Ñ Ñ– Ñонечны Ñвет на карце Ñвету
+Comment[bg]=Показване на чаÑа и времето от денонощието на Ñветовната карта
+Comment[bn]=বিশà§à¦¬ মানচিতà§à¦° বà§à¦¯à¦¬à¦¹à¦¾à¦° করে সময় ও সূরà§à¦¯à¦¾à¦²à§‹à¦• দেখায়
+Comment[ca]=Mostra l'hora i la llum del sol a un mapa del món
+Comment[cs]=Zobrazuje Äas a sluneÄní svit na svÄ›tové mapÄ›
+Comment[cy]=Dangos amser ac heulwen ar fap y byd
+Comment[da]=Viser tid og solskin på et verdenskort
+Comment[de]=Zeigt die Zeit- und Sonnenzonen auf einer Weltkarte
+Comment[el]=Εμφανίζει την ÏŽÏα και την ηλιοφάνεια σε ένα παγκόσμιο χάÏτη
+Comment[eo]=Montru tempon kaj sunleviÄon sur monda mapo
+Comment[es]=Muestra la hora y la luz diurna en un mapamundi
+Comment[et]=Kellaaeg ja päikesetõus maailma kaardil
+Comment[eu]=Bistaratu ordua eta eguzki izpiak munduko mapan
+Comment[fa]=زمان Ùˆ طلوع Ø¢Ùتاب را در نگاشت جهانی نمایش می‌دهد
+Comment[fi]=Näyttää ajan ja auringonvalon maailmankartalla
+Comment[fr]=Affiche l'avancement de la journée sur un planisphère
+Comment[ga]=Taispeáin an t-am agus suíomh na gréine ar léarscáil an domhain
+Comment[gl]=Mostra a hora e a luz solar nun mapa-mundi
+Comment[he]=מציג ×ת הזמן והזריחה במפת העול×
+Comment[hr]=Prikazuje vrijeme i sunce na karti svijeta
+Comment[hu]=Megmutatja a világtérképen az időzónákat és a nappal-éjszaka állapotokat
+Comment[is]=Sýnir tíma og sólskin á heimskorti
+Comment[it]=Mostra l'ora e la luce solare in una mappa del mondo
+Comment[ja]=世界地図ã§æ™‚刻ã¨æ—¥ç…§ã‚’表示
+Comment[km]=បង្ហាញ​ពáŸáž›ážœáŸáž›áž¶ និង​ពន្លឺ​ព្រះ​អាទិážáŸ’យ​លើ​ផែនទី​ពិភពលោក
+Comment[ko]=시간과 í•´ ìƒíƒœë¥¼ 세계 지ë„ì—ì„œ 보기
+Comment[lv]=RÄda laiku un saules apspÄ«dÄ“to teritoriju uz pasaules kartes
+Comment[mk]=Прикажува време и Ñончева Ñветлина на карта на Ñветот
+Comment[nb]=Vis tid og steder med solskinn på et verdenskart
+Comment[nds]=Wiest Tiet un Sünnschien op'n Weltkoort
+Comment[ne]=विशà¥à¤µ मानचितà¥à¤°à¤®à¤¾ समय र सूरà¥à¤¯à¥‹à¤¦à¤¯ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ गरà¥à¤¦à¤›
+Comment[nl]=Toont de tijd en zonneschijn op een wereldkaart
+Comment[nn]=Viser tid og solskin på eit verdskart
+Comment[pl]=Pokazuje czas i zasięg słońca na mapie świata
+Comment[pt]=Mostra a hora e luz solar num mapa mundo
+Comment[pt_BR]=Mostra a hora e a linha do dia/noite num mapa mundial
+Comment[ro]=Afişează timpul şi răsăritul soarelului pe o hartă mondială
+Comment[ru]=Ð’Ñ€ÐµÐ¼Ñ Ð¸ ÑÐ¾Ð»Ð½ÐµÑ‡Ð½Ð°Ñ Ñторона на карте мира
+Comment[sk]=Zobrazí Äas a slneÄný svit na mape sveta
+Comment[sl]=Prikazuje Äas in sonÄno svetlobo na zemljevidu sveta
+Comment[sr]=Приказује време и оÑунчаноÑÑ‚ на мапи Ñвета
+Comment[sr@Latn]=Prikazuje vreme i osunÄanost na mapi sveta
+Comment[sv]=Visar tid och solsken på en världskarta
+Comment[tg]=Ðамоиши вақти рузона ва шабона дар харитаи ҷаҳонӣ
+Comment[tr]=Bir dünya haritası üzerinde zamanı ve gün ışığını gösterir
+Comment[uk]=Показує Ñ‡Ð°Ñ Ñ– ÑонÑчний бік на карті Ñвіту
+Comment[wa]=Mostere l' eure eyet l' loumire do djoû so ene mape daegnrece
+Comment[zh_CN]=在世界地图上显示时间和阳光
+Comment[zh_TW]=在世界地圖上顯示時間與日光
+X-KDE-Library=ww_panelapplet
diff --git a/kworldwatch/main.cpp b/kworldwatch/main.cpp
new file mode 100644
index 0000000..622dc73
--- /dev/null
+++ b/kworldwatch/main.cpp
@@ -0,0 +1,202 @@
+/*
+**
+** Copyright (C) 1998-2001 by Matthias Hölzer-Klüpfel <hoelzer@kde.org>
+** Maintainence has ceased - send questions to kde-devel@kde.org.
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+#include <stdlib.h>
+
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qwidget.h>
+
+
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kaboutdata.h>
+#include <kcmdlineargs.h>
+#include <klocale.h>
+#include <kdebug.h>
+
+
+#include "main.moc"
+#include "mapwidget.h"
+#include "zoneclock.h"
+
+
+WorldWideWatch::WorldWideWatch(bool restore, QWidget *parent, const char *name)
+ : KMainWindow(parent, name)
+{
+ KGlobal::locale()->insertCatalogue("timezones"); // For time zone translation
+
+ QWidget *w = new QWidget(this);
+ setCentralWidget(w);
+
+ setPlainCaption(i18n("KDE World Clock"));
+
+ QVBoxLayout *vbox = new QVBoxLayout(w, 0,0);
+
+ _map = new MapWidget(false, restore, w);
+ vbox->addWidget(_map,1);
+
+ _clocks = new ZoneClockPanel(w);
+ vbox->addWidget(_clocks);
+
+ connect(_map, SIGNAL(addClockClicked(const QString &)), _clocks, SLOT(addClock(const QString &)));
+ connect(_map, SIGNAL(saveSettings()), this, SLOT(doSave()));
+
+ if (restore)
+ load(kapp->config());
+}
+
+
+void WorldWideWatch::load(KConfig *config)
+{
+ _map->load(config);
+ _clocks->load(config);
+
+ resize(config->readNumEntry("Width", 320),
+ config->readNumEntry("Height", 200));
+}
+
+
+void WorldWideWatch::save(KConfig *config)
+{
+ _map->save(config);
+ _clocks->save(config);
+
+ config->writeEntry("Width", width());
+ config->writeEntry("Height", height());
+}
+
+
+void WorldWideWatch::doSave()
+{
+ save(kapp->config());
+}
+
+
+void WatchApplication::dumpMap()
+{
+ // guess some default parameters
+ QSize mapSize(kapp->desktop()->size());
+
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ QCString themeName = args->getOption("theme");
+ QCString outName = args->getOption("o");
+
+ QCString ssize = args->getOption("size");
+ if (!ssize.isEmpty())
+ {
+ int w,h;
+ if (sscanf(ssize.data(), "%dx%d", &w, &h) == 2)
+ mapSize = QSize(w,h);
+ }
+
+ kdDebug() << "theme=" << themeName << " out=" << outName << " size=" << mapSize.width() << "x" << mapSize.height() << endl;
+
+ MapWidget *w = new MapWidget(false, true, 0);
+ w->setTheme(themeName);
+ w->setSize(mapSize.width(), mapSize.height());
+
+ QPixmap pm = w->calculatePixmap();
+ QPainter p(&pm);
+ w->paintContents(&p);
+ pm.save(outName, "PPM");
+
+ delete w;
+}
+
+
+int WatchApplication::newInstance()
+{
+ // dump mode, used for background drawing
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+ if (args->isSet("dump"))
+ {
+ dumpMap();
+ return 0;
+ }
+
+ if (!restoringSession())
+ {
+ WorldWideWatch *www = new WorldWideWatch(true);
+ www->show();
+ }
+
+ return 0;
+}
+
+static void listThemes()
+{
+ QPtrList<MapTheme> _themes = MapLoader::themes();
+ QPtrListIterator<MapTheme> it(_themes);
+ for ( ; it.current(); ++it)
+ {
+ printf("%s\n", it.current()->tag().local8Bit().data());
+ }
+}
+
+static KCmdLineOptions options[] =
+{
+ { "dump", I18N_NOOP("Write out a file containing the actual map"), 0 },
+ { "theme <file>", I18N_NOOP("The name of the theme to use"), "depths"},
+ { "themes", I18N_NOOP("List available themes"), 0 },
+ { "o <file>", I18N_NOOP("The name of the file to write to"), "dump.ppm" },
+ { "size <WxH>", I18N_NOOP("The size of the map to dump"), 0 },
+ KCmdLineLastOption
+};
+
+
+int main(int argc, char *argv[])
+{
+ KAboutData about("kworldclock", I18N_NOOP("KDE World Clock"), "1.5");
+ KCmdLineArgs::init(argc, argv, &about);
+ KCmdLineArgs::addCmdLineOptions(options);
+ KUniqueApplication::addCmdLineOptions();
+
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+ if (args->isSet("themes"))
+ {
+ KInstance app(&about);
+ listThemes();
+ return 0;
+ }
+
+ if (!KUniqueApplication::start())
+ return 0;
+
+ WatchApplication app;
+ if (args->isSet("dump"))
+ app.disableSessionManagement();
+
+ if (app.isRestored())
+ RESTORE(WorldWideWatch)
+
+ return app.exec();
+}
diff --git a/kworldwatch/main.h b/kworldwatch/main.h
new file mode 100644
index 0000000..7b4c3c6
--- /dev/null
+++ b/kworldwatch/main.h
@@ -0,0 +1,85 @@
+/*
+**
+** Copyright (C) 1998-2001 by Matthias Hölzer-Klüpfel <hoelzer@kde.org>
+** Maintainence has ceased - send questions to kde-devel@kde.org.
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+#ifndef MAIN_H
+#define MAIN_H
+
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+#include <kuniqueapplication.h>
+#include <kmainwindow.h>
+
+
+class MapWidget;
+class ZoneClockPanel;
+
+
+class WorldWideWatch : public KMainWindow
+{
+ Q_OBJECT
+
+public:
+
+ WorldWideWatch(bool restore=false, QWidget *parent=0, const char *name=0);
+
+ void save(KConfig *config);
+ void load(KConfig *load);
+
+
+protected:
+
+ void readProperties(KConfig *sc) { load(sc); };
+ void saveProperties(KConfig *sc) { save(sc); };
+
+
+private slots:
+
+ void doSave();
+
+
+private:
+
+ MapWidget *_map;
+ ZoneClockPanel *_clocks;
+
+};
+
+
+class WatchApplication : public KUniqueApplication
+{
+ Q_OBJECT
+
+public:
+
+ WatchApplication() : KUniqueApplication() {};
+
+ int newInstance();
+
+ void dumpMap();
+
+};
+#endif
+
diff --git a/kworldwatch/maploader.cpp b/kworldwatch/maploader.cpp
new file mode 100644
index 0000000..236abd3
--- /dev/null
+++ b/kworldwatch/maploader.cpp
@@ -0,0 +1,172 @@
+/*
+**
+** Copyright (C) 1998-2001 by Matthias Hölzer-Klüpfel <hoelzer@kde.org>
+** Maintainence has ceased - send questions to kde-devel@kde.org.
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+#include <time.h>
+
+#include <qvaluelist.h>
+#include <qdir.h>
+#include <qimage.h>
+#include <qpainter.h>
+#include <qtl.h>
+#include <qstringlist.h>
+
+
+#include <kglobal.h>
+#include <kstandarddirs.h>
+#include <kdesktopfile.h>
+#include <kimageeffect.h>
+
+
+#include "astro.h"
+#include "maploader.h"
+
+
+QPtrList<MapTheme> MapLoader::themes()
+{
+ QPtrList<MapTheme> result;
+
+ QStringList files = KGlobal::dirs()->findAllResources("data", "kworldclock/maps/*/*.desktop");
+ for (QStringList::Iterator it=files.begin(); it != files.end(); ++it)
+ {
+ KDesktopFile conf(*it);
+ conf.setGroup("Theme");
+ result.append(new MapTheme(conf.readName(), conf.readEntry("Theme")));
+ }
+
+ return result;
+}
+
+
+QStringList MapLoader::maps(const QString &theme)
+{
+ return KGlobal::dirs()->findAllResources("data", QString("kworldclock/maps/%1/*.jpg").arg(theme));
+}
+
+
+void MapLoader::load(unsigned int width, const QString &theme, unsigned int height, float opacity)
+{
+ // find the maps available
+ QValueList<uint> sizes;
+ QStringList files = maps(theme);
+ for (uint i=0; i<files.count(); ++i)
+ {
+ QString f = files[i];
+ int pos = f.findRev("/");
+ if (pos >= 0)
+ f = f.mid(pos+1);
+ pos = f.findRev(".");
+ if (pos >= 0)
+ f = f.left(pos);
+ sizes.append(f.toInt());
+ }
+ qHeapSort(sizes);
+
+ // find the closest (bigger) size
+ uint size=0;
+ for (uint i=0; i<sizes.count(); ++i)
+ {
+ size = sizes[i];
+ if (size >= width)
+ break;
+ }
+
+ QImage image;
+ if (size == 0)
+ {
+ image = QImage(locate("data", "kworldclock/maps/depths/800.jpg"));
+ size = 800;
+ }
+ else
+ image = QImage(locate("data", QString("kworldclock/maps/%1/%2.jpg").arg(theme).arg(size)));
+
+ if (height == 0)
+ height = width/2;
+
+ if ((image.width() != (int)width) || (image.height() != (int)height))
+ image = image.smoothScale(width, height);
+
+ // convert to light map
+ _light.convertFromImage(image);
+
+ // calculate dark map
+ _dark.convertFromImage(KImageEffect::blend(Qt::black, image, opacity));
+}
+
+
+QBitmap MapLoader::darkMask(int width, int height)
+{
+ time_t t;
+ struct tm *tmp;
+ double jt, sunra, sundec, sunrv, sunlong;
+ short *wtab;
+
+ QBitmap illuMask(width, height);
+
+ // calculate the position of the sun
+ t = time(NULL);
+ tmp = gmtime(&t);
+ jt = jtime(tmp);
+ sunpos(jt,FALSE, &sunra, &sundec, &sunrv, &sunlong);
+
+ int sec = tmp->tm_hour*60*60 + tmp->tm_min*60 + tmp->tm_sec;
+ int gmt_position = width * sec / 86400; // note: greenwich is in the middle!
+
+ // calculate the illuminated area
+ wtab = new short[height];
+ projillum(wtab,width,height,sundec);
+
+ // draw illumination
+ illuMask.fill(Qt::black);
+ QPainter p;
+ p.begin(&illuMask);
+
+ int start, stop;
+ int middle = width - gmt_position;
+ for (int y=0; y<height; y++)
+ if (wtab[y]>0)
+ {
+ start = middle - wtab[y];
+ stop = middle + wtab[y];
+ if (start < 0)
+ {
+ p.drawLine(0,y,stop,y);
+ p.drawLine(width+start,y,width,y);
+ }
+ else
+ if (stop > width)
+ {
+ p.drawLine(start,y,width,y);
+ p.drawLine(0,y,stop-width,y);
+ }
+ else
+ p.drawLine(start,y,stop,y);
+ }
+ p.end();
+ delete [] wtab;
+ return illuMask;
+}
+
diff --git a/kworldwatch/maploader.h b/kworldwatch/maploader.h
new file mode 100644
index 0000000..efce45f
--- /dev/null
+++ b/kworldwatch/maploader.h
@@ -0,0 +1,81 @@
+/*
+**
+** Copyright (C) 1998-2001 by Matthias Hölzer-Klüpfel <hoelzer@kde.org>
+** Maintainence has ceased - send questions to kde-devel@kde.org.
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+#ifndef MAP_LOADER_H
+#define MAP_LOADER_H
+
+#include <qpixmap.h>
+#include <qbitmap.h>
+#include <qptrlist.h>
+
+
+class MapTheme
+{
+public:
+
+ MapTheme() : _name(""), _tag(""), _id(0) {};
+ MapTheme(const QString &name, const QString &tag) : _name(name), _tag(tag), _id(0) {};
+
+ QString tag() { return _tag; };
+ QString name() { return _name; };
+
+ void setID(int i) { _id = i; };
+ int ID() { return _id; };
+
+
+private:
+
+ QString _name, _tag;
+ int _id;
+
+};
+
+
+class MapLoader
+{
+public:
+
+ static QPtrList<MapTheme> themes();
+
+ void load(unsigned int width=400, const QString &theme = "earth", unsigned int height=0, float opacity=0.5);
+
+ QPixmap lightMap() { return _light; };
+ QPixmap darkMap() { return _dark; };
+
+ QBitmap darkMask(int width, int height);
+
+
+private:
+
+ QStringList maps(const QString &theme);
+
+ QPixmap _light, _dark;
+
+};
+
+
+#endif
diff --git a/kworldwatch/maps/Makefile.am b/kworldwatch/maps/Makefile.am
new file mode 100644
index 0000000..5d3d86e
--- /dev/null
+++ b/kworldwatch/maps/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = depths flatworld
diff --git a/kworldwatch/maps/README.maps b/kworldwatch/maps/README.maps
new file mode 100644
index 0000000..fc35886
--- /dev/null
+++ b/kworldwatch/maps/README.maps
@@ -0,0 +1,10 @@
+A nice collection of maps to be used with KWorldWatch
+can be found at:
+
+http://www.radcyberzine.com/xglobe
+
+If you want to use your own map, you should make sure
+that Greenwich is exactly in the middle of the map.
+
+Bye,
+Matthias.
diff --git a/kworldwatch/maps/depths/400.jpg b/kworldwatch/maps/depths/400.jpg
new file mode 100644
index 0000000..1447b3d
--- /dev/null
+++ b/kworldwatch/maps/depths/400.jpg
Binary files differ
diff --git a/kworldwatch/maps/depths/800.jpg b/kworldwatch/maps/depths/800.jpg
new file mode 100644
index 0000000..38866b6
--- /dev/null
+++ b/kworldwatch/maps/depths/800.jpg
Binary files differ
diff --git a/kworldwatch/maps/depths/Makefile.am b/kworldwatch/maps/depths/Makefile.am
new file mode 100644
index 0000000..d543382
--- /dev/null
+++ b/kworldwatch/maps/depths/Makefile.am
@@ -0,0 +1,2 @@
+maps_DATA = depths.desktop 400.jpg 800.jpg
+mapsdir = $(kde_datadir)/kworldclock/maps/depths
diff --git a/kworldwatch/maps/depths/depths.desktop b/kworldwatch/maps/depths/depths.desktop
new file mode 100644
index 0000000..33a11a5
--- /dev/null
+++ b/kworldwatch/maps/depths/depths.desktop
@@ -0,0 +1,64 @@
+[Theme]
+Name=Surface Depth
+Name[af]=Oppervlakte Diepte
+Name[ar]=عمق السطح
+Name[az]=Səth Dərinliyi
+Name[be]=Ð“Ð»Ñ‹Ð±Ñ–Ð½Ñ Ð¿Ð°Ð²ÐµÑ€Ñ…Ð½Ñ–
+Name[bg]=Релеф на земната повърхноÑÑ‚
+Name[bn]=পৃষà§à¦ à§‡à¦° গভীরতা
+Name[br]=Krogad en egor
+Name[ca]=Extensió de la superfície
+Name[cs]=Plocha do hloubky
+Name[cy]=Dyfnder Arwyneb
+Name[da]=Overfladedybde
+Name[de]=Oberflächenstruktur
+Name[el]=Βάθος επιφάνειας
+Name[eo]=Surfacprofundo
+Name[es]=Profundidad de superficie
+Name[et]=Pinnasügavus
+Name[eu]=Azalaren Sakona
+Name[fa]=عمق سطح
+Name[fi]=Pinnan syvyys
+Name[fr]=Relief
+Name[ga]=Doimhneacht an Dromchla
+Name[gl]=Profundidade da Superfície
+Name[he]=מעמקי×
+Name[hi]=सतह गहराई
+Name[hr]=Površinska dubina
+Name[hu]=Felületmélység
+Name[is]=Yfirborðsdýpt
+Name[it]=Profondità superficie
+Name[ja]=表é¢ã®æ·±ã•
+Name[km]=ជម្រៅ​ផ្ទៃ
+Name[ko]=표면 깊ì´
+Name[lt]=Paviršiaus gylis
+Name[lv]=Virsmas dziļums
+Name[mk]=Длабочина на површина
+Name[mt]=Fond tal-wiċċ
+Name[nb]=Overflate-dybde
+Name[nds]=Böversiet-Deepde
+Name[ne]=धरातलिय गहिराइ
+Name[nl]=Oppervlaktediepte
+Name[nn]=Overflatedjupne
+Name[pl]=Głębokość powierzchni
+Name[pt]=Profundidade da Superfície
+Name[pt_BR]=Profundidade de superfície
+Name[ro]=Suprafaţă de adîncimi
+Name[ru]=Глубина поверхноÑти
+Name[sk]=Hĺbka povrchu
+Name[sl]=Globina ploskve
+Name[sr]=Дубина рељефа
+Name[sr@Latn]=Dubina reljefa
+Name[sv]=Ytdjup
+Name[ta]= தள ஆழமà¯
+Name[tg]=Қаъри Сатҳ
+Name[th]=ความลึà¸à¸žà¸·à¹‰à¸™à¸œà¸´à¸§
+Name[tr]=Yüzey Derinliği
+Name[uk]=Глибина поверхні
+Name[ven]=Vhulapfu uya fhasi
+Name[wa]=Surface e relief
+Name[xh]=Ubunzulu Bomphezulu
+Name[zh_CN]=表é¢çºµæ·±
+Name[zh_TW]=表é¢æ·±åº¦
+Name[zu]=Ubunzulu Baphezulu
+Theme=depths
diff --git a/kworldwatch/maps/flatworld/1200.jpg b/kworldwatch/maps/flatworld/1200.jpg
new file mode 100644
index 0000000..40a086d
--- /dev/null
+++ b/kworldwatch/maps/flatworld/1200.jpg
Binary files differ
diff --git a/kworldwatch/maps/flatworld/1600.jpg b/kworldwatch/maps/flatworld/1600.jpg
new file mode 100644
index 0000000..c0209af
--- /dev/null
+++ b/kworldwatch/maps/flatworld/1600.jpg
Binary files differ
diff --git a/kworldwatch/maps/flatworld/200.jpg b/kworldwatch/maps/flatworld/200.jpg
new file mode 100644
index 0000000..a603671
--- /dev/null
+++ b/kworldwatch/maps/flatworld/200.jpg
Binary files differ
diff --git a/kworldwatch/maps/flatworld/400.jpg b/kworldwatch/maps/flatworld/400.jpg
new file mode 100644
index 0000000..3dc3dac
--- /dev/null
+++ b/kworldwatch/maps/flatworld/400.jpg
Binary files differ
diff --git a/kworldwatch/maps/flatworld/800.jpg b/kworldwatch/maps/flatworld/800.jpg
new file mode 100644
index 0000000..895faf4
--- /dev/null
+++ b/kworldwatch/maps/flatworld/800.jpg
Binary files differ
diff --git a/kworldwatch/maps/flatworld/Makefile.am b/kworldwatch/maps/flatworld/Makefile.am
new file mode 100644
index 0000000..5feb5be
--- /dev/null
+++ b/kworldwatch/maps/flatworld/Makefile.am
@@ -0,0 +1,2 @@
+maps_DATA = flatworld.desktop 200.jpg 400.jpg 800.jpg 1200.jpg 1600.jpg
+mapsdir = $(kde_datadir)/kworldclock/maps/flatworld
diff --git a/kworldwatch/maps/flatworld/flatworld.desktop b/kworldwatch/maps/flatworld/flatworld.desktop
new file mode 100644
index 0000000..56ff332
--- /dev/null
+++ b/kworldwatch/maps/flatworld/flatworld.desktop
@@ -0,0 +1,53 @@
+[Theme]
+Name=Flat World
+Name[be]=ПлоÑкі Ñвет
+Name[bg]=Без релеф на земната повърхноÑÑ‚
+Name[bn]=সমতল বিশà§à¦¬
+Name[br]=Bed kompez
+Name[cs]=Plochý svět
+Name[cy]=Byd Gwastad
+Name[da]=Flad verden
+Name[de]=Flache Welt
+Name[el]=Επίπεδος κόσμος
+Name[eo]=Plana Mondo
+Name[es]=Mundo plano
+Name[et]=Lame maailm
+Name[eu]=Mundu zabal
+Name[fa]=جهان مسطح
+Name[fi]=Laakea maailma
+Name[fr]=Monde plat
+Name[ga]=Domhan Cothrom
+Name[gl]=Mundo Chao
+Name[he]=×¢×•×œ× ×©×˜×•×—
+Name[hr]=Pljosnati svijet
+Name[hu]=Lapos világ
+Name[is]=Flatur heimur
+Name[it]=Mondo piatto
+Name[ja]=å¹³å¦ãªä¸–界図
+Name[km]=ពិភពលោក​សំប៉ែáž
+Name[ko]=í‰í‰í•œ 세계
+Name[lv]=Plakana pasaule
+Name[mk]=Рамен Ñвет
+Name[mt]=Dinja ÄŠatta
+Name[nb]=Flat verden
+Name[nds]=Platte Welt
+Name[ne]=फराकिलो संसार
+Name[nl]=Vlakke wereld
+Name[pl]=Płaski świat
+Name[pt]=Mundo Plano
+Name[pt_BR]=Mundo Plano
+Name[ro]=Suprafaţă plată
+Name[ru]=ПлоÑкий мир
+Name[sk]=Plochý svet
+Name[sl]=PloÅ¡Äati svet
+Name[sr]=Раван Ñвет
+Name[sr@Latn]=Ravan svet
+Name[sv]=Platt värld
+Name[ta]=படிமான உலகமà¯
+Name[tg]=Ҷаҳони ҳамворӣ
+Name[tr]=Düz Dünya
+Name[uk]=ПлоÑкий Ñвіт
+Name[wa]=Plate Daegne
+Name[zh_CN]=å¹³é¢ä¸–ç•Œ
+Name[zh_TW]=å¹³é¢ä¸–ç•Œ
+Theme=flatworld
diff --git a/kworldwatch/mapwidget.cpp b/kworldwatch/mapwidget.cpp
new file mode 100644
index 0000000..2dac883
--- /dev/null
+++ b/kworldwatch/mapwidget.cpp
@@ -0,0 +1,576 @@
+/*
+**
+** Copyright (C) 1998-2001 by Matthias Hözer-Klüpfel <hoelzer@kde.org>
+** Maintainence has ceased - send questions to kde-devel@kde.org.
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+#include "config.h"
+
+#include <time.h>
+#include <stdlib.h>
+
+#include <qdatetime.h>
+
+#include <kapplication.h>
+#include <kcmdlineargs.h>
+#include <kcolordialog.h>
+#include <kconfig.h>
+#include <kglobal.h>
+#include <kglobalsettings.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kstandarddirs.h>
+
+#include <qcursor.h>
+#include <qpainter.h>
+#include <qpopupmenu.h>
+#include <qregexp.h>
+#include <qiconset.h>
+#include <qtooltip.h>
+
+
+#include "cities.h"
+#include "about.h"
+#include "flags.h"
+#include "mapwidget.moc"
+
+
+MapWidget::MapWidget(bool applet, bool restore, QWidget *parent, const char *name)
+ : QWidget(parent, name), _loader(), _illumination(true), _cities(true), _flags(true), _cityList(0),
+ _applet(applet), _width(0), _height(0)
+{
+ // this ugly construction is necessary so we don't load
+ // the map twice.
+ _theme = "depths";
+
+ if (restore)
+ {
+ KConfig *config = kapp->config();
+ if (applet)
+ config = new KConfig("kwwwappletrc");
+ _theme = config->readEntry("Theme", "depths");
+ if (applet)
+ delete config;
+ }
+
+ setBackgroundMode(QWidget::NoBackground);
+
+ gmt_position = 0;
+ time_t t = time(NULL);
+ setTime(gmtime(&t));
+
+ _flagList = new FlagList;
+
+ int id;
+ _flagPopup = new QPopupMenu(this);
+ QPixmap flag = QPixmap(locate("data", "kworldclock/pics/flag-red.png"));
+ id = _flagPopup->insertItem(QIconSet(flag), i18n("Add &Red"), this, SLOT(addFlag(int)));
+ _flagPopup->setItemParameter(id, 0);
+ flag = QPixmap(locate("data", "kworldclock/pics/flag-green.png"));
+ id = _flagPopup->insertItem(QIconSet(flag), i18n("Add &Green"), this, SLOT(addFlag(int)));
+ _flagPopup->setItemParameter(id, 1);
+ flag = QPixmap(locate("data", "kworldclock/pics/flag-blue.png"));
+ id = _flagPopup->insertItem(QIconSet(flag), i18n("Add &Blue"), this, SLOT(addFlag(int)));
+ _flagPopup->setItemParameter(id, 2);
+ id = _flagPopup->insertItem(i18n("Add &Custom..."), this, SLOT(addFlag(int)));
+ _flagPopup->setItemParameter(id, 3);
+ _flagPopup->insertSeparator();
+ _flagPopup->insertItem(i18n("&Remove Flag"), this, SLOT(removeFlag()));
+ _flagPopup->insertItem(i18n("&Remove All Flags"), this, SLOT(removeAllFlags()));
+
+ _themePopup = new QPopupMenu(this);
+ _themes = MapLoader::themes();
+ int cnt=0;
+ QPtrListIterator<MapTheme> it(_themes);
+ for ( ; it.current(); ++it)
+ {
+ int id = _themePopup->insertItem(it.current()->name(), this, SLOT(themeSelected(int)));
+ _themePopup->setItemParameter(id, cnt++);
+ it.current()->setID(id);
+ }
+
+ QPopupMenu *_clocksPopup = new QPopupMenu(this);
+ _clocksPopup->insertItem(i18n("&Add..."), this, SLOT(addClock()));
+
+ _popup = new QPopupMenu(this);
+ _popup->insertItem(i18n("&Flags"), _flagPopup);
+
+ if (!applet)
+ _popup->insertItem(i18n("&Clocks"), _clocksPopup);
+
+ _popup->insertSeparator();
+ _popup->insertItem(i18n("&Map Theme"), _themePopup);
+ _illuminationID = _popup->insertItem(i18n("Show &Daylight"), this, SLOT(toggleIllumination()));
+ _citiesID = _popup->insertItem(i18n("Show &Cities"), this, SLOT(toggleCities()));
+ _flagsID = _popup->insertItem(i18n("Show F&lags"), this, SLOT(toggleFlags()));
+
+ if (!applet)
+ {
+ _popup->insertSeparator();
+ _popup->insertItem(i18n("&Save Settings"), this, SLOT(slotSaveSettings()));
+ }
+
+ _popup->insertSeparator();
+ _popup->insertItem(i18n("&About"), this, SLOT(about()));
+
+ QTimer *timer = new QTimer(this);
+ connect(timer, SIGNAL(timeout()), this, SLOT(timeout()));
+ timer->start(1000);
+
+ _cityIndicator = new QLabel(0,0, WStyle_StaysOnTop | WStyle_Customize | WStyle_NoBorder | WStyle_Tool | WX11BypassWM );
+ _cityIndicator->setMargin(1);
+ _cityIndicator->setIndent(0);
+ _cityIndicator->setAutoMask(false);
+ _cityIndicator->setLineWidth(1);
+ _cityIndicator->setAlignment(QLabel::AlignAuto | QLabel::AlignTop);
+ _cityIndicator->setAutoResize(true);
+ _cityIndicator->setFrameStyle(QFrame::Box | QFrame::Plain);
+ _cityIndicator->setPalette(QToolTip::palette());
+
+ if (restore && !applet)
+ load(kapp->config());
+
+ connect(&m_timer, SIGNAL(timeout()), this, SLOT(updateCityIndicator()));
+}
+
+
+MapWidget::~MapWidget()
+{
+ if (_applet)
+ {
+ KConfig *conf = new KConfig("kwwwappletrc");
+ save(conf);
+ delete conf;
+ }
+ delete _cityList;
+ delete _flagList;
+}
+
+
+void MapWidget::load(KConfig *config)
+{
+ setCities(config->readBoolEntry("Cities", true));
+ setIllumination(config->readBoolEntry("Illumination", true));
+ setFlags(config->readBoolEntry("Flags", true));
+
+ if ( !_applet )
+ {
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+ if (args->isSet("theme"))
+ setTheme(QString::fromLocal8Bit(args->getOption("theme")));
+ else
+ setTheme(config->readEntry("Theme", "depths"));
+
+ _flagList->load(config);
+ }
+}
+
+
+void MapWidget::save(KConfig *config)
+{
+ config->writeEntry("Cities", _cities);
+ config->writeEntry("Illumination", _illumination);
+ config->writeEntry("Flags", _flags);
+
+ config->writeEntry("Theme", _theme);
+
+ _flagList->save(config);
+}
+
+
+void MapWidget::slotSaveSettings()
+{
+ emit saveSettings();
+}
+
+
+void MapWidget::addClock()
+{
+ if (!_cityList)
+ _cityList = new CityList;
+
+ QPoint where;
+ City *c = _cityList->getNearestCity(_width, _height, gmt_position, _flagPos.x(), _flagPos.y(), where);
+
+ QString zone = "";
+ if (c)
+ zone = c->name();
+
+ emit addClockClicked(zone);
+}
+
+
+void MapWidget::addFlag(int index)
+{
+ QColor col = Qt::red;
+
+ switch (index)
+ {
+ case 0:
+ col = Qt::red;
+ break;
+ case 1:
+ col = Qt::green;
+ break;
+ case 2:
+ col = Qt::blue;
+ break;
+ case 3:
+ if (KColorDialog::getColor(col, this) != KColorDialog::Accepted)
+ return;
+ break;
+ }
+
+ int x = _flagPos.x() - gmt_position + width()/2;
+ if (x>width())
+ x -= width();
+ double la = 90.0 - 180.0 * ((double)_flagPos.y()) / ((double)_height);
+ double lo = 360.0 * ((double)x) / ((double)_width) - 180.0;
+
+ _flagList->addFlag(new Flag(lo, la, col));
+
+ update();
+}
+
+
+void MapWidget::removeFlag()
+{
+ _flagList->removeNearestFlag(_flagPos, _width, _height, gmt_position);
+ update();
+}
+
+void MapWidget::removeAllFlags()
+{
+ if ( KMessageBox::warningContinueCancel( this, i18n( "Do you really want to remove all flags?" ), QString::null, KStdGuiItem::del() ) == KMessageBox::Continue )
+ _flagList->removeAllFlags();
+
+ update();
+}
+
+void MapWidget::setCities(bool c)
+{
+ _cities = c;
+ _popup->setItemChecked(_citiesID, c);
+
+ if (c && !_cityList)
+ _cityList = new CityList;
+
+ setMouseTracking(c);
+ if (!c)
+ {
+ _cityIndicator->hide();
+ m_timer.stop();
+ }
+
+ update();
+}
+
+
+void MapWidget::toggleCities()
+{
+ setCities(!_popup->isItemChecked(_citiesID));
+}
+
+
+void MapWidget::toggleIllumination()
+{
+ setIllumination(!_popup->isItemChecked(_illuminationID));
+}
+
+
+void MapWidget::setFlags(bool f)
+{
+ _flags = f;
+ _popup->setItemChecked(_flagsID, f);
+
+ update();
+}
+
+
+void MapWidget::toggleFlags()
+{
+ setFlags(!_popup->isItemChecked(_flagsID));
+}
+
+
+void MapWidget::updateBackground()
+{
+ if (!_height)
+ return;
+ _pixmap = calculatePixmap();
+ setBackgroundPixmap(_pixmap);
+
+ update();
+}
+
+
+QPixmap MapWidget::getPixmap()
+{
+ return _pixmap;
+}
+
+
+void MapWidget::setIllumination(bool i)
+{
+ _illumination = i;
+ _popup->setItemChecked(_illuminationID, i);
+
+ updateBackground();
+}
+
+
+void MapWidget::timeout()
+{
+ time_t t = time(NULL);
+ setTime(gmtime(&t));
+
+ if (_cities && !_currentCity.isEmpty())
+ _cityIndicator->setText(cityTime(_currentCity));
+}
+
+
+QString MapWidget::cityTime(const QString &city)
+{
+ QString result = i18n(city.latin1()); // Time zone translation
+ int pos = result.find("/");
+ if (pos >= 0)
+ result = result.mid(pos+1);
+ result.replace(QRegExp("_"), " ");
+ result.append(": ");
+
+ char *initial_TZ = getenv("TZ");
+ setenv("TZ", city.latin1(), 1);
+ tzset();
+
+ time_t t = time(NULL);
+ QDateTime dt;
+ dt.setTime_t(t);
+ result.append(QString("%1, %2").arg(KGlobal::locale()->formatTime(dt.time(), true)).arg(KGlobal::locale()->formatDate(dt.date(), true)));
+
+ if (initial_TZ != 0)
+ setenv("TZ", initial_TZ, 1);
+ else
+ unsetenv("TZ");
+ tzset();
+ return result;
+}
+
+
+void MapWidget::enterEvent(QEvent *)
+{
+ if ( _cities )
+ updateCityIndicator();
+}
+
+void MapWidget::leaveEvent(QEvent *)
+{
+ _cityIndicator->hide();
+ m_timer.stop();
+}
+
+
+void MapWidget::about()
+{
+ AboutDialog dlg(this, 0, true);
+ dlg.exec();
+}
+
+
+void MapWidget::themeSelected(int index)
+{
+ QString t = _themes.at(index)->tag();
+ if (!t.isEmpty())
+ setTheme(t);
+}
+
+
+void MapWidget::mousePressEvent(QMouseEvent *ev)
+{
+ if (ev->button() == QMouseEvent::RightButton)
+ {
+ _flagPos = ev->pos();
+ _popup->exec(ev->globalPos());
+ }
+}
+
+
+void MapWidget::mouseMoveEvent(QMouseEvent *)
+{
+ if (!_cities)
+ return;
+
+ if (!m_timer.isActive())
+ m_timer.start(25, true);
+}
+
+void MapWidget::updateCityIndicator()
+{
+ QPoint where;
+ QPoint pos = mapFromGlobal(QCursor::pos());
+
+ if (!_cityList)
+ _cityList = new CityList;
+ City *c = _cityList->getNearestCity(_width, _height, gmt_position, pos.x(), pos.y(), where);
+
+ if (c)
+ {
+ _currentCity = c->name();
+ showIndicator(QCursor::pos());
+ }
+ else
+ _cityIndicator->hide();
+}
+
+
+void MapWidget::showIndicator(const QPoint &pos)
+{
+ _cityIndicator->setText(cityTime(_currentCity));
+
+ int w = _cityIndicator->width();
+ int h = _cityIndicator->height();
+
+ QRect desk = KGlobalSettings::desktopGeometry(pos);
+
+ QPoint newPos;
+
+ if (pos.x()+w+10 > desk.right())
+ newPos.setX(pos.x()-w-5);
+ else
+ newPos.setX(pos.x()+10);
+
+ if (pos.y()+h+10 > desk.bottom())
+ newPos.setY(pos.y()-h-5);
+ else
+ newPos.setY(pos.y()+10);
+
+ _cityIndicator->move(newPos);
+
+ _cityIndicator->show();
+
+}
+
+
+void MapWidget::setTheme(const QString &theme)
+{
+ _theme = theme;
+
+ QPtrListIterator<MapTheme> it(_themes);
+ for ( ; it.current(); ++it)
+ _themePopup->setItemChecked(it.current()->ID(), theme == it.current()->tag());
+
+ if (_height)
+ setSize(_width, _height);
+}
+
+
+void MapWidget::setTime(struct tm *time)
+{
+ sec = time->tm_hour*60*60 + time->tm_min*60 + time->tm_sec;
+
+ if (isVisible())
+ {
+ int old_position = gmt_position;
+ gmt_position = width() * sec / 86400; // note: greenwich is in the middle!
+
+ if (old_position != gmt_position)
+ updateBackground();
+ }
+}
+
+void MapWidget::setSize(int w, int h)
+{
+ _width = w;
+ _height = h;
+ _loader.load(_width, _theme, _height);
+
+ gmt_position = width() * sec / 86400; // note: greenwich is in the middle!
+
+ updateBackground();
+}
+
+void MapWidget::resizeEvent(QResizeEvent *ev)
+{
+ setSize(width(), height());
+ QWidget::resizeEvent(ev);
+}
+
+void MapWidget::paintContents(QPainter *p)
+{
+ if (_cities)
+ _cityList->paint(p, _width, _height, gmt_position);
+ if (_flags)
+ _flagList->paint(p, _width, _height, gmt_position);
+}
+
+void MapWidget::paintEvent(QPaintEvent *ev)
+{
+ QWidget::paintEvent(ev);
+
+ if (_cities || _flags)
+ {
+ QPainter p(this);
+
+ p.setClipping(true);
+ p.setClipRegion(ev->region());
+
+ paintContents(&p);
+ }
+}
+
+
+QPixmap MapWidget::calculatePixmap()
+{
+ QPixmap map;
+
+ if (_illumination)
+ {
+ map = _loader.darkMap();
+ QPixmap clean = _loader.lightMap();
+
+ QPainter mp(&map);
+ clean.setMask(_loader.darkMask(map.width(), map.height()));
+ mp.drawPixmap(0,0, clean);
+ }
+ else
+ map = _loader.lightMap();
+
+ int greenwich = map.width()/2;
+
+ QPixmap pm(_width, _height);
+ QPainter p;
+ p.begin(&pm);
+
+ if (gmt_position >= greenwich)
+ {
+ p.drawPixmap(gmt_position-greenwich, 0, map, 0, 0, map.width()-gmt_position+greenwich);
+ p.drawPixmap(0,0, map, map.width()-gmt_position+greenwich, 0, gmt_position-greenwich);
+ }
+ else
+ {
+ p.drawPixmap(0,0, map, greenwich-gmt_position, 0, map.width()+gmt_position-greenwich);
+ p.drawPixmap(map.width()+gmt_position-greenwich, 0, map, 0, 0, greenwich-gmt_position);
+ }
+
+ return pm;
+}
diff --git a/kworldwatch/mapwidget.h b/kworldwatch/mapwidget.h
new file mode 100644
index 0000000..54e4f58
--- /dev/null
+++ b/kworldwatch/mapwidget.h
@@ -0,0 +1,161 @@
+/*
+**
+** Copyright (C) 1998-2001 by Matthias Hölzer-Klüpfel <hoelzer@kde.org>
+** Maintainence has ceased - send questions to kde-devel@kde.org.
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+#ifndef MAP_WIDGET_H
+#define MAP_WIDGET_H
+
+
+#include <time.h>
+
+
+#include <qwidget.h>
+#include <qpixmap.h>
+#include <qstringlist.h>
+#include <qlabel.h>
+#include <qpoint.h>
+#include <qtimer.h>
+
+
+class QPopupMenu;
+
+
+#include <kconfig.h>
+
+
+class CityList;
+class FlagList;
+
+
+#include "maploader.h"
+
+
+class MapWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+
+ MapWidget(bool applet=false, bool restore=false, QWidget *parent=0, const char *name=0);
+ ~MapWidget();
+
+ void setTheme(const QString &theme);
+ void setTime(struct tm *time);
+ void setIllumination(bool i);
+ void setCities(bool c);
+ void setFlags(bool f);
+ void setSize(int w, int h);
+
+ void save(KConfig *config);
+ void load(KConfig *config);
+
+ void updateBackground();
+
+ QPixmap getPixmap();
+ QPopupMenu* contextMenu() const { return _popup; }
+
+ void paintContents(QPainter *p);
+ QPixmap calculatePixmap();
+
+signals:
+
+ void addClockClicked(const QString &zone);
+ void saveSettings();
+
+
+protected slots:
+
+ void timeout();
+ void updateCityIndicator();
+
+public slots:
+
+ void about();
+
+ void toggleIllumination();
+ void toggleCities();
+ void toggleFlags();
+
+ void removeFlag();
+ void removeAllFlags();
+
+ void slotSaveSettings();
+
+
+protected:
+
+ void resizeEvent(QResizeEvent *ev);
+ void paintEvent(QPaintEvent *ev);
+ void mousePressEvent(QMouseEvent *ev);
+ void mouseMoveEvent(QMouseEvent *ev);
+ void enterEvent(QEvent *ev);
+ void leaveEvent(QEvent *ev);
+
+
+private slots:
+
+ void themeSelected(int index);
+ void addFlag(int index);
+ void addClock();
+
+
+private:
+
+ void updateMap();
+ QString cityTime(const QString &city);
+ void showIndicator(const QPoint &pos);
+
+ MapLoader _loader;
+
+ QString _theme;
+
+ QPixmap _pixmap;
+
+ int gmt_position;
+
+ time_t sec;
+
+ QPopupMenu *_popup, *_themePopup, *_flagPopup;
+ QPtrList<MapTheme> _themes;
+
+ bool _illumination, _cities, _flags;
+ int _illuminationID, _citiesID, _flagsID;
+
+ CityList *_cityList;
+ QLabel *_cityIndicator;
+ QString _currentCity;
+
+ FlagList *_flagList;
+ QPoint _flagPos;
+
+ bool _applet;
+ QTimer m_timer;
+
+ int _width, _height;
+};
+
+
+#endif
diff --git a/kworldwatch/pics/Makefile.am b/kworldwatch/pics/Makefile.am
new file mode 100644
index 0000000..b0cbcf9
--- /dev/null
+++ b/kworldwatch/pics/Makefile.am
@@ -0,0 +1,2 @@
+pics_DATA = flag.png flag-mask.xpm flag-red.png flag-blue.png flag-green.png
+picsdir = $(kde_datadir)/kworldclock/pics
diff --git a/kworldwatch/pics/flag-blue.png b/kworldwatch/pics/flag-blue.png
new file mode 100644
index 0000000..b0d41dc
--- /dev/null
+++ b/kworldwatch/pics/flag-blue.png
Binary files differ
diff --git a/kworldwatch/pics/flag-green.png b/kworldwatch/pics/flag-green.png
new file mode 100644
index 0000000..dba9c2d
--- /dev/null
+++ b/kworldwatch/pics/flag-green.png
Binary files differ
diff --git a/kworldwatch/pics/flag-mask.xpm b/kworldwatch/pics/flag-mask.xpm
new file mode 100644
index 0000000..d7ceb66
--- /dev/null
+++ b/kworldwatch/pics/flag-mask.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char * flag_xpm[] = {
+"16 16 2 1",
+" c #ffffff",
+". c #000000",
+" ",
+" ...... ",
+" ....... ",
+" ......... ",
+" ............. ",
+" ............. ",
+" ............ ",
+" ............ ",
+" .. ........ ",
+" .. .......",
+" .. .... ",
+" .. ",
+" .. ",
+" .. ",
+" .. ",
+" "};
diff --git a/kworldwatch/pics/flag-red.png b/kworldwatch/pics/flag-red.png
new file mode 100644
index 0000000..ef05d3b
--- /dev/null
+++ b/kworldwatch/pics/flag-red.png
Binary files differ
diff --git a/kworldwatch/pics/flag.png b/kworldwatch/pics/flag.png
new file mode 100644
index 0000000..3aaa788
--- /dev/null
+++ b/kworldwatch/pics/flag.png
Binary files differ
diff --git a/kworldwatch/pics/world2.png b/kworldwatch/pics/world2.png
new file mode 100644
index 0000000..20b4a05
--- /dev/null
+++ b/kworldwatch/pics/world2.png
Binary files differ
diff --git a/kworldwatch/sunclock.c b/kworldwatch/sunclock.c
new file mode 100644
index 0000000..46058ac
--- /dev/null
+++ b/kworldwatch/sunclock.c
@@ -0,0 +1,164 @@
+/*
+ * Sun clock. X11 version by John Mackin.
+ *
+ * This program was derived from, and is still in part identical with, the
+ * Suntools Sun clock program whose author's comment appears immediately
+ * below. Please preserve both notices.
+ *
+ * The X11R3/4 version of this program was written by John Mackin, at the
+ * Basser Department of Computer Science, University of Sydney, Sydney,
+ * New South Wales, Australia; <john@cs.su.oz.AU>. This program, like
+ * the one it was derived from, is in the public domain: `Love is the
+ * law, love under will.'
+ */
+
+/*
+
+ Sun clock
+
+ Designed and implemented by John Walker in November of 1988.
+
+ Version for the Sun Workstation.
+
+ The algorithm used to calculate the position of the Sun is given in
+ Chapter 18 of:
+
+ "Astronomical Formulae for Calculators" by Jean Meeus, Third Edition,
+ Richmond: Willmann-Bell, 1985. This book can be obtained from:
+
+ Willmann-Bell
+ P.O. Box 35025
+ Richmond, VA 23235
+ USA
+ Phone: (804) 320-7016
+
+ This program was written by:
+
+ John Walker
+ Autodesk, Inc.
+ 2320 Marinship Way
+ Sausalito, CA 94965
+ USA
+ Fax: (415) 389-9418
+ Voice: (415) 332-2344 Ext. 2829
+ Usenet: {sun,well,uunet}!acad!kelvin
+ or: kelvin@acad.uu.net
+
+ modified for interactive maps by
+
+ Stephen Martin
+ Fujitsu Systems Business of Canada
+ smartin@fujitsu.ca
+
+ This program is in the public domain: "Do what thou wilt shall be the
+ whole of the law". I'd appreciate receiving any bug fixes and/or
+ enhancements, which I'll incorporate in future versions of the
+ program. Please leave the original attribution information intact so
+ that credit and blame may be properly apportioned.
+
+ Revision history:
+
+ 1.0 12/21/89 Initial version.
+ 8/24/89 Finally got around to submitting.
+
+ 1.1 8/31/94 Version with interactive map.
+ 1.2 10/12/94 Fixes for HP and Solaris, new icon bitmap
+ 1.3 11/01/94 Timezone now shown in icon
+ 1.4 03/29/98 Fixed city drawing, added icon animation
+
+*/
+
+#include "sunclock.h"
+
+void projillum(short *wtab, int xdots, int ydots, double dec);
+
+/* PROJILLUM -- Project illuminated area on the map. */
+
+void
+projillum(wtab, xdots, ydots, dec)
+short *wtab;
+int xdots, ydots;
+double dec;
+{
+ int i, ftf = 1, ilon, ilat, lilon = 0, lilat = 0, xt;
+ double m, x, y, z, th, lon, lat, s, c;
+
+ /* Clear unoccupied cells in width table */
+
+ for (i = 0; i < ydots; i++)
+ wtab[i] = -1;
+
+ /* Build transformation for declination */
+
+ s = sin(-dtr(dec));
+ c = cos(-dtr(dec));
+
+ /* Increment over a semicircle of illumination */
+
+ for (th = -(PI / 2); th <= PI / 2 + 0.001;
+ th += PI / TERMINC) {
+
+ /* Transform the point through the declination rotation. */
+
+ x = -s * sin(th);
+ y = cos(th);
+ z = c * sin(th);
+
+ /* Transform the resulting co-ordinate through the
+ map projection to obtain screen co-ordinates. */
+
+ lon = (y == 0 && x == 0) ? 0.0 : rtd(atan2(y, x));
+ lat = rtd(asin(z));
+
+ ilat = ydots - (lat + 90) * (ydots / 180.0);
+ ilon = lon * (xdots / 360.0);
+
+ if (ftf) {
+
+ /* First time. Just save start co-ordinate. */
+
+ lilon = ilon;
+ lilat = ilat;
+ ftf = 0;
+ } else {
+
+ /* Trace out the line and set the width table. */
+
+ if (lilat == ilat) {
+ wtab[(ydots - 1) - ilat] = ilon == 0 ? 1 : ilon;
+ } else {
+ m = ((double) (ilon - lilon)) / (ilat - lilat);
+ for (i = lilat; i != ilat; i += sgn(ilat - lilat)) {
+ xt = lilon + floor((m * (i - lilat)) + 0.5);
+ wtab[(ydots - 1) - i] = xt == 0 ? 1 : xt;
+ }
+ }
+ lilon = ilon;
+ lilat = ilat;
+ }
+ }
+
+ /* Now tweak the widths to generate full illumination for
+ the correct pole. */
+
+ if (dec < 0.0) {
+ ilat = ydots - 1;
+ lilat = -1;
+ } else {
+ ilat = 0;
+ lilat = 1;
+ }
+
+ for (i = ilat; i != ydots / 2; i += lilat) {
+ if (wtab[i] != -1) {
+ while (1) {
+ wtab[i] = xdots / 2;
+ if (i == ilat)
+ break;
+ i -= lilat;
+ }
+ break;
+ }
+ }
+}
+
diff --git a/kworldwatch/sunclock.h b/kworldwatch/sunclock.h
new file mode 100644
index 0000000..1787506
--- /dev/null
+++ b/kworldwatch/sunclock.h
@@ -0,0 +1,98 @@
+/*
+ * Sun clock. X11 version by John Mackin.
+ *
+ * This program was derived from, and is still in part identical with, the
+ * Suntools Sun clock program whose author's comment appears immediately
+ * below. Please preserve both notices.
+ *
+ * The X11R3/4 version of this program was written by John Mackin, at the
+ * Basser Department of Computer Science, University of Sydney, Sydney,
+ * New South Wales, Australia; <john@cs.su.oz.AU>. This program, like
+ * the one it was derived from, is in the public domain: `Love is the
+ * law, love under will.'
+ */
+
+/*
+
+ Sun clock
+
+ Designed and implemented by John Walker in November of 1988.
+
+ Version for the Sun Workstation.
+
+ The algorithm used to calculate the position of the Sun is given in
+ Chapter 18 of:
+
+ "Astronomical Formulae for Calculators" by Jean Meeus, Third Edition,
+ Richmond: Willmann-Bell, 1985. This book can be obtained from:
+
+ Willmann-Bell
+ P.O. Box 35025
+ Richmond, VA 23235
+ USA
+ Phone: (804) 320-7016
+
+ This program was written by:
+
+ John Walker
+ Autodesk, Inc.
+ 2320 Marinship Way
+ Sausalito, CA 94965
+ USA
+ Fax: (415) 389-9418
+ Voice: (415) 332-2344 Ext. 2829
+ Usenet: {sun,well,uunet}!acad!kelvin
+ or: kelvin@acad.uu.net
+
+ modified for interactive maps by
+
+ Stephen Martin
+ Fujitsu Systems Business of Canada
+ smartin@fujitsu.ca
+
+ This program is in the public domain: "Do what thou wilt shall be the
+ whole of the law". I'd appreciate receiving any bug fixes and/or
+ enhancements, which I'll incorporate in future versions of the
+ program. Please leave the original attribution information intact so
+ that credit and blame may be properly apportioned.
+
+ Revision history:
+
+ 1.0 12/21/89 Initial version.
+ 8/24/89 Finally got around to submitting.
+
+ 1.1 8/31/94 Version with interactive map.
+ 1.2 10/12/94 Fixes for HP and Solaris, new icon bitmap
+ 1.3 11/01/94 Timezone now shown in icon
+ 1.4 03/29/98 Fixed city drawing, added icon animation
+
+*/
+
+#ifndef SUNCLOCK_H
+#define SUNCLOCK_H
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <time.h>
+
+#ifndef PI
+#define PI 3.14159265358979323846
+#endif
+
+#ifndef E
+#define E 2.7182818284590452354
+#endif
+
+#define abs(x) ((x) < 0 ? (-(x)) : x) /* Absolute value */
+#define sgn(x) (((x) < 0) ? -1 : ((x) > 0 ? 1 : 0)) /* Extract sign */
+#define dtr(x) ((x) * (PI / 180.0)) /* Degree->Radian */
+#define rtd(x) ((x) / (PI / 180.0)) /* Radian->Degree */
+#define fixangle(a) ((a) - 360.0 * (floor((a) / 360.0))) /* Fix angle */
+
+#define TERMINC 100 /* Circle segments for terminator */
+
+#define PROJINT (60 * 10) /* Frequency of seasonal recalculation */
+
+#endif
+
diff --git a/kworldwatch/zone.tab b/kworldwatch/zone.tab
new file mode 100644
index 0000000..e3c8e39
--- /dev/null
+++ b/kworldwatch/zone.tab
@@ -0,0 +1,409 @@
+# @(#)zone.tab 1.30
+#
+# TZ zone descriptions
+#
+# From Paul Eggert <eggert@twinsun.com> (1996-08-05):
+#
+# This file contains a table with the following columns:
+# 1. ISO 3166 2-character country code. See the file `iso3166.tab'.
+# 2. Latitude and longitude of the zone's principal location
+# in ISO 6709 sign-degrees-minutes-seconds format,
+# either +-DDMM+-DDDMM or +-DDMMSS+-DDDMMSS,
+# first latitude (+ is north), then longitude (+ is east).
+# 3. Zone name used in value of TZ environment variable.
+# 4. Comments; present if and only if the country has multiple rows.
+#
+# Columns are separated by a single tab.
+# The table is sorted first by country, then an order within the country that
+# (1) makes some geographical sense, and
+# (2) puts the most populous zones first, where that does not contradict (1).
+#
+# Lines beginning with `#' are comments.
+#
+#country-
+#code coordinates TZ comments
+AD +4230+00131 Europe/Andorra
+AE +2518+05518 Asia/Dubai
+AF +3431+06912 Asia/Kabul
+AG +1703-06148 America/Antigua
+AI +1812-06304 America/Anguilla
+AL +4120+01950 Europe/Tirane
+AM +4011+04430 Asia/Yerevan
+AN +1211-06900 America/Curacao
+AO -0848+01314 Africa/Luanda
+AQ -7750+16636 Antarctica/McMurdo McMurdo Station, Ross Island
+AQ -9000+00000 Antarctica/South_Pole Amundsen-Scott Station, South Pole
+AQ -6734-06808 Antarctica/Rothera Rothera Station, Adelaide Island
+AQ -6448-06406 Antarctica/Palmer Palmer Station, Anvers Island
+AQ -6736+06253 Antarctica/Mawson Mawson Station, Holme Bay
+AQ -6835+07758 Antarctica/Davis Davis Station, Vestfold Hills
+AQ -6617+11031 Antarctica/Casey Casey Station, Bailey Peninsula
+AQ -7824+10654 Antarctica/Vostok Vostok Station, S Magnetic Pole
+AQ -6640+14001 Antarctica/DumontDUrville Dumont-d'Urville Base, Terre Adelie
+AQ -690022+0393524 Antarctica/Syowa Syowa Station, E Ongul I
+AR -3436-05827 America/Argentina/Buenos_Aires Buenos Aires (BA, CF)
+AR -3124-06411 America/Argentina/Cordoba most locations (CB, CC, CN, ER, FM, LP, MN, NQ, RN, SA, SE, SF, SL)
+AR -2411-06518 America/Argentina/Jujuy Jujuy (JY)
+AR -3124-06411 America/Argentina/Tucuman Tucuman (TM)
+AR -2828-06547 America/Argentina/Catamarca Catamarca (CT)
+AR -2926-06651 America/Argentina/La_Rioja La Rioja (LR)
+AR -3132-06831 America/Argentina/San_Juan San Juan (SJ)
+AR -3253-06849 America/Argentina/Mendoza Mendoza (MZ)
+AR -4552-06730 America/Argentina/ComodRivadavia Chubut (CH)
+AR -5138-06913 America/Argentina/Rio_Gallegos Santa Cruz (SC)
+AR -5448-06818 America/Argentina/Ushuaia Tierra del Fuego (TF)
+AS -1416-17042 Pacific/Pago_Pago
+AT +4813+01620 Europe/Vienna
+AU -3133+15905 Australia/Lord_Howe Lord Howe Island
+AU -4253+14719 Australia/Hobart Tasmania
+AU -3749+14458 Australia/Melbourne Victoria
+AU -3352+15113 Australia/Sydney New South Wales - most locations
+AU -3157+14127 Australia/Broken_Hill New South Wales - Yancowinna
+AU -2728+15302 Australia/Brisbane Queensland - most locations
+AU -2016+14900 Australia/Lindeman Queensland - Holiday Islands
+AU -3455+13835 Australia/Adelaide South Australia
+AU -1228+13050 Australia/Darwin Northern Territory
+AU -3157+11551 Australia/Perth Western Australia
+AW +1230-06858 America/Aruba
+AX +6006+01957 Europe/Mariehamn
+AZ +4023+04951 Asia/Baku
+BA +4352+01825 Europe/Sarajevo
+BB +1306-05937 America/Barbados
+BD +2343+09025 Asia/Dhaka
+BE +5050+00420 Europe/Brussels
+BF +1222-00131 Africa/Ouagadougou
+BG +4241+02319 Europe/Sofia
+BH +2623+05035 Asia/Bahrain
+BI -0323+02922 Africa/Bujumbura
+BJ +0629+00237 Africa/Porto-Novo
+BM +3217-06446 Atlantic/Bermuda
+BN +0456+11455 Asia/Brunei
+BO -1630-06809 America/La_Paz
+BR -0351-03225 America/Noronha Atlantic islands
+BR -0127-04829 America/Belem Amapa, E Para
+BR -0343-03830 America/Fortaleza NE Brazil (MA, PI, CE, RN, PB)
+BR -0803-03454 America/Recife Pernambuco
+BR -0712-04812 America/Araguaina Tocantins
+BR -0940-03543 America/Maceio Alagoas, Sergipe
+BR -1259-03831 America/Bahia Bahia
+BR -2332-04637 America/Sao_Paulo S & SE Brazil (GO, DF, MG, ES, RJ, SP, PR, SC, RS)
+BR -2027-05437 America/Campo_Grande Mato Grosso do Sul
+BR -1535-05605 America/Cuiaba Mato Grosso
+BR -0846-06354 America/Porto_Velho W Para, Rondonia
+BR +0249-06040 America/Boa_Vista Roraima
+BR -0308-06001 America/Manaus E Amazonas
+BR -0640-06952 America/Eirunepe W Amazonas
+BR -0958-06748 America/Rio_Branco Acre
+BS +2505-07721 America/Nassau
+BT +2728+08939 Asia/Thimphu
+BW -2545+02555 Africa/Gaborone
+BY +5354+02734 Europe/Minsk
+BZ +1730-08812 America/Belize
+CA +4734-05243 America/St_Johns Newfoundland Island
+CA +4439-06336 America/Halifax Atlantic Time - Nova Scotia (most places), NB, W Labrador, E Quebec & PEI
+CA +4612-05957 America/Glace_Bay Atlantic Time - Nova Scotia - places that did not observe DST 1966-1971
+CA +5320-06025 America/Goose_Bay Atlantic Time - E Labrador
+CA +4531-07334 America/Montreal Eastern Time - Quebec - most locations
+CA +4339-07923 America/Toronto Eastern Time - Ontario - most locations
+CA +4901-08816 America/Nipigon Eastern Time - Ontario & Quebec - places that did not observe DST 1967-1973
+CA +4823-08915 America/Thunder_Bay Eastern Time - Thunder Bay, Ontario
+CA +6608-06544 America/Pangnirtung Eastern Standard Time - Pangnirtung, Nunavut
+CA +6344-06828 America/Iqaluit Eastern Standard Time - east Nunavut
+CA +6245-09210 America/Rankin_Inlet Eastern Standard Time - central Nunavut
+CA +4953-09709 America/Winnipeg Central Time - Manitoba & west Ontario
+CA +4843-09429 America/Rainy_River Central Time - Rainy River & Fort Frances, Ontario
+CA +6903-10505 America/Cambridge_Bay Central Time - west Nunavut
+CA +5024-10439 America/Regina Central Standard Time - Saskatchewan - most locations
+CA +5017-10750 America/Swift_Current Central Standard Time - Saskatchewan - midwest
+CA +5333-11328 America/Edmonton Mountain Time - Alberta, east British Columbia & west Saskatchewan
+CA +6227-11421 America/Yellowknife Mountain Time - central Northwest Territories
+CA +6825-11330 America/Inuvik Mountain Time - west Northwest Territories
+CA +5946-12014 America/Dawson_Creek Mountain Standard Time - Dawson Creek & Fort Saint John, British Columbia
+CA +4916-12307 America/Vancouver Pacific Time - west British Columbia
+CA +6043-13503 America/Whitehorse Pacific Time - south Yukon
+CA +6404-13925 America/Dawson Pacific Time - north Yukon
+CC -1210+09655 Indian/Cocos
+CD -0418+01518 Africa/Kinshasa west Dem. Rep. of Congo
+CD -1140+02728 Africa/Lubumbashi east Dem. Rep. of Congo
+CF +0422+01835 Africa/Bangui
+CG -0416+01517 Africa/Brazzaville
+CH +4723+00832 Europe/Zurich
+CI +0519-00402 Africa/Abidjan
+CK -2114-15946 Pacific/Rarotonga
+CL -3327-07040 America/Santiago most locations
+CL -2710-10927 Pacific/Easter Easter Island & Sala y Gomez
+CM +0403+00942 Africa/Douala
+CN +3114+12128 Asia/Shanghai east China - Beijing, Guangdong, Shanghai, etc.
+CN +4545+12641 Asia/Harbin Heilongjiang
+CN +2934+10635 Asia/Chongqing central China - Gansu, Guizhou, Sichuan, Yunnan, etc.
+CN +4348+08735 Asia/Urumqi Tibet & most of Xinjiang Uyghur
+CN +3929+07559 Asia/Kashgar southwest Xinjiang Uyghur
+CO +0436-07405 America/Bogota
+CR +0956-08405 America/Costa_Rica
+CS +4450+02030 Europe/Belgrade
+CU +2308-08222 America/Havana
+CV +1455-02331 Atlantic/Cape_Verde
+CX -1025+10543 Indian/Christmas
+CY +3510+03322 Asia/Nicosia
+CZ +5005+01426 Europe/Prague
+DE +5230+01322 Europe/Berlin
+DJ +1136+04309 Africa/Djibouti
+DK +5540+01235 Europe/Copenhagen
+DM +1518-06124 America/Dominica
+DO +1828-06954 America/Santo_Domingo
+DZ +3647+00303 Africa/Algiers
+EC -0210-07950 America/Guayaquil mainland
+EC -0054-08936 Pacific/Galapagos Galapagos Islands
+EE +5925+02445 Europe/Tallinn
+EG +3003+03115 Africa/Cairo
+EH +2709-01312 Africa/El_Aaiun
+ER +1520+03853 Africa/Asmera
+ES +4024-00341 Europe/Madrid mainland
+ES +3553-00519 Africa/Ceuta Ceuta & Melilla
+ES +2806-01524 Atlantic/Canary Canary Islands
+ET +0902+03842 Africa/Addis_Ababa
+FI +6010+02458 Europe/Helsinki
+FJ -1808+17825 Pacific/Fiji
+FK -5142-05751 Atlantic/Stanley
+FM +0931+13808 Pacific/Yap Yap
+FM +0725+15147 Pacific/Truk Truk (Chuuk)
+FM +0658+15813 Pacific/Ponape Ponape (Pohnpei)
+FM +0519+16259 Pacific/Kosrae Kosrae
+FO +6201-00646 Atlantic/Faeroe
+FR +4852+00220 Europe/Paris
+GA +0023+00927 Africa/Libreville
+GB +512830-0001845 Europe/London Great Britain
+GB +5435-00555 Europe/Belfast Northern Ireland
+GD +1203-06145 America/Grenada
+GE +4143+04449 Asia/Tbilisi
+GF +0456-05220 America/Cayenne
+GH +0533-00013 Africa/Accra
+GI +3608-00521 Europe/Gibraltar
+GL +6411-05144 America/Godthab most locations
+GL +7646-01840 America/Danmarkshavn east coast, north of Scoresbysund
+GL +7030-02215 America/Scoresbysund Scoresbysund / Ittoqqortoormiit
+GL +7634-06847 America/Thule Thule / Pituffik
+GM +1328-01639 Africa/Banjul
+GN +0931-01343 Africa/Conakry
+GP +1614-06132 America/Guadeloupe
+GQ +0345+00847 Africa/Malabo
+GR +3758+02343 Europe/Athens
+GS -5416-03632 Atlantic/South_Georgia
+GT +1438-09031 America/Guatemala
+GU +1328+14445 Pacific/Guam
+GW +1151-01535 Africa/Bissau
+GY +0648-05810 America/Guyana
+HK +2217+11409 Asia/Hong_Kong
+HN +1406-08713 America/Tegucigalpa
+HR +4548+01558 Europe/Zagreb
+HT +1832-07220 America/Port-au-Prince
+HU +4730+01905 Europe/Budapest
+ID -0610+10648 Asia/Jakarta Java & Sumatra
+ID -0002+10920 Asia/Pontianak west & central Borneo
+ID -0507+11924 Asia/Makassar east & south Borneo, Celebes, Bali, Nusa Tengarra, west Timor
+ID -0232+14042 Asia/Jayapura Irian Jaya & the Moluccas
+IE +5320-00615 Europe/Dublin
+IL +3146+03514 Asia/Jerusalem
+IN +2232+08822 Asia/Calcutta
+IO -0720+07225 Indian/Chagos
+IQ +3321+04425 Asia/Baghdad
+IR +3540+05126 Asia/Tehran
+IS +6409-02151 Atlantic/Reykjavik
+IT +4154+01229 Europe/Rome
+JM +1800-07648 America/Jamaica
+JO +3157+03556 Asia/Amman
+JP +353916+1394441 Asia/Tokyo
+KE -0117+03649 Africa/Nairobi
+KG +4254+07436 Asia/Bishkek
+KH +1133+10455 Asia/Phnom_Penh
+KI +0125+17300 Pacific/Tarawa Gilbert Islands
+KI -0308-17105 Pacific/Enderbury Phoenix Islands
+KI +0152-15720 Pacific/Kiritimati Line Islands
+KM -1141+04316 Indian/Comoro
+KN +1718-06243 America/St_Kitts
+KP +3901+12545 Asia/Pyongyang
+KR +3733+12658 Asia/Seoul
+KW +2920+04759 Asia/Kuwait
+KY +1918-08123 America/Cayman
+KZ +4315+07657 Asia/Almaty most locations
+KZ +4448+06528 Asia/Qyzylorda Qyzylorda (Kyzylorda, Kzyl-Orda)
+KZ +5017+05710 Asia/Aqtobe Aqtobe (Aktobe)
+KZ +4431+05016 Asia/Aqtau Atyrau (Atirau, Gur'yev), Mangghystau (Mankistau)
+KZ +5113+05121 Asia/Oral West Kazakhstan
+LA +1758+10236 Asia/Vientiane
+LB +3353+03530 Asia/Beirut
+LC +1401-06100 America/St_Lucia
+LI +4709+00931 Europe/Vaduz
+LK +0656+07951 Asia/Colombo
+LR +0618-01047 Africa/Monrovia
+LS -2928+02730 Africa/Maseru
+LT +5441+02519 Europe/Vilnius
+LU +4936+00609 Europe/Luxembourg
+LV +5657+02406 Europe/Riga
+LY +3254+01311 Africa/Tripoli
+MA +3339-00735 Africa/Casablanca
+MC +4342+00723 Europe/Monaco
+MD +4700+02850 Europe/Chisinau
+MG -1855+04731 Indian/Antananarivo
+MH +0709+17112 Pacific/Majuro most locations
+MH +0905+16720 Pacific/Kwajalein Kwajalein
+MK +4159+02126 Europe/Skopje
+ML +1239-00800 Africa/Bamako southwest Mali
+ML +1446-00301 Africa/Timbuktu northeast Mali
+MM +1647+09610 Asia/Rangoon
+MN +4755+10653 Asia/Ulaanbaatar most locations
+MN +4801+09139 Asia/Hovd Bayan-Olgiy, Govi-Altai, Hovd, Uvs, Zavkhan
+MN +4804+11430 Asia/Choibalsan Dornod, Sukhbaatar
+MO +2214+11335 Asia/Macau
+MP +1512+14545 Pacific/Saipan
+MQ +1436-06105 America/Martinique
+MR +1806-01557 Africa/Nouakchott
+MS +1644-06213 America/Montserrat
+MT +3554+01431 Europe/Malta
+MU -2010+05730 Indian/Mauritius
+MV +0410+07330 Indian/Maldives
+MW -1547+03500 Africa/Blantyre
+MX +1924-09909 America/Mexico_City Central Time - most locations
+MX +2105-08646 America/Cancun Central Time - Quintana Roo
+MX +2058-08937 America/Merida Central Time - Campeche, Yucatan
+MX +2540-10019 America/Monterrey Central Time - Coahuila, Durango, Nuevo Leon, Tamaulipas
+MX +2313-10625 America/Mazatlan Mountain Time - S Baja, Nayarit, Sinaloa
+MX +2838-10605 America/Chihuahua Mountain Time - Chihuahua
+MX +2904-11058 America/Hermosillo Mountain Standard Time - Sonora
+MX +3232-11701 America/Tijuana Pacific Time
+MY +0310+10142 Asia/Kuala_Lumpur peninsular Malaysia
+MY +0133+11020 Asia/Kuching Sabah & Sarawak
+MZ -2558+03235 Africa/Maputo
+NA -2234+01706 Africa/Windhoek
+NC -2216+16530 Pacific/Noumea
+NE +1331+00207 Africa/Niamey
+NF -2903+16758 Pacific/Norfolk
+NG +0627+00324 Africa/Lagos
+NI +1209-08617 America/Managua
+NL +5222+00454 Europe/Amsterdam
+NO +5955+01045 Europe/Oslo
+NP +2743+08519 Asia/Katmandu
+NR -0031+16655 Pacific/Nauru
+NU -1901+16955 Pacific/Niue
+NZ -3652+17446 Pacific/Auckland most locations
+NZ -4357-17633 Pacific/Chatham Chatham Islands
+OM +2336+05835 Asia/Muscat
+PA +0858-07932 America/Panama
+PE -1203-07703 America/Lima
+PF -1732-14934 Pacific/Tahiti Society Islands
+PF -0900-13930 Pacific/Marquesas Marquesas Islands
+PF -2308-13457 Pacific/Gambier Gambier Islands
+PG -0930+14710 Pacific/Port_Moresby
+PH +1435+12100 Asia/Manila
+PK +2452+06703 Asia/Karachi
+PL +5215+02100 Europe/Warsaw
+PM +4703-05620 America/Miquelon
+PN -2504-13005 Pacific/Pitcairn
+PR +182806-0660622 America/Puerto_Rico
+PS +3130+03428 Asia/Gaza
+PT +3843-00908 Europe/Lisbon mainland
+PT +3238-01654 Atlantic/Madeira Madeira Islands
+PT +3744-02540 Atlantic/Azores Azores
+PW +0720+13429 Pacific/Palau
+PY -2516-05740 America/Asuncion
+QA +2517+05132 Asia/Qatar
+RE -2052+05528 Indian/Reunion
+RO +4426+02606 Europe/Bucharest
+RU +5443+02030 Europe/Kaliningrad Moscow-01 - Kaliningrad
+RU +5545+03735 Europe/Moscow Moscow+00 - west Russia
+RU +5312+05009 Europe/Samara Moscow+01 - Caspian Sea
+RU +5651+06036 Asia/Yekaterinburg Moscow+02 - Urals
+RU +5500+07324 Asia/Omsk Moscow+03 - west Siberia
+RU +5502+08255 Asia/Novosibirsk Moscow+03 - Novosibirsk
+RU +5601+09250 Asia/Krasnoyarsk Moscow+04 - Yenisei River
+RU +5216+10420 Asia/Irkutsk Moscow+05 - Lake Baikal
+RU +6200+12940 Asia/Yakutsk Moscow+06 - Lena River
+RU +4310+13156 Asia/Vladivostok Moscow+07 - Amur River
+RU +4658+14242 Asia/Sakhalin Moscow+07 - Sakhalin Island
+RU +5934+15048 Asia/Magadan Moscow+08 - Magadan
+RU +5301+15839 Asia/Kamchatka Moscow+09 - Kamchatka
+RU +6445+17729 Asia/Anadyr Moscow+10 - Bering Sea
+RW -0157+03004 Africa/Kigali
+SA +2438+04643 Asia/Riyadh
+SB -0932+16012 Pacific/Guadalcanal
+SC -0440+05528 Indian/Mahe
+SD +1536+03232 Africa/Khartoum
+SE +5920+01803 Europe/Stockholm
+SG +0117+10351 Asia/Singapore
+SH -1555-00542 Atlantic/St_Helena
+SI +4603+01431 Europe/Ljubljana
+SJ +7800+01600 Arctic/Longyearbyen Svalbard
+SJ +7059-00805 Atlantic/Jan_Mayen Jan Mayen
+SK +4809+01707 Europe/Bratislava
+SL +0830-01315 Africa/Freetown
+SM +4355+01228 Europe/San_Marino
+SN +1440-01726 Africa/Dakar
+SO +0204+04522 Africa/Mogadishu
+SR +0550-05510 America/Paramaribo
+ST +0020+00644 Africa/Sao_Tome
+SV +1342-08912 America/El_Salvador
+SY +3330+03618 Asia/Damascus
+SZ -2618+03106 Africa/Mbabane
+TC +2128-07108 America/Grand_Turk
+TD +1207+01503 Africa/Ndjamena
+TF -492110+0701303 Indian/Kerguelen
+TG +0608+00113 Africa/Lome
+TH +1345+10031 Asia/Bangkok
+TJ +3835+06848 Asia/Dushanbe
+TK -0922-17114 Pacific/Fakaofo
+TL -0833+12535 Asia/Dili
+TM +3757+05823 Asia/Ashgabat
+TN +3648+01011 Africa/Tunis
+TO -2110+17510 Pacific/Tongatapu
+TR +4101+02858 Europe/Istanbul
+TT +1039-06131 America/Port_of_Spain
+TV -0831+17913 Pacific/Funafuti
+TW +2503+12130 Asia/Taipei
+TZ -0648+03917 Africa/Dar_es_Salaam
+UA +5026+03031 Europe/Kiev most locations
+UA +4837+02218 Europe/Uzhgorod Ruthenia
+UA +4750+03510 Europe/Zaporozhye Zaporozh'ye, E Lugansk
+UA +4457+03406 Europe/Simferopol central Crimea
+UG +0019+03225 Africa/Kampala
+UM +1700-16830 Pacific/Johnston Johnston Atoll
+UM +2813-17722 Pacific/Midway Midway Islands
+UM +1917+16637 Pacific/Wake Wake Island
+US +404251-0740023 America/New_York Eastern Time
+US +421953-0830245 America/Detroit Eastern Time - Michigan - most locations
+US +381515-0854534 America/Louisville Eastern Time - Kentucky - Louisville area
+US +364947-0845057 America/Kentucky/Monticello Eastern Time - Kentucky - Wayne County
+US +394606-0860929 America/Indianapolis Eastern Standard Time - Indiana - most locations
+US +382232-0862041 America/Indiana/Marengo Eastern Standard Time - Indiana - Crawford County
+US +411745-0863730 America/Indiana/Knox Eastern Standard Time - Indiana - Starke County
+US +384452-0850402 America/Indiana/Vevay Eastern Standard Time - Indiana - Switzerland County
+US +415100-0873900 America/Chicago Central Time
+US +450628-0873651 America/Menominee Central Time - Michigan - Wisconsin border
+US +470659-1011757 America/North_Dakota/Center Central Time - North Dakota - Oliver County
+US +394421-1045903 America/Denver Mountain Time
+US +433649-1161209 America/Boise Mountain Time - south Idaho & east Oregon
+US +364708-1084111 America/Shiprock Mountain Time - Navajo
+US +332654-1120424 America/Phoenix Mountain Standard Time - Arizona
+US +340308-1181434 America/Los_Angeles Pacific Time
+US +611305-1495401 America/Anchorage Alaska Time
+US +581807-1342511 America/Juneau Alaska Time - Alaska panhandle
+US +593249-1394338 America/Yakutat Alaska Time - Alaska panhandle neck
+US +643004-1652423 America/Nome Alaska Time - west Alaska
+US +515248-1763929 America/Adak Aleutian Islands
+US +211825-1575130 Pacific/Honolulu Hawaii
+UY -3453-05611 America/Montevideo
+UZ +3940+06648 Asia/Samarkand west Uzbekistan
+UZ +4120+06918 Asia/Tashkent east Uzbekistan
+VA +4154+01227 Europe/Vatican
+VC +1309-06114 America/St_Vincent
+VE +1030-06656 America/Caracas
+VG +1827-06437 America/Tortola
+VI +1821-06456 America/St_Thomas
+VN +1045+10640 Asia/Saigon
+VU -1740+16825 Pacific/Efate
+WF -1318-17610 Pacific/Wallis
+WS -1350-17144 Pacific/Apia
+YE +1245+04512 Asia/Aden
+YT -1247+04514 Indian/Mayotte
+ZA -2615+02800 Africa/Johannesburg
+ZM -1525+02817 Africa/Lusaka
+ZW -1750+03103 Africa/Harare
diff --git a/kworldwatch/zoneclock.cpp b/kworldwatch/zoneclock.cpp
new file mode 100644
index 0000000..7b15fbc
--- /dev/null
+++ b/kworldwatch/zoneclock.cpp
@@ -0,0 +1,287 @@
+/*
+**
+** Copyright (C) 1998-2001 by Matthias Hölzer-Klüpfel <hoelzer@kde.org>
+** Maintainence has ceased - send questions to kde-devel@kde.org.
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+#include "config.h"
+
+#include <stdlib.h>
+#include <time.h>
+
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qdatetime.h>
+#include <qtimer.h>
+#include <qcombobox.h>
+#include <qlineedit.h>
+#include <qpopupmenu.h>
+
+
+#include <kglobal.h>
+#include <klocale.h>
+#include <kconfig.h>
+
+
+#include "flow.h"
+#include "clock.h"
+#include "cities.h"
+#include "zoneclock.moc"
+#include <kdebug.h>
+
+ZoneClock::ZoneClock(const QString &zone, const QString &name, QWidget *parent, const char *n)
+ : QFrame(parent, n), _zone(zone), _name(name)
+{
+ setFrameStyle(QFrame::Panel | QFrame::Raised);
+ QHBoxLayout *hbox = new QHBoxLayout(this, 2,2);
+
+ _name.append(":");
+ _nameLabel = new QLabel(_name, this);
+ hbox->addWidget(_nameLabel, 1);
+ hbox->addSpacing(4);
+
+ _timeLabel = new QLabel(this);
+ hbox->addWidget(_timeLabel, 0, Qt::AlignRight);
+
+ _popup = new QPopupMenu(this);
+ _popup->insertItem(i18n("&Edit..."), this, SLOT(editClock()));
+ _popup->insertItem(i18n("&Add..."), this, SLOT(slotAddClock()));
+ _popup->insertItem(i18n("&Remove"), this, SLOT(slotRemoveClock()));
+
+ _nameLabel->installEventFilter(this);
+ _timeLabel->installEventFilter(this);
+
+ updateTime();
+}
+
+
+void ZoneClock::slotRemoveClock()
+{
+ // Note: this is stupid, but we can't get us deleted
+ // from this slot, as we would return and crash.
+ // So instead we fire up an idle event triggering the delete
+ // after the return.
+
+ QTimer::singleShot(0, this, SLOT(removeTimeout()));
+}
+
+
+void ZoneClock::removeTimeout()
+{
+ emit removeMe(this);
+}
+
+
+void ZoneClock::slotAddClock()
+{
+ emit addClock(_zone);
+}
+
+
+void ZoneClock::editClock()
+{
+ ClockDialog *_dlg = new ClockDialog(this, 0, true);
+ CityList cities;
+ QStringList timezones = cities.timezones();
+ for (QStringList::iterator it = timezones.begin(); it != timezones.end(); ++it)
+ _dlg->ClockZone->insertItem(i18n((*it).utf8()));
+
+ _dlg->ClockCaption->setText(_nameLabel->text().left(_nameLabel->text().length()-1));
+ for (int i=0; i<_dlg->ClockZone->count(); ++i)
+ if (_dlg->ClockZone->text(i) == i18n(_zone.utf8()))
+ {
+ _dlg->ClockZone->setCurrentItem(i);
+ break;
+ }
+
+ if (_dlg->exec() == QDialog::Accepted)
+ {
+ _zone = timezones[_dlg->ClockZone->currentItem()];
+ _name = _dlg->ClockCaption->text().append(":");
+ _nameLabel->setText(_dlg->ClockCaption->text().append(":"));
+ updateTime();
+ layout()->invalidate();
+ emit changed();
+ }
+
+ delete _dlg;
+}
+
+
+bool ZoneClock::eventFilter(QObject *obj, QEvent *ev)
+{
+ if (ev->type() == QEvent::MouseButtonPress)
+ {
+ QMouseEvent *e = (QMouseEvent*)ev;
+ if (e->button() == QMouseEvent::RightButton)
+ _popup->exec(e->globalPos());
+ }
+
+ return QFrame::eventFilter(obj, ev);
+}
+
+
+void ZoneClock::updateTime()
+{
+ char *initial_TZ = getenv("TZ");
+ setenv("TZ", _zone.latin1(), 1);
+ tzset();
+
+ time_t t = time(NULL);
+ QDateTime dt;
+ dt.setTime_t(t);
+ _timeLabel->setText(QString("%1, %2").arg(KGlobal::locale()->formatTime(dt.time(), true)).arg(KGlobal::locale()->formatDate(dt.date(), true)));
+
+ if (initial_TZ != 0)
+ setenv("TZ", initial_TZ, 1);
+ else
+ unsetenv("TZ");
+ tzset();
+}
+
+
+ZoneClockPanel::ZoneClockPanel(QWidget *parent, const char *name)
+ : QFrame(parent, name), _dlg(0)
+{
+ _flow = new SimpleFlow(this,1,1);
+
+ QTimer *t = new QTimer(this);
+
+ connect(t, SIGNAL(timeout()), this, SLOT(updateTimer()));
+ t->start(500);
+
+ _clocks.setAutoDelete(true);
+}
+
+
+void ZoneClockPanel::createDialog()
+{
+ if (!_dlg)
+ {
+ _dlg = new ClockDialog(this, 0, true);
+ CityList cities;
+ QStringList timezones = cities.timezones();
+ for (QStringList::iterator it = timezones.begin(); it != timezones.end(); ++it)
+ _dlg->ClockZone->insertItem(i18n((*it).utf8()));
+ }
+}
+
+
+void ZoneClockPanel::addClock(const QString &zone, const QString &name)
+{
+ // add the clocks
+ ZoneClock *zc = new ZoneClock(zone, name, this);
+ _flow->add(zc);
+ _clocks.append(zc);
+ zc->show();
+
+ realign();
+
+ connect(zc, SIGNAL(addClock(const QString &)), this, SLOT(addClock(const QString &)));
+ connect(zc, SIGNAL(changed()), this, SLOT(realign()));
+ connect(zc, SIGNAL(removeMe(ZoneClock *)), this, SLOT(removeClock(ZoneClock *)));
+}
+
+
+void ZoneClockPanel::removeClock(ZoneClock *clock)
+{
+ _clocks.remove(clock);
+ realign();
+}
+
+
+void ZoneClockPanel::realign()
+{
+ // realign the labels
+ int w = 0;
+ QPtrListIterator<ZoneClock> it(_clocks);
+ for ( ; it.current(); ++it)
+ if (it.current()->sizeHint().width() > w)
+ w = it.current()->sizeHint().width();
+ it.toFirst();
+ for ( ; it.current(); ++it)
+ it.current()->setFixedWidth(w);
+}
+
+
+void ZoneClockPanel::updateTimer()
+{
+ QPtrListIterator<ZoneClock> it(_clocks);
+ for ( ; it.current(); ++it)
+ it.current()->updateTime();
+}
+
+void ZoneClockPanel::addClock(const QString &zone)
+{
+ createDialog();
+
+ _dlg->ClockCaption->setText(i18n(zone.utf8()).section('/', -1));
+ for (int i=0; i<_dlg->ClockZone->count(); ++i)
+ if (_dlg->ClockZone->text(i) == i18n(zone.utf8()))
+ {
+ _dlg->ClockZone->setCurrentItem(i);
+ break;
+ }
+
+ if (_dlg->exec() == QDialog::Accepted)
+ {
+ CityList cities;
+ QStringList timezones = cities.timezones();
+ QString newzone = timezones[_dlg->ClockZone->currentItem()];
+ addClock(newzone, _dlg->ClockCaption->text());
+ update();
+ }
+}
+
+
+void ZoneClockPanel::save(KConfig *config)
+{
+ config->writeEntry("Clocks", _clocks.count());
+
+ QPtrListIterator<ZoneClock> it(_clocks);
+ int cnt=0;
+ for ( ; it.current(); ++it)
+ {
+ QString n = it.current()->name();
+ n = n.left(n.length()-1);
+ config->writeEntry(QString("Clock_%1_Name").arg(cnt), n);
+ config->writeEntry(QString("Clock_%1_Zone").arg(cnt), it.current()->zone());
+ cnt++;
+ }
+}
+
+
+void ZoneClockPanel::load(KConfig *config)
+{
+ _clocks.clear();
+
+ int num = config->readNumEntry("Clocks", 0);
+
+ for (int i=0; i<num; ++i)
+ {
+ addClock(config->readEntry(QString("Clock_%1_Zone").arg(i)), config->readEntry(QString("Clock_%1_Name").arg(i)));
+ }
+}
+
diff --git a/kworldwatch/zoneclock.h b/kworldwatch/zoneclock.h
new file mode 100644
index 0000000..50a6768
--- /dev/null
+++ b/kworldwatch/zoneclock.h
@@ -0,0 +1,134 @@
+/*
+**
+** Copyright (C) 1998-2001 by Matthias Hölzer-Klüpfel <hoelzer@kde.org>
+** Maintainence has ceased - send questions to kde-devel@kde.org.
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+#ifndef ZONECLOCK_H
+#define ZONECLOCK_H
+
+
+#include <qwidget.h>
+#include <qstring.h>
+#include <qframe.h>
+#include <qptrlist.h>
+
+
+class QLabel;
+class SimpleFlow;
+class KConfig;
+
+
+class ClockDialog;
+
+
+class ZoneClock : public QFrame
+{
+ Q_OBJECT
+
+public:
+
+ ZoneClock(const QString &zone, const QString &name, QWidget *parent=0, const char *n=0);
+
+
+ QString zone() const { return _zone; };
+ void setZone(const QString &z) { _zone = z; updateTime(); };
+
+ QString name() const { return _name; };
+ void setName( const QString &n) { _name = n; updateTime(); };
+
+
+signals:
+
+ void removeMe(ZoneClock *t);
+ void addClock(const QString &zone);
+ void changed();
+
+
+public slots:
+
+ void updateTime();
+
+
+protected:
+
+ virtual bool eventFilter(QObject *, QEvent *);
+
+
+private slots:
+
+ void editClock();
+ void slotRemoveClock();
+ void removeTimeout();
+ void slotAddClock();
+
+
+private:
+
+ QString _zone;
+ QString _name;
+ QLabel *_timeLabel, *_nameLabel;
+ QPopupMenu *_popup;
+
+};
+
+
+class ZoneClockPanel : public QFrame
+{
+ Q_OBJECT
+
+public:
+
+ ZoneClockPanel(QWidget *parent=0, const char *name=0);
+
+ void addClock(const QString &zone, const QString &name);
+
+ void save(KConfig *config);
+ void load(KConfig *config);
+
+
+public slots:
+
+ void addClock(const QString &zone);
+
+
+private slots:
+
+ void updateTimer();
+ void realign();
+ void removeClock(ZoneClock *);
+
+
+private:
+
+ void createDialog();
+
+ SimpleFlow *_flow;
+ QPtrList<ZoneClock> _clocks;
+ ClockDialog *_dlg;
+
+};
+
+
+#endif