From 2ef48967b5ebfa7a88b03030434a058b5c5ee1c1 Mon Sep 17 00:00:00 2001 From: coulisse Date: Sat, 2 Dec 2023 09:29:26 +0100 Subject: [PATCH] callsign and propagation --- CITATION.cff | 4 +- README.md | 9 +- cfg/config.json.template | 1 + cfg/modes.json | 101 ++++- cfg/version.txt | 2 +- docs/CHANGELOG.md | 16 +- lib/config.py | 4 - requirements.txt | 1 + scripts/.gitignore | 1 + scripts/build.sh | 10 +- static/css/dev/style.css | 101 ++++- static/css/rel/style.min.css | 2 +- static/data/cty_wt_mod.dat | 617 +++++++++++++-------------- static/js/dev/callsign_search.js | 10 +- static/js/dev/index_inline.js | 30 +- static/js/dev/table.js | 59 +-- static/js/rel/callsign_search.min.js | 2 +- static/js/rel/index_inline.min.js | 2 +- static/js/rel/table.min.js | 2 +- static/pwa/manifest.webmanifest | 2 +- static/pwa/service-worker.js | 2 +- templates/_base.html | 16 +- templates/index.html | 14 +- templates/propagation.html | 213 +++++++++ test.sh | 1 + webapp.py | 124 +++++- webapp.py.old | 611 ++++++++++++++++++++++++++ webapp_sanit.py.old | 617 +++++++++++++++++++++++++++ 28 files changed, 2187 insertions(+), 387 deletions(-) create mode 100644 scripts/.gitignore create mode 100644 templates/propagation.html create mode 100644 webapp.py.old create mode 100644 webapp_sanit.py.old diff --git a/CITATION.cff b/CITATION.cff index 642d93b..e29081e 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -24,5 +24,5 @@ keywords: - dxcluster - spiderweb license: GPL-3.0 -version: v2.4.5.72 -date-released: 2023-11-18 +version: v2.5 +date-released: 2023-12-02 diff --git a/README.md b/README.md index c2d8481..fe87fe5 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ [![CodeFactor](https://www.codefactor.io/repository/github/coulisse/spiderweb/badge)](https://www.codefactor.io/repository/github/coulisse/spiderweb) -- **Release:** v2.4.5.72 +- **Release:** v2.5 - **Author:** Corrado Gerbaldo - [IU1BOW](https://www.qrz.com/db/IU1BOW) - **Mail:** - **Licensing:** Gpl V3.0 see [LICENSE](LICENSE) file. @@ -27,6 +27,9 @@ For this application, I've used: - **flag-icon-css** [https://github.com/lipis/flag-icon-css](https://github.com/lipis/flag-icon-css) I used it to show the country flags - **ng3k.com** [ng3k.com](http://ng3k.com/misc/adxo.html) I used to get information about "Announced Dx Operations". Thanks to Bill/NG3K !!! - **silso** [sidc.be/silso](https://sidc.be/silso/) used to show propagation trend in "Chart & stats" section +- **hamqsl** [www.hamqsl.com/solar.html](https://www.hamqsl.com/solar.html/) used to show solar and band conditions +- **kc2g** [prop.kc2g.com](https://prop.kc2g.com/) used to show MUF map + You can find my web site at [https://www.iu1bow.it](https://www.i1bow.it) @@ -221,11 +224,11 @@ This application is designed for desktop and mobile phone. It is a [PWA](https:/ ### API **Spot list** -You can retrieve last spots calling "**/spotlist**"; For example [www.iu1bow.com/spotlist](https://www.iu1bow.com/spotlist) +You can retrieve last spots calling "**/spotlist**"; For example [www.iu1bow.it/spotlist](https://www.iu1bow.it/spotlist) **Country of a callsign** -You can retrive some information about a callsign with **callsign**; for example: [www.iu1bow.com/callsign?c=IU1BOW](https://www.iu1bow.com/callsign?c=IU1BOW) +You can retrive some information about a callsign with **callsign**; for example: [www.iu1bow.it/callsign?c=IU1BOW](https://www.iu1bow.it/callsign?c=IU1BOW) ### Development diff --git a/cfg/config.json.template b/cfg/config.json.template index 9629d22..060a986 100644 --- a/cfg/config.json.template +++ b/cfg/config.json.template @@ -21,6 +21,7 @@ "menu": { "menu_list": [ {"label":"Charts & stats", "link": "/plots.html", "external": false}, + {"label": "Propagation", "link": "/propagation.html", "external": false}, {"label":"Sources", "link": "https://github.com/coulisse/spiderweb/" , "external": true}, {"label":"Cookies", "link": "/cookies.html", "external": false}, {"label":"Privacy", "link": "/privacy.html", "external": false} diff --git a/cfg/modes.json b/cfg/modes.json index ad27776..aa71625 100644 --- a/cfg/modes.json +++ b/cfg/modes.json @@ -44,7 +44,7 @@ "max": 50312.9 }, { - "min": 50314.0, + "min": 50313.1, "max": 50499.9 }, { @@ -99,6 +99,7 @@ "min": 47087000, "max": 47089000 } + ] }, { @@ -148,10 +149,6 @@ "min": 28180.0, "max": 28180.0 }, - { - "min": 50313.0, - "max": 50313.9 - }, { "min": 50500.0, "max": 51000.0 @@ -199,6 +196,10 @@ }, { "min": 50100, + "max": 50312.9 + }, + { + "min": 50313.1, "max": 50500 }, { @@ -250,6 +251,96 @@ "max": 47089000 } ] + }, + { + "id": "digi-ft8", + "freq": [ + { + "min": 1840.0, + "max": 1841.0 + }, + { + "min": 3573.0, + "max": 3574.0 + }, + { + "min": 7074.0, + "max": 7075.0 + }, + { + "min": 10136.0, + "max": 10137.0 + }, + { + "min": 14074.0, + "max": 14075.0 + }, + { + "min": 18100.0, + "max": 18101.0 + }, + { + "min": 21074.0, + "max": 21075.0 + }, + { + "min": 24915.0, + "max": 24916.0 + }, + { + "min": 28074.0, + "max": 28075.0 + }, + { + "min": 50313.0, + "max": 50314.0 + } + ] + }, + { + "id": "digi-ft4", + "freq": [ + { + "min": 3568.0, + "max": 3569.0 + }, + { + "min": 3575.0, + "max": 3576.0 + }, + { + "min": 7047.5, + "max": 7048.5 + }, + { + "min": 10140.0, + "max": 10141.0 + }, + { + "min": 14080.0, + "max": 14081.0 + }, + { + "min": 18104.0, + "max": 18105.0 + }, + { + "min": 21140.0, + "max": 21141.0 + }, + { + "min": 24919.0, + "max": 24920.0 + }, + { + "min": 28180.0, + "max": 28181.0 + }, + { + "min": 50318.0, + "max": 50319.0 + } + ] } ] } \ No newline at end of file diff --git a/cfg/version.txt b/cfg/version.txt index 0a1eb26..0d81cd0 100644 --- a/cfg/version.txt +++ b/cfg/version.txt @@ -1 +1 @@ -v2.4.5.72 +v2.5 \ No newline at end of file diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 8034af1..5a67ecd 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,15 +1,20 @@ ### Change log -Date: 18/11/2023 -Release: v2.4.5.72 -- security issue #46 +Date: 02/12/2023 +Release: v2.5 +- security issue #46. - csp report +- Added esclusion for FT4 and FT8. Thanks to HB9VVQ +- Added filter on dx spot callsings. Thanks to HB9VVQ. Issue [#39](https://github.com/coulisse/spiderweb/issues/39). +- Sanitized callsign input +- Added propagation page with MUF Map. Issue [#27](https://github.com/coulisse/spiderweb/issues/27). Thanks to Paul Herman and Andrew Rodland + ___ Date: 12/11/2023 Release: v2.4.5.1 - managed telnet password -- issue #34 -- issue #38 +- issue [#34](https://github.com/coulisse/spiderweb/issues/34) +- issue [#38](https://github.com/coulisse/spiderweb/issues/38) ___ Date: 11/11/2023 @@ -33,7 +38,6 @@ Release: v2.4.4 ___ Date: 11/02/2023 ->>>>>>> staging Release: v2.4.2 - changed cache-control header - fixed Layout scrolling (SEO) diff --git a/lib/config.py b/lib/config.py index 871fde4..311b60e 100644 --- a/lib/config.py +++ b/lib/config.py @@ -222,10 +222,6 @@ def menu_input_entry(entry, new_entry): while external != "y" and external != "n": external = str(user_input("open link external [y/n]: ")).lower() - # if external == 'y': - # external = True - # else: - # external = False external = is_external(external) entry["label"] = label diff --git a/requirements.txt b/requirements.txt index 389d2f7..d1a9ed6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -25,4 +25,5 @@ tzdata==2023.3 urllib3==2.0.7 Werkzeug==3.0.1 WTForms==3.1.1 +xmltodict==0.13.0 xxhash==3.4.1 diff --git a/scripts/.gitignore b/scripts/.gitignore new file mode 100644 index 0000000..66810a4 --- /dev/null +++ b/scripts/.gitignore @@ -0,0 +1 @@ +*report.html diff --git a/scripts/build.sh b/scripts/build.sh index c2e484f..9b40f69 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -138,7 +138,7 @@ if [ "$1" == "-r" ]; then sed -i 's/mysql-connector-python==8.0.31/mysql-connector-python>=8.0.31/' ../requirements.txt sed -i 's/mysql-connector-python==8.2.0/mysql-connector-python>=8.2.0/' ../requirements.txt - if ! sed -i '13,20s/level=DEBUG/level=INFO/g' ${app_ini}; then + if ! sed -i '7,25s/level=DEBUG/level=INFO/g' ${app_ini}; then echo 'ERROR settimg loglevel=INFO ' exit 12 fi @@ -148,7 +148,7 @@ if [ "$1" == "-d" ]; then echo 'creating DEBUG application' html_change_references -d - if ! sed -i '13,20s/level=INFO/level=DEBUG/g' ${app_ini}; then + if ! sed -i '7,25s/level=INFO/level=DEBUG/g' ${app_ini}; then echo 'ERROR settimg loglevel=DEBUG ' exit 12 fi @@ -169,12 +169,12 @@ echo 'get version from version.txt' #if ! ver=$(git tag|tail -1) if ! ver=$(head -1 ../cfg/version.txt) then - echo 'ERROR on get version from git' + echo 'ERROR on get version' exit 10 fi if [ ${ver} == "" ]; then - echo 'ERROR git version is empty' + echo 'ERROR version is empty' exit 20 fi echo 'version: '${ver} @@ -275,6 +275,8 @@ if [ "$2" == "-c" ]; then if [ "$1" == "-r" ]; then echo '*** SPIDERWEB commit process ***' + head -10 ../docs/CHANGELOG.md + read -p "Do you want to proceed to commit version ${ver} (yes/no) " yn case $yn in diff --git a/static/css/dev/style.css b/static/css/dev/style.css index a04e300..83a2cb4 100644 --- a/static/css/dev/style.css +++ b/static/css/dev/style.css @@ -37,6 +37,10 @@ } } +#form-filters { + max-width: 360px; +} + .img-flag { background-color: white; border: 1px solid #ddd; @@ -53,7 +57,6 @@ box-shadow: 0 2px 10px rgba(0, 0, 0, .5), 0 2px 3px rgba(0, 0, 0, .5); } - .ipcs { background-image: url("/static/images/background.webp"); background-size: cover; @@ -92,6 +95,8 @@ span.search-callsign { margin-top: 5px; } +/* Chart & stats */ + #dashboard { padding: 10px; gap: 10px; @@ -123,4 +128,96 @@ span.search-callsign { right: 20px; display: none; opacity: 0.7; - } \ No newline at end of file + } + + + /* propagation */ +.icon { + float: right; + font-size:500%; + position: absolute; + top:0rem; + right:-0.3rem; + opacity: .16; + } + +.grey-dark { + background: #495057; + color: #efefef; +} + +.no-good2 { + background: linear-gradient(180deg, rgba(207,82,82,1) 0%, rgba(121,9,9,1) 80%); + color: #fff; +} + +.no-good { + background: #a83b3b; + color: #fff; +} + +.good { + background: #1f7205; + color: #fff; +} + +.medium { + background: #ffc241; + color:#495057; +} + +.kpi-card { + overflow: hidden; + position: relative; + box-shadow: 1px 1px 3px rgba(0,0,0,0.75);; + display: inline-block; + padding: 1em; + border-radius: 0; + font-family: sans-serif; + width: 170px; + height: 170px; + min-height: 80px; + min-width: 80px; + margin-left: 0.5em; + margin-top: 0.5em; +} + +.card-value { + display: block; + font-size: 200%; + font-weight: bolder; +} + +.card-text { + display:block; + font-size: 100%; + padding-left: 0.2em; +} + +#propagation-wrapper { + width: 100%; + display: flex; + flex-wrap: wrap; +} + +#card-container { + width: 80%; + display: flex; + flex-wrap: wrap; +} + +#muf-container { + margin: auto; +} + +#solar-data-updated-txt { + font-size: 14px; +} + + +.ts-wrapper.multi .ts-control .item { + background: #15539e; + color: #fff; + border-radius: 3px; +} + diff --git a/static/css/rel/style.min.css b/static/css/rel/style.min.css index 1ebd891..14ecbbc 100644 --- a/static/css/rel/style.min.css +++ b/static/css/rel/style.min.css @@ -1 +1 @@ -@import url("https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.3/font/bootstrap-icons.css");@font-face{font-display:swap;font-family:bootstrap-icons}.badge-responsive{width:70px}@media screen and (max-width:768px){.text-responsive{font-size:12px}.badge-responsive{width:40px}#collapseFilters.collapsing{position:absolute!important;z-index:20}#collapseFilters.collapse.show{display:block;position:absolute;z-index:20}.navbar-collapse{max-height:none!important}}.img-flag{background-color:#fff;background-size:cover!important;border:1px solid #ddd;border-radius:2px;-webkit-box-shadow:0 2px 10px rgba(0,0,0,.5),0 2px 3px rgba(0,0,0,.5);-moz-box-shadow:0 2px 10px rgba(0,0,0,.5),0 2px 3px rgba(0,0,0,.5);-o-box-shadow:0 2px 10px rgba(0,0,0,.5),0 2px 3px rgba(0,0,0,.5);box-shadow:0 2px 10px rgba(0,0,0,.5),0 2px 3px rgba(0,0,0,.5);height:19px!important;max-height:auto;max-width:auto;padding:3px;width:32px!important}.ipcs{background-image:url(/static/images/background.webp);background-repeat:no-repeat;background-size:cover}.copyleft{display:inline-block;transform:rotate(180deg)}span.search-callsign{background:url(/static/images/search-callsign.svg) no-repeat 0 0;background-size:contain;cursor:pointer;display:inline-block;height:16px;width:20px}#input-group-callsign{margin-bottom:.5rem;margin-right:1rem}#collapseFilters{background-color:#dde2e6;margin-top:10px}#spotsTable{margin-top:10px}#band{margin-top:5px}#dashboard{gap:10px;padding:10px}#telnet-thead{position:sticky;top:0}#chart-band_activity{height:400px;width:100%}.spider_chart{height:480px;width:600px}#silo-propagation-img{height:auto;width:95%}#btn-back-to-top{bottom:20px;display:none;opacity:.7;position:fixed;right:20px} \ No newline at end of file +@import url("https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.3/font/bootstrap-icons.css");@font-face{font-display:swap;font-family:bootstrap-icons}.badge-responsive{width:70px}@media screen and (max-width:768px){.text-responsive{font-size:12px}.badge-responsive{width:40px}#collapseFilters.collapsing{position:absolute!important;z-index:20}#collapseFilters.collapse.show{display:block;position:absolute;z-index:20}.navbar-collapse{max-height:none!important}}#form-filters{max-width:360px}.img-flag{background-color:#fff;background-size:cover!important;border:1px solid #ddd;border-radius:2px;-webkit-box-shadow:0 2px 10px rgba(0,0,0,.5),0 2px 3px rgba(0,0,0,.5);-moz-box-shadow:0 2px 10px rgba(0,0,0,.5),0 2px 3px rgba(0,0,0,.5);-o-box-shadow:0 2px 10px rgba(0,0,0,.5),0 2px 3px rgba(0,0,0,.5);box-shadow:0 2px 10px rgba(0,0,0,.5),0 2px 3px rgba(0,0,0,.5);height:19px!important;max-height:auto;max-width:auto;padding:3px;width:32px!important}.ipcs{background-image:url(/static/images/background.webp);background-repeat:no-repeat;background-size:cover}.copyleft{display:inline-block;transform:rotate(180deg)}span.search-callsign{background:url(/static/images/search-callsign.svg) no-repeat 0 0;background-size:contain;cursor:pointer;display:inline-block;height:16px;width:20px}#input-group-callsign{margin-bottom:.5rem;margin-right:1rem}#collapseFilters{background-color:#dde2e6;margin-top:10px}#spotsTable{margin-top:10px}#band{margin-top:5px}#dashboard{gap:10px;padding:10px}#telnet-thead{position:sticky;top:0}#chart-band_activity{height:400px;width:100%}.spider_chart{height:480px;width:600px}#silo-propagation-img{height:auto;width:95%}#btn-back-to-top{bottom:20px;display:none;opacity:.7;position:fixed;right:20px}.icon{float:right;font-size:500%;opacity:.16;position:absolute;right:-.3rem;top:0}.grey-dark{background:#495057;color:#efefef}.no-good2{background:linear-gradient(180deg,#cf5252,#790909 80%);color:#fff}.no-good{background:#a83b3b;color:#fff}.good{background:#1f7205;color:#fff}.medium{background:#ffc241;color:#495057}.kpi-card{border-radius:0;box-shadow:1px 1px 3px rgba(0,0,0,.75);display:inline-block;font-family:sans-serif;height:170px;margin-left:.5em;margin-top:.5em;min-height:80px;min-width:80px;overflow:hidden;padding:1em;position:relative;width:170px}.card-value{display:block;font-size:200%;font-weight:bolder}.card-text{display:block;font-size:100%;padding-left:.2em}#propagation-wrapper{display:flex;flex-wrap:wrap;width:100%}#card-container{display:flex;flex-wrap:wrap;width:80%}#muf-container{margin:auto}#solar-data-updated-txt{font-size:14px}.ts-wrapper.multi .ts-control .item{background:#15539e;border-radius:3px;color:#fff} \ No newline at end of file diff --git a/static/data/cty_wt_mod.dat b/static/data/cty_wt_mod.dat index b9dd538..1c97b37 100644 --- a/static/data/cty_wt_mod.dat +++ b/static/data/cty_wt_mod.dat @@ -1,6 +1,6 @@ # -# RELEASE 2023.11.03.00 -# based on CTY-3337 +# RELEASE 2023.11.21.00 +# based on CTY-3338 # # ADIF 246 Sov Mil Order of Malta: 15: 28: EU: 41.90: -12.43: -1.0: 1A: @@ -37,7 +37,7 @@ Conway Reef: 32: 56: OC: -22.00: -175.00: -12.0: 3D2/c: =3D2CR; # ADIF 460 Rotuma Island: 32: 56: OC: -12.48: -177.08: -12.0: 3D2/r: - =3D2RAT,=3D2RI; + =3D2RI; # ADIF 468 Kingdom of Eswatini: 38: 57: AF: -26.65: -31.48: -2.0: 3DA: 3DA; @@ -148,7 +148,7 @@ Jamaica: 08: 11: NA: 18.20: 77.47: 5.0: 6Y: Yemen: 21: 39: AS: 15.65: -48.12: -3.0: 7O: 7O, # Socotra - =7O8AD(37)[48]<12.50/-53.92>,=7O8AE(37)[48]<12.50/-53.92>; + =7O73T(37)[48]<12.50/-53.92>,=7O8AD(37)[48]<12.50/-53.92>,=7O8AE(37)[48]<12.50/-53.92>; # ADIF 432 Lesotho: 38: 57: AF: -29.22: -27.88: -2.0: 7P: 7P; @@ -191,8 +191,7 @@ West Malaysia: 28: 54: AS: 3.95: -102.23: -8.0: 9M2: # ADIF 46 East Malaysia: 28: 54: OC: 2.68: -113.32: -8.0: 9M6: # Sabah - 9M6<5.25/-117.00>,9W6<5.25/-117.00>,=9M4CBP<5.25/-117.00>,=9M4CKT<5.25/-117.00>, - =9M4CRP<5.25/-117.00>, + 9M6<5.25/-117.00>,9W6<5.25/-117.00>,=9M4CKT<5.25/-117.00>,=9M4CRP<5.25/-117.00>, # Sarawak 9M8<2.80/-113.88>,9W8<2.80/-113.88>; # ADIF 369 @@ -1833,7 +1832,7 @@ Antarctica: 13: 74: SA: -90.00: 0.00: 0.0: CE9: # Vostok Station =RI1ANC(29)[70]<-78.47/-106.80>, # Akademik Vernadsky Station - =EM1/UW5EHR[73]<-65.23/64.25>,=EM1U[73]<-65.23/64.25>,=VP8/UW5EHR[73]<-65.23/64.25>, + =EM1/UW5EHR[73]<-65.23/64.25>,=EM1U[73]<-65.23/64.25>, # Byrd Station =KC4USB(12)<-80.02/119.53>, # Amundsen-Scott South Pole Station @@ -1897,7 +1896,7 @@ Madeira Islands: 33: 36: AF: 32.75: 16.95: 0.0: CT3: CQ2,CQ3,CQ9,CR3,CR9,CS3,CS9,CT3,CT9; # ADIF 149 Azores: 14: 36: EU: 38.70: 27.23: 1.0: CU: - CQ1,CQ8,CR1,CR2,CR8,CS4,CS8,CT8,CU, + CQ1,CQ8,CR1,CR2,CR8,CS4,CS8,CT8,CU,=VERSION, # Santa Maria CU1<36.95/25.15>, # Sao Miguel @@ -2139,7 +2138,6 @@ Spain: 14: 37: EU: 40.32: 3.43: -1.0: EA: # BI-HU-NA-SS-TE-VI-Z AM2<42.60/1.93>,AN2<42.60/1.93>,AO2<42.60/1.93>,EA2<42.60/1.93>,EB2<42.60/1.93>,EC2<42.60/1.93>, ED2<42.60/1.93>,EE2<42.60/1.93>,EF2<42.60/1.93>,EG2<42.60/1.93>,EH2<42.60/1.93>, - =EA2EZ/P<42.60/1.93>, # Catalonia AM3<41.68/-1.90>,AN3<41.68/-1.90>,AO3<41.68/-1.90>,EA3<41.68/-1.90>,EB3<41.68/-1.90>, EC3<41.68/-1.90>,ED3<41.68/-1.90>,EE3<41.68/-1.90>,EF3<41.68/-1.90>,EG3<41.68/-1.90>, @@ -2147,7 +2145,6 @@ Spain: 14: 37: EU: 40.32: 3.43: -1.0: EA: # BA-CC-CR-CU-GU-M-TO AM4<40.18/3.93>,AN4<40.18/3.93>,AO4<40.18/3.93>,EA4<40.18/3.93>,EB4<40.18/3.93>,EC4<40.18/3.93>, ED4<40.18/3.93>,EE4<40.18/3.93>,EF4<40.18/3.93>,EG4<40.18/3.93>,EH4<40.18/3.93>, - =EA6XQ/P<40.18/3.93>, # A-AB-CS-MU-V AM5<38.87/0.97>,AN5<38.87/0.97>,AO5<38.87/0.97>,EA5<38.87/0.97>,EB5<38.87/0.97>,EC5<38.87/0.97>, ED5<38.87/0.97>,EE5<38.87/0.97>,EF5<38.87/0.97>,EG5<38.87/0.97>,EH5<38.87/0.97>, @@ -2158,12 +2155,12 @@ Spain: 14: 37: EU: 40.32: 3.43: -1.0: EA: =EA9HU<37.25/4.68>,=EA9LZ/P<37.25/4.68>; # ADIF 21 Balearic Islands: 14: 37: EU: 39.60: -2.95: -1.0: EA6: - AM6,AN6,AO6,EA6,EB6,EC6,ED6,EE6,EF6,EG6,EH6,=AO30MRB; + AM6,AN6,AO6,EA6,EB6,EC6,ED6,EE6,EF6,EG6,EH6,=AO30MRB,=EA6XQ/P; # ADIF 29 Canary Islands: 33: 36: AF: 28.32: 15.85: 0.0: EA8: AM8,AN8,AO8,EA8,EB8,EC8,ED8,EE8,EF8,EG8,EH8, # Las Palmas de Gran Canaria - =EA1AP/8<28.15/15.42>; + =EA1AP/8<28.15/15.42>,=EC5AHA<28.15/15.42>; # ADIF 32 Ceuta & Melilla: 33: 37: AF: 35.90: 5.27: -1.0: EA9: AM9,AN9,AO9,EA9,EB9,EC9,ED9,EE9,EF9,EG9,EH9, @@ -2294,7 +2291,7 @@ Clipperton Island: 07: 10: NA: 10.28: 109.22: 8.0: FO/c: =TX5P; # ADIF 509 Marquesas Islands: 31: 63: OC: -8.92: 140.07: 9.5: FO/m: - =FO5QS,=TX7L; + =FO/F5JRX,=FO5QS,=TX7L; # ADIF 277 St. Pierre & Miquelon: 05: 09: NA: 46.77: 56.20: 3.0: FP: FP; @@ -2332,7 +2329,7 @@ Wallis & Futuna Islands: 32: 62: OC: -13.30: 176.20: -12.0: FW: FW,TW; # ADIF 63 French Guiana: 09: 12: SA: 4.00: 53.00: 3.0: FY: - FY,=TO1A; + FY,=TO1A,=TO2FY; # ADIF 223 England: 14: 27: EU: 52.77: 1.47: 0.0: G: 2E,G,M; @@ -2341,29 +2338,28 @@ Isle of Man: 14: 27: EU: 54.20: 4.53: 0.0: GD: 2D,GD,GT,MD,MT; # ADIF 265 Northern Ireland: 14: 27: EU: 54.73: 6.68: 0.0: GI: - 2I,GI,GN,MI,MN,=GB2DMR,=GB9AFD; + 2I,GI,GN,MI,MN,=GB8LWF,=GB9AFD; # ADIF 122 Jersey: 14: 27: EU: 49.22: 2.18: 0.0: GJ: 2J,GH,GJ,MH,MJ; # ADIF 279 Scotland: 14: 27: EU: 56.82: 4.18: 0.0: GM: - 2A,2M,GM,GS,MA,MM,MS,=GB0FFS,=GB0GDS,=GB0OZE,=GB0SSB,=GB0WRH,=GB2CM,=GB2ELH,=GB2KDR,=GB2LO, - =GB2OWM,=GB3ANG,=GB3LER,=GB3LER/B,=GB3RMK/B,=GB4LER,=GB5KCD,=GB6WLS; + 2A,2M,GM,GS,MA,MM,MS,=GB0FFS,=GB0GDS,=GB0OZE,=GB0SSB,=GB2BD,=GB2CM,=GB2ELH,=GB2LO,=GB2OWM,=GB3ANG, + =GB3LER,=GB3LER/B,=GB3RMK/B,=GB4LER,=GB6WLS; # ADIF 279 Shetland Islands: 14: 27: EU: 60.50: 1.50: 0.0: *GM/s: =2M0BDR,=2M0BDT,=2M0CPN,=2M0GFC,=2M0SEG,=2M0SPX,=2M0ZET,=GB2ELH,=GB3LER,=GB3LER/B,=GB4LER,=GM0AVR, =GM0CXQ,=GM0EKM,=GM0GFL,=GM0ILB,=GM0JDB,=GM1FGN,=GM1KKI,=GM1ZNR,=GM3WHT,=GM3ZET,=GM4IPK,=GM4JPI, =GM4LBE,=GM4LER,=GM4PXG,=GM4SLV,=GM4WXQ,=GM4ZHL,=GM6RQW,=GM6YQA,=GM7AFE,=GM7GWW,=GM8LNH,=GM8MMA, - =GM8YEC,=GS3ZET,=MM0LSM,=MM0NQY,=MM0VIK,=MM0XAU,=MM0ZAL,=MM0ZCG,=MM0ZRC,=MM1FEO,=MM1FJM,=MM3VQO, - =MM5PSL,=MM5YLO,=MM6BDU,=MM6BZQ,=MM6IKB,=MM6IMB,=MM6MFA,=MM6PTE,=MM6SJK,=MM6YLO,=MM6ZBG,=MM6ZDW, - =MM7CGR,=MM8A,=MS0ZCG,=MS0ZET; + =GM8YEC,=GS2MP,=GS3ZET,=GS7V,=MM0LSM,=MM0NQY,=MM0VIK,=MM0XAU,=MM0ZAL,=MM0ZCG,=MM0ZRC,=MM1FEO, + =MM1FJM,=MM3VQO,=MM5PSL,=MM5YLO,=MM6BDU,=MM6BZQ,=MM6IKB,=MM6IMB,=MM6MFA,=MM6PTE,=MM6SJK,=MM6YLO, + =MM6ZBG,=MM6ZDW,=MM7CGR,=MM8A,=MS0ZCG,=MS0ZET; # ADIF 106 Guernsey: 14: 27: EU: 49.45: 2.58: 0.0: GU: 2U,GP,GU,MP,MU; # ADIF 294 Wales: 14: 27: EU: 52.28: 3.73: 0.0: GW: - 2W,GC,GW,MC,MW,=GB0HBR,=GB0MPA,=GB1CR,=GB1GLC,=GB1MUU,=GB1WHR,=GB2GFS,=GB2IMD,=GB2MOP,=GB2TD, - =GB2VK,=GB4MDI,=GB4RRS; + 2W,GC,GW,MC,MW,=GB0MPA,=GB1GLC,=GB1MUU,=GB2GFS,=GB2IMD,=GB2MOP,=GB2TD,=GB2VK,=GB4MDI,=GB9KW; # ADIF 185 Solomon Islands: 28: 51: OC: -9.00: -160.00: -11.0: H4: H4; @@ -2596,7 +2592,7 @@ Sardinia: 15: 28: EU: 40.15: -9.27: -1.0: IS: =IR0A,=IY0GA; # ADIF 248 Sicily: 15: 28: EU: 37.50: -14.00: -1.0: *IT9: - IB9,ID9,IE9,IF9,II9,IJ9,IO9,IQ9,IR9,IT9,IU9,IW9,IY9,=IQ1QQ/9,=IW0HBY/9; + IB9,ID9,IE9,IF9,II9,IJ9,IO9,IP9,IQ9,IR9,IT9,IU9,IW9,IY9,=IQ1QQ/9,=IW0HBY/9; # ADIF 382 Djibouti: 37: 48: AF: 11.75: -42.35: -3.0: J2: J2; @@ -2879,17 +2875,17 @@ United States: 05: 08: NA: 37.60: 91.87: 5.0: K: =AA5UN<27.83/81.63>,=AA7JV<27.83/81.63>,=AA8R<27.83/81.63>,=AA9HQ<34.02/81.00>, =AC6NN<37.85/77.77>,=AC6WI<37.85/77.77>,=AC7GG<34.02/81.00>,=AC8Y<37.85/77.77>,=AD8J<35.53/79.68>, =AF6G<35.53/79.68>,=AG7AE<37.85/77.77>,=AG8GT<35.53/79.68>,=AH2EJ<37.85/77.77>, - =AH6FX<37.85/77.77>,=AH6R<27.83/81.63>,=AI8F<33.42/83.88>,=AI8O<35.53/79.68>,=AJ0IM<27.83/81.63>, - =G8ERJ<33.12/82.20>,=K0CIE<27.83/81.63>,=K0DVH<33.42/83.88>,=K0FE<34.02/81.00>,=K0HT<33.42/83.88>, - =K0LUZ<27.83/81.63>,=K0RK<27.83/81.63>,=K0ZR<37.85/77.77>,=K5AUP<27.83/81.63>,=K5EEE<27.83/81.63>, - =K5EK<35.53/79.68>,=K5JR<33.42/83.88>,=K5KG<27.83/81.63>,=K5MO<35.53/79.68>,=K5OF<35.53/79.68>, - =K5TF<33.42/83.88>,=K5VG<37.85/77.77>,=K5VIP<37.85/77.77>,=K6ES<35.53/79.68>,=K6RM<35.53/79.68>, - =K7BV<35.53/79.68>,=K7GM<35.53/79.68>,=K7LU<37.85/77.77>,=K7OM<34.02/81.00>,=K7SV<37.85/77.77>, - =K7UPJ<27.83/81.63>,=K7UWR<33.42/83.88>,=K7WCH<34.02/81.00>,=K8AC<35.53/79.68>, - =K8ARY<34.02/81.00>,=K8FC<27.83/81.63>,=K8GP<37.85/77.77>,=K8LBQ<33.42/83.88>,=K8LF<37.85/77.77>, - =K8MV<27.83/81.63>,=K8NS<27.83/81.63>,=K8RAR<27.83/81.63>,=K8SYH<37.85/77.77>,=K8UGG<33.42/83.88>, - =K8WWN<35.53/79.68>,=K8YC<35.53/79.68>,=K8YFM<37.85/77.77>,=K8YM<27.83/81.63>,=K9AXT<35.53/79.68>, - =K9EZ<35.53/79.68>,=K9GS<27.83/81.63>,=K9GWS<34.02/81.00>,=K9HXO<27.83/81.63>,=K9MBQ<37.85/77.77>, + =AH6FX<37.85/77.77>,=AH6R<27.83/81.63>,=AI8F<33.42/83.88>,=AI8O<35.53/79.68>,=G8ERJ<33.12/82.20>, + =K0CIE<27.83/81.63>,=K0DVH<33.42/83.88>,=K0FE<34.02/81.00>,=K0HT<33.42/83.88>,=K0LUZ<27.83/81.63>, + =K0RK<27.83/81.63>,=K0ZR<37.85/77.77>,=K5AUP<27.83/81.63>,=K5EEE<27.83/81.63>,=K5EK<35.53/79.68>, + =K5JR<33.42/83.88>,=K5KG<27.83/81.63>,=K5MO<35.53/79.68>,=K5OF<35.53/79.68>,=K5TF<33.42/83.88>, + =K5VG<37.85/77.77>,=K5VIP<37.85/77.77>,=K6ES<35.53/79.68>,=K6RM<35.53/79.68>,=K7BV<35.53/79.68>, + =K7GM<35.53/79.68>,=K7LU<37.85/77.77>,=K7OM<34.02/81.00>,=K7SV<37.85/77.77>,=K7UPJ<27.83/81.63>, + =K7UWR<33.42/83.88>,=K7WCH<34.02/81.00>,=K8AC<35.53/79.68>,=K8ARY<34.02/81.00>,=K8FC<27.83/81.63>, + =K8GP<37.85/77.77>,=K8LBQ<33.42/83.88>,=K8LF<37.85/77.77>,=K8MV<27.83/81.63>,=K8NS<27.83/81.63>, + =K8RAR<27.83/81.63>,=K8SYH<37.85/77.77>,=K8UGG<33.42/83.88>,=K8WWN<35.53/79.68>, + =K8YC<35.53/79.68>,=K8YFM<37.85/77.77>,=K8YM<27.83/81.63>,=K9AXT<35.53/79.68>,=K9EZ<35.53/79.68>, + =K9GS<27.83/81.63>,=K9GWS<34.02/81.00>,=K9HXO<27.83/81.63>,=K9MBQ<37.85/77.77>,=K9OM<27.83/81.63>, =K9OQ<33.42/83.88>,=K9RQ<27.83/81.63>,=KA6U<27.83/81.63>,=KA8JIL<27.83/81.63>, =KA8OAT<27.83/81.63>,=KA8P<34.02/81.00>,=KA8Q<37.85/77.77>,=KC5RFU<27.83/81.63>, =KC8GCR<35.53/79.68>,=KC8OPV<37.85/77.77>,=KC8YRK<33.42/83.88>,=KD7ACB<27.83/81.63>, @@ -2962,65 +2958,66 @@ United States: 05: 08: NA: 37.60: 91.87: 5.0: K: WZ5(4)[7]<31.85/96.30>~6.0~,=AA3C(4)[7]<30.92/97.33>~6.0~,=AA4TO(4)[7]<30.92/97.33>~6.0~, =AA5UZ(4)[8]<30.70/91.47>~6.0~,=AB1BN(4)[7]<30.92/97.33>~6.0~,=AB8YZ(4)[7]<30.92/97.33>~6.0~, =AC4CA(4)[7]<30.92/97.33>~6.0~,=AC4CH(4)[7]<35.60/96.85>~6.0~,=AC7P(4)[7]<30.92/97.33>~6.0~, - =AE5MI(4)[8]<32.58/89.57>~6.0~,=AG5Z(4)[8]<32.58/89.57>~6.0~,=AH6SU(4)[8]<32.58/89.57>~6.0~, - =AI5HG(4)[8]<32.58/89.57>~6.0~,=AJ4F(4)[7]<30.92/97.33>~6.0~,=AK5CT(4)[8]<32.58/89.57>~6.0~, - =AK9B(4)[7]<30.92/97.33>~6.0~,=AL5M(4)[7]<30.92/97.33>~6.0~,=AL5P(4)[7]<30.92/97.33>~6.0~, - =AL7V(4)[7]<35.60/96.85>~6.0~,=K1DW(4)[7]<30.92/97.33>~6.0~,=K1IEB(4)[7]<30.92/97.33>~6.0~, - =K1JD(4)[7]<34.60/106.33>~6.0~,=K1LEC(4)[7]<35.20/92.72>~6.0~,=K2SHN(4)[7]<35.20/92.72>~6.0~, - =K2ZP(4)[7]<30.70/91.47>~6.0~,=K3IGA(4)[7]<30.92/97.33>~6.0~,=K3KEK(4)[7]<30.92/97.33>~6.0~, - =K3NT(4)[7]<30.92/97.33>~6.0~,=K4DG(4)[7]<30.92/97.33>~6.0~,=K4FMH(4)[7]<32.58/89.57>~6.0~, - =K5FZ(4)[8]<32.58/89.57>~6.0~,=K5IJ(4)[8]<32.58/89.57>~6.0~,=K5OLV(4)[8]<32.58/89.57>~6.0~, - =K5PN(4)[8]<32.58/89.57>~6.0~,=K5UF(4)[8]<32.58/89.57>~6.0~,=K5WK(4)[8]<32.58/89.57>~6.0~, - =K5YVY(4)[8]<32.58/89.57>~6.0~,=K6FX(4)[7]<30.92/97.33>~6.0~,=K6RCW(4)[7]<30.92/97.33>~6.0~, - =K6ZB(4)[7]<30.92/97.33>~6.0~,=K7DWI(4)[7]<30.92/97.33>~6.0~,=K7IA(4)[7]<34.60/106.33>~6.0~, - =K7IOL(4)[7]<30.92/97.33>~6.0~,=K7MOA(4)[7]<30.92/97.33>~6.0~,=K7RB(4)[7]<30.92/97.33>~6.0~, - =K7UD(4)[7]<30.92/97.33>~6.0~,=K7VF(4)[7]<30.92/97.33>~6.0~,=K7ZYV(4)[8]<32.58/89.57>~6.0~, - =K8OZ(4)[7]<34.60/106.33>~6.0~,=K8TE(4)[7]<34.60/106.33>~6.0~,=K9ING(4)[7]<30.92/97.33>~6.0~, - =K9MK(4)[7]<30.92/97.33>~6.0~,=K9OZ(4)[7]<35.20/92.72>~6.0~,=KA4OTB(4)[7]<35.20/92.72>~6.0~, - =KB1IKC(4)[7]<34.60/106.33>~6.0~,=KB6OJE(4)[7]<30.92/97.33>~6.0~,=KC2LM(4)[7]<34.60/106.33>~6.0~, - =KC6UCN(4)[7]<30.92/97.33>~6.0~,=KC6ZBE(4)[7]<30.92/97.33>~6.0~,=KC7QY(4)[7]<34.60/106.33>~6.0~, - =KD2KW(4)[7]<30.92/97.33>~6.0~,=KD5DD(4)[8]<32.58/89.57>~6.0~,=KD5EJG(4)[8]<32.58/89.57>~6.0~, - =KE4XT(4)[7]<30.92/97.33>~6.0~,=KE5MIS(4)[8]<32.58/89.57>~6.0~,=KF6JOQ(4)[7]<35.60/96.85>~6.0~, - =KF9LI(4)[7]<30.92/97.33>~6.0~,=KG5SSB(4)[8]<32.58/89.57>~6.0~,=KG5UN(4)[8]<32.58/89.57>~6.0~, - =KG5XR(4)[8]<32.58/89.57>~6.0~,=KH9AE(4)[7]<30.92/97.33>~6.0~,=KI5UTQ(4)[8]<32.58/89.57>~6.0~, - =KI5UXN(4)[8]<32.58/89.57>~6.0~,=KI6HQT(4)[7]<30.92/97.33>~6.0~,=KI7ID(4)[7]<30.92/97.33>~6.0~, - =KJ6DQ(4)[7]<30.92/97.33>~6.0~,=KK5OQ(4)[8]<32.58/89.57>~6.0~,=KK6MC(4)[7]<34.60/106.33>~6.0~, - =KL4LJ(4)[7]<30.92/97.33>~6.0~,=KL7U(4)[7]<30.92/97.33>~6.0~,=KM0I(4)[8]<32.58/89.57>~6.0~, - =KM4DR(4)[7]<30.92/97.33>~6.0~,=KS4XU(4)[7]<30.92/97.33>~6.0~,=KV8S(4)[7]<30.70/91.47>~6.0~, - =N1IPB(4)[7]<30.92/97.33>~6.0~,=N2GG(4)[7]<34.60/106.33>~6.0~,=N2IC(4)[7]<34.60/106.33>~6.0~, - =N3BB(4)[7]<30.92/97.33>~6.0~,=N3BUO(4)[7]<30.92/97.33>~6.0~,=N3CI(4)[7]<35.60/96.85>~6.0~, - =N3DI(4)[8]<30.70/91.47>~6.0~,=N3MRA(4)[7]<34.60/106.33>~6.0~,=N4LR(4)[8]<32.58/89.57>~6.0~, - =N4OGW(4)[8]<32.58/89.57>~6.0~,=N4UPX(4)[8]<32.58/89.57>~6.0~,=N5BLY(4)[8]<32.58/89.57>~6.0~, - =N5CW(4)[8]<32.58/89.57>~6.0~,=N5FTY(4)[8]<32.58/89.57>~6.0~,=N5GD(4)[8]<32.58/89.57>~6.0~, - =N5KSS(4)[8]<32.58/89.57>~6.0~,=N5MIS(4)[8]<32.58/89.57>~6.0~,=N5PA(4)[8]<32.58/89.57>~6.0~, - =N5PU(4)[8]<32.58/89.57>~6.0~,=N5SA(4)[8]<32.58/89.57>~6.0~,=N5YT(4)[8]<32.58/89.57>~6.0~, - =N6EB(4)[7]<35.60/96.85>~6.0~,=N6EV(4)[7]<30.92/97.33>~6.0~,=N6GR(4)[7]<34.60/106.33>~6.0~, - =N6HEW(4)[7]<34.60/106.33>~6.0~,=N6RH(4)[7]<30.92/97.33>~6.0~,=N6ZZ(4)[7]<34.60/106.33>~6.0~, - =N7KA(4)[7]<34.60/106.33>~6.0~,=N8OO(4)[7]<30.70/91.47>~6.0~,=N9JYJ(4)[7]<35.60/96.85>~6.0~, - =N9NM(4)[7]<30.92/97.33>~6.0~,=N9OF(4)[7]<30.92/97.33>~6.0~,=NA5DX(4)[8]<32.58/89.57>~6.0~, - =NA5NN(4)[8]<32.58/89.57>~6.0~,=NF8H(4)[7]<35.20/92.72>~6.0~,=NG5U(4)[8]<32.58/89.57>~6.0~, - =NH6L(4)[7]<30.92/97.33>~6.0~,=NH6PK(4)[8]<30.70/91.47>~6.0~,=NH6SM(4)[7]<35.60/96.85>~6.0~, - =NH7TR(4)[7]<30.92/97.33>~6.0~,=NI2M(4)[7]<30.92/97.33>~6.0~,=NL7RQ(4)[7]<35.20/92.72>~6.0~, - =NN5O(4)[8]<32.58/89.57>~6.0~,=NO3OO(4)[7]<30.70/91.47>~6.0~,=NZ7Q(4)[7]<34.60/106.33>~6.0~, - =W1JCW(4)[7]<30.92/97.33>~6.0~,=W2ACY(4)[7]<30.92/97.33>~6.0~,=W2GS(4)[7]<32.58/89.57>~6.0~, - =W2IY(4)[7]<34.60/106.33>~6.0~,=W2KF(4)[7]<30.92/97.33>~6.0~,=W2MN(4)[7]<30.92/97.33>~6.0~, - =W2ODH(4)[7]<30.92/97.33>~6.0~,=W2OZB(4)[7]<30.92/97.33>~6.0~,=W3PWF(4)[7]<30.92/97.33>~6.0~, - =W3RZ(4)[7]<30.92/97.33>~6.0~,=W3XO(4)[7]<30.92/97.33>~6.0~,=W4IPA(4)[7]<30.92/97.33>~6.0~, - =W5BLX(4)[8]<32.58/89.57>~6.0~,=W5EPL(4)[8]<32.58/89.57>~6.0~,=W5GAI(4)[8]<32.58/89.57>~6.0~, - =W5ORC(4)[8]<32.58/89.57>~6.0~,=W5RCG(4)[8]<32.58/89.57>~6.0~,=W5SGL(4)[8]<32.58/89.57>~6.0~, - =W5THT(4)[8]<32.58/89.57>~6.0~,=W5UMS(4)[8]<32.58/89.57>~6.0~,=W5WGF(4)[8]<32.58/89.57>~6.0~, - =W5YD(4)[8]<32.58/89.57>~6.0~,=W6FB(4)[7]<30.70/91.47>~6.0~,=W6LFB(4)[7]<30.92/97.33>~6.0~, - =W7JKC(4)[7]<30.92/97.33>~6.0~,=W7NX(4)[7]<30.92/97.33>~6.0~,=W8OV(4)[7]<30.92/97.33>~6.0~, - =W8WZ(4)[7]<30.70/91.47>~6.0~,=W9DCT(4)[7]<35.20/92.72>~6.0~,=W9DXM(4)[7]<30.92/97.33>~6.0~, - =W9LCQ(4)[7]<30.92/97.33>~6.0~,=W9MC(4)[7]<30.92/97.33>~6.0~,=WA2TOP(4)[7]<30.92/97.33>~6.0~, - =WA2VYA(4)[7]<30.92/97.33>~6.0~,=WA3NZA(4)[7]<30.92/97.33>~6.0~,=WA8ZBT(4)[7]<30.92/97.33>~6.0~, - =WA9AFM(4)[7]<35.60/96.85>~6.0~,=WA9JBR(4)[7]<30.70/91.47>~6.0~,=WB4KTF(4)[7]<30.92/97.33>~6.0~, - =WB5SKM(4)[8]<32.58/89.57>~6.0~,=WB8QZM(4)[7]<30.92/97.33>~6.0~,=WD5CCA(4)[8]<32.58/89.57>~6.0~, - =WD9FJL(4)[7]<34.60/106.33>~6.0~,=WE6EZ(4)[7]<30.92/97.33>~6.0~,=WF3H(4)[7]<30.92/97.33>~6.0~, - =WH7R(4)[7]<30.92/97.33>~6.0~,=WJ5K(4)[8]<32.58/89.57>~6.0~,=WL7OU(4)[7]<30.92/97.33>~6.0~, - =WM5A(4)[8]<32.58/89.57>~6.0~,=WM5DX(4)[8]<32.58/89.57>~6.0~,=WN2E(4)[8]<32.58/89.57>~6.0~, - =WQ5L(4)[8]<32.58/89.57>~6.0~,=WT4DX(4)[7]<30.92/97.33>~6.0~,=WW2OK(4)[7]<35.60/96.85>~6.0~, - =WX7V(4)[7]<30.92/97.33>~6.0~,=WY6K(4)[7]<30.92/97.33>~6.0~, + =AD9BT(4)[7]<30.92/97.33>~6.0~,=AE5MI(4)[8]<32.58/89.57>~6.0~,=AG5Z(4)[8]<32.58/89.57>~6.0~, + =AH6SU(4)[8]<32.58/89.57>~6.0~,=AI5HG(4)[8]<32.58/89.57>~6.0~,=AJ4F(4)[7]<30.92/97.33>~6.0~, + =AK5CT(4)[8]<32.58/89.57>~6.0~,=AK9B(4)[7]<30.92/97.33>~6.0~,=AL5M(4)[7]<30.92/97.33>~6.0~, + =AL5P(4)[7]<30.92/97.33>~6.0~,=AL7V(4)[7]<35.60/96.85>~6.0~,=K1DW(4)[7]<30.92/97.33>~6.0~, + =K1IEB(4)[7]<30.92/97.33>~6.0~,=K1JD(4)[7]<34.60/106.33>~6.0~,=K1LEC(4)[7]<35.20/92.72>~6.0~, + =K2SHN(4)[7]<35.20/92.72>~6.0~,=K2ZP(4)[7]<30.70/91.47>~6.0~,=K3IGA(4)[7]<30.92/97.33>~6.0~, + =K3KEK(4)[7]<30.92/97.33>~6.0~,=K3NT(4)[7]<30.92/97.33>~6.0~,=K3TD(4)[7]<30.92/97.33>~6.0~, + =K4DG(4)[7]<30.92/97.33>~6.0~,=K4FMH(4)[7]<32.58/89.57>~6.0~,=K5FZ(4)[8]<32.58/89.57>~6.0~, + =K5IJ(4)[8]<32.58/89.57>~6.0~,=K5OLV(4)[8]<32.58/89.57>~6.0~,=K5PN(4)[8]<32.58/89.57>~6.0~, + =K5UF(4)[8]<32.58/89.57>~6.0~,=K5WK(4)[8]<32.58/89.57>~6.0~,=K5YVY(4)[8]<32.58/89.57>~6.0~, + =K6FX(4)[7]<30.92/97.33>~6.0~,=K6RCW(4)[7]<30.92/97.33>~6.0~,=K6ZB(4)[7]<30.92/97.33>~6.0~, + =K7DWI(4)[7]<30.92/97.33>~6.0~,=K7IA(4)[7]<34.60/106.33>~6.0~,=K7IOL(4)[7]<30.92/97.33>~6.0~, + =K7MOA(4)[7]<30.92/97.33>~6.0~,=K7RB(4)[7]<30.92/97.33>~6.0~,=K7UD(4)[7]<30.92/97.33>~6.0~, + =K7VF(4)[7]<30.92/97.33>~6.0~,=K7ZYV(4)[8]<32.58/89.57>~6.0~,=K8OZ(4)[7]<34.60/106.33>~6.0~, + =K8TE(4)[7]<34.60/106.33>~6.0~,=K9ING(4)[7]<30.92/97.33>~6.0~,=K9MK(4)[7]<30.92/97.33>~6.0~, + =K9OZ(4)[7]<35.20/92.72>~6.0~,=KA4OTB(4)[7]<35.20/92.72>~6.0~,=KB1IKC(4)[7]<34.60/106.33>~6.0~, + =KB6OJE(4)[7]<30.92/97.33>~6.0~,=KC2LM(4)[7]<34.60/106.33>~6.0~,=KC6UCN(4)[7]<30.92/97.33>~6.0~, + =KC6ZBE(4)[7]<30.92/97.33>~6.0~,=KC7QY(4)[7]<34.60/106.33>~6.0~,=KD2KW(4)[7]<30.92/97.33>~6.0~, + =KD5DD(4)[8]<32.58/89.57>~6.0~,=KD5EJG(4)[8]<32.58/89.57>~6.0~,=KE4XT(4)[7]<30.92/97.33>~6.0~, + =KE5MIS(4)[8]<32.58/89.57>~6.0~,=KF6JOQ(4)[7]<35.60/96.85>~6.0~,=KF9LI(4)[7]<30.92/97.33>~6.0~, + =KG5SSB(4)[8]<32.58/89.57>~6.0~,=KG5UN(4)[8]<32.58/89.57>~6.0~,=KG5XR(4)[8]<32.58/89.57>~6.0~, + =KH9AE(4)[7]<30.92/97.33>~6.0~,=KI5UTQ(4)[8]<32.58/89.57>~6.0~,=KI5UXN(4)[8]<32.58/89.57>~6.0~, + =KI6HQT(4)[7]<30.92/97.33>~6.0~,=KI7ID(4)[7]<30.92/97.33>~6.0~,=KJ6DQ(4)[7]<30.92/97.33>~6.0~, + =KK5OQ(4)[8]<32.58/89.57>~6.0~,=KK6MC(4)[7]<34.60/106.33>~6.0~,=KL4LJ(4)[7]<30.92/97.33>~6.0~, + =KL7U(4)[7]<30.92/97.33>~6.0~,=KM0I(4)[8]<32.58/89.57>~6.0~,=KM4DR(4)[7]<30.92/97.33>~6.0~, + =KS4XU(4)[7]<30.92/97.33>~6.0~,=KV8S(4)[7]<30.70/91.47>~6.0~,=N1IPB(4)[7]<30.92/97.33>~6.0~, + =N2GG(4)[7]<34.60/106.33>~6.0~,=N2IC(4)[7]<34.60/106.33>~6.0~,=N3BB(4)[7]<30.92/97.33>~6.0~, + =N3BUO(4)[7]<30.92/97.33>~6.0~,=N3CI(4)[7]<35.60/96.85>~6.0~,=N3DI(4)[8]<30.70/91.47>~6.0~, + =N3MRA(4)[7]<34.60/106.33>~6.0~,=N4LR(4)[8]<32.58/89.57>~6.0~,=N4OGW(4)[8]<32.58/89.57>~6.0~, + =N4UPX(4)[8]<32.58/89.57>~6.0~,=N5BLY(4)[8]<32.58/89.57>~6.0~,=N5CW(4)[8]<32.58/89.57>~6.0~, + =N5FTY(4)[8]<32.58/89.57>~6.0~,=N5GD(4)[8]<32.58/89.57>~6.0~,=N5KSS(4)[8]<32.58/89.57>~6.0~, + =N5MIS(4)[8]<32.58/89.57>~6.0~,=N5PA(4)[8]<32.58/89.57>~6.0~,=N5PU(4)[8]<32.58/89.57>~6.0~, + =N5SA(4)[8]<32.58/89.57>~6.0~,=N5YT(4)[8]<32.58/89.57>~6.0~,=N6EB(4)[7]<35.60/96.85>~6.0~, + =N6EV(4)[7]<30.92/97.33>~6.0~,=N6GR(4)[7]<34.60/106.33>~6.0~,=N6HEW(4)[7]<34.60/106.33>~6.0~, + =N6RH(4)[7]<30.92/97.33>~6.0~,=N6ZZ(4)[7]<34.60/106.33>~6.0~,=N7KA(4)[7]<34.60/106.33>~6.0~, + =N8OO(4)[7]<30.70/91.47>~6.0~,=N9JYJ(4)[7]<35.60/96.85>~6.0~,=N9NM(4)[7]<30.92/97.33>~6.0~, + =N9OF(4)[7]<30.92/97.33>~6.0~,=NA5DX(4)[8]<32.58/89.57>~6.0~,=NA5NN(4)[8]<32.58/89.57>~6.0~, + =NF8H(4)[7]<35.20/92.72>~6.0~,=NG5U(4)[8]<32.58/89.57>~6.0~,=NH6L(4)[7]<30.92/97.33>~6.0~, + =NH6PK(4)[8]<30.70/91.47>~6.0~,=NH6SM(4)[7]<35.60/96.85>~6.0~,=NH7TR(4)[7]<30.92/97.33>~6.0~, + =NI2M(4)[7]<30.92/97.33>~6.0~,=NL7RQ(4)[7]<35.20/92.72>~6.0~,=NN5O(4)[8]<32.58/89.57>~6.0~, + =NO3OO(4)[7]<30.70/91.47>~6.0~,=NZ7Q(4)[7]<34.60/106.33>~6.0~,=W1JCW(4)[7]<30.92/97.33>~6.0~, + =W2ACY(4)[7]<30.92/97.33>~6.0~,=W2GS(4)[7]<32.58/89.57>~6.0~,=W2IY(4)[7]<34.60/106.33>~6.0~, + =W2KF(4)[7]<30.92/97.33>~6.0~,=W2MN(4)[7]<30.92/97.33>~6.0~,=W2ODH(4)[7]<30.92/97.33>~6.0~, + =W2OZB(4)[7]<30.92/97.33>~6.0~,=W3PWF(4)[7]<30.92/97.33>~6.0~,=W3RZ(4)[7]<30.92/97.33>~6.0~, + =W3XO(4)[7]<30.92/97.33>~6.0~,=W4IPA(4)[7]<30.92/97.33>~6.0~,=W5BLX(4)[8]<32.58/89.57>~6.0~, + =W5EPL(4)[8]<32.58/89.57>~6.0~,=W5GAI(4)[8]<32.58/89.57>~6.0~,=W5ORC(4)[8]<32.58/89.57>~6.0~, + =W5RCG(4)[8]<32.58/89.57>~6.0~,=W5SGL(4)[8]<32.58/89.57>~6.0~,=W5THT(4)[8]<32.58/89.57>~6.0~, + =W5UMS(4)[8]<32.58/89.57>~6.0~,=W5WGF(4)[8]<32.58/89.57>~6.0~,=W5YD(4)[8]<32.58/89.57>~6.0~, + =W6FB(4)[7]<30.70/91.47>~6.0~,=W6LFB(4)[7]<30.92/97.33>~6.0~,=W7JKC(4)[7]<30.92/97.33>~6.0~, + =W7NX(4)[7]<30.92/97.33>~6.0~,=W8OV(4)[7]<30.92/97.33>~6.0~,=W8WZ(4)[7]<30.70/91.47>~6.0~, + =W9DCT(4)[7]<35.20/92.72>~6.0~,=W9DXM(4)[7]<30.92/97.33>~6.0~,=W9LCQ(4)[7]<30.92/97.33>~6.0~, + =W9MC(4)[7]<30.92/97.33>~6.0~,=WA2TOP(4)[7]<30.92/97.33>~6.0~,=WA2VYA(4)[7]<30.92/97.33>~6.0~, + =WA3NZA(4)[7]<30.92/97.33>~6.0~,=WA8ZBT(4)[7]<30.92/97.33>~6.0~,=WA9AFM(4)[7]<35.60/96.85>~6.0~, + =WA9JBR(4)[7]<30.70/91.47>~6.0~,=WB4KTF(4)[7]<30.92/97.33>~6.0~,=WB5SKM(4)[8]<32.58/89.57>~6.0~, + =WB8QZM(4)[7]<30.92/97.33>~6.0~,=WD5CCA(4)[8]<32.58/89.57>~6.0~,=WD9FJL(4)[7]<34.60/106.33>~6.0~, + =WE6EZ(4)[7]<30.92/97.33>~6.0~,=WF3H(4)[7]<30.92/97.33>~6.0~,=WH7R(4)[7]<30.92/97.33>~6.0~, + =WJ5K(4)[8]<32.58/89.57>~6.0~,=WL7OU(4)[7]<30.92/97.33>~6.0~,=WM5A(4)[8]<32.58/89.57>~6.0~, + =WM5DX(4)[8]<32.58/89.57>~6.0~,=WN2E(4)[8]<32.58/89.57>~6.0~,=WQ5L(4)[8]<32.58/89.57>~6.0~, + =WT4DX(4)[7]<30.92/97.33>~6.0~,=WW2OK(4)[7]<35.60/96.85>~6.0~,=WX7V(4)[7]<30.92/97.33>~6.0~, + =WY6K(4)[7]<30.92/97.33>~6.0~, # California AA6(3)[6]<35.48/119.35>~8.0~,AB6(3)[6]<35.48/119.35>~8.0~,AC6(3)[6]<35.48/119.35>~8.0~, AD6(3)[6]<35.48/119.35>~8.0~,AE6(3)[6]<35.48/119.35>~8.0~,AF6(3)[6]<35.48/119.35>~8.0~, @@ -3070,13 +3067,13 @@ United States: 05: 08: NA: 37.60: 91.87: 5.0: K: =N8JOE(3)[6]<35.48/119.35>~8.0~,=N9BD(3)[6]<35.48/119.35>~8.0~,=ND2T(3)[6]<35.48/119.35>~8.0~, =NK3L(3)[6]<35.48/119.35>~8.0~,=NR1K(3)[6]<35.48/119.35>~8.0~,=NR5NN(3)[6]<35.48/119.35>~8.0~, =NT5A(3)[6]<35.48/119.35>~8.0~,=W0PE(3)[6]<35.48/119.35>~8.0~,=W0PZ(3)[6]<35.48/119.35>~8.0~, - =W0YK(3)[6]<35.48/119.35>~8.0~,=W1MVY(3)[6]<35.48/119.35>~8.0~,=W1PR(3)[6]<35.48/119.35>~8.0~, - =W1RH(3)[6]<35.48/119.35>~8.0~,=W1SAV(3)[6]<35.48/119.35>~8.0~,=W1SRD(3)[6]<35.48/119.35>~8.0~, - =W3FF(3)[6]<35.48/119.35>~8.0~,=W3WRC(3)[6]<35.48/119.35>~8.0~,=W4EF(3)[6]<35.48/119.35>~8.0~, - =W4NJK(3)[6]<35.48/119.35>~8.0~,=W4UAT(3)[6]<35.48/119.35>~8.0~,=W5ABQ(3)[6]<35.48/119.35>~8.0~, - =W8EWL(3)[6]<35.48/119.35>~8.0~,=W8GJK(3)[6]<35.48/119.35>~8.0~,=W8SA(3)[6]<35.48/119.35>~8.0~, - =W9JXT(3)[6]<35.48/119.35>~8.0~,=W9MAK(3)[6]<35.48/119.35>~8.0~,=WA9JIB(3)[6]<35.48/119.35>~8.0~, - =WB8YQJ(3)[6]<35.48/119.35>~8.0~,=WC2A(3)[6]<35.48/119.35>~8.0~,=WX5S(3)[6]<35.48/119.35>~8.0~, + =W0YK(3)[6]<35.48/119.35>~8.0~,=W1PR(3)[6]<35.48/119.35>~8.0~,=W1RH(3)[6]<35.48/119.35>~8.0~, + =W1SAV(3)[6]<35.48/119.35>~8.0~,=W1SRD(3)[6]<35.48/119.35>~8.0~,=W3FF(3)[6]<35.48/119.35>~8.0~, + =W3WRC(3)[6]<35.48/119.35>~8.0~,=W4EF(3)[6]<35.48/119.35>~8.0~,=W4NJK(3)[6]<35.48/119.35>~8.0~, + =W4UAT(3)[6]<35.48/119.35>~8.0~,=W5ABQ(3)[6]<35.48/119.35>~8.0~,=W8EWL(3)[6]<35.48/119.35>~8.0~, + =W8GJK(3)[6]<35.48/119.35>~8.0~,=W8SA(3)[6]<35.48/119.35>~8.0~,=W9JXT(3)[6]<35.48/119.35>~8.0~, + =W9MAK(3)[6]<35.48/119.35>~8.0~,=WA9JIB(3)[6]<35.48/119.35>~8.0~,=WB8YQJ(3)[6]<35.48/119.35>~8.0~, + =WC2A(3)[6]<35.48/119.35>~8.0~,=WX5S(3)[6]<35.48/119.35>~8.0~, # AZ-ID-MT-NV-OR-UT-WA-WY AA7(3)[6]<41.30/116.60>~7.0~,AB7(3)[6]<41.30/116.60>~7.0~,AC7(3)[6]<41.30/116.60>~7.0~, AD7(3)[6]<41.30/116.60>~7.0~,AE7(3)[6]<41.30/116.60>~7.0~,AF7(3)[6]<41.30/116.60>~7.0~, @@ -3183,27 +3180,27 @@ United States: 05: 08: NA: 37.60: 91.87: 5.0: K: WK8(4)<41.35/83.23>,WM8(4)<41.35/83.23>,WN8(4)<41.35/83.23>,WO8(4)<41.35/83.23>, WQ8(4)<41.35/83.23>,WR8(4)<41.35/83.23>,WS8(4)<41.35/83.23>,WT8(4)<41.35/83.23>, WU8(4)<41.35/83.23>,WV8(4)<41.35/83.23>,WW8(4)<41.35/83.23>,WX8(4)<41.35/83.23>, - WY8(4)<41.35/83.23>,WZ8(4)<41.35/83.23>,=AA1JM(4)<42.87/84.22>,=AA4R(4)<42.87/84.22>, - =AA5TA(4)<40.43/82.80>,=AH2AV(4)<42.87/84.22>,=K0ACP(4)<42.87/84.22>,=K1CCN(4)<40.43/82.80>, - =K1LT(4)<40.43/82.80>,=K1ND(4)<42.87/84.22>,=K2CUB(4)<42.87/84.22>,=K2KMC(4)<40.43/82.80>, - =K2PM(4)<42.87/84.22>,=K2YAZ(4)<42.87/84.22>,=K3DMG(4)<40.43/82.80>,=K3GP(4)<40.43/82.80>, - =K3USC(4)<40.43/82.80>,=K3VIN(4)<40.43/82.80>,=K3YP(4)<40.43/82.80>,=K4YJ(4)<40.43/82.80>, - =K6HRU(4)<40.43/82.80>,=K7TAR(4)<40.43/82.80>,=KA0AZS(4)<40.43/82.80>,=KA1LDD(4)<40.43/82.80>, - =KA1RUE(4)<40.43/82.80>,=KB4TLH(4)<40.43/82.80>,=KB5BGC(4)<42.87/84.22>,=KB6NU(4)<42.87/84.22>, - =KE3K(4)<42.87/84.22>,=KI6DY(4)<40.43/82.80>,=KK0L(4)<40.43/82.80>,=KL2YE(4)<42.87/84.22>, - =KP4VZ(4)<40.43/82.80>,=KQ4YC(4)<40.43/82.80>,=KS4OP(4)<40.43/82.80>,=N0FW(4)<40.43/82.80>, - =N0TTI(4)<42.87/84.22>,=N0VRS(4)<40.43/82.80>,=N1LB(4)<40.43/82.80>,=N2CB(4)<42.87/84.22>, - =N2CCG(4)<42.87/84.22>,=N3JJT(4)<40.43/82.80>,=N3RA(4)<40.43/82.80>,=N3WVB(4)<40.43/82.80>, - =N4CSV(4)<40.43/82.80>,=N4DBR(4)<42.87/84.22>,=N4EL(4)<40.43/82.80>,=N4HAI(4)<40.43/82.80>, - =N4LSJ(4)<40.43/82.80>,=N5JED(4)<40.43/82.80>,=N5MKY(4)<42.87/84.22>,=N5WCS(4)<42.87/84.22>, - =N6FS(4)<42.87/84.22>,=N6JRL(4)<40.43/82.80>,=N6VF(4)<40.43/82.80>,=ND3N(4)<40.43/82.80>, - =NG3Q(4)<40.43/82.80>,=W0CG(4)<40.43/82.80>,=W0JX(4)<40.43/82.80>,=W1CHL(4)<40.43/82.80>, - =W1NN(4)<40.43/82.80>,=W1PD(4)<40.43/82.80>,=W1SKU(4)<42.87/84.22>,=W3CB(4)<42.87/84.22>, - =W3CRZ(4)<40.43/82.80>,=W3HKK(4)<40.43/82.80>,=W3USA(4)<40.43/82.80>,=W4KD(4)<40.43/82.80>, - =W4YPW(4)<40.43/82.80>,=W5DT(4)<42.87/84.22>,=W5HIO(4)<40.43/82.80>,=W5KBW(4)<40.43/82.80>, - =W5UHQ(4)<40.43/82.80>,=WA1UJU(4)<42.87/84.22>,=WA2DHG(4)<40.43/82.80>,=WA3C(4)<40.43/82.80>, - =WA3JAT(4)<40.43/82.80>,=WA4MLD(4)<42.87/84.22>,=WB5WAH(4)<40.43/82.80>,=WO3X(4)<40.43/82.80>, - =WR4T(4)<40.43/82.80>,=WS6K(4)<40.43/82.80>, + WY8(4)<41.35/83.23>,WZ8(4)<41.35/83.23>,=AA1JM(4)<42.87/84.22>,=AA5TA(4)<40.43/82.80>, + =AH2AV(4)<42.87/84.22>,=K0ACP(4)<42.87/84.22>,=K1CCN(4)<40.43/82.80>,=K1LT(4)<40.43/82.80>, + =K1ND(4)<42.87/84.22>,=K2CUB(4)<42.87/84.22>,=K2KMC(4)<40.43/82.80>,=K2PM(4)<42.87/84.22>, + =K2YAZ(4)<42.87/84.22>,=K3DMG(4)<40.43/82.80>,=K3GP(4)<40.43/82.80>,=K3USC(4)<40.43/82.80>, + =K3VIN(4)<40.43/82.80>,=K3YP(4)<40.43/82.80>,=K4YJ(4)<40.43/82.80>,=K6HRU(4)<40.43/82.80>, + =K7TAR(4)<40.43/82.80>,=KA0AZS(4)<40.43/82.80>,=KA1LDD(4)<40.43/82.80>,=KA1RUE(4)<40.43/82.80>, + =KB4TLH(4)<40.43/82.80>,=KB5BGC(4)<42.87/84.22>,=KB6NU(4)<42.87/84.22>,=KE3K(4)<42.87/84.22>, + =KI6DY(4)<40.43/82.80>,=KK0L(4)<40.43/82.80>,=KL2YE(4)<42.87/84.22>,=KP4VZ(4)<40.43/82.80>, + =KQ4YC(4)<40.43/82.80>,=KS4OP(4)<40.43/82.80>,=N0FW(4)<40.43/82.80>,=N0TTI(4)<42.87/84.22>, + =N0VRS(4)<40.43/82.80>,=N1LB(4)<40.43/82.80>,=N2CB(4)<42.87/84.22>,=N2CCG(4)<42.87/84.22>, + =N3JJT(4)<40.43/82.80>,=N3RA(4)<40.43/82.80>,=N3WVB(4)<40.43/82.80>,=N4CSV(4)<40.43/82.80>, + =N4DBR(4)<42.87/84.22>,=N4EL(4)<40.43/82.80>,=N4HAI(4)<40.43/82.80>,=N4LSJ(4)<40.43/82.80>, + =N5JED(4)<40.43/82.80>,=N5MKY(4)<42.87/84.22>,=N5WCS(4)<42.87/84.22>,=N6FS(4)<42.87/84.22>, + =N6JRL(4)<40.43/82.80>,=N6VF(4)<40.43/82.80>,=ND3N(4)<40.43/82.80>,=NG3Q(4)<40.43/82.80>, + =W0CG(4)<40.43/82.80>,=W0JX(4)<40.43/82.80>,=W1CHL(4)<40.43/82.80>,=W1NN(4)<40.43/82.80>, + =W1PD(4)<40.43/82.80>,=W1SKU(4)<42.87/84.22>,=W3CB(4)<42.87/84.22>,=W3CRZ(4)<40.43/82.80>, + =W3HKK(4)<40.43/82.80>,=W3USA(4)<40.43/82.80>,=W4KD(4)<40.43/82.80>,=W4YPW(4)<40.43/82.80>, + =W5DT(4)<42.87/84.22>,=W5HIO(4)<40.43/82.80>,=W5KBW(4)<40.43/82.80>,=W5UHQ(4)<40.43/82.80>, + =WA1UJU(4)<42.87/84.22>,=WA2DHG(4)<40.43/82.80>,=WA3C(4)<40.43/82.80>,=WA3JAT(4)<40.43/82.80>, + =WA4MLD(4)<42.87/84.22>,=WB5WAH(4)<40.43/82.80>,=WO3X(4)<40.43/82.80>,=WR4T(4)<40.43/82.80>, + =WS6K(4)<40.43/82.80>, # IL-IN-WI AA9(4)<41.55/87.97>~6.0~,AB9(4)<41.55/87.97>~6.0~,AC9(4)<41.55/87.97>~6.0~, AD9(4)<41.55/87.97>~6.0~,AE9(4)<41.55/87.97>~6.0~,AF9(4)<41.55/87.97>~6.0~, @@ -3302,139 +3299,139 @@ United States: 05: 08: NA: 37.60: 91.87: 5.0: K: =K4DXV(4)<35.82/86.33>~6.0~,=K4DZR(4)<35.82/86.33>~6.0~,=K4EES(4)<33.02/86.75>~6.0~, =K4FBC(4)<33.02/86.75>~6.0~,=K4FN(4)<37.83/85.27>~6.0~,=K4FTY(4)<33.02/86.75>~6.0~, =K4GIG(4)<33.02/86.75>~6.0~,=K4HAL(4)<33.02/86.75>~6.0~,=K4HWS(4)<35.82/86.33>~6.0~, - =K4HY(4)<37.83/85.27>~6.0~,=K4IE(4)<37.83/85.27>~6.0~,=K4ISV(4)<37.83/85.27>~6.0~, - =K4KCG(4)<37.83/85.27>~6.0~,=K4KKI(4)<35.82/86.33>~6.0~,=K4KO(4)<35.82/86.33>~6.0~, - =K4KSV(4)<33.02/86.75>~6.0~,=K4KYN(4)<35.82/86.33>~6.0~,=K4LEN(4)<35.82/86.33>~6.0~, - =K4MSU(4)<37.83/85.27>~6.0~,=K4NO(4)<33.02/86.75>~6.0~,=K4OAQ(4)<35.82/86.33>~6.0~, - =K4PJ(4)<35.82/86.33>~6.0~,=K4PKM(4)<37.83/85.27>~6.0~,=K4PO(4)<33.02/86.75>~6.0~, - =K4RFT(4)<35.82/86.33>~6.0~,=K4RO(4)<35.82/86.33>~6.0~,=K4ROJ(4)<35.82/86.33>~6.0~, - =K4RST(4)<35.82/86.33>~6.0~,=K4SHA(4)<33.02/86.75>~6.0~,=K4SPO(4)<37.83/85.27>~6.0~, - =K4TCG(4)<35.82/86.33>~6.0~,=K4TEC(4)<37.83/85.27>~6.0~,=K4TG(4)<37.83/85.27>~6.0~, - =K4TIN(4)<33.02/86.75>~6.0~,=K4TNN(4)<35.82/86.33>~6.0~,=K4TO(4)<37.83/85.27>~6.0~, - =K4TXL(4)<35.82/86.33>~6.0~,=K4TZ(4)<37.83/85.27>~6.0~,=K4VIG(4)<35.82/86.33>~6.0~, - =K4WG(4)<33.02/86.75>~6.0~,=K4WI(4)<33.02/86.75>~6.0~,=K4WW(4)<37.83/85.27>~6.0~, - =K4XXX(4)<37.83/85.27>~6.0~,=K4YA(4)<35.82/86.33>~6.0~,=K4ZGB(4)<33.02/86.75>~6.0~, - =K5VBA(4)<33.02/86.75>~6.0~,=K5WP(4)<33.02/86.75>~6.0~,=K5ZQ(4)<37.83/85.27>~6.0~, - =KA3MTT(4)<37.83/85.27>~6.0~,=KA4J(4)<35.82/86.33>~6.0~,=KA4SCV(4)<35.82/86.33>~6.0~, - =KA5VZG(4)<35.82/86.33>~6.0~,=KB3A(4)<33.02/86.75>~6.0~,=KB4QZH(4)<37.83/85.27>~6.0~, - =KB4VL(4)<35.82/86.33>~6.0~,=KC1DWP(4)<35.82/86.33>~6.0~,=KC1RVY(4)<35.82/86.33>~6.0~, - =KC4BB(4)<33.02/86.75>~6.0~,=KC4FLT(4)<33.02/86.75>~6.0~,=KC4HW(4)<33.02/86.75>~6.0~, - =KC4NX(4)<35.82/86.33>~6.0~,=KC4OBX(4)<37.83/85.27>~6.0~,=KC4RNF(4)<33.02/86.75>~6.0~, - =KC4TEO(4)<33.02/86.75>~6.0~,=KC4TNQ(4)<35.82/86.33>~6.0~,=KC4WPS(4)<37.83/85.27>~6.0~, - =KC4WQ(4)<37.83/85.27>~6.0~,=KD4ADC(4)<33.02/86.75>~6.0~,=KD4EE(4)<37.83/85.27>~6.0~, - =KD4LT(4)<35.82/86.33>~6.0~,=KD4ULD(4)<37.83/85.27>~6.0~,=KD5USA(4)<33.02/86.75>~6.0~, - =KE0L(4)<35.82/86.33>~6.0~,=KE4BFG(4)<35.82/86.33>~6.0~,=KE4GOI(4)<33.02/86.75>~6.0~, - =KE4KY(4)<37.83/85.27>~6.0~,=KE4MRX(4)<35.82/86.33>~6.0~,=KE4QCY(4)<33.02/86.75>~6.0~, - =KE4SVI(4)<33.02/86.75>~6.0~,=KE4WE(4)<35.82/86.33>~6.0~,=KF4AV(4)<37.83/85.27>~6.0~, - =KF4FMQ(4)<37.83/85.27>~6.0~,=KF4RWA(4)<33.02/86.75>~6.0~,=KF4TY(4)<35.82/86.33>~6.0~, - =KF5MU(4)<37.83/85.27>~6.0~,=KF7CG(4)<35.82/86.33>~6.0~,=KG2MD(4)<33.02/86.75>~6.0~, - =KG4BIG(4)<37.83/85.27>~6.0~,=KG4CDL(4)<35.82/86.33>~6.0~,=KG4DBM(4)<35.82/86.33>~6.0~, - =KG4LKY(4)<37.83/85.27>~6.0~,=KG4Q(4)<33.02/86.75>~6.0~,=KG4SRK(4)<37.83/85.27>~6.0~, - =KG4STL(4)<35.82/86.33>~6.0~,=KH2AR(4)[7]<35.82/86.33>~6.0~,=KH2GM(4)<33.02/86.75>~6.0~, - =KI0EB(4)<37.83/85.27>~6.0~,=KI4KWR(4)<33.02/86.75>~6.0~,=KI4PHE(4)<33.02/86.75>~6.0~, - =KI4RKM(4)<35.82/86.33>~6.0~,=KI4VLI(4)<37.83/85.27>~6.0~,=KI4ZZJ(4)<35.82/86.33>~6.0~, - =KI5GX(4)<33.02/86.75>~6.0~,=KJ4A(4)<37.83/85.27>~6.0~,=KJ4AOM(4)<37.83/85.27>~6.0~, - =KJ4BIX(4)<35.82/86.33>~6.0~,=KJ4JPV(4)<35.82/86.33>~6.0~,=KJ4LTA(4)<33.02/86.75>~6.0~, - =KJ4M(4)<33.02/86.75>~6.0~,=KJ4ND(4)<37.83/85.27>~6.0~,=KJ4UGO(4)<33.02/86.75>~6.0~, - =KJ4YLR(4)<37.83/85.27>~6.0~,=KJ6YXI(4)<35.82/86.33>~6.0~,=KK2A(4)<35.82/86.33>~6.0~, - =KK4JW(4)<37.83/85.27>~6.0~,=KK4OVW(4)<35.82/86.33>~6.0~,=KK4XA(4)<35.82/86.33>~6.0~, - =KL1SE(4)<37.83/85.27>~6.0~,=KM1Z(4)<35.82/86.33>~6.0~,=KM4CH(4)<37.83/85.27>~6.0~, - =KM4CRC(4)<35.82/86.33>~6.0~,=KM4FO(4)<37.83/85.27>~6.0~,=KM4JAD(4)<35.82/86.33>~6.0~, - =KM4RO(4)<37.83/85.27>~6.0~,=KM4RT(4)<35.82/86.33>~6.0~,=KM4VI(4)<35.82/86.33>~6.0~, - =KN4CG(4)<37.83/85.27>~6.0~,=KN4CNU(4)<35.82/86.33>~6.0~,=KN4COE(4)<37.83/85.27>~6.0~, - =KN4DUA(4)<35.82/86.33>~6.0~,=KN4IXT(4)<35.82/86.33>~6.0~,=KN4LIU(4)<35.82/86.33>~6.0~, - =KN4PHS(4)<33.02/86.75>~6.0~,=KN4VKW(4)<35.82/86.33>~6.0~,=KO4AWC(4)<33.02/86.75>~6.0~, - =KO4CTP(4)<35.82/86.33>~6.0~,=KO4IFG(4)<35.82/86.33>~6.0~,=KO4MAO(4)<35.82/86.33>~6.0~, - =KO4O(4)<33.02/86.75>~6.0~,=KO4OL(4)<37.83/85.27>~6.0~,=KO4PZX(4)<35.82/86.33>~6.0~, - =KO4SKK(4)<33.02/86.75>~6.0~,=KO4TFE(4)<37.83/85.27>~6.0~,=KO4UHE(4)<37.83/85.27>~6.0~, - =KO4UOJ(4)<35.82/86.33>~6.0~,=KO4XJ(4)<37.83/85.27>~6.0~,=KO4YED(4)<35.82/86.33>~6.0~, - =KO4Z(4)<35.82/86.33>~6.0~,=KP4X(4)<35.82/86.33>~6.0~,=KR4F(4)<33.02/86.75>~6.0~, - =KS4VOL(4)<35.82/86.33>~6.0~,=KS4X(4)<35.82/86.33>~6.0~,=KS4YT(4)<33.02/86.75>~6.0~, - =KT4DW(4)<35.82/86.33>~6.0~,=KT4E(4)<35.82/86.33>~6.0~,=KT4O(4)<35.82/86.33>~6.0~, - =KT4RH(4)<35.82/86.33>~6.0~,=KT4RSQ(4)<35.82/86.33>~6.0~,=KT4TN(4)<35.82/86.33>~6.0~, - =KT4XA(4)<33.02/86.75>~6.0~,=KU4A(4)<37.83/85.27>~6.0~,=KU4H(4)<33.02/86.75>~6.0~, - =KU4RN(4)<35.82/86.33>~6.0~,=KV4AC(4)<33.02/86.75>~6.0~,=KV4T(4)<33.02/86.75>~6.0~, - =KW4J(4)<33.02/86.75>~6.0~,=KW4LU(4)<35.82/86.33>~6.0~,=KW4SW(4)<33.02/86.75>~6.0~, - =KW4YA(4)<37.83/85.27>~6.0~,=KX3Y(4)<33.02/86.75>~6.0~,=KX4AV(4)<37.83/85.27>~6.0~, - =KX4BI(4)<33.02/86.75>~6.0~,=KX4I(4)<33.02/86.75>~6.0~,=KX4X(4)<33.02/86.75>~6.0~, - =KY3G(4)<37.83/85.27>~6.0~,=KY4AR(4)<37.83/85.27>~6.0~,=KY4ARC(4)<37.83/85.27>~6.0~, - =KY4BG(4)<37.83/85.27>~6.0~,=KY4BP(4)<37.83/85.27>~6.0~,=KY4G(4)<33.02/86.75>~6.0~, - =KY4HV(4)<33.02/86.75>~6.0~,=KY4KY(4)<37.83/85.27>~6.0~,=KY4L(4)<35.82/86.33>~6.0~, - =KY4MAK(4)<37.83/85.27>~6.0~,=KY4X(4)<37.83/85.27>~6.0~,=KZ4A(4)<33.02/86.75>~6.0~, - =N0ZO(4)<33.02/86.75>~6.0~,=N1OKL(4)<35.82/86.33>~6.0~,=N3CY(4)<33.02/86.75>~6.0~, - =N4AER(4)<35.82/86.33>~6.0~,=N4ARO(4)<35.82/86.33>~6.0~,=N4ATU(4)<35.82/86.33>~6.0~, - =N4AU(4)<33.02/86.75>~6.0~,=N4CVG(4)<37.83/85.27>~6.0~,=N4DTF(4)<35.82/86.33>~6.0~, - =N4DW(4)<35.82/86.33>~6.0~,=N4DXN(4)<35.82/86.33>~6.0~,=N4EMP(4)<33.02/86.75>~6.0~, - =N4FR(4)<35.82/86.33>~6.0~,=N4FZ(4)<37.83/85.27>~6.0~,=N4GO(4)<37.83/85.27>~6.0~, - =N4IDH(4)<33.02/86.75>~6.0~,=N4JDB(4)<33.02/86.75>~6.0~,=N4JEH(4)<33.02/86.75>~6.0~, - =N4JKO(4)<37.83/85.27>~6.0~,=N4JN(4)<33.02/86.75>~6.0~,=N4JR(4)<33.02/86.75>~6.0~, - =N4JRG(4)<37.83/85.27>~6.0~,=N4KGL(4)<33.02/86.75>~6.0~,=N4KH(4)<33.02/86.75>~6.0~, - =N4KJR(4)<37.83/85.27>~6.0~,=N4KZ(4)<37.83/85.27>~6.0~,=N4LS(4)<33.02/86.75>~6.0~, - =N4LT(4)<35.82/86.33>~6.0~,=N4MCC(4)<35.82/86.33>~6.0~,=N4MJ(4)<35.82/86.33>~6.0~, - =N4MRM(4)<37.83/85.27>~6.0~,=N4MTE(4)<35.82/86.33>~6.0~,=N4MZ(4)<33.02/86.75>~6.0~, - =N4NA(4)<35.82/86.33>~6.0~,=N4NM(4)<33.02/86.75>~6.0~,=N4NP(4)<37.83/85.27>~6.0~, - =N4NT(4)<35.82/86.33>~6.0~,=N4OG(4)<37.83/85.27>~6.0~,=N4OPI(4)<35.82/86.33>~6.0~, - =N4PWG(4)<35.82/86.33>~6.0~,=N4PX(4)<35.82/86.33>~6.0~,=N4QS(4)<37.83/85.27>~6.0~, - =N4ROA(4)<37.83/85.27>~6.0~,=N4RRR(4)<35.82/86.33>~6.0~,=N4RT(4)<33.02/86.75>~6.0~, - =N4RZ(4)<37.83/85.27>~6.0~,=N4SEV(4)<33.02/86.75>~6.0~,=N4SS(4)<37.83/85.27>~6.0~, - =N4TY(4)<37.83/85.27>~6.0~,=N4UC(4)<33.02/86.75>~6.0~,=N4UL(4)<37.83/85.27>~6.0~, - =N4UW(4)<35.82/86.33>~6.0~,=N4VN(4)<33.02/86.75>~6.0~,=N4WE(4)<33.02/86.75>~6.0~, - =N4ZZ(4)<35.82/86.33>~6.0~,=N5INV(4)<35.82/86.33>~6.0~,=N6MA(4)<35.82/86.33>~6.0~, - =N7CR(4)<33.02/86.75>~6.0~,=N7KDT(4)<33.02/86.75>~6.0~,=NA4A(4)<33.02/86.75>~6.0~, - =NA4C(4)<35.82/86.33>~6.0~,=NA4D(4)<37.83/85.27>~6.0~,=NA4MM(4)<33.02/86.75>~6.0~, - =NA4W(4)<33.02/86.75>~6.0~,=ND4U(4)<35.82/86.33>~6.0~,=ND4X(4)<37.83/85.27>~6.0~, - =ND4Y(4)<37.83/85.27>~6.0~,=NE5W(4)<33.02/86.75>~6.0~,=NF4J(4)<33.02/86.75>~6.0~, - =NF7D(4)<33.02/86.75>~6.0~,=NH6T(4)<33.02/86.75>~6.0~,=NJ4P(4)<35.82/86.33>~6.0~, - =NK4I(4)<35.82/86.33>~6.0~,=NK4T(4)<33.02/86.75>~6.0~,=NN4H(4)<37.83/85.27>~6.0~, - =NN4NT(4)<33.02/86.75>~6.0~,=NN4SA(4)<33.02/86.75>~6.0~,=NN5SS(4)<35.82/86.33>~6.0~, - =NP3FB(4)<33.02/86.75>~6.0~,=NP4AC(4)<35.82/86.33>~6.0~,=NQ4Y(4)<35.82/86.33>~6.0~, - =NR4L(4)<35.82/86.33>~6.0~,=NS2X(4)<35.82/86.33>~6.0~,=NS4X(4)<35.82/86.33>~6.0~, - =NT4J(4)<35.82/86.33>~6.0~,=NT4W(4)<37.83/85.27>~6.0~,=NU4B(4)<35.82/86.33>~6.0~, - =NU4N(4)<37.83/85.27>~6.0~,=NV4G(4)<35.82/86.33>~6.0~,=NY4JB(4)<35.82/86.33>~6.0~, - =W0AG(4)<35.82/86.33>~6.0~,=W0SK(4)<35.82/86.33>~6.0~,=W1EG(4)<35.82/86.33>~6.0~, - =W1GKT(4)<33.02/86.75>~6.0~,=W1LTC(4)<35.82/86.33>~6.0~,=W1WSF(4)<35.82/86.33>~6.0~, - =W2BJN(4)<33.02/86.75>~6.0~,=W2LAT(4)<33.02/86.75>~6.0~,=W2RSS(4)<37.83/85.27>~6.0~, - =W3DEV(4)<35.82/86.33>~6.0~,=W3TB(4)<35.82/86.33>~6.0~,=W4AWE(4)<35.82/86.33>~6.0~, - =W4BAX(4)<35.82/86.33>~6.0~,=W4BCG(4)<35.82/86.33>~6.0~,=W4BLT(4)<33.02/86.75>~6.0~, - =W4CDA(4)<37.83/85.27>~6.0~,=W4CMG(4)<35.82/86.33>~6.0~,=W4CN(4)<37.83/85.27>~6.0~, - =W4CQE(4)<35.82/86.33>~6.0~,=W4CRV(4)<35.82/86.33>~6.0~,=W4DAN(4)<35.82/86.33>~6.0~, - =W4DHN(4)<33.02/86.75>~6.0~,=W4DTA(4)<35.82/86.33>~6.0~,=W4EM(4)<35.82/86.33>~6.0~, - =W4ER(4)<33.02/86.75>~6.0~,=W4ETA(4)<35.82/86.33>~6.0~,=W4GGM(4)<35.82/86.33>~6.0~, - =W4GKM(4)<35.82/86.33>~6.0~,=W4GON(4)<35.82/86.33>~6.0~,=W4HLR(4)<35.82/86.33>~6.0~, - =W4IAX(4)<33.02/86.75>~6.0~,=W4IL(4)<35.82/86.33>~6.0~,=W4IOD(4)<37.83/85.27>~6.0~, - =W4JH(4)<35.82/86.33>~6.0~,=W4JNB(4)<33.02/86.75>~6.0~,=W4JUU(4)<35.82/86.33>~6.0~, - =W4KW(4)<35.82/86.33>~6.0~,=W4LC(4)<37.83/85.27>~6.0~,=W4MRF(4)<37.83/85.27>~6.0~, - =W4NBS(4)<33.02/86.75>~6.0~,=W4NI(4)<35.82/86.33>~6.0~,=W4NJA(4)<37.83/85.27>~6.0~, - =W4NNF(4)<33.02/86.75>~6.0~,=W4NZ(4)<35.82/86.33>~6.0~,=W4OLB(4)<35.82/86.33>~6.0~, - =W4PA(4)<35.82/86.33>~6.0~,=W4PCA(4)<35.82/86.33>~6.0~,=W4PF(4)<37.83/85.27>~6.0~, - =W4PUD(4)<35.82/86.33>~6.0~,=W4RLB(4)<37.83/85.27>~6.0~,=W4RYW(4)<33.02/86.75>~6.0~, - =W4SDX(4)<35.82/86.33>~6.0~,=W4SK(4)<35.82/86.33>~6.0~,=W4SSF(4)<35.82/86.33>~6.0~, - =W4SV(4)<35.82/86.33>~6.0~,=W4TLK(4)<35.82/86.33>~6.0~,=W4TRC(4)<35.82/86.33>~6.0~, - =W4UAL(4)<33.02/86.75>~6.0~,=W4UT(4)<35.82/86.33>~6.0~,=W4UW(4)<35.82/86.33>~6.0~, - =W4UWC(4)<37.83/85.27>~6.0~,=W4VFF(4)<35.82/86.33>~6.0~,=W4WC(4)<35.82/86.33>~6.0~, - =W4WKU(4)<37.83/85.27>~6.0~,=W4WTS(4)<35.82/86.33>~6.0~,=W4WWV(4)<35.82/86.33>~6.0~, - =W4XK(4)<35.82/86.33>~6.0~,=W4YTO(4)<33.02/86.75>~6.0~,=W5ACQ(4)<35.82/86.33>~6.0~, - =W5HVV(4)<35.82/86.33>~6.0~,=W5MX(4)<37.83/85.27>~6.0~,=W5NZ(4)<33.02/86.75>~6.0~, - =W5PET(4)<37.83/85.27>~6.0~,=W6AWL(4)<35.82/86.33>~6.0~,=W6EMM(4)<35.82/86.33>~6.0~, - =W6LX(4)<37.83/85.27>~6.0~,=W6UB(4)<35.82/86.33>~6.0~,=WA1FCN(4)<33.02/86.75>~6.0~, - =WA4AA(4)<35.82/86.33>~6.0~,=WA4CAX(4)<33.02/86.75>~6.0~,=WA4CDP(4)<33.02/86.75>~6.0~, - =WA4CQG(4)<33.02/86.75>~6.0~,=WA4GGK(4)<33.02/86.75>~6.0~,=WA4HR(4)<35.82/86.33>~6.0~, - =WA4JA(4)<35.82/86.33>~6.0~,=WA4JK(4)<33.02/86.75>~6.0~,=WA4JQS(4)<37.83/85.27>~6.0~, - =WA4KY(4)<37.83/85.27>~6.0~,=WA4VEK(4)<33.02/86.75>~6.0~,=WA4VGZ(4)<35.82/86.33>~6.0~, - =WA4WZR(4)<35.82/86.33>~6.0~,=WA4YJB(4)<37.83/85.27>~6.0~,=WA4ZXV(4)<33.02/86.75>~6.0~, - =WA5POK(4)<35.82/86.33>~6.0~,=WB0CJB(4)<35.82/86.33>~6.0~,=WB4E(4)<35.82/86.33>~6.0~, - =WB4FWQ(4)<35.82/86.33>~6.0~,=WB4GHZ(4)<35.82/86.33>~6.0~,=WB4HMA(4)<35.82/86.33>~6.0~, - =WB4IT(4)<33.02/86.75>~6.0~,=WB4WXE(4)<33.02/86.75>~6.0~,=WB4YDL(4)<35.82/86.33>~6.0~, - =WB4YDY(4)<35.82/86.33>~6.0~,=WB4ZBI(4)<35.82/86.33>~6.0~,=WB5WAJ(4)<35.82/86.33>~6.0~, - =WC4AR(4)<35.82/86.33>~6.0~,=WC4DC(4)<35.82/86.33>~6.0~,=WD4CFN(4)<35.82/86.33>~6.0~, - =WD4KTF(4)<37.83/85.27>~6.0~,=WD4OHD(4)<35.82/86.33>~6.0~,=WD4PTJ(4)<35.82/86.33>~6.0~, - =WD5FCA(4)<33.02/86.75>~6.0~,=WE5P(4)<37.83/85.27>~6.0~,=WF3T(4)<37.83/85.27>~6.0~, - =WF7T(4)<35.82/86.33>~6.0~,=WH6DM(4)<33.02/86.75>~6.0~,=WI4MPY(4)<37.83/85.27>~6.0~, - =WM4Q(4)<35.82/86.33>~6.0~,=WN4AT(4)<33.02/86.75>~6.0~,=WR3O(4)<35.82/86.33>~6.0~, - =WT4U(4)<35.82/86.33>~6.0~,=WT4W(4)<33.02/86.75>~6.0~,=WU7Q(4)<35.82/86.33>~6.0~, - =WV4P(4)<35.82/86.33>~6.0~,=WW0CJ(4)<35.82/86.33>~6.0~,=WW4N(4)<35.82/86.33>~6.0~, - =WW4R(4)<35.82/86.33>~6.0~,=WW5M(4)<35.82/86.33>~6.0~,=WW5X(4)<33.02/86.75>~6.0~, - =WX4HP(4)<33.02/86.75>~6.0~,=WX4W(4)<37.83/85.27>~6.0~,=WZ4F(4)<33.02/86.75>~6.0~, + =K4HY(4)<37.83/85.27>~6.0~,=K4IE(4)<37.83/85.27>~6.0~,=K4KCG(4)<37.83/85.27>~6.0~, + =K4KKI(4)<35.82/86.33>~6.0~,=K4KO(4)<35.82/86.33>~6.0~,=K4KSV(4)<33.02/86.75>~6.0~, + =K4KYN(4)<35.82/86.33>~6.0~,=K4LEN(4)<35.82/86.33>~6.0~,=K4MSU(4)<37.83/85.27>~6.0~, + =K4NO(4)<33.02/86.75>~6.0~,=K4OAQ(4)<35.82/86.33>~6.0~,=K4PJ(4)<35.82/86.33>~6.0~, + =K4PKM(4)<37.83/85.27>~6.0~,=K4PO(4)<33.02/86.75>~6.0~,=K4RFT(4)<35.82/86.33>~6.0~, + =K4RO(4)<35.82/86.33>~6.0~,=K4ROJ(4)<35.82/86.33>~6.0~,=K4RST(4)<35.82/86.33>~6.0~, + =K4SHA(4)<33.02/86.75>~6.0~,=K4SPO(4)<37.83/85.27>~6.0~,=K4TCG(4)<35.82/86.33>~6.0~, + =K4TEC(4)<37.83/85.27>~6.0~,=K4TG(4)<37.83/85.27>~6.0~,=K4TIN(4)<33.02/86.75>~6.0~, + =K4TNN(4)<35.82/86.33>~6.0~,=K4TO(4)<37.83/85.27>~6.0~,=K4TXL(4)<35.82/86.33>~6.0~, + =K4TZ(4)<37.83/85.27>~6.0~,=K4VIG(4)<35.82/86.33>~6.0~,=K4WG(4)<33.02/86.75>~6.0~, + =K4WI(4)<33.02/86.75>~6.0~,=K4WW(4)<37.83/85.27>~6.0~,=K4XXX(4)<37.83/85.27>~6.0~, + =K4YA(4)<35.82/86.33>~6.0~,=K4ZGB(4)<33.02/86.75>~6.0~,=K5VBA(4)<33.02/86.75>~6.0~, + =K5WP(4)<33.02/86.75>~6.0~,=K5ZQ(4)<37.83/85.27>~6.0~,=KA3MTT(4)<37.83/85.27>~6.0~, + =KA4J(4)<35.82/86.33>~6.0~,=KA4SCV(4)<35.82/86.33>~6.0~,=KA5VZG(4)<35.82/86.33>~6.0~, + =KB3A(4)<33.02/86.75>~6.0~,=KB4QZH(4)<37.83/85.27>~6.0~,=KB4VL(4)<35.82/86.33>~6.0~, + =KC1DWP(4)<35.82/86.33>~6.0~,=KC1RVY(4)<35.82/86.33>~6.0~,=KC4BB(4)<33.02/86.75>~6.0~, + =KC4FLT(4)<33.02/86.75>~6.0~,=KC4HW(4)<33.02/86.75>~6.0~,=KC4NX(4)<35.82/86.33>~6.0~, + =KC4OBX(4)<37.83/85.27>~6.0~,=KC4RNF(4)<33.02/86.75>~6.0~,=KC4TEO(4)<33.02/86.75>~6.0~, + =KC4TNQ(4)<35.82/86.33>~6.0~,=KC4WPS(4)<37.83/85.27>~6.0~,=KC4WQ(4)<37.83/85.27>~6.0~, + =KD4ADC(4)<33.02/86.75>~6.0~,=KD4EE(4)<37.83/85.27>~6.0~,=KD4LT(4)<35.82/86.33>~6.0~, + =KD4ULD(4)<37.83/85.27>~6.0~,=KD5USA(4)<33.02/86.75>~6.0~,=KE0L(4)<35.82/86.33>~6.0~, + =KE4BFG(4)<35.82/86.33>~6.0~,=KE4GOI(4)<33.02/86.75>~6.0~,=KE4KY(4)<37.83/85.27>~6.0~, + =KE4MRX(4)<35.82/86.33>~6.0~,=KE4QCY(4)<33.02/86.75>~6.0~,=KE4SVI(4)<33.02/86.75>~6.0~, + =KE4WE(4)<35.82/86.33>~6.0~,=KF4AV(4)<37.83/85.27>~6.0~,=KF4FMQ(4)<37.83/85.27>~6.0~, + =KF4RWA(4)<33.02/86.75>~6.0~,=KF4TY(4)<35.82/86.33>~6.0~,=KF5MU(4)<37.83/85.27>~6.0~, + =KF7CG(4)<35.82/86.33>~6.0~,=KG2MD(4)<33.02/86.75>~6.0~,=KG4BIG(4)<37.83/85.27>~6.0~, + =KG4CDL(4)<35.82/86.33>~6.0~,=KG4DBM(4)<35.82/86.33>~6.0~,=KG4LKY(4)<37.83/85.27>~6.0~, + =KG4Q(4)<33.02/86.75>~6.0~,=KG4SRK(4)<37.83/85.27>~6.0~,=KG4STL(4)<35.82/86.33>~6.0~, + =KH2AR(4)[7]<35.82/86.33>~6.0~,=KH2GM(4)<33.02/86.75>~6.0~,=KI0EB(4)<37.83/85.27>~6.0~, + =KI4KWR(4)<33.02/86.75>~6.0~,=KI4PHE(4)<33.02/86.75>~6.0~,=KI4RKM(4)<35.82/86.33>~6.0~, + =KI4VLI(4)<37.83/85.27>~6.0~,=KI4ZZJ(4)<35.82/86.33>~6.0~,=KI5GX(4)<33.02/86.75>~6.0~, + =KJ4A(4)<37.83/85.27>~6.0~,=KJ4AOM(4)<37.83/85.27>~6.0~,=KJ4BIX(4)<35.82/86.33>~6.0~, + =KJ4JPV(4)<35.82/86.33>~6.0~,=KJ4LTA(4)<33.02/86.75>~6.0~,=KJ4M(4)<33.02/86.75>~6.0~, + =KJ4ND(4)<37.83/85.27>~6.0~,=KJ4UGO(4)<33.02/86.75>~6.0~,=KJ4YLR(4)<37.83/85.27>~6.0~, + =KJ6YXI(4)<35.82/86.33>~6.0~,=KK2A(4)<35.82/86.33>~6.0~,=KK4JW(4)<37.83/85.27>~6.0~, + =KK4OVW(4)<35.82/86.33>~6.0~,=KK4XA(4)<35.82/86.33>~6.0~,=KL1SE(4)<37.83/85.27>~6.0~, + =KM1Z(4)<35.82/86.33>~6.0~,=KM4CH(4)<37.83/85.27>~6.0~,=KM4CRC(4)<35.82/86.33>~6.0~, + =KM4FO(4)<37.83/85.27>~6.0~,=KM4JAD(4)<35.82/86.33>~6.0~,=KM4RO(4)<37.83/85.27>~6.0~, + =KM4RT(4)<35.82/86.33>~6.0~,=KM4VI(4)<35.82/86.33>~6.0~,=KN4CG(4)<37.83/85.27>~6.0~, + =KN4CNU(4)<35.82/86.33>~6.0~,=KN4COE(4)<37.83/85.27>~6.0~,=KN4DUA(4)<35.82/86.33>~6.0~, + =KN4IXT(4)<35.82/86.33>~6.0~,=KN4LIU(4)<35.82/86.33>~6.0~,=KN4PHS(4)<33.02/86.75>~6.0~, + =KN4VKW(4)<35.82/86.33>~6.0~,=KO4AWC(4)<33.02/86.75>~6.0~,=KO4CTP(4)<35.82/86.33>~6.0~, + =KO4IFG(4)<35.82/86.33>~6.0~,=KO4MAO(4)<35.82/86.33>~6.0~,=KO4O(4)<33.02/86.75>~6.0~, + =KO4OL(4)<37.83/85.27>~6.0~,=KO4PZX(4)<35.82/86.33>~6.0~,=KO4SKK(4)<33.02/86.75>~6.0~, + =KO4TFE(4)<37.83/85.27>~6.0~,=KO4UHE(4)<37.83/85.27>~6.0~,=KO4UOJ(4)<35.82/86.33>~6.0~, + =KO4XJ(4)<37.83/85.27>~6.0~,=KO4YED(4)<35.82/86.33>~6.0~,=KO4Z(4)<35.82/86.33>~6.0~, + =KP4X(4)<35.82/86.33>~6.0~,=KR4F(4)<33.02/86.75>~6.0~,=KS4VOL(4)<35.82/86.33>~6.0~, + =KS4X(4)<35.82/86.33>~6.0~,=KS4YT(4)<33.02/86.75>~6.0~,=KT4DW(4)<35.82/86.33>~6.0~, + =KT4E(4)<35.82/86.33>~6.0~,=KT4O(4)<35.82/86.33>~6.0~,=KT4RH(4)<35.82/86.33>~6.0~, + =KT4RSQ(4)<35.82/86.33>~6.0~,=KT4TN(4)<35.82/86.33>~6.0~,=KT4XA(4)<33.02/86.75>~6.0~, + =KU4A(4)<37.83/85.27>~6.0~,=KU4H(4)<33.02/86.75>~6.0~,=KU4RN(4)<35.82/86.33>~6.0~, + =KV4AC(4)<33.02/86.75>~6.0~,=KV4T(4)<33.02/86.75>~6.0~,=KW4J(4)<33.02/86.75>~6.0~, + =KW4LU(4)<35.82/86.33>~6.0~,=KW4SW(4)<33.02/86.75>~6.0~,=KW4YA(4)<37.83/85.27>~6.0~, + =KX3Y(4)<33.02/86.75>~6.0~,=KX4AV(4)<37.83/85.27>~6.0~,=KX4BI(4)<33.02/86.75>~6.0~, + =KX4I(4)<33.02/86.75>~6.0~,=KX4X(4)<33.02/86.75>~6.0~,=KY3G(4)<37.83/85.27>~6.0~, + =KY4AR(4)<37.83/85.27>~6.0~,=KY4ARC(4)<37.83/85.27>~6.0~,=KY4BG(4)<37.83/85.27>~6.0~, + =KY4BP(4)<37.83/85.27>~6.0~,=KY4G(4)<33.02/86.75>~6.0~,=KY4HV(4)<33.02/86.75>~6.0~, + =KY4KY(4)<37.83/85.27>~6.0~,=KY4L(4)<35.82/86.33>~6.0~,=KY4MAK(4)<37.83/85.27>~6.0~, + =KY4X(4)<37.83/85.27>~6.0~,=KZ4A(4)<33.02/86.75>~6.0~,=N0ZO(4)<33.02/86.75>~6.0~, + =N1OKL(4)<35.82/86.33>~6.0~,=N3CY(4)<33.02/86.75>~6.0~,=N4AER(4)<35.82/86.33>~6.0~, + =N4ARO(4)<35.82/86.33>~6.0~,=N4ATU(4)<35.82/86.33>~6.0~,=N4AU(4)<33.02/86.75>~6.0~, + =N4CVG(4)<37.83/85.27>~6.0~,=N4DTF(4)<35.82/86.33>~6.0~,=N4DW(4)<35.82/86.33>~6.0~, + =N4DXN(4)<35.82/86.33>~6.0~,=N4EMP(4)<33.02/86.75>~6.0~,=N4FR(4)<35.82/86.33>~6.0~, + =N4FZ(4)<37.83/85.27>~6.0~,=N4GO(4)<37.83/85.27>~6.0~,=N4IDH(4)<33.02/86.75>~6.0~, + =N4JDB(4)<33.02/86.75>~6.0~,=N4JEH(4)<33.02/86.75>~6.0~,=N4JKO(4)<37.83/85.27>~6.0~, + =N4JN(4)<33.02/86.75>~6.0~,=N4JR(4)<33.02/86.75>~6.0~,=N4JRG(4)<37.83/85.27>~6.0~, + =N4KGL(4)<33.02/86.75>~6.0~,=N4KH(4)<33.02/86.75>~6.0~,=N4KJR(4)<37.83/85.27>~6.0~, + =N4KZ(4)<37.83/85.27>~6.0~,=N4LS(4)<33.02/86.75>~6.0~,=N4LT(4)<35.82/86.33>~6.0~, + =N4MCC(4)<35.82/86.33>~6.0~,=N4MJ(4)<35.82/86.33>~6.0~,=N4MRM(4)<37.83/85.27>~6.0~, + =N4MTE(4)<35.82/86.33>~6.0~,=N4MZ(4)<33.02/86.75>~6.0~,=N4NA(4)<35.82/86.33>~6.0~, + =N4NM(4)<33.02/86.75>~6.0~,=N4NP(4)<37.83/85.27>~6.0~,=N4NT(4)<35.82/86.33>~6.0~, + =N4OG(4)<37.83/85.27>~6.0~,=N4OPI(4)<35.82/86.33>~6.0~,=N4PWG(4)<35.82/86.33>~6.0~, + =N4PX(4)<35.82/86.33>~6.0~,=N4QS(4)<37.83/85.27>~6.0~,=N4ROA(4)<37.83/85.27>~6.0~, + =N4RRR(4)<35.82/86.33>~6.0~,=N4RT(4)<33.02/86.75>~6.0~,=N4RZ(4)<37.83/85.27>~6.0~, + =N4SEV(4)<33.02/86.75>~6.0~,=N4SS(4)<37.83/85.27>~6.0~,=N4TY(4)<37.83/85.27>~6.0~, + =N4UC(4)<33.02/86.75>~6.0~,=N4UL(4)<37.83/85.27>~6.0~,=N4UW(4)<35.82/86.33>~6.0~, + =N4VN(4)<33.02/86.75>~6.0~,=N4WE(4)<33.02/86.75>~6.0~,=N4ZZ(4)<35.82/86.33>~6.0~, + =N5INV(4)<35.82/86.33>~6.0~,=N6MA(4)<35.82/86.33>~6.0~,=N7CR(4)<33.02/86.75>~6.0~, + =N7KDT(4)<33.02/86.75>~6.0~,=NA4A(4)<33.02/86.75>~6.0~,=NA4C(4)<35.82/86.33>~6.0~, + =NA4D(4)<37.83/85.27>~6.0~,=NA4MM(4)<33.02/86.75>~6.0~,=NA4W(4)<33.02/86.75>~6.0~, + =ND4U(4)<35.82/86.33>~6.0~,=ND4X(4)<37.83/85.27>~6.0~,=ND4Y(4)<37.83/85.27>~6.0~, + =NE5W(4)<33.02/86.75>~6.0~,=NF4J(4)<33.02/86.75>~6.0~,=NF7D(4)<33.02/86.75>~6.0~, + =NH6T(4)<33.02/86.75>~6.0~,=NJ4P(4)<35.82/86.33>~6.0~,=NK4I(4)<35.82/86.33>~6.0~, + =NK4T(4)<33.02/86.75>~6.0~,=NN4H(4)<37.83/85.27>~6.0~,=NN4NT(4)<33.02/86.75>~6.0~, + =NN4SA(4)<33.02/86.75>~6.0~,=NN5SS(4)<35.82/86.33>~6.0~,=NP3FB(4)<33.02/86.75>~6.0~, + =NP4AC(4)<35.82/86.33>~6.0~,=NQ4Y(4)<35.82/86.33>~6.0~,=NR4L(4)<35.82/86.33>~6.0~, + =NS2X(4)<35.82/86.33>~6.0~,=NS4X(4)<35.82/86.33>~6.0~,=NT4J(4)<35.82/86.33>~6.0~, + =NT4W(4)<37.83/85.27>~6.0~,=NU4B(4)<35.82/86.33>~6.0~,=NU4N(4)<37.83/85.27>~6.0~, + =NV4G(4)<35.82/86.33>~6.0~,=NY4JB(4)<35.82/86.33>~6.0~,=W0AG(4)<35.82/86.33>~6.0~, + =W0SK(4)<35.82/86.33>~6.0~,=W1EG(4)<35.82/86.33>~6.0~,=W1GKT(4)<33.02/86.75>~6.0~, + =W1LTC(4)<35.82/86.33>~6.0~,=W1WSF(4)<35.82/86.33>~6.0~,=W2BJN(4)<33.02/86.75>~6.0~, + =W2LAT(4)<33.02/86.75>~6.0~,=W2RSS(4)<37.83/85.27>~6.0~,=W3DEV(4)<35.82/86.33>~6.0~, + =W3TB(4)<35.82/86.33>~6.0~,=W4AWE(4)<35.82/86.33>~6.0~,=W4BAX(4)<35.82/86.33>~6.0~, + =W4BCG(4)<35.82/86.33>~6.0~,=W4BLT(4)<33.02/86.75>~6.0~,=W4CDA(4)<37.83/85.27>~6.0~, + =W4CMG(4)<35.82/86.33>~6.0~,=W4CN(4)<37.83/85.27>~6.0~,=W4CQE(4)<35.82/86.33>~6.0~, + =W4CRV(4)<35.82/86.33>~6.0~,=W4DAN(4)<35.82/86.33>~6.0~,=W4DHN(4)<33.02/86.75>~6.0~, + =W4DTA(4)<35.82/86.33>~6.0~,=W4EM(4)<35.82/86.33>~6.0~,=W4ER(4)<33.02/86.75>~6.0~, + =W4ETA(4)<35.82/86.33>~6.0~,=W4GGM(4)<35.82/86.33>~6.0~,=W4GKM(4)<35.82/86.33>~6.0~, + =W4GON(4)<35.82/86.33>~6.0~,=W4HLR(4)<35.82/86.33>~6.0~,=W4IAX(4)<33.02/86.75>~6.0~, + =W4IL(4)<35.82/86.33>~6.0~,=W4IOD(4)<37.83/85.27>~6.0~,=W4JH(4)<35.82/86.33>~6.0~, + =W4JNB(4)<33.02/86.75>~6.0~,=W4JUU(4)<35.82/86.33>~6.0~,=W4KW(4)<35.82/86.33>~6.0~, + =W4LC(4)<37.83/85.27>~6.0~,=W4MRF(4)<37.83/85.27>~6.0~,=W4NBS(4)<33.02/86.75>~6.0~, + =W4NI(4)<35.82/86.33>~6.0~,=W4NJA(4)<37.83/85.27>~6.0~,=W4NNF(4)<33.02/86.75>~6.0~, + =W4NZ(4)<35.82/86.33>~6.0~,=W4OLB(4)<35.82/86.33>~6.0~,=W4PA(4)<35.82/86.33>~6.0~, + =W4PCA(4)<35.82/86.33>~6.0~,=W4PF(4)<37.83/85.27>~6.0~,=W4PUD(4)<35.82/86.33>~6.0~, + =W4RLB(4)<37.83/85.27>~6.0~,=W4RYW(4)<33.02/86.75>~6.0~,=W4SDX(4)<35.82/86.33>~6.0~, + =W4SK(4)<35.82/86.33>~6.0~,=W4SSF(4)<35.82/86.33>~6.0~,=W4SV(4)<35.82/86.33>~6.0~, + =W4TLK(4)<35.82/86.33>~6.0~,=W4TRC(4)<35.82/86.33>~6.0~,=W4UAL(4)<33.02/86.75>~6.0~, + =W4UT(4)<35.82/86.33>~6.0~,=W4UW(4)<35.82/86.33>~6.0~,=W4UWC(4)<37.83/85.27>~6.0~, + =W4VFF(4)<35.82/86.33>~6.0~,=W4WC(4)<35.82/86.33>~6.0~,=W4WKU(4)<37.83/85.27>~6.0~, + =W4WTS(4)<35.82/86.33>~6.0~,=W4WWV(4)<35.82/86.33>~6.0~,=W4XK(4)<35.82/86.33>~6.0~, + =W4YTO(4)<33.02/86.75>~6.0~,=W5ACQ(4)<35.82/86.33>~6.0~,=W5HVV(4)<35.82/86.33>~6.0~, + =W5MX(4)<37.83/85.27>~6.0~,=W5NZ(4)<33.02/86.75>~6.0~,=W5PET(4)<37.83/85.27>~6.0~, + =W6AWL(4)<35.82/86.33>~6.0~,=W6EMM(4)<35.82/86.33>~6.0~,=W6LX(4)<37.83/85.27>~6.0~, + =W6UB(4)<35.82/86.33>~6.0~,=WA1FCN(4)<33.02/86.75>~6.0~,=WA4AA(4)<35.82/86.33>~6.0~, + =WA4CAX(4)<33.02/86.75>~6.0~,=WA4CDP(4)<33.02/86.75>~6.0~,=WA4CQG(4)<33.02/86.75>~6.0~, + =WA4GGK(4)<33.02/86.75>~6.0~,=WA4HR(4)<35.82/86.33>~6.0~,=WA4JA(4)<35.82/86.33>~6.0~, + =WA4JK(4)<33.02/86.75>~6.0~,=WA4JQS(4)<37.83/85.27>~6.0~,=WA4KY(4)<37.83/85.27>~6.0~, + =WA4VEK(4)<33.02/86.75>~6.0~,=WA4VGZ(4)<35.82/86.33>~6.0~,=WA4WZR(4)<35.82/86.33>~6.0~, + =WA4YJB(4)<37.83/85.27>~6.0~,=WA4ZXV(4)<33.02/86.75>~6.0~,=WA5POK(4)<35.82/86.33>~6.0~, + =WB0CJB(4)<35.82/86.33>~6.0~,=WB4E(4)<35.82/86.33>~6.0~,=WB4FWQ(4)<35.82/86.33>~6.0~, + =WB4GHZ(4)<35.82/86.33>~6.0~,=WB4HMA(4)<35.82/86.33>~6.0~,=WB4IT(4)<33.02/86.75>~6.0~, + =WB4WXE(4)<33.02/86.75>~6.0~,=WB4YDL(4)<35.82/86.33>~6.0~,=WB4YDY(4)<35.82/86.33>~6.0~, + =WB4ZBI(4)<35.82/86.33>~6.0~,=WB5WAJ(4)<35.82/86.33>~6.0~,=WC4AR(4)<35.82/86.33>~6.0~, + =WC4DC(4)<35.82/86.33>~6.0~,=WD4CFN(4)<35.82/86.33>~6.0~,=WD4KTF(4)<37.83/85.27>~6.0~, + =WD4OHD(4)<35.82/86.33>~6.0~,=WD4PTJ(4)<35.82/86.33>~6.0~,=WD5FCA(4)<33.02/86.75>~6.0~, + =WE5P(4)<37.83/85.27>~6.0~,=WF3T(4)<37.83/85.27>~6.0~,=WF7T(4)<35.82/86.33>~6.0~, + =WH6DM(4)<33.02/86.75>~6.0~,=WI4MPY(4)<37.83/85.27>~6.0~,=WM4Q(4)<35.82/86.33>~6.0~, + =WN4AT(4)<33.02/86.75>~6.0~,=WR3O(4)<35.82/86.33>~6.0~,=WT4U(4)<35.82/86.33>~6.0~, + =WT4W(4)<33.02/86.75>~6.0~,=WU7Q(4)<35.82/86.33>~6.0~,=WV4P(4)<35.82/86.33>~6.0~, + =WW0CJ(4)<35.82/86.33>~6.0~,=WW4N(4)<35.82/86.33>~6.0~,=WW4R(4)<35.82/86.33>~6.0~, + =WW5M(4)<35.82/86.33>~6.0~,=WW5X(4)<33.02/86.75>~6.0~,=WX4HP(4)<33.02/86.75>~6.0~, + =WX4W(4)<37.83/85.27>~6.0~,=WZ4F(4)<33.02/86.75>~6.0~, # MT-WY =AC7AF(4)[7]<42.70/106.98>~7.0~,=AE7AP(4)[6]<46.77/111.32>~7.0~,=AL7RT(4)[6]<46.77/111.32>~7.0~, =K0SN(4)[6]<46.77/111.32>~7.0~,=K1AUS(4)[7]<46.77/111.32>~7.0~,=K5MH(4)[6]<46.77/111.32>~7.0~, @@ -3497,30 +3494,30 @@ Palmyra & Jarvis Islands: 31: 61: OC: 5.87: 162.07: 11.0: KH5: AH5,KH5,NH5,WH5; # ADIF 110 Hawaii: 31: 61: OC: 21.12: 157.48: 10.0: KH6: - AH6,AH7,KH6,KH7,NH6,NH7,WH6,WH7,=AA2TT,=AA3CM,=AB7RT,=K1ENT,=K2GT,=K3RW,=K4XV,=K5ZYO,=K6ARS, - =K6BDN,=K6DCA,=K6HI,=K7DWJ,=KA1MRC,=KA6MCS,=KB6EGA,=KC8UHF,=KC9WIB,=KD0OLJ,=KD0VQY,=KD6NFT, - =KE0TCW,=KE6AEZ,=KE8LGD,=KF0FMQ,=KF5QMN,=KF5VYL,=KF6PHC,=KF7SEE,=KG6HWF,=KG6JSH,=KG7ART,=KH0WJ, - =KH3AE,=KI5YDR,=KJ6LVS,=KJ6WIE,=KK6CSE,=KK6YBW,=KM6NFS,=KM6RJA,=KO4LNN,=KO4ZYO,=KR3BLK,=KX4ES, - =N3GWR,=N3QIP,=N8KGB,=W2DK,=W8EBR,=WA0CMY,=WA6QDQ,=WB2CAT,=WB4JTT,=WK1K,=WW7CC; + AH6,AH7,KH6,KH7,NH6,NH7,WH6,WH7,=AA3CM,=AB7RT,=K1ENT,=K2GT,=K3RW,=K4XV,=K5ZYO,=K6ARS,=K6BDN, + =K6DCA,=K6HI,=K7DWJ,=KA1MRC,=KB6EGA,=KC8UHF,=KC9WIB,=KD0OLJ,=KD0VQY,=KD6NFT,=KE0TCW,=KE6AEZ, + =KE8LGD,=KF0FMQ,=KF5QMN,=KF5VYL,=KF6PHC,=KF7SEE,=KG6HWF,=KG6JSH,=KG7ART,=KH0WJ,=KH3AE,=KI5YDR, + =KJ6LVS,=KJ6WIE,=KK6CSE,=KK6YBW,=KM6NFS,=KM6RJA,=KO4LNN,=KO4ZYO,=KR3BLK,=KX4ES,=N3GWR,=N3QIP, + =N6LTM,=N6LZL,=N8KGB,=W2DK,=W6GKL,=W8EBR,=WA0CMY,=WA6QDQ,=WB2CAT,=WB4JTT,=WK1K,=WW7CC; # ADIF 138 Kure Island: 31: 61: OC: 29.00: 178.00: 10.0: KH7K: AH7K,KH7K,NH7K,WH7K; # ADIF 9 American Samoa: 32: 62: OC: -14.32: 170.78: 11.0: KH8: - AH8,KH8,NH8,WH8; + AH8,KH8,NH8,WH8,=KG7ITH; # ADIF 515 Swains Island: 32: 62: OC: -11.05: 171.25: 11.0: KH8/s: - =W8S; + =K8R,=W8S; # ADIF 297 Wake Island: 31: 65: OC: 19.28: -166.63: -12.0: KH9: AH9,KH9,NH9,WH9; # ADIF 6 Alaska: 01: 01: NA: 61.40: 148.87: 8.0: KL: - AL,KL,NL,WL,=AC7EV,=AD0DK,=AG6PI,=K3RCJ,=K5GEC,=K7TWN,=K7WJH,=KA1NCN,=KA2ZSD,=KA7TOM,=KB1BED, - =KC0QOB,=KC2LHD,=KD2ZZV,=KD7OTW,=KD7RF,=KD7UZB,=KD8SOV,=KE0PRX,=KE0RWP,=KE0WDR,=KE6FNQ,=KE8BZA, - =KF0EXR,=KF7PFN,=KF7WUC,=KG5WFF,=KG5WFG,=KG7ARV,=KG7AUD,=KG7BFK,=KG7GSU,=KI5HPI,=KI6ZYO,=KI7CPI, - =KI7DUW,=KI7HOC,=KI7SUU,=KJ6EHV,=KJ7AXV,=KJ7IXG,=KJ7VMN,=KK6BVH,=KK6CAU,=KK6IMB,=KK7GPT,=KN6OEF, - =N0SN,=N1TX,=N2KJU,=N7DKL,=W3MKG,=W5MSC,=W7ORR,=WA7MOS; + AL,KL,NL,WL,=AC7EV,=AD0DK,=AG6PI,=AK6DA,=K3RCJ,=K5GEC,=K7TWN,=K7WJH,=KA1NCN,=KA2ZSD,=KA7TOM, + =KB1BED,=KC0QOB,=KC2LHD,=KD2ZZV,=KD7OTW,=KD7RF,=KD7UZB,=KD8SOV,=KE0PRX,=KE0RWP,=KE0WDR,=KE6FNQ, + =KE8BZA,=KF0EXR,=KF7PFN,=KF7WUC,=KG5WFF,=KG5WFG,=KG7ARV,=KG7AUD,=KG7BFK,=KG7GSU,=KG7ORS,=KI5HPI, + =KI6ZYO,=KI7CPI,=KI7DUW,=KI7HOC,=KI7SUU,=KJ6EHV,=KJ7AXV,=KJ7IXG,=KJ7VMN,=KK6BVH,=KK6CAU,=KK6IMB, + =KK7GPT,=KN6OEF,=N0SN,=N1TX,=N2KJU,=N7DKL,=W3MKG,=W5MSC,=WA7MOS; # ADIF 182 Navassa Island: 08: 11: NA: 18.40: 75.00: 5.0: KP1: KP1,NP1,WP1; @@ -3732,8 +3729,8 @@ Argentina: 13: 14: SA: -32.50: 62.13: 3.0: LU: LW2E<-33.70/61.00>,LW3D<-33.70/61.00>,LW3E<-33.70/61.00>,LW4D<-33.70/61.00>,LW4E<-33.70/61.00>, LW5D<-33.70/61.00>,LW5E<-33.70/61.00>,LW6D<-33.70/61.00>,LW6E<-33.70/61.00>,LW7D<-33.70/61.00>, LW7E<-33.70/61.00>,LW8D<-33.70/61.00>,LW8E<-33.70/61.00>,LW9D<-33.70/61.00>,LW9E<-33.70/61.00>, - =LT2F/D<-33.70/61.00>,=LU1DUA/D<-33.70/61.00>,=LU3EU/D<-33.70/61.00>,=LU4ARU/D<-33.70/61.00>, - =LU7CC/E<-33.70/61.00>, + =LT2F/D<-33.70/61.00>,=LU3EU/D<-33.70/61.00>,=LU4ARU/D<-33.70/61.00>,=LU7CC/E<-33.70/61.00>, + =LU7CGL/D<-33.70/61.00>,=LU8EMD/D<-33.70/61.00>,=LU9EOE/D<-33.70/61.00>, # Santa Fe AY0F<-33.72/62.23>,AY1F<-33.72/62.23>,AY2F<-33.72/62.23>,AY3F<-33.72/62.23>,AY4F<-33.72/62.23>, AY5F<-33.72/62.23>,AY6F<-33.72/62.23>,AY7F<-33.72/62.23>,AY8F<-33.72/62.23>,AY9F<-33.72/62.23>, @@ -3813,7 +3810,6 @@ Argentina: 13: 14: SA: -32.50: 62.13: 3.0: LU: LV5G<-26.95/58.72>,LV6G<-26.95/58.72>,LV7G<-26.95/58.72>,LV8G<-26.95/58.72>,LV9G<-26.95/58.72>, LW0G<-26.95/58.72>,LW1G<-26.95/58.72>,LW2G<-26.95/58.72>,LW3G<-26.95/58.72>,LW4G<-26.95/58.72>, LW5G<-26.95/58.72>,LW6G<-26.95/58.72>,LW7G<-26.95/58.72>,LW8G<-26.95/58.72>,LW9G<-26.95/58.72>, - =LW3EMP/GA<-26.95/58.72>, # Cordoba AY0H<-31.42/64.18>,AY1H<-31.42/64.18>,AY2H<-31.42/64.18>,AY3H<-31.42/64.18>,AY4H<-31.42/64.18>, AY5H<-31.42/64.18>,AY6H<-31.42/64.18>,AY7H<-31.42/64.18>,AY8H<-31.42/64.18>,AY9H<-31.42/64.18>, @@ -3853,7 +3849,7 @@ Argentina: 13: 14: SA: -32.50: 62.13: 3.0: LU: LV5H<-31.42/64.18>,LV6H<-31.42/64.18>,LV7H<-31.42/64.18>,LV8H<-31.42/64.18>,LV9H<-31.42/64.18>, LW0H<-31.42/64.18>,LW1H<-31.42/64.18>,LW2H<-31.42/64.18>,LW3H<-31.42/64.18>,LW4H<-31.42/64.18>, LW5H<-31.42/64.18>,LW6H<-31.42/64.18>,LW7H<-31.42/64.18>,LW8H<-31.42/64.18>,LW9H<-31.42/64.18>, - =LU4HCH/H<-31.42/64.18>,=LU4HK/H<-31.42/64.18>, + =LU4HCH/H<-31.42/64.18>, # Misiones AY0I<-26.92/54.52>,AY1I<-26.92/54.52>,AY2I<-26.92/54.52>,AY3I<-26.92/54.52>,AY4I<-26.92/54.52>, AY5I<-26.92/54.52>,AY6I<-26.92/54.52>,AY7I<-26.92/54.52>,AY8I<-26.92/54.52>,AY9I<-26.92/54.52>, @@ -4012,7 +4008,6 @@ Argentina: 13: 14: SA: -32.50: 62.13: 3.0: LU: LV5L<-28.67/57.63>,LV6L<-28.67/57.63>,LV7L<-28.67/57.63>,LV8L<-28.67/57.63>,LV9L<-28.67/57.63>, LW0L<-28.67/57.63>,LW1L<-28.67/57.63>,LW2L<-28.67/57.63>,LW3L<-28.67/57.63>,LW4L<-28.67/57.63>, LW5L<-28.67/57.63>,LW6L<-28.67/57.63>,LW7L<-28.67/57.63>,LW8L<-28.67/57.63>,LW9L<-28.67/57.63>, - =LU8LCT/L<-28.67/57.63>,=LU9LMD/L<-28.67/57.63>, # Mendoza AY0M<-32.88/68.85>,AY1M<-32.88/68.85>,AY2M<-32.88/68.85>,AY3M<-32.88/68.85>,AY4M<-32.88/68.85>, AY5M<-32.88/68.85>,AY6M<-32.88/68.85>,AY7M<-32.88/68.85>,AY8M<-32.88/68.85>,AY9M<-32.88/68.85>, @@ -4624,7 +4619,7 @@ Finland: 15: 18: EU: 61.38: -24.82: -2.0: OH: # Uudenmaa OF2<60.23/-24.78>,OG2<60.23/-24.78>,OH2<60.23/-24.78>,OI2<60.23/-24.78>, # Haeme - OF3<61.53/-23.75>,OG3<61.53/-23.75>,OH3<61.53/-23.75>,OI3<61.53/-23.75>, + OF3<61.53/-23.75>,OG3<61.53/-23.75>,OH3<61.53/-23.75>,OI3<61.53/-23.75>,=OH0MZA/3<61.53/-23.75>, # Mikkeli OF4<62.50/-28.00>,OG4<62.50/-28.00>,OH4<62.50/-28.00>,OI4<62.50/-28.00>, # Kymi @@ -4829,7 +4824,7 @@ Bangladesh: 22: 41: AS: 24.12: -89.65: -6.0: S2: S2,S3; # ADIF 499 Slovenia: 15: 28: EU: 46.00: -14.00: -1.0: S5: - S5,=VERSION; + S5; # ADIF 379 Seychelles: 39: 53: AF: -4.67: -55.47: -4.0: S7: S7; @@ -5042,7 +5037,7 @@ Mali: 35: 46: AF: 18.00: 2.58: 0.0: TZ: TZ; # ADIF 54 European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: - R,U,=R7AB/P,=RI0SP(40),=RI41POL(40), + R,U,=RC9WD/6,=RI0SP(40),=RV9WB/3,=UB8AFZ/3, # Saint Petersburg (SP) R1A<59.95/-30.30>,R1B<59.95/-30.30>,R1F<59.95/-30.30>,R1H<59.95/-30.30>,R1J<59.95/-30.30>, R1L<59.95/-30.30>,R1M<59.95/-30.30>,RA1A<59.95/-30.30>,RA1B<59.95/-30.30>,RA1F<59.95/-30.30>, @@ -5087,7 +5082,8 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: UG1J<59.95/-30.30>,UG1L<59.95/-30.30>,UG1M<59.95/-30.30>,UH1A<59.95/-30.30>,UH1B<59.95/-30.30>, UH1F<59.95/-30.30>,UH1H<59.95/-30.30>,UH1J<59.95/-30.30>,UH1L<59.95/-30.30>,UH1M<59.95/-30.30>, UI1A<59.95/-30.30>,UI1B<59.95/-30.30>,UI1F<59.95/-30.30>,UI1H<59.95/-30.30>,UI1J<59.95/-30.30>, - UI1L<59.95/-30.30>,UI1M<59.95/-30.30>, + UI1L<59.95/-30.30>,UI1M<59.95/-30.30>,=R1AT[19]<59.95/-30.30>,=RU1AC[19]<59.95/-30.30>, + =UA1A[19]<59.95/-30.30>,=UA1F[19]<59.95/-30.30>, # Leningradskaya (LO) R1C<60.05/-31.75>,R1D<60.05/-31.75>,RA1C<60.05/-31.75>,RA1D<60.05/-31.75>,RC1C<60.05/-31.75>, RC1D<60.05/-31.75>,RD1C<60.05/-31.75>,RD1D<60.05/-31.75>,RE1C<60.05/-31.75>,RE1D<60.05/-31.75>, @@ -5101,7 +5097,7 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: UA1D<60.05/-31.75>,UB1C<60.05/-31.75>,UB1D<60.05/-31.75>,UC1C<60.05/-31.75>,UC1D<60.05/-31.75>, UD1C<60.05/-31.75>,UD1D<60.05/-31.75>,UE1C<60.05/-31.75>,UE1D<60.05/-31.75>,UF1C<60.05/-31.75>, UF1D<60.05/-31.75>,UG1C<60.05/-31.75>,UG1D<60.05/-31.75>,UH1C<60.05/-31.75>,UH1D<60.05/-31.75>, - UI1C<60.05/-31.75>,UI1D<60.05/-31.75>, + UI1C<60.05/-31.75>,UI1D<60.05/-31.75>,=R1CAA[19]<60.05/-31.75>, # Karelia (KL) R1N[19]<63.82/-33.00>,RA1N[19]<63.82/-33.00>,RC1N[19]<63.82/-33.00>,RD1N[19]<63.82/-33.00>, RE1N[19]<63.82/-33.00>,RF1N[19]<63.82/-33.00>,RG1N[19]<63.82/-33.00>,RJ1N[19]<63.82/-33.00>, @@ -5119,7 +5115,7 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: RV1O[19]<63.50/-43.00>,RW1O[19]<63.50/-43.00>,RX1O[19]<63.50/-43.00>,RY1O[19]<63.50/-43.00>, RZ1O[19]<63.50/-43.00>,U1O[19]<63.50/-43.00>,UA1O[19]<63.50/-43.00>,UB1O[19]<63.50/-43.00>, UC1O[19]<63.50/-43.00>,UD1O[19]<63.50/-43.00>,UE1O[19]<63.50/-43.00>,UF1O[19]<63.50/-43.00>, - UG1O[19]<63.50/-43.00>,UH1O[19]<63.50/-43.00>,UI1O[19]<63.50/-43.00>,=UA9XK/1[19]<63.50/-43.00>, + UG1O[19]<63.50/-43.00>,UH1O[19]<63.50/-43.00>,UI1O[19]<63.50/-43.00>, # Nenetsky (NO) R1P[20]<68.83/-54.83>,RA1P[20]<68.83/-54.83>,RC1P[20]<68.83/-54.83>,RD1P[20]<68.83/-54.83>, RE1P[20]<68.83/-54.83>,RF1P[20]<68.83/-54.83>,RG1P[20]<68.83/-54.83>,RJ1P[20]<68.83/-54.83>, @@ -5179,7 +5175,8 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: RV1Z[19]<68.03/-34.57>,RW1Z[19]<68.03/-34.57>,RX1Z[19]<68.03/-34.57>,RY1Z[19]<68.03/-34.57>, RZ1Z[19]<68.03/-34.57>,U1Z[19]<68.03/-34.57>,UA1Z[19]<68.03/-34.57>,UB1Z[19]<68.03/-34.57>, UC1Z[19]<68.03/-34.57>,UD1Z[19]<68.03/-34.57>,UE1Z[19]<68.03/-34.57>,UF1Z[19]<68.03/-34.57>, - UG1Z[19]<68.03/-34.57>,UH1Z[19]<68.03/-34.57>,UI1Z[19]<68.03/-34.57>,=RN2F/1[19]<68.03/-34.57>, + UG1Z[19]<68.03/-34.57>,UH1Z[19]<68.03/-34.57>,UI1Z[19]<68.03/-34.57>,=RA9UDK/1[19]<68.03/-34.57>, + =RN2F/1[19]<68.03/-34.57>, # Moscow city (MA) R2A<55.75/-37.62>,R2B<55.75/-37.62>,R2C<55.75/-37.62>,R3A<55.75/-37.62>,R3B<55.75/-37.62>, R3C<55.75/-37.62>,R5A<55.75/-37.62>,R5B<55.75/-37.62>,R5C<55.75/-37.62>,RA3A<55.75/-37.62>, @@ -5230,7 +5227,7 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: UG3C<55.75/-37.62>,UG5A<55.75/-37.62>,UG5B<55.75/-37.62>,UG5C<55.75/-37.62>,UH3A<55.75/-37.62>, UH3B<55.75/-37.62>,UH3C<55.75/-37.62>,UH5A<55.75/-37.62>,UH5B<55.75/-37.62>,UH5C<55.75/-37.62>, UI3A<55.75/-37.62>,UI3B<55.75/-37.62>,UI3C<55.75/-37.62>,UI5A<55.75/-37.62>,UI5B<55.75/-37.62>, - UI5C<55.75/-37.62>, + UI5C<55.75/-37.62>,=RN2F/3<55.75/-37.62>, # Moskovskaya (MO) R2D<55.70/-36.97>,R2H<55.70/-36.97>,R3D<55.70/-36.97>,R3F<55.70/-36.97>,R3H<55.70/-36.97>, R5D<55.70/-36.97>,R5F<55.70/-36.97>,R5H<55.70/-36.97>,RA3D<55.70/-36.97>,RA3F<55.70/-36.97>, @@ -5277,7 +5274,7 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: UG5D<55.70/-36.97>,UG5F<55.70/-36.97>,UG5H<55.70/-36.97>,UH3D<55.70/-36.97>,UH3F<55.70/-36.97>, UH3H<55.70/-36.97>,UH5D<55.70/-36.97>,UH5F<55.70/-36.97>,UH5H<55.70/-36.97>,UI3D<55.70/-36.97>, UI3F<55.70/-36.97>,UI3H<55.70/-36.97>,UI5D<55.70/-36.97>,UI5F<55.70/-36.97>,UI5H<55.70/-36.97>, - =R8FF/3<55.70/-36.97>,=R9UG/3<55.70/-36.97>, + =R8FF/3<55.70/-36.97>, # Orlovskaya (OR) R2E<52.85/-36.43>,R3E<52.85/-36.43>,R5E<52.85/-36.43>,RA3E<52.85/-36.43>,RA5E<52.85/-36.43>, RC2E<52.85/-36.43>,RC3E<52.85/-36.43>,RC5E<52.85/-36.43>,RD2E<52.85/-36.43>,RD3E<52.85/-36.43>, @@ -5365,7 +5362,7 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: UA5L<55.00/-33.00>,UB3L<55.00/-33.00>,UB5L<55.00/-33.00>,UC3L<55.00/-33.00>,UC5L<55.00/-33.00>, UD3L<55.00/-33.00>,UD5L<55.00/-33.00>,UE3L<55.00/-33.00>,UE5L<55.00/-33.00>,UF3L<55.00/-33.00>, UF5L<55.00/-33.00>,UG3L<55.00/-33.00>,UG5L<55.00/-33.00>,UH3L<55.00/-33.00>,UH5L<55.00/-33.00>, - UI3L<55.00/-33.00>,UI5L<55.00/-33.00>,=R80OSM<55.00/-33.00>, + UI3L<55.00/-33.00>,UI5L<55.00/-33.00>, # Yaroslavskaya (YR) R2M<57.87/-39.20>,R3M<57.87/-39.20>,R5M<57.87/-39.20>,RA3M<57.87/-39.20>,RA5M<57.87/-39.20>, RC2M<57.87/-39.20>,RC3M<57.87/-39.20>,RC5M<57.87/-39.20>,RD2M<57.87/-39.20>,RD3M<57.87/-39.20>, @@ -5484,7 +5481,7 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: UA5R<52.72/-41.57>,UB3R<52.72/-41.57>,UB5R<52.72/-41.57>,UC3R<52.72/-41.57>,UC5R<52.72/-41.57>, UD3R<52.72/-41.57>,UD5R<52.72/-41.57>,UE3R<52.72/-41.57>,UE5R<52.72/-41.57>,UF3R<52.72/-41.57>, UF5R<52.72/-41.57>,UG3R<52.72/-41.57>,UG5R<52.72/-41.57>,UH3R<52.72/-41.57>,UH5R<52.72/-41.57>, - UI3R<52.72/-41.57>,UI5R<52.72/-41.57>,=R9CZ/3<52.72/-41.57>, + UI3R<52.72/-41.57>,UI5R<52.72/-41.57>,=R100ZK<52.72/-41.57>,=R9CZ/3<52.72/-41.57>, # Ryazanskaya (RA) R2S<54.40/-40.60>,R3S<54.40/-40.60>,R5S<54.40/-40.60>,RA3S<54.40/-40.60>,RA5S<54.40/-40.60>, RC2S<54.40/-40.60>,RC3S<54.40/-40.60>,RC5S<54.40/-40.60>,RD2S<54.40/-40.60>,RD3S<54.40/-40.60>, @@ -5664,7 +5661,7 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: RU4F<53.25/-44.57>,RV4F<53.25/-44.57>,RW4F<53.25/-44.57>,RX4F<53.25/-44.57>,RY4F<53.25/-44.57>, RZ4F<53.25/-44.57>,U4F<53.25/-44.57>,UA4F<53.25/-44.57>,UB4F<53.25/-44.57>,UC4F<53.25/-44.57>, UD4F<53.25/-44.57>,UE4F<53.25/-44.57>,UF4F<53.25/-44.57>,UG4F<53.25/-44.57>,UH4F<53.25/-44.57>, - UI4F<53.25/-44.57>, + UI4F<53.25/-44.57>,=UA4FMQ/P<53.25/-44.57>, # Samarskaya (SR) R4H[30]<53.45/-50.45>,R4I[30]<53.45/-50.45>,RA4H[30]<53.45/-50.45>,RA4I[30]<53.45/-50.45>, RC4H[30]<53.45/-50.45>,RC4I[30]<53.45/-50.45>,RD4H[30]<53.45/-50.45>,RD4I[30]<53.45/-50.45>, @@ -5744,9 +5741,8 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: UG4Q<55.55/-50.93>,UG4R<55.55/-50.93>,UH4P<55.55/-50.93>,UH4Q<55.55/-50.93>,UH4R<55.55/-50.93>, UI4P<55.55/-50.93>,UI4Q<55.55/-50.93>,UI4R<55.55/-50.93>,=R4PH[30]<55.55/-50.93>, =R4RB[30]<55.55/-50.93>,=R4RM[30]<55.55/-50.93>,=RJ4P[30]<55.55/-50.93>,=RK4P[30]<55.55/-50.93>, - =RT4Q[30]<55.55/-50.93>,=RZ4PXP[30]<55.55/-50.93>,=UA4FMQ/P<55.55/-50.93>, - =UA4PN[30]<55.55/-50.93>,=UA4PRU[30]<55.55/-50.93>,=UA4Q[30]<55.55/-50.93>, - =UG4P[30]<55.55/-50.93>, + =RT4Q[30]<55.55/-50.93>,=RZ4PXP[30]<55.55/-50.93>,=UA4PN[30]<55.55/-50.93>, + =UA4PRU[30]<55.55/-50.93>,=UA4Q[30]<55.55/-50.93>,=UG4P[30]<55.55/-50.93>, # Marij-El (MR) R4S<56.70/-47.87>,R4T<56.70/-47.87>,RA4S<56.70/-47.87>,RA4T<56.70/-47.87>,RC4S<56.70/-47.87>, RC4T<56.70/-47.87>,RD4S<56.70/-47.87>,RD4T<56.70/-47.87>,RE4S<56.70/-47.87>,RE4T<56.70/-47.87>, @@ -5760,7 +5756,7 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: UA4T<56.70/-47.87>,UB4S<56.70/-47.87>,UB4T<56.70/-47.87>,UC4S<56.70/-47.87>,UC4T<56.70/-47.87>, UD4S<56.70/-47.87>,UD4T<56.70/-47.87>,UE4S<56.70/-47.87>,UE4T<56.70/-47.87>,UF4S<56.70/-47.87>, UF4T<56.70/-47.87>,UG4S<56.70/-47.87>,UG4T<56.70/-47.87>,UH4S<56.70/-47.87>,UH4T<56.70/-47.87>, - UI4S<56.70/-47.87>,UI4T<56.70/-47.87>, + UI4S<56.70/-47.87>,UI4T<56.70/-47.87>,=UA5B/4<56.70/-47.87>, # Mordoviya (MD) R4U<54.43/-44.45>,RA4U<54.43/-44.45>,RC4U<54.43/-44.45>,RD4U<54.43/-44.45>,RE4U<54.43/-44.45>, RF4U<54.43/-44.45>,RG4U<54.43/-44.45>,RJ4U<54.43/-44.45>,RK4U<54.43/-44.45>,RL4U<54.43/-44.45>, @@ -5778,7 +5774,7 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: RZ4W[30]<57.28/-52.75>,U4W[30]<57.28/-52.75>,UA4W[30]<57.28/-52.75>,UB4W[30]<57.28/-52.75>, UC4W[30]<57.28/-52.75>,UD4W[30]<57.28/-52.75>,UE4W[30]<57.28/-52.75>,UF4W[30]<57.28/-52.75>, UG4W[30]<57.28/-52.75>,UH4W[30]<57.28/-52.75>,UI4W[30]<57.28/-52.75>,=R0CM/4[30]<57.28/-52.75>, - =R100FP[30]<57.28/-52.75>,=R4WAN/P[30]<57.28/-52.75>, + =R100FP[30]<57.28/-52.75>, # Chuvashiya (CU) R4Y<55.55/-47.10>,R4Z<55.55/-47.10>,RA4Y<55.55/-47.10>,RA4Z<55.55/-47.10>,RC4Y<55.55/-47.10>, RC4Z<55.55/-47.10>,RD4Y<55.55/-47.10>,RD4Z<55.55/-47.10>,RE4Y<55.55/-47.10>,RE4Z<55.55/-47.10>, @@ -5844,7 +5840,7 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: UH6D<45.37/-39.43>,UH7A<45.37/-39.43>,UH7B<45.37/-39.43>,UH7C<45.37/-39.43>,UH7D<45.37/-39.43>, UI6A<45.37/-39.43>,UI6B<45.37/-39.43>,UI6C<45.37/-39.43>,UI6D<45.37/-39.43>,UI7A<45.37/-39.43>, UI7B<45.37/-39.43>,UI7C<45.37/-39.43>,UI7D<45.37/-39.43>,=R9GM/6<45.37/-39.43>, - =R9OM/6<45.37/-39.43>,=RA9ULL/6<45.37/-39.43>,=RJ9I/6<45.37/-39.43>, + =R9KC/6<45.37/-39.43>,=R9OM/6<45.37/-39.43>,=RJ9I/6<45.37/-39.43>, # Karachay-Cherkessia (KC) R6E<43.92/-41.78>,R7E<43.92/-41.78>,RA6E<43.92/-41.78>,RA7E<43.92/-41.78>,RC6E<43.92/-41.78>, RC7E<43.92/-41.78>,RD6E<43.92/-41.78>,RD7E<43.92/-41.78>,RE6E<43.92/-41.78>,RE7E<43.92/-41.78>, @@ -5976,7 +5972,8 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: UG6N<47.87/-41.18>,UG7L<47.87/-41.18>,UG7M<47.87/-41.18>,UG7N<47.87/-41.18>,UH6L<47.87/-41.18>, UH6M<47.87/-41.18>,UH6N<47.87/-41.18>,UH7L<47.87/-41.18>,UH7M<47.87/-41.18>,UH7N<47.87/-41.18>, UI6L<47.87/-41.18>,UI6M<47.87/-41.18>,UI6N<47.87/-41.18>,UI7L<47.87/-41.18>,UI7M<47.87/-41.18>, - UI7N<47.87/-41.18>,=RM8W/6<47.87/-41.18>,=RV9WB/6<47.87/-41.18>,=UE37EUF<47.87/-41.18>, + UI7N<47.87/-41.18>,=R2023DX<47.87/-41.18>,=RM8W/6<47.87/-41.18>,=RV9WB/6<47.87/-41.18>, + =UE33DX<47.87/-41.18>,=UE37EUF<47.87/-41.18>, # Chechnya (CN) R6P<43.40/-45.72>,R7P<43.40/-45.72>,RA6P<43.40/-45.72>,RA7P<43.40/-45.72>,RC6P<43.40/-45.72>, RC7P<43.40/-45.72>,RD6P<43.40/-45.72>,RD7P<43.40/-45.72>,RE6P<43.40/-45.72>,RE7P<43.40/-45.72>, @@ -6030,7 +6027,7 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: UE6V<47.23/-47.23>,UE7U<47.23/-47.23>,UE7V<47.23/-47.23>,UF6U<47.23/-47.23>,UF7U<47.23/-47.23>, UF7V<47.23/-47.23>,UG6U<47.23/-47.23>,UG6V<47.23/-47.23>,UG7U<47.23/-47.23>,UG7V<47.23/-47.23>, UH6U<47.23/-47.23>,UH6V<47.23/-47.23>,UH7U<47.23/-47.23>,UH7V<47.23/-47.23>,UI6U<47.23/-47.23>, - UI6V<47.23/-47.23>,UI7U<47.23/-47.23>,UI7V<47.23/-47.23>,=R465AO<47.23/-47.23>, + UI6V<47.23/-47.23>,UI7U<47.23/-47.23>,UI7V<47.23/-47.23>, # Dagestan (DA) R6W<43.10/-46.88>,R7W<43.10/-46.88>,RA6W<43.10/-46.88>,RA7W<43.10/-46.88>,RC6W<43.10/-46.88>, RC7W<43.10/-46.88>,RD6W<43.10/-46.88>,RD7W<43.10/-46.88>,RE6W<43.10/-46.88>,RE7W<43.10/-46.88>, @@ -6263,7 +6260,8 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: UG9A<54.75/-60.70>~-6.0~,UG9B<54.75/-60.70>~-6.0~,UH8A<54.75/-60.70>~-6.0~, UH8B<54.75/-60.70>~-6.0~,UH9A<54.75/-60.70>~-6.0~,UH9B<54.75/-60.70>~-6.0~, UI8A<54.75/-60.70>~-6.0~,UI8B<54.75/-60.70>~-6.0~,UI9A<54.75/-60.70>~-6.0~, - UI9B<54.75/-60.70>~-6.0~,=RA0QK/8<54.75/-60.70>~-6.0~,=UA9AR/P<54.75/-60.70>~-6.0~, + UI9B<54.75/-60.70>~-6.0~,=R80SUSU<54.75/-60.70>~-6.0~,=RA0QK/8<54.75/-60.70>~-6.0~, + =RW9AV[21]<54.75/-60.70>~-6.0~, # Sverdlovskaya (SV) R8C<58.70/-61.33>~-6.0~,R8D<58.70/-61.33>~-6.0~,R8E<58.70/-61.33>~-6.0~,R9C<58.70/-61.33>~-6.0~, R9D<58.70/-61.33>~-6.0~,R9E<58.70/-61.33>~-6.0~,RA8C<58.70/-61.33>~-6.0~,RA8D<58.70/-61.33>~-6.0~, @@ -6325,8 +6323,8 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: UH8D<58.70/-61.33>~-6.0~,UH8E<58.70/-61.33>~-6.0~,UH9C<58.70/-61.33>~-6.0~, UH9D<58.70/-61.33>~-6.0~,UH9E<58.70/-61.33>~-6.0~,UI8C<58.70/-61.33>~-6.0~, UI8D<58.70/-61.33>~-6.0~,UI8E<58.70/-61.33>~-6.0~,UI9C<58.70/-61.33>~-6.0~, - UI9D<58.70/-61.33>~-6.0~,UI9E<58.70/-61.33>~-6.0~,=R9CS/P<58.70/-61.33>~-6.0~, - =RW9C[20]<58.70/-61.33>~-6.0~, + UI9D<58.70/-61.33>~-6.0~,UI9E<58.70/-61.33>~-6.0~,=RW9C[20]<58.70/-61.33>~-6.0~, + =RX9CC[20]<58.70/-61.33>~-6.0~, # Tomskaya (TO) R8H(18)[31]<58.75/-82.13>,R8I(18)[31]<58.75/-82.13>,R9H(18)[31]<58.75/-82.13>, R9I(18)[31]<58.75/-82.13>,RA8H(18)[31]<58.75/-82.13>,RA8I(18)[31]<58.75/-82.13>, @@ -6416,8 +6414,7 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: UE9K[20]<65.30/-74.03>~-6.0~,UF8K[20]<65.30/-74.03>~-6.0~,UF9K[20]<65.30/-74.03>~-6.0~, UG8K[20]<65.30/-74.03>~-6.0~,UG9K[20]<65.30/-74.03>~-6.0~,UH8K[20]<65.30/-74.03>~-6.0~, UH9K[20]<65.30/-74.03>~-6.0~,UI8K[20]<65.30/-74.03>~-6.0~,UI9K[20]<65.30/-74.03>~-6.0~, - =R2023BA[20]<65.30/-74.03>~-6.0~,=R9XD/9[20]<65.30/-74.03>~-6.0~,=RJ6N/8[20]<65.30/-74.03>~-6.0~, - =RV7B/9[20]<65.30/-74.03>~-6.0~, + =R2023BA[20]<65.30/-74.03>~-6.0~,=RU9SQ/8[20]<65.30/-74.03>~-6.0~, # Tyumenskaya (TN) R8L<57.83/-69.00>~-6.0~,R9L<57.83/-69.00>~-6.0~,RA8L<57.83/-69.00>~-6.0~,RA9L<57.83/-69.00>~-6.0~, RC8L<57.83/-69.00>~-6.0~,RC9L<57.83/-69.00>~-6.0~,RD8L<57.83/-69.00>~-6.0~, @@ -6465,7 +6462,7 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: UF9M<56.22/-73.27>,UF9N<56.22/-73.27>,UG8M<56.22/-73.27>,UG8N<56.22/-73.27>,UG9M<56.22/-73.27>, UG9N<56.22/-73.27>,UH8M<56.22/-73.27>,UH8N<56.22/-73.27>,UH9M<56.22/-73.27>,UH9N<56.22/-73.27>, UI8M<56.22/-73.27>,UI8N<56.22/-73.27>,UI9M<56.22/-73.27>,UI9N<56.22/-73.27>, - =R9MA[31]<56.22/-73.27>, + =R9MA[31]<56.22/-73.27>,=UA9MW[31]<56.22/-73.27>, # Novosibirskaya (NS) R8O(18)[31]<55.45/-79.55>,R8P(18)[31]<55.45/-79.55>,R9O(18)[31]<55.45/-79.55>, R9P(18)[31]<55.45/-79.55>,RA8O(18)[31]<55.45/-79.55>,RA8P(18)[31]<55.45/-79.55>, @@ -6508,8 +6505,8 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: UG9O(18)[31]<55.45/-79.55>,UG9P(18)[31]<55.45/-79.55>,UH8O(18)[31]<55.45/-79.55>, UH8P(18)[31]<55.45/-79.55>,UH9O(18)[31]<55.45/-79.55>,UH9P(18)[31]<55.45/-79.55>, UI8O(18)[31]<55.45/-79.55>,UI8P(18)[31]<55.45/-79.55>,UI9O(18)[31]<55.45/-79.55>, - UI9P(18)[31]<55.45/-79.55>,=R2ET/9(18)[31]<55.45/-79.55>,=RO9O(18)[31]<55.45/-79.55>, - =RR9O(18)[31]<55.45/-79.55>, + UI9P(18)[31]<55.45/-79.55>,=R120RAEM(18)[31]<55.45/-79.55>,=R2ET/9(18)[31]<55.45/-79.55>, + =RO9O(18)[31]<55.45/-79.55>,=RR9O(18)[31]<55.45/-79.55>, # Kurganskaya (KN) R8Q<55.57/-64.75>~-6.0~,R8R<55.57/-64.75>~-6.0~,R9Q<55.57/-64.75>~-6.0~,R9R<55.57/-64.75>~-6.0~, RA8Q<55.57/-64.75>~-6.0~,RA8R<55.57/-64.75>~-6.0~,RA9Q<55.57/-64.75>~-6.0~, @@ -6551,7 +6548,7 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: UG9Q<55.57/-64.75>~-6.0~,UG9R<55.57/-64.75>~-6.0~,UH8Q<55.57/-64.75>~-6.0~, UH8R<55.57/-64.75>~-6.0~,UH9Q<55.57/-64.75>~-6.0~,UH9R<55.57/-64.75>~-6.0~, UI8Q<55.57/-64.75>~-6.0~,UI8R<55.57/-64.75>~-6.0~,UI9Q<55.57/-64.75>~-6.0~, - UI9R<55.57/-64.75>~-6.0~, + UI9R<55.57/-64.75>~-6.0~,=R9CS/P<55.57/-64.75>~-6.0~, # Orenburgskaya (OB) R8S(16)<52.13/-55.60>~-6.0~,R8T(16)<52.13/-55.60>~-6.0~,R9S(16)<52.13/-55.60>~-6.0~, R9T(16)<52.13/-55.60>~-6.0~,RA8S(16)<52.13/-55.60>~-6.0~,RA8T(16)<52.13/-55.60>~-6.0~, @@ -6594,7 +6591,7 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: UG9S(16)<52.13/-55.60>~-6.0~,UG9T(16)<52.13/-55.60>~-6.0~,UH8S(16)<52.13/-55.60>~-6.0~, UH8T(16)<52.13/-55.60>~-6.0~,UH9S(16)<52.13/-55.60>~-6.0~,UH9T(16)<52.13/-55.60>~-6.0~, UI8S(16)<52.13/-55.60>~-6.0~,UI8T(16)<52.13/-55.60>~-6.0~,UI9S(16)<52.13/-55.60>~-6.0~, - UI9T(16)<52.13/-55.60>~-6.0~,=RN3QOP/4(16)<52.13/-55.60>~-6.0~, + UI9T(16)<52.13/-55.60>~-6.0~, # Kemerovskaya (KE) R8U(18)[31]<54.93/-87.23>,R8V(18)[31]<54.93/-87.23>,R9U(18)[31]<54.93/-87.23>, R9V(18)[31]<54.93/-87.23>,RA8U(18)[31]<54.93/-87.23>,RA8V(18)[31]<54.93/-87.23>, @@ -6659,7 +6656,7 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: UD9W(16)<54.47/-56.27>~-6.0~,UE8W(16)<54.47/-56.27>~-6.0~,UE9W(16)<54.47/-56.27>~-6.0~, UF8W(16)<54.47/-56.27>~-6.0~,UF9W(16)<54.47/-56.27>~-6.0~,UG8W(16)<54.47/-56.27>~-6.0~, UG9W(16)<54.47/-56.27>~-6.0~,UH8W(16)<54.47/-56.27>~-6.0~,UH9W(16)<54.47/-56.27>~-6.0~, - UI8W(16)<54.47/-56.27>~-6.0~,UI9W(16)<54.47/-56.27>~-6.0~, + UI8W(16)<54.47/-56.27>~-6.0~,UI9W(16)<54.47/-56.27>~-6.0~,=R1LK/4(16)<54.47/-56.27>~-6.0~, # Altaysky (AL) R8Y(18)[31]<52.77/-82.62>,R9Y(18)[31]<52.77/-82.62>,RA8Y(18)[31]<52.77/-82.62>, RA9Y(18)[31]<52.77/-82.62>,RC8Y(18)[31]<52.77/-82.62>,RC9Y(18)[31]<52.77/-82.62>, @@ -6682,7 +6679,6 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: UF8Y(18)[31]<52.77/-82.62>,UF9Y(18)[31]<52.77/-82.62>,UG8Y(18)[31]<52.77/-82.62>, UG9Y(18)[31]<52.77/-82.62>,UH8Y(18)[31]<52.77/-82.62>,UH9Y(18)[31]<52.77/-82.62>, UI8Y(18)[31]<52.77/-82.62>,UI9Y(18)[31]<52.77/-82.62>,=R0FBA/9(18)[31]<52.77/-82.62>, - =R0QAW/P(18)[31]<52.77/-82.62>, # Gorno Altayskaya (GA) R8Z(18)[31]<50.92/-86.92>,R9Z(18)[31]<50.92/-86.92>,RA8Z(18)[31]<50.92/-86.92>, RA9Z(18)[31]<50.92/-86.92>,RC8Z(18)[31]<50.92/-86.92>,RC9Z(18)[31]<50.92/-86.92>, @@ -6752,7 +6748,7 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: UG0H(18)[32]<59.88/-91.67>~-8.0~,UH0A(18)[32]<59.88/-91.67>~-8.0~, UH0B(18)[32]<59.88/-91.67>~-8.0~,UH0H(18)[32]<59.88/-91.67>~-8.0~, UI0A(18)[32]<59.88/-91.67>~-8.0~,UI0B(18)[32]<59.88/-91.67>~-8.0~, - UI0H(18)[32]<59.88/-91.67>~-8.0~,=UA9CTT/P(18)[32]<59.88/-91.67>~-8.0~, + UI0H(18)[32]<59.88/-91.67>~-8.0~,=UA9CTT/9(18)[32]<59.88/-91.67>~-8.0~, # Khabarovsky (HK) R0C(19)[34]<54.80/-136.83>~-11.0~,RA0C(19)[34]<54.80/-136.83>~-11.0~, RC0C(19)[34]<54.80/-136.83>~-11.0~,RD0C(19)[34]<54.80/-136.83>~-11.0~, @@ -6888,7 +6884,7 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: UD0K(19)[25]<66.67/-171.00>~-12.0~,UE0K(19)[25]<66.67/-171.00>~-12.0~, UF0K(19)[25]<66.67/-171.00>~-12.0~,UG0K(19)[25]<66.67/-171.00>~-12.0~, UH0K(19)[25]<66.67/-171.00>~-12.0~,UI0K(19)[25]<66.67/-171.00>~-12.0~, - =RU9MV/0(19)[25]<66.67/-171.00>~-12.0~, + =UA0KBG(19)[26]<66.67/-171.00>~-12.0~, # Primorsky (PK) R0L(19)[34]<45.33/-134.67>~-11.0~,R0M(19)[34]<45.33/-134.67>~-11.0~, R0N(19)[34]<45.33/-134.67>~-11.0~,RA0L(19)[34]<45.33/-134.67>~-11.0~, @@ -6937,8 +6933,7 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: UH0L(19)[34]<45.33/-134.67>~-11.0~,UH0M(19)[34]<45.33/-134.67>~-11.0~, UH0N(19)[34]<45.33/-134.67>~-11.0~,UI0L(19)[34]<45.33/-134.67>~-11.0~, UI0M(19)[34]<45.33/-134.67>~-11.0~,UI0N(19)[34]<45.33/-134.67>~-11.0~, - =R5AF/0(19)[34]<45.33/-134.67>~-11.0~,=RV3DSA/0(19)[34]<45.33/-134.67>~-11.0~, - =RX3X/0(19)[34]<45.33/-134.67>~-11.0~, + =R1FW/0(19)[34]<45.33/-134.67>~-11.0~,=R5AF/0(19)[34]<45.33/-134.67>~-11.0~, # Buryatiya (BU) R0O(18)[32]<53.80/-109.33>~-9.0~,RA0O(18)[32]<53.80/-109.33>~-9.0~, RC0O(18)[32]<53.80/-109.33>~-9.0~,RD0O(18)[32]<53.80/-109.33>~-9.0~, @@ -6973,7 +6968,7 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: UD0Q(19)[23]<66.40/-129.17>~-11.0~,UE0Q(19)[23]<66.40/-129.17>~-11.0~, UF0Q(19)[23]<66.40/-129.17>~-11.0~,UG0Q(19)[23]<66.40/-129.17>~-11.0~, UH0Q(19)[23]<66.40/-129.17>~-11.0~,UI0Q(19)[23]<66.40/-129.17>~-11.0~, - =RA1WS/0(19)[23]<66.40/-129.17>~-11.0~, + =R8CDV/0(19)[23]<66.40/-129.17>~-11.0~,=RA1WS/0(19)[23]<66.40/-129.17>~-11.0~, # Irkutskaya (IR) R0R(18)[32]<57.37/-106.00>~-9.0~,R0S(18)[32]<57.37/-106.00>~-9.0~, R0T(18)[32]<57.37/-106.00>~-9.0~,RA0R(18)[32]<57.37/-106.00>~-9.0~, @@ -7120,7 +7115,8 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: UG0U(18)[32]<54.00/-118.00>~-10.0~,UG0V(18)[32]<54.00/-118.00>~-10.0~, UH0U(18)[32]<54.00/-118.00>~-10.0~,UH0V(18)[32]<54.00/-118.00>~-10.0~, UI0U(18)[32]<54.00/-118.00>~-10.0~,UI0V(18)[32]<54.00/-118.00>~-10.0~, - =R9PS/0(18)[32]<54.00/-118.00>~-10.0~; + =R0UT(18)[33]<54.00/-118.00>~-10.0~,=R9PS/0(18)[32]<54.00/-118.00>~-10.0~, + =RW0UM(18)[33]<54.00/-118.00>~-10.0~,=UA0UV(18)[33]<54.00/-118.00>~-10.0~; # ADIF 292 Uzbekistan: 17: 30: AS: 41.40: -63.97: -5.0: UK: UJ,UK,UL,UM, @@ -8114,7 +8110,7 @@ Brunei Darussalam: 28: 54: OC: 4.50: -114.60: -8.0: V8: V8; # ADIF 1 Canada: 05: 09: NA: 44.35: 78.75: 5.0: VE: - CF,CG,CJ,CK,VA,VB,VC,VE,VG,VX,VY9,XL,XM,=VER20231103, + CF,CG,CJ,CK,VA,VB,VC,VE,VG,VX,VY9,XL,XM,=VER20231121, # Nova Scotia (NS) CF1<45.13/62.48>~4.0~,CG1<45.13/62.48>~4.0~,CJ1<45.13/62.48>~4.0~,CK1<45.13/62.48>~4.0~, VA1<45.13/62.48>~4.0~,VB1<45.13/62.48>~4.0~,VC1<45.13/62.48>~4.0~,VE1<45.13/62.48>~4.0~, @@ -8128,6 +8124,7 @@ Canada: 05: 09: NA: 44.35: 78.75: 5.0: VE: CF3(4)[4]<43.80/79.25>,CG3(4)[4]<43.80/79.25>,CJ3(4)[4]<43.80/79.25>,CK3(4)[4]<43.80/79.25>, VA3(4)[4]<43.80/79.25>,VB3(4)[4]<43.80/79.25>,VC3(4)[4]<43.80/79.25>,VE3(4)[4]<43.80/79.25>, VG3(4)[4]<43.80/79.25>,VX3(4)[4]<43.80/79.25>,XL3(4)[4]<43.80/79.25>,XM3(4)[4]<43.80/79.25>, + =VE2PID/3(4)[4]<43.80/79.25>, # Manitoba (MB) CF4(4)[3]<49.88/97.13>~6.0~,CG4(4)[3]<49.88/97.13>~6.0~,CJ4(4)[3]<49.88/97.13>~6.0~, CK4(4)[3]<49.88/97.13>~6.0~,VA4(4)[3]<49.88/97.13>~6.0~,VB4(4)[3]<49.88/97.13>~6.0~, diff --git a/static/js/dev/callsign_search.js b/static/js/dev/callsign_search.js index a758f24..a9f5be0 100644 --- a/static/js/dev/callsign_search.js +++ b/static/js/dev/callsign_search.js @@ -4,12 +4,12 @@ function myCallsignSearch(event) { event.preventDefault(); - var callsign=document.getElementById('callsignInput').value; + var callsign = document.getElementById('callsignInput').value; - //replacing space and tab in callsign and set location href to the specific page - if (callsign.replace(/\s/g, '').length > 0) { - location.href = ('/callsign.html?c=').concat((callsign.trim()).toUpperCase()); - } + // Callsigne sanitize + var sanitizedCallsign = encodeURIComponent(callsign.trim().toUpperCase()); + var redirectURL = '/callsign.html?c=' + sanitizedCallsign; + location.href = redirectURL; } document.getElementById('form-callsign').addEventListener('submit', myCallsignSearch); diff --git a/static/js/dev/index_inline.js b/static/js/dev/index_inline.js index f347d30..248d2e2 100644 --- a/static/js/dev/index_inline.js +++ b/static/js/dev/index_inline.js @@ -1,4 +1,3 @@ - /* * script loaded inline page in order to prepare data * for next operations @@ -6,7 +5,7 @@ */ //var my_adxo_events=jQuery.parseJSON(my_adxo_events_json.replaceAll("\t","")); -var my_adxo_events=JSON.parse(my_adxo_events_json.replaceAll('\t','')); +var my_adxo_events = JSON.parse(my_adxo_events_json.replaceAll('\t', '')); refresh_timer(); //run first data fetch var myRefresh = setInterval(refresh_timer, timer_interval_json); @@ -14,5 +13,30 @@ window.onload = () => { document.getElementById('form-filters').addEventListener('submit', mySearch); }; +document.getElementById('MyClockDisplay').addEventListener('load', showTime()); + +/* managing Tom Select for selecting DX callsings */ +document.addEventListener('DOMContentLoaded', function () { + var dxcallsElement = document.getElementById('dxcalls'); + new TomSelect(document.getElementById('dxcalls'), { + plugins: { + remove_button: { + title: 'Remove callsign', + }, + 'dropdown_header': { + title: 'Callsign' + }, + 'clear_button':{ + 'title':'Remove all selected options', + } + }, + persist: false, + create: true, + createOnBlur: true, + allowEmptyOption: true, + maxItems: 6, + wrap: true + }); +}); + -document.getElementById('MyClockDisplay').addEventListener('load',showTime()); \ No newline at end of file diff --git a/static/js/dev/table.js b/static/js/dev/table.js index e62b918..3d239df 100644 --- a/static/js/dev/table.js +++ b/static/js/dev/table.js @@ -295,24 +295,28 @@ function mySearch(event) { function compose_filter(id, len, qry_json) { try { - let selectedFilter = [].map.call(document.getElementById(id).selectedOptions, option => option.value); - if (selectedFilter.length < len) { - qry_json[id] = []; - selectedFilter.map(function (el) { - if (el) { - qry_json[id].push(el); - } else { - return ''; - } - }); - } else if (len == -1) { - selectedFilter.map(function (el) { - if (el) { - qry_json[id]=el; - } else { - return ''; - } - }); + if (len == 0) { //checkboxes + qry_json[id] = document.getElementById(id).checked; + } else { + let selectedFilter = [].map.call(document.getElementById(id).selectedOptions, option => option.value); + if (selectedFilter.length < len) { //lists + qry_json[id] = []; + selectedFilter.map(function (el) { + if (el) { + qry_json[id].push(el); + } else { + return ''; + } + }); + } else if (len == -1) { //combo-box + selectedFilter.map(function (el) { + if (el) { + qry_json[id] = el; + } else { + return ''; + } + }); + } } } catch (err) { @@ -337,12 +341,15 @@ function refresh_timer() { let params = {}; //get other filters - params = compose_filter('band', 14, params); + params = compose_filter('dxcalls', 14, params); + params = compose_filter('band', 14, params); params = compose_filter('de_re', 7, params); - params = compose_filter('dx_re', 7, params); - params = compose_filter('mode', 3, params); - params = compose_filter('cqdeInput', -1, params); + params = compose_filter('dx_re', 7, params); + params = compose_filter('mode', 3, params); + params = compose_filter('cqdeInput', -1, params); params = compose_filter('cqdxInput', -1, params); + params = compose_filter('exclft8', 0, params); + params = compose_filter('exclft4', 0, params); delete params_sv['lr']; //remove line row number, for future param comparison @@ -351,8 +358,8 @@ function refresh_timer() { tb.resetData(); params_sv = params; } - params['lr']=tb.getLastRowId(); - + params['lr'] = tb.getLastRowId(); + //Open a new connection, using the GET request on the URL endpoint //let csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content"); fetch('spotlist', { @@ -360,9 +367,9 @@ function refresh_timer() { cache: 'no-cache', credentials: 'same-origin', headers: { - 'Content-Type': 'application/json' + 'Content-Type': 'application/json' }, - body: JSON.stringify( params ) + body: JSON.stringify(params) }) .then((response) => response.json()) .then((data_new) => { diff --git a/static/js/rel/callsign_search.min.js b/static/js/rel/callsign_search.min.js index 6dc46b3..e3d4818 100644 --- a/static/js/rel/callsign_search.min.js +++ b/static/js/rel/callsign_search.min.js @@ -1 +1 @@ -function myCallsignSearch(e){e.preventDefault();e=document.getElementById("callsignInput").value;0{document.getElementById("form-filters").addEventListener("submit",mySearch)},document.getElementById("MyClockDisplay").addEventListener("load",showTime()); +var my_adxo_events=JSON.parse(my_adxo_events_json.replaceAll("\t","")),myRefresh=(refresh_timer(),setInterval(refresh_timer,timer_interval_json));window.onload=()=>{document.getElementById("form-filters").addEventListener("submit",mySearch)},document.getElementById("MyClockDisplay").addEventListener("load",showTime()),document.addEventListener("DOMContentLoaded",function(){document.getElementById("dxcalls");new TomSelect(document.getElementById("dxcalls"),{plugins:{remove_button:{title:"Remove callsign"},dropdown_header:{title:"Callsign"},clear_button:{title:"Remove all selected options"}},persist:!1,create:!0,createOnBlur:!0,allowEmptyOption:!0,maxItems:6,wrap:!0})}); diff --git a/static/js/rel/table.min.js b/static/js/rel/table.min.js index 86ee8a4..8361f06 100644 --- a/static/js/rel/table.min.js +++ b/static/js/rel/table.min.js @@ -1 +1 @@ -class table_builder{constructor(e){this.selector=e,this.current_data=[],this.first_time=!0}getLastRowId(){let e;return e=null==this.current_data||this.current_data.length<1?0:this.current_data[0].rowid}resetData(){this.current_data=[]}#buildRow(e,t,n,a=""){var r=document.createElement("tr"),t=(0NG3K Website",l=document.createElement("i"),o=(l.className="bi-search",l.role="button",l.ariaLabel=e.dx,document.createElement("a")),s=(o.href=qrz_url+e.dx,o.target="_blank",o.rel="noopener",document.createElement("span")),i=document.createElement("mark"),i=(i.textContent=e.dx,e.dx==a?s.appendChild(i):s.textContent=" "+e.dx,null!=d&&((a=document.createElement("i")).tabIndex=0,a.className="bi-megaphone-fill",a.style="color: cornflowerblue;",a.role="button",a.ariaLabel="dx_operations",a.setAttribute("data-bs-container","body"),a.setAttribute("data-bs-toggle","popover"),a.setAttribute("data-bs-trigger","focus"),a.setAttribute("data-bs-sanitizer","true"),a.setAttribute("data-bs-placement","auto"),a.setAttribute("data-bs-html","true"),a.setAttribute("data-bs-title","Announced DX Op.: "+d.summary),a.setAttribute("data-bs-content",d.description+"data from "+t),s.appendChild(a)),document.createElement("td"));o.appendChild(l),i.appendChild(o),i.append(s),r.appendChild(i);try{var c=document.createElement("span"),u=(c.className="img-flag fi fi-"+e.iso,c.setAttribute("data-bs-container","body"),c.setAttribute("data-bs-toggle","popover"),c.setAttribute("data-bs-trigger","hover"),c.setAttribute("data-bs-placement","left"),c.setAttribute("data-bs-content",e.country),document.createElement("td"));u.appendChild(c),r.appendChild(u)}catch(e){console.log(e),console.log("error creating flag");d=document.createElement("td");r.appendChild(d)}t=document.createElement("td"),t.className="d-none d-lg-table-cell d-xl-table-cell",t.textContent=e.country,r.appendChild(t),a=document.createElement("td");a.className="d-none d-lg-table-cell d-xl-table-cell";try{a.textContent=e.comm.substring(0,100)}catch(e){a.textContent=""}r.appendChild(a);let m=new Date(1e3*e.time),p="00"+m.getUTCHours(),h=(p=p.substring(p.length-2,p.length),"00"+m.getMinutes()),b=(h=h.substring(h.length-2,h.length),"00"+m.getUTCDate()),g=(b=b.substring(b.length-2,b.length),"00"+(Number(m.getUTCMonth())+1));g=g.substring(g.length-2,g.length);l=m.getUTCFullYear(),o=p+":"+h,m=b+"/"+g+"/"+l,s=document.createElement("div"),s.className="d-flex flex-column",i=document.createElement("div");return i.textContent=o,s.appendChild(i),m!=n&&((c=document.createElement("div")).textContent=m,s.appendChild(c)),r.appendChild(s),r}build(n,a){if(null!=n){var r=new Date;let e="00"+r.getUTCDate(),t=(e=e.substring(e.length-2,e.length),"00"+(Number(r.getUTCMonth())+1));t=t.substring(t.length-2,t.length);var r=r.getUTCFullYear(),l=e+"/"+t+"/"+r,o=(document.getElementById(this.selector).replaceChildren(),[]);for(let e=0;ee.value);a.lengthe.json()).then(t=>{try{tb.build(t)}catch(e){console.log(e),console.log(e.stack),console.log(t)}})} +class table_builder{constructor(e){this.selector=e,this.current_data=[],this.first_time=!0}getLastRowId(){let e;return e=null==this.current_data||this.current_data.length<1?0:this.current_data[0].rowid}resetData(){this.current_data=[]}#buildRow(e,t,n,a=""){var r=document.createElement("tr"),t=(0NG3K Website",l=document.createElement("i"),o=(l.className="bi-search",l.role="button",l.ariaLabel=e.dx,document.createElement("a")),s=(o.href=qrz_url+e.dx,o.target="_blank",o.rel="noopener",document.createElement("span")),c=document.createElement("mark"),c=(c.textContent=e.dx,e.dx==a?s.appendChild(c):s.textContent=" "+e.dx,null!=d&&((a=document.createElement("i")).tabIndex=0,a.className="bi-megaphone-fill",a.style="color: cornflowerblue;",a.role="button",a.ariaLabel="dx_operations",a.setAttribute("data-bs-container","body"),a.setAttribute("data-bs-toggle","popover"),a.setAttribute("data-bs-trigger","focus"),a.setAttribute("data-bs-sanitizer","true"),a.setAttribute("data-bs-placement","auto"),a.setAttribute("data-bs-html","true"),a.setAttribute("data-bs-title","Announced DX Op.: "+d.summary),a.setAttribute("data-bs-content",d.description+"data from "+t),s.appendChild(a)),document.createElement("td"));o.appendChild(l),c.appendChild(o),c.append(s),r.appendChild(c);try{var i=document.createElement("span"),m=(i.className="img-flag fi fi-"+e.iso,i.setAttribute("data-bs-container","body"),i.setAttribute("data-bs-toggle","popover"),i.setAttribute("data-bs-trigger","hover"),i.setAttribute("data-bs-placement","left"),i.setAttribute("data-bs-content",e.country),document.createElement("td"));m.appendChild(i),r.appendChild(m)}catch(e){console.log(e),console.log("error creating flag");d=document.createElement("td");r.appendChild(d)}t=document.createElement("td"),t.className="d-none d-lg-table-cell d-xl-table-cell",t.textContent=e.country,r.appendChild(t),a=document.createElement("td");a.className="d-none d-lg-table-cell d-xl-table-cell";try{a.textContent=e.comm.substring(0,100)}catch(e){a.textContent=""}r.appendChild(a);let u=new Date(1e3*e.time),p="00"+u.getUTCHours(),h=(p=p.substring(p.length-2,p.length),"00"+u.getMinutes()),b=(h=h.substring(h.length-2,h.length),"00"+u.getUTCDate()),g=(b=b.substring(b.length-2,b.length),"00"+(Number(u.getUTCMonth())+1));g=g.substring(g.length-2,g.length);l=u.getUTCFullYear(),o=p+":"+h,u=b+"/"+g+"/"+l,s=document.createElement("div"),s.className="d-flex flex-column",c=document.createElement("div");return c.textContent=o,s.appendChild(c),u!=n&&((i=document.createElement("div")).textContent=u,s.appendChild(i)),r.appendChild(s),r}build(n,a){if(null!=n){var r=new Date;let e="00"+r.getUTCDate(),t=(e=e.substring(e.length-2,e.length),"00"+(Number(r.getUTCMonth())+1));t=t.substring(t.length-2,t.length);var r=r.getUTCFullYear(),l=e+"/"+t+"/"+r,o=(document.getElementById(this.selector).replaceChildren(),[]);for(let e=0;ee.value)).lengthe.json()).then(t=>{try{tb.build(t)}catch(e){console.log(e),console.log(e.stack),console.log(t)}})} diff --git a/static/pwa/manifest.webmanifest b/static/pwa/manifest.webmanifest index d9d2452..6bdd4f6 100644 --- a/static/pwa/manifest.webmanifest +++ b/static/pwa/manifest.webmanifest @@ -1,5 +1,5 @@ { - "name": "IU1BOW Spiderweb v2.4.5.72", + "name": "IU1BOW Spiderweb v2.5", "description": "DXCluser for ham radio by IU1BOW", "short_name": "Spiderweb", "theme_color": "#f3b221", diff --git a/static/pwa/service-worker.js b/static/pwa/service-worker.js index 8356815..f571bdc 100644 --- a/static/pwa/service-worker.js +++ b/static/pwa/service-worker.js @@ -1,5 +1,5 @@ // Dichiarazione della costante per il nome della cache -const CACHE_NAME = 'pwa-spiderweb_v2.4.5.72' +const CACHE_NAME = 'pwa-spiderweb_v2.5' // Dichiarazione della costante per gli URL da mettere in cache const URLS_TO_CACHE = [ diff --git a/templates/_base.html b/templates/_base.html index afda613..f95aa9a 100644 --- a/templates/_base.html +++ b/templates/_base.html @@ -15,12 +15,17 @@ + + - + + {% endblock head %} @@ -91,7 +96,7 @@ © Copyleft: IU1BOW - Spiderweb - v2.4.5.72 + v2.5 @@ -101,10 +106,17 @@ {% endblock app_data %} + + + + + {% block app_scripts %} diff --git a/templates/index.html b/templates/index.html index 9d482cf..f120f03 100644 --- a/templates/index.html +++ b/templates/index.html @@ -6,7 +6,7 @@ {% endblock %} {% block head %} {{ super() }} - {% endblock %} + {% endblock %} {% block titles %}

WEB DX Cluster

@@ -26,6 +26,13 @@
+ DX Call(s) + +

Band +
+ + +

@@ -309,6 +320,7 @@ var continents_cq={{continents["continents"]|tojson|safe}}; var band_frequencies={{bands["bands"]|tojson|safe}}; {% endblock app_data %} + {% block app_scripts %} {{ super() }} diff --git a/templates/propagation.html b/templates/propagation.html new file mode 100644 index 0000000..39ec094 --- /dev/null +++ b/templates/propagation.html @@ -0,0 +1,213 @@ +{% extends "_base.html" %} + + + {% block title %} + DX Cluster from IU1BOW: Propagation + {% endblock %} + {% block head %} + {{ super() }} + {% endblock %} + +{% block titles %} +

Propagation

+

WEB DX Cluster For HAM Radio

+{% endblock %} +{% block filters %} +{% endblock %} +{% block contents %} + +
+
+
+ + + {% macro calculate_card_color(value, good=None, medium=None, no_good=None) %} + {# Usage: for string value, pass good, medium and no-good #} + {# for numeric value, pass good and no-good #} + {% if value|float > 0 %} + {% set numeric_value = value|float %} + {% if good is defined and no_good is defined %} + {% set numeric_good = good[0]|float %} + {% set numeric_no_good = no_good[0]|float %} + {% if numeric_good > numeric_no_good %} + {% if numeric_value >= numeric_good %} + good + {% elif numeric_value < numeric_no_good %} + no-good + {% else %} + medium + {% endif %} + {% else %} + {% if numeric_value < numeric_good %} + good + {% elif numeric_value >= numeric_no_good %} + no-good + {% else %} + medium + {% endif %} + {% endif %} + {% endif %} + {% else %} + {# Check litteral values #} + {% if good is defined and value in good %} + good + {% elif medium is defined and value in medium %} + medium + {% elif no_good is defined and value in no_good %} + no-good + {% else %} + grey-dark + {% endif %} + {% endif %} + {% endmacro %} + + + {% macro generate_kpi_card(card_data, good=None, medium=None, no_good=None) %} + {% set card_value = card_data.value|lower %} + {% if card_value != "norpt" and card_value != "no report" and card_value!= "no report" and card_value!= "" %} +
+ {{ card_data.value }} + {{ card_data.text }} + + {% if card_data.icon %} + + {% endif %} +
+ {% endif %} + {% endmacro %} + + +
+ {% for card_data in [ + {'value': solar_data.solar.solardata.solarflux, 'text': 'SFI', 'good': [100], 'no_good': [70]}, + {'value': solar_data.solar.solardata.aindex, 'text': 'A Index', 'good': [7], 'no_good': [50]}, + {'value': solar_data.solar.solardata.kindex, 'text': 'K Index', 'good': [3], 'no_good': [7]}, + {'value': solar_data.solar.solardata.kindexnt, 'text': 'K Index NT'}, + {'value': solar_data.solar.solardata.sunspots, 'text': 'Sun spots', 'good': [101], 'no_good': [50]}, + {'value': solar_data.solar.solardata.latdegree, 'text': 'Aurora latitude','good': [30], 'no_good': [60]}, + {'value': solar_data.solar.solardata.solarwind, 'text': 'Solar wind (km/s)','good': [400], 'no_good': [500]}, + {'value': solar_data.solar.solardata.magneticfield, 'text': 'Magnetic field','good': [0.30], 'no_good': [0.50]}, + {'value': solar_data.solar.solardata.geomagfield, 'text': 'Geomagnetic field','good': ['vr quiet','quiet'], 'medium': ['unsettld','min strm'], 'no_good': ['stormy','very stormy']}, + {'value': solar_data.solar.solardata.signalnoise, 'text': 'Signal noise', 'good': ['s0-s1','s1-s2'], 'medium': ['s2-s3','s3-s4'], 'no_good': ['s4-s6','s5-s6','s6-s7','s7-s8','s8-s9']}, + {'value': solar_data.solar.solardata.fof2, 'text': 'Fof2 (Mhz)','good': [4], 'no_good': [2]} + ] %} + {{ generate_kpi_card(card_data, card_data.good, card_data.medium, card_data.no_good) }} + {% endfor %} +
+ +
+
+ + + {% macro color_band(value) %} + {% set value = value|lower %} + {% if value == "poor" %} + badge bg-danger + {% elif value == "fair" %} + badge bg-warning text-dark + {% else %} + badge bg-success + {% endif %} + {% endmacro %} + + + + + + + + + + + + + + {% set band_length = solar_data.solar.solardata.calculatedconditions.band | length / 2%} + {% for i_band in range(0, band_length|int) %} + {% set day_band = solar_data.solar.solardata.calculatedconditions.band | selectattr('@name', 'equalto', solar_data.solar.solardata.calculatedconditions.band[i_band]['@name']) | selectattr('@time', 'equalto', 'day') | first %} + {% set night_band = solar_data.solar.solardata.calculatedconditions.band | selectattr('@name', 'equalto', solar_data.solar.solardata.calculatedconditions.band[i_band]['@name']) | selectattr('@time', 'equalto', 'night') | first %} + + + + + + {% endfor %} + +
+ Band  + + Day  + + Night  +
{{ day_band['@name'] }}{{ day_band['#text'] }}{{ night_band['#text'] }}
+
+ +
+ + + + + + + + + + + + + {% set vhf_phenomenon_length = solar_data.solar.solardata.calculatedvhfconditions.phenomenon | length %} + {% for i_vhf_phenomenon in range(0, vhf_phenomenon_length) %} + + + + + + {% endfor %} + +
+ Phenomenon  + + Location  + + Condition  +
{{solar_data.solar.solardata.calculatedvhfconditions.phenomenon[i_vhf_phenomenon]['@name'] }}{{ solar_data.solar.solardata.calculatedvhfconditions.phenomenon[i_vhf_phenomenon]['@location']| replace('_', ' ')|title }}{{ solar_data.solar.solardata.calculatedvhfconditions.phenomenon[i_vhf_phenomenon]['#text']| replace('_', ' '|title) }}
+
+ +
+
+ Updated: {{ solar_data.solar.solardata.updated }} + Source: + {{ solar_data.solar.solardata.source['@url']|replace('http://','https://') }} + +
+
+ + +
+
+ + muf map + +
+
+ MUF map powered by + https://prop.kc2g.com/ + +
+ +
+ +
+ +{% endblock %} +{% block app_data %} +{% endblock %} +{% block app_scritps %} +{% endblock %} +{% block inline_scripts %} +{% endblock %} \ No newline at end of file diff --git a/test.sh b/test.sh index a860868..dc44071 100755 --- a/test.sh +++ b/test.sh @@ -11,6 +11,7 @@ if [ $# -gt 0 ] fi if [ "$1" == "-d" ]; then + rm -rf __pycache__ flask --app webapp.py --debug run --exclude-patterns *webapp.log* else flask --app webapp.py run diff --git a/webapp.py b/webapp.py index a3ef6b2..790abba 100644 --- a/webapp.py +++ b/webapp.py @@ -13,11 +13,12 @@ from lib.adxo import get_adxo_events from lib.qry import query_manager from lib.cty import prefix_table from lib.plot_data_provider import ContinentsBandsProvider, SpotsPerMounthProvider, SpotsTrend, HourBand, WorldDxSpotsLive - +import requests +import xmltodict logging.config.fileConfig("cfg/webapp_log_config.ini", disable_existing_loggers=True) logger = logging.getLogger(__name__) -logger.info("Start") +logger.info("Starting SPIDERWEB") app = flask.Flask(__name__) app.config["SECRET_KEY"] = secrets.token_hex(16) @@ -26,6 +27,10 @@ app.config.update( SESSION_COOKIE_HTTPONLY=False, SESSION_COOKIE_SAMESITE="Strict", ) +version_file = open("cfg/version.txt", "r") +app.config["VERSION"] = version_file.read().strip() +version_file.close +logger.info("Version:"+app.config["VERSION"] ) inline_script_nonce = "" @@ -38,6 +43,10 @@ if app.config["DEBUG"]: else: minify(app=app, html=True, js=True, cssless=False) +#removing whitespace from jinja2 html rendered +app.jinja_env.trim_blocks = True +app.jinja_env.lstrip_blocks = True + # load config file with open("cfg/config.json") as json_data_file: cfg = json.load(json_data_file) @@ -98,13 +107,17 @@ def query_build_callsign(callsign): def query_build(parameters): try: + last_rowid = str(parameters["lr"]) # Last rowid fetched by front end get_param = lambda parameters, parm_name: parameters[parm_name] if (parm_name in parameters) else [] + dxcalls=get_param(parameters, "dxcalls") band=get_param(parameters, "band") dere=get_param(parameters, "de_re") dxre=get_param(parameters, "dx_re") mode=get_param(parameters, "mode") + exclft8=get_param(parameters, "exclft8") + exclft4=get_param(parameters, "exclft4") decq = [] if "cqdeInput" in parameters: @@ -116,6 +129,9 @@ def query_build(parameters): query_string = "" + #construct callsign of spot dx callsign + dxcalls_qry_string = " AND spotcall IN (" + ''.join(map(lambda x: "'" + x + "'," if x != dxcalls[-1] else "'" + x + "'", dxcalls)) + ")" + # construct band query decoding frequencies with json file band_qry_string = " AND ((" for i, item_band in enumerate(band): @@ -145,6 +161,36 @@ def query_build(parameters): ) mode_qry_string += "))" + + #Exluding FT8 or FT4 connection + ft8_qry_string = " AND (" + if exclft8: + ft8_qry_string += "(comment NOT LIKE '%FT8%')" + single_mode = find_id_json(modes_frequencies["modes"], "digi-ft8") + for j in range(len(single_mode["freq"])): + ft8_qry_string += ( + " AND (freq NOT BETWEEN " + + str(single_mode["freq"][j]["min"]) + + " AND " + + str(single_mode["freq"][j]["max"]) + + ")" + ) + ft8_qry_string += ")" + + ft4_qry_string = " AND (" + if exclft4: + ft4_qry_string += "(comment NOT LIKE '%FT4%')" + single_mode = find_id_json(modes_frequencies["modes"], "digi-ft4") + for j in range(len(single_mode["freq"])): + ft4_qry_string += ( + " AND (freq NOT BETWEEN " + + str(single_mode["freq"][j]["min"]) + + " AND " + + str(single_mode["freq"][j]["max"]) + + ")" + ) + ft4_qry_string += ")" + # construct DE continent region query dere_qry_string = " AND spottercq IN (" for i, item_dere in enumerate(dere): @@ -185,6 +231,8 @@ def query_build(parameters): + last_rowid ) + if dxcalls: + query_string += dxcalls_qry_string if len(band) > 0: query_string += band_qry_string @@ -192,6 +240,12 @@ def query_build(parameters): if len(mode) > 0: query_string += mode_qry_string + if exclft8: + query_string += ft8_qry_string + + if exclft4: + query_string += ft4_qry_string + if len(dere) > 0: query_string += dere_qry_string @@ -207,6 +261,8 @@ def query_build(parameters): query_string += " ORDER BY rowid desc limit 50;" + logger.debug (query_string) + except Exception as e: logger.error(e) query_string = "" @@ -312,11 +368,33 @@ def spots(): adxo_events=adxo_events, continents=continents_cq, bands=band_frequencies, + dx_calls=get_dx_calls(), ) ) return response +#Show all dx spot callsigns +def get_dx_calls(): + try: + query_string = "SELECT spotcall AS dx FROM spot GROUP BY spotcall ORDER BY count(spotcall) DESC LIMIT 500" + qm.qry(query_string) + data = qm.get_data() + row_headers = qm.get_headers() + + payload = [] + for result in data: + main_result = dict(zip(row_headers, result)) + payload.append(main_result["dx"]) + logger.debug("last DX Callsigns:") + logger.debug(payload) + return payload + + except Exception as e: + return [] + + + @app.route("/service-worker.js", methods=["GET"]) def sw(): return app.send_static_file("pwa/service-worker.js") @@ -347,6 +425,36 @@ def plots(): ) return response + +@app.route("/propagation.html") +def propagation(): + + #get solar data in XML format and convert to json + solar_data={} + url = "https://www.hamqsl.com/solarxml.php" + try: + logging.debug("connection to: " + url) + req = requests.get(url) + logger.debug(req.content) + solar_data = xmltodict.parse(req.content) + logger.debug(solar_data) + + except Exception as e1: + logging.error(e1) + + response = flask.Response( + render_template( + "propagation.html", + inline_script_nonce=get_nonce(), + mycallsign=cfg["mycallsign"], + telnet=cfg["telnet"]["host"]+":"+cfg["telnet"]["port"], + mail=cfg["mail"], + menu_list=cfg["menu"]["menu_list"], + solar_data=solar_data + ) + ) + return response + @app.route("/cookies.html", methods=["GET"]) def cookies(): response = flask.Response( @@ -493,28 +601,30 @@ def add_security_headers(resp): resp.headers["X-Frame-Options"] = "SAMEORIGIN" resp.headers["X-Content-Type-Options"] = "nosniff" resp.headers["Referrer-Policy"] = "strict-origin-when-cross-origin" + #resp.headers["Access-Control-Allow-Origin"]= "sidc.be prop.kc2g.com www.hamqsl.com" resp.headers["Cache-Control"] = "public, no-cache" resp.headers["Pragma"] = "no-cache" + resp.headers["ETag"] = app.config["VERSION"] + #resp.headers["Report-To"] = '{"group":"csp-endpoint", "max_age":10886400, "endpoints":[{"url":"/csp-reports"}]}' resp.headers["Content-Security-Policy"] = "\ default-src 'self';\ script-src 'self' cdnjs.cloudflare.com cdn.jsdelivr.net 'nonce-"+inline_script_nonce+"';\ - style-src 'self' cdnjs.cloudflare.com cdn.jsdelivr.net 'unsafe-inline';\ + style-src 'self' cdnjs.cloudflare.com cdn.jsdelivr.net;\ object-src 'none';base-uri 'self';\ - connect-src 'self' cdn.jsdelivr.net cdnjs.cloudflare.com sidc.be;\ + connect-src 'self' cdn.jsdelivr.net cdnjs.cloudflare.com sidc.be prop.kc2g.com www.hamqsl.com;\ font-src 'self' cdn.jsdelivr.net;\ frame-src 'self';\ frame-ancestors 'none';\ form-action 'none';\ - img-src 'self' data: cdnjs.cloudflare.com sidc.be;\ + img-src 'self' data: cdnjs.cloudflare.com sidc.be prop.kc2g.com ;\ manifest-src 'self';\ media-src 'self';\ worker-src 'self';\ - worker-src 'self';\ report-uri /csp-reports;\ " - return resp + #report-to csp-endpoint;\ #script-src 'self' cdnjs.cloudflare.com cdn.jsdelivr.net 'nonce-sedfGFG32xs';\ #script-src 'self' cdnjs.cloudflare.com cdn.jsdelivr.net 'nonce-"+inline_script_nonce+"';\ diff --git a/webapp.py.old b/webapp.py.old new file mode 100644 index 0000000..651dee2 --- /dev/null +++ b/webapp.py.old @@ -0,0 +1,611 @@ +__author__ = "IU1BOW - Corrado" +import flask +import secrets +from flask import request, render_template +from flask_wtf.csrf import CSRFProtect +from flask_minify import minify +import json +import threading +import logging +import logging.config +from lib.dxtelnet import who +from lib.adxo import get_adxo_events +from lib.qry import query_manager +from lib.cty import prefix_table +from lib.plot_data_provider import ContinentsBandsProvider, SpotsPerMounthProvider, SpotsTrend, HourBand, WorldDxSpotsLive + + +logging.config.fileConfig("cfg/webapp_log_config.ini", disable_existing_loggers=True) +logger = logging.getLogger(__name__) +logger.info("Starting SPIDERWEB") + +app = flask.Flask(__name__) +app.config["SECRET_KEY"] = secrets.token_hex(16) +app.config.update( + SESSION_COOKIE_SECURE=True, + SESSION_COOKIE_HTTPONLY=False, + SESSION_COOKIE_SAMESITE="Strict", +) +version_file = open("cfg/version.txt", "r") +app.config["VERSION"] = version_file.read().strip() +version_file.close +logger.info("Version:"+app.config["VERSION"] ) + +inline_script_nonce = "" + +csrf = CSRFProtect(app) + +logger.debug(app.config) + +if app.config["DEBUG"]: + minify(app=app, html=False, js=False, cssless=False) +else: + minify(app=app, html=True, js=True, cssless=False) + +# load config file +with open("cfg/config.json") as json_data_file: + cfg = json.load(json_data_file) + +logging.debug("CFG:") +logging.debug(cfg) +# load bands file +with open("cfg/bands.json") as json_bands: + band_frequencies = json.load(json_bands) + +# load mode file +with open("cfg/modes.json") as json_modes: + modes_frequencies = json.load(json_modes) + +# load continents-cq file +with open("cfg/continents.json") as json_continents: + continents_cq = json.load(json_continents) + +# read and set default for enabling cq filter +if cfg.get("enable_cq_filter"): + enable_cq_filter = cfg["enable_cq_filter"].upper() +else: + enable_cq_filter = "N" + +# define country table for search info on callsigns +pfxt = prefix_table() + +# create object query manager +qm = query_manager() + +# find id in json : ie frequency / continent +def find_id_json(json_object, name): + return [obj for obj in json_object if obj["id"] == name][0] + + +def query_build_callsign(callsign): + + query_string = "" + if len(callsign) <= 14: + query_string = ( + "(SELECT rowid, spotter AS de, freq, spotcall AS dx, comment AS comm, time, spotdxcc from spot WHERE spotter='" + + callsign + + "'" + ) + query_string += " ORDER BY rowid desc limit 10)" + query_string += " UNION " + query_string += ( + "(SELECT rowid, spotter AS de, freq, spotcall AS dx, comment AS comm, time, spotdxcc from spot WHERE spotcall='" + + callsign + + "'" + ) + query_string += " ORDER BY rowid desc limit 10);" + else: + logging.warning("callsign too long") + return query_string + + +def query_build(parameters): + + try: + + last_rowid = str(parameters["lr"]) # Last rowid fetched by front end + + get_param = lambda parameters, parm_name: parameters[parm_name] if (parm_name in parameters) else [] + dxcalls=get_param(parameters, "dxcalls") + band=get_param(parameters, "band") + dere=get_param(parameters, "de_re") + dxre=get_param(parameters, "dx_re") + mode=get_param(parameters, "mode") + exclft8=get_param(parameters, "exclft8") + exclft4=get_param(parameters, "exclft4") + + decq = [] + if "cqdeInput" in parameters: + decq[0] = parameters["cqdeInput"] + + dxcq = [] + if "cqdxInput" in parameters: + dxcq[0] = parameters["cqdxInput"] + + query_string = "" + + #construct callsign of spot dx callsign + dxcalls_qry_string = " AND spotcall IN (" + ''.join(map(lambda x: "'" + x + "'," if x != dxcalls[-1] else "'" + x + "'", dxcalls)) + ")" + + # construct band query decoding frequencies with json file + band_qry_string = " AND ((" + for i, item_band in enumerate(band): + freq = find_id_json(band_frequencies["bands"], item_band) + if i > 0: + band_qry_string += ") OR (" + + band_qry_string += ( + "freq BETWEEN " + str(freq["min"]) + " AND " + str(freq["max"]) + ) + + band_qry_string += "))" + # construct mode query + mode_qry_string = " AND ((" + for i, item_mode in enumerate(mode): + single_mode = find_id_json(modes_frequencies["modes"], item_mode) + if i > 0: + mode_qry_string += ") OR (" + for j in range(len(single_mode["freq"])): + if j > 0: + mode_qry_string += ") OR (" + mode_qry_string += ( + "freq BETWEEN " + + str(single_mode["freq"][j]["min"]) + + " AND " + + str(single_mode["freq"][j]["max"]) + ) + + mode_qry_string += "))" + + #Exluding FT8 or FT4 connection + ft8_qry_string = " AND (" + if exclft8: + ft8_qry_string += "(comment NOT LIKE '%FT8%')" + single_mode = find_id_json(modes_frequencies["modes"], "digi-ft8") + for j in range(len(single_mode["freq"])): + ft8_qry_string += ( + " AND (freq NOT BETWEEN " + + str(single_mode["freq"][j]["min"]) + + " AND " + + str(single_mode["freq"][j]["max"]) + + ")" + ) + ft8_qry_string += ")" + + ft4_qry_string = " AND (" + if exclft4: + ft4_qry_string += "(comment NOT LIKE '%FT4%')" + single_mode = find_id_json(modes_frequencies["modes"], "digi-ft4") + for j in range(len(single_mode["freq"])): + ft4_qry_string += ( + " AND (freq NOT BETWEEN " + + str(single_mode["freq"][j]["min"]) + + " AND " + + str(single_mode["freq"][j]["max"]) + + ")" + ) + ft4_qry_string += ")" + + # construct DE continent region query + dere_qry_string = " AND spottercq IN (" + for i, item_dere in enumerate(dere): + continent = find_id_json(continents_cq["continents"], item_dere) + if i > 0: + dere_qry_string += "," + dere_qry_string += str(continent["cq"]) + dere_qry_string += ")" + + # construct DX continent region query + dxre_qry_string = " AND spotcq IN (" + for i, item_dxre in enumerate(dxre): + continent = find_id_json(continents_cq["continents"], item_dxre) + if i > 0: + dxre_qry_string += "," + dxre_qry_string += str(continent["cq"]) + dxre_qry_string += ")" + + if enable_cq_filter == "Y": + # construct de cq query + decq_qry_string = "" + if len(decq) == 1: + if decq[0].isnumeric(): + decq_qry_string = " AND spottercq =" + decq[0] + # construct dx cq query + dxcq_qry_string = "" + if len(dxcq) == 1: + if dxcq[0].isnumeric(): + dxcq_qry_string = " AND spotcq =" + dxcq[0] + + if last_rowid is None: + last_rowid = "0" + if not last_rowid.isnumeric(): + last_rowid = 0 + + query_string = ( + "SELECT rowid, spotter AS de, freq, spotcall AS dx, comment AS comm, time, spotdxcc from spot WHERE rowid > " + + last_rowid + ) + + if dxcalls: + query_string += dxcalls_qry_string + + if len(band) > 0: + query_string += band_qry_string + + if len(mode) > 0: + query_string += mode_qry_string + + if exclft8: + query_string += ft8_qry_string + + if exclft4: + query_string += ft4_qry_string + + if len(dere) > 0: + query_string += dere_qry_string + + if len(dxre) > 0: + query_string += dxre_qry_string + + if enable_cq_filter == "Y": + if len(decq_qry_string) > 0: + query_string += decq_qry_string + + if len(dxcq_qry_string) > 0: + query_string += dxcq_qry_string + + query_string += " ORDER BY rowid desc limit 50;" + + logger.debug (query_string) + + except Exception as e: + logger.error(e) + query_string = "" + + return query_string + + +# the main query to show spots +# it gets url parameter in order to apply the build the right query +# and apply the filter required. It returns a json with the spots +def spotquery(parameters): + try: + + if 'callsign' in parameters: + logging.debug('search callsign') + query_string = query_build_callsign( parameters['callsign'] ) + else: + logging.debug('search eith other filters') + query_string = query_build(parameters) + + qm.qry(query_string) + data = qm.get_data() + row_headers = qm.get_headers() + + logger.debug("query done") + logger.debug(data) + + if data is None or len(data) == 0: + logger.warning("no data found") + + payload = [] + for result in data: + # create dictionary from recorset + main_result = dict(zip(row_headers, result)) + # find the country in prefix table + search_prefix = pfxt.find(main_result["dx"]) + # merge recordset and contry prefix + main_result["country"] = search_prefix["country"] + main_result["iso"] = search_prefix["iso"] + + payload.append({**main_result}) + + return payload + except Exception as e: + logger.error(e) + +# find adxo events +adxo_events = None + +def get_adxo(): + global adxo_events + adxo_events = get_adxo_events() + threading.Timer(12 * 3600, get_adxo).start() + + +get_adxo() + +# create data provider for charts +heatmap_cbp = ContinentsBandsProvider(logger, qm, continents_cq, band_frequencies) +bar_graph_spm = SpotsPerMounthProvider(logger, qm) +line_graph_st = SpotsTrend(logger, qm) +bubble_graph_hb = HourBand(logger, qm, band_frequencies) +geo_graph_wdsl = WorldDxSpotsLive(logger, qm, pfxt) + +# ROUTINGS +@app.route("/spotlist", methods=["POST"]) +@csrf.exempt +def spotlist(): + logger.debug(request.json) + response = flask.Response(json.dumps(spotquery(request.json))) + return response + + +def who_is_connected(): + host=cfg["telnet"]["host"] + port=cfg["telnet"]["port"] + user=cfg["telnet"]["user"] + password=cfg["telnet"]["password"] + response = who(host, port, user, password) + logger.debug("list of connected clusters:") + logger.debug(response) + return response + +#Calculate nonce token used in inline script and in csp "script-src" header +def get_nonce(): + global inline_script_nonce + inline_script_nonce = secrets.token_hex() + return inline_script_nonce + +@app.route("/", methods=["GET"]) +@app.route("/index.html", methods=["GET"]) +def spots(): + response = flask.Response( + render_template( + "index.html", + inline_script_nonce=get_nonce(), + mycallsign=cfg["mycallsign"], + telnet=cfg["telnet"]["host"]+":"+cfg["telnet"]["port"], + mail=cfg["mail"], + menu_list=cfg["menu"]["menu_list"], + enable_cq_filter=enable_cq_filter, + timer_interval=cfg["timer"]["interval"], + adxo_events=adxo_events, + continents=continents_cq, + bands=band_frequencies, + dx_calls=get_dx_calls(), + ) + ) + return response + + +#Show all dx spot callsigns +def get_dx_calls(): + try: + query_string = "SELECT spotcall AS dx FROM spot GROUP BY spotcall ORDER BY count(spotcall) DESC LIMIT 500" + qm.qry(query_string) + data = qm.get_data() + row_headers = qm.get_headers() + + payload = [] + for result in data: + main_result = dict(zip(row_headers, result)) + payload.append(main_result["dx"]) + logger.debug("last DX Callsigns:") + logger.debug(payload) + return payload + + except Exception as e: + return [] + + + +@app.route("/service-worker.js", methods=["GET"]) +def sw(): + return app.send_static_file("pwa/service-worker.js") + +@app.route("/offline.html") +def root(): + return app.send_static_file("html/offline.html") + +@app.route("/world.json") +def world_data(): + return app.send_static_file("data/world.json") + +@app.route("/plots.html") +def plots(): + whoj = who_is_connected() + response = flask.Response( + render_template( + "plots.html", + inline_script_nonce=get_nonce(), + mycallsign=cfg["mycallsign"], + telnet=cfg["telnet"]["host"]+":"+cfg["telnet"]["port"], + mail=cfg["mail"], + menu_list=cfg["menu"]["menu_list"], + who=whoj, + continents=continents_cq, + bands=band_frequencies, + ) + ) + return response + +@app.route("/propagation.html") +def propagation(): + response = flask.Response( + render_template( + "propagation.html", + inline_script_nonce=get_nonce(), + mycallsign=cfg["mycallsign"], + telnet=cfg["telnet"]["host"]+":"+cfg["telnet"]["port"], + mail=cfg["mail"], + menu_list=cfg["menu"]["menu_list"], + ) + ) + return response + +@app.route("/cookies.html", methods=["GET"]) +def cookies(): + response = flask.Response( + render_template( + "cookies.html", + inline_script_nonce=get_nonce(), + mycallsign=cfg["mycallsign"], + telnet=cfg["telnet"]["host"]+":"+cfg["telnet"]["port"], + mail=cfg["mail"], + menu_list=cfg["menu"]["menu_list"], + ) + ) + return response + +@app.route("/privacy.html", methods=["GET"]) +def privacy(): + response = flask.Response( + render_template( + "privacy.html", + inline_script_nonce=get_nonce(), + mycallsign=cfg["mycallsign"], + telnet=cfg["telnet"]["host"]+":"+cfg["telnet"]["port"], + mail=cfg["mail"], + menu_list=cfg["menu"]["menu_list"], + ) + ) + return response + +@app.route("/sitemap.xml") +def sitemap(): + return app.send_static_file("sitemap.xml") + + +@app.route("/callsign.html", methods=["GET"]) +def callsign(): + # payload=spotquery() + callsign = request.args.get("c") + response = flask.Response( + render_template( + "callsign.html", + inline_script_nonce=get_nonce(), + mycallsign=cfg["mycallsign"], + telnet=cfg["telnet"]["host"]+":"+cfg["telnet"]["port"], + mail=cfg["mail"], + menu_list=cfg["menu"]["menu_list"], + timer_interval=cfg["timer"]["interval"], + callsign=callsign, + adxo_events=adxo_events, + continents=continents_cq, + bands=band_frequencies, + ) + ) + return response + + +# API that search a callsign and return all informations about that +@app.route("/callsign", methods=["GET"]) +def find_callsign(): + callsign = request.args.get("c") + response = pfxt.find(callsign) + if response is None: + response = flask.Response(status=204) + return response + + +@app.route("/plot_get_heatmap_data", methods=["POST"]) +@csrf.exempt +def get_heatmap_data(): + #continent = request.args.get("continent") + continent = request.json['continent'] + logger.debug(request.get_json()); + response = flask.Response(json.dumps(heatmap_cbp.get_data(continent))) + logger.debug(response) + if response is None: + response = flask.Response(status=204) + return response + + +@app.route("/plot_get_dx_spots_per_month", methods=["POST"]) +@csrf.exempt +def get_dx_spots_per_month(): + response = flask.Response(json.dumps(bar_graph_spm.get_data())) + logger.debug(response) + if response is None: + response = flask.Response(status=204) + return response + + +@app.route("/plot_get_dx_spots_trend", methods=["POST"]) +@csrf.exempt +def get_dx_spots_trend(): + response = flask.Response(json.dumps(line_graph_st.get_data())) + logger.debug(response) + if response is None: + response = flask.Response(status=204) + return response + + +@app.route("/plot_get_hour_band", methods=["POST"]) +@csrf.exempt +def get_dx_hour_band(): + response = flask.Response(json.dumps(bubble_graph_hb.get_data())) + logger.debug(response) + if response is None: + response = flask.Response(status=204) + return response + + +@app.route("/plot_get_world_dx_spots_live", methods=["POST"]) +@csrf.exempt +def get_world_dx_spots_live(): + response = flask.Response(json.dumps(geo_graph_wdsl.get_data())) + logger.debug(response) + if response is None: + response = flask.Response(status=204) + return response + +@app.route("/csp-reports", methods=['POST']) +@csrf.exempt +def csp_reports(): + report_data = request.get_data(as_text=True) + logger.warning("CSP Report:") + logger.warning(report_data) + response=flask.Response(status=204) + return response + +@app.context_processor +def inject_template_scope(): + injections = dict() + + def cookies_check(): + value = request.cookies.get("cookie_consent") + return value == "true" + + injections.update(cookies_check=cookies_check) + return injections + + +@app.after_request +def add_security_headers(resp): + + resp.headers["Strict-Transport-Security"] = "max-age=1000" + resp.headers["X-Xss-Protection"] = "1; mode=block" + resp.headers["X-Frame-Options"] = "SAMEORIGIN" + resp.headers["X-Content-Type-Options"] = "nosniff" + resp.headers["Referrer-Policy"] = "strict-origin-when-cross-origin" + resp.headers["Cache-Control"] = "public, no-cache" + resp.headers["Pragma"] = "no-cache" + + resp.headers["ETag"] = app.config["VERSION"] + #resp.headers["Report-To"] = '{"group":"csp-endpoint", "max_age":10886400, "endpoints":[{"url":"/csp-reports"}]}' + resp.headers["Content-Security-Policy"] = "\ + default-src 'self';\ + script-src 'self' cdnjs.cloudflare.com cdn.jsdelivr.net 'nonce-"+inline_script_nonce+"';\ + style-src 'self' cdnjs.cloudflare.com cdn.jsdelivr.net;\ + object-src 'none';base-uri 'self';\ + connect-src 'self' cdn.jsdelivr.net cdnjs.cloudflare.com sidc.be;\ + font-src 'self' cdn.jsdelivr.net;\ + frame-src 'self';\ + frame-ancestors 'none';\ + form-action 'none';\ + img-src 'self' data: cdnjs.cloudflare.com sidc.be;\ + manifest-src 'self';\ + media-src 'self';\ + worker-src 'self';\ + report-uri /csp-reports;\ + " + return resp + + #report-to csp-endpoint;\ + #script-src 'self' cdnjs.cloudflare.com cdn.jsdelivr.net 'nonce-sedfGFG32xs';\ + #script-src 'self' cdnjs.cloudflare.com cdn.jsdelivr.net 'nonce-"+inline_script_nonce+"';\ + +if __name__ == "__main__": + app.run(host="0.0.0.0") diff --git a/webapp_sanit.py.old b/webapp_sanit.py.old new file mode 100644 index 0000000..0d531c5 --- /dev/null +++ b/webapp_sanit.py.old @@ -0,0 +1,617 @@ +__author__ = "IU1BOW - Corrado" +import flask +import secrets +from flask import request, render_template +from flask_wtf.csrf import CSRFProtect +from flask_minify import minify +import json +import threading +import logging +import logging.config +from lib.dxtelnet import who +from lib.adxo import get_adxo_events +from lib.qry import query_manager +from lib.cty import prefix_table +from lib.plot_data_provider import ContinentsBandsProvider, SpotsPerMounthProvider, SpotsTrend, HourBand, WorldDxSpotsLive + +logging.config.fileConfig("cfg/webapp_log_config.ini", disable_existing_loggers=True) +logger = logging.getLogger(__name__) +logger.info("Starting SPIDERWEB") + +app = flask.Flask(__name__) +app.config["SECRET_KEY"] = secrets.token_hex(16) +app.config.update( + SESSION_COOKIE_SECURE=True, + SESSION_COOKIE_HTTPONLY=False, + SESSION_COOKIE_SAMESITE="Strict", +) +version_file = open("cfg/version.txt", "r") +app.config["VERSION"] = version_file.read().strip() +version_file.close() +logger.info("Version:" + app.config["VERSION"]) + +inline_script_nonce = "" + +csrf = CSRFProtect(app) + +logger.debug(app.config) + +if app.config["DEBUG"]: + minify(app=app, html=False, js=False, cssless=False) +else: + minify(app=app, html=True, js=True, cssless=False) + +# load config file +with open("cfg/config.json") as json_data_file: + cfg = json.load(json_data_file) + +logging.debug("CFG:") +logging.debug(cfg) +# load bands file +with open("cfg/bands.json") as json_bands: + band_frequencies = json.load(json_bands) + +# load mode file +with open("cfg/modes.json") as json_modes: + modes_frequencies = json.load(json_modes) + +# load continents-cq file +with open("cfg/continents.json") as json_continents: + continents_cq = json.load(json_continents) + +# read and set default for enabling cq filter +if cfg.get("enable_cq_filter"): + enable_cq_filter = cfg["enable_cq_filter"].upper() +else: + enable_cq_filter = "N" + +# define country table for search info on callsigns +pfxt = prefix_table() + +# create object query manager +qm = query_manager() + +# find id in json : ie frequency / continent +def find_id_json(json_object, name): + return [obj for obj in json_object if obj["id"] == name][0] + +def query_build_callsign(callsign): + + query_string = "" + if len(callsign) <= 14: + query_string = ( + "(SELECT rowid, spotter AS de, freq, spotcall AS dx, comment AS comm, time, spotdxcc from spot WHERE spotter='" + + callsign + + "'" + ) + query_string += " ORDER BY rowid desc limit 10)" + query_string += " UNION " + query_string += ( + "(SELECT rowid, spotter AS de, freq, spotcall AS dx, comment AS comm, time, spotdxcc from spot WHERE spotcall='" + + callsign + + "'" + ) + query_string += " ORDER BY rowid desc limit 10);" + else: + logging.warning("callsign too long") + return query_string + + +def query_build(parameters): + + try: + + last_rowid = str(parameters["lr"]) # Last rowid fetched by front end + + get_param = lambda parameters, parm_name: parameters[parm_name] if (parm_name in parameters) else [] + dxcalls=get_param(parameters, "dxcalls") + band=get_param(parameters, "band") + dere=get_param(parameters, "de_re") + dxre=get_param(parameters, "dx_re") + mode=get_param(parameters, "mode") + exclft8=get_param(parameters, "exclft8") + exclft4=get_param(parameters, "exclft4") + + decq = [] + if "cqdeInput" in parameters: + decq.append(parameters["cqdeInput"]) + + dxcq = [] + if "cqdxInput" in parameters: + dxcq.append(parameters["cqdxInput"]) + + query_string = "" + + #construct callsign of spot dx callsign + dxcalls_qry_string = " AND spotcall IN (" + ",".join(["%s" for _ in dxcalls]) + ")" + dxcalls_params = tuple(dxcalls) + + # construct band query decoding frequencies with json file + band_qry_string = " AND ((" + for i, item_band in enumerate(band): + freq = find_id_json(band_frequencies["bands"], item_band) + if i > 0: + band_qry_string += ") OR (" + + band_qry_string += ( + "freq BETWEEN " + str(freq["min"]) + " AND " + str(freq["max"]) + ) + + band_qry_string += "))" + # construct mode query + mode_qry_string = " AND ((" + for i, item_mode in enumerate(mode): + single_mode = find_id_json(modes_frequencies["modes"], item_mode) + if i > 0: + mode_qry_string += ") OR (" + for j in range(len(single_mode["freq"])): + if j > 0: + mode_qry_string += ") OR (" + mode_qry_string += ( + "freq BETWEEN " + + str(single_mode["freq"][j]["min"]) + + " AND " + + str(single_mode["freq"][j]["max"]) + ) + + mode_qry_string += "))" + + # Exluding FT8 or FT4 connection + ft8_qry_string = " AND (" + if exclft8: + ft8_qry_string += "(comment NOT LIKE '%FT8%')" + single_mode = find_id_json(modes_frequencies["modes"], "digi-ft8") + for j in range(len(single_mode["freq"])): + ft8_qry_string += ( + " AND (freq NOT BETWEEN " + + str(single_mode["freq"][j]["min"]) + + " AND " + + str(single_mode["freq"][j]["max"]) + + ")" + ) + ft8_qry_string += ")" + + ft4_qry_string = " AND (" + if exclft4: + ft4_qry_string += "(comment NOT LIKE '%FT4%')" + single_mode = find_id_json(modes_frequencies["modes"], "digi-ft4") + for j in range(len(single_mode["freq"])): + ft4_qry_string += ( + " AND (freq NOT BETWEEN " + + str(single_mode["freq"][j]["min"]) + + " AND " + + str(single_mode["freq"][j]["max"]) + + ")" + ) + ft4_qry_string += ")" + + # construct DE continent region query + dere_qry_string = " AND spottercq IN (" + ",".join(["%s" for _ in dere]) + ")" + dere_params = tuple(dere) + + # construct DX continent region query + dxre_qry_string = " AND spotcq IN (" + ",".join(["%s" for _ in dxre]) + ")" + dxre_params = tuple(dxre) + + if enable_cq_filter == "Y": + # construct de cq query + decq_qry_string = "" + decq_params = [] + if len(decq) == 1: + if decq[0].isnumeric(): + decq_qry_string = " AND spottercq = %s" + decq_params = (decq[0],) + + # construct dx cq query + dxcq_qry_string = "" + dxcq_params = [] + if len(dxcq) == 1: + if dxcq[0].isnumeric(): + dxcq_qry_string = " AND spotcq = %s" + dxcq_params = (dxcq[0],) + + if last_rowid is None: + last_rowid = "0" + if not last_rowid.isnumeric(): + last_rowid = 0 + + query_string = ( + "SELECT rowid, spotter AS de, freq, spotcall AS dx, comment AS comm, time, spotdxcc from spot WHERE rowid > %s" + ) + + if dxcalls: + query_string += dxcalls_qry_string + + if len(band) > 0: + query_string += band_qry_string + + if len(mode) > 0: + query_string += mode_qry_string + + if exclft8: + query_string += ft8_qry_string + + if exclft4: + query_string += ft4_qry_string + + if len(dere) > 0: + query_string += dere_qry_string + + if len(dxre) > 0: + query_string += dxre_qry_string + + if enable_cq_filter == "Y": + if len(decq_qry_string) > 0: + query_string += decq_qry_string + decq_params = (decq_params,) + + if len(dxcq_qry_string) > 0: + query_string += dxcq_qry_string + dxcq_params = (dxcq_params,) + + query_string += " ORDER BY rowid desc limit 50;" + + logger.debug(query_string) + + except Exception as e: + logger.error(e) + query_string = "" + + return query_string, ( + last_rowid, + *dxcalls_params, + *band_params, + *mode_params, + *ft8_params, + *ft4_params, + *dere_params, + *dxre_params, + *decq_params, + *dxcq_params, + ) + + +# the main query to show spots +# it gets url parameter in order to apply the build the right query +# and apply the filter required. It returns a json with the spots +def spotquery(parameters): + try: + + if 'callsign' in parameters: + logging.debug('search callsign') + query_string, params = query_build_callsign(parameters['callsign']) + else: + logging.debug('search eith other filters') + query_string, params = query_build(parameters) + + qm.qry(query_string, params) + data = qm.get_data() + row_headers = qm.get_headers() + + logger.debug("query done") + logger.debug(data) + + if data is None or len(data) == 0: + logger.warning("no data found") + + payload = [] + for result in data: + # create dictionary from recorset + main_result = dict(zip(row_headers, result)) + # find the country in prefix table + search_prefix = pfxt.find(main_result["dx"]) + # merge recordset and contry prefix + main_result["country"] = search_prefix["country"] + main_result["iso"] = search_prefix["iso"] + + payload.append({**main_result}) + + return payload + except Exception as e: + logger.error(e) + +# find adxo events +adxo_events = None + +def get_adxo(): + global adxo_events + adxo_events = get_adxo_events() + threading.Timer(12 * 3600, get_adxo).start() + + +get_adxo() + +# create data provider for charts +heatmap_cbp = ContinentsBandsProvider(logger, qm, continents_cq, band_frequencies) +bar_graph_spm = SpotsPerMounthProvider(logger, qm) +line_graph_st = SpotsTrend(logger, qm) +bubble_graph_hb = HourBand(logger, qm, band_frequencies) +geo_graph_wdsl = WorldDxSpotsLive(logger, qm, pfxt) + +# ROUTINGS +@app.route("/spotlist", methods=["POST"]) +@csrf.exempt +def spotlist(): + logger.debug(request.json) + response = flask.Response(json.dumps(spotquery(request.json))) + return response + + +def who_is_connected(): + host=cfg["telnet"]["host"] + port=cfg["telnet"]["port"] + user=cfg["telnet"]["user"] + password=cfg["telnet"]["password"] + response = who(host, port, user, password) + logger.debug("list of connected clusters:") + logger.debug(response) + return response + +#Calculate nonce token used in inline script and in csp "script-src" header +def get_nonce(): + global inline_script_nonce + inline_script_nonce = secrets.token_hex() + return inline_script_nonce + +@app.route("/", methods=["GET"]) +@app.route("/index.html", methods=["GET"]) +def spots(): + response = flask.Response( + render_template( + "index.html", + inline_script_nonce=get_nonce(), + mycallsign=cfg["mycallsign"], + telnet=cfg["telnet"]["host"]+":"+cfg["telnet"]["port"], + mail=cfg["mail"], + menu_list=cfg["menu"]["menu_list"], + enable_cq_filter=enable_cq_filter, + timer_interval=cfg["timer"]["interval"], + adxo_events=adxo_events, + continents=continents_cq, + bands=band_frequencies, + dx_calls=get_dx_calls(), + ) + ) + return response + + +#Show all dx spot callsigns +def get_dx_calls(): + try: + query_string = "SELECT spotcall AS dx FROM spot GROUP BY spotcall ORDER BY count(spotcall) DESC LIMIT 500" + qm.qry(query_string) + data = qm.get_data() + row_headers = qm.get_headers() + + payload = [] + for result in data: + main_result = dict(zip(row_headers, result)) + payload.append(main_result["dx"]) + logger.debug("last DX Callsigns:") + logger.debug(payload) + return payload + + except Exception as e: + return [] + + + +@app.route("/service-worker.js", methods=["GET"]) +def sw(): + return app.send_static_file("pwa/service-worker.js") + +@app.route("/offline.html") +def root(): + return app.send_static_file("html/offline.html") + +@app.route("/world.json") +def world_data(): + return app.send_static_file("data/world.json") + +@app.route("/plots.html") +def plots(): + whoj = who_is_connected() + response = flask.Response( + render_template( + "plots.html", + inline_script_nonce=get_nonce(), + mycallsign=cfg["mycallsign"], + telnet=cfg["telnet"]["host"]+":"+cfg["telnet"]["port"], + mail=cfg["mail"], + menu_list=cfg["menu"]["menu_list"], + who=whoj, + continents=continents_cq, + bands=band_frequencies, + ) + ) + return response + +@app.route("/propagation.html") +def propagation(): + response = flask.Response( + render_template( + "propagation.html", + inline_script_nonce=get_nonce(), + mycallsign=cfg["mycallsign"], + telnet=cfg["telnet"]["host"]+":"+cfg["telnet"]["port"], + mail=cfg["mail"], + menu_list=cfg["menu"]["menu_list"], + ) + ) + return response + +@app.route("/cookies.html", methods=["GET"]) +def cookies(): + response = flask.Response( + render_template( + "cookies.html", + inline_script_nonce=get_nonce(), + mycallsign=cfg["mycallsign"], + telnet=cfg["telnet"]["host"]+":"+cfg["telnet"]["port"], + mail=cfg["mail"], + menu_list=cfg["menu"]["menu_list"], + ) + ) + return response + +@app.route("/privacy.html", methods=["GET"]) +def privacy(): + response = flask.Response( + render_template( + "privacy.html", + inline_script_nonce=get_nonce(), + mycallsign=cfg["mycallsign"], + telnet=cfg["telnet"]["host"]+":"+cfg["telnet"]["port"], + mail=cfg["mail"], + menu_list=cfg["menu"]["menu_list"], + ) + ) + return response + +@app.route("/sitemap.xml") +def sitemap(): + return app.send_static_file("sitemap.xml") + + +@app.route("/callsign.html", methods=["GET"]) +def callsign(): + # payload=spotquery() + callsign = request.args.get("c") + response = flask.Response( + render_template( + "callsign.html", + inline_script_nonce=get_nonce(), + mycallsign=cfg["mycallsign"], + telnet=cfg["telnet"]["host"]+":"+cfg["telnet"]["port"], + mail=cfg["mail"], + menu_list=cfg["menu"]["menu_list"], + timer_interval=cfg["timer"]["interval"], + callsign=callsign, + adxo_events=adxo_events, + continents=continents_cq, + bands=band_frequencies, + ) + ) + return response + + +# API that search a callsign and return all informations about that +@app.route("/callsign", methods=["GET"]) +def find_callsign(): + callsign = request.args.get("c") + response = pfxt.find(callsign) + if response is None: + response = flask.Response(status=204) + return response + + +@app.route("/plot_get_heatmap_data", methods=["POST"]) +@csrf.exempt +def get_heatmap_data(): + #continent = request.args.get("continent") + continent = request.json['continent'] + logger.debug(request.get_json()); + response = flask.Response(json.dumps(heatmap_cbp.get_data(continent))) + logger.debug(response) + if response is None: + response = flask.Response(status=204) + return response + + +@app.route("/plot_get_dx_spots_per_month", methods=["POST"]) +@csrf.exempt +def get_dx_spots_per_month(): + response = flask.Response(json.dumps(bar_graph_spm.get_data())) + logger.debug(response) + if response is None: + response = flask.Response(status=204) + return response + + +@app.route("/plot_get_dx_spots_trend", methods=["POST"]) +@csrf.exempt +def get_dx_spots_trend(): + response = flask.Response(json.dumps(line_graph_st.get_data())) + logger.debug(response) + if response is None: + response = flask.Response(status=204) + return response + + +@app.route("/plot_get_hour_band", methods=["POST"]) +@csrf.exempt +def get_dx_hour_band(): + response = flask.Response(json.dumps(bubble_graph_hb.get_data())) + logger.debug(response) + if response is None: + response = flask.Response(status=204) + return response + + +@app.route("/plot_get_world_dx_spots_live", methods=["POST"]) +@csrf.exempt +def get_world_dx_spots_live(): + response = flask.Response(json.dumps(geo_graph_wdsl.get_data())) + logger.debug(response) + if response is None: + response = flask.Response(status=204) + return response + +@app.route("/csp-reports", methods=['POST']) +@csrf.exempt +def csp_reports(): + report_data = request.get_data(as_text=True) + logger.warning("CSP Report:") + logger.warning(report_data) + response=flask.Response(status=204) + return response + +@app.context_processor +def inject_template_scope(): + injections = dict() + + def cookies_check(): + value = request.cookies.get("cookie_consent") + return value == "true" + + injections.update(cookies_check=cookies_check) + return injections + + +@app.after_request +def add_security_headers(resp): + + resp.headers["Strict-Transport-Security"] = "max-age=1000" + resp.headers["X-Xss-Protection"] = "1; mode=block" + resp.headers["X-Frame-Options"] = "SAMEORIGIN" + resp.headers["X-Content-Type-Options"] = "nosniff" + resp.headers["Referrer-Policy"] = "strict-origin-when-cross-origin" + resp.headers["Cache-Control"] = "public, no-cache" + resp.headers["Pragma"] = "no-cache" + + resp.headers["ETag"] = app.config["VERSION"] + #resp.headers["Report-To"] = '{"group":"csp-endpoint", "max_age":10886400, "endpoints":[{"url":"/csp-reports"}]}' + resp.headers["Content-Security-Policy"] = "\ + default-src 'self';\ + script-src 'self' cdnjs.cloudflare.com cdn.jsdelivr.net 'nonce-"+inline_script_nonce+"';\ + style-src 'self' cdnjs.cloudflare.com cdn.jsdelivr.net;\ + object-src 'none';base-uri 'self';\ + connect-src 'self' cdn.jsdelivr.net cdnjs.cloudflare.com sidc.be;\ + font-src 'self' cdn.jsdelivr.net;\ + frame-src 'self';\ + frame-ancestors 'none';\ + form-action 'none';\ + img-src 'self' data: cdnjs.cloudflare.com sidc.be;\ + manifest-src 'self';\ + media-src 'self';\ + worker-src 'self';\ + report-uri /csp-reports;\ + " + return resp + + #report-to csp-endpoint;\ + #script-src 'self' cdnjs.cloudflare.com cdn.jsdelivr.net 'nonce-sedfGFG32xs';\ + #script-src 'self' cdnjs.cloudflare.com cdn.jsdelivr.net 'nonce-"+inline_script_nonce+"';\ + +if __name__ == "__main__": + app.run(host="0.0.0.0")